2010年10月
2010年10月30日
先日のブログで構想を書きましたが、Gmailに「メール読んだリンク」を付加できるようにするサービスを開発しましたので、リリースしました。
URLは以下となります。
http://mail-yonda.net/
【サービス概要】
【使い方】
以下の文面をメールに記述すれば、メール受信者がURLにアクセスしたときにメールを読んだということがメール送信者に伝わるようになります。
上記の文面を、署名の中に設定しておくと、毎回手動で入力する必要がありませんので、便利に使うことができます。
URLは以下となります。
http://mail-yonda.net/
【サービス概要】
メール読んだ は、Gmailに「メール読んだリンク」を付加するサービスです。
「メール読んだ」を使うと、あなたのメールが、相手に読まれたことを知ることができます。
「メール読んだ」は、無料ですぐに利用できます。
【使い方】
以下の文面をメールに記述すれば、メール受信者がURLにアクセスしたときにメールを読んだということがメール送信者に伝わるようになります。
※このメールを読んだことを送信者に伝えるには、以下のURLをクリックしてください
https://mail-yonda.net/10000000000000000
上記の文面を、署名の中に設定しておくと、毎回手動で入力する必要がありませんので、便利に使うことができます。
2010年10月26日
以前作成した、Gmailのメール送信時に宛名に「様」を付け忘れていないかチェックするツールを、Chromeの拡張機能として作り直しました。
以下で公開しています。
https://chrome.google.com/extensions/detail/bgmnadmefdbbpjebjmbpdalcohpfpahh?hl=ja
以前のバージョンは、Greasemonkeyのユーザースクリプトとして作ったため、かなり無理やりな作りになっていたのですが、今回はChromeの拡張機能として作ったことでだいぶマシになりました。
また、機能を強化して、リッチテキスト形式のメールにも対応させました。
ちなみに、私は、前回作成してからこの半月の間に、早くも一回、このツールに救われました(´・ω・`)
以下で公開しています。
https://chrome.google.com/extensions/detail/bgmnadmefdbbpjebjmbpdalcohpfpahh?hl=ja
以前のバージョンは、Greasemonkeyのユーザースクリプトとして作ったため、かなり無理やりな作りになっていたのですが、今回はChromeの拡張機能として作ったことでだいぶマシになりました。
また、機能を強化して、リッチテキスト形式のメールにも対応させました。
ちなみに、私は、前回作成してからこの半月の間に、早くも一回、このツールに救われました(´・ω・`)
2010年10月25日
少し前に、TechCrunchに以下のようなサービスが紹介されていました。
相手が読んだことを確認できるGmailトラッキングサービスEmailOracle―「そのメール見落としました」は通用せず
紹介されているEmailOracleを使ってみましたが、何か特別のことをやっているというわけではなく、普通にメールの中にトラッキング用の画像を入れるサービスのようです。(自分宛にテストメールを送って試すと、何も設定しなくても画像が表示されるので、一瞬何か特別なことをやっているのかと思いましたが、自分からのメールの画像は自動表示されるようにGmailで設定されていただけでした(´・ω・`))
私も昔から、メールが読まれたかどうかを知ることができるようにするサービスがあったら面白いかなと思っていたのですが、多くの環境(少なくとも私の環境)では、トラッキング用の画像の読み込みが許可されてないのではないかと考えて、あきらめていました。
--
上記のサービスとは異なるのですが、最近、メールの対応をしていて、メール既読に関する違う形のニーズもあるかもしれないと思いました。
仕事中にメールを受け取ると、メールにすぐに返答できないことがあります。特にメールの相手がお客様の場合は、返事を書くのにある程度まとまった時間が必要なので、時間がないときにはすぐに返答できません。その場合は、とりあえず、メールを読んだこと(また、場合によっては、何時間後くらいに返事を出すか)を伝えたいということがあります。
というわけで、「メール読んだリンク」をメールに付記できるようなサービスを作ろうと思いました。
以下のような文面をメールに記述すれば、メール受信者がURLにアクセスしたときにメールを読んだということがメール送信者に伝わるというようにしようと思っています。
相手が読んだことを確認できるGmailトラッキングサービスEmailOracle―「そのメール見落としました」は通用せず
紹介されているEmailOracleを使ってみましたが、何か特別のことをやっているというわけではなく、普通にメールの中にトラッキング用の画像を入れるサービスのようです。(自分宛にテストメールを送って試すと、何も設定しなくても画像が表示されるので、一瞬何か特別なことをやっているのかと思いましたが、自分からのメールの画像は自動表示されるようにGmailで設定されていただけでした(´・ω・`))
私も昔から、メールが読まれたかどうかを知ることができるようにするサービスがあったら面白いかなと思っていたのですが、多くの環境(少なくとも私の環境)では、トラッキング用の画像の読み込みが許可されてないのではないかと考えて、あきらめていました。
--
上記のサービスとは異なるのですが、最近、メールの対応をしていて、メール既読に関する違う形のニーズもあるかもしれないと思いました。
仕事中にメールを受け取ると、メールにすぐに返答できないことがあります。特にメールの相手がお客様の場合は、返事を書くのにある程度まとまった時間が必要なので、時間がないときにはすぐに返答できません。その場合は、とりあえず、メールを読んだこと(また、場合によっては、何時間後くらいに返事を出すか)を伝えたいということがあります。
というわけで、「メール読んだリンク」をメールに付記できるようなサービスを作ろうと思いました。
以下のような文面をメールに記述すれば、メール受信者がURLにアクセスしたときにメールを読んだということがメール送信者に伝わるというようにしようと思っています。
※このメールを読んだことを送信者に伝えるには、以下のURLにアクセスしてください
http://mail-yonda.net/access/000000000000
2010年10月24日
以下の3点の改良を行いました。
(1)
広告主が、自分のツイッターIDを設定できるようにしました。ツイッターIDを設定すると、広告のキャンペンページや広告一覧ページで、ツイッターへのリンクが表示されるようになります。
(2)
つぶやき広告に広告主のツイッターIDのリンクを含むように設定できるようにしました。この設定を行うと、公式のつぶやきボタンを押したときのように、つぶやきの中に、@yhayashi10 という形で、ツイッターIDのリンクが含まれるようになります。
(3)
広告主が、報酬支払い済みのアフィリエイターのメールアドレスを見れるようにしました。また、報酬支払い前のアフィリエイターのメールアドレスの一部を見れるようにしました。これにより、運営の透明性が向上しました。(広告主がアフィリエイターに連絡する手段を作ることで、弊社で不正ができないことを担保しています。)
(1)
広告主が、自分のツイッターIDを設定できるようにしました。ツイッターIDを設定すると、広告のキャンペンページや広告一覧ページで、ツイッターへのリンクが表示されるようになります。
(2)
つぶやき広告に広告主のツイッターIDのリンクを含むように設定できるようにしました。この設定を行うと、公式のつぶやきボタンを押したときのように、つぶやきの中に、@yhayashi10 という形で、ツイッターIDのリンクが含まれるようになります。
(3)
広告主が、報酬支払い済みのアフィリエイターのメールアドレスを見れるようにしました。また、報酬支払い前のアフィリエイターのメールアドレスの一部を見れるようにしました。これにより、運営の透明性が向上しました。(広告主がアフィリエイターに連絡する手段を作ることで、弊社で不正ができないことを担保しています。)
2010年10月22日
C#でシリアル通信を行うプログラムを書くときは、System.IO.Ports.SerialPort というクラスを使うと簡単に書くことができます。
しかし、このクラスには一つ注意点があります。
これまで、デリヘル電話メモでは、線を引っこ抜いた後に、アプリを終了しようとすると、UnauthorizedAccessExceptionのエラー画面が表示されていました。デリヘル電話メモのプログラムの中では、SerialPortオブジェクトをきちんとDisposeし、また、Dispose時のExceptionを拾って対処していたので、このような現象が発生するのを不思議に思っていました。
少し調べてみたところ、以下に解決策が載っていました。
C# SerialPortのエラー「UnauthorizedAccessException」対策
上記の説明では少し分かりにくいのですが、ようするに、
1. 断線していると、SerialPortオブジェクトのDispose(bool)メソッド内で例外が発生する
2. SerialPortオブジェクトのDispose(bool)メソッドは、Disposeしたときだけでなく、オブジェクトのファイナライズ時にも呼ばれる
3. SerialPortオブジェクトのファイナライズ時に、キャッチされない例外が発生するのでアプリが落ちる
ということのようです。
しかし、このクラスには一つ注意点があります。
これまで、デリヘル電話メモでは、線を引っこ抜いた後に、アプリを終了しようとすると、UnauthorizedAccessExceptionのエラー画面が表示されていました。デリヘル電話メモのプログラムの中では、SerialPortオブジェクトをきちんとDisposeし、また、Dispose時のExceptionを拾って対処していたので、このような現象が発生するのを不思議に思っていました。
少し調べてみたところ、以下に解決策が載っていました。
C# SerialPortのエラー「UnauthorizedAccessException」対策
USB-シリアル変換ケーブル使用時にケーブルが抜かれた時に発生する「UnauthorizedAccessException」エラーは、Try〜catch出来てもすぐ後にプログラムが終了してしまう。
ということは問題は、ファイナライザ内で発生する未処理の例外はアプリケーション側でキャンセルする事はできない。
ファイナライザの中で例外が発生しないように実装することが必須のようです。これを踏まえて解決するには、SerialPortクラスを継承してアタッチ・デタッチ処理をポート定期チェックとDispose時に行えば良い。
上記の説明では少し分かりにくいのですが、ようするに、
1. 断線していると、SerialPortオブジェクトのDispose(bool)メソッド内で例外が発生する
2. SerialPortオブジェクトのDispose(bool)メソッドは、Disposeしたときだけでなく、オブジェクトのファイナライズ時にも呼ばれる
3. SerialPortオブジェクトのファイナライズ時に、キャッチされない例外が発生するのでアプリが落ちる
ということのようです。
2010年10月18日
先週、「つぶやき→報酬」を利用いただいているお客様のメールサポートをしていたのですが、なかなかメールが噛み合わなくてもどかしい思いをしました。
日本語というのは難しくて、だいたい主語が省略できるという時点で、だいぶ怪しい言語だと思います。
相手のメールによってイラッとさせられると、こっちも相手をイラッとさせるメールを送りたくなる気持ちになることがあります。
何回かメールのやり取りをして分かったのですが、その人はつぶやきボタンを設置して報酬をゲットできると思っていたようでした。(通常は、「つぶやき→報酬」では、広告をつぶやいて報酬をゲットするという流れが基本となります。)
このことがわかって、ようやくそれまでの質問の意味などもわかってきました。お互いに少しだけ時間を無駄にしました。
しかし考えてみると、そのアイデアもインパクトがあってなかなか面白いかもしれません。今後の検討課題にしたいと思います。
私は基本的には、ユーザーが直接口にする要望をあまり重視しない派なのですが、それでも、これまでを思い返せば、ユーザーと直接やりとりをしたときは、得ることもあったと思います。お客様対応を辛抱強く行うと、何らかの得られるものもあるということですね。このことを忘れないようにしたいと思います。
日本語というのは難しくて、だいたい主語が省略できるという時点で、だいぶ怪しい言語だと思います。
相手のメールによってイラッとさせられると、こっちも相手をイラッとさせるメールを送りたくなる気持ちになることがあります。
何回かメールのやり取りをして分かったのですが、その人はつぶやきボタンを設置して報酬をゲットできると思っていたようでした。(通常は、「つぶやき→報酬」では、広告をつぶやいて報酬をゲットするという流れが基本となります。)
このことがわかって、ようやくそれまでの質問の意味などもわかってきました。お互いに少しだけ時間を無駄にしました。
しかし考えてみると、そのアイデアもインパクトがあってなかなか面白いかもしれません。今後の検討課題にしたいと思います。
私は基本的には、ユーザーが直接口にする要望をあまり重視しない派なのですが、それでも、これまでを思い返せば、ユーザーと直接やりとりをしたときは、得ることもあったと思います。お客様対応を辛抱強く行うと、何らかの得られるものもあるということですね。このことを忘れないようにしたいと思います。
2010年10月09日
Yet Another View Selection SourceというChromeエクステンションを作成しました。
先日、厳選して使用している便利なChromeエクステンション19個で、View Selection Sourceというエクステンションが紹介されていました。
View Selection Sourceは、マウスで選択した場所のソースコードを表示するChromeエクステンションです。
View Selection Sourceは非常に便利なのですが、ポップアップでソースコードを表示するというところが使いにくいと感じました。ポップアップですと、マウスで他の場所をクリックするとすぐに消えてしまいます。そこで、新しいウィンドウを開いてソースコードを表示するように改良してみました。
新しいウィンドウに表示することで、以下のメリットがあります。
・間違って他の場所をマウスクリックしてしまっても消えない
・複数同時に開ける
・ソースコードを検索できる
◆10月12日更新◆
Googleのサイトからインストールできるようになりました。
https://chrome.google.com/extensions/detail/gbdhbekobignbgdalhpkigmaakjnpfdl?hl=ja

