*いしのなかにいる*

oops ! I am in rock !

【Ruby】配列内の文字列を数値に一括変換する

カンマ区切りの数字の文字列を一気に数値に変換したいときってありませんか?

たとえばこんなやつです。

“1,2,3…”

これ、何も考えずにカンマで分割すると、文字列の配列になっちゃうんですよね。

こんな感じに

> "1,2,3".split(",")
=> ["1", "2", "3"]

ActiveRecordの検索に使う分には問題ないのですが、数値として使いたいときとかにちょいちょい不便。

なので、配列内の文字列を数値に一括置換する方法を調べてみました。

map(&:to_i)を呼び出して一括変換

> "1,2,3".split(",").map(&:to_i)
=> [1, 2, 3]

これだけです!

ちなみにmapは新しい配列を作って返すだけなので、元のリストを書き換えちゃっていい場合はmap!を使いましょう。

map, map! (Array) - Rubyリファレンス - AmiWiki

mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します

とのことなので、結局やっていることは配列内の各要素のto_iをしているだけなんだろうけど、 メソッドを呼ぶだけで一発で変換できるのは気持ちいいですね!

ちなみに配列の中に文字列が入っていた場合は 0 に変換されるようです。
(これはto_iの動作ですね)

> ["1", "2", "hoge"].map(&:to_i)
=> [1, 2, 0]

以上!

github のアカウントが「Your account has been flagged.」になってしまった

ある日、githubを開いたらこんなメッセージが表示されていました。

f:id:malor:20170605145415p:plain

何かの設定エラーか?

特に何かしたつもりもなかったので、ポリシーでも変わったのかな〜と思っていました。 (赤いメッセージなのがチョット怖いですが)

英語力はまるでないので、google先生で翻訳。

Your account has been flagged.
Because of that, your profile is hidden from the public. If you believe this is a mistake, contact support to have your account status reviewed.
(訳:あなたのアカウントにはフラグが立てられています。
そのため、あなたのプロフィールは公開されていません。これが間違いだと思われる場合は、サポートに連絡してアカウントステータスを確認してください。)

「フラグが立てられています」と言われてもなんのことやらさっぱりですね。

githubで何かを公開している訳でもないので放っておいても問題なさそうですが、実はウイルスとかが原因で他の方に迷惑をかけていたりしたら嫌なのでサポートに連絡してみることにしました。

サポートに連絡してみた

送った文章はこんな感じです。 とはいっても自分で英語の文は作れないので、全部google翻訳で作ってもらいました。

To the github support team

"Your account has been flagged."

When I logged into github I got a message like this because I got an email.

Did I have used something wrong?

Since I do not remember especially, if it does not seem to be a problem please cancel the flag.

内容としては、 「悪い子としたつもりはないんだけど、こんなメッセージ出ちゃった。問題ないなら直して!」 って感じで書いています。

コンタクトページに記入して送信!

f:id:malor:20170605145502p:plain

すぐに返信が来た

コンタクトを送信してから待つこと1時間半ほど。 すぐにサポートチーム?のジミーから返信がありました。

Hi there,

Sorry about that! Sometimes our spam-detecting robots get a little carried away. I've reinstated your profile and you're good to go. You shouldn't see that message anymore.

Have an awesome day!
Jimmy


訳:
こんにちは、

それについて申し訳ありません!場合によっては、迷惑メールを検出するロボットが少し迷惑をかけることもあります。私はあなたのプロフィールを元に戻しました。あなたは元気です。もうメッセージは表示されません。

すばらしい一日を!
ジミー

詳しいことはわかりませんが、何やら迷惑メールを検出するボットの誤動作だったようです。

ジミーがプロフィールをもとに戻してくれたそうで、すぐに元気(?)になりました!

というわけで解決

ググッてみたら同じことになっている先人たちがいたようです。

a-habakiri.hateblo.jp

みんな身に覚えがない様で、なんか変な操作をしたために「フラグが立った」のではなく、迷惑メール検出ボットの抽選に通った感じなのかな?

拙い英文でも即座に解除してくれるので、もしフラグが立ってしまったらサポートチームに連絡することをおすすめします。

エラーっぽいメッセージが出っぱなしというのは気持ち悪いですからね!

MySQLのデータベースの名前を変更する

先日Railsでアプリ作成していて、ふと名称を変更したくなったのでやり方を調べてみました。 というのも、ちょいとアプリの名前を変更したくなったんです。そしたら合わせてフォルダ名とかも変えたくなって…

