エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

TypeScriptでハマったこと インタフェース編

きっかけ

業務でTypeScriptを使っていたが、意味不明なエラーが出て、かなり悩んだ。

インタフェースの重複の問題

コード

問題になったコードとは異なるが、だいたい同じような感じ。

export interface testif1 <T1, T2>{
    value1: T1;
    value2: T2;
}

export interface testif1 <E1, E2>{
    value3: E1;
    value4: E2;
}

class Sample implements testif1<string, string> {

}

おきること

このコードだと、実際にコンパイルエラーになる。
Javaをやってきたら「何で?」って思うけど、エラーなのだ。
コンパイルエラーの原因は、インタフェースがマージされるため、宣言しなければいけない型が増える。

上記コードは、下記のインタフェースを実装するのと同じ。

export interface testif1 <T1, T2, E1, E2>{
    value1: T1;
    value2: T2;
    value3: E1;
    value4: E2;
}

対策

namespace使うなり、モジュール化する。
影響範囲が小さくなるようにすることが大切。

こんな状況に陥ることはレアケースだと思うが、知っている/知らないでは、ドツボにハマることがある。

mac os x の.bashrcの設定方法と反映方法

そもそも

初心者的なことが分かっていなかったのでメモ。
知っている人は、嘲り笑うがいい!

./bash~の種類

~/.bash_profile

ユーザ単位の設定ファイル。
あれば読み込まれる。

~/.bash_login

ログインした際、~/.bash_profileが存在しなければ読込まれる設定ファイル。
なくてもいい。
ややこしいので、なるべく~/.bash_profileに寄せるべき。

~/.profile

ログイン時、~/.bash_profile ・ ~/.bash_loginが存在しなければ読み込まれる設定ファイル。
なくても良い。

~/.bashrc

bash実行時に読み込まれる設定ファイル。
ターミナル起動時に読み込ませたい場合、sourceで反映されることができる。
しかし、ターミナル再起動した場合は、毎回コマンドを叩く必要があるので、下記の設定を.bash_profileにしておくのが楽。

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

使い分け

~/.bash_profile, ~/.bashrcで十分。

~/.bash_profile

ログイン時に行う処理を記載する。

~/.bashrc

ターミナル起動時に必要な処理を記載する。
パスやコマンドのエイリアスなど。

ハマったこと

そもそもの発端は、node.jsの環境をmacに作ろうと思ったから。
bashrcにパスを通していたが、反映されずに困惑していた。
ターミナル再起動時に毎回sourceコマンドを叩く必要はないはずと思い、いろいろ調べた。

参考サイト

.bash_profile ? .bashrc ? いろいろあるけどこいつらなにもの? - Qiita

mac os x ターミナルで.bashrcを反映させるには | MATUKEN's Blog

Tabulator概要

Tabulator

olifolkerd.github.io

GitHub - olifolkerd/tabulator: A table generation JQuery UI Plugin

概要

高機能なテーブルが作成できると聞いて、試してみたくなった。
REST-fullなwebページ作成の補助につながる気がしたので、気になった。
あとは、Excelを殺してくれそうな気がしたので。。。

試作

前準備

とりあえず、下記をインクルードしていれば、試せる。

<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<link href='https://fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">

<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>

テーブルの作成

<div id="example-table"></div>

指定した要素にテーブルを適用してみる。
当然、jqueryなので、id名指定以外にもクラス名指定もできる。
今回は、とりあえずid名指定で確認。

以下でテーブルを作成する。

$("#example-table").tabulator();

テーブルはできるけど、表示するものが無いので、次で表示設定をする。

列定義

$("#example-table").tabulator({
  columns:[
    {title:"Name", field:"name", sortable:true, width:200},
    {title:"Progress", field:"progress", sortable:true, sorter:"number"},
    {title:"Gender", field:"gender", sortable:true},
    {title:"Favourite Color", field:"col", sortable:false},
    {title:"Date Of Birth", field:"dob"},
    {title:"Cheese Preference", field:"cheese"},
  ],
});

列の定義内容

  • title
    必須:この列のヘッダーに表示されるタイトル。
  • field
    必須:(アイコン/ボタン列では不要)データ配列内のこの列のキー。
  • align
    列のテキストの配置。設定内容は、(left | center | right)
  • width
    列の幅を設定。ピクセル単位、テーブル全体の幅に対するパーセンテージの設定も可能。未設定だと、システムが最適と判断した幅になる。
  • minWidth
    列の最小幅を設定。
  • sortable
    列のデータを並べ替可否の設定
  • sorter
    列のソート方法指定。
  • formatter
    データのフォーマット指定。
  • onClick
    列のセルをクリックしたときの処理内容。
  • editable
    編集可否の設定。Bool値のみ設定可。デフォルト:false
  • editor
    データを編集するときに使用するエディタの設定
  • visible
    可視設定。Bool値のみ設定可。デフォルト:true
  • cssClass
    列のヘッダーとセルに適用するCSSクラスを設定。
  • tooltip
    列の各セルホバー時のツールチップを設定する。
  • tooltipHeader
    列見出しホバー時のツールチップを設定する。
  • editableTitle
    ヘッダータイトルの編集可否設定。
  • headerFilter
    ヘッダ内の要素から列をフィルタリング。
  • mutator
    テーブルに解析されるときに列の値を操作する関数。
    ぶっちゃけ、使い方がよく分からん。
  • mutateType
    データ解析、セル編集、またはその両方で突然変異を発生させるかどうかを定義。
    ぶっちゃけ、使い方がよく分からん。
  • accessor
    getData関数を使用する前の処理内容を記載する。

