エンターテイメント!!

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

Vue.jsをvue-cliで試してみる

きっかけ

UI周りの実装が楽にならないか探して、vue.jsを知ったので試してみる。
react.jsも試したことはあるんだけど、覚えることが多くて辞めた。

環境

バージョン: 1.33.1 (system setup)
コミット: 51b0b28134d51361cf996d2f0a1c698247aeabd8
日付: 2019-04-11T08:27:14.102Z
Electron: 3.1.6
Chrome: 66.0.3359.181
Node.js: 10.2.0
V8: 6.6.346.32
OS: Windows_NT x64 10.0.17763

詳細

nodeはインストールした前提で始める。

Vue cliのインストール

とりあえず、公式にあるとおりにインストール。

npm install -g @vue/cli

グローバルに入れるのは、プロジェクト作成のツールであるため。
vue create my-project とすると、my-projectの中にnpmのプロジェクトができるので、自分で作ってローカルにインストールすると、二重にできてしまうから。

プロジェクト用意

先に書いてしまったが、下記のコマンドで用意

vue create my-project

結構、長い。。。
気長に待つ、

とりあえず実行

インストールが終わると、npm run serve で起動できるらしいので、作られたmy-project配下に移動して、コマンドを叩く。

 $ cd my-project
 $ npm run serve

serveって、serverのことかな?

http://localhost:8080/で起動したよ的なメッセージが出てきたので、ブラウザでアクセスしてみる。
そうすると、vueのサンプルページが見えるはず。

バインディング

App.vue と HelloWorld.vueの連携はわかったんだけど、index.htmlとApp.vueの連携がよく分からなかったので調べた。

紐付をしているのは、main.jsの下記の実装

new Vue({
  render: h => h(App),
}).$mount('#app')

appにApp.vueを設定している。

下記の記述と同価

new Vue({
  el: "#app",
  render: h => h(App),
})

render関数は、業が深そうなので、こうすると描画されるんだ程度で辞めとく。

感想

vueファイルとあるが、内部は、css/html/jsだから、素直に読めるのがいいと思った。
イベントハンドリングや文字列の埋め込みは、別の機会に。

Mahoutでレコメンドを試し実装

きっかけ

Spartの動きがなんとなく分かったので、次の機械学習へ。

環境

IntelliJ IDEA 2019.1 (Community Edition)
Build #IC-191.6183.87, built on March 27, 2019
JRE: 11.0.2+9-b159.30 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0

intellijって、開発環境を簡単に出せるのか。。。
知らなかった。
メニューバーの HelpAbout で表示できる。

いっつも、コマンド打って転記してたけど、今度からこれでやったほうが早いな。

実験

build.graldeと実行ソース、データセットを晒しておけば十分かな?

build.gradle

plugins {
    id 'java'
}

group 'rssCollector'
version '1.0-SNAPSHOT'

sourceCompatibility = 11

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    // https://mvnrepository.com/artifact/org.apache.mahout/mahout-core
    compile group: 'org.apache.mahout', name: 'mahout-core', version: '0.9'

}

data.csv

1,1243,3.3
1,1240,0.3
1,1242,1.2
2,1242,1.3
2,1243,1.9
2,1241,2.8
2,1245,4.3
3,1240,0.6
3,1242,1.0
3,1241,2.3
3,1245,3.0

sample

本当は、先頭大文字にすべきだけど、多めにみて。。。

import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.List;

public class sample {
    public static void main(String[] args) throws IOException, TasteException, URISyntaxException {


        URL url = ClassLoader.getSystemResource("data.csv");
        DataModel model = new FileDataModel(new File(url.toURI()));

        UserSimilarity similarity = new PearsonCorrelationSimilarity(model);

        UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);
        Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);

        // ユーザID:1の人に3件レコメンド
        List<RecommendedItem> recommendations = recommender.recommend(1, 3);

        recommendations.forEach(System.out::println);
    }
}

実行

実行すると、下記みたいなのがでるはず。

RecommendedItem[item:1245, value:3.65]
RecommendedItem[item:1241, value:2.55]

3件指定したけど、2件しか出てこないのは、データが少なすぎるせいらしい。

感想

sparkなくても、レコメンドとかできるのか。。。。
すごく楽にレコメンドとか実装できてしまって、hadoopの実行環境作るのに悩んでいたのは何だったんだと思いたくなる。

