VimFxを導入した
Vimperatorがe10sにまだ対応しなくて、Firefox重くてつらくてChromeに移行したけど、
Vimium設定が微妙にかゆいところ届かなくて困ってて、
Yet another like vimなブラウザ操作の何かを探してたところ、VimFxと出会った。
はてなブックマークアドオンもe10sまだ対応していない(よね?)ので、とりあえずその辺のconfigいじれるかやってみたらできたので、ブログ書いておくなど。
VimFxについて
VimFxのすばらしい解説があったのでこちら必読。
コンフィグの有効化
ここに基本的な流れが書いてあるけど、少し悩んだのでブログ書いておく。
環境はMac OS X (Yosemite)。
~/.config/vimfx
にディレクトリを作る。~/.config/vimfx/config.js
,~/.config/vimfx/frame.js
という二つのからファイルを作る。about:config
画面を開き、extensions.VimFx.config_file_directory
の項目を探す- この項目の値を
~/.config/vimfx
とする - 変更したら
about:config
は閉じておk - 適当なタブでキーバインド
gC
を実行する(g
を押した後続けてC
を押す)。 - すると、右下に「設定ファイルの再読み込みに成功しました」と出る。
~/.config/vimfx/config.js
に下記のプログラムを入力する。入力できたら再度gC
で再読み込みして、cc
ではてブURL開く。
vimfx.addCommand({ name: 'open_hatena_bookmark_entry', description: 'Open Hatena Bookmark Entry', }, ({vim}) => { let location = new vim.window.URL(vim.browser.currentURI.spec) vim.window.gBrowser.loadURI(`http://b.hatena.ne.jp/entry/${encodeURIComponent(location.href)}`) }) let map = (shortcuts, command, custom=false) => { vimfx.set(`${custom ? 'custom.' : ''}mode.normal.${command}`, shortcuts) } map('cc', 'open_hatena_bookmark_entry', true)
VimFx良い!
思うところ
とりあえず、VimFxのおかげでまたFirefoxユーザに戻れそうで嬉しい。
Vimperatorがダメになったんではないんですよ。僕がタブ開きまくる使い方してるせいだったり、Webの仕組みが複雑化しすぎて、シングルプロセスだと回らなくなったのが原因なんですよ!VimpはVimpで、消費メモリ少ないとかシングルプロセスで動くモノだから良いところもあって、批判するつもりなんかさらさらなくて感謝の念しか無い。ただ、時代が変わりすぎて則せなくなっただけなんですよね…?
E4Xが死んだあたりで、もうVimp的にもVimp-plugins的にもつらたんなのにe10s対応ですもんね…。まだ見てないですけど今はWebExtensions推しなんでしたっけ。アドオンは古くなっても自分は古くなりとうないですね。
CentOS7でblender実行するまで
blenderをコマンドラインから使えるっぽい感じだったのでインストールしてみた。
僕の場合二回エラーが出た。
./blender: error while loading shared libraries: libGLU.so.1: cannot open shared object file: No such file or directory
sudo yum install mesa-libGLU-devel
で解決。
./blender: error while loading shared libraries: libXi.so.6: cannot open shared object file: No such file or directory
sudo yum install libXi-devel
で解決。
Minecraft Spigotプラグイン "RSSNewsBook" を公開しました
これはMinecraftの世界の中でニュースを読むためのSpigotプラグインです。 URLが入っていれば、そのURLをクリックすることで、そのニュースの詳細を見ることが可能です。
第二回神戸マインクラフト勉強会にて、公開したことを発表させて頂きました。
その時のスライドはこちら。
www.slideshare.net
モチベーションに関して
スライドにもちょっと紹介していますが、僕はMinecraftと別の何かを繋ぐことを前々からしたいなと思っていました。その形はぼんやりしていて具体的ではないのですが、まずは自分の生活フローと結び付けたいと考えていました。「例えば、マイクラ内のボタンを押すと、家のエアコンがつく」とか。でもハード苦手なのでそれは敷居が高いなと。それで代わりの何かを考えていたのです。
それで、勉強会があるとのことで、これの期間を目標にしてSpigotプラグインを作ろうと思い立ちました。残り3週間、実装からローンチまでの期間としては良いくらいではないかなと。あとはアイデアだけ。何にしよう。
で、僕は毎朝出勤の際にニュースを読むのですが「ああ、とりあえずはこれかな」という感じで即決しました。なんとなくあんまり使いドコロ無いのではという気もしなくもなかったのですが、とりあえず始めないと始まらないということで、実装開始した感じです。最初なので、あまりアイデアの良し悪しは考えませんでした。
あとは、プロジェクトの作り方でしょうか。Androidアプリ開発の経験が長く、Android Studioに慣れているので、IntelliJ+Gradleベースプロジェクトにこだわりました。あとはTestabilityにもこだわりたくて、テストしにくいプロジェクトは嫌だと思ったのもあります。Gradleを選んだのはこの辺もありました。今のところは僕的には結構満足度高くて、
- テストコードはsrc/main/test/javaに入れておけばJUnit4で実行可能。Yamlからの取得・Yamlとして保存する方法に関して今回は仕様しました
- ソースコードを変更した後、jarにまとめる→サーバのpluginsディレクトリにjarを入れる→起動の流れをコマンド一発で行えるようにしました。これのおかげで、試すまでの時間がうんと短くなりました
時間がなくて一部シェルスクリプト使っているのだけが気になっているところ…。これも解決して、Windowsでも開発出来るようにしたいところです。
最低限の自分の要望を組み込むところまではいきたいので、これからも開発続けます!
Bukkit pluginを作るために参考にしたところ
またリンク集みたいに雑多に置いておくなど… Unityもこないだ触ったのでそれも書いておきたい…
環境
先に注意点
リンク
- なにはともあれ、Spigotのjarファイルを作成
- https://www.spigotmc.org/wiki/buildtools/
- これがないと開発始められないので…
- DMCA関係で、jarファイルそのものは配布されていない。BuildTools.jarを使ってjarファイルを作らなければならない
- ブランクプロジェクトの作り方
- https://www.spigotmc.org/wiki/creating-a-blank-spigot-plugin-in-intellijidea/
- 上記の中にも出てきますが、
plugin.yml
がないとプラグインとして認識しないので注意 - 僕はこんな感じで書きました
- プラグイン開発インデックス
- Javadoc URL
- https://hub.spigotmc.org/javadocs/spigot/
- IntelliJで、spigot.jarに上記Javadocを関連付ける方法
- コンフィグファイル(config.yml)の読み方
- 公式: https://www.spigotmc.org/wiki/creating-a-config-file/
- もう少し具体的に調べたので後述してます。個人的に公式の書かれてる手順が微妙だったので、サンプル見つけてきてなんとかした
- プラグインのデバッグ方法
- https://www.spigotmc.org/wiki/intellij-debug-your-plugin/
- 引数付きでサーバを起動して、IDEからattachするような感じっぽい
- 上記はIntelliJの記事。Eclipseの方も結構内容充実してて参考になるので、見ておくの吉
- https://www.spigotmc.org/wiki/eclipse-debug-your-plugin/
- https://www.spigotmc.org/wiki/intellij-debug-your-plugin/
コンフィグファイル
プラグイン使っているとわかると思うんですが、基本的にプラグインって
- プラグインをダウンロードする
- サーバのpluginsフォルダに入れる
- 起動する。すると
plugins/<プラグイン名>/config.yml
というファイルが出来上がる - サーバを止める
config.yml
を修正して再度起動
みたいな感じだと思います。この流れを基本とすると、開発側でやりたいことは具体的にいくつか決まってくると思います。それをちょっと下記に列挙しておきます
デフォルトの config.yml
を導入
プラグインを作るには、成果物のjarに plugin.yml
を含めないといけませんが、それと同じように config.yml
もjarに梱包しておきます。そして下記のコードを実行すると、「 config.yml
がなければ作成する」という実装ができます。
File configYml = new File(plugin.getDataFolder(), "config.yml"); if (!configYml.exists()) { plugin.saveResource(configYml.getName(), false); }
大切なのが plugin.getDataFolder()
と plugin.saveResource(fileName, false)
。前者はサーバの plugins
ディレクトリのパスを取得することが可能で、後者はjarファイルに含まれている任意のファイル名のものを、 plugins/<プラグイン名>/<fileName>
の位置に保存できます。
mitmproxyを使ってresponse body書換え
ふと思いついてmitmproxyを触ってみてた。今まであんまりちゃんとmitmproxyのhookできたことがなくて、ちゃんと調べてみてたんだけど、ちょっとクセがあるっぽい感じだった。
- mitmproxyではpythonスクリプトを間に差し込み、リクエストを書き換えたりできる
- こちらのQiitaの記事では、リクエスト先を開発環境に書き換えたりしている
mitmproxy -s my_script.py
みたいな感じで起動すると、指定したスクリプトでリクエスト・レスポンスを書き換えることが出来る。mitmdump -s my_script.py
でもいける。こちらの場合、標準出力に表示されるので、スクリプトに問題があった時よく分かるmitmproxy -s my_script.py
での起動の場合、スクリプトエラーがあると、読まれないっぽい。エラーも出ない- スクリプトエラーがあると、左下の表記がちょっと違う
- エラーあり:
- エラーなし:
- 引数をmy_script.pyに渡す場合は、
mitmdump -s 'my_script.py --foo 42'
のように渡す。
上記を踏まえて。
下記のようにスクリプトを書いた。このスクリプトは先程の Inline scripts の部分を元に書いた。
from libmproxy.models import decoded def start(context, argv): f = open('test.json') context.mydata = f.read() f.close() print(context.mydata) def response(context, flow): with decoded(flow.response): original = "example.com" target_path = '/path/to/get' print("handle request: %s %s" % (flow.request.host, flow.request.path)) print(" Host: %s" % (flow.request.headers["Host"])) if original in flow.request.headers["Host"]: if flow.request.path == target_path: print("Match request.") flow.response.content = context.mydata
上記を mitmdump -T --host -s my_scripts.py
で起動。うまく書き換わった。
もっと細かくプログラム組めば、オレオレセッション値とか設定できそう。
まれにデバッグとか調査とかで使うことがあるので慣れておきたいな。
Unreal Engine 4始めたのでまた参考にしたところリンク集
C++わかんない人なのでそこから…。 プログラマー向けです。
環境について
最初手を付けるところ
- インストールしてUnreal Editor起動できたら、チュートリアルで火鉢つくるのおすすめ
- 以前は日本語化してなかったっぽい?けど、今は日本語化してるのでぜひ。
- とりあえずUI慣れないと…
- プログラマー・クイックスタート
- とりあえずコード慣れていくのこれがおすすめ。わかりやすい
- デバッグ
- Unreal Engine | FString
- 文字列の結合方法とかだけど、
UE_LOG
の使い方とかも書いてる - リリース後の動作に支障与えないよう、条件付きコンパイル使うの良いっぽい
またまとまったら追記する
Scalaもくもく会参加してきました
初めてScalaの勉強会におじゃましました!
感想
Scalaというか、関数型言語というのに興味が湧きまして、Play Frameworkをちょいちょいいじってたんですが そしたら社長が勉強会の存在教えてくれまして、ちょっと行ってみよかなみたいになった次第です。
もくもく会なので基本もくもくなんですが、結構なもくもく具合だったので「あっ、これガチなやつや」みたいに思ってたんですけど、主催者の人がテンション高いのと、Scalaに詳しい方々がゆったりお話聞いてくださる方々でしたので、全然大丈夫で充実できました。
あとやっぱり、お詳しい方々なだけあって色んな問題が飛ぶように解決したり、「そんなものあるんや」的なこととか、Scalaのライブラリの流行りの傾向とか知る機会にもなってよかったです。
いろんな話をする時間も次もっとほしいですね!(僕は勝手に取らせてもらった感じになってましたけど…!)
お聞きした内容
断片的ですが、学んだ内容を記載しておきます。
- 「カリー化」(部分適用)って?
- 例えば、ある関数を実行するには、引数が三つ必要です。
- この場合、
methodName(arg1, arg2, arg3)
のような形で三つ指定します。
- この場合、
- カリー化では、それらの引数のうち、例えばまず一つだけを渡す関数を用意しておきます。
- 例えば
methodName(arg1)
- 例えば
- それを実行すると、残りの二つの引数(arg2, arg3)を必要とする「関数」を、「戻り値」として返すようなやり方。
- 例えば、ある関数を実行するには、引数が三つ必要です。
- Play FrameworkにおけるModelの置き場所は?
- →例えばCakePHPだと、
Model/
というフォルダがあってその中にModelに当たるファイルを置くけど、Playはどうなのか? - Playでは、
app/
以下だとどこでも自由において良い。プロジェクト毎に決め事を作って運用する感じ。
- →例えばCakePHPだと、
- 俺氏、DBアクセスを行うコードをユニットテスト側に書くと、
RuntimeException: There is no started application
てな感じで怒られる- 検索すると、アプリケーションを適当にスタートさせる必要があるとのことだった
- そのこと話すと、「多分、application.confにDBの接続先などを書いてるけど、アプリケーションを開始させないとそこを読みに行かないんだと思います」とのこと。なるほど!!
- いろんな本読んでる人居た
- 洋書率高すぎてヤバい
- Manning | Akka in Action
今日はこの本をもくもく模写模写します。https://t.co/JTzmC7z9Ho#scala_kb
— Yoshitaka Fujii (@yoshiyoshifujii) 2016年2月24日- Scalaパズル 36の罠から学ぶベストプラクティス(アンドリューフィリップス ネルミンセリフォヴィック 竹添直樹 島本多可子 竹添直樹 島本多可子) | 翔泳社の本
- 初心者向けはこっちとか
ドワンゴさんとはてなさんのテキスト #scala_kb
— SAMMY(きの子) (@aa7th) 2016年2月24日
Introduction | Scala研修テキスト https://t.co/PDvkZxMBm0 hatena/Hatena-Textbook: はてな研修用教科書 https://t.co/C2F8hezJbp
- その他キーワード
- scalaz
- Neo4j
- 全然関係ないけど、グラフのところ見てるとmermaid.js思い出した。
- Skinny Framework
- コマンド一発でCRUD(Bean?)作ってくれるスグレモノらしい
- 個人的にも発見していて、ORM - Skinny FrameworkがSkinnyから分離してるっぽい感じなので、Slickの代替となれるものなのかな?とも思っている(まだ試してない)
次回
ちなみに次は3/24(木)とのことです! 僕行けるかまだ分かんないんですが、行けたら行きます!