パイプを使ったループの中で使用した変数をループ外で参照できない@bash

bashでパイプを使って以下のような処理をすると、ループ内の変数の値をループ外で参照できないようです。

#!/bin/bash
HOGE="hoge"
echo -e "$HOGE" | while read I ; do
    HOGE="$HOGE $I"
    echo "$HOGE"
done
echo "$HOGE"

上記を実行すると結果は以下のようになります。

hoge hoge
hoge

原因はパイプを使うと、パイプの先は別プロセスで処理されるためのようです。つまり上記では、呼び出し元の$HOGEに入っている”hoge”は呼び出し先で参照でき、結果は”hoge hoge”になりますが、ループの外、つまり呼び出し元では呼び出し先の処理が反映されないので、”hoge”になります。

なので、対策は面倒ですが一度ファイルに書き出すのがベストな気がします。

#!/bin/bash
HOGE="hoge"
echo -e "$HOGE" | while read I ; do
    HOGE="$HOGE $I"
    echo "$HOGE" > tmp
done
HOGE=`cat tmp`

Sony NW-S746 (S740シリーズ)購入

SonyのMP3プレーヤー NW-S740の32GBタイプ(NW-S746)を購入しました。1日使ってみての感想を書いてみます(主に不満ですが・・・)。ちなみに乗り換え前は4年ぐらい前のiriverを使っていたので、一部の感想はこれとの比較になっています。

  • ◎な点
    • ドラッグ&ドロップで音楽ファイルを転送でき、転送速度が結構早い。(昔のが遅すぎたのかも)
    • ドラッグ&ドロップ転送後本体でタグを読み取ってデータベースを構築してくれる。さらに数GBのファイルのタグ(1000ファイル以上)を読み取る時間は数十秒ぐらいと早い。
    • イコライザーのカスタム設定は2つ保存可能。
    • このサイズでフラッシュメモリ32GBがあり、電池の持ちも良い。(A840シリーズは少しサイズが大きいが64B版もあり)
  • ○な点
    • 上位のAシリーズ程ではないかもしれないが、それなりにノイズキャンセリング機能が効く。(以前はそもそも機能がなかったのでmazn的には機能があるだけで○)
    • ドラッグ&ドロップのフォルダは本体でも認識でき、音楽の選択も可能。
    • 音質は満足。
    • 薄い。小さい。
    • 動画も再生可能。
  • ×な点
    • ノイズキャンセリングOFFでも、ホワイトノイズが結構聞こえる。ONの場合はかなり聞こえる(ONは普通?)。また、DSEE機能をONにすると、ノイズ(CDの回転ノイズのような音)が入る。
    • ドラッグ&ドロップで転送したファイルは、フォルダ管理の機能からは転送した順(もしくはファイル名順?)で表示されるが、アルバム一覧機能は順番がなぜか9曲目からはじまり10,11,12,13,1,2,3…8,14,15…となってしまいます。常にこの順番なので、本体側のソフトのバグのような気がします。
      • ID3v2.4のタグが読み込めないようです。v2.3に変換したらうまく動いてくれているようです。
    • 曲再生中に上下ボタンでアルバム選択ができるようだがアルバム名が出てこないので、ジャケットの写真を登録していないとまったく役に立たない。そもそも全てのジャケット覚えているはずないだろ!!
    • ラジオ再生中、BACKボタンでメニューに戻るとラジオも終了する。つまりラジオ再生中はラジオのチューナー画面しか見られない。
    • 本体でプレイリスト(ブックマークとかお気に入りとも言うかも)とかが作れない。さすがに32GBもあると、作れないのは辛い。PC上で作ることはできるが、Xアプリが必須なので、ドラッグ&ドロップ派の人は無理。
    • ラジオの感度がいまいち。
    • ポケットに入れていると、すぐに何かボタンを押してしまう。ホールドにしていても、触る度に画面にホールド中の旨の表示が数秒出るので、その分電池の減りが大きくなる。
    • ボタンにあまり凹凸がないので、押し間違えることが多々ある。(慣れの問題かも)
    • メニュー操作中にすぐに曲再生の画面に戻れない。(再生ボタンの長押しとかで簡単に戻れたら便利なのに)
    • 画面の明かりが最低でも15秒待たないと消えない。(以前のiriverでは5秒にしてました)
    • 早送り、巻き戻しの速度が変更できない。

32GBで40時間以上の再生時間(公称)、薄くて小さいに惹かれて購入したのですが、正直操作性や機能はいまいちだと感じました。特に大容量になればなるほど、曲を探したり、プレイリストを作ったりする機能は重要な気がします。前モデルはプレイリスト機能があったらしいので、残念です。

最後に、ノイズキャンセリングは付属のマイク付き専用のイヤホンが必要なのですが、もっと市販のマイク付きイヤホンの種類が増えて、選べるようになりたいです。


gmailでフィルタリング転送した時メールは受信トレイに残るの?

gmailの基本転送機能は全てのメールをあるアドレスに転送しますが、フィルタを用いることである条件にマッチするメールだけを転送することができます。

ただ、この時転送済みのメールを受信トレイに残すかどうかの設定がないので、どうなるか実験してみました。

結果 : 受信トレイに残ります!


Googleの検索結果に近所の情報が表示される件

