2013/12/26

シェルスクリプトからログ出力するテスト on Mac OS X

ふつうに echo "hoge" >> log でいいんですが、Mac の場合は ~/Library/Logs/ の下に出すといいようです。

ログファイルに出力される様子は、Console という OS X 標準アプリで tail -f のように見れます。

下記は ~/Library/Logs/test.log に出力する例です。

2013/12/25

セキュアなクラウド

https://spideroak.com/

そのうち試そう。

2013/12/23

Raspberry Pi → LaunchPad に I2C で送信テスト

rpi から TI のLaunchPadに、I2C経由で1バイト送るテスト。

結線とか。

デバイスは MSP430G2553。Pull up してないけど動くw

まずは、LaunchPad

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
}

つぎに、Raspberry Pi

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(赤) 消灯

2013/12/21

電験3種の免状が来た

10/28に申請して、昨日(12/20) 届きました。

っといっても、とくに嬉しい事もなく、今2種の勉強をしているので、そっちの不安の方が大きかったりします。

2種の免状を拝むことができるのはいつの日なんだろうか。

2013/12/20

YouTube Downloader

YouTube の動画をダウンロードするサイトです。

ClipConverter

使い方は、動画のURLを貼りつけて、ファイル形式を指定するだけです。

この手のサイトは長続きしないことが多いですが、ここはかなり続いている方ではないかと。

2013/10/16

電験3種 受かった。

やっと受かった。長い道のりだった。

2013/10/09

シェルスクリプトでディレクトリを再帰処理

python なら os.walk() で一発ですが、シェルスクリプトだとこんな感じです。

2013/10/08

ClipboardPlain の作者さんに Pull request を送ってみた。

Mac の ClipboardPlain をちょっと直してみたのつづきです。

GitHub で 作者さんに Pull request を送ってみたら、あっさりマージしてもらえました。

次のタイミングで Mac App Store にアップデートするとのこと。

Pull request を送ったのは初めてだったのですが、思ったより簡単でした。外国の人とこんなに簡単にパッチのやりとりができるなんて、スゴイ時代です。

いまさらですが、インターネット素晴らしいです。

GitHub も最高に素晴らしいです。

Mac の ClipboardPlain をちょっと直してみた

Mac で テキストをコピペするときに書式を取り除いてくれるソフト ClipboardPlain をしばらく前から使っています。

とても気に入っていたのですが、1つ困った事がありました。

それは、メニュー項目の「Remove Format Automatically」を有効化すると、Finderでファイルのコピペができなくなることでした。

今まで我慢して使っていたのですが、昨日ふとソースコードが Github に置かれているのを発見しました。

とりあえず適当に直したので、お困りの方がおられましたら使ってみて下さい。

以下、使い方です。

  1. ClipboardPlain.app.zip をダウンロードします。
  2. zip を解凍すると ClipboardPlain.app ができるので、これをアプリケーションフォルダに上書きしてください。
  3. ClipboardPlain.app をダブルクリックすると起動します。

もし、不具合がありましたら教えて下さい。 ちなみに、いじったソースはココにあります。

ソースがあるって素晴らしい。RMSバンザイ!

つづく。

2013/10/05

ダウンロードファイルを自動的にゴミ箱に移動させる

ダウンロードしたファイルを手でゴミ箱に移動するのが面倒だったので、シェルスクリプトを書きました。

ゴミ箱に移動するものは、.dmgなどをインストール中だと困るので

  • 最後のアクセスから10分以上経過している
  • ファイルを操作中ではないもの

の両方を満たすものだけとしています。

ゴミ箱に移動するロジックは、コマンドラインからゴミ箱に捨てるシェルスクリプト をそのまま使わせてもらいました。

これを launchd で自動実行する方法を以下に書きます。

なお、launchd の plist(XML) を書くのがめんどくさかったので、Lingon を使わせてもらいました。

  1. 上記のコードを ~/bin/download_cleaner.sh として保存します。
  2. Lingonを起動し、+ボタンを押して「My Agent」を選択して新しい起動項目を作ります。

  3. 下の画像のように設定して、「Save」ボタンを押します。

    (ここでは30分おきに起動するようにしています)

  4. 一旦ログオフして、ログオンしなおします。

自分で言うのもおかしいのですが、こんなスクリプト1つでかなり楽になりました。

参考にさせていただいたサイト

2013/10/03

Completionsバッファでディレクトリに色づけ

C-x C-f(find-file)などでファイルを開くときに、minibuffer でTABキーを押すとCompletionsバッファが開き、補完候補が列挙されます。

このとき、ファイルとディレクトリの区別がつきにくいので、ディレクトリに色を付けるようにしてみました。

ディレクトリがたくさんあるところに行くと、ちょっと重いかもです。

2013/09/30

MacのPage Up / Page Down キーをWindowsと同じ挙動に

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と同じようにしたいので、下記のようにしています。

2013/09/25

Mac に Django をインストール

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が起動しているのを確認。

2013/09/15

Raspberry Pi でGPIO(LED点滅とSW入力)のテスト

GPIOのテストとして、WiringPi のインストール → LED点滅 → SW入力 やります。

WiringPi インストール

$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

これでサンプルプログラムがビルドされる

ポート出力テスト(LED点滅)

上の写真のように結線して

$ sudo ./blink

LEDが1秒周期で点滅する

ポート入力テスト(SW入力)

(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

2013/09/09

XC8用のUSBライブラリはどこにある?

残念ながら、今現在は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

とありました。

2013/09/08

秋月の PIC18F14K50 ボードでLチカ

ひさびさに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 が必要なので要注意です。

参考にさせていただいたサイト

2013/09/07

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として使いたいなら)、これらはできるだけ避けたほうが無難です。

2013/09/06

行末とコメントを除いた部分の行末を行き来する end-of-line

Emacsで C-e するとコメントがあろうがなかろうが行末に飛びます。

いたって普通の動作です。

しかし、カレント行にコメントがある場合は、コメントではない部分の末尾に飛んでほしいと、以前から思っていました。

言葉にするとややこしいのですが、下の画像のようなことがしたかったわけです。

C-e すると、まずはコメントではない部分の末尾にジャンプ。

もう一度 C-e すると、行末にジャンプ。

さらにもう一度 C-e すると…、これ以降トグルです。

長年の希望が叶ったので記念に貼っておきます。

ちなみに、ソースの * が付いている2行のコメントアウトを外すと、