他のサイト見ていたけど、 UserSimilarity similarity = new PearsonCorrelationSimilarity(model); のところで、 PearsonCorrelationSimilarity 以外のアルゴリズムを適用させて、いろいろ分析方法を返るみたい。
当然、後続で利用するクラスも変わるわけだが。。。
利用するアルゴリズムは、統計学の知識がないと、よく分からなかった。
体系的に統計学を学ばないと、ググって調べた程度の知識量では、汎用的に使うのが難しそう。。。

あと、調べてると、やたらとscalaが出てくる。
時期的に見ると、Java8リリース前だから、JVM言語が出始めてきた頃だな。
Java8リリース前は、JVM言語の方が盛り上がってた印象がある。
Scalaは、なんとなく読めるけど、やっぱり、違和感はある。

そういえば、機械学習とかするときって、前処理が大変とよく聞くが、アルゴリズムを適用させるために、決まったデータフォーマットにするために大変ってことだろうか?

課題

参考サイト

Mahoutでレコメンドを作ってみよう! | Atlas Developers Blog

mahout をとりあえず動かしてレコメンドしてみる(動作確認程度) - Qiita

低スペックな頭の僕がJavaの機械学習ライブラリmahoutを動かしてみる。 - regtan’s TechNote

2019/04/015週 気づきと振り返り

業務こなしての問題・気づき

週次リリースの廃止

週次リリースが廃止されてからしばらくたつが、なんか、メリハリがなくなった感がする。
どうも、ダラダラ開発してしまう。

危機感が、少し必要なのかも知れない。

JNINativeMethod

JavaC++のつなぎで使う。
ふつうに呼び出そうとすると、C++側のメソッド名が長くなりすぎるので、JavaC++のメソッド名のヒモ付をしたほうが良い。

雑記

最近、他言語をつなげることばっかりしてる気がする。

JavaJavaScriptJavaC++。。。

つなぎ目を作っていて思うことは、冗長化しやすいなって感じる。。。

2019/04/08週 気づきと振り返り

業務こなしての問題・気づき

printデバッグ

たしかに回避するべきだが、デバック起動でパフォーマンスが落ちて、動作確認に時間がかかっては意味が無い。
printしたほうが早いのなら、prinデバッグで良いのでは?と最近思い始めた。

戦略と作戦と戦術と兵站

やることが無くて、戦略とか作戦について、自分は仕事の中でどうするべきか、思いを馳せてみた。

戦略

最上位概念。戦わずして勝つやり方を考える。

敗者から見て、卑怯といわれる方法が戦略?

仕事の中では、開発の古典(デザインパターンとか、原理原則)を学ぶことが戦略に該当すると思う。
ただ、戦術面での下積みがないと、戦略は使いこなせない気がする。
デザインパターンも、いきなり教わるのではなく、開発で悩んだ結果、デザインパターンを知ることで、よりよく使えると思う。

作戦

戦いを作る。どうせ戦いが始まるのなら、有利な状況で戦いを作る。

仕事のうえでは、言語の先取り学習とか、情報収集、アンテナ張りかな?
危険な仕事の気配を感じたら、擦り付け先を考えるのを良くする。だけど、やりたくない泥臭い仕事は、高確率で俺のところに来るから、処世術が下手なのかもしれない。。。。

言語の先取り学習は、たぶん、即座に現場に活かせることはないと思う。
どちらかというと、投資の意味合いが強い気がする。
Javaなら早期ビルドのころから追ったほうが、確実に有利。
覚えるのが、出てからよりも、よく覚えられる気がする。
たぶん、情報が出ていないから、自分で情報を取りに行くため、不明点が明確になって覚えやすいのだろうと思う。

戦術

戦う術。

仕事のうえなら、リーダブルコードを書く、UMLで意思疎通を計るなどかな?

兵站

戦略・作戦・戦術を長く続けるためのリソース確保。
疎かにすると、戦略レベルで崩れて、戦わずして負ける。

マインド(学習意欲)を強くする、快適な学習環境が、そうだろうか?
ブログを書くのも、長く学習するうえで必要かもな。
あとは、検証環境を迅速に作れるdockerをマスターしたり、webサービスを高速に作れるSpringBoot覚えたりが、そうだろうか?

雑記

