てみたの不思議空間【後ろ】

フィーリングで感じたことを書く

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

2013/05/30 Rails3, Ruby 1.9.3-p125

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

過程

まず、試行錯誤してる最中のやつを載せる。Excelで作ったCSVはSJISとして保存される。
DBはUTF-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読み込めたような。ソース読んでみよう。

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

2013/05/22 git

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

「gitってgithubとか聞くやつ?」
残念ながら、gitとgithubは別物です。
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 で検索するとスマートな使い方を知ることができます。

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

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」の使い道は、代入目的で使うというのが正しいのかな。

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を手に入れる。
  • SDK managerでGoogle USB Driverをインストールする
  • androidをデバッグモードで接続する
  • c:\user\ユーザ名\.android\adb_usb.ini に 「0x2207」を追記
  • デバイスマネージャで?デバイスを確認してVIDとPIDを取得
  • android_winusb.infにVIDとPIDを追記する
  • デバイスマネージャでドライバインストール
  • adb kill-server&adb shell

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

Android SDKを手に入れる

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

Google USB Driverを取得

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

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

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

  • 設定からUSBを選んでconnect to PCにチェックを入れる
  • developer setting からデバッグオプションにチェックを入れる
  • 右下が as media connected から USB debugging connectedに変わればOK
0x2207の追記

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

デバイスマネージャでドライバのインストール
  • デバイスマネージャを開いて?のデバイスを探す
  • 右クリックプロパティ→詳細のハードウェアID項目をみる

そこには、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改良版を載せておきます。

http://forum.xda-developers.com/showthread.php?t=803225

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

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

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

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

groonga勉強会3でrroongaを使った検索サービスの発表してきた[ニコ番]

てみた!です。
全文検索エンジンgroongaを囲む夕べ 3 @groonga : ATND
に行って発表させていただきました。

発表資料はこれです。

以前のgroonga勉強会では、groonga本体についてだったのですが、
今回はユーザの活用事例をメインに開かれました。

勉強会だし、何も考えずに発表しまーすっといってみたら、
定員150人!ユースト200人!ニコ生400人でした!
groonga大人気!

私の発表内容は、「rroongaで生放送コメントを検索してみた」でした。
サービスはニコ番です。

今回は生放送コメントとして、ニコニコユーザー生放送を対象としました。
最初からニコニコ生放送を利用していない方には、
わかりずらい内容になってしまったと反省。。
それでも言いたかったこととしては、
rroongaは、生放送のようなコメントがどんどん書き込まれる状況でも、
即座にデータベースに反映され、すばやく検索できることです。
やってみてつまずきそうなところはいろいろ盛り込んだつもりです。
Railsとの連携図とかも載せてみたのですが参考になったでしょうか。

懇親会にも参加させていただきました。
milkodeのスピーカー:おんがえしさん
数万のソースコードから目的の一行を一瞬で見つけ出す、Milkode - ブログのおんがえし
苦労裏話などが聞けましたhehehe!
新たなお仕事チャンスあるかなというワクワクだったり、とっても楽しかったです!
また参加したいですね!

ニコニコ生放送の便利ツール作ってみた。[ニコニコール:Zero]

ニコニコユーザ生放送便利ツール作ってみたのでちょっと紹介します。
ニコニコール:Zero && Nicoban の二つのサービスが一緒になりました。

ニコニコール:Zeroってなに?

次枠移動用のユーザ放送新着通知ツール。ニコニコアラートのような物

特徴? スムーズな次枠移動がコンセプト。
インストールなし(ブラウザのみ)でMacでも使えて簡単。ニコニコール:Zero は待機しているニコニコの生放送があった場合に次枠へ誘導してくれるツールです。通知はプッシュ配信に対応しているので更新ボタンを連打する必要が無くなります。

公式ニコ生アラートがあるけど? コミュニティに入るかを次枠で決めるときとかに使える。ブラウザの画面に表示されるので気づきやすい。生主は前枠でお知らせすると次枠へ誘いやすいです。

ブラウザだったら通知までにラグがあるんじゃないの? 一定時間ごとに更新されるわけではなく、放送が開始されたタイミングで通知されます。

使い方
å°Žå…¥

インストールなどは必要ありません。下のURLにアクセスしてください。

ニコニコール http://niconama.temita.net/niconicall

生主の方は、http://niconama.temita.net/niconicall?co6155(←コミュid) のリンクを張れば自動的に次枠待ちになります。

実は、これ2代目(d:id:temita:20090430)です。以前に公開して5日でサービス終了を余儀なくされたのを復活させました。今回はプッシュ配信を自前で用意するなどパワーアップしてます。技術的な話も書いていきたいな。

Nicoban についてはのちほど紹介します。こっちの方ががんばってたりする。