コメントではない部分の末尾 → コメントの先頭 → 行末

と飛びますが、ちょっと煩雑すぎる気がしたので無効にしています。

2013/08/25

Raspberry Pi の電気代はいくら?

これのつづきで、Raspberry Pi の電気代も考えてみたいと思います。

Raspberry Pi は24時間 常時電源ONで、Webサーバとして動かすとします。

ココによると、3.5W 以上食うことはないということです。

3.5W ✕ 24 = 84Wh/日 → 2.5kWh/月 ≒ 3kWh/月 とします。

Raspberry Pi 導入以前の電気代を114kW/月とすると、導入後は+3kW なので 117kW/月となります。

関西の場合は、ココで 114kW と 117kW を入力して差分をとります。

  • 導入前:114kW : 2,533円/月
  • 導入後:117kW : 2,598円/月

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

よく見かける「x 秒後に自動的にジャンプします。」な Javascript サンプルです。

JQuery は使っていません。「x 秒後」の数字の部分は 10, 9, 8, 7, ... と変化します。

リダイレクトするだけなら、ヘッダに下の1行を書き足せばいいのですが、

<meta http-equiv="refresh" content="10;URL=http://www.google.co.jp/" />

数字を変化させるとなると Javascript 書くしかないかなと。

ちなみに、クロージャを使っています。

CSS の 'rgba(255,255,255,1.0)' と #fff を変換する

Pythonによる、CSS3 の 'rgba()' 表記と従来の #16進数表記の相互変換の関数です。

文字列を指定した文字数ずつに分割する

Python の文字列の split() は区切り文字による分割はできますが、「何文字ずつに分割する」ということはできないと思います。

Split string into strings by length? で Pythonic な解決方法を示してくれた方がおられました。

シンプルさに感動したので関数化して置いておきます。

2013/08/24

KeyRemap4MacBook で Chrome のキーバインドを変更

KeyRemap4MacBook で Google Chrome のタブ切り替えを F11/F12 でできるようにしてみました。

  • F12: Ctrl + TAB
  • F11: Ctrl + Shift + TAB

~/Library/Application Support/KeyRemap4MacBook/private.xmlに下記を書き足します。

KeyCode, ModifierFlag の順に書かないとダメなようです。

2013/08/20

Emacs で ssh 接続してファイルを開く

ふつうに 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 の Debian で最初の設定

Raspberry Pi / Wheezy で、インストール後に最初にやることのおぼえがきです。

HDMIでディスプレイにつないで、

  • User: pi
  • Pass: raspberry

でログイン。

まずは一般ユーザをつくる

$sudo su
#adduser hoge  <-- ユーザ 'hoge'を追加

sudo できるようにする

#chmod +w /etc/sudoers
#vi /etc/sudoers
        :
    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    hoge   ALL=(ALL:ALL) ALL   <-- この行を追加
        :

#chmod -w /etc/sudoers

sshのポート番号を変更する

$cd /etc/ssh/
$sudo cp sshd_config sshd_config.orig
$sudo vi sshd_config

    Port 22 --> Port 1022とか

IPアドレスを確認した後にリブート

$ifconfig
$sudo reboot

ここまでやると ssh でつながるので、Ethernet ケーブルをつないで、PC から

ssh 192.168.xx.xx -p 1022

で入ります。

タイムゾーンを UTC → JST へ

tzconfig は deprecated らしいので、下記で。

$sudo dpkg-reconfigure tzdata

  Asia / Tokyo

$date
Sun Aug 18 09:42:34 JST 2013

現在時刻がJSTで表示されればOK。

まずはここまで。

2013/08/19

Raspberry Pi の Debian に mod_wsgi をインストール

以下は、Raspberry Pi のApacheに mod_wsgiをインストールしたときのメモです。

  • Debian(Wheezy)
  • Apache 2.2.22
  • Python 3.3.2

最初は 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!' と出るはずです。

2013/08/15

Python の takewhile と dropwhile

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 には使いでがありそうなものが多いです。

filter, map をリストの内包表記で。

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します… 。

2013/07/22

例外処理 try .. except のサンプル (Python3版)

割り算を繰り返している最中に、ゼロで割り算してしまったら、そこで ZeroDivisionError という例外が発生します。

例外処理 try..except を使わない not_used() 関数は、そこでプログラムが異常終了してしまいますが、 例外処理を使っている used() 関数は処理を中断せずに最後まで実行します。

プログラムにとって、途中で異常終了するのは最悪なことです。

とくにマルチユーザのプログラムでは、1人のユーザの操作が原因で全員の作業を中断させてしまうことにもなります。なので、このような致命的な事態はできるだけ避けなければなりません。

上の例のように、原因が分かりきっているバグはすぐに取ってしまえばいいですが、原因が予測できないケースや、原因が多岐にわたるケースもあります。

そのような場合は、エラーを避けるための事前確認処理として if .. elif .. else を何個も入れることになり、結果として読みづらいコードになりがちです。

例外処理 try..except を使えば比較的シンプルにエラー処理を書くことができ、開発時には想定していなかったケースにも対応しやすいです。

2013/07/20

消してしまったファイルをDropboxから復活させる

よく忘れるので、メモります。

  1. Dropboxのサイトにログインします。
  2. ページの右上にあるゴミ箱アイコンをクリックし、ゴミ箱が閉じたアイコンになるようにします。

    普段は削除したファイルは表示されませんが、この状態にすると、削除したファイルがグレーで表示されるようになります。
  3. フォルダ階層をたどって、消してしまったファイルを探します。
    フォルダごと削除した場合は、そのフォルダを探します。
  4. 目的のファイルを右クリックし、メニューから「Restore」を選びます。

同期が終われば、ファイルが復活しているはずです。

TimeMachineの操作が重いので、最近は Dropboxからファイルを復旧することの方が多くなってきました。

Dired から Mac の openコマンドでファイルを開く

Emacs の Dired では、ファイルを選択してEnterキーを押すと、何でもかんでも Emacsで開こうとします。しかし画像や動画のファイルは専用のソフトで開きたいところです。

Mac ではファイルごとに関連付けられたデフォルトのアプリでファイルを開く open コマンドがあります。

このコマンドと、以前試したQuick Look のこれを使って、 Dired で Enter を押したしたときに自動判別して開くようにしてみました。

下記では jpeg や png などの静止画は Quick Look で、avi などの動画や pdf は open で開きます。

2013/07/18

