Hatena::ブログ(Diary)

temitaの不思議空間

2013-05-30

Rails3でExcelで作ったSJISのCSVファイルをUTF-8で読み込む方法

22:39 | Rails3でExcelで作ったSJISのCSVファイルをUTF-8で読み込む方法を含むブックマーク

2013/05/30 Rails3, Ruby 1.9.3-p125

Excelで作ったCSVの読み込み方法を探してもいいものが見つからなかった。
誰も困ってないのかな。お気に入りのやつを作る。

過程

まず、試行錯誤してる最中のやつを載せる。Excelで作ったCSVSJISとして保存される。
DBUTF-8なので変換しなくてはいけない。

CSV.foreach(filename, encoding: "Shift_JIS:UTF-8") do |row|
  # …
end

ArgumentError: invalid byte sequence in UTF-8

で引っかかりまくる。
未定義文字があると、errorになるようだ?
open()を使ってやりましょうってあるけど、
Webでopen()とか恐怖症で使えない。(調べてないだけ、だけど。)

SJISで読み込んで、UTF-8に変換していくことにする。

CSV.foreach(filename, encoding: "SJIS") do |row|
  new_hash = row.to_hash
  row = Hash[new_hash.map { |k,v| k, v.encode("UTF-16BE", :invalid => :replace, :undef => :replace, :replace => '?').encode("UTF-8")] }]
end

それでも、

ArgumentError: invalid byte sequence in UTF-8

と出たりする。

終端文字が悪さをしているようだ。Excelの終端文字は"\r\n"になるみたいです。

row_sep: "\r\n"

を追加することにすることで直った。

結果

結果はこうなりました。

CSV.foreach(filename, headers: true, row_sep: "\r\n", encoding: "SJIS") do |row|
  new_hash = row.to_hash
  row = Hash[new_hash.map { |k,v| k, v.encode("UTF-16BE", :invalid => :replace, :undef => :replace, :replace => '?').encode("UTF-8")] }]
  Products.new(row).save!
end

たしか、redmineでもCSV読み込めたような。ソース読んでみよう。

参考

http://qiita.com/items/8559576b71642b79df67
http://naofumi.castle104.com/?p=1818
http://d.hatena.ne.jp/yarb/20110112/p1

2013-05-22

gitをいきなり覚えようとする人の疑問あるある載せてく

20:30 | gitをいきなり覚えようとする人の疑問あるある載せてくを含むブックマーク

2013/05/22 git

いきなりバージョン管理ツールに触れて、gitを理解しようとしてる人に関するあるある。挙げてく。
気軽に理解したい人向け。

gitってgithubとか聞くやつ?」
残念ながら、gitgithubは別物です。
git分散型バージョン管理ツールです。
github はコードをgitを通して共有したり公開するためのサービスです。

githubないとgit使えないんでしょ?」
うれしい事に、gitはパソコン1台から始めれます。
github の登録は必要ないですが、gitインストールは必要です。

gitは複数人でsvnは1人用なんですか?」
うれしい事に、gitは1人でも複数人でも利用できます。

「複数人で使う時以外はgitは必要ないんでしょ?」
うれしい事に、1人でも十分効果的な(コード復元など)使い方ができます。

「まずは、GUIから始めたいんですけど」
残念ながら、GUIは大抵 git を理解している人前提に作られてます。
GUI専用用語が増えて混乱する場合があります。

「コマンド多すぎて覚えられない」
残念ながら、自由度が広すぎて全部のコマンドを覚えるのは難しいです。
やりたい事から検索するのがいいです。

「cloneとかno-ffとかpushとかpullとかfetchとかmergeとかrebaseとかとか、全部覚える必要は・・?」
clone, push は良く使いますが、それ以外は他人のコードを持ってきたりするときに必要です。
必要なときに調べて使えばいいですが、no-ff は先に調べて追加する癖をつけておくといいかもです。

「用語が多すぎて覚えられない」
残念ながら、自由度が広すぎて全部の用語を覚えるのは難しいです。

「リモートリポジトリ、branch, HEAD, ref, master, origin, bare...」
うれしい事に、用語を知らなくても使うことはできます。後から理解しても遅くありません。

「PUSHとかあるけど、1人開発の場合はどこにPUSHすんの?」
1人開発の場合はPUSHは無くてもかまいません。

「あなたの日常的に使う重要なコマンドおしえて」
`git add -p' #変更を細かく追加
`git diff --cached' ##何を追加したか忘れるので確認
`git commit -m "fix typo username bug" ' #登録(コミット
のループ
その他は前のを戻したり、PUSHしたり、分けたり、できるんだけど、そのたびに検索

「操作方法の図がループしてあるけど、どこからがスタートなの?」
初期化(init)またはコードを持って来る(clone)後は、`git add' から始まります。

「最新の使い方を覚えたいんだけど」
git-flow で検索するとスマートな使い方を知ることができます。

ここまで。
気付いたら追加していこうかな。

2013-05-02

Rubyで読みやすいからといって and と or を代入(=)と一緒に使うとさらにややこしい

01:04 | Rubyで読みやすいからといって and と or を代入(=)と一緒に使うとさらにややこしいを含むブックマーク

環境:Ruby 1.9.3

Ruby演算子と優先度の話で
初歩的な話だけど見落としていたことを書きます。

