ターミナルを閉じてもrubyを実行し続けるには

今までは、ターミナル上でrubyの実行を行っていましたが、全て完結するものを書いていました。

では、ターミナルを閉じても実行するにはどうしたらいいのでしょうか?

それにはまず、プロセスIDというものを理解することが必要です。

【プロセスID】

プロセスIDはアプリケーションが実行されている場所を示しているものであり、アプリケーションなどを実行すると自動で割り当てられます。

Macの場合、プロセスIDを確認する方法は2種類あります。

アクティビティモニタを利用

アクティビティモニタを利用して確認するには、アクティビティモニタを起動して、その中の「PID」というのを見ることで確認することができます。

・コマンドを利用

アクティビティモニタを使う以外にも、macでは「psコマンド」で知ることが確認することができます。具体的には「ps aux」というコマンドを入力することで現在実行されているプロセスの一覧を確認することができます。

auxはそれぞれ

a:自分以外のユーザーのプロセスも表示する
u:ユーザー名と開始時刻を表示する
x:制御端末のないプロセスの情報も表示する

というオプションになっていて、それを全て表示しようとすると「aux」というコマンドになります。

【バックグラウンドでの実行】

では、本題のターミナルを閉じても実行し続けるには、という話ですが、方法は簡単です。いつもrubyを実行しているコマンドを「nohup いつものコマンド &」という形で囲むだけです。

例えば、今の時間を表示し続ける「time.rb」というコードを書いたとします。

--time.rb--

while true
  day = Time.now
  puts "#{day.sec}"
  sleep(1)
end

----------

これをバックグランドで実行し続けるには

nohup ruby time.rb &

というように書けばOKです。

試しに実行してみて、ターミナルを閉じ、実行されているかプロセスIDを見て確認してみましょう。

ps aux | grep ruby

すると、しっかり実行されているのがわかると思います。

そのように実行を確認したら

kill プロセスID

でプロセスを終了させましょう。

 

これを用いれば、データの自動収集などを行うことができそうです。

rubyでファイルを扱う時に必須のjsonファイル

今回はrubyJSONファイルを扱う方法についてまとめます。

jsonファイルの読み込み】

jsonファイルはcsvファイルやテキストファイルのように1行ずつ読み込むような概念がありません。そのため、まず一気にjsonファイルを読み込んでしまい、その後それを1つ1つ分解して処理をするというのが一般的です。

・ファイルの読み込み

File.open("ファイル名") do |file|
  hash = JSON.load(file)
end

これで読み込みは完了。勝手にハッシュの形になって配列にか苦悩されているので、呼び出すときはhashに対してeachを行い、オブジェクト['キー']の形でよびだせる。

hash.each do |h|
  puts "#{h['name']}\t#{h['gender']}\t#{h['age']}"
end

jsonファイルを作成】

上記ではjsonファイルを読み込む方法を紹介したので、今回はrubyjsonファイルを作成する方法をまとめます。

jsonファイルの作成にはJSON.generateというメソッドが使えます。ここに入れつを与えてあげることで、自動でjsonファイルの形式にしてくれます。そのため、arrayという配列をjsonファイルとして出力したければこのように書けば良い。

File.open("meibo_j.json","w") do |json|
  json.puts(JSON.generate(array))

end

rubyでテキストファイルをCSVで出力する

rubyでファイルの読み込み、書き込みについてまとめる。

【テキストファイルをCSVファイルに変換】

 テキストファイルをCSVファイルに変換し出力するには、まずテキストファイルを読み込む必要がある。

テキストファイルの読み込みについては前回説明したが、以下のようにして読み込む。

CSV.foreach('ファイル名', :col_sep => "\t") do |row|
  //処理
end

そして、今回重要なのは、どのようにしてファイルに出力するかということである。

ファイルへの出力は以下のようにすれば行える。

File.open("ファイル名","w") do |csv|
  csv.puts("書き込みたい内容")
end

 csv.putsというメソッドに引数を与えることで、ファイルに書き込みがされる。

そして、ファイルに書き込む際にCSVとして出力するには、要素同士の間をカンマ「,」で区切ってあげれば良い。

 

※注意

要素をカンマで区切りたい、と思ったが要素自体にカンマが入ってしまっていたり特殊記号が入っていたりすると上手くいかないことがある。そんなときのために以下の二つを覚えておくと良い。

- 要素は必ずダブルクォートでくくる

- 要素の中にダブルクォートがあれば二重のダブルクォートに置換する

これを徹底すればそのような場合にも対処できるので押さえておこう。

