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

たぷつきません

おなかがでてきた。もうたぷついてるやん。

grepの--max-countオプションが--after-contextオプションを無視して非道い

最初に見つかった1件目の前後の出力行数を指定しているのに、--before-context分の行数は出力されるのに、--after-contextは無視するの何なんだよもー。


ダメ元で別のgrepを入れてみようかなー…
qiita.com


…と、思ったけど、パイプで head ( before-context分 + after-context分 + 1 ) すりゃいっか。

またまたgit-pull-origin-all.sh修正

リモートと同期とれている(またはとれた)ブランチで、今は注目していないものは削除するようにした。
作業したい時にまたcheckoutすれば良いだけだしさ。

そんでもってcloneしているリポジトリをワンサカ置いている場所で、次のシェルを実行。

#!/bin/sh

for dir in `find . -maxdepth 1 -type d`; do
    if [ -d $dir/.git ]; then
        pushd . > /dev/null 2>&1
        cd $dir
        echo "======== $dir ========"
        git-pull-origin-all.sh $*
        popd > /dev/null 2>&1
    fi
done

すごい楽になったわー。

master、ブランチを一括pull · GitHub

.gitignoreが勝手に生まれる現象

何もしてないのにgit操作ができなくなることがあり、見るとsrcの下とかに/generated と書かれた.gitignoreを勝手に作られていることがあって、その度にイラっとしながら
「その上のディレクトリの .gitignore に、src/generated って書いてんのになんだよもーーー」
とつぶやきながら手で削除していた件。

m2eclipseのしわざだった。お節介さんめ。


f:id:t-katochin:20160415155009p:plain

gitで最新ブランチ取り直すの毎回めんどくさいよー

事情があって、自宅、会社と日によって作業マシンが変わる生活を送っているのですが、朝毎回リポジトリの取り直し作業があります。
複数リポジトリ複数ブランチとあって、毎朝最新にするために1つ1つ確認しながらpullしているのですが……やってられません!午前中これだけで終わる!

そんなわけで以前作った一括プルするシェルを使っているんですが、色々問題があったので修正しました。

これまであった問題
  1. リモートブランチを全てチェックアウトしちゃっていた。
  2. どっか別の枝にリベースされたブランチがpullできない。
  3. ローカルブランチの方がリモートよりコミット進んでいるのにpullしようとしちゃう(まあ失敗するだけで実害はないけど)

特に人がやってた見る必要のないブランチをチェックアウトするのはマジで要らんかったです。
いつの間にかリモートではなくなっていてもローカルにポツンと残る知らないブランチ…それを削除する手間…マジで要らんかったです。

あとpullできなくて枝が分かれてしまったやつは勝手に合わせるのは危ないので普通は追随しません。ローカルの方が進んでいるかもしれないですし。
それはさすがに目で先に確認しておいたほうがよいです。
なので、まずは普通にこのgit-pull-origin-all.shを叩いた後で、自分の未pushなブランチがあればpushして、どのブランチもリモートに合わせてOKだなーと判断できたら、--force付きで叩いてください。
ただ、自分とリモートブランチの枝が変わっちゃっていて、且つ自分の方が進んでいるのに--forceしたら悲劇ですので、そこはマジでご注意ください。リモートブランチから順当にローカルブランチが進んでいる場合は--forceを行っても、

ローカルの方が進んでいるのでリモートに合わせません。

と出るのでその点はご安心を。


gist.github.com

[WARNING] Workspace defines a VM that does not contain a valid jre/lib/rt.jar: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

mvn叩くと

[WARNING] Workspace defines a VM that does not contain a valid jre/lib/rt.jar: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

っていっつも出るからウザイなー思ってたら、maven-eclipse-pluginの最近のMac対応への不具合だから、このパッチ当てろってことだった。
[MECLIPSE-668] jre/lib/rt.jar doesn't exist on OSX, rather bundle/Classes/classes.jar - ASF JIRA
でもmaven-eclipse-pluginはもうディスコン。永久に解消されないなー。orz

google eclipse pluginのappengine / gwt SDKの設定を一括リフレッシュするツール

前々からGAE/GWTSDKのありかをeclipse pluginにまとめて伝えるのがホンっトにウザかったから勢いで作成。
うちにGAE/GWT使ってるプロジェクトは幾つもあってそれぞれ違うバージョンを指してるし、極力最新に合わせてはいるけど過去のコミットをチェックアウトして調査するとかあるので、やっぱり沢山設定しておかなければならない。歴史の積み重ねって大変。
で、新規のマシンでeclipse pluginにSDKの設定を一から全部入力するというのは地獄の沙汰。こんな単純作業やっとれんとなるわけであります。eclipse pluginの設定ファイルをハックしたら簡単な仕組みだったのでサラッと作りました。

github.com

$ git clone https://github.com/tkatochin/google-eclipse-plugin-update-sdk-settings.git
$ cd google-eclipse-plugin-update-sdk-settings
$ mvn clean package
$ java -jar target/google-eclipse-plugin-update-sdk-settings-0.0.1.jar [appengine-java-sdk-xxx や gwt-xxxがある親のパス、eclipseのワークスペースがあるパスを並べる。どんな順序でも構いまへん ]

とすればごっそり一通り設定してくれます。
エラーがなければうんともすんとも言わずに終わるので、終わったらeclipseを再起動すればOK。

Domaせっかくjoinしたんだからオブジェクトにバインドしてほしいなーというアイデア

単純型にしかバインドできないのかー。

http://doma.seasar.org/tutorial/select.html#結合した結果を取得する検索

それなら次のように書けばdepartmentがまるごとバインドされるといいのになー。

@Entity
public class EmployeeDepartment extends Employee {

    @Column(name = "d")
    Department department;

    ...

}
select
  e.*,
  d.*
from 
  employee e 
left outer join 
  department d 
on 
  e.department_id = d.id 
order by 
  e.id

Departmentも@Entityであればその中でのアノテーションで項目名や諸々分かっている状態だし…。
…んがしかしできない理由わかった。SQLの結果セットでのフィールド名では d.* は展開されて departmentのメンバーなのかなんなのか区別できんからだわー。
S2DaoだとN:1マッピングSlim3だとModelRefでレイトバインディングする形で提供されているけど、Domaの思想には合わない感じがする。
複数SQL発行せずに最初の一発でjoinした情報で解決するのがDomaらしい形。Domaを選んだのもパフォーマンスのためなわけだったし。いろんなナンチャラコンテナの積み上げで掛かるwarmupがないから速いんだし。

名前が展開されちゃうから問題なので、次のようにSQL側できちんと1つ1つドット付きで名前付けしたならバインドできそう。

select
  e.*,
  d.departmentId as `d.departmentId`,
  d.name as `d.name`,
  d.xxxx as `d.xxx`, ...
from 
  employee e 
left outer join 
  department d 
on 
  e.department_id = d.id 
order by 
  e.id

バインドして欲しい意思が強いSQL(笑)。でもこうやって明示化してるからコードとの対応も分かりやすいし。

mavenでビルドするプロジェクトごとにローカルリポジトリを変更したい

機能の追加や要望やバグフィックスが目白押しな毎日なのですが、課題がわんさかあると、みんなで並行して課題ごとのブランチがあったり、一人でも日々変わる優先順位の切り替えで平行作業が余儀なくされます。
チームで開発した依存ライブラリも沢山あってしかもそれらにも課題ごとにブランチされていて、よーするに人不足で一つに集中できないんですが、そんな状況ではもうローカルインストールした個々のmvn projectのSNAPSHOTがどのfeatureもしくはhotifx用に入れたものかとか把握しきれなくなります。
CIでnexusにorigin/developで自動的に上がったのが落ちてきて混ざるとまた大変だし(※mvn オプションで切っとけるけどやっぱり常に意識は必要)
gitはバンバン作業ブランチ切り替えられて最高ですが、各課題を並行作業できるように、eclipseワークスペースを開発機能ごとhotfixごとに分けて、同じprojectであろうと、それぞれのワークスペースにgit cloneして開発しています。
大きな機能の開発中の未コミット状態からでも、突発的に起きた問題の調査しなければならない要求にもすぐ答えられます。便利。
その延長で、だったらワークスペース毎に .m2/repositoriy 置いたら良いじゃない!! という結論が出ました。
ユーザーディレクトリ直下の .m2 以外に、ワークスペースのディレクトリ内に .m2/repository置いといてそれを使うようにすればさー!!って。
でも手動で切り替えとかだと、絶対ウッカリ切り替え忘れが起きて別のローカルリポジトリに入れちゃったりして結局わやくちゃになることが、やる前から容易に想像つきます。にんげんだもの。

そんなわけで、プロジェクトごとにローカルリポジトリを切り替えられることができるようにしたmvn · GitHub 作成。
mvn 実行したそのディレクトリの属するm2 repositoryを自動的に扱ってくれます。

使うための準備
  • それぞれのワークスペースに .m2/repository ディレクトリを作っておきます。(※最初は ~/.m2/repository を copy -rf してきても良いですね。ダウンロード時間とローカル全コピー時間のトレードオフで判断してくださいな)
  • mvn本体を直接起動せずにリポジトリ切り替えしてから起動するシェルとして同名のmvnコマンドを置きます。
    • ↑のシェルを /usr/local/binより先にPATHが通ったところに置いて、chmod +x しといてください。
    • ちなみに私は、雑に ~/bin を作って mvn という名前で配置し、.bashrcの最後に、export PATH=~/bin:$PATH を記述しました。
    • 違う場所にmvnがあるなら、シェルの最後の行の /usr/local/bin/mvn を正しい物に変えてください。
使い方
  • 今までと何も変わりません。
    • ビルドするプロジェクトの親ディレクトリ階層のどこにも .m2/repositoryが見つからなければ、今までどおり ~/.m2/repository が使われます。

おわり

Google Code閉鎖とか困る

便利そうなmaven-pluginのプロジェクト見つけたけど2011年から更新されておらずmaven centralにもあげられてなかった。
そして先頭に哀しい赤文字が…

READ-ONLY: This project has been archived. For more information see this post.

そう。Google Codeにホスティングされてる。

アーカイブされてGithubにExportするボタンがあるし、ダウンロードできなくなるってのがGithub Exportもなのかよく分からんし(2016年1月26日なのか2016年いっぱいなのかハッキリしない)、Github検索すると誰もがわんさかExportしていってる。もうどれをmasterにすれば良いのやら。osdn.jp

ところでGoogle Code閉鎖の裏でなんか変なの出してる!?

Cloud Source Repositories とか言って、既存のGoogle Cloud Platform上になにやらgitリポジトリ置いてるんだけど?cloud.google.com


ソースコードをブラウザ上で編集したりeditしたりmergeできるらしいからアカウントごとにリモートに作業スペース持てるってことなのかな?

まだBetaだからか500MBまで無料だけど、ずっと無料ならイイな。そのうち金とるんだろうな〜。いつもの手だ。

appengine-java-sdkを簡単に入れるシェル

しょっちゅー上がるからめんどくて作成。
新しい物も古いものも自動的に探してダウンロードして展開します。

最初のパラメータに --dry-run を入れれば存在チェックだけでインストールしないです。

# sh install_appengine-java-sdk.sh --dry-run 1.9.9
appengine-java-sdk-1.9.19 の存在チェック中 (in featured/)
appengine-java-sdk 1.9.19 の存在チェック中 (in deprecated/)
appengine-java-sdk-1.9.19 をダウンロード中
appengine-java-sdk-1.9.19 のダウンロード成功
appengine-java-sdk-1.9.19 の展開終了

gist.github.com

YosemiteでEclipseにPATHが渡されなくなった件

Marvericsで使えていたlaunchdが死んだ。
で、DockやFinderから起動したアプリに /usr/local/bin のPATHが通らない。

