From a84908b7e8a0e2423afd6b836eccf27a420270b4 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 20 Sep 2023 19:56:52 +0900 Subject: feat(blog/nuldoc): change content format from DocBook to NulDoc --- .../index.html | 4 +-- .../python-unbound-local-error/index.html | 6 ++-- .../ruby-detect-running-implementation/index.html | 4 +-- .../ruby-then-keyword-and-case-in/index.html | 24 ++++++------- .../rust-where-are-primitive-types-from/index.html | 12 +++---- .../index.html | 10 +++--- .../vim-swap-order-of-selected-lines/index.html | 12 +++---- .../2022-04-09/phperkaigi-2022-tokens/index.html | 32 ++++++++--------- .../index.html | 2 +- .../php-conference-okinawa-code-golf/index.html | 4 +-- .../index.html | 5 ++- .../index.html | 34 +++++++++--------- .../phperkaigi-2023-unused-token-quiz-1/index.html | 18 +++++----- .../setup-server-for-this-site/index.html | 40 +++++++++++----------- .../phperkaigi-2023-unused-token-quiz-2/index.html | 14 ++++---- .../phperkaigi-2023-unused-token-quiz-3/index.html | 14 ++++---- .../index.html | 20 +++++------ vhosts/blog/public/posts/index.html | 2 +- 18 files changed, 128 insertions(+), 129 deletions(-) (limited to 'vhosts/blog/public/posts') diff --git a/vhosts/blog/public/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html b/vhosts/blog/public/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html index 75ba6ea9..0954830d 100644 --- a/vhosts/blog/public/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html +++ b/vhosts/blog/public/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html @@ -69,7 +69,7 @@ タイトル落ち。まずはこのコードを見て欲しい。

-
#include <iostream>
+          
#include <iostream>
 
 [[alignas]] [[alignof]] [[and]] [[and_eq]] [[asm]] [[auto]] [[bitand]]
 [[bitor]] [[bool]] [[break]] [[case]] [[catch]] [[char]] [[char16_t]]
@@ -132,7 +132,7 @@
              上のコードでは [[using]] をコメントアウトしているが、これは using キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。 
           

-
// using の例
+          
// using の例
 [[using foo: attr1, attr2]] int x; // [[foo::attr1, foo::attr2]] の糖衣構文

diff --git a/vhosts/blog/public/posts/2021-10-02/python-unbound-local-error/index.html b/vhosts/blog/public/posts/2021-10-02/python-unbound-local-error/index.html index 105b946b..cb6efafb 100644 --- a/vhosts/blog/public/posts/2021-10-02/python-unbound-local-error/index.html +++ b/vhosts/blog/public/posts/2021-10-02/python-unbound-local-error/index.html @@ -73,7 +73,7 @@ Python でクロージャを作ろうと、次のようなコードを書いた。

-
def f():
+          
def f():
     x = 0
     def g():
         x += 1
@@ -95,7 +95,7 @@ f()
local変数 x が代入前に参照された、とある。これは、fx を参照するのではなく、新しく別の変数を g 内に作ってしまっているため。 前述のコードを宣言と代入を便宜上分けて書き直すと次のようになる。var を変数宣言のための構文として擬似的に利用している。

-
# 注: var は正しい Python の文法ではない。上記参照のこと
+          
# 注: var は正しい Python の文法ではない。上記参照のこと
 def f():
   var x           #  f の local変数 'x' を宣言
   x = 0           #  x に 0 を代入
@@ -110,7 +110,7 @@ f()
当初の意図を表現するには、次のように書けばよい。

-
def f():
+          
def f():
     x = 0
     def g():
         nonlocal x   ## (*)
diff --git a/vhosts/blog/public/posts/2021-10-02/ruby-detect-running-implementation/index.html b/vhosts/blog/public/posts/2021-10-02/ruby-detect-running-implementation/index.html
index d9f9e79f..16b6b0bb 100644
--- a/vhosts/blog/public/posts/2021-10-02/ruby-detect-running-implementation/index.html
+++ b/vhosts/blog/public/posts/2021-10-02/ruby-detect-running-implementation/index.html
@@ -78,7 +78,7 @@
              上記ページの例から引用する: 
           

-
$ ruby-1.9.1 -ve 'p RUBY_ENGINE'
+          
$ ruby-1.9.1 -ve 'p RUBY_ENGINE'
 ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux]
 "ruby"
 $ jruby -ve 'p RUBY_ENGINE'
@@ -203,7 +203,7 @@ jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java]
             mruby 該当部分のソース より引用: 
           

-
/*
+          
/*
 * Ruby engine.
 */
 #define MRUBY_RUBY_ENGINE  "mruby"
diff --git a/vhosts/blog/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html b/vhosts/blog/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html index fcd653e2..a483ee73 100644 --- a/vhosts/blog/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html +++ b/vhosts/blog/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html @@ -78,7 +78,7 @@ 使われることは稀だが、Ruby では then がキーワードになっている。次のように使う:

-
if cond then
+            
if cond then
   puts "Y"
 else
   puts "N"
