clairvyの日記

思ったこと,調べたことを書きます

Carton でモジュールをインストールしようとした話

まだ書きかけでした.

モジュールをインストールしようとした

carton 環境を作った

やること

  • plenv のインストール = ~/.plenv 配下
    • Perl のインストール = ~/.plenv/versions 配下
    • cpanm のインストール = ~/.plenv/versions/<インストールしたバージョン> 配下
      • perl-Carton のインストール = ~/.plenv/versions/<インストールしたバージョン> 配下
        • perl-Carton でモジュールをインストール
        • perl-Carton 経由でモジュールを利用

動機

モジュールをインストールしたい. できるだけインストール先がわかりやすく, 指定も楽な方がよい.

最近のことがわからない.

  • Windows でも実施する
    • Strawberry Perl だと cpanm までは入っている
  • plenv を使おう
    • System でもいいけど,root じゃない人も居るし,環境を隔離したい(~/.plenv 削除すれば全部消えるとか)
    • rbenv を使ってたりするし.こっちでいいか.
    • install-cpanm サブコマンドがある.
      • 普通にインストールしてる
  • cpanm / perl-carton なんすかね?
    • cpanm 単体でやろうとしたけど,@INC の指定がよくわからなかった
    • perl-carton なら簡単なんすかね
      • carton exec でやるのもいい.
    • できるだけローカルディレクトリで済ませたかった.(インストール先が理解しやすいと良い)
    • Carmel - CPAN Artifact Repository Manager - metacpan.org の方がいいんすかね? まだ EXPERIMENTAL ですね.

install-cpanm 補足

$ tail -2 ~/.plenv/libexec/plenv-install-cpanm
curl ${PLENV_INSTALL_CPANM} -L http://cpanmin.us/ | plenv exec perl - ExtUtils::MakeMaker App::cpanminus
plenv rehash

インストール

plenv のインストールは簡単です

コピペだけしとくと

$ git clone git://github.com/tokuhirom/plenv.git ~/.plenv
$ git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/

.bashrc や .zshrc に以下を追加

export PATH="$HOME/.plenv/bin:$PATH"
eval "$(plenv init -)"

で,Perl をインストールして使えるようにする.と

$ source ~/.zshrc
$ plenv install -l|tail -1
 5.23.9
$ plenv install 5.23.9
$ plenv global 5.23.9
$ perl -V|head -1
Summary of my perl5 (revision 5 version 23 subversion 9) configuration:
cpanm を使う
$ plenv install-cpanm
$ where cpanm
<HOME>/.plenv/shims/cpanm
$ rehash
$ cpanm -V|head -1
cpanm (App::cpanminus) version 1.7040 (<HOME>/.plenv/versions/5.23.9/bin/cpanm)
perl-carton を使う
$ cpanm Carton
$ rehash
$ where carton 
<HOME>/.plenv/shims/carton
$ carton -v
carton v1.0.22
モジュールをインストールする
$ edit cpanfile
$ cat cpanfile
requires 'HTTP::Server::Simple'
$ carton  // インストールされる

動作確認

$ carton exec ./a.pl    // HTTP::Server::Simple を使ったもので. @INC 指定していない
$ cat a.pl
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;

{
package A;

use strict;
use warnings;
use utf8;

use base qw(HTTP::Server::Simple::CGI);

sub handle_request {
    my ($self, $cgi) = @_;

    my $a = $cgi->param('a') || 'none';
    print "Hello World ", $a;
}

1;
}

my $server = A->new();
$server->run();

LINK

初めてのPerl 第6版

初めてのPerl 第6版

続・初めてのPerl 改訂第2版

続・初めてのPerl 改訂第2版

モダンPerl入門 (CodeZine BOOKS)

モダンPerl入門 (CodeZine BOOKS)

Eclipse から JUnit を使える環境を準備する話

前の記事からのまとめです.

  • EclipseJUnit を使おうとしたら Matchers(hamcrest-library) が無かった
  • Plugin 内での解決方法がわからなかった
  • Gradle を使うのもいいが,そこまで重くしたくなかった(Eclipse, Gradle をインストールするという意味で)