メガネ

作業するときはメガネをしているのだが、たまたま忘れた。。。

画面がぜんぜん見えないから、作業にならない。。。

メガネがないとダメなんだ。。。
メガネがないと。。。

プリン

プリンは飲み物
分類するなら汁物。俺の中では、味噌汁と同じ分類。

マナーを気にするところでは、スプーン使うけど、家の中ではすすって食べる。

2019/04/01週 気づきと振り返り

業務こなしての問題

Java native

Android開発をするようになって、C++と連携しているソースを初めてみた。

nativeってワードを今まで見たことなかったが、初めて見た気がする。
今まで開発したなかで、見た記憶はない。

用途を確認したら、C++等のネイティブな実装を呼び出すときにだけ使うらしい。
そりゃ、見ませんよね。。。

どこかで、C++との連携する試し実装をしてみたい。

Android で Service連携

Serviceを実装したクラスが連携。
onBind()で返されるStubの実装が、処理の代理、もしくは振り分けを実施する。

CRAFT BOSS

初めて飲んだが、コーヒー嫌いな俺でも飲めた。
甘めなのが、個人的には不満だったかな?

2019/03/25週 気づきと振り返り

業務こなしての問題

サムスン製モニタ

現場で発煙があったらしく、リスク回避のため、取り替えるらしい。
こういう話を聞くと、やっぱり、怖くて手が出せないよね。。。

個人では、モニタは、PHILIPSiiyamaを使ってる。
やっぱり、使うとしたら2択になってしまう。

デザインパターンの必要性

どこかのサイトで、不要・必要みたいなことが書いてあったので、改めて考えた。

個人的には、デザインパターンの考えは必要。
特にFWを作る場合は。
使う側が不要と感じるのは、それだけうまく状態管理とかをFW側が隠してくれてるからだと思う。
最近だと、SubjectとObserverパターンは、よく使うんじゃないかな?
Reactiveプログラミングだと必須だと思うのだが、使わないものなのだろうか?

古典的なプログラミング作法を知らないのは、かなりの遠回りをするような気がしてならない。
苦労してデザインパターンを自分で見つけてもいいかも知れないが、たぶん、その頃には、現役でいられるか怪しい気がする。

個人的には、一回問題にぶつかって、モヤモヤ悩んだあと、デザインパターンを知るべきだと思う。
最初っからデザインパターンを知ってしまったら、過度な適用や、誤ったパターンの適用をしてしまいそうな気がする。
一度、自分で熟考するのが大切だと思うな。
その方が、プログラミング能力は向上すると思う。

Gerritのnew UI

バージョンが新しくなったらしく、新規のUIで操作できるリンクができてた。
ただ、new UIで書いたコメントが、古いUIで見れないっぽい。。。

windowsの管理者権限と環境変数

管理者権限剥奪されてるアカウントで環境変数dosからコマンド操作で変えられるのは、OKなのだろうか?
変わってるのは、ユーザ環境変数だから、OKなのかな?

AndroidでJava8

target1.8にしただけでは、streamは使えない。
APIのバージョンも合わせる必要がある。

やってみたいこと

JavaC++の連携を試す

Androidで、ネイティブ層の実装とJavaの実装の連携方法を見ているのだが、さっぱり分からない。。。
なんとなく、ポインタ取得して同じところをみている感じがするのは、感覚的に分かった。
いろいろ実験してみないと、本当に推察が正しいのか判断できない。

2019/03/18週 気づきと振り返り

業務こなしての問題

WebviewでUnable to open asset URL

読み込もうとするHTMLがないから起こってるっぽい。
原因がよく分からないが、Android Studioのインスタントランが原因っぽい。
おそらくだが、ビルド後に配置される場所に、何らかの操作で消したが、Android Studioが差分を検知できなかったため、再配置されず、起動時にエラーになったと思われる。

たぶんね、ファイル移動をしたような、しなかったような記憶がある。

インスタントランを停止して再ビルドしたら、動作した。
これで半日悩み続けましたわ。。。

雑記

縦長ディスプレイ

縦長ディスプレイが現場に欲しい。
ピボットできるディスプレイでも可。
ドキュメント見るときに、多くの情報が見れる縦長の方が、楽チン。

ワイド1縦長1のデュアルディスプレイが、開発には最適だと個人的に思ってる。