Rubyで文字をasciiからutf-8にする方法
作りながら学ぶRuby入門の26章をmac環境でやっていたら、
登録時に、画面ではutf-8だが、webrick経由で、mysqlへ取り込むときのinsert文が
{"id"=>"201122", "title"=>"\xE3\x81\x9F\xE3\x81\x97\xE3\x81\x8B\xE3\x81\xAA\xE3\x81\x93\xE3\x81\xA8", "author"=>"\xE3\x81\x88\xE3\x81\x88\xE3\x81\xAE\xE3\x81\x8B\xE3\x81\xAA\xEF\xBC\x9F", "page"=>"100", "publish_date"=>"20100202"}
[2014-02-17 23:15:13] ERROR Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT
って感じで、asciiで来てしまい、mysqlへ取り込めない状況に
さて、どうしたものかとググルと、force_encodingを使えば行けそうな。
■参考URL
http://qiita.com/yahihi/items/add104d5a0b848f0b5ff
と、いうことで、
dbh.do("insert into bookinfos values('#{req.query['id']}', '#{req.query['title'].force_encoding("utf-8")}','#{req.query['author'].force_encoding("utf-8")}','#{req.query['page']}','#{req.query['publish_date']}');")
を文字に指定することで、正常に登録されるように。
項目名 | 登録データ |
---|---|
id | 2022 |
title | だいじょうぶ |
author | けけけ |
page | 10 |
publish_date | 20120202 |
ただ、これを一個一個気にしながら強制的に文字コードを直さないと行けないとなると、若干Rubyの設定が煩わしい。
何か、よい策があるような気もするが、コーディングを行いながら気づいていこうかと思う。
【メモ】文字コード(#! Ruby -Ksの意味)
「作りながら学ぶRuby 入門」の16章で、csvファイルからのファイル入出力を試していたら、以下のエラーが発生。
実行環境 mac OS 10.8
Ruby 2.1.0
Emacs 24.3
ex1601.rb:25:in `toFormattedString': incompatible character encodings: UTF-8 and Windows-31J (Encoding::CompatibilityError)
from ex1601.rb:82:in `block in listAllBookInfos'
from ex1601.rb:81:in `each'
from ex1601.rb:81:in `listAllBookInfos'
from ex1601.rb:174:in `run'
from ex1601.rb:189:in `<main>'
外部との入出力時がなく、ruby の実行環境上での文字のやりとりでは出てこなかったので、なんかあるのかなと調べてみた。
OS・・・UTF-8だよな〜
locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=
作成ファイル・・・uft-8
file --mime ex1601.rb
ex1601.rb: text/x-c++; charset=utf-8
はて、なんだろうと考えていたら、この本って、実行環境がWindowsが前提だったことを思い出した。
そこで、#! ruby -Ksを試しに恥ずして、実行したら、文字コードに関するエラーは外れた。
おまじないと思って、無視していたのだが、書籍を見なおしたら、一応書いてあった。
#! ruby -Ks ・・・ ver 1.8までのRubyがファイルの日本語を判定するために使う
# -*- coding: xxxxx -*- ・・・ ver1.9以降のRubyのファイルが日本語を判定するために使う
と、いうことであった。
つまりは複数のバージョンの指定を記載しており、多分、先に書いてあった旧バージョンの文字コードを判定してしまっていたのだろう。
そのため、実行時に、RubyはこのファイルをWIndows-31Jとして認識しているため、外部ファイルであるcsvはUTF-8なのに、実行ソースはWindows-31Jで認識していた。という結論である。
いい勉強になりました。
参考にしたURL
OSとRubyスクリプトの文字コードが異なる場合の対策
【メモ】バックスラッシュの入力にはまった
¥をバックスラッシュとして入力しても、改行されない。
http://mac.just4fun.biz/?macの設定%2Fバックスラッシュの入力方法
を参考に、英数で入力するときの¥を\になるように変更。
環境設定で変えるもんなんだなと。
【メモ】値渡し?参照渡し?
確か、rubyって値渡しだよな〜〜と。
入門Rubyには参照渡しっぽく以下のソースの説明が書いてあったので、「?」に。
#! ruby -Ks
#-*- coding:UTF-8 -*-
str1 = "Hello"
str2 = "WaWoo"
str3 = str1
puts str1;
puts str2;
puts str3;
str1 = ""
puts str1;
puts str3;
結果・・・
Hello
WaWoo
Hello
Hello
まあ、当然なのですが、str1とstr3が同じ参照先を見ているという感じに書いてあったんですね。。。
でも、そうならば、str1=""をした時に、str3も""になるような。
str1=""としたときに異なるアドレス空間に置かえるのか??
んなわけないような・・と以下のサイトでやっぱり値渡し(というかcallしてないから・・)というのを
値渡しと参照渡しの違いを理解する
http://magazine.rubyist.net/?0032-CallByValueAndCallByReference
研修で頂いた環境をMacで動かせた
先月にグローバルナレッジで受講した研修のプログラムとデータを持ち帰り、
自己研鑚用に環境構築・・・。
研修はWinであったが、自宅のPCはMacなので、ちょっぴり設定に戸惑い・・・。
やったことは以下のとおり・・。
1.Java SE5で使っていたので、Java EE 7 をインストール。
インストール後、GlassFish Serverも自動で入ってしまって、Tomcatとportがかち合ったので、
https://blogs.oracle.com/yosshi/entry/glassfishとtomcatの違い_part_1
を参考に、GlassFishのポートを変更。
Tomcatのlocalhost/config/server.xmlでポート番号を8080から18080に変更したのだが、うまく変わらなかったので、できる方で。(なんで変わらなかったのかはなぞ・・)
2.もらったソースをEclipseに取り込む。
Tomcatプロジェクトにして、Servlet情報をビルドパスに・・。
→ とりあえず、コンパイルエラーはなし。
3.MySQLをインストール
→ って、昔、インストールしたんだっけと・・・。
システム環境設定におもいっきりMySQLがあったので、version 5.5をそのまま利用。
ただ、数ヶ月以上使っていなかったかつ、初心者クラスのため、起動の仕方をすっかり忘れていた。。。
Windowsの用に、mysql - u password -pじゃだめなんね。
しっかり、実行することをアピールして、./mysql xxxxと書かないと起動しなかった。.shということをよく忘れてしまいます。
で、とりあえず、動いたので、ここから動かしながら拡張していこうかと。。。
徐々に学習です・・・。
【メモ】MacにJava EE7のインストール
このサイトを見て、DISPLAYの設定が必要なことを確認しインストール
shをそのまま実行したら、以下のメッセージが出たので・・・。
This program requires DISPLAY environment variable to be set.
Please re-run after assigning an appropriate value to DISPLAY.
Jenkinsを使ってみた
会社の社内勉強会でJenkinsの使い方の例を紹介することがあるそうなんで、事前にJenkinsを触ってみようと。
http://www.buildinsider.net/enterprise/jenkins/01
のサイトを利用して、インストールしてみる。
1.Xcodeのインストール
すでにインストールされていたので、飛ばす・・・
2.homebrewのインストール
を参照にインストール・・・。
やってみたら、どうも過去にインストールされていた・・・。
It appears Homebrew is already installed. If your intent is to reinstall you
should do the following before running this installer again:
rm -rf /usr/local/Cellar /usr/local/.git && brew cleanup
3.Jenkinsのインストール
4.Jenkinsの起動
java -jar /usr/local/Cellar/jenkins/1.490/libexec/jenkins.war
5.jenkins起動の確認
単純な事例で、shellの起動を実施してみた。
詳しくJenkinsを知らないので、これから学ぶことになるが、キーワードで継続的イテレーションとか記載されている。(どこの記事だっけな?)
上記のサイトにCronに似ているが条件をフック(多分複雑に出来るということか)したり、出力形式を変更できること、また自動化してテストできるというの利点として書かれている。
社内勉強会でも、面倒なデプロイ作業から、テストの自動化を謳っていそうなので、そこがポイントなのかな?
前回、研修でもらったソースをベースに使ってみようかと思います。