しばらくはこのあたりのやり方で回避出来てたんだけど、ちょっと前だかのYosemiteアップデートでとうとうそれも死んだ。

自分はEclipseからの外部実行で色々叩けるようにしている(たとえばFirefoxのAdmin SDKでブラウザ拡張をmvn内のantrunからビルドしたり)ので不便極まりない。

おこだよ激おこ。←死語

んで、そういえば元々自分はEclipse複数起動したい人なので、
MultiEclipse.app というのを作って使っていた。
2度めのEclipse起動は、すでに立ち上がってるEclipseがアクティブになるだけなので、ワークスペース毎に起動したい時に便利っす。

そいつの実体は只のシェル

#!/bin/sh
open -n /Applications/eclipse/Eclipse.app

なので、このopen前にPATH仕込めばいいじゃん!って結論になった。

というわけで、MultiEclipse.app のインストーラ置いときますわ。
Multi Ecplise.pkg

入れたら、

vi /Applications/Multi\ Eclipse.app/Contents/MacOS/multiEclipse

で、以下のように修正すればOK。

#!/bin/sh
export PATH=/usr/local/bin:$PATH
open -n /Applications/eclipse/Eclipse.app

openの中身はkeplerでもlunaでも自由にEclipseの実パスにしてくださいな。

Macのキーとマウスのログから日々の稼働開始〜終了時間を出力する

おもろい。

qiita.com

これで吐かれたログを使って自分の月の稼働時間をまとめることにした。
月報に転記したいだけなので各日の開始〜終了時間だけ、ざっと出すシェルを。

てっぺん超えるヘビーな仕事はもうやらないので日またぎは考慮していない。

gist.github.com

Jun 1		11:45:14 - 14:49:38

こんな感じで出る。ソートが文字列順なので、月単位には綺麗に並ばないけど。

次の月末から使えそう。

正規表現でHTMLの</script>までの中身を得たいだけでハマった

HTMLパーサーを主に正規表現だけで実装しようとしてるんだけど、scriptタグ内ではjsコード内でHTMLの要素が含まれちゃう場合があるのでスキップして "</script" が見つかるまでをテキストノードとして取得しようとしたら、これが意外にうまくいかない。

    document.write(document.write('<link rel="stylesheet" type="text/css" href="' + CSS_PATH + '/' + new gadgets.Prefs().getString("theme") + '-theme/jquery-ui-1.10.4.custom.min.css">);
  </script>
  <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
 </head>....

に対して、最初にやったのは

 "([\s\S]*)</script"

これ。
すると取れたのは

    document.write(document.write('<link rel="stylesheet" type="text/css" href="' + CSS_PATH + '/' + new gadgets.Prefs().getString("theme") + '-theme/jquery-ui-1.10.4.custom.min.css">);
  </script>
  <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script

これ。直近のまでじゃ無く最後に見つかった</ script までになっちゃう!

んで結局なにかってゆーと、+や*ってのはその条件が続く最も長い結果を持つってことだった。
最長一致ってやつ。

最短一致にするには、*の後ろに?を付けるだけでいけるとのこと。

 "([\s\S]*?)</script"

ってやるだけ。

そしたら

    document.write(document.write('<link rel="stylesheet" type="text/css" href="' + CSS_PATH + '/' + new gadgets.Prefs().getString("theme") + '-theme/jquery-ui-1.10.4.custom.min.css">);
  </script

これが取れて、その結果のgroup(1)を取れば

    document.write(document.write('<link rel="stylesheet" type="text/css" href="' + CSS_PATH + '/' + new gadgets.Prefs().getString("theme") + '-theme/jquery-ui-1.10.4.custom.min.css">);
  

になって無事解決。

SourceTreeのカスタムアクションに入れてるやつシリーズ その2

今チェックアウトしているブランチの強制プッシュ

リベースしたりしてプッシュ済みのものと変わっちゃった場合に。
なかなか勇気いるやつ。実行前に今チェックアウトしているものが何かちゃんと確認してから使いましょう。

強制push · GitHub