2014/12/21(日)plink に ssh 踏み台を設定する方法
調べてもよくわかんなかったのでメモ
puttyを起動して、以下を設定して適当なセッション名で保存する。
Connection/Porxy/ Proxy type: Local Do DNS name lookup at proxy end: Yes Consider proxying local host connections: Yes Telnet command, or local proxy command: plink -nc %host:%port -l %user -pw %pass -P %proxyport %proxyhost Proxy hostname: 踏み台サーバのホスト名 (%proxyhost) Proxy port: 踏み台サーバのポート名 (%proxyport) Username: 踏み台サーバのユーザ名 (%user) Password: 踏み台サーバのパスワード (%pass) Session/ Host Name: ログイン先のサーバホスト名 (%host) Port: ログイン先のサーバポート番号 (%port) Connection/Data/ Auto-login username: ログイン先のサーバユーザ名 Connection/SSH/Auth PrivateKey: ログイン先サーバの認証用.ppk
cygwin OpenSSH で作った プライベートキーは、 putty-gen の import ボタン で .ppk にしておくこと。
踏み台の認証用ppkを設定する場所はないので
Telnet command の plink に -i hoge.ppk とかってやって直接ファイル名指定するしかないかも。
Connection/SSH/Auth の ppk 指定は、agentを使っているなら指定要らないかも。
これを設定してから、セッション名をつけて保存。
plink 適当なセッション名 hostname
で ちゃんとつながってることを確認できればおっけー。
2014/09/27(土)template <T> struct intrusive_tree_base
だいぶ前に書いたC++で木構造どうしようの記事
template <class T> class TreeNode { ... }; の中身は?
template<T> struct TreeNode { TreeNode<T> *parent, *child_left, *child_right; }
とかつくったら、
TreeNode<OBJECT_T *> pObject; の子供のメンバにアクセスするたびに
static_cast<OBJECT_T *>(pObject->child_left)->SomeMember;
みたいに static_cast すんのか?
という疑問に対する一つの答えが
template<T> struct intrusive_tree_base<T> { T *parent, *child_left, *child_right; } struct SomeTreeNode : public intrusive_tree_base<SomeTreeNode> { SomeType SomeMember; };
すればいいじゃないということに気づいた。
というわけで、実際に実装してみた。
intrusive_tree_base
https://gist.github.com/ttsuki/5b0498518f99f1fd2b78
C++11を学ぶにつれて、だんだんこういうかゆいところにも手が届くように、なってきたりする。
2014/09/21(日)VC++ で __builtin_ctz __builtin_clz __builtin_popcount
をするための intrin wrapper。
コンテストではローカルがVisualStudioで、ジャッジサーバはgccなので、
これを書いておくと、あまりその辺気を使わずビット演算できる
//// bit //// #ifdef _MSC_VER #ifdef _WIN32 inline unsigned int __builtin_ctz(unsigned int x) { unsigned long r; _BitScanForward(&r, x); return r; } inline unsigned int __builtin_clz(unsigned int x) { unsigned long r; _BitScanReverse(&r, x); return 31 - r; } inline unsigned int __builtin_ffs(unsigned int x) { unsigned long r; return _BitScanForward(&r, x) ? r + 1 : 0; } inline unsigned int __builtin_popcount(unsigned int x){ return __popcnt(x); } #ifdef _WIN64 inline unsigned long long __builtin_ctzll(unsigned long long x) { unsigned long r; _BitScanForward64(&r, x); return r; } inline unsigned long long __builtin_clzll(unsigned long long x) { unsigned long r; _BitScanReverse64(&r, x); return 63 - r; } inline unsigned long long __builtin_ffsll(unsigned long long x) { unsigned long r; return _BitScanForward64(&r, x) ? r + 1 : 0; } inline unsigned long long __builtin_popcountll(unsigned long long x) { return __popcnt64(x); } #else inline unsigned int hidword(unsigned long long x) { return static_cast<unsigned int>(x >> 32); } inline unsigned int lodword(unsigned long long x) { return static_cast<unsigned int>(x & 0xFFFFFFFF); } inline unsigned long long __builtin_ctzll(unsigned long long x) { return lodword(x) ? __builtin_ctz(lodword(x)) : __builtin_ctz(hidword(x)) + 32; } inline unsigned long long __builtin_clzll(unsigned long long x) { return hidword(x) ? __builtin_clz(hidword(x)) : __builtin_clz(lodword(x)) + 32; } inline unsigned long long __builtin_ffsll(unsigned long long x) { return lodword(x) ? __builtin_ffs(lodword(x)) : hidword(x) ? __builtin_ffs(hidword(x)) + 32 : 0; } inline unsigned long long __builtin_popcountll(unsigned long long x) { return __builtin_popcount(lodword(x)) + __builtin_popcount(hidword(x)); } #endif // _WIN64 #endif // _WIN32 #endif // _MSC_VER inline unsigned int bsf(unsigned int v) { return __builtin_ctz(v); } // 最下位の1は下から数えて何ビットめか? inline unsigned long long bsf(unsigned long long v) { return __builtin_ctzll(v); } // 最下位の1は下から数えて何ビットめか? inline unsigned int bsr(unsigned int v) { return 31 - __builtin_clz(v); } // 最上位の1は下から数えて何ビットめか? inline unsigned long long bsr(unsigned long long v) { return 63 - __builtin_clzll(v); } // 最上位の1は下から数えて何ビットめか? inline unsigned int msb(unsigned int v) { return 1 << bsr(v); } // 最上位の1だけ残す inline unsigned long long msb(unsigned long long v) { return 1ull << bsr(v); } // 最上位の1だけ残す inline unsigned int lsb(unsigned int v) { return v & -v; } // 最下位の1だけ残す inline unsigned long long lsb(unsigned long long v) { return v & -v; } // 最下位の1だけ残す inline unsigned int pop_lsb(unsigned int v) { return v & v - 1; } // 最下位の1以外を残す inline unsigned long long pop_lsb(unsigned long long v) { return v & v - 1; } // 最下位の1以外を残す inline unsigned int round_up_pow2(unsigned int v) { return msb(v - 1) << 1; } // 2の累乗に切り上げ inline unsigned long long round_up_pow2(unsigned long long v) { return msb(v - 1) << 1; } // 2の累乗に切り上げ // bit permutation。nビット立っているものを列挙する inline unsigned int next_bit_permutation(unsigned int x) { int t = x | (x - 1); return (t + 1) | (unsigned int)((~t & -~t) - 1) >> (bsf(x) + 1); } // bit permutation。nビット立っているものを列挙する inline unsigned long long next_bit_permutation(unsigned long long x) { long t = x | (x - 1); return (t + 1) | (unsigned long long)((~t & -~t) - 1) >> (bsf(x) + 1); } // x の p1からlen bitと p2 から len bit を入れ替える template<class T> T bit_swap(T x, size_t p1, size_t p2, size_t len) { T mask = (static_cast<T>(1) << len) - 1; T ope = (x >> p1 ^ x >> p2) & mask; // 入れ替える場所のxorを求める return x ^ (ope << p1 | ope << p2); // 入れ替える場所をxor。 }
最新版は以下でメンテされるだろう。
ただし、あっちは、 #define long long long されているので注意が必要。
プロコン用テンプレート C++11
2014/08/19(火)コミケ行ってきたので模様替え。
2014/07/06(日)プロコン用テンプレート C++11
つーさが、ここ1ヶ月くらい前からAOJで遊びはじめて、
プログラミングコンテストとかで使ってるテンプレートです。
C++11です。
入出力が READ や read<..>(n次元); や readjag()で簡単に書けたり、
出力が、WRITE に vector を渡すと1行にスペース区切りで出してくれたりとか。
探索と幾何はそれなりにまとめた?
フローとかがなくてつらい。
2014/06/22(日)AtCoder Beginner Contest #11
久々にAtCoderに出たよ!
http://abc011.contest.atcoder.jp/submissions/all?user_screen_name=ttsuki
D問題の大ジャンプが面白い問題だった。
ぎりぎり401点取れて42位、全完の中では下から2番目。。
順位表を眺めていて、この辺のレベルを面白いと思って解いているようじゃ、まだまだだなー。
最近個人的にプログラミングコンテストブームが再来して、AOJでICPC関連の問題解いて遊んでる。
人生において、プロコン問題が解けた瞬間が一番楽しいと思う。
2014/01/18(土)x86 で cntlz64
Counting of Leading Zeros.
Number of Leading Zeros. ともいう。
64bitのnlzをx86で求めるにはどうすりゃええんか? と思っていろいろいじってた。
2014/01/01(水)yamy(Yet Another 窓使いの憂鬱)でどこでもhjklカーソル移動
あけましておめでとうございます。
本年も何卒よろしくお願いいたします。
日本で英語キーボードというとどうしても選択肢が限られてしまい、
最近のノートパソコンではキーボード配列を選べないことも多くなってきました。
キーボード配列ひとつで好きなノートPCが選べないのはもったいないですし、
かといってやはり記号を多く入力するプログラマにとって英語配列の魅力は捨てがたい。
結局、109日本語キーボードを104英語配列ドライバで動かすことに落ち着いているつーさです。
記号キーはキーボードに書いてある文字と違うものが出るので最初は戸惑いますが、
慣れてしまえばキーボードを見ることなんてないのでこれはこれで幸せです。
さて、タイトル。
文字を書いてるとき、ログを眺めてるとき、hjklでカーソル移動したいです。
前々から気になっていたyamyでのremapに挑戦。
http://knoike.seesaa.net/article/356046428.html
yamy は 窓使いの憂鬱の親戚で、
LLキーボードフックを使ってキーの入れ替えをしてくれるツールです。