cygwinでgem updateに失敗する(1)

こんばんは。
最底辺です。

久々にIT関係記事です。
rubyでも勉強してみようかとcygwinにruby入れたんですが、
なんかgemってやつのupdateが上手くいかないようです。
(なんでcygwinに入れたってツッコミはなしで。。。)

$ gem update
ERROR: While executing gem ... (ArgumentError)
invalid byte sequence in UTF-8

う~ん。これは、困った。とりあえず、ググるか。

http://chiranoura.nobody.jp/articles/2014-10-06_01_fix_rubygem/

この辺りの情報かな?
なんか、win32\registry.rbとかいうのが怪しいらしい。
という言うことで、リンク先の更にリンクにあった以下を参考に修正してみました。

$ diff -u registry.rb 'C:\cygwin64\usr\share\ruby\2.0.0\win32\registry.rb'
--- registry.rb 2014-09-04 20:54:39.138646900 +0200
+++ "C:\\cygwin64\\usr\\share\\ruby\\2.0.0\\win32\\registry.rb" 2014-09-04 20:54:44.109928700 +0200
@@ -62,6 +62,9 @@
 For detail, see the MSDN[http://msdn.microsoft.com/library/en-us/sysinfo/base/predefined_keys.asp] article.

 =end rdoc
+  WCHAR = Encoding::UTF_16LE
+  WCHAR_SPACE = "\0".encode(WCHAR).freeze
+  LOCALE = Encoding.find(Encoding.locale_charmap)

   class Registry

@@ -164,12 +167,12 @@
         extend Fiddle::Importer
         dlload "kernel32.dll"
       end
-      FormatMessageA = Kernel32.extern "int FormatMessageA(int, void *, int, int, void *, int, void *)", :stdcall
+      FormatMessageW = Kernel32.extern "int FormatMessageW(int, void *, int, int, void *, int, void *)", :stdcall
       def initialize(code)
         @code = code
-        msg = "\0".force_encoding(Encoding::ASCII_8BIT) * 1024
-        len = FormatMessageA.call(0x1200, 0, code, 0, msg, 1024, 0)
-        msg = msg[0, len].force_encoding(Encoding.find(Encoding.locale_charmap))
+        msg = WCHAR_SPACE * 1024
+        len = FormatMessageW.call(0x1200, 0, code, 0, msg, 1024, 0)
+        msg = msg[0, len].encode(LOCALE)
         super msg.tr("\r", '').chomp
       end
       attr_reader :code

実は、ここまで約2時間!! さすが最底辺。

$ gem update
...
Building native extensions.  This could take a while...
ERROR:  Error installing json:
        ERROR: Failed to build gem native extension.

    /usr/bin/ruby.exe -r ./siteconf20150515-1396-8b5m10.rb extconf.rb
creating Makefile

make "DESTDIR=" clean
rm -f
rm -f generator.so  *.o  *.bak mkmf.log .*.time

make "DESTDIR="
gcc -I. -I/usr/include/ruby-2.0.0 -I/usr/include/ruby-2.0.0/ruby/backward -I/usr/include/ruby-2.0.0 -I. -DJSON_GENERATOR     -ggdb -O2 -pipe -Wimplicit-function-declaration    -o generator.o -c generator.c
rm -f generator.so
gcc -shared -o generator.so generator.o -L. -L/usr/lib -L. -fstack-protector -Wl,--export-all-symbols -Wl,--enable-auto-image-base,--enable-auto-import    -lruby200  -lpthread -lrt -ldl -lcrypt
/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/../../../../x86_64-pc-cygwin/bin/ld: -lcrypt が見つかりません
collect2: エラー: ld はステータス 1 で終了しました

お、さっきのエラーはなくなったようだけど、なんかまだ怪しいな!!(続く。。。)