データベース名の変更がしたい

結論から言うとコマンド1発でポンッという感じにはできなそうです。
(個人的には rename database みたいなコマンドで変更できると嬉しかったのですが。)

なので、先に新しい(変更後)の名前のデータベースを用意して、そこに古い(変更前)のデータベースのデータを移し替えてやる必要があります。 めんどくさい。。。

実際にやった手順は以下の通り。

1.新しいデータベースの作成

まずMySQLにログインして新しいデータベースを作ります。

# MySQLにログイン
$ mysql -u ユーザ名 -p
Enter password:

# 新しいデータベースを作成
mysql> create database 新しいデータベース名 character set utf8;

# MySQLからログアウト
mysql> exit

2.古いデータベースからデータをエクスポート

次にmysqldumpコマンドを使って旧データベースに保存されているデータを抜き出します。

# mysqldumpで保存されているデータをエクスポート
$ mysqldump -u ユーザ名 -p 古いデータベース名 > databse_dump.sql
Enter password:

3.新しいデータベースにデータをインポート

最後に新しいデータベースに2で抜き出したデータを取り込みます。

# 新しいデータベースへデータを取り込む
$ mysql -u ユーザ名 -p データベース名 < 新しいデータベース名 < database_dump.sql
Enter password:

以上、3ステップで完了です。

面倒くさいけど、思ったよりか楽に終わりました。

おまけ

データベース名にハイフンを含める方法

普通にやるとデータベース名にハイフンを含めることができません

mysql> create database ハイフン付きの名前 character set utf8;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-a character set utf8' at line 1

で、どうやるかというと

  • バッククォートでDB名を囲む
mysql> create database `ハイフン付きの名前` character set utf8;
Query OK, 1 row affected (0.01 sec)

これでハイフン付きの名称をつけられました

【Mac】ssh-agentを使ってパスフレーズの入力を省略する

sshやらgitへのpushやらで毎回パスフレーズを入力するのが嫌で過去に

blog.malor.net

こんな記事を書きましたが、セキュリティ上あまり良くないようです。
(パスフレーズを解除するので当然といえば当然)

じゃあどうすんだ!と知人に聞いたところ、
「ssh-agent」なるものを使えばパスフレーズの入力は不要!と聞いたので、早速 ssh-agent を設定しました。

ちなみに ssh-agent というのは

SSHサーバに接続するときに秘密鍵に設定されているパスフレーズの入力を代わりにやってくれるアプリケーションとのこと。
コチラのサイトさんで詳しく説明されていました。)

面倒なパスフレーズの入力を代行してくれるだなんて、なんて素晴らしツール!

鍵の登録

さて、そんなわけで便利な ssh-agent さんですが、しっかり働いてもらうには秘密鍵を登録してあげなくてはいけません。

鍵の登録には次のコマンドを使います。 「~/.ssh/id_rsa」の部分に秘密鍵のパスを指定してください。

$ ssh-add -K ~/.ssh/id_rsa # 秘密鍵のパス
Enter passphrase for /Users/user/.ssh/id_rsa:

-Kオプションを付けないとコンソールを開くたびに再設定が必要になるので注意!

鍵を登録したらちゃんと登録されたか確認しておきましょう

登録した鍵の確認

$ ssh-add -l
2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /Users/user/.ssh/id_rsa (RSA)

登録した鍵のパスが表示されていればオッケーです。

これでセキュリティレベルを落とすことなく、コトあるごとにパスフレーズを打つという煩わしさもなくなりました!
VIVA! ssh-agent!!

【Mac】秘密鍵にパスフレーズを設定(変更)する方法

先日、秘密鍵に設定したパスフレーズを解除しました。

blog.malor.net

毎回パスフレーズを入力するという不毛な生活を抜け出してウハウハだったのですが・・・

この話を(自慢げに)知人にしたところ、

「ssh-agentに登録しておけばそんなことしなくてもパスフレーズは聞かれないよ?」

「しかもパスフレーズなしの鍵が他の人に渡っちゃったらアウトだからセキュリティ的にやばいよ?」

的なことを言われてしまいました。。。

セキュリティレベルを下げずに楽をする方法があったなんて・・・

という訳で今回は 秘密鍵にパスフレーズを設定する方法をご紹介します。
ちなみに設定済みのパスフレーズを変更する方法も一緒です。

秘密鍵にパスフレーズを設定する

パスフレーズを設定する方法も簡単で、下記のコマンドを打つだけ

ssh-keygen -p

