JDBな人生  専門的なことから日常的なことまで~ まぁ自由きままに書いていきます。
2018年08月 / 07月<< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>09月

アクセスランキング

[ジャンルランキング]
コンピュータ
229位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
32位
アクセスランキングを見る>>

Gradle/Spring Boot/MySQL (+Phinx)のプロジェクトをGoogle App Engine/Cloud SQLにデプロイする

久々に技術系の記事です。最近ちょっとしたWEBアプリケーションを開発しているのですが、今回は初めて、運用にGoogle Cloudを使ってみることにしました。ある程度開発が進み、一度デプロイしようと思ったら色々と問題が。かれこれ三日もハマってしまいました。

サンプルはいろいろとあるのですが、Gradleを利用、かつCloud SQLに接続しているようなものが見つけられず、見よう見まねで何とか動かしたというところです。

以下、参考になったサイトと簡単な手順だけ書き残しておきます。

0. Google Cloud SDKをインストールする

開発用のマシンからデプロイする場合はこれを入れておきます。

Cloud SDK | Google Cloud
https://cloud.google.com/sdk/

1. PhinxをCloud SQLに接続する

こちらは単純でした。ドキュメント通りにCloud SQL Proxyをインストール・起動した後、phinx.ymlに接続先としてlocalhostを指定します。(3306はおそらく使用中なのでポートも指定することになると思います。)

Cloud SQL Proxy を使用して MySQL クライアントを接続する | Cloud SQL for MySQL | Google Cloud
https://cloud.google.com/sql/docs/mysql/connect-admin-proxy?hl=ja

2. App Engineで起動するための改造

こちらも基本ドキュメント通りに進めますが、Gradleの記法には要注意です。

getting-started-java/appengine-standard-java8/springboot-appengine-standard at master · GoogleCloudPlatform/getting-started-java · GitHub
https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/appengine-standard-java8/springboot-appengine-standard

build.gradle

// 衝突するものを排除する
configurations {
    compile.exclude group: 'org.springframework.boot', module: "spring-boot-starter-tomcat"
    compile.exclude group: 'org.slf4j', module: "jul-to-slf4j"
    compile.exclude group: 'org.apache.logging.log4j', module: "log4j-to-slf4j"
    compile.exclude group: 'ch.qos.logback', module: "logback-classic"
}

// AppEngineでの起動のため
apply plugin: 'com.google.cloud.tools.appengine'
apply plugin: 'war'

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.cloud.tools:appengine-gradle-plugin:+'
    }
}

dependencies {
    // ...
    providedCompile group: 'javax.servlet', name: 'servlet-api', version: '2.5'
    compile group: 'com.google.cloud.tools', name: 'appengine-gradle-plugin', version: '1.3.5'
}


@SpringBootApplicationのクラスにSpringBootServletInitializerを継承させます。
(SpringBootServletInitializerを継承したクラスをここ以外の場所に置いてもAppEngineでは起動しませんでした。)

ServerApplication.kt

// ...
@SpringBootApplication
class ServerApplication : SpringBootServletInitializer() {
    override fun configure(application: SpringApplicationBuilder): SpringApplicationBuilder {
        return application.sources(ServerApplication::class.java)
    }
}

fun main(args: Array) {
    runApplication(*args)
}



上記ドキュメントの"Out of memory errors"の対処法だけ、本文中の方法では直らなかったので、以下のページを参考にしました。

springboot-appengine-standard logging configuration · Issue #284 · GoogleCloudPlatform/getting-started-java · GitHub
https://github.com/GoogleCloudPlatform/getting-started-java/issues/284#issuecomment-349119391

application.properties

# ...
logging.level.root=INFO
logging.level.org.springframework.test.web.servlet.result=DEBUG


あとはローカルならappengineRun、デプロイならappengineDeployを実行すればいけるはずです。(もちろん諸々の初期設定は必要ですが。)

3. Cloud SQLに接続する

こちらもドキュメント通りに進めますが、設定の方法に注意が必要です。

Google Cloud SQL の使用 | Java の App Engine スタンダード環境 | Google Cloud
https://cloud.google.com/appengine/docs/standard/java/cloud-sql/?hl=ja

build.gradle

dependencies {
    // ...
    runtime('mysql:mysql-connector-java')
    compile group: 'com.google.cloud.sql', name: 'mysql-socket-factory', version: '1.0.5'
}


appengine-web.xml

<use-google-connector-j>true</use-google-connector-j>


application-development-google.properties

spring.datasource.url=jdbc:google:mysql://インスタンス接続名/DB名
spring.datasource.username=ユーザ名
spring.datasource.password=パスワード
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.datasource.driver-class-name=com.mysql.jdbc.GoogleDriver


DriverClassの指定はこれでいいのかよくわかりませんが、とりあえずこの指定で動いているのでこうしておきます。

---

以上が三日間の苦闘の末の成果(?)です。最終的な設定ファイルが定まるまで53回もデプロイしていました。ほとんど実験ですね。ドキュメントをちゃんと読むのってやっぱり大事です。

VPSにデプロイするのと比べると、楽ができる部分が多そうなので、うまいこと活用していきたいと思います。あとはどのくらいの料金がかかりそうなのかですね。

クライアント側ではangularの新しいやつ(一体バージョンはいくつまで上がったのでしょうか?)を使おうと思っているので、また何かあれば記事にします。
   Kotlin/Spring Boot/GAE    TB(0)    CM(0)    EDIT    ページ↑

カルボナーラの真実

お久しぶりです。前回の更新から一か月も経ってしまいました。
タイトルの通り、最近ちょっとした発見をしました。しょーもない話なんですが。

さて、豚骨ラーメンとカルボナーラ、どちらがより多くの塩分を含むかと聞かれたら、どう答えるでしょうか。

昼食をカルボナーラか豚骨ラーメンか迷ったある日、ふと気になりました。さっきおやつも食べたし、一応塩分少なそうな方にしよう。まあカルボナーラでしょ、と。

そこで一応成分表示を見ると、次の通り。

こちらが豚骨ラーメン(袋麺)の表示です。
成分表示豚骨

乾麺の状態と茹でたあとの状態で麺に含まれる塩分の量が変化する(茹でるとお湯に溶け出すため)のですが、ご親切に調理後の値が書いてあります。
スープの塩分量が多いですが、スープを飲まない、つまり麺を啜るときに口に入る量以外は考えないとすれば、実際に摂取するのはこの1割程度と考えて良いでしょう。(後日、食前・食後でスープの量を概算したところ、多く見積もっても1割しか減っていませんでした。)

こちらがカルボナーラのソースの表示です。
成分表示

ソースはかなりの部分がスパゲッティと絡んで口に入るので、8割くらいは摂取すると考えて良いでしょう。少なく見積もって5割の計算もしておきます。

スパゲッティは茹でるときに塩を入れるので、それも考慮に入れないといけません。

穀類/こむぎ/[マカロニ・スパゲッティ類]/マカロニ・スパゲッティ/ゆで - 一般成分-無機質-ビタミン類-アミノ酸-脂肪酸-炭水化物-有機酸等
https://fooddb.mext.go.jp/details/details.pl?ITEM_NO=1_01064_7

文部科学省の食品成分データベースでは、ナトリウムが460mg、食塩相当量に換算すると1.17gとなります。

パスタの茹で汁に塩を入れたときの塩分摂取量を調べてみよう
http://no-shukketsu.com/salt_of_pasta/

100gのパスタを1%の食塩水で茹でると2.8gの塩分が加わるということです。

こちらのページでは2.8gと出ています。この値はどれだけの塩を入れるかにも依るので、多少の幅はあっても仕方ないと思います。
高校の家庭科の授業では、パスタ1束には小さじ1(6g)と習いましたが、上記のサイトでは10gを入れているので、少し多めかもしれません。6gに換算すると1.68gなので、文科省のデータに近づきます。
ここでは少な目に見積もって文科省のデータ1.17gを使いましょう。

ということで、状況を整理してみます。
まとめ

スープ・ソースから摂取する塩分量の割合を上述の通りとすると、豚骨ラーメン一杯からの摂取量が1.73gに対して、カルボナーラ一食では2.61gと、およそ1.5倍となっています。食塩の絶対量では0.88gの差です。

ちなみにカルビーのポテトチップスの食塩相当量は、うすしお味の60g入りのものだと0.6gです。

商品のエネルギー(カロリー)や栄養成分をおしえてください。また、カリウムとリンの数値もおしえてください。 | お客様相談室 | カルビー株式会社
http://faq.calbee.co.jp/faq_detail.html?id=5

つまり、カルボナーラ>豚骨ラーメン+ポテトチップスという不等式が(食塩に限定すれば)成立する訳です。

ラーメンよりスパゲッティのほうが多いって、意外な結果ではないでしょうか。

ただし、スープの摂取割合を1割から2割に増やしたり、ソースの摂取割合を減らしたりすると結果は変わります。なのでスープを飲む場合、ソースがそんなに絡んでいない場合はこの関係は成り立たないかもしれません。

ということで、(当日はここまで計算したのではなくなんとなくの概算で)豚骨ラーメンを食べたわけです。
後日カルボナーラも食べましたが。

厚生労働省の「日本人の食事摂取基準」では、8.0g未満(成人男性の場合)に抑えよと書いてあるので、上の計算通りなら一応は3食食べても大丈夫ということにはなりますが、副菜や間食もありますからね。案外超えてるのかも。

ということで、ラーメン=体に悪い、というイメージがある人もいるかもしれませんが、塩分だけ見れば、必ずしもそうでもないということを覚えておきましょう。(ただしスープを飲まない場合!)
   雑談    TB(0)    CM(0)    EDIT    ページ↑

∫2x^(3)e^(∫2xdx)dxを積分する

ここ数週間、訳あって微分方程式の学習をしています。
微積分をやっていると「中高6年間の数学はこのためにあったのか!」と感じるようなところがあります。

さて、テキストの演習問題で一問、かなり悩んだものがあったので、備忘録も兼ねて書いておきたいと思います。
しばらく検索したのですがこの形のものがなかなか見つからず。最終的には以下のサイトが非常に参考になりました。(というかほぼそのまま)

算数数学の質問まとめブログ : f(x)=x^3 * e^(-x^2) を積分したい
http://blog.livedoor.jp/sansusugakuquestion/archives/30501541.html

やってみれば大したことではないのですが、この形の置換積分は初めて見た(気がする)のでなるほど、という感じです。
調べると、後半のe^(x^2)になる部分は初等関数で不定積分を表すことはできないそうです。

\[f(x) = \int2x^{3}e^{\int2xdx}dx \\
=\int2x^{3}e^{x^{2}}dx \\
t=x^{2}として、\frac{dt}{dx}=2x \\
上式=\int \Bigl(2x^{3}e^{x^{2}}\cdot\frac{1}{2x}\frac{dt}{dx} \Bigl)dx \\
=\int x^{2}e^{x^2}\frac{dt}{dx}dx \\
=\int te^{t} dt \\
=\int \{ (e^{t})'\cdot t \} dt \\
=e^{t}t - \int (e^{t} \cdot 1 )dt \\
=e^{t}(t-1) + C \\
\therefore f(x) = e^{x^{2}}(x^{2}-1) + C \\(C:積分定数) \]


数式を打ち込むのって案外良い暇つぶしになるかもしれません。
   数学    TB(0)    CM(0)    EDIT    ページ↑

TOEICスコア更新?

先月末に、人生で3回目となるTOEIC(リーディング・リスニング)テストを受験してきました。
目標は前々から言っている900点台の突入だったのですが、次のような結果で目標達成ならず。

スクリーンショット 20170722

前回の結果が865点だったので、一応は点数アップということになります。内訳はリスニングが5点下がり、リーディングが10点上がったという感じです。

今回はいつもやっている単語集に加えて、洋書(講義の参考文献)を読んでみたりなんかしたのですが、思った以上に点数が変わりませんでした。リーディングはもう少し上がると思ったんですけどね。

あと今回の受験で感じたのが、英語を読み続けられるだけの集中力がどれだけあるのか、ってところ。途中数十秒、集中が途切れる場面がありました。結局最後の一問は残してしまいました。

努力の結果が出ないっていうのは久々に悔しい感じもするので、2ヶ月ほどしっかり準備して、もう一度挑戦してみようと思います。
でも今回準備していて、経済学や哲学の文献を読む(理解する)には十分な読解力がついていると分かったので、それはそれで一つの収穫にはなりました。
前回・前々回のスコアがまぐれじゃなさそうだってわかったのも大きいですね。


話は変わりますが、前回の記事で書いた構想は、ちょっと人と相談した結果、栄養バランスの簡単な分析やレコメンド機能は実装できるかもしれないが、レコメンドの内容そのものについて、個人の好み・その時々のコンディション(あっさりしたものが食べたいとか、こってりしたものが食べたいとか)によって相当違いが出るので、現実的には難しいかもしれない、というご意見をいただきました。確かに気分によって食べたい食べたく無いってあります。

まあそれも含めて、検討・実装してみようかなと思います。技術的な記事もおいおい書ければと。
   雑談    TB(0)    CM(0)    EDIT    ページ↑

「正しい」食生活?

(広告を消したいだけなのであんまり中身がないかもしれません)

ここ数週間、正しい食生活ってのは一体なんなんだろうと考えています。

朝食・昼食・夕食に何を食べるべきかは自分で決められる訳ですが、もしその選択が悪ければ体調不良の直接の原因になることもあります。

じゃあ厚生労働省とかが示している基準に従って、満遍なく栄養を摂れるように食べれば良いじゃないか、という話になるのかもしれませんが、現実にはそんな生活ができている人ってそうそういないだろうなあと。レシピを見つけるところから、食材の調達・調理時間の確保まで全て完璧にこなさないと満遍なくってわけにはいきません。これってかなり難しいですよね。

そこで、結局はこれまで食べてきたようなもの、多分これを食べておくと良いんだろうと思うもの、可能な出費の範囲内で食べたいと思うものを選んで食べることになります。

実際問題、食生活がどれだけ体調に影響するのかってよくわかりませんが、偏りかたによっては致命的な場合もあるでしょうし、そうでなくても少し改善すれば多少はマシになるってものもあるのかもしれないと思います。その辺の話も調べたら結構色々出てきそうです。優先すべき栄養素とそうでない栄養素とか。

で、何か良いアプリとかないかなあと思うわけです。一応少し探してみると、食べた食事の内容を記録して、それに応じた栄養素の摂取量を計算できるってアプリ(だいぶ前にリリースされたもの)と、ダイエットをサポートするサービスで14種類の栄養素が記録できるとかってのがありました。

できれば不足している栄養素を補えるような手間をかけずに作れるレシピのおすすめ機能なんかもあったらなあ、とか思っちゃったりします。(これは限られた資源を最も効率的に配分するにはどうしたら良いかっていう、まさに経済的な問題ですね。)

あと、写真から何を食べたのか勝手に認識して記録してくれる機能とかあったら嬉しいなあとか。ちょっと前にMicrosoftが公開した画像認識のAPIの精度が高いって話題になっていたような。まあ料理だけで学習させた方が精度は上がりそうな感じもします。

誰か作ってくれないかなあ…
そんなサービスがあったらぜひ教えてください。
   雑談    TB(0)    CM(0)    EDIT    ページ↑

Picture of the day: 現品限り

今日ニトリに行ったら、ちょうど探していたサイズの本棚(というより大きめのカラーボックス)が見つかりました。

思っていたよりも安いな…と思ったら現品限り(組み立て済み)の最後の一品。自転車で行っていたのですが、さっさと買ってしまおうと、タイムズで車を借りて買うことにしました。

台車に乗せて駐車場まで持っていったのは良いものの、一つ重大な問題が。

大きすぎて車に入りません。

実家の車(7人乗り)と同じ感覚で「まあ入るでしょ」と考えていたのですが、甘すぎました。170センチ以上もあるのに、5人乗りの小ぶりな車にはさすがに大きすぎたようです。

言い訳をすれば、助手席・後部座席を倒せるところまで倒してトランクから入れようと考えていて、いざ乗せようと思ったら後部座席が倒れないし、そもそもトランクも開かない(?!)車だった訳です。

なんて惨めな…
あまりにも無計画なのはよろしくないですね。

どうしようかと考えた結果、バラして載せるしかないだろうと。
組み立て家具のコーナーで一本120円のプラスドライバーを買ってきて、作業を開始しました。

側板を取ったところ
IMG_20170505_194819.jpg

という訳で、今日の一枚はこちら。

IMG_20170505_200001.jpg

ニトリの暗い立体駐車場で、一人寂しく(地道に、惨めに、)カラーボックスを分解するなんて、そうそう経験できることではありません。(たぶん)

家具を買うときは、設置場所だけではなくて、車のスペースもよく考えないといけないですね。(書くだけしょうもないような

にしても今日は夏っぽい天気でした。水分不足・熱中症に気をつけて、残りのゴールデンウィークを楽しみたいところです。
   Photo    TB(0)    CM(0)    EDIT    ページ↑

(メモ)そのうち記事にしたいこと

また広告が載ってしまいました。
最近時間がなくてきちんとした記事が書けていませんが、記事のアイデアだけ少々。

・「読解」の練習の仕方?
・語彙・文法の関係を「学習」一般の中で捉える
・学習における「詰め込み」の役割
・苦手「意識」はなぜできるのか
・ソースコードと物語の構造の比較


時間があったら書いてみようと思います。
   雑談    TB(0)    CM(0)    EDIT    ページ↑

プロフィール

JDB Luigi

Author:JDB Luigi
どこにでもいるようなありふれた人間・・・という訳でもなく、かと言って怪しい宗教を信仰する変人という訳でも無い。

基本的に掲載しているコード等は煮ていただいても焼いていただいても結構ですが、利用は自己責任にてお願いいします。
また、バグ・アドバイス等もしあればよろしくお願いします。