Quantcast
Channel: そごうソフトウェア研究所
Viewing all 108 articles
Browse latest View live

GitHubメモ

$
0
0

会社でやっているプロジェクトは複数の会社で構成されることが多く、GitHubを使ってます。 まだそれほど大規模な使い方では無いのでPrivate Projectで運用しています。

Issue管理や、Wikiも使用してコミュニケーションしています。 設計書はお客さんに提出する関係で、Officeで作っているけどこれもWikiに移行していけたらいいな、と思ってますが表や、図の書きやすさはまだまだMS Officeの方が良い。

Wikiにはプロジェクトに入ったら知っておいて欲しいルールや、環境の情報、Tipsなんかを書いていっています。

このエントリでは、GitHubを使う時のメモを書いていっています。

Step 1. リポジトリのクローン

GitHub上のプロジェクトをローカルに取得する

$ git clone https://github.com/AAA/BBB.git BBB/

URLの部分はGitHubリポジトリ画面の右下から持ってくることができます。 f:id:begirama:20140214164753p:plain

Step 2. ファイルの追加

$ vi test.txt  
$ ls  
README.md   test.txt  
$ git add test.txt   

Step 3. ローカルへのコミット

$ git commit -m "テスト用のファイルを追加"  
[master 2588d93] テスト用のファイルを追加  
 1 file changed, 1 insertion(+)  
 create mode 100644 test.txt  

Step 4. GitHubへのPush

$ git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 369 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/AAA/BBB.git
   1e9e805..2588d93  master -> master

これで、GitHub上に先ほどのファイルが更新される。

f:id:begirama:20140215110747p:plain

push.defaultが定義されていないという警告がでたので、設定する。

git config --global push.default simple


WebLogic Server 12c上でHibernateを使う

$
0
0

WebLogicHibernateを使った時にはまったことをメモしておきます。

利用している環境はWebLogic Server 12c。

発生したエラーはClassNotFound。 org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [from 自分で作ったクラス]

解決方法はデプロイしようとしているのがwarファイルだったので、weblogic.xmlを開いてWEB-INF/lib以下を優先するように設定。

1.WEB-INF/lib以下全部を優先する場合

<weblogic-web-app>
(略)
  <container-descriptor>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
  </container-descriptor>
(略)
</weblogic-web-app>

2.特定のjarのみWEB-INF/lib以下を優先する場合 今回使っているのはantlr-2.7.6.jarでした。

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app>
(略)
    <container-descriptor>
        <prefer-web-inf-classes>false</prefer-web-inf-classes>
        <prefer-application-packages>
            <package-name>antlr.*</package-name>
        </prefer-application-packages>
    </container-descriptor>
(略)
</weblogic-web-app>

なるべくJava EEの標準ライブラリでやった方がこの手の問題は絶対楽だな。

参考サイト

https://blogs.oracle.com/WebLogicServer/entry/resolving_conflicts_with_classloadershttp://stackoverflow.com/questions/2702266/classnotfoundexception-hqltoken-when-running-in-weblogichttp://docs.oracle.com/cd/E24329_01/web.1211/e24368/classloading.htm#i1098467Log4jantlrWebLogicのマニュアルのサンプルに載るくらい皆はまってるってことだな。

SQL DeveloperからSQL Serverにつなぐ

$
0
0

SQL DeveloperはOracleが出しているDatabaseを操作するためのGUIのクライアントツールです。Oracle SQL Developerから入手できます。

接続先のデータベースがOracle DBの場合はそのまま使えるけど、それ以外で最初は新規の接続を選択しても、Oracleというタブしかないので準備が必要です。 MicrosoftSQL Serverに接続する手順を書きます。

ドライバーの設定

Microsoftのドライバを使うのでは無くて、オープンソースjTDSを使うみたいです。

動作確認はjtds-1.3.1-dist.zipを使っています。

Zipを解凍した後、SQL DeveloperのPreferenceからjtds-1.3.1.jarのパスを設定します。

f:id:begirama:20140405074850p:plain

接続設定

ドライバを入れる前までは無かったSQL Serverタブが表示されます。

f:id:begirama:20140405072632p:plain

上手く接続できれば、GUIでがんがん操作できるので便利です。

f:id:begirama:20140405074445p:plain

参照資料

http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/thirdparty-095608.htmlその他のデータベースに接続するために必要なドライバに付いても書かれています。

iTextについてちょっと調べて見た

$
0
0

Javaのサーバーサイドで簡単な帳票を作成したいのだけれど、専用の製品を導入する程でもない。 ということで、手軽にPDFを作成できるライブラリを調査しました。