wget でサイトをまるごとダウンロード

ウェブ上に置いてあるマニュアルや読み物は、ローカルに落としてじっくり読みたいものです。

wget で CSSや画像を含めてまるごと取得するには、下記の例のようにします。

wget -p -r http://diveintopython3-ja.rdy.jp/index.html

この例では Dive into Python3 日本語版 を取得しています。

2013/07/17

html-modeで閉じタグにジャンプする

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 のカッコ間ジャンプと同居させてみたくなったので、下記のようなのを仕込みました。

これで、カーソル位置がカッコならカッコ間ジャンプ、それ以外ならタグ間ジャンプをしてくれます。

Pythonで「ImportError: No module named …」が出た時の3つの対処法

このエラーは、インポートしている .pyファイルが見つからないときに出ます。

果てしなく既出っぽいですが、他のモジュールを使うときの3通りの方法をまとめます。

例:main.py が /path/to/dir/sub.py をインポートする場合

1. インポートする側のソースファイルで対処

インポートする側のソース(main.py)の先頭に下記を書き足す。

 import sys
 sys.path.append('/path/to/dir')

2. シェルで対処

.bashrc 等に下記を書き足す。

 export PYTHONPATH=/path/to/dir:$PYTHONPATH

3. 実行する度に対処

ふだん、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

2013/07/16

光からADSLに変更

フレッツ光の2年縛りが解けたので、ADSLに変更します。

今月中にやらなければ自動更新されてしまい、2年後の契約満了月までに解約すると違約金が発生するらしいので。

固定電話は休止中のものがあるので、これを再利用の手続きをしてからADSLに変更しました。

以下は、フレッツ光からADSLに変更した時の個人的なメモです。

1.ADSLプロバイダを探して目星をつける

価格.comなどを参考に。

2.休止させている固定電話を復活させる。

NTTに電話をかける。

ちなみに、NTT西日本では 0800-2000116(2013年7月現在 )。 
土日祝 9:00-21:00。携帯フリーコールOK。

担当者さんにつながるまで気長に待つ。(10分ほどかかった)

「利用休止中の固定電話を再利用したいのですが」といえば話しが通じる。

下記を聞かれるので予め準備できればベター。

  • 電話の名義
  • 停止した時の固定電話の電話番号
  • 停止した時の住所
  • 停止申請時に連絡先として教えた電話番号(携帯等)
  • 停止した時期

この電話でフレッツ光の解約もできるようなので、担当者さんにお願いする。

新しい電話番号を取得して、折り返し電話をくれるとのこと。

3.電話を受ける

新しい電話番号の候補を5つほど教えてくれるのでメモを取って、その場で決める。

電話の工事日付を指定する(立ち会い工事)。

フレッツ光をいつ止めるか聞かれるので11日後(土日除く)以降の日付を指定する。

4.目星をつけたプロバイダの申し込み手続きをする。

今回は Nexys.BB で。

電話番号は、先ほど復活させた電話番号を入力する。

利用開始日付は、フレッツ光が止まる11日後を指定する。

申込書は郵送で届く。

5.現在利用中のプロバイダの解約手続きをする。

ウェブで解約手続きをする。

後は、郵送で送られてくるものを順次処理すれば完了です。

その他、注意事項

  • 現在利用中の光モデム等はNTTから返送用の袋が送られてくるので、それに入れてコンビニで送る(着払い)。
  • 固定電話の工事費用は2100円(電話の差込口がある場合)。NTTに支払うのはこれのみ。
  • 固定電話の支払いは再度手続きが必要。NTTから申込書が送られてくる。

Spotlight で見つけたファイルの場所を開く

よく忘れるので、メモを残します。

見つけたはいいけど、そこへはどうやって行けばいいのか。

はい。Command + r でファインダーで開けます。

コンテキストメニューにでも出してくれればいいのに…。

参考にさせていただいたサイト

2013/07/14

Dired でファイルを削除したときに、ゴミ箱に移動する

Dired でDキーを押してファイルを削除したときに、直接消さずにゴミ箱に移動するようにするには、下記の1行を .emacs に追加するだけでOKです。

(setq delete-by-moving-to-trash t)

Emacsで開いているファイルの場所をターミナルで開く

これのつづきです。

とりあえず、やっつけで作りました。ちょっと難ありです。

現状の問題点は、

  • Mac専用
  • 1つでもターミナルを開いていることが前提
  • 他のターミナルのウィンドウがすべて前面化される

一応 Dired でも使えます。

参考にさせていただいたサイト

2013/07/13

Genshi のテンプレートにHTMLリテラル文字列を挿入したい

HTMLタグの含まれた文字列を Genshi に渡すと、>< などがエスケープされてしまい、意図した動作になりません。

公式サイトのFAQ では3通りの解決方法を挙げていますが、その一つのMarkupクラスを使う方法を示します。

単純に、文字列をMarkupクラスでラップして渡してやればOKです。

以下に例を。

2013/07/12

mkvmerge で英語音声を日本語に変更するシェルスクリプト

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文で回したときにうまく動かない

ファイル名に空白が入っていると、シェルスクリプトのforで回したときにファイル名が空白で分割されてしまい、期待した動作になりません。

そんなときの対処法は、単にシェル変数IFSに改行文字のみを設定すればいいです。

この変数は区切り文字を表すのですが、通常はこの変数にスペースやタブ文字が含まれていることが原因です。

2013/07/10

Python 3.3 で CherryPy

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 フォルダをアップロードすることになります。

2013/07/09

自分の Gist が検索できるようになっている件

今頃気づくなと言われそうですが、Gistのページの一番上にあるテキストボックスにキーワードを入力すると、検索できるようになっているようです。

上図の赤枠にキーワードを入れると、該当する候補がプルダウン表示されます。

どうやら、

  • 大文字/小文字を区別する(Case Sensitive)
  • 自分のGistと、スターをつけた誰かのGistが検索対象
  • Description に書いた内容を検索

のような感じなので、Gist に置いたソースの全文を検索してくれるわけではないみたいですが、自分のGistを検索するには便利になりました。

できれば、ファイル名も引っ掛けてくれるとありがたい…。

microchip の送料無料クーポン

少し前に、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程度かかるので、これはありがたいです。

2013/07/08

mkvmerge をコマンドラインで使い、英語音声を日本語に変更する

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 で英語音声を日本語に変更するシェルスクリプト

2013/07/06

iPhone5のWi-Fiがよく切れるときの、その場しのぎな対処法