プロジェクトを作るまで

Eclipse をインストールする

$ brew install Caskroom/cask/eclipse-java

Gradle plugin を入れる

Eclipse を起動して

Help > Eclipse Marketplace
> Search > Find: gradle > Gradle IDE Pack > Install

Gradle プロジェクトを作る

勉強のために,JUnit を書きたいだけなので,Quickstart で.

File > New > Other
> Gradle / Gralde Project > Next
> Project name: XXX, Sample project: Java Quickstart > Finish

Git の設定

プロジェクトを選択して…

Team > Share Project
> Git > Next
> Use or create repository in parent folder of project, プロジェクトを選択, Create Repository > Finish
.gitignore の設定

このままだと,.gradle ディレクトリの扱いが面倒なので,.gitignore に .gradle を足します.
以下は,.gitignore を編集する例です.

プロジェクトを選択 > Show In > Navigator
> (フォルダ階層の中に .gitignore があるので編集) > "/.gradle" を追加 > 保存

Navigator パースペクティブを Close

JUnit 依存の追加

これは,tddbc のプロジェクトから取ってきています.

build.gradle

diff --git a/build.gradle b/build.gradle
index c1baa9d..e733dd6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,7 +15,8 @@ repositories {

 dependencies {
     compile group: 'commons-collections', name: 'commons-collections', version:
 '3.2'
-    testCompile group: 'junit', name: 'junit', version: '4.+'
+    testCompile 'junit:junit:4.+', { exclude module: 'hamcrest-core' }
+    testCompile 'org.hamcrest:hamcrest-all:1.3'
 }

 test {
依存の解決

プロジェクトを選択

Gradle > Refresh Dependencies

プロジェクトの Gradle Dependencies に,hamcrest-all-X.Y.jar が含まれていることを確認する(hamcrest-core ではなくて)

Assist の設定

以下引用させて頂く

設定画面で、Java - Editor - Content Assist - Favorits にて以下の設定。

New Type
    org.hamcrest.CoreMatchers
    org.hamcrest.Matchers (hamcrest-library利用時)
New Members
    org.junit.Assert.assertThat
    org.junit.Assert.fail

引用終わり

Java のテストの話の自分の理解

テストを書ける環境を準備したい話

あらすじ

  • 自分は,Java は,全然知らない.特に最近のはわからない.
  • 友だちに Java を教える話があった
  • まあ学習目的だから,ユニットテストは書くだろう
    • よく知らないけど JUnit かな?
  • IDE とかは,Eclipse かな
  • 最近のは,assertThat / Matcher を使うらしい
  • assertThat / CoreMatcher.is は使えた.
  • Collection の比較で,contains ってどこにあんの?
  • hamcrest-library にあるらしい.
    • eclipse/plugin 配下だと,hamcrest.core しかないような?

一つの目的としては,JUnit 依存をなんとかできるプロジェクトを作る方法を知りたい.

あ,あと,条件として.

  • 予想だと,教える人に過去遺産とかルールがありそうだから Eclipse であることはたぶん変えない.

車輪を見る

tddbc の資料を見てみる.

いかにも,JUnit っぽい.

gradle, maven を使う方法が書いてある.タスクランナーとかビルドツール的な?

gradle - ビルド,依存関係

この記事読んだだけで,gradle でいいんじゃないかと思えてきた.XML とか書きたくないじゃないですか.

gradle と Eclipse をどうやって,一緒に使うのか?

Eclipse には,plugin があるけど,gradle eclipse を叩かないと駄目なんかな.

gradle wrapper というのがあるらしい

そういえば,そういうのが tddbc のプロジェクトに入っていた気がする.
そうか,だから,wrapper を使わない場合.のようになっていたのか.

途中まとめ

まとめというか,tddbc のプロジェクトクローンすればいいんじゃないか.
という結論に達した.
車輪を読んで自分が勉強しただけでしたね.

Eclipse - 開発環境

Eclipse 以外がいい.という理由がすぐ探せなかったので,あまり何も考えてない.

SublimeText を検討…

bootstrap を考える

Eclipse を入れて,なんとかしたら,良い感じの状況にしたい.
確認したいこと.

  • Eclipse 内で,依存関係が解決してよしなになるか.
  • Eclipse 内で,そのようなプロジェクトを作ることができるか.
    • できないならば,その場合には何が必要となるのか.

ためしに,tddbc のプロジェクトをクローンしてみる.

$ cd workspace
$ git clone https://github.com/tddbc/java_junit.git
$ cd java_junit
$ ./gradlew eclipse

Eclipse > File > import > Existing Projects into Workspace

この場合,生成された .classpath を見るに,$HOME/.gradle/caches を使うようだ.
これだと,.classpath とかをコミットできず,全員が gradlew eclipse をしなければならないが,
ライブラリをダウンロードするためには,最低1回は,全員が gradlew eclipse をすると思えば,そんなに悪くない.

とはいえ,デプロイ用途だから test 用ライブラリ不要,という要件はできてもいいかな.と思うけど,
今回は本筋から外れるから考えない.

Eclipse gradle plugin
Eclipse > Help > Eclipse Marketplace 
gradle で検索
Gradle IDE Pack をinstall

dukelab さんの記事を参考に,新規プロジェクトを試してみる.

sample project について

Java Quickstart がシンプルなのかな.

File > New > Other > Gradle > Gradle Project > Next
> Project Name(gradle_test_qs) : Sample Project(Java Quickstart) > Finish

プロジェクトを選択 > Team > Share Project > Git : Next
> Use or create repository in parent folder of project : そのロケーションを選択 : create repository > Finish

プロジェクトを選択 > Team > Commit

試しに,build.gradle を変更してみる.

modify build.gradle

プロジェクトを選択 > Gradle > Refresh All

これで,依存関係とかが変更される気がする.

あと,ディレクトリを見てみたら.こうなっていた.
あまり調べていないのだが,.gradle/, .settings/ は ignore するのかな.

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   .gradle/2.1/taskArtifacts/cache.properties.lock
	modified:   .gradle/2.1/taskArtifacts/fileHashes.bin
	modified:   .gradle/2.1/taskArtifacts/fileSnapshots.bin
	modified:   .gradle/2.1/taskArtifacts/taskArtifacts.bin
	modified:   .settings/org.eclipse.jdt.core.prefs
	modified:   build.gradle

no changes added to commit (use "git add" and/or "git commit -a")

.gitignore に .gradle は含めても良さそう

あと,.settings は,日付が更新されていただけなので,戻しても良さそう.

jar を入れる

ググったけど,直接 Eclipse に jar を入れたり,という道を選択することはあまり無いようだ.
あっても,maven でなんとかする.という記事くらいしか見付からない.

まとめ

grails plugins を eclipse で使うということでいいかな.

すべては何になるのか

とあるドラマの感想である

  • 話題的には大学の位置は元のでも良かったかもね
    • それこそ予測できないから,仕方ないか.
  • 真賀田博士は,痩せたメイクをしてもいいかもしれない.
  • 喜多先生かっこいいは,盛り過ぎじゃね?
    • ダンディとか?もう少しお若い方の配役でも良かったのでは?あんま出ない感じなんすかね?
    • 犀川先生と同期とか言われると,ちょっと違和感があった.
  • イマドキメールが来るから,は無いやろ.チャットとか,オンラインミーティングで良いんじゃ?
  • 犀川先生のイメージは,少し一般受けな感じですね.部屋が汚かったり,表情が表に出る感じ.
    • デカいディスプレイとかはあっても良かったかも.ノートである意味はあんま無いかなー.画面を写したくなかったのかな?作るの面倒だから.Python 使ってる.とかツッコミが来たりするしね.

ということで,まだ全部見てないけど.こんくらいすかね.

何になるのか.というと,本質的に萌えアニメなんだから.
犀川先生がかわいければ,何でもいいんじゃないですかね.

あ,あと,四季が預言者みたくなってますね.
そんなもんだっけか?

結婚式で思うこと

内容

結婚エントリではありません.
以下,個人の感想ですし,そもそも1組ずつしか見てないので,
一般的ではないかもしれないのをご容赦ください.

結婚式に二週間連続で行ってきたので感想を残しておこうと思う.

  • 前者は,教会のタイプで,
  • 後者は,神社のタイプ

だった.

教会のタイプ

新郎,新婦 に 神父 が誓約(commit) させるようなイメージがあった.
それを同席の人に確認させる.契約のイメージ.

神社のタイプ

神主(?) は,あくまでも司会 or 代弁者に近いイメージで,ちょっと話すだけ.
新郎,新婦が,誓約するけど,回りの人も,一緒に聞く.
神楽を踊ったりして,同席の人は,参加者でしかないイメージ.

まとめ

宗教の神観の違いなのかもしれないけど,
そのまま,人の価値観にも現われているのかな.という部分も考えたりした.

そんなことはどうでもいいので,御両人 x 2,お幸せに.

docker private registry を立ててみた

内容

いちいち build するのが面倒になったから,private registry を立てることを検討してみた.
とりあえず,ローカル(MacOSX + boot2docker)に立ててみる.

Mac$ docker run -p 5000:5000 registry

Mac$ docker ps -a
CONTAINER ID        IMAGE                                            COMMAND                CREATED             STATUS                   PORTS                                                                                    NAMES
a7238561b9e2        registry:latest                                  /bin/sh -c 'exec doc   22 hours ago        Up 29 minutes            0.0.0.0:5000->5000/tcp                                                                   silly_bell

これだけで起動する.

失敗

Mac で boot2docker を使っているので,

Mac 側
Mac$ sudo vi /etc/hosts
192.168.59.103 docker-reg.private.local

Mac$ docker push docker-reg.private.local
2014/08/08 08:34:12 Error: Invalid Registry endpoint: Get http://docker-reg.private.local:5000/v1/_ping: dial tcp: lookup docker-
reg.private.local: no such host

としてみたら,push できなかった.

成功

boot2docker 側
boot2docker$ sudo vi /etc/hosts
127.0.0.1 docker-reg.private.local
boot2docker$ docker push docker-reg.private.local:5000/sample-app
The push refers to a repository [docker-reg.private.local:5000/sample-app] (len: 1)
Sending image list
Pushing repository docker-reg.private.local:5000/sample-app (1 tags)
(中略)
Pushing tag for rev [a1eb481825d3] on {http://docker-reg.private.local:5000/v1/repositories/sample-app/tags/latest}

で設定したらできたみたい.
そりゃそうか.docker が動いてるのは boot2docker 側だから,
そっちから引けないと駄目か.

ということは,最初は localhost にしたら簡単だったかも.
あーでも,そうすると,Mac 側から見えないか.両方設定するのもアリかもしれない.

次に

もうちょっとストレージの永続化とかを考えた方がいいかもしれない.

Makefile を書く訳

何か仕事的なことを実行するときにシェルスクリプト的なものを書くときがあります.

スクリプトのサイズ(処理する機能,処理対象)によって,
シェル → スクリプティング言語 → 速いの.みたいな描き直しが発生したりしますが.

シェル → スクリプティング言語の途中に,Makefile を使うことがあります.
まあ,Makefile なんで複雑なこと書けないし,$ (ダラー)をエスケープとかしなきゃいけないけど
2つ好きなところがあります.

  • ターゲットを補完できる
  • 依存関係を表現できる
ターゲットを補完できる

基本Zshell 使っているので,補完したい.
仕組み作ってもいいけど.まあ簡単にやりたい.
そんな感じで,Makefile のtarget を使ってます.

依存関係を表現できる

処理する対象がある程度大きいと処理を分割しよっかなと思ったりします.
一時ファイルとか作ってやるとかです.真面目に最適化するのもいいけど.
まだそれが今後も必要な処理かどうかが,わかっていないとか.

そんなときに,適当に処理を分割して,pipe & filter の処理をわざと区切って
task に落としたりします.

target: bbb

bbb: aaa
    $(scriptB) aaa > bbb

aaa:
    $(scriptA) > aaa

みたいな.

オプションとか真面目に処理するなら,何か言語でやったが速いかもなー.
オプションも簡単に書けて,自動的に Zshell で補完できるのなにかないですかねー.