Anagura's.....

たまに書く

mkdirしたら自動でリモートのmercurialにcloneする

というわけでzshrcあたりに記述するシェル芸を久々に書いた. いちいちcloneしたりpushする時にパス書くのも面倒くさいし ディレクトリ作るためだけにリモート行くのもやや面倒くさい…. その為に osmkdir ex2.11 とかするとディレクトリ生成とclone,ついでにhgrcを書いてpush出来るようにする関数を作ってみました.

osmkdirするとディレクトリとpathを記述したhgrcを作り,mercurialにcloneす ...

やってることはただコマンド並べてるだけなのでわりかし簡単…. SSH変数のとこを適当に変えてください

perlの()

最近Perl勉強しています.楽しいです. 今日の発見なんですが

#!/usr/bin/env perl
use strict;
use warnings;

chomp (my $input = <STDIN>);

sub reject{

    my $number = @_;

    if ($number == 0) {
       $number =1;
    } else {
       $number *= &reject($number-1); 
    }
}

print reject($input) ."\n";

なコードがエラーを吐いて? だったのですが. Perl入学式で質問してみると

いわゆるコンテキストなアレ 問題だったらしい.要素数だけが返されてたのね…

どうもただ ()使っているだけに感じていた

my($foo,$hoo) = @_;($foo,hoo) がリストとして解釈されたから上手く行っていたらしい. なるほど…Perlは奥が深い…

ぴかぴか(自称)のPerl1ねんせい

この記事は Perl入学式 Advent Calendar 2016 12日目の記事です。

自己紹介

今年から始まりましたPerl入学式 in 沖縄の受講生です.アナグラといいます.in沖縄は第2回まで開催されてますが,第1回の第三部から参加させて頂いてます.

情報工学系を勉強している大学2年次です.CodeHex先生の後輩に相応します.力の差があるので気楽に後輩と言えない.

受講したきっかけ

ぶっちゃけ詳しく覚えてないです. 確かCodeHex先生がニュースサイトに投稿しているので知ったような気がします. 当時は大学でC言語java,あとpythonをちょろっと触ったのですが,どれも今一踏み込んで書けるLevelではなく.

 スラスラ書けるのがシェルスクリプトだけ という状態だったので 母国語(プログラミング的な意味で)  が欲しくて受講を決めました.

ちなみに当時のPerlに対する認知レベルは Perl? 真珠? レベルです.

第2回までの流れ

in 沖縄では第二回の時に第三回も纏めて行ったので,知識としてはリファレンスあたりまで勉強しました. 講師はpapixさんやOkinawa.pmの皆さんが中心だと思います. perl入学式は勉強したことをすぐコードに起こすので,知識と実装が同時に入ってくる感じがあり勉強しやすいです. 何より楽しい

papixさんを始めサポーターの皆さんが優しいのですごい助かっています. Slackの方でも質問に答えて頂いて,ここまでしていただいて良いのかと思っています.

perlについて

復習と予習がてらリャマ本も進めていますが,正直リファレンスを初めとして未知の部分が多いです. コンテキストの違いはこないだ少しわかってきました.(多分)

今書いているコードはハッシュとpush,popなど以外はperlらしいコードをあまり書いていないんじゃないかなぁというレベルです. なのでよりPerlらしい(?)コードを書けるように勉強します!!

後はpaizaとかやってます.入学式に参加してからPerlでB問題が解けるようになりました…!嬉しい…!

懇談会

in 沖縄では毎回Perl入学式終了後にOkinawa.pmさんとの懇談会が行われます. 懇談会ではLTが行われたり,技術トークで盛り上がったり,相談に乗っていただいたりしています.

技術トークは技術力がないのでまだ追いついていけない事が多いですが,後々トークにあがっていたwordを聞くことがあり,いつか混ざりたいです.

それと前回の懇談会では自己紹介のLTさせて頂きました.温かい空気ありがとうごうざいます.

まとめ

まだin沖縄の全日程を走りきってないので卒業していないPerl 1年生ですが Perlはいいぞおじさん(Perl Monger) になれるようにコードガリガリ書いていきたいです.

とりあえずはアルパカ本を読み切るのがしばらくの目標です. 後は何か作ってみたいですね.はてなブログにターミナルから投稿できるプログラムとかとか….

なのでperl入学式in 沖縄卒業まで頑張っていきます! 

後は彼女がいないので,いつか「Perl入学式に参加したら彼女が出来た件について」書けるようになりたいですね.

container迎撃戦(途中)

作業メモですね.まだ終わってないというか詳細の考察が出来てないです…

作業の目的は dockerが作ったcontainerにhostから入り込めたいので,場所を特定する です.

とりあえずcontainerを作ってrunさせてみる. containnerの中にattachしておもむろにファイルシステムを調べるためにdfコマンドを使うと