先日、厳選して使用している便利なChromeエクステンション19個で、View Selection Sourceというエクステンションが紹介されていました。
View Selection Sourceは、マウスで選択した場所のソースコードを表示するChromeエクステンションです。
View Selection Sourceは非常に便利なのですが、ポップアップでソースコードを表示するというところが使いにくいと感じました。ポップアップですと、マウスで他の場所をクリックするとすぐに消えてしまいます。そこで、新しいウィンドウを開いてソースコードを表示するように改良してみました。
新しいウィンドウに表示することで、以下のメリットがあります。
・間違って他の場所をマウスクリックしてしまっても消えない
・複数同時に開ける
・ソースコードを検索できる
◆10月12日更新◆
Googleのサイトからインストールできるようになりました。
https://chrome.google.com/extensions/detail/gbdhbekobignbgdalhpkigmaakjnpfdl?hl=ja

2010年10月08日
昨日メールを送信するときに、ついお客様の名前に「様」を付けるのを忘れてしまいました。お客様の名前をコピーして貼り付けたときに、様を付けるのを忘れてしまったのですが、これはたまに(一年に2〜3回くらい)やってしまいます。
頭にきたので、メール本文の1行目が「様」で終わっていないと警告を出すようにしてみました。
調べてみるとChromeは、Greasemonkeyのユーザースクリプトをそのまま動かすことができると分かったので、Gmail用のユーザースクリプトを作ることにしました。
ちなみに、以下にGmailのGreasemonkeyのAPIというのもあったのですが、残念ながら、Chromeではうまく動かないようです。
http://code.google.com/p/gmail-greasemonkey/wiki/GmailGreasemonkey10API
Gmailにアクセスしたときに単にDOMを操作すれば簡単にできるだろうと思ったのですが、Gmailのコードは自動生成されているコードなので、かなり複雑なコードになっています。DOMオブジェクトのIDもころころ変わったりしています。
したがって、私のユーザースクリプトも、かなり無理やりでひどいコードになってしまいました。まあ、それでも、一応目的は達したので、怒りは収まりました。
いつまで動くコードか分かりませんが、一応ダウンロードできるようにしておきますので、物好きな人は拾ってください。(メール送信前に何らかのチェックを行うようなスクリプトを作りたい人には、もしかしたら参考になるかもしれません。)
Chromeの場合は、以下のリンクをクリックするだけで、ユーザースクリプトをインストールすることができます。Firefoxの場合は、Greasemonkeyをインストールした状態で、リンクをクリックすると、ユーザースクリプトをインストールすることができます。
gmail_sama_forgot.user.js
ちなみに、↓のような感じで警告が表示されます。

