4度目のTOEIC

渡航前の9月に受けたTOEIC(第157回)は,760(L390/R370)だった.
正直手応え的にはあまりなかったのでそれなりに意外だった.というのは,前に690とった時の方がリスニングで選択肢を先読みとかできてて,最終的な時間も余ってたのに対し,今回はかなりいっぱいっぱいだったから.まぁ,多分前回はわりと準備したのに対して,今回はほとんど対策ができなかったからだろう.

しかしこのぶんだと860以上あっても海外行くと苦労するんだろうな.僕もせめて海外行く前にTOEIC860ぐらいはとれるぐらい頑張っておくべきでした.
2月の試験は就活のためにも頑張りたい.

追記

一ヶ月ほど経過したわけだけども,現在の英語事情をメモ.

リスニング

CNN Student Newsが字幕なしで半分以上理解できるようになった気がする*1.あとはネイティブ同士の会話が雰囲気で理解できるようになった気がする.1対1で正確な理解が必要なときは聞き返し多発.

リーディング

昔から避けてきたこともあって糞遅く,内容の理解が伴わないことが多々ある.ただしこれは英語論文の話で,メールとか一部チャットはストレスを感じず読めるようになったと思う.英語論文は日本語の10分の1のスピードでしか読めない.

ライティング

メールなどで長文を書くと,主に冠詞がおかしいので曖昧だったり読みにくかったりするらしい.チャットとかになると文法のミスが頻発するが,アメリカ人は文法あんま気にしないからそこに関しては大丈夫とあるネイティブが言っていた.
書いてる本人としてはあまり時間を取らなくなった気がする.日本語に比べると遅いが,簡単な表現を使えばいいので英語論文を読むときの比ほどではない.

スピーキング

発音は悪く無いっぽい.文法も多分そこまで変じゃない.が,とっさに単語や表現が出てこないし,長い文章を作ろうとすると全くダメ.ここ一ヶ月はあんまりしゃべってないので,一番進歩してないかもしれない.

*1:たぶんニュース内容によるけど

アメリカ滞在中のもやもやを走り書き

今はこれを書くのに時間をかけたくないので,さらっと.

今日は単身銀行に行ってきた.結論から言うと,正直無茶をしてしまったと思う.
対応してくれた人には主に僕の英語の聞き取り力のなさで大変迷惑をかけた.すみません,そしてありがとう.下調べが足りなかったのも反省したい*1.一応口座はなんとか開設できました.

まとめ

  1. 英語(特に聞き取り)を超頑張る
  2. 時間は大切にする,計画力と行動力を身につける
  3. 物事は事前に調べる,情報の受け身にならない
  4. 会話に割り込む*2

*1:ただ,自分はなんでもかんでも身構えて調べてしまう癖があるので,とりあえずやってみるという度胸的には良かったと考えている.この悔しい思いは英語学習の原動力になるとも思う

*2:聞くだけで精一杯の今ではかなり難しいが,だからと言ってしゃべらないのはダメ

mcomplete.el においてidoやelscreenとの競合を回避

idoのすすめ

Emacsで,もしanythingを使わなくて,ファイルを開く関数に不満があったら,個人的にはidoがおすすめ.
http://www.bookshelf.jp/soft/meadow_23.html#SEC224


リンク先では酷評されてるし僕も最初は使えないと思ってしまったが,キーバインドをちょっと変更すると劇的に変わる.

