Ruby配列のそれぞれの要素をダブルクオーテーションで括って、カンマ区切り(CSV)で出力する。
mapメソッドを使って作ってみました。
items = [id, name, gender, age] puts items.map {|item| "\"#{item}\""}.join(",")
MySQLでテーブルの型を調べる
SHOW COLUMNS FROM tbl_name
Rubyを利用したCSVファイルの書き出し
CSV.open("file.csv", "w") do |csv| users.each do |user| id = user.id name = user.name gender = user.gender age = user.age p "#{id}, #{name}, #{gender}, #{age}" csv << [id, name, gender, age] end end
参考記事。
brewのアップデート(brew update)失敗への対処(Error: Failed while executing git pull origin)
久しぶりに利用するために brew update したが、下記のエラーが。
Error: Failed while executing git pull origin
解決法はこちら。
brewのアップデート(brew update)に失敗してしまったので対処する - F13
$ cd `brew --prefix` $ git fetch origin $ git reset --hard origin/master
これで解決。
MySQLの出力結果をファイルに出力する方法。
teeコマンドを使うと簡単。
mysql> tee output.txt Logging to file 'output.txt' mysql> select * from users order by gender; +----+--------+--------+------+ | id | name | gender | age | +----+--------+--------+------+ | 3 | alice | f | 15 | | 5 | jasmin | f | 17 | | 1 | john | m | 18 | | 2 | paul | m | 20 | | 4 | dabid | m | 17 | +----+--------+--------+------+ 5 rows in set (0.00 sec) mysql> select * from users where gender = 'm' order by age; +----+-------+--------+------+ | id | name | gender | age | +----+-------+--------+------+ | 4 | dabid | m | 17 | | 1 | john | m | 18 | | 2 | paul | m | 20 | +----+-------+--------+------+ 3 rows in set (0.01 sec) mysql> select * from users where gender = 'f'; +----+--------+--------+------+ | id | name | gender | age | +----+--------+--------+------+ | 3 | alice | f | 15 | | 5 | jasmin | f | 17 | +----+--------+--------+------+ 2 rows in set (0.00 sec) mysql> notee Outfile disabled.
ファイルの出力を開始するには、MySQL 接続語に tee を実行し、出力終了時には notee を実行する。 出力先のファイルパスは絶対パスでも相対パスでもOK。ファイル名だけを指定した場合は、mysql へ接続したフォルダ(ディレクトリ)にファイルが生成される。
mysqlエラー:there can be only one auto column and it must be defined as a key
mysql> create table users(id int auto_increment, name varchar(20), gender varchar(20), age int);
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
こんなエラーが出た。
mysql: auto_increment は主キーにしないといけない | BmathLog
auto_increment があると、そのカラムは主キーでなければいけないらしい。
primary key(id)を入れたら先に進めた。
mysql> create table users(id int auto_increment, name varchar(20), gender varchar(20), age int,primary key(id));
Rubyでハッシュを利用する際の文字列とシンボルの違い
プログラミング初心者のため、他サイトを参考にまとめてみる。
テーマはRubyでハッシュを利用する際に文字列利用とシンボル利用の違いである。
今回のテーマは何度本を読んでも理解できないオブジェクト指向に関連するテーマのように感じるため、本質的な理解は先になりそうだが。。
まずは「Ruby シンボル」で検索。下記記事が非常に参考になる。
Ruby空間における操作対象(オペランド)はオブジェクトである。Rubyオペレータはオブジェクトしか取り扱わない。オブジェクトはユーザによって初めてRuby空間に生み出されるが、それはクラスという設計図に従って常に構築される。
(中略)
Ruby空間に生み出されたすべてのオブジェクトはそれぞれが固有のID(object_id)を持っていて、RubyオペレータはこのIDで個々のオブジェクトを管理する。
相変わらずオブジェクトがなんなのかはよくわからないが、Rubyを書いている時にはオブジェクトしか扱っておらず、全てのオブジェクトはそれぞれ固有のIDを持っているということらしい。
次は固有のIDについて調べてみる。
object_id
メソッドは、レシーバのオブジェクトIDを返します。オブジェクトIDは、オブジェクトごとに固有の整数値です。レシーバが同じオブジェクトなら必ず同じオブジェクトIDになり、違うオブジェクトなら別のオブジェクトIDが返ります。
さっきの記事と似たようなことが書いてある。コードを見ると、"str1"と"str2"は同じ文字列"hello"が代入されているが、オブジェクトIDは異なる事がわかる。コンピューターは同じ文字でつでも違うオブジェクトと認識しているようだ。
RubyのオブジェクトIDと、ディープ/シャロー(deep/shallow)コピーについて | task blog
1
2 1.object_id #=> 3
'1'.object_id #=> 70183691563540ちなみに、
'1'
とかは、内部的にはString.new('1')
をしているのと同じなので、毎回オブジェクトIDが異なります。ただ
1
は、オブジェクトIDは変わりません。
赤字の部分を読むと、なんとなくどんな処理を内部で行っているかイメージする事ができる。同じ文字列でも内部的には新たな'1'を生成しているようだ。
面白い比較があった。
シンボルとは何か その1(後編) - 文字列のintern - 世界線航跡蔵
intern操作によって、文字列はオブジェクトとして一意になる。だから、同一性判定するだけで低コストで比較できる。
- 10.times do
- p "foo".object_id
- end
すると毎回違う結果が出るが、
- 10.times do
- p "foo".intern.object_id
- end
は同じ結果がずらりと並ぶ。この「文字列をinternした結果」こそが
Symbol
オブジェクトなのである。
最初の記事に戻って結論。
シンボルの特性をまとめてみよう。
- 文字列と一対一に対応した記号である(文字列オブジェクトとシンボルオブジェクトは多対一の関係になる)
- 同一記号のシンボルはRuby空間に唯一つ存在する(整数と同様、文字列と相違)
- シンボル記号自体が意味付けを表象できる(文字列と同様、整数と相違)
これらの特性を考えれば、そのオブジェクトの変更が予定されない場合、無駄なオブジェクトが生成されないシンボルは、速度の点で文字列オブジェクトよりも有利であり、またその記号の可読性を高めたい場合、整数オブジェクトよりも有利である。
文字列を利用する場合は、同じ文字列でも新しいオブジェクトが生成されており、同一記号のシンボルがRuby空間に一つだけのシンボルを利用する際に比較して処理に時間がかかり、かつ管理のしやすさの面でもシンボルの方が有利ということだ。
今後も学習を進めながらオブジェクトの概念をつかめるようにしていきたい。