テーブルへのデータの読み込み

今回はとりあえず配列で試す。

var sampleData = [
  {id:1, name:"Oli Bob", progress:12, gender:"male", rating:1, col:"red", dob:"", car:1, lucky_no:5, cheese:"Cheader"},
  {id:2, name:"Mary May", progress:1, gender:"female", rating:2, col:"blue", dob:"14/05/1982", car:true, lucky_no:10, cheese:"Gouda"},
  {id:3, name:"Christine Lobowski", progress:42, gender:"female", rating:0, col:"green", dob:"22/05/1982", car:"true", lucky_no:12, cheese:"Manchego"},
  {id:4, name:"Brendon Philips", progress:100, gender:"male", rating:1, col:"orange", dob:"01/08/1980", lucky_no:18, cheese:"Brie"},
  {id:5, name:"Margret Marmajuke", progress:16, gender:"female", rating:5, col:"yellow", dob:"31/01/1999", lucky_no:33, cheese:"Cheader"},
];

データを割り当てる。
割り当てるには、setData()を使う。
メソッドを呼ぶんじゃなくて、tabulatorの中で処理するので、注意。

$("#example-table").tabulator("setData", sampleData);

HTMLファイルを開くと、指定したJavaScript配列のデータが表示される。

サンプルHTML

<html>
    <head>
       <title>tabulator-test</title>
       <link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
       <link href='https://fonts.googleapis.com/css?family=Montserrat:400,700' rel='stylesheet' type='text/css'>
       <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
       <link rel="stylesheet" href="tabulator-master/tabulator.css">

       <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
       <script type="text/javascript" src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
       <script type="text/javascript" src="tabulator-master/tabulator.js"></script>
   </head>
    <body>
        <div id="example-table"></div>

        <script type="text/javascript">
           $("#example-table").tabulator({
             columns:[
               {title:"Name", field:"name", sortable:true, width:200},
               {title:"Progress", field:"progress", sortable:true, sorter:"number"},
               {title:"Gender", field:"gender", sortable:true},
               {title:"Favourite Color", field:"col", sortable:false},
               {title:"Date Of Birth", field:"dob"},
               {title:"Cheese Preference", field:"cheese"},
             ],
           });

           var sampleData = [
             {id:1, name:"Oli Bob", progress:12, gender:"male", rating:1, col:"red", dob:"", car:1, lucky_no:5, cheese:"Cheader"},
             {id:2, name:"Mary May", progress:1, gender:"female", rating:2, col:"blue", dob:"14/05/1982", car:true, lucky_no:10, cheese:"Gouda"},
             {id:3, name:"Christine Lobowski", progress:42, gender:"female", rating:0, col:"green", dob:"22/05/1982", car:"true", lucky_no:12, cheese:"Manchego"},
             {id:4, name:"Brendon Philips", progress:100, gender:"male", rating:1, col:"orange", dob:"01/08/1980", lucky_no:18, cheese:"Brie"},
             {id:5, name:"Margret Marmajuke", progress:16, gender:"female", rating:5, col:"yellow", dob:"31/01/1999", lucky_no:33, cheese:"Cheader"},
           ];
           
           $("#example-table").tabulator("setData", sampleData);
       </script>
    </body>
</html>

その他のデータ指定方法

Ajax

$("#example-table").tabulator("setData", "http://www.exampleurl.com/data");

HTML

$("#example-table").tabulator({});

参考

HTMLのテーブルをJSONで動的に更新できる「Tabulator」がスゴい! - WPJ

2016年の振り返りと2017年の目標

2016年の振り返り

KPT法でとりあえず振り返る。

K:やれてよかったこと

  • ブログを大きな間隔を長い期間開けずに書き続けた

    • 詳細
      1ヶ月以上の間隔は開かなかったはず。
      なんとか続けられた。
      やり抜くことは、意外と難しい。
      やり続けることで、文章力が上がった気がする。。。
      あとは、常に情報収集を意識できたかな?
      これは、継続してやりたい。
  • Gitを業務で触れた

    • 詳細
      やっとSVN以外のVCSを業務で使えた。
      GitHubとか使っていたから、Gitを知らないわけではなかったが、チームで使うって意味が初だった。
      使ってみて感じたが、Gitコマンド覚えないとダメだなと感じた。
      なぜなら、やっていることが明確に見えないから。
      やることが魔法の言葉みたいに感じた。
      ※個人で使っているときもよく分かってなかった。。。
      2017年は、それを克服したい。
  • AWSシステム開発できた

    • 詳細
      触ってみた感じ、全然ローカル開発と違和感ない。
      そもそも、開発時点からAWS環境のDBを使う意味があったのか、甚だ疑問だが。。。。
      個人でAWSで開発ができないから、いい経験にはなったと思いたい。
      AWSも個人開発者向けのプランがあればいいのにな。
      容量を大幅制限することで、格安プランを出すとか。
      個人でやるには、料金的にキツイ気がする。
      ※俺の収入が低いってのもあるかもしれないが。
  • Powershellを少し学べた

    • 詳細
      CSVを読み込んで、特定条件のデータを抜き出す方法を覚えた。
      DOSだったらまずやらないようなことが、簡単にできたのが意外だった。
      結構応用が効き、大体の開発環境はWindowsなので、ツールとして使えるようにしておきたい。