ネット上に情報が多そうなのはiText(http://itextpdf.com/)でした。

ライセンスについてのQiitaの記事が分かりやすかったです。 http://qiita.com/takudo/items/e2b37b659c9143db730c

CSSで改行の指定(page-break)もあるようなので、更にライトにやるなら、こっちかなぁ。 http://www.htmq.com/style/page-break-before.shtml

WebLogic 12c セットアップ手順メモ

$
0
0

準備

yum install ld-linux.so.2

プロダクトのインストール(コンソールモード)

http://docs.oracle.com/cd/E28613_01/doc.1211/b65933/console.htm

 chmod +x wls1211_linux32.bin 
 wls1211_linux32.bin -mode=console

ドメインの作成(コンソールモード)

http://docs.oracle.com/cd/E28613_01/web.1211/b65940/console_mode.htm

これをやってないとドメインの作成が終わらなかった。失敗したらdomains以下のファイルを削除して、再作成でOK。

export CONFIG_JVM_ARGS=-Djava.security.egd=file:/dev/./urandom

コンソールモードで起動

config.sh -mode=console

ドメイン作成後の準備

/Oracle/Middleware/wlserver_12.1/common/bin/config.sh

boot.propertiesの作成

これを作成しないと、起動時にユーザーとパスワードを聞かれる

{WLS}/user_projects/domains/mydomain/servers/myserver/security/boot.properties

いつも間違ってdomainの直ぐ下のsecurityフォルダにboot.propertiesファイルを置いて、起動しねぇ!となる。

12.1.1は必須のパッチがありそう。 http://www.davidghedini.com/pg/entry/oracle_web_logic"Before investing any time in this, despite a fresh download you will need,.... a patch: (p13606167_12110_Generic.zip). "

あと、JDKのバージョンが6系だと設定の保存で失敗することがあった。7系にあげることで解消。

欲しいClassがどのjarファイルに入っているか探す

$
0
0

Enterprise Javaをやっていると必ずはまるJar地獄。 自分が使っているライブラリを、アプリケーションサーバーや、3rdパーティーのライブラリが使っていて、ClassNotFoundや、そんなメソッドないとか、そのメソッドはPublicじゃないとか訳分かんなくなるやつ。

そんな時はエラーになっているClassがクラスパスのどこにあるか探して、複数ある場合はどっちを使うべきかを設定してやればいいし、無ければクラスパスに追加してやればOK。

Classがどのjarに含まれているか調べないといけないけど、Googleで調べても有名で皆がはまったことのあるやつしか出てこない。ですので、作りました。5年くらい前に。最近もこれに助けられた。

サーバサイドJavaのトラブル分析(APサーバースローダウン)

$
0
0

ここ1ヶ月くらいサーバーサイドのトラブル解決をよくやっていて、Javaのサーバーアプリのトラブルの分析のやり方を書いていきます。

先日発生したのはAPサーバーのスローダウンでした。ここでの原因は特殊なものだと思うので、その理由よりは分析のプロセスの方が大事かなと思っています。

チェックした内容

  • OSリソースの使用状況

sarを見ると該当の時間でuserのCPU使用率が90%を超えていました。 ioなどに問題はないので、アプリ層に問題がありそうです。

FullGCが頻発していれば、CPUを使い切っていてスローダウンが発生するが、GCは大したことなかった。

  • topコマンドでプロセスごとのCPU使用量確認

APサーバー(WebLogic Server)のJavaプロセスが使っていることを確認。 でもどのサーバーアプリかは分からない。

  • アプリログ

特にエラーはない。ただし、処理開始・終了のログから処理速度が遅いことは確認

該当の時間にBroken pipeのエラーログが大量にでていた。

Caused By: javax.xml.stream.XMLStreamException: java.net.SocketException: Broken pipe

ただし、Broken pipeが発生するのはネットワークが正常のステップで切断されていない場合(例えば、通信経路にあるFirewallがタイムアウトで接続を切っていたり、クライアントアプリがタイムアウトで接続を閉じた場合など)なので本当の理由は別にあるはずです。

エラーの原因

WebLogic Serverのログをさらにさかのぼって確認すると次のようなログがでていました。

Error Log in case of JDBC Trace Log (MS SQL Server ...

「[STUCK] ExecuteThread: '11' for queue: 'weblogic.kernel.Default (self-tuning)'は"600"秒間ビジー状態になっています。これは、構成された時間(StuckThreadMaxTime)"600"秒を超えています。」というのはWebLogic Serverがあるスレッドが設定された時間(デフォルト600秒)の間、処理がスタックしていればスタック状態と見なすという挙動です。 スタック状態と見なした後は設定に依ってWebLogic Serverを再起動したりをすることができます。

スタックトレースを見ると「com.microsoft.sqlserver.jdbc.SQLServerResultSet」が「java.util.logging.Logger」を使っているところばかりです。 実はWebLogic Server、SQL Server間でエラーが以前発生していたので分析のためのJDBC Traceログを仕掛けていたのですが、その設定が中途半端に残っていました。実際のログは出力されていないが、出力するための設定ファイルを毎回見に行くという状態になっていました。

そのため、io負荷が異常に高ければ、ログ出力を疑ったと思うのですが、実際はioは問題になっておらず、CPUを使い切っているという症状となっていました。

重要なこと

分析に必要な情報がでていること

問題の再現手順が分からないことや、本番環境でしか発生しないなど発生させるのが難しい場合があります。 予め問題の分析に必要な情報が収集されていることが重要です。 設定面で言えば、GCログが出力されるようにセットしていることや、OSやミドルウェアのリソース使用状況が記録されている必要があります。

アプリケーションの設計では、適切なログが出力されるようになっていることも重要です。 エラーのスタックトレースが出力されていて、エラーの箇所が特定できること。 スローダウンが発生している際に、全ての処理が遅いのか、特定のAPIのみかなどが分かること。(そもそもサーバー側の処理時間が分かること)

根気よく効率良く情報を読むこと

まず問題を報告してくれた人に正確な情報を聞くこと。 問題が発生した日時、問題が発生する条件・手順。 後でログを詳しく見る際に、問題が発生した日時が分からないと作業量が膨大です。

自分はまず、関連するログをgrepで「FATAL」、「ERROR」、「Exception」などでざっと検索をかけます。 (プロジェクト終盤のテストのフェーズであれば、エラーの報告の有無に関わらず、毎日ログを検索して想定外のエラーが発生していないか確認します。本来、監視の対象にならないようなログがログレベルを間違って出力されているのもここで確認できます)

それで該当の時間帯にエラーのログが出力されていれば、そこから始めます。 ポイントとして、その後のログを見ていくのでは無く、時系列をさかのぼってログを見ていきます。 もっと前の時間に同じ、または別のエラーが発生していないかを確認します。 これはユーザーに見えているエラーの原因となるエラーがもっと前に発生していることがあるからです。

この例の場合、ユーザーから報告のあった時間にはBroken pipeのエラーがありますが、 もっと前のログを見ると、java.util.Logginのエラーがでています。

今回は問題になっていませんでしたが、作っているアプリの中に問題があった場合はGCログや、スレッドダンプの中身を詳細に見ていく必要があるので、適切なViewerやWebLogic Serverの場合、JRockit Mission Controlなどのツールを使えるようにしておきたいところです。

JBoss ASのデプロイプロセスを眺めた

$
0
0

WebLogic Serverの会社にいたので、JBossは全然触ったことがなかったのですが、最近、使ってます。今日は、デプロイのプロセスを眺めていたので、メモしておきます。

デプロイ

デプロイはこのパスにwarファイルなどを置くことで簡単にできます。 {JBOSS_HOME}/standalone/deployments/

その時、置いたwarファイルに対して、isdeployingというファイルができる。

AppPot_1.1.4_3_jboss.war
AppPot_1.1.4_3_jboss.war.isdeploying

しばらくまってると、deployedファイルになり、デプロイ完了。ファイル名で分かるというのはシンプルで面白いやり方ですね。

AppPot_1.1.4_3_jboss.war
AppPot_1.1.4_3_jboss.war.deployed 

アンデプロイ

アンデプロイするときは、deployedファイルをundeployという名前に変えるだけ。 $ mv AppPot_1.1.4_2_jboss.war.deployed AppPot_1.1.4_2_jboss.war.undeploy

そうすると、undeployに加えて、undeployedファイルができて、実際にWebアプリのURLにアクセスしてみると404エラーが返ってくる

-rw-r--r--  1 ncdc        ncdc        13887481  6月  5 08:54 2014 AppPot_1.1.4_2_jboss.war
-rw-rw-r--  1 jboss       jboss             24  6月  5 08:54 2014 AppPot_1.1.4_2_jboss.war.undeploy
-rw-rw-r--  1 jboss       jboss             24  6月  5 10:08 2014 AppPot_1.1.4_2_jboss.war.undeployed

ITmediaのセミナーでの成田空港さんの事例

$
0
0

ITmediaさんのセミナーで、企業でのモバイルアプリの取り組みの事例などをお話しさせてもらいました。

そちらの内容は、別途、公開しますが、今日は同じセミナーで成田空港さんが事例を紹介されていましたので、Twitterの内容からまとめます。

元々はカウンターではNotesを使ってご案内ができていたが、後述の巡回案内ではNotesにアクセスできないという情報の差が課題だったそうです。Notesをモバイルで持ち出すというのは面白いですね。需要ありそう。

これは、いつもモバイルならではの使い易いUIにしましょうと、提案することが多いので、そうなんだ!と思いました。

これ、理想。

これは自分のセミナーでも同じメッセージです。 小さく、素早く始めて、利用状況を見ながら、改善していく。

iBeacon面白そうですね!

Mule 3.5のセットアップとサンプルの実行

$
0
0

会社の方で公式ドキュメントして書くのだけど、ひとまずこちらに書いてみます。

目標は、取りあえずインストールして、実行してみるところまで。

インストール

使用可能な環境はここでチェック。OSはMuleがサポートしているJDKがサポートしていればOKっぽい。

http://www.mulesoft.org/documentation/display/current/Hardware+and+Software+Requirements

どんな構成にするか

デプロイモードを選択する。

http://www.mulesoft.org/documentation/display/current/Deployment+Scenarios

ここでいうデプロイメントとは、Mule自体の配置のこと。Mule上で動作するモジュールのデプロイメントではない。

MuleはAPサーバー上でも動かすことができるけど、基本はスタンドアローンでOK。

Mule Management Consoleって使うの?

http://www.mulesoft.org/documentation/display/current/Mule+Management+Console

いろいろな管理機能が提供される。Enterprise Editionが必要。

インストールの手順はこれの「Mule Community Runtime」のタブに従ってやればOK。基本、スタンドアローン構成ならZipを解凍するだけ。

http://www.mulesoft.org/documentation/display/current/Downloading+and+Launching+Mule+ESB+-+hid

  1. Javaセットアップ Javaをセットアップして、JAVA_HOME設定

export JAVA_HOME=/usr/java/jdk1.7.0_60/

  1. Muleセットアップ 解凍するだけ。まじ簡単。

bin/muleを実行で起動。終了するときはCtlr+C。

起動停止

$MULE_HOME\bin\mule.bat start|stop

起動オプションなんかは下記にまとまっている。

http://www.mulesoft.org/documentation/display/current/Starting+and+Stopping+Mule+ESB

自分で作ったモジュールを動かしてみよう

Anypont Studioを入れるとSampleが一緒に付いてくるから、それを実行してみましょう。

f:id:begirama:20140627084110p:plain

スタートページのOpen Sampleでサンプルの一覧が見られる。

f:id:begirama:20140627084119p:plain

まあ、最初はHelloWorldだろうと。

f:id:begirama:20140627084123p:plain

フロー定義の見た目はこんな感じ。 HTTPでリッスンして、文字列を返すだけのフロー。

取りあえず試すだけなら、Anypont Studioの中に埋め込みMuleが入っているのでプロジェクトを右クリックして、「Run AS->Mule Application」でOK。

サーバー上のMuleへのデプロイは上記のURLの「Deploy on a Mule Enterprise Server」の通りにやればOK。

Anypont StudioでExportする

f:id:begirama:20140627084441p:plain

f:id:begirama:20140627084448p:plain

f:id:begirama:20140627084455p:plain

Muleへのデプロイ

Mule HOMEのappsフォルダにzipを置くだけ。 Muleがポーリングをしていて、しばらくするとzipが解凍されます。

[sogo@localhost mule-standalone-3.5.0]$ cd apps/
[sogo@localhost apps]$ ls
default  default-anchor.txt

appsフォルダにエクスポートしたhello-world.zipを置くと・・・・

[sogo@localhost apps]$ cp ~/hello-world.zip .
[sogo@localhost apps]$ ls
default  default-anchor.txt  hello-world.zip

しばらくするとzipが展開されてデプロイされている。

[sogo@localhost apps]$ ls
default  default-anchor.txt  hello-world  hello-world-anchor.txt

Muleのデプロイログ

同じタイミングでMule側のログには、サンプルアプリが置かれたことを検知して、インストールして起動した旨のログがでます。

INFO  2014-06-26 21:26:12,950 [Mule.app.deployer.monitor.1.thread.1] org.mule.module.launcher.ArtifactArchiveInstaller: Exploding a Mule artifact archive: file:/home/sogo/mule/mule-standalone-3.5.0/apps/hello-world.zip
INFO  2014-06-26 21:26:13,008 [Mule.app.deployer.monitor.1.thread.1] org.mule.module.launcher.application.DefaultMuleApplication: 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ New app 'hello-world'                                    +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INFO  2014-06-26 21:26:13,009 [Mule.app.deployer.monitor.1.thread.1] org.mule.module.launcher.log4j.ArtifactAwareRepositorySelector: Found logging config for application 'hello-world' at 'file:/home/sogo/mule/mule-standalone-3.5.0/conf/log4j.properties'
INFO  2014-06-26 21:26:15,796 [Mule.app.deployer.monitor.1.thread.1] org.mule.module.launcher.MuleDeploymentService: 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Started app 'hello-world'                                +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

いやー簡単ですね。

Mac OSXへのGradleのセットアップ

$
0
0

完全にメモです。

Android Annotationsが使いたかっただけなんだけど、ついでにいろいろ整備する。

Android Annotationsを使うためにGradleを入れたい。GradleをセットアップするためにHomebrewを入れたい。Homebrewは前から気になってたけど、入れてなかったのでついでに入れる。

こちらを参考にさせてていただきつつ、セットアップ。 eclipseでgradleを使うための環境構築 - mi_kami's diary

Rubyが必要らしい。入ってる。

sogo$ ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin13]

公式サイトによると、これで一発で入れられるみたい。パスワードを途中で1回入れるだけでセットアップ完了。

    sogo$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    sogo$ brew -v
    Homebrew 0.9.5

このままGradleをインストール

    sogo$ brew install gradle

    ・・・・

    ==> Downloading https://downloads.gradle.org/distributions/gradle-2.1-bin.zip
    ######################################################################## 100.0%
    🍺  /usr/local/Cellar/gradle/2.1: 149 files, 44M, built in 36 seconds

セットアップ完了。

sogo$ /usr/local/Cellar/gradle/2.1/bin/gradle -v

------------------------------------------------------------
Gradle 2.1
------------------------------------------------------------

Build time:   2014-09-08 10:40:39 UTC
Build number: none
Revision:     e6cf70745ac11fa943e19294d19a2c527a669a53

Groovy:       2.3.6
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0 (Oracle Corporation 25.0-b70)
OS:           Mac OS X 10.9.5 x86_64

Mac OSXでDocker(インストール編)

$
0
0

公式サイト

Mac OS X - Docker Documentation

インストール

ダウンロードしたBoot2Docker-1.4.1.pkgを開くと、2ステップでboot2dockerツールのインストールは完了します。

f:id:begirama:20141222082724p:plain

f:id:begirama:20141222082730p:plain

ここまで5分。後は環境設定などをやっていきます。

初期化

boot2docker initで初期化を行います。公開鍵方式の鍵ペアを作成されました。

rsogo$ boot2docker init
Latest release for boot2docker/boot2docker is v1.4.1
Downloading boot2docker ISO image...
Success: downloaded     https://github.com/boot2docker/boot2docker/releases/download/v1.4.1/boot2docker.iso
to /Users/rsogo/.boot2docker/boot2docker.iso
Generating public/private rsa key pair.
Your identification has been saved in /Users/rsogo/.ssh/id_boot2docker.
Your public key has been saved in /Users/rsogo/.ssh/id_boot2docker.pub.

起動

Docker daemonを起動します。

rsogo$ boot2docker start
Waiting for VM and Docker daemon to start...
........................ooooooooooooooooooo
Started.
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/key.pem

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.103:2376
    export DOCKER_CERT_PATH=/Users/rsogo/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1

環境変数等の設定

$(boot2docker shellinit)を($や()もそのまま)実行して、環境変数などをセットします。環境変数を直接.bashrcなどに書くのではなく、このコマンドが実行されるように設定するのが推奨されています。

rsogo$ $(boot2docker shellinit)
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/rsogo/.boot2docker/certs/boot2docker-vm/key.pem

サンプルの実行

ここまでで準備はできたみたいなので、hello-worldというサンプルがあるのでそれを実行してみます。

rsogo$ docker run hello-world
Unable to find image 'hello-world:latest' locally
hello-world:latest: The image you are pulling has been verified
511136ea3c5a: Pull complete 
7fa0dcdc88de: Pull complete 
ef872312fe1b: Pull complete 
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (Assuming it was not already locally available.)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

For more examples and ideas, visit:
 http://docs.docker.com/userguide/

出力された内容を見ると、ローカルにないから、hello-worldのイメージをDocker Hubからダウンロードしています。 その後、"Hello from Docker"という文字列が表示されました。

このエラーが出るときは環境変数の初期化ができていない

rsogo$ docker run hello-world
FATA[0000] Post http:///var/run/docker.sock/v1.16/containers/create: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS? 

DockerでコンテナにJavaを入れるまで

$
0
0

年末にDockerを入れて、サンプルを実行してみました。

Mac OSXでDocker(インストール編) - そごうソフトウェア研究所

冬休み中に試験環境をDockerで準備することが目標です。

dotinstallを見ながら色々遊んでいましたが、実際の試験環境の構築を始めようと思います。今日はCentOS上にJava環境を構築します。

docker pullでCentOSのイメージを取得

rsogo$ docker pull centos
centos:latest: The image you are pulling has been verified
5b12ef8fd570: Pull complete 
34943839435d: Pull complete 
511136ea3c5a: Already exists 
Status: Downloaded newer image for centos:latest

イメージの確認

rsogo$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
rsogo/sshd           latest              296067ca835f        6 minutes ago       625.8 MB
centos               6                   510cf09a7986        5 days ago          202.6 MB
centos               latest              8efe422e6104        5 days ago          210 MB
rsogo/jboss          latest              67acbf60269a        8 days ago          855.2 MB

この記事では、centosのlatestを使用しているけれど、現時点で最新はCentOS 7で、テスト環境としては6が欲しかったので、実際のテスト環境はcentos:6でやっている。

Dockerfileの作成

何度でも同じイメージが作成できるように環境の準備はDockerfileで行います。

FROM centos
MAINTAINER Ryohei Sogo

# ビルド時に実行
RUN yum install -y java-1.7.0-openjdk
RUN yum install -y java-1.7.0-openjdk-devel

# 起動時に実行
CMD ["java", "-version"]

このDockerfileは次の内容を書いています。

  • centosイメージを基に作成する
  • ビルド時にjava-1.7.0-openjdkと、 java-1.7.0-openjdk-develをyumコマンドでインストールするよう
  • 実行時にはjava -versionでインストールされたjavaのバージョンを出力する

ビルドの実行

docker buildコマンドでビルドを行います。 ここではrsogo/javaというタグ名を付けています。

rsogo$ docker build -t rsogo/java .
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM centos
 ---> 34943839435d
Step 1 : MAINTAINER Ryohei Sogo
 ---> Using cache
 ---> fa1f439f448f
Step 2 : RUN yum install -y java-1.7.0-openjdk
 ---> Using cache
 ---> 3841ca600101
Step 3 : RUN yum install -y java-1.7.0-openjdk-devel
 ---> Using cache
 ---> bd0a1d4c9937
Step 4 : CMD java -version
 ---> Using cache
 ---> 3adf3b598444
Successfully built 3adf3b598444

このログを取る前に何度かビルドを行っているので、Using cacheと出力されているとおり、Docker内のキャッシュを使ってビルドを行っているようです。 初回は関連パッケージの取得とインストールが行われていました。

実行

docker runコマンドで実行します。

rsogo$ docker run rsogo/java
java version "1.7.0_71"
OpenJDK Runtime Environment (rhel-2.5.3.1.el7_0-x86_64 u71-b14)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)

