読者です 読者をやめる 読者になる 読者になる

戦えプログラマン

いつだって戦いなのだ

IDEA で Create New Project で sbt したら、srcディレクトリがない

Scala IntelliJ IDEA 環境構築 sbt

しばらくサボってた忙しくて、久々にIDEA触ってみたら、なんかヘン。
f:id:arx0balest:20160815235153p:plain:w600

scala idea」でググって出てくる手順通りにIDEAでScalaプロジェクトを作ると、
なぜかsrcディレクトリが生成されない。

why?

1. SBT launcherの設定を確認。

  1. なんかヘンなプロジェクトを Close Project
  2. SBT launcher を正しく設定してやる。
    f:id:arx0balest:20160816000612p:plain:w600

2. Create New Project時の設定を確認。

  1. いつもの(Create New Project -> Scala -> SBT -> Next)
  2. なんか自動で作ってくれる感ある項目にチェック。
    f:id:arx0balest:20160816001109p:plain:w600
  3. Finish

3. 待つ!!!

特に初めてScalaプロジェクトを作成した時は、準備・生成が完了するまで時間が掛かる。
IDEAのステータスバーが空になるまで待つ。とにかく待つ。

qiita.com

うんまあとにかく待つんだ。
あわてちゃいけない。

で。

無事でけたもよう。
f:id:arx0balest:20160816002513p:plain:w600

∩( ・ω・)∩ ばんじゃーい

Cannot resolve symbol 'index' エラーの解決

Play Framework Scala 環境構築 IntelliJ IDEA

(先の「無料でPlay2鯖を立てる」の続き。)

IntelliJ に sbt プロジェクトとしてインポートしてみた。
とりあえず適当にファイルを眺めてると・・・なんかエラーが起きてる。

「app\controllers\HomeController.scala」 で 「Cannot resolve symbol 'index'」

なんでチュートリ通りに作ってエラーが出るんだ・・・などと慌てない慌てない。
とりあえずググると、割と有名なエラーっぽい。

解決方法は諸説あるようだが、
「sbt pluginで、IDEA用プロジェクトとして作り直す」
というのが一番簡単そう。

1. 初期化

既にIntelliJにインポート済みの場合は、設定情報と中間ファイルを削除する。
「もう設定とか色々煮詰めてやり直したくない!」という場合は・・・
ご愁傷様。傷が浅い内に涙をのんでやり直しましょう。

「Close Project」して、プロジェクトルートディレクトリから、下記2ディレクトリを削除する。

  • .idea
  • target

2. 「sbt-idea」プラグインの導入

「project\plugins.sbt」の末尾に、下記を追加。

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")

※そーす
GitHub - mpeltonen/sbt-idea: A simple-build-tool (sbt) plugin/processor for creating IntelliJ IDEA project files

3. 「sbt-idea」の実行

プロジェクトルートディレクトリにて、下記コマンドを実行。

sbt gen-idea

流れるCUIを見ながら待つ。ちょー待つ。
終わったら、「.idea」「.idea_modules」「target」ディレクトリが自動生成されてるはず。

4. IntelliJにインポート

あとはいつも通り(?)、sbtプロジェクトとしてインポートするだけ。

エラーを吐いてた「app\controllers\HomeController.scala」を見に行くと・・・
エラーがなくなってるはず。

5. ローカルでもPlayを動かしてみる

IntelliJの「SBT Console」を使う。

  • メニュー -> View -> Tool Windows -> SBT Console をクリック。
  • 「SBT Console」ウィンドウで、左端の緑の再生マークをクリック。
  • 「run」と入力して「Enter」。

またまた待って・・・

f:id:arx0balest:20160803003352p:plain:w400
キタワァ・*゚(n'∀')η゚*。・



ん?OpenShiftに立てた方と画面違くね・・・?(続く?)

無料でPlay2鯖を立てる(OpenShift + Scala + Play Framework)

Scala Play Framework Openshift PaaS

「『OpenShift』に登録すると、
 タダでScala鯖が立って、
 git pushするだけでデプロイできちゃう!」

とかいう甘言に釣られて、思ったよりのたうち苦しんだので備忘録。
(※主にドキュメントを読まなかったせい)

こんな記事書いといて何だが、OpenShiftは割と公式ドキュメントが充実してるので、
英語がちゃんと読める人は公式読むことをオススメ。
用語とか「OpenShiftとは何ぞや」みたいな話は、
既にたくさん良い記事があるのでググってね!!

さー、IntelliJのインポート・ビルドが終わるのと、この記事書き終わるの、どっちが早いかな。

0. 前提環境

  • 開発環境 : Windows 7IntelliJ IDEA Community Edition (結局無料Win10スルーしちまった・・・)
  • OpenShift操作用コマンド(rhc)のインストール先 : Lubuntu (VMWare)