今年の3月に購入した iPhone5 のWi-Fiが、最近特につながらなくなりました。

購入当初から、速度が遅かったりよく切れたりしていましたが、まだ許せる範囲でした。しかし、最近はアプリのダウンロードもできなくなる始末。最近話題の Google ハングアウトもつながった試しがありません。

「iPhone5 Wi-Fi」でウェブを探すと、やはり5GHzの無線ルータに買い替えるという対処法がゴロゴロ出てきます。

でも、すぐにルータを替えるお金なんてないので、ここは対処療法でなんとかしてみます。

その場しのぎな対処法は、

ルータのオートチャネルの設定を無効化し、速いチャネルを手動で設定

です。どこが速いチャネルなのかは実際に iPhone の速度ベンチをとらないと分かりませんので、手間はかかります。

私のルータ WN-G300DGR では、下記のように設定しました。

参考までに、ベンチを下記に。

↓オートチャネル

↓固定チャネル(7CH)

チャネルを手で設定してからは、切れることが少なくなりました。

難点としては、その時々の隣近所の電波の混みあいで速いチャネルは変わるので、その都度チャネルを変える必要があることです。

辛抱できなくなったら、その時 5GHzルータを買うことにします。

参考にさせていただいたサイト

2013/07/05

Raspberry Pi: Type A と Type B の違い

RS Components の製品ページから両者の仕様を比較してみました。

Type A (24.00ポンド 約3600円)

  • 256MB RAM
  • USB 2.0 socket

Type B (31.20ポンド 約4700円)

  • 512MB RAM
  • 2 x USB 2.0 sockets
  • 10/100 BaseT Ethernet socket

というわけで主な違いは、メモリUSBポート数Ethernetポートの有無 の3点です。

有線でネットにつないで何かしたい場合は Type B 一択になりそうです。USB経由でLANアダプタ等もできなくはないですが…。

なお、上記の価格は RS Components のものです。

下記は共通仕様です。

共通仕様

  • Broadcom BCM2835 700MHz ARM1176JZFS processor with FPU and Videocore 4 GPU
  • GPU provides Open GL ES 2.0, hardware-accelerated OpenVG, and 1080p30 H.264 high-profile decode
  • GPU is capable of 1Gpixel/s, 1.5Gtexel/s or 24GFLOPs with texture filtering and DMA infrastructure
  • Boots from SD card, running a version of the Linux operating system
  • HDMI video out socket
  • RCA composite video out socket
  • 3.5mm audio out jack
  • SD card socket
  • Powered from microUSB socket
  • Raspberry Pi HD video camera connector
  • Size: 85.6 x 53.98 x 17mm"

Emacs でも、Win/Mac のような 全選択を。

最近のEmacsは Shift + カーソル移動でテキストを選択できるようになっているようです。

全選択(Select All)もそれっぽいのが欲しくなったので、似たようなのを作ってみました。

M-a するとバッファ内のすべてに色がつき、カーソルがバッファ末尾に移動します。

参考にさせていただいたサイト

Monolingual ⊂ CCleaner @Mac

Monolingual は、普段使わない言語リソースを削除してディスクを節約するソフトです。

システムディスクがSSDになったこともあり、できるだけ容量を節約したいときには重宝していました。

しかし、Mac版の CCleaner には Monolingual の機能が含まれているようです。

まず、左側の Options > Languages と進み、不要な言語を設定します。(必要な物だけ チェック)

Options > Languages

次に、左側の Cleaner > Mac OS X タブと進み、Unneeded Languages をチェックします。

Cleaner > Mac OS X

あとはいつものように、掃除をするだけで不要な言語リソースを削除してくれます。

CCleaner はWindowsでは有名な掃除ソフトですが、Mac版も素晴らしい出来のようです。

あまりソフトの紹介は得意ではないのですが、久々に感動したのでつい。

2013/07/04

recentf のホームディレクトリを "~" に置換

recentf-ext のディレクトリを色付けに引き続き、recentfネタです。

recentf で列挙されるパスのホームディレクトリ部分(Mac では "/Users/hoge"など)を "~" に置換します。

↑こういう表示が、↓こういう感じになります。

既出っぽいネタですが、これで視認性がよくなりました。

recentf-ext のディレクトリを色付け

人は俺を「recentfマスター」と呼ぶ の recentf-ext.el を使うと、最近使ったファイルだけでなくディレクトリも列挙されるようになります。

あとは、そのディレクトリを選んでEnterを押すだけで dired で開けます。これに慣れてしまうと、M-x diredC-x C-dしてディレクトリ名を入力なんて、やってられません。大抵の場合は、recentf して近場のディレクトリ名をインクリメンタルサーチして Enterすれば事足ります。

とても便利になりましたが、どれがディレクトリなのか見分けづらいこともあります。

そこで、ディレクトリだけを色付けするようにしてみました。

recentf がマイナーモードということもあって色付けには overlay を使いましたが、こういうものは本来 syntax-table か font-lock ですべきなのかもと思ったのは書いた後でした。

z を bash で使う

コマンドラインでのディレクトリ移動が楽になる 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/ と展開されます。

キーワードが一致すれば、先頭・末尾に限らず何でもいいので、うろ覚えで移動が可能です。

2013/06/27

大ざっぱすぎる西暦→和暦変換。

適当ですが、西暦→和暦変換プログラムをPythonででっち上げました。

  • 明治、大正、昭和、平成のみ
  • 年号が変わる年の月の考慮なし
    (例:1989年途中まで 昭和64年 ですが、平成1年 と表示)

厳密な用途(誕生日計算など)には使えないです。

とりあえず平成があれば十分なのと、なんしか今は時間ないので。

2013/06/26

MacPorts で Python3.3を入れる

そろそろ重い腰を上げて、 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を同時に走らせることができるので、バージョンやインストールされているパッケージの違いによる挙動の違いを比較する場合などは手軽に試すことができます。

Emacs で JSON を Flymake する

コマンドラインで使える 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 Lint

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バイト文字が含まれていると少し指摘箇所の桁がずれますが、エラー行は分かります。

2013/06/25

ちょこっと確認するとき用の shell モード

Emacs を使っている時にシェルを使いたいときは M-x shell とするのですが、今ひとつ使い勝手がよくありません。

少し億劫に感じてきたので、最近はこんなものを使っています。

