Gmail フィルタ設定のインポート・エクスポートファイルの詳細

Gmailにはフィルタという機能があり送信者や受信者、タイトルや本文の内容によって条件を指定し、該当するメールにラベルを付けたり転送したりといった特定の処理を行うことができます。

これが非常に便利な機能で、受信したメールの整理を自動化できるのはもちろんモバイルでの通知などもこの機能の応用で自由自在です。

そんなフィルタ機能の設定で、xmlファイルによるインポートとエクスポートができるようです。

となればxmlファイルのフォーマットの解析がしてみたくなるもの。

適当なフィルタを作成し、エクスポートしたファイルはこのようになりました。

<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:apps='http://schemas.google.com/apps/2006'>
<title>Mail Filters</title>
<id>tag:mail.google.com,2008:filters:1407980806474</id>
<updated>2014-08-14T01:25:05Z</updated>
<author>
<name>山田太郎</name>
<email>test@gmail.com</email>
</author>
<entry>
<category term='filter'></category>
<title>Mail Filter</title>
<id>tag:mail.google.com,2008:filters:1407980806474</id>
<updated>2014-08-14T01:25:05Z</updated>
<content></content>
<apps:property name='from' value='test@test.com'/>
<apps:property name='to' value='test@gmail.com'/>
<apps:property name='subject' value='test title'/>
<apps:property name='hasTheWord' value='include'/>
<apps:property name='doesNotHaveTheWord' value='exclude'/>
<apps:property name='hasAttachment' value='true'/>
<apps:property name='excludeChats' value='true'/>
<apps:property name='label' value='日経'/>
<apps:property name='shouldMarkAsRead' value='true'/>
<apps:property name='forwardTo' value='test@hotmail.co.jp'/>
<apps:property name='shouldStar' value='true'/>
<apps:property name='shouldTrash' value='true'/>
<apps:property name='shouldNeverSpam' value='true'/>
<apps:property name='shouldNeverMarkAsImportant' value='true'/>
<apps:property name='smartLabelToApply' value='^smartlabel_personal'/>
<apps:property name='size' value='1'/>
<apps:property name='sizeOperator' value='s_sl'/>
<apps:property name='sizeUnit' value='s_smb'/>
</entry>
</feed>

上記xmlファイルのコードを見るに、フィルタ設定の中身は、「entry」要素の子要素である「apps:property」要素の「name」と「value」属性のペアで記述されているようです。

まず、検索条件については以下の「name」属性があるようです。

name value example note
from *@test.com OR *@test.co.jp 送信メールアドレス
to test+@gmail.com 受信メールアドレス
subject test タイトル
hasTheWord test 本文中に含まれる文字列
doesNotHaveTheWord test 本文中に含まれない文字列
hasAttachment true 添付ファイルの有無
excludeChats true チャットを含めるか否か
size 1 メールのサイズ(数値のみ)
sizeOperator s_sl 指定サイズより大きいか小さいか(s_sl, s_ss)
sizeUnit s_smb メールのサイズの単位(s_sb, s_skb, s_smb)

次に、上記検索条件と合致するメールに対する処理は以下の内容で記述します。

name value example note
label test メールに付加するラベル名
shouldMarkAsRead true 既読とするか否か
forwardTo test@hotmail.co.jp 転送先メールアドレス
shouldStar true スターをつけるか否か
shouldTrash true ゴミ箱に入れるか否か
shouldNeverSpam true スパムとして認識させずにおくか否か
shouldNeverMarkAsImportant true 重要としてマークさせずにおくか否か
shouldAlwaysMarkAsImportant true 常に重要としてマークするか否か
shouldArchive true アーカイブするか否か
smartLabelToApply ^smartlabel_personal 付加するスマートラベル

一通り調べた内容では以上の内容でした。
公式のフィルタ作成ダイアログはちょっと使いづらいのでインポート用xmlファイルのジェネレータでも作ってみようかな…

広告
カテゴリー: PC | タグ: | コメントをどうぞ

[Javascript] テキスト入力欄(input, textarea)の値をリアルタイムに監視するには

テキスト入力欄の値によって動的な処理を行いたい場合、現状Javascriptのビルドインなイベントでしっくり来るものはない。

例えばInput要素のvalueの変更を検知するイベントとしては、「change」イベントがあるが、これは対象のInput要素からフォーカスが外れた時に発火する。
これでは入力中の値をもとにリアルタイムな処理を行う事はできない。

別の例としてInput要素に対して「keydown」, 「keyup」, 「keypress」などのイベントでキーボードからの入力に応じて変更があったとみなすとしても、実はブラウザごとにIMEがオンになった状態での前述の3種のイベントの振る舞いが異なる。
具体的にはFirefoxにおいてIMEがオンになった状態で入力を開始すると、keyupイベントは最初の位置文字目で発生し、あとは何文字打とうと確定するときのエンターキーの入力までkeyupイベントは発生しない。
となるとIMEオンの時は入力に応じてリアルタイムに監視することはできない。

ということで、最後の方法としてテキスト入力欄の値をintervalで常時監視して変化があった時に処理を行うしか道は残されていない。

