tag:blogger.com,1999:blog-76169795614648287112024-03-19T18:29:32.193+09:00プログラマメモ2プログラマメモ2 小さくても大きくてもコーディングに関わるのは楽しいです、と最近ようやくいえるような気がします。Unknownnoreply@blogger.comBlogger1376125tag:blogger.com,1999:blog-7616979561464828711.post-60444549781808629132021-04-29T18:00:00.007+09:002021-04-29T18:52:26.950+09:00nano秒スリープさせたいと思ったわけです。<p> javaです。</p><p>nano秒スリープさせたいと思ったわけです。</p><p>それで、スレッドのsleepにnanoとあったので、おっと思ったのですが、javadocを読むと「<code>nanos</code> - <code>0-999999</code>追加でスリープするナノ秒」とあって、<b>追加</b>でなのでした。</p><p> <br /></p>
<pre><code>
public static void sleep(long millis,
int nanos)
throws InterruptedException
</code></pre><p>
<br />
<br />
<a href="https://stackoverflow.com/questions/11498585/how-to-suspend-a-java-thread-for-a-small-period-of-time-like-100-nanoseconds">sleep - How to suspend a java thread for a small period of time, like 100 nanoseconds? - Stack Overflow</a>
<br /> </p><p>アイデアとしてはシンプルで、whileで回して止まったようにするというもの <br /></p><p>コード書いて試してみました。cpuとかの仕組みがわかっとらんので、僕もあやういなー</p><p><a href="https://github.com/ugonakawaka/pub/blob/master/java/aexample/src/a001_nano_sleep/Test01.java" rel="nofollow" target="_blank">https://github.com/ugonakawaka/pub/blob/master/java/aexample/src/a001_nano_sleep/Test01.java</a></p><p> </p><p>そんなとこ <br /></p><p> </p><p> </p><p>
<br />
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-9859316286448145032021-04-17T12:11:00.007+09:002021-04-17T19:26:02.935+09:00[blogger]編集(quick edit)ボタンを復活させたい<p> bloggerです。</p><p>いろいろ理由はわかってないのですが、いつの頃から、編集(quick edit)ボタンがみえなくなってそれをを復活させたいというのが、動機となります。</p><p> </p><p> いまのところ、ログインしたユーザ(自分)がページを開いたときに編集(quick edit)ボタンがみえることはできていないです。(たぶんできないのかもしれない...)</p>
<pre><code><b:with value='data:view.isPage ? &quot;page&quot; : &quot;post&quot;' var='type'>
<a expr:href='&quot;https://www.blogger.com/&quot; + data:type + &quot;-edit.g?blogID=&quot; + data:blog.blogId + &quot;&amp;&quot; + data:type + &quot;ID=&quot; + data:post.id + &quot;&amp;from=pencil&quot;' expr:title='data:post.title' rel='nofollow'>XXXXXX</a>
</b:with>
</code></pre>
<p> </p><p>参考</p><ul style="text-align: left;"><li><a href="https://btf-jp.blogspot.com/2017/10/restored-quickedit-blogger-2017-theme.html?qe" rel="nofollow" target="_blank">https://btf-jp.blogspot.com/2017/10/restored-quickedit-blogger-2017-theme.html?qe</a> </li><li><a href="https://support.google.com/blogger/answer/47270?hl=ja&dark=1" rel="nofollow" target="_blank">https://support.google.com/blogger/answer/47270?hl=ja&dark=1</a><br /></li></ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-90681218109866034112021-04-04T19:00:00.002+09:002021-04-10T08:26:50.696+09:00[blogger]公開日と更新日が違うときだけ、更新日を表示したいです。<p> bloggerです。</p><p>ようやく記事の更新日付を表示できるようになったので、いろいろ工夫中です。</p><p>公開日と更新日が違うときだけ、更新日を表示したいです。</p>
<pre><code>
<!-- 公開更新日付 -->
<b style='clear:both;float:right;font-size: 13px;line-height: 13px;'>
<b:eval expr='format (data:post.date, &quot;YYYY/MM/dd &quot;)'/>
<br/>
<b:if cond='data:post.date != data:post.lastUpdated'>
<b:eval expr='format (data:post.lastUpdated, &quot;YYYY/MM/dd &quot;)'/>
</b:if>
</b>
</code></pre>
<h3 style="text-align: left;">参考</h3><p><a href="https://spoontofork.blogspot.com/2018/06/blogger-show-last-modified-date.html" rel="nofollow" target="_blank">https://spoontofork.blogspot.com/2018/06/blogger-show-last-modified-date.html </a></p><p><a href="https://indoor-days.blogspot.com/2019/08/QooQ.Update-date.html" rel="nofollow" target="_blank">https://indoor-days.blogspot.com/2019/08/QooQ.Update-date.html</a> <br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-41000903250689676542021-04-04T18:00:00.007+09:002021-04-04T18:26:16.641+09:00ラムダで再帰だって!?<p> java8です。</p><p>数年に一回はjavaのラムダで再帰をと思い立ち調べて..あああとなるわけです。</p><p> </p><p>モチベーション</p><p>ディレクトリにマーカーファイル(目じるしファイル)をおいておきそこの場所をルートまで辿って調べたい。なかったらnullを返す。 <br /></p><p> </p><h4 style="text-align: left;">コード </h4><h4 style="text-align: left;"><span style="font-weight: normal;">再帰のためのお助け定義</span></h4>
<pre><code>
public class Recursive<I> {
public I func;
}
</code></pre>
<p> </p><p></p><pre><code> final Recursive<Function<Path, Path>> recursive = new Recursive<>();
recursive.func = (p) -> {
Path path2 = p.resolve(MARKER_FILE);
if (!Files.exists(path2)) {
Path parentPath = p.getParent();
if (parentPath == null)
return null;
return recursive.func.apply(parentPath);
}
return p;
};
final Path fpath = recursive.func.apply(path);
</code></pre><br /><p></p><p> </p><p> </p><h4 style="text-align: left;"> 参考</h4><p><a href="https://stackoverflow.com/questions/19429667/implement-recursive-lambda-function-using-java-8" rel="nofollow" target="_blank">https://stackoverflow.com/questions/19429667/implement-recursive-lambda-function-using-java-8 </a><br /></p><p> </p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-59543560680708008002021-04-04T16:18:00.002+09:002021-04-04T16:39:33.716+09:00パス(java.nio.file.Path)の結合<p> java7です。パス(java.nio.file.Path)の結合です。</p><p>この10年勉強してこなかったつけがどーんと押し寄せている感じがしてます。 </p><h2 style="text-align: left;">モチベーション</h2><p>ディレクトリを表現しているパスがあり、ファイル名がわかっていて、それらをひとつのパスで表現したいわけです。 </p><p>Fileでしたたら、ペアレントのFileと結合という感じにやっていたなーというところですが、<br /></p><p>どうするのか</p><p>resolveというメソッドを使うのがよいようです。<br /></p><p><br /></p><h2 style="text-align: left;">参考<br /></h2><p><a href="https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Path.html">https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Path.html</a></p><p><a href="https://docs.oracle.com/cd/E26537_01/tutorial/essential/io/pathOps.html#resolve">https://docs.oracle.com/cd/E26537_01/tutorial/essential/io/pathOps.html#resolve</a><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-45697027871916614352021-03-28T11:09:00.007+09:002021-04-05T00:19:27.098+09:00java.lang.IllegalArgumentException: Can not set com.google.api.services.blogger.model.Post$Author field com.google.api.services.blogger.model.Post.author to com.google.gson.internal.LinkedTreeMap<h4>はじまり</h4>
blogger api です。javaです。
json→java objectをやっていて、gson使えばよいのかとやっていて
エラーになってしまっていました。
<blockquote>java.lang.IllegalArgumentException: Can not set com.google.api.services.blogger.model.Post$Author field com.google.api.services.blogger.model.Post.author to com.google.gson.internal.LinkedTreeMap</blockquote>
<h4>方針変更</h4>
gsonを直接使う方法ではなく、com.google.api.client.json.JsonObjectParserを使う方法に変更。
以下、コード
<pre><code>final JsonFactory factory = GsonFactory.getDefaultInstance();
final JsonObjectParser parser = new JsonObjectParser(factory);
final InputStream inputStream = TestGson.class.getResourceAsStream("/list.json");
{
final Post[] posts = parser.parseAndClose(new InputStreamReader(inputStream), Post[].class);
Arrays.asList(posts).forEach(a -> {
System.out.println(a);
});
}
</code></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-38093656841109928982021-03-21T17:24:00.002+09:002021-04-29T18:54:07.582+09:00bloggerのレイアウトを変更中<p>記事の更新日を表示したいところから、いろいろ試して数日がたってしまった。 </p><p>わかったことをメモすると、version='1'だとだめで、それを変更して保存してもだめ。</p><p>それでいったんbloggerの新しいテンプレートに変換して、それから、再度自分のテンプレートを適用してもどらなくなった。。。 <br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-37123570193622987202021-03-14T19:27:00.005+09:002021-04-17T19:35:42.667+09:00お試し投稿<p> </p>
<pre><code>class Test {
} </code></pre>
<br/>
お試し更新Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-39162328409383774312020-11-15T15:38:00.003+09:002021-04-05T00:31:03.536+09:00なんで、virtualboxをupdateして入れることに、ゲストOSにubuntuを入れる<p> いろいろほったらかしにしていたつけがまわっている感じします。</p><p>さて、ひさびさに、vmawareを起動しようとしたら、バージョン古すぎるのとライセンスが切れていた...</p><p>なんで、virtualboxをupdateして入れることに、ゲストOSにubuntuを入れる</p><p>ホストOS(mac osx)と共有フォルダしたいので、いろいろ調べて <br /></p><blockquote>sudo apt-get install virtualbox-guest-additions-iso</blockquote><p> </p><p> 最近、へんに翻訳されていろいろ読めるのはありがたいけど、なんか違和感</p><p>https://qastack.jp/ubuntu/22743/how-do-i-install-guest-additions-in-a-virtualbox-vm </p><p><br /></p><p><br /></p><p>インストールが終わったらreboot</p><p> </p><p> </p><p> </p><p>あと、キーボドレイアウトを変える<br /></p>
<a href="https://qiita.com/vochicong/items/6452ac54bde56b0e0bb3">sudo dpkg-reconfigure keyboard-configuration</a><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyiUNIHovguko77kjC2vQhtrKZCIMn8T7LkclGt52dQn88f6SAFQzxDCFblt9nSzUkVBilX99R1mGYO975FfWXNCLH1lYgI5Tg5tYKzVDvS3XnKy37dekvwPXJl_-u3mNqKooE3kSyJECx/s767/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2020-11-15+15.42.05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="617" data-original-width="767" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyiUNIHovguko77kjC2vQhtrKZCIMn8T7LkclGt52dQn88f6SAFQzxDCFblt9nSzUkVBilX99R1mGYO975FfWXNCLH1lYgI5Tg5tYKzVDvS3XnKy37dekvwPXJl_-u3mNqKooE3kSyJECx/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2020-11-15+15.42.05.png" width="320" /></a></div><br /><p></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-64830492597506447262020-11-14T16:06:00.004+09:002020-11-15T15:42:36.334+09:00TOSの悪夢 - TOS値の設定確認とか<p> <a href="https://ja.wikipedia.org/wiki/IPv4#%E3%83%91%E3%82%B1%E3%83%83%E3%83%88" target="_blank">IPV4</a></p><p><a href="https://ja.wikipedia.org/wiki/IPv6">IPV6</a> </p><p>最近、再びネットワークプログラミングと関わることがあったのであった。</p><p>IPヘッダーにTOSというフィールドがある。で、UDPで信号を送って、それにTOSを設定して確認したいのであった。</p><p>調べると、ncというコマンドで、このTOS値を設定送ることができることがわかった。</p><p> </p><p></p><blockquote>$ nc -u 127.0.0.1 55501 -T 0x0 </blockquote><br /><p></p><p><a href="https://qiita.com/chenglin/items/70f06e146db19de5a659" target="_blank">https://qiita.com/chenglin/items/70f06e146db19de5a659</a><br /></p><p><br /></p><p><br /></p><p><br /></p><p> </p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-8190984631179026642020-11-07T16:02:00.006+09:002020-11-07T16:37:41.467+09:00今日も元気に5GC<p> 5GC関連の資料の探し方</p><p>3GPPの本家、大きい</p><p>
5GCというのはどうも3GPPの勧告というものをベースにして、世界中のあちらこちらで開発しているようだ。
wikipediaの説明を読むと標準プロジェクトというふうに書かれていた。もしかして、これだけでごはんが食べていけるかもしれない(淡い期待)。
TR(技術報告書)、TS(技術仕様書)、どっちが先なのかはわかっていない... </p><p> 【参考】</p><ul style="text-align: left;"><li> <a href="https://www.3gpp.org/">3GPP</a> </li><li> <a href="https://ja.wikipedia.org/wiki/3GPP">3GPP - Wikipedia</a> </li><li><a href="https://ja.wikipedia.org/wiki/%E7%AC%AC5%E4%B8%96%E4%BB%A3%E7%A7%BB%E5%8B%95%E9%80%9A%E4%BF%A1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0#%E6%A8%99%E6%BA%96%E5%8C%96">第5世代移動通信システム - Wikipedia</a> </li><li><a href="https://www.3gpp.org/DynaReport/status-report.htm">3GPP specification status report</a> </li><li><a href="https://www.3gpp.org/specifications/79-specification-numbering">Specification Numbering</a> </li></ul><p> 気になるはTSのほうなんだけど、TSxxのxxがシリーズというものっぽい。</p><p>ちらっとみたことがあるのがTS23,TS29のシリーズなんだけど。</p><p style="margin-left: 40px; text-align: left;">TS23は"Technical realization ("stage 2")" </p><p style="margin-left: 40px; text-align: left;">TS29はSignalling protocols ("stage 3") - intra-fixed-network</p><p> らしい。
</p><ul style="text-align: left;"><li><a href="https://www.3gpp.org/DynaReport/23-series.htm">3GPP specification series: 23series</a> </li><li><a href="https://www.3gpp.org/DynaReport/29-series.htm">3GPP specification series: 29series</a>
</li></ul><p>
TSは、zipになっていて、解凍するとマイクロソフトのワード形式が大半のようだった(全部は知らない...)。yamlファイルが入っているものもあるよ。僕のコンピュータがパワー不足でワードひらくのにもたつく... </p><p>しかし、全体像がわからない...</p><p>5GCのこの難しさは、その前の世代?EPCとかイメージできていないとそうなのかもしれない(たぶん)。</p><p>よくわかってないけど、↓参考 <br /></p><ul style="text-align: left;"><li>
<a href="https://www.nttdocomo.co.jp/corporate/technology/rd/tech/5g/5g06/">5G無線アクセスネットワーク標準化動向 | 企業情報 | NTTドコモ</a>
</li><li><a href="https://www.ctc-g.co.jp/report/column/5g_system/index.html">ネットワークインフラエンジニアから見た5Gシステム|伊藤忠テクノソリューションズ</a></li></ul><p> わからないわからないといってもはじまらないので、まずはとっかかりとして、いろいろ調べていくと、サービスベースアーキテクチャというの導入されたぽい。SBA(Service Based Architecture)。こういったのは興味がでてくる。</p><p> </p><p>
<span lang="EN-GB" style="font-family: "Times New Roman",serif; font-size: 10.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: 游明朝; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-fareast;">3GPP TS 23.501 [</span><span lang="EN-GB" style="font-family: "Times New Roman",serif; font-size: 10.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: 游明朝; mso-fareast-language: ZH-CN; mso-fareast-theme-font: minor-fareast;">3</span><span lang="EN-GB" style="font-family: "Times New Roman",serif; font-size: 10.0pt; mso-ansi-language: EN-GB; mso-bidi-language: AR-SA; mso-fareast-font-family: 游明朝; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-fareast;">] defines the 5G
System Architecture as a Service Based Architecture</span>
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-536870145 1107305727 0 0 415 0;}
@font-face
{font-family:游明朝;
panose-1:2 2 4 0 0 0 0 0 0 0;
mso-font-charset:128;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-2147482905 717749503 18 0 131231 0;}
@font-face
{font-family:"\@游明朝";
mso-font-charset:128;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-2147482905 717749503 18 0 131231 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin-top:0mm;
margin-right:0mm;
margin-bottom:9.0pt;
margin-left:0mm;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman",serif;
mso-fareast-font-family:游明朝;
mso-fareast-theme-font:minor-fareast;
mso-ansi-language:EN-GB;
mso-fareast-language:EN-US;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-size:10.0pt;
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;
mso-ascii-font-family:"Times New Roman";
mso-hansi-font-family:"Times New Roman";
mso-font-kerning:0pt;
mso-ansi-language:EN-GB;
mso-fareast-language:EN-GB;}size:612.0pt 792.0pt;
margin:99.25pt 30.0mm 30.0mm 30.0mm;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}</style> <br /></p><p> </p><p> </p><p> </p><p> </p><p> </p><p>
</p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-83742682659907652802020-11-03T17:11:00.003+09:002020-11-03T18:50:18.973+09:00 openapi事始<p> openapi事始</p><p> </p><p> </p><p>
まずは生成してみることにします。
いろいろやり方があるとは思うけど、
<br />
<a href="https://github.com/jdegre/5GC_APIs">GitHub - jdegre/5GC_APIs: RESTful APIs of main Network Functions in the 3GPP 5G Core Network</a></p><p> </p><p>試してみるのは、TS29510_Nnrf_NFManagement.yaml</p><p>3GPPのサイトを参照するのはよいとは思うけど</p><p> </p><p> <br /></p><p></p><blockquote>$ wget https://raw.githubusercontent.com/jdegre/5GC_APIs/master/TS29510_Nnrf_NFManagement.yaml </blockquote><br /><p></p><p> </p><p>いまいちopenapiわかってないけど</p><p> 生成したいのはmodelだけ</p><p>あと、json<=>objectとのマッピングができることを確認したい。 <br /></p><p> </p><p> </p>
<a href="https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/">Central Repository: org/openapitools/openapi-generator-cli</a>
<br />
<a href="https://openapi-generator.tech/docs/generators/java">Config Options for java</a>
<p> </p><p>なんかうまくいかない<br /></p><p>https://github.com/OpenAPITools/openapi-generator/issues/559<br /></p><p><br /></p><p><br /></p><p>
<br /></p><p> </p><p> </p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-21984537804622606292020-07-27T22:04:00.003+09:002020-07-27T22:07:05.806+09:00java11 gaeのスタンダードエディションで その2<div>前回の続き</div><div><br /></div><div>うまくデプロイして動かすことができたので、次は最適化ということで、不要なjarファイルをwarから取る作業</div><div>webjarsは含めておこないとだめっぽいのでそれ以外←これはただしい?<br /></div><div><br /></div><div>参考)</div><div>[Apache Maven WAR Plugin – Including and Excluding Files From the WAR](<a href="https://maven.apache.org/plugins/maven-war-plugin/examples/including-excluding-files-from-war.html">https://maven.apache.org/plugins/maven-war-plugin/examples/including-excluding-files-from-war.html</a>)<br /></div><div><blockquote> <!-- [START make-a-war_plugin] --><br /> <plugin><br /> <groupId>org.apache.maven.plugins</groupId><br /> <artifactId>maven-war-plugin</artifactId><br /> <version>3.3.1</version><br /> <configuration><br /> <packagingExcludes><br /> WEB-INF/lib/asm*.jar,<br /> WEB-INF/lib/jetty*.jar,<br /> WEB-INF/lib/kuromoji*.jar,<br /> WEB-INF/lib/javax*.jar,<br /> WEB-INF/lib/jackson*.jar,<br /> WEB-INF/lib/commons*.jar,<br /> WEB-INF/lib/firebase*.jar,<br /> WEB-INF/lib/slf4j*.jar,<br /> WEB-INF/lib/classg*.jar,<br /> </packagingExcludes><br /> </configuration><br /> </plugin><br /> <!-- [END make-a-war_plugin] --></blockquote><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-23303271194599295892020-07-27T21:15:00.000+09:002020-07-27T21:15:43.223+09:00java11 gaeのスタンダードエディションで<div>ようやく移行できたのでメモ <br /></div><div><br /></div><div><a href="https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/appengine-java11">java-docs-samples/appengine-java11 at master · GoogleCloudPlatform/java-docs-samples</a><br /></div><div><a href="https://ludoch.github.io/java11.html">AppEngine Java 11 Runtime FAQ</a></div><div><br /></div><div>単純なjspがサーブレットぐらいしか動かさないかなということで、移行は、単純なjettyを含むやりかたでデプロイ</div><div><br /></div><div>以前のやりかたから、なれたとてもシンプルになっているのかもしれない。</div><div>定義は以下</div><div><br /></div><div>例)<br /></div><div><blockquote># [START gae_java11_servlet_yaml]<br />runtime: java11<br />entrypoint: 'java -cp "*" jp.deiji.Main deijitools_googlapp-0.0.1.war'<br /># [END gae_java11_servlet_yaml]</blockquote><br /></div><div>自分で定義した、Mainクラスでjettyを動かして、そこにwarを渡してあげるというものっぽい。</div><div>ローカルの実行はうまくいって、さてGAEにデプロイしたら、</div><div><br /></div><div>java.lang.ClassNotFoundException</div><div><br /></div><div>が発生...ため息がでつつ調べたら以下<br /></div><div><br /></div><div><a href="https://github.com/GoogleCloudPlatform/app-gradle-plugin/issues/355">https://github.com/GoogleCloudPlatform/app-gradle-plugin/issues/355</a></div><div><br /></div><div>そうだんだねーと思いつつ。</div><div><br /></div><div>どうもローカルで実行したときとデプロイしたときで動きが違うのかどうかわからないけど</div><div><br /></div><div><blockquote>entrypoint: 'java -cp "*"</blockquote></div><div>のこの部分の✴︎でmainクラスがあるjarが読まれていない。そりゃそうだ、warはでpackageでつくっていたからなのだから</div><div><br /></div><div>そういえばsampleみてもpom.xmlのpackageはjarだったかなーと思いつつ、jarで作成したらokだったが、引数にわたすwarは?</div><div><br /></div><div>ならば、jarとwarを同時につくればいいんじゃないということで、調べたたら以下</div><div><br /></div><div>[java - Maven - Generate Jar and War - Stack Overflow](<a href="https://stackoverflow.com/questions/10862980/maven-generate-jar-and-war">https://stackoverflow.com/questions/10862980/maven-generate-jar-and-war</a>)<br /></div><div><br /></div><div>これでjarとwarができたけど、もうひと手間</div><div><br /></div><div></div><blockquote><div> <!-- [START make-a-jar_plugin] --><br /> <plugin><br /> <groupId>org.apache.maven.plugins</groupId><br /> <artifactId>maven-jar-plugin</artifactId><br /> <executions><br /> <execution><br /> <id>make-a-jar</id><br /> <phase>compile</phase><br /> <goals><br /> <goal>jar</goal><br /> </goals><br /> <configuration><br /> <!-- need! --><br /> <outputDirectory><br /> ${project.build.directory}/appengine-staging<br /> </outputDirectory><br /> </configuration><br /> </execution><br /> </executions><br /> </plugin><br /> <!-- [END make-a-jar_plugin] --><br /></div><div></div></blockquote><div>ローカルからデプロイするときにappengine-stagingからファイルをコピーしているようなので、作成したjarを入れておく必要があるぽっい。</div><div><br /></div><div>ふーこれで一応うごいたよ。</div><div><br /></div><div>java11</div><div>[deiji tools](<a href="https://deijitools.appspot.com/">https://deijitools.appspot.com/</a>)<br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-31022935614821285752020-07-11T14:16:00.010+09:002020-07-11T14:40:33.506+09:00逆関数なんぞ逆関数なんぞ
<br />
<math xmlns="http://www.w3.org/1998/Math/MathML">
<semantics>
<mrow>
<msub>
<mi>log</mi>
<mn>2</mn>
</msub>
<mo>(</mo>
<mrow>
<mi>x</mi>
<mo>-</mo>
<mn>1</mn>
</mrow>
<mo>)</mo>
</mrow>
<annotation encoding="Mathematica">TemplateBox[List["2", RowBox[List["x", "-", "1"]]], "Log", Rule[DisplayFunction, Function[RowBox[List[SubscriptBox["log", Slot[1]], "(", Slot[2], ")"]]]]]</annotation>
</semantics>
</math>
<br /><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHDUvAnLLAXxxA5n36bE5mxZh_rDUmdcdTwEvlHpfoOYqQGPk9ah9SenrFxE-ZyTw_JCPBK0tt-LFOdzLf7Cg9UomRkGbx3suoQMFRoy3nxTkOORPd5oa8QM4wzGohoHZr_5SklSQV2cA-/s347/WolframAlpha--log2_x_1_______2020_07_11_00_11.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="123" data-original-width="347" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHDUvAnLLAXxxA5n36bE5mxZh_rDUmdcdTwEvlHpfoOYqQGPk9ah9SenrFxE-ZyTw_JCPBK0tt-LFOdzLf7Cg9UomRkGbx3suoQMFRoy3nxTkOORPd5oa8QM4wzGohoHZr_5SklSQV2cA-/s320/WolframAlpha--log2_x_1_______2020_07_11_00_11.png" width="320" /></a></div><div><br /></div><div>Wolfram|Alphaさんを使ってみる。
</div>
<br />
<br />
<a href="https://ja.wolframalpha.com/input/?i=log2%28x-1%29">log2(x-1) - Wolfram|Alpha</a>
<br />
<br />
<div><br /></div><div><a href="https://ja.wolframalpha.com/input/?i=%E9%80%86%E9%96%A2%E6%95%B0">逆関数 - Wolfram|Alpha</a>
</div>
<a href="https://ja.wolframalpha.com/input/?i=-x%5E2%2B1%E3%81%AE%E9%80%86%E9%96%A2%E6%95%B0">-x^2+1の逆関数 - Wolfram|Alpha</a>
<br />
<br /><div>
Wolfram言語では、InverseFunctionを使うらしい。</div><div><br /></div>
<br />
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mrow>
<mn>1</mn>
<mo>-</mo>
<msup>
<mi>x</mi>
<mn>2</mn>
</msup>
</mrow>
</math>
<br />
<div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5Iv_jm3zMGSdFEbe2k7Zu8WO81_04vfUBxdR7geak8GPuvNqFsWDIN9II_Nwwqi6MZfuMjGa07goHLcjful0Ngv8NqgXCc4rm4o0Zl_-YM6llNwKbrh6Oz6q7hDNe1A2yDzgGQCv3JOKr/s404/WolframAlpha--_x_2_1__________2020_07_11_00_37.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="318" data-original-width="404" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5Iv_jm3zMGSdFEbe2k7Zu8WO81_04vfUBxdR7geak8GPuvNqFsWDIN9II_Nwwqi6MZfuMjGa07goHLcjful0Ngv8NqgXCc4rm4o0Zl_-YM6llNwKbrh6Oz6q7hDNe1A2yDzgGQCv3JOKr/s320/WolframAlpha--_x_2_1__________2020_07_11_00_37.png" width="320" /></a></div><div><br /></div><br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-87126363334406395192020-07-05T12:30:00.001+09:002020-07-05T12:52:52.286+09:00数列なんぞ<div dir="ltr" style="text-align: left;" trbidi="on">
階差数列
<br />
勉強中
<br />
数式
<br />
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mrow>
<mrow>
<munderover>
<mo>∑</mo>
<mrow>
<mi>k</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mi>n</mi>
</munderover>
<mrow>
<mo>(</mo>
<mrow>
<mrow>
<mn>3</mn>
<mo>⁢</mo>
<mrow>
<mo>(</mo>
<mrow>
<mi>k</mi>
<mo>-</mo>
<mn>1</mn>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
<mo>+</mo>
<mn>2</mn>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
<mo></mo>
<mrow>
<mfrac>
<mn>1</mn>
<mn>2</mn>
</mfrac>
<mo>⁢</mo>
<mi>n</mi>
<mo>⁢</mo>
<mrow>
<mo>(</mo>
<mrow>
<mrow>
<mn>3</mn>
<mo>⁢</mo>
<mi>n</mi>
</mrow>
<mo>+</mo>
<mn>1</mn>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
</mrow>
</math>
<br />
<a href="https://ja.wolframalpha.com/input/?i=%CE%A3%5Bk%3D1%2Cn%5D%282%2B3%28k-1%29%29">Σ[k=1,n](2+3(k-1)) - Wolfram|Alpha</a>
<br />
等比数列
<br />
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<mrow>
<mrow>
<munderover>
<mo>∑</mo>
<mrow>
<mi>k</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mi>n</mi>
</munderover>
<mrow>
<mn>2</mn>
<mo>⁢</mo>
<msup>
<mn>3</mn>
<mrow>
<mi>k</mi>
<mo>-</mo>
<mn>1</mn>
</mrow>
</msup>
</mrow>
</mrow>
<mo></mo>
<mrow>
<msup>
<mn>3</mn>
<mi>n</mi>
</msup>
<mo>-</mo>
<mrow>
<mn>1</mn>
</mrow>
</mrow>
</mrow>
</math>
<br/>
<a href="https://ja.wolframalpha.com/input/?i=%CE%A3%5Bk%3D1%2Cn%5D2*3%5E%28k-1%29">Σ[k=1,n]2*3^(k-1) - Wolfram|Alpha</a>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-77006387211666512742019-02-11T13:53:00.001+09:002019-02-11T13:53:15.462+09:00~/.appcfg_oauth2_tokens_java を消せば良い<div dir="ltr" style="text-align: left;" trbidi="on">
GAEです。ひさびさにデプロイしようとていエラーになったので。<br />
<blockquote class="tr_bq">
Either the access code is invalid or the OAuth token is revoked.Details: invalid_grant </blockquote>
<br />
環境はmac osxです。<br />
下記のファイルを削除すればよろし<br />
<br />
<blockquote class="tr_bq">
~/.appcfg_oauth2_tokens_java </blockquote>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-46339210404589720262017-01-21T14:16:00.005+09:002021-03-14T19:30:11.122+09:00lenb,midb?<div dir="ltr" style="text-align: left;" trbidi="on">
javaです。<br />
たとえばですが、最新じゃないoracle dbを使用していて、項目を、文字数でなくバイト数で定義してたりするとします。<br />
文字コードは、Shift_JISとします。<br />
そういう場合、アプリケーション側から、dbに登録する場合に、文字をバイト数で切って登録しないと、<br />
桁数オーバーとなってしまいます。<br />
なので、バイト数で切り出して登録するとします。<br />
<br />
Shift_JISを以下、sjisといいます。<br />
<br />
sjisは、1バイト文字、2バイト文字が混合です。<br />
クリアしなければいけない課題があります。<br />
2バイト固定であったりすればバイト数で切る場合は、2の倍数で切ればよいのですが、<br />
素直にバイト数で切ると文字列の一番最後の文字の2バイト文字を半分で切ってしまうことになる場合があります。<br />
<br />
実装方式その1<br />
1文字づつ切り出して、sjis変換して、バイト数チェックしつながら、バイト数を加算していきます。<br />
sjis変換は、javaのStringクラスのgetBytesを使います。<br />
この実装方式はまちがいないです。メリットはコードがわかりやすいことです。デメリットは、文字数が多い場合、切り出しのバイト数が多い場合、1文字1文字の処理なのでそれなりのコストがかかること。<br />
<br />
<br />
実装方式その2<br />
1の方法ですと、文字列が多いと効率が悪くなので、少しだけ効率をよくしてみます。<br />
ただし、実装が面倒となります。<br />
はじめにバイト数を切り取り、最後の1バイトが2文字の片割れかどうか判定し、片割れだとそれ除く処理を行います。<br />
コード表はこちらのサイトを参考にさせてもらっています。<br />
<br />
<a href="http://seiai.ed.jp/sys/text/java/shiftjis_table.html">Shift_JIS 文字コード表</a><br />
キャプチャ(http://seiai.ed.jp/sys/text/java/shiftjis_table.html)<br />
2バイトの上位 <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8I2wFx5CjgRWfX1mOJowXsfXbvsrr3xZTnCH3bxyhUDJ-uewapaGMoI3oSuQCJykH2tw2ga_yYJjomv5C6SrmXlwvrIzyZ7EUizBIVETQLIOGerYrYD2CFVKrTyIJ0dKGLqx75ftST89_/s1600/2017-01-21_1412.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8I2wFx5CjgRWfX1mOJowXsfXbvsrr3xZTnCH3bxyhUDJ-uewapaGMoI3oSuQCJykH2tw2ga_yYJjomv5C6SrmXlwvrIzyZ7EUizBIVETQLIOGerYrYD2CFVKrTyIJ0dKGLqx75ftST89_/s320/2017-01-21_1412.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
sjisの1バイト目と2バイト目なのかは、単純に区別できない場合があります。<br />
<br />
例)キャプチャ(http://seiai.ed.jp/sys/text/java/shiftjis_table.html)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwgGc625oP1YkAPaT_-F6rjW3l5QrNlU-AUFY-vGYn1NDP1IfKFOThY3LFmzwIralLUedV1UUOxWvM1jw5k9xmz9ZfW80PAUZ1ULGnY0ddiSLVNWIB7pJE93BInEc40gGhKDl8rhOL1hQw/s1600/2017-01-21_1414.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwgGc625oP1YkAPaT_-F6rjW3l5QrNlU-AUFY-vGYn1NDP1IfKFOThY3LFmzwIralLUedV1UUOxWvM1jw5k9xmz9ZfW80PAUZ1ULGnY0ddiSLVNWIB7pJE93BInEc40gGhKDl8rhOL1hQw/s320/2017-01-21_1414.png" width="320" /></a></div>
<br />
ですので、一度、切り出したバイト列を変換して、最後の文字が化けていないかチェックします。<br />
化けていたら、その文字を除いて返却するという処理を行います。<br />
<br />
実装方式その3<br /><br />高速版です。なんとなく、できる方法あるなーとは気がついてはいたのですが、自力ではないですが、がんばってコードをシンプルにしました。<br />実は、発想は、実装方式その1と変わらないですが、javaのもっている文字コード処理を直接呼び出すイメージでしょうか。<br />使っているので重要なのは、CharsetEncoderです。Stringのbyte[] getBytes(String charsetName)で使われているのもこれですね。<br />
<br />
参考<br />
<a href="http://d.hatena.ne.jp/kameid/20090314/1237025305">文字列を指定の文字エンコーディングでのバイト数で切る - kameidの備忘録 - Sharpen the Saw!</a><br />
<br />
以下、ソースコード<br />
<pre class="prettyprint">
package a;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
public class TestMidb {
public static void main(String[] args) throws UnsupportedEncodingException {
a();
}
static void a() throws UnsupportedEncodingException {
final String[] テスト文字列 = { "", "a", "aa", "aaaa", "aムム", "ムムa", "ムaa", "ムムムム", "ムムム", "ムム", "ム" };
final int len = 3;
for (String s : テスト文字列) {
final String s01 = new String(midb01(s, len), "sjis");
final String s02 = new String(midb02(s, len), "sjis");
final String s03 = new String(midb03(s, len), "sjis");
final boolean judge = s01.equals(s02) && s02.equals(s03);
System.out.printf("%s [%s] [%s] [%s] %s %n", s, s01, s02, s03, judge);
}
}
/**
* 実装方式1
*
* @param s
* @param byteLen
* @return
*/
public static byte[] midb01(String s, int byteLen) {
final String characterSet = "sjis";
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
int size = 0;
try {
for (int i = 0; (i < s.length() && size < byteLen); i++) {
final byte[] bs = s.substring(i, i + 1).getBytes(characterSet);
final int blen = bs.length;
if ((size + blen) > byteLen)
break;
baos.write(bs);
size += bs.length;
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
return baos.toByteArray();
}
/**
* 実装方式2
*
* @param s
* @param byteLen
* @return
*/
public static byte[] midb02(String s, int byteLen) {
final String charset = "sjis";
try {
final byte[] srcbs = s.getBytes(charset);
if (srcbs.length <= byteLen) {
return srcbs;
}
final byte[] bs = new byte[byteLen];
System.arraycopy(srcbs, 0, bs, 0, byteLen);
final int b = bs[byteLen - 1] & 0xff;
// sjis 1バイト目の範囲か検査する
if ((0x80 <= b && b < 0xA0) || (0xE0 <= b && b <= 0xFF)) {
// 検査のため全体を文字列にする
final String s2 = new String(bs, charset);
// 最後の文字を取得
final char ch = s2.charAt(s2.length() - 1);
// 変換できていない文字か検査する
if (Character.OTHER_SYMBOL == Character.getType(ch)) {
// 1バイト少ないバイト配列を作成
byte[] bs2 = new byte[byteLen - 1];
System.arraycopy(bs, 0, bs2, 0, byteLen - 1);
return bs2;
}
}
return bs;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
/**
* 実装方式3
* @param s
* @param byteLen
* @return
*/
public static byte[] midb03(String s, int byteLen) {
final String charsetName = "sjis";
final Charset charset = Charset.forName(charsetName);
final byte[] bs = new byte[byteLen];
final ByteBuffer outByteBuffer = ByteBuffer.wrap(bs);
final char[] array = s.toCharArray();
final CharBuffer inCharBuffer = CharBuffer.wrap(array);
final CharsetEncoder charsetEncoder = charset.newEncoder();
charsetEncoder.encode(inCharBuffer, outByteBuffer, true /* endOfInput */);
// 余ったぶんは切り捨てる
outByteBuffer.flip();
// 切り捨てたあとのサイズで返却する
final byte[] bs2 = new byte[outByteBuffer.limit()];
outByteBuffer.get(bs2);
return bs2;
}
}
</pre>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-89542845786276983382017-01-18T23:04:00.001+09:002017-01-18T23:04:32.692+09:00半角スペースの悪夢で<div dir="ltr" style="text-align: left;" trbidi="on">
半角スペースの悪夢です。<br />
<br />
古いoracleです。<br />デフォルト値に半角スペース。<br />null不許可。<br />DAOの作りによるとは思うのだけど、作りとして、エンテイィティオブジェクトでは、<br />初期値に半角スペースをもつようになっている。<br /><br />で、ここでありがちな問題だけど、バグの温床となることが、<br />画面側で、入力時には半角スペースはもちろん邪魔なので、除去した状態になっている。<br /><br />入力した値と、エンテイィティオブジェクトの中身を比較したい。<br />
<br />
<br />
プログラムでとりうる方法<br />
<br />方式1<br />入力した値が空文字なら、半角スペースを補完して比較する。<br />方式2<br />入力した値にたいしてトリムをかけて、あわせてエンテイィティオブジェクトの値にもトリムをかけて比較する。<br /><br />なぜこうするかというと、値がない状態で比較したいわけなのだけど、入力側は値がない状態は、空文字となっているし、<br />DB側はデフォルト値は半角スペースという状態だからなのだけど、なにがいいたいかというと、面倒くさいということなのであった。<br />
<br />
コーディングの基準がないと、記述する人でまちまちな方式をとるので、こういうのははじめに基準作ったほうが吉。<br />
<br />エンテイィティはエンティティですね。はい。</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-46656026329562047272017-01-10T23:13:00.001+09:002021-03-14T19:30:55.129+09:00ThreadLocalか。<div dir="ltr" style="text-align: left;" trbidi="on">
Javaです。ThreadLocalです。<br />
<br />
<br />
<br />
<pre class="prettyprint">
package a;
public class TestThreadLocal {
static class A {
final ThreadLocal<String> value1 = new ThreadLocal<>();
String value2;
void setValue(String value) {
this.value1.set(value);
this.value2 = value;
}
void print(String marker) {
System.out.printf("%s value1:%s value2:%s threadName:%s%n", marker, this.value1.get(), this.value2, Thread.currentThread().getName());
}
}
public static void main(String[] args) throws InterruptedException {
final A a = new A();
a.print("a1==>");
a.setValue("a");
a.print("a2==>");
new Thread(new Runnable() {
@Override
public void run() {
a.print("b1==>");
a.setValue("b");
a.print("b2==>");
}
}).start();
Thread.sleep(1);
new Thread(new Runnable() {
@Override
public void run() {
a.print("c1==>");
a.setValue("c");
a.print("c2==>");
}
}).start();
Thread.sleep(1);
a.print("a3==>");
}
}
</pre>
<br />
結果
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2DzAFbmYaWOR2uWQM4CbAKzKUNv2wrsLrsPIHIuePyiQC8pmo8iYNk4_CxPnTaxeObyzT-UczOVmHytuQbiE9QmOqvrRBQcJB1uh5QrPJCyYGX9aAWewaCmurZYZsdzFjSxRp0Ev_0o3G/s1600/2017-01-10_2311.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2DzAFbmYaWOR2uWQM4CbAKzKUNv2wrsLrsPIHIuePyiQC8pmo8iYNk4_CxPnTaxeObyzT-UczOVmHytuQbiE9QmOqvrRBQcJB1uh5QrPJCyYGX9aAWewaCmurZYZsdzFjSxRp0Ev_0o3G/s320/2017-01-10_2311.png" width="320" /></a></div>
<br />
Webとかで使う場合、スレッドが再利用されるので、しっかり後片付けしないとだめだよ。<br />
参考<br />
<ul style="text-align: left;">
<li><a href="http://qiita.com/yoshi-naoyuki/items/507c5c3ea6027033f4bb">JavaのThreadLocalとスレッドセーフについて - Qiita</a></li>
<li><a href="https://www.jpcert.or.jp/java-rules/tps04-j.html">TPS04-J. スレッドプールの使用時にはThreadLocal変数の再初期化を確実に行う</a> </li>
</ul>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-43275830552447562602017-01-10T22:52:00.006+09:002020-11-14T15:55:51.971+09:00いたいめにあうこと<div dir="ltr" style="text-align: left;" trbidi="on">
「痛い目に合う」。<br />
成長する絶好のチャンスなのかもしれない。<br />
そうだとは思うのだけど、はたして、「痛い目に合う」がことが必要なのか。<br />
何が言いたいかというと「痛い目も」、まあ、度合いだと思うわけなのだが、痛い目に合わないと成長できないのも悲しいかなと。本番環境にまちがってデプロイして、お客様に迷惑かけましたとか、まあ、これはいいすぎだけど、だから手順をしっかり確認して、注意しようね、とか悲しすぎる。。。書いたSQLが遅すぎて、おこられたとか、悲しすぎる。わざと彼ら、彼女ら痛い目に合わせて温かい目で見守ってあげるそれが親心か。。。なんかやだな。反省。 </div><div dir="ltr" style="text-align: left;" trbidi="on"><br />
</div><div dir="ltr" style="text-align: left;" trbidi="on">§追記§</div><div dir="ltr" style="text-align: left;" trbidi="on">現時点で主張、痛い目にあわないと人は成長しない。</div><div dir="ltr" style="text-align: left;" trbidi="on">痛い目を失敗と言い替えても良いよ <br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-89982743333629598262017-01-09T15:38:00.003+09:002021-03-14T19:34:52.843+09:00jsr-223 - 追記中<div dir="ltr" style="text-align: left;" trbidi="on">
jsr-223です。<br />
<br />
<ul style="text-align: left;">
<li><a href="https://www.jcp.org/en/jsr/detail?id=223">The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 223</a></li>
</ul>
<br />
javaからJVM言語をスクリプト実行したいです。<br />
主観ですが、メジャーな言語と思えるものを調べてみました。<br />
かなりおおざっぱです。<br />
<br />
対象 <br />
clojure,groovy,scala,jruby,jython,kotlin, javascript<br />
<br />
<div style="overflow: scroll;">
<style>table { }.font5 { color: black; font-size: 12pt; font-weight: 400; font-style: normal; text-decoration: none; font-family: メイリオ,sans-serif; }.font6 { color: windowtext; font-size: 6pt; font-weight: 400; font-style: normal; text-decoration: none; font-family: "MS Pゴシック",sans-serif; }td { padding-top: 1px; padding-right: 1px; padding-left: 1px; color: black; font-size: 12pt; font-weight: 400; font-style: normal; text-decoration: none; font-family: "MS Pゴシック",sans-serif; vertical-align: bottom; border: medium none; white-space: nowrap; }.xl63 { font-family: メイリオ,sans-serif; }.xl64 { font-family: メイリオ,sans-serif; border: 0.5pt solid windowtext; }.xl65 { font-family: メイリオ,sans-serif; border: 0.5pt solid windowtext; background: rgb(218, 238, 243) none repeat scroll 0% 0%; }ruby { }rt { color: windowtext; font-size: 6pt; font-weight: 400; font-style: normal; text-decoration: none; font-family: "MS Pゴシック",sans-serif; display: none; }</style>
<br />
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 1137px;">
<colgroup><col style="mso-width-alt: 2816; mso-width-source: userset; width: 66pt;" width="66"></col>
<col style="mso-width-alt: 6826; mso-width-source: userset; width: 160pt;" width="160"></col>
<col style="mso-width-alt: 18858; mso-width-source: userset; width: 442pt;" width="442"></col>
<col style="mso-width-alt: 12416; mso-width-source: userset; width: 291pt;" width="291"></col>
<col style="mso-width-alt: 7594; mso-width-source: userset; width: 178pt;" width="178"></col>
</colgroup><tbody>
<tr height="19" style="height: 19.0pt;">
<td class="xl65" height="19" style="height: 19.0pt; width: 66pt;" width="66">言語</td>
<td class="xl65" style="border-left: none; width: 160pt;" width="160">engine
name(shortName)</td>
<td class="xl65" style="border-left: none; width: 442pt;" width="442">Factoryクラス</td>
<td class="xl65" style="border-left: none; width: 291pt;" width="291">JAR</td>
<td class="xl65" style="border-left: none; width: 178pt;" width="178">特記</td>
</tr>
<tr height="19" style="height: 19.0pt;">
<td class="xl64" height="19" style="border-top: none; height: 19.0pt;">Clojure</td>
<td class="xl64" style="border-left: none; border-top: none;">Clojure</td>
<td class="xl64" style="border-left: none; border-top: none;">clojure.contrib.jsr223.ClojureScriptEngineFactory</td>
<td class="xl64" style="border-left: none; border-top: none;">clojure-jsr223-1.2.jar</td>
<td class="xl64" style="border-left: none; border-top: none;"> </td>
</tr>
<tr height="19" style="height: 19.0pt;">
<td class="xl64" height="19" style="border-top: none; height: 19.0pt;">Groovy</td>
<td class="xl64" style="border-left: none; border-top: none;">Groovy</td>
<td class="xl64" style="border-left: none; border-top: none;">org.codehaus.groovy.jsr223.GroovyScriptEngineFactory</td>
<td class="xl64" style="border-left: none; border-top: none;">groovy-jsr223-2.4.7.jar</td>
<td class="xl64" style="border-left: none; border-top: none;"> </td>
</tr>
<tr height="19" style="height: 19.0pt;">
<td class="xl64" height="19" style="border-top: none; height: 19.0pt;">Scala</td>
<td class="xl64" style="border-left: none; border-top: none;">scala</td>
<td class="xl64" style="border-left: none; border-top: none;">scala.tools.nsc.interpreter.IMain$Factory</td>
<td class="xl64" style="border-left: none; border-top: none;">scala-compiler-2.11.8.jar</td>
<td class="xl64" style="border-left: none; border-top: none;">-Dscala.usejavacp=true</td>
</tr>
<tr height="19" style="height: 19.0pt;">
<td class="xl64" height="19" style="border-top: none; height: 19.0pt;">Kotlin</td>
<td class="xl64" style="border-left: none; border-top: none;">kotlin</td>
<td class="xl64" style="border-left: none; border-top: none;">org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory</td>
<td class="xl64" style="border-left: none; border-top: none;">kotlin-jsr223-local-example-1.1-M04-eap-14.jar</td>
<td class="xl64" style="border-left: none; border-top: none;"> </td>
</tr>
<tr height="19" style="height: 19.0pt;">
<td class="xl64" height="19" style="border-top: none; height: 19.0pt;">JRuby</td>
<td class="xl64" style="border-left: none; border-top: none;">jruby</td>
<td class="xl64" style="border-left: none; border-top: none;">org.jruby.embed.jsr223.JRubyEngineFactory</td>
<td class="xl64" style="border-left: none; border-top: none;">jruby-complete-9.1.6.0.jar</td>
<td class="xl64" style="border-left: none; border-top: none;"><span class="font5">-Dpython.import.site=FALSE</span></td>
</tr>
<tr height="19" style="height: 19.0pt;">
<td class="xl64" height="19" style="border-top: none; height: 19.0pt;">Jython</td>
<td class="xl64" style="border-left: none; border-top: none;">jython</td>
<td class="xl64" style="border-left: none; border-top: none;">org.python.jsr223.PyScriptEngineFactory</td>
<td class="xl64" style="border-left: none; border-top: none;">jython-2.7.0.jar</td>
<td class="xl64" style="border-left: none; border-top: none;"> </td>
</tr>
<tr height="19" style="height: 19.0pt;">
<td class="xl64" height="19" style="border-top: none; height: 19.0pt;">javascript</td>
<td class="xl64" style="border-left: none; border-top: none;">javascript</td>
<td class="xl64" style="border-left: none; border-top: none;">com.sun.script.javascript.RhinoScriptEngineFactory#java7</td>
<td class="xl64" style="border-left: none; border-top: none;">resources.jar</td>
<td class="xl64" style="border-left: none; border-top: none;">java8はNashorn</td>
</tr>
</tbody></table>
<br /></div>
<br />
jsr-223って、もともとサーバーサイドで各種スクリプト言語の実行を目指したもののようですね。<br />
<br />
こうやってみてみるとJVM言語っていろいろありますね。かなり貪欲というか。 <br />
<br />
呼び出し方は、ScriptEngineManagerにたいして、エンジン名を指定して、ScriptEngineを取得します。取得できない場合は、nullが返ってくるようです。<br />
<br />
ちなみに、各ScriptEngineFactoryはプログラムの起動時に行われるようです。ScriptEngineFactoryの定義は、各ライブラリ(jar)のMETA-INF/services/javax.script.ScriptEngineFactory ファイルに記述されています。<br />
ですので、このファイルを探せばよいというのがわかります。ただし、このファイルに記述されているのに実際のクラスがない場合、不幸なことにプログラム全体が起動しません。<br />
# 遅延ロードでできないのかしら? <br />
<br />
参考 clojure<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAdh7BFC2hmJJx32NHtb-yVS9dUAahbUl4HopS2VHKbKGlICPUMkZBRR69_4v6-tu17LtxBRAFHE0nCNHCdiO5_WhcE1xWnSUx3IHs-y6STXvdVgfVPn99cgsRPCqYCIO2hBtAuDssd-Hd/s1600/2017-01-09_1539.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAdh7BFC2hmJJx32NHtb-yVS9dUAahbUl4HopS2VHKbKGlICPUMkZBRR69_4v6-tu17LtxBRAFHE0nCNHCdiO5_WhcE1xWnSUx3IHs-y6STXvdVgfVPn99cgsRPCqYCIO2hBtAuDssd-Hd/s320/2017-01-09_1539.png" width="320" /></a></div>
<br />
以下、呼び出しソース <br />
<br />
<div class="prettyprint">
package jsr223;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class TestMain {
public static void main(String[] args) throws ScriptException {
a();
}
static void a() throws ScriptException {
// まとめて実行するとjava.lang.OutOfMemoryErrorする....
jsr223_noengine();
jsr223_Clojure();
jsr223_Groovy();
jsr223_Scala();
jsr223_JRuby();
jsr223_Jython();
jsr223_Javascript();
jsr223_Kotlin();
}
static void jsr223_noengine() throws ScriptException {
final ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
final String shortName = "xxxx";// 存在しないものを指定
final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName);
if (scriptEngine == null) {
System.out.println("*** 存在しないものを指定した場合は、script engineはnullになります。");
} else {
scriptEngine.eval("");
}
}
static void jsr223_Clojure() throws ScriptException {
final ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
final String shortName = "Clojure";
final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName);
scriptEngine.eval("(println \"clojure \")");
}
static void jsr223_Groovy() throws ScriptException {
final ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
final String shortName = "Groovy";
final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName);
scriptEngine.eval("println \"groovy \"");
}
static void jsr223_Scala() throws ScriptException {
final ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
final String shortName = "scala";
final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName);
scriptEngine.eval("println(\"scala \")");
}
static void jsr223_JRuby() throws ScriptException {
final ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
final String shortName = "jruby";
final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName);
scriptEngine.eval("printf \"jruby \n\"");
}
static void jsr223_Jython() throws ScriptException {
final ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
final String shortName = "jython";
final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName);
scriptEngine.eval("print 'jython'");
}
static void jsr223_Javascript() throws ScriptException {
final ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
final String shortName = "javascript"; // java7 Rhino java8 Nashorn
final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName);
scriptEngine.eval("print('javascript')");
}
static void jsr223_Kotlin() throws ScriptException {
final ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
final String shortName = "kotlin";
final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(shortName);
scriptEngine.eval("println(\"Kotlin\")");
}
}
</div>
<br />
<br />
参考<br />
<ul style="text-align: left;">
<li><a href="http://yyyank.blogspot.jp/2015/04/javajsr.html">【Javaの仕様が決まるとき】JSRの歩き方(基本編) - Javaプログラマのはしくれダイアリー</a> </li>
<li><a href="http://qiita.com/y_q1m/items/5d6eead589528fe5e83e">Java の JSR-223 実装を試す - Qiita</a></li>
<li><a href="http://d.hatena.ne.jp/Nagise/20140227/1393500657">Java書けるんなら当然JavaScript呼び出せるよね? - プログラマーの脳みそ</a> </li>
</ul>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-7491139519346518312017-01-09T10:19:00.001+09:002017-01-09T10:19:21.017+09:002017年になってしまいましたね!<div dir="ltr" style="text-align: left;" trbidi="on">
あけおめことよろ!<br />
2017は素数のようです。<br />
<br />
2016は2記事しか書かなかったです。いろいろやってたとは思うんですが、あまり記憶がない一年でした(まあ、毎年、そのようなことをいったり思ったり)。<br />
<br />
2017年の前半(6月までぐらい)は、飛躍のための準備ということで、きっちりかっちりやっていきたいです。<br />
<br />
昨年は、アンドロイドでの開発をちらほらやっていて、バックグラウンド処理とか調べて、実現できず、へんこんだりしてたり。iOSで開発はプライベートではできず。<br />
GAEでjoddを使っての開発はノウハウはちょっとたまったかな。いろいろコンピュータ関連の本を処分して、古いmacともお別れして、シンセサイザーを数台ともお別れしました。 <br />
<br />
AIとかまあいまのぼくがやってるところとは遠いキーワードを目にしつつ、おもしろいことやりたいなーと漠然と思いつつ、なんだかんだ、入り口が違うと出口も変わる感じなので、そのあたり注意したいところ。<br />
<br />
目標は具体的にたてるものというわけで、今年は、30メモはしたいぞ。<br />
<br />
あらためて、今年もよろしくです。</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-55165060598120800522016-12-29T13:31:00.003+09:002016-12-29T13:33:17.816+09:00不幸は忘れたころにやってくる - OutOfMemoryError<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
この一年、レガシーな環境の開発に参加させてもらっています。<br />
java1.4で、各種ライブラリは、2006年、ほっとだったspring,hibernateのバージョンそのままです。<br />
<br />
それで不幸は忘れた頃にやってくるわけですが、OutOfMemoryErrorがぽこぽこ発生。<br />
<br />
結論からいいますと、java1.4と使用していたcommons-fileuploadの組み合わせが原因。<br />
<br />
こちらのブログの内容が、まさにヒットでした。<br />
<br />
<a href="http://hhelibex.hatenablog.jp/entry/20091207/1260185026">File.deleteOnExit() を使用していたライブラリ - HHeLiBeXの日記 正道編</a>
<br />
<br />
java1.4のdeleteOnExitは、メモリーリークというか、使ったらシステムが落ちるまで掴みぱなしでCヒープが消費されていきます。<br />
<br />
javaヒープは十分にあるようにみえました。gcも動いてるし、なのにALLOCATION FAILUREがおきて、コアをはいてずどーんと落ちます。<br />
<br />
javaヒープ、CヒープとOutOfMemoryErrorについての説明は、下記の記事がよかったです。こういう記事はずーと残って欲しいな。<br />
2010年の記事です。<br />
<br />
<a href="http://www.atmarkit.co.jp/ait/articles/1003/11/news091.html">現場にキく、Webシステムの問題解決ノウハウ(4):調査の難しい「OutOfMemoryError」事例、5選 - @IT</a>
<br />
Native Methodの呼び出しでのOutOfMemoryErrorですね。はい。<br />
<br />
いろいろ不運な要素が重なりました。<br />
<br />
WEBのアプリケーションは1日一度再起動されるので、これが数千件程度の呼び出しであれば、問題は発覚しなかったのでしょう。<br />
<br />
わかったのは、strutsとこのバージョンのcommons-fileuploadですと、画面のformの項目数分、File.deleteOnExit()が呼ばれるのでした。
<br />
そして、画面の項目数が100以上あり、submitするたびにFile.deleteOnExit()が呼ばれます。<br />
<br />
それで、上のブログの記事を参考に、fileuploadのバージョンを1.1にあげました。ただし、このバージョンのfileuploadは、commons-ioを必要とします。<br />
<br />
依存ライブラリがひとつ増えてしまう。。。<br />
<br />
<a href="https://commons.apache.org/proper/commons-fileupload/">commons-fileupload – Home</a>
<br />
<a href="http://commons.apache.org/proper/commons-io/">Commons IO – Commons IO Overview</a>
<br />
いまの時代、1.4に対応したものってold versionの深い闇にしかないんですよね。
<br />
そして上記のブログには続きがあるようで、Commons IOにも何かしら問題が潜んでいるようでして。。。<br />
<a href="http://hhelibex.hatenablog.jp/entry/20100108/1262969268">Webアプリケーション開発の際の注意事項(3) - HHeLiBeXの日記 正道編</a>
<br />
<br />
この問題まだ続くのかな(笑)<br />
<br />
さて、何年も、メモしてきたこのブログですが、今年は2回しか、書けていなかったです。いろいろ知見を得ることができた1年だったのですが、メモしなかったのは反省です。来年(2017年)こそは。。。。
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-7616979561464828711.post-73075493890478720932016-01-03T18:48:00.001+09:002016-01-03T18:48:46.476+09:002016年になりましたね!<div dir="ltr" style="text-align: left;" trbidi="on">
2016年になりました。<br />
<br />
さて今年は、そろそろ違ったことやりたいなーとは思うんですけど。<br />
アプリ制作は止まっているし、幾つか作る仕組みとして実現してみたいこともあるのですが、2015はちょっと停滞気味なようで、地味にコードは書いてたんですけどね。<br />
<br />
今年の前半は、お仕事で関わってるサービスが世にでることを目標に。それがうまくいけば、それを発展させて次の開発に。<br />
<br />
アプリは、2〜3本!<br />
<br />
急がば回れで、頑張れたらなと。<br />
今年もよろしくお願いいたします。</div>
Unknownnoreply@blogger.com0