ちょこっと確認したいときなどは、

  1. M-x term とたたく
  2. 下部に rebuilder っぽく小さいシェルウィンドウが開く
  3. ちょろっとコマンド入れて確認
  4. C-x k で抜ける

としています。抜けるときはシェルバッファとプロセスは毎回消します。

termというコマンド名には別のコマンドが割り付けられていますが、とりあえず気にしないということで…。

2013/06/21

一番簡単な Raspberry Pi 用SDカードの作り方

以前はRAWイメージをddコマンドで書き込んだり、専用のツールでSDカードを作っていましたが、今はもっと簡単な方法があるようです。

この方法は NOOB(New Out Of Box Software )という、初心者(newbie)向けのやり方のようですが、

  • 書き込みのためのツールは不要(ふつうのファイル操作でOK)
  • SDカードには複数のディストリのイメージが書き込まれる
  • Raspberry Pi を起動した後で、好みのディストリを選択してインストール

という特徴があります。4GB以上のSDカードならこちらのほうが早くて簡単かもしれません。

やり方は Windows / Mac / Linux どれも似たようなものですが、下記に Mac の例を書きます。

  1. 買ったばかりのSDカードはあらかじめ SD Formatter でフォーマットしておく
  2. ココ から NOOBS**.zip をダウンロード
    (torrentが使える場合はそっちの方が速い)
  3. zip を解凍
  4. 解凍したフォルダをFinderで開き、フォルダの中身を全て選択して、コピー
  5. SDカードのルートに貼り付け
  6. SDカードをイジェクトして、Raspberry Pi に挿し込む
  7. Raspberry Pi に HDMIケーブル と USBマウス か USBキーボードを挿して、電源を入れる
  8. インストールしたいディストリをマウスかキーボードで選ぶ
    (とくに好みがなければ、とりあえず Raspbian で)
  9. OSのインストールが始まるので数分待つ
  10. 確認ダイアログで OK を押す

この後、Raspberry Pi のオプション設定画面になりますが、起動確認だけなら何もせずに Finish を選ぶといいです。

するとコンソールに落ちるので、ここで

$startx

とでもすると X が起動します。

再起動するとインストールしたディストリで起動しますが、これ以降のログインは(ユーザを作っていない場合は)下記のデフォルトユーザが使えます。

  • Raspbian: User: pi, Pass: raspberry
  • Arch Linux: User: root, Pass: root
  • Pidora: User: root, Pass: raspberrypi

2013/06/19

メジャーモードごとに eval-region を切り替える

Python でもスクラッチバッファで対話したい のつづきです。

メジャーモードごとに eval-region を切り替えるようにしてみました。簡単な割に便利です。

これで、スクラッチバッファでもそうでなくても M-x eval-region すると、そのメジャーモードにふさわしい eval-region が呼び出され、リージョンの評価結果をプリントするようになります。…といっても、今のところ Python, Ruby, ELispだけですが。

各モード用の eval-region-xxx の関数定義は共通化すればシンプルになりそうですが、早すぎる最適化を招きそうなのでこのまま放置です。

Emacs Lisp の関数のすげ替え テスト

fset / setf と、とてもまぎらわしいので、備忘録的においておきます。

テストとして、挨拶文を表示するgreetingという関数を朝用と夜用にすげ替えてみます。

これでいいのか、今ひとつ自信ないです…。

摂氏 [°C] と 華氏 [°F] の変換グラフ

摂氏(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

参考にさせてもらったサイト

2013/06/11

あるXtalをボーレート設定に使ったときの誤差を求める

部品屋でボーレート設定用の 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等のビデオ信号用として使われます。

2013/06/07

CSSのセレクタまとめ

基本形

まずは基本形、セレクタ1つです。例として p 要素の文字を赤にしたい場合を考えます。

p {color:red}         // <p> すべてに適用
p.menu {color:red}    // <p class="menu"> に適用
p#ss0 {color:red}     // <p id="ss0"> に適用

さて、このセレクタをスペースかカンマで区切って、2つ以上指定した場合はどうなるかを見てみます。

結論から言うと、

  • スペース区切り:HTMLの階層
  • カンマ区切り:複数指定

となります。それぞれ例を示します。

スペース区切り:HTMLの階層

スペースで区切ると、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 要素に適用

とします。

2013/06/05

C言語のビット演算子 まとめ

ビット演算子のおさらい

         例 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)

実践編

実際にはビットマスクを使って下記のようにすることが多いです。

あるビットを立てたい(1にしたい)→ OR
mask = 0x04;      // 0000_0100
PORTB |= mask;    // bit2 を立てる
あるビットを寝かせたい(0にしたい)→ AND
mask = 0x04;      // 0000_0100
PORTB &= ~mask;   // bit2 を寝かす

マスクを一旦 NOT して、それを AND するという2段階が必要
あるビットを反転させたい → XOR
mask = 0x04;      // 0000_0100
PORTB ^= mask;    // bit2 を反転させる

XOR についての注意

元のビットが 1 のときに XOR を使うとビットを寝かせることができるので、AND の代わりに使えそうです。AND が2段階必要なのに比べるとシンプルにも思えます。

しかしこの方法は、元のビットが想定外に0に変化してしまうと、XOR の結果は 1 になる(立ってしまう)ため、下手をすればバグの元となります。

特に割り込み許可フラグや状態遷移のフラグなどにこの手の操作をしてしまうと、盛大にバグる上に発見が難しいです。

なので、XOR のそういう使い方は避け、純粋にビット反転の用途のみに使うべきです。

AVR Dragon 接続できない件

なぜか、ときどき AVR Dragon が使えなくなります。

PCの電源は落とさずにスリープしながら使っているのが原因かもしれないのですが、再現性100%というわけでもなく、今ひとつはっきりしません。その度にUSBケーブルをつなぎ直したりするのですが、いつも手間取ってしまうので、うまくいく手順の一例を下記に書いておきます。

AVR Dragon の ISPコネクタをターゲット基板に接続している状態で、次のとおりに行います。

  1. Atmel Studio (AVR Studio) を一旦閉じる
  2. Atmel Studio 起動
  3. ターゲットの電源 ON
  4. AVR Dragon と USBケーブルを接続

これでいつものように、F5 を押せばステップ実行できるようになるはず。

2013/06/04

ウェブ上のインタープリタ codepad

ウェブ上の言語処理系(インタープリタ or コンパイラ)codepad です。

左のリストから言語を選び、右のテキストボックスにプログラムを書いて Submit ボタンを押せば、下のように実行結果を出力してくれます。