$df .
Filesystem                                                                                           1K-blocks   Used Available Use% Mounted on
/dev/mapper/docker-253:4-4886298774-a92010df79ba7ec88ff7cf9805c59a0547f642c06599a5dfbc43b9e10952940b 103080888 641328  97180296   1% /

と/dev/mapperにmappingされてるファイルシステムを使っているらしい. 253:4-488とかは多分作られたcontainerに一意に振られたものなんだろうと予想.

containner内部でlsblkすると

[@a92010df79ba]/% lsblk                                            

**略 **

`-sdd1   8:49   0     2T  0 part 
sr0     11:0    1  1024M  0 rom  
loop0    7:0    0   100G  0 loop 
loop1    7:1    0     2G  0 loop 

おぅふ.中からはよくわからないが,dockerを走らせた状態で一旦抜けてホスト側から見ると

sr0                                   11:0    1  1024M  0 rom  
loop0                                  7:0    0   100G  0 loop 
└─docker-253:4-4886298774-pool       253:5    0   100G  0 dm   
  └─docker-253:4-4886298774-a92010df79ba7ec88ff7cf9805c59a0547f642c06599a5dfbc43b9e10952940b
                                     253:6    0   100G  0 dm   
loop1                                  7:1    0     2G  0 loop 
└─docker-253:4-4886298774-pool       253:5    0   100G  0 dm   
  └─docker-253:4-4886298774-a92010df79ba7ec88ff7cf9805c59a0547f642c06599a5dfbc43b9e10952940b
                                     253:6    0   100G  0 dm   

ふむ.loop0とloop1という名前で接続されてるのがこのcontainerの中身か. ならその中を見たいのだけど.

container側からdf取った時に見れたディレクトリに移動してみると

[e155730@dalmore]/dev/mapper% ls -la
 docker-253:4-4886298774-> ../dm-6

的なものが.ふ〜む.結局これはdm-6にリンク張られてるだけか. しかしdm-6というもの,物理的なファイルシステムを論理ファイルシステムとして見れるようにしたもの (昨日までの理解なので間違っている可能性大) なのでlessやcdは当然出来ない.

他のdockeerが絡んでそうな/var/libe/docker/ は管理者権限ないので覗けないし… これ以上追えない疑惑が…

実際dockerがホストのどこに配置したのかは自分のVMで作って見てみるのが早そうかなぁ. ただ学科のcontainerで計測したデータを転送したいのだけど,ホスト->containerは可能でも container->ホストはディレクトリが判明しないとわからないのでデータの送信という面でもどうするか….

う〜ん…このへんは聞かないとどうにもならなさそう…

さらにjavaシステムコールの処理時間はプロセス分けただけなら時間同じじゃね?と思ったら,containerの方が2倍ほど遅いという結果に…う〜ん…わからん…

mercurialのmerge関連

一応まとめておいたほうが良いかも?ということで OSの課題の奴です.参考になるかはわかりませんが.

mercurialでpull requestをするにはBitbucketとかgithubが自動でやってくれていた所を自分でどうにかしないといけない. それは何かと言えば,リモートのリポジトリの権限を振ってあげないといけない.

mercurialの場合,pushしたリポジトリからcloneしてpull request(push)する際に対象となるのはリモートのリポジトリgithub使ってるときは$git push origin master (だっけ)する対象だよね.

ただ自分が作っただけだとパーミッションが755.つまり自分だけしかなにも出来ない状態になっている. なので他の人がpushしようとしてもロックがかかってしまう訳.

じゃぁどうするかと言うと権限を変えれば良い. グループ内だけ出来るようにすれば良いので775で良いと思うのだけど,777にしとくのがベター? それと再帰的にするので -Rを忘れずに

$chmod 775 -R .hg

すればおそらく出来る筈.mergeは調べれば出てくる気がするけど

$ hg merge other-branch

あたりすれば良いかなぁ. 終わったらパーミッション戻しとこう

$chmod 755 -R .hg

閲覧サービスのgrafでmergeされてればokかな.たぶん


2016/12/01(追記)

mergeする際にconflictが起こった場合,OSXの場合はXcodeのFileMergeがデフォルトで起動するらしい. hgrcにmergeの記述を書いといたほうがエディタで書けるので便利

GitKrakenでのsshについてなど

手術とかデザインスクールとかまとめないと行けないのをまとめてない…やばい…

academyなアカウントで無料でPRO版を取得できるので最近gitを使うときは GitKrakenを使っているのですが,どうもssh回りで何か挙動が怪しい.

まずsshの鍵名を独自のにしてconfigureに書いている場合は

Preferenceの AuthenticationからUse Local SSH agent をクリックしないといけない. どうもKrakenは鍵を見てくれないらしい.悲しい. ただここをクリックしてもsshの登録が上手く行かないと反映してくれない. 可能性としてはssh-addをしないといけないらしい.

その時点でクリックしてなかったのが原因かはわからないけれど,Krakenからgit cloneすると デフォルトのプロトコルsshではなくてhttpsになっているので,コマンドラインからpushするとパスワード聞いてくる.おいおい.

どうもこれはGithub for Macでもあったものらしく .git/configureのレポジトリのurlを

    url = git@github.com:anagura/hogehoge.git 

的に変えないといけないらしい.参考リンク

Branchtの状態などが可視化出来てわりと使いやすいのでオススメかも. アイコンがGravatarから読まれているのでグループワークしても自分を主張できる強さも有る.

モデリングの講義ではこれ使っていく感じで

OS2.1(前半)とjavaの場所

一応まとめ.作業途中にIntellijのスクショ取っとくべきだった….

今回はビルドにテスト,その他諸々をスクリプトで記述することによって自動化してしまおうという gradleというツールを使ってjavaでのI/Oの記述速度の比較をするプログラムを作る.その為の前準備の様な課題です.

とりあえずJavaでよく使われるIDEIntellijをダウンロードしてみよう. 一応学生は登録すればUltimate無料で使えたりします.後プラグイン入れたら他の言語も使えるよ.

次にgradleをinstall

$brew install gradle

一応この前にbrewの環境を更新しときたいので

$brew update 
$brew upgrade

ぐらいはしておいても良いんじゃないかなぁ.

次に今回はjavaを使うので最新版のJDKをinstallします. jDKのinstall Accept License AgreementのチェックいれてMacOSXのverをinstallしよう.112ぐらい使えば良いのではないかなぁ.sampleはいらないと思われる.

ダウンロードしたJavaの仕様書もほしいよねって事で.英語版のdocumentをDownloadします. Java Document

Downloadしたものは自分のMacOSXのDocumentディレクトリの中にjavaとか作るなりして置いてみよう. 参照するのはAPIが中心なので,落としたDocumentのAPIディレクトリ内のindex.htmlをブラウザからブックマークしていつでも見れるようにしておこう.

じゃぁ落としたjavaは112だよね.ということはjavaのverは最新の筈だ. 確認を込めて

$java -version

してみるとおそらく違うverを指している. 何故かと言うとこのjavaはシステムのjava.つまりAppleが用意してくれたJavaというわけ.

じゃぁ今落としたjavaはどこにあるのか. とりあえず確認してみよう

$where java
/usr/bin/java

javaはここを指している.ふむ.ならそこはどうなっているのだろう

$ls -l /usr/bin/java                                                   
lrwxr-xr-x  1 root  wheel  74 10 18  2015 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java

/usr/bin/javaはリンク類ってるだけか.だったらそこを見てみよう わかりやすいようにcdしてみると

$cd  /System/Library/Frameworks/JavaVM.framework/Versions
$ls 
1.4        1.5        1.6        A          CurrentJDK
1.4.2      1.5.0      1.6.0      Current

ここにはさっき落としたjavaは入ってなさそう.ではいったいdmgでinstallしたjavaはどこに入っているのだろう

javaには落としたversionを確認する(実際は後述する環境変数の設定の為ですが) java_homeというコマンドが実は用意されています. ただこのコマンドが置いてある場所はPATHが通ってないのでフルパスで

$/usr/libexec/java_home -V 

とか打ってみます.Vオプションは今現在installしているjavaの一覧が見えます 試しにやってみると

$/usr/libexec/java_home -V
Matching Java Virtual Machines (6):
    1.8.0_112, x86_64: "Java SE 8"  /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home
    1.8.0_111, x86_64: "Java SE 8"  /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
    1.8.0_60, x86_64:  "Java SE 8"  /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home
    1.8.0_51, x86_64:  "Java SE 8"  /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:  "Java SE 6"  /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386:    "Java SE 6"  /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home

これによるとさっきinstallした1.8.0_112はこの1番上/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home にあるらしい.なるほど.

つまりdmgでinstallしたjavaファイルは/Library/Java/JavaVirtualMachines/にversionごとdirectoryが生成されてそこに置かれる訳.

ではjavaのversionをこの最新版に変更しよう./usr/binで見たjavaのコマンド群はリンクが張られているだけなので,versionを指定できれば動的に変わるはずだ.

JAVAを利用する各ツールは環境変数$JAVA_HOMEで設定しているパスを確認している. その部分を変更すれば良いという事になる.

指定方法は簡単.zshなら.zshrcぐらいに

$vim ~/.zshrc
export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_112`

を付け加えれば大丈夫.その後設定を反映させたいので

$source .zshrc

しておこう.zshにloginシェルを変更したい場合は次のリンクでも参考にしてみよう. Homebrew で zsh を導入する | deadwood

では実際に作るのはまた後半で