restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

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,Ruby,Emacsでの文字設定を調べてみた。

 

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

emacs上・・・utf-8

f:id:restofwaterimp:20140125083157p:plain

 

はて、なんだろうと考えていたら、この本って、実行環境がWindowsが前提だったことを思い出した。

そこで、#! ruby -Ksを試しに恥ずして、実行したら、文字コードに関するエラーは外れた。

おまじないと思って、無視していたのだが、書籍を見なおしたら、一応書いてあった。

#! ruby -Ks ・・・ ver 1.8までのRubyがファイルの日本語を判定するために使う

# -*- coding: xxxxx -*- ・・・ ver1.9以降のRubyのファイルが日本語を判定するために使う

 

と、いうことであった。

つまりは複数のバージョンの指定を記載しており、多分、先に書いてあった旧バージョンの文字コードを判定してしまっていたのだろう。

 

そのため、実行時に、RubyはこのファイルをWIndows-31Jとして認識しているため、外部ファイルであるcsvUTF-8なのに、実行ソースはWindows-31Jで認識していた。という結論である。

いい勉強になりました。

 

参考にしたURL

OSとRubyスクリプト文字コードが異なる場合の対策

http://pgnote.net/?p=211

【メモ】バックスラッシュの入力にはまった

Macemacsを使って、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/glassfishtomcatの違い_part_1

を参考に、GlassFishのポートを変更。

 

Tomcatlocalhost/config/server.xmlでポート番号を8080から18080に変更したのだが、うまく変わらなかったので、できる方で。(なんで変わらなかったのかはなぞ・・)

 

2.もらったソースをEclipseに取り込む。

 Tomcatプロジェクトにして、Servlet情報をビルドパスに・・。

  → とりあえず、コンパイルエラーはなし。

 

3.MySQLをインストール

  → って、昔、インストールしたんだっけと・・・。

    システム環境設定におもいっきりMySQLがあったので、version 5.5をそのまま利用。

 

    ただ、数ヶ月以上使っていなかったかつ、初心者クラスのため、起動の仕方をすっかり忘れていた。。。

    Windowsの用に、mysql - u  password -pじゃだめなんね。

    しっかり、実行することをアピールして、./mysql xxxxと書かないと起動しなかった。.shということをよく忘れてしまいます。

 

で、とりあえず、動いたので、ここから動かしながら拡張していこうかと。。。

f:id:restofwaterimp:20140116233247p:plain

 

 

徐々に学習です・・・。

【メモ】MacにJava EE7のインストール

このサイトを見て、DISPLAYの設定が必要なことを確認しインストール

 

shをそのまま実行したら、以下のメッセージが出たので・・・。

This program requires DISPLAY environment variable to be set.

 

Please re-run after assigning an appropriate value to DISPLAY.

 

http://sometimes.hatenablog.jp/entry/2013/11/03/003243

Jenkinsを使ってみた

会社の社内勉強会でJenkinsの使い方の例を紹介することがあるそうなんで、事前にJenkinsを触ってみようと。

 

http://www.buildinsider.net/enterprise/jenkins/01

 

のサイトを利用して、インストールしてみる。

 

1.Xcodeのインストール

 すでにインストールされていたので、飛ばす・・・

2.homebrewのインストール

 http://brew.sh/index_ja.html

 を参照にインストール・・・。

 やってみたら、どうも過去にインストールされていた・・・。

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起動の確認

f:id:restofwaterimp:20140106210130p:plain

 

単純な事例で、shellの起動を実施してみた。

 

詳しくJenkinsを知らないので、これから学ぶことになるが、キーワードで継続的イテレーションとか記載されている。(どこの記事だっけな?)

 

上記のサイトにCronに似ているが条件をフック(多分複雑に出来るということか)したり、出力形式を変更できること、また自動化してテストできるというの利点として書かれている。

 

社内勉強会でも、面倒なデプロイ作業から、テストの自動化を謳っていそうなので、そこがポイントなのかな?

 

前回、研修でもらったソースをベースに使ってみようかと思います。