DockerfileのCMDで記載したとおり、java -versionが実行され、インストールが成功していることが確認できます。

ps -lで確認すると、実行が終わったプロセスは終了状態になっています。

rsogo$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
980ab9c8b558        rsogo/java:latest   "java -version"     18 minutes ago      Exited (0) 18 minutes ago                       naughty_elion       

次はJBossをインストールします。 WebLogicyumでインストールできればいいのに。。。

OSXのboot2dockerでのIPアドレス確認ではまった

$
0
0

AnsibleからからDocker上のコンテナにsshでアクセスしたいだけなのにえらい時間がかかった。 結論から言うと'boot2docker ip'でOK。

  • 使用例

      $ boot2docker ip
      192.168.59.103
    

はまった経緯は、いろんなDockerのネットワーク周りのブログを見るとdocker0というネットワークインターフェイスができるよ、と書いてあるがifconfigしてもでてこない。

docker inspectでコンテナの情報が表示され、その中のIPアドレスでアクセスできるんだろうと思っていたけど、できない。

 docker inspect --format ' {{ .NetworkSettings.IPAddress }} ' test01
172.17.0.71

$ telnet 172.17.0.71 22
Trying 172.17.0.71...
telnet: connect to address 172.17.0.71: Operation timed out
telnet: Unable to connect to remote host

