wordpressのdockerコンテナからRDSに接続する
今度はRDSに接続してみる。
RDSはとりあえずdevでぽちぽち立ち上げ。
mysql -h ${RDS ENDPOINT} -P 3306 -u ${RDS USER} -p
で接続できることを確認。
接続できない時は立ち上げたVPC上のSecurity Groupの設定で接続元(この時はローカルのMacから接続してたので自宅のグローバルIP)とポートを許可する
RDSに接続できることを確認できたらwordpressのコンテナ起動オプションに
https://hub.docker.com/_/wordpress/
に従い -e オプションで接続先のDB設定を追加する
docker run --name wordpress -e WORDPRESS_DB_HOST=${RDS ENDPOINT} -e WORDPRESS_DB_USER=${RDS USER} -e WORDPRESS_DB_PASSWORD=${RDS PASSWORD} -p 80:80 -d wordpress
起動できたら前回同様にブラウザでアクセスしてみる
#dockerホストのIP確認
$ docker-machine ip wordpress >192.168.99.100
http://192.168.99.100にアクセス -> OK
同一dockerホスト上でwordpressとmysqlをそれぞれのdockerコンテナで起動して接続してみるメモ
※環境はMacOS
※virtualBoxとdocker-machineはセットアップ済み
#docker-machineでwordpress起動用のdockerHostを起動
$ docker-machine create --driver virtualbox wordpress
# 環境変数を設定
$ eval "$(docker-machine env wordpress)"
#mysqlのdockerコンテナを起動
$ docker pull mysql $ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
#接続の確認
mysql -h $(docker-machine ip wordpress) -uroot -p
dockerでwordpressを起動
$ docker pull wordpress $ docker run --name wordpress --link mysql -p 80:80 -d wordpress
ブラウザでアクセスしてみる
#dockerホストのIP確認
$ docker-machine ip wordpress >192.168.99.100
http://192.168.99.100にアクセス -> OK
Raspberry Pi2 Model Bでmdadmを使ったraid1構築
apt-get install mdadm
でmdadmをインストール- sdaとsdbをfdiskで初期化してから、それぞれsda1とsdb1のパーテーションを作成
mdadm --create /dev/md0 --level=raid1 --raid-devices=2 missing /dev/sda1
でまずはsda1だけの片肺状態で/dev/md0を作成mkfs -t ext4 -c /dev/md0
で/dev/md0にext4のファイスシステムを作成する- /etc/fstabに
/dev/md0 /data ext4 defaults 0 0
を追記する - 試しに
mount /dev/md0
でマウントしてみる→OK mdadm --add /dev/md0 /dev/sdb1
で残りのsdb1をraidに参加させる
Macで画像のexifを編集する
exiftoolをインストールする
www.sno.phy.queensu.ca
対象のディレクトリで以下を実行
cd target_dir exiftool -alldates='2016:2:04 00:00:00' -overwrite_original *
haskellでなぜfoldrだと無限リストが扱えてfoldlだと扱えないのか
畳込関数fold:foldrとfoldlの違い (あるいはfold_right, fold_left) - 一歩前進
無限リストをfoldrで扱う(foldlでは扱えない)
haskellは遅延評価が特徴。
式の評価は外側から行う。
つまり外側の評価をするその時に内側の結果が必要なら計算する。
算数で例えると
(1 + (2 * 3))
という計算の場合は、外側の1 + の部分を計算するためには(2 * 3)の結果が必要なので、しゃーなしにその時に(2 * 3)を計算するみたいな感覚っぽい。
なので
foldl (+) v [x0,x1,...,xn] = (...((v + x0) + x1) ...) + xn foldr (+) v [x0,x1,...,xn] = x0 + (x1 + (... (xn + v)...))
のような場合だと
foldlの場合は一番外側の式がxnの計算、つまり無限の終端を対象とする計算になってしまうので計算不可能。
foldrの場合は、一番外側がx0でリストの最初の数を対象にしているので計算(を開始することは)可能。
ということみたい。
試しにGHCIで
Prelude> foldl (+) 0 [1..]
は返ってこない
Prelude> foldr (+) 0 [1..] [2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394,396,398,400,402,404,406,408,410,412,414,416,418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452,454,456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488,490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,564,566,...
で一応実行できる。
Java Flight RecorderとMission Controlのまとめ
Java Flight Recorder(以下JFR)はいわゆるJavaプロセスのプロファイラ。
Java Mission Control(以下JMC)はJFRで取得したプロファイリングデータをGUIで見る事ができるビューア。
もともとはJRockitで搭載されていたのが, Java 7 Update 40以降で搭載されるようになった。
詳しくは
http://www.infoq.com/jp/news/2013/10/misson-control-flight-recorderHotSpot JVMで動作するMission ControlとFlight Recorder
で。
この機能は商用ライセンスのみになっているので、プロダクト用に利用する場合は商用ライセンス契約が必要。
ただし、JVMのオプションを指定することで利用できるようになっているのでお試しで利用することはできるみたい。
使い方は基本的には
http://docs.oracle.com/javase/8/docs/technotes/guides/jfr/toc.htmlTable of Contents
に全てが書いてあります。
プロファイリングの開始
$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr MyApp
のようにプロセス起動時に開始するか
$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder MyApp
で起動してから
jcmd(後述)でJFR.startコマンドを投げることによって開始される。
プロファイリング開始後の操作
jcmdコマンドを使ってjavaプロセスにコマンドを投げることによって、プロファイラに命令を送ることができる
#javaプロセスの確認 $ jcmd 3857 ←プロファイリングしたいプロセス 20762 sun.tools.jcmd.JCmd #このプロセスに投げることができるコマンド一覧の確認 $ jcmd 3857 help 3857: The following commands are available: JFR.stop JFR.start JFR.dump JFR.check VM.native_memory VM.commercial_features ManagementAgent.stop ManagementAgent.start_local ManagementAgent.start Thread.print GC.class_histogram GC.heap_dump GC.run_finalization GC.run VM.uptime VM.flags VM.system_properties VM.command_line VM.version help
プロファイリングスタート
$ jcmd 3857 JFR.start 3857: Started recording 1. No limit (duration/maxsize/maxage) in use. Use JFR.dump recording=1 filename=FILEPATH to copy recording data to file.
recordingという番号がプロファイリング開始番号みたいな扱いらしい。
duration(期間)などの指定もオプションでできる
プロファイリングの状態の確認
$ jcmd 3857 JFR.check Recording: recording=1 name="Recording 1" (running)
recording番号は1でプロファイリング実行中(runnning)というのが確認できる
プロファイリングデータのダンプ取得
$ jcmd 3857 JFR.dump filename="/tmp/myprofile.jfr" compress=true recording=1
filenameでダンプファイルのパスを指定して、zipでの圧縮がしたければcompress=trueを指定する。
recorindg番号を指定は必須
プロファイリングの終了
$ jcmd 3857 JFR.stop recording=1
これもrecorind番号は必須
JMCの起動
$ [JDK_PATH]/bin/jmc
で起動
JMX経由の情報も見ることができるが、今回はプロファイリングデータから読み込むのでメニューのファイルから開くで、ダンプした/tmp/myprofile.jfrを指定する。
時系列ごとによく使われいてるMethodやThreadの一覧、メモリの割り当て状況やIO(ファイルやネットワーク)の状況も全て解析できる。
プロファイリング対象の設定
デフォルトのプロファイリングの設定だとメモリの割り当て状況(Memory -> Allocations)やヒープのオブジェクト解析(Memory -> Object Statistics)がオフになっているので、有効にする。
(JMCでウィンドウ開いてもEvent type 'Allocation in new TRAB' is not enabled in this recordingとかEvent type 'Object Count' is not enabled in this recordingとか出て何もグラフに表示されない)
ちなみにTLABはThread Local Allocation Buffersの略。
$ls -l [JDK_PATH]/jre/lib/jfr -rw-rw-r-- 1 root wheel 18574 Oct 8 2013 default.jfc -rw-rw-r-- 1 root wheel 18531 Oct 8 2013 profile.jfc
これがプロファイリング用の設定ファイルらしい
とりあえずdefault.jrcをmyprofile.jfcとしてコピーして必要そうなところをfalse -> trueに書き換えて有効にする
$ diff default.jfc myprofile.jfc 118c118 < <flag name="class-loading-enabled" label="Class Loading">false</flag> --- > <flag name="class-loading-enabled" label="Class Loading">true</flag> 237c237 < <setting name="enabled" control="heap-statistics-enabled">false</setting> --- > <setting name="enabled" control="heap-statistics-enabled">true</setting> 267c267 < <setting name="enabled">false</setting> --- > <setting name="enabled">true</setting> 446c446 < <setting name="enabled" control="allocation-profiling-enabled">false</setting> --- > <setting name="enabled" control="allocation-profiling-enabled">true</setting> 451c451 < <setting name="enabled" control="allocation-profiling-enabled">false</setting> --- > <setting name="enabled" control="allocation-profiling-enabled">true</setting>
そしてプロファイリング開始時にこの設定を使ってプロファイリング開始するようにする
$ jcmd 3857 JFR.start settings=myprofile
これで先ほどと同じ通りにプロファイリングデータのダンプを取得してJMCに読み込ませれば、該当のプロファイリングが有効になってました。
参考:
Java Mission Control + Flight RecorderをGlassFish4で使ってみた - ブログなんだよもん
Running Java Flight Recorder
[http://hirt.se/blog/?p=370Creating Flight Recordings | Marcus Hirt
[http://hirt.se/blog/?p=381Allocation Profiling in Java Mission Control | Marcus Hirt
IntelliJ Ideaでgradleのサブブロジェクト構成をビルドするとエラーになる問題
Error:scalac: Error: object scala.runtime in compiler mirror not found. scala.reflect.internal.MissingRequirementError: object scala.runtime in compiler mirror not found. at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16) at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17) at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48) at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:40) at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61) at scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:172) at scala.reflect.internal.Mirrors$RootsBase.getRequiredPackage(Mirrors.scala:175) at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage$lzycompute(Definitions.scala:183) at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage(Definitions.scala:183) at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass$lzycompute(Definitions.scala:184) at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass(Definitions.scala:184) at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr$lzycompute(Definitions.scala:1024) at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr(Definitions.scala:1023) at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses$lzycompute(Definitions.scala:1153) at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses(Definitions.scala:1152) at scala.reflect.internal.Definitions$DefinitionsClass.symbolsNotPresentInBytecode$lzycompute(Definitions.scala:1196) at scala.reflect.internal.Definitions$DefinitionsClass.symbolsNotPresentInBytecode(Definitions.scala:1196) at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1261) at scala.tools.nsc.Global$Run.<init>(Global.scala:1290) at xsbt.CachedCompiler0$$anon$2.<init>(CompilerInterface.scala:116) at xsbt.CachedCompiler0.run(CompilerInterface.scala:116) at xsbt.CachedCompiler0.run(CompilerInterface.scala:102) at xsbt.CompilerInterface.run(CompilerInterface.scala:27) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:102) at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:48) at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:41) at org.jetbrains.jps.incremental.scala.local.IdeaIncrementalCompiler.compile(IdeaIncrementalCompiler.scala:28) at org.jetbrains.jps.incremental.scala.local.LocalServer.compile(LocalServer.scala:25) at org.jetbrains.jps.incremental.scala.remote.Main$.make(Main.scala:58) at org.jetbrains.jps.incremental.scala.remote.Main$.nailMain(Main.scala:21) at org.jetbrains.jps.incremental.scala.remote.Main.nailMain(Main.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.martiansoftware.nailgun.NGSession.run(NGSession.java:319)
対応方法
$ cd {project_root} $ find . -name "*.iml" | xargs rm -rf #idea設定を全削除 $ find . -name ".idea" | xargs rm -rf # ideaプロジェクト設定を削除 $ gradle clean # gradleきれいにしてから $ gradle build -x test # 一度、全ビルドしてからの $ gradle idea # idea設定を作成