頭にきたので、メール本文の1行目が「様」で終わっていないと警告を出すようにしてみました。
調べてみるとChromeは、Greasemonkeyのユーザースクリプトをそのまま動かすことができると分かったので、Gmail用のユーザースクリプトを作ることにしました。
ちなみに、以下にGmailのGreasemonkeyのAPIというのもあったのですが、残念ながら、Chromeではうまく動かないようです。
http://code.google.com/p/gmail-greasemonkey/wiki/GmailGreasemonkey10API
Gmailにアクセスしたときに単にDOMを操作すれば簡単にできるだろうと思ったのですが、Gmailのコードは自動生成されているコードなので、かなり複雑なコードになっています。DOMオブジェクトのIDもころころ変わったりしています。
したがって、私のユーザースクリプトも、かなり無理やりでひどいコードになってしまいました。まあ、それでも、一応目的は達したので、怒りは収まりました。
いつまで動くコードか分かりませんが、一応ダウンロードできるようにしておきますので、物好きな人は拾ってください。(メール送信前に何らかのチェックを行うようなスクリプトを作りたい人には、もしかしたら参考になるかもしれません。)
Chromeの場合は、以下のリンクをクリックするだけで、ユーザースクリプトをインストールすることができます。Firefoxの場合は、Greasemonkeyをインストールした状態で、リンクをクリックすると、ユーザースクリプトをインストールすることができます。
gmail_sama_forgot.user.js
ちなみに、↓のような感じで警告が表示されます。

