2011年4月30日土曜日

テープ起こしに Express Scribe - ホットキーのカスタマイズと、再生時間の挿入

1. テープ起こしに必要な機能

テープ起こしをするためのアプリを探している。

要件は 2 つ。

  1. 「再生・停止・巻き戻し・早送り」のホットキーをカスタマイズできる
  2. 再生している時間を簡単に挿入できる

以前に Okoshiyasu2 を使ったことがある。このアプリケーションは、音声の再生に特化しており、エディタは付属していない。できればエディタと音声の再生機能が一緒になっているものを利用したい。

ベクター で調べてみると、Voice Writing が iTune のようなインターフェイスで綺麗。使いやすそうだけれど、自分の環境では途中でなぜかホットキーが無効になってしまった。

http://www.nch.com.au/scribe/index.html

Digital Transcriber
via kwout【音声ソフト10連発】第2回 | テープ起こしならokoso(オコソ) では、

というソフトが紹介されている。次のように特徴が述べられていた。

1)ホットキーが使える…○
2)再生・停止が同じキーでできる…×
3)ちょっと戻り(オートバックスペース)ができる…○
4)速聞き・遅聞き時に音程が変わらない…○
5)ノイズ除去など…不明(英語なのでよく分からない、すみません!)
6)その他…多くの音声形式に対応している、ブックマークが付けられる。
7)価格…無料

再生と停止が同じキーが使えないのが残念だけれど、こういった類の海外製を試したことがないので使ってみることに。

 

2. Express Scribe のホットキーを設定する

CropperCapture[163]最初に、ホットキーの設定を行う。

メニューより、

  • Options > System-wide hot-keys

基本操作は以下のようにした。

  • Alt + J : Pay
  • Alt + M : Stop
  • Alt + L : Fast Forward
  • Alt + K : Rewind

再生スピード

  • Alt + U : Play Real Speed
  • Alt + I : Paly Slow Speed
  • Alt + O : Play Fast Speed

CropperCapture[165]

追記(2015/4/5): 再生と停止のホットキーを変更した。

  • Alt + Space : Play
  • Ctrl + Space : Stop

SnapCrab_No-0014

 

再生時間の挿入
Ctrl + Shift + T で時間の挿入。

これはメニューの Notes > Insert > Time にショートカットキーが書かれている。

 

3. 各種時間の設定

デフォルトでは「早送り・巻戻し」される時間が短かい。

メニューより、

  • Options > Playback

Rewind and fast forward > Rewind, Forward の値を 5000 ms とした。

また、停止した後に自動的少しだけ戻すために、

  • Playback > Auto backstep on stop

を 1000 ms に設定。

CropperCapture[166]

 

4. データの管理

読み込んだ音声データと、書いたノートは

  • Options > Disk Usage > Data folder

で設定されているフォルダに存在する。デフォルトでは以下の場所。

  • C:\Users\ユーザ名\AppData\Roaming\NCH Swift Sound\Scribe

 

データの復活

音声データを選択し、メニューより

  • File > Done

を選ぶと「音声データとノート」がメインウィンドウから消える。

復活させたい場合は、

  • File > Recovory Old Dictation

を選択すると元に戻せる。

2011年4月29日金曜日

Firefox 4 の「タブのグループ分け」 (Panorama) を多用するようになった - Chrome には Tab Sugar

1. 思っていたよりも使いにくい、タブのウィンドウへの独立化

Firefox 4 では、タブをウィンドウからスムーズに独立させることができる。しかし、このスムーズというのは「内部で再生されている動画が停止しない」という意味でしかなく、残念なことにアドオンの利用が増えるに従い動作が緩慢になった。

また、タブをウィンドウとして独立化させるとき、つかんだタブを離した位置にウィンドウとして開かれるない。独立前のウィンドウに重なるにして開かれるので、操作の直感に反する。

Chrome, Safari では、タブをドロップした位置にウィンドウが開かれるので使いやすい。

 

2. 手に馴染んでしまった、タブグループ分けのショートカットキー

CropperCapture[159]結果、タブを独立させることはせずに、分離させたいと思った瞬間、ショートカットキー

Ctrl + Shift + E

を押し、Panorama を起動。 タブをグループ分けするようになった。

当初、「Firefox 4 へ移行するための設定」 では、

Firefox 4 は外観の変化も去ることながら、Google Chrome と同じように、複数のタブを開いているときに、Youtube で動画を再生しているタブを D&D してウィンドウとして独立させても、再生が止まることがない点が魅力的。自分としては新しく追加された機能、

よりも重要。