P:悪かったこと

  • Java以外をやれていない
    • 詳細
      Pyconには出たけど、全然Pythonプログラミングできていない。
      セッションの内容は、Javaで得た知識やシステム開発を通して得た知識で付いて行けるので、さほど問題ではなかった。
      Powershellは、言語って感じじゃないから、除外。
      そろそろ、複数言語使えないとまずい年代かな?
      なるはやで使えるようにしておきたい。
      Python以外なら、SwiftかC++
      ネイティブ系の開発をできるようになりたい欲望がある。 Webエンジニアなら分かってくれるハズ!
      Pythonは、ビッグデータ処理やら機械学習など、今後を見据えて必須だと感じているから習得したい。
  • 情報処理技術者試験に合格できなかった
    • 詳細
      セキュリティスペシャリストを受けたけど、合格まで至らなかった。
      30歳までに何かしらの高度情報処理技術者を合格したかったけど、もう来年しかチャンス無いね。。。
      30歳になっても受け続けはしますが。
      試験制度って少し変わっているんだな。
      セキュリティスペシャリストを受けてきたけど、試験制度見たら、情報処理技術者の方が合格したい試験な気がする。
      次の試験は、データベーススペシャリストにしようかな?
      今年が最後だと思って、きっちり予定を立てて試験勉強していきたい。
  • OJCPを受験できなかった
    • 詳細
      勉強はしていたが、受ける機会がなかった。
      最後の方は、業務多忙が影響しているせいもあるが、それは仕方ないね。
      OJCPって、過去問解いてたけど、引掛け問題が頭に来るぜ!
      個人的には、手応えがあったので、Java9が出る前に合格しておきたい。
  • ブログで知識が散らばったまま
    • 詳細
      気になったときに調べはするんだが、それが散らばったままだな。。。
      wiki化するなど、情報をカテゴライズして見やすいようにまとめてたい。
      ココらへんは、ひしだまブログを参考にしたい。
      はてなブログでこういうことはできるのだろうか?
      ブログは、Markdownで書きやすいんだけど、wikiっぽいものを作るのが面倒くさい気がする。
      やり方あるのかな?
      それっぽい機能は、見てもなかった気がする。
      ローカルにKnowledge/GitLab環境作ってみようか画策中。
      いいアイディア持っている人がいたら、コメントをプリーズ!!

T:次に試すこと(2017年目標)

  • JavaScriptJavaレベルに!
    • 詳細
      とりあえず、複数言語取得に向けて、一番手軽にやれるものを。
      もちろん、Pythonの勉強は続ける。
      使えないわけではないが、本格的に触れない&次の業務で使うので、これを機に完璧習得したい。
  • 3DCGの学習
    • 詳細
      これも業務で使うから。
      手を出したい分野ではあったので、これを機に触る。
      とりあえず、Three.jsあたりを使えるようにしたい。
  • Node.jsを使いこなす
    • 詳細
      JavaScriptやっていると、必ず出てくるライブラリなので、覚えておきたい。
      簡単なツールを作るのにも使えそうなので、使えるようにしておけば、払った学習コスト以上のものになるのではないかと感じている。
  • OJCP8受ける
    • 詳細
      Java8は使えているけど、外見え的によく見えるので、持っておきたい。
  • wikiを作る
    • 詳細
      ブログに散らばった知識を集約する
  • Gitコマンドを覚える
    • 詳細
      細かいことや、やっていることがモヤッとしか覚えてないので、コマンド操作できるようにしておく。
      SVNも、コマンド覚えていると、ちょっとしたツールを作れたりしたので、できれば、コマンド操作を覚えたい。
  • FireFoxのアドオン作成
    • 詳細
      開発・趣味の両方とも、FireFoxを愛用。
      たまに、これができたらいいのにってのがある。
      オレオレツールができるようになれば、もっとブラウジングが捗りそうだから、覚えたい。

今年は

今年は、新しいことをチャレンジしたい。
既知の知識の強化も忘れずに。
あとは、得た知識の体系化を考える。
あと、難問中の難問、彼女作るってのもある。

Java Advent Calendar 2016のまとめ

Java Advent Calendar 2016

公式サイト

qiita.com

概要の引用

今年も Advent Calendar の季節がやってきました。 Java をネタにしたブログを公開してしまいましょう。 Java といえば、サーバーからクライアント、クラウドに組み込みと、さまざな分野で使われており、そこで使われている技術もたくさん。 Java の Tips でもいいし、ライブラリの使い方でもいい、自作のツールの紹介など、Java に関していれば何でもかまいません。ぜひこの機会に、Java のブログを書いてみましょう!! qiitaのアドベントカレンダーを使用していますが、もちろんqiita以外からの投稿もできます! 普段お使いのブログがあるかたはそちらでご参加ください!

内容・感想

[12/01] jcmd と既存ツールの対応

記事URL

jcmd と既存ツールの対応 - sugarlife's blog

感想

jcmdの紹介記事。
使ったことがなかったので、コレを機会に調査。

まずは、なんでもいいので、Javaのアプリを立ち上げる。
当然、実行して即終了するようなやつは、ダメ。
アプリをゼロから作るのが面倒だから、SpringBoot使ってWebアプリを速攻作成。
初心者なので、欲張らず、使えるコマンドの調査からやってみる。
Windows10なので、タスクマネージャーから、PIDを調べる。 ※あとになって思ったが、クラス名でも行けるのね。。。

f:id:suzaku0914:20161204114808j:plain

"3740"なので、紹介されている方法で使えるコマンドが何かを調べる。

jcmd 3740 help

すると、以下の出力が!

3740:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help

For more information about a specific command use 'help <command>'.

ちなみに、試したときの環境情報 - Java:1.8.0_111 - STS:3.8.2