rubyでタブ区切りのテキストファイルの読み込みを行う

rubyでファイルの読み込みについてまとめる。

【テキストファイルを読みだして配列に格納する方法】

テキストファイルの読み込みは主に2種類ある

・テキストファイルを一気に読み込む方法

tsv_data = CSV.read('meibo.txt', headers: true)

・1行ずつ読み取っては処理をする

CSV.foreach('meibo.txt') do |row|
  //処理
end

この読み取りではどちらも普通に1行を1つのデータとしてみなすが、タブで区切られていたら、それを別々のものとして切り離したい時は「:col_sep」というオプションを用いれば良い。

具体的には、先ほど書いた「タブごとに区切る」という時はこのように書けば良い

・テキストファイルを一気に読み込む方法

 

tsv_data = CSV.read('meibo.txt',:col_sep => "\t", headers: true)

・1行ずつ読み取っては処理をする

CSV.foreach('meibo.txt',:col_sep => "\t") do |row|
  //処理
end

これで、タブで区切られたものを切り離すことができる。

 

Rubyで標準入力をするなら黙ってchompをつけよう

新しいプログラミング言語に触れるとき、まず知りたいのは標準出力の方法と、標準入力の方法です。

rubyの場合出力は

p

puts

print

などいろいろある。

そして、標準入力はgetsで入力を受け付けることができる。

data = gets

とすることで入力した値を変数に格納したりするのが一般的である。
また、RubyではC言語のように数値の受け取りや文字の受け取りを区別せず、すべて文字列として受け取る。そのため、数値の入力を受け付けたい場合は、まず

gets

で文字列として受けとり、それを「.to_i」で数値に変換する必要がある。

gets.to_i

数値の受け取りの際はいいんですけど、文字列をそのまま使おうと思った時にこのgetsだと、少し問題があります。
それは、開業まで反映されてしまうというところです。
試しに、getsで入力された文字を確認してみると"\n"このようなものが付加していないだろうか?
これは、改行コードで、これが入っていると後の作業に影響が出てしまいます。そこで、それをなくすために出てくるのが題名に書いてある「chomp」です。

これをつけることで改行コードを除いた文字列を受け取ってくれるのです。

gets.chomp

これから入力を受け付ける時はとりあえずこれをつけましょう。

【そこが知りたい】Rubyでの繰り返し何使えばいいの??

 Rubyの学習をするにあたって、繰り返し処理を勉強したわけですが、Rubyには繰り返し処理ができる文法が多い!

 「Ruby 繰り返し」で検索すると

  • while文
  • until文
  • for文
  • eachメソッド
  • timesメソッド、uptoメソッド、downtoメソッド
  • stepメソッド
  • loopメソッド

 うん、多いよ。どれ使えばえーねん。って思いました。

 今までやってた言語ではfor/whileが主だったし、その中でもforを多用してたので今回もとりあえずforを使ってみたけど、まあ書きにくい。しかも、Rubyの繰り返しでは、物によってはnを未満だったり、n以下だったりして「あれ?今回どっち??」みたいになりがち・・・・

 そこで、バイト先の人に聞いた所一番いいのは「timesメソッド」だそうです。理由としては

マジックナンバー(例えばforの時の初期設定値とか、何回繰り返すかとかのアレ)が1つでいいこと。

・その数値分繰り返してくれること

 だそうです。確かに、納得ですね。

一応timesの書き方を示すと

5.times{

処理A

}

これで5回処理Aを繰り返せます。

0以上5未満とか、1以上5以下とか考えなくていいので楽ですね。

これからはtimesを使っていこうと思った今日であった。

以上。

MACのSublime TextでShift-JISファイルを作成できない件・・・

 前回の研修で、「HTMLファイル(以下の2種類)を作成せよ」というものがあった。初めは「簡単じゃないか」と思ったけどその時使っていたのはSublime Text。エンコードのところになんとShift-JISがない。

 それで、いろいろ調べてみたがShift-JISのファイルを文字化けせずに開く方法は載っていたが、Shift-JISのファイルを作成する方法がよくわからなかった。

 さらに調べること5分。なんとMACのターミナルにはファイルをエンコードするっている便利なものがあるじゃないですか!よし、これを使おう!ということでShift-JISにしたいファイルに対して以下のようにコマンドを実行してOK!

nkf -s --overwrite ファイル名

 

ちなみに、この-sの部分を-wに帰るとUTF-8エンコードできる。他のコードにもできるみたいなので気になる人は調べてみるといいかも。

 

以上。

最初の投稿でした。