rubyには 「&&」「||」 演算子の他に「and」「or」があります。
『 あれでしょ、「and」 と 「or」 は優先度が同じだけど、
「&&」は「||」より優先度が高いってやつ。 』

この文章はよく見る。
でも、気をつけなければいけないのは、もう一つ
「and」と「or」は「=」より優先度が低いこと。

まず、「and」と「&&」とかの比較を見てみると、

irb> true || true &&  false    #=> true
irb> true or true and false    #=> false

irb> true || false &&  false   #=> true
irb> true or false and false   #=> false

という結果になって、

irb> true || (true && false)     #=> true
irb> (true or true) and false    #=> false

irb> true || (false && false)    #=> true
irb> (true or false) and false   #=> false

こう解釈される。

同じ解釈をするには、括弧で括ってしまえばいいのだ。

irb> true || (true && false)     #=> true
irb> true or (true and false)    #=> true

irb> true || (false && false)    #=> true
irb> true or (false and false)   #=> true

じゃあ、それを代入したらどうなるか。

気をつけるべきは、
「and」と「or」は「=」よりも優先度が低いこと。

これを知らないともっとややこしいことになる。
さっきの解釈結果をそのまま代入してみる。

irb> flag = true || (true && false)     #=> true
irb> flag #=> true
irb> flag = true or (true and false)    #=> true
irb> flag #=> true
irb> flag = true || (false && false)    #=> true
irb> flag #=> true
irb> flag = true or (false and false)   #=> true
irb> flag #=> true

同じじゃないかと思っても、

irb> flag = "truedayo" and (true or false)   #=> false
irb> flag #=> "truedayo"
irb> flag = "truedayo" && (true || false)   #=> false
irb> flag #=> false

なんと、flag に一部が代入されてしまった。
気をつけよう。ということでした。

「and」と「or」の使い道は、代入目的で使うというのが正しいのかな。

2013-02-09

android mini PC の mk808 を Windows7 で adb usb 接続を試す

05:35 | android mini PC の mk808 を Windows7 で adb usb 接続を試すを含むブックマーク

2012/02/10 環境:Windows7 64 bit

android の miniPC mk808 ガジェットをゲットしました。
MINI TV Dual-Core A9 Processor(中国製)とか書いてます。
これ、armなんですが一昔前のプロセッサ並の性能があります!
PC側から adb usbデバッグしたいってことありますよね。
意外と手こずったので楽できるように手順を載せます。

やることは(後で詳細)、

という手順、ぐぐって来た方はこれで分かるかな。

Android SDKを手に入れる

これは、
Download Android Studio and SDK tools  |  Android Developers
からダウンロードして解凍

Google USB Driverを取得

解凍したフォルダの中の
SDK Manager.exe
を実行してGoogle USB Driverにチェックをつけてインストール

Android デバッグモードでつなぐ

アンドロイドを繋いで起動してください。
Androidの画面をみてください。

0x2207の追記

c:\user\ユーザ名\.android\adb_usb.ini
にファイルを作成して「0x2207」を追記する

デバイスマネージャでドライバインストール

そこには、VIDとPIDが書かれているので、
adt-bundle-windows-x86_64\sdk\extras\google\usb_driverの
android_winusb.infに以下を追記

[Google.NTamd64]
;MK808
%SingleAdbInterface%     = USB_Install, USB\VID_2207&PID_0006&REV_0222
%CompositeAdbInterface%  = USB_Install, USB\VID_2207&PID_0006

VIDとPIDは各自変更になるかもしれません。

デバイスマネージャを開いて?デバイスインストールを選ぶ
ドライバーソフトの参照先に
adt-bundle-windows-x86_64\sdk\extras\google\usb_driver
を選択するとインストールが完了する。

完了


adb kill-server
adb shell

をして表示できれば完了です。

あと、コマンドプロンプトで操作するのは難しいので、adb 接続ができる
putty改良版を載せておきます。

ADB enhanced Putty (replacement for "ad… | Android Development and Hacking

これでTab補完とかができるようになります。

参考
jikiba の 備忘録 / memorandum book by jikiba MK808 その1 ADB 接続
おっさんエンジニアの実験室: MK808でadbが出来るまでの長い道のり

2013-01-06

p {:key => 123} が動かないせいでRubyが少し嫌いになった

17:09 | p {:key => 123} が動かないせいでRubyが少し嫌いになったを含むブックマーク

すごい些細なことかもしれないです。

ハッシュを直接outputするとエラーが出る。

[10] pry(main)> p {:key => 123}
SyntaxError: unexpected tASSOC, expecting '}'
p {:key => 123}

代入後だとちゃんと動く。なにが違うんだよ。

[10] pry(main)> p h = {:key => 123}
{:key=>123}
=> nil

ちなみに配列だと問題ない

[11] pry(main)> p [1,2,3,4,5]
[1, 2, 3, 4, 5]
=> nil

ブロックの{}とが同じだから解釈できないって理由だろうけど。
パフォーマンスの問題なのか?
妥協するしかないのかね。

keyesberrykeyesberry 2013/01/06 23:16 p h={}とするかp({})とカッコを付けるんでしょうね。

temitatemita 2013/01/07 12:33 括弧()をつけると大丈夫なんですね!ありがとうございます。