ベトナムでfacebookを使う方法

ベトナムではfacebookはアクセス制限されていて、通常アクセス出来ない。
Hootsuite のようなクライアント経由であれば投稿できそうな気がするけど、やっぱり直接アクセスできたほうが便利

eHow に記事があったので軽く翻訳

概要としてはパソコンのDNSサーバー設定を Google Public DNS にしなさいということ
Windowsだと、以下のような手順になります。

  1. コントロールパネルから「ネットワークの設定」を選ぶ
  2. プロパティを選ぶ
  3. IPv4 のプロパティを選択
  4. DNSサーバーにGoogle Public DNSを設定する
    1. eHow の記事によるとGoogle Public DNS 8.8.8.8 / 8.8.4.4 以外にも以下のDNSが使えるらしい
    2. 208.67.222.222 / 208.67.220.220 (OpenDNS)
    3. 198.153.192.1 / 198.153.194.1 (Norton DNS)

これだけ。

読んで気がついたけど、そういえば、ベトナムのオフィスのPCでDNSが 8.8.8.8 に設定してるのがあったな。。

RVM環境での sudo は rvmsudo だった。。

EC2環境で ec2-user でログインしていて sudo gem update ってしたら、ruby 1.8.7 環境のgem をupdateしてくれた。
RVMで上にある ruby 1.9.2 の環境の gem update のために sudo rvm gem update みたいな感じか?とおもったら、rvmsudo というコマンドがあった。

文をMeCabで単語に分解して、json として返す処理を作ったところ、to_json すると、すべての単語が \\ufffd になってしまうという問題が発生した。

MeCabが返す string に str.force_encoding(Encoding::UTF_8) とすると、ちゃんと to_json することができた。

以下の処理では文字がすべてつぶれてしまう。。

ruby-1.9.2> m = MeCab::Tagger.new
ruby-1.9.2> p m.parse("先週、川崎フロンターレの試合を見に行ったけど、選手がほとんど分からなかったぞ。").split("\n").map{|w| w.split(",")[0].split(' ')[0] }.to_json
"[\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"\\ufffd\\ufffd\\ufffd\",\"EOS\"]"

str.force_encoding(Encoding::UTF_8) することで、正しい文字列の集合を得ることができた

ruby-1.9.2> m = MeCab::Tagger.new
ruby-1.9.2> p m.parse("先週、川崎フロンターレの試合を見に行ったけど、選手がほとんど分からなかったぞ。").split("\n").map{|w| w.split(",")[0].split(' ')[0].force_encoding(Encoding::UTF_8) }.to_json
"[\"\\u5148\\u9031\",\"\\u3001\",\"\\u5ddd\\u5d0e\",\"\\u30d5\\u30ed\\u30f3\\u30bf\\u30fc\\u30ec\",\"\\u306e\",\"\\u8a66\\u5408\",\"\\u3092\",\"\\u898b\",\"\\u306b\",\"\\u884c\\u3063\",\"\\u305f\",\"\\u3051\\u3069\",\"\\u3001\",\"\\u9078\\u624b\",\"\\u304c\",\"\\u307b\\u3068\\u3093\\u3069\",\"\\u5206\\u304b\\u3089\",\"\\u306a\\u304b\\u3063\",\"\\u305f\",\"\\u305e\",\"\\u3002\",\"EOS\"]"

なんで???

ruby 1.9 では Stringが文字コード情報を持っているということで、 str.encoding で文字コード情報を確認

ruby-1.9.2-p180 :020 > m.parse("先週、川崎フロンターレの試合を見に行ったけど、選手がほとんど分からなかったぞ。").split("\n").map{|w| p w.split(",")[0].split(' ')[0].encoding }
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>
#<Encoding:ASCII-8BIT>

MeCab はStringを ASCII で返している。。
なので、文字列はそのままで、文字コード情報をUTF-8 に変換してあげる必要があるようですね。

force_encodingメソッドは、文字列の文字コード情報を引数encodingに切り替えます。引数には文字列かEncodingオブジェクトを指定します。レシーバ自身を変更するメソッドです。戻り値はレシーバ自身です。

force_encodingメソッドは文字コード情報を変更しますが、文字列が持っているバイト列は変更しません。一般的な意味で「文字コードの変換」を行いたいときは、encodeメソッドを使います。


参考: