メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

Hibernate(Wildfly) + MySQLでDB再接続ができなくなる

接続が切れた時のエラー

The last packet successfully received from the server was 00,000 milliseconds ago. The last packet sent successfully to the server was 00 milliseconds ago.
(00の部分は適当なミリ秒)

INFO [stdout] (default task-62) Hibernate: select * from my_application_table
WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-62) SQL Error: 0, SQLState: 08003
ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-62) No operations allowed after connection closed.
INFO [stdout] (default task-62) yyyy/mm/dd hh:mm:ss:sss ERROR
INFO [stdout] (default task-62) javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: could not prepare statement
INFO [stdout] (default task-62) Caused by: org.hibernate.exception.JDBCConnectionException: could not prepare statement
INFO [stdout] (default task-62) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
INFO [stdout] (default task-62) Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
INFO [stdout] (default task-62)
INFO [stdout] (default task-62) The last packet successfully received from the server was 8,569 milliseconds ago. The last packet sent successfully to the server was 16 milliseconds ago.
INFO [stdout] (default task-62) Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
INFO [stdout] (default task-62) at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3004) ~[na:na]
INFO [stdout] (default task-62) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3462) ~[na:na]
INFO [stdout] (default task-62) ... 222 common frames omitted

タイムアウト8時間問題ではない

ググってよく出てくるのがMySQLのタイムアウトが8時間うんたら…
ただ、一旦接続が切れるとコレが出続けてアプリサーバーの再起動を余儀なくされます。。これは良くない。
特に不安定な無線接続下などでは一旦接続が切れることもあるので
出る確率は高く、結構苦しい。

yyhayashi303.hatenablog.com

このサイトによると
・アプリケーションでコネクションを使用する前に有効性をテストする
・タイムアウトの設定値を増やす
・autoReconnect=trueの設定を追加する
の中から1の方法で解決すべきとあります。

今回はCommons DBCPでもSpringでもないので
Wildfly+MySQL的な解決方法で、standalone.xmlに

<datasource jndi-name…略>
<connection-url>略</connection-url>
<driver>mysql</driver>
<security>
<user-name>略</user-name>
<password>略</password>
</security>
<validation>
<check-valid-connection-sql>select 1</check-valid-connection-sql>
<validate-on-match>false</validate-on-match>
<background-validation>true</background-validation>
<background-validation-millis>10000</background-validation-millis>
</validation>
</datasource>

としたら再接続できるようになりました!!

参考

stackoverflow.com

stackoverflow.com

IPA-NW (情報処理技術者試験 ネットワークスペシャリスト)で散った

H28秋試験はNWを受験しました

社内でIPA試験受験の機運が高まっていたので勉強会の開催と
秋に優先して受けたい区分がなかったのでメンバーに合わせてNW受験を申し込みました。
元々ネットワーク関連の知識が弱かったので、みんなとの勉強を経て私も教わってあわよくば受かってしまおうという目論見もあり。
しかし甘かった。
午前・午後、各セクションについて、書いていきます。

午前Ⅱ対策の神bot登場

午前Ⅱは基礎知識を問う4択で、過去問をこなせば合格ラインは超えられるように設問が設計されています。
しかしただ暗記系するだけだとどうしても苦痛なんですよね。。

そこでスーパー後輩が神botをSlackに組み込んでくれました。

毎日9:00、13:00、18:00に午前Ⅱの過去問を1問出題して1問1答採点してくれます。
間違えるとみんなにバレるので割と真剣に取り組めますし
回答スピードを競ったりなど、楽しみつつ覚えられる要素がありました。

f:id:ryoichi0102:20161017223306j:plain

このおかげで午前Ⅱは楽勝に近い状態に!超感謝です。

高度系試験は午後からが本番

IPA-NWは、AP(応用)+SC(セキュリティ)だと言われることもありますが
元々Webセキュリティかじったぐらいの知識からのスタートだったので
戦える分野が狭く、午後での選択が結構限られてしまう所が弱点でした。


拡大表示はコチラ ⇒ IPA-NW 過去問

過去問を見て分かる通り出題範囲が広いです。
ざっくりまとめると、
TCP、OSI7階層、レイヤ2とレイヤ3をベースとして
★ FW, VRRP, VLAN, 無線LAN, DNS, メール, HTTP, 仮想
★★ プロキシ, 負荷分散(LB), VPN(SSL-VPN, IP-Sec)
PKI, QoS
とのことで。

このサイトが結構参考になりました。

nwsp30.blog.fc2.com