コンパイラをインストールしていない環境や、ちょっとしたサンプルコードの確認など、地味に出番があります。

選択できる言語には C や C++ に紛れて、なにげに関数型言語や Lisp があるのが面白いです。

2013/05/31

シェルスクリプトの if 文のおぼえがき

とりあえずよく忘れるものだけ。

ファイルの更新日時を比較

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

Eagle のコマンドバーで線を引く

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パッドも同様の座標指示で配置できます。

ちなみに、外形線のレイヤと線幅は下記のようにするとよいと思います。

  • レイヤは tPlace か bPlace
  • 線幅はシルクの線幅(例:Olimexでは10mil = 0.254mm)

これらは、changeコマンドや右クリックメニューのPropertiesで変更できます。

2013/05/30

Google日本語入力のユーザ辞書登録

特になんてことはないのですが、Macで Google日本語入力(Google Japanese Input)のユーザ辞書登録をするやり方です。

メニューバーの右の方にある もしくは A というアイコンを右クリックし、Dictionary Tool ...を選択。

そして、 Add ボタンを押して、 Readingに入力語句、Wordに変換後の語句を入れます。

2013/05/29

AVRのタイマー割込みサンプル

1秒ごとにLEDが点滅するサンプルです。

2013/05/27

AVRのSW入力とLED点灯のサンプル

タクトSWを押すとLEDが光るサンプルを置いておきます。

  • LEDはPB0: LO で 点灯
  • SWはPB1: LO で ON

です。

ごく単純なものですが、組込みにおけるHello world!的なものなので、一生のうち何度も書くです。

2013/05/25

C言語の二次元配列の要素数

比較的最近の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-EK HID接続テスト(キーボード編)

前回のつづきです。

今度はキーボードとして認識させてみます。

RN-42の設定は以下のとおり。

  • S~,6 # HID
  • SH,0200 # キーボード
  • SM,6 # Pairing Mode (キーボードでは必須)
  • SR,BC9A78xxxxxx # 接続先PCのアドレス(必須ではない)

コマンドモードで上記を設定した後に 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のヘルプメニューがプルダウンします。

2013/05/24

RN-42-EK HID接続テスト(マウス編)

遅ればせながら、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 の設定です。

  • S~,6 # HID
  • SH,0220 # マウス
  • SM,6 # Pairing Mode (必須ではない)
  • SR,BC9A78xxxxxx # 接続先PCのアドレス(必須ではない)

以下、メモ書きです。

  • レポート送信用のボーレートは9600, 115200 bps で正常動作を確認済み
  • HIDとして接続中は $$$ によるコマンドモードには入れない
  • コマンドモードに入るには PCのBluetooth管理でFireFly-XXXXを削除(disconnect ではなく、remove)した後に、Teraterm から $$$を入力する
  • さらに、RN-42 のTXD/RXD をオープンになっていないと、Teraterm から $$$ が届かない模様
  • ほかのHIDデバイス(キーボードなど)に切り替えるときは、コマンドモードで SH,0200 としたあと、RN-42 の電源を切/入し、PCのBluetooth管理でキーボードとして認識させる

2013/05/16

AVRのUARTのサンプルその2

以前のこれのつづきです。

割り込みによる送受信とリングバッファを追加したものです。

若干納得が行かないところもありますが、とりあえず使えます。

リングバッファモジュール

前回のコレをモジュール化しました。

動きは同じです。

リングバッファのサンプル

通信などに用いるリングバッファのサンプルです。

このサンプルでは、バッファの状態をグラフィカル(笑)に表示するので動きがわかりやすいかもしれません。

バッファに書き込むライトポインタとバッファから読み出すリードポインタがあり、ライトポインタはリードポインタを追い越しません。

これにより、まだ読み出されていないデータは上書きされることはありませんが、書こうとしていたデータは捨てられます。

それを防ぐためには、書込み/読出しの頻度差(通信速度差ともいえます)に見合ったバッファサイズに調整する必要があるでしょう。

AVR シリアル通信サンプル その1

UARTのもっとも単純なサンプルを置いておきます。

デバイスはATMEGA88P、クロックは工場出荷状態の内蔵RCオシレータで9600bpsです。

このままでは実用的でないです。

とくに受信部分は割り込み処理とバッファが別途必要ですがそれはまた後日。

2013/05/08

AVR Dragon の debugWIRE 使用上の注意

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 します。

  1. AVR Studio を起動し AVR Dragon と PC をUSBケーブルでつなぐ。

  2. AVR Dragon の HVPP ソケットに AVRマイコンを差し込む。

  3. AVR Studio > Tools > Device Programming

  4. Interface = HVPP > Apply

  5. 左ペインの Fuses を選択し、 DWEN をチェック。 Program を押す。


次に HVPPソケットから AVRマイコンを外してターゲット基板に実装し、ISPコネクタと接続します。

debugWIRE でデバッグするのに最低限必要な結線を下図に示します。

ここで、ターゲット基板に専用の電源回路がある場合(ふつうはこれ)は、ISPコネクタの 2番ピン(VTG)は接続しません。

ターゲット基板に電源回路がない場合は、しかたないので接続します。ただし、その場合は AVR Dragon から+5Vを供給することになるので、ターゲット回路の電源系は+5Vとなります。もし 3.3V系のICなどが接続されている場合は壊れる可能性があるので注意が必要です。


結線ができたら、あとはふつうにデバッグを始められます。

  1. ターゲット基板の電源を入れます。

  2. Alt + F7 を押して プロジェクトのプロパティを開き、左ペイン > Tool > Selected debugger/programmer = AVR Dragon, Interface = debugWIRE

  3. ソースにブレークポイントを仕掛けて、F5(Continue)します。
    実行中は AVR Dragon の赤LEDは点灯せず、緑が点灯/点滅しています。もし、赤が点灯している場合は何かがおかしいです。

デバッグまでの手順は以上です。


余談その1

上の結線図にもありますが、ISPコネクタの2番(VTG)はターゲット基板に接続する必要はありません。このピンは AVR Dragon から 5V が出力されており、これをターゲット基板の電源として使うこともできますが、単純なブレッドボード上での評価用と割り切ったほうがいいと思います。特にターゲット回路の電源が5Vより低い場合(3.3V系など)はターゲット回路を壊す可能性があるため、このピンはオープンのままのほうが無難です。

余談その2