2010年10月07日
先日、大量のメモリキャッシュを持つサーバをJavaで作る必要がありました。
Javaでキャッシュを作る場合は、ConcurrentHashMapというクラスを使うことが多いです。ConcurrentHashMapは、スレッドセーフなハッシュマップです。他のハッシュコンテナと同じように、ハッシュ値の計算にはオブジェクトの#hashCodeを利用します。
一方で、データの件数が多くなる場合、ハッシュマップに格納するキーのためのメモリ容量が馬鹿にならなくなるので、これを節約したくなってきました。
いつもは、キーに文字列を使うことが多いのですが、今回はメモリ容量を節約するため、キーをバイト配列にすることにしました。しかし、バイト配列の#hashCodeは、オブジェクトのハッシュ値ですので、同じ内容のバイト配列が同一の値になりません。通常は、バイト配列をラップしたオブジェクトを作って#hashCodeをオーバーライドするのですが、今回は、(やってはいけないとは思いつつ)ConcurrentHashMapのソースをコピーして変更したものを使うことにしました。
メモリ容量がどうなるか調べてみました。私の環境(32bitOS、JDK6)で測定してみたところ、ここの情報と同じような結果になりました。
キーがアスキー文字10文字の文字列の場合、以下のようになりました。
(1)文字列をそのまま使用した場合のメモリ使用量:64バイト
・長さ10のchar配列・・・2x10+12を8の倍数に切り上げ → 32バイト
・その他フィールド・・・24バイト
・オブジェクト生成のオーバーヘッド・・・8バイト
(2)文字列をバイト配列にして、オブジェクトにラップしたときのメモリ使用量:40バイト
・長さ10のバイト配列・・・1x10+12を8の倍数に切り上げ → 24バイト
・バイト配列のフィールドが一つ・・・8バイト
・オブジェクト生成のオーバーヘッド・・・8バイト
(3)文字列をバイト配列にして、ときのメモリ使用量:24バイト:24バイト
・長さ10のバイト配列・・・1x10+12を8の倍数に切り上げ → 24バイト
したがいまして、データの件数が100万件、1000万件の場合は、メモリ使用量は以下となります。
(1)文字列:約64Mバイト(100万件)、約640Mバイト(1000万件)
(2)バイト配列をオブジェクトにラップ:約40Mバイト(100万件)、約400Mバイト(1000万件)
(3)バイト配列そのまま:約24Mバイト(100万件)、約240Mバイト(1000万件)
Javaでキャッシュを作る場合は、ConcurrentHashMapというクラスを使うことが多いです。ConcurrentHashMapは、スレッドセーフなハッシュマップです。他のハッシュコンテナと同じように、ハッシュ値の計算にはオブジェクトの#hashCodeを利用します。
一方で、データの件数が多くなる場合、ハッシュマップに格納するキーのためのメモリ容量が馬鹿にならなくなるので、これを節約したくなってきました。
いつもは、キーに文字列を使うことが多いのですが、今回はメモリ容量を節約するため、キーをバイト配列にすることにしました。しかし、バイト配列の#hashCodeは、オブジェクトのハッシュ値ですので、同じ内容のバイト配列が同一の値になりません。通常は、バイト配列をラップしたオブジェクトを作って#hashCodeをオーバーライドするのですが、今回は、(やってはいけないとは思いつつ)ConcurrentHashMapのソースをコピーして変更したものを使うことにしました。
メモリ容量がどうなるか調べてみました。私の環境(32bitOS、JDK6)で測定してみたところ、ここの情報と同じような結果になりました。
キーがアスキー文字10文字の文字列の場合、以下のようになりました。
(1)文字列をそのまま使用した場合のメモリ使用量:64バイト
・長さ10のchar配列・・・2x10+12を8の倍数に切り上げ → 32バイト
・その他フィールド・・・24バイト
・オブジェクト生成のオーバーヘッド・・・8バイト
(2)文字列をバイト配列にして、オブジェクトにラップしたときのメモリ使用量:40バイト
・長さ10のバイト配列・・・1x10+12を8の倍数に切り上げ → 24バイト
・バイト配列のフィールドが一つ・・・8バイト
・オブジェクト生成のオーバーヘッド・・・8バイト
(3)文字列をバイト配列にして、ときのメモリ使用量:24バイト:24バイト
・長さ10のバイト配列・・・1x10+12を8の倍数に切り上げ → 24バイト
したがいまして、データの件数が100万件、1000万件の場合は、メモリ使用量は以下となります。
(1)文字列:約64Mバイト(100万件)、約640Mバイト(1000万件)
(2)バイト配列をオブジェクトにラップ:約40Mバイト(100万件)、約400Mバイト(1000万件)
(3)バイト配列そのまま:約24Mバイト(100万件)、約240Mバイト(1000万件)
2010年10月04日
弊社の商用サービスはさくらの専用サーバで動作していますが、ここで利用しているデータベースのバックアップは、これまでは、MySQLレプリケーションの機能を利用して、自宅サーバ上でリアルタイムにバックアップを取っていました。このバックアップの機能を、さくらのVPSで行うことにしました。
さくらのVPSは、仮想サーバなだけあって、ディスクの多重化を、さくらインターネットに任せられます。ディスク故障時の対応を心配(&準備)しなくて良くなりますので、運用が大変楽だと言えると思います。
自宅サーバは、そろそろディスクの寿命も近づいていますし、おまけにたくさんのサービスが動いていますので、壊れたときの復旧作業のことを考えると憂鬱だったのですが、今回の移行によって、少し心配が減りました。
さくらのVPSは、仮想サーバなだけあって、ディスクの多重化を、さくらインターネットに任せられます。ディスク故障時の対応を心配(&準備)しなくて良くなりますので、運用が大変楽だと言えると思います。
自宅サーバは、そろそろディスクの寿命も近づいていますし、おまけにたくさんのサービスが動いていますので、壊れたときの復旧作業のことを考えると憂鬱だったのですが、今回の移行によって、少し心配が減りました。





