すると、どの秘密鍵のパスフレーズを設定するのか聞かれます。
(カッコの中はデフォルトの秘密鍵名)

Enter file in which the key is (/Users/ユーザ名/.ssh/id_rsa): 

あとはパスフレーズを2回入力すれば完了。

Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.

変更の場合は古いパスワードも聞かれます。

Enter old passphrase:
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.

以上でパスフレーズの設定は完了です!

次回は ssh-agent の使い方を書きます!!

【Mac】秘密鍵に設定したパスフレーズを解除する方法

すっごい今更なのですが、秘密鍵のパスフレーズを解除しました。

というのも、サーバにsshで接続するときやgitでpushするときなんかに毎回パスフレーズ聞かれるんですよね。
つどつど律儀に入力していたのですが、さすがに入力が面倒になってきました。
(毎回パスフレーズを入力していたという・・・ 非生産の極みですね。)

という訳で、秘密鍵に設定したパスフレーズを解除する方法です。

秘密鍵のパスフレーズを解除

やることは簡単で、下記のコマンドを打つだけです。

openssl rsa -in /Users/user/.ssh/hoge_rsa -out new_rsa

このコマンドを実行すると、hoge_rsa に設定したパスフレーズを聞かれます。

Enter pass phrase for /Users/user/.ssh/hoge_rsa:

ここに正しいパスフレーズを入力すると、パスフレーズなしの秘密鍵が生成されます。
(new_rsa がパスフレーズなしの秘密鍵)

これを使用すれば、今までパスフレーズを設定していた面倒な生活とおさらばできます!

ただし!パスフレーズを解除しちゃっているので取り扱いには要注意です。
間違っても公開されたフォルダに配置したりしないようにしましょう。

【Ruby】NameErrorが出てrakeタスクが実行できない!

rakeタスクの作成にチャレンジしてみました。

Capybaraでサイト情報を解析するクローラを作っていたので、 こいつを呼び出すように実装してみたのですが、どうにもうまくいかず。

やったこと

クローラのモジュールをrakeタスクから呼び出すだけ、だと思っていたのですが・・・
なかなかうまくいかなかったです。

コードは次のような感じに作りました。

rakeファイル

namespace :crawler do

  desc 'クローラだよ'
  task :anlyze, ['platform'] => :environment do |t, args|
     HogeCrawler.anlyze
  end
end

クローラ

module HogeCrawler

  class << self

    def anlyze
 

こんな感じに作ってみました。

さて、実行!

$ bundle exec rake crawler:anlyze

結果、エラー

rake aborted!
NameError: uninitialized constant HogeCrawler
/Users/user/anlyzer/lib/tasks/crawler.rake:5:in `block (2 levels) in <top (required)>'
Tasks: TOP => crawler:anlyze
(See full trace by running task with --trace)

となってしまって実行できない。 –traceつけてみてもわからずでした。

bundle exec rake crawler:anlyze --trace
** Invoke crawler:anlyze (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute crawler:anlyze
rake aborted!
NameError: uninitialized constant HogeCrawler
/Users/user/anlyzer/lib/tasks/crawler.rake:5:in `block (2 levels) in <top (required)>'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:248:in `block in execute'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:243:in `each'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:243:in `execute'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:187:in `block in invoke_with_call_chain'
/Users/user/.rbenv/versions/2.3.0/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:180:in `invoke_with_call_chain'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/task.rb:173:in `invoke'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:150:in `invoke_task'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/Users/zuser/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:106:in `each'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:106:in `block in top_level'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:115:in `run_with_threads'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:100:in `top_level'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:78:in `block in run'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:176:in `standard_exception_handling'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/lib/rake/application.rb:75:in `run'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/gems/rake-11.1.2/bin/rake:33:in `<top (required)>'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/bin/rake:23:in `load'
/Users/user/anlyzer/vendor/bundle/ruby/2.3.0/bin/rake:23:in `<main>'
Tasks: TOP => crawler:anlyze

原因

結局のところエラーの通りでした。 命名規約に沿ってなかっただけ。

rakeで呼び出そうとしているモジュールとメソッドは合ってるんだけど、ファイル名が「hogehoge.rb」ってなってたせい。

うわぁ・・・

クローラのファイル名をモジュール名に合わせて『hoge_crawler.rb』としたら動くようになりましたとさ。 Rails、もっと勉強しないとなぁ。

参考リンク

rake コマンドで NameError: uninitialized constant エラー rake task だけで起きる NameError: uninitialized constant ModelName