ブレークポイントを仕掛けても止まらないとか、ローカル変数がウォッチできない場合は、コンパイル時の最適化が効いていることが原因かもしれません。その場合、次のようにして最適化を無効にします。

Alt + F7 を押して プロジェクトのプロパティを開き、左ペイン > Toolchain > AVR/GNU C Compiler > Optimization > Optimization Level = None(-O0)

最適化OFF

余談その3

AVR Dragon のマニュアルによると、大きい方のLED が黄色に光っているときは、AVR Dragon のファームウェアがコンフリクト(?)しているらしいので、ファームウェアをアップデートする必要があります。

余談その4

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 mini 2011 (OS X 10.8.3 / Mountain Lion)
  • Parallels Desktop 8
  • Windows XP Home SP 3 / Windows 7 Home x64
  • AVR Studio (Atmel Studio) 6.1 / 5.1
  • AVR Dragon

2013/05/07

Parallels Desktop に入れた Windows で、なぜか日本語キーボードになる件

英語キーボードをつないだMacなのに、Parallels Desktop に入れた Windows XP ではなぜか日本語配列になってしまうのを治す方法です。

要はキーボードのドライバを入れなおせば解決するのですが、ちょっと煩雑なのでおぼえがきとして残しておきます。

  1. Windows > スタートボタン > コントロールパネル > キーボード

  2. 「ハードウェア」タブ > 「101/102 英語キーボードまたは …」を選択 > 「プロパティ」ボタン > 「ドライバ」タブ > 「ドライバの更新」ボタン

  3. 「いいえ、今回は接続しません」をチェックして「次へ」 > 「一覧または特定の場所からインストール」をチェックして「次へ」 > 「検索しないで、インストールするドライバを選択する」をチェックして「次へ」 > 「101/102 英語キーボードまたは …」が選択された状態で「次へ」 > 上書きしてもいいか聞いてくるので、「はい」 > 「完了」ボタン

  4. Windows を再起動

これで直るはずです。

下記は、参考までにこちらの環境です。

  • Parallels Desktop 8
  • Windows XP Home/Pro

2013/05/04

Mac でCOMポート

COMポートに何かをつないで通信したいときは、Windows PC の場合は TeraTerm Pro を使うのが定番です。

Macの場合は TeraTerm Pro の代わりに CoolTerm が紹介されていることが多いですが、実は無くてもできてしまいます。

COMポートは /dev/tty.xxxxxxx という名前で列挙されています。このデバイス名さえ分かれば、下記のように screen コマンドを使うことで手軽に通信することができます。

$screen /dev/tty.usbserial-A101XXXX 115200

上記は、FTDIの仮想COMポートに 115200 bps で接続する例です。

2013/04/25

CSS の margin パラメータ数の違い

たまに CSS を書くと毎回忘れているのでメモです。

margin、padding、border などに適用するときの、上下左右の指定方法です。

  • パラメータ4つ margin: U R D L
  • パラメータ3つ margin: U RL D
  • パラメータ2つ margin: UD RL
  • パラメータ1つ margin: ALL

未だに、3つ指定したときのが覚えられない…

2013/04/23

Pyhton で JPEG画像を添付してメールを送信

前回の、

Pyhton で GMail の smtp で UTF-8 なメールを送信

のつづきです。

今回は JPEG画像を添付してメールを送ります。

テキストだけのメールであれば MIMEText()で用意したメッセージだけでいいのですが、添付ファイルをつけるとそれ以外に2種類のメッセージが必要になります。

  • 本文テキスト用 MIMEText()
  • 添付ファイル用 MIMEImage()
  • コンテナ用 MIMEMultipart()

ここで、添付ファイル用のメッセージはファイルごとに必要です。 ですので、添付画像が1つであっても合計で3つのメッセージが必要ということになります。

コンテナ用のメッセージの中に、他の2種類を格納して送信します。FromTo を設定するのは、コンテナ用のメッセージに対して行います。

2013/04/19

Elisp のトグル動作や内部カウンタはクロージャを使う

よく忘れるので、メモしておきます。

トグル動作をさせたい場合や、内部のカウンタを使いたいときは、スタティック変数が欲しいところです。 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 した vfunc1 がカウンタに使っている v は別物ということです。

カウンタではなく、トグル動作にしたい場合は

(defun cage1 ()
  (lexical-let ((v nil))
    (defun func1 ()
      (setq v (not v)))))

とします。

2013/04/17

Google の Custom Search Engine で画像を検索するサンプル

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つの文字列をコードに埋め込みます。

参考リンク

2013/04/15

BloggerにGistを貼り付けると、前後に空行が入ってしまう

いつのころからか、ブログに Gist を貼り付けると、前後に5行ほど空行が入ってしまうようになりました。

といいますか、行番号の対応がずれてしまうのか、とにかく見栄えがよくありません。

before

対策としては、ココ によると、CSS を追加してやれば良さそうです。

以下は Blogger での手順です。


1.Blogger にログイン

2.テンプレート > カスタマイズ > 上級者向け > CSS を追加 とたどり、下記を入力

/* for Gist */
.line-numbers, .line-pre > .line {
    font-size: 12px;
    line-height: 1.4;
}

3.「ブログに適用」ボタンを押す。


以上です。これで、下のようになりました。

after

フォントも小さくなって、いい感じです。

なお、CSS のクラス名はときどき変わるようなので、もしまた崩れたら見直す必要がありそうです。

参考にさせてもらったサイト

Pyhton で GMail の smtp で UTF-8 なメールを送信

Python でメールを送信すること自体は簡単です。

しかし、GMail のSMTPサーバーを使ったり、日本語のメールを送信しようとすると、ちょっとコツがいります。

いつも忘れてしまうので、サンプルとして残しておきます。

考えなければならないことは、

  • 要ログイン (user, pass)
  • 要SSL (port 587)
  • 要STARTTLS
  • MIMEText は 要エンコード(UTF-8等)

あたりでしょうか。

2013/04/12

MYO:腕の筋肉の動きを検知するコントローラ

myo

MYO:THE NEXT GENERATION OF GESTURE CONTROL がとても気になります。

APIが公開されるというのもいいです。

スティーブ・ウォズニアックのコメントにもシビレました。

発売は来年の予定らしいですが、未来が買えると思えば、$149は破格に思えます。

2013/04/11

Google の検索結果に表示される 著者の写真を非表示に

検索結果に表示される、ページの著者の写真を消したいという話しです。

