とあるぼっちの生存報告

はてなから卒業します. さようなら.

Virtual Boxに入れたubuntu serverにホストOSからssh経由でアクセスする

毎回忘れるのでいい加減メモ

ネットワークの設定

VirtualBox側の環境設定でホストオンリーネットワークにアダプタを追加(されているなら不要)し、対象のVM環境の設定にあるネットワークのアダプター2をホストオンリーアダプタとして有効化。名前を追加したアダプタの名前にする。なお、この作業は対象のVM環境の電源をOFFにしておかないとできない。

ubuntu serverを起動したら、/etc/network/interfacesの末尾に以下を追加する。

auto eth1
iface eth1 inet static
address 192.168.56.101
netmask 255.255.255.0

これでホスト側からゲストのubuntu serverへアクセスできるようになる。なお、ここのaddressとnetmaskはホストオンリーアダプタのDHCPサーバ設定に依存する。

sshの設定

$HOMEに.sshディレクトリ、及びauthorized_keysファイルがない場合は

$ mkdir ~/.ssh
$ chmod 0700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

しておき、公開鍵をauthorized_keysに記入する。

# この例はホストOS側でログインしているuserの公開鍵をscpを利用してゲストOS側のuserのホームディレクトリへコピーしている
$ scp ~/.ssh/id_rsa.pub user@192.168.56.101:
# 上記でコピーされた公開鍵をauthorized_keysに記入する
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

/etc/ssh/sshd_configの設定を以下のように変更する。

  • PermitRootLogin をnoへ
  • PasswordAuthentication をnoへ
  • AuthorizedKeysFile の項目の先頭にある#を削除

設定が終わったら

$ sudo /etc/init.d/ssh restart

これでホストOSからゲストOSへssh経由でアクセスできる。

参考

Virtualboxで仮想サーバー構築(ubuntu server 12.04 + SSH) - Qiita

Emacs24.3(for Mac OSX)でUnity用のC#を書くために

前提

  • auto-completeを導入. 以前の記事を参照
  • monoの最新版を導入

csharp-modeの導入

Emacs 24.3にはC#用のメジャーモードがデフォルトで用意されていないため、csharp-mode.elを入れる.

curl -O http://www.emacswiki.org/emacs/download/csharp-mode.el
mv csharp-mode.el ~/.emacs.d/site-lisp/

OmniSharpの導入

C#のコード補完を行うためにOmniSharpを導入する.

git clone git@github.com:nosami/Omnisharp.git
cd Omnisharp
git submodule update --init --recursive
cd server
xbuild /p:Platform="Any CPU"

これでOmniSharp/bin/Debugの中にOmniSharp.exeが生成される. 後で紹介するomnisharp-emacsが隠蔽してくれるのであまり使う事にはならないが使用方法を以下に示す.

mono OmniSharp/bin/Debug/OmniSharp.exe -s path/to/you/hoge.sln

omnisharp-emacsの導入

omnisharp-emacs*1はOmniSharpを起動しそれと通信を行う事でそのプロジェクト内にあるファイルの補完候補をEmacs上で提示してくれる.

cd clone git@github.com:sp3ctum/omnisharp-emacs.git
cp omnisharp-emacs/omnisharp.el ~/.emacs.d/site-lisp

設定

(autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t)
(add-to-list 'auto-mode-alist '("\\.cs$" . csharp-mode))
(require 'omnisharp)
(setq omnisharp-server-executable-path (expand-file-name "/path/to/OmniSharp.exe"))
(add-hook 'csharp-mode-hook
            #'(lambda ()
                (omnisharp-mode)
                (ac-common-setup)))
(global-auto-complete-mode t)

とすれば動く……と思ったら動かない. byte compileでomnisharp-emacsがエラーを吐くので修正が必要

--- omnisharp.el
+++ omnisharp.el
@@ -563,7 +563,7 @@ solution."
                               ;; dll and csproj files
                               ))
          (tmp-params (omnisharp--get-common-params))
