ふつうに echo "hoge" >> log
でいいんですが、Mac の場合は ~/Library/Logs/
の下に出すといいようです。
ログファイルに出力される様子は、Console という OS X 標準アプリで tail -f
のように見れます。
下記は ~/Library/Logs/test.log
に出力する例です。
さあ、今日も毛を刈ろう。
ふつうに echo "hoge" >> log
でいいんですが、Mac の場合は ~/Library/Logs/
の下に出すといいようです。
ログファイルに出力される様子は、Console という OS X 標準アプリで tail -f
のように見れます。
下記は ~/Library/Logs/test.log
に出力する例です。
rpi から TI のLaunchPadに、I2C経由で1バイト送るテスト。
デバイスは MSP430G2553。Pull up してないけど動くw
rpi からコマンド送信して LauchPadのLEDを点灯/消灯してみる。
ほぼ、Example の msp430g2xx3_uscib0_i2c_07.c
のままで、※1の5行ほど追加。
#include <msp430.h>
volatile unsigned char RXData;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 = UCMODE_3 + UCSYNC; // I2C Slave, synchronous mode
UCB0I2COA = 0x48; // Own Address is 048h
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
IE2 |= UCB0RXIE; // Enable RX interrupt
P1DIR |= 0x01; // P1.0: LED ※1
while (1)
{
__bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
__no_operation(); // Set breakpoint >>here<< and read
// RXData
if(RXData > 0) // ※1
P1OUT |= 0x01; // ON ※1
else // ※1
P1OUT &= 0xFE; // OFF ※1
}
}
// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
RXData = UCB0RXBUF; // Get RX data
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
rpi の方は Raspberry Piで「I2C LCD Breakout」を使ってみた!のまんま
$ sudo vi /etc/modules
i2c-bcm2708
i2c-dev
$ sudo vi /etc/modprobe.d/raspi-blacklist.conf
#blacklist i2c-bcm2708
$ sudo reboot
$ sudo apt-get install i2c-tools
$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
LaunchPadのアドレスが読めたので、データを送信してみる
$ sudo i2cset -y 1 0x48 1
LED1(赤) 点灯
$ sudo i2cset -y 1 0x48 0
LED1(赤) 消灯
Mac の ClipboardPlain をちょっと直してみたのつづきです。
GitHub で 作者さんに Pull request を送ってみたら、あっさりマージしてもらえました。
次のタイミングで Mac App Store にアップデートするとのこと。
Pull request を送ったのは初めてだったのですが、思ったより簡単でした。外国の人とこんなに簡単にパッチのやりとりができるなんて、スゴイ時代です。
いまさらですが、インターネット素晴らしいです。
GitHub も最高に素晴らしいです。
Mac で テキストをコピペするときに書式を取り除いてくれるソフト ClipboardPlain をしばらく前から使っています。
とても気に入っていたのですが、1つ困った事がありました。
それは、メニュー項目の「Remove Format Automatically」を有効化すると、Finderでファイルのコピペができなくなることでした。
今まで我慢して使っていたのですが、昨日ふとソースコードが Github に置かれているのを発見しました。
とりあえず適当に直したので、お困りの方がおられましたら使ってみて下さい。
以下、使い方です。
もし、不具合がありましたら教えて下さい。 ちなみに、いじったソースはココにあります。
ソースがあるって素晴らしい。RMSバンザイ!
ダウンロードしたファイルを手でゴミ箱に移動するのが面倒だったので、シェルスクリプトを書きました。
ゴミ箱に移動するものは、.dmgなどをインストール中だと困るので
の両方を満たすものだけとしています。
ゴミ箱に移動するロジックは、コマンドラインからゴミ箱に捨てるシェルスクリプト をそのまま使わせてもらいました。
C-x C-f(find-file)などでファイルを開くときに、minibuffer でTABキーを押すとCompletionsバッファが開き、補完候補が列挙されます。
このとき、ファイルとディレクトリの区別がつきにくいので、ディレクトリに色を付けるようにしてみました。
ディレクトリがたくさんあるところに行くと、ちょっと重いかもです。
Mac で ページをスクロールするとき、Page Up/Down キーを押すとIビームカーソルがついてきません。
このため、スクロール後に Iビームカーソルを移動しようとすると、スクロール前の画面に戻ってしまい「ムキーッ」となることが多々あります。
この挙動をWindowsと同じようにするには、下記の内容で、~/Library/KeyBindings/DefaultKeyBinding.dict
というファイルを作ります。
// ~/Library/KeyBindings/DefaultKeyBinding.dict
{
"\UF72C" = "pageUp:"; // page up
"\UF72D" = "pageDown:"; // page down
}
私は、Home, Endキーの挙動もWindowsと同じようにしたいので、下記のようにしています。
MacでもWindowsでもLinuxでも pip が使えれば、どれもやりかたは同じです。
ここではvirtualenv環境にDjango入れてみます。
$virtualenv --no-site-packages -p /opt/local/bin/python3.3 django
$. django/bin/activate
$sudo pip install django
Django-1.5.4 が入りました。
$cd ~/test
$django-admin.py startproject django_test_0
$cd django_test_0
$python manage.py runserver
ブラウザで http://127.0.0.1:8000/ を開いてDjangoが起動しているのを確認。
GPIOのテストとして、WiringPi のインストール → LED点滅 → SW入力 やります。
$ssh -p 22122 rpi
$sudo apt-get install git-core
$cd ~/src
$git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
これで /usr/local/bin/gpio が入る
$ cd examples
$ make really-all
これでサンプルプログラムがビルドされる
上の写真のように結線して
$ sudo ./blink
LEDが1秒周期で点滅する
(3.3Vの結線と330Ωは不要でした)
上の写真のように結線して
$ sudo ./wfi
スイッチを押す→放すのたびに myCounter++ する様子がプリントされる
Waiting ... Done. myCounter: 1
Waiting ... Done. myCounter: 2
Waiting ... Done. myCounter: 3
Waiting ... Done. myCounter: 4
Waiting ... Done. myCounter: 5
残念ながら、今現在はXC8用のUSBライブラリはないようです。
しかし、近々リリースされる気配はあります。
どうやら、近年はUSB ライブラリ単体ではなくて、他のライブラリ(グラフィックやmTouch等)と同梱になったようです。
最新のMicrochip Libraries for Applications (v2013-06-15)をダウンロードして、その中の MCHPFSUSB Library Help.pdf を見ると、
Find out what the USB development team is working on and what will be out in the near future.
Description
The following are the projects that are being worked on. These may not be released in the next release but are in development
• Implement XC8 compiler support for PIC18 targets in the USB device demos
とありました。
ひさびさにPICやります。とりあえず、恒例のLチカです。
秋月で
を買って、下記をダウンロード。
ブレッドボードに秋月ボードを挿して、LEDを適当に接続。
File > New Project > Microchip Embedded > Standalone Project > PIC18F14K50 > None > PICkit3 > XC8 > led0
File > New File > Microchip Embedded / XC8 Compiler / main18.c > main
して、New File > Lチカのコードを書きます。クロックは秋月ボード上の12MHz Xtal を使うことにします。
PICkit3を接続して、秋月ボードにUSBケーブルを挿し+5Vを供給。
ビルドして、書き込み(Run > Run Project)。
これだけのことですが、勝手が分からずに時間がかかりました。
なお、書き込みだけではなく、PIC18F14K50 を PICkit3 でデバッグするには 別途 Debug Header が必要なので要注意です。
PICkit3 でデバッグしようとして、
A debug header is required to debug this device.
と言われたら、ひょっとするとそのデバイスは Debug Header が必要なPIC かもしれません。
Processor Extension Pak and Header Specification
の 「TABLE 1: REQUIRED DEBUG HEADERS BY DEVICE」という、9ページ目あたりのリストにあるものが「Debug Header が必要なPIC」と見て良さそうです。
PICの型番だけを抜粋すると、現時点では下記が「Debug Header が必要なPIC」のようです。
PIC10F200
PIC10F202
PIC10F204
PIC10F206
PIC10F220
PIC10F222
PIC10F320
PIC10F322
PIC10LF320
PIC10LF322
PIC12F508
PIC12F509
PIC12F510
PIC12F519
PIC12F609
PIC12HV609
PIC12F615
PIC12HV615
PIC12F617
PIC12F629
PIC12F635
PIC12F675
PIC12F683
PIC12F1501
PIC12LF1501
PIC16F505
PIC16F506
PIC16F526
PIC16F610
PIC16HV610
PIC16F616
PIC16HV616
PIC16F627A
PIC16F628A
PIC16F630
PIC16F631
PIC16F636
PIC16F639
PIC16F648A
PIC16F676
PIC16F677
PIC16F684
PIC16F685
PIC16F687
PIC16F688
PIC16F689
PIC16F690
PIC16F716
PIC16F785
PIC16HV785
PIC16F1503
PIC16F1507
PIC16LF1503
PIC16LF1507
PIC18F13K50
PIC18F14K50
PIC18LF13K50
PIC18LF14K50
PIC24F04KA200
PIC24F04KA201
PICkit3でデバッグしたいなら(ICEとして使いたいなら)、これらはできるだけ避けたほうが無難です。
Emacsで C-e するとコメントがあろうがなかろうが行末に飛びます。
いたって普通の動作です。
しかし、カレント行にコメントがある場合は、コメントではない部分の末尾に飛んでほしいと、以前から思っていました。
言葉にするとややこしいのですが、下の画像のようなことがしたかったわけです。
C-e すると、まずはコメントではない部分の末尾にジャンプ。
もう一度 C-e すると、行末にジャンプ。
さらにもう一度 C-e すると…、これ以降トグルです。
長年の希望が叶ったので記念に貼っておきます。
ちなみに、ソースの *
が付いている2行のコメントアウトを外すと、
コメントではない部分の末尾 → コメントの先頭 → 行末
と飛びますが、ちょっと煩雑すぎる気がしたので無効にしています。
これのつづきで、Raspberry Pi の電気代も考えてみたいと思います。
Raspberry Pi は24時間 常時電源ONで、Webサーバとして動かすとします。
ココによると、3.5W 以上食うことはないということです。
3.5W ✕ 24 = 84Wh/日 → 2.5kWh/月 ≒ 3kWh/月 とします。
Raspberry Pi 導入以前の電気代を114kW/月とすると、導入後は+3kW なので 117kW/月となります。
関西の場合は、ココで 114kW と 117kW を入力して差分をとります。
2,598 - 2,533 = 65円/月 と出ました。
65円/月 なら容赦なく常時ONにできます。
ここからは余談です。
私の Raspberry Pi (Type B) にはセンサやカメラ等はつけておらず、Mac のUSBポート(非Powered USB)につないでいるので、最大でも 500mA → 5V ✕ 0.5A = 2.5W のはずです。とすると同様の計算では44円/月 以下になります。
Mac mini 2012 は アイドル時 11W 未満 とのことですが、これをWebサーバとして使うと 273円/月 となります。
これを単純に比較すると、Raspberry Pi は Mac mini の 6倍以上安上がりということになります。
しかし、一方で、よく使う重めの Pythonコードで簡易ベンチを取ってみると Raspberry Pi は Mac mini の 30倍ほど遅いという結果も出ています。
何が安いか、考えどころです。
よく見かける「x 秒後に自動的にジャンプします。」な Javascript サンプルです。
JQuery は使っていません。「x 秒後」の数字の部分は 10, 9, 8, 7, ... と変化します。
リダイレクトするだけなら、ヘッダに下の1行を書き足せばいいのですが、
<meta http-equiv="refresh" content="10;URL=http://www.google.co.jp/" />
数字を変化させるとなると Javascript 書くしかないかなと。
ちなみに、クロージャを使っています。
Python の文字列の split()
は区切り文字による分割はできますが、「何文字ずつに分割する」ということはできないと思います。
Split string into strings by length? で Pythonic な解決方法を示してくれた方がおられました。
シンプルさに感動したので関数化して置いておきます。
KeyRemap4MacBook で Google Chrome のタブ切り替えを F11/F12 でできるようにしてみました。
~/Library/Application Support/KeyRemap4MacBook/private.xml
に下記を書き足します。
KeyCode, ModifierFlag の順に書かないとダメなようです。
ふつうに C-x C-f で開けます。
C-x C-f /ssh:ユーザ@ホスト#ポート番号:ファイル名
例:
C-x C-f /ssh:john@192.168.1.2#1022:/etc/hosts
ポート番号はデフォルト(22)のときは省略可です。
Raspberry Pi / Wheezy で、インストール後に最初にやることのおぼえがきです。
HDMIでディスプレイにつないで、
でログイン。
$sudo su
#adduser hoge <-- ユーザ 'hoge'を追加
#chmod +w /etc/sudoers
#vi /etc/sudoers
:
# User privilege specification
root ALL=(ALL:ALL) ALL
hoge ALL=(ALL:ALL) ALL <-- この行を追加
:
#chmod -w /etc/sudoers
$cd /etc/ssh/
$sudo cp sshd_config sshd_config.orig
$sudo vi sshd_config
Port 22 --> Port 1022とか
$ifconfig
$sudo reboot
ここまでやると ssh でつながるので、Ethernet ケーブルをつないで、PC から
ssh 192.168.xx.xx -p 1022
で入ります。
tzconfig は deprecated らしいので、下記で。
$sudo dpkg-reconfigure tzdata
Asia / Tokyo
$date
Sun Aug 18 09:42:34 JST 2013
現在時刻がJSTで表示されればOK。
まずはここまで。
以下は、Raspberry Pi のApacheに mod_wsgiをインストールしたときのメモです。
最初は mod_python を試そうとしたのですが、ココによると、
mod_python は古くてメンテされていないので、 mod_wsgi の方がイーンジャネ。
とのことなので入れてみたしだいです。流されやすくてすいません。
ほぼココのまんまです。
まずは mod_wsgi を入れます。Python3を使っているので mod-wsgi も Python3用のものを入れます。
$sudo apt-get install libapache2-mod-wsgi-py3
テストとして走らせる .py を入れるディレクトリを作ります。
$cd /var/www
$sudo mkdir test
テストとして走らせる .py をそこに置きます。
$cd test
$sudo vi wsgi0.py
-----------
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
-----------
バーチャルホストを設定します。
このRaspberry Pi のローカルIPアドレスは 192.168.1.2 とし、架空のDDNSサービス(ddns.net)で mynetというホストを登録した例です。
$cd /etc/apache2/sites-available
$sudo cp default hoge
$sudo vi hoge
-----------
NameVirtualHost 192.168.1.2:80
<VirtualHost 192.168.1.2:80>
ServerAdmin admin@hoge.mynet.ddns.net
ServerName hoge.mynet.ddns.net
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
WSGIScriptAlias / /var/www/test/wsgi0.py
<Directory "/var/www/test">
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
-----------
$sudo a2ensite hoge
Apache を再起動します。
$sudo /etc/init.d/apache2 restart
WWWブラウザで http://192.168.1.2/test にアクセスして 'Hello World!' と出ればOKです。
ルーターのポートを開放してあれば、http://mynet.ddns.net/test でも同様に 'Hello World!' と出るはずです。
map のようにリストを高階関数で回して、途中で終了したいときや途中から始めたいときに便利です。
takewhile:条件が成立しているうちは継続し、成立したら中断
>>> from itertools import takewhile
>>> l = [0, 1, 2, 3, None, 5, 6, 7, 8, 9]
>>> list(takewhile(lambda x: x != None, l))
[0, 1, 2, 3]
dropwhile:条件が成立しているうちは読み飛ばし、不成立になったらそこから継続
>>> from itertools import dropwhile
>>> l = [0, 1, 2, 3, None, 5, 6, 7, 8, 9]
>>> list(dropwhile(lambda x: x != None, l))
[None, 5, 6, 7, 8, 9]
他にも itertools には使いでがありそうなものが多いです。
Python3 では、filter や map がイテレータオブジェクトを返すらしく、Python2の習慣でリストのように扱おうとすると TypeError
が発生します。
>>> l = filter(lambda x: x % 2, range(10)) # 奇数だけ抜き出し
>>> l
<builtins.filter at 0x10ff1ff90>
>>> l[0]
TypeError: 'filter' object is not subscriptable
これを回避するには、下のように list() で包んでやればいいのですが、ちょっと冗長な気がします。
>>> l = list(filter(lambda x: x % 2, range(10)))
>>> l
[1, 3, 5, 7, 9]
>>> l[0]
1
やはりPython的には、リストの内包表記で書きなおす方法が自然なので、filter は下記のように。
l = list(filter(lambda x: x % 2, range(10))) # 奇数だけ抜き出し
↓
l = [x for x in range(10) if x % 2]
同様に map は下記のように。
l = list(map(lambda x: x * 2, range(10))) # 各要素を2倍する
↓
l = [x * 2 for x in range(10)]
reduce は… for で回す…くらいなら from functools import reduce
します… 。
割り算を繰り返している最中に、ゼロで割り算してしまったら、そこで ZeroDivisionError
という例外が発生します。
例外処理 try..except
を使わない not_used()
関数は、そこでプログラムが異常終了してしまいますが、
例外処理を使っている used()
関数は処理を中断せずに最後まで実行します。
プログラムにとって、途中で異常終了するのは最悪なことです。
とくにマルチユーザのプログラムでは、1人のユーザの操作が原因で全員の作業を中断させてしまうことにもなります。なので、このような致命的な事態はできるだけ避けなければなりません。
上の例のように、原因が分かりきっているバグはすぐに取ってしまえばいいですが、原因が予測できないケースや、原因が多岐にわたるケースもあります。
そのような場合は、エラーを避けるための事前確認処理として if .. elif .. else
を何個も入れることになり、結果として読みづらいコードになりがちです。
例外処理 try..except
を使えば比較的シンプルにエラー処理を書くことができ、開発時には想定していなかったケースにも対応しやすいです。
よく忘れるので、メモります。
同期が終われば、ファイルが復活しているはずです。
TimeMachineの操作が重いので、最近は Dropboxからファイルを復旧することの方が多くなってきました。
Emacs の Dired では、ファイルを選択してEnterキーを押すと、何でもかんでも Emacsで開こうとします。しかし画像や動画のファイルは専用のソフトで開きたいところです。
Mac ではファイルごとに関連付けられたデフォルトのアプリでファイルを開く open
コマンドがあります。
このコマンドと、以前試したQuick Look のこれを使って、 Dired で Enter を押したしたときに自動判別して開くようにしてみました。
下記では jpeg や png などの静止画は Quick Look で、avi などの動画や pdf は open
で開きます。
ウェブ上に置いてあるマニュアルや読み物は、ローカルに落としてじっくり読みたいものです。
wget で CSSや画像を含めてまるごと取得するには、下記の例のようにします。
wget -p -r http://diveintopython3-ja.rdy.jp/index.html
この例では Dive into Python3 日本語版 を取得しています。
web-mode.el ではweb-mode-tag-match
というコマンドで開始タグと閉じタグの間をジャンプできます。
これを html-mode で使うには、
(require 'web-mode)
(add-hook 'html-mode-hook
'(lambda ()
(define-key html-mode-map "\M-]" 'web-mode-tag-match)))
単純に上のようにすればいいです。
しかし、なんとなく mic-paren のカッコ間ジャンプと同居させてみたくなったので、下記のようなのを仕込みました。
これで、カーソル位置がカッコならカッコ間ジャンプ、それ以外ならタグ間ジャンプをしてくれます。
このエラーは、インポートしている .pyファイルが見つからないときに出ます。
果てしなく既出っぽいですが、他のモジュールを使うときの3通りの方法をまとめます。
例:main.py が /path/to/dir/sub.py をインポートする場合
インポートする側のソース(main.py)の先頭に下記を書き足す。
import sys
sys.path.append('/path/to/dir')
.bashrc 等に下記を書き足す。
export PYTHONPATH=/path/to/dir:$PYTHONPATH
ふだん、main.py を実行するとき、
$python main.py
としているのを、
$PYTHONPATH=/path/to/dir python main.py
として実行する。
カレントディレクトリ配下のディレクトリを指定する場合は、下記のように。
$PYTHONPATH=. python main.py
いずれの場合も、インポートされる側のディレクトリに__init__.py
を置くのを忘れないように注意。
/path/to/dir
|
+-- __init__.py
|
+-- sub.py
フレッツ光の2年縛りが解けたので、ADSLに変更します。
今月中にやらなければ自動更新されてしまい、2年後の契約満了月までに解約すると違約金が発生するらしいので。
固定電話は休止中のものがあるので、これを再利用の手続きをしてからADSLに変更しました。
以下は、フレッツ光からADSLに変更した時の個人的なメモです。
価格.comなどを参考に。
NTTに電話をかける。
ちなみに、NTT西日本では 0800-2000116(2013年7月現在 )。
土日祝 9:00-21:00。携帯フリーコールOK。
担当者さんにつながるまで気長に待つ。(10分ほどかかった)
「利用休止中の固定電話を再利用したいのですが」といえば話しが通じる。
下記を聞かれるので予め準備できればベター。
この電話でフレッツ光の解約もできるようなので、担当者さんにお願いする。
新しい電話番号を取得して、折り返し電話をくれるとのこと。
新しい電話番号の候補を5つほど教えてくれるのでメモを取って、その場で決める。
電話の工事日付を指定する(立ち会い工事)。
フレッツ光をいつ止めるか聞かれるので11日後(土日除く)以降の日付を指定する。
今回は Nexys.BB で。
電話番号は、先ほど復活させた電話番号を入力する。
利用開始日付は、フレッツ光が止まる11日後を指定する。
申込書は郵送で届く。
ウェブで解約手続きをする。
後は、郵送で送られてくるものを順次処理すれば完了です。
よく忘れるので、メモを残します。
見つけたはいいけど、そこへはどうやって行けばいいのか。
はい。Command
+ r
でファインダーで開けます。
コンテキストメニューにでも出してくれればいいのに…。
Dired でD
キーを押してファイルを削除したときに、直接消さずにゴミ箱に移動するようにするには、下記の1行を .emacs に追加するだけでOKです。
(setq delete-by-moving-to-trash t)
これのつづきです。
とりあえず、やっつけで作りました。ちょっと難ありです。
現状の問題点は、
一応 Dired でも使えます。
HTMLタグの含まれた文字列を Genshi に渡すと、>
や <
などがエスケープされてしまい、意図した動作になりません。
公式サイトのFAQ では3通りの解決方法を挙げていますが、その一つのMarkupクラスを使う方法を示します。
単純に、文字列をMarkupクラスでラップして渡してやればOKです。
以下に例を。
mkvmerge をコマンドラインで使い、英語音声を日本語に変更するのつづきです。
編集する mkvファイルが多い時は煩雑になるので、同じフォルダにあるすべてのmkvファイルを一括変更するシェルスクリプトにしました。
このスクリプトを、パスの通った場所か mkvファイルと同じ場所に置いて実行すると、下記のように日本語音声のトラックIDを聞いてきます。
$cd /video/test/hoge
$mkv.sh
71 files in /video/test/hoge
----------------------------
Track ID 0: video (V_MPEG4/ISO/AVC)
Track ID 1: audio (A_AC3)
Track ID 2: audio (A_AC3)
Track ID 3: subtitles (S_TEXT/SSA)
Track ID 4: audio (A_AC3)
Track ID 5: subtitles (S_TEXT/ASS)
Track ID 6: subtitles (S_TEXT/ASS)
Track ID 7: subtitles (S_VOBSUB)
INPUT 'Track ID' OF JP-AUDIO:2 <------ 入力
トラックIDを入力した後はただ待つだけです。元のファイルはorig
という名前のサブフォルダに待避します。
なお、ファイルによっては日本語音声のトラックIDが違うこともあるので、編集後のファイルの確認は必要と思います。
ファイル名に空白が入っていると、シェルスクリプトのforで回したときにファイル名が空白で分割されてしまい、期待した動作になりません。
そんなときの対処法は、単にシェル変数IFSに改行文字のみを設定すればいいです。
この変数は区切り文字を表すのですが、通常はこの変数にスペースやタブ文字が含まれていることが原因です。
Python2.7までは、CherryPy のインストールは不要でした。
公式サイトから一式をダウンロードして、その中身の cherrypyフォルダをスクリプトと同じ場所にコピーするだけ動いたのです。
しかし、Python3.3では今のところこの方法は使えないようです。
現在、公式サイトにある CherryPy の最新バージョンは 3.2.2 ですが、このバージョンはまだ Python3.3 に対応していません。
Python 3.3 で CherryPy 3.2.2 を使うと、下記のエラーが発生します。
AttributeError in cherrypy.process.plugins - threading._Timer
未対応箇所については、このあたり で議論されており、pip のパッケージ(usr/lib/python3.3/site-packages/cherrypy/)にある CherryPy 3.2.4 は対応済みの模様です。
ですので、ローカル環境で動かすには、
$sudo pip install cherrypy
とすれば、Python3.3で cherrypy が動きます。
リモートサイトに上げるときは、この pip で取得した cherrypy フォルダをアップロードすることになります。
少し前に、RN-42というBluetoothモジュールについて、microchip のサポート に質問したことがありました。
チケットを発行して質問を英語でポストすると、向こうの担当者さんがそれを見て回答してくれるという、一般的なバグトラッキングシステムです。
担当者さんと何度かやり取りしたおかげで原因が判明したので、「僕的には解決しました。ありがとう。」と伝えました。
そして10日ほど過ぎたある日、microchip からメールが。単に 「ステータスを Resolved にしたよ。」の知らせかと思いきや、
As a thank you for designing with Microchip products, we are offering you Free Shipping on your next Development Tool/Software order on microchipDIRECT. Simply enter this single-use coupon code, **, first at the final checkout screen. Offer expires 30/Sep/2013. Microchip reserves the right to expire the promotion at any time and without warning.
9/30までに microchip Direct で何か注文すれば、送料無料になるとのこと。
microchip Directで注文すると、小さなものでも送料が$9程度かかるので、これはありがたいです。
mkvmerge(MKVToolNix) は mkvファイルの編集に重宝します。
しかし mkvmerge のGUIはちょっと使いづらいので、コマンドラインで使うことが多いです。
下記は mkvmerge で mkvファイルのデフォルト音声を変更する方法です。 当然ながら、mkvファイルに日本語の音声トラックが含まれていないとできませんのでご注意を。
以下は、カレントディレクトリにある hoge.mkv を日本語音声に変更する例です。
まず、-i
オプションで mkvファイルの情報を見て、日本語音声っぽい TID(Track ID) を探します。(Macの場合)。
$/Applications/Mkvtoolnix.app/Contents/MacOS/mkvmerge -i hoge.mkv
File 'hoge.mkv': container: Matroska
Track ID 0: video (V_MPEG4/ISO/AVC)
Track ID 1: audio (A_AC3)
Track ID 2: audio (A_AC3)
Track ID 3: subtitles (S_VOBSUB)
Track ID 4: subtitles (S_VOBSUB)
Track ID 1
が英語音声、Track ID 2
が日本語音声だとすると、オプションとして --default-track 2
を指定すると、日本語音声がデフォルトになります。
具体的には、下記のようなコマンドになります。
$/Applications/Mkvtoolnix.app/Contents/MacOS/mkvmerge -o hoge_mod.mkv --default-track 2 hoge.mkv
hoge_mod.mkv を再生するとデフォルト音声が日本語になっていると思います。なっていない場合は、TIDの指定が間違っているので、別のTIDを試します。
コマンドラインオプションは、
が詳しいです。
シェルスクリプト化しました → mkvmerge で英語音声を日本語に変更するシェルスクリプト
今年の3月に購入した iPhone5 のWi-Fiが、最近特につながらなくなりました。
購入当初から、速度が遅かったりよく切れたりしていましたが、まだ許せる範囲でした。しかし、最近はアプリのダウンロードもできなくなる始末。最近話題の Google ハングアウトもつながった試しがありません。
「iPhone5 Wi-Fi」でウェブを探すと、やはり5GHzの無線ルータに買い替えるという対処法がゴロゴロ出てきます。
でも、すぐにルータを替えるお金なんてないので、ここは対処療法でなんとかしてみます。
その場しのぎな対処法は、
ルータのオートチャネルの設定を無効化し、速いチャネルを手動で設定
です。どこが速いチャネルなのかは実際に iPhone の速度ベンチをとらないと分かりませんので、手間はかかります。
私のルータ WN-G300DGR では、下記のように設定しました。
参考までに、ベンチを下記に。
↓オートチャネル
↓固定チャネル(7CH)
チャネルを手で設定してからは、切れることが少なくなりました。
難点としては、その時々の隣近所の電波の混みあいで速いチャネルは変わるので、その都度チャネルを変える必要があることです。
辛抱できなくなったら、その時 5GHzルータを買うことにします。
RS Components の製品ページから両者の仕様を比較してみました。
というわけで主な違いは、メモリ、USBポート数、Ethernetポートの有無 の3点です。
有線でネットにつないで何かしたい場合は Type B 一択になりそうです。USB経由でLANアダプタ等もできなくはないですが…。
なお、上記の価格は RS Components のものです。
下記は共通仕様です。
最近のEmacsは Shift + カーソル移動でテキストを選択できるようになっているようです。
全選択(Select All)もそれっぽいのが欲しくなったので、似たようなのを作ってみました。
Monolingual は、普段使わない言語リソースを削除してディスクを節約するソフトです。
システムディスクがSSDになったこともあり、できるだけ容量を節約したいときには重宝していました。
しかし、Mac版の CCleaner には Monolingual の機能が含まれているようです。
まず、左側の Options > Languages と進み、不要な言語を設定します。(必要な物だけ チェック)
次に、左側の Cleaner > Mac OS X タブと進み、Unneeded Languages をチェックします。
あとはいつものように、掃除をするだけで不要な言語リソースを削除してくれます。
CCleaner はWindowsでは有名な掃除ソフトですが、Mac版も素晴らしい出来のようです。
あまりソフトの紹介は得意ではないのですが、久々に感動したのでつい。
recentf-ext のディレクトリを色付けに引き続き、recentfネタです。
recentf で列挙されるパスのホームディレクトリ部分(Mac では "/Users/hoge"
など)を "~"
に置換します。
↑こういう表示が、↓こういう感じになります。
既出っぽいネタですが、これで視認性がよくなりました。
人は俺を「recentfマスター」と呼ぶ の recentf-ext.el を使うと、最近使ったファイルだけでなくディレクトリも列挙されるようになります。
あとは、そのディレクトリを選んでEnterを押すだけで dired で開けます。これに慣れてしまうと、M-x dired
や C-x C-d
してディレクトリ名を入力なんて、やってられません。大抵の場合は、recentf して近場のディレクトリ名をインクリメンタルサーチして Enterすれば事足ります。
とても便利になりましたが、どれがディレクトリなのか見分けづらいこともあります。
そこで、ディレクトリだけを色付けするようにしてみました。
recentf がマイナーモードということもあって色付けには overlay を使いましたが、こういうものは本来 syntax-table か font-lock ですべきなのかもと思ったのは書いた後でした。
コマンドラインでのディレクトリ移動が楽になる z を bash で使うためのメモです。
z
は、簡単にいえば cd
で移動したディレクトリの履歴を取ってくれて、その後に移動する時の入力補完に使おうというものです。autojumpもいいのですが、こちらのほうが入れるのが楽なので。
パッケージなどはないので、手動で入れます。といっても z.sh というシェルスクリプト1個だけです。
インストール先としては、とりあえず ~/bin
にしときます。~/bin
がない場合は、適宜掘ります。
https://github.com/rupa/z から z.sh をダウンロードして、~/bin
に置きます。
その後、.bashrc に以下の1〜2行を追加します。
PATH=$PATH:$HOME/bin # 今回、初めて ~/bin を掘った場合のみ追加
source ~/bin/z.sh
編集が終わったら、
source ~/.bashrc
として、.bashrc
を再読み込みします。これで z
が使えるようになっているはず。
どこかに cd
すれば、それを z
が履歴として保存してくれます。
ためしに、
$cd /usr/local/share/info
$cd /var/log/cups
とカレントディレクトリを移動したあとで z
と打ってみます。
$z
4 /private/var/log/cups
8 /usr/local/share/info
引数なしで z
を実行すると移動履歴が表示されます。(4とか8はランクかな?)
z
でカレントディレクトリを移動するには、cd
と同様に
z 移動先ディレクトリ
としますが、この移動先を入力するときにTABキーによる補完が効くというわけです。
z log
とタイプした後、TABキーを押すと、z /private/var/log/cups
と展開されます。
同様に z sh
では、z /usr/local/share/info/
と展開されます。
キーワードが一致すれば、先頭・末尾に限らず何でもいいので、うろ覚えで移動が可能です。
適当ですが、西暦→和暦変換プログラムをPythonででっち上げました。
厳密な用途(誕生日計算など)には使えないです。
とりあえず平成があれば十分なのと、なんしか今は時間ないので。
そろそろ重い腰を上げて、 Python 3.xx に移行することしました。
しかし、いっぺんに切り替えるのは怖いので、 virtualenv を使って Python2系 と Python3系 を同時に使えるようにしてみたいと思います。
また、今までメインで使っていた 2.7系は Python.org のインストーラ(.dmg)から入れたものでしたが、この際 MacPorts に統一したいと思います。
まずは、ココを参考に、今まで入っていた Python2.7系を消します。これは、 /Library/Frameworks/Python.framework/Versions/2.x
に入っています。
次に port で Python を探します。
$sudo port -d
$port search python*
:
python26 @2.6.8 (lang)
An interpreted, object-oriented programming language
python27 @2.7.5 (lang)
An interpreted, object-oriented programming language
python31 @3.1.5 (lang)
An interpreted, object-oriented programming language
python32 @3.2.5 (lang)
An interpreted, object-oriented programming language
python33 @3.3.2 (lang)
An interpreted, object-oriented programming language
:
たくさんありますが、今回は3.3と2.7を入れてみます。
$sudo port install python33 python27
$which python
/opt/local/bin/python
$python --version
Python 2.7.5
この状態では、2.7系が有効になっているようです。
つぎに virtualenv を入れます。
$sudo pip install virtualenv
では早速、3.3環境と2.7環境を作ってみます。
$cd ~/test/python
$mkdir env
$cd env
$virtualenv -p /opt/local/bin/python3.3 33
$virtualenv -p /opt/local/bin/python2.7 27
これで、~/test/python/env/
の中に 3.3環境と2.7環境ができました。
まずは 3.3環境を使ってみます。その環境のPythonを使うには、そのディレクトリのなかにある bin/activate を source します(って日本語?)。
$. ~/test/python/env/33/bin/activate
(33)~$python --version
Python 3.3.2
activate
すると、プロンプトが変わります。
次に、もうひとつターミナルを開いて、2.7環境を使ってみます。
$. ~/test/python/env/27/bin/activate
(27)~$python --version
Python 2.7.5
このように、異なる環境のPythonを同時に走らせることができるので、バージョンやインストールされているパッケージの違いによる挙動の違いを比較する場合などは手軽に試すことができます。
コマンドラインで使える JSON Lintのつづきです。
どうせなら Emacs で Flymake したいなぁという話しです。
JSON Lint 以外に必要な物は下記3つです。
それぞれダウンロードして、load-path の通ったところに置き、下記を .emacs に追加します。
(require 'json-mode)
(add-to-list 'auto-mode-alist '("\\.json$" . json-mode))
(require 'flymake-json)
(add-hook 'json-mode-hook 'flymake-json-load)
これで *.json を開くと、エラー行に色がつくようになります。
次のエラー行に飛ぶには M-x flymake-goto-next-error
とします。
JSONの構文チェックツールとして JSON の Lint があります。
ウェブ上で簡単に検査できる JSONLint - The JSON Validator もありますが、機密製の高いデータの場合は使いたくありません。
JSONはプログラムではなくデータなので、出来ればこういう類のものはローカル環境で使いたいものです。
ローカル環境のコマンドラインで使えるものとして、その名もズバリ JSON Lint があります。
インストールは npm で一発です。
$sudo npm install jsonlint -g
下記は使用例です。
$cat test.json
[{ "name":"吉田", "age":20, "drink":["ファンタ", "ビール"]},
{ "name":"田中", "age":21, "drink":["コーヒー" "コーラ"]},
{ "name":"佐野", "age":50, "drink":["日本酒", "焼酎"]}]
$jsonlint test.json
[Error: Parse error on line 2:
...21, "drink":["コーヒー" "コーラ"]}, { "name":"
-----------------------^
Expecting 'EOF', '}', ':', ',', ']', got 'STRING']
データに2バイト文字が含まれていると少し指摘箇所の桁がずれますが、エラー行は分かります。
Emacs を使っている時にシェルを使いたいときは M-x shell
とするのですが、今ひとつ使い勝手がよくありません。
少し億劫に感じてきたので、最近はこんなものを使っています。
ちょこっと確認したいときなどは、
M-x term
とたたくC-x k
で抜けるとしています。抜けるときはシェルバッファとプロセスは毎回消します。
term
というコマンド名には別のコマンドが割り付けられていますが、とりあえず気にしないということで…。
以前はRAWイメージをdd
コマンドで書き込んだり、専用のツールでSDカードを作っていましたが、今はもっと簡単な方法があるようです。
この方法は NOOB(New Out Of Box Software )という、初心者(newbie)向けのやり方のようですが、
という特徴があります。4GB以上のSDカードならこちらのほうが早くて簡単かもしれません。
やり方は Windows / Mac / Linux どれも似たようなものですが、下記に Mac の例を書きます。
この後、Raspberry Pi のオプション設定画面になりますが、起動確認だけなら何もせずに Finish
を選ぶといいです。
するとコンソールに落ちるので、ここで
$startx
とでもすると X が起動します。
再起動するとインストールしたディストリで起動しますが、これ以降のログインは(ユーザを作っていない場合は)下記のデフォルトユーザが使えます。
Python でもスクラッチバッファで対話したい のつづきです。
メジャーモードごとに eval-region を切り替えるようにしてみました。簡単な割に便利です。
これで、スクラッチバッファでもそうでなくても M-x eval-region
すると、そのメジャーモードにふさわしい eval-region が呼び出され、リージョンの評価結果をプリントするようになります。…といっても、今のところ Python, Ruby, ELispだけですが。
各モード用の eval-region-xxx
の関数定義は共通化すればシンプルになりそうですが、早すぎる最適化を招きそうなのでこのまま放置です。
fset / setf と、とてもまぎらわしいので、備忘録的においておきます。
テストとして、挨拶文を表示するgreeting
という関数を朝用と夜用にすげ替えてみます。
これでいいのか、今ひとつ自信ないです…。
摂氏(Celsius) と 華氏(Fahrenheit) をグラフで表してみました。
グラフ作成ソフトの gnuplot で下記を実行するだけです。
$gnuplot
gnuplot> c2f(x)=(((9 / 5.0) * x) + 32)
gnuplot> plot c2f(x)
gnuplot> set grid
gnuplot> set xr[0:100]
gnuplot> set xl "Celsius [°C]"
gnuplot> set yl "Fahrenheit [°F]"
gnuplot> set xtics 5
gnuplot> set ytics 20
gnuplot> replot
gnuplot> set terminal png
Terminal type set to 'png'
Options are 'nocrop font "arial,12" fontscale 1.0 size 640,480 '
gnuplot> set out "c-f.png"
gnuplot> replot
gnuplot> quit
部品屋でボーレート設定用の Xtal を探すときはこの式で事足ります。
しかし、手持ちのジャンク箱から適当なクリスタルやセラロックを引っ張りだしてボーレート設定に使いたいときなどは、できるだけ誤差の小さいものを選びたいものです。
手前味噌ですが、クリスタルの周波数と目的のボーレートをキーボードで入力して、誤差を求めるPythonプログラムを書きました。
$baud.py
Xtal frequency [MHz]:1
baud rate [bps]:9600
--> err:0.16[%]
上の例では 1MHz のクリスタルを 9600pbs で使った場合の誤差を求めています。
UARTのボーレート設定に使う Xtal の周波数は
周波数[Hz] / ボーレート[bps] = 整数
となるものを選ぶと、理論上の誤差が0となり精度が最も高くなります。
つまり Xtal の周波数を Hz に直してボーレートで割り切れたら、それは UART用のXtalと思っていいでしょう。
ただしマイコンの多くは分周比が固定されているので、その場合は更にその分周比(8, 16 など)でさらに割ってやります。
例えば、AVRで 7.3728MHz を 115200bps で使うとすると、AVRの分周比が16の場合では、
7372800 / 115200 / 16 = 4
と割り切れて整数となります。ですので、この周波数 7.3728MHz はUARTのボーレート設定用に使えるとわかります。
ボーレート設定用としてよく使われるものは、
1.8432MHz
3.6864MHz *
7.3728MHz *
11.0593MHz *
14.7456MHz
などがあり、いずれも端数つきの周波数となります。
ノイズマージンやマイコンの動作スピードを考えると、5〜10MHz のものが使いやすいので、このリストの*
印のあたりがいいかもしれません。
ちなみに、よく見かける端数つきの周波数 3.58MHz(3.579594MHz) はボーレート設定用ではなく、NTSC等のビデオ信号用として使われます。
まずは基本形、セレクタ1つです。例として p
要素の文字を赤にしたい場合を考えます。
p {color:red} // <p> すべてに適用
p.menu {color:red} // <p class="menu"> に適用
p#ss0 {color:red} // <p id="ss0"> に適用
さて、このセレクタをスペースかカンマで区切って、2つ以上指定した場合はどうなるかを見てみます。
結論から言うと、
となります。それぞれ例を示します。
スペースで区切ると、HTML階層の下(内側)にある要素を示します。たとえば、
<div class="subj">
<p>驚愕の真実</p>
</div>
<p>コメント</p>
上記のHTMLで 驚愕の真実
の部分だけ文字色を赤にするには、p
要素の前にスペースで区切ってクラスを置き、
.subj p {color:red} // クラスが subj の親要素の内側にある p 要素に適用
とします。コメント
の部分の p
要素の文字は黒のままです。
親要素の id
で指定する場合は同様に id
を前に置きます。
#ss2 p {color:red} // id が ss2 の親要素の内側にある p 要素に適用
すべての div
要素の内側にある p
を指定したいなら、下記のようにします。
div p {color:red} // div の内側にあるすべての p 要素に適用
要するに、クラスでも id でも要素名でもなんでも可です。
カンマで区切ると、列挙したセレクタすべてに適用します。たとえば、
<p id="ss0">驚愕の真実</p>
<p id="ss1">関連URL</p>
<p>コメント</p>
上記のHTMLで 驚愕の真実
と関連URL
の文字色を赤にするには、セレクタをカンマで区切り、
#ss0,#ss1 {color:red} // id が ss0 もしくは ss1 であるすべての要素に適用
or
p#ss0,p#ss1 {color:red} // id が ss0 もしくは ss1 の p 要素に適用
とします。
例 16進数 2進数
NOT '~' ~0x04 => 0xFB (~0000_0100 => 1111_1011)
OR '|' 0x26 | 0x14 => 0x36 ( 0010_0110 | 0001_0100 => 0011_0110)
AND '&' 0x26 & 0x14 => 0x04 ( 0010_0110 & 0001_0100 => 0000_0100)
XOR '^' 0x26 ^ 0x14 => 0x32 ( 0010_0110 ^ 0001_0100 => 0011_0010)
実際にはビットマスクを使って下記のようにすることが多いです。
mask = 0x04; // 0000_0100
PORTB |= mask; // bit2 を立てる
mask = 0x04; // 0000_0100
PORTB &= ~mask; // bit2 を寝かす
マスクを一旦 NOT して、それを AND するという2段階が必要
mask = 0x04; // 0000_0100
PORTB ^= mask; // bit2 を反転させる
元のビットが 1 のときに XOR を使うとビットを寝かせることができるので、AND の代わりに使えそうです。AND が2段階必要なのに比べるとシンプルにも思えます。
しかしこの方法は、元のビットが想定外に0に変化してしまうと、XOR の結果は 1 になる(立ってしまう)ため、下手をすればバグの元となります。
特に割り込み許可フラグや状態遷移のフラグなどにこの手の操作をしてしまうと、盛大にバグる上に発見が難しいです。
なので、XOR のそういう使い方は避け、純粋にビット反転の用途のみに使うべきです。
なぜか、ときどき AVR Dragon が使えなくなります。
PCの電源は落とさずにスリープしながら使っているのが原因かもしれないのですが、再現性100%というわけでもなく、今ひとつはっきりしません。その度にUSBケーブルをつなぎ直したりするのですが、いつも手間取ってしまうので、うまくいく手順の一例を下記に書いておきます。
AVR Dragon の ISPコネクタをターゲット基板に接続している状態で、次のとおりに行います。
これでいつものように、F5 を押せばステップ実行できるようになるはず。
ウェブ上の言語処理系(インタープリタ or コンパイラ)codepad です。
左のリストから言語を選び、右のテキストボックスにプログラムを書いて Submit ボタンを押せば、下のように実行結果を出力してくれます。
コンパイラをインストールしていない環境や、ちょっとしたサンプルコードの確認など、地味に出番があります。
選択できる言語には C や C++ に紛れて、なにげに関数型言語や Lisp があるのが面白いです。
とりあえずよく忘れるものだけ。
if [ file1.c -nt file2.c ]; then
echo "file1 is new"
else
echo "file1 is old"
fi
-nt
は newer than です。 -ot
では older than になります。
if [ "`cmp file1.c file2.c`" ]; then
echo "differ"
else
echo "equal"
fi
条件式の中をダブルクォートで囲まないと、-bash: [: too many arguments
といわれます。
if [ -e file1.c ]; then
echo "exist"
fi
if ! [ -e file1.c ]; then
echo "NOT exist"
fi
EDAのEagleでコマンドバーで座標を指定して線を引く方法です。
たとえば、部品登録する際にパッケージを描きますが、それの外形線を引くときなどに便利です。
下記のような外形線を引きたいとします。
まず、原点を部品の中央として、4スミの座標を求めます。下のような絵をチラシの裏にでも描くことになるでしょう。
さて座標が決まれば、あとは実際に線を引いていけばいいのですが、せっかく座標がわかっているのに、描画エリアを拡大/縮小しながらマウスでポチポチクリックしていくのはバカバカしいです。ですので、Eagleのウィンドウの上の方にあるコマンドバーに座標を打ち込んでいきます。
たとえば、先ほどの絵で左上の座標から時計回りに入力していく場合は、コマンドバーに下記のように入力します。
wire
(-6.7 12.8)
(6.7 12.8)
(6.7 -12.8)
(-6.7 -12.8)
(-6.7 12.8)
1行目の wire
は線を引くコマンドです。2行目以降が座標で、(x y)
の形式で指定します。それぞれの行末でEnterキーを入力し、すべての座標を入力し終えたら、ESCキーを押せば wire
コマンドから抜けます。なお、コマンドバーでは矢印キーの上下で入力履歴が使えます。
スルーホールやSMDパッドも同様の座標指示で配置できます。
ちなみに、外形線のレイヤと線幅は下記のようにするとよいと思います。
これらは、change
コマンドや右クリックメニューのProperties
で変更できます。
比較的最近のGCCで二次元配列の初期化をする話しです。
char arr[][] = {{1, 2, 3, 4}, {6, 7, 8, 9}};
などと書くと、コンパイラから次のように文句を言われます。
Error 2 array type has incomplete element type
Warning ではなく Error です。エラーメッセージにはelement type
とあるので、型がおかしいように思えますがそうではなく、単純に要素数を明示してないのが原因です。ですんで、
char arr[2][4] = {{1, 2, 3, 4}, {6, 7, 8, 9}};
といういうふうに、要素数を明記してやれば回避できます。一次元配列では要素数は省略できますが、多次元では省略不可のようです。
GCCの仕様変更によるものらしいです。
前回のつづきです。
今度はキーボードとして認識させてみます。
RN-42の設定は以下のとおり。
コマンドモードで上記を設定した後に RN-42 の電源を切/入し、PCのBluetooth管理でキーボードとして認識させます。
あとはマウスの時と同様にTeraTerm からレポートを送信してテストします。
キーボード用のレポートは1つにつき11バイトで構成されますが、キーボードの場合は通常、押す/離すでレポートを2つ送信することが多いです。
FD 09 01 04 00 0B 00 00 00 00 00 ; Alt+h
FD 09 01 00 00 00 00 00 00 00 00 ; release all
ここでは2列で書いていますが、バイナリファイルにする場合は下記のように連続して書き、22バイトとします。
無事レポートが届けば、RN-42が Alt+h
を押してくれるので、下記のようにTeraTermのヘルプメニューがプルダウンします。
遅ればせながら、Bluetoothモジュール RN-42 の評価基板をテストしています。
HIDマウスとしての動作を確認できたので、その記念動画です。
この状態ではまだマイコン等は接続しておらず、Mac --> (USB SERIAL) --> RN-42-EK --> (Bluetooth) --> Mac というループバック環境です。
MacでのBluetoothの接続状態は下のような感じです。
FireFly-XXXX
として認識されています。これが Connected(緑色)なら接続は正常です。この状態で、RN-42 の UART(RxD) に対して マウス用のレポートを送信すれば、マウスとして動作します。
レポートは(テストなので)Macからシリアル通信で送ります。
Mac > Parallels Desktop > Win XP > COM4(USB Serial) > TeraTerm > ファイル > ファイル送信 > バイナリファイル で送信。
マウスのレポート用のバイナリファイルは下記のような7バイトです。
FD 05 02 00 0A 00 00
この例では0A
がX座標の移動量です。これを送信した瞬間に、マウスポインタが右に43ピクセルほど移動します。レポートの移動量と画面上の移動量が一致していませんが、これはおいおい調べることにします。
以下は RN-42 の設定です。
以下、メモ書きです。
$$$
によるコマンドモードには入れないFireFly-XXXX
を削除(disconnect ではなく、remove)した後に、Teraterm から $$$
を入力する$$$
が届かない模様通信などに用いるリングバッファのサンプルです。
このサンプルでは、バッファの状態をグラフィカル(笑)に表示するので動きがわかりやすいかもしれません。
バッファに書き込むライトポインタとバッファから読み出すリードポインタがあり、ライトポインタはリードポインタを追い越しません。
これにより、まだ読み出されていないデータは上書きされることはありませんが、書こうとしていたデータは捨てられます。
それを防ぐためには、書込み/読出しの頻度差(通信速度差ともいえます)に見合ったバッファサイズに調整する必要があるでしょう。
UARTのもっとも単純なサンプルを置いておきます。
デバイスはATMEGA88P、クロックは工場出荷状態の内蔵RCオシレータで9600bpsです。
このままでは実用的でないです。
とくに受信部分は割り込み処理とバッファが別途必要ですがそれはまた後日。
AVR Studio と AVR Dragon の組み合わせで debugWIRE を使ってデバッグをする方法について書きます。
debugWIRE は 6ピンのISPコネクタで接続するので、結線自体はふつうにISP書き込みするのと同じです。
ただ、debugWIRE を使うには、事前に AVR のフューズビット DWEN を 1 にしておく必要があります。フューズ操作は、デバイスによっては ISP接続ではできないものもあり、 AVR Dragon でそのようなデバイスのフューズを操作するには、ISPコネクタでの接続ではなく HVPP ソケットを使わなければなりません。
ですが、買ったままの AVR Dragon は HVPPソケットはスルーホールパターンのみでソケットは実装されていないので、HVPP を使いたいときは、事前に別途 ZIFソケット等をハンダ付けしておく必要があります。
これらのことは特に、新しい環境だったり初物のマイコンだったりすると割とハマリやすいので、以下に手順を残します。
まずは AVRマイコンの DWEN ビットを ON します。
AVR Studio を起動し AVR Dragon と PC をUSBケーブルでつなぐ。
AVR Dragon の HVPP ソケットに AVRマイコンを差し込む。
AVR Studio > Tools > Device Programming
Interface = HVPP > Apply
左ペインの Fuses を選択し、 DWEN をチェック。 Program を押す。
次に HVPPソケットから AVRマイコンを外してターゲット基板に実装し、ISPコネクタと接続します。
debugWIRE でデバッグするのに最低限必要な結線を下図に示します。
ここで、ターゲット基板に専用の電源回路がある場合(ふつうはこれ)は、ISPコネクタの 2番ピン(VTG)は接続しません。
ターゲット基板に電源回路がない場合は、しかたないので接続します。ただし、その場合は AVR Dragon から+5Vを供給することになるので、ターゲット回路の電源系は+5Vとなります。もし 3.3V系のICなどが接続されている場合は壊れる可能性があるので注意が必要です。
結線ができたら、あとはふつうにデバッグを始められます。
ターゲット基板の電源を入れます。
Alt
+ F7
を押して プロジェクトのプロパティを開き、左ペイン > Tool > Selected debugger/programmer = AVR Dragon, Interface = debugWIRE
ソースにブレークポイントを仕掛けて、F5
(Continue)します。
実行中は AVR Dragon の赤LEDは点灯せず、緑が点灯/点滅しています。もし、赤が点灯している場合は何かがおかしいです。
デバッグまでの手順は以上です。
上の結線図にもありますが、ISPコネクタの2番(VTG)はターゲット基板に接続する必要はありません。このピンは AVR Dragon から 5V が出力されており、これをターゲット基板の電源として使うこともできますが、単純なブレッドボード上での評価用と割り切ったほうがいいと思います。特にターゲット回路の電源が5Vより低い場合(3.3V系など)はターゲット回路を壊す可能性があるため、このピンはオープンのままのほうが無難です。
ブレークポイントを仕掛けても止まらないとか、ローカル変数がウォッチできない場合は、コンパイル時の最適化が効いていることが原因かもしれません。その場合、次のようにして最適化を無効にします。
Alt
+ F7
を押して プロジェクトのプロパティを開き、左ペイン > Toolchain > AVR/GNU C Compiler > Optimization > Optimization Level = None(-O0)
AVR Dragon のマニュアルによると、大きい方のLED が黄色に光っているときは、AVR Dragon のファームウェアがコンフリクト(?)しているらしいので、ファームウェアをアップデートする必要があります。
ISPコネクタでの接続した状態で AVR Studio > Tools > Device Programming > Interface = ISP
とした時は Device Signature
, Fuses
, Lock Bits
はどれも読めず、下記のようなダイアログが出ます。
Unable to enter programming mode.
Please verify device selection, interface settings, target power and connections to the target device.
しかし、この動作は正常です。最初に書いたとおり、AVR Dragon でフューズビット等をR/Wするには、ISPコネクタではなく HVPPでの接続でしかできません。つまり AVR Dragon でこの手の操作を行うには、AVR Studio > Tools > Device Programming > Interface = HVPP
として、HVPPソケットにAVRマイコンを挿しこんで行います。ダイアログのメッセージを読むと、一見、結線や電源を見なおせばISP接続でも Device Signature
等が読み取れそうに思えますが、この場合はそうではないです。
以下環境です。
英語キーボードをつないだMacなのに、Parallels Desktop に入れた Windows XP ではなぜか日本語配列になってしまうのを治す方法です。
要はキーボードのドライバを入れなおせば解決するのですが、ちょっと煩雑なのでおぼえがきとして残しておきます。
Windows > スタートボタン > コントロールパネル > キーボード
「ハードウェア」タブ > 「101/102 英語キーボードまたは …」を選択 > 「プロパティ」ボタン > 「ドライバ」タブ > 「ドライバの更新」ボタン
「いいえ、今回は接続しません」をチェックして「次へ」 > 「一覧または特定の場所からインストール」をチェックして「次へ」 > 「検索しないで、インストールするドライバを選択する」をチェックして「次へ」 > 「101/102 英語キーボードまたは …」が選択された状態で「次へ」 > 上書きしてもいいか聞いてくるので、「はい」 > 「完了」ボタン
Windows を再起動
これで直るはずです。
下記は、参考までにこちらの環境です。
COMポートに何かをつないで通信したいときは、Windows PC の場合は TeraTerm Pro を使うのが定番です。
Macの場合は TeraTerm Pro の代わりに CoolTerm が紹介されていることが多いですが、実は無くてもできてしまいます。
COMポートは /dev/tty.xxxxxxx
という名前で列挙されています。このデバイス名さえ分かれば、下記のように screen コマンドを使うことで手軽に通信することができます。
$screen /dev/tty.usbserial-A101XXXX 115200
上記は、FTDIの仮想COMポートに 115200 bps で接続する例です。
たまに CSS を書くと毎回忘れているのでメモです。
margin、padding、border などに適用するときの、上下左右の指定方法です。
未だに、3つ指定したときのが覚えられない…
前回の、
Pyhton で GMail の smtp で UTF-8 なメールを送信
のつづきです。
今回は JPEG画像を添付してメールを送ります。
テキストだけのメールであれば MIMEText()で用意したメッセージだけでいいのですが、添付ファイルをつけるとそれ以外に2種類のメッセージが必要になります。
ここで、添付ファイル用のメッセージはファイルごとに必要です。 ですので、添付画像が1つであっても合計で3つのメッセージが必要ということになります。
コンテナ用のメッセージの中に、他の2種類を格納して送信します。From
や To
を設定するのは、コンテナ用のメッセージに対して行います。
よく忘れるので、メモしておきます。
トグル動作をさせたい場合や、内部のカウンタを使いたいときは、スタティック変数が欲しいところです。 Emacs Lisp ではクロージャを使えば可能です。
(defun cage1 ()
(lexical-let ((v 0))
(defun func1 ()
(setq v (1+ v))))) ; C-x C-e
これを評価すると、cage1
という関数が定義されます。しかし cage1
関数自体はコールされてないため、cage1
の中にある func1
関数はまだ未定義です。
なので、func1
をコールしたいと思っても、
(func1) ; C-x C-e
Debugger entered--Lisp error: (void-function func1)
(func1)
eval((func1) nil)
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp)
eval-region-or-last-sexp()
call-interactively(eval-region-or-last-sexp nil nil)
となり、エラーが発生します。
一旦 cage1
をコールしてやれば、 func1
が定義されるので、それ以後は問題なく func1
をコールできるようになります。
(cage1) ; C-x C-e
(func1) ; C-x C-e
=> 1
(func1) ; C-x C-e
=> 2
(func1) ; C-x C-e
=> 3
ここでもし 変数 v
がグローバル変数なら、外から値を変更できてしまいます。しかし、この v
はレキシカル変数(この場合 cage1
内部にある、一種のローカル変数)なので、外から変更できません。
外から変更しようとして、下のようにしても
(setq v 100) ; C-x C-e
(func1) ; C-x C-e
=> 4
(func1) ; C-x C-e
=> 5
というぐあいに、func1
が 101, 102, ... を返したりはせず、カウンタの動作として正しい値をカウントし続けます。
つまり、100 を setq した v
と func1
がカウンタに使っている v
は別物ということです。
カウンタではなく、トグル動作にしたい場合は
(defun cage1 ()
(lexical-let ((v nil))
(defun func1 ()
(setq v (not v)))))
とします。
Python から Google の Custom Search Engine を使って画像を検索するときに、いくつかハマりどころがありましたのでメモを残します。
あらかじめ、ライブラリはインストールしておきます。Python 用のライブラリのインストール等については、このあたりを参照するといいと思います。
あと、GoogleのID などはあらかじめ取得しておき、Google API コンソールを使える状態にしておきます。
つぎに、APIキーが必要です。ここの 左ペインの API Access をクリックし、下の方にある API key:
と書かれている 39文字の文字列がそれです。これをどこかにコピペしておき、あとで API を使うときに developerKey
パラメータとして指定します。
つぎに、専用の検索エンジンの設定を作ります。http://www.google.com/cse/all に行って検索エンジンを追加し、検索するサイトを *.jp
とかにしておきます。
作成ボタン > コードを取得ボタン と押していくと、JavaScriptのコードが表示されます。このコードの var cx = 'XXXX'
というのが 検索エンジンID です。
このIDをどこかにコピペしておき、あとで APIをコールするときに cx
パラメータとして指定します。
つぎに、左ペインの 検索エンジンの編集 の下にあるプルダウンメニューで先ほど作成した検索エンジンを選択します。画像を検索したい場合は、ここで下図のように、画像検索をオンしておく必要があります。
あとは、下にあるコードをファイルに保存し、先ほどコピペした2つの文字列をコードに埋め込みます。
いつのころからか、ブログに Gist を貼り付けると、前後に5行ほど空行が入ってしまうようになりました。
といいますか、行番号の対応がずれてしまうのか、とにかく見栄えがよくありません。
対策としては、ココ によると、CSS を追加してやれば良さそうです。
以下は Blogger での手順です。
1.Blogger にログイン
2.テンプレート > カスタマイズ > 上級者向け > CSS を追加 とたどり、下記を入力
/* for Gist */
.line-numbers, .line-pre > .line {
font-size: 12px;
line-height: 1.4;
}
3.「ブログに適用」ボタンを押す。
以上です。これで、下のようになりました。
フォントも小さくなって、いい感じです。
なお、CSS のクラス名はときどき変わるようなので、もしまた崩れたら見直す必要がありそうです。
参考にさせてもらったサイト
Python でメールを送信すること自体は簡単です。
しかし、GMail のSMTPサーバーを使ったり、日本語のメールを送信しようとすると、ちょっとコツがいります。
いつも忘れてしまうので、サンプルとして残しておきます。
考えなければならないことは、
あたりでしょうか。
MYO:THE NEXT GENERATION OF GESTURE CONTROL がとても気になります。
APIが公開されるというのもいいです。
スティーブ・ウォズニアックのコメントにもシビレました。
発売は来年の予定らしいですが、未来が買えると思えば、$149は破格に思えます。
検索結果に表示される、ページの著者の写真を消したいという話しです。
たぶん1年ほど前からではないかと思うのですが、検索結果にそのページの著者のサムネイル画像が表示されるようになりました。
検索するたびに、知らない人の顔がずらっと表示されるのは、ちょっと疲れます。
著者の方々には申し訳ないのですが、ブラウザのカスタムCSSを使って、この写真を非表示にしたいと思います。
まずは Google Chrome の場合です。
Chrome のカスタムCSSの場所は下記にあります。
Mac OS X
~/Library/Application Support/Google/Chrome/Default/User StyleSheets/Custom.css
Windows 7, Vista
C:\Users\<ユーザー名>\AppData\Local\Google\Chrome\User Data\Default\User StyleSheets\Custom.css
Windows XP
C:\Documents and Settings\<ユーザー名>\Local Settings\Application Data\Google\Chrome\User Data\Default\User StyleSheets\Custom.css
ただし、これらは隠しフォルダの中にあるので、ターミナルやコマンドプロンプトを使わないと見つけられないかもしれません。コマンドラインが苦手な場合は、Stylist などの機能拡張を使うと楽です。
あとは、この Custom.css ファイルを開き、下記の1行を追加して保存するだけです。
[id^=apthumb] { display: none; }
これで、次回の検索から著者の写真が非表示になるはずです。
次に Safari (Mac) の場合です。
Safari も同じようにできますが、ファイルの指定方法が若干異なります。
Safari の場合は、上記の1行を書いたファイルを適当な名前で保存しておき、Safari > メニュー > 環境設定 > 詳細タブ > 「スタイルシート」プルダウンメニュー > 「その他...」と辿り、そのファイルを選択します。
Safari の場合は、上記操作の直後にサムネイル画像が非表示になります。
また、CSS3に対応していない古いブラウザでもできそうですが、その場合は、(すこし力技ですが)下記のようにすればいいと思います。
#apthumb1,#apthumb2,#apthumb3,#apthumb4,#apthumb5,#apthumb6,#apthumb7,#apthumb8,#apthumb9,#apthumb10 {
display: none;
}
最近の Safari は なぜか Backspace (DEL) キーで前のページに戻ることができないです。
下記をターミナルで実行したあと、Safari を再起動すると希望の動作になると思います。
$defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2BackspaceKeyNavigationEnabled -bool YES
ack を入れてはみたものの、Mac では Spotlight があるのでもっと速いのできそうな気がしました。
Spotlightのコマンドライン版である mdfind
で grep find の代わりになるシェルスクリプトを書いてみました。
gという名前で保存し、chmod +x して
カレントディレクトリで文字列'hoge'を検索
$g hoge
ディレクトリ'doko'で文字列'hoge'を検索
$g hoge doko
ルートディレクトリで文字列'hoge'を検索
$g hoge /
というぐあいに使います。
インデックスができていないと使えないのですが、Sportlightのインデクシングは素早いので個人的には十分実用になっています。
better than grepなackを試してみた を読んで ack の存在を知りました。
brew でインストールすると楽そうなのですが、あえて MacPorts でやってみました。
ですが、正直めんどいですし特にいいこともないので、素直に brew か curl で入れたほうがいいと思います。
それでもやっぱり MacPorts の方がいいという粋な方は以下をどうぞ。
まずは、これです。
$sudo port install p5-app-ack
これまた、ちょっと変な名前ですが、CPANモジュール的命名ということで気にしない(^^; で、入ってるだろうということで、試してみても
$ack
-bash: ack: command not found
という感じで怒られます。
しかたないので、どこに入ったか調べます。
$port contents *app-ack
Port p5-app-ack contains:
/opt/local/share/doc/p5-app-ack/README
Port p5.8-app-ack is not installed.
Port p5.10-app-ack is not installed.
Port p5.12-app-ack contains:
/opt/local/bin/ack-5.12
/opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack.pm
/opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack/Plugin.pm
/opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack/Plugin/Basic.pm
/opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack/Repository.pm
/opt/local/lib/perl5/vendor_perl/5.12.4/App/Ack/Resource.pm
/opt/local/lib/perl5/vendor_perl/5.12.4/darwin-thread-multi-2level/auto/ack/.packlist
/opt/local/libexec/perl5.12/ack
/opt/local/share/perl5.12/man/man1/ack.1pm
Port p5.14-app-ack is not installed.
Port p5.16-app-ack is not installed.
ということで、/opt/local/bin/ack-5.12
が実行ファイルっぽいので、これをパスの通ったところにSymリンクしておきます。
$sudo ln -s /opt/local/bin/ack-5.12 /usr/local/bin/ack
これでやっと使えるようになりました。
$ack --version
ack 1.96
Running under Perl 5.12.4 at /opt/local/bin/perl5.12
Copyright 2005-2011 Andy Lester.
This program is free software. You may modify or distribute it
under the terms of the Artistic License v2.0.
テストです。
$ack --nogroup defvaralias
auto-complete/auto-complete.el:139:(defvaralias 'ac-user-dictionary-files 'ac-dictionary-files)
auto-complete/auto-complete.el:167:(defvaralias 'ac-candidate-menu-height 'ac-menu-height)
auto-complete/auto-complete.el:178:(defvaralias 'ac-quick-help-prefer-x 'ac-quick-help-prefer-pos-tip
OKそうです。ふー。
というわけで、今のところ MacPorts で ack を入れるのはちょっとめんどくさいという話しでした。
というふうにしたいです。
(defun my-query-replace (arg)
(interactive "P")
(let ((current-prefix-arg nil))
(call-interactively
(if arg 'query-replace-regexp 'query-replace))))
xyzzy でもこんなのを書いたような…。
果てしなく車輪の再発明っぽいのですが、Emacs の Python の対話環境をでっちあげてみました。
リージョンを選択して M-x eval-region-python すると、評価結果をカーソル行の下に挿入します。雰囲気としては Lisp Interaction モード で C-j したときのような感じです。
(defun eval-region-python (beg end)
(interactive "r")
(insert (with-output-to-string
(shell-command-on-region beg end "python" standard-output))
"\n"))
ちなみに、結果をスクラッチバッファに出さずに、slime っぽく別のウィンドウに表示する場合は下記のように。
(defun eval-region-python (beg end)
(interactive "r")
(let ((buf "*Py Output*")
(curwin (selected-window)))
(shell-command-on-region beg end "python" buf)
(pop-to-buffer buf)
(select-window curwin)))
こういうのをスクラッチバッファのメジャーモードを検知してすべての言語に対応してやれば、最強のスクラッチバッファになるかも…。
コードスニペットを Markdown にしてブログに貼り付けることが多いので、こんなのを使っています。
(defun markdown-code-region (beg end)
(interactive "r")
(save-excursion
(save-restriction
(untabify beg end)
(narrow-to-region beg end)
(goto-char (point-min))
(while (search-forward-regexp "\\(^.*\\)" nil t)
(replace-match (concat " " (match-string 1)))))))
リージョンを選択して M-x markdown-code-region すると、それぞれの行頭にスペースを4つづつ入れます。
よく忘れるので、メモしておきます。
Cmd
+ k
で、スクロールバッファをクリアできます。
Mac 標準のターミナル.app でも iTerm でも同じようです。
ちなみに Ctrl
+ l
はプロンプト行をターミナルの先頭に移動するだけで、スクロールバッファはクリアしません。
Emacs のモードラインの左部分にはバッファ名が表示されています。
この部分を左クリックしたら一定時間だけファイルのパス名が表示されるようにしてみました。 ついでにクリックと同時にパス文字列をキルリングにコピーします。
下記は powerlineでの表示例です。
普段はバッファ名が表示されているけど…
左クリックするとフルパス表示に切り替わる
(defvar mode-line-buffer-fullpath
(list 'buffer-file-name
(propertized-buffer-identification "%12f")
(propertized-buffer-identification "%12b")))
(add-hook 'dired-mode-hook
(lambda ()
;; TODO: handle (DIRECTORY FILE ...) list value for dired-directory
(setq mode-line-buffer-identification
;; emulate "%17b" (see dired-mode):
'(:eval
(propertized-buffer-identification
(if (< (length default-directory) 17)
(concat default-directory
(make-string (- 17 (length default-directory))
?\s))
default-directory))))))
(setq mode-line-buffer-default mode-line-buffer-identification)
(defun show-mode-line-fullpath (event)
(interactive "e")
(when (buffer-file-name)
(select-window (posn-window (event-start event))) ; activate window
(let ((wait-sec 5))
(setq mode-line-buffer-identification mode-line-buffer-fullpath)
(force-mode-line-update)
(my-copy-buffer-file-name) ; copy path string to killring
(sit-for wait-sec)
(setq mode-line-buffer-identification mode-line-buffer-default)
(force-mode-line-update)
(message ""))))
(define-key mode-line-buffer-identification-keymap [mode-line mouse-1] 'show-mode-line-fullpath) ; left click
(set-face-attribute 'mode-line-highlight nil :box nil) ; remove box when hover mouse
(defun my-copy-buffer-file-name ()
"copy buffer-file-name to kill-ring."
(interactive)
(let ((fn (unwind-protect
(buffer-file-name)
nil)))
(if fn
(let ((f (abbreviate-file-name (expand-file-name fn))))
(kill-new f)
(message "copied: \"%s\"" f))
(message "no file name"))))
この例では5秒間表示されます。表示時間は wait-sec で変更します。
なお、一定時間表示ではなく、クリックするたびに表示をトグルしたい場合は、show-mode-line-fullpath
の代わりに下記の toggle-mode-line-fullpath
を define-key
するといいです。
(defun toggle-mode-line-fullpath ()
(interactive)
(setq mode-line-buffer-identification
(if (string= (format "%s" mode-line-buffer-identification)
(format "%s" mode-line-buffer-fullpath))
mode-line-buffer-default
mode-line-buffer-fullpath))
;; (force-mode-line-update)
)
Mac OS X の Finder には「上の階層へ」ボタンがありません。Windows の Explorer も 7 あたりからこのボタンがなくなってしまいましたが、無いとちょっと不便なこともあります。
AppleScript で工夫されている方もおられるようですが、せっかくなので Mac のアプリとして作成してみました。
下記にパッケージを置いています。
pkg ファイルなのでインストーラが起動します。インストールできたら、Finder でアプリケーションフォルダを開いて 「Up」という上矢印のアイコンを Finder の上部にドラッグアンドドロップすれば使えるようになります。
しくみは Finder に Cmd
+ ↑
を sendkeys しているだけですので、このキーをリマップしていたり無効化していると動作しないです。
ソースは github に置いてあります。
アイコンが気に入らない場合は、up.iconset フォルダの中にある png を差し替えてビルドしなおせばOKです。
わずか34行のスロッピーコードなので、煮るなり焼くなりご自由に。
OS X 10.8.2 (Mountain Lion) と XtraFinder の組み合わせで動作を確認済みです。
以下余談です。
AppStore に置いてもらうためにいろいろな実装方法を試してみたのですが、結局どれも SandBoxing と Entitlement で武装したレビュア陣には勝てませんでした。
Developer Support の外人さんには1ヶ月ほどメールで相談させてもらったのですが、やはり他のアプリを外から操作するのは Sandbox的にはご法度らしく、いくつか提案してもらった API では実現出来ませんでした。
このままHDDの肥やしにしておくのもちょっともったいないと思ったので、最も動作が軽くて単純な実装を、野良で置くことにしました。
はぁー、AppStore 過酷っす。
パトラッシュ、ぼくはもう疲れたよ。
Mountain Lion では、ときどき「Finderで開く」が効かなくなることがあります。
下記をターミナルで実行すると治ります。
$sudo killall -KILL appleeventsd
Spotlight の検索結果を Cmd + 右クリックして、ファイルの場所を Finder で開く場合にも有効です。
ターミナルが苦手な場合は、アクティビティモニタから「appleeventsd」を停止させてもいいです。
iPhone を英語(US)の設定で使っていると、Mapsなどでの距離表示は、当然ですがマイル表示(miles)になります。
「マイルで言われてもわからんし」ってときは、下記のようにカナダにすると km 表示にできます。
Settings > General > International > Region Format > Canada
こうすると、時刻フォーマットは英語圏のままで、距離表示だけを miles → km になります。 通貨単位は未確認です。
EmacsをGUIで起動すると、モードラインは縁がついて3Dっぽくなります。 しかし、最近のGUIは平面的なものが多いので、Emacsのモードラインも平面的にしてみます。
(set-face-attribute 'mode-line nil :box nil)
(set-face-attribute 'mode-line-inactive nil :box nil)
3D(デフォルト)
平面化
powerlineには平面的なモードラインが似合いそうな気がします。
タイトルバーにカレントバッファのバッファ名かファイル名を表示します。
カレントバッファがファイルを開いていたらファイル名を、そうでなかったらバッファ名を表示します。
(setq frame-title-format
(if (buffer-file-name)
(format "%%f - Emacs")
(format "%%b - Emacs")))
%%b とかは、モードラインの書式に似ているので、M-x apropos mode-line-format で調べると分かります。
なんか、.emacsを紛失するたんびに書いているような気もしますが…。
ブログに関連する記事を表示するブログパーツ LinkWithin を使っていたのですが、ブログを引越しするとなぜか表示されなくなったので、Outbrain を試しています。
LinkWithinとは違い、Outbrain は ユーザー登録しないと使えませんが、細かい設定ができたりアクセス履歴を見れたりします。
ただ、肝心の「関連する記事をピックアップする機能」が LinkWithinよりも下手な気がします。日本語向けの最適化が甘いのかもしれませんが、もう少し様子を見てみたいと思います。
(defun quicklook-file (path)
(interactive)
(defvar cur nil)
(defvar old nil)
(setq old cur)
(setq cur (start-process "ql-file" nil "qlmanage" "-p" path))
(when old (delete-process old)))
こんなのを書いてみたんですが、ちょっとビミョーでした。
Dired で v 押したときにプレビューできるように、こんなふうに(↓)してみましたが…。
(defun dired-view-file-quicklook ()
(interactive)
(let ((file (dired-get-file-for-visit)))
(if (file-directory-p file)
(or (and (cdr dired-subdir-alist)
(dired-goto-subdir file))
(dired file))
(save-selected-window
(quicklook-file file))
)))
(define-key dired-mode-map (kbd "v") 'dired-view-file-quicklook)
毎回プロセスを起動しているので遅いです。Quicklookデーモンにテキストを送信するようなことができたらいいと思ったのですが、見当たりませんでした。
まあ、Quicklook 自体がビミョーってのもあるんですけど。
最近の Emacs には text-scale-increase というのが、標準で入っているようです。
とりあえず、C-M-= 等で拡大できるようにしておきました。
(global-set-key (kbd "C-M-=") 'text-scale-increase)
(global-set-key (kbd "C-M--") 'text-scale-decrease)
(global-set-key (kbd "C-M-0") '(lambda () (interactive) (text-scale-set 0)))
cycle-buffer.el を長年使っていたのですが、ココによるとどうやら obsolete なようです。2004年というと、9年前ですね。いいかげん気づけよって話しですが(^^;
で、今は bs.el というバッファ切り替え全般を受け持つモジュールが標準で入っていて、この中に cycle-buffer に似たような機能があります。
cycle-buffer.el で scratch バッファを表示候補に入れたかったのですが、これも bs.el を使えば簡単でした。
(global-set-key [(f11)] 'bs-cycle-previous)
(global-set-key [(f12)] 'bs-cycle-next)
(setq bs-cycle-configuration-name "files-and-scratch") ; *scratch*バッファも表示候補に入れる
紛らわしいですが、cyclebuffer.elも同様に obsolete ですね。