あまりインフラや調査関連をやったことがないので、プロセス調査とかは敷居が高いイメージがあった。
「使えるコマンドがこれです」ってのが見れるのは、かなり敷居が低くなった印象がある。
"$ jcmd help"さえ覚えておけば、バージョン違いによる実行できる/できないの差異を覚える必要がない。
あと、基本的な文法が一緒なので、覚えることが少ないけど、やれることが多いのがいいと思いました。

[12/02] どこからも使用されてないクラスを列挙する

記事URL

どこからも使用されてないクラスを列挙する - 水まんじゅう

感想

jdepsを利用したクラス解析。
やっていることは、jdepsで使用されているクラスの一覧を抽出し、特定パッケージ配下に抽出したクラスを含んでいないクラスを抽出するというもの。
かなり亜種なやり方だと思ったが、import解析よりは良くなっている気はする。
もっとこういったものは、発展するべきだと思う。
IDEとかで、実装して欲しい機能ではある。
リファクタリングすると、発生する可能性がなくはないからね。
できれば、public変数の対応も欲しいところではある。
まぁ、編集の修飾子をprivateにしてみてビルドエラーにならなければ、消してもいい変数だと分かるんだけどね。
手間がかかるから、一発でわかるなら、そうしたい。

[12/03] Javaが僕にくれたもの

記事URL

Javaが僕にくれたもの | susumuis Info

感想

Javaの業務経験についての話。
自分も経験あるようなあるある話がいくつかあった。
読んでいて思ったのが、やっぱり環境は大事。

[12/04] ローカルキャッシュにCaffeineでも

記事URL

ローカルキャッシュにCaffeineでも - CLOVER

感想

あんまりキャッシュ周りを気にしたことはなかったが、色々できそうな気がした。
キャッシュ関連の操作をあまりしたことがなかったので、いいきっかけになった。 一番驚いたのは、有効期限の設定かな。
今時のキャッシュライブラリはできて当然みたいな感じだったが、あんまり意識したことがなかったので、驚いた。
ここまで進んでいるんだね。

ここまでできるなら、区分値など、起動時に読み込まれる外出定数とかに使えるのではないかと思った。
DBやpropertyに新規追加した場合、メモリ上にロードされていないから、アクセスがあったときにロードするとか。
リリースを考えなくてもいい作りにできるな、とレベルの低いことを考えてサンプルを試していた。
どっちかというと、試す環境づくりでかなり手間取った。。。

[12/05] ArrayListのソースを読んでみた

記事URL

http://qiita.com/fukushiw/items/dade32371df476987bec

感想

ArrayListのコールドリーディングを、自社で実施した時のレポート。
自分も、どちらかと言えば、何かを主催する方の人間にあたるので、内容よりも会社内でどういった状況だったのかを注視した。
詳しくレポートを書きすぎると、イベントをやっても初回しか集まらない話はなんとなく分かる。
人って面倒くさがりだからな。
詳しくやるのも考えものだと思った。
レポートは、最後をやってから出せば良いのではなかろうかと思う。
あとは、超サマリだけ共有するとか。
難しい。。。
興味を引くことの難しさを感じる。
あと、詳細書いても、見てくれるとは思えない。
勉強会・読書会を参加する文化を作らなければ、最終的な能力向上は計れないと感じました。

[12/06] HashSetを実装しなおして失敗した話

記事URL

HashSetを実装しなおして失敗した話 - Qiita

感想

HashSetの独自実装の話。
やはり、コアな部分はJVMとセットで理解してないと、性能向上は難しいとのこと。
そういった意味でも、ステップアップを図りたい場合は、JVMを理解する必要がある。

[12/07] Java Stream APIでハマったこと

記事URL

Java Stream APIでハマったこと | haruo31's blog

感想

StreamAPIは、なるべく使うようにしている。
今、現場で禁止されているのが意味不明で、使いたいところで使えない不満があるが。。。

読んでいて思ったのは、並列処理の解析手法が難しいと思った。
StreamAPIを使うなら、やっぱりJavaのヒープメモリの解析方法を知っておく必要があると感じた。

[12/08] Optimizing JavaというJavaパフォーマンス系の書籍が面白そう

記事URL

Optimizing JavaというJavaパフォーマンス系の書籍が面白そう - 谷本 心 in せろ部屋

感想

書籍紹介。
まだ、日本語訳出てないのか。。。
日本語訳を待っていると、情報が遅れるのは否めない。。。
やっぱり、英語大事だな。
喋れなくても、読み書きできるようにはならないといけないね!
近場に英語を話せる人が欲しい。

[12/09]マイクロベンチマークツール、JMHについて

記事URL

マイクロベンチマークツール、JMHについて - Qiita

感想

jmhの紹介。
計測する場合、当然ではあるが、ロジックが正当なことであること。
使う前に準備がいるので、そこら辺がもっと簡単になれば、使われるのではないかと思った。
実際に使ってみて、準備するまでが面倒だと感じた。

出力結果は、レポートとかに使えそうな、なんとなく威厳を感じる出力。。。
※小物感ハンパねぇ

Java9でいろいろ機能が追加されると思うが、これを使って計測してブログに結果あげるようにしたいと思う。

[12/10] DBUnitでBLOBデータをEXCELから放り込んだ話

記事URL

DBUnitでBLOBデータをEXCELから放り込んだ話 - Qiita

感想

プロジェクトで、テストにExcel使うって時点で、嫌な予感しかしない。
案の定、書いた人も苦労したようだ。

