2009年11月30日月曜日

Skype チャットの読み上げ - 棒読みちゃん

1. 画面が狭いと、チャットウィンドウを見ていられない

自分の PC は画面が狭い。そのため、複数のアプリを起動しながら、Skype のチャットをすることが難しい。

会話の流れがわかるように、チャットウィンドウの内容を読み上げてくれるソフトはないだろうか?

 

2. 聞き取りやすい合成された音声

ニコニコ生放送車載放送 の中で、コメントが自動に読み上げられるのを見たことがある。昔と違って、コンピュータの合成する音声が聞きとりやすくなったことに関心した。

何のソフトを使っているのかと調べてみたら、

というものらしい。

早速ダウンロードして起動。

 

Skype を読み上げるための設定

「その他 > プラグイン」の Skype 読み上げ にチェックを入れる。

※ 初回の起動では、Skype 側で許可する必要あり。

091130-017.png

読み上げを一時停止したい場合は、音声合成タブの Skype のアイコンをクリック。

091130-016.png

このソフト Twitter も読み上げてくれるのでおもしろい。

2009年11月23日月曜日

PDF-XChange Viewer でコメントするときの 識別情報 (名前) を変更する

091123-003.pngPDF で作成された文書に対して注釈を付けたい場合、PDF-XChange Viewer を使う。

このツールでコメントを付けたり、図形や矢印などのマークアップツールを使うと、デフォルトでは Windows にログインしたときのログイン名が表示される。これを変更したい。

 

方法

特定のコメントのみ変更したい場合、コメントを右クリック > 「プロパティ > 一般」の「作者」を変更する。この場合、新しくコメントを作ると前の変更は反映されない。あくまでも変更した対象が変わるだけ。

 

永続的に変更したいときは、メニューより、「編集 > 環境設定」を選択。

環境設定ダイアログの「識別情報」の「ログイン名」は固定されているので、「名前」の方に変更したい名前を入力して、OK ボタンを押す。

091123-002.png

これにより、新しく作るコメントは上記で設定された名前となる。

携帯から写真を Pixelpipe 経由で Twitpic へ投稿 - なるべく小さく安く

1. brizzly で Twitter を閲覧すると画像を見るのが楽しい

最近、Twitter を見るときブラウザは Google Chrome 、クライアント (?) は Brizzly 。補助として pbtweet+ を利用。

Brizzly はフォローしている人のつぶやき全体を眺めるときに使う。チャットのように表示してくれる pbtweet+ は、リアルの友人をリストにまとめて見るときに利用。

Brizzly の良い点は画像へのリンクをインラインに展開して表示してくれるところ。しかも表示のスピードが早い。twitter を眺めるのが、雑誌を読むときのような感覚に近くなる。

 

2. 画像は Twitpic へ投稿

Twitter と連携する画像投稿サービスは百花繚乱。その中でよく見かけるのが Twitpic 。他の画像投稿サイトは「いかに Twitpic を追撃するか」という記事を見かけるところからして、ここが老舗のようだ。寄らば大樹の陰的な発想は好きではないのだけれど、その筋に疎いので、とりあえず Twitpic を利用することに。

Twitpic は Twitter のアカウントを利用してログイン。さすがに海外のサイトなので英語が基本。しかし画像の投稿はシンプルなので問題なし。アップロードと共に Twitter につぶやけるところもいい。 ^^

091123-004.png

しかし、Twitter の機動性の高さが発揮されるべき携帯との連携が、日本語の場合問題となる。 (+_+) 携帯で写真を写しメールに添付して、Twitpic の Settings に書かれているメールアドレスに、日本語を付けて投稿すると文字化けしてしまう。

091123-005.png

追記 (2009.11.29) : iPhone なら Twixy が文字化けもなくお手軽みたい。

 

3. Pixcelpipe から Twitpic へ投稿

文字化けせずに Twitpic に投稿できないものかと調べていたら、

… そんな人はPixelpipeに登録するといいです

(□ 前 の め り □ » Twitpicと日本語と文字化け…そしてPixelpipe より)

聞いたことのないサービスだなぁ。。(@_@;) Yahoo Pipes の親戚かと思ったけれど全然違うみたい。

WEBマーケティング ブログ によると、

これは複数サービスに画像アルバムや動画チャンネルを持っている人にはなかなか便利なサービス。 画像か動画かを自動的に判別し、対応する複数のサービスへ一括でアップロードしてくれます。