'boot2docker ip'を使ってみる。

$ boot2docker ip
192.168.59.103

$ telnet 192.168.59.103 22
Trying 192.168.59.103...
Connected to 192.168.59.103.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.0
^C

OK。ちなみにこのIPアドレスの特定の仕方は下記のOSX用のインストールのマニュアルに記載されていた。ブログ等を見るのも良いけど、トラブった時は一次情報を参照せよという良い例。

https://docs.docker.com/installation/mac/

Android Studioへの自作ライブラリプロジェクトの取込

$
0
0

まだそれほどAndroid Studioを触ったわけではないですが、社内のAndroidプロジェクトを順次、ADTからAndroid Studioに移行しています。

今回は社内のAndroidライブラリのプロジェクトを他のプロジェクトから使うまでの手順です。もちろんライブラリ側のプロジェクトをjar化して、使用するのもありますが、プロジェクトを参照する形で今回はやっています。

新規プロジェクトの作成

ライブラリを使う側のプロジェクトを新規作成します。

モジュールのインポート

メニューの「New>Module」を選択します。 f:id:begirama:20150727160851p:plain「Import Gradle Project」を選択します。

setting.gradleファイルに以下の記述が追加されます。

include ':app', ':AppPotSDK'

ここではappが利用側プロジェクト、AppPotSDKがライブラリプロジェクトです。