なんて言ってたのに、タブをグループ分けしないで使うことが全く考えられなくなった。 (@_@;

 

3. Panorama の使い方と設定

ボタンの位置を変更

タブのグループを起動するためのボタンは、隅の方に配置していたけれど、

CropperCapture[133]

多用するようになったので、押しやすい位置にボタンを配置。

CropperCapture157

 

タブの検索

タブをたくさん開いたときに、目的のものを探すのも簡単で見やすい。

  1. Ctrl + F
  2. 文字の入力

でスポットライトが当てられ、Enter によって開かれる。これによりマウスいらず。

CropperCapture[160]

 

新規グループに新規タブ

新しいグループを作り、新規タブを開きたいときは、

  • グループ化されてない領域でダブルクリック

操作性が非常に良い。

これにはショートカットキーは割当てられてないのかな?

 

アニメーションをさせない

もし、PC の処理性能が低く、開いたり閉じたりするときのアニメーションを切りたければ、ロケーションバーで

about:config

を入力し、

browser.tabs.animate
trueからfalseに。

(Tei SPe ぶろぐ:Firefox4.0 Beta - アニメーションを止めてみる より)

 

4. Chrome に Tab Sugar

自分としては、全く注目してなかった機能だったので、

「使ってみないと、その必要性ってわからないものだ」

と、つくづく実感。てゆうか、この機能のないブラウザはもう使う気になれない。

Google Chrome にも、同様の機能を追加してみることにした。

複数のタブを簡単にグループ分けしたり整理したりできるChromeのアドオン「Tab Sugar」 : ライフハッカー[日本版] によると、

Tab Sugarでは、Panoramaと同じようにタブのグループを作り、スクリーン上でそれを整理したり分類したり、オープンもしくはクローズドなグループに分けたりできます。グループ間のタブの移動は、ドラッグ&ドロップするだけです。

Tab Sugar をインストール。

オプションで Firefox と同じショートカットキーを割当てた。

CropperCapture[161]

でも、まだ動作が安定してないようなので、今後に期待。

語源を調べやすい英英辞典 - Your Dictionary

1. 英和辞典のアルクは例文が豊富

英単語を調べるときは、スペースアルク を利用している。例文が豊富なので、単語の使われ方が把握しやすく、意味をイメージしやすい。

ブラウザのロケーションバーから、スマートキーワードを利用して検索するには、以下の URL をブックマークしておく。

http://eow.alc.co.jp/%s/UTF-8/

 

2. 語源を調べる

調べたい英単語が馴染のない言葉である場合、英和辞典では、自分の知識の中に取り入れにくい。理由は、英和辞典では、単語の意味を、日本語に置き換えるだけだから。

例えば、“demarcate” という単語を調べた場合、

【他動】

    ~の境界を定める、~と一線を画する

この単語が頭に入っていなければ、何度も出会わない限り、記憶できる気がしない。

これに対し、「単語の成り立ち・語源学習法 ちょんまげ英語塾」には、効果的な英単語の学習の方法が述べられている。

… 「多くの」英単語も漢字も法則性のある組み合わせで成り立っているということでござる。ちなみに英単語の場合は接頭辞+語根+接尾辞という組み合わせで成り立っているのでござる。

接頭辞は単語全体に意味を付与する働きをし(と同時に品詞を作る場合もある)、語根はその単語の中心となる部分であり、接尾辞はその単語の品詞を決定する …

接頭辞や接尾辞や語根を頭の片隅に入れておけば、単語学習の手助けになるはずでござるから一覧を作ってみたでござる。単語を辞書で調べた時などに派生語や関連語を意識すると良いでござるよ。

接頭辞一覧 接尾辞一覧 語根一覧

つまり、接頭・接尾辞に注目すると、既存の知識と関連付けて覚えやすい。

 

3. 語源を調べやすい辞書

オンラインで引ける英語の辞書(英英・語源・類義語・スラング辞典) - 英語のゆずりん」において、

語源や類義語も表示。用例がほかに比べて非常に豊富なのが特徴です。

と紹介されていたのは、

試しに、先ほどの単語を調べてみると、単語ごとに Origin: という欄が設けられれているのがわかる。

demarcate

Origin: back-form. < demarcation

リンクを辿っていくと、demarcation

Origin: Sp demarcación (in línea de demarcación, 1493) < de- (L de), from + marcar, to mark boundaries < Gmc *marka, a boundary, mark

Origin: Spanish demarcación, from demarcar, to mark boundaries : de-, off (from Latin dē-; see de- ) + marcar, to mark (from Italian marcare, from Old Italian, of Germanic origin; see merg- in Indo-European roots).

スムーズに `mark, de-‘ の意味にアクセスできた。

こうやって単語に見慣れていけば、最低限の知識で意味を推測できるようになるかな。

 

4. 語源を持つ、英英辞典を検索

追記(2012.2.23): YOUR DICTIONARY で語源が表示されなくなった。

そこで、調べたい単語に origin を付けて検索。

その結果、いくつか語源を表示する辞書があった。

また、語源を複数の辞書から、検索してくれるサイトもある。

「"Pictures.library-ms" は現在機能していません」のエラーに対する対処

Windows Live Writer では、「画像の挿入」に対して Ctrl + J のショートカットキーが割当てられている。誤ってこのキーを入力すると、いつの頃からかダイアログが開く前後で、

"Pictures.library-ms" は現在機能していません。

が何度か繰り返されるようになり、イライラ… (+_+)

CropperCapture[158]これは Widnows 7 のライブラリに登録されているフォルダに問題があるということ。

修復するには、pictures.library.ms "no longer working" you may delete and not によると、

a. Open Windows Explorer.
b. Right-click on the corresponding library and choose Delete.
c. Click Yes when asked for confirmation.

今回のエラーは、「ピクチャ」フォルダに問題があるので、

  1. エクスプローラを開き、
  2. ライブラリ > ピクチャ を削除。

これでエラーが表示されなくなった。

Windows の自動ログオンし、管理者権限の必要なアプリを承認なしで実行

1. Windows を起動するときにパスワードを入力するのが面堂

何度も再起動を繰り返す必要がある PC の設定をしていると、起動する度にログオン画面でパスワードを入力しないといけないので面倒。

また、管理者権限が必要なアプリをスタートアップに登録していると、起動の度に承認が求められてうざい。 (@_@;

この操作をしないで済むような設定をしてみる。

 

2. 自動ログオンの設定

には、XP における設定の仕方が述べらている。この方法は Windows 7 においても同じ。

Windows キー +  R で「ファイル名を指定して実行」。

control userpasswords2

と入力して「ユーザアカウント」を起動。

「ユーザーがこのコンピュータを使うには、ユーザー名とパスワードの入力が必要」

のチェックをはずす。

CropperCapture[156]

Windows 7 で自動的にログオンするようにユーザー アカウントを構成する にも同様の手続きが述べられている。

1. [スタート] ボタンをクリックし、「netplwiz」と入力して、Enter キーを押します。
2. [ユーザー アカウント] ダイアログ ボックスで、自動的にログオンするときに使うアカウントをクリックします。設定を変更できる場合は、[ユーザーがこのコンピューターを使うには、ユーザー名とパスワードの入力が必要] チェック ボックスをオフにします。
3. [OK] をクリックします。
4. [自動ログオン] ダイアログ ボックスでユーザーのパスワードを 2 回入力し、[OK] をクリックします。
次にコンピューターを再起動すると、選択したローカル ユーザー アカウントで自動的にログオンされます。自動ログオンを構成すると、ユーザーのパスワードは暗号化されていない状態でレジストリに格納されます。この場所からパスワードを取得することができるので注意が必要です。

 

3. ログオン時に管理者権限が必要なアプリを承認なしで起動

Windows7で管理者権限が必要なアプリをスタートアップに登録したい」 によると、

タスクスケジューラを使って、最上位の権限で起動するようなタスクを作り、起動タイミングをログオン時にしてあげる

タスクスケジューラを起動するには、

  • スタート > すべてのプログラム > アクセサリ > システムツール > タスクスケジューラ

ここではウィザードを利用するのが便利。

  • 操作 > 「基本タスクの作成」を選択。

CropperCapture[175]

適当に名前を付ける。

CropperCapture[176]

「ログオン時」をチェック。

CropperCapture[177]

「プログラムの開始」を選択。

CropperCapture[178]

プログラムの指定は、起動したいプログラムのプロパティを開き、「リンク先」のフィールドをコピーするのが簡単。

CropperCapture[179]

「完了」をクリックしたときに、このタスクの[プロパティ]ダイアログを開くにチェック

CropperCapture[181]

ダイアログが表示されたら、「最上位の特権で実行する」にチェック。

CropperCapture[182]

2011年4月27日水曜日

Blogger で記事を投稿するときに HTML のエラーが表示されたら

Blogger で記事を投稿する際、

  • 「HTML の編集」

を利用していると、以下のようなエラーが表示されることがある。

作成された HTML ファイルは承認できません: 終了タグが開始タグと一致していません: A

CropperCapture[174]

これはどこかで HTML のタグを書き間違えているということ。上例の場合、どこかの A タグに問題がある。

Blogger の投稿画面で A タグを検索しても良いけれど、記事が長いと結構大変。 (+_+)

 

HTML を検証するためのツールを手がかりに

代わりに Another HTML-lint gateway を使い、HTML の検証をすると問題の箇所を早く見つけることができる。

  1. 上記サイトにアクセスし、Blogger に投稿しようとした HTML のソースを DATA フィールドに貼り付け。
  2. DATA にチェックを入れ、「チェック」ボタンを押して検証。
http://openlab.ring.gr.jp/k16/htmllint/htmllint.html

Another HTML-lint gateway via kwout

結果がたくさん表示されるので、当該箇所を見つけるのに、

この場合、

<A>

で検索したら、

9: line 39: </A> に対応する開始タグ <A> が見つかりません。

をすぐに見つけることができた。

ちなみに、HTML のソースが一行にまとまっている場合、Windows Live Writer などを使い、HTML を整形してからの方が結果が見やすくなる。

 

参考サイト

2011年4月26日火曜日

ブログに対する「つぶやき」を Topsy を利用してフィードリーダーでチェック

1. ブログに対する Twitter の反応を見たい

自分のブログに対する Twitter のつぶやきをチェックしたい。

ただし、自分自身のツイートは除きたい。

 

2. Topsy で検索し、フィードを購読する

Topsy で、フィールドに以下の形式で入力して検索。

site:ドメイン名 –from:除きたいTwitter名

例えば、このブログに対するツイートで、自分 (jutememo) 以外を表示するには、

site:jutememo.blogspot.com -from:jutememo

左上にある

最新の検索結果

を選択。

画面右に表示される

rss 検索結果を購読

をクリックして、フィードリーダーに登録する。

http://topsy.com/s?allow_lang=ja&q=site%3Ajutememo.blogspot.com+-from%3Ajutememo

Topsy via kwout

Haskell でリストの要素を swap する 9 つの方法

0. Python でリストの要素を swap する方法

Python で「リストの特定のインデックス i, j の要素を swap したい」場合、以下のように書ける。

def swap(i, j, ary):
    tmp    = ary[i]
    ary[i] = ary[j]
    ary[j] = tmp

要素を交換するために、一時的に値を退避させておく変数 tmp を利用し、要素を上書き。

多重代入を使うなら、一時変数を省略できる。

ary[i], ary[j] = ary[j], ary[i]

こういった操作ができるのは、Python ではリストが「変更可能なシーケンス型」として定義されているため。

では、同様のことを変数の更新ができない Haskell ではどのように書けばよいのか?

 

1. データコンストラクタによる分解と take, drop 関数を使う

例えば、具体的に 0 ~ 7 を要素に持つリストの 2 番目と 5 番目の要素を交換したい場合で考える。

CropperCapture[155]

典型的なリスト処理は、リストをデータコンストラクタで分解し、要素を先頭から末尾へと辿る。

先頭の要素 0 から見て、交換したい要素の位置は 2 番目と 5 番目。これを一つ後ろに進め、要素 1 から見た場合、交換したい要素の位置は 1 番目と 4 番目になる。同じように要素 2 から見たら、0 番目と 3 番目。

CropperCapture[156]

つまり、先頭から末尾へと視点を移していくと、交換したい要素の位置が相対的に変化する。これを利用して swap 関数を考えればよい。

交換したい要素の小さい方のインデックスが 0 より大きい場合は、元の要素をそのまま返す。データコンストラクタで (x:xs) のように分解したとき、リスト xs に対しては swap する位置を 1 ずつ変化させて再帰的に定義。

swap i j (x:xs)     = x : swap (i-1) (j-1) xs

次に、交換したい要素の小さい方のインデックスが 0 となった場合。以下のように区分けすれば take, drop 関数を組み合わせればよいことがわかる。

CropperCapture[157]

swap 0 j xs'@(x:xs) = xs' !! j : take (j-1) xs
                      ++ x : drop j xs

全体は gist: 940061 — Gist

 

2. スライスしてから結合

別の方法としては、予め特定のインデックス間の要素をスライスする関数をしておき、下図の黄色の部分を取得した後、 swap する要素を結合して、最後に全体を合わせる。

CropperCapture[159]

slice 関数は、ライブラリに定義されている splitAt 関数を利用して定義。

CropperCapture[158]

slice i j = snd . splitAt i . fst . splitAt (j+1)

これを使い、

swap i j xs = let a = slice' 0     (i-1)
                  b = slice' (i+1) (j-1)
                  c = slice' (j+1) (length xs - 1) 
              in a ++ (xs!!j):b ++ (xs!!i):c
    where
      slice' i j = slice i j xs

全体は gist: 940063 — Gist

 

3. 累積変数でインデックスを付ける

Python のリストはインデックスが付いている。しかし、Haskell のリストは付いていない。インデックスが利用できれば swap 関数を考えやすいのではないかな?

累積変数でインデックスを代替する方法を考える。

swap i j xs0 = swap' 0 xs0
    where
      swap' idx [] = []
      swap' idx (x1:xs1) | idx == i  = xs0 !! j : swap''
                         | idx == j  = xs0 !! i : swap''
                         | otherwise = x1       : swap''
          where
            swap'' = swap' (idx+1) xs1

gist: 940091 — Gist

 

4. zip 関数でインデックスを付け、累積変数を使い末尾再帰

インデックスを付けるなら、累積変数を使うよりも zip 関数を使う方が楽。予めインデックス付けしてから関数を適用する方法に変更してみる。

ついでなので、累積変数 acc を利用し、末尾再帰で定義。

CropperCapture[160]

swap i j xs0 = swap' [] withIdx
    where
      withIdx = zip [0..] xs0

      swap' acc []                         = reverse acc
      swap' acc ((idx,x1):xs1) | idx == i  = swap' ((xs0!!j):acc) xs1
                               | idx == j  = swap' ((xs0!!i):acc) xs1
                               | otherwise = swap' (x1:acc)       xs1

gist: 940084 — Gist

 

5. 畳み込み関数

データコンストラクタでリストを分解し、順に要素を辿っていくのなら、畳み込み関数を使った方がスッキリと書ける。

累積変数 acc を用意し、そこへ要素を追加すると伴に、インデックスを更新していく。

CropperCapture[161]

swap i j xs = reverse $ fst $ foldl f ([],0) xs
    where
      f (acc, idx) x | idx == i  = (xs!!j:acc, idx+1)
                     | idx == j  = (xs!!i:acc, idx+1)
                     | otherwise = (x:acc, idx+1)

gist: 940099 — Gist

 

6. map 関数でシンプルに

考えてみたら、データコンストラクタによる分解、累積変数、畳み込み関数とか面倒なことを考えなくても、map 関数で個々の要素を変換する方法が一番考えやすくないかな?

CropperCapture[162]

swap i j xs = swap' withIdx
    where
      withIdx = zip [0..] xs
      
      swap' = map f
          where
            f (idx, x) | idx == i  = xs !! j
                       | idx == j  = xs !! i
                       | otherwise = x

gist: 940129 — Gist

 

7. オブジェクト指向的に考える

実は、一番最初に考えた方法は全然違う。オブジェクト指向で考える方が馴染みがあるので、個々の要素に自分で考えてもらう方が自然な感じがする。

頭に入れておくことは、個々の要素が把握できる情報を、

  • 自分の持っている値
  • 自分よりも後ろにあるリスト

の 2 つだけだと制約を付けて考えること。

イメージしやすいように、リストを一方向リストで描く。

CropperCapture[164]

リストをデータコンストラクタの分解により、先頭から末尾のリストへと次々に swap 関数を適用していくことをイメージする。

CropperCapture[165]

swap 0 3 xs となったとき、リスト xs は自分の持っている値 (先頭要素) が swap 対象であることを知る。ここから後ろのリストに対して、この要素が保持する値を swap する値を取得したい。この役割を担うのが関数 idxAt 。

CropperCapture[166]

idxAt を後方のリストに対して次々に適用していく。

CropperCapture[167]

目的の要素に辿り着いたら、その値を返す。

CropperCapture[168]

これで swap するための片方の値 5 を取得できた。

次に、先ほどの swap 0 3 xs のときに戻り、もう片方の値を swap するため、後方のリストへ自分が保持する値 2 を渡していく。この役割を担うのが関数 set 。

CropperCapture[169]

後ろのリストへ set 関数を適用していく。

CropperCapture[170]

目的の要素に辿り着いたら、要素を置き換える。

CropperCapture[171]

以下が上記を実現したコード。

swap 0 j (x:xs) = idxAt (j-1) xs : set x (j-1) xs
    where
      idxAt 0 (x:_) = x
      idxAt j (_:xs) = idxAt (j-1) xs

      set x 0 (_:ys) = x:ys
      set x j (y:ys) = y:set x (j-1) ys

swap i j (x:xs) = x : swap (i-1) (j-1) xs

gist: 940153 — Gist

 

8. State モナド (1)

全く別の方法として、効率も何もかも無視し、「状態の変更」という視点から State モナドを利用したらどう書けるか試す。

さて、何をどう考えればいいのか?

下図のように想定する。

  • 内容が変更されると想定する「リスト」と「一時変数」を用意

これが時刻 t0 ~ t3 において、以下のように変化すると考える。

  1. 時刻 t0 : リストを swap する前の状態。
  2. 時刻 t1 : 一時変数にリストの 2 番目の要素を代入する。
  3. 時刻 t2 : リストの 2 番目の要素を 5 番目の要素で上書き。
  4. 時刻 t3 : リストの 5 番目の要素を一時変数の値で上書き。

CropperCapture[172]

時刻 t0 における「リスト」と「一時変数」の状態を、時刻 t1 の状態に変更する関数を f1 とする。( 以降それぞれ f2, f3 と仮定。 )

State モナドを利用する場合、型を合わせるために「状態を変更する関数」を

s –> (a, s)

という型であると想定する必要がある。

関数 f1 ~ f3 の関数を上記の型に合うように考えるなら、

f1 :: ([a], a) –> ((), ([a], a))

しかし、これだとごちゃごちゃして見にくいので、予め以下のように別名を付けておく。

リストは、

type Ary a = [a]

一時変数は、

type Temp a = a

上記 2 つを合わせたものを、

type Vars a = (Ary a, Temp a)

これにより、先ほどの f1 を以下のように書ける。

f1 :: Vars a –> ((), Vars a)

更に、ライブラリに定義されている State モナドを利用するために、

f1 :: State (Vars a) ()

という型に合わせる。

 

予め State モナドを利用するために、

import Control.Monad.State

関数 f1 は「一時変数にリストの i 番目の要素を代入する」。名前を toTemp とするなら、

toTemp :: Int -> State (Vars a) ()
toTemp i = State $ \(xs, tmp) -> ((), (xs, xs !! i))

get, put 関数を使って定義すると、

toTemp i = get >>= \(xs, tmp) ->
           put (xs, xs!!i)

modify 関数で置き換えるなら、

toTemp i = modify $ \(xs, tmp) -> (xs, xs!!i)

 

リストの i 番目の要素を j 番目の要素で上書きする関数を copyElem とすると、

copyElem :: Int -> Int -> State (Vars a) ()
copyElem i j = modify $ \(xs, tmp) ->
               (take i xs ++ xs!!j : drop (i+1) xs, tmp)

 

リストの j 番目の要素を一時変数の値で上書きする関数を formTemp とすると、

fromTemp :: Int -> State (Vars a) ()
fromTemp j = modify $ \(xs, tmp) ->
             (take j xs ++ tmp : drop (j+1) xs, tmp)

上記 3 つの関数を使い swap を定義する。

swapS :: Int -> Int -> State (Vars a) ()
swapS i j = toTemp i >> copyElem i j >> fromTemp j

swap i j xs = fst $ execState (swapS i j) (xs, 0)

全体は gist: 940268 — Gist

 

9. State モナド (2)

上記の State モナドでは「一時変数」に相当するものを想定した。しかし、これがなくても問題ない。

別名を付けるのも面倒なので、リストの特定のインデックスを更新する関数 update を

update :: Int –> a –> [a] -> ((), [a])

とする。 これを元に State モナドに合わせるために以下のように型を定める。

update :: Int -> a -> State [a] ()

この update 関数の定義は、

update i x = State $ \xs -> ((), take i xs ++ x : drop (i+1) xs)

先ほどと同じように get, put 関数を使うなら、

update i x = get >>= \xs ->
             put $ take i xs ++ x : drop (i+1) xs

modify 関数で置き換えるなら、

update i x = modify $ \xs -> take i xs ++ x : drop (i+1) xs

次に、リストの特定のインデックスの値を取得する関数を getIdxAt とすると、その型は、

getIdxAt :: Int -> State [a] a

この定義は、

getIdxAt i = State $ \xs -> (xs !! i, xs)

get 関数を使うと、

getIdxAt i = get >>= \ xs ->
             return $ xs !! i

関数合成を利用すると、

getIdxAt i = get >>= return . (!! i)

この二つの関数を使い swap を定義する。

swapS i j = getIdxAt i >>= \a ->
            getIdxAt j >>= \b ->
            update i b >>
            update j a

swap i j xs = (execState $ swapS i j) xs

上記 swapS 関数では変数 a, b の二つを利用しているが、一つだけでも十分。

swapS i j = getIdxAt i >>= \tmp ->
            getIdxAt j >>= update i >>
            update j tmp

do 式を使うなら、

swapS i j = do tmp <- getIdxAt i
               update i =<< getIdxAt j
               update j tmp

そういえば、get 関数を使うなら、getIdxAt 関数も必要もないか。

swapS i j = do xs <- get
               update i (xs!!j)
               update j (xs!!i)

全体は gist: 940572 — Gist

2011年4月24日日曜日

多重代入と変数の swap - Python と Ruby の比較

Python で多重代入を利用した変数の swap

Python の 6.3 代入文 (assignment statement) によると、

代入の定義では、左辺値と右辺値がオーバラップするような代入 (例えば、"a, b = b, a" を行うと、二つの変数を入れ替えます) を定義しても `安全 (safe)' に代入できます …

例えば、2 つの変数 a, b を入れ替えるなら、変数の値を退避しておく一時変数を省略できる。

a = "hoge"
b = "piyo"

a, b = b, a

print a,b         #=> piyo hoge

 

代入対象の変数にオーバーラップがある場合

注意点としては、

代入対象となる変数群 の間で オーバラップがある場合は安全ではありません!

(同上より)

次のようなケース。

ary = ["hoge", "piyo", "fuga"]
i = 100

i, ary[i] = 1, 999

print ary          #=> ['hoge', 999, 'fuga']

もし、swap が見かけ通り一つの文として同時に実行されているなら、swap を行う時点の i の値は 100 となり、ary[100] は存在しないためにエラーとなる。しかし、実際には最初の i に 1 が代入されたことにより、i の値が上書きされ、ary[1] に 999 が代入される。

以下のように順次実行されているのと同じように見える。

i= 1
ary[i] = 999

しかし、変数を a, b を swap したときのように swap させると、

ary = [1,2,3,4,5]
i = 0

i, ary[i] = ary[i], i

print i, ary

結果は、

1 [1, 0, 3, 4, 5]

となる。 右辺の i は更新される前の i の値を参照しているようで、何だかよくわからなくなってきた。  (+_+)

てっきり、以下のように実行されるのかと思った。

i = ary[i]
ary[i] = i

右辺の代入される値は、多重代入の前の変数で名前解決が行われるのかな?

i = ary[0]
ary[i] = 0

 

Ruby で多重代入を利用した変数の swap

同じく多重代入ができる Ruby で動作を確認すると、

a = "hoge"
b = "piyo"

a, b = b, a

p a,b        

次のように同じ結果となる。

"piyo"
"hoge"

また、「代入対象となる変数群の間でオーバラップがある場合」も結果は同じ。

ary = ["hoge", "piyo", "fuga"]
i = 100       

i, ary[i] = 1, 999

p ary          #=> ["hoge", 999, "fuga"]

以下も Python と同じ。

ary = [1,2,3,4,5]
i = 0

i, ary[i] = ary[i], i

p i, ary

結果は、

1
[1, 0, 3, 4, 5]

2011年4月23日土曜日

Skype 通話中に突然聞こえる大音量を抑える - VSTHost でコンプレッサとイコライザーを併用

1. 大きな音を抑えたい

Skype で通話中に咳をしたり くしゃみ をしたりすると、相手の耳に甚大な被害をもたらす。スプーンが皿にぶつかったときなど、向こうで悲鳴が聞こえる。 ^^; おかしの袋を開けるのもダメ。

これに対して、

により、ある程度対応することができる。ただし、大音量に対しては効果がない。

できれば、でかい音が入力されたら、瞬時に音を小さくして欲しい。

 

2. コンプレッサーで音量の差を小さくする

こういった要求に応えてくれる音響機器の名前は「コンプレッサー」。

VSTHost でイコライザーを使うときに参考にした記事、

で解説されている GeneComp を利用したら、非常に良かった。 ^^

ところで、コンプレッサー (音響機器) – Wikipedia によると、

コンプレッサー (compressor) は、エフェクターの一種である。音の強さの差を縮小する効果がある。…

入力音量が予め設定した一定の値(スレッショルドレベル、閾値)を超えた場合、音量の変化を設定した比率(レシオ、レイシオ、圧縮比)で抑え、設定された時間で解放(リリース)するプロセスによって、その音量の最大と最小の差(ダイナミックレンジ)を圧縮する。

細かいことはさて置き、以下のように値を設定した。

 

3. VST Host の設定

VST Host のインストールと、イコライザーの設定は以下の記事を参照。

  1. PC の音声出力に対してリアルタイムにイコライザーをかける - VSTHost とASIO4ALL
  2. USB スピーカーとヘッドホンに対して VSTHost でイコライザーをかける - 仮想的なサウンドデバイスを利用して

 

a. プラグインの配置

VSTHost におけるイコライザーと、コンプレッサの配置は以下の通り。

CropperCapture[150]

コンプレッサ GeneCompbuzzroom よりダウンロード。解凍したらフォルダの中にある、

  • (plugins)
    • GeneComp.dll

を VSTHost に D&D 。

イコライザーは前回と同じく TENTION Digital Audio の 「TDAe EQ2008S

  • TDAe EQ2008S.dll

を利用。

各プラグインの設定をするには、プラグインの Plugin Edit ボタン CropperCapture[154] を押す。

 

b. コンプレッサの設定

コンプレッサでは、大きな音が入力されたらすぐに小さくなるようにした。

  1. THRESHOLD のつまみを適当に左に回し、大きな音を抑える。
  2. RATIO のつまみを目一杯右に回し、THRESHOLD で設定した音量を超えないようにする。
  3. ATTACK のつまみを目一杯左に回し、THRESHOLD で設定した音量を超えた場合、すぐにコンプレッサが効くように。

CropperCapture[153][4]

 

c. イコライザーの設定

イコライザーの設定では、低音域を出し、高音域をカットした。

  1. イコライザーのプリセットを選ぶボタンより `LowStereto’ を選択。
  2. 左右の音の設定が同じようになるための `LINK’ ボタンを押す。
  3. 高音域のスライダーを適当に下げる。

CropperCapture[151]

2011年4月10日日曜日

CPU のオーバークロック (3) - メモリに無理をさせない設定、Core 2 Duo E8400

1. オーバークロックしたら、ブルースクリーンが頻発

BIOS でオーバークロックの設定をした後、PC に負荷がかかると、突然ブルースクリーンになる。

特に、動画を再生中によく落ちる。そのため、最新の Flash Player をインストールして様子を見た。しかし、Flash Player はブルースクリーンと関係ないようだった。

そこで、BIOS でオーバークロックの設定を見直すことにする。

 

2. まずは PC 内部のホコリをチェック

最初に、ブルースクリーンになる前の CPU の温度を確認しておく。

ブルースクリーンになる直前、 CPU の温度を見て異常に高いときは、BIOS の設定をする前に PC 内部の掃除を行うこと。必要に応じて、冷却方法を考える。

 

3. メモリの設定

次に BIOS でメモリの設定を行う。

ASUS のマザーボードでは、メモリのアクセスに関する設定は、

  • Advanced > JumperFree Configuration > DRAM Timing Control

で行う。使用しているメモリに適した値は、メモリ本体に貼られたシールに書かれている。

自分が使っているメモリは 2 種類あり、以下のように記載されていた。

  • 555-12
  • 555-13

マニュアルには「同じ種類のものを使え」と書かれている。当然、メモリのアクセスのことを考えると、同じ種類のメモリを使うのが普通だろう。これが原因で BSOD が頻発しているかもしれない。

そこで、なるべく メモリに負担がかからない設定を試みた。

 

a. メモリのアクセスタイミングの調整

上記のメモリに記載されている数字は、メモリのアクセスに関する数値。

ASCII.jp:メモリモジュールオーバークロック指南|Windows 7で行なうオーバークロック によると、

メモリアクセスの手順に必要な時間(クロック数)を表している。4つの数字は順に「CAS# Latency」「RAS# to CAS# Delay」「RAS# Precharge」「RAS# Activate to Precharge」(マザーボードによってそれぞれの表記は異なることがある)を表しており、数字が小さいほうが、メモリアクセスを開始してから、実際にデータの転送が行なわれるまでのレイテンシ(遅延)が小さくなる。 …

通常は自動設定にしておけば問題はないのだが、メモリのバスクロックを定格よりも上げると(オーバークロック)、SPD情報の設定ではアクセスタイミングが短すぎて、間に合わなくなることがある。その場合、手動でアクセスタイミングを設定して、その数を増やす(レイテンシを増やす)ことで、動作が安定する場合がある。

(装飾は引用者による)

そこで、メモリのアクセスタイミングを、メモリ本体に書かれていた数値よりも大きい値に変更した。

777-19

メモリの設定を Auto にしていると、マザーボードがメモリの設定を読み取ってくれる。この時の値は、

5-5-18

だった。上記の設定は、この値よりも大きく設定した。

その他、DRAM に関する設定は、Auto にしていたとき、

3-52-6-3-3

と表示されていた。 PC が安定しないときは、この値も、Auto にしたときよりも、大きな値となるように設定しておく。

 

b. Transaction Booster

Transaction Booster の設定をして、アクセスタイミングを調整する。

DOS/V POWER REPORT | Impress Japan によると、

「Transaction Booster」は、メモリの詳細なアクセスタイミングを高速化する設定。Enabledにするとメモリのデータ転送速度が向上するが、安定性やオーバークロック耐性の点では不利となる点に注意は必要だ。

安定性を優先させるため、

  • Advanced > JumperFree Configuration > Transaction Booster

の値を Disabled に変更。

Transaction Booster と伴に表示される値の設定については、以下を参照した。

ASUSTeK Computer Inc. -Support- FAQ P5K-E FAQ BIOS の「Transaction booster」について

Transaction booster はASUSが開発したメモリレイテンシ調節機能です。
Booster Level: 有効にした場合の設定範囲は 0 ~ 1 です。「1」を選択すると、レイテンシが小さくなりメモリのパフォーマンスが上がります。
Relax Level: 無効に設定した場合の設定範囲は0 ~ 3 です。高く設定するほどレイテンシの範囲が高くなり、メモリの安定性が増します。

  • Relax Level を 1

に設定した。

とにかく、安定しないときは、メモリのアクセスするタイミングを調整して、レイテンシを増やすのが良い。

 

c. FSB Strap to North Bridge

FSB Strap to North Bridge を調整して、メモリの規格にある上限を超えないようにした。

自分が使っているメモリの種類は、DDR2-800

DDR2-800とは、DDR2 SDRAMのチップの規格で、フロントサイドバスFSB)のベースクロックが最大400MHzである規格のことである。