-         (params (add-to-list 'tmp-params
+         (params (add-to-list (omnisharp--get-common-params)
                               `(Reference . ,path-to-ref-file-to-add))))
     (omnisharp-add-reference-worker params)))
 
@@ -1694,7 +1694,7 @@ ido-completing-read. Returns the chosen element."
       (cdr (assoc 'QuickFixes quickfix-response)))
      other-window)))
 
-(defun omnisharp-navigate-to-solution-member-other-window
+(defun omnisharp-navigate-to-solution-member-other-window ()
   (omnisharp-navigate-to-solution-member t))
 
 (defun omnisharp-navigate-to-solution-file

こんな雰囲気のpatchをomnisharp.elにあててbyte compile.

使用方法

Unityでメニューの"Assets"から"Sync MonoDevelop Project"を選択してsln/projファイルを生成し、OmniSharpに解析対象のslnを渡す. omnisharp-emacsを使用する場合は以下のようになる.

(omnisharp-start-omnisharp-server (expand-file-name "/path/to/your_unity_project.sln"))

これでOmniSharpのサーバーが起動する. 面倒なのでinteractiveな函数を作る.

(defun my-omnisharp-start (sln)
  (interactive "fOpen sln: ")
  (omnisharp-start-omnisharp-server (expand-file-name sln)))

後は該当のC#コードを開き、`M-x my-omnisharp-start'で対象のソリューションファイルを指定する事で、補完が捗るようになる. 定義へジャンプも可能なようだ(まだ試していない)

*1:omnisharp-emacs(version: 2.0)は別途"json(1.2)", "dash(1.8.0)", "popup(0.5)", "auto-complete(1.4)", "flycheck(0.19)", "csharp-mode(0.8.6)"が必要なので, package-installなり手動なりでinstall.

Emacsでコード補完を利用するためにauto-complete-clang-asyncを導入してみた

OSX上のemacs-version "24.2.2"なEmacsでの話

auto-complete

まずは前提となるauto-completeがないと話にならないので, サイトダウンロードから一式落として, 然るべき処(~/.emacs.d/site-lispなど)に必要な物一式コピーする.

cp *.el ~/.emacs.d/site-lisp/
mkdir ~/.emacs.d/ac-dict
cp dict/*-mode ~/.emacs.d/ac-dict

~/.emacs.d/init.elなどにauto-completeの設定を記述.

(require 'auto-complete)
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
(ac-config-default)
(setq ac-modes (append ac-modes '(objc-mode)))

ac-modesのdefaultにはobjc-modeは入っていないので別途追加している. ちなみにac-modesにdefaultで含まれている物は以下.

auto-complete-clang-async ちょっとその前に

続いてauto-comlete-clang-asyncを入れ……る前に, XCode付属のclangではうまく動いてくれないという不幸が訪れるので先に自前でclangをビルドする.

clang

llvm.orgから一式落としてくる. 執筆段階では3.4がリリースされているので3.4を利用する.

curl -O http://llvm.org/releases/3.4/llvm-3.4.src.tar.gz
curl -O http://llvm.org/releases/3.4/clang-3.4.src.tar.gz
tar zxvf llvm-3.4.src.tar.gz
tar zxvf clang-3.4.src.tar.gz
mv clang-3.4 llvm-3.4/tools/clang
mkdir build
cd build
# $HOME/local/llvmにinstallする前提.
../llvm-3.4/configure --prefix $HOME/local/llvm --enable-optimized --disable-assersions
make clean && make -j4 && make check-all && make install

auto-complete-clang-async

いよいよC++のコード補完をよしなにするために

git clone git@github.com:Golevka/emacs-clang-complete-async
cd emacs-clang-comlete-async
export DYLD_LIBRARY_PATH=$HOME/local/llvm/lib:$DYLD_LIBRARY_PATH # 上でinstallしたlibclang.dylibにアクセス可能にするための処置.
make
cp clang-complete ~/.emacs.d/bin # Emacsからアクセスできる場所に設置.
cp auto-complete-clang-async.el ~/.emacs.d/site-lisp

clang-completeが内部でclangのcc1を起動して良い感じの補完候補を抽出してくれるようになるらしい(ちゃんとコード読んでない).

そのclang-comleteと通信してEmacs上でコード補完を行えるようにしてくれるのがauto-comlete-clang-async.

auto-complete-clang-asyncを以下のようにする事で使用可能となる.

(require 'auto-complete-clang-async)
(defun ac-cc-mode-setup ()
  (setq ac-clang-complete-executable (expand-file-name "~/.emacs.d/bin/clang-complete"))
  (setq ac-sources (append '(ac-source-clang-async) ac-sources))
  (setq ac-clang-cflags (mapcar (lambda (item)
                                  (concat "-I" (expand-file-name item)))
                                  (split-string "~/local/llvm/lib/clang/3.4/include
~/local/include")))
  (setq ac-clang-cflags (append '("-std=c++1y") ac-clang-cflags))
  (ac-clang-launch-completion-process))
(add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
(add-hook 'c++-mode-common-hook 'ac-cc-mode-setup)
(add-hook 'auto-complete-mode-hook 'ac-common-setup)
(global-auto-complete-mode t)

clang-complete, というかclang -cc1はCFLAGSを元に補完候補を抽出するので追加のincludeパスがある場合はac-clang-cflagsに設定を追加する必要がある.

上の例だとC++1yを対象としていてObjctive-Cではちゃんと補完されないため, 設定用の函数を作りobjc-mode-hookに別途設定を施す必要があるがそれはまた今度.

PERSONA3 the Weird Masquerade 〜青の覚醒〜

1月11日 昼の回 鑑賞。

各回16席しかないマスカレードシートに幸いにも当選したので、舞台左右に設置されたテーブル席から観る事に。

各々の席にはキャストの直筆メッセージのある招待状が置いてあり、私は美鶴役の田野アサミさんからだった。ありがとうございます。ありがとうございます。

内容は記載しないけど舞台上の席からだから役者さんが近い近い。戦闘中には当然ながら役者さんが転がる転がる。スカート穿いてるのに転がる転がる。ゆかり*1が倒れた時などスカートの中が見えてしまってドキドキ物であった。ま、ちゃんと見えてもいい感じになってたけどね!!

阿澄佳奈さん格好良かった。んだけど、当然舞台正面から観る事が前提になっているため、横から観る事になっている都合上見えにくい事が多々あり、また、舞台奥のスクリーンと役者の演技が同期するようになっているので視線の移動が厳しく何が起きているのかも判り難かった。大型シャドウ8体残っているのできっと続きをやってくれると信じて、次はマスカレードシート席(あれば)狙いつつ、正面からちゃんと鑑賞したい。

イエス!アスミス!

*1:富田麻帆さんっていうと私の中ではかみちゅの人なのよね。

Mavericksにしたら/usr/includeが消失していた件

表題の通り。ハマった。

xcode-select --install

これで入る。

ついでに、antなどもなくなっており、結構被害が大きいかもしれない……。

Lua5.2でluaの函数内にてエラった時にtracebackを取得するには

Luaを自分のプログラムに組み込んでなんやらしている時に、

local function g()
  prin("hoge") -- 本当はprint("hoge")と書きたかった.
end

local function f()
  g()
end

f()

というコードがあるとして、これを実行するために、

  int error_code = lua_pcall(L,
                             nargs,
                             nresults,
                             0);
  if (error_code)
    {
      luaL_traceback(L,
                     L,
                     lua_tostring(L,
                                   1),
                     1);
      std::cout << lua_tostring(L, 1) << std::endl;
    }

なんて事をしても、lua_pcall()終了時点でstackは空になっているためtraceback自体表示されない. 正しくは、

namespace
{

int
traceback(lua_State* L)
{
  const char* message(lua_tostring(L,
                                   1));
  if (message)
    {
      luaL_traceback(L,
                     L,
                     message,
                     1);
    }
  else if (!lua_isnoneornil(L, 1))
    {
      if (!luaL_callmeta(L, 1, "__tostring"))
        {
          lua_pushliteral(L,
                          "(no error message)");
        }
    }

  return 1;
}

}
...

int error_func = lua_gettop(L) - nargs; // 呼び出した函数のstack数で引く
lua_pushcfunction(L,
                  traceback); // traceback函数をpush
lua_insert(L,
           error_func);
error_code = lua_pcall(L,
                       nargs,
                       nresults,
                       error_func); //traceback函数のhandle(index)を指定
lua_remove(L,
           error_func);

if (error_code)
  {
    const char* error_message(lua_tostring(L,
                                           1));
    std::cout << "luaL_pcall:";
    std::cout << error_message << std::endl;
    lua_close(L);
    return 1;
  }

...

これで、

luaL_pcall:[string "?"]:3: attempt to call global 'prin' (a nil value)
stack traceback:
    [string "?"]:3: in function 'g'
    [string "?"]:7: in function 'f'
    [string "?"]:10: in main chunk

というようにちゃんとstack tracebackが表示される.

MBAのOSをMavericksにしたらdisplay-battery-modeが使えなくなってた件

(emacs-version)
"GNU Emacs 24.2.1 (x86_64-apple-darwin12.2.1, Carbon Version 1.6.0 AppKit 1187.34)"

において、

(display-battery-mode 1)

とすると、`number-or-marker-p' 付近でエラーが発生するので、起動時にこれをevalするようになっていると、そこでエラーとなりそれ以降のelispが読み込まれない。理由は、Mountain Lion当時、pmsetが返す文字列は以下だった

$ pmset -g ps
Currently drawing from 'AC Power'
 -InternalBattery-0    99%; charged; 0:00 remaining

が、Mavericksになってその文字列に変更が加えられたから。

$ pmset -g ps
Now drawing from 'Battery Power'
 -InternalBattery-0    99%; charged; 0:00 remaining

battery.el内のbattery-pmset()がこれら文字列を解析して表示しているのだが、初っ端からして異なっているためにmatchせず、N/Aになる。

なので、battery.elのbattery-pmset()の定義内を

(re-search-forward "Currentl?y drawing from '\\(AC\\|Battery\\) Power'" nil t)

から

(re-search-forward "\\(Currentl?y\\|Now\\) drawing from '\\(AC\\|Battery\\) Power'" nil t)

に変更するpatchを作ればOK.

適当に作った.

--- battery.el 2013-01-02 05:37:17.000000000 +0900
+++ mavericks-battery.el    2013-10-23 12:11:13.000000000 +0900
@@ -543,7 +543,7 @@ The following %-sequences are provided:
     (with-temp-buffer
       (ignore-errors (call-process "pmset" nil t nil "-g" "ps"))
       (goto-char (point-min))
-      (when (re-search-forward "Currentl?y drawing from '\\(AC\\|Battery\\) Power'" nil t)
+      (when (re-search-forward "\\(Currentl?y\\|Now\\) drawing from '\\(AC\\|Battery\\) Power'" nil t)
    (setq power-source (match-string 1))
    (when (re-search-forward "^ -InternalBattery-0[ \t]+" nil t)
      (when (looking-at "\\([0-9]\\{1,3\\}\\)%")