build.gradleへの依存性の設定

利用側プロジェクトのbuild.gradleファイルに下記の記述を追記します。AppPotSDKは先ほどのImportしたライブラリプロジェクトです。 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.1.1' compile project(":AppPotSDK") }

以上


Jenkins導入メモ

Mule ESB 3.7起動

$
0
0

以前、OSX上でMule 3.6を動かしました。

Mule ESB 3.6起動 - そごうソフトウェア研究所

Mule 3.7がリリースされているので、そちらを試してみたいと思います。

Mule 3.7のダウンロード

以前のエントリでは、Enterprise版のダウンロードページにしか行けずに、そちらで検証していました。 Enterprise版ではトライアル期間が終わると次のようなエラーが出て、起動できなくなります。

ERROR 2015-08-04 16:22:59,527 [main] com.mulesource.licm.impl.TrueLicenseHelper: Couldn't validate license key!
Invalid license

Community Editionのダウンロードはこちらで行けそう。

Download Mule ESB Runtimedeveloper.mulesoft.com

Muleの起動

ダウンロードしたファイルを解凍。

$ unzip mule-standalone-3.7.0.zip

実行ファイルがあるところまで移動して、

$ cd mule-standalone-3.7.0/bin/
$ ls
additional.groovy   launcher.bat        mule
launcher        launcher.conf       mule.bat