DOS/V POWER REPORT | Impress Japan によると、

「FSB Strap to North Bridge」では、CPUのシステムバスクロック(FSB)情報を上書きし、メモリクロック倍率やCPU-チップセット間のデータ転送のタイミングなどを変更できる。これはBSEL modと呼ばれるアルミホイルなどでの改造方法をBIOSで可能としたものだ。数値が大きいほどCPU-チップセット間の速度はわずかに下がるが、オーバークロック耐性は高くなる

(太字は引用者による)

Advanced > JumperFree Configuration の値を

  • FSB Strap to North Bridge : 400MHz

にした。

 

4. 電圧の設定

メモリ以外に、電圧の設定も行った。

a. North Bridge Voltage を上げる

よっちゃんのチラ裏 intel Core 2 Duo E8400 オーバークロック によると、

OS起動のみでベンチはかけていないですが、
ノースブリッジの電圧を+0.15V上げないと非常に不安定でした。

以下のように電圧を設定。

  • North Bridge Voltage : 1.4V
b. SpeedStep で省電力

DOS/V POWER REPORT | Impress Japan には、

SpeedStepテクノロジ(以下EIST)の設定も本メニューに用意されている…

EISTを利用するにはWindows Vistaの電源オプションにも気を配りたい。「バランス」設定ではEISTが利用されるが、高パフォーマンスに設定するとBIOSでEISTが有効になっていても常に最大クロックで動作する。また、省電力に設定した場合は、負荷がかかっても動作クロックが上がらず、パフォーマンスも常に低い状態になってしまう。そのため、通常は標準設定のバランスに設定しておけば低消費電力とパフォーマンスの両立が可能になる。