例としてid=”target_input”が指定された要素に対し、

<input id="target_input" type="text" value="" />

以下のような処理で求める動作が実現できる。

var timer = null;

var input = document.getElementById("target_input");

var prev_val = input.value;

input.addEventListener("focus", function(){
	window.clearInterval(timer);
	timer = window.setInterval(function(){
		var new_val = input.value;
		if(prev_val != new_val){
			/* inputに変更があった場合の処理 */
		};
		prev_value = new_value;
	}, 10);
}, false);

input.addEventListener("blur", function(){
	window.clearInterval(timer);
}, false);

今回はテキスト入力欄にフォーカスがあるときのみ10ms毎にvalueをチェックして前回取得時と違う値だったなら…

という仕組み。

カテゴリー: Web Design | タグ: , | 4件のコメント

URoad AeroをPythonから制御して快適に!(sl4a/Android対応)

外出先で威力を発揮するモバイルルーター。

僕はUQ Wimax / シンセイコーポレーションの「URoad Aero」を使用しています。

この商品(他のモバイルルーターの多く)をコントロールするには接続したPCやスマホのブラウザから管理画面を表示して操作する、専用のアプリケーションをインストールして使用するといった方法を取らなければいけません。

大した手間ではありませんが、より快適&素早く操作できたら便利だよなーと思い管理画面のソースを見てみると単にHTTP通信で制御してるみたい。

ということは、Pythonでルーターに直接HTTP/POST通信を行いコントロールできる!ということです。

以下はPython2.6で再起動するPOSTを投げるコード。

続きを読む

カテゴリー: Tips | タグ: , , | コメントをどうぞ

iOSのSafariで、jQueryのdelegate(on)でクリックイベントが動作しないバグの対処方法

jQueryのクロスブラウザなところにある程度の信頼をおいてコーディングしていても、あるとき落とし穴に陥る時がある。

今回はまさにそんなシーン、
iOSデバイスのSafariで、jQueryのdelegate(on)でクリックイベントが動作しないバグの対処方法を紹介します。

<div id="click">動作しない</div>
$("body").on("click", "#click", function() {
	alert("clicked!");
});

上記コードは、#clickが指定された要素のクリック時にアラートを表示するというもの。

jQueryの.on()の使用法としては、別の資料を参照してください。

javascript部分を.delegate()で記述すると、

$("body").delegate("#click", "click", function() {
	alert("clicked!");
});

となります。

どちらで書いたにせよ、iPhone・iPad・iPodのSafariではクリックイベントが発動しません。

この問題はHtml側の簡単な修正で、解決します。

<div id="click" onclick="">動作するようになった</div>

簡単解決!

原文はこちら。

jQuery .on() and .delegate() doesn’t work on iPad – stackoverflow.com

カテゴリー: Web Design | タグ: , | コメントをどうぞ

サイズ可変で縦横比固定のブロック要素をcssのみで実現する方法

Htmlでサイズ可変で縦横比固定のブロック要素を実現する方法を模索していたところ、
ちょっと独特な方法ですが可能なようです。

こちらのページに書かれていました。

日本語訳がちょっとおかしなことになっているので転載。

以下は幅によって高さが決まるタイプのコード。

html

<div class="aspectwrapper">
	<div class="content">
		内容…
	</div>
</div>

css

.aspectwrapper{
	position: relative;
}
.aspectwrapper:after{//beforeでもよい
	padding-top: 75%;//幅に対する高さの割合
	display: block;
	content: "";
}
.aspectwrapper > .content{
	position: absolute;
	top: 0px;
	left: 0px;
	bottom: 0px;
	right: 0px;
}

aspectwrapperというクラスの幅をどのような値にしても、cssの5行目で指定したpadding-topを元に高さが決まる。

上記コードは4:3の場合の例です。

padding-topをパーセントで指定した場合の算出基準は親要素の横幅となるようです。

Box modelより引用:

‘padding-top’, ‘padding-right’, ‘padding-bottom’, ‘padding-left’
Value: <padding-width> | inherit
Initial: 0
Applies to: all elements except table-row-group, table-header-group, table-footer-group, table-row, table-column-group and table-column
Inherited: no
Percentages: refer to width of containing block
Media: visual
Computed value: the percentage as specified or the absolute length

These properties set the top, right, bottom, and left padding of
a box.

つまり、縦横比を4:1にしたい場合は
padding-top: 25%;
とすれば、横幅の4分の1の高さが確保されます。

因みにコード例ではブロック要素に対して適用していますが、
display: inline-block;
を指定した要素に対しても効くはず。

果たして、使用機会はあるでしょうか…

カテゴリー: Web Design | タグ: , | 1件のコメント

UQ Wimax グローバルIPオプションで躓いた!

自宅のネットはUQ Wimaxを使用しています。

理由としては、
・外出用のモバイルルーターと一本化することで通信費が大幅に安くなる
・自宅のある場所では速度面において不自由を感じることが無い
という点が挙げられます。

このほど、2年間あまり使用していたURoad-8000という機種から、同メーカーの最新機種に当るURoad-Aeroに乗り換えました。

そこで問題発生。

