困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

VRの話~OculusRiftDK2でSteamのRedoutをプレイしてみた~

OculusRiftDK2でSteamのRedoutをプレイするまでに、色々と詰まったのでメモ。

1. OculusRiftのセットアップソフトインストール

https://www3.oculus.com/en-us/setup/


ここからダウンロード

exe起動

f:id:mochimoffu:20161108000444p:plain

 

↑のような画面が出るので、画面の案内にしたがってボタンを押していく

2. OculusRiftセットアップソフトを使用して、初期設定

とりあえず、アカウント設定やログインまで終わったら、一通り初期セットアップしろといわれるので、画面案内にしたがって設定。

f:id:mochimoffu:20161108000448p:plain

多分、ここが一番詰まるところだとおもう。

上記画像みたいに、ケーブル系で全く認識してない状態になるが、気にしてはいけない。

ここがこんなでも大丈夫。

リモコンの設定などもSkipして大丈夫。

3. Oculus製品以外も認識するように、設定

f:id:mochimoffu:20161108000450p:plain
↑の画像のように、Generalの一番上をONにする。

どうやら、正規のOculusのソフト以外を実行するのは、このチェックが必要らしい。

4. Steam側の設定をする
多分、Steam起動すると、「SteamVRをインストールしますか?」的なことを言われるので、インストールする。
そこまで終わったら、多分一回再起動かましたほうがいい。
再起動する前に、もしデュアルディスプレイにしてるんだったら、片方ディスプレイ端子から抜いといたほうがいい。恐らく、トリプルでは認識しないグラボの方が多いのではなかろうか。

で、再起動終わったら、Steamの左上のメニュー、「表示」⇒「SteamVRを起動」をする。

そうすると、SteamのVRチュートリアルアプリが立ち上がり、初期設定をするが、適当にOKを押しすすめってOK。

5. ゲーム起動
Redoutを押して、SteamVRで起動を選択して起動。多分起動する。

6. あとがき

会社のマシンのスペックは高くて、プレイに没入感があったが、自宅マシンのGTX650では30FPSか?ってくらいカクつき、快適なプレイとは程遠い状態となってしまった。

まず、高FPSを出せるようにしないとアカンのやなぁと思った。

VIMの話~特定のコマンドで、予め指定したファイルを開く方法(vimrc編集の話)~

以前、open-browserというプラグインを導入した。

https://github.com/tyru/open-browser.vim


VIM上で記述されているURL上にカーソルを合わせてコマンドを打つと、ウェブブラウザで開いてくれる
・:google 検索文字列 とやると、ウェブブラウザでそれを検索してくれる

という事を実現したかったからだ。

正直、あまり使っていない機能になってしまっているのだが、何とか使えないかと思い、
URL一覧か何かをファイルにまとめておき、それをすぐに開けるようにキーマップしておけば便利になるのではないかと思い
試しにやってみた。

1. URLを記述するファイルを置く
とりあえず、「C:/takuya/vim/vim73/win32」に、「url」というファイルを作成する。

2. VIMRCに、キーマップを登録する
VIMRCに、以下のように追加する
nmap <Space>url :open C:/takuya/vim/vim73/win32/url <enter>

SPACE⇒u⇒r⇒l と入力すると、C:/takuya/vim/vim73/win32/url を開いてくれるだけのキーマップだ。

ここに、会社で使うGmailとかRedMineのURLとか乗っけておけば、もしかしたら便利なのかもしれない。
自分でも頑張って使ってみることにする。

ちなみに、上記の記述は他の色々な事に応用できそうな気がする。
batファイルを実行する、といった記述にしておけば、コンパイルを開始してくれるようなことも可能だと思う。


VIMの話~ファイル編集履歴を残しておけるプラグイン-unite-~

VIMの話と書いてあるが、この機能はどのエディターでもあれば便利のはずなので、是非お使いのエディターでも類似の機能がないか是非探してみてほしい。

さて、VIMプラグインという物で「unite」という物がある。

https://github.com/Shougo/unite.vim
このuniteだが様々な機能がついている。
と言っても、筆者は全て使いこなしているわけではなく、使っている機能は3つだけだ。

・ファイルのエクスプローラー機能
・ファイルの編集履歴一覧
・それらのパスから、コマンドを指定して実行(エクセルファイル等は、Excelで立ち上げてくれて、exeファイル等は実行されるなど。もちろん、他の窓に分割して開く、という事も出来る)

以上だ。

この中で、ファイルの編集履歴一覧が想像以上に便利だった。

IDEをお使いの人なら、わざわざファイルを探さなくても、画面の右か左にファイルの一覧が並んでいて、検索窓にファイル名でも打ち込めば探してくれるだろう。
しかし、このプラグインを入れて然るべきキーマップを設定すると、
SPACE⇒F⇒Mで、過去に編集したファイル200件が表示される。
それを選択すれば、すぐにファイルを編集可能な状態で開いてくれるというわけだ。

あと、よく実行するbatやexe、VIMでは編集できないxlsx等もとりあえず一度開いて履歴に登録しておけば、
その履歴一覧から実行することも可能になるわけだ。

キーボード3打で、編集してきたファイル一覧が閲覧できるというのは、思いのほか便利なので、
是非類似のことが出来ないか調べて試してみて欲しい。

VIMの話-postmail.vimを使えるように頑張る4-

前回の続き。
Ccも送れるようにしてみた。

VIMスクリプトPythonスクリプトの中身が、実際どのような流れで何をしているのか
きちんと理解しながらトレースするぞぉ!

・・・・・










なんていう、新人に教えるようなことをする気は最初っからないので!

ひとまず、Toと書かれている辺りの処理をコピペしてなんとなく似せれば上手く動くだろうと
まず、postmail.vimの中身を検索。

    if l:argc < 1
        let l:to_input = input('To Address : ', l:smtpconf.default_to_address)
        let l:to_input = iconv(l:to_input, &encoding, 'utf-8')
        let l:addresses = [ l:to_input ]
    else
        let l:addresses = a:000
    endif

この辺が、VIMコマンド実行時に入力を促す処理と見た!
根拠は、'To Address'
これが、コマンド実行時に表示されるからだ。
とりあえず、多分変数の概念とかあるんだろうから、コピペする範囲に気をつけて

    if l:argc < 1
        let l:to_input = input('Cc Address : ', l:smtpconf.default_cc_address)
        let l:to_input = iconv(l:to_input, &encoding, 'utf-8')
        let l:cc_addresses = [ l:to_input ]
    else
        let l:cc_addresses = a:000
    endif

 を追加。

l:smtpconf.default_to_address から察するに、postmail.confの中身を参照しているのだろうと推測。
こっちにも

    'default_cc_address': '*****@*****'         ,

 これを追加。

試しにコマンドを打ってみると、Cc Addressの入力を促す入力待機が実行された。


次に、VIMスクリプトに流しているであろう辺りを捜索。
というか、.pyを実行しているのは

    for l:i in split(globpath(&runtimepath, 'plugin/postmail.py'), '\n')

