rcmdnk's blog
Last update

Cygwin Simplified: 30 pages of Cygwin in 30 minutes

Octopressをアップデート は、Mac内で行っていた作業だったんですが、 WindowsのCygwinでもGem等をアップデートして使えるようにしました。

Gemのアップデート

OctopressのディレクトリはDropboxで同期してるので ファイル群は揃っています。

なので、Octopressのディレクトリへ行って

$ bundle install
...

chcp

bundle installしたら試しにサイトを作ってみます。

$ rake generate
## Set the codepage to 65001 for Windows machines
rake aborted!
Errno::ENOENT: No such file or directory - chcp 65001
.../octopress/Rakefile:37:in ``'
.../octopress/Rakefile:37:in `<top (required)>'
(See full trace by running task with --trace)
$

これは、新しいRakefileの最初の方にある

Rakefile
1
2
3
4
5
6
...
if (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
  puts '## Set the codepage to 65001 for Windows machines'
  `chcp 65001`
end
...

の部分が原因。 これは、Cygwin等の場合に文字コードを65001(UTF-8)に設定しています。 (これSupport UTF-8 in Markdown filesとかだと別の場所でUTF-8にエンコードしたりしている例。)

日本語を書いてこの部分を削除しても、今のところそんなに問題が出てないのですが (kramdownだから?)、 なんとなくこれを使いたいし、なんでchcpが無いのかわからない。

で、チョット探してみると、似たような物が

/cygdrive/c/Windows/System32/chcp.com
(= C:\Windows\System32\chcp.com)

にあったので これを直接呼んで上げるように、

1
2
3
4
5
 if (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
   puts '## Set the codepage to 65001 for Windows machines'
-  `chcp 65001`
+  `chcp.com 65001`
 end

としてあげると動く様になりました。

昔?(むしろ新しいもの?)は、.extと同様に.comファイルも.comの部分を除いた形でも 呼んだりすることが出来た?みたいですが、 今使ってる環境だとこれが呼べない様です。

いまどき.comファイル - 檜山正幸のキマイラ飼育記

とりあえず.comを付けておいても悪くはならないようなので加えることに。

Fix the codepage issue for Windows developers · Issue #1835 · jekyll/jekyll

Octopress rake install difficulties - Google グループ

Octopress Setup - Cygwnni Bruce B Campbell

追記

自分のdotfilesを見なおしてみたら、 Cygwinでは最初に

chcp.com 65001 >/dev/null

.bashrcの中から呼ぶようになっていました。

dotfiles/.win.sh: https://github.com/rcmdnk/dotfiles/blob/master/.win.sh

なので、上の設定が無くても大丈夫そうだったのはこれのおかげもあるっぽい。

追記ここまで

rebase ruby

chcpを対処したらまたテスト。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ rake go
## Test build for source/_posts/2014-07-10-test.md

## Stashing other posts
## Generating Site with Jekyll
    114 [main] ruby 7824 child_info_fork::abort: address space needed by 'stringio.so' (0x4E0000) is already occupied
    132 [main] ruby 7700 child_info_fork::abort: address space needed by 'stringio.so' (0x4E0000) is already occupied
   8500 [main] ruby 2924 child_info_fork::abort: address space needed by 'stringio.so' (0x4E0000) is already occupied
identical source/stylesheets/screen.css
Configuration file: .../octopress/_config.yml
            Source: source
       Destination: ~/tmp/octopress/public
      Generating...
      3 [main] ruby 6328 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
      3 [main] ruby 6976 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
   1030 [main] ruby 2304 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
  39776 [main] ruby 7244 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
  13282 [main] ruby 6812 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
  41343 [main] ruby 1528 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
  36630 [main] ruby 8028 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
      2 [main] ruby 1244 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
   9539 [main] ruby 4532 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
      2 [main] ruby 6352 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
      3 [main] ruby 3752 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
      2 [main] ruby 6472 child_info_fork::abort: address space needed by 'stringio.so' (0x290000) is already occupied
  Liquid Exception: No such file or directory - C:\Windows\system32\cmd.exe in _posts/2014-07-10-test.md/#excerpt
                    done.
## Restoring stashed posts
   8295 [main] ruby 6372 child_info_fork::abort: address space needed by 'stringio.so' (0x4E0000) is already occupied

みたいなエラーが出ました。

どうも、 CygwinでCan’t fork()とかのエラーが出た時の対処法 の辺でやったみたいにライブラリファイルとかがをrebaseする必要がある様子。

$ cd  /usr/lib/ruby/
$ find ./ -name "*.dll" -o -name "*.so" >rebase.lst
$ rebase -n -s -T ./rebase.lst

で上に出てくるstringio.soも含めたRuby内の全ライブラリをrebase出来ました。

COMSPEC

次にテストしてみると、

$ rake generate
...
      Generating...
  Liquid Exception: No such file or directory - C:\Windows\system32\cmd.exe in _posts/2014-07-10-test.md/#excerpt
                    done.
## Restoring stashed posts

みたいな感じでファイルが見つからない、と出ます。

コレに対してはCOMSPECと言う環境変数を

$ export COMSPEC=/cygdrive/c/Windows/System32/cmd.exe

としてあげれば良いとのこと。 (上に出した.win.sh(.winrc) (.bashrcから呼ばれる)の中に追加しておきます。)

Jekyll on Windows with Cygwin: http://nathanielstory.com/2013/12/28/jekyll-on-windows-with-cygwin.html

Liquid exception under Cygwin · Issue #1383 · jekyll/jekyll

python2

もう一度。

$ rake generate
...
      Generating...
which: no python2 in (...PATH...)
  Liquid Exception: undefined method `match' for nil:NilClass in _posts/2014-07-10-test.md/#excerpt
jekyll 2.1.0 | Error:  undefined method `match' for nil:NilClass

と、python2が見つからない、とのこと。 確かに無いわけですが、pythonの2系はインストールしてるわけで、 単にリンクを作ってあげれば良いとのこと (これもこちらJekyll on Windows with Cygwin参照)。

$ ln -s /usr/bin/python /usr/local/bin/python2

でOK。

これで、ほとんどのポストなんかはbuild出来る様になりました。

一部コードブロックを修正

一部のコードブロックを含むポストをビルドしようとした時に、

      Generating...
  Liquid Exception: undefined method `[]' for nil:NilClass in _posts/2014-07-10-test.md/#excerpt
jekyll 2.1.0 | Error:  undefined method `[]' for nil:NilClass
## Restoring stashed posts

とエラーが出ます。

どうやら、コード内に%が含まれて、かつ

{% codeblock Rakefile lang:ruby %}

の様に、codeblockに対してファイル名等の引数を与えている場合に起きる様子。

これに対処するには

  1. codeblockで引数を与えない。({% codeblock %}の様にする)
  2. %をエスケープ
  3. rawで囲う

が考えられ、これらは全部有効です。

ただ、ファイル名や言語設定はしたいし、エスケープは環境依存があるかもしれないし結構危険だったりもするので、 rawタグを使って行うのが他の環境でも悪い影響を与えず、安全かつ有用な感じです1。 (Cygwin特有の問題なのか、それともRubyのバージョンの問題なのか。 Cygwinではapt-cygで取れるrubyがまだ1.9系で、他では2.0.0を使っています。)

とりあえず

これで動くようにはなりました。

Sponsored Links
Sponsored Links

« Octopressでの時間帯の地域の設定 Octopressのアップデート@coLinux (debian) »

}