2016年はIPAからの標的型攻撃への注意喚起が本当に盛んだったこともあり
出るだろうなぁと思っていましたが、午後Ⅰで出きってしまい午後Ⅱが轟沈でした(笑)

H28 午後Ⅰ

問1: メール
問2: モバイルネットワーク・無線LANVPN
問3: メールサーバーと移行負荷分散

H28 午後Ⅱ

問1: VoIP・STUN・移行
問2: TCP/IPIPsecVPN

散った。。

IPsecが怪しかったので移行の方を選択しましたが、
振り返りの勉強会でも結構ボロボロでした。
合否を確認するまでもなく(ー人ー)

でも、NW受験を通して何を学んだか?

何かに立ち向かう姿は美しい…いやそういうことではなく

DNS関連の理解が深まりました。
Webサイト運営してる人なら必要なスキルだったのでこの機会に理解が深まったのでよかった。
また、メール関連についても、ちょうどその後使う機会があったので比較的苦労しないで済みました。
勉強してなかったら結構時間かかってたかも知れない…
独自ドメイン取ってのメール設定をAWSでやったんですが、こちらはまた別で書きます。

そういえば去年Oracle12cの時も

これは2015年に取得しましたが、その時のツラい努力と引き換えにDBA知識を蓄えましたが、ちょうどその後に、権限関連や(アーカイブ・)REDOログや表領域について職場で話題が出るなど、やってることがちょうどその後に活かされてくるような機会に今回も恵まれました。

実は元々周りにはそういう話はあって、自分のインプットありきで耳が立つようになったりするのか、それとも取り組みが周知されているからなのか、不思議ですがまぁでもとにかく今回もチャレンジした甲斐がありました。

来年合格予定

IPv4が枯渇したニュースが最近出ましたが
来年はIPv6移行とか出そうですね。

japan.zdnet.com

EclipseでBootstrapを使うときにLESSプラグインを使う

みんな大好きEclipse

EclipseでBootstrapなWebを編集することがあったのでGulp+Sassかと思ったらBootstrapはLESSだったのでプラグインを入れてみた。

前提や環境

・npm導入済
Eclipse Mars (多分ほかでも大丈夫)
Windows (特有の問題があり本文中に解決方法記載あり、Linux系は出ないハズ)

LESSインストール

> npm install less -g

プラグインインストール

ウィンドウ⇒設定
⇒インストール/更新 内の 使用可能なソフトウェア・サイト にて、
下記URLを追加します。
http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/
http://www.normalesup.org/~simonet/soft/ow/update/

ヘルプ⇒Eclipse マーケットプレイス を開き
xtextと検索して、Xtext 2.10.0 を、
LESSと検索して、Eclipse plugin for LESS 1.0.19 を入れます。
(バージョンは記載時点)

そのまま実行するとエラー (Windows)

やったー入ったーと思ってEclipse上でそのまま.lessファイルを右クリック⇒実行⇒LESS Compilerを選択すると

Cannot be launched because of an I/O exception
Cannot run program "lessc": CreateProcess error=2, 指定されたファイルが見つかりません。

が出ます。

lesscが実行できないのです。

調べてみるとlessインストール時に作成されるWindows用の
"C:\Users\ryoichi_obara\AppData\Roaming\npm\lessc.cmd"
Eclipse LESS Compilerからは参照できていない模様。

ということで、実行の構成をします。
Eclipseメニュー⇒実行⇒実行構成をクリック。

f:id:ryoichi0102:20161114182959j:plain

ここでLESS command: の所に上記cmdのパスを設定してあげます。
ついでにVerbose messagesやStrict importsも必要に応じてチェック。
そして、Use this launch configuration as defaultをチェックして
適用をクリックします。
また、ここで適用して実行しても引数が渡されてなくエラーなので、ここではそのまま閉じます。

f:id:ryoichi0102:20161114190039j:plain

これでless.cmdは呼び出せるようにはなるので、今度こそ
*.lessを右クリック⇒実行⇒LESS Compilerをクリックすると…

Unable to interpret argument O0 - if it is a plugin (less-plugin-O0), make sure that it is installed under or at the same level as less
A failure occurred when running the LESS compiler, see above error message.

というエラーが出ます。

f:id:ryoichi0102:20161114190634j:plain

"C:\Users\ryoichi_obara\AppData\Roaming\npm\node_modules\less\bin\lessc"
の102行目あたりにswitch文があるので、これを

switch (arg) {
    case 'O0':
    case 'O1':
    case 'O2':
        break;
    case 'v':
    ・
    ・

となるようにcaseを追加します。

これで、晴れてコンソールに
Compilation successful.
が出て成功です。

参考

github.com

stackoverflow.com

qiita.com