Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

システム開発で最近やっていることのまとめ&感想

f:id:fa11enprince:20180420015702j:plain ここ3か月程度で取り組んでいることのまとめと感想
ほぼ殴り書きで自分向けに書いている内容となっています。
それぞれ細かく記事は書きたいのだけれど…
備忘録的な位置づけで書いてしまっています。
※Web系の人ではないので悪しからず…。

技術スタック

Java

  • ガリガリ書いてる。なぜこの言語かというと…察してください。
  • Spring Boot
    • 最近初めて触った。
    • JavaにしてはよくできたWebフレームワーク
      • 比較的手軽に何でもできてしまう。めんどくさいの代名詞Springのイメージを覆してる。
    • Hibernate
      • やはりJPAというかHibernateの学習コストが高すぎるOneToMany, ManyToOne, LAZY, EAGAR, FETCH結合が鬼門すぎる。
        • 何も考えずにN+1問題やだーでEAGARにすると死ぬ。
        • もはや1対多、多対1関連なんて使わずにJava側で自前で結合しまったりキーを抜き出してEntityごとにfindしたほうが余計な轍を踏まなくていいんじゃね…状態になりがち
        • Rails(ActiveRecord)のようにシンプルにならんのか
      • とはいえ複合PK(やむを得ず使う場合がある…)を扱えたりと何でもできる。
      • JPQLは便利
    • フロントエンドはAngularなのでThymeleafなにそれ?おいしいの?状態。ただのREST API作成用のアレですよ。
    • Scaffoldくらいさせてくれよ…という不満はある
    • Spring Batchはやりすぎ感がある。高機能だけど。
    • application.yml, application.propertiesはよく考えられてる。
    • Gradle 何それおいしいの?そもそもmavenで困ってない。gulpかwebpackにやらせたいことをやらせればいいんじゃね的な。どーなんだろ。