@@ -88,7 +88,7 @@
                このキーワードが現れうる場所はいくつかあり、ifunlessrescuecase 構文がそれに当たる。 上記のように、何か条件を書いた後 then を置き、式がそこで終了していることを示すマーカーとして機能する。 
             

-
# Example:
+            
# Example:
 
 if x then
   a
@@ -116,13 +116,13 @@
                普通 Ruby のコードで then を書くことはない。なぜか。次のコードを実行してみるとわかる。 
             

-
if true puts 'Hello, World!' end
+
if true puts 'Hello, World!' end

次のような構文エラーが出力される。

-
20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n'
+            
20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n'
 if true puts 'Hello, World!' end
         ^~~~
 20:1: syntax error, unexpected `end', expecting end-of-input
@@ -136,7 +136,7 @@ if true puts 'Hello, World!' end
                ポイントは改行が then (や ;) の代わりとなることである。true の後に改行を入れてみる。 
             

-
if true
+            
if true
 puts 'Hello, World!' end

@@ -150,18 +150,18 @@ puts 'Hello, World!' if a b end

+
if a b end

then; も改行もないのでエラーになるが、これは条件式がどこまで続いているのかわからないためだ。 この例は二通りに解釈できる。

-
# a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価
+            
# a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価
 if a then
 b
 end
-
# a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、
+            
# a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、
 # その結果が truthy なら何もしない
 if a(b) then
 end
@@ -185,7 +185,7 @@ b https://github.com/ruby/ruby/blob/221ca0f8281d39f0dfdfe13b2448875384bbf735/parse.y#L3961-L3986

-
p_case_body : keyword_in
+            
p_case_body : keyword_in
 {
   SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
   p->command_start = FALSE;
@@ -216,7 +216,7 @@ p_cases
                簡略版: 
             

-
p_case_body : keyword_in p_top_expr then compstmt p_cases
+            
p_case_body : keyword_in p_top_expr then compstmt p_cases
 ;

@@ -227,7 +227,7 @@ p_cases これにより、case - when による従来の構文と同じように、then 等をパターンの後ろに挿入すればよいことがわかった。つまり次の3通りのいずれかになる:

-
case x
+            
case x
 in 1 then a
 in 2 then b
 in 3 then c
@@ -252,7 +252,7 @@ p_cases
                ところで、p_top_expr には if による guard clause が書けるので、その場合は if - then と似たような見た目になる。 
             

-
case x
+            
case x
 in 0 then a
 in n if n < 0 then b
 in n then c
diff --git a/vhosts/blog/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html b/vhosts/blog/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html
index 7509e3a0..063f4f42 100644
--- a/vhosts/blog/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html
+++ b/vhosts/blog/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html
@@ -68,7 +68,7 @@
                Rust において、プリミティブ型の名前は予約語でない。したがって、次のコードは合法である。 
             

-
#![allow(non_camel_case_types)]
+            
#![allow(non_camel_case_types)]
 #![allow(dead_code)]
 
 struct bool;
@@ -122,7 +122,7 @@
               rustc はセルフホストされている (= rustc 自身が Rust で書かれている) ので、boolchar などで適当に検索をかけてもノイズが多すぎて話にならない。 しかし、お誂え向きなことに i128/u128 というコンパイラ自身が使うことがなさそうな型が存在するのでこれを使って git grep してみる。 
             

-
$ git grep "\bi128\b" | wc      # i128
+            
$ git grep "\bi128\b" | wc      # i128
 165    1069   15790
 
 $ git grep "\bu128\b" | wc      # u128
@@ -135,7 +135,7 @@ $ git grep "\bbool\b" | wc      # cf. bool の結果
                165 程度であれば探すことができそうだ。今回は、クレート名を見ておおよその当たりをつけた。 
             

-
$ git grep "\bi128\b"
+            
$ git grep "\bi128\b"
 ...
 rustc_resolve/src/lib.rs:        table.insert(sym::i128, Int(IntTy::I128));
 ...
@@ -144,7 +144,7 @@ rustc_resolve/src/lib.rs: table.insert(sym::i128, Int(IntTy::I128)); rustc_resolve というのはいかにも名前解決を担いそうなクレート名である。該当箇所を見てみる。

-
/// Interns the names of the primitive types.
+            
/// Interns the names of the primitive types.
 ///
 /// All other types are defined somewhere and possibly imported, but the primitive ones need
 /// special handling, since they have no place of origin.
@@ -191,7 +191,7 @@ rustc_resolve/src/lib.rs:        table.insert(sym::i128, Int(IntTy::I128));
                とある。次はこの struct の使用箇所を追う。追うと言っても使われている箇所は次の一箇所しかない。なお説明に不要な箇所は大きく削っている。 
             

-
/// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.
+            
/// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.
 /// (略)
 fn resolve_ident_in_lexical_scope(
     &mut self,
@@ -229,7 +229,7 @@ rustc_resolve/src/lib.rs:        table.insert(sym::i128, Int(IntTy::I128));
                動作がわかったところで、例として次のコードを考える。 
             

-
#![allow(non_camel_case_types)]
+            
#![allow(non_camel_case_types)]
 
 struct bool;
 
diff --git a/vhosts/blog/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html b/vhosts/blog/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html
index ea874004..69e28ce1 100644
--- a/vhosts/blog/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html
+++ b/vhosts/blog/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html
@@ -119,14 +119,14 @@
                 https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L85-L86
               

-
{"BufAdd",      EVENT_BUFADD},
+              
{"BufAdd",      EVENT_BUFADD},
 {"BufCreate",   EVENT_BUFADD},

https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97

-
{"BufRead",     EVENT_BUFREADPOST},
+              
{"BufRead",     EVENT_BUFREADPOST},
 {"BufReadCmd",  EVENT_BUFREADCMD},
 {"BufReadPost", EVENT_BUFREADPOST},
@@ -134,7 +134,7 @@ https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105

-
{"BufWrite",    EVENT_BUFWRITEPRE},
+              
{"BufWrite",    EVENT_BUFWRITEPRE},
 {"BufWritePost",    EVENT_BUFWRITEPOST},
 {"BufWritePre", EVENT_BUFWRITEPRE},
@@ -149,7 +149,7 @@ https://github.com/neovim/neovim/blob/71d4f5851f068eeb432af34850dddda8cc1c71e3/src/nvim/auevents.lua#L119-L124

-
aliases = {
+              
aliases = {
 BufCreate = 'BufAdd',
 BufRead = 'BufReadPost',
 BufWrite = 'BufWritePre',
@@ -160,7 +160,7 @@ FileEncoding = 'EncodingChanged',
                  ところで、上では取り上げなかった FileEncoding だが、これは :help FileEncoding にしっかりと書いてある。 
               

-
                                                              *FileEncoding*
+              
                                                              *FileEncoding*
 FileEncoding                    Obsolete.  It still works and is equivalent
                                 to |EncodingChanged|.
diff --git a/vhosts/blog/public/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html b/vhosts/blog/public/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html index 9ca04808..deb55b48 100644 --- a/vhosts/blog/public/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html +++ b/vhosts/blog/public/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html @@ -64,7 +64,7 @@

TL; DR

-
" License: Public Domain
+            
" License: Public Domain
 
 command! -bar -range=%
     \ Reverse
@@ -137,7 +137,7 @@ command! -bar -range=%
                  なお、:g/^/m0 は全ての行を入れ替えるが、:N,Mg/^/mN-1 とすることで N行目から M行目を処理範囲とするよう拡張できる。手でこれを入力するわけにはいかないので、次のようなコマンドを用意する。 
               

-
command! -bar -range=%
+              
command! -bar -range=%
     \ Reverse
     \ <line1>,<line2>g/^/m<line1>-1
@@ -172,7 +172,7 @@ command! -bar -range=% 前述した :Reverse コマンドの定義を少し変えて、次のようにする:

-
function! s:reverse_lines(from, to) abort
+            
function! s:reverse_lines(from, to) abort
     execute printf("%d,%dg/^/m%d", a:from, a:to, a:from - 1)
 endfunction
 
@@ -198,7 +198,7 @@ command! -bar -range=%
               

- Autocommands do not change the current search patterns. Vim saves the current search patterns before executing autocommands then restores them after the autocommands finish. This means that autocommands do not affect the strings highlighted with the `hlsearch' option. + Autocommands do not change the current search patterns. Vim saves the current search patterns before executing autocommands then restores them after the autocommands finish. This means that autocommands do not affect the strings highlighted with the `hlsearch' option.

