Raspberry Pi 3にCentOS 7をインストール

先日、Raspberry Pi 3を買ってみました!
お値段は5500円ぐらいですが、ケースや16GBのMicroSDやMicroUSBケーブルを買ったら合計1万円以上かかってしまいました…
友達から「ラズパイは安い!」って聞いてたのに、いざ買ってみると周辺機器を揃えるのにお金がかかってしまいます
バイトをしてない大学生には、ちょっと痛手です…
せっかく、買ったのでRaspberry Piで面白いものを作りたいと思います!

Raspberry Piは「Raspbian」というOSが推奨されてるっぽいんですが、
自分はCentOSが使い慣れているので今回、CentOS 7をインストールさせたいと思います。

準備

まず、以下のURLからイメージファイルをダウンロードします。
http://buildlogs.centos.org/centos/7/isos/armhfp/

このダウンロードしたファイルは「xz」という初めて見る拡張子になってます。

xz は、データ圧縮プログラムのひとつ、およびその圧縮データのフォーマットである。LZMA2圧縮アルゴリズムを利用している。先行するgzip, bzip2と比較すると、圧縮時にはこれら以上の時間とメモリを消費するが、圧縮率では概ね優位で、また伸張速度もgzipより多少遅いがbzip2よりは速い傾向にある。このことから、特にアーカイブ配布用途として、.tar.gzや.tar.bz2と並んで採用されるケースが増えている(.tar.bz2にとって代わる場合もある)。アーカイブ機能はない。

引用:xz (ファイルフォーマット) - Wikipedia

ふーん、よく分からないッス!笑
で、このファイルを解凍するために、コマンドをインストールする必要があります。
自分のPCはMacなので、Macでコマンドをインストールする方法を紹介したいと思います。

$ brew install xz
$ xz -d xxxx.xz #解凍する方法

MicroSDに書き込み

PCにMicroSDを差し込んで、MicroSDカードの場所を調べる必要があるそうです。

$ diskutil list
  #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *121.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            120.5 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +120.1 GB   disk1
                                 Logical Volume on disk0s2
                                 FD2938A5-EF87-4FFA-B79B-C2D6B41336E0
                                 Unlocked Encrypted
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk2
   1:               Windows_NTFS SDCard                  15.9 GB    disk2s1

で、表示されたものを確認すると、MicroSDの場所は「disk2s1」ということが分りました。

次に、MicroSDをアンマウントします。

sudo diskutil umountDisk /dev/disk2
Unmount of all volumes on disk2 was successful


MicroSDの場所が「disk2s1」なのに、「disk2」をアンマウントするのはよく分からないです…
ここは、注意ですね!

$ sudo dd bs=1m if=xxxxx.img of=/dev/disk2
3072+0 records in
3072+0 records out
3221225472 bytes transferred in 1501.605507 secs (2145188 bytes/sec)


これで、MiroSDに書き込むことができました!
ちなみに、「dd」は書き込み(=コピー)をするコマンドっぽいです。
詳しくは、以下のURLを参照して下さい。
ddコマンド:Linuxコマンド集 - 【 dd 】 ファイルの変換とコピーを行う:ITpro

参考:Raspberry PiにRaspbianをインストールする for Mac OSX - Qiita

自分が犯した失敗

diskutilコマンドでMicroSDの場所が「disk2s1」と表示されていたので、
書き込みの時、「of=/dev/disk2s1」ってしたら、書き込みに失敗してました。
書き込みに失敗していたので、Raspberry Piが起動しなくて、泣いてました…
なので、みなさんご注意ください!

Rubyの勉強(2)

前回の続きです!
前回:Rubyの勉強(1) - usmysaの開発メモ

それでは、さっそく気温データのCSVファイルをRubyで読み込んで、データベースに追加したいと思います。

CSVファイルが読み込めない!

for csv_i in 1..15 do
  filename = "data-" + csv_i.to_s + ".csv"
  csvData = CSV.read(filename)
end

15個あるCSVファイルをfor文を使って、読み込もうとしたら

