<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Curl Global Community - Baison log]]></title>
		<link>https://communities.curl.com/</link>
		<description><![CDATA[Curl Global Community - https://communities.curl.com]]></description>
		<pubDate>Sat, 16 May 2026 06:31:21 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[待機サーバと同期する際の判断条件]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1199</link>
			<pubDate>Thu, 22 Jan 2015 09:28:12 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1199</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
sc コマンドでWindowsサービスの管理を行える</span><br />
<br />
ある本番サーバ環境と、その待機サーバの間で、夜間バッチにて、データベースの同期をとる際、<br />
単純に、本番のDBからエクスポートしたダンプファイルを、待機サーバに送り、インポートする、<br />
つまり、単純に上書きをするとします。<br />
<br />
しかし、もし障害が発生し、待機側のDBが「正しい」状態になっていたら、<br />
本番サーバから上書きしてはいけないことになります。<br />
その「上書きしていいかどうか」の判断として、<br />
『本番サーバのサービス（ApacheTomcat）が動いて』いたら、<br />
待機サーバが運用されているものとして、本番から上書きを行わない、<br />
という方式を考えてみました。<br />
<br />
この場合に、本番サーバから、待機サーバのサービスの状態を確認するには、<br />
下記のようなコードでいけそうです。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>@Echo Off<br />
Call :DoesRunningService "1&nbsp;&nbsp;STOPPED"<br />
Call :DoesRunningService "4&nbsp;&nbsp;RUNNING"<br />
Exit /B<br />
::--------------------------------------<br />
::サービスの状態を確認をするサブルーチン<br />
::--------------------------------------<br />
:DoesRunningServic<br />
&nbsp;&nbsp;&nbsp;&nbsp;SET service=Tomcat7<br />
&nbsp;&nbsp;&nbsp;&nbsp;sc &#92;&#92;133.170.235.90 query %service% | FindStr -C:%1&gt;NUL<br />
&nbsp;&nbsp;&nbsp;&nbsp;If ERRORLEVEL 1 ( Echo %service% : %1 NG ) Else (Echo %service% : %1 OK )<br />
Exit /B</code></div></div><br />
ちなみに、この「sc コマンド」は、サービスの状態だけでなく、<br />
サービスの開始や停止なども行えます。<br />
<br />
<br />
ちなみに、サービスのインストールは、<br />
.NETのインストール用ユーティリティ（InstallUtil.exe）で、できるみたいです。<br />
<br />
<br />
例：<br />
"C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe" サービス名<br />
<br />
<br />
<br />
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
sc コマンドでWindowsサービスの管理を行える</span><br />
<br />
ある本番サーバ環境と、その待機サーバの間で、夜間バッチにて、データベースの同期をとる際、<br />
単純に、本番のDBからエクスポートしたダンプファイルを、待機サーバに送り、インポートする、<br />
つまり、単純に上書きをするとします。<br />
<br />
しかし、もし障害が発生し、待機側のDBが「正しい」状態になっていたら、<br />
本番サーバから上書きしてはいけないことになります。<br />
その「上書きしていいかどうか」の判断として、<br />
『本番サーバのサービス（ApacheTomcat）が動いて』いたら、<br />
待機サーバが運用されているものとして、本番から上書きを行わない、<br />
という方式を考えてみました。<br />
<br />
この場合に、本番サーバから、待機サーバのサービスの状態を確認するには、<br />
下記のようなコードでいけそうです。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>@Echo Off<br />
Call :DoesRunningService "1&nbsp;&nbsp;STOPPED"<br />
Call :DoesRunningService "4&nbsp;&nbsp;RUNNING"<br />
Exit /B<br />
::--------------------------------------<br />
::サービスの状態を確認をするサブルーチン<br />
::--------------------------------------<br />
:DoesRunningServic<br />
&nbsp;&nbsp;&nbsp;&nbsp;SET service=Tomcat7<br />
&nbsp;&nbsp;&nbsp;&nbsp;sc &#92;&#92;133.170.235.90 query %service% | FindStr -C:%1&gt;NUL<br />
&nbsp;&nbsp;&nbsp;&nbsp;If ERRORLEVEL 1 ( Echo %service% : %1 NG ) Else (Echo %service% : %1 OK )<br />
Exit /B</code></div></div><br />
ちなみに、この「sc コマンド」は、サービスの状態だけでなく、<br />
サービスの開始や停止なども行えます。<br />
<br />
<br />
ちなみに、サービスのインストールは、<br />
.NETのインストール用ユーティリティ（InstallUtil.exe）で、できるみたいです。<br />
<br />
<br />
例：<br />
"C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe" サービス名<br />
<br />
<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[リモートデスクトップの同時接続数を増やす]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1196</link>
			<pubDate>Tue, 20 Jan 2015 04:37:58 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1196</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
気を使うより、数増やせ</span><br />
<br />
下記サイトを参考にして、リモートデスクトップの同時接続数を増やすことができます。<br />
<br />
■1 つの接続で実行可能な同時リモート接続数を構成する<br />
<a href="http://technet.microsoft.com/ja-jp/library/cc753380.aspx" target="_blank" rel="noopener" class="mycode_url">http://technet.microsoft.com/ja-jp/libra...53380.aspx</a><br />
<br />
これで、他の作業者の顔色を窺わずとも、気軽にサーバにログインできになります。<br />
<br />
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
気を使うより、数増やせ</span><br />
<br />
下記サイトを参考にして、リモートデスクトップの同時接続数を増やすことができます。<br />
<br />
■1 つの接続で実行可能な同時リモート接続数を構成する<br />
<a href="http://technet.microsoft.com/ja-jp/library/cc753380.aspx" target="_blank" rel="noopener" class="mycode_url">http://technet.microsoft.com/ja-jp/libra...53380.aspx</a><br />
<br />
これで、他の作業者の顔色を窺わずとも、気軽にサーバにログインできになります。<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[WebLogic で Curl を動かす]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1193</link>
			<pubDate>Thu, 08 Jan 2015 00:02:32 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1193</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
MIMEの設定を忘れずに</span><br />
<br />
WebLogic で新しくドメインを追加して、Curlアプリケーションをデプロイすると、<br />
「Error:InvalidAppletException: content-type''はサポートされていません。」<br />
というエラーが表示されるようになってしまいました。<br />
<br />
これまでのドメインでは動いていたのになんでだろうと、過去の設定作業を思い出してみると、<br />
MIMEタイプの設定が必要だったことを忘れていました。<br />
<br />
<br />
■MIME<br />
Oracle\Middleware\user_projects\domains\&lt;ドメイン名&gt;\config<br />
mimemappings.properties<br />
<br />
内容<br />
curl=text/vnd.curl<br />
dcurl=text/vnd.curl.dcurl<br />
scurl=text/vnd.curl.scurl<br />
mcurl=text/vnd.curl.mcurl<br />
pcurl=application/vnd.curl.pcurl<br />
car=application/vnd.curl.car<br />
<br />
私の環境では、画像のPNGファイルとか、ワンダフルレポートという帳票ツールも使っていたので、下記の記述も追加していました。<br />
png=image/png<br />
wfr=application/octet-stream<br />
wfi=application/octet-stream<br />
wff=application/octet-stream<br />
<br />
<br />
<br />
ちなみに、デプロイ対象のフォルダの下には、Curlのソースだけでなく、WEB-INFフォルダを作成し、web.xmlがないと、<br />
WebLogicの管理コンソールでデプロイ対象として認識されないみたいです。<br />
私の環境では下記2ファイルを置いていました。<br />
<br />
<br />
■web.xml<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"&gt;<br />
&lt;display-name&gt;sccess&lt;/display-name&gt;<br />
&lt;welcome-file-list&gt;<br />
&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br />
&lt;/welcome-file-list&gt;<br />
&lt;/web-app&gt;</code></div></div><br />
<br />
■weblogic.xml<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE weblogic-web-app<br />
PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN"<br />
"http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"<br />
&lt;weblogic-web-app&gt;<br />
&lt;context-root&gt;ルート名&lt;/context-root&gt;<br />
&lt;/weblogic-web-app&gt;</code></div></div><br />
<br />
なお、mimemappings.propertiesがなくても、<br />
web.xml にMIMEを記述すれば行けるみたいです。<br />
例<br />
&lt;mime-mapping&gt;<br />
&lt;extension&gt;curl&lt;/extension&gt;<br />
&lt;mime-type&gt;=text/vnd.curl&lt;/mime-type&gt;<br />
&lt;/mime-mapping&gt;<br />
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
MIMEの設定を忘れずに</span><br />
<br />
WebLogic で新しくドメインを追加して、Curlアプリケーションをデプロイすると、<br />
「Error:InvalidAppletException: content-type''はサポートされていません。」<br />
というエラーが表示されるようになってしまいました。<br />
<br />
これまでのドメインでは動いていたのになんでだろうと、過去の設定作業を思い出してみると、<br />
MIMEタイプの設定が必要だったことを忘れていました。<br />
<br />
<br />
■MIME<br />
Oracle\Middleware\user_projects\domains\&lt;ドメイン名&gt;\config<br />
mimemappings.properties<br />
<br />
内容<br />
curl=text/vnd.curl<br />
dcurl=text/vnd.curl.dcurl<br />
scurl=text/vnd.curl.scurl<br />
mcurl=text/vnd.curl.mcurl<br />
pcurl=application/vnd.curl.pcurl<br />
car=application/vnd.curl.car<br />
<br />
私の環境では、画像のPNGファイルとか、ワンダフルレポートという帳票ツールも使っていたので、下記の記述も追加していました。<br />
png=image/png<br />
wfr=application/octet-stream<br />
wfi=application/octet-stream<br />
wff=application/octet-stream<br />
<br />
<br />
<br />
ちなみに、デプロイ対象のフォルダの下には、Curlのソースだけでなく、WEB-INFフォルダを作成し、web.xmlがないと、<br />
WebLogicの管理コンソールでデプロイ対象として認識されないみたいです。<br />
私の環境では下記2ファイルを置いていました。<br />
<br />
<br />
■web.xml<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"&gt;<br />
&lt;display-name&gt;sccess&lt;/display-name&gt;<br />
&lt;welcome-file-list&gt;<br />
&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br />
&lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br />
&lt;/welcome-file-list&gt;<br />
&lt;/web-app&gt;</code></div></div><br />
<br />
■weblogic.xml<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE weblogic-web-app<br />
PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN"<br />
"http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"<br />
&lt;weblogic-web-app&gt;<br />
&lt;context-root&gt;ルート名&lt;/context-root&gt;<br />
&lt;/weblogic-web-app&gt;</code></div></div><br />
<br />
なお、mimemappings.propertiesがなくても、<br />
web.xml にMIMEを記述すれば行けるみたいです。<br />
例<br />
&lt;mime-mapping&gt;<br />
&lt;extension&gt;curl&lt;/extension&gt;<br />
&lt;mime-type&gt;=text/vnd.curl&lt;/mime-type&gt;<br />
&lt;/mime-mapping&gt;<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[バッチプログラムの勉強]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1192</link>
			<pubDate>Thu, 25 Dec 2014 05:44:55 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1192</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
餅は餅屋。バッチに任せられるものは任せよう。</span><br />
<br />
不要ファイル削除等の日時処理や、メンテナンスのために、<br />
バッチプログラムをいろいろと組む必要が出てきたので、<br />
参考になったサイト等をメモ。<br />
<br />
コマンドプロンプトは難しいイメージがありますが、<br />
勉強して使えるようになってくると便利ですね。<br />
<br />
■基本的なバッチの書き方<br />
<a href="http://d.hatena.ne.jp/language_and_engineering/20130502/PatternsOfMSDOSorBAT" target="_blank" rel="noopener" class="mycode_url">http://d.hatena.ne.jp/language_and_engin...MSDOSorBAT</a><br />
勉強になりました<br />
<br />
■コマンドプロンプトの変数<br />
<a href="http://pf-j.sakura.ne.jp/program/dos/dos...ercent.htm" target="_blank" rel="noopener" class="mycode_url">http://pf-j.sakura.ne.jp/program/dos/dos...ercent.htm</a><br />
知らないと結構悩む<br />
<br />
■環境変数の遅延展開<br />
<a href="http://d.hatena.ne.jp/ladybug/20090530/p1" target="_blank" rel="noopener" class="mycode_url">http://d.hatena.ne.jp/ladybug/20090530/p1</a><br />
知らないとドツボにはまる<br />
<br />
■for文<br />
<a href="http://www.atmarkit.co.jp/ait/articles/0104/27/news002.html" target="_blank" rel="noopener" class="mycode_url">http://www.atmarkit.co.jp/ait/articles/0...ws002.html</a><br />
実行結果の取得とか、単純なループ処理以外に使える、<br />
というか、forを理解しないとバッチは進まない<br />
<br />
■タスクスケジューラの管理<br />
<a href="http://hisk2tmem.blog61.fc2.com/blog-entry-48.html" target="_blank" rel="noopener" class="mycode_url">http://hisk2tmem.blog61.fc2.com/blog-entry-48.html</a><br />
最初、相手先を&lt;\\IP&gt;で指定できることに気付かなかった<br />
サーバ間でバッチを呼び出し合うのに利用<br />
<br />
■サービスの作成や実行 sc コマンド<br />
<a href="http://win-cmd.seesaa.net/article/85809065.html" target="_blank" rel="noopener" class="mycode_url">http://win-cmd.seesaa.net/article/85809065.html</a><br />
非常用のサーバを準備する際など、複数のサービスを起動できる<br />
<br />
■コマンドラインから Javascript を実行 mshta コマンド<br />
<a href="http://d.hatena.ne.jp/language_and_engineering/20081023/1224678990" target="_blank" rel="noopener" class="mycode_url">http://d.hatena.ne.jp/language_and_engin...1224678990</a><br />
なんでもできすぎて危険、かつ魅惑的なコマンド<br />
<br />
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
餅は餅屋。バッチに任せられるものは任せよう。</span><br />
<br />
不要ファイル削除等の日時処理や、メンテナンスのために、<br />
バッチプログラムをいろいろと組む必要が出てきたので、<br />
参考になったサイト等をメモ。<br />
<br />
コマンドプロンプトは難しいイメージがありますが、<br />
勉強して使えるようになってくると便利ですね。<br />
<br />
■基本的なバッチの書き方<br />
<a href="http://d.hatena.ne.jp/language_and_engineering/20130502/PatternsOfMSDOSorBAT" target="_blank" rel="noopener" class="mycode_url">http://d.hatena.ne.jp/language_and_engin...MSDOSorBAT</a><br />
勉強になりました<br />
<br />
■コマンドプロンプトの変数<br />
<a href="http://pf-j.sakura.ne.jp/program/dos/dos...ercent.htm" target="_blank" rel="noopener" class="mycode_url">http://pf-j.sakura.ne.jp/program/dos/dos...ercent.htm</a><br />
知らないと結構悩む<br />
<br />
■環境変数の遅延展開<br />
<a href="http://d.hatena.ne.jp/ladybug/20090530/p1" target="_blank" rel="noopener" class="mycode_url">http://d.hatena.ne.jp/ladybug/20090530/p1</a><br />
知らないとドツボにはまる<br />
<br />
■for文<br />
<a href="http://www.atmarkit.co.jp/ait/articles/0104/27/news002.html" target="_blank" rel="noopener" class="mycode_url">http://www.atmarkit.co.jp/ait/articles/0...ws002.html</a><br />
実行結果の取得とか、単純なループ処理以外に使える、<br />
というか、forを理解しないとバッチは進まない<br />
<br />
■タスクスケジューラの管理<br />
<a href="http://hisk2tmem.blog61.fc2.com/blog-entry-48.html" target="_blank" rel="noopener" class="mycode_url">http://hisk2tmem.blog61.fc2.com/blog-entry-48.html</a><br />
最初、相手先を&lt;\\IP&gt;で指定できることに気付かなかった<br />
サーバ間でバッチを呼び出し合うのに利用<br />
<br />
■サービスの作成や実行 sc コマンド<br />
<a href="http://win-cmd.seesaa.net/article/85809065.html" target="_blank" rel="noopener" class="mycode_url">http://win-cmd.seesaa.net/article/85809065.html</a><br />
非常用のサーバを準備する際など、複数のサービスを起動できる<br />
<br />
■コマンドラインから Javascript を実行 mshta コマンド<br />
<a href="http://d.hatena.ne.jp/language_and_engineering/20081023/1224678990" target="_blank" rel="noopener" class="mycode_url">http://d.hatena.ne.jp/language_and_engin...1224678990</a><br />
なんでもできすぎて危険、かつ魅惑的なコマンド<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[「切断したネットワークドライブ」が消えない]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1191</link>
			<pubDate>Wed, 24 Dec 2014 06:14:22 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1191</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
ネットワークドライブの割り当ては自動で行う</span><br />
<br />
あるとき、サーバのエクスプローラを開くと、とあるバッチの中で利用している「Z:ドライブ」が、<br />
「切断したネットワークドライブ」と表示され、アイコンに赤バッテンがついている。<br />
<br />
なぜだろうと思って、コマンドプロンプトから「net use」と打っても、<br />
「一覧にエントリが存在しません」となる。<br />
<br />
そうか、使ってないのか、と思って、再割り当てをしようと、<br />
「net use z: &lt;\\ホストのIP&gt;&lt;\ドライブ&#36;&gt; &lt;パスワード&gt; /user:&lt;ユーザ&gt; /persistent:no」<br />
みたいなコマンドを打つと、<br />
今度は「ローカル デバイス名は既に使用されています。」となる。<br />
<br />
使っているのか、いないのか、はっきりしてくれよ、と思いながら、<br />
リポジトリの「HKEY_CURRENT_USER\Network\」を確認しても、何もない。<br />
もちろん「net use z: /DELETE」を実行しても、切断したネットワークドライブは残ったまま。<br />
<br />
ネットの諸情報を見ると同じ問題で困っている人も多いようで、<br />
確実そうな情報としては、「net use /PERSISTENT:yes」と打ってから、<br />
Windows の再起動を行うと「切断したネットワーク ドライブ」は消える、とのことなのですが、<br />
サーバをホイホイ再起動するわけにもいきません。<br />
<br />
とりあえず、バッチ側で行っていたネットワークドライブの割り当てを、<br />
「net use」コマンドでの直接ドライブ指定ではなく、<br />
「pushd」コマンドで、自動割り当てすることになりました。<br />
<br />
ちなみに、「pushd」コマンドで割り当てられたドライブの取得方法はよくわかりませんが、<br />
「pushd」コマンド実行直後は、割り当てられたドライブがカレントディレクトリになるので、<br />
「%CD%」でカレントディレクトリ（＝割り当てらられたドライブ）を取得すればよさそうです。<br />
<br />
<br />
■pushd<br />
<a href="http://www.atmarkit.co.jp/fwin2k/win2ktips/792pushd/pushd.html" target="_blank" rel="noopener" class="mycode_url">http://www.atmarkit.co.jp/fwin2k/win2kti...pushd.html</a><br />
<br />
■コマンドプロンプトの%について<br />
<a href="http://pf-j.sakura.ne.jp/program/dos/doscmd/str_percent.htm" target="_blank" rel="noopener" class="mycode_url">http://pf-j.sakura.ne.jp/program/dos/dos...ercent.htm</a>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
ネットワークドライブの割り当ては自動で行う</span><br />
<br />
あるとき、サーバのエクスプローラを開くと、とあるバッチの中で利用している「Z:ドライブ」が、<br />
「切断したネットワークドライブ」と表示され、アイコンに赤バッテンがついている。<br />
<br />
なぜだろうと思って、コマンドプロンプトから「net use」と打っても、<br />
「一覧にエントリが存在しません」となる。<br />
<br />
そうか、使ってないのか、と思って、再割り当てをしようと、<br />
「net use z: &lt;\\ホストのIP&gt;&lt;\ドライブ&#36;&gt; &lt;パスワード&gt; /user:&lt;ユーザ&gt; /persistent:no」<br />
みたいなコマンドを打つと、<br />
今度は「ローカル デバイス名は既に使用されています。」となる。<br />
<br />
使っているのか、いないのか、はっきりしてくれよ、と思いながら、<br />
リポジトリの「HKEY_CURRENT_USER\Network\」を確認しても、何もない。<br />
もちろん「net use z: /DELETE」を実行しても、切断したネットワークドライブは残ったまま。<br />
<br />
ネットの諸情報を見ると同じ問題で困っている人も多いようで、<br />
確実そうな情報としては、「net use /PERSISTENT:yes」と打ってから、<br />
Windows の再起動を行うと「切断したネットワーク ドライブ」は消える、とのことなのですが、<br />
サーバをホイホイ再起動するわけにもいきません。<br />
<br />
とりあえず、バッチ側で行っていたネットワークドライブの割り当てを、<br />
「net use」コマンドでの直接ドライブ指定ではなく、<br />
「pushd」コマンドで、自動割り当てすることになりました。<br />
<br />
ちなみに、「pushd」コマンドで割り当てられたドライブの取得方法はよくわかりませんが、<br />
「pushd」コマンド実行直後は、割り当てられたドライブがカレントディレクトリになるので、<br />
「%CD%」でカレントディレクトリ（＝割り当てらられたドライブ）を取得すればよさそうです。<br />
<br />
<br />
■pushd<br />
<a href="http://www.atmarkit.co.jp/fwin2k/win2ktips/792pushd/pushd.html" target="_blank" rel="noopener" class="mycode_url">http://www.atmarkit.co.jp/fwin2k/win2kti...pushd.html</a><br />
<br />
■コマンドプロンプトの%について<br />
<a href="http://pf-j.sakura.ne.jp/program/dos/doscmd/str_percent.htm" target="_blank" rel="noopener" class="mycode_url">http://pf-j.sakura.ne.jp/program/dos/dos...ercent.htm</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[OEM にアクセスできない]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1190</link>
			<pubDate>Fri, 05 Dec 2014 05:51:41 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1190</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　鳴かぬなら、殺してしまえSSL</span><br />
<br />
Oracle をインストールして、データベースを作成後、<br />
Database Console のサービスが立ち上がっているのに、<br />
Oracle Enterprise Manager（OEM）をブラウザで表示しようとすると、<br />
「この Web サイトのセキュリティ証明書には問題があります。」と表示され、<br />
閉じるしか選択肢がない状態になることがある。<br />
<br />
Fire Fox でアクセスすれば表示できる場合もあるが、<br />
ある環境ではできなかった。<br />
とりあえず、SSLの設定を外せば、httpでアクセスできるようになるみたい。<br />
<br />
以下はSSLを外すための手順<br />
<br />
①コマンドプロンプトを起動<br />
②DBコンソールのサービスを止める<br />
emctl stop dbconsole<br />
③SSLの設定を外す<br />
emctl unsecure dbconsole<br />
④DBコンソールのサービスを開始する<br />
emctl start dbconsole<br />
⑤http://ホスト名:ポート/em でアクセスする<br />
<br />
ちなみに、戻す時は emctl secure dbconsole <br />
<br />
これまでも、最初は警告が表示されてOEMを起動できない、ということはあったのですが、<br />
どうも、Windows Update や、IEのバージョン（現時点の最新11など）のからみで、<br />
発生する問題みたい。]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　鳴かぬなら、殺してしまえSSL</span><br />
<br />
Oracle をインストールして、データベースを作成後、<br />
Database Console のサービスが立ち上がっているのに、<br />
Oracle Enterprise Manager（OEM）をブラウザで表示しようとすると、<br />
「この Web サイトのセキュリティ証明書には問題があります。」と表示され、<br />
閉じるしか選択肢がない状態になることがある。<br />
<br />
Fire Fox でアクセスすれば表示できる場合もあるが、<br />
ある環境ではできなかった。<br />
とりあえず、SSLの設定を外せば、httpでアクセスできるようになるみたい。<br />
<br />
以下はSSLを外すための手順<br />
<br />
①コマンドプロンプトを起動<br />
②DBコンソールのサービスを止める<br />
emctl stop dbconsole<br />
③SSLの設定を外す<br />
emctl unsecure dbconsole<br />
④DBコンソールのサービスを開始する<br />
emctl start dbconsole<br />
⑤http://ホスト名:ポート/em でアクセスする<br />
<br />
ちなみに、戻す時は emctl secure dbconsole <br />
<br />
これまでも、最初は警告が表示されてOEMを起動できない、ということはあったのですが、<br />
どうも、Windows Update や、IEのバージョン（現時点の最新11など）のからみで、<br />
発生する問題みたい。]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[RecordSetでの大量データ]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1189</link>
			<pubDate>Fri, 05 Dec 2014 05:41:50 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1189</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