たぶん1年ほど前からではないかと思うのですが、検索結果にそのページの著者のサムネイル画像が表示されるようになりました。

before

検索するたびに、知らない人の顔がずらっと表示されるのは、ちょっと疲れます。

著者の方々には申し訳ないのですが、ブラウザのカスタム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; }

これで、次回の検索から著者の写真が非表示になるはずです。

after

次に Safari (Mac) の場合です。

Safari も同じようにできますが、ファイルの指定方法が若干異なります。

Safari の場合は、上記の1行を書いたファイルを適当な名前で保存しておき、Safari > メニュー > 環境設定 > 詳細タブ > 「スタイルシート」プルダウンメニュー > 「その他...」と辿り、そのファイルを選択します。

Safari の場合は、上記操作の直後にサムネイル画像が非表示になります。

また、CSS3に対応していない古いブラウザでもできそうですが、その場合は、(すこし力技ですが)下記のようにすればいいと思います。

#apthumb1,#apthumb2,#apthumb3,#apthumb4,#apthumb5,#apthumb6,#apthumb7,#apthumb8,#apthumb9,#apthumb10 {
    display: none;
}

Mac の Safari で Backspace (DEL) キーで前のページに戻るようにする

最近の Safari は なぜか Backspace (DEL) キーで前のページに戻ることができないです。

下記をターミナルで実行したあと、Safari を再起動すると希望の動作になると思います。

$defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2BackspaceKeyNavigationEnabled -bool YES

関係しそうなバージョン

  • Safari 6.0.3
  • OS X 10.8.3 (Mountain Lion)

参考にさせてもらったサイト

2013/04/10

Spotlight を grep find の代わりに

ack を入れてはみたものの、Mac では Spotlight があるのでもっと速いのできそうな気がしました。

Spotlightのコマンドライン版である mdfind で grep find の代わりになるシェルスクリプトを書いてみました。

gという名前で保存し、chmod +x して

カレントディレクトリで文字列'hoge'を検索
$g hoge

ディレクトリ'doko'で文字列'hoge'を検索
$g hoge doko

ルートディレクトリで文字列'hoge'を検索
$g hoge /

というぐあいに使います。

インデックスができていないと使えないのですが、Sportlightのインデクシングは素早いので個人的には十分実用になっています。

ack を MacPorts で入れてみる

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 を入れるのはちょっとめんどくさいという話しでした。

C-u つきの query-replace は正規表現で

  • M-% で、ふつうの置換(query-replace)
  • C-u M-% で、正規表現で置換(query-replace-regexp)

というふうにしたいです。

(defun my-query-replace (arg)
  (interactive "P")
  (let ((current-prefix-arg nil))
    (call-interactively
     (if arg 'query-replace-regexp 'query-replace))))

xyzzy でもこんなのを書いたような…。

Python でもスクラッチバッファで対話したい

果てしなく車輪の再発明っぽいのですが、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 向けに

コードスニペットを 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つづつ入れます。

2013/04/09

Mac のターミナルでスクロールバッファをクリアする

よく忘れるので、メモしておきます。

  • Cmd + k
  • メニュー > Edit > Clear All

で、スクロールバッファをクリアできます。

Mac 標準のターミナル.app でも iTerm でも同じようです。

ちなみに Ctrl + l はプロンプト行をターミナルの先頭に移動するだけで、スクロールバッファはクリアしません。

2013/04/04

モードラインにファイルのフルパスを表示

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-fullpathdefine-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)
)

参考リンク

2013/04/01

Finder に 「上へ」ボタンを

Up button screenshot

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 過酷っす。

パトラッシュ、ぼくはもう疲れたよ。

2013/03/27

「Finderで開く」が効かないときの対処法

Mountain Lion では、ときどき「Finderで開く」が効かなくなることがあります。

下記をターミナルで実行すると治ります。

$sudo killall -KILL appleeventsd

Spotlight の検索結果を Cmd + 右クリックして、ファイルの場所を Finder で開く場合にも有効です。

ターミナルが苦手な場合は、アクティビティモニタから「appleeventsd」を停止させてもいいです。

参考リンク

2013/03/25

iPhone の距離表示を miles → km にする

iPhone を英語(US)の設定で使っていると、Mapsなどでの距離表示は、当然ですがマイル表示(miles)になります。

「マイルで言われてもわからんし」ってときは、下記のようにカナダにすると km 表示にできます。

Settings > General > International > Region Format > Canada

こうすると、時刻フォーマットは英語圏のままで、距離表示だけを miles → km になります。 通貨単位は未確認です。

2013/03/22

Emacs のモードラインを平面化する

EmacsをGUIで起動すると、モードラインは縁がついて3Dっぽくなります。 しかし、最近のGUIは平面的なものが多いので、Emacsのモードラインも平面的にしてみます。

(set-face-attribute 'mode-line          nil :box nil)
(set-face-attribute 'mode-line-inactive nil :box nil)

3D(デフォルト) 3D(デフォルト)

平面化 平面化

powerlineには平面的なモードラインが似合いそうな気がします。

Emacs のタイトルバーにバッファ名かファイル名を表示する

タイトルバーにカレントバッファのバッファ名かファイル名を表示します。

カレントバッファがファイルを開いていたらファイル名を、そうでなかったらバッファ名を表示します。

(setq frame-title-format
      (if (buffer-file-name)
          (format "%%f - Emacs")
        (format "%%b - Emacs")))

%%b とかは、モードラインの書式に似ているので、M-x apropos mode-line-format で調べると分かります。

なんか、.emacsを紛失するたんびに書いているような気もしますが…。

2013/03/14

ブログに関連する記事を Outbrain で表示してみる

ブログに関連する記事を表示するブログパーツ LinkWithin を使っていたのですが、ブログを引越しするとなぜか表示されなくなったので、Outbrain を試しています。

LinkWithinとは違い、Outbrain は ユーザー登録しないと使えませんが、細かい設定ができたりアクセス履歴を見れたりします。

ただ、肝心の「関連する記事をピックアップする機能」が LinkWithinよりも下手な気がします。日本語向けの最適化が甘いのかもしれませんが、もう少し様子を見てみたいと思います。

2013/03/11

Emacs から Mac の Quick look を使う

(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 自体がビミョーってのもあるんですけど。

2013/03/09

Emacsでフォントを拡大・縮小

最近の 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)))

2013/03/08

cycle-buffer.el は古いらしい

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 ですね。