これより、Advanced > CPU Configuration で

  • Intel SpeedStep Tech : Enabled

であることを確認し、コントロールパネル > 電源の設定で「バランス」を選択。

c. Windows の電源オプション

動作がもっさりしてる場合は、

  • コントロールパネル > ハードウェアとサウンド > 電源オプション

のプランが「高パフォーマンス」が選択されていることを確認する。

 

5. その他

不安定な USB を使わない

複数ある USB ポートの中に、安定して利用できるものと、そうでないものがある。

例えば、マウスのレシーバは動くのに、キーボードを挿すと反応がないポートがある。こういったポートを利用すると、システム全体が不安定になり、BSOD になるかも。

AI Suite を削除

Windows 上でオーバークロックを行うアプリケーションは削除した。

マウスのドライバを更新

利用しているマウスドライバ、SetPoint を最新にした。

 

関連記事

音太郎 を使いタスクバーでマウスホイールによって音量を素早く調整

音量を素早くマウスで調整するために Tray Volume を使っている。このツールを使うと、タスクバーでマウスホイールを動かすことにより音量を調整 できる。しかし、最近マウスホイールを動かしても反応しなくなることがあり、起動しなおすことが多いために代替のアプリを探していた。

音太郎」は Tray Volume の代わりになる。音量の変化が大きく画面に表示されるとこもいい。

