u-ryo's blog

various information for coding...

Optical Illusion

| Comments

IT mediaの記事(コンピュータで“錯視”の謎に迫る:試してびっくり 点を回転させると円に見える「グラス・パターン」錯視の謎)を見て、こんな世界があるんだー! って驚きました。錯視を引き起こす成分を分離できるなんて! ここでも出来るのかな?

夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー
夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー

ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏
ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏ーナワ夏

夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー
夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー夏ワナー

JHipster

| Comments

ここんとこPWA(Progressive Web Application)作ろうとしていて、 ずっとJEEかなぁって思ってたんですけどSpringの勢いが凄くて、 それと今ならSPAでぼくはAngular派なので、 それに今時認証は自分でやりたくないよねとOAuth2で、 連動させるの大変だなぁとかって思ってたら、 そういうの全部ひっくるめたJHipsterというのがあるんだ! というのが衝撃でした。 かなり前からあったんですね。

ただこれ難しいですね。 scaffoldingまでは簡単ですけど、 そこからどうしていいのか。 自動生成filesはなるべく弄りたくないですが、 そうもいかないですよねこれ。 samplesも、「そこから先」についてはなかなか。 JHipster Mini-Book 4.0も見てみましたものの、それをなぞって行けるわけでは無かったので。 scaffoldingと、JDLでentities作って、 jhipster spring-controller Foong g component Barとかのcommandで取っ掛かりを作って、 そこから作り込んでいく、感じでしょうか。

Angular CLIがうまく動かなかった等あったのでメモ。 jhipsterのversionが変われば、こんな知識も不要になると思われますが。

  • JDLでfield名はsnakeやhyphenationではなくcamelで。 DBだからhyphenかなと思ったんですが、 生成されたclassのfield名がcamelにならなかったので。
  • JDLでUserは特別なentity。 Manualに書いてありました。 scaffoldingの次は取り敢えず JDL Studioでentity作成、import、 になるのに、解説すっ飛ばしてJDL見たので、なんだろう?って思うんですよね。
  • jhipster 4.13.3で入るAngular CLI(./node_modules/@angular/cli/)のversionは 1.6.0(package.json)でbug持ち(@angular-devkit/coreが入らない)なので、 ng g ...が失敗します。package.json中の@angular/cliの version numberを最新のもの(本執筆時点では1.6.6)に書き換え、 yarn installするとうまく行きました (Angular CLIをglobalでinstallしてもlocalのversionのモノを使うのでダメ、 @angular-devkit/coreを個別にnpm install ...しても、 次から次へと足りないものが出て来て、 全部入れた挙句の果てにyarn startがコケるようになるのでダメ)。
  • ng g component Fooとしてそれを表示させるにはどうしたらいいんだろう? と悩みました。route作ってそこで表示させるべく、他のentityとか見よう見真似でfoo.route.ts作ってpath直打ちして試したものの、表示されず。errorも何も出ないので、何が悪いのか分かりません。多分登録が届いてないんだろうとは思ってたんですけど、具体的にどこをどう直せばいいのかわけわかめです。StackOverflowに回答があったので出来ました。結局、0.ng g component Fooでcomponentを作る 1.foo.route.tsを作る(その際Routesで配列にするのではなくRouteで単数に?) 2.index.tsを真似して作る(foo.moduleのimportは記載不要) 3.foo.module.tsを作る 4.app.module.tsに登録(その際Angular CLIが自動登録したcomponentは削除しないとtop pageが表示されず) →そもそもcomponentではなくmoduleをgenerateするべきだったのでしょうか。よくわかりませんが、scaffoldingの後のことはなかなか書いてないので、「こんなのわかんないよー」という感じです。

JHipsterは「Java/Angular版Rails」か! とも思ったんですが、 もう出てだいぶ経つみたいですし、 でもまだそこまで洗練されてはいないのかなと。 Angularの難しさ、面倒臭さ、 とnode modules周りの変化が激しいのもあるためか、 使いこなすのはなかなか大変だと思います。

RPA and Sikuli

| Comments

昨日、社内で「事務部門はRPA(Robotics Process Automation)を導入して業務効率化を図る」という発表があったので、どんな凄いことしてるのかと思ったら、要するにSikuliのパクリなんですねこれ。年間150万近く払ってこんなの使いたいなんて、よくわかんないですタダで出来るのに。

しかし、Sikuliに「ロボ・オペレータ」とかRobotics Process Automationとかご大層な名前を付けて、ITに疎い事務部門に売り付けるという発想は、凄いと思いました。それは思い付かなかったですねー。

Unbelievable Coding

| Comments

