【Ruby】ruby-mysqlを使用してMySQLに接続
事前にやっておくこと
# gem install ruby-mysql
環境
RHEL6.7
ruby2.3.0p0
MySQL5.7.12
使用するテーブル
以下のzaikoテーブルを使用します
mysql> SHOW COLUMNS FROM zaiko; +-------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | maker | text | YES | | NULL | | | type | text | YES | | NULL | | | serial | varchar(100) | YES | | NULL | | | purpose | varchar(20) | YES | | NULL | | | input_date | date | YES | | NULL | | | output_date | date | YES | | NULL | |
mysql> select * from zaiko; +----+--------+-------+--------+----------+------------+-------------+ | id | maker | type | serial | purpose | input_date | output_date | +----+--------+-------+--------+----------+------------+-------------+ | 2 | maker1 | type1 | 001 | purpose1 | 2016-04-01 | 2016-04-02 | | 3 | maker2 | type2 | 002 | purpose2 | 2016-04-03 | 2016-04-04 | | 4 | maker3 | type3 | 003 | purpose3 | 2016-04-03 | 2016-04-04 | | 5 | maker4 | type4 | 004 | purpose4 | 2016-04-05 | 2016-04-06 | | 6 | maker5 | type5 | 005 | purpose5 | 2016-04-06 | 2016-04-07 | +----+--------+-------+--------+----------+------------+-------------+ 5 rows in set (0.01 sec)
簡単なSELECT
◆ソース(mysql_select.rb)
require 'mysql' # DBに接続 my = Mysql::new("127.0.0.1", "[ユーザ名]", "[パスワード]", "[DB名]") # 抽出結果でループ result = my.query("select maker,type,serial,purpose,\ input_date,output_date from zaiko").each do \ |maker,type,serial,purpose,input_date,output_date| # レコードの内容を出力 puts "#{maker},#{type},#{serial},#{purpose},#{input_date},#{output_date}" end # DBの切断 my.close
◆実行結果
# ruby mysql_select.rb maker1,type1,001,purpose1,2016-04-01,2016-04-02 maker2,type2,002,purpose2,2016-04-03,2016-04-04 maker3,type3,003,purpose3,2016-04-03,2016-04-04 maker4,type4,004,purpose4,2016-04-05,2016-04-06 maker5,type5,005,purpose5,2016-04-06,2016-04-07
パラメータを持つSELECT
◆ソース(mysql_select2.rb)
require 'mysql' # DBに接続 my = Mysql::new("127.0.0.1", "root", "Ph/*CyFUf0gt", "test_db") # SQLの作成 stmt = my.prepare("select maker,type,serial,purpose,input_date,\ output_date from zaiko where serial = ?") # SQLの実行&レコードの取り出し tuple = stmt.execute('001').fetch # 結果はtupleに配列で格納される # レコードが存在した場合は結果を出力 if tuple then puts "#{tuple[0]},#{tuple[1]},#{tuple[2]},#{tuple[3]},#{tuple[4]},#{tuple[5]}" end # DBの切断 my.close
◆実行結果
# ruby mysql_select2.rb maker1,type1,001,purpose1,2016-04-01,2016-04-02
INSERT
◆ソース(mysql_insert.rb)
require 'mysql' # DBに接続 my = Mysql::new("127.0.0.1", "root", "Ph/*CyFUf0gt", "test_db") # SQLの作成 stmt = my.prepare("insert into zaiko(maker,type,serial,purpose,input_date,output_date) \ values(?,?,?,?,?,?)") # SQLの実行 stmt.execute('maker6','type1','006','purpose6','2016-04-08','2016-04-09') # DBの切断 my.close
◆mysql_insert.rb実行後のselect実行結果
mysql> select * from zaiko; +----+--------+-------+--------+----------+------------+-------------+ | id | maker | type | serial | purpose | input_date | output_date | +----+--------+-------+--------+----------+------------+-------------+ | 2 | maker1 | type1 | 001 | purpose1 | 2016-04-01 | 2016-04-02 | | 3 | maker2 | type2 | 002 | purpose2 | 2016-04-03 | 2016-04-04 | | 4 | maker3 | type3 | 003 | purpose3 | 2016-04-03 | 2016-04-04 | | 5 | maker4 | type4 | 004 | purpose4 | 2016-04-05 | 2016-04-06 | | 6 | maker5 | type5 | 005 | purpose5 | 2016-04-06 | 2016-04-07 | | 7 | maker6 | type1 | 006 | purpose6 | 2016-04-08 | 2016-04-09 | +----+--------+-------+--------+----------+------------+-------------+ 6 rows in set (0.00 sec)idが7の行が追加されています
UPDATE
◆ソース(mysql_update.rb)
require 'mysql' # DBに接続 my = Mysql::new("127.0.0.1", "root", "Ph/*CyFUf0gt", "test_db") # SQLの作成 stmt = my.prepare("update zaiko set maker=? where serial=?") # SQLの実行 stmt.execute('changed1','001') # DBの切断 my.close
◆mysql_update.rb実行前のselect実行結果
mysql> select * from zaiko; +----+--------+-------+--------+----------+------------+-------------+ | id | maker | type | serial | purpose | input_date | output_date | +----+--------+-------+--------+----------+------------+-------------+ | 2 | maker1 | type1 | 001 | purpose1 | 2016-04-01 | 2016-04-02 | | 3 | maker2 | type2 | 002 | purpose2 | 2016-04-03 | 2016-04-04 | | 4 | maker3 | type3 | 003 | purpose3 | 2016-04-03 | 2016-04-04 | | 5 | maker4 | type4 | 004 | purpose4 | 2016-04-05 | 2016-04-06 | | 6 | maker5 | type5 | 005 | purpose5 | 2016-04-06 | 2016-04-07 | | 7 | maker6 | type1 | 006 | purpose6 | 2016-04-08 | 2016-04-09 | +----+--------+-------+--------+----------+------------+-------------+ 6 rows in set (0.00 sec)今回作成したプログラムではserialが「001」のレコードのmakerを「type1」から「changed1」に変更します
◆mysql_update.rb実行後のselect実行結果
mysql> select * from zaiko; +----+----------+-------+--------+----------+------------+-------------+ | id | maker | type | serial | purpose | input_date | output_date | +----+----------+-------+--------+----------+------------+-------------+ | 2 | changed1 | type1 | 001 | purpose1 | 2016-04-01 | 2016-04-02 | | 3 | maker2 | type2 | 002 | purpose2 | 2016-04-03 | 2016-04-04 | | 4 | maker3 | type3 | 003 | purpose3 | 2016-04-03 | 2016-04-04 | | 5 | maker4 | type4 | 004 | purpose4 | 2016-04-05 | 2016-04-06 | | 6 | maker5 | type5 | 005 | purpose5 | 2016-04-06 | 2016-04-07 | | 7 | maker6 | type1 | 006 | purpose6 | 2016-04-08 | 2016-04-09 | +----+----------+-------+--------+----------+------------+-------------+ 6 rows in set (0.00 sec)serialが「001」のレコードのmakerが「type1」から「changed1」に変更されています
DELETE
◆ソース(mysql_delete.rb)
require 'mysql' # DBに接続 my = Mysql::new("127.0.0.1", "root", "Ph/*CyFUf0gt", "test_db") # SQLの作成 stmt = my.prepare("delete from zaiko where serial=?") # SQLの実行 stmt.execute('006') # DBの切断 my.close
◆mysql_delete.rb実行前のselect実行結果
mysql> select * from zaiko; +----+----------+-------+--------+----------+------------+-------------+ | id | maker | type | serial | purpose | input_date | output_date | +----+----------+-------+--------+----------+------------+-------------+ | 2 | changed1 | type1 | 001 | purpose1 | 2016-04-01 | 2016-04-02 | | 3 | maker2 | type2 | 002 | purpose2 | 2016-04-03 | 2016-04-04 | | 4 | maker3 | type3 | 003 | purpose3 | 2016-04-03 | 2016-04-04 | | 5 | maker4 | type4 | 004 | purpose4 | 2016-04-05 | 2016-04-06 | | 6 | maker5 | type5 | 005 | purpose5 | 2016-04-06 | 2016-04-07 | | 7 | maker6 | type1 | 006 | purpose6 | 2016-04-08 | 2016-04-09 | +----+----------+-------+--------+----------+------------+-------------+ 6 rows in set (0.00 sec)今回作成したプログラムではserialが「006」のレコードを削除します
◆mysql_delete.rb実行後のselect実行結果
mysql> select * from zaiko; +----+----------+-------+--------+----------+------------+-------------+ | id | maker | type | serial | purpose | input_date | output_date | +----+----------+-------+--------+----------+------------+-------------+ | 2 | changed1 | type1 | 001 | purpose1 | 2016-04-01 | 2016-04-02 | | 3 | maker2 | type2 | 002 | purpose2 | 2016-04-03 | 2016-04-04 | | 4 | maker3 | type3 | 003 | purpose3 | 2016-04-03 | 2016-04-04 | | 5 | maker4 | type4 | 004 | purpose4 | 2016-04-05 | 2016-04-06 | | 6 | maker5 | type5 | 005 | purpose5 | 2016-04-06 | 2016-04-07 | +----+----------+-------+--------+----------+------------+-------------+ 5 rows in set (0.01 sec)serialが「006」のレコードが削除されています
【Linux】システム関連コマンドリンク集
自分でブログを書こうとしたんですが、既に素晴らしいブログを公開されている方がたくさんいらっしゃるので、リンク集にしようかと思いますw
(1)topコマンド
(2)freeコマンド
(3)psコマンド
(4)iotop
(5)逆引き
自分がハマったのは以下の2つです。
◆psコマンドがLinux/BSD系とSolarisで異なる
◆メモリ使用量の見方
メモリ使用量に関しては、
【top】
Mem: 12157736k total, 11839208k used, 318528k free, 160352k buffers
Swap: 6143992k total, 348992k used, 5795000k free, 10419328k cached
【free】
total used free shared buffers cached
Mem: 12157736 11831180 326556 140348 160360 10411948
-/+ buffers/cache: 1258872 10898864
Swap: 6143992 348992 5795000
・topコマンドのSwapの行に「10419328k cached」の表示があるので惑わされる
・usedが少ないのでメモリが足りないと勘違いする(実際はfreeコマンドの「-/+ buffers/cache: 1258872 10898864)がほぼ実体の使用量)
ってな感じでした。
(6)dstatコマンド
(7)sarコマンド
【Ruby】メール送信
【Ruby】Regexp(パターンマッチ)
RHEL6にVagrant(CentOS6.7)をインストール
こちらのサイトを参考にさせていただきました。
(1)DKMSインストール
カーネルモジュールのビルドとアップデートを助けるフレームワークのようで、カーネルをアップデートしてもViurualBoxのカーネルモジュールも自動的にアップデートされるみたいです。
# yum --enablerepo rpmforge install dkms
⇒あ、rpmforgeつかってます
(2)VirtualBoxのインストール
①専用のリポジトリ追加
# wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
# yum --enablerepo=virtualbox list | grep VirtualBox
VirtualBox-3.2.x86_64 3.2.28_100435_el6-1 virtualbox
VirtualBox-4.0.x86_64 4.0.36_104075_el6-1 virtualbox
VirtualBox-4.1.x86_64 4.1.44_104071_el6-1 virtualbox
VirtualBox-4.2.x86_64 4.2.36_104064_el6-1 virtualbox
VirtualBox-4.3.x86_64 4.3.36_105129_el6-1 virtualbox
VirtualBox-5.0.x86_64 5.0.18_106667_el6-1 virtualbox
②5.0をインストールしてみる
③rootをvboxusers グループに追加
(3)Vagrantインストール
# rpm -ivh vagrant_1.8.1_x86_64.rpm
(4)Vagrantセットアップ
①centos用のボックスを追加
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos67' (v0) for provider:
box: Downloading: https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
==> box: Successfully added box 'centos67' (v0) for 'virtualbox'!
⇒/root/.vagrant.d/boxes/centos67ディレクトリが作成されます
②適当にディレクトリ作成して移動
③仮想化環境初期化
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
④Vagrant起動
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos67'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: centos67_default_1461121012287_41932
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2200
default: SSH username: vagrant
default: SSH auth method: private key
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: The guest additions on this VM do not match the installed version of
default: VirtualBox! In most cases this is fine, but in rare cases it can
default: prevent things such as shared folders from working properly. If you see
default: shared folder errors, please make sure the guest additions within the
default: virtual machine match the version of VirtualBox you have installed on
default: your host and reload your VM.
default:
default: Guest Additions Version: 4.3.30
default: VirtualBox Version: 5.0
==> default: Mounting shared folders...
default: /vagrant => /root/vagrant/centos67
⑤ログインしてみる
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS release 6.7 (Final)
[vagrant@localhost ~]$ su -
パスワード:
[root@localhost ~]#
⇒初期パスワードはvagrantです
【Ruby】ハッシュ
この辺もperlでよく使っていたので。。。
(1)単純なパターン
①ソース(hash.rb)
hash = Hash.new() # ハッシュの初期化
hash[:apple] = 1 # 要素の挿入
hash[:orange] = 2
hash[:grape] = 3
puts hash[:apple] # keyを指定してvalueを取り出し
puts '----------------'
hash.each do |key,val| # keyとvalueを順番に取り出し
puts "#{key}: #{val}"
end
hash[:strawberry] = 4; # ハッシュに要素を追加
puts '----------------'
hash.each do |key,val| #再度keyとvalueを順番に取り出し
puts "#{key}: #{val}"
end
②実行結果
# ruby hash.rb
1
----------------
apple: 1
orange: 2
grape: 3
----------------
apple: 1
orange: 2
grape: 3
strawberry: 4
(2)ネストしたハッシュ
①ソース(hash_nest.rb)
hash = Hash.new { |hash,key| hash[key] = Hash.new {} } # ハッシュの初期化
hash[:apple][:count] = 2; # 要素の挿入
hash[:apple][:price] = 50;
hash[:orange][:count] = 5;
hash[:orange][:price] = 100;
hash[:grape][:count] = 10;
hash[:grape][:price] = 30;
puts hash # とりあえず出力
puts '----------------'
hash.each do |key,arr| #各要素を取り出し
arr.each do |item,value|
puts "#{key}: #{item},#{value}"
end
end
hash[:strawberry][:count] = 4; # 要素を追加
hash[:strawberry][:price] = 200;
puts '----------------'
puts hash
puts '----------------'
hash.each do |key,arr| #再度各要素を取り出し
arr.each do |item,value|
puts "#{key}: #{item},#{value}"
end
end
②実行結果
# ruby hash_nest.rb
{:apple=>{:count=>2, :price=>50}, :orange=>{:count=>5, :price=>100}, :grape=>{:count=>10, :price=>30}}
----------------
apple: count,2
apple: price,50
orange: count,5
orange: price,100
grape: count,10
grape: price,30
----------------
{:apple=>{:count=>2, :price=>50}, :orange=>{:count=>5, :price=>100}, :grape=>{:count=>10, :price=>30}, :strawberry=>{:count=>4, :price=>200}}
----------------
apple: count,2
apple: price,50
orange: count,5
orange: price,100
grape: count,10
grape: price,30
strawberry: count,4
strawberry: price,200
perlとかPHPだと特に意識しないでネストしたハッシュを定義できたんですが、rubyの場合はHash.newをやらないとエラーになっちゃうんですね^^;