(FlickrやPicasa、YouTubeなどに一気に動画や画像をアップできる「Pixelpipe」 より)

つまり、Pixelpipe 自体は色々なサービスへの投稿を楽にするのが目的だけれど、これを経由して Twitpic へ投稿すると、なぜか日本語の文字化けが解消されるということかな。

 

4. 写真のサイズが小さいと Pixcelpipe へ投稿できない

早速、Pixelpipe に登録して、上記の説明を読みながら Twitpic を投稿先として設定。Manage Personal Settings に書かれているアドレスへ写メールで投稿。

091123-001.png

しかし、なぜか投稿されなかった。 (+_+) 

aaaa画像が上手くアップロードできないと Pixelpipe のホームに吹き出しの画像が代わりに表示される。

このとき投稿した写真のサイズは 120 × 1603KB (画質: ノーマル) 。携帯でネットは使わず、パケ放題を利用してないので、なるべく小さい画像で試したかった。ちなみに、自分の携帯の写真の画素数は 130万画素が最高。よく見たら携帯の機種の前に vodafone って書いてある。(@_@;) なめんな、携帯旧世代というスペック ^^;

次に、サイズを 240 × 320 (画質: ノーマル) にして投稿したら今度は上手くいった。120 × 160 では画質を ファイン にしてもダメだった。

 

5. Twitpic へ投稿するには メールのタイトルか本文につぶやきを書く

つぶやく内容を、写メールの タイトル と 本文 に付けた場合、投稿された内容がどうなるか試してみた。

  タイトル 本文
1 通目 [なし] テスト
2 通目 テストタイトル テストだよタイトル

Twitpic の場合、下の方が 1通目になる。

091122-002.png

結局、タイトルか本文のどちらかに つぶやき を付ければ良いようだ。ただし、両方つけたらタイトルが優先される。

 

Flickr の場合 タイトルと本文が反映される

ついでに Flickr への投稿も試した。(右側が 1 通目)

091122-003.png

こちらは本文とタイトルを入力しても、それぞれ反映される。

 

6. 画像サイズと料金の確認

先ほど述べたように、携帯旧世代なのでパケット代が気になる。ちゃんと投稿できたときは 13 KB 。これがいくらになるのか?

自分の場合、softbank のホワイトプランでパケ放題には入ってないので、以下の料金。

パケットって何!?計算方法は!? - ソフトバンクモバイル情報サイト 〓SoftBank Mobile - 楽天ブログ(Blog) によると、

1パケットは、128バイトであります。
1KBは、1024バイト(1MBは1024×1024=1048576バイト)でありますので、パケットで計算しなおすと、1KBは、1024バイト÷128バイトで、8パケットということになると考えられます。

だから、約 13 KB × 8 × 0.21 = 21.84 円。

念のため Web版 パケット計算 で計算を確認してもその通りだった。

塵も積もれば山となる。気をつけよう~。

2009年11月17日火曜日

Google Chrome で HootSuite のフォントサイズを少し大きくしたい

user script のインストール

http://userstyles.org/styles/22613 の Load as user script ボタンを押してインストール。

 

HootSuite の文字が小さくて読みにくい

愛用していた pbtweet が twitter の仕様の変更のためなのか、表示が上手くされないときがあった。pbtweet 以外の twitter クライアントを色々と検討したけれど、やはり pbtweet の会話調の吹き出しに敵うものなし。敢えて別のものを使うとしたら、HootSuite 。しかし、デフォルトでは文字が小さいので読みずらい。 (+_+)

Firefox なら Stylish を使って、

.tweetContent {
    font-size:100% !important;
}

と書けば問題ない。

Chrome でも Stylish のようなものがあるのかな?と思い探したけれどわからなかった。

 

User Script

今、Chrome は開発版を使っている。 どのバージョンからか知らないけれど、XXXXX.user.js という名前のユーザスクリプトファイルを Chrome に D&D してやると簡単にインストールできる。(削除するときは、Google Chrome の設定 > 拡張機能 を開く)

Google Chrome Converts User Scripts into Extensions によると、

Now you can visit userscripts.org and any other site that links to Greasemonkey scripts and other flavors of user scripts, click on the link to a *.user.js file and install it in one click.

ということで、userscripts を書くことに。

userstyles.org のサンプルを見て、必要であろうところのみ抽出。JavaScript で head 要素に style タグを追加するだけ。