いつ頃からか、Googleで普通に検索すると、近所の情報が表示されるようになりました。例えば、ラーメンを検索すると今検索した場所の近くのラーメン屋が表示されるのです。

Cookieやら過去の検索履歴やらを解析してユーザの好みの場所でも割り出しているのかなぁって適当に考えてたのですが、Cookieを消しても近所が表示されるからびっくり。予想はどうも違うみたいと気づきました。

で少し調べたところ、どうも2009年の4月頃から正式にサービス開始したらしいです。で、場所はアクセス元のIPやブラウザ(日本という大まかな情報しかわかりませんが)から割り出しているようです。ということは、プロキシを使った場合は反映されないんでしょうね。

それにしても、GoogleはIPと場所を結びつけるデータベースを構築し持っていて、逐一場所を割り出しているということです。さすが全ての情報を整理するという目標を掲げているだけあります。恐るべし、Google!!


keyhac でキーカスタマイズ@Windows XP, Vista

トラックポイントつきのIBMのキーボードを手に入れたので、パソコンの操作をキーボードに集杓してみたいと思い、キーボードのキーカスタマイズを使いはじめました。

Windowsでキーカスタマイズをしたい場合、窓使いの憂鬱が有名ですが、Vistaに対応していないし、後継のソフトは有料だしマウス操作ができないので他のソフトウェアを探していたらPythonでカスタマイズを書けるkeyhacというソフトウェアを見つけました。作者さんに感謝です。

基本的な使い方は結構簡単で、起動したらconfig.pyとうファイルができるので、これをいじっていきます。

config.pyにカスタマイズ例が載っているので、キーを他のキーに割り当てるのは簡単にできます。デフォルトの設定では左のWindowsキー+矢印でウィンドウの位置を移動させたり、Windowsキー+F3でメモ帳を立ち上げたりできる設定になっています。

しかし、マウス操作の例がなく方法がわからず困ってました。マニュアルを見ていると pyautoという同じ作者さんが作られたソフトを内蔵しているらしく、この機能をつかうことでいろいろなWindowsの操作ができるようです。ただし、pyauto自体はAPIのドキュメントやサンプルが少ないのでやり方を書いておきます。ここではユーザが定義したモディファイアキー(U0)+Returnでマウスのミドルクリックを実現します。

まずはじめに、pyautoのモジュールをimportします。

from keyhac import *
from pyauto import *

configure関数の中でミドルクリックを行う関数をかいて、その関数をU0+Returnに割り当てます。

        def m_MClick():
            x, y = Input.getCursorPos()
            Input.send([MouseMiddleClick(int(x), int(y)),])
        keymap_global[ "U0-Return" ] = m_MClick

maznが適当にカスタマイズしてみたconfig.py全体はこんな感じです。無変換+○でいろいろな機能を実現していて、無変換 + h,j,k,lキーでviのようなカーソル操作、無変換+ “,”と”.”でブラウザの戻る・進む、無変換+Returnでミドルクリックができます。

from keyhac import *
from pyauto import *

def configure(keymap):
    # config.py編集用のテキストエディタの設定
    keymap.editor = u"notepad.exe"
    # 無変換キー(29)を仮想キー255に割り当て
    keymap.replaceKey( 29, 255 )
    # 255をユーザモディファイアキーに追加
    keymap.defineModifier( 255, "User0" )

    # どのウインドウにフォーカスがあっても効くキーマップ
    if 1:
        keymap_global = keymap.defineWindowKeymap()

        # vi風にカーソル移動
        keymap_global[ "U0-K" ] = keymap.command_InputKey("Up")
        keymap_global[ "U0-J" ] = keymap.command_InputKey("Down")
        keymap_global[ "U0-H" ] = keymap.command_InputKey("Left")
        keymap_global[ "U0-L" ] = keymap.command_InputKey("Right")
        keymap_global[ "U0-A" ] = keymap.command_InputKey("Home")
        keymap_global[ "U0-E" ] = keymap.command_InputKey("End")

        # Shift
        keymap_global[ "U0-S-K" ] = keymap.command_InputKey("S-Up")
        keymap_global[ "U0-S-J" ] = keymap.command_InputKey("S-Down")
        keymap_global[ "U0-S-H" ] = keymap.command_InputKey("S-Left")
        keymap_global[ "U0-S-L" ] = keymap.command_InputKey("S-Right")
        keymap_global[ "U0-S-A" ] = keymap.command_InputKey("S-Home")
        keymap_global[ "U0-S-E" ] = keymap.command_InputKey("S-End")

        # Ctrl
        keymap_global[ "U0-C-K" ] = keymap.command_InputKey("C-Up")
        keymap_global[ "U0-C-J" ] = keymap.command_InputKey("C-Down")
        keymap_global[ "U0-C-H" ] = keymap.command_InputKey("C-Left")
        keymap_global[ "U0-C-L" ] = keymap.command_InputKey("C-Right")

        # 戻る・進む
        keymap_global[ "U0-Comma" ] = "166"
        keymap_global[ "U0-Period" ] = "167"

        # U0-Returnでマウスのミドルクリック
        def m_MClick():
            x, y = Input.getCursorPos()
            Input.send([MouseMiddleClick(int(x), int(y)),])
        keymap_global[ "U0-Return" ] = m_MClick