xengineer’s diary

結果、メモ的な内容になっています。

gitが実行できなくなった

Sierraにアップデートしたら。

こんなエラー。

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

tips.tutorialhorizon.com

このサイトいわく、これを実行しろ!

$ xcode-select --install

というわけで実行したら直った。 ありがとうございました。

ハードディスク処分市

はいねもとです。

 

なんか、100GB〜200GBくらいのゴミみたいなのが溜まってきたので捨てることに。

 

ひさしぶりにあけてみました。

 

ヘッド。実はヘッドはすんごい強力な磁石で固定されてたりします。

 

なので、一見どうやって開けるかわからないけど、

 

ドライバとかで、ふんぬ!!!ってやると開きます。

 


f:id:xengineer:20161006000559j:image

 

んー、大学のときはよく記録密度の測定とかしておりました。

 

なつかしい。

 

奥が、SAS、手前がSATASASはディスクサイズ小さいなぁ。

 

容量も、これで、73GBだったかな?手前は、163GBくらい。手前のディスクには僕が写り込んでいますな。


f:id:xengineer:20161006000538j:image

 

これSAS

f:id:xengineer:20161006000515j:image

 

 

基盤の密度もだいぶ違うので、撮影してたんだけど、間違って消しちゃったのかな。

 

スマホにないっす。残念。

 

ディスクの厚みも、SASのほうが厚い。ディスクのばたつきを抑えて、ヘッドとのクラッシュのリスクを減らすためなんだろうなー。

 

信頼性向上のための仕組みがたくさん入ってます。

 

すごいなー。

SQLite3の使い方メモ

はいねもとです。

いつも忘れるのでメモ、今回はSQLiteについて、御苑のTully's Coffeeからお届けします。

僕は、MacOS使ってるので、MacOS対象だよ、と。

まずは、SQLite使ってて、補完使えない問題にぶちあたったので、その解消法。

SQLiteで補完が効かないYO !!

sqlite3でhistoryや補完が効かない - komagataのブログ

そのままのサイトがありました!

つまり、Android SDKをinstallしてる人は、そっちのsqlite3が使われちゃう、と。

記載の通り対応してみたけど、僕はこれやってもうまくいかず。

.bash_profileに下記を追記しました。

export PATH="/usr/local/Cellar/sqlite/3.14.2_1/bin:$PATH"

そしたら、rails に、readlineがない!!!!って怒られるようになって、

rails動かなくなっちゃった。(エラー内容は忘れました)

一旦、brew link でreadlineのsymbolic link作って、ruby再インストールで復活!!

$ brew link readline --force
$ rbenv uninstall 2.3.0
$ rbenv install 2.3.0

これで、.bash_profileをロードすればおっけーなはず。(ちょっと前にやったから不安)

$ source ~/.bash_profile

SQLite本番

ここからやっとSQLiteの使い方。

DBの開き方

さてさて、ファイルを指定して開きます。

$ sqlite3 db/development.sqlite3
SQLite version 3.14.2 2016-09-12 18:50:49
Enter ".help" for usage hints.
sqlite>

show database

> .database

見栄えよくする

> .header on
> .mode column

show tables

> .tables
sqlite> .tables
table1 table2
table3 table4

select

> select * from hoge;
id          column1       column2        column3
--          --------       ---------       ---------
 1           aaaaaaa       bbbbbb         ccccccc
 2           ddddddd       eeeeee         fffffff

insert

> insert into hoge (id, column1, column2, column3) values (3, "ggggg", "hhhhh", "iiiii");

一旦。

whenever gemでどう書くの?

はいねもとです。

cron管理に、whenever gemを使っています。

github.com

今回、下記設定をしようとして、謎挙動をしたので、とりあえずメモ。

  • 2:00 - 23:30までは、30min毎に、task Aを実行する

まずは、バージョン。

  • whenever (0.9.4)
  • chronic (0.10.2)

Wheneverは導入が超簡単なcrontab管理ライブラリGemです![Rails4.2 x Ruby2.3] - 酒と泪とRubyとRailsと

上記記事を参考にして、schedule.rbにはこんな感じで記載してみました。

regular_sync_schedule = (2..23).map {|_| ["#{_}:00", "#{_}:30"] }.flatten
  every 1.day, at: regular_sync_schedule do
    runecho "bb"
end

そして、実行!えいやー。

$ RAILS_ENV=development bundle exec whenever --update-crontab

cronの設定を確認。