rhc用にrubyが必要で、ruby + win は相性悪いとよく聞くので、VM上に入れた。
「なんか軽いらしい」と適当に選んだディストリなので、rubyが動けば何でもよし。

1. OpenShift に登録する。

特に珍しいものもなく、ググれば記事出てくるし割愛。

2. Lubuntu に rhc をインストールする。

公式の通り
For Debian/Ubuntu | OpenShift Developers

(メモ)

vm@l-vm:~$ rhc setup
# (中略)
If you have your own OpenShift server, you can specify it now. Just hit enter to use the server for OpenShift Online:
openshift.redhat.com.
# 空Enterでよし
Enter the server hostname: |openshift.redhat.com| 

You can add more servers later using 'rhc server'.

# 登録済みのアカウントでログインする
Login to openshift.redhat.com: user@example.com
Password: ***

# 一定期間ログインしっぱなしにするみたいなやつ。yesなりお好きにしてEnter。
OpenShift can create and store a token on disk which allows to you to access the server without using your password. The key
is stored in your home directory and should be kept secret.  You can delete the key at any time by running 'rhc logout'.
Generate a token now? (yes|no) yes
Generating an authorization token for this client ... lasts about 1 month

Saving configuration to /home/vm/.openshift/express.conf ... done
# (略)