// ==UserScript==
// @name           set hootsuite fontsize
// @description    hootsuite 
// @namespace      http://jutememo.blogspot.com
// @include        http://hootsuite.com/dashboard* 
// ==/UserScript==
(function(){
    var fontsize = "100%";
    
    var css = ".tweetContent{font-size:" + fontsize + " !important;}";
    var style = document.createElement('style');
    style.type = "text/css";
    style.appendChild(document.createTextNode(css));
    document.getElementsByTagName("head")[0].appendChild(style);
})();

 

userstyles.org を利用

当初これをエディタに書いて、Chrome に D&D していた。しかし、userstyles.org でアカウントを取得してみたら、CSS を入力するだけで、後は全部自動で上記のようなコードを生成してくれた。userstyles.org のコードはよく使わせてもらっていたけれど、こんなにお手軽に user script を作れるとは今まで知らなかった。 (@_@;)

これなら表示をカスタマイズしたいサイトがあったら、

  1. userstyles.org で CSS を入力
  2. user script を生成
  3. Chrome へインストール

で簡単にできる。 ^^

http://userstyles.org/styles/new

New style | userstyles.org via kwout

2009年11月12日木曜日

Haskell の State モナド (2) - 「状態を変更する関数」を `つなげる関数' を共通部品として括り出す

Haskell の State モナド (1) - 状態を模倣する の続き。

… しかし、前回の内容忘れてもうた。。

パタッ(o_ _)o~†

 

復習

前回は、スタックの内容を変更する pop, push などを連続して適用するために、状態を変更する関数と関数を つなげる comb 関数を定義した。(Control.Monad.State は使わずに。)

ポイントは、最初に、

関数と関数を「つなげる関数」を意識する。

090923-002

そのためには、

関数を「適用する値」と、「適用する関数」に分割して考える

例えば、次のような apply 関数を定義したら、

apply a f = f a

直接、関数 (演算子) に適用する方法と、意識的に分割して適用する方法があることを認識しておく。

*Main> 100 + 1
101
*Main> apply 100 (+ 1)
101

091011-003

手段としては、

    1. 無名関数クロージャで 内側へ内側へ…と計算をつなげ、
    2. 一番内側の関数で自由変数の値を使って計算を組立てる

例えば、3 つの引数を足し合わせる関数 add3 の定義は、

add3 x y z = x + y + z

これを次のように無名関数とクロージャで書くことができる。

add3 = \x -> \y -> \z -> x + y + z

無名関数とクロージャで書かれていたら、省略されている括弧を頭の中で補完。束縛関係を明確に意識する。

add3 = \x -> (\y -> (\z -> x + y + z))

091112-008.png

先ほどの apply 関数と、無名関数・クロージャを使えば、100 + 200 + 300 を次のように書くことができる。

*Main> 100 `apply` (\x -> 200 `apply` (\y -> 300 `apply` (\z -> x + y + z)))
600

これが関数を「つなげる」ことの原型となる。

後は … 端折って、「型に注意しましょう」ということで。 ^^;

 


B0012ORJAM

カウンタの例

前回と同じように、今回は「数を数えるための カウンタ」を操作する関数を「つなげる」ことを考える。

最初に、カウンタの「値」と「増分」をフィールドに持つ Counter a 型を定義。

data Counter a = Counter { val       -- 値
                         , step :: a -- 増分
                         } deriving Show

 

状態を変更する関数

次に、カウンタの値を増分だけ増やす next 関数を定義する。このとき、後で関数をつなげることができるように、前回のスタックの pop 関数のように

pop :: Stack a –> (b, Stack a)

の形に沿った関数の型にする。

next :: Num a => Counter a -> (a, Counter a)
next (Counter v s) = let v' = v + s
                     in (v', Counter v' s)

ここでは返されるタプルの第1要素は、next が適用された後のカウンタの「値」としておいた。

例えば、値 0、増分 1 のカウンタに対して next 関数を適用すると、

*Counter> next (Counter 0 1)
(1,Counter {val = 1, step = 1})

 

「状態を変更する関数」に別名を付ける

前回と同じように next 関数を つなげる 関数を考える。まずは、関数の型が長いと読みにくいので、カウンタを操作する関数の型を「カウンタ操作型」として別名を付ける。

type CounterOp a b = Counter a -> (b, Counter a)

ここで注意することは 型変数 a, b 。上記の next 関数では、たまたまタプルの第1要素がカウンタの値と同じ型だった。しかし、カウンタを操作する関数を他に定義した場合、別の型にしたいこともあるかもしれない。カウンタで使われる値の型の方は、当然ながらカウンタ操作する前と後では変わらない。

 

「状態を変更する関数」を つなぐ 関数

次に上記のカウンタ操作型を つなげる 関数を定義。なぜこのように定義するかは前回を参照。今回は一気に端折って、

comb :: CounterOp a b -> (b -> CounterOp a c ) -> CounterOp a c
comb m n = \counter0 -> let (val1, counter1) = m counter0
                            (val2, counter2) = n val1 counter1
                        in  (val2, counter2)

comb 関数の第2引数が、第1引数に対して全く関心がない場合のために comb_ 関数を定義しておく。

comb_ :: CounterOp a b -> CounterOp a c -> CounterOp a c
comb_ m n = m `comb` \_ -> n

 

ここでカウンタを連続して 3 回カウントさせる next3 関数を上記の comb_ 関数を使って定義してみる。

next3 = next `comb_` next `comb_` next

これを先ほどと同じカウンタに適用すると、

*Counter> next3 $ Counter 0 1
(3,Counter {val = 3, step = 1})

 

ついでなので、next を 3 回つなげて、カウンタの値を足し合わせる関数を定義してみる。

… と、その前に前回と同じように、ある値に適用すると CounterOp a b 型の値を返す関数 ret を定義しておく。ただし、ret 関数では counter の更新は行わない。単に b 型の値を CounterOp a で包むだけ。

ret :: b -> CounterOp a b
ret x = \counter -> (x, counter)

これを元に、

next3' = next `comb` \x1 ->
         next `comb` \x2 ->
         next `comb` \x3 ->
         ret $ x1+x2+x3

早速使ってみる。

*Counter> next3' $ Counter 0 2
(12,Counter {val = 6, step = 2})

 

ここまでのコード

 

スタック操作型 と カウンタ操作型 の比較

ところで、前回のスタックを操作するときに定義 した「スタック操作型」は、次の通りだった。

type StackOp a b = Stack a -> (b, Stack a)

これに対して、今回の「カウンタ操作型」は、

type CounterOp a b = Counter a -> (b, Counter a)

違いは「別名」と、そこで「状態を変更する対象」である具体的な型コンストラクタ

 

comb 関数も同様に見てみると、「スタック操作」版は、

comb :: StackOp a b -> (b -> StackOp a c) -> StackOp a c
comb m n = \stack0 ->
           let (x1, stack1) = m stack0
               (x2, stack2) = n x1 stack1
           in  (x2, stack2)

「カウンタ操作」の comb 関数は、

comb :: CounterOp a b -> (b -> CounterOp a c ) -> CounterOp a c
comb m n = \counter0 -> let (val1, counter1) = m counter0
                            (val2, counter2) = n val1 counter1
                        in  (val2, counter2)

 

ret 関数も同じく「スタック操作」版は、

ret :: b -> StackOp a b
ret x = \stack -> (x, stack)

「カウンタ操作」版は、

ret :: b -> CounterOp a b
ret x = \counter -> (x, counter)

 

「もう、これは共通部分をまとめるしかない」という雰囲気になった。 ^^;

 

State s a 型 (状態 操作型) にまとめる

最初に別名から考える。「スタック操作型」と「カウンタ操作型」を総称する名前にしたいので、「状態操作型」という意味で State s a 型という名前にした。(もちろん、Control.Monad.State.LazyState を真似て…)

type State s a = s -> (a, s)

先ほど具体的な型が書かれていた StackOp, CounterOp の部分を型変数 s とした。 いきなりこの定義を見たら、抽象的な関数で具体的なイメージがわかない。しかし、これに対応した具体的な関数を連想できるので、State s a 型は 状態を変更する関数を表現したものだと解釈できる。

 

これに伴い、同じように comb 関数も具体的な型名を型変数で置き換える。

comb :: State s a -> (a -> State s b) -> State s b
comb m n = \s0 -> let (x1, s1) = m s0
                      (x2, s2) = n x1 s1
                  in  (x2, s2)

ret 関数も同じく、

ret :: a -> State s a
ret x = \s -> (x, s)

 

ここまでのコード

… しかし、これだけ見たら、本当わからんなぁ。。 (+_+)

とにかく、これで スタックを操作していたモジュールと、Counter モジュールに記述していた comb, comb_, ret 関数を削除し、上記の State をインポートすればよくなった。

counter.hs

stack.hs

main.hs

main.hs の main を実行した結果は、

*Main> main
(3,Counter {val = 3, step = 1})
((),Stack [300,200,100,5,4,3,2,1])