Angular5

  • 最近初めて触った。Spring Bootと組み合わせてる。
  • VSCodeと組み合わせると最強。Lint系ツールも素敵。
  • そこそこガリガリ書いてる。Vue.jsを選べばよかったかも…。と少し後悔。Reactでもよかったかも。いやでもよいところもありますよ。。。
  • なかなか良い感じ。しかし…、SPAですべて作ることを強要されるような気がする。SPAに浸食される。
    • もっと気軽に使いたいんだ
    • AngularJSのときのようにシンプルなテンプレートエンジンでサーバサイドで生成したページと混ぜることが容易ではない。

      • 混ぜたい場合はどうすればよいかいまいちわからない。Angular単位?でアプリを分けるしかない?
        • 詳しい方教えてください(´;ω;`)ウゥゥ
        • 別窓で開くページとかだと戻る必要がないのでそこは問題ないけどrouterがあるのでThymeleafのページとかと組み合わせずらいっすよね。
    • jQueryとかと組み合わせないと結局込み入ったものが作れない。が、jQueryと組み合わせるとちょっと面倒。

      • いや、まじめにコンポーネント作ればできるっちゃできるんですが、ほら、偉大な過去の資産がね…。
    • 学習コストはAngularJSより下がってる(個人的には)。つまり学習が楽だ(ngコマンドとTypeScriptのおかげ)。あんまりng、んぐ言わない。
  • AOTコンパイル通らない。うえー…が多々。
  • npmで依存モジュールとかでダメになる…おまえはアレか、bundlerと同じつらみ。バージョン合わせに四苦八苦。
  • ngx-bootstrapもうちょっと頑張ってくれ…頼む。
  • bootstrap4はいいけど…それにしてもbootstrap依存すぎる。まぁいいけど。
  • TypeScript
    • ほぼES6 + 型。素敵。初見はSwiftに似てると思った。
  • RxJS
    • 込み入った機能を使わなければ超便利なやつ。いいと思います。

JavaScript

  • 読んでるだけ。TypeScriptかES6じゃないと読むの苦痛…。プロトタイプ、テメーはダメだ。いやES5あたりだと思うんだけど旧来のJSが……。
  • Node.js
    • Express
      • Node.jsのWebフレームワーク
      • 自分は読んでるだけ

Python2

  • 読んでるだけ
  • Python2のサポートがRHELとかから外れるってのも知ってますよ…でもね…
  • 機械学習…逃げたいけどやつは追ってくる。嫌だ。機械学習嫌だ。
  • Jupyter
    • いやだから機械学習系は…くぁwせdrf
    • ジュパイターなのかジュピターなのかよくわからん…とおもったらアメリカではジュピターなのね…。セントオーエスVSセントス的な

Ansible

  • あらためて冪等性ってマジ素敵

docker

  • いや、ポータビリティいいんだけどさ…間に何か挟まった感じでダルい…いやきっとそれはまだ自分のスキルが低いのだ…。
    • ポータビリティはいいけどイメージのサイズが当然デカイので、どうにかならないのか…ならないね。
    • docker越しでコマンドをひたすらビシビシたたく!うん。便利。オーバーヘッドも全然なさそう。
    • ポートの指定をrun時に忘れたときの絶望感…docker rmしないとダメか…あぁ。
  • docker-compose
    • dockerの親分的な。便利。
  • kubernates
    • よくわからんけどdocker-composeの競合的な?

MongoDB

  • スキーマレス。テーブル定義的なのがないよ。
  • JSONぶち込み放題
  • MEANスタックってあるけど確かに相性いいよね。ただ、Expressってちょっと機能少なくないですか?
  • すすんで使いたいと思わない。用途に寄るが

MariaDB

  • MySQLの派生
  • Oracle色がなくて素敵(Oracle嫌い)
  • 無料で高機能を使えて素敵

Ubuntu

  • もうこれからLinuxはこれでいいんじゃね的な感じがとってもある。dockerと相性いいし。
  • Ubuntu Desktopはよく使っていたがUbuntu Server悪くないね。CentOSを窓から投げ捨てたくなった。
    • yumって間違えて打つことがなくなって逆にCentOSでapt-getしそうになる。
  • 海外ではCentOSよりUbuntuが主流
  • Ubuntuに限らずだけどsystemctl ... このコマンドとサービス名が長くなりがちなので打つのダルい。serviceとかinitdのときは楽だった。
  • おい、rootになれないんだけど…えっ?sudoが必要だって?とにかく宇文津さんは須藤さんが大好き。

AWS

  • EC2とRDSとS3とかそのあたりは大体つかってた。
    • lambda
      • 勉強したいがいまいちそそらない。lambdaというよりAWS全般にあまり興味がわかない。課金怖い。
      • RDSと相性悪い。

GitBucket

  • Scala製なんだ。へー。
  • しかしGitHubに比べると物足りない…。でも無料でこれなら素敵。メンションでメール飛ばしたい。

開発用Chatツール

  • SlackかHipChat使いたい…無料で代替のがないのか…。

Proxy

  • 技術スタックというか、こいつが邪魔……。squidとかそういう話ではないです。

Apache

  • ええ、今更語ることはないです。

もっといろいろなんか新たに学んだことややったことがある気がするけどこんなところかも… 管理系ってのもありますね。マネジメント あぁ、でもマネジメントしてるのに一番プログラミングしてるゆがんだ状態になってます。 管理したくない。されたい。ふー。 Djangoを触ってみたいなーと思いながらも、触れない日々を過ごしています。

Angular + TypeScript + Spring Bootをやってみた

f:id:fa11enprince:20180130152024j:plain 2018/08/12更新
最近開発でAngular(2+) + TypeScript + Spring Bootを使っています。
それぞれのバージョンの詳細はこんな感じです。
Angular 6
TypeScript 2.7.2
Spring Boot 1.5
Java 8
Maven 3
Node.js 8.11.3
Angular-CLI 6.0.8

実際の構成例

GitHubに置きました。

AngularのチュートリアルとSpring Bootのチュートリアルを混ぜたものです。
ArpitSuthar (Arpit Suthar) · GitHub のをforkしました。

大まかな構成

TypeScriptをどう、SpringのTomcatと連携させるか考えていました。
あんまり複雑な構成にしたくなく、AngularJS(1系)の時のようにお手軽に使えるようにしたかったのです。
それでいろいろ調べたところ、下記の構成にしました。

src
 └ main
      └ client ... ここにAngularのソースを書く(npmで管理しているのもこの配下)
      └ java
      └ resources
         └ static ... ここにAngularのTypeScriptのビルド結果が入る(Angular専用ディレクトリにする)
         └ public ... Spring bootのstaticのかわりにここを使う。Thymeleaf等で参照したいものがあればここに入れる

ご覧の通りSpring Bootが中心の構成になっています。
Angular2+は基本的にフルでSPAで作るといった感じになります。
AngularJSは何も考えずに一部画面だけにAngularJSを適用するとかができましたが、
Angular2+の場合はちょっと考えないと一部画面だけAngular適用ってのは辛いです。。 フルでSPAにしたくない場合は、特定のパス配下はThymeleafでやるといった運用も可能です。 今回のサンプルは特にパッケージ(名前空間)を特に分けてないので、このままではそれはできませんが、 packageを何らかの名前で切ってangular.jsonBaseHrefで設定すればこの配下だけAngularというのは可能です。

ビルドはmavenにやらせてmaven経由でnpmをたたいてnpmのpackage.jsonからAngular-CLIのngコマンドをたたいて
TypeScript→JavaScript変換をしてビルドする感じです。

Angular2+について

AngularJSをちょっとだけ触ったことがあったのですが、
AngularJSに比べてかなり使いやすいです。学習コストは高いといわれますが、周辺のエコシステムを学ばなくていい分Reactよりだいぶ学びやすいと思いました。
TypeScriptの恩恵もあってか、どう作ればいいかという道しるべを示してくれている分、
あんまり書き方に差異は出ないような気がしました。複雑になってきたらServiceにとりあえず逃がしておけばよいといった感じで。
TypeScript素敵です。ES6よりも当然、良いです。JavaScript全部TypeScriptにならないかな…と思える今日この頃です。

Spring Bootについて

Spring単体だと嫌なイメージしかなかったのですが、なかなか素敵なフレームワークです。
ただ、Ruby On Railsとかに比べるとやや生産性は落ちる気がしますが、それでも素敵なフレームワークだと思います。
規模が大きくなっても全然辛くならないフレームワークですね。 ただ、JPAというかHibernate、テメーはダメだ。
Hibernate、機能多すぎて、ハマりも多すぎて辛い…。RailsのActive Recordくらいシンプルになればいいのに。

ハマったところ

Angularがどう頑張っても更新されない…watchしてんのに…。
Angularのhtmlを更新してもなんで反映されないのよ…Springのdevtoolいれてんのに…と思っていました。

IntelliJだとこのハマりはないっぽいです。

なんで更新されなかったかというと、Eclipseがリフレッシュをうまいこと効かせてくれなくて、 そのためEclipseからのSpring Boot Appから普通は動かすと思うのですが(デバッグ時)
その時は
target/classes/resources/static/
を見に行きます。

一方、デプロイして動かす環境やmvn spring-boot:runで動かしたときは
webapp/src/main/resources/static
を参照しに行き、そちらを見に行きます。

いずれにしてもリフレッシュがうまくいかなくてstaticディレクトリに入ってくれないんです。 ただ、Eclipseをリフレッシュしてしまえば、うまくいくこともママあります。 native pollingをONにしても解決しない…だれかうまい解決方法しらないかな? 仕方ないんで、都度都度Spring Boot Appの再起動をかけるか、リフレッシュしてプラグインで強制同期かけてます。

パソコン電源投入時にピーピーピーとビープ音が鳴り、起動しない

f:id:fa11enprince:20160328070422j:plain 私事ですが引越しました。 引っ越ししてしばらくたってからWindows PCを立ち上げようとすると、 ピーピーピーピーだかピーピーピーと音が鳴ってUEFIすら立ち上がりません。 3回かな?4回かな?よくわからない状態でした。冷静になって聞いたら3回かも…って感じでした。 軽くスマホでググるとどうも何らかのハードウェアの不良があって、 たいていの場合メモリ絡みの問題らしい。 メモリの接触不良が原因だそうな。

引越の時に、時間に余裕がなく多少乱暴に梱包したのがいけなかったかなーなんて思いました。 もしくは引越業者の人がPCだって忘れてて豪快に投げたのかもしれません(笑) 引越業者の名誉のために言っておきますが依頼した引っ越し業者はとても良い仕事をしていただきました。とても親切丁寧、迅速な引越業者さんでした。 起動中でないし、HDDでないしちょっと程度の衝撃じゃ大して影響ないなーとは思うんですが…

そんなこんなでひとまず、分解しました。 ドスパラのBTOパソコンなのでネジをはずして終わりなので楽ですね。 ……1年半くらいPCの掃除をさぼってたのでホコリがそこそこやばい。 1年半前に電源変えてきれいだったはずの配線がホコリまみれに。 エアブロワーで吹き飛ばしました。 他の部分も盛大にホコリがたまっていたので吹き飛ばしました。 メモリ部分もなんだかホコリが付着しているので飛ばしました。 メモリは完全に刺さっているような気がしたけど、 片方、若干浮いているような気がしました。 抜くと挿すとき割れそうで怖いので(臆病なんです…大昔に256MBのメモリを増設したときにお小遣いが吹き飛びそうでビビってました)、 そのままぐいぐいっと押しなおして念入りにホコリを吹き飛ばして電源投入すると 正常にWindowsが起動しました。

一応、グラフィックボードの接続を確認しましたが問題なし。 CPUはホコリまみれだったのでとっておきました。 全然関係ないと思うけどSSDとHDDのSATAがゆるゆるな感じだったので刺しなおしました。 あとは電源コードを見直しましたが、たぶんどれも関係がない。 電源を入れると一瞬で起動しました。 最近HDDのiMac使っているので起動が異様に早くてビビりました。

ちなみにですが、エラー時のビープ音は下記のようになっているそうです

AWORD BIOSの場合

(短音×1)正常起動
(短音×2)CMOS設定エラー
(長音×1、短音×1)メモリーエラー
(長音×1、短音×2)グラフィックボード、またはモニター接続エラー
(長音×1、短音×3)グラフィックメモリーエラー
(長音の連続)メモリー接続エラー、装着エラー
(短音の連続)電源供給エラー

AMI BIOSの場合

(短音×1)メモリーリフレッシュエラー
(短音×2)メモリーバリティーエラー
(短音×3)メモリーエラー
(短音×5)CPUエラー
(短音×6)キーボードエラー
(短音×7)CPU、マザーボードエラー
(短音×8)グラフィックメモリーエラー

起動時にビープ音が発生する|ドスパラ より引用

ちなみに私の場合は最初にこの音を聞いたとき ピーピーピー(しばらく間隔)ピーピーピー 3回に聞こえるときもあるし4回に聞こえるときもあるし…で焦りました。 たぶんメモリエラーだろうなとあたりを付けて… ちなみに引っ越し作業でマザーボードが何か書いてあるマニュアルどこかに消えてしまいました(笑) 探せばあるんだけど… と思ったら、PC内にドキュメント残しておいてた。

ASRock > B75M R2.0 これですね。 GUI でサポートされた 64Mb AMI UEFI Legal BIOS と書いてあるのでBIOSはAMIのほうですね。 4回に聞こえたのは聞き間違いのようだった…。

教訓。ホコリは大敵。1年に1回は掃除しよう…。

Git 備忘録

f:id:fa11enprince:20170818063154j:plain

Gitでcommitを分割したいとき

次のコマンドでコミット番号を見る

$ git log --oneline --graph  

リベースする

$ git rebase -i 59b146c  

※上記コミット番号はあくまで例

エディットするコミットを選ぶ

下記のようなコミットメッセージが表示されるので、pickをedit(e)に変更

pick 310154e 部分的な修正1とその他ほげほげ

e 310154e 部分的な修正1とその他ほげほげ

ひとつ前のコミットでリセットする(※ここがポイント)

$ git reset HEAD^

※mixedモードでリセットするのでcommitとaddがひとつ前のコミットに戻る

git add前の状態になるので、必要な単位でgit addcommitを繰り返す

全部終わったらcontinueする

$ git rebase --continue

毎回ssh-addが消える問題

現象

$ git pull
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
$ ssh-add -l
Could not open a connection to your authentication agent.

※そもそもGitHubの公開鍵設定をしていない場合は
http://ryoichi0102.hatenablog.com/entry/2017/02/03/232920
とかを参照して下さい

とりあえずその場しのぎの処置

$ eval `ssh-agent`
$ ssh-add ~/.ssh/github_id_rsa
$ ssh-add -l

github_id_rsaのところはお使いの公開鍵に変えてください

面倒なんで.bashrcに書く方法

この辺とかあるが…うーんなんだか… 毎回手でたたくでいいかなって感じもする http://d.hatena.ne.jp/himadatanode/20160823/p14

でもイライラしてきたので.bashrcに書く

eval `ssh-agent`
ssh-add ~/.ssh/github_id_rsa

私の環境の場合はgithub_id_rsaです。適宜変えてください。

もしくはid_rsaにしておくとデフォルトでそこに読みに行くのでこのような問題は生じない…はずです。

Filename too long

これが出る場合、下記をたたく git config --system core.longpaths true ただし、管理者権限が必要な模様 なので ~/.gitconfigに

[core]
    longhpaths = true

を記述する

参考

GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ - Qiita

※httpsの方が最近はいいらしい->Windowsなら資格情報、MacならKeyChainに格納される
ssh key vs personal access token
GitHubに二段階認証を設定した後にGit操作できない時の解決策 - Qiita