VMware horizon client の Linux 版の Ctrl と Capsを入れ替える
動作確認は以下のバージョンで実施した。
$ vmware-view --version VMware Horizon Client 4.7.0
horizon clientのkeymapも以下の方法で変更できる。10年も前の記事だけど参考になったのでめちゃくちゃ感謝している。
このブログにも一応書いておくが
~/.vmware/config
に xkeymap.keycode.${original_code} = ${rewrited_code}
を書き込んだ後、horizon clientを起動すると良い。
自分は以下のような設定を入れた。
$ cat ~/.vmware/config xkeymap.language = jp106 xkeymap.keycode.66 = 0x01d
~/.vmware/config に何が記載できるか? がVMwareの公式ドキュメントとしてまとまっていてほしい...けど、どこかにあるのだろうか?
Linuxでhorizon-clientを使う人でJISを使っていてわざわざCtrlとCapsを入れ替えたい人がどれだけ存在するか?は知らないけど、何かの参考になれば。
設定はそれだけだが、ここに至るまでに読んだ良かった記事をいくつかリンクしておく。
↑の記事はLinuxのkeyboardを叩くと、どのようにして値が扱われるか?がまとめて書いてある。記事は古いが大枠を理解するには役立った。
↑は実際にどのような値が入力されるか?を調べるための方法がまとまっていた。
tentarafoo 開発 4日目
やったこと
- 文字列をログ出力できるようにした
- https://github.com/brianvoe/gofakeit の
HackerPhrase
を利用した
- https://github.com/brianvoe/gofakeit の
やりたいこと
- ログの文字列、全くサーバーのログっぽくはないのでそのうち改善したい
- goroutineを使うだけではCPUをうまく使い切れないらしいので、CPUを使う数を増やす
- yesコマンドがCPUを食いつぶすらしいのでそれっぽい実装をしたい
tentarafoo 開発 2日目
やったこと
- ポートを開く機能を非同期にして、ポートが閉じるのを待つようにした
- udpのポートが開けないバグを直した
追加でやりたいと思ったこと
- 開くポートをランダムにすること
- それっぽいログをランダムな間隔で吐くようにしたい
- ものすごい勢いでログを吐き続ける機能もありかも
学び
net.Listen
の引数はtcp
という文字列を取るのでudp
も行けると思ったらだめだったnet.ListenUDP
を使う必要がある
tentarafoo 開発 1日目
tentarafooというツール兼サーバーを書き始めた。
このツールはプロダクションで可動しているサーバーでは期待されないような状態を作り出すこと目的としている。
例えば、以下のような状態が期待されていない状態として上げられる。
- 謎のプロセスが80/tcpを掴んでいる
- メモリの使用量がじわじわと上がったり
- inodeが枯渇したり
- ディスクフルな状態
- etc
目的を達成するだけならAnsibleとシェルスクリプトの寄せ集めのほうが早い気がするが、
シングルバイナリで様々な環境で動いてほしいのでgolangで書き始めている。
今日書いたのは以下
- 設定ファイルを読み込む
- プロセスタイトルを任意のものに変更できるようにした
- tcpで複数のポートを開けるようにした
- ddpで複数のポートを開けるようにした
- 上記の状態で60秒待つようにした。
リポジトリは以下。
Keystoneの認証を利用してOpenStack APIを利用する
OpenStackをAPIでいろいろ操作する必要が出てきたので、OpenStack SDKに入門したのですが、微妙に躓いたのでメモを残して置きます。
2018年7月28日での話
実現したかったこと
自分が利用するOpenStack環境は、各エンドポイントがURLパスではなくドメインで分割されていたので、以下を実現したかった。
- keystoneに対して認証して
- 各エンドポイントに対してAPIをコールする
kestone認証を利用する
keystoneでsession情報を取得し、他の各クライアントにsession情報を引数で渡す。
以下のような感じでSDKを利用しておけば良い気がする。
pre requirement
pip install python-novaclient python-glanceclient python-keystoneclient
コード
import os from keystoneauth1.identity import v3 from keystoneauth1 import session from glanceclient import Client from novaclient import client as novaclient def get_keystone_credential(): return { 'auth_url': os.getenv('OS_AUTH_URL', ''), 'user_id': os.getenv('OS_USER_ID', ''), 'password': os.getenv('OS_PASSWORD', ''), 'project_id': os.getenv('OS_PROJECT_ID', ''), } if __name__ == '__main__': auth = v3.Password(**get_keystone_credential()) sess = session.Session(auth=auth) glance = Client('2', session=sess) print("---images---") for image in glance.images.list(): print(image['name']) print("---servers---") nova = novaclient.Client('2', session=sess) for s in nova.servers.list(): print(s.name)
エンドポイントを指定する
こちらに関しては、利用したい各クライアントによって指定方法が異なる気がする。
glanceなら Clientを生成するときの引数で endpoint
を指定するし、
https://github.com/openstack/python-glanceclient/blob/master/glanceclient/client.py#L23
novaだとhttps://github.com/openstack/python-novaclient/blob/master/novaclient/client.py#L270 から生成されるであろう https://github.com/openstack/python-novaclient/blob/master/novaclient/v2/client.py#L50 には endpoint_override
という引数で指定できそう
ココらへんのことを書いてあるドキュメントを見つけられず、コードを読んで結論を出したので、もしかしたらもっと良い方法があるかもしれない。
反省点
軽い気持ちでSDKというくくりの日本語ドキュメントを読み始めたのが間違いだった。
各クライアントのドキュメントを読むと良い気がする。
OpenStack Docs: Python bindings to the OpenStack Identity API (Keystone)
OpenStack Docs: Python Bindings for the OpenStack Images API
python fabric2 の話
先日、おもむろに pipenv install fabric
したら、fabricのver 2が落ちてきた。
今までのfabricのインターフェースとは大きく変わっていたのでざっくりとまとめておく。
TL;DL
- fabric2は良い
- oopなインターフェースを備えた
- 1ライブラリというスタンスが明確になった
- fabric1のユーザーは http://docs.fabfile.org/en/2.1/upgrading.html に目を通しましょう。
- デグレっぽいときはだいたい機能を削った理由が書いてある
Fabric
- 自動化のためのツール
- ShellScriptでは微妙だけど、Ansibleを持ち出すほどでもないときによく使われる印象
公式ドキュメント
どのような意図なのか?はわからないが、公式ドキュメントは2ドメインある
- ざっくりした概要が書いてある場所
- APIのドキュメント
また2018年6月16日の段階では fabricの日本語ドキュメントは2対応していないので注意
Fabric ver 2 ?
- fabric
- もともとあったfabric
- python3は未対応
- 今となってはバージョン指定をして pip インストールをする必要がある
- fabric 2
- fabric 3
- fabricが長い間 python3 に未対応だったためのfork
- fabric の ver 1のインターフェースと ほぼ 互換性がある
- コードを読むとわかるけど、一部非互換のところもあったよ
- python3対応
pipenv install fabric3
で落ちてくる
ver 1 と ver 2 のgetting start 的な比較
すごく雑だが、パスワード認証でログインできるサーバーにrootで hello world
を出力するサンプル
ver 1
from fabric.api import run, env env.hosts = ["192.168.0.1"] env.user = "root" def hello(): run("echo hello world")
fabfile.pyのあるディレクトリで fab hello
で実行可能
ver 2 を ver 1っぽい書き方で
from invoke import task @task def hello(c): c.run("echo hello world")
fabfile.pyのあるディレクトリで fab --host root@192.168.0.1 --prompt-for-login-password hello
ver 2 を ver 2っぽい書き方で
from fabric import Connection c = Connection(host="192.168.0.1", user="root", connect_kwargs={"password": "xxxxxxx"}) c.run("echo hello world")
何が変わったのか?
- ver 1
fab
コマンドがメイン- fabfile.py で、関数の中に
fabric.api.run
を書いて、fab 関数名
- 改めて考えると、マジックな感じが多く、fabricに対する知識が求められる感じ
- ver 2
fabricの1と2では、機能的側面で互換性があるので、fabric 1の利用者は http://docs.fabfile.org/en/2.1/upgrading.html を読むことをおすすめする。自分が気になった非互換は以下
fabric ver 1 と ver 2での非互換
http://docs.fabfile.org/en/2.1/upgrading.html からの抜粋して雑に意訳とその感想
- role がなくなった
- Group がいい感じで使えるようになったからそっちで賄えそう
--shell
やenv.shell
で シェルを指定できなくなった- fabric1のときはいろいろと指定する方法があったが面倒なので詳しくは調べていない
- fabric2では http://www.fabfile.org/upgrading.html#run にremoteでの実行のことが書いてある
- google先生に翻訳してももらうと
- 指定できるのは嬉しいけど、コマンドのエスケープがバグりがち?
- runの引数にshellはあるけど、他のインターフェース(invoke.runners.Runner)のサブクラスだからあるだけで何もしないとのこと
- たぶんココらへんにそのコードがある https://github.com/fabric/fabric/blob/2.0/fabric/runners.py#L18
- google先生に翻訳してももらうと
- remoteに対しては runメソッドの引数などを利用せず、commandで明示的に指定するようにしてほしい感じだと思う
- ディレクトリごとファイルを送れなくなった
- http://www.fabfile.org/upgrading.html#file-transfer の一番下に書いてある
- rsync + zip or tar みたいなコードをメンテするのが大変だったからやめたとのこと
- 自分はローカルでzipにして、リモートに送ってunzipするようにした
雑な感想
fabric ver 2では直感的にわかりやすいし、個人的には良いと思えるインターフェース設計になった印象があるので、積極的にfabric1から移行したい。