@@ -212,7 +212,7 @@ command! -bar -range=%

- (略) This command doesn’t work in an autocommand, because the highlighting state is saved and restored when executing autocommands |autocmd-searchpat|. Same thing for when invoking a user function. + (略) This command doesn’t work in an autocommand, because the highlighting state is saved and restored when executing autocommands |autocmd-searchpat|. Same thing for when invoking a user function.

@@ -229,7 +229,7 @@ command! -bar -range=%

-
command! -bar -range=%
+            
command! -bar -range=%
     \ Reverse
     \ keeppatterns <line1>,<line2>g/^/m<line1>-1
diff --git a/vhosts/blog/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html b/vhosts/blog/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html index b19f038d..6db138d5 100644 --- a/vhosts/blog/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html +++ b/vhosts/blog/public/posts/2022-04-09/phperkaigi-2022-tokens/index.html @@ -79,7 +79,7 @@ ソースコードはこちら。実行には PHP 8.1 以上が必要なので注意。

-
<?php
+            
<?php
 
 declare(strict_types=0O1);
 
@@ -176,7 +176,7 @@ $🐘([
                    なお、brainf*ck プログラムを普通の書き方で書くと、次のようになる。 
                 

-
+ + + + + + + + + +
+                
+ + + + + + + + + +
 [
   > + + +
   > + + + + +
@@ -266,7 +266,7 @@ $🐘([
                    ソースコードのライセンスを示したこの部分だが、 
                 

-
https://creativecommons.org/publicdomain/zero/1.0/
+
https://creativecommons.org/publicdomain/zero/1.0/

完全に合法な PHP のコードである。 https: 部分はラベル、// 以降は行コメントになっている。 @@ -279,7 +279,7 @@ $🐘([ ソースコード中に、ほとんど数値リテラルが書かれていないことにお気づきだろうか。 PHP では、型変換を利用することで任意の整数を作り出すことができる。

-
assert(0 === +!![]);
+                
assert(0 === +!![]);
 assert(1 === +![]);
 assert(2 === ![]+![]);
 assert(3 === ![]+![]+![]);
@@ -324,7 +324,7 @@ $🐘([
                ソースコードはこちら。実行には PHP 8.0 以上が必要なので注意。 
             

-
<?php
+            
<?php
 
 /*********************************************************
 * This program displays a PHPer token.                  *
@@ -373,7 +373,7 @@ $🐘([
                  まずはソースコードを読んでいく。 
               

-
$token = [
+              
$token = [
 // 略
 ];
@@ -381,25 +381,25 @@ $🐘([ 数値からなる $token があり、各要素をループしている。

-
$x = $x ^ N;
+
$x = $x ^ N;

まずは排他的論理和 (xor) を取り、

-
$x = sprintf('%025b', $x);
+
$x = sprintf('%025b', $x);

二進数に変換して、

-
$x = str_replace(search: ['0', '1'], replace: [' ', '#'], subject: $x);
+
$x = str_replace(search: ['0', '1'], replace: [' ', '#'], subject: $x);

0 を空白に、1 を # にし、

-
$x = implode("\n", str_split($x, length: 5));
+
$x = implode("\n", str_split($x, length: 5));

5文字ごとに区切ったあと、改行で結合している。 @@ -445,13 +445,13 @@ $🐘([ N は高々

-
assert(0 <= N && N <= 0b11111_11111_11111_11111_11111);
+
assert(0 <= N && N <= 0b11111_11111_11111_11111_11111);

なのでブルートフォースしてもよいが、ここではブルートフォースしない方法を紹介する。

-
<?php
+              
<?php
 
 $x = 0x14B499C;
 
@@ -472,7 +472,7 @@ $🐘([
                  この一連の変換に対する逆変換を考えると、次のようになる。 
               

-
<?php
+              
<?php
 
 $x =
 " # # \n" .
@@ -501,7 +501,7 @@ $🐘([
                ソースコードはこちら。 
             

-
<?php
+            
<?php
 
 // License: https://creativecommons.org/publicdomain/zero/1.0/
 // This is a quine-like program to generate a PHPer token.
@@ -535,7 +535,7 @@ Q;
                コメントにもあるとおり、次のようにして実行すれば答えがでてくる。 
             

-
$ php toquine.php | php | php | php | ...
+
$ php toquine.php | php | php | php | ...

実際にはもう少しパイプで繋げなければならない。 @@ -564,7 +564,7 @@ Q;

状態保持

- トークンの何文字目まで出力したかを、ソースコードを変えずに (quine なので) 覚えておく必要がある。 このプログラムでは、トークンが出力されるとソースコードがだんだんと長くなっていくのを利用して、LINE から情報を取得している。 + トークンの何文字目まで出力したかを、ソースコードを変えずに (quine なので) 覚えておく必要がある。 このプログラムでは、トークンが出力されるとソースコードがだんだんと長くなっていくのを利用して、__LINE__ から情報を取得している。

diff --git a/vhosts/blog/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html b/vhosts/blog/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html index 595fb462..6ba72208 100644 --- a/vhosts/blog/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html +++ b/vhosts/blog/public/posts/2022-04-24/term-banner-write-tool-showing-banner-in-terminal/index.html @@ -56,7 +56,7 @@ こんなものを作った。

-
$ term-banner 'Hello, World!' 'こんにちは、' '世界!'
+
$ term-banner 'Hello, World!' 'こんにちは、' '世界!'

image::https://raw.githubusercontent.com/nsfisis/term-banner/main/screenshot.png[term-banner のスクリーンショット] diff --git a/vhosts/blog/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html b/vhosts/blog/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html index d9c3fe78..f55221d1 100644 --- a/vhosts/blog/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html +++ b/vhosts/blog/public/posts/2022-08-27/php-conference-okinawa-code-golf/index.html @@ -116,7 +116,7 @@ 書いたものがこちら:

-
[<?php $n=$argv[1];foreach([1e4,5e3,2e3,1e3,500,100,50,10,5,1]as$x)for(;$n>=$x;$n-=$x)$r[]=$x;echo implode(', ',$r??[]);?>]
+
[<?php $n=$argv[1];foreach([1e4,5e3,2e3,1e3,500,100,50,10,5,1]as$x)for(;$n>=$x;$n-=$x)$r[]=$x;echo implode(', ',$r??[]);?>]

しめて 123 バイトとなった (末尾改行を含めずにカウント)。 @@ -126,7 +126,7 @@ こちらは改行とスペースを追加したバージョン:

-
[<?php
+            
[<?php
 
 $n = $argv[1];
 foreach ([1e4, 5e3, 2e3, 1e3, 500, 100, 50, 10, 5, 1] as $x)
diff --git a/vhosts/blog/public/posts/2022-08-31/support-for-communty-is-employee-benefits/index.html b/vhosts/blog/public/posts/2022-08-31/support-for-communty-is-employee-benefits/index.html
index ae8cea42..9e895397 100644
--- a/vhosts/blog/public/posts/2022-08-31/support-for-communty-is-employee-benefits/index.html
+++ b/vhosts/blog/public/posts/2022-08-31/support-for-communty-is-employee-benefits/index.html
@@ -5,8 +5,7 @@
     
     
     
-    
+    
     
     弊社の PHP Foundation への寄付に寄せて | REPL: Rest-Eat-Program Loop
     
@@ -51,7 +50,7 @@
           

はじめに

- 注: これは私個人の意見であり、所属する組織を代表するものではありません。 + 注: これは私個人の意見であり、所属する組織を代表するものではありません。

diff --git a/vhosts/blog/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html b/vhosts/blog/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html index f29cf154..60bc635b 100644 --- a/vhosts/blog/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html +++ b/vhosts/blog/public/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line/index.html @@ -120,7 +120,7 @@ 特に、C言語でこのような試みをおこなったことがあるかたならそう思うだろう。事実、Cでのこの制約はほとんど無意味に等しい。

-
#\
+            
#\
 i\
 n\
 c\
@@ -245,7 +245,7 @@ c\
                また、2文字だと文字列がまともに書けないのも辛い。'' だけで2文字使うので、 「1文字の文字列リテラル」というものを書くことができない。PHP では文字列リテラル中に生の改行が書けるので 
             

-
$a
+            
$a
 ='
 a'
 ;;
@@ -267,7 +267,7 @@ a' まずは普通に書くとしよう。

-
<?php
+              
<?php
 
 for ($i = 1; $i < 100; $i++) {
   echo (($i % 3 ? '' : 'Fizz') . ($i % 5 ? '' : 'Buzz') ?: $i) . "\n";
@@ -284,7 +284,7 @@ a'
                 for は、3文字もある長いキーワードである。 こんなものは使えない。array_ 系の関数を使って、適当に置き換えるとしよう。 
               

-
<?php
+              
<?php
 
 $s = range(1, 100);
 array_walk(
@@ -304,7 +304,7 @@ fn($i) =>
                 rangearray_walkprintf は長すぎるのでどうにかせねばならない。 ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。 
               

-
<?php
+              
<?php
 
 $r = 'range';
 $w = 'array_walk';
@@ -340,7 +340,7 @@ fn($i) =>
                  というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という PHP 7.x までの仕様が利用できる。 例えば、 Fizz という文字列が欲しければ、次のようにする。 
               

-
$f
+              
$f
 =F
 .i
 .z
@@ -351,7 +351,7 @@ fn($i) =>
                  こうして簡単に文字列を作れる。 なお、この仕様は 7.x 時点でも警告を受けるので、@ 演算子を使って抑制してやるとよい。 
               

-
$f
+              
$f
 =@
 F.
 @i
@@ -376,7 +376,7 @@ F.
                  ずばり、文字列同士のビット演算を使う。 PHP では、文字列同士でビット演算 (&|^) をした場合、 文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。 
               

-
$a = "12345";
+              
$a = "12345";
 $b = "world";
 
 // $a ^ $b は次のコードと同じ
@@ -392,7 +392,7 @@ F.
                  これを踏まえ、次のコードを見てみよう。 
               

-
$x = "x\nOm\n";
+              
$x = "x\nOm\n";
 $y = "\nk!\no";
 $r = $x ^ $y;
 echo "$r\n";
@@ -401,7 +401,7 @@ F. 実行すると、range が表示される。 さて、PHP では文字列リテラル中に生の改行を直接書いてもよいのだった (「主な障害」の節を参照のこと)。 書きかえてみよう。

-
$x
+              
$x
 ='x
 Om
 ';
@@ -418,7 +418,7 @@ o'
                  さらに # を使って適当に調整すると、次のようになる。 
               

-
$x
+              
$x
 =#
 'x
 Om
@@ -453,7 +453,7 @@ o'
                完成したものがこちら。 
             

-
<?php
+            
<?php
 
 $x
 =#
@@ -621,7 +621,7 @@ _!
                PHP では、バッククォートを使ってシェルを呼び出せる。 これは shell_exec 関数と等価である。 さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。 
             

-
<?php
+            
<?php
 
 printf(`
 e\
@@ -658,7 +658,7 @@ o\
                もうこれ以上は不可能だと思っていたのだが、この記事の執筆中に解決する方法を思いついたので載せておく。 
             

-
<?php
+            
<?php
 
 $c = 'chr';
 
@@ -692,7 +692,7 @@ ${
                先程と同じく、chrprintf を生成する部分は長くなるので省いた。 
             

-
${
+            
${
 '_
 '}
@@ -700,7 +700,7 @@ ${ は変数で、中にはスペースとエスケープが入っている (chr(32) . chr(92))。 シェルに渡されている文字列は次のようになる。

-
e\
+            
e\
 c\
 h\
 o\
@@ -721,7 +721,7 @@ o\
                ちなみに、PHP 8.2 からは、この記法で Warning が出るようになるようだ。 
             

-
${
+            
${
 '_
 '}
diff --git a/vhosts/blog/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html b/vhosts/blog/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html index eaa210c5..1c661438 100644 --- a/vhosts/blog/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html +++ b/vhosts/blog/public/posts/2022-10-23/phperkaigi-2023-unused-token-quiz-1/index.html @@ -81,7 +81,7 @@ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。

-
<?php
+            
<?php
 
 $π = $argv[1] ?? null;
 if ($π === null) {
@@ -110,14 +110,14 @@ $π = trim($π);
                ソースを見るとわかるとおり、$argv[1] を参照している。 それを  なる変数に代入しているので、円周率を渡してみる。 
             

-
$ php Q.php 3.14
+            
$ php Q.php 3.14
 Failed.

失敗してしまった。精度を上げてみる。

-
$ php Q.php 3.1415
+            
$ php Q.php 3.1415
 Failed.

@@ -128,7 +128,7 @@ Failed.

最初にトークンが得られるのは、小数点以下 16 桁目まで入力したときで、こうなる。

-
$ php Q.php 3.1415926535897932
+            
$ php Q.php 3.1415926535897932
 Token: #YO

@@ -142,7 +142,7 @@ Token: #YO

短いので頭から追っていく。

-
$π = $argv[1] ?? null;
+            
$π = $argv[1] ?? null;
 if ($π === null) {
   exit('No input.');
 }
@@ -155,7 +155,7 @@ $π = trim($π);
                入力のバリデーション部分。数値のみ受け付ける。 
             

-
$s = implode(array_map(chr(...), str_split($π, 2)));
+
$s = implode(array_map(chr(...), str_split($π, 2)));

を 2 文字ごとに区切り (str_split)、 数値を ASCII コードと見做して文字に変換 (chr) して結合 (implode) している。 @@ -165,12 +165,12 @@ $π = trim($π); 例えば、'656667' だったとすると、 656667 に対応した 'A''B''C' へと変換され、'ABC' になる。

-
$π = '656667';
+            
$π = '656667';
 $s = implode(array_map(chr(...), str_split($π, 2)));
 echo $s;
 // => ABC
-
preg_match('/(\x23.+?) /', $s, $m);
+            
preg_match('/(\x23.+?) /', $s, $m);
 $t = $m[1] ?? '';

@@ -181,7 +181,7 @@ $π = trim($π); なお、# を直接書いていないのは、/#.+?) / と書くと、 #.+?) という意図せぬトークンが登録されてしまうからである。

-
if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
+            
if (md5($t) === '056e831a4146bf123e8ea16613303d2e') {
   echo "Token: {$t}\n";
 } else {
   echo "Failed.\n";
diff --git a/vhosts/blog/public/posts/2022-10-28/setup-server-for-this-site/index.html b/vhosts/blog/public/posts/2022-10-28/setup-server-for-this-site/index.html
index 20297c1b..c0da51a0 100644
--- a/vhosts/blog/public/posts/2022-10-28/setup-server-for-this-site/index.html
+++ b/vhosts/blog/public/posts/2022-10-28/setup-server-for-this-site/index.html
@@ -89,7 +89,7 @@
                  ローカルマシンで鍵を生成する。 
               

-
$ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/teika.key
+              
$ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/teika.key
 $ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/github2teika.key

@@ -103,7 +103,7 @@ $ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/github2teika.key

.ssh/config に設定しておく。

-
Host teika
+              
Host teika
     HostName **********
     User **********
     Port **********
@@ -127,7 +127,7 @@ $ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/github2teika.key
管理者ユーザで作業すると危ないので、メインで使うユーザを作成する。 sudo グループに追加して sudo できるようにし、su で切り替え。

-
$ sudo adduser **********
+              
$ sudo adduser **********
 $ sudo adduser ********** sudo
 $ su **********
 $ cd
@@ -135,12 +135,12 @@ $ cd

ホスト名を変える

-
$ sudo hostname teika
+
$ sudo hostname teika

公開鍵を置く

-
$ mkdir ~/.ssh
+              
$ mkdir ~/.ssh
 $ chmod 700 ~/.ssh
 $ vi ~/.ssh/authorized_keys
@@ -155,7 +155,7 @@ $ vi ~/.ssh/authorized_keys
SSH の設定を変更し、少しでも安全にしておく。

-
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
+              
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
 $ sudo vi /etc/ssh/sshd_config
    @@ -176,7 +176,7 @@ $ sudo vi /etc/ssh/sshd_config
そして設定を反映。

-
$ sudo systemctl restart sshd
+              
$ sudo systemctl restart sshd
 $ sudo systemctl status sshd
@@ -186,7 +186,7 @@ $ sudo systemctl status sshd
今の SSH セッションは閉じずに、ターミナルを別途開いて疎通確認する。 セッションを閉じてしまうと、SSH の設定に不備があった場合に締め出しをくらう。

-
$ ssh teika
+
$ ssh teika
@@ -195,7 +195,7 @@ $ sudo systemctl status sshd
デフォルトの 22 番を閉じ、設定したポートだけ空ける。

-
$ sudo ufw deny ssh
+              
$ sudo ufw deny ssh
 $ sudo ufw allow *******
 $ sudo ufw enable
 $ sudo ufw reload
@@ -212,20 +212,20 @@ $ sudo ufw status
GitHub に置いてある private リポジトリをサーバから clone したいので、SSH 鍵を生成して置いておく。

-
$ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/github.key
+              
$ ssh-keygen -t ed25519 -b 521 -f ~/.ssh/github.key
 $ cat ~/.ssh/github.key.pub

GitHub の設定画面 から、この公開鍵を追加する。

-
$ vi ~/.ssh/config
+
$ vi ~/.ssh/config

設定はこう。

-
Host github.com
+              
Host github.com
     HostName github.com
     User git
     Port 22
@@ -236,12 +236,12 @@ $ cat ~/.ssh/github.key.pub
最後に接続できるか確認しておく。

-
$ ssh -T github.com
+
$ ssh -T github.com

パッケージの更新

-
$ sudo apt update
+              
$ sudo apt update
 $ sudo apt upgrade
 $ sudo apt update
 $ sudo apt upgrade
@@ -260,12 +260,12 @@ $ sudo apt autoremove

使うソフトウェアのインストール

-
$ sudo apt install docker docker-compose git make
+
$ sudo apt install docker docker-compose git make

メインユーザが Docker を使えるように

-
$ sudo adduser ********** docker
+
$ sudo adduser ********** docker
@@ -274,7 +274,7 @@ $ sudo apt autoremove
80 番と 443 番を空ける。

-
$ sudo ufw allow 80/tcp
+              
$ sudo ufw allow 80/tcp
 $ sudo ufw allow 443/tcp
 $ sudo ufw reload
 $ sudo ufw status
@@ -282,7 +282,7 @@ $ sudo ufw status

リポジトリのクローン

-
$ cd
+              
$ cd
 $ git clone git@github.com:nsfisis/nsfisis.dev.git
 $ cd nsfisis.dev
 $ git submodule update --init
@@ -290,13 +290,13 @@ $ git submodule update --init

certbot で証明書取得

-
$ docker-compose up -d acme-challenge
+              
$ docker-compose up -d acme-challenge
 $ make setup

サーバを稼動させる

-
$ make serve
+
$ make serve
diff --git a/vhosts/blog/public/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html b/vhosts/blog/public/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html index a870f0d4..5071e1ce 100644 --- a/vhosts/blog/public/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html +++ b/vhosts/blog/public/posts/2022-11-19/phperkaigi-2023-unused-token-quiz-2/index.html @@ -85,7 +85,7 @@ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。

-
<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
+            
<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
 <?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
 <?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
 <?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
@@ -107,7 +107,7 @@
                実行してみると、次のような出力が得られる。 
             

-
#
+            
#
 <?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
 <?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
 <?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
@@ -122,7 +122,7 @@
                1 行目を除き、先ほどのコードとほぼ同じものが出てきた。もう一度実行してみる。 
             

-
#
+            
#
 W
 <?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
 <?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s='​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​<?php printf((isset($s)?fn($s)=>trim($s,"​"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
@@ -137,7 +137,7 @@ W
                今度は 2 行目が書き換えられた。すべての行が変化するまで繰り返すと次のようになる。 
             

-
#
+            
#
 W
 E
 L
@@ -163,7 +163,7 @@ P
Vim で開くと次のようになる (1 行目を抜粋)。

-
<?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s='<200b><?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>
+
<?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s='<200b><?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>')."\n","\x27$s\x27");?>

<200b> と表示されているのは、Unicode の U+200b で、ゼロ幅スペースである。 @@ -188,13 +188,13 @@ P

続いて、トークンへの変換ロジックを解析する。注目すべきはこの部分だ。以下、ゼロ幅スペースは Vim での表示に合わせて <200b> と記載する。

-
fn($s)=>chr(strlen($s)/3)
+
fn($s)=>chr(strlen($s)/3)

PHP の strlen() は文字列のバイト数を返す。1 行目の $s は以下の内容となっており、

-
$s='<200b><?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'
+
$s='<200b><?php printf((isset($s)?fn($s)=>trim($s,"<200b>"):fn($s)=>chr(strlen($s)/3))($s=%s)."\n","\x27$s\x27");?>'

このソースコードは UTF-8 で書かれているので、105 バイトになる。それを 3 で割ると 35 となり、これは # の ASCII コードと一致する。他の行も、同様にしてゼロ幅スペースを詰めることで文字列長を調整し、トークンをエンコードしている。 diff --git a/vhosts/blog/public/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html b/vhosts/blog/public/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html index 397f6ceb..038cae52 100644 --- a/vhosts/blog/public/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html +++ b/vhosts/blog/public/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html @@ -91,7 +91,7 @@ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。

-
<?php
+            
<?php
 try {
   f(g() / __LINE__);
 } catch (Throwable $e) {
@@ -242,7 +242,7 @@
                  このうち 1つ目のケースは、 finally 節の中でエラーを投げると PHP 処理系が勝手に $previous を設定してくれる。 
               

-
<?php
+              
<?php
 
 try {
   try {
@@ -268,7 +268,7 @@
                  出力部をコメントや改行を追加して再掲する: 
               

-
<?php
+              
<?php
 try {
   f(g() / __LINE__);
 } catch (Throwable $e) {
@@ -286,7 +286,7 @@
                  フォーマット指定子 %c は、整数を ASCII コード と見做して印字する。トークン #base64_decode('SGVsbG8sIFdvcmxkIQ==')b であれば、ASCII コード 98 なので、75 行目で発生したエラー、 
               

-
1, 20 => 0 / 0,
+
1, 20 => 0 / 0,

によって表現されている。エラーを起こす方法はいろいろと考えられるが、今回はゼロ除算を使った。 @@ -303,7 +303,7 @@ f() の定義を再掲する (エラーオブジェクトの行数を利用しているので、一部分だけ抜き出すと値が変わることに注意):

-
function f(int $i) {
+              
function f(int $i) {
   if ($i < 0) f();
   try {
     match ($i) {
@@ -328,11 +328,11 @@
                  前述のように、 finally 節でエラーを投げると PHP 処理系が $previous を設定する。ここでは、エラーを繋げるために f() を再帰呼び出ししている。最初に f() を呼び出している箇所を確認すると、 
               

-
<?php
+              
<?php
 try {
   f(g() / __LINE__); // 3 行目
-
function g() {
+              
function g() {
   return __LINE__; // 111 行目
 }
diff --git a/vhosts/blog/public/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html b/vhosts/blog/public/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html index 547191b9..91020aaf 100644 --- a/vhosts/blog/public/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html +++ b/vhosts/blog/public/posts/2023-04-01/implementation-of-minimal-png-image-encoder/index.html @@ -93,7 +93,7 @@ 以下のソースコードをベースにする。 今回 PNG のデコーダは扱わないので、読み込みには Go の標準ライブラリ image/png を用いる。

-
package main
+            
package main
 
 import (
 	"image"
@@ -184,7 +184,7 @@
                 writeSignature の実装はこちら: 
               

-
import "encoding/binary"
+              
import "encoding/binary"
 
 func writeSignature(w io.Writer) {
 	sig := [8]uint8{
@@ -233,7 +233,7 @@
                  CRC (Cyclic Redundancy Check) は誤り検出符号の一種。Go 言語では hash/crc32 パッケージにあるが、今回はこれも自前で実装する。PNG の仕様書に C 言語のサンプルコードが載っている (D. Sample CRC implementation) ので、これを Go に移植する。 
               

-
var (
+              
var (
 	crcTable         [256]uint32
 	crcTableComputed bool
 )
@@ -273,7 +273,7 @@
                  できた crc 関数を使って、chunk 一般を書き込む関数も用意しておこう。 
               

-
func writeChunk(w io.Writer, chunkType string, data []byte) {
+              
func writeChunk(w io.Writer, chunkType string, data []byte) {
 	typeAndData := make([]byte, 0, len(chunkType)+len(data))
 	typeAndData = append(typeAndData, []byte(chunkType)...)
 	typeAndData = append(typeAndData, data...)
@@ -367,7 +367,7 @@
                  今回ほとんどのデータは決め打ちするので、データに応じて変わるのは width と height だけになる。コードは次のようになる。 
               

-
import "bytes"
+              
import "bytes"
 
 func writeChunkIhdr(w io.Writer, width, height uint32) {
 	var buf bytes.Buffer
@@ -421,7 +421,7 @@
                    Adler-32 も CRC と同じく誤り検出符号である。こちらも zlib の仕様書に C 言語でサンプルコードが記載されている (9. Appendix: Sample code) ので、Go に移植する。 
                 

-
const adler32Base = 65521
+                
const adler32Base = 65521
 
 func updateAdler32(adler uint32, buf []byte) uint32 {
 	s1 := adler & 0xFFFF
@@ -468,7 +468,7 @@
                    実際にこの手抜き zlib を実装したものがこちら: 
                 

-
func encodeZlib(data []byte) []byte {
+                
func encodeZlib(data []byte) []byte {
 	var buf bytes.Buffer
 
 	binary.Write(&buf, binary.BigEndian, uint8(0x78))
@@ -508,7 +508,7 @@
                    先ほどの encodeZlib も使って実際に実装したものがこちら: 
                 

-
func writeChunkIdat(w io.Writer, width, height uint32, img image.Image) {
+                
func writeChunkIdat(w io.Writer, width, height uint32, img image.Image) {
 	var pixels bytes.Buffer
 	for y := uint32(0); y < height; y++ {
 		binary.Write(&pixels, binary.BigEndian, uint8(0))
@@ -535,7 +535,7 @@
                  特に追加のデータはなく、必要なのは chunk type の IEND くらいなので実装は簡単: 
               

-
func writeChunkIend(w io.Writer) {
+              
func writeChunkIend(w io.Writer) {
 	writeChunk(w, "IEND", nil)
 }
@@ -547,7 +547,7 @@ 最後に全ソースコードを再掲しておく。

-
package main
+            
package main
 
 import (
 	"bytes"
diff --git a/vhosts/blog/public/posts/index.html b/vhosts/blog/public/posts/index.html
index acd16a6c..4f75183b 100644
--- a/vhosts/blog/public/posts/index.html
+++ b/vhosts/blog/public/posts/index.html
@@ -178,7 +178,7 @@
           
           

- 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。 本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。 + 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。