4度目のTOEIC
渡航前の9月に受けたTOEIC(第157回)は,760(L390/R370)だった.
正直手応え的にはあまりなかったのでそれなりに意外だった.というのは,前に690とった時の方がリスニングで選択肢を先読みとかできてて,最終的な時間も余ってたのに対し,今回はかなりいっぱいっぱいだったから.まぁ,多分前回はわりと準備したのに対して,今回はほとんど対策ができなかったからだろう.
しかしこのぶんだと860以上あっても海外行くと苦労するんだろうな.僕もせめて海外行く前にTOEIC860ぐらいはとれるぐらい頑張っておくべきでした.
2月の試験は就活のためにも頑張りたい.
追記
一ヶ月ほど経過したわけだけども,現在の英語事情をメモ.
リスニング
CNN Student Newsが字幕なしで半分以上理解できるようになった気がする*1.あとはネイティブ同士の会話が雰囲気で理解できるようになった気がする.1対1で正確な理解が必要なときは聞き返し多発.
リーディング
昔から避けてきたこともあって糞遅く,内容の理解が伴わないことが多々ある.ただしこれは英語論文の話で,メールとか一部チャットはストレスを感じず読めるようになったと思う.英語論文は日本語の10分の1のスピードでしか読めない.
ライティング
メールなどで長文を書くと,主に冠詞がおかしいので曖昧だったり読みにくかったりするらしい.チャットとかになると文法のミスが頻発するが,アメリカ人は文法あんま気にしないからそこに関しては大丈夫とあるネイティブが言っていた.
書いてる本人としてはあまり時間を取らなくなった気がする.日本語に比べると遅いが,簡単な表現を使えばいいので英語論文を読むときの比ほどではない.
スピーキング
発音は悪く無いっぽい.文法も多分そこまで変じゃない.が,とっさに単語や表現が出てこないし,長い文章を作ろうとすると全くダメ.ここ一ヶ月はあんまりしゃべってないので,一番進歩してないかもしれない.
*1:たぶんニュース内容によるけど
アメリカ滞在中のもやもやを走り書き
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
*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.pde はarduinoに転送するプログラム.文字'a'を送るとDIGITALの13番ポートに出力が出るようなもの.一応これ単独でも,arduinoのIDE上のシリアルモニタなどを使ったら簡単に動作が確認できる.
serial_com.py はループ中に入力された文字をシリアル通信で転送するプログラム.COMポートとかは直に入れています.さっきのプログラムをarduinoで走らせてから,こいつでpythonのシリアル通信がうまくいっていることを確認.
最後に, wrapper.cpp で serial_com.py を呼ぶ.Visual Studioでコンパイルするとき*1は,Pythonのライブラリとインクルードファイルの場所を指定しておく.
以上でいい感じに動作してくれました.Python便利だなぁ.
ステッピングモータで試す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上で超適当に試した結果をメモ.
- Shift_JISを他で読む場合,EUC-JP,ISO-2022-JP,UTF-8どれも◆に"?"が入った文字がよく出る
- UTF-8を他で読む場合,EUC-JP,ISO-2022-JPは◆,Shift_JISは"縺"のような漢字がよく出る
- ISO-2022-JPを他で読む場合,どの文字コードも$と英字がよく出る
- EUC-JPを他で読む場合,ISO-2022-JP,UTF-8ともに◆,Shift_JISは半角カナがよく出る
以下見分け方:
- ($と英字)→ISO-2022-JP
- "◆"→とりあえずShift_JISにしてみる
- (半角カナ)→EUC-JP
- (漢字)→UTF-8
ちなみに,◆の文字化けでは,ISO-2022-JPの場合だと◆の文字数が多いっぽい.