# ruby setDB_weatherData.rb 
/usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:2016:in `=~': invalid byte sequence in UTF-8 (ArgumentError)
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:2016:in `init_separators'
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:1538:in `initialize'
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:1273:in `new'
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:1273:in `open'
	from /usr/local/rbenv/versions/2.3.1/lib/ruby/2.3.0/csv.rb:1339:in `read'
	from setDB_weatherData.rb:19:in `<main>'

というエラーが表示されました。
「invalid byte sequence in UTF-8 (ArgumentError)」っていうことは、utf-8じゃないから問題が発生してるのかな?

原因

このCSVファイルをどうやって作ったかは分からないですが、
Excelで作ったCSVSJISとして保存されるようです。
Excelで作った場合だと、終端文字が"\r\n"になるそうです。
その結果、エラーが発生してうまくいってないようです。

解決策

CSV.foreach('CSVファイル名', headers: true, row_sep: "\r\n", encoding: "SJIS") do |row|
  puts row[0] #rowの0番目を表示
end

ちなみに、「row_sep」とは行区切り文字列として使用する文字列を返すメソッドらしいです。

参考:Rails3でExcelで作ったSJISのCSVファイルをUTF-8で読み込む方法 - temitaの不思議空間
   ライブラリ:csv > クエリ:row_sep > バージョン:1.9.3 | るりまサーチ (Ruby 1.9.3)
  

何とか解決できたので、はやくデータベースに追加して
夜ご飯を食べたい…

Rubyの勉強(1)

気象庁が公開している気象データを使って、どうにかできないかなと遊んでます。
とりあえず、以下のサイトを参考にプロトタイプを作成したいと思います!


itpro.nikkeibp.co.jp


まず、気象データをデータベースに保存するっぽい。
とりあえず、RubyMySQLに接続する方法を確認するために、既にある情報をフェッチしてみよう。


文字化け

サーバ上でMySQLからデータを取得し、表示しようとすると文字化けしてしまうという問題が発生…
発生している問題としては、以下のとおり。

# ruby xxxx.rb 
??????????????
??????????
?????????
?????
?????????? ?????

データベースが問題!?

phpMyAdminからデータベースの構造を確認しても、ちゃんと「utf8_general_ci」となってるので問題なさそう。
そうなると、やっぱりソースコードが原因か…


既存のソースコードと比較

前にRubyで作成したメール通知プログラムのソースコードと比較して問題の原因を探してみた。

#!/usr/bin/ruby -Ku
require 'kconv'
    ・
    ・
    ・

冒頭部分に上の2つが書いていた。


「#!/usr/bin/ruby -Ku」とは!?

答えとなるようなサイトは見つからなかったけど、指定したRubyで実行させるようにしてるっぽい。
意味的には、yumの設定ファイル(/usr/bin/yum)の冒頭文に書かれている

#!/usr/bin/python2.6.6   
import sys
try:
    import yum
except ImportError:
    print >> sys.stderr
    ・
    ・
    ・

と同じ感じなのかな?
(上のコードでは、Pythonのバージョンを2.6.6に指定している)

「require 'kconv'」とは!?

kconv」はRuby文字コードを変換するための標準ライブラリらしいです!

# _*_ coding: utf-8 _*_
require 'kconv'
 
str_sjis = "文字列".tosjis
str_utf8 = "文字列".toutf8
 
puts "#{str_sjis.encoding} => #{str_sjis}"
puts "#{str_utf8.encoding} => #{str_utf8}"

参考:Rubyで文字コードを変換 ‘kconv’ | rakkyooの備忘録

以上の2つを試して見ても、問題が解決できず…


解決策

元々、データベースにアクセスし、データを取得するソースコードは以下のようでした。

require 'mysql'

hostname = "127.0.0.1"
username = "xxxxx"
password = "xxxxx"
dbname = "xxxxx"
connection = Mysql.connect('hostname', 'username', 'password', 'dbname')

result = connection.query('SELECT * FROM table_name')

けど、データベースにアクセスする時点で文字コードを設定しなくちゃいけなかったっぽい
修正したソースコードは以下のとおり。

require 'mysql'

hostname = "127.0.0.1"
username = "xxxxx"
password = "xxxxx"
dbname =  "xxxxx"
connection = Mysql.init()
connection.options(Mysql::SET_CHARSET_NAME,'utf8')
connection.real_connect(hostname, username, password, dbname)
result = connection.query('SELECT * FROM table_name')

参考:Ruby Mysqlで文字化け? - まめ畑


これで一件落着!
てか、そもそもMySQLに接続する書き方が

connection.real_connect(hostname, username, password, dbname)

とか

connection = Mysql.connect(hostname, username, password, dbname)

があって、よく分からないな…