初めての接続だと、「sshキー登録する?」とも聞かれるので、これも「yes」でよい。
後からWebUIで簡単に追加・削除ができるので。 (https://openshift.redhat.com/app/console/settings
(「~/.ssh/」配下に鍵が存在すれば、デフォでそれが使われる。)

3. OpenShift に Play2 をデプロイ。

さあもうデプロイだよ!!

公式によると、雛形のカートリッジ使うのが手っ取り早いっぽい。
Free Play Framework Hosting | OpenShift QuickStart
ver.2.5.0とちょい古いのが残念だけど・・・まぁ2.5台だしいいか。

GitHub - tyrcho/openshift-cartridge-play2: Play2 In OpenShift as a cartridge

# WebUIでなく、コマンドで雛形を作る(結構待つ)
vm@l-vm:~$ rhc app create  playapp  http://cartreflect-claytondev.rhcloud.com/reflect?github=tyrcho/openshift-cartridge-play2&commit=play-2.5.0

# できあがったウェブサイトの確認 (※この時点でウェブサイトにブラウザアクセスすると500エラーで死んでるが気にしない)
vm@l-vm:~$ rhc apps
/var/lib/gems/2.3.0/gems/commander-4.2.1/lib/commander/user_interaction.rb:328: warning: constant ::TimeoutError is deprecated
playapp @ http://playapp-example.rhcloud.com/ (uuid: 000a000b0c000000b0000001)
-----------------------------------------------------------------------------------------
  Domain:     example
  Created:    11:07 PM
  Gears:      1 (defaults to small)
  Git URL:    ssh://000a000b0c000000b0000001@playapp-example.rhcloud.com/~/git/playapp.git/
  SSH:        000a000b0c000000b0000001@playapp-example.rhcloud.com
  Deployment: auto (on git push)

  github-play2-2.5.0 (Play Framework 2.5.0)
  -----------------------------------------
    From:    http://cartreflect-claytondev.rhcloud.com/reflect?github=tyrcho/openshift-cartridge-play2
    Website: https://github.com/tyrcho/openshift-cartridge-play2
    Gears:   1 small

You have access to 1 application.

# 鯖にsshログイン
vm@l-vm:~$ rhc ssh playapp

# 鯖の状態を確認してみる
[playapp-example.rhcloud.com 000a000b0c000000b0000001]\> gear status
Cart to get the status for?
1. play2-2.5.0
?  1
ATTR: quota_blocks=1048576
ATTR: quota_files=80000
CLIENT_RESULT: Application is either stopped or inaccessible

# ビルドして叩き起こす(かなり待つ)
[playapp-example.rhcloud.com 000a000b0c000000b0000001]\> gear build
[playapp-example.rhcloud.com 000a000b0c000000b0000001]\> gear start

# 鯖の状態を確認してみる
[playapp-example.rhcloud.com 000a000b0c000000b0000001]\> gear status
Cart to get the status for?
1. play2-2.5.0
?  1
ATTR: quota_blocks=1048576
ATTR: quota_files=80000
CLIENT_RESULT: Application is running

# ∩(・ω・)∩ばんじゃーい

WebUIで、鯖が起動してることを確認。
https://openshift.redhat.com/app/console/applications
f:id:arx0balest:20160802212644p:plain:w400

サイトのURLにアクセスすると・・・・・・・・・
f:id:arx0balest:20160802212039p:plain:w400
キタワー.:.。.:・゚(n'∀')η゚

4. 開発マシンにcloneする。

もう各所で目にしたが
ssh://000a000b0c000000b0000001@playapp-example.rhcloud.com/~/git/playapp.git/」
リポジトリ
sshなので接続には公開鍵の登録が必要。

公開鍵を登録する方法は、これまた公式を参考に。
Remote Connection (SSH) | OpenShift Developers

作った鍵を「settings」ページの「Add key」で登録。
Sign in to OpenShift Online | OpenShift Online by Red Hat

開発マシンで git clone(SourceTree経由でやったらエライ遅かったので、コマンドでのcloneをオススメする)

git clone ssh://000a000b0c000000b0000001@playapp-example.rhcloud.com/~/git/playapp.git/

host@Win-PC MINGW64 /d/Project/IdeaProjects/playapp (master)
$ git log --oneline
53f9610 Creating template

そんでローカルにできあがったリポジトリを、IntelliJにインポート(すごく待つ)

んで

これでようやく・・・ようやくスタートラインに・・・
立ててないんだよなぁ・・・

次はDBの作成・登録。(また後日)

どこでもPHPUnit

php サンプルコード

何?
PHPユニットテストを試しに書いてみたいけど、導入方法がわからない?
そもそも導入に申請が要る?時間がない?外部プログラム利用禁止?

お兄さん良いものがありますよ。
よってらっしゃいみてらっしゃい。

どこでも誰でも人類皆等しく、今すぐ PHPUnit (のような何か)を書ける!
さあこれを適当な tekitou.php にコピペして、あなたも私も今から PHPUnitter !!!

ででーん

MicroPHPUnit.php

gist.github.com

厨二ネームですんません。
PHP 5.3~5.6で動作。それ以外は知りません。
特に工夫もなく見ればわかるレベルのコード量だが、

  • assertSame()
  • fail()

アサートはこれらしか実装してない。
まーこの2つさえあれば、エセPHPUnit書くには十分だろう。(慢心)
簡単な使い方については冒頭に記載。

PHPUnit互換(たぶん)なので、いつか本物のPHPUnitを使えるようになったら、
これに書いたテストコードを丸コピすりゃOK。

以上!

(※ この記事はここで終わりです。)


(※ 以下駄文)

どうしてこんな車輪の再発明をするに至ったか。
早くも暑さで狂ったのか。
いやいやこれには深い深い訳が・・・言うほどでもないがあったんだ。

・・・

(フィクションです。一昨日あった話とかではないです本当です。)
え?テストコードを書きたい?うん、いいよ。
え?パー?ピェー?コンポーザー?って何?
ふーん。じゃ、申請書書いて。
申請通るの2週間後くらいだけど、進捗大丈夫?
え?プロジェクトのコードに組み込むとか、お前本気で言ってる?
それで障害起きたら誰が責任取るの?
あのさー、こっちも忙しいから、仮定の話は暇な時にしてくれないかな。
おしゃべりしてないで手を動かそうよ。

・・・

ごくごく一般的なPHP案件での、上長との心温まる愉快な技術雑談の一例ですね。

  • UTを書く土壌がない。
  • そもそもUT Frameworkが導入されてない。
  • そもそも導入について調べる時間がない。
  • セキュリティ(笑)の問題で、お上からお申請書お判子お頂かないと、ソフトウェアを導入できない。(+牛歩

・・・

うるさいっ それでもテストコードを書きたいんだ!

・・・

そんなことを思って作った。
ので、ネットに放流した。

外部のデータ持込やソフトウェア導入が禁止でも、
ネットのコードのコピペはセーフみたいな風潮だからね。
元ネタが他人様のブログ自分のブログか程度の違いだし、晴れてどこでもPHPUnitれるね。
やったねペチパーちゃん!

・・・

「つーか元のプロジェクトからコード切り離したら、テストの意味なくね?」
逆に考えるんだ。
切り離しても正しく動くほど、疎結合なコードを書いてるのさ」と考えるんだ。

・・・

はーーーーーーーーーーーーー
もうPHPは嫌

※追記(2016/06/20)
テスト対象を「require_once」すれば、いちいちこのファイルにコピペ移植なんてしなくてもテストコード書けるじゃないか、と気付いた。
まぁそれで動くような疎結合なコード書いてるプロジェクトで、UnitTest一つまともに導入できない環境なんてないわな・・・

古いMacBookにSSDを載っけてやる

Mac

訳あって古いMacBookを使うことになった。

この白マックとかいうやつである。(画像は拾いもの)
f:id:arx0balest:20160605005919j:plain:w300

とりあえず何も考えずに最新の El Capitan へOSアップグレードしたところ、重い重すぎる
使い物にならんので、「今どきノートPCにHDDはないよねー」ってことで
内蔵ストレージのHDDをSSDに交換した。

1. ネタを集める。

SSD

 SSDはこれ。
 選んだ理由は、一番安かったから!
 骨董品の延命用だし、速度もSATAで頭打ちだろうし、TLCの安いヤツで十分じゃね~のと。
 250GB台のSSDが7000円で買えるとか、良い時代になったねほんと。

・工具類
 「mac ドライバー」などでamazon検索。
  ・アネックス(ANEX) ヘクスローブドライバーT型 T8×60 No.6300
  ・アネックス(ANEX) 精密ドライバー プラス00×50 No.3450

 ちなみに上記の星形ネジ用ドライバは、筐体固定用のやつ。
 HDD固定用のは、もっと小さいのを買わないといけないらしい。
 なぜ「らしい」なのかって?
 知らずに買って、サイズが合わなかったからだよ!ペンチでねじ回す力技で乗り切ったがな!

 あと、せっかく筐体開けるので、エアダスターもあると、溜まった埃を吹っ飛ばせて気持がいい。

2. 型番を調べる。

f:id:arx0balest:20160605010610j:plain:w300

うちの子は「A1342」というらしい。

3. 型番+SSDでググって交換する。

こちらのサイトがわかりやすかった。多謝。

MacBook(MC207J/A)にSSDを導入する。 @ temverCLBlog

4. ついでに光学ドライブも外しちゃう。

開けてしげしげ眺めてたら、「光学ドライブ要らなくね?」と余計なことを思い付く。
ただでさえ重い(物理的に)のだから、ちょっとでも部品減らしたろうじゃないか。

MacBook Unibody Model A1342 Optical Drive Replacement - iFixit

バッテリーのコード抜かずに作業してたことに気付きびびるなど・・・
そして外してみて・・・
うーん・・・心なし軽くなった・・・ような気がしなくなくなくない

5. あとはOSをインストールしておわり

はいお疲れっしたー

のはずが、OSのインストールでエラー。
ハードウェア構成が変更したせいかな?
よくわからんけど、とりあえず下記参考に解決。

5-1. NVRAMのクリア。
MacのPRAMをクリア(初期化)してハードウエアトラブルに対処する方法 / Inforati

5-2. 日時の設定。
Macをインターネットリカバリしようとしたらエラー - うっかり技術支援部署に配属されたので勉強する
(いっつも思うが、日時の順番が酷すぎる。設計したやつアホなんじゃねーかと常々思う。)

さあ気を取り直して、OSインストール!
この時初めて気付いたけど、MacってOSインストール用のUSBさえ用意しなくていいのね。
インターネット経由で勝手に最新OS DLして、勝手にインストールしてくれる。すげえ。

6. Trimの有効化。

OSX: Mac (El Capitan ) で SSD の TRIM を有効にする方法 | siro:chro

はい今度こそお疲れっしたー。

で。

まだ初期設定をした程度だけど、劇的に違う。サクサク。
5年も昔の骨董品とは思えないくらい、ちゃんと動く。
DiskI/Oだけでこんなに違うもんかね~。

ちんたらやって、全作業合計2hも掛かってないと思う。(もち通販の配送待ちは除きますよ)
割とあっさり簡単に成功したので、押し入れに古いMacBookが転がってる人とか、
中古でMacBook買ったけど遅くて使い物にならなかった人とか、
ぜひお試しあれ。

gitのリポジトリを作ったら一番最初に流すコマンド

# (1) チェックアウト/コミット時の自動改行コード変換を無効化
git config --system core.autocrlf false
git config --global core.autocrlf false
git config core.autocrlf false

# (2) ファイル名の大/小文字の無差別設定を無効化
git config --system core.ignorecase false
git config --global core.ignorecase false
git config core.ignorecase false

# 確認
git config --system -l
git config --global -l
git config -l

これデフォの挙動にしとけやボケェ!って叫びながらEnterすると尚良し。

git hook で、コミットメッセージの禁止文字チェックを行う

git git hook

git で commit や push 等々する前に、内容をチェックしてくれる機能として、「hook」がある。
リポジトリDirの下記パスに入ってる怪しいファイル.sampleさん達がそれだ。

{リポDir}\.git\hooks

自動でコミットメッセージに特定の文言突っ込んだり、みんなスゴいことやってるけど、
ド単純な「コミットメッセージの禁止ワード」をやってる記事が見当たらなかったので書く。
・・・ド単純過ぎて書くまでもないってことですかね。初心者ってことで大目に見ておくんなまし。

コミットメッセージのチェックに使う hook はこれ。
.\.git\hooks\commit-msg

コードはこんな感じ。
github.com

「pre-commit や pre-push 等を自分で開発したいけどよくわかんない!」
そんな時は、SourceTreeをうまく使うといいと思う。
適当なhookファイルに

echo $1
exit 1

こんな感じのデバッグコード仕込んでSourceTreeからコミットすれば、
必ずエラーでコミットが中断し、変数の中身を確認したりできる。
いちいち面倒な感は否めないけど、単純でいいんじゃないかな。