2019年12月12日

【WebSphere】JSPバッチコンパイル

おじさんが勉強した昔は、JSPは/temp にコンパイルされてた気がするんだが
9.0とかではデフォルトはWEB-INF/classesに出すようになってんだな。

https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_9.0.5/com.ibm.websphere.base.doc/ae/cweb_jspclassfiles.html

tempを探してWeb-infを探すわけやな。
ClassLoader分離上の都合とかそういう背景だろうか・・。うーん。バージョンいつからの仕様なんだろ。


https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_9.0.5/com.ibm.websphere.base.doc/ae/rweb_jspbchtl.html

compileToWebInfオプションがTrueの場合(デフォルトTrue)はWEB-INF側に出す、
falseやcompileToDirでtempを指定するとtempに出す、という仕組みのようですな。

tempの場所を変更するにはJSPエンジン設定のscratchdirですかなー。
https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_9.0.5/com.ibm.websphere.base.doc/ae/rweb_jspengine.html

システムプロパティ com.ibm.websphere.servlet.temp.dir より優先ってあるから
触るときは注意ですな。まぁ、こんなの触らないだろうけど・・。
posted by koteitan at 15:05| Comment(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2019年08月07日

[WebSphere]pluginをマージする方法

昔はこんなのなかった気がするが、時代かなー・・。

https://www.ibm.com/support/knowledgecenter/ja/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/twsv_configsimplelb.html

https://www.ibm.com/support/knowledgecenter/ja/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/twsv_merge_configfiles.html

v7の場合は、ちょっとコマンドが違います。
pLuginMerge.sh (bat) です。

もちろんviとかemacsとかpythonとかでちまちまやってもよいです。


posted by koteitan at 10:34| Comment(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2018年07月23日

[WebSphere]sys.exit()すると例外になる件

v9からjythonの仕様変更があって、それが原因のようだ。

https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_9.0.0/com.ibm.websphere.base.doc/ae/rxml_jython27.html#rxml_jython27__sec3


今北産業
sys.exit(0)

os._exit(0)

地味にめんどくさいなぁ・・。
posted by koteitan at 17:10| Comment(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2017年09月07日

V9でjythonが一気に2.7に!

今更遅いよ、って感はあるよね。(´・ω・`)
2.1から2.7まで一気に上げたみたいなので、
既存のscript、いろいろ問題でるでしょう。
予約語だって変わってるし。

マニュアル

リリース情報


ここから 備忘録 

pythonで予約語列挙するには

つ __import__('keyword').kwlist

pythonのバージョンを出力するには

つ sys.version

posted by koteitan at 18:24| Comment(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2017年03月10日

WebSphereでのJDK6/JDK7のサポートが終了

嘘のようなホントの話。猶予は2018/4/30までと2018/9/30だそうで。
アプリケーションの互換チェックとかリグレッションテストとか大変ですなぁ。

WAS V7/V8 サポート終了 およびWAS V8.5同梱のJava 6/7のサポート終了について

Java SE6のサポートが終了: 移行先は?


posted by koteitan at 16:44| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2017年02月01日

WebSphereプラグインログからIHSのPIDとTID

こんなものを見たい状況がイマイチよくわからないが、Pluginのログの書式は

日付 PID TID メッセージ

[18/Jan/2015:03:30:16.09247] 00eb00d4 00000306 - ERROR: ws_common: websphereHandleRequest: Failed to execute the transac

赤いところがPID(16進)、緑がTID(16進)ってことやね。

10進にしたけりゃ、 perl -lane 'print "@F[0]" , " " ,hex "@F[1]" ," ",hex "@F[2]"'とかでいいんでないか。
ラベル:WebSphere
posted by koteitan at 11:30| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2017年01月17日

IHSでSSLhandshake問題の調査方法

調査方法というより、トレースの取り方ですな。

トレースはIHS側のmod_sslのトレースと、
肝心の暗号処理を行っているgskitのトレースを取ることになります。
やり方は簡単で、ちょっと設定をいれて再起動するだけです。
めっちゃログがでるようになるので注意。

httpd.conf の LogLevelをdebugに
httpd.conf に SSLTraceを追加
export GSK_TRACE_FILE=/tmp/gsk_trace.log

IHS再起動で反映

終わったら、httpd.confを戻し、unset GSK_TRACE_FILE

もっと細かいオプション等はリンク先で。


ラベル:IHS ssl GSKit
posted by koteitan at 10:53| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2016年11月26日

[IHS]Etagについて

Etagは各コンテンツに対するハッシュ値みたいなもので、更新日付のみでの
(last-modified)のみでのキャッシュより精密な制御ができる。
古い日付のファイルで更新した場合、Etag無効なら更新が反映されずキャッシュがでてしまうというように。

無論経路上に存在するキャッシュ機器やブラウザが対応していないとダメ。
最近ならほとんど対応してるはず。

CVE-2003-1418なんて古−−−い脆弱性を調べてたときのメモである
Etagの値を求めるのに、inode番号を使ってたから、inodeが漏えいするってえやつ。
inodeが漏れただけではなんともないが、別の脆弱性と組み合わせてって感じなのかな。


以下リンク
IHS: ETagの無効化について

Disabling ETag headers in IBM HTTP Server

How do we fix "ETag Inode Information Leakage" vulnerability in IHS?

Apache HTTP Server での MIME メッセージ境界による情報漏えい (ApacheMimeInformationDisclosure)

ApacheのETAG計算
クラウド環境でのApacheの設定

ETagについて調べてみた


posted by koteitan at 10:44| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

[WebSphere]WebSphereでコネクションプールの状況をコマンドから確認する方法

昔はPMIモジュールを有効にして、TPVするしか確認できなかったのに、
最近は簡単になったんだねぇ。

1.wsadminツールにて管理ノードへ接続します

wsadmin.sh -lang jython -user <USERNAME> -password <PASSWORD>

2.対象のMbeanを検索します。

ds=AdminControl.queryNames('*:j2eeType=JDBCDataSource,name=DS名,process=AS名,*')

3.pool状況をモニタします

AdminControl.invoke(ds,"showPoolContents")


出力される内容の

Total number of connections: 1 (max/min 10/1, reap/unused/aged 180/1800/0, connectiontimeout/purge 180/EntirePool)
                               (testConnection/inteval false/0, stuck timer/time/threshold 0/0/0, surge time/connections 0/-1)

ここがプールの状況で、(これは1つプールされていて、最小1 最大10って意味)

Shared/Unsahred Connection information

ここにコネクションの使用状況が出る。スレッドIDが出るので、javacoreを吐かせて処理を特定できる。
同じスレッドIDがいくつもつかんでいたりすると開放漏れのリークかもねぇ。


参考

posted by koteitan at 10:39| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2016年10月09日

plugin転送のあれこれ

http->httpのトランスポートに
https->httpsのトランスポートに

80−>9080
443−>9043

ってのがまず大前提としてあって、


https->http みたいなセキュリティ度外視転送をする場合、
新しいWebSphereではpluginのUseInSecureプロパティををTrueにしなければエラーにされる。
むしろそれが正しい。


変換したとしてもHTTPで通信されるのはIHS->WAS間であり、
元々のユーザーからのリクエストをWASヘッダ$WSSCに記憶しているので、
アプリケーション内でのgetScheme()などはちゃんとhttpsで判定してくれる。

じゃあ、WASに直接リクエストして、$WSSCヘッダつけたらどうなるんだろうかって試してみたくなった。
たぶん判定してくれないと思うな。セキュリティの穴になりそうだし。
posted by koteitan at 12:42| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

IHS de SSL

よく忘れるので、メモしておこう。

1 keyストア作る
2 証明書入れる(自己でも買ったやつでもなんでも)
3 httpd.conf に以下を入れる
 (デフォルトで入っているのを有効化するだけでいい)

キーストアのパスは適宜直すこと
LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
Listen 443
<VirtualHost :443>
SSLEnable
SSLClientAuth None
</VirtualHost>

SSLDisable
KeyFile "c:/program files/ibm http server/key.kdb"


posted by koteitan at 12:29| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2016年09月04日

WebSphere V9

GA版が発表されたWAS9。
個人的にうれしいのはjythonが2.7に更新されたということだなー。
これで「そんな関数はありませんムキー!いちからか、いちからつくらないとだめか!」
から開放されるぞ、やったね。

最近jythonまったく触ってないけどね!
posted by koteitan at 18:55| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2016年08月24日

ServerIOTimeOut の弊害

更新何年ぶりだろな

相変わらず、WebSphereとかjavaとかしてますが、あまり目新しいことや
Tips的なの無いんですよね。(有っても書けないことのほうが多いからのう

今回はWASV6からだったか追加されてるServerIOTimeOutの挙動についての豆知識。
マニュアルなどからは読み取れない細かい話だけれども。

http://www-01.ibm.com/support/docview.wss?uid=jpn1J1000347
http://www-01.ibm.com/support/docview.wss?uid=jpn1J1012104

ここいらに書いてあるServerIOTimeOutのパラメータについて、
クラスタ構成で、正の値が指定されている場合、マークダウンせずに次のサーバーへ
リルートが行われる。

多重処理を防ぐために、PostBufferSizeをゼロにした時、
説明にはこうある。

"
PostBufferSizeが0であるためリクエストのコンテンツをバッファーせず、
更にServerIOTimeoutが正の値ですので、該当サーバーをマークダウンせず、
クライアントに500エラーを返します。
"


HTTP応答コードは最初の応答を返す前に付与される情報であるので、
例えばいくつかの応答を吐きだした後に、Webアプリケーションが張り付いた場合
クライアントには既にHTTP200といくらかの応答が返っているので、HTTP500を返すことはできない。
よって、応答コードだけをServerIOTimeOutが発生したかの判断に使うのは危険だと思う。

この少しだけ応答した場合のServerIOTimeOut有無はAccessLogの応答サイズや、
応答時間ぐらいしか判断材料がない。
http_plugin.logで確認するにはLogLevelをDEBUGまで上げる必要がある


http_plugin.log
[24/Aug/2016:16:01:28.65581] 00001df0 be1fc700 - DEBUG: mod_was_ap22_http: cb_write_body: In the write body callback writing 289
[24/Aug/2016:16:01:28.65601] 00001df0 be1fc700 - DEBUG: lib_htresponse: htresponseGetChunk: Getting the next chunk
[24/Aug/2016:16:01:28.65604] 00001df0 be1fc700 - TRACE: lib_rio: Blocking for read, waiting 45
[24/Aug/2016:16:01:29.22684] 00001e11 c8ed2700 - DEBUG: mod_was_ap22_http: as_child_init pid= 00001E11
[24/Aug/2016:16:02:13.66877] 00001df0 be1fc700 - DEBUG: lib_rio: wait_on_socket: ServerIOTimeout fired.
[24/Aug/2016:16:02:13.66883] 00001df0 be1fc700 - DEBUG: lib_rio.c line 894 : Read failed, rc=11

access.log
192.168.1.10 - - [24/Aug/2016:16:00:00 +0900] "GET /MyTestWeb/post.html HTTP/1.1" 200 409
192.168.1.10 - - [24/Aug/2016:16:01:28 +0900] "POST /MyTestWeb/IOTimeOutTest.jsp HTTP/1.1" 200 289

※ServerIOTimeOutを45秒に設定、アプリケーションで少し出力したあとに60秒sleepさせてみた結果


htresponseGetChunkのエラーで検知できるかもだが、ちょっと微妙過ぎる気がするぜ。
どうでもいいが、TimeOut発動時のログ、fired! ってのがちょっとかっこいいな
posted by koteitan at 22:34| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2013年06月05日

[WebSphere]スレッド数を見たい時点でもう設計として(以下略 −2−

しかし、本当に要るのだろうかね。
詳細は前回のリンクの英文にあるので、それを見てもらえば概ね大丈夫だとおもうです。

(1)PMIの名前をゲットしてきて

#PMI Name
perfN = AdminControl.completeObjectName('type=Perf,process='+AS名とか+',*')

(2)PMIオブジェクトを作成して
   ((1)の名前がとれなかった場合は、PMIが無効になっている)

#PMI Object Name
perfObj = AdminControl.makeObjectName(perfN)

(3)見たいパフォーマンスデータのオブジェクト名を取得してきて

thpool_w = AdminControl.completeObjectName('type=ThreadPool,process='+AS名やって+',name=WebContainer,*')

(4)javax.management型に変換して

import javax.management as mgmt
param = [ mgmt.ObjectName(thpool_w), java.lang.Boolean('false')]

(5)jmxのメソッドを呼ぶ

sigs = ['javax.management.ObjectName', 'java.lang.Boolean']
th_stat = AdminControl.invoke_jmx( perfObj, 'getStatsObject', param, sigs)

(6)あとは煮るなり焼くなり好きにしてくれ
 (これは数だけ表示させる例)

for i in th_stat.getStatisticNames():
stat = th_stat.getStatistic(i)
stat_val = None
className=str(stat.getClass())
if (className.find("Count") > -1):
stat_val = stat.getCount()
else:
stat_val = stat.getCurrent()

print "%s,%s,%s" % (stat.getName(),stat.getDescription()[:-1],stat_val)


原文抜粋
To show how you can do this, we'll start with the techniques described in an earlier article, Writing PMI applications using the JMX interface. The examples in that article were created for Java developers. Here, we'll use wsadmin Jython scripts to demonstrate how easy it can be using this method to read and understand performance metrics.

なんて簡単なんでしょう!そう、IBMerならね!(ドヤァ

ホンマか!?(;´Д`)
ホンマにこれ簡単なんか!?

参考リンク
http://pic.dhe.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=%2Fcom.ibm.websphere.javadoc.doc%2Fpublic_html%2Fapi%2Fcom%2Fibm%2Fwebsphere%2Fpmi%2Fstat%2FStatsImpl.html

https://www.ibm.com/developerworks/websphere/techjournal/1112_guillemenot/1112_guillemenot.html?ca=drs-

http://publib.boulder.ibm.com/infocenter/wsdoc400/v6r0/index.jsp?topic=/com.ibm.websphere.iseries.doc/info/ae/ae/rxml_admincontrol.html
posted by koteitan at 14:13| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2013年05月30日

[WebSphere]スレッド数を見たい時点でもう設計として(以下略

PMI()にアクセスできればWASの内部状態を知ることができる。
例えば活動中のスレッドプール数、コネクション接続数などなど。
設定値上はMin/Maxしかないものの現在の値がチェックできるので、見積もり時や
トラブル時などに役に立つだろう。
決して本番稼働中システムの設定値が妥当かどうかを見るために使うものではないと思う。
(理由は(1)の※2)
ただし、PMIのデータを見るには以下のいくつかのステップが必要だ。

(1)WASのPMI機能を有効にする
  ※1 適切なレベル設定になっていないと見たいものが見えない
  ※2 しかし上位になればなるほどパフォーマンス影響がでる。(プロファイラみたいなもんだし)

(2)ローカルマシン上のTPVクライアントから(1)のサーバーへ接続して目的のJVMを確認する
   もしくは管理コンソールから確認する(負荷かかるのでローカルの方がよい)

まぁ、ほとんどは(1)のステップが設定変更を伴うためウヘァとなるだろうか。
TPVによる図示はSVG変換などでいくらか余計なコストがかかるので、
wsadminから強引に取りだすこともできる。スクリプトなのでロギングしたり、定期的にチェックしたりも余裕でできる。
(やっと本題)
だが、長いので次回に。

ここ見て予習しておいてくだせぇ('ω')ノ
http://www.ibm.com/developerworks/jp/websphere/library/was/was8_jvm_update/

しっかし、これ役に立つんだろうか・・。備忘録とはいえ忘れていいんじゃないかとすら思う(;´Д`)。
posted by koteitan at 09:31| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2013年05月21日

[WebSphere]scriptLibrary

アプリを操作するとき、普通はAdminappだよな

http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/topic/com.ibm.websphere.express.doc/info/exp/ae/txml_exportdll.html


でも、めんどくさがり屋さんのためにもうちょっと使いやすくしたもの(スクリプトで便利関数とかにしたものというか)が
スクリプトライブラリ。

http://pic.dhe.ibm.com/infocenter/wasinfo/v8r5/topic/com.ibm.websphere.nd.doc/ae/rxml_7libapp3.html

こっちだとAdminApplication

スクリプトライブラリは、Websphere導入先のscriptLibrariesディレクトリに入っている。
wsadmin起動時に自動でclassも読み込まれるので、オブジェクトとして利用することもできるし
jythonのサンプルスクリプトとしても使える。

http://pic.dhe.ibm.com/infocenter/wasinfo/v8r5/topic/com.ibm.websphere.nd.doc/ae/welc_ref_adm_jython.html

うーむ、infocenterへのリンクがバージョンバラバラやんか。(;´Д`)
まぁ、適当に読み替えてくだしあ。

posted by koteitan at 11:41| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2012年12月20日

[WebSphere]セッションフィクセイション攻撃について

うーむ。
セッション固定攻撃自体は結構前からある手法で、phpとかはアダプションがあるので
うまくいきやすい。(指定した文字列をセッションIDとして受け付けてしまうという脅威的な機能)
アダプションを無効にしたとしても、Cookieモンスターやなんやらでイケテル文字列を用意すれば
よろしい、詳しくは徳丸本徳丸さんのblogなどに詳しい解説がある。

ここまではよい。

で、javaだとアダプションは出来ないんだけど、イケテルIDを取得してきたらOKなのは間違いない。
アダプションもできないはずなんだけど、本当に出来ないかどうかは確かめてみないと。

ということで、やってみた。
ぐちゃぐちゃな文字を指定してやると、当然の如く、イケテルIDが貰え・・・
1.PNG
(つд⊂)ゴシゴシ

(;゚ Д゚)!?2つ?

Reload!
2.png
(;゚ Д゚)!?新規ID?

どうも、InMemoryのJSESSIONとDiskに書き込まれたJSESSIONが出ている気がする。
(ツール-開発者ツール から Cookieを表示させると、document.cookie.write で書き込んだ方しか見えない)
3.PNG
参ったな、こりゃ。
ぐちゃぐちゃなJSESSIONIDを踏ませ、100年ぐらいのexpireにしとけばいつまで経ってもログインできない
ブラウザの完成
」ということだよなぁ。セコイ攻撃だけどなぁ。
もうちょっと調べるか。パケットとWebSphereトレースやな。

トレースのやり方メモしとこかいな。
http://www-01.ibm.com/support/docview.wss?uid=swg21192604


posted by koteitan at 18:54| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2012年11月14日

[WebSphere]HeapDumpの強制出力

ネタが無いのに無理やり捻り出してみる。

表題にあるように、稼動しているJVMからHeapDumpを取り出したい時ってたまにしょっちゅうありますよね・・・(´-ω-`)エッ?ナイ?

断片化が進んできて連続領域確保できずに、Heapが拡張してしまっているのが
ログから見て取れるのに、HeapDumpからオブジェクトの配置状況をマップして「見える化」するという
果てしなく無駄な作業とか、ありませんか?そうですか。

前置きが長かったですな。
(ええと、以下はIBMのJVMに関しての話です。SUN(現Oracle)についてはちゃうかもしれませんので
各自自習。普通jmapとか使うんじゃないかな)


このHeapDump、普通はOOM(OutOfMemory)発生時にしかでません。オプション、IBM_HEAP_DUMP=trueが入ってないから
kill -3 (QUIT)で出ます、って記事もたまーにありますが、このオプションの説明が
はしょってあるだけです。デフォルトでは出ません。(←ここ、よくハマるので注意)

概ねは これの http://www-01.ibm.com/support/docview.wss?uid=jpn1J1006976 
のとこの動きを見ればいいんでないかな。
要するに、オプション入れとかなきゃ OOM時しか出ません、って話なんだけど

http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/topic/com.ibm.java.doc.diagnostics.60/diag/tools/heapdump_env.html

で、これを設定してないAPPServerのHeapDumpが欲しい今すぐ。設定変更、再起動は許さん!
という「そんなご無体な・・・」「うるさい、今すぐやれあqswでfrgthyじゅきぉ」

と来るのが世の常。Dumpが要求されるような時っていうのは、まぁ大抵トラブル発生中なうな極限状態であることが多いので
普段冷静なお客様や上役達も目の前にブロックを落とされたぐっすんおよよ状態なわけでして。

で、うん、よし落ち着け。
WebSphereのJVMに限って言えば方法はある。だから落ち着け

やり方はwsadminで、該当ASのJVMのmbeanをとってきて
Admincontrolで、generateHeapDumpするだけ。

で、毎回毎回毎回jython書くのも面倒なので、ここに保存しておく

以下のjythonは入力値のASの存在確認をしたのち、heapdumpを出力させる

WASのFPが低いと、ぬるぽが出る既存の問題を踏む可能性がある
http://www-01.ibm.com/support/docview.wss?uid=swg1PK77235

----------


import sys
import os


def task_heapDump(id,asName):

print "APPServer : %s " % asName

NodeName=findNode(asName)
if(NodeName==None):
#don't Enter ...
print "Huh?"
sys.exit(8)

print "Node : %s " % NodeName

jvmbean = AdminControl.queryNames('type=JVM,process=' + asName +',node=' + NodeName + ',*')


print "enter heapdump..."
print ""

AdminControl.invoke(jvmbean, "generateHeapDump")

print ""
print "done."


def findNode(asName):
nodes = AdminConfig.list("Node").splitlines()
for node in nodes:
nodeServers = AdminConfig.list("Server", node).splitlines()
for nodeServer in nodeServers:
sname = AdminConfig.showAttribute(nodeServer, "name")
if sname == asName:
nname = AdminConfig.showAttribute(node, "name")
return nname
return None

if(len(sys.argv) != 1 ):
print "usage : wsadmin.sh -user -password -lang jython -f memDmp.py "
sys.exit(0)



TargetName=sys.argv[0]


Servers=AdminConfig.list("Server")
for sv in Servers.splitlines():
ServerType = AdminConfig.showAttribute(sv,"serverType")
if(ServerType == "APPLICATION_SERVER"):
Cname = AdminConfig.showAttribute(sv,"name")
if(Cname==TargetName):
task_heapDump(sv,Cname)
sys.exit(0)




print "if you see this message, check your input. script can't found APP Server %s " % TargetName


posted by koteitan at 11:45| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする

2012年10月15日

WebSphere本の新刊

最近更新してないなぁ・・。
なんつーか、ガッツが出ないんだよねぇ。

WebSphereには相変わらず触っています。
新しい、WAS本が出ますのでご紹介をば。



日本語で書かれたまとまった資料としては大いに期待できますな。
もちろんゲットしました。
712頁もあって持ち歩くにはシャレになんないw
電子書籍版もあれば検索もできてよかったのになぁと思うです。
posted by koteitan at 21:24| Comment(0) | TrackBack(0) | WebSphere | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。