大量データを扱うときは、RecordFieldの数に気をつけろ</span><br />
<br />
ビッグデータといわないまでも、数万件から数十万件のデータを、<br />
Curlで扱いたいということが最近増えてきました。<br />
<br />
私が大量データを扱う経験したのは、CSVで作成した元データを、サーバに送って取り込む機能。<br />
通常業務では取り込む対象は数件とのことだったので、1万件程度の負荷テストだけで済ませていました。<br />
しかし、1年に何回か、10万件のデータを取り込む、という運用があるとのことで、<br />
最大データ容量での負荷テストを行ったとたん、メモリ不足でCurlが落ちてしまいました。<br />
<br />
最終的には、ファイルを内部で分割しながらサーバとやり取りする仕組みに実装しなおしたことで<br />
問題は解決しましたが、<br />
メモリ消費量の推移がイマイチ納得いかなかったので、<br />
サンプルを作ってテストしてみました。<br />
<br />
その内容は以下。<br />
ちなみに、メモリ消費量はタスクマネージャで確認した値です。<br />
<br />
<br />
フィールド数　　レコード件数/メモリ消費量<br />
　　　　　　　　 3万件　　 6万件　　12万件<br />
　　　　　70　　 30MB　　　60MB　　 120MB<br />
　　　　 140　　 60MB　　 120MB　　 240MB<br />
　　　　 210　　120MB　　 240MB　　 470MB<br />
　　　　 280　　110MB　　 240MB　　 470MB<br />
　　　　 350　　230MB　　 460MB　　 820MB<br />
　　　　 420　　230MB　　 460MB　　 830MB<br />
<br />
見てわかるとおり、レコード件数に対しては一定の比率ですが、<br />
フィールド数に対しては、210個と280個、380個と420個の場合に同じメモリ消費量となり、<br />
階段のようなグラフになっていることがわかります。<br />
<br />
サンプルの中では、フィールドの物理名の長さを変えたり、<br />
レコードの値設定を、通常の set ではなく、BasicRecord.internal-set-value に変えてみたりと<br />
いくつかのチェックをしましたが、どれも有意な差にはなりませんでした。<br />
<br />
大量RecordSetを作る上での一番のポイントはフィールド数であり、<br />
閾値の確認まではしていませんが、<br />
メモリの領域が足りなくなった段階で、倍々で確保する仕組みになっているのかもしれません。<br />
<br />
業務仕様上、フィールド数を単純に削減することはできないかもしれませんが、<br />
大量データをRecordSetに取り込む場合は、<br />
フィールド数を意識しておくとよいかもしれません。<br />
<br />
<br />
<br />
<br />
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
大量データを扱うときは、RecordFieldの数に気をつけろ</span><br />
<br />
ビッグデータといわないまでも、数万件から数十万件のデータを、<br />
Curlで扱いたいということが最近増えてきました。<br />
<br />
私が大量データを扱う経験したのは、CSVで作成した元データを、サーバに送って取り込む機能。<br />
通常業務では取り込む対象は数件とのことだったので、1万件程度の負荷テストだけで済ませていました。<br />
しかし、1年に何回か、10万件のデータを取り込む、という運用があるとのことで、<br />
最大データ容量での負荷テストを行ったとたん、メモリ不足でCurlが落ちてしまいました。<br />
<br />
最終的には、ファイルを内部で分割しながらサーバとやり取りする仕組みに実装しなおしたことで<br />
問題は解決しましたが、<br />
メモリ消費量の推移がイマイチ納得いかなかったので、<br />
サンプルを作ってテストしてみました。<br />
<br />
その内容は以下。<br />
ちなみに、メモリ消費量はタスクマネージャで確認した値です。<br />
<br />
<br />
フィールド数　　レコード件数/メモリ消費量<br />
　　　　　　　　 3万件　　 6万件　　12万件<br />
　　　　　70　　 30MB　　　60MB　　 120MB<br />
　　　　 140　　 60MB　　 120MB　　 240MB<br />
　　　　 210　　120MB　　 240MB　　 470MB<br />
　　　　 280　　110MB　　 240MB　　 470MB<br />
　　　　 350　　230MB　　 460MB　　 820MB<br />
　　　　 420　　230MB　　 460MB　　 830MB<br />
<br />
見てわかるとおり、レコード件数に対しては一定の比率ですが、<br />
フィールド数に対しては、210個と280個、380個と420個の場合に同じメモリ消費量となり、<br />
階段のようなグラフになっていることがわかります。<br />
<br />
サンプルの中では、フィールドの物理名の長さを変えたり、<br />
レコードの値設定を、通常の set ではなく、BasicRecord.internal-set-value に変えてみたりと<br />
いくつかのチェックをしましたが、どれも有意な差にはなりませんでした。<br />
<br />
大量RecordSetを作る上での一番のポイントはフィールド数であり、<br />
閾値の確認まではしていませんが、<br />
メモリの領域が足りなくなった段階で、倍々で確保する仕組みになっているのかもしれません。<br />
<br />
業務仕様上、フィールド数を単純に削減することはできないかもしれませんが、<br />
大量データをRecordSetに取り込む場合は、<br />
フィールド数を意識しておくとよいかもしれません。<br />
<br />
<br />
<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Eclipse で実行しているサーバのパスがわからないときは？]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1100</link>
			<pubDate>Fri, 08 Aug 2014 03:31:13 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1100</guid>
			<description><![CDATA[新規開発時に、既存のサーバプロジェクトをコピーして再利用すると、<br />
サーバの起動パスがわからなくなることがあります。<br />
そんなときは、下記の方法で確認できます。<br />
<br />
<br />
■Eclipse で実行しているサーバのパスの確認方法<br />
　①「サーバ」ビューで、対象サーバをダブルクリック<br />
　②「概要」タブが開くので、その下部の「モジュール」タブを選択<br />
　③各リソースのパスが、「パス」カラムに表示されている<br />
<br />
「パス」の初期値は、プロジェクトの「\.settings\org.eclipse.wst.common.component」で記述されているぽいので、<br />
修正するには、ここの値を書き換える。<br />
<br />
（下記コード10行目の context-root の値）<br />
[code]<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;project-modules id="moduleCoreId" project-version="1.5.0"&gt;<br />
&lt;wb-module deploy-name="sccess"&gt;<br />
&lt;wb-resource deploy-path="/" source-path="/WebContent"/&gt;<br />
&lt;wb-resource deploy-path="/WEB-INF/classes" source-path="/base"/&gt;<br />
&lt;wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/&gt;<br />
&lt;wb-resource deploy-path="/WEB-INF/classes" source-path="/resources"/&gt;<br />
&lt;wb-resource deploy-path="/WEB-INF/classes" source-path="/test"/&gt;<br />
&lt;property name="java-output-path" value="build/classes"/&gt;<br />
&lt;property name="context-root" value="server-path"/&gt;<br />
&lt;/wb-module&gt;<br />
&lt;/project-modules&gt;<br />
[code]<br />
<br />
]]></description>
			<content:encoded><![CDATA[新規開発時に、既存のサーバプロジェクトをコピーして再利用すると、<br />
サーバの起動パスがわからなくなることがあります。<br />
そんなときは、下記の方法で確認できます。<br />
<br />
<br />
■Eclipse で実行しているサーバのパスの確認方法<br />
　①「サーバ」ビューで、対象サーバをダブルクリック<br />
　②「概要」タブが開くので、その下部の「モジュール」タブを選択<br />
　③各リソースのパスが、「パス」カラムに表示されている<br />
<br />
「パス」の初期値は、プロジェクトの「\.settings\org.eclipse.wst.common.component」で記述されているぽいので、<br />
修正するには、ここの値を書き換える。<br />
<br />
（下記コード10行目の context-root の値）<br />
[code]<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;project-modules id="moduleCoreId" project-version="1.5.0"&gt;<br />
&lt;wb-module deploy-name="sccess"&gt;<br />
&lt;wb-resource deploy-path="/" source-path="/WebContent"/&gt;<br />
&lt;wb-resource deploy-path="/WEB-INF/classes" source-path="/base"/&gt;<br />
&lt;wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/&gt;<br />
&lt;wb-resource deploy-path="/WEB-INF/classes" source-path="/resources"/&gt;<br />
&lt;wb-resource deploy-path="/WEB-INF/classes" source-path="/test"/&gt;<br />
&lt;property name="java-output-path" value="build/classes"/&gt;<br />
&lt;property name="context-root" value="server-path"/&gt;<br />
&lt;/wb-module&gt;<br />
&lt;/project-modules&gt;<br />
[code]<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[SplashScreen の利用にはお気をつけて]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1098</link>
			<pubDate>Tue, 08 Jul 2014 07:53:21 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1098</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　実行時間の短いサービスでは、SplashScreen を利用するな</span><br />
<br />
<br />
現在、ORBを利用したサービス呼び出しを連続で行うと、<br />
結果の返却順番が入れ替わってしまう、という問題が起きています。<br />
<br />
■プログラムの前提<br />
　１．サービス名：税計算サービス<br />
　　日付と区分を引数に、対象となる税率を返却する<br />
　２．イベントＡ．日付を表すDateField の ValueFinished で、税計算サービス（TaxService.calc-tax）を呼び出す<br />
　３．イベントＢ．区分を表す RadioFrame の ValueFinished で、税計算サービス（TaxService.calc-tax）を呼び出す<br />
　４．税計算サービスの実行結果を、税率フィールドに表示する<br />
<br />
■引数と結果の組み合わせ例<br />
　　日付：2010、区分：消費税　結果：5％<br />
　　日付：2014、区分：消費税　結果：8％<br />
　　日付：2010、区分：外貨　　結果：0％<br />
　　日付：2014、区分：外貨　　結果：0％<br />
<br />
■操作手順<br />
　①DateField の日付を2010年から、2014年に変更する<br />
　　（フォーカスアウト等はしていないのでValueFinishedは未発生）<br />
　②RadioFrame のラジオボタンを、消費税から、外貨に変更する<br />
　　（この段階で、DateFieldのValueFinished が発生、次に、RadioFrame のValueFinished が発生する）<br />
<br />
■結果<br />
　5回に１回くらいの割合で、税率フィールドに8％と表示される<br />
　※１：上記操作の結果、画面上は「日付：2014、区分：外貨」となっているのにもかかわらず、<br />
　　　　「日付：2014、区分：消費税」（ラジオボタンの変更前の状態）の結果がセットされる<br />
　※２：税率フィールドには、一瞬「0％」と表示されたのち、「8％」が表示される<br />
<br />
<br />
100%発生するわけではなく、ある程度の割合で発生するので、<br />
明確な原因は不明なのですが、サービス呼び出しの箇所にログを仕掛けたところ、<br />
下記のような処理の順番になっていることがわかりました。<br />
<br />
■処理順<br />
　①DateField の ValueFinished イベントで calc-tax が呼び出される<br />
　②RadioFrame の ValueFinished イベントで calc-pay-pln-dt が呼び出される<br />
　　（本来であれば、①の結果を返却してから、サービスが呼ばれるべき！）<br />
　③②の結果が返却される<br />
　④①の結果が返却される<br />
　　（順番が入れ替わることで、不正な結果となってしまう）<br />
<br />
これは、DateField のValueFinished で呼び出されたサービスの結果が返却される前に、<br />
RadioFrame のValueFinished イベントが割り込んでいるように見えます。<br />
<br />
dispatch-events を記述することでこのような問題が発生する可能性がありますが、<br />
プログラムには、dispathc-events は記述していません。<br />
<br />
そこで怪しいと思ったのが、「SplashScreen」です。<br />
<br />
<br />
現在、サービスの呼び出し時に、下記のようなインタセプタを設定しています。<br />
内容としては、サービス呼び出し時（handle-before-request）に SplashScreen を表示して、<br />
サービス実行後（handle-after-response）に、SplashScreenを閉じる、という処理になっています。<br />
<br />
このサービス呼び出し時の処理のなかで、対象のサービスの場合だけ、SplashScreenを表示しない、<br />
という処理を入れると、この問題は再現しなくなりました。<br />
<br />
SplashScreen のコードはOPEN-CONTROLS にもないので、確実なことは言えませんが、<br />
もしかすると、SplashScreen.setup の内部でdispatch-events のような処理が実行されており、<br />
そのため、DateField とRadioButton のValueFinished イベント割り込みが発生しているのではないか、<br />
と私は判断しています。<br />
<br />
同様の問題が発生している環境があれば、この辺りを疑ってみるとよいかも知れません。<br />
<br />
もし詳しい方がいらっしゃれば情報提供いただけるとありがたいです。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>||サービスコール時に、プログラムIDが指定されているかどうかを判断するインタセプタ<br />
{define-class public InitializeServiceInterceptor {inherits ClientInterceptor}<br />
<br />
&nbsp;&nbsp;||プログレスバーの表示を無視するサービスの一覧<br />
&nbsp;&nbsp;||　共通処理と終了（ログアウト）処理は無視する<br />
&nbsp;&nbsp;field exclusion-methods:{Array-of String} =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{Array-of String}<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;"lightning-service"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||プログレスバー処理を行う対象のメソッドかどうかを調べる<br />
&nbsp;&nbsp;||アプリケーション終了時にはサブアプレットの生成ができないので、<br />
&nbsp;&nbsp;||終了時のログアウトだけ、プログレスバーを表示しない<br />
&nbsp;&nbsp;|| また、共通機能からの通信 find-mst-info、find-base-date-info についても表示しない<br />
&nbsp;&nbsp;{method {get-progress-method?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methos-name:String ,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arguments:#FastArray<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}:bool<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {self.exclusion-methods.find methos-name} &gt; -1 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return false}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if {self.get-common? arguments} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return false}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return true}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;{constructor public {default<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client-filter:{proc-type {AbstractClient}:bool} =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{fn client =&gt; true}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{construct-super client-filter = client-filter}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||&nbsp;&nbsp;handle-before-request　：メソッド実行前の処理を定義できます。<br />
&nbsp;&nbsp;{method protected open {handle-before-request <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;http-request-headers:#HttpRequestHeaders,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;orb-request-hearders:#HashTable,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;method:Method,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;arguments:#FastArray<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}:(http-request-headers:#HttpRequestHeaders, orb-request-headers:#HashTable)<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {self.get-progress-method? method.name, arguments} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ProgressView.setup<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "サーバ処理",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer = "サーバ処理中です．．．"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{self.print&nbsp;&nbsp;"[START] " &amp; method.defining-class.name &amp; "." &amp; method.name }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if-non-null args = arguments then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for arg in args do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if not {self.get-common? arguments} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "INPUT-DTO = " &amp; {String {type-of arg}}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def (ret-http-request-headers:#HttpRequestHeaders, ret-orb-request-headers:#HashTable) =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{super.handle-before-request<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http-request-headers,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orb-request-hearders,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method ,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arguments<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return ret-http-request-headers, ret-orb-request-headers}<br />
&nbsp;&nbsp;}<br />
<br />
<br />
<br />
&nbsp;&nbsp;||&nbsp;&nbsp;handle-after-response　：メソッド実行後の処理を定義できます。<br />
&nbsp;&nbsp;{method protected open {handle-after-response<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;header:#HttpResponseHeaders,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;map:#{HashTable-of any, any},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;method:Method,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;arguments:#{FastArray-of any},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return-value:any}:(#HttpResponseHeaders, #{HashTable-of any, any})<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {self.get-progress-method? method.name, arguments} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ProgressView.destroy}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{self.print&nbsp;&nbsp;"[END] " &amp; method.defining-class.name &amp; "." &amp; method.name }<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return {super.handle-after-response header, map, method, arguments,return-value }}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||&nbsp;&nbsp;handle-exception　：例外発生時の処理を定義できます。<br />
&nbsp;&nbsp;{method protected open {handle-exception ||throw-advice<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;method:Method,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;arguments:#FastArray,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;exception:Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;||{if {self.get-progress-method? method.name} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ProgressView.destroy}<br />
&nbsp;&nbsp;&nbsp;&nbsp;||}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{self.print "[ERROR] " &amp; method.defining-class.name &amp; "." &amp; method.name}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{type-switch exception<br />
 &nbsp;&nbsp;&nbsp;&nbsp;case rae:RemoteApplicationException do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "[ERROR-MESSAGE] " &amp; rae.remote-error.message-id &amp; ":" &amp; rae.remote-error.message}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;case rse:RemoteSystemException do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "[ERROR-MESSAGE] " &amp; rse.remote-error.message-id &amp; ":" &amp; rse.remote-error.message}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "[ERROR-MESSAGE] " &amp; exception.message &amp; ":" &amp; {type-of exception}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;||システム例外が、アプリケーション処理継続不能な処理の場合、<br />
&nbsp;&nbsp;&nbsp;&nbsp;||共通的に処理する<br />
&nbsp;&nbsp;&nbsp;&nbsp;{type-switch exception<br />
 &nbsp;&nbsp;&nbsp;&nbsp;case re:RemoteSystemException do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if-non-null re.remote-error, message-id = re.remote-error.message-id&nbsp;&nbsp;then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||タイムアウト、バッチ実行中の処理判断の検討結果に合わせて変更<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{switch message-id<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;case SERVER-ERROR-CODE-EXECUTING-BATCH do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{popup-message "バッチ実行中のためサーバアクセスが拒否されました。&#92;nアプリケーションを終了します。"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "バッチ実行中のためユーザー確認後、アプリケーション終了"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{exit}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;SERVER-ERROR-CODE-TIMEOUT do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{popup-message<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"タイムアウトしました。&#92;nアプリケーションを終了します。"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "タイムアウトのためユーザーがアプリケーション終了を判断"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{exit}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{super.handle-exception method, arguments, exception}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||&nbsp;&nbsp;register-interceptor　：Interceptor登録時の処理を定義できます。<br />
&nbsp;&nbsp;{method protected open {register-interceptor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;client:AbstractClient<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{super.register-interceptor client}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;|| -- private --<br />
&nbsp;&nbsp;{method private {print str:String}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{output-log-info "[SERVICE] " &amp; str}<br />
&nbsp;&nbsp;}<br />
<br />
}<br />
<br />
||インターセプターの登録<br />
{register-orb-interceptors<br />
&nbsp;&nbsp;&nbsp;&nbsp;{InitializeServiceInterceptor}<br />
}<br />
<br />
<br />
||プログレスビューとして表示する画面<br />
{import * from CURL.ENGINE.BROWSER}<br />
{def package splash-screen-applet-source:String =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{stringify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{curl 8.0 applet}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{import * from CURL.ENGINE.BROWSER}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{define-class public CustomSplashScreenSubApplet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{inherits SplashScreenSubApplet}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{constructor public {default}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{construct-super}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set self.footer-frame.font-size = 11pt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{method public open {create-main-body}:Graphic<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def vb =&nbsp;&nbsp;{VBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size = 11pt,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width=4in,&nbsp;&nbsp;spacing = 3pt, margin = 4pt,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = 0.7in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-width = 1pt,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-color = "black",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background = "white",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;framelike-stretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.title-frame,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.progress-bar-frame,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.footer-frame,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||透明度を設定する<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on AttachEvent at vb:VBox do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def view = vb.parent.parent asa View<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{view.set-opacity 0.7 asa float}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{vb.add-event-handler<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{context-popup<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu-pane={MenuPane<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{MenuAction<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label="閉じる",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{exit}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vb<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{after 0s do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CustomSplashScreenSubApplet}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
||<br />
{define-class public ProgressView<br />
<br />
&nbsp;&nbsp;||このパラメータが true の間は、別のプログレスビューを表示したり、閉じたりしない<br />
&nbsp;&nbsp;||複数のサービスをfor文で呼ぶ場合などで、その処理全体の時間中にプログレスビューを表示したい場合に利用してください。<br />
&nbsp;&nbsp;||{with} マクロを使ってこのフラグを true に設定することを強くお勧めします。<br />
&nbsp;&nbsp;let public ignore?:bool = false<br />
<br />
&nbsp;&nbsp;||プログレスバーが表示されているかどうかを保持する変数<br />
&nbsp;&nbsp;let private show?:bool = false<br />
<br />
<br />
&nbsp;&nbsp;{define-proc public {set-progress-bar-indeterminate}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-progress-bar-indeterminate}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;{define-proc public {set-progress-bar-value val:double}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-progress-bar-value val}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;{define-proc public {set-progress-bar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min:double = 0.0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max:double = 100.0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value:double = min}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-progress-bar min = min, max = max, value = value}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;{define-proc public {show}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if not ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.show}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set ProgressView.show? = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;{define-proc public {setup<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title:String = "お待ちください",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer:String = "処理の終了を待っています ...",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-url:#Url = null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:Distance = 0m,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height:Distance = 0m,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;splash-applet-url:#Url =&nbsp;&nbsp;{string-url splash-screen-applet-source},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay:Time = .3s<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ProgressView.destroy}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if not ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.setup<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = title,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer = footer,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-url = image-url,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = height,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;splash-applet-url = splash-applet-url,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay = delay<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-progress-bar-indeterminate}<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;catch e:Exception do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set ProgressView.show? = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;{define-proc public {set-footer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer:String,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halign:any = "left",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-family:String =&nbsp;&nbsp;"MS Gothic",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:Distance = 0m,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-weight:any = null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:String = "black"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-footer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halign = halign,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-family = font-family,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size = font-size,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-weight = font-weight,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color = color<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;{define-proc public {destroy}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.destroy}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;catch e:Exception do<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;set ProgressView.show? = false<br />
&nbsp;&nbsp;}<br />
<br />
}</code></div></div>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　実行時間の短いサービスでは、SplashScreen を利用するな</span><br />
<br />
<br />
現在、ORBを利用したサービス呼び出しを連続で行うと、<br />
結果の返却順番が入れ替わってしまう、という問題が起きています。<br />
<br />
■プログラムの前提<br />
　１．サービス名：税計算サービス<br />
　　日付と区分を引数に、対象となる税率を返却する<br />
　２．イベントＡ．日付を表すDateField の ValueFinished で、税計算サービス（TaxService.calc-tax）を呼び出す<br />
　３．イベントＢ．区分を表す RadioFrame の ValueFinished で、税計算サービス（TaxService.calc-tax）を呼び出す<br />
　４．税計算サービスの実行結果を、税率フィールドに表示する<br />
<br />
■引数と結果の組み合わせ例<br />
　　日付：2010、区分：消費税　結果：5％<br />
　　日付：2014、区分：消費税　結果：8％<br />
　　日付：2010、区分：外貨　　結果：0％<br />
　　日付：2014、区分：外貨　　結果：0％<br />
<br />
■操作手順<br />
　①DateField の日付を2010年から、2014年に変更する<br />
　　（フォーカスアウト等はしていないのでValueFinishedは未発生）<br />
　②RadioFrame のラジオボタンを、消費税から、外貨に変更する<br />
　　（この段階で、DateFieldのValueFinished が発生、次に、RadioFrame のValueFinished が発生する）<br />
<br />
■結果<br />
　5回に１回くらいの割合で、税率フィールドに8％と表示される<br />
　※１：上記操作の結果、画面上は「日付：2014、区分：外貨」となっているのにもかかわらず、<br />
　　　　「日付：2014、区分：消費税」（ラジオボタンの変更前の状態）の結果がセットされる<br />
　※２：税率フィールドには、一瞬「0％」と表示されたのち、「8％」が表示される<br />
<br />
<br />
100%発生するわけではなく、ある程度の割合で発生するので、<br />
明確な原因は不明なのですが、サービス呼び出しの箇所にログを仕掛けたところ、<br />
下記のような処理の順番になっていることがわかりました。<br />
<br />
■処理順<br />
　①DateField の ValueFinished イベントで calc-tax が呼び出される<br />
　②RadioFrame の ValueFinished イベントで calc-pay-pln-dt が呼び出される<br />
　　（本来であれば、①の結果を返却してから、サービスが呼ばれるべき！）<br />
　③②の結果が返却される<br />
　④①の結果が返却される<br />
　　（順番が入れ替わることで、不正な結果となってしまう）<br />
<br />
これは、DateField のValueFinished で呼び出されたサービスの結果が返却される前に、<br />
RadioFrame のValueFinished イベントが割り込んでいるように見えます。<br />
<br />
dispatch-events を記述することでこのような問題が発生する可能性がありますが、<br />
プログラムには、dispathc-events は記述していません。<br />
<br />
そこで怪しいと思ったのが、「SplashScreen」です。<br />
<br />
<br />
現在、サービスの呼び出し時に、下記のようなインタセプタを設定しています。<br />
内容としては、サービス呼び出し時（handle-before-request）に SplashScreen を表示して、<br />
サービス実行後（handle-after-response）に、SplashScreenを閉じる、という処理になっています。<br />
<br />
このサービス呼び出し時の処理のなかで、対象のサービスの場合だけ、SplashScreenを表示しない、<br />
という処理を入れると、この問題は再現しなくなりました。<br />
<br />
SplashScreen のコードはOPEN-CONTROLS にもないので、確実なことは言えませんが、<br />
もしかすると、SplashScreen.setup の内部でdispatch-events のような処理が実行されており、<br />
そのため、DateField とRadioButton のValueFinished イベント割り込みが発生しているのではないか、<br />
と私は判断しています。<br />
<br />
同様の問題が発生している環境があれば、この辺りを疑ってみるとよいかも知れません。<br />
<br />
もし詳しい方がいらっしゃれば情報提供いただけるとありがたいです。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>||サービスコール時に、プログラムIDが指定されているかどうかを判断するインタセプタ<br />
{define-class public InitializeServiceInterceptor {inherits ClientInterceptor}<br />
<br />
&nbsp;&nbsp;||プログレスバーの表示を無視するサービスの一覧<br />
&nbsp;&nbsp;||　共通処理と終了（ログアウト）処理は無視する<br />
&nbsp;&nbsp;field exclusion-methods:{Array-of String} =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{Array-of String}<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;"lightning-service"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||プログレスバー処理を行う対象のメソッドかどうかを調べる<br />
&nbsp;&nbsp;||アプリケーション終了時にはサブアプレットの生成ができないので、<br />
&nbsp;&nbsp;||終了時のログアウトだけ、プログレスバーを表示しない<br />
&nbsp;&nbsp;|| また、共通機能からの通信 find-mst-info、find-base-date-info についても表示しない<br />
&nbsp;&nbsp;{method {get-progress-method?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methos-name:String ,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arguments:#FastArray<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}:bool<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {self.exclusion-methods.find methos-name} &gt; -1 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return false}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if {self.get-common? arguments} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return false}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return true}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;{constructor public {default<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client-filter:{proc-type {AbstractClient}:bool} =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{fn client =&gt; true}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{construct-super client-filter = client-filter}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||&nbsp;&nbsp;handle-before-request　：メソッド実行前の処理を定義できます。<br />
&nbsp;&nbsp;{method protected open {handle-before-request <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;http-request-headers:#HttpRequestHeaders,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;orb-request-hearders:#HashTable,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;method:Method,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;arguments:#FastArray<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}:(http-request-headers:#HttpRequestHeaders, orb-request-headers:#HashTable)<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {self.get-progress-method? method.name, arguments} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ProgressView.setup<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "サーバ処理",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer = "サーバ処理中です．．．"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{self.print&nbsp;&nbsp;"[START] " &amp; method.defining-class.name &amp; "." &amp; method.name }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if-non-null args = arguments then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for arg in args do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if not {self.get-common? arguments} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "INPUT-DTO = " &amp; {String {type-of arg}}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def (ret-http-request-headers:#HttpRequestHeaders, ret-orb-request-headers:#HashTable) =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{super.handle-before-request<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http-request-headers,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orb-request-hearders,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method ,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arguments<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return ret-http-request-headers, ret-orb-request-headers}<br />
&nbsp;&nbsp;}<br />
<br />
<br />
<br />
&nbsp;&nbsp;||&nbsp;&nbsp;handle-after-response　：メソッド実行後の処理を定義できます。<br />
&nbsp;&nbsp;{method protected open {handle-after-response<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;header:#HttpResponseHeaders,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;map:#{HashTable-of any, any},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;method:Method,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;arguments:#{FastArray-of any},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return-value:any}:(#HttpResponseHeaders, #{HashTable-of any, any})<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {self.get-progress-method? method.name, arguments} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ProgressView.destroy}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{self.print&nbsp;&nbsp;"[END] " &amp; method.defining-class.name &amp; "." &amp; method.name }<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return {super.handle-after-response header, map, method, arguments,return-value }}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||&nbsp;&nbsp;handle-exception　：例外発生時の処理を定義できます。<br />
&nbsp;&nbsp;{method protected open {handle-exception ||throw-advice<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;method:Method,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;arguments:#FastArray,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;exception:Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;||{if {self.get-progress-method? method.name} then<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ProgressView.destroy}<br />
&nbsp;&nbsp;&nbsp;&nbsp;||}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{self.print "[ERROR] " &amp; method.defining-class.name &amp; "." &amp; method.name}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{type-switch exception<br />
 &nbsp;&nbsp;&nbsp;&nbsp;case rae:RemoteApplicationException do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "[ERROR-MESSAGE] " &amp; rae.remote-error.message-id &amp; ":" &amp; rae.remote-error.message}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;case rse:RemoteSystemException do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "[ERROR-MESSAGE] " &amp; rse.remote-error.message-id &amp; ":" &amp; rse.remote-error.message}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "[ERROR-MESSAGE] " &amp; exception.message &amp; ":" &amp; {type-of exception}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;||システム例外が、アプリケーション処理継続不能な処理の場合、<br />
&nbsp;&nbsp;&nbsp;&nbsp;||共通的に処理する<br />
&nbsp;&nbsp;&nbsp;&nbsp;{type-switch exception<br />
 &nbsp;&nbsp;&nbsp;&nbsp;case re:RemoteSystemException do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if-non-null re.remote-error, message-id = re.remote-error.message-id&nbsp;&nbsp;then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||タイムアウト、バッチ実行中の処理判断の検討結果に合わせて変更<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{switch message-id<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;case SERVER-ERROR-CODE-EXECUTING-BATCH do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{popup-message "バッチ実行中のためサーバアクセスが拒否されました。&#92;nアプリケーションを終了します。"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "バッチ実行中のためユーザー確認後、アプリケーション終了"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{exit}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;SERVER-ERROR-CODE-TIMEOUT do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{popup-message<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"タイムアウトしました。&#92;nアプリケーションを終了します。"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.print "タイムアウトのためユーザーがアプリケーション終了を判断"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{exit}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{super.handle-exception method, arguments, exception}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||&nbsp;&nbsp;register-interceptor　：Interceptor登録時の処理を定義できます。<br />
&nbsp;&nbsp;{method protected open {register-interceptor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;client:AbstractClient<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{super.register-interceptor client}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;|| -- private --<br />
&nbsp;&nbsp;{method private {print str:String}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{output-log-info "[SERVICE] " &amp; str}<br />
&nbsp;&nbsp;}<br />
<br />
}<br />
<br />
||インターセプターの登録<br />
{register-orb-interceptors<br />
&nbsp;&nbsp;&nbsp;&nbsp;{InitializeServiceInterceptor}<br />
}<br />
<br />
<br />
||プログレスビューとして表示する画面<br />
{import * from CURL.ENGINE.BROWSER}<br />
{def package splash-screen-applet-source:String =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{stringify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{curl 8.0 applet}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{import * from CURL.ENGINE.BROWSER}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{define-class public CustomSplashScreenSubApplet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{inherits SplashScreenSubApplet}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{constructor public {default}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{construct-super}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set self.footer-frame.font-size = 11pt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{method public open {create-main-body}:Graphic<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def vb =&nbsp;&nbsp;{VBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size = 11pt,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width=4in,&nbsp;&nbsp;spacing = 3pt, margin = 4pt,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = 0.7in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-width = 1pt,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-color = "black",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background = "white",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;framelike-stretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.title-frame,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.progress-bar-frame,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.footer-frame,<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||透明度を設定する<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on AttachEvent at vb:VBox do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def view = vb.parent.parent asa View<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{view.set-opacity 0.7 asa float}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{vb.add-event-handler<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{context-popup<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu-pane={MenuPane<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{MenuAction<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label="閉じる",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{exit}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vb<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{after 0s do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CustomSplashScreenSubApplet}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
||<br />
{define-class public ProgressView<br />
<br />
&nbsp;&nbsp;||このパラメータが true の間は、別のプログレスビューを表示したり、閉じたりしない<br />
&nbsp;&nbsp;||複数のサービスをfor文で呼ぶ場合などで、その処理全体の時間中にプログレスビューを表示したい場合に利用してください。<br />
&nbsp;&nbsp;||{with} マクロを使ってこのフラグを true に設定することを強くお勧めします。<br />
&nbsp;&nbsp;let public ignore?:bool = false<br />
<br />
&nbsp;&nbsp;||プログレスバーが表示されているかどうかを保持する変数<br />
&nbsp;&nbsp;let private show?:bool = false<br />
<br />
<br />
&nbsp;&nbsp;{define-proc public {set-progress-bar-indeterminate}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-progress-bar-indeterminate}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;{define-proc public {set-progress-bar-value val:double}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-progress-bar-value val}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;{define-proc public {set-progress-bar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min:double = 0.0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max:double = 100.0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value:double = min}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-progress-bar min = min, max = max, value = value}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;{define-proc public {show}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if not ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.show}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set ProgressView.show? = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;{define-proc public {setup<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title:String = "お待ちください",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer:String = "処理の終了を待っています ...",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-url:#Url = null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:Distance = 0m,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height:Distance = 0m,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;splash-applet-url:#Url =&nbsp;&nbsp;{string-url splash-screen-applet-source},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay:Time = .3s<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{ProgressView.destroy}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if not ProgressView.show? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.setup<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = title,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer = footer,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-url = image-url,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = height,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;splash-applet-url = splash-applet-url,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay = delay<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-progress-bar-indeterminate}<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;catch e:Exception do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set ProgressView.show? = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;{define-proc public {set-footer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer:String,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halign:any = "left",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-family:String =&nbsp;&nbsp;"MS Gothic",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:Distance = 0m,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-weight:any = null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:String = "black"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.set-footer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;footer,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halign = halign,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-family = font-family,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size = font-size,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-weight = font-weight,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color = color<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;{define-proc public {destroy}:void<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {this-class}.ignore? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SplashScreen.destroy}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;catch e:Exception do<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;set ProgressView.show? = false<br />
&nbsp;&nbsp;}<br />
<br />
}</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ SQLステートメントとパラメータを組み合わせて実行可能なSQLを整形する]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1096</link>
			<pubDate>Thu, 03 Jul 2014 09:57:52 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1096</guid>
			<description><![CDATA[私は、サーバの開発で iBatis を利用することが多いのですが、<br />
log4j を利用することで、SQLのステートメントとパラメータの両方が、<br />
出力されるようになっています。<br />
<br />
■出力例<br />
yyyy-mm-dd hh:mm<img src="https://communities.curl.com/images/smilies/confused.gif" alt="Confused" title="Confused" class="smilie smilie_13" />s,mmm DEBUG [java.sql.Connection] [http-8080-2] [********************] - {conn-NNNNNNN} Preparing Statement: SELECT * FROM EMP_MST WHERE EMP_CD = '?'<br />
yyyy-mm-dd hh:mm<img src="https://communities.curl.com/images/smilies/confused.gif" alt="Confused" title="Confused" class="smilie smilie_13" />s,mmm DEBUG [java.sql.PreparedStatement] [http-8080-2] [*******************] - {pstm-NNNNNN} Parameters: [A0001]<br />
<br />
テストの際などに、サーバ処理の中で利用されたSQLを、<br />
改めて、DBに対して直接投げてみたい、ということがよくあります。<br />
そのためには、このステートメントとパラメータを組み合わせてSQLを作り直す必要があるのですが、<br />
パラメータ数が多いといちいち「?」を置換して整形するのが面倒なので、<br />
下記のようなサンプルで組み立てるようにしています。<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>{curl 8.0 applet}<br />
{curl-file-attributes character-encoding = "utf8"}<br />
{import * from CURL.DESKTOP.CLIPBOARD}<br />
{def sql-ta:TextArea =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{TextArea<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||width = {make-elastic preferred-size = 1in},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = {make-elastic preferred-size = 1in}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
{def param-ta:TextArea =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{TextArea<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||width = 7in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = {make-elastic preferred-size = 0.5in}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
{def comp-ta:TextArea =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{TextArea<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||width = 7in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = {make-elastic preferred-size = 0.5in}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
{define-proc {get-type-list<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;index:int,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;val:String,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;params:StringArray<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}:DropdownList<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■CHAR<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■NUMBER<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■VARCHAR2<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■TIMESTAMP<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■DATE<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def dl =&nbsp;&nbsp;{DropdownList<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name = val,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user-data = index,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"文字列",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"数値",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on ValueChanged at dl:DropdownList do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{switch dl.value<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;"文字列" do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set params[dl.user-data asa int] = "&#92;'" &amp; {dl.name.trim-clone} &amp;&nbsp;&nbsp;"&#92;'"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set params[dl.user-data asa int] = {dl.name.trim-clone} asa String<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {String {val.to-int}} == val then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{dl.set-value-with-events "数値"}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;elseif&nbsp;&nbsp;{String {val.to-double}} == val then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{dl.set-value-with-events "数値"}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{dl.set-value-with-events "文字列"}<br />
2014-07-03 16:24:18.554999&nbsp;&nbsp; START:会計年月日　値確定<br />
2014-07-03 16:24:18.563000&nbsp;&nbsp;DATE&nbsp;&nbsp;20140413<br />
2014-07-03 16:24:18.570000&nbsp;&nbsp;PAY-DV&nbsp;&nbsp;1<br />
[info] #2014/07/03 16:24:18.579# - [SERVICE] [START] DisPayPlnDtService.calc-pay-pln-dt<br />
[info] #2014/07/03 16:24:18.582# - [SERVICE] INPUT-DTO = DisInCalcPayPlnDtDto<br />
[info] #2014/07/03 16:24:18.582# - [SERVICE] PROGRAM-ID = SCRD2010<br />
2014-07-03 16:24:18.746000&nbsp;&nbsp; START:支払区分　値確定<br />
2014-07-03 16:24:18.848000&nbsp;&nbsp;DATE&nbsp;&nbsp;20140703<br />
2014-07-03 16:24:18.848000&nbsp;&nbsp;PAY-DV&nbsp;&nbsp;3<br />
[info] #2014/07/03 16:24:18.850# - [SERVICE] [START] DisPayPlnDtService.calc-pay-pln-dt<br />
[info] #2014/07/03 16:24:18.850# - [SERVICE] INPUT-DTO = DisInCalcPayPlnDtDto<br />
[info] #2014/07/03 16:24:18.850# - [SERVICE] PROGRAM-ID = SCRD2010<br />
[info] #2014/07/03 16:24:18.932# - [SERVICE] [END] DisPayPlnDtService.calc-pay-pln-dt<br />
2014-07-03 16:24:18.933999&nbsp;&nbsp; END:支払区分　値確定<br />
[info] #2014/07/03 16:24:19.055# - [SERVICE] [END] DisPayPlnDtService.calc-pay-pln-dt<br />
2014-07-03 16:24:19.065000&nbsp;&nbsp; END:会計年月日　値確定<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return dl}<br />
}<br />
<br />
{def type-tbl =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{Table<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||height = {make-elastic preferred-size = 1pt},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||valign = "top",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columns = 4}<br />
}<br />
<br />
<br />
{def formed-params-by-type:StringArray = {StringArray}}<br />
<br />
{def parse-cb =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "解析",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.clear}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{formed-params-by-type.clear}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add "No."}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add "Column"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add "Value"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add "Type"}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def split-sql = {sql-ta.value.split split-chars = '?'}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def params = {param-ta.value.split split-chars = ','}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for s in params do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{formed-params-by-type.append {s.trim-clone}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for s key index:int in params do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let col:String = ""<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def tmp-ary = {split-sql[index].split}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||カラム名を探すため、まず。後ろから = を探す<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def find-equal-index =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{tmp-ary.find "=", search-direction = SearchDirection.backward}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if find-equal-index &gt; -1 then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def find-column-index =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{tmp-ary.find<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||空白では「ない」ものを検索<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equality-proc = {proc {s1:String, s2:String}:bool<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if s1 == s2 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return false}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return true}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starting-index = find-equal-index - 1,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search-direction = SearchDirection.backward}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if find-column-index&gt; -1 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set col = tmp-ary[find-column-index]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add index + 1}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add col}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add s}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add {get-type-list index, s, formed-params-by-type }}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
{def replace-cb =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label= "置換",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if not sql-ta.value.empty? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def split-sql = {sql-ta.value.split split-chars = '?'}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let comp-sql:String = ""<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for s key index:int in formed-params-by-type do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set comp-sql = comp-sql &amp; split-sql[index]&nbsp;&nbsp;&amp; s<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set comp-sql = comp-sql &amp; split-sql[split-sql.size - 1]<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set comp-ta.value = comp-sql<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
{def copy-cb =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label= "クリップボードへコピー",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def clip = {Clipboard.get-system-clipboard }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{clip.set-string comp-ta.value }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
<br />
{View<br />
&nbsp;&nbsp;&nbsp;&nbsp;title = "SQL解析",<br />
&nbsp;&nbsp;&nbsp;&nbsp;height = 8in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;width&nbsp;&nbsp;= 8in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| この{Frame}を置き換えて使用してください<br />
&nbsp;&nbsp;&nbsp;&nbsp;{Frame<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{VBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halign = "center",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin = 5pt, spacing = 3pt,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{GroupBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "■SQL Templete",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql-ta<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{HBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{GroupBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "■Parameter",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param-ta<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{GroupBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "■Type Select",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ScrollBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{VBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true, type-tbl, {Fill}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{HBox spacing = 5pt, parse-cb, replace-cb, copy-cb},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{GroupBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "■Executable SQL",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp-ta<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;visibility = "normal",<br />
&nbsp;&nbsp;&nbsp;&nbsp;{on WindowClose do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{exit}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code></div></div><br />
<br />
■使い方<br />
①「SQL Templete」のテキストエリアにステートメントを張り付ける<br />
②「Parameter」のテキストエリアにパラメータを張り付ける<br />
③「解析」ボタンを押す<br />
④必要に応じて「Type Select」に表示される型と値の組み合わせを修正する<br />
⑤「置換」ボタンを押して、ステートメントとパラメータを整形します<br />
⑥「Executable SQL」に出力されたSQLを利用する<br />
　（「クリップボードへコピー」ボタンでコピー可能）<br />
<br />
<br />
もしかすると、SQL Developer などのツールであれば、<br />
もっとうまくやってくれる機能がありそうな気もしますが・・・。<br />
<br />
]]></description>
			<content:encoded><![CDATA[私は、サーバの開発で iBatis を利用することが多いのですが、<br />
log4j を利用することで、SQLのステートメントとパラメータの両方が、<br />
出力されるようになっています。<br />
<br />
■出力例<br />
yyyy-mm-dd hh:mm<img src="https://communities.curl.com/images/smilies/confused.gif" alt="Confused" title="Confused" class="smilie smilie_13" />s,mmm DEBUG [java.sql.Connection] [http-8080-2] [********************] - {conn-NNNNNNN} Preparing Statement: SELECT * FROM EMP_MST WHERE EMP_CD = '?'<br />
yyyy-mm-dd hh:mm<img src="https://communities.curl.com/images/smilies/confused.gif" alt="Confused" title="Confused" class="smilie smilie_13" />s,mmm DEBUG [java.sql.PreparedStatement] [http-8080-2] [*******************] - {pstm-NNNNNN} Parameters: [A0001]<br />
<br />
テストの際などに、サーバ処理の中で利用されたSQLを、<br />
改めて、DBに対して直接投げてみたい、ということがよくあります。<br />
そのためには、このステートメントとパラメータを組み合わせてSQLを作り直す必要があるのですが、<br />
パラメータ数が多いといちいち「?」を置換して整形するのが面倒なので、<br />
下記のようなサンプルで組み立てるようにしています。<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>{curl 8.0 applet}<br />
{curl-file-attributes character-encoding = "utf8"}<br />
{import * from CURL.DESKTOP.CLIPBOARD}<br />
{def sql-ta:TextArea =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{TextArea<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||width = {make-elastic preferred-size = 1in},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = {make-elastic preferred-size = 1in}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
{def param-ta:TextArea =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{TextArea<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||width = 7in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = {make-elastic preferred-size = 0.5in}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
{def comp-ta:TextArea =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{TextArea<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||width = 7in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = {make-elastic preferred-size = 0.5in}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
{define-proc {get-type-list<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;index:int,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;val:String,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;params:StringArray<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}:DropdownList<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■CHAR<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■NUMBER<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■VARCHAR2<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■TIMESTAMP<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| ■DATE<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def dl =&nbsp;&nbsp;{DropdownList<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name = val,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user-data = index,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"文字列",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"数値",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on ValueChanged at dl:DropdownList do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{switch dl.value<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;"文字列" do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set params[dl.user-data asa int] = "&#92;'" &amp; {dl.name.trim-clone} &amp;&nbsp;&nbsp;"&#92;'"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set params[dl.user-data asa int] = {dl.name.trim-clone} asa String<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{if {String {val.to-int}} == val then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{dl.set-value-with-events "数値"}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;elseif&nbsp;&nbsp;{String {val.to-double}} == val then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{dl.set-value-with-events "数値"}<br />
 &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{dl.set-value-with-events "文字列"}<br />
2014-07-03 16:24:18.554999&nbsp;&nbsp; START:会計年月日　値確定<br />
2014-07-03 16:24:18.563000&nbsp;&nbsp;DATE&nbsp;&nbsp;20140413<br />
2014-07-03 16:24:18.570000&nbsp;&nbsp;PAY-DV&nbsp;&nbsp;1<br />
[info] #2014/07/03 16:24:18.579# - [SERVICE] [START] DisPayPlnDtService.calc-pay-pln-dt<br />
[info] #2014/07/03 16:24:18.582# - [SERVICE] INPUT-DTO = DisInCalcPayPlnDtDto<br />
[info] #2014/07/03 16:24:18.582# - [SERVICE] PROGRAM-ID = SCRD2010<br />
2014-07-03 16:24:18.746000&nbsp;&nbsp; START:支払区分　値確定<br />
2014-07-03 16:24:18.848000&nbsp;&nbsp;DATE&nbsp;&nbsp;20140703<br />
2014-07-03 16:24:18.848000&nbsp;&nbsp;PAY-DV&nbsp;&nbsp;3<br />
[info] #2014/07/03 16:24:18.850# - [SERVICE] [START] DisPayPlnDtService.calc-pay-pln-dt<br />
[info] #2014/07/03 16:24:18.850# - [SERVICE] INPUT-DTO = DisInCalcPayPlnDtDto<br />
[info] #2014/07/03 16:24:18.850# - [SERVICE] PROGRAM-ID = SCRD2010<br />
[info] #2014/07/03 16:24:18.932# - [SERVICE] [END] DisPayPlnDtService.calc-pay-pln-dt<br />
2014-07-03 16:24:18.933999&nbsp;&nbsp; END:支払区分　値確定<br />
[info] #2014/07/03 16:24:19.055# - [SERVICE] [END] DisPayPlnDtService.calc-pay-pln-dt<br />
2014-07-03 16:24:19.065000&nbsp;&nbsp; END:会計年月日　値確定<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return dl}<br />
}<br />
<br />
{def type-tbl =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{Table<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||height = {make-elastic preferred-size = 1pt},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||valign = "top",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columns = 4}<br />
}<br />
<br />
<br />
{def formed-params-by-type:StringArray = {StringArray}}<br />
<br />
{def parse-cb =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "解析",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.clear}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{formed-params-by-type.clear}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add "No."}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add "Column"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add "Value"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add "Type"}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def split-sql = {sql-ta.value.split split-chars = '?'}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def params = {param-ta.value.split split-chars = ','}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for s in params do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{formed-params-by-type.append {s.trim-clone}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for s key index:int in params do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let col:String = ""<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def tmp-ary = {split-sql[index].split}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||カラム名を探すため、まず。後ろから = を探す<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def find-equal-index =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{tmp-ary.find "=", search-direction = SearchDirection.backward}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if find-equal-index &gt; -1 then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def find-column-index =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{tmp-ary.find<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||空白では「ない」ものを検索<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equality-proc = {proc {s1:String, s2:String}:bool<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if s1 == s2 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return false}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{return true}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starting-index = find-equal-index - 1,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search-direction = SearchDirection.backward}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if find-column-index&gt; -1 then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set col = tmp-ary[find-column-index]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add index + 1}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add col}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add s}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{type-tbl.add {get-type-list index, s, formed-params-by-type }}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
{def replace-cb =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label= "置換",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if not sql-ta.value.empty? then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def split-sql = {sql-ta.value.split split-chars = '?'}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let comp-sql:String = ""<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for s key index:int in formed-params-by-type do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set comp-sql = comp-sql &amp; split-sql[index]&nbsp;&nbsp;&amp; s<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set comp-sql = comp-sql &amp; split-sql[split-sql.size - 1]<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set comp-ta.value = comp-sql<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
{def copy-cb =<br />
&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label= "クリップボードへコピー",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def clip = {Clipboard.get-system-clipboard }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{clip.set-string comp-ta.value }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
<br />
{View<br />
&nbsp;&nbsp;&nbsp;&nbsp;title = "SQL解析",<br />
&nbsp;&nbsp;&nbsp;&nbsp;height = 8in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;width&nbsp;&nbsp;= 8in,<br />
&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;|| この{Frame}を置き換えて使用してください<br />
&nbsp;&nbsp;&nbsp;&nbsp;{Frame<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{VBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halign = "center",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin = 5pt, spacing = 3pt,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{GroupBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "■SQL Templete",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql-ta<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{HBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{GroupBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "■Parameter",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param-ta<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{GroupBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "■Type Select",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ScrollBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vstretch? = true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{VBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hstretch? = true, type-tbl, {Fill}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{HBox spacing = 5pt, parse-cb, replace-cb, copy-cb},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{GroupBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "■Executable SQL",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp-ta<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;visibility = "normal",<br />
&nbsp;&nbsp;&nbsp;&nbsp;{on WindowClose do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{exit}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</code></div></div><br />
<br />
■使い方<br />
①「SQL Templete」のテキストエリアにステートメントを張り付ける<br />
②「Parameter」のテキストエリアにパラメータを張り付ける<br />
③「解析」ボタンを押す<br />
④必要に応じて「Type Select」に表示される型と値の組み合わせを修正する<br />
⑤「置換」ボタンを押して、ステートメントとパラメータを整形します<br />
⑥「Executable SQL」に出力されたSQLを利用する<br />
　（「クリップボードへコピー」ボタンでコピー可能）<br />
<br />
<br />
もしかすると、SQL Developer などのツールであれば、<br />
もっとうまくやってくれる機能がありそうな気もしますが・・・。<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Oracle のパスワードを忘れたら]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1094</link>
			<pubDate>Thu, 19 Jun 2014 01:23:36 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1094</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　OracleにはOS認証でもログインできます<br />
　OS認証できれば、パスワード忘れてもへっちゃらです</span><br />
<br />
<br />
SYSユーザなどのパスワードを忘れてしまっても、DBサーバにログインできるのであれば、<br />
「OS認証」という機能でログインすることで、パスワードが変更できるので問題なし。<br />
いや、これも、DBを長く使っている方であれば当たり前の知識なんだろうなとは思いますが、<br />
今回初めて知ったのでメモです。<br />
<br />
■OS認証とは<br />
<a href="https://blogs.oracle.com/oracle4engineer/entry/column_howtouse_osauth" target="_blank" rel="noopener" class="mycode_url">https://blogs.oracle.com/oracle4engineer...use_osauth</a><br />
<br />
OSユーザの所属グループの設定が正しければ、<br />
下記の手順でパスワードを変更できます。<br />
<br />
①DBサーバにリモートデスクトップ等でログイン<br />
②コマンドプロンプトを立ち上げる<br />
③ログイン先のSIDを環境変数「ORACLE_SID」にセット<br />
　set ORACLE_SID=[対象のSID]　※１<br />
④SQLPLUSコマンド実行<br />
　sqlplus /nolog<br />
⑤OS認証でログイン<br />
　conn / as sysdba<br />
⑥SYSユーザのパスワードを変更<br />
　ALTER USER SYS IDENTIFIED BY [new_password] ;<br />
<br />
※１<br />
「ORACLE_SID」はレジストリに登録されているキーで、<br />
単純にOS認証でログインすると、このキーに登録されているSIDにログインしてしまう。<br />
値は、最後に作成したSIDが入っているっぽい。<br />
そのため、SQLPLUSに入るまえに、ログインしたいIDを、<br />
setを使って環境変数に一時登録しておくことで、自動的に対象インスタンスにログインできる。<br />
<br />
⑥の前に、select * from v&#36;instance; でログイン先のSID名が正しいか確認すると、安全。]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　OracleにはOS認証でもログインできます<br />
　OS認証できれば、パスワード忘れてもへっちゃらです</span><br />
<br />
<br />
SYSユーザなどのパスワードを忘れてしまっても、DBサーバにログインできるのであれば、<br />
「OS認証」という機能でログインすることで、パスワードが変更できるので問題なし。<br />
いや、これも、DBを長く使っている方であれば当たり前の知識なんだろうなとは思いますが、<br />
今回初めて知ったのでメモです。<br />
<br />
■OS認証とは<br />
<a href="https://blogs.oracle.com/oracle4engineer/entry/column_howtouse_osauth" target="_blank" rel="noopener" class="mycode_url">https://blogs.oracle.com/oracle4engineer...use_osauth</a><br />
<br />
OSユーザの所属グループの設定が正しければ、<br />
下記の手順でパスワードを変更できます。<br />
<br />
①DBサーバにリモートデスクトップ等でログイン<br />
②コマンドプロンプトを立ち上げる<br />
③ログイン先のSIDを環境変数「ORACLE_SID」にセット<br />
　set ORACLE_SID=[対象のSID]　※１<br />
④SQLPLUSコマンド実行<br />
　sqlplus /nolog<br />
⑤OS認証でログイン<br />
　conn / as sysdba<br />
⑥SYSユーザのパスワードを変更<br />
　ALTER USER SYS IDENTIFIED BY [new_password] ;<br />
<br />
※１<br />
「ORACLE_SID」はレジストリに登録されているキーで、<br />
単純にOS認証でログインすると、このキーに登録されているSIDにログインしてしまう。<br />
値は、最後に作成したSIDが入っているっぽい。<br />
そのため、SQLPLUSに入るまえに、ログインしたいIDを、<br />
setを使って環境変数に一時登録しておくことで、自動的に対象インスタンスにログインできる。<br />
<br />
⑥の前に、select * from v&#36;instance; でログイン先のSID名が正しいか確認すると、安全。]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[マスタ検索フレームワーク]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1088</link>
			<pubDate>Fri, 23 May 2014 10:41:39 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1088</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　開発工数の削減には、汎用的なマスタ検索機能の提供が効果的、かも</span><br />
<br />
<br />
「某マスタから、入力したコードを条件にして検索する」というような処理は、<br />
業務システムであれば避けることはできない頻出機能です。<br />
<br />
開発方針によっては、マスタ検索も含めて、業務画面の実装に任せる、<br />
という考え方もありえると思いますが、<br />
共通部品として提供できれば、システム開発全体の工数を抑えることができるかもしれません。<br />
<br />
そんなわけで、これまでの経験をもとに、シンプルな「マスタ検索フレームワーク」を作成してみました。<br />
アプリケーション基盤として足りない機能などあれば、<br />
アドバイスいただけると嬉しいです。<br />
<br />
<br />
【基本機能】<br />
テキストフィールドと、カラム（グリッド）の両方で下記の機能を提供する<br />
<br />
・入力されたコードが対象のマスタに存在する場合、その一致するレコード情報を取得する<br />
　　　コードと名称が１対１で存在するような一般的なマスタテーブルを前提に、<br />
　　　フィールドに、マスタに存在するコードが入力されたら、名称を補完表示する機能を実装しています。<br />
・上記補完処理が成功した場合、コードを含む全カラムの情報を付属情報として保持する<br />
・補完処理実行後、補完に成功したかどうかをイベントでハンドリング可能<br />
　　　補完成功時は、イベントから付属情報を取得可能です<br />
・コード一致以外にも固定検索条件を追加設定可能<br />
・「マスタ検索ダイアログ」を表示して、一覧からコードを選択することが可能<br />
　　　　マスタ検索ダイアログは、反映先のフィールドの検索条件を引き継ぎます<br />
<br />
【グリッド用追加機能】<br />
カラム（グリッド）の場合は下記機能が追加されます<br />
・カラム単位での一括補完処理<br />
・固定検索条件以外に、レコード単位での検索条件が設定可能<br />
<br />
<br />
■サンプルの内容説明<br />
・「...」と表記されているボタンを押すと、社員マスタのコード検索ダイアログが表示されます<br />
　　一覧から任意のレコードを選択すると、フィールドにコードと名称が反映されます<br />
　　<br />
・「社員コードテキストフィールド」に U0001 と入力すると、<br />
　　社員マスタテーブルから、対応する社員情報を取得し、名称を補完表示します<br />
　　同時に、その社員が退職している（RSG_DT!=99999999）場合は、退職と表示します<br />
　　<br />
・テキストフィールドと同様に、「社員コードカラム」のいずれかのセルに U0001 と入力すると、<br />
　　同レコードの名称セルに名称を補完表示します<br />
　　退職判断についてもテキストフィールドと同様です<br />
　　<br />
・チェックボタンの「固定条件 「等級=A1」」をチェックすると、<br />
　　テキストフィールド、グリッドともに、<br />
　　役職等級（GRD_CD）がA1の社員のみ検索されるようになります<br />
　　<br />
・グリッドでは、チェックボタンの「レコードごとの条件 「部門=SCT_CDフィールドの値」」をチェックすると、<br />
　　レコードごとに「部門（条件）」カラムに入力された値を、<br />
　　部門コード（SCT_CD）の検索条件として利用します<br />
　　（DBでは、各社員に、123, 234, 999という3つの部門コードを設定しています）<br />
<br />
・「補完」ボタンを押すと、グリッドにU0001からU0013までのコードを反映し、<br />
　　全レコードに対して補完処理を一括で行います<br />
<br />
・「フィールドの付属情報取得」ボタンを押すと、「社員コードテキストフィールド」<br />
　　社員コードに関連して保持されている付属情報を一覧表示します<br />
・「選択レコードの付属情報取得」ボタンを押すと、グリッドで選択されているレコードを対象に、<br />
　　社員コードに関連して保持されている付属情報を一覧表示します<br />
<br />
・画面下部の「社員マスタテーブル全件取得」ボタンを押すと、<br />
　　社員マスタテーブルに登録されている全レコードを取得、表示します。<br />
　　カラム名は、テーブルに設定されている物理名となります<br />
<br />
<br />
サンプルでは、DBにSQLite を利用しているので、面倒なサーバ、DBの設定等は不要ですが、<br />
実際には、環境に合わせてアプリケーションサーバ、DBサーバを利用することになると思います。<br />
私が担当したプロジェクトは、サーバ側をJavaで実装し、クライアント・サーバ間の接続はCurl ORBを利用、<br />
サーバからDBへの接続はO/Rマッパの「iBatis（MyBatis）」を利用する、<br />
という環境が多かったため、同等の環境構成での利用を想定したプレームワークとなっています。<br />
<br />
今回のサンプルではチェック機能を実装してませんが、<br />
過去に投稿した、入力チェックのフレームワークと組み合わせれば、<br />
「入力したコードが、マスタに存在しなければエラーとする」といった振る舞いを実装することも可能です。<br />
<br />
　　■入力チェックのフレームワーク<br />
　　http://communities.curl.com/showthread.php?tid=1078<br />
<br />
<br />
また、今回のサンプルでは、マスタテーブル内の値と一致させる単純検索条件のみですが、<br />
SQLのフォーマットを変更することで、<br />
たとえば、部門Ａもしくは部門Ｂに所属する社員を検索する、<br />
といった複合的な条件も利用可能です。<br />
この辺りは、iBatis（MyBatis）などのO/Rマッパを利用することで効率よく開発できると思います。<br />
<br />
<br />
なお、サンプル内で利用しているSQLiteでの「社員マスタ」の操作については、<br />
前回の投稿と同じプログラムを利用しています。<br />
「社員マスタ」のテーブル情報などは、そちらを参照してください。<br />
<br />
　　■CurlでSQLite を使ってみよう<br />
　　　http://communities.curl.com/showthread.php?tid=1086<br />
<br />
<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=431" target="_blank" title="">マスタ検索.zip</a> (Size: 103.53 KB / Downloads: 964)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　開発工数の削減には、汎用的なマスタ検索機能の提供が効果的、かも</span><br />
<br />
<br />
「某マスタから、入力したコードを条件にして検索する」というような処理は、<br />
業務システムであれば避けることはできない頻出機能です。<br />
<br />
開発方針によっては、マスタ検索も含めて、業務画面の実装に任せる、<br />
という考え方もありえると思いますが、<br />
共通部品として提供できれば、システム開発全体の工数を抑えることができるかもしれません。<br />
<br />
そんなわけで、これまでの経験をもとに、シンプルな「マスタ検索フレームワーク」を作成してみました。<br />
アプリケーション基盤として足りない機能などあれば、<br />
アドバイスいただけると嬉しいです。<br />
<br />
<br />
【基本機能】<br />
テキストフィールドと、カラム（グリッド）の両方で下記の機能を提供する<br />
<br />
・入力されたコードが対象のマスタに存在する場合、その一致するレコード情報を取得する<br />
　　　コードと名称が１対１で存在するような一般的なマスタテーブルを前提に、<br />
　　　フィールドに、マスタに存在するコードが入力されたら、名称を補完表示する機能を実装しています。<br />
・上記補完処理が成功した場合、コードを含む全カラムの情報を付属情報として保持する<br />
・補完処理実行後、補完に成功したかどうかをイベントでハンドリング可能<br />
　　　補完成功時は、イベントから付属情報を取得可能です<br />
・コード一致以外にも固定検索条件を追加設定可能<br />
・「マスタ検索ダイアログ」を表示して、一覧からコードを選択することが可能<br />
　　　　マスタ検索ダイアログは、反映先のフィールドの検索条件を引き継ぎます<br />
<br />
【グリッド用追加機能】<br />
カラム（グリッド）の場合は下記機能が追加されます<br />
・カラム単位での一括補完処理<br />
・固定検索条件以外に、レコード単位での検索条件が設定可能<br />
<br />
<br />
■サンプルの内容説明<br />
・「...」と表記されているボタンを押すと、社員マスタのコード検索ダイアログが表示されます<br />
　　一覧から任意のレコードを選択すると、フィールドにコードと名称が反映されます<br />
　　<br />
・「社員コードテキストフィールド」に U0001 と入力すると、<br />
　　社員マスタテーブルから、対応する社員情報を取得し、名称を補完表示します<br />
　　同時に、その社員が退職している（RSG_DT!=99999999）場合は、退職と表示します<br />
　　<br />
・テキストフィールドと同様に、「社員コードカラム」のいずれかのセルに U0001 と入力すると、<br />
　　同レコードの名称セルに名称を補完表示します<br />
　　退職判断についてもテキストフィールドと同様です<br />
　　<br />
・チェックボタンの「固定条件 「等級=A1」」をチェックすると、<br />
　　テキストフィールド、グリッドともに、<br />
　　役職等級（GRD_CD）がA1の社員のみ検索されるようになります<br />
　　<br />
・グリッドでは、チェックボタンの「レコードごとの条件 「部門=SCT_CDフィールドの値」」をチェックすると、<br />
　　レコードごとに「部門（条件）」カラムに入力された値を、<br />
　　部門コード（SCT_CD）の検索条件として利用します<br />
　　（DBでは、各社員に、123, 234, 999という3つの部門コードを設定しています）<br />
<br />
・「補完」ボタンを押すと、グリッドにU0001からU0013までのコードを反映し、<br />
　　全レコードに対して補完処理を一括で行います<br />
<br />
・「フィールドの付属情報取得」ボタンを押すと、「社員コードテキストフィールド」<br />
　　社員コードに関連して保持されている付属情報を一覧表示します<br />
・「選択レコードの付属情報取得」ボタンを押すと、グリッドで選択されているレコードを対象に、<br />
　　社員コードに関連して保持されている付属情報を一覧表示します<br />
<br />
・画面下部の「社員マスタテーブル全件取得」ボタンを押すと、<br />
　　社員マスタテーブルに登録されている全レコードを取得、表示します。<br />
　　カラム名は、テーブルに設定されている物理名となります<br />
<br />
<br />
サンプルでは、DBにSQLite を利用しているので、面倒なサーバ、DBの設定等は不要ですが、<br />
実際には、環境に合わせてアプリケーションサーバ、DBサーバを利用することになると思います。<br />
私が担当したプロジェクトは、サーバ側をJavaで実装し、クライアント・サーバ間の接続はCurl ORBを利用、<br />
サーバからDBへの接続はO/Rマッパの「iBatis（MyBatis）」を利用する、<br />
という環境が多かったため、同等の環境構成での利用を想定したプレームワークとなっています。<br />
<br />
今回のサンプルではチェック機能を実装してませんが、<br />
過去に投稿した、入力チェックのフレームワークと組み合わせれば、<br />
「入力したコードが、マスタに存在しなければエラーとする」といった振る舞いを実装することも可能です。<br />
<br />
　　■入力チェックのフレームワーク<br />
　　http://communities.curl.com/showthread.php?tid=1078<br />
<br />
<br />
また、今回のサンプルでは、マスタテーブル内の値と一致させる単純検索条件のみですが、<br />
SQLのフォーマットを変更することで、<br />
たとえば、部門Ａもしくは部門Ｂに所属する社員を検索する、<br />
といった複合的な条件も利用可能です。<br />
この辺りは、iBatis（MyBatis）などのO/Rマッパを利用することで効率よく開発できると思います。<br />
<br />
<br />
なお、サンプル内で利用しているSQLiteでの「社員マスタ」の操作については、<br />
前回の投稿と同じプログラムを利用しています。<br />
「社員マスタ」のテーブル情報などは、そちらを参照してください。<br />
<br />
　　■CurlでSQLite を使ってみよう<br />
　　　http://communities.curl.com/showthread.php?tid=1086<br />
<br />
<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=431" target="_blank" title="">マスタ検索.zip</a> (Size: 103.53 KB / Downloads: 964)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[CurlでSQLite を使ってみよう]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1086</link>
			<pubDate>Thu, 22 May 2014 10:18:16 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1086</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　ローカルでデータベースを試したいなら SQLite を使ってみよう</span><br />
<br />
業務アプリ開発では避けて通れないのがデータベース（DB）。<br />
DBといえば、有料であればOracle、無料であればMySQL、PostgreSQL 等が有名どころですが、<br />
サーバを用意したり、接続の設定をしたり、始めるまでにはいろいろ面倒。<br />
<br />
簡単にローカル環境でいろいろ試したいなら、SQLite を利用するというのはどうでしょう。<br />
<br />
Curlであれば、SQLiteと接続するためのオープンソース「Curl Data Kit（CDK）」を使って、<br />
面倒な設定なしでSQLiteを利用できます。<br />
<br />
添付したサンプルでは、この「CDK」を使て、社員マスタのテーブルをクリエイトしたり、<br />
レコードの追加・削除などの処理を行えます。<br />
（CDK も含まれているので、別途ダウンロードする必要はありません）<br />
<br />
<br />
説明:<br />
アプレット初回起動は、「社員マスタ」が存在しないため、エラーメッセージが表示されます。<br />
起動後、画面上部の「create EMP_MST」ボタンを押すと、社員マスタ（EMP_MST テーブル）が作成されます<br />
　※テーブルは、アプレットと同じフォルダにある、test.db というSQLite のファイルに作成されます<br />
「insert EMP_MST」ボタンを押すと、プログラムで定義している社員のレコードが追加されます<br />
<br />
<br />
■サンプル内で利用している「社員マスタ」テーブルの属性情報<br />
テーブル名：EMP_MST<br />
カラム（説明、物理名、型）<br />
　社員コード　　　EMP_CD　CHAR(5)　※プライマリキー<br />
　社員名　　　　　EMP_NM　CHAR(20)<br />
　所属部門コード　SCT_CD　CHAR(10)<br />
　役職等級コード　GRD_CD　CHAR(2)<br />
　退職年月日　　　RSG_DT　NUMBER(8)　※在職者の値は99999999<br />
<br />
<br />
最近はモバイルアプリでの利用でも注目を集めているようですので、<br />
ご興味のある方は、SQLiteを触ってみるとよいかもしれません。<br />
<br />
<br />
■「CodeZine」記事：<br />
　Curlのオフライン機能とSQLiteを使って「停止しないシステム」を作る<br />
<a href="http://codezine.jp/article/detail/5027" target="_blank" rel="noopener" class="mycode_url">http://codezine.jp/article/detail/5027</a><br />
<br />
■技術情報サイト<br />
　クライアント・データベース操作（SQLite） <br />
<a href="http://developers.curlap.com/re-reference/25-data/18-sqlite.html" target="_blank" rel="noopener" class="mycode_url">http://developers.curlap.com/re-referenc...qlite.html</a><br />
<br />
■SourceForge Curl Data Kit（ダウンロードはここから）<br />
<a href="http://sourceforge.net/projects/curl-cdk/" target="_blank" rel="noopener" class="mycode_url">http://sourceforge.net/projects/curl-cdk/</a><br />
<br />
<br />
■SQLite入門<br />
<a href="http://www.dbonline.jp/sqlite/" target="_blank" rel="noopener" class="mycode_url">http://www.dbonline.jp/sqlite/</a><br />
<br />
■SQLite データベース・ブラウザ (SQLite Database Browser)<br />
<a href="http://www.kkaneko.com/rinkou/sqlite/sqlitedbbrowser.html" target="_blank" rel="noopener" class="mycode_url">http://www.kkaneko.com/rinkou/sqlite/sql...owser.html</a><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=430" target="_blank" title="">SQLite.zip</a> (Size: 41.35 KB / Downloads: 1013)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　ローカルでデータベースを試したいなら SQLite を使ってみよう</span><br />
<br />
業務アプリ開発では避けて通れないのがデータベース（DB）。<br />
DBといえば、有料であればOracle、無料であればMySQL、PostgreSQL 等が有名どころですが、<br />
サーバを用意したり、接続の設定をしたり、始めるまでにはいろいろ面倒。<br />
<br />
簡単にローカル環境でいろいろ試したいなら、SQLite を利用するというのはどうでしょう。<br />
<br />
Curlであれば、SQLiteと接続するためのオープンソース「Curl Data Kit（CDK）」を使って、<br />
面倒な設定なしでSQLiteを利用できます。<br />
<br />
添付したサンプルでは、この「CDK」を使て、社員マスタのテーブルをクリエイトしたり、<br />
レコードの追加・削除などの処理を行えます。<br />
（CDK も含まれているので、別途ダウンロードする必要はありません）<br />
<br />
<br />
説明:<br />
アプレット初回起動は、「社員マスタ」が存在しないため、エラーメッセージが表示されます。<br />
起動後、画面上部の「create EMP_MST」ボタンを押すと、社員マスタ（EMP_MST テーブル）が作成されます<br />
　※テーブルは、アプレットと同じフォルダにある、test.db というSQLite のファイルに作成されます<br />
「insert EMP_MST」ボタンを押すと、プログラムで定義している社員のレコードが追加されます<br />
<br />
<br />
■サンプル内で利用している「社員マスタ」テーブルの属性情報<br />
テーブル名：EMP_MST<br />
カラム（説明、物理名、型）<br />
　社員コード　　　EMP_CD　CHAR(5)　※プライマリキー<br />
　社員名　　　　　EMP_NM　CHAR(20)<br />
　所属部門コード　SCT_CD　CHAR(10)<br />
　役職等級コード　GRD_CD　CHAR(2)<br />
　退職年月日　　　RSG_DT　NUMBER(8)　※在職者の値は99999999<br />
<br />
<br />
最近はモバイルアプリでの利用でも注目を集めているようですので、<br />
ご興味のある方は、SQLiteを触ってみるとよいかもしれません。<br />
<br />
<br />
■「CodeZine」記事：<br />
　Curlのオフライン機能とSQLiteを使って「停止しないシステム」を作る<br />
<a href="http://codezine.jp/article/detail/5027" target="_blank" rel="noopener" class="mycode_url">http://codezine.jp/article/detail/5027</a><br />
<br />
■技術情報サイト<br />
　クライアント・データベース操作（SQLite） <br />
<a href="http://developers.curlap.com/re-reference/25-data/18-sqlite.html" target="_blank" rel="noopener" class="mycode_url">http://developers.curlap.com/re-referenc...qlite.html</a><br />
<br />
■SourceForge Curl Data Kit（ダウンロードはここから）<br />
<a href="http://sourceforge.net/projects/curl-cdk/" target="_blank" rel="noopener" class="mycode_url">http://sourceforge.net/projects/curl-cdk/</a><br />
<br />
<br />
■SQLite入門<br />
<a href="http://www.dbonline.jp/sqlite/" target="_blank" rel="noopener" class="mycode_url">http://www.dbonline.jp/sqlite/</a><br />
<br />
■SQLite データベース・ブラウザ (SQLite Database Browser)<br />
<a href="http://www.kkaneko.com/rinkou/sqlite/sqlitedbbrowser.html" target="_blank" rel="noopener" class="mycode_url">http://www.kkaneko.com/rinkou/sqlite/sql...owser.html</a><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=430" target="_blank" title="">SQLite.zip</a> (Size: 41.35 KB / Downloads: 1013)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[セッションをより確実に殺す（Oracle編）]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1084</link>
			<pubDate>Mon, 19 May 2014 08:08:57 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1084</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point1<br />
　通常は ALTER SYSTEM KILL SESSION で殺す<br />
★point2<br />
　だめなら orakill コマンドで殺す</span><br />
<br />
以前、あるSQLの実行結果が、DBサーバから戻ってこない、という問題が起きた際、<br />
原因となっているDBのセッションを殺す、ということを行いました。<br />
<br />
通常、私は、SQL Developer を使っているので、[ツール]-&gt;[セッションのモニター]で、<br />
SYSDBA権限を持った接続を開き、[WAIT_SECONDS]の値が大きくなっているレコードを、<br />
右クリックメニューの[セッションの中断]を選んで消しています。<br />
（ALTER SYSTEM KILL SESSION と同等）<br />
<br />
ただ、この操作をしたときに、下記のような例外が起こり、<br />
即座にセッションがキルされない、ということが何度もあります。<br />
この例外が発生すると、セッションのレコードで STATUS が、KILLED にはなるのですが、<br />
しばらく（数時間以上）経っても、レコードが残り続ける状態になってしまいます。<br />
<br />
■セッションキル時に発生する例外<br />
リクエストされた操作の実行中にエラーが発生しました:<br />
<br />
ORA-00031: セッションは強制終了されます。<br />
00031. 00000 - "session marked for kill"<br />
*Cause: The session specified in an ALTER SYSTEM KILL SESSION command<br />
cannot be killed immediately (because it is rolling back or blocked<br />
on a network operation), but it has been marked for kill. This<br />
means it will be killed as soon as possible after its current<br />
uninterruptable operation is done.<br />
*Action: No action is required for the session to be killed, but further<br />
executions of the ALTER SYSTEM KILL SESSION command on this session<br />
may cause the session to be killed sooner.<br />
ベンダー・コード31<br />
<br />
<br />
こうなってしまうと、何度同様の手順でセッションを殺そうとしても、同じエラーが出るだけで、<br />
セッションが残り続けてしまい、<br />
それだけならまだしも、ほかに何の処理をしていなくても、<br />
この、KILLEDになったセッションがいるだけで、DBサーバのCPU利用率が50%を超えた状態が続いてしまう、という状況でした。<br />
<br />
エラー内容を読む限り、ロールバック等の処理をおこなってからセッションが切られます、ということのようですが、<br />
対象のSQLはSELECT文なので、ロールバックする処理はないはずです。<br />
<br />
なぜにセッションが残ってしまうのか、原因はわからないのですが、<br />
とりあえず、ALTER SYSTEM KILL SESSION よりさらにアクティブにセッションを殺す方法として、<br />
orakill コマンドというものがあったので、下記に備忘録を残しておきます。<br />
あまり推奨されていないコマンドのようなので利用には注意が必要かも、です。<br />
<br />
■orakillコマンド<br />
orakill sid（※１） thread（※２）<br />
※１：対象DBのサービスID　セッションID（v&#36;session.sid）ではないことに注意<br />
※２：プロセスID（v&#36;process.spid）<br />
<br />
■orakill コマンドに必要なSPIDを特定するためのSELECT文<br />
select spid, s.sid, s.serial#, s.status , osuser, s.program,s.username, s.event from<br />
v&#36;process p, v&#36;session s where p.addr=s.paddr and s.status = 'KILLED';<br />
（STATUSが「KILLED」になっているプロセスIDを確認<br />
<br />
■参考　[Oracle]強制終了したセッションが「killed」で残ってしまう場合の対処方法 <br />
<a href="http://www.popolog.net/articles/2013/04/oracle_session_kill.html" target="_blank" rel="noopener" class="mycode_url">http://www.popolog.net/articles/2013/04/..._kill.html</a>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point1<br />
　通常は ALTER SYSTEM KILL SESSION で殺す<br />
★point2<br />
　だめなら orakill コマンドで殺す</span><br />
<br />
以前、あるSQLの実行結果が、DBサーバから戻ってこない、という問題が起きた際、<br />
原因となっているDBのセッションを殺す、ということを行いました。<br />
<br />
通常、私は、SQL Developer を使っているので、[ツール]-&gt;[セッションのモニター]で、<br />
SYSDBA権限を持った接続を開き、[WAIT_SECONDS]の値が大きくなっているレコードを、<br />
右クリックメニューの[セッションの中断]を選んで消しています。<br />
（ALTER SYSTEM KILL SESSION と同等）<br />
<br />
ただ、この操作をしたときに、下記のような例外が起こり、<br />
即座にセッションがキルされない、ということが何度もあります。<br />
この例外が発生すると、セッションのレコードで STATUS が、KILLED にはなるのですが、<br />
しばらく（数時間以上）経っても、レコードが残り続ける状態になってしまいます。<br />
<br />
■セッションキル時に発生する例外<br />
リクエストされた操作の実行中にエラーが発生しました:<br />
<br />
ORA-00031: セッションは強制終了されます。<br />
00031. 00000 - "session marked for kill"<br />
*Cause: The session specified in an ALTER SYSTEM KILL SESSION command<br />
cannot be killed immediately (because it is rolling back or blocked<br />
on a network operation), but it has been marked for kill. This<br />
means it will be killed as soon as possible after its current<br />
uninterruptable operation is done.<br />
*Action: No action is required for the session to be killed, but further<br />
executions of the ALTER SYSTEM KILL SESSION command on this session<br />
may cause the session to be killed sooner.<br />
ベンダー・コード31<br />
<br />
<br />
こうなってしまうと、何度同様の手順でセッションを殺そうとしても、同じエラーが出るだけで、<br />
セッションが残り続けてしまい、<br />
それだけならまだしも、ほかに何の処理をしていなくても、<br />
この、KILLEDになったセッションがいるだけで、DBサーバのCPU利用率が50%を超えた状態が続いてしまう、という状況でした。<br />
<br />
エラー内容を読む限り、ロールバック等の処理をおこなってからセッションが切られます、ということのようですが、<br />
対象のSQLはSELECT文なので、ロールバックする処理はないはずです。<br />
<br />
なぜにセッションが残ってしまうのか、原因はわからないのですが、<br />
とりあえず、ALTER SYSTEM KILL SESSION よりさらにアクティブにセッションを殺す方法として、<br />
orakill コマンドというものがあったので、下記に備忘録を残しておきます。<br />
あまり推奨されていないコマンドのようなので利用には注意が必要かも、です。<br />
<br />
■orakillコマンド<br />
orakill sid（※１） thread（※２）<br />
※１：対象DBのサービスID　セッションID（v&#36;session.sid）ではないことに注意<br />
※２：プロセスID（v&#36;process.spid）<br />
<br />
■orakill コマンドに必要なSPIDを特定するためのSELECT文<br />
select spid, s.sid, s.serial#, s.status , osuser, s.program,s.username, s.event from<br />
v&#36;process p, v&#36;session s where p.addr=s.paddr and s.status = 'KILLED';<br />
（STATUSが「KILLED」になっているプロセスIDを確認<br />
<br />
■参考　[Oracle]強制終了したセッションが「killed」で残ってしまう場合の対処方法 <br />
<a href="http://www.popolog.net/articles/2013/04/oracle_session_kill.html" target="_blank" rel="noopener" class="mycode_url">http://www.popolog.net/articles/2013/04/..._kill.html</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[RecordGridColumnの配列は、フィールドで定義するな]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1083</link>
			<pubDate>Fri, 16 May 2014 10:21:58 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1083</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　RecordGrid.columns に設定するRecordGridColumnの配列は、フィールドで定義するな！</span><br />
<br />
下記の数値は、RecordGridUI.get-cell-at で、<br />
１回につき、100レコード×100カラム のセルを取得した場合の、<br />
メモリの使用量の推移です。<br />
※Curlのメモリ使用量は、「タスクマネージャ」の「プロセス」タブで表示される<br />
　「surge,.exe」の「メモリ（プライベートワーキングセット）」を参照しました<br />
<br />
■セル取得時のメモリ使用量<br />
①「field定義のカラムを利用」した場合のメモリ消費量（単位は100KB）<br />
1回目： 508 差分<br />
2回目： 791 283<br />
3回目：1074 283<br />
4回目：1347 273<br />
5回目：1629 282<br />
6回目：1894 265<br />
7回目：2195 301<br />
<br />
②「一時的なカラムを利用」した場合のメモリ消費量（単位は100KB）<br />
1回目： 549 差分<br />
2回目： 791 242<br />
3回目：1075 284<br />
4回目：1347 272<br />
5回目：1367 20<br />
6回目：1383 16<br />
7回目：1407 24<br />
<br />
<br />
<br />
①と②の違いは、下記のアプレットのコードを見てもらうとわかりますが、<br />
簡単に言うと、RecordGrid.columns に設定する{Array-of RecordGridColumn} を、<br />
クラスのフィールド（field）に定義して利用するか、そうでないか、というものです。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>{define-class public Screen {inherits Dialog}<br />
<br />
&nbsp;&nbsp;||レコードとカラムの数<br />
&nbsp;&nbsp;field rs-size:int = 100<br />
&nbsp;&nbsp;field rf-size:int = 100<br />
<br />
<br />
&nbsp;&nbsp;||フィールドとして定義するレコードグリッドカラムの配列<br />
&nbsp;&nbsp;field ary-column:{Array-of RecordGridColumn}<br />
<br />
&nbsp;&nbsp;||一時的なレコードグリッドカラムの配列を返却するゲッター<br />
&nbsp;&nbsp;{getter {tmp-ary-column}:{Array-of RecordGridColumn}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return {self.make-columms}}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;{constructor public {default}<br />
&nbsp;&nbsp;&nbsp;&nbsp;set self.ary-column = {self.make-columms}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def ary-rf = {{Array-of RecordField}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{for i:int = 0 below self.rf-size do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ary-rf.append<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{RecordField {String i}, nullable? = true}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def rs =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{RecordSet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{RecordFields {splice ary-rf} }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{for i:int = 0 below self.rs-size do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def new-r = {rs.new-record}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{rs.append new-r}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def cb-permanent =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "field定義のカラムを利用する",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.get-cell rs, self.ary-column}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def cb-tmp =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "一時的なカラムを利用する",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.get-cell rs, self.tmp-ary-column}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def cb-gc =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "ガベージコレクト",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{garbage-collect}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{self.add<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{VBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb-permanent,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb-tmp,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb-gc<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||セルを取得すrう<br />
&nbsp;&nbsp;{method {get-cell<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record-set:RecordSet,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cols:{Array-of RecordGridColumn}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;let cnt:int = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;def grid = {RecordGrid }<br />
&nbsp;&nbsp;&nbsp;&nbsp;set grid.columns = cols<br />
&nbsp;&nbsp;&nbsp;&nbsp;set grid.record-source = record-set<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{for r in grid.records do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for col in grid.columns do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def cell = {grid.ui.get-cell-at r, col}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if-non-null cell then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set cnt = cnt + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{output "cell が見つかりません"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{output cnt &amp; "個のセルを生成しました"}<br />
&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;||大量のカラムを生成する<br />
&nbsp;&nbsp;{method {make-columms}:{Array-of RecordGridColumn}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def cols = {{Array-of RecordGridColumn}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{for i:int = 0 below self.rf-size do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{cols.append<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{RecordGridColumn {String i}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return cols}<br />
&nbsp;&nbsp;}<br />
<br />
}<br />
<br />
{def s = {Screen}}<br />
{value s}</code></div></div><br />
数値の推移をみてもわかるように、フィールドで定義して利用した①には、<br />
単純増加傾向がみられるのに比べ、<br />
そうではない②は、4回目以降、メモリの使用増加量が低下しています。<br />
①については、私が試した限りでは20回以上、単純増加傾向か続きました。<br />
<br />
また、各処理の間で、明示的に「ガベージコレクト（garbage-collect）」を呼び出した場合も、<br />
①ではその効果がみられませんでした。<br />
プログラムでは、グリッドを毎回作り直しているので、<br />
以前のグリッド内で生成されたセルは、ガベージとして認識され、破棄されてほしいところですが、<br />
私の試した限りでは、そのように期待した結果にはなりませんでした。<br />
<br />
どうも、フィールドで定義したカラムを利用して生成されたセルは、<br />
そのフィールドの親クラスが破棄されるまで、<br />
ずっとガベージとして認識されないのではないかと推測されるのです。<br />
<br />
<br />
静的に、グリッドとカラムを保持するような画面であればよいのですが、<br />
グリッドに対して何度もカラムの再設定をする処理のある画面では、<br />
上記のように、メモリの使用量がどんどん増えてしまう、<br />
という問題が起こる可能性があります。<br />
<br />
今回私が試した環境は、Windows7+Curl8.0.4 だけですので、<br />
この現象が、ほかの環境でも発生するかは不明ですが、<br />
できるだけ、RecordGridColumn の配列は、フィールドで定義せず、<br />
記載したアプレットのサンプルソースのようにgetterで一時的に作成するなどの方式にしたほうがよさそうです。<br />
<br />
<br />
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　RecordGrid.columns に設定するRecordGridColumnの配列は、フィールドで定義するな！</span><br />
<br />
下記の数値は、RecordGridUI.get-cell-at で、<br />
１回につき、100レコード×100カラム のセルを取得した場合の、<br />
メモリの使用量の推移です。<br />
※Curlのメモリ使用量は、「タスクマネージャ」の「プロセス」タブで表示される<br />
　「surge,.exe」の「メモリ（プライベートワーキングセット）」を参照しました<br />
<br />
■セル取得時のメモリ使用量<br />
①「field定義のカラムを利用」した場合のメモリ消費量（単位は100KB）<br />
1回目： 508 差分<br />
2回目： 791 283<br />
3回目：1074 283<br />
4回目：1347 273<br />
5回目：1629 282<br />
6回目：1894 265<br />
7回目：2195 301<br />
<br />
②「一時的なカラムを利用」した場合のメモリ消費量（単位は100KB）<br />
1回目： 549 差分<br />
2回目： 791 242<br />
3回目：1075 284<br />
4回目：1347 272<br />
5回目：1367 20<br />
6回目：1383 16<br />
7回目：1407 24<br />
<br />
<br />
<br />
①と②の違いは、下記のアプレットのコードを見てもらうとわかりますが、<br />
簡単に言うと、RecordGrid.columns に設定する{Array-of RecordGridColumn} を、<br />
クラスのフィールド（field）に定義して利用するか、そうでないか、というものです。<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>{define-class public Screen {inherits Dialog}<br />
<br />
&nbsp;&nbsp;||レコードとカラムの数<br />
&nbsp;&nbsp;field rs-size:int = 100<br />
&nbsp;&nbsp;field rf-size:int = 100<br />
<br />
<br />
&nbsp;&nbsp;||フィールドとして定義するレコードグリッドカラムの配列<br />
&nbsp;&nbsp;field ary-column:{Array-of RecordGridColumn}<br />
<br />
&nbsp;&nbsp;||一時的なレコードグリッドカラムの配列を返却するゲッター<br />
&nbsp;&nbsp;{getter {tmp-ary-column}:{Array-of RecordGridColumn}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return {self.make-columms}}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;{constructor public {default}<br />
&nbsp;&nbsp;&nbsp;&nbsp;set self.ary-column = {self.make-columms}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def ary-rf = {{Array-of RecordField}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{for i:int = 0 below self.rf-size do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ary-rf.append<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{RecordField {String i}, nullable? = true}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def rs =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{RecordSet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{RecordFields {splice ary-rf} }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{for i:int = 0 below self.rs-size do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def new-r = {rs.new-record}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{rs.append new-r}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def cb-permanent =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "field定義のカラムを利用する",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.get-cell rs, self.ary-column}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def cb-tmp =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "一時的なカラムを利用する",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{self.get-cell rs, self.tmp-ary-column}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def cb-gc =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{CommandButton<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label = "ガベージコレクト",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{on Action do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{garbage-collect}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{self.add<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{VBox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb-permanent,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb-tmp,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb-gc<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;||セルを取得すrう<br />
&nbsp;&nbsp;{method {get-cell<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record-set:RecordSet,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cols:{Array-of RecordGridColumn}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}:void<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;let cnt:int = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;def grid = {RecordGrid }<br />
&nbsp;&nbsp;&nbsp;&nbsp;set grid.columns = cols<br />
&nbsp;&nbsp;&nbsp;&nbsp;set grid.record-source = record-set<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{for r in grid.records do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for col in grid.columns do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def cell = {grid.ui.get-cell-at r, col}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{if-non-null cell then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set cnt = cnt + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{output "cell が見つかりません"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{output cnt &amp; "個のセルを生成しました"}<br />
&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;||大量のカラムを生成する<br />
&nbsp;&nbsp;{method {make-columms}:{Array-of RecordGridColumn}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def cols = {{Array-of RecordGridColumn}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{for i:int = 0 below self.rf-size do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{cols.append<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{RecordGridColumn {String i}}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{return cols}<br />
&nbsp;&nbsp;}<br />
<br />
}<br />
<br />
{def s = {Screen}}<br />
{value s}</code></div></div><br />
数値の推移をみてもわかるように、フィールドで定義して利用した①には、<br />
単純増加傾向がみられるのに比べ、<br />
そうではない②は、4回目以降、メモリの使用増加量が低下しています。<br />
①については、私が試した限りでは20回以上、単純増加傾向か続きました。<br />
<br />
また、各処理の間で、明示的に「ガベージコレクト（garbage-collect）」を呼び出した場合も、<br />
①ではその効果がみられませんでした。<br />
プログラムでは、グリッドを毎回作り直しているので、<br />
以前のグリッド内で生成されたセルは、ガベージとして認識され、破棄されてほしいところですが、<br />
私の試した限りでは、そのように期待した結果にはなりませんでした。<br />
<br />
どうも、フィールドで定義したカラムを利用して生成されたセルは、<br />
そのフィールドの親クラスが破棄されるまで、<br />
ずっとガベージとして認識されないのではないかと推測されるのです。<br />
<br />
<br />
静的に、グリッドとカラムを保持するような画面であればよいのですが、<br />
グリッドに対して何度もカラムの再設定をする処理のある画面では、<br />
上記のように、メモリの使用量がどんどん増えてしまう、<br />
という問題が起こる可能性があります。<br />
<br />
今回私が試した環境は、Windows7+Curl8.0.4 だけですので、<br />
この現象が、ほかの環境でも発生するかは不明ですが、<br />
できるだけ、RecordGridColumn の配列は、フィールドで定義せず、<br />
記載したアプレットのサンプルソースのようにgetterで一時的に作成するなどの方式にしたほうがよさそうです。<br />
<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[CSVデータをDTOに詰めてはいけない]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1082</link>
			<pubDate>Tue, 13 May 2014 07:09:01 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1082</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　CSVデータをDTOに詰めてはいけません、絶対に。</span><br />
<br />
今回は、Java に詳しい方には、「そんなの当然」といわれてしまいそうな話なのですが、<br />
Curl ORB を利用して、サーバからCSVデータをダウンロードしたい、という場合、<br />
私などは、CSV形式に整形した文字列を、DTOのフィールドに詰めて、<br />
クライアント側でその値を、ファイル出力（write-to）すればいいじゃん、と簡単に考えてしまいます。<br />
<br />
しかし、サーバのメモリは有限なので、CSVデータの容量や、同時利用人数によっては、<br />
CSVデータのためのメモリが確保できず、OutOfMemory 例外が出てしまう可能性があります。<br />
実際にこれで痛い目にもあいました。<br />
<br />
この問題を回避するためには、下記のような処理を実装する方法が考えられます。<br />
①サーバでは、CSVデータを、テンポラリとして実ファイルに出力する ※１、２<br />
②サーバからクライアントに、①で出力したファイルの「パス」をDTOのフィールドに詰めて返却する※３<br />
③クライアントは、受け取ったファイルパスからファイルをダウンロードする ※４、５<br />
<br />
注意<br />
　※１：出力前のCSVデータ自体の確保でOutOfMemoryが出ないように注意すること<br />
　　　　具体的には、DBから取得したデータをまとめてリストで保持するのではなく、<br />
　　　　たとえば、FETCHデータを１行ごとファイルへ追記出力するなどの処理が必要<br />
　　　　（iBatis であれば、RowHandler を利用して、１行ごとに処理することが可能）<br />
　　　　　■参考「メモリー管理に失敗したJavaアプリの実例」<br />
　　　　　http://thinkit.co.jp/story/2011/03/11/2051<br />
　※２：テンポラリファイルのパスは、クライアントからhttpでアクセスできるパスであること<br />
　　　　また、ファイル名にはyyyymmdd_hhmmss+ミリ秒をつけて、同時利用時でもファイル名が衝突しないように注意<br />
　※３：テンポラリのファイルパスとは別に、クライアントで保存する際の初期提案用ファイル名も必要<br />
　※４：ファイルダウンロード時の例外ハンドリング、<br />
　　　　保存ダイアログの初期表示フォルダを指定する機能なども実装すること<br />
　※５：サーバで実行される日時バッチなどを組み、定期的にテンポラリファイルを削除する機能を実装すること<br />
<br />
もちろん、サーバのメモリが潤沢であったり、出力するCSVデータ容量が極小であったり、<br />
DTOに詰めてやり取りしても問題がない場合はあるので、<br />
上記のような、やや面倒な実装を忌避したくなる気持ちは十分すぎるほどわかります。<br />
しかし、データは肥大化していくものですので、<br />
運用開始直後は問題なく動いていても、ダウンロードの対象データが大きくなるにつれ、<br />
ある時から急に問題が発生するようになる、ということも考えられます。<br />
<br />
アプリケーションの将来性を考えるうえでも、<br />
企業で利用するアプリケーションの基盤としては、<br />
絶対に「DTOのなかにCSVを詰めない」という方針を取ったほうが良いと思っています。<br />
<br />
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　CSVデータをDTOに詰めてはいけません、絶対に。</span><br />
<br />
今回は、Java に詳しい方には、「そんなの当然」といわれてしまいそうな話なのですが、<br />
Curl ORB を利用して、サーバからCSVデータをダウンロードしたい、という場合、<br />
私などは、CSV形式に整形した文字列を、DTOのフィールドに詰めて、<br />
クライアント側でその値を、ファイル出力（write-to）すればいいじゃん、と簡単に考えてしまいます。<br />
<br />
しかし、サーバのメモリは有限なので、CSVデータの容量や、同時利用人数によっては、<br />
CSVデータのためのメモリが確保できず、OutOfMemory 例外が出てしまう可能性があります。<br />
実際にこれで痛い目にもあいました。<br />
<br />
この問題を回避するためには、下記のような処理を実装する方法が考えられます。<br />
①サーバでは、CSVデータを、テンポラリとして実ファイルに出力する ※１、２<br />
②サーバからクライアントに、①で出力したファイルの「パス」をDTOのフィールドに詰めて返却する※３<br />
③クライアントは、受け取ったファイルパスからファイルをダウンロードする ※４、５<br />
<br />
注意<br />
　※１：出力前のCSVデータ自体の確保でOutOfMemoryが出ないように注意すること<br />
　　　　具体的には、DBから取得したデータをまとめてリストで保持するのではなく、<br />
　　　　たとえば、FETCHデータを１行ごとファイルへ追記出力するなどの処理が必要<br />
　　　　（iBatis であれば、RowHandler を利用して、１行ごとに処理することが可能）<br />
　　　　　■参考「メモリー管理に失敗したJavaアプリの実例」<br />
　　　　　http://thinkit.co.jp/story/2011/03/11/2051<br />
　※２：テンポラリファイルのパスは、クライアントからhttpでアクセスできるパスであること<br />
　　　　また、ファイル名にはyyyymmdd_hhmmss+ミリ秒をつけて、同時利用時でもファイル名が衝突しないように注意<br />
　※３：テンポラリのファイルパスとは別に、クライアントで保存する際の初期提案用ファイル名も必要<br />
　※４：ファイルダウンロード時の例外ハンドリング、<br />
　　　　保存ダイアログの初期表示フォルダを指定する機能なども実装すること<br />
　※５：サーバで実行される日時バッチなどを組み、定期的にテンポラリファイルを削除する機能を実装すること<br />
<br />
もちろん、サーバのメモリが潤沢であったり、出力するCSVデータ容量が極小であったり、<br />
DTOに詰めてやり取りしても問題がない場合はあるので、<br />
上記のような、やや面倒な実装を忌避したくなる気持ちは十分すぎるほどわかります。<br />
しかし、データは肥大化していくものですので、<br />
運用開始直後は問題なく動いていても、ダウンロードの対象データが大きくなるにつれ、<br />
ある時から急に問題が発生するようになる、ということも考えられます。<br />
<br />
アプリケーションの将来性を考えるうえでも、<br />
企業で利用するアプリケーションの基盤としては、<br />
絶対に「DTOのなかにCSVを詰めない」という方針を取ったほうが良いと思っています。<br />
<br />
]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[DBからSQLの結果が返ってこない]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1081</link>
			<pubDate>Fri, 09 May 2014 11:43:43 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1081</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　Oracle では、SQLのサイズを64kバイト未満に抑えよう</span><br />
<br />
ある案件で、ある損益帳票を、社内の全部門で集計する、という処理が、<br />
固まってしまう、という問題が起きました。<br />
<br />
現象としては、Javaから、iBatis経由でSQLをOracleに発行した後、<br />
DBサーバのCPU利用率が100%にまで上がってしまい、<br />
結果が返ってこなくなる、というものでした。<br />
<br />
<br />
この時に発行されているSQLは、IN句のなかに数百の部門が展開されるているもので、<br />
数千行という、かなりの大きさになっていました。<br />
<br />
また、返却されるデータ量も、数万件という、そこそこの件数なので、<br />
そのあたりがDBサーバの負荷になっているのではないか、という予想のもと、<br />
いろいろと調査をしたのですが、<br />
下記のような矛盾があり、原因の特定ができず、困っていました。<br />
<br />
<br />
・該当の処理も、必ず固まるわけではない（条件は特定できない）<br />
・返却されるデータの大小にかかわらず、固まることがある<br />
・同じSQLを、SQL Developer から投げると大きな遅延なく結果が返却される<br />
<br />
<br />
いろいろと頭をお悩ませたのですが、最終的には、下記のサイトを見て、<br />
どうやら、SQLの大きさに原因があるのではないか、ということに落ち着きました。<br />
たしかに、固まるSQLとそれ以外のSQLの間には64kバイトの壁がありました。<br />
<br />
<br />
■Oracle 性能限界<br />
<a href="http://www.shift-the-oracle.com/oracle/limits.html" target="_blank" rel="noopener" class="mycode_url">http://www.shift-the-oracle.com/oracle/limits.html</a><br />
「SQLにおける制限事項」<br />
<br />
<br />
（とはいえ、利用しているOracleのバージョンは11gなので、<br />
　この64kバイト制限が9iまでの制限という情報とは矛盾があるのですが・・・）<br />
<br />
結局、全部門をまとめてIN句に入れるのではなく、部門ごとのSQLを、<br />
Javaでループしながら投げる、という方式に変更することで、<br />
処理が固まることはなくなりました。]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
　Oracle では、SQLのサイズを64kバイト未満に抑えよう</span><br />
<br />
ある案件で、ある損益帳票を、社内の全部門で集計する、という処理が、<br />
固まってしまう、という問題が起きました。<br />
<br />
現象としては、Javaから、iBatis経由でSQLをOracleに発行した後、<br />
DBサーバのCPU利用率が100%にまで上がってしまい、<br />
結果が返ってこなくなる、というものでした。<br />
<br />
<br />
この時に発行されているSQLは、IN句のなかに数百の部門が展開されるているもので、<br />
数千行という、かなりの大きさになっていました。<br />
<br />
また、返却されるデータ量も、数万件という、そこそこの件数なので、<br />
そのあたりがDBサーバの負荷になっているのではないか、という予想のもと、<br />
いろいろと調査をしたのですが、<br />
下記のような矛盾があり、原因の特定ができず、困っていました。<br />
<br />
<br />
・該当の処理も、必ず固まるわけではない（条件は特定できない）<br />
・返却されるデータの大小にかかわらず、固まることがある<br />
・同じSQLを、SQL Developer から投げると大きな遅延なく結果が返却される<br />
<br />
<br />
いろいろと頭をお悩ませたのですが、最終的には、下記のサイトを見て、<br />
どうやら、SQLの大きさに原因があるのではないか、ということに落ち着きました。<br />
たしかに、固まるSQLとそれ以外のSQLの間には64kバイトの壁がありました。<br />
<br />
<br />
■Oracle 性能限界<br />
<a href="http://www.shift-the-oracle.com/oracle/limits.html" target="_blank" rel="noopener" class="mycode_url">http://www.shift-the-oracle.com/oracle/limits.html</a><br />
「SQLにおける制限事項」<br />
<br />
<br />
（とはいえ、利用しているOracleのバージョンは11gなので、<br />
　この64kバイト制限が9iまでの制限という情報とは矛盾があるのですが・・・）<br />
<br />
結局、全部門をまとめてIN句に入れるのではなく、部門ごとのSQLを、<br />
Javaでループしながら投げる、という方式に変更することで、<br />
処理が固まることはなくなりました。]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[入力チェックのフレームワーク]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1078</link>
			<pubDate>Mon, 28 Apr 2014 09:19:28 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1078</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
チェックは、コントロールとグリッドの両方で、同様の振る舞いをさせるべき</span><br />
<br />
<br />
これまで、自分が参画したプロジェクトで、<br />
Curl賢人の方々のソースも参考にしながら、<br />
自分なりの入力チェック用のフレームワークを作ってきましたが、<br />
いったん、シンプルなレベルに整理してみました。<br />
<br />
このフレームワークは、コントロールとグリッド（セル）のチェックと、<br />
その結果の振る舞いに差異がないようにしたい、というポイントを意識しています。<br />
そのため、「グリッドのエラー状態を保持」できるようにしています。<br />
<br />
■プログラム概要<br />
「入力不可（read-only）」「必須（required?）」「エラー状態（error?）」のプロパティを持つ<br />
チェックルールは、「編集仕様（EditorSpec）」で定義する<br />
<br />
<br />
■主な振る舞い<br />
「入力不可」に設定すると、背景色がグレーになり、キー入力が行えない<br />
「必須」に設定すると、背景色が黄色になり、チェック時に値が空文字だとエラーになる<br />
「エラー状態」が活性状態の場合、背景色が赤色になる<br />
<br />
<br />
賢人の方々からすると、突っ込みどころも多いかと思いますので、<br />
ぜひコメントいただけるとありがたいです。<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=429" target="_blank" title="">Validate.zip</a> (Size: 126.16 KB / Downloads: 1010)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
チェックは、コントロールとグリッドの両方で、同様の振る舞いをさせるべき</span><br />
<br />
<br />
これまで、自分が参画したプロジェクトで、<br />
Curl賢人の方々のソースも参考にしながら、<br />
自分なりの入力チェック用のフレームワークを作ってきましたが、<br />
いったん、シンプルなレベルに整理してみました。<br />
<br />
このフレームワークは、コントロールとグリッド（セル）のチェックと、<br />
その結果の振る舞いに差異がないようにしたい、というポイントを意識しています。<br />
そのため、「グリッドのエラー状態を保持」できるようにしています。<br />
<br />
■プログラム概要<br />
「入力不可（read-only）」「必須（required?）」「エラー状態（error?）」のプロパティを持つ<br />
チェックルールは、「編集仕様（EditorSpec）」で定義する<br />
<br />
<br />
■主な振る舞い<br />
「入力不可」に設定すると、背景色がグレーになり、キー入力が行えない<br />
「必須」に設定すると、背景色が黄色になり、チェック時に値が空文字だとエラーになる<br />
「エラー状態」が活性状態の場合、背景色が赤色になる<br />
<br />
<br />
賢人の方々からすると、突っ込みどころも多いかと思いますので、<br />
ぜひコメントいただけるとありがたいです。<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://communities.curl.com/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=429" target="_blank" title="">Validate.zip</a> (Size: 126.16 KB / Downloads: 1010)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Curl アプレットを同期させるための注意点]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1074</link>
			<pubDate>Tue, 22 Apr 2014 07:22:29 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1074</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point1<br />
　resync-file を利用しよう<br />
<br />
★point2<br />
　デプロイモジュールの更新日時を変更しよう</span><br />
<br />
Curl アプレットは、クライアント側にキャッシュされることで、毎回の起動時にロード時間を短縮してくれます。<br />
さらに、それらのキャッシュは、起動時に自動でサーバに上がっているモジュールと比較され、<br />
差分がある場合は、最新のモジュールがキャッシュされる仕組みになっています。<br />
<br />
とはいえ、正しい設定、環境でないと、このキャッシュ更新機能がうまく働かないので、<br />
いくつか注意するすべき項目を挙げておきます。<br />
<br />
①resync-file を利用<br />
②デプロイ時に各ファイルの更新日時を最新化する<br />
<br />
<br />
①については、過去のCurlアプレット配信では resync-as-of というAPIを利用して<br />
最新化の日時を設定していた方もいらっしゃるかと思いますが、<br />
このAPIは、デプロイの度に対象日時を変更する必要があり、ちょっと面倒でした。<br />
現在は、「resync-file」を利用することで、manifest.mcurl ファイルの更新日時が<br />
自動的に対象日時として設定されます。<br />
Curl としても、このresync-file を利用することを推奨しているようです。<br />
<br />
<br />
②については、結構見逃されがちな問題なので、注意が必要です。<br />
具体的には下記のような例があります。<br />
<br />
■ケース１<br />
resync-file を使っており、再デプロイ時に変更のあったパッケージのみ pcurl化し、<br />
すでに運用されているアプリケーションから、そのファイルだけ、元ファイルと置き換えた。<br />
しかし、次の日起動したら同期化されていなかった。<br />
　→理由：manifest.mcurl の更新日時がそのままなので、変更があると判断されない。<br />
<br />
■ケース２<br />
すでに運用されているアプリケーションを最新化するため、<br />
デプロイ当日の12時に、デプロイモジュールを事前に作成しておき、<br />
実際のデプロイは20時に行った。<br />
ユーザは、当日の15時に初めてアプリケーションを起動していた<br />
しかし、次の日起動したら同期化されていなかった<br />
　→理由：デプロイされたファイルの更新日時（12時）が、<br />
　　　　　キャッシュされた時刻（15時）より過去になってしまうため。<br />
<br />
<br />
Curlの同期ルールを正確に理解したうえで<br />
デプロイモジュール作成時のタイミングや、作成モジュール対象のファイルの切り分けを行えば、<br />
これらの問題を起こさずに済みますが、<br />
私の場合は、<span style="font-weight: bold;" class="mycode_b">「全ファイルの更新日時を一括してデプロイ時刻に統一する」</span>のが一番楽かな、<br />
と思っています。<br />
<br />
デプロイ時に Ant を使っているのであれば、 touch タスクで更新日時を変更するか、<br />
ツールなどを利用して、デプロイ直前に更新日時を変更してからデプロイすれば<br />
上記の問題は回避できます。<br />
<br />
<br />
■（参考）ファイルのアクセス日付変更ツール<br />
<a href="http://www.vector.co.jp/soft/dl/winnt/util/se503248.html" target="_blank" rel="noopener" class="mycode_url">http://www.vector.co.jp/soft/dl/winnt/ut...03248.html</a>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point1<br />
　resync-file を利用しよう<br />
<br />
★point2<br />
　デプロイモジュールの更新日時を変更しよう</span><br />
<br />
Curl アプレットは、クライアント側にキャッシュされることで、毎回の起動時にロード時間を短縮してくれます。<br />
さらに、それらのキャッシュは、起動時に自動でサーバに上がっているモジュールと比較され、<br />
差分がある場合は、最新のモジュールがキャッシュされる仕組みになっています。<br />
<br />
とはいえ、正しい設定、環境でないと、このキャッシュ更新機能がうまく働かないので、<br />
いくつか注意するすべき項目を挙げておきます。<br />
<br />
①resync-file を利用<br />
②デプロイ時に各ファイルの更新日時を最新化する<br />
<br />
<br />
①については、過去のCurlアプレット配信では resync-as-of というAPIを利用して<br />
最新化の日時を設定していた方もいらっしゃるかと思いますが、<br />
このAPIは、デプロイの度に対象日時を変更する必要があり、ちょっと面倒でした。<br />
現在は、「resync-file」を利用することで、manifest.mcurl ファイルの更新日時が<br />
自動的に対象日時として設定されます。<br />
Curl としても、このresync-file を利用することを推奨しているようです。<br />
<br />
<br />
②については、結構見逃されがちな問題なので、注意が必要です。<br />
具体的には下記のような例があります。<br />
<br />
■ケース１<br />
resync-file を使っており、再デプロイ時に変更のあったパッケージのみ pcurl化し、<br />
すでに運用されているアプリケーションから、そのファイルだけ、元ファイルと置き換えた。<br />
しかし、次の日起動したら同期化されていなかった。<br />
　→理由：manifest.mcurl の更新日時がそのままなので、変更があると判断されない。<br />
<br />
■ケース２<br />
すでに運用されているアプリケーションを最新化するため、<br />
デプロイ当日の12時に、デプロイモジュールを事前に作成しておき、<br />
実際のデプロイは20時に行った。<br />
ユーザは、当日の15時に初めてアプリケーションを起動していた<br />
しかし、次の日起動したら同期化されていなかった<br />
　→理由：デプロイされたファイルの更新日時（12時）が、<br />
　　　　　キャッシュされた時刻（15時）より過去になってしまうため。<br />
<br />
<br />
Curlの同期ルールを正確に理解したうえで<br />
デプロイモジュール作成時のタイミングや、作成モジュール対象のファイルの切り分けを行えば、<br />
これらの問題を起こさずに済みますが、<br />
私の場合は、<span style="font-weight: bold;" class="mycode_b">「全ファイルの更新日時を一括してデプロイ時刻に統一する」</span>のが一番楽かな、<br />
と思っています。<br />
<br />
デプロイ時に Ant を使っているのであれば、 touch タスクで更新日時を変更するか、<br />
ツールなどを利用して、デプロイ直前に更新日時を変更してからデプロイすれば<br />
上記の問題は回避できます。<br />
<br />
<br />
■（参考）ファイルのアクセス日付変更ツール<br />
<a href="http://www.vector.co.jp/soft/dl/winnt/util/se503248.html" target="_blank" rel="noopener" class="mycode_url">http://www.vector.co.jp/soft/dl/winnt/ut...03248.html</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Curl RTE のインストールログの取得方法]]></title>
			<link>https://communities.curl.com/showthread.php?tid=1072</link>
			<pubDate>Fri, 18 Apr 2014 10:49:29 +0000</pubDate>
			<guid isPermaLink="false">https://communities.curl.com/showthread.php?tid=1072</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
インストール失敗時は、ログをとって検証！<br />
</span><br />
私個人は、Curl RTE のインストールでコケたことがないのですが、<br />
数百人、数千人という単位でお客様にインストールしてもらう際には、<br />
時々インストールに失敗した、という報告を受けることがあります。<br />
<br />
大体の場合は、アドミン権限がなかったり、再インストールしたらうまくいった、という結果なのですが、<br />
よくわからない場合は、ログを取る方法がよさそうです。<br />
<br />
msiexec /i curl-rte-8.0.3-ja.msi /l*v ./logfile.txt<br />
<br />
上記のようなコマンドで、ログファイルの出力が可能です。<br />
<br />
<br />
]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">★point<br />
インストール失敗時は、ログをとって検証！<br />
</span><br />
私個人は、Curl RTE のインストールでコケたことがないのですが、<br />
数百人、数千人という単位でお客様にインストールしてもらう際には、<br />
時々インストールに失敗した、という報告を受けることがあります。<br />
<br />
大体の場合は、アドミン権限がなかったり、再インストールしたらうまくいった、という結果なのですが、<br />
よくわからない場合は、ログを取る方法がよさそうです。<br />
<br />
msiexec /i curl-rte-8.0.3-ja.msi /l*v ./logfile.txt<br />
<br />
上記のようなコマンドで、ログファイルの出力が可能です。<br />
<br />
<br />
]]></content:encoded>
		</item>
	</channel>
</rss>