muleコマンドを実行

$ ./mule 

起動ログ

$ ./mule 
MULE_HOME is set to /Users/rsogo/work/mule-standalone-3.7.0
Running in console (foreground) mode by default, use Ctrl-C to exit...
MULE_HOME is set to /Users/rsogo/work/mule-standalone-3.7.0
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Running Mule...
--> Wrapper Started as Console
Launching a JVM...
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Starting the Mule Container...
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
  Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.


WARNING - Unable to load the Wrapper's native library because none of the
          following files:
            libwrapper-macosx-x86-64.dylib
            libwrapper-macosx-universal-64.dylib
            libwrapper.dylib
          could be located on the following java.library.path:
            /Users/rsogo/work/mule-standalone-3.7.0/bin/%LD_LIBRARY_PATH%
            /Users/rsogo/work/mule-standalone-3.7.0/lib/boot
          Please see the documentation for the wrapper.java.library.path
          configuration property.
          System signals will not be handled correctly.

INFO  2015-08-04 16:46:04,937 [WrapperListener_start_runner] org.mule.module.launcher.MuleContainer: 
**********************************************************************
* Mule ESB and Integration Platform                                  *
* Version: 3.7.0 Build: 725cbc8a                                     *
* MuleSoft, Inc.                                                     *
* For more information go to http://www.mulesoft.org                 *
*                                                                    *
* Server started: 15/08/04 16:46                                     *
* JDK: 1.7.0_71 (mixed mode)                                         *
* OS: Mac OS X (10.10.4, x86_64)                                     *
* Host: Ryohei-no-MacBook-Pro.local (192.168.11.5)                   *
**********************************************************************
INFO  2015-08-04 16:46:04,941 [WrapperListener_start_runner] org.mule.module.launcher.coreextension.DefaultMuleCoreExtensionManager: Initializing core extensions
INFO  2015-08-04 16:46:04,941 [WrapperListener_start_runner] org.mule.module.launcher.coreextension.DefaultMuleCoreExtensionManager: Starting core extensions
INFO  2015-08-04 16:46:04,955 [WrapperListener_start_runner] org.mule.module.launcher.DefaultArchiveDeployer: ================== New Exploded Artifact: default
INFO  2015-08-04 16:46:04,963 [WrapperListener_start_runner] org.mule.module.launcher.MuleSharedDomainClassLoader: Using domain dir /Users/rsogo/work/mule-standalone-3.7.0/domains/default for domain default
INFO  2015-08-04 16:46:05,013 [WrapperListener_start_runner] org.mule.module.launcher.MuleDeploymentService: 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Started domain 'default'                                 +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INFO  2015-08-04 16:46:05,020 [WrapperListener_start_runner] org.mule.module.launcher.DefaultArchiveDeployer: ================== New Exploded Artifact: default
INFO  2015-08-04 16:46:05,044 [WrapperListener_start_runner] org.mule.module.launcher.application.DefaultMuleApplication: 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ New app 'default'                                        +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INFO  2015-08-04 16:46:09,459 [WrapperListener_start_runner] org.mule.module.launcher.MuleDeploymentService: 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Started app 'default'                                    +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INFO  2015-08-04 16:46:09,462 [WrapperListener_start_runner] org.mule.module.launcher.DeploymentDirectoryWatcher: 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Mule is up and kicking (every 5000ms)                    +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INFO  2015-08-04 16:46:09,533 [WrapperListener_start_runner] org.mule.module.launcher.StartupSummaryDeploymentListener: 
**********************************************************************
*              - - + DOMAIN + - -               * - - + STATUS + - - *
**********************************************************************
* default                                       * DEPLOYED           *
**********************************************************************