DBUnitは、JUnitとセットでよく見かける。
テストデータをExcelで管理する現場は、よくあるからな。
だが、BLOBデータは扱った記憶があるような、無いような。。。
だいたいは、基本的な数値型と文字列でなんとかなってしまうから、あんまり記憶にない。
確かにレアケースではあるが、対処方法は覚えておくに越したことはないと感じた。

やっていることは、途中でバイナリ変換を実施している。
かなり泥臭いことを。。。
確かに、現場でこんなことしたら、怒られてしまいそうだな。

最近、思うのだが、Excelでのデータ管理に限界を感じる。
なんというか、いろんな見えざる罠が多すぎる印象がある。
もっと上手い方法がないだろうか?
テストデータ管理用のDBがあってもよいのでは無いかと思う今日このごろ。
SQLiteみたいな軽めのDBにデータ突っ込んで、JUnitとかで走らせたときに、使っているDBにデータを突っ込むとかね。

[12/11]Gradleから始めるDataNucleus

記事URL

Gradleから始めるDataNucleus - Qiita

感想

JDOを使ったGoogleCloudPlatformへのデータ登録。
Gradleは、つかったことが無いので、なんとなくで記事を読んだ。
JDOは、テスト系で使えるのではなかろうか?と思いました。
あと、マルチバイトの変数名の変数は、プロダクトコードには入れられないけど、テストコードになら入れてもよいのではないかと言うのが、個人的な感想。
ただし、プロダクトの構成が100%日本人の場合だけだけどね。

JDOは、上手いことテストコードに使えそうな気がする。
どこかのタイミングで検証してみたい。
TODO行きだ!

[12/12] さあ、並列プログラミングをはじめよう

記事URL

さあ、並列プログラミングをはじめよう - Qiita

感想

Java8の並列APIって言われると、ParallelStreamAPIしか思いつかなかったけど、言われてみれば、Threadもそうだったね。
Threadは、学生時代で使って以降、なんかの時間の計測か、ゲームの描画処理でしか使った記憶がないな。。。
あんまり並列って認識がなかった。

並列処理は、なんとなく理解したつもりになっていたけど、改めて見ると知らないことが多かった。
Executor FrameWorkとか、使ったことがなかったが、初めて使って、Threadより簡潔にかけると感じた。

比べてみてわかったが、よりシンプルに書けるのは、StreamAPIなんだと感じる。
並列処理は、プログラミングの難問だから、書く量は少ないほうがいいのは、当然か。
Fork/joinは、とっつきにくさを感じた。

並列処理は、今後も重要になってくる気がする。
並列処理ってわけではないが、分散処理を考える上でも、並列処理の概念は覚えておいた方がいいと感じた。
しっかりと勉強し直す必要がありそうだ。
TODO行き!

[12/13] JavaSEでもオブジェクト指向データベース(JPA)を!

記事URL

データベースを簡単にーJavaSEでもオブジェクト指向データベース(JPA) - Qiita

感想

JPAを使ったDBアクセス関連の話。
全く関係のないことだが、derbyがとっつきにくい!
話全般は、O/Rマッパーを理解していれば、問題なく飲み込める。
Javaのライブラリは、たまにとっつきにくい物があるが、そこら辺はカスタマイズが必要なのかと感じた。

[12/14]JGiven で 100% Pure Java BDD

記事URL

JGiven で 100% Pure Java BDD(導入編) - Qiita

感想

ごめんなさい。BDDって単語がわからなかった愚か者です。。。
振る舞い駆動は知っていたぜ!
BDDって単語がわからんかっただけ。もう覚えたぜ!

話を戻す。
テストは、状態・実行内容・期待値を定義して、それらの実行はJGivenに任せるんですね。
だから、状態や実行内容が列挙できていれば、簡単に複合テストケースが作れるわけか。
そこら辺は、便利かもしれない。
実際にプロジェクトで使ってみないと問題は見えないかもしれないが。。。
レポートのいいところは、どんな機能が使えるかが分かるところか。
逆もまたしかり。
どんな機能が使えないかも分かるってことだね。
TDD的な開発でアレば、かなり有用そうな気がする。
これのNGが、そのまま進捗報告に使えるわけか。
なかなか有用そうな気がする。
まだ、正式版では内容だが、活用シーンは多くありそう。
情報は、随時追っていきたい。
TODO行き!

話が全然変わるが、テストケースに日本語使うのは、個人的には有りだと思っている。
ただし、ターゲットが日本限定の場合のみね!
納品先が、ガチガチの日本企業ならOKかなって思っている。

雑記

バージョンの表記方法を全然知らなくて、調べた。
RCって、ほぼリリースに近い状態なんだな。
JGivenのリリースは、結構近いのか。
ちなみに、調べたサイトは、以下。

安藤幸央のランダウン(51):意外と知らないバージョン表記・数字の豆知識 - @IT

[12/15] HttpURLConnectionで嵌った話

記事URL

HttpURLConnectionで嵌った話

感想

HttpURLConnectionを使ったHTTP通信で、サーバーが4xxのエラーを返したときの話。
最近良く思うのが、HTTPのステータスコードが全然頭に入ってこない。
いや、調べりゃいいんだろうけど、200か200以外かしか気にしたことがない。
そろそろ、こんな状態は脱却したいな。
4xx番台が何なのかくらいは覚えたい。
TODO行き

話を戻すと、エラーが帰ってきたときに、エラーストリームが取得できない状態にハマったという話。
ココらへんまで来ると、もうソースを読む力が重要なんだなと思う。
あとは、妄想力。
こういう状態なら、こうなるが考えられるようになると、バグ修正の速度は格段に上昇すると個人的に思う。