共同開発者に外部ネットワークからRailsのテストサーバーにアクセスしてもらって挙動を確認してもらうという事を時々してたんですが、ポート開放の設定をしても全くアクセスできない状態となってしまったのです。

調べるうちに、原因はUQ Wimaxの仕様変更にあると判明。

IPアドレス割り当ての運用変更およびグローバルIPアドレスオプション導入について | UQ WiMAX – ワイヤレスブロードバンドで高速モバイルインターネットより引用:

1. WiMAX機器へ付与するIPアドレスの変更
現在、WiMAX機器に付与されるIPアドレスは、グローバルIPアドレスとなっておりますが、2013年6月以降順次プライベートIPアドレス※2へ変更を行います。大部分の利用形態においては引き続き問題なくご利用いただけますが、グローバルIPアドレスの利用に依存している一部のアプリケーション等はご利用いただけなくなる場合があります。

とのことで、
「グローバルIP + ポート」という方法でテストサーバーにアクセスしてもらうのはもう無理なのか…
と、思いきや!

IPアドレス割り当ての運用変更およびグローバルIPアドレスオプション導入について | UQ WiMAX – ワイヤレスブロードバンドで高速モバイルインターネットより引用:

2. グローバルIPアドレスオプションの提供開始
引き続きグローバルIPアドレスを必要とするアプリケーションをご使用いただけるよう、グローバルIPアドレスの割当を保証するオプションサービスを新たに開始いたします。

とあり、オプション加入で従来通りのグローバルIPが付与された状態での利用が可能に。

2013年9月末利用分まで無料なので試しにオプションを申し込みテストしてみると、無事外部からのアクセスが可能となりました。

他にも方法はあるのかもしれないけどとりあえずはこれで対応します。

新仕様は一部オンラインゲームとかでも不具合があるらしく、トラブルに見舞われている人は無料期間中に試してみるのもいいかもしれません。

「My UQ」ページ「ご契約内容」タブから「契約一覧照会/変更」メニューへ。

ページ下部の「グローバルIPアドレスオプション変更」ボタンから申し込み。

正しく申し込みが完了すればルーター等Wimax機器再起動で晴れてグローバルIPを手に出来ます。

カテゴリー: Tips | コメントをどうぞ

[Javascript] IE8で、キャッシュから画像を読み込んだ時にimgタグのonloadイベントが動作しない場合の回避策

Javascriptをコーディングしていて、IEだけ意図した動作を示さないということはあまりに数多く遭遇するトラブルの一つである。

特にIE9以前のバージョンではそれが顕著であり、そのことに頭を悩ませるのにはもはや慣れたという人も多くいる筈である。この投稿では、IE8で遭遇した不思議な現象についてである。

img要素にonloadイベントをくっつけると画像のロード完了時に関数を実行する事ができるのだが、IE8ではimg要素の画像がキャッシュからロードされるとき、onloadイベントが実行されない。

1. キャッシュから読み込んだ時にonloadイベントが動作しないコード

var img = document.createElement("img");
img.src = "画像のパス";
img.onload = function(){alert("読み込んだよ!")};
parentElement.appendChild(img);

このようにHTMLに動的に画像を埋め込む際、IE8においては初めてのロード時には「読み込んだよ!」とアラートが表示されるが、二度目以降に画像がキャッシュされた状態ではアラートが表示されない。

いろいろ調べたり試したりするうち、回避策が2つあることがわかった。

1つ目はキャッシュのロード自体を防ぐ方法。

2つ目はimgのsrcを指定するタイミングをいじる方法である。

 

 

1. キャッシュのロード自体を防ぐ方法

この方法は以下のように行う。

2. キャッシュのロード自体を防ぐ方法

var img = document.createElement("img");
img.src = "画像のパス" + "?" + new Date().getTime();
img.onload = function(){alert("読み込んだよ!")};
parentElement.appendChild(img);

変更点は赤字の部分。

画像のパスの末尾に、「?」と文字列を加える。

ブラウザは画像のsrcが「?」以下の文字列まで一致していないと同じ画像と判断せず、キャッシュを読み込もうとしない。

現在時刻を「?」以下の文字列とすることで、ブラウザが別の画像として読み込んでくれるから毎回onloadイベントが作動するという仕掛けである。

しかし、毎回読み込み直すには大きすぎる画像である場合やサーバーの負担を考えるとスマートなやり方とは考えづらい。

ではもうひとつの方法ではどうだろう。

 

 

2. imgのsrcを指定するタイミングをいじる方法

この方法はimgオブジェクトのsrcを指定するタイミングを、HTMLにimgタグを生成するより後にするという簡単な工夫である。

2. imgのsrcを指定するタイミングをいじる方法

var img = document.createElement("img");
img.onload = function(){alert("読み込んだよ!")};
parentElement.appendChild(img);
img.src = "画像のパス";

変更点は赤字の部分。

こうすることでブラウザがキャッシュを読み込むにもかかわらず、onloadイベントも発動するようになる。

このほうが、キャッシュの恩恵を受けつつ目的の動作を実行できるのでいい方法なのではないだろうか。

カテゴリー: Web Design | タグ: , | 1件のコメント