$ crontab -l
# Begin Whenever generated tasks for: /Users/nemoto_hideaki/work/PROJECT/testp/config/schedule.rb
0,30,0,30 14,15,16,17 * * * /bin/bash -l -c 'echo test1 '\''bb'\'' >> log/cron_log.log 2>&1'

0,30 6,7,8,9,10,11,12,13,18,19,20,21,22,23 * * * /bin/bash -l -c 'echo test1 '\''bb'\'' >> log/cron_log.log 2>&1'

# End Whenever generated tasks for: /Users/nemoto_hideaki/work/PROJECT/testp/config/schedule.rb

ぬぬー???なんかおかしい・・・

みやすく揃えてみると・・・

[min]
0,30,0,30
0,30

[hour]
14,15,16,17
6,7,8,9,10,11,12,13,18,19,20,21,22,23

[others]
* * * /bin/bash -l -c 'echo test1 '\''bb'\'' >> log/cron_log.log 2>&1'
* * * /bin/bash -l -c 'echo test1 '\''bb'\'' >> log/cron_log.log 2>&1'

やっぱり色々おかしい・・・

仕方ないので、原因を追ってみる。

Wheneverを呼び出すと、わーーーー、っと流れに流れて、

Whenever::Output::Cron#initialize が呼ばれます。

その中で、先程記載した下記設定の、"at" の部分が解釈されるみたい。

regular_sync_schedule = (2..23).map {|_| ["#{_}:00", "#{_}:30"] }.flatten
  every 1.day, at: regular_sync_schedule do
    runecho "bb"
end

実際のコードは下記。

def initialize(time = nil, task = nil, at = nil)
  @at_given = at
  @time = time
  @task = task
  @at   = at.is_a?(String) ? (Chronic.parse(at) || 0) : (at || 0)
end

んで、ここのどこでおかしくなってるかというと・・・

Chronic.parse(at)

これですこれ。

なんか、この人に、1:00 - 5:00のStringを渡すと、なぜか、PMに変換されちゃう。

$ irb
irb(main):001:0> require 'chronic'
=> true
irb(main):002:0> Chronic.parse("5:00")
=> 2016-09-24 17:00:00 +0900
irb(main):003:0> Chronic.parse("6:00")
=> 2016-09-24 06:00:00 +0900
irb(main):004:0> Chronic.parse("5:00 am")
=> 2016-09-24 05:00:00 +0900

ほら。最後に、amをくっつけたやつは大丈夫。

Chronic gemまで見てみる気力がなかったので、一旦下記の設定をして逃げるある。

regular_sync_schedule_am = (2..11).map {|_| ["#{_}:00 am", "#{_}:30 am"] }.flatten
regular_sync_schedule_pm = (12..23).map {|_| ["#{_}:00 pm", "#{_}:30 pm"] }.flatten

every 1.day, at: regular_sync_schedule_am do
  runecho1 "aa"
end

every 1.day, at: regular_sync_schedule_pm do
  runecho1 "aa"
end

23:00とかにもpmってついちゃうけど、それは問題なく動くので気にしない。

最終こうなったよ。

0,30 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 * * * /bin/bash -l -c 'echo test1 '\''aa'\'' >> log/cron_log.log 2>&1'

ちゃんちゃん。

PHPのメモリ割り当てエラー

はいねもとです。

今回は、WordPressをいじっていて出たエラー。

バージョンは、こんなん。

  • WP-4.2.2
  • PHP 5.5.38 (cli) (built: Jul 20 2016 16:01:37)

エラーはこんなん。

PHP Fatal error: Allowed memory size of bytes exhausted (tried to allocate XX bytes) in $ROOTDIR/wp/wp-includes/wp-db.php

なんだろーなー、と色々検索して、下記設定値をあげてみたりするも解決せず。

  • WP_MEMORY_LIMIT
  • WP_MAX_MEMORY_LIMIT

php.iniの、memory_limitも、128MB -> 256MBにあげてみたけど解決せず。

なんやねん。と思いつつ調査。

最終、原因は、php-fpm.d/www.confの下記設定。

php_admin_value[memory_limit] = 128M

どうやら、php_admin_valueに、渡してる引数に対応するphpの設定項目を上書きしちゃうらしい。

つまり、これをfpm側に書いてると、php.iniでいくらmemory_limitを設定しても無駄。

なので、ここを256MBにして再起動したら直りましたとさ。

ちゃんちゃん。

awsのstub in rspec

はいねもとです。

こんな環境でSQSのテストをrspecで書いていてこまってたのでメモ。

こまったのは、

queue = sqs.create_queue(queue_name: "testq")
sqs.send_message(queue_url: queue.queue_url, message_body: "testdeath")

こんなコードを書いてるところです。