Vector: 音太郎 - 新着ソフトレビュー によると、

起動するとタスクトレイにアイコンが常駐し、いつでもすばやく音量を変更できるようになる。…

マウスでは、

  • タスクバー上でマウスホイールを回転させる

 

各設定

起動したら、タスクトレイの「音太郎」を右クリック > 設定。

以下のように設定した。

  • 音量メーターを見やすくするため「画面上の位置」を「中央」
  • 音量を変化後、すぐにメーターが消えるように「表示時間」を「1」秒
  • キーボードでの操作はしないので、「メインキーを…」のチェックをはずす
  • 音量の変化がキー入力でされないように「キー」を削除
  • 音量の微調整ができるように「…変化音量」を「1」

CropperCapture[155]

2011年4月8日金曜日

Make Link をキー入力で素早く呼び出す

1. Firefox のアドオンMake Link をコンテキストメニューから選択するのは面倒

サイトの URL を誰かに教えたいとき、タイトルと URL をペアでコピーしてくれる Make Link を使う。

Make Link の使い方は、

  1. 対象のページで右クリック > Make Link を選択した後、
  2. HTML やプレーンテキスト等の適当な書式を選ぶ。

この操作をマウスで行うことは結構煩わしい。

 

2. なるべくマウスを使わないようにする

マウスを使わないキーボードテクニック」によると、

アルファベットや数字(つまり半角文字)から始まる選択肢に対しては、入力したキーで検索&ジャンプが行われます。

そこで、「右クリック > Make Link > 設定」において、次のようにリンクの名称を変更した。

  • HTML       ---> l HTML
  • Plain Text ---> k Plain Text

CropperCapture[153]

CropperCapture[154]これにより、右クリックした後に Make Link のサブメニューを開くためのショートカットキー、

L

を入力し、その後このキーから位置の近いキー (L, K) を押すことにより、サブメニューの項目を選択できる。

 

使い方

つまり、

  • 右クリック > L > L

で HTML の書式でタイトルとアドレスがコピーされ、

  • 右クリック > L > K

により、プレーンテキストが得られる。

 

3. 必要のないものは削除

ちなみに、使わない書式は削除し、利用頻度が高い方がメニューの上に来るようにした。

捨てて、整理整頓、シンプルライフ。

 

関連記事