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
自分が犯した失敗
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で作ったCSVはSJISとして保存されるようです。
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)
気象庁が公開している気象データを使って、どうにかできないかなと遊んでます。
とりあえず、以下のサイトを参考にプロトタイプを作成したいと思います!
まず、気象データをデータベースに保存するっぽい。
とりあえず、RubyでMySQLに接続する方法を確認するために、既にある情報をフェッチしてみよう。
文字化け
サーバ上で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')
これで一件落着!
てか、そもそもMySQLに接続する書き方が
connection.real_connect(hostname, username, password, dbname)
とか
connection = Mysql.connect(hostname, username, password, dbname)
があって、よく分からないな…