ここだけだから、この周りを調べればおk。

    let l:i = 0
    while l:i < len(l:addresses)
        let l:to_address = l:addresses[l:i]
        call s:Post(

これが、それなんだろうと思うが、この文をそのままVIMスクリプトの知識無しでトレースすると、アドレスが入ってる配列の個数分Post関数呼ばれないかこれ・・・?

と思った。
が、実際は一回しか呼び出されていないので、whileしてるけど、事実上addressesの中身は一個しかない処理なんだと推測し、以下を追加

        let l:to_address = l:addresses[l:i]
        let l:cc_address = l:cc_addresses[l:i]

もちろん、引数にも

            \     l:to_address,
            \     l:cc_address,

こんな感じで。呼び出し先の方も

function! s:Post(auth_type, smtp_host, smtp_port, login_user, login_pass, mail_encoding, from_address, to_address, cc_address, subject, body, pop_host, pop_port, pop_user, pop_pass)

 こんな感じで追加。

そして、一回postmail.pyの方を検索かけてみるが、auth_typeを受け取っているのが

class Mailer(threading.Thread):
    def __init__(self, auth_type, smtp_host, smtp_port, login_user, login_pass, mail_encoding, pop_host, pop_port, pop_user, pop_pass):
        threading.Thread.__init__(self)

        if auth_type == 'None':
            self.mailer = BaseMailer(smtp_host, smtp_port, login_user, login_pass, mail_encoding)
        if auth_type == 'TLS':
            self.mailer = TLSMailer(smtp_host, smtp_port, login_user, login_pass, mail_encoding)
        if auth_type == 'POP':
            self.mailer = POPMailer(smtp_host, smtp_port, login_user, login_pass, mail_encoding, pop_host, pop_port, pop_user, pop_pass)

 ここだけで、さっきのPython呼び出しとはあんまり関係がなさそうな感じ。
というわけで、他のto_addressをpostmail.vimの方で検索かけていると

to_address    = vim.eval('a:to_address')

ってのがあったので

cc_address    = vim.eval('a:cc_address')

 を追加。

さらに、その下の方に

mailer.sendmail(from_address, to_address, subject, body)

があったので、これがpostmail.py側の

 

    def sendmail(self, from_address, to_address, subject, body):

 に該当すると思い

mailer.sendmail(from_address, to_address, cc_address, subject, body)
    def sendmail(self, from_address, to_address, cc_address, subject, body):

 と追加。

というか、postmail.py側のto_addressが書かれている箇所全てに、cc_addressを思考停止で追加していった。

で、実際にメールを送るpostmail.py内の箇所は

    def __send_tls_auth_message__(self, from_address, to_address, cc_address, message):

 今回はここなので、
http://stackoverflow.com/questions/1546367/python-how-to-send-mail-with-to-cc-and-bcc


ここを参考にして

        to_address_list = to_address.split(",")
        cc_address_list = cc_address.split(",")
        to_address_lists = to_address_list + cc_address_list
        ~~~
        smtp.sendmail(from_address, to_address_lists, message.as_string())

とした。


で、テストして上手く動いてるっぽい挙動をしたので、自分で使う分にはこれでいいやという事で

終わり。

ちなみに、postmail.confのmail_encodingをutf-8にすると、携帯にメールを送ると改行が効かなくなるので注意。

 

エンジニアとして、内部でやっている処理の流れを理解せずに、適当に追加してそれでいいのか!というお叱りを受けそうだが、それがクリティカルになりそうなら調べればいいだろうし、問題が起きた際にどうにでも対応できるんだったら動けばいいんじゃないかな^p^
実際、これは問題が起きたところで何も実害がないので。
仕事ではクリティカルになる場合が多いので、ほとんどの場合はきちんと理解してから使うことになりますね。当たり前ですが。

というわけで、これを参考にする場合は自己責任でお願いします(笑)

VIMの話-postmail.vimを使えるように頑張る3-

前回の続き。

とりあえず、複数Toを送れるように、色々調べてみた。

http://d.hatena.ne.jp/thalion/20090622/p1

http://ameblo.jp/pythonista/entry-11296347805.html

http://qiita.com/ana_aki/items/5104978238f1f5e72cc8


この辺を参考にして、とりあえずpostmail.pyの中身を編集していく

    def __send_tls_auth_message__(self, from_address, to_address, message):

        smtp.sendmail(from_address, [to_address], message.as_string())

これを
        to_address_list = to_address.split(",")
        smtp.sendmail(from_address, to_address_list, message.as_string())

こう変更するだけで、とりあえずTo宛に複数送信することは出来た。
上記のサイトに、CcやBccもあったので、次回はこの辺を改良していくことにする。

VIMの話-postmail.vimを使えるように頑張る2-

前回の続き。

宣言どおり、とりあえずpostmail.pyの中身を確認、文字列本文を表しているであろうと思われる箇所を探す。

def __create_message__(self, from_address, to_address, subject, body):
これのbodyがそれに該当するっぽかったので、早速以下のコードを試す

        message            = MIMEText(body.encode(self.mail_encoding).replace('\n\r', '\r').replace('\n', '\r'), 'plain', self.mail_encoding)

しかし、これが上手くいかない・・・。

何故かと思い、printを仕込んで実行してみたところ、"\n"という文字列が、改行ではなく文字列として扱われていた模様。

なので、正しくは

        message            = MIMEText(body.encode(self.mail_encoding).replace('\\n\\r', '\r').replace('\\n', '\r'), 'plain', self.mail_encoding)

これが正解っぽい。

これで、Pythonから自分のHotMail宛てに文章を送って、変な改行が入らないようになった。

【今回の注意点・ハマリ点・助言】
・タブはスペース4つじゃないと、どうやらエラーになる模様
・必死にreplace('\n', '\r')とかやっていたが、それではダメで、内部的には"\n"という文字列扱いになっているので、正しくはreplace('\\n', '\r')という事らしい
・printすれば、一応ログデバック可能なので、活用すべし

次は、TOやCCの指定が可能かどうかだな。

VIMの話-postmail.vimを使えるように頑張る1-

筆者は仕事をする時にVIMを使う。
厳密にいうと、KaoriyaさんのGVIMに便利そうなプラグインを適当に足していき、VIMを拠点に様々な操作を行うというスタイルを取っている。

以前から、日報提出のメール内容はVIMで編集してはいたのだが、いっそのことVIM上からメールを送信できればいいなと思っていた。
昔一度トライしたことがあり

postmail.vim : メール送信用vimエディタプラグイン — 名無しのvim使い

こちらを参考に試したのだが、:Mailコマンドがエラーで動かず即断念した。

ただ、別のプラグインを使えるようにする過程で、VIMスクリプトの中身を見てトレースする機会があり、今なら動かせるのではないかと思い、再度挑戦した。

 

結論からいうと、エラーが出ている場所はここだった
postmail.vim
function! g:PostMail(...) rangeの
for l:i in split(globpath(&runtimepath, 'plugin/postmail.conf'), '\n')

ここに、「globpath(&runtimepath, 'plugin/postmail.conf')」のパスにpostmail.confが存在していなくて失敗していたようだった。

runtimepathは、vim上で:set runtimepathとか打てば、通っているパス一覧が表示されるので、そのどこかにpostmail.confを置いてやればよかった。

後は、手順に則り、postmail.confを編集してやれば、メールを「送信できること」は確認できた。

 

そう、送信するだけならな!

 

詰まった点
・全角文字が入力されていると、エラーになる
・改行コードがおかしく表示される
・TO宛先に複数指定が出来るか不明、また、CC指定が可能かもわからない

 

全角文字指定に関しては、postmail.confに予め全角文字を含めてしまうと、おかしくなってしまうので、デフォで全角文字設定をするのは避けた方が良さそう。

 

改行コードに関しては、どうやらCRにすると上手くいくようなのだが、WindowsでCRを使うは微妙な気がするし、そもそもVIMでの設定はdos(CRLF)になっているしている。
これは、pythonスクリプトの中身確認して、文字コードをCRに書き換える処理を加えられるらならそうしたほうがよさそうだ。

 

TO宛先に関しても、こちらはまだ完全にノープランだが、恐らくPythonスクリプト側でその辺の設定が出来る箇所があると思うので、やはりPythonスクリプト側に探りを入れていく予定だ。

 

まぁ、ひとまず可読可能な物をメールで送信することは出来たので、もう少し調べれば使い物になるのではないかなと思う。