(require 'ido)
(ido-mode 'file)
(ido-everywhere t)
(custom-set-variables '(ido-max-directory-size 'const))
(custom-set-variables '(ido-enter-matching-directory 'first))
(custom-set-variables '(ido-ignore-files (cons '"\\`\\." ido-ignore-files)))
(define-key ido-file-dir-completion-map (kbd "SPC") 'ido-exit-minibuffer)     ; ここ
(define-key ido-file-dir-completion-map (kbd "C-h") 'ido-delete-backward-updir)

C-xC-fから,ちょっと文字を入力して,スペースで確定していく*1.先頭から入力しなくてもよかったり,複数の候補をC-sやC-rで切り替えるのはiswitchbと同じ.
おそらくデフォルトで入っているから,上のコードを.emacsに追加するだけで動くはず.

mcompleteと仲良く

自分のemacs環境では,ido, iswitchb, elscreenなどを導入しているが,ここにmcompleteを加えるとファイルを開く時やバッファを切り替える時に動作がおかしくなるというエラーがあった.具体的には,次のようなメッセージが表示され,キーを打つたび "[No match]" が出てくるというもの.

Error in pre-command-hook: (args-out-of-range 39 206)

で,原因等はここが参考になりました.
http://hexe19.net/2008/05/11/46/emacs-elscreen-iswitchb-mcomplete-error-in-pre-command-hook/trackback
適当にまとめると,mcompleteはminibufferの上で動くのだが,iswitchbやidoなどと競合しないようにmcompleteのモードを無効にする関数リストを持っている.で,そのリスト定義はmcomplete.elの1000行目付近の次の記述で,デフォルトでidoやiswitchbの関数が登録されているここにelscreen-find-fileとかelscreen-find-and-goto-by-bufferとかを追加するというわけ.

(mapcar #'(lambda (f) (put f 'mcomplete-mode '(:mode off)))
        '(...

が,こちらの環境ではidoがうまく動かず,他に追加する必要があったのでメモ.

例えば,idoで一旦上の階層に戻ってから補間する場合,うちの環境では ido-delete-backward-updir をmode-offのリストに追加していないと例のエラーで操作ができなかった.
ということで,他にエラーを起こすかもしれない,keymapに登録されている関数を一応リストアップしておく.

ido-toggle-ignore
ido-toggle-case
ido-edit-input
ido-complete
ido-complete-space
ido-select-text
ido-exit-minibuffer
ido-toggle-prefix
ido-prev-match
ido-next-match
ido-toggle-regexp
ido-undo-merge-work-directory
ido-restrict-to-matches
ido-take-first-match
ido-restrict-to-matches
ido-completion-help
ido-magic-backward-char
ido-magic-forward-char
ido-magic-delete-char
ido-enter-switch-buffer
ido-fallback-command
ido-enter-dired
ido-next-match-dir
ido-prev-match-dir
ido-prev-work-directory
ido-next-work-directory
ido-delete-backward-updir
ido-delete-backward-word-updir
ido-up-directory
ido-reread-directory
ido-wide-find-dir-or-delete-dir
ido-push-dir
ido-push-dir-first
ido-wide-find-file-or-pop-dir
ido-forget-work-directory
ido-make-directory
ido-next-work-directory
ido-prev-work-file
ido-merge-work-directories
ido-delete-file-at-head
ido-copy-current-word
ido-copy-current-file-name
ido-toggle-literal
ido-toggle-vc
ido-enter-find-file
ido-fallback-command
ido-kill-buffer-at-head

あとEmacsWikiにあったiswitchbスタイルのfile-cache関数とかも競合したのでその類も登録.
しかし,そのfile-cache-iswitchb-file関数とicomplete.elをちゃんと解析したら,もっと競合が起こりにくそうな拡張ができそうな気もするが,スキルや時間対効果を考えると今動いてるしまぁこれでいいかという結論に.

ヘルプ機能

f1-[afmk]あたりはわりと馴染みがあったけど,他に知らない便利そうなのがあるのでメモ.

  • M-x find-function
  • f1-a apropos-command
  • f1-b describe-bindings
  • f1-f describe-function
  • f1-i info
  • f1-k describe-key
  • f1-l view-lossage
  • f1-m describe-mode
  • f1-p finder-by-keyword
  • f1-v describe-variable
  • f1-w where-is
追記

他の操作でもエラーが発生.たとえば,elscreenのfind-fileをread-onlyで開く関数とか,idoでカンマ入力による拡張とか.なんかいろいろと面倒くさくなって来たので,素直にicompleteを使おうかな.
というのも,iswitchbとかなら選択肢が少なくて,C-sとか途中から入力とかが意味を持ってたけど,M-xの補完候補はめっちゃ多くてあまり意味がないから.historyで頻繁に使うぐらいならキーバインドしたらいいと思うし.
とりあえず,補完中に第一候補で決定できるようにだけ拡張しようかな.

*1:デフォルトはRETかC-mで少々やりにくい.また,空白を入力する場合はC-qSPCで代用する

Emacsでviのfコマンドを実装

なんか最近elispを触っていないので,忘れない程度に小規模なコードを投下してみる.

viのfコマンド

僕はemacsのisearchが大好きで仕方がないのだが,やっぱりviのfコマンドもあっていいと思ったので,リハビリついでに書いてみた*1
viではコマンドモードでfに続けて文字(1文字)を入力すると,カーソルをその文字まで飛ばすことができる.isearchだと3アクションだが,これだと2アクションというわけ.

;; viのfコマンド
(defvar my-vim-fsearch-string " ")
(defun my-vim-fsearch (arg)
  (unless (or (equal last-command 'my-vim-fsearch-forward)
	      (equal last-command 'my-vim-fsearch-backward))
    (setq my-vim-fsearch-string (char-to-string (read-char))))
  (if arg
      (search-forward my-vim-fsearch-string nil t)
    (search-backward my-vim-fsearch-string nil t)))
(defun my-vim-fsearch-forward () (interactive) (my-vim-fsearch t))
(defun my-vim-fsearch-backward () (interactive) (my-vim-fsearch nil))
(global-set-key (kbd "C-)") 'my-vim-fsearch-forward)
(global-set-key (kbd "C-(") 'my-vim-fsearch-backward)

以上を.emacsに追加.これで, C-)C-( を入力すると,前方or後方fsearch(勝手に命名)となる.繰り返す場合はコマンドを連続して入力する.
このあたりは自分の好みで,オリジナルの動作とは異なっているので再現ではない.

カーソルを固定して張り付け

これもどっかにありそうだけど,例えば「ペースト,移動,ペースト,移動,...」みたいな作業があったとして,それをなんかキーマクロでやりたい時とやりたくない時があるじゃないですか.
まぁマクロ登録中でもコピーした文字列をペーストするとカーソルが動いてめんどくさい時があるかなぁと.
で,それは以下で対処する.

;; 移動しない張り付け
(defun my-yank ()
  (interactive)
  (let ((pos (point)))
    (yank)
    (goto-char pos)))
(global-set-key (kbd "C-@") 'my-yank)

今更ながら

bookmark使うよりはfilecacheをブックマーク的に使った方がいいことに気づいた.
anything.elユーザには関係ないかもしれないが,でもanythingはやっぱ自分のスタイルではない気がする.

*1:調べてないけど既にどこかにある気がする

Pythonを経由してC(C++)のプログラムからArduinoとシリアル通信

シリアル通信を使って,ArduinoにPC上のC(C++)プログラム側から指示する適当メモ.
C(C++)のシリアル通信はなんかめんどくさそうだし,Pythonだとシリアル通信が簡単よ,と聞いたのでとりあえずPythonで書いて,そのプログラムをC(C++)側から呼び出すことにしました.以下コード.

wrapper.cpp

#include <Python.h>

int main(void)
{
    Py_Initialize();

    // Get a reference to the main module.
    PyObject* main_module =
      PyImport_AddModule("__main__");

    // Get the main module's dictionary
    // and make a copy of it.
    PyObject* main_dict =
      PyModule_GetDict(main_module);

    FILE* file_1 = fopen("serial_com.py", "r");
    PyRun_File(file_1, "serial_com.py",
	       Py_file_input,
	       main_dict, main_dict);

    Py_Finalize();
    return 0;
}


serial_com.py

# coding: utf-8
import serial

ser = serial.Serial(2, 9600, timeout=1)
print ser.portstr
c = "\0"

# MAIN LOOP
while True:
    c = raw_input()
    ser.write(c)
    if(c == 'q'):
        break;

ser.close()


serial_test.pde

int sigPin = 13; // DIGITALの13番にオンボードのLED
int val = 0;      //読み取り値の変数

void setup()
{
  pinMode(sigPin, OUTPUT); // 出力に設定
  digitalWrite(sigPin, LOW);
  Serial.begin(9600);       // シリアル通信初期化
}

void flash()
{
  digitalWrite(sigPin, HIGH); // 出力オン
  delay(750);                 // 750ミリ秒待つ
  digitalWrite(sigPin, LOW);  // 出力オフ
  delay(750); 
}

void loop()
{
  //データが0個より多いとき
  if(Serial.available()>0){
    //データの読み込み
    val=Serial.read();
  }
  
  Serial.println(val);
  if(val == 97){
    flash();
  }
  val = 0;
  delay(100);
}


serial_test.pdearduinoに転送するプログラム.文字'a'を送るとDIGITALの13番ポートに出力が出るようなもの.一応これ単独でも,arduinoIDE上のシリアルモニタなどを使ったら簡単に動作が確認できる.
serial_com.py はループ中に入力された文字をシリアル通信で転送するプログラム.COMポートとかは直に入れています.さっきのプログラムをarduinoで走らせてから,こいつでpythonのシリアル通信がうまくいっていることを確認.
最後に, wrapper.cppserial_com.py を呼ぶ.Visual Studioコンパイルするとき*1は,Pythonのライブラリとインクルードファイルの場所を指定しておく.
以上でいい感じに動作してくれました.Python便利だなぁ.

*1:g++(gcc)ではオプション"-I/usr/include/python2.6 -L/usr/lib/python2.6/config -lpython2.6"

ステッピングモータで試すarduino

Arduinoから秋月のステッピングモータ(SPG20-332)を動かしてみた.やってみたらわりとあっさり動作してちょっとびっくり.
Arduinoはすばらしいな.以下はそのコード.

int pinP1 = 4; // DIGITALの4番    : WHITE
int pinP2 = 5; // DIGITALの5番    : RED
int pinP1B = 6; // DIGITALの6番   : YELLOW
int pinP2B = 7; // DIGITALの7番   : GREEN

void setup()
{
  pinMode(pinP1, OUTPUT); // 出力に設定
  pinMode(pinP2, OUTPUT); // 出力に設定
  pinMode(pinP1B, OUTPUT); // 出力に設定
  pinMode(pinP2B, OUTPUT); // 出力に設定
}

void step1(int dtime)
{
  // first step
  digitalWrite(pinP1, HIGH);
  digitalWrite(pinP2, LOW);
  digitalWrite(pinP1B, LOW);
  digitalWrite(pinP2B, LOW); 
  delay(dtime);  

  // second step
  digitalWrite(pinP1, LOW);
  digitalWrite(pinP2, HIGH);
  delay(dtime);
  
  // third step
  digitalWrite(pinP2, LOW);
  digitalWrite(pinP1B, HIGH);
  delay(dtime);
  
  // second step
  digitalWrite(pinP1B, LOW);
  digitalWrite(pinP2B, HIGH);
  delay(dtime);
}

void step2(int dtime)
{
  // 初期設定 + first step
  digitalWrite(pinP1, HIGH);
  digitalWrite(pinP2, LOW);
  digitalWrite(pinP1B, LOW);
  digitalWrite(pinP2B, HIGH); 
  delay(dtime);  

  // second step
  digitalWrite(pinP2B, LOW); 
  digitalWrite(pinP2, HIGH);
  delay(dtime);  
  
  // third step
  digitalWrite(pinP1, LOW);
  digitalWrite(pinP1B, HIGH);
  delay(dtime);  

  // forth step
  digitalWrite(pinP2, LOW);
  digitalWrite(pinP2B, HIGH);
  delay(dtime);  
}

void loop()
{
  step2(15);                 // 15ミリごと
}

setp1関数は1−1相励磁,step2関数は2−2相励磁.
なお,ステッピングモータの構造や制御法は, http://homepage1.nifty.com/rikiya/software/114stepping1.htm が参考になりました.
追記:実はうまくうごいていないかも.実用上はちゃんとドライバICを使うべき.

間違った文字コードの見え方

前から何となく気になっていたので,firefox*1上で超適当に試した結果をメモ.

以下見分け方:

ちなみに,◆の文字化けでは,ISO-2022-JPの場合だと◆の文字数が多いっぽい.

*1:on Ubuntu 10.04