外部への接続なので、当然、stubしてね、って怒られました。

そしてこんなstubを書きました。

stub_request(
  :post,
  "https://sqs.ap-northeast-1.amazonaws.com/"
).to_return(status: 200, body: ""), headers: {})

それで実行してみました。

TypeError:
no implicit conversion of Array into String

ぬぐぐ・・・。配列を文字列に暗に変換しましたね!と。

そんなつもりはないのですが、どこかで変換したみたいです。

queue = sqs.create_queue(queue_name: "testq")
sqs.send_message(queue_url: queue.queue_url, message_body: "testdeath")

send_messageの引数に、create_queueの返り値を渡しているので、そのあたりをあたってみました。

stub_request(
  :post,
  "https://sqs.ap-northeast-1.amazonaws.com/"
).to_return(status: 200, body: Aws::SQS::Types::CreateQueueResult.new(queue_url: "aaa"), headers: {})

変更したのは、returnで、Aws::SQS::Types::CreateQueueResultを作って渡してみたところ。

なぜかというと、下記を見ると、create_queueの戻りはこれ、って言ってるので。

Class: Aws::SQS::Client — AWS SDK for Ruby V2

でも、実行してみたら、

WebMock::Response::InvalidBody:
  must be one of: [Proc, IO, Pathname, String, Array]. 'Aws::SQS::Types::CreateQueueResult' given
# ./spec/controllers/hogehoge_controller_spec.rb:204:in `block (4 levels) in <top (required)>'

どーん!returnに指定できるものは決まっているじゃないですが・・・

意気消沈の助。

先生にたくさん質問して得られた結果。

Client Response Stubs - AWS Developer Blog - Ruby

f:id:xengineer:20160830153659p:plain

Stubbing All Clients

The default config can be used to enable client stubbing globally. This can be very useful when writing tests to enable stubbing in your test helper once.

# stub everything
Aws.config[:stub_responses] = true

つまり、Aws.config[:stub_responses] = trueを設定すれば、AWSの接続は全部勝手にstubしてやるよ!

って太っ腹設定があるのねーーーー!!

ほっ。これで全部解決。

ということで、設定してみました。

before do
  Aws.config[:stub_responses] = true
end

実行してみました。

ArgumentError:
  invalid endpoint, expected URI::HTTP, URI::HTTPS, or nil, got #<URI::Generic String>

はふ・・・もう少し・・・だといいな・・・

なんだろうねぇ・・・と思って、create_queueからの戻りを見てみると、

"String"

って。きっと内部的には、URI.parse(queue_url)的なことをされているのだと思いますが、

URIの文字列ではないので、URI::Generic Stringって言われちゃうんでしょうね・・・

さて、ここから再度先生に質問。

support response stubbing for all instances of a service client · Issue #187 · aws/aws-sdk-core-ruby · GitHub
Using Stubs for the AWS SDK for Ruby - DZone Cloud
Client Response Stubs - AWS Developer Blog - Ruby

この辺を参考にした結果。

before do
  Aws.config[:sqs] = {
    stub_responses: {
      create_queue: {
        queue_url: "http://test.com"
      }
    }
  }
end

これ!これで無事通りました。

ちゃんと、create_queueのときに、queue.queue_urlに、"http://test.com"が入ってきます。

あー、長かった・・・腰が痛いです。

aws-sdk使っていて謎のエラー(region設定)

はい、ねもとです。

で、SQS使おうとして、謎のエラーにぶつかり続けたのでメモです。

現象:

  1. rake spec は問題ない
  2. rspec spec/controllers/hogehoge_controller.specするとエラーがでる
NoMethodError:
  undefined method `match' for nil:NilClass
  Did you mean?  catch

検索してみると、

github.com

の中で、おじさんが、こんなことを言っていました。

f:id:xengineer:20160830120446p:plain

つまり、region設定ちゃんとされてないと出るよ。

ほむほむ。

dotenv-rails gemが入っているので、.envで、SQS_REGIONを定義して、

プログラム上もそれを読んでるんですけども・・・

binding.pry 挿入して、デバッグしてみたけども・・・

[2] pry(#<QueueManagerService>)> ENV['SQS_REGION']
=> nil

がっつりnil

えー。rake spec するとちゃんと入ってる。

えー。なんでだろう・・・と散々悩むことロダンの如し。

shell再起動したら直りました。

あ、そういうこともあるのか・・・。というか、.env編集したら再起動しないといけないのかな・・・

軽く、ぐーぐる先生にたずねてみたけどそんなことも見つからず。

誰か教えてくださいm(__)m