どっちかというと、こういう事象有りますよって感じで終わっていたな。

[12/16] Javaslang を試してみた

記事URL

Javaslang を試してみた - 覚えたら書く

感想

StreamAPIを理解していたからかもしれないが、案外すんなり入ってきた。
副作用がないことで、関数型プログラミングはしやすくなるのではないかと感じる。
今後、Javaに大きく影響を与えそうなライブラリではないかと感じた。

話が変わるが、この記法は、Scalaライクなのだろうか?
Scalaは、やろうとしたが、覚えられなくて断念した記憶がある。
紹介されていた記法に近いなら、俺にもできそうな気がしてきた。
余裕があれば、Scalaを覚えて機械学習に流用したい野望がある。
TODO行き。

[12/17] JARファイルの難デコンパイル化について頑張ってみた話

記事URL

JARファイルの難デコンパイル化について頑張ってみた話 - Qiita

感想

ソース見られたくないから暗号化しようぜ!って話。
実行時間にどれくらい差がでるのか気になった。

クラスローダ周りは、正直知識がなくて、ふ~んくらいで記事を呼んだ。
結構な黒魔術を使わないと、こういうものって守れないんだなって思いました。
ソースコードの難デコンパイル化は、製品としてありそうな気がする。
著作権保護を強く訴えている起業とか。
※ネズミの王国が真っ先に思いつく!

[12/18] 暗号処理をやってみよう!

記事URL

暗号処理をやってみよう! - Qiita

感想

これは、知っているで!
ログイン関連の画面をやらせてもらったとき、パスワードの暗号・復号化で似たようなことをやった記憶がある。
暗号化は、突き詰めていくとかなり奥が深いってのは、そのときに痛いほど味わった。
だいたい既知の内容だったので、特に言及することはない。

[12/19] 自作のJavaMailラッパーでiCloudメールにアクセスする

記事URL

自作のJavaMailラッパーでiCloudメールにアクセスする - ひらおかゆみの投げやりブログ

感想

JavaMailでiCloudメールに接続できなくなったときの対応話。
問題だったのは、iOSの2ファクタ認証。
2ファクタ認証ってなんぞ?状態だったので、とりあえず調べた。

確認コードを入手して 2 ファクタ認証でサインインする - Apple サポート

要するに、2段階認証のことだろうか?
ちょっとiOS持ってないので、確認できないのが痛い。。。

今まで知らなかったけど、このメール送れない問題って、かなりシステム影響でかいんじゃ。。。て思った。
例えば、会員登録とかは、メールアドレスに一時的に有効なURLを送ったりするけど、それがそもそもできないってことになる。
メール送信の機能を作っている人は、大変だな、こりゃ。
バイス関連の情報は、逐一収集しておかないと、対応が後手に回るから恐ろしい。

[12/20] ThreeTen Extra と ThreeTen Backport

記事URL

ThreeTen Extra と ThreeTen Backport - Promised Land

感想

Date and Time APIの歴史と、生まれた派生の成果物についての話。
ThreeTen ExtraのThreeTenって何っておもったけど、JSR310の310のことねってわかるとすんなり行く。
Extraって言われると仰々しいイメージがあるけど、翻訳すると「余分な」って意味らしいね。
中二病満載の用語かと思っていたが、ディスりのイメージが強い用語なのだろうか?

ThreeTen Backportは、まだJava8に移行できてないプロジェクトで積極的に使っていくべきだと感じた。
いずれバージョンアップの時はくるから、被害が少なくなるように、少しづつ対応は行っていく必要があると思う。
内容を見ていたが、やっぱり、時間の管理は迷走しやすい気がした。
いろんな地域でいろんな日付の管理があるから。。。

[12/21] MySQL on Fusion-IOのパフォーマンスを引き出すバッチパターン

記事URL

MySQL on Fusion-IOのパフォーマンスを引き出すバッチパターン - Qiita

感想

CQSを理解するのに時間がかかった。
ようするに、副作用があるとこないとこキッチリ分けましょうってことね。
並列処理する上では、副作用の有無を理解した上で、どこの性能上げるかが大事だね。
DB関連の並列処理は、かなり面倒な印象がある。
完全には理解できなかった。
どこかで実験する必要があるな。

[12/22] 拙訳 JUnit 5 User Guide

記事URL

拙訳 JUnit 5 User Guide - Qiita

感想

JUnir5の紹介。
ざっくり見た感じ、3→4ほどのデカイ変更はなかった気がする。
Junitは、Javaのテストツールとしてデファクトスタンダードみたいになっているので、なる早で情報は集めたい。
あとで、じっくり検証する。

C++の設計と進化』に見る Java の方向性

記事URL

『C++の設計と進化』に見る Java の方向性 - Qiita

感想

C++Javaを比べての話。
C++だけでなく、C言語をベースにした言語すべてに言えるが、書き方が宣言的で分かりづらい印象がある。
Objective-cなんかと使った時は、Javaならもっと簡単に書けるのに!ってのが何回かあった。
たぶん、C++も同じだろう。
※使ったことがないので、憶測ではあるが。。。

他の言語と比べることで、Javaのいいところ、悪いところが見えてくるのだと感じた。
来年から、少しJavaから離れるが、別の言語の知見を取得して、プログラミングスキルの幅を広げたい。

ダンJavaの書き方。Immutable Java、Null安全を考えてみる。

記事URL

モダンなJavaの書き方。Immutable Java、Null安全を考えてみる。 - Qiita

感想

タイトル通り、イミュータブルやNullと、どうやって付き合って行くかの話。
不安定な状態のオブジェクトをなくすように心がけるのは、最初のころはわからなかったなぁ~と感慨深く見ていた。
基本的には既知の内容が多かったので、そこまで参考にすることはなかったが、上手くまとまっていた。

groovyの内部DSLの勉強がてらにETLツールもどきを作ってみた

記事URL

groovyの内部DSLの勉強がてらにETLツールもどきを作ってみた | takemikami's note

感想

Groovyを使ったDB初期化ツール。
Groovyは、JavaよりなJVM言語。
一時、触っていた。
目的はGradleを使えるようになりたかったから。
だが、タイミングを逃してしまい、今に至る。
ただ、言語自体は読めるので、そんなに苦ではなかった。
スクリプトに近い感覚で書けるので、もっといろんなことができそうな気がする。

もう一度、学びまおそうかな?

TODO

  • JDOを使ってテストコードを書けないか、考察する
  • 並列処理(特にExecutor FrameWork)を学習しておく
  • JGivenの利用方法について習熟しておく
  • HTTPステータスをまとめておく
  • Scalaの世界への入門

総括

以前より知らないことが減った気がする。
気のせいかもしれないが。。。

もうちょい深いところの知識がほしいと思った。

Advent Calendarのいいところは、いろんな知識が集約してくるところだね。
1ヶ月で知らないことや新しい発想に出会える可能性が高いので、来年も期待したい。

以前のAdvent Calendarまとめ

suzaku-tec.hatenadiary.jp

SQLite3のオートコミット

きっかけ

Spring Bootで手軽にデータを管理したいので、よくSQLiteを使う。
その際に、ロックの概念でかなり迷ったので、書いておく

SQLiteの挙動

手軽に使えるように、オートコミットが有効らしい。
Oracleとか、MySQLとかでセッション管理やっていると、癖でBEGIN/COMMITやってしまう。
そうすると、"database is locked"が発生する。
自分は、面倒くせぇから、SQLiteでオートコミットしないように設定して回避している。

実運用を考えると、オートコミットとかは邪魔な気がしてならない。
SQLiteで大規模なデータ管理はしないと思うが、そういう動きをすることは理解しておく必要がある。

SQLiteは、かなり使い勝手のいいDBだと思うので、ここらへんの細かい動きは、理解しておきたい。
これからのIoT時代に必要になものだと、個人的には感じている。

かなり短いけど、ここまで。
参考になったサイト上げておく

参考サイト

Atsushi's Homepage ` SQLite ‚ðŽg‚Á‚Ä‚Ý‚é

Kuro's Blog: [sqlite] SQLiteのロック・トランザクション関連仕様の整理

同時実行制御とSQLite3 - Qiita

【雑記】今年最後に参画したプロジェクトは、ひどいプロジェクトだった

この記事は

ただの不満のはけ口と、ちょっとした思ったことを書いているだけです。
事実と異なる可能性もなくもない。
読む場合は、気楽な気持ちで読んで下さい。
技術的な要素はなく、あとで振り返るようのメモなので、目的が違う人は直に別ページを探すことをおススメします。マジで!

今年の後半

とある商流関係のシステムで、センターシステムの刷新プロジェクトに参加。
刷新なので、既存のソースを載せ替えるのがメインの仕事。
自分はJavaの開発要員としてアサイン。 参加している企業が手動しているわけではなく、支援の形。
主導している企業は他にある。

そこで、主導している企業からいろいろ酷い目にあった。 恨み・辛みを忘れないために残す。

苦痛・疑問だったこと

主導企業に対して

  • FWが未完と分かっていて開発を進めなければならなかった
  • レビューが体裁の指摘だけで、レビューになっていない
    • 主導企業のFWを使うことになっていて、それを使う上での指摘が一切なし
  • 詳細設計からソースを自動生成すると言っており、レビューが全て自動生成するための指摘ばかり
  • アーキテクチャレベルが詳細設計のフェーズでも未決定
    • ねぇねぇ、これは何時決まるの?を何度も言ってきた。。。
    • 要件決まってないのに、どうやって詳細設計すればいいねん!
  • 単体テストが意味不な独自FW(主導企業のものらしい)
  • 謎の将来拡張を考える。
    • 明らかに顧客要件ではないのに、将来拡張を考えて、カラムの桁数より、多きい桁数を格納できるようにした。
    • 案の定、影響範囲は莫大である
  • DBのテーブル定義が製造・単体フェーズで大幅に変わる
    • 一度や二度なら許せるが、数十回発生した。許さんぞ!!!!
  • チケット駆動でタスク管理しているはずだが、申請したらモノが出来上がる前にクローズする。
    • どうやって出来上がったモノを通知するつもりやねん!
  • Gitを使用していたが、FWレベルの改修が毎日大元のブランチに入り、毎回リベース・マージが必要
    • 朝来たら、1時間近く掛けて取り込む。使いこなせてないせいかも知れないが、かなり面倒だった。
  • 主導企業の独自FWなのに、俺の方がFWに詳しい
    • 俺「こういう実装できないから、こう実装します。いいですね?」
    • W「いや、こうすればできます」
    • 指示された通りに実装→動かない。ドキュメントと詳しい実装を追って、動かないことが分かる。
    • 俺「こういう作りだから、言われた通りに実装しても、この要件はみたせないんだYO!(怒)」
    • W「それがやりたかったんですか?こう実装してください」
    • 俺の心の声(それ、俺が最初に言ったやつやん!)
  • 標準化を謳っていたが、自分が担当する画面は、「標準化対象外です!」ってほとんど突っぱねられた。
    • 主導企業担当の機能しか標準化してないんだが。。。
  • なんでも自動化っていってくるけど、自動化するまでの準備作業が多すぎる
    • それなら自動化しない方が楽では?って場合が結構あった。
    • 自動化するのはいいんだけど、影響範囲がでかいところを自動化したせいで、対応に追われる状態
  • 発注していたデザイン取り込みが製造の佳境に入ってから実施
  • JSFを使ってガチガチなコンポーネントを提供。なお、デザイン取り込みで、最後は破綻気味
  • 提供されているコンポーネントのドキュメントなし
    • バグったら手探り調査。サンプル渡せば万事解決だと思っているらしい。
  • クラスの継承関係がかなり深い。クラスの継承関係の問題でバグがいくつかあった。
    • ちなみに、発見したのは、すべて俺。。。
    • 修正方法まで指示した
  • リファクタリングを強制実行
    • アナウンスなくクラス名を変える暴挙。Gitで取り込んだ結果、エラーが出まくり、参画している方の企業がパニックに。。。
  • サイレントアップデート
    • 通達なく、こっそりと資料を更新してくる。ものを作ってレビューに出したら、ボロクソに言われる。
    • もしかして、俺ができない奴っていう印象操作?
  • 例外なげるの禁止
    • Javaで開発していたが、例外をなげちゃ駄目らしい。「なんで?」って聞いても「そういうFWのルールだから」の一点張り
    • なにか処理をしたあとは、必ずエラーチェックをする羽目に。。。
  • Stream禁止
    • なんか、性能劣化するから駄目と言われた。本当に検証したのか疑問。どうやって検証したいのか見たかったと、後々になって思った。
    • 個人的には、Stream推奨派なので、反論したが、平行線なので諦めた。
  • 議事録のTODOをこちらが突っつかないとやらない
    • なんのために議事録をとっているのか知っている??
  • 1時間枠の会議で、俺が40分くらい喋らなければ伝わらない
    • 聞く気があるのだろうか?それとも俺の技術が低すぎ??
  • 主導企業の独自FWの使用を強制してくる
    • 分からないことがあり、再現性がない事象について質問すると、「再現方法が分かってから質問してください」
    • それが分からないから質問しとんねん!!使用やソースも公開されてないのに、どうやって再現方法を見つければいいねん!
  • 業務要件を理解してないのにアジャイル開発します宣言
    • アジャイルは、品質・納期・機能を調整してプロジェクトを薦めることだと知らないらしい。
    • 何か問題があったら、直に解決することをアジャイルだと思っているらしい。
  • プロジェクト終了目前で主導企業が社員旅行
    • 死ねばいいのに。
    • やる気あんの?
  • 進捗報告の場では、「問題ないです」の一点張り
    • いや、問題はある。問題があると認識できないお前の頭にな!
  • 最後の方は逆ギレ
    • いやいや、主導してきたのお前らですやん!
  • 仕様は口頭連絡したから大丈夫b!
    • 口約束しといたけど大丈夫→そんな約束してないけど、証拠は?→爆発!

自分が入っていた企業に対して

  • レビューが無かった
  • 開発者で入ったはずだが、いつのまにやら他社問い合わせ窓口に
  • タスクにない他社問い合わせをしていたが、担当タスクは減らない。
  • 見積もりは俺がやるの?
  • 内部の課題管理は個人で
  • 進捗は日報&WBS。報告がダブっているんですけど。。。
  • プロパーがいない会議があってもいいの?
  • PCのスペックが低すぎる!

他に面白かったこと

GitLabのActiveで流れていたレビュー内容

主導側のレビューレベルが低すぎた。
本当にこの企業の支援でプロジェクトは成功するのか心配になった。

主導企業のホームページで実態とそぐわない記述が

主導企業がどんな事しているのか気になって調べたら、ホームページでは誇張された実績と、「安心のプロジェクト管理を〜」みたいな記述があった。見積もりも正確にやれますみたいなことが書いてあり、みんなで総ツッコミ状態だった。

結末

案の定、上手く行きませんよね。。。
プロジェクトは、御破算になるようでした。。。
めでたし、めでたし。。(めでたいのだろうか?)

何か得られたのか?

プロジェクトでやってはいけないアンチパターンを学べた。

技術力重要。差がありすぎると、会議をしても考えが伝わらない。

全体影響を考えないのは、システム開発失格。

過度な自動化はダメ。きちんと影響範囲と副作用を意識して、自動化する。

横文字を多用するやつを信じてはいけない。

結婚指輪以外の指輪を、いっぱいつけている人は、能力的に低い。

コンポーネントの部品化は、APIを利用したWEBシステムと合わない。
コンポーネントが画面固有になることが多いので、標準化できずに破綻しやすい。

進捗管理できないやつは、たいてい問題があっても報告しない。

ムカついても、陰口を叩いてはいけない。
自分の人間性を疑われる。
陰口を叩く場合、蔑称をつけるのがいい。
そうすれば、なんのことを言っているのか、外部の人はわからないし、伝わるのは一部の内部の人間のみ。
こんな嬉しい事はない。罵倒しまくりだぜ!!

個人的に思うこと

主導企業に対する怒りが強い!
潰れて欲しいとすら思ったことがある。
最後の方の社員旅行行っているって知ったときは、行きか帰りで事故らないかなぁ〜と本気で思った。
たぶん、一生忘れない。
末代までたたってやる!!