*******************************************************************************************************
*            - - + APPLICATION + - -            *       - - + DOMAIN + - -       * - - + STATUS + - - *
*******************************************************************************************************
* default                                       * default                        * DEPLOYED           *
*******************************************************************************************************

Mule 3.7のDatabase Connectorを試す1(設定とSELECT)

$
0
0

デプロイ

mule-config.xmlをappsの下に作ったdatabaseフォルダに置きます。

$ pwd
/Users/rsogo/work/mule-standalone-3.7.0/apps/database
$ ls
mule-config.xml

gist.github.com

デプロイ時ログ

おぉ、成功。

*******************************************************************************************************
*            - - + APPLICATION + - -            *       - - + DOMAIN + - -       * - - + STATUS + - - *
*******************************************************************************************************
* default                                       * default                        * DEPLOYED           *
* database                                      * default                        * DEPLOYED           *
*******************************************************************************************************

JDBC Driverの配置

  • Database Driverになにもやってない状態でhttp://localhost:8081/にアクセスすると次のようなエラーがでた。
org.mule.module.db.internal.domain.connection.ConnectionCreationException: java.sql.SQLException: Error trying to load driver: oracle.jdbc.Driver : oracle.jdbc.Driver (java.sql.SQLException). Message payload is of type: NullPayload

OracleからJDBC Driverをダウンロードする。

Oracle Database 12c Release 1 JDBC Driver Downloads

自分の環境はJDK1.7を使っているので、ojdbc7.jar

{MULE_HOME}/lib/user/配下に置く。

$ ls lib/user/
README.txt          mule-tests-functional-3.7.0.jar xmlunit-1.5.jar
junit-4.11.jar          ojdbc7.jar

StackOverflowかどこかに{MULE_HOME}/lib/mule/に置けって言っている人がいるけど、それだと動かなかった。

  • DriverはOKで、コネクションが確立できない場合のログ。
