タイトル/名前 | 更新者 | 更新日 |
---|---|---|
Groovy/Grails/同じコントローラクラス名を、パッケージだけ分けて共存できるか? | msakamoto-sf | 2012-10-08 21:00:22 |
技術/vim/「Vimを使ってくれてありがとう」, "Thanks for flying Vim" の消去 | msakamoto-sf | 2012-10-08 16:55:34 |
技術/Windows/Cygwin/minttyのタイトルをcdやpwdで変更する | msakamoto-sf | 2012-10-08 15:46:35 |
技術/Windows/Cygwin/lvの"OOPS"対応とUTF-8 | msakamoto-sf | 2012-10-08 15:45:58 |
日記/2012/10/08/Console2とnyaosメモ | msakamoto-sf | 2012-10-08 15:40:39 |
技術/Windows/Cygwin/NTFSをnoaclでマウントする | msakamoto-sf | 2012-10-08 14:19:46 |
技術/Windows/Cygwin | msakamoto-sf | 2012-10-08 14:19:30 |
技術/Windows/Cygwin/rsyncメモ | msakamoto-sf | 2012-10-08 13:49:25 |
技術/Android/WebViewセキュリティメモ1 | msakamoto-sf | 2012-10-07 14:16:07 |
日記/2012/09/30/GrapeとローカルのMavenリポジトリの連携 | msakamoto-sf | 2012-09-30 19:53:25 |
例:
pkg1.foo.HelloController と pkg2.bar.HelloController を共存させられるか?
答え:不明。多分Grailsのデフォルトの機能としては提供されてない。でもある程度デメリットを受け入れればカスタマイズ出来るかも。 (Grails-2.1.x時点)
※あくまでも2012-10-08時点での調査結果になります。Grailsのバージョンアップや、自分自身のGrailsの習熟により受け入れられる水準の運用による対応やカスタマイズ方法が出てきたらその時また追記していきます。
あまり断言できるほど調査できてないのですが、StackOverflowでも似たような質問が幾度も繰り返され、すべて玉砕している状況から多分今のところ、Grailsのデフォルトの機能としては提供されていないんじゃないかと思われます。
リクエスト上げてみても良いかもですが・・・。
パッケージによりマッピングを分ける、という技法はあるらしいんですよ。
myapp.user.MyAccount ... ログイン中のユーザが自分のアカウント情報を確認 myapp.admin.UserAccount ... 管理者によるユーザアカウント管理
みたいな構成にしておいて、
"myapp.user"以下のController -> "/user/$controller/$action?" にマッピング "myapp.admin"以下のController -> "/admin/$controller/$action?/$id?/" にマッピング
というのは出来る。ただし、コントローラ名の重複までは許されない・・・らしい。(順不同でどっちかに上書きされる?)
このへん、Grails内部でのController管理がどうなっているのか、に依ってくると思います。そのへんは現時点ではまだまだ調査不足です。
もしかしたら上記技法の応用で、厳密にクラス名のFQNを使ってURLをマッピングすることも出来るかもしれません。
しかし、UrlMappingsを調整できたとしても・・・TagLibの"<g:link>"や"<g:createLink>", "<g:form>"などにも影響してきます。これらのGrailsタグのcontroller属性においても、クラスのFQNにしたがってマッピングされているURLを逆引きする機能が必要な・・・ハズ、です(内部実装全く調べてないので推測でしか無いのですが)。
ただしこの制限も、"<g:createLink>"や"<g:link>", "<g:form>"などで"controller", "action"パラメータを指定するだけで済ませる場合、の制限になります。もしかしたら"url"パラメータに指定するmapと、UrlMappingsのURLパターン中のパラメータをうまく突き合わせることで、色々と回避する方法があるかもしれません。
以下、色々と漁ってみた資料です。
puttyやTerminalなど端末エミュレータ上でvimを起動し、終了させると、端末エミュレータ自身のウインドウタイトルが「Vimを使ってくれてありがとう」(英語表記では "Thanks for flying Vim" ) になってしまい、元の、例えばカレントディレクトリなどの表示に戻らない現象が発生する、場合があります。
自分の場合は以下の環境で発生しました:
Win7SP1日本語版 $ cygcheck -c cygwin bash mintty vim Cygwin Package Information Package Version Status bash 4.1.10-4 OK cygwin 1.7.16-1 OK mintty 1.1.1-1 OK vim 7.3.646-1 OK
これをどうにかして元の表記に戻したい・・・ということでネット上では既に阿鼻叫喚の地獄絵図が繰り広げられていたらしいですが、今のところ勝者が誰もいないようです。
結論から言うと、vim単体で元に戻す方法は現時点では見つかりませんでした。vimを起動したシェル側で、vim終了後に元に戻して上げてください、あるいは後述のtitleoldを適当にセットアップしてvimを起動してください。例えばcygwinであれば、 技術/Windows/Cygwin/minttyのタイトルをcdやpwdで変更する にまとめたようにcdやpwd実行時にminttyのタイトルも更新するようにしておき、vim終了後にpwdなどでタイトルを更新する、というように運用で回避します。
または"set notitle"をvimrcに書いておき、vimがxtermのウインドウタイトルを変更しないようにしてください。
少し原理的な部分について調べてみますと、そもそも「グラフィカルな端末エミュレータのウインドウタイトルを変更する」とはどういうことか?これは一気にPOSIXとかSUSまで遡った、端末の機能にアクセスするtermcapの世界の話になってしまうわけです。
unix系でグラフィカルな端末エミュレータの事実上の標準はxtermになります。ということは、xtermのtermcapにウインドウのタイトルを変更する機能があるわけです。("termcap"という用語の使い方はかなりいい加減にしてます。とりあえず、エスケープシーケンスに続けて独自のコマンドを出力することでxtermのGUI要素を操作できる、と覚えておけばOKかと。)
ちなみにxtermの制御シーケンスについて、以下の資料を見つけました。
技術/Windows/Cygwin/minttyのタイトルをcdやpwdで変更する でminttyのウインドウタイトルを変更するのに
echo -ne "\e]2;$t\007"
というechoを使いましたが、これは
\e]2; -> 上記制御シーケンスの資料ではoscに当たります。 \007 -> octet表記でASCII制御コードのBELに当たります。
これをxtermの制御シーケンスに当てはめると、ちょうど
osc Ps ; Pt BEL Ps -> 2が "Change Window Title to Pt"に当たります。 Pt -> 変更するWindowタイトルの文字列
でビンゴ!とヒットしてるわけです。
本記事と若干関連していて、vimの話題で「"set title"してるのに端末エミュレータ側のウインドウタイトルが変更されない」という話もあるらしく、これなどはまさしくvim側が出力しているウインドウタイトル変更用の制御シーケンスが、端末エミュレータ側の種類が異なるなどして無視されているものと推測されます。この場合の解決方法は一応vim側で用意されていて、t_tsとt_fsにその端末エミュレータ用のウインドウタイトルの変更開始・終了用制御シーケンスを割り当てます。詳しくは":help t_ts", ":help t_fs"や以下の参考リンクを参照してください。
vimではウインドウのタイトル変更について以下のオプションが関連します。
title <> notitle titleold titlestring titlelen
基本的に "set title" されると、"titlestring"がウインドウタイトルに設定され、vim終了時にtitleoldに戻されます。
このtitleoldが本記事でも問題となっている "Thanks for flying Vim" というわけで、":help titleold"で見てみると
This option will be used for the window title when exiting Vim if the original title cannot be restored. Only happens if 'title' is on or 'titlestring' is not empty. This option cannot be set from a |modeline| or in the |sandbox|, for security reasons.
とあります。「オリジナルのタイトルに戻せなかった場合に、titleoldに変更する」と読めます。じゃぁ「オリジナルのタイトルに戻せなかった場合」ってどんな場合か・・・ってこればっかりはvimのソースコードを追うしか無いんですが、もうそんな余力はありません。今日一日ずっとこれとか、派生して 技術/Windows/Cygwin/minttyのタイトルをcdやpwdで変更する の調査に費やしてるわけです。
視点を変えれば、「オリジナルのタイトルに戻そうとしている」ことは確かです。じゃぁオリジナルのウインドウのタイトルはどうやって取得するの?というところですが、ここでもxtermの制御シーケンスが関連してくるわけです。
ウインドウタイトルを変更する制御シーケンスがあるので、その逆に「現在のウインドウタイトルを取得する制御シーケンス」もあり得る訳です。
CSI Ps ; Ps ; Ps t ... Ps = 21 → Report xterm window’s title. Result is OSC l label ST Ps = 23 ; 2 → Restore xterm window title from stack.
このあたりがそれっぽいです。が、ちょっとbash上からこれらの制御シーケンスを叩いてみたのですが何も表示されず・・・もしかしたら使い方の時点で間違ってるかもしれませんが。
ひとまず事実としてわかっていることは、どうやらvimは、現在の端末エミュレータのウインドウタイトルを取得するのに失敗する場合があり、それが原因でvim終了時に"titleold"のデフォルト値である "THanks for ..." に強制的に戻してしまう、というのが事の顛末のようです。
まぁこのあたりの問題ってvimだけじゃなくて、端末エミュレータのウインドウタイトルを変更するようなコマンドラインプログラムはたくさんありますので、似たような問題はそれら全般に渡って潜んでいる、とも考えられます。(screenとかtmuxなんかもその種の問題と関わりが出てきそうです。)
となれば、1ユーザとしてはvimだけで局所的に解決するのではなく、もっとお手軽に・汎用的に解決したいところです。
ということで一番手っ取り早いのがシェル側でpwdとかcdすることでカレントディレクトリをウインドウタイトルに設定することで、そのcygwin + minttyバージョンが 技術/Windows/Cygwin/minttyのタイトルをcdやpwdで変更する となったわけでした。
ただ、シェル側で解決する方法を採ったとしても、vim終了時点ではやっぱり "Thanks for..." が残ってしまします。これをクリアするにはユーザが明示的に一度cdやpwdを実行しなければなりません。
中途半端でも良いので、とりあえずvim起動時のディレクトリ名とかに戻したい場合は、以下のように.vimrcを設定します。
let &titleold=expand("%:p:h") set title
この例では編集中ファイルのディレクトリ部分をtitleoldに設定しますので、少なくとも何らかのディレクトリ情報はウインドウタイトルに残せます。(この2行にたどり着くまでに6時間以上費やしました (´Д⊂ヽ)
vimscriptの腕に覚えのある方は、もっと色々とカスタマイズすることで、もしかしたらシェル側のpwdやcdとうまく連携出来るかも・・・しれません・・・。
ということで冒頭に書いた結論に戻りますと、vimでは「現在の端末エミュレータのウインドウタイトルの取得」に失敗することがあり、その場合にvim終了時に"titleold"オプションの値にウインドウタイトルを変更します。これのデフォルト値が"Thanks for..."になります。現在のウインドウタイトルの取得がなぜ失敗するのか、どうすれば正常に端末エミュレータとインタラクトして取得できるようになるのかは現時点では調べきれませんでした。
運用上の回避方法として、以下の様な方式をmsakamoto-sfは採用しました。
以下、調査時に参照したリンクです。
「vimを使ってくれてありがとう」に巻き込まれた人たちの阿鼻叫喚地獄絵図:
vimscriptの勉強:
Macだと"TITLE"環境変数が使えるようです:
Cygwin 1.7でminttyでCygwinを実行すると、minttyのウインドウのタイトルが"- bash"という具合に非常に味気ない状態で起動します。
xtermなどのグラフィカルなターミナルエミュレータでは、制御コードを出力することでウインドウのタイトルを変更できます。
そこで、以下のようにbashのcdとpwdを再定義し、cdやpwd実行時にカレントディレクトリをminttyのウインドウタイトルに表示するようにしておくと便利です。
.bashrc:
... function settitle () { t="[$@]@`hostname`" # "\e]2;"までがウインドウタイトル変更開始の制御コード # "\007"が変更終了・・・らしい、です。 echo -ne "\e]2;$t\007" } function cd() { builtin cd $@ && settitle $(cygpath -m `/usr/bin/pwd`) } function pwd() { settitle $(cygpath -m `/usr/bin/pwd`) builtin pwd $@ }
ただしこれだと、全部が全部 cygpath で実際のWindowsフォルダ・ファイルパス表記になってしまい分かりづらいかもしれません。Cygwin世界の表記をそのままあ使うのであれば、
settitle $(cygpath -m `/usr/bin/pwd`) -> settitle `builtin pwd`
でも良いと思います。
動作確認:
Win7SP1日本語版 $ cygcheck -c cygwin bash mintty Cygwin Package Information Package Version Status bash 4.1.10-4 OK cygwin 1.7.16-1 OK mintty 1.1.1-1 OK
参考:
Cygwinからlv入れてみて、SJISのテキストを表示させてみるとすべての行が"OOPS"で始まる。
→"TERM"環境変数に"cygwin"を設定すれば解決。
TERMにcygwin設定すると、emacsのカラー表示でトラブル・・・らしい、のだけれど、自分はemacs使わなくてvimオンリーで、TERM=cygwinでもvimは特に問題は発生してないのでこれで行きます。
.bashrc:
export TERM=cygwin export PAGER=lv
動作確認:
Win7SP1日本語版 $ cygcheck -c cygwin bash lv vim mintty Cygwin Package Information Package Version Status bash 4.1.10-4 OK cygwin 1.7.16-1 OK lv 4.51-1 OK vim 7.3.646-1 OK mintty 1.1.1-1 OK
参考:
会社の人がタブ形式のコマンドプロンプト使ってて、教えてもらいました。
シェルは"nyaos"というの使ってて、コマンドプロンプトのインターフェイスとしてConsole2というのを使ってるそうです。
ということで色々リンク教えてもらって試してみました。
以下、教えてもらった参考リンク:
Console2:
nyaos:
Luaでカスタマイズ出来るようにしてくれたのは嬉しい・・・が、入れてみたものの全然使いこなせてない。
また時間あるときに触ってみます・・・。
CygwinはNTFSのACLをPOSIXで扱えるように色々とマッピングをいじったりしています。
その影響か、Windowsプログラムで普通に作成したディレクトリやファイルをCygwin上で見てみると、パーミッションが"000"になっていてあたかも所有者含めて一切の権限がロストしているかのように見える時があります。
個人で、しかも開発用のマシンで管理者としてログインして操作可能な状態であれば、Cygwin上でNTFSとPOSIXのACLマッピングを無効化したほうがスッキリします。
・・・というか、デーモンやらサービスやらをあれこれ起動したりいじる環境で、Cygwinのマッピングを「正しく」維持しても、発生しうるトラブルに対するメリットが少ないというか・・・。
環境:
Win7SP1日本語版 $ cygcheck -c cygwin Cygwin Package Information Package Version Status cygwin 1.7.16-1 OK
※本記事はCygwin 1.7以降を元にしています。"noacl"って1.7以降のオプションで、"/etc/fstab"への記述でOKなのも1.7以降から、らしいです。1.7より前は、"ntsec"とか"nontsec"とかいじる必要があったっぽいです。
noaclの設定例 - "/etc/fstab" :
... C:/Users /home ntfs override,noacl,binary,auto 0 0 C:/Users/Foo /home/Foo ntfs override,noacl,binary,auto 0 0 none /cygdrive cygdrive binary,noacl,posix=0,user 0 0
詳しくは"man mount"でマウントオプションを確認してください。
もしnoaclなしのデフォルト状態でファイルとかディレクトリを作ってしまったら?
→icaclsコマンドを使います。"/reset"オプションでACLをリセットして親ディレクトリから継承させ直すことができます。
例:時既に遅く、C:\work\cygtest\hello.txtを作ってしまっていた・・・。ただし、Cygwinで作ったのは"cygtest\hello.txt"までで、"C:\work"まではWindowsのエクスプローラで作った。
→コマンドプロンプトを立ち上げ、
> cd c:\work > icacls cygtest /reset /t
でC:\workからACLを継承させ直すことができます。
参考:
Win2kとか古いCygwin時代に、NTFSのACLをCygwinのPOSIXマッピングを細かく調整するための資料:
Cygwin関連のメモ
Win7, Cygwin1.7以降のモダンなCygwin環境はまずはここから:
2012-10-06, 神保町のIIJでAndroidセキュリティ勉強会, WebViewの脆弱性編が開催されましたので行って来ました。
発表の書き起こしや資料リンク:
GroovyのGrapeを使うと実行時に依存関係を解決できます。
Grapeの内部にはIvyが使われていますので、 日記/2012/09/30/Apache IvyとローカルのMavenリポジトリの連携 で実験したIvyの設定などがそのまま活用できます。
Mavenローカルリポジトリとの連携もIvyの話がそのまま適用され、codehausのGrapeのページにも"~/.groovy/grapeConfig.xml"にMavenローカルリポジトリ参照用の<ibiblio>resolverの組み込み方が紹介されています。
・・・が、2.0系では以下のchangesetで上記設定が組み込み済みになっています。
1.8.0の段階ではまだ組み込まれてなかったようです:
しかし、1.8系の新し目であれば上記2.0系への変更がバックポートされています。
groovy-1.8.8.jarから取り出して見ると、確かに"${user.home}/.m2/repository/"が組み込み済みでした。
$ jar xf groovy-1.8.8.jar groovy/grape/defaultGrapeConfig.xml $ cat groovy/grape/defaultGrapeConfig.xml ... <ibiblio name="localm2" root="file:${user.home}/.m2/repository/" \ checkmodified="true" changingPattern=".*" changingMatcher="regexp" m2compatible="true"/> ...
上記のように、1.8系の最新 or 2.0系以降であればデフォルトでMavenのローカルリポジトリを参照してくれるようになっていました。
ということで実験ですが、今回は 日記/2012/09/30/Apache IvyとローカルのMavenリポジトリの連携 でローカルにinstallしたjarをGrapeで呼び出してみます。
foo.groovy:
@Grab(group='mvntest', module='mvnjartest', version='1.0-SNAPSHOT') import mvnjartest.App def a = new App('hello world') println(a.capitalize())
$ groovy foo.groovy Hello World
これにより、"~/.groovy/grapes/" 以下にcommons-langとmvnjartestのjarが展開されました。
~/.groovy/grapes/ commons-lang/ commons-lang/ ivy-2.1.xml ivy-2.1.xml.original ivydata-2.1.properties jars/ commons-lang-2.1.jar mvntest/ mvnjartest/ ivy-1.0-SNAPSHOT.xml ivy-1.0-SNAPSHOT.xml.original ivydata-1.0-SNAPSHOT.properties jars/ mvnjartest-1.0-SNAPSHOT.jar
ということで特にオチはありません。
もしNexusなど会社とかチーム独自のローカルリポジトリサーバを運営している場合は、"~/.groovy/grapeConfig.xml"のカスタマイズで対処できると思われます。
最初は".m2/repository"を共有できないかな~と思ったんですが、Grapeは内部的にはIvyを使ってるので難しいかもしれません。Grapeには"grape"コマンドが付属してまして、
grape list grape install grape uninstall
などが使えます。また上記のようにディレクトリ構成もivyになってるので、MavenのローカルリポジトリをそのままGrape(=Ivy)のキャッシュとして使いまわす、というのは難しいようです。
Mavenの場合はリポジトリとキャッシュが同じ".m2/repository/"を共有する方式ですが、IvyやGrapeはリポジトリとキャッシュを区別して、ローカルに保存するのはキャッシュ、という具合に割り切っているようです。
jarファイルが重複してしまいますが、利便性とのトレードオフで諦めるしか無いのか・・・(´・ω・`)