qiita-markdownを含んだGemfileをHerokuにpushするには - Qiita
こちら、HerokuのBuildpackの仕組みが環境変数ベースのものからちゃんとしたサブコマンドが用意されたのでそちらを使わないと動きません。
Buildpacks | Heroku Dev Center
素の状態だとqiita-markdownが依存してるcharlock_holmes
とrugged
がインストールできません。
rugged
cmakeが必要なのでcmakeを入れてくれるbuildpackを入れます。
$ heroku buildpacks:add --index 1 https://github.com/rcaught/heroku-buildpack-cmake
charlock_holmes
libicu
が必要なため、Aptfileに書いたライブラリをapt-getでインストールしてくれるbuildpackを使います。
$ vi Aptfile
libicu52
libicu-dev
$ heroku buildpacks:add --index 1 https://github.com/heroku/heroku-buildpack-apt
$ heroku buildpacks
1. https://github.com/heroku/heroku-buildpack-apt
2. https://github.com/rcaught/heroku-buildpack-cmake
3. heroku/ruby
aptが使えるならいろいろやりやすそうです。
日本語変換の話です。
日本語の変換って、「こまめに決定していく派」と「一気に打って後で変換していく派」があると思います。
僕は前者です。これは日本語変換が賢くない時の癖で、変換対象の文が長い方が予測も効きやすいはずで、後者に変えたいんですが、後者の方法だと不可能なパターンがある気がしてならない。
それが「csvをgz圧縮」できない問題です。
Google日本語入力とことえり両方で駄目でした。
そもそも後者の人はたくさんいるんだろうか。そしてみんなどうやって対応してるんだろうか。
railsのcreated_at
とupdated_at
はnot null
なので「無くてもいいけどあってもいい」かな?ぐらいのときに面倒。
他からデータを入れる時に困る。
embulk-filter-add_timeプラグインで追加できる。
$ embulk gem install embulk-filter-add_time
in:
...
filters:
- type: add_time
to_column:
name: created_at
type: timestamp
from_value:
mode: upload_time
- type: add_time
to_column:
name: updated_at
type: timestamp
from_value:
mode: upload_time
out:
...
sudo apt-get install openjdk-8-jre-headless
やりたいこと
BigQueryに日別に集計結果のログテーブルを作っています。
例:logs_20160101
その集計結果をCloud SQLに追加したい。
例:logs
日次バッチで動かしていて、毎日BigQueryから集計結果をCloud SQLのlogsテーブルに追加したい。
- 今日:logs_20160101(BigQuery) -> logs(Cloud SQL)
- 明日:logs_20160102(BigQuery) -> logs(Cloud SQL)
- 明後日:logs_20160103(BigQuery) -> logs(Cloud SQL)
やろうとしたこと
BigQueryからGoogle Cloud Storage(GCS)にCSVファイルでエクスポートして、Cloud SQLにインポートする。
$ bq extract datasetname.logs_20160101 gs://bucket-name/logs_20160101.csv
BigQueryからGCSへのエクスポートはできた。
しかしCloud SQLにCSVでファイルを読み込むことができない。
ローカルでmysqlimportを使うバターン
$ gsutil cp gs://bucket-name/logs_20160101.csv /tmp/logs_20160101.csv
$ mysqlimport --fields-terminated-by=',' -hxxx.xxx.xxx.xxx -uroot -ppassword database_name /tmp/logs_20160101.csv
mysqlimport: Error: 1045, Access denied for user 'root'@'%' (using password: YES), when using table: logs
権限が無い。
ローカルでmysqlクライアントからLOAD DATA INFILEを使うパターン
mysql -uroot -ppassword -hxxx.xxx.xxx.xxx database-name
mysql> LOAD DATA INFILE '/tmp/logs_20160101.csv' INTO TABLE logs;
ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)
権限が無い。
mysqlimportとLOAD DATA INFILEはmysqlのFILE権限が無いとできない。しかしCloud SQLではその権限が無い。権限付与ができない。
LOAD DATA LOCAL INFILEを使うパターン
mysql> LOAD DATA LOCAL INFILE '/tmp/logs_20160101.csv' INTO TABLE logs;
ERROR 1148 (42000): The used command is not allowed with this MySQL version
このmysql versionでは使えない。
CSV以外のフォーマットを使う方法
mysqldump形式やSQL形式のファイルをインポートする方法はいくつかありそうだが、BigQueryではそれらの形式でのエクスポートはサポートしていない。
その他
Cloud ConsoleのGUIではインポートできるが、バッチで実行するのには使えない。
最終手段は普通にAPIを使うプログラムを書くというものだが、「Cloud SQLでCSVインポートぐらいできないわけがない」という思いがあり、踏み出せない。
Stack Overflowに投稿してみた。しかし英語で伝えられてる気がしないので状況の整理の意味も込めてブログにも書いてみました。
How to import table from BigQuery to Cloud SQL - Stack Overflow
俺の胃の調子が悪いのがオフィスで飲みまくるコーヒーのカフェインのせいじゃないかと思い、ノンカフェインのルイボスティーをAmazonで買って飲んでました。
100個入りで1029円という恐るべきコストパフォーマンス。
今日、使い切ったので随分お気に入りで飲んだなーと思う一方、同じぐらいコーヒーを飲んでたのかと思うと恐ろしく思いました。
胃の調子は確かにマシになりましたが、他にも色々対策してたのでルイボスティーは関係ないかも。でも美味しいです。
Thread作りすぎにならないように10個ずつ送る。
threads = []
1000.times do
threads << Thread.new { post_request(url, data) }
if threads.size >= 10
threads.each(&:join)
threads.clear
end
end
rubocopプラグインを入れたが下記のようなエラー。
ググって出て来るのはGemfileにrubocopを入れてないというエラーで俺の場合は違う。
ProcessNotCreatedException: Failed to run RuboCop command - is it installed? (SDK=/usr/local/var/rbenv/versions/2.3.1/bin): Cannot run program "rubocop" (in directory "/Users/komagata/dev/src/github.com/fjordllc/kowabana"): error=2, No such file or directory
.kt
とい拡張子はkotlinかな?javaやkotlinのデバッグはやりたくないな。
RubyMineはしばらく置いておこう。
Failed to run RuboCop command - is it installed? (SDK=/usr/local/var/rbenv/versions/2.3.1/bin): Cannot run program "rubocop" (in directory "/Users/komagata/dev/src/github.com/fjordllc/kowabana"): error=2, No such file or directory
com.intellij.execution.process.ProcessNotCreatedException: Cannot run program "rubocop" (in directory "/Users/komagata/dev/src/github.com/fjordllc/kowabana"): error=2, No such file or directory
at com.intellij.execution.configurations.GeneralCommandLine.createProcess(GeneralCommandLine.java:358)
at org.jetbrains.plugins.ruby.ruby.run.RubyCommandLine.createProcess(RubyCommandLine.java:64)
at io.github.sirlantis.rubymine.rubocop.RubocopTask$runViaCommandLine$1.invoke(RubocopTask.kt:173)
at io.github.sirlantis.rubymine.rubocop.RubocopTask$runViaCommandLine$1.invoke(RubocopTask.kt:25)
at io.github.sirlantis.rubymine.rubocop.RubocopTask.parseProcessOutput(RubocopTask.kt:67)
at io.github.sirlantis.rubymine.rubocop.RubocopTask.runViaCommandLine(RubocopTask.kt:173)
at io.github.sirlantis.rubymine.rubocop.RubocopTask.run(RubocopTask.kt:60)
at io.github.sirlantis.rubymine.rubocop.RubocopAnnotator.doAnnotate(RubocopAnnotator.kt:157)
at io.github.sirlantis.rubymine.rubocop.RubocopAnnotator.doAnnotate(RubocopAnnotator.kt:24)
at com.intellij.codeInsight.daemon.impl.ExternalToolPass.b(ExternalToolPass.java:212)
at com.intellij.codeInsight.daemon.impl.ExternalToolPass.access$500(ExternalToolPass.java:44)
at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.run(ExternalToolPass.java:160)
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320)
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310)
at com.intellij.util.ui.update.MergingUpdateQueue.lambda$flush$1(MergingUpdateQueue.java:260)
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:274)
at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:229)
at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:222)
at com.intellij.util.Alarm$Request$1.run(Alarm.java:378)
at com.intellij.util.Alarm$Request.run(Alarm.java:389)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at com.intellij.util.concurrency.SchedulingWrapper$MyScheduledFutureTask.run(SchedulingWrapper.java:227)
at com.intellij.util.concurrency.BoundedTaskExecutor.runFirstTaskThenPollAndRunRest(BoundedTaskExecutor.java:178)
at com.intellij.util.concurrency.BoundedTaskExecutor.access$000(BoundedTaskExecutor.java:40)
at com.intellij.util.concurrency.BoundedTaskExecutor$2.run(BoundedTaskExecutor.java:197)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Cannot run program "rubocop" (in directory "/Users/komagata/dev/src/github.com/fjordllc/kowabana"): error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at com.intellij.execution.configurations.GeneralCommandLine.startProcess(GeneralCommandLine.java:368)
at com.intellij.execution.configurations.GeneralCommandLine.createProcess(GeneralCommandLine.java:354)
... 28 more
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 30 more