org.mule.module.db.internal.domain.connection.ConnectionCreationException: java.sql.SQLException: Cannot get connection for URL jdbc:oracle:thin:{User}/{Password}@localhost:{SID} : No suitable driver found for jdbc:oracle:thin:{User}/{Password}@localhost:{SID} (java.sql.SQLException). Message payload is of type: NullPayload

実行

Muleを実行しているマシンのhttp://locahost:8081/にアクセスしてみる。 上手く行っていると、データベースに検索した結果がJSONに変換されたレスポンスが見られる。

Mule 3.7 メッセージ変換

$
0
0

使えるメッセージ変換の機能は下記のマニュアルを参照。

  • 用意されている変換機能

Objectと、JSONXMLの変換なんかは自動でやってくれる。 いざとなったらJavaやGroovyも呼び出せる。

Transformers - Current Mule Documentation

MEL (Mule Expression Language)

MELというXMLベースの独自言語が用意されていて、メッセージの要素にアクセスしたり、値を評価しての条件分岐とか書ける。

概要はこっちのマニュアルを読んで、

Mule Expression Language MEL - Current Mule Documentation

どんな機能が用意されているからは、こっちのリファレンスを見ればOK。 Mule Expression Language Reference - Current Mule Documentation

後はサンプルを見て、感じをつかむのが早い。

デプロイすると、No suitable driver foundが原因のjava.sql.SQLExceptionが発生する。 Muleを再起動すると解消する。DB接続が絡んでいない場合は、起動中のホットデプロイができているので、DB接続がらみで何かあるのかも知れない。要調査。

org.mule.module.db.internal.domain.connection.ConnectionCreationException: java.sql.SQLException: Cannot get connection for URL jdbc:oracle:thin:CMN/CMDB01@localhost:1521:aaa : No suitable driver found for jdbc:oracle:thin:aaa/aaa@localhost:1521:aaa (java.sql.SQLException). Message payload is of type: LinkedHashMap

Mule 3.7のDatabase Connectorを試す2(INSERT)

$
0
0

先日、Muleを使ってOracle Databaseにアクセスするための設定の記事を書きました。

Mule 3.7のDatabase Connectorを試す1(設定とSELECT) - そごうソフトウェア研究所begirama.hatenablog.com

今回は、JSONで受け取って、Oracle DBにInsertするまでを書きます。

まず、メインのmule-config.xml

gist.github.com

前回のSELECTだけやるフローを改良しています。

まず、HTTPメソッドに応じて動かすフローを分けています。

GETメソッドで動かすフロー

<flow name="GetFlow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="Recieve HTTP request" allowedMethods="GET"/>

中身は前回のフローとほぼ同様で、データベースに対してSELECT文を発行して、結果をJSONにして返します。

レスポンスのサンプルはこんな感じ。

[
  {
    "VALUE": "foo",
    "NAME": "SATO"
  },
  {
    "VALUE": "bar",
    "NAME": "SUZUKI"
  }
]

POSTメソッドで動かすフロー

<flow name="PostFlow" doc:name="PostFlow">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="Recieve HTTP request" allowedMethods="POST"/>

中身の処理は

デバッグ用にTransformerの前後でPayloadの中身をログにダンプ

<logger doc:name="Log the payload" level="INFO" message="About to echo #[message.payload]"/>

変換前後のログの出力結果はこんな感じ。

INFO  2015-08-06 08:51:47,892 [[database_update].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: About to echo org.glassfish.grizzly.utils.BufferInputStream@386d562
INFO  2015-08-06 08:51:47,973 [[database_update].HTTP_Listener_Configuration.worker.01] org.mule.api.processor.LoggerMessageProcessor: About to echo [{VALUE=foo, NAME=SATO}, {VALUE=bar, NAME=SUZUKI}]

JSONをObjectに変換

この時の変換先のクラスはjava.util.ArrayListということを指定しています。 今回は、この後でループ処理をやるためにArrayListに変換していますが、<byte-array-to-string-transformer doc:name="Convert Byte Array to String"/>とかで、一つのStringオブジェクトに変換してもOK。

<json:json-to-object-transformer returnClass="java.util.ArrayList" doc:name="JSON to Object"/>

INSERTの発行

リクエストに含まれる件数分ループで回しつつ、Insert文を発行。

<foreach collection="#[message.payload]" doc:name="For Each">
    <db:insert config-ref="Oracle_Configuration" doc:name="Database">
        <db:parameterized-query><![CDATA[INSERT INTO TEST(NAME, VALUE)
              VALUES (#[payload.NAME], #[payload.VALUE])]]></db:parameterized-query>
    </db:insert>
</foreach>

マニュアル

あんまり読んで無いけど、JDBC周りのリファレンス。

JDBC Transport Reference - Current Mule Documentation

HTTPリスナでリクエストを受け付けるところはこのマニュアルを読んでおけばOK。

HTTP Listener Connector - Current Mule Documentation

Payloadからの値の取り方について

あと、これも参考にした。

JSON Payload ingested into MySQL database using Mule ESB - Stack Overflow

Viewing all 108 articles
Browse latest View live