Androidのお仕事で、あるclassのcodeを読んでいて。

  • onTouchListenerの上にonClickListenerを上書き
    あるbuttonをsetOnTouchListener(this);してて。 buttonをonTouchListenerっていうのもなんですが、 onTouch(...)で更にsetOnClickListener(...);してるという...
  • timer止めずに新しいinstanceを上書き
    CountDownTimerをinstance fieldとして持ってて、 途中でnewしてるんですが、それが複数箇所あるんですよね... 直前にcancel処理とか特に無いし。大丈夫なのかこれ。
  • カタカナや"$","/"にtoLowerCase()/toUpperCase()してindexOf()
    "半角カタカナ".toLowerCase()してからindexOf(...)>-1して、 contains(...)と同じことしてました。indexOfはまだしも、 toLowerCaseしたからって 全角カタカナが半角カタカナになるわけじゃないのに。 え、まさか、とか思ってしまった自分が情けないです。 同様に、記号に対しても"$".toLowerCase()とか謎すぎます。
  • 他の(inflateもincludeもしてない)View上のR.idをfindViewById()
    当然nullですfindViewById()しても。実質無害なcodeではありますが。 どうやら他から何も考えずにコピペしたから、らしいです。
  • listの2度回し
    なるべく一度で済むように書きますよねぇ、フツーは。 ちょっと違う処理をするから、なのか、 同じlistを直後に2度回して、って。 まー他でも同じtableのDB accessを3回してたりしますからねーこのcode。
  • 1830秒?
    随分謎なMagic Numberです。
  • loop回すのに中で値を上書き(結局見てるのは最後の値だけ)
    for(i in list){v = i}みたいな。v=list[lastIndex]でいいじゃん。 そういうことされると意図が読めないんですよね。困ります。
  • loopの空回し
    waitしたいみたいなんですが、 while(true){if(!flag)break;}ってこれじゃぁCPU無駄遣いでしょ。 改善したっていってdo{i=0;}while(!flag);って、あのねー...
  • synchronized wait()で同期 他Activity(dialog)に遷移させ、 その同期にsynchronized(this){wait();}って使ってます。 そういうthread jugglingはやめて欲しい、です。 こういうのってホントはRXですよね。
  • method/field名が大文字で始まっててclass名と区別がつかない、 なんていうのは可愛い方で、もう気にもならなくなってますそういえば。 methodも長いし条件分岐も複雑で、 state patternとかなんて知らないんだろうなぁと。
  • というか全てがfat ActionでFragmentもなければApplicationもないという (基本的には。後から「訳も分からずダーッとコピペした部分」にはありますが)。

...というように。 こういうcodeと共に仕事するのは、嫌で嫌で仕方ありません。

Spock and JMockit

| Comments

バイトのtestで、Spockでさらっとtest書いて、 いざ全pattern cross check! と思ったら、 無限loopになるpatternが多くて。 @Timeout導入でサクッと、と思ったら、 loop回るのが早くて凄いmemoryと時間を食って、 @Timeoutでは抑えきれません。 うーむ、それじゃぁGroovyのmetaClassでmethodの振る舞いを変更だ! と思ったら、どうやっても振る舞いが変わりません。 悩んだ末、GroovyのmetaClassでの再定義は、 外側のJava classには及ばない(Groovyの世界の中だけ)、と結論。 仕方無いじゃぁJMockitだ! って思ったんですが、今度はSpockとJMockitは相容れないようで、

1
Caused by: java.lang.UnsupportedOperationException: Attempted to redefine class loaded from custom class loader

なのでJAVA_OPTS=-javaagent:.../jmockit-1.37.jarをつけて実行すると今度は、

1
mockit.internal.ClassFile$NotFoundException: Unable to find class file for Test2$1

spockは諦めました。

ならばせめてJUnit5だ! と思ったんですが、build.gradleで、

1
junitAnt 'org.apache.ant:ant-junit4:1.10.1'

と指定しているので、敢え無く撃沈。 調べるとどうも、JUnit5とAntを組み合わせる動きはないんですよね。 それでも Ant を使いたい人のための JUnit 5というのもありましたけど、これは、

1
<java fork="true" classname="org.junit.platform.console.ConsoleLauncher">

で無理矢理実行してるだけですから、ちょっと違います。 こちとら、build.gradleからant.junitAnt(...)で呼んでいるので、 ConsoleLauncherだと困るんです(→どうやって書いたらいいかよくわからない)。

結局、JUnit4 + JMockit で書きました。 TimeoutExpectedException@Ruleにしてちょこっと今っぽくしましたけど、 そのくらいが関の山でした。

ant.junitAnt(...)fork:trueにして、また更に junit4.jarよりjmockit.jarを先に書いておかないと IllegalStateExceptionが出る(gradle + jmockitでjava.lang.IllegalStateExceptionって出たので対応)、 というのでそう書いたしgradle --stacktraceしてload順確認したんですけど、 それでもException出たので、

1
jvmarg(line:"-javaagent:${configurations.jmockit.asPath.split(':')[0]}")

を入れて漸く動きました。

けど、折角JMockit入れたのに、 やっぱり別の時にはTimeoutも必要で。 JUnit4だと@RuleつけてTimeout.millis(200)でいいんですね今。 そしたら、JMockitで振る舞い変えなくても、 GroovyでなくJavaならTimeoutだけで済むじゃーないですかー! うぁーん。

あとはParameterized Testにしました。 JUnitParamsが簡便そうです。 何がいいって、JUnit4標準の方法だとinstance fieldがparameterになるので、 全methodについて回っちゃいませんか? というのが不安で。 JUnitParamsなら、明示的に単一methodに対してparameter指定できるので安心です。

...ダメです。JUnitParams使うと、Timeout効かないことがわかりました。 悲しい。