postfixでバーチャルメールアドレスとか
特定のドメインでメールを受け付けてphpを動かす
王道は、
- virtual_alias_mapsでアドレスを書き換える
- 書き換えたアドレスのaliasを設定しておいて、aliasからプログラム呼び出し
という感じ。
/etc/postfix/main.cf
virtual_alias_maps = regexp:/etc/postfix/virtual_alias_maps alias_maps = hash:/etc/aliases
/etc/postfix/virtual_alias_maps
/^(.*)\@upload\.exsample\.com$/ upload
/etc/aliases
upload: /usr/bin/php /path/to/upload.php
プログラム呼び出し時の環境変数
aliasからプログラムを呼び出した場合、環境変数に以下の値がセットされる
SHELL 受信ユーザのログインシェル。 HOME 受信ユーザのホームディレクトリ。 USER 裸の(bare)受信者名。 EXTENSION オプションの受信者アドレスの拡張部。 DOMAIN 受信者アドレスのドメイン部。 LOG名前 裸の(bare)受信者名。 LOCAL 受信者アドレスのローカル部分全体(@ の左側)。 RECIPIENT 受信者アドレス全体。 SENDER 送信者アドレス全体。http://www.postfix-jp.info/trans-2.3/jhtml/local.8.html
なので、phpを動かした場合、$_SERVER['USER']という風にして受信者名などを取得することができる。
virtualでアドレス書き換えを行った場合のRECIPIENT
上記のように、
/^(.*)\@upload\.exsample\.com$/ upload
こんな感じで書き換えを行なっていた場合に、test@upload.exsample.com宛にメールを送ると、
環境変数RECIPIENTに入る値は、
upload@exsample.com
のように、書き換え後の値が入ってくる。*1
プログラム上で送り先アドレスを見て処理を分岐とかしたい場合、勿論、標準入力*2にはメールの実データが受け渡されてるんで、そっちを分解してやればX-Original-Toに書き換え前のtest@upload.exsample.comが入っているはずなので判断可能だけど…。
書き換え後の宛先は環境変数に入ってるんだから、書き換え前の宛先もさくっと環境変数で取得したりできないものか
というのが本題。*3
で、ほぼ丸一日使って試行錯誤した結果どうにも無理っぽいなぁという雰囲気。
virtualでalias宛に書き換えずに直接virtual_alias_mapsからプログラム起動できないか?
→不可能
どうやら仕様です。
master.cfにpipe追加してtransport_mapsで起動すると良いんじゃないか?
→無理っぽい
確かにこの方法で起動するとRECIPIENTはオリジナルのままなんだけど、存在しないユーザー宛だとUser unknownになってしまった。
http://www.postfix-jp.info/trans-2.3/jhtml/VIRTUAL_README.html#mailing_lists
- バーチャル エイリアスドメインの場合、それぞれのメーリングリストアドレスから それ自身への同一性を持つマッピングが存在する必要があります。
- バーチャル メールボックスドメインの場合、それぞれのメーリングリストアドレスに 対するダミーメールボックスが存在する必要があります。
マニュアルにもしっかり書いていたオチ。
なんかオプションでどうにかならないの?
→無理っぽい
マニュアル読みまくったけどそれっぽいのは無さそう。もしあったら教えてえらい人。
どうにか対処する方法
recipient_delimiterを使う
recipient_delimiterはデフォルトで設定されていないので、main.cfに設定を追加。
recipient_delimiter = +
また、virtual_alias_mapsも書き換える。
/^(.*)\@upload\.exsample\.com$/ upload+$1
これで、例えばtest@upload.exsample.com宛に送ったとすると、
- virtualでアドレスをupload+testに変更
- ユーザーupload+testは見つからない。recipient_delimiterを設定しないとこの時点でUser knownになる
- recipient_delimiterは"+"なので、ユーザーuploadを探すして環境変数EXTENSIONにtestを設定する
- aliasにuploadが設定されているので、プログラム呼び出し
って感じになる。
これで、環境変数EXTENSIONに、最初の送信先アドレスが含まれることになるので、わりかしスマートに処理の分岐ができるようになる…と。*4
ソフトバンクでポイント交換
7月11日って何かの日だったような気がするなぁと思ったらiPhone3Gの発売日だったらしい
という訳で、4年前の7月11日にiPhone3Gを買って、2年後の6月7日にiPhone4に機種変した訳ですが、iPhone4機種変時にはポイントを全部使ったんだけど、2年経って7月末でポイントが切れることになりました。
iPhone5が6月だったら機種変にポイント使うところだったんだけど、残念ながら発売しなかったので、1000ポイント余り無駄に消してしまわないためにポイントを使いました。
いろいろ迷った挙句使ったのは、Apple USB Power Adaptor 3 2,667ポイント。
これ、交換ページ見ただけだとわかりづらいですが充電アダプターとUSBケーブルが同梱されています。
どう考えてもケーブルのみって割にあわないような…。
ところで、Amazonでリンク貼ろうかと思ったら…Amazon、偽物しか売ってないね('ω`)
とりあえず本家はこちら。
ケーブルは100均でも買えるから良いとして、USBのアダプターは純正以外のものを買っても1000円近くするし、あったらあったで非常に便利なので。
100均のUSBドックケーブルについて
詳しくは検索すると出てくるけれど、ダイソーは充電のみ対応でピンアサインがおかしい感じです*1
一応充電できるけど、少し不安。
セリアのは至って普通のピンアサイン。カールケーブルになってるのしか持ってないけど、3種類ぐらいあるみたい。*2
ただ、ダイソーのは内部でドックコネクタのピンは5本入っていて他のは4本。
なので、分解してラインアウトケーブルなどを作るにはダイソーのを使うのがベターです。
あと、DealExtreamで売ってる$1.6の純正風ドックケーブルは3本買ったけど1本は充電できず、1本はしばらくして断線という感じでした。
*1:GNDの位置が変だった気がする。詳しくは忘れた
iPhone4 5.1.1 JB
iPhone4でiOS 5.1.1にアップデートしたらエラー14が出て少々ハマった件
今更なんだけど、iOS5.1.1にアップデートして、またいつものようにJailbreakした。
私の使ってるiPhoneは初期型の4なので、念のためBB維持しています。
BB維持でのアップデート手順としては、
- redsn0wでNOBBなファームウェアを作成(Extras→Custom IPSW)
- redsn0wでPwned DFUに入る(Extras→Pwned DFU)
- iTunesでNOBBのファームウェアを使って復元してiOSアップデート
- redsn0wでJailbreak
- iTunesでバックアップから復元
…という感じ。
なんだけど、3のiTunesで復元する時点でエラー14が発生。
どうも調べたらPwned DFUに入れてなかったり、ファームウェアが壊れてるとなるということだったので、iREB使ったり、ファームウェア作りなおしたり試した結果、原因は、
iPhone版Chrome
以下の記事はJB済みiPhoneでの記事になるので非JB環境と異なる場合があります*1
数日前、待望の?iPhone版Chromeがリリースされました。
詳しい特集記事はその辺にあがってると思うので、自分が思うことだけ書いていきます。
中身のブラウザエンジンはMobileSafariそのまま
PC版のChromeはSafariと同じブラウザエンジンのWebKitを使っているけれど、Chrome専用にGoogleチューニングされています。
しかし、iPhone版ChromeはSafariのブラウザエンジンをそのまま使っているとのことです。
個人的には、これもメインで使おうと思った理由のひとつだったりします。
今のスマートフォン版のWEBページは、MobileSafariを標準としている訳で、わざわざスマートフォンでブラウザエンジン違いでブラウジングに問題が出たりしたら面倒くさいですからね。
『MobileSafariそのまま』という事は、私は安心感としてポジティブに捉えてます。
UIはSafariと全然違う
ブラウザエンジンが同じであっても、ChromeのUIはSafariと全然違います。
しばらくは慣れが必要でしたが、慣れると使いやすい…かなぁ、あんまり変わらない気がする。
タブの切替
左右の画面端からフリックすると、開いているタブをすいすいと切り替えられます。
この操作は使っていて気持ちは良いんですが、横スクロールしようとすると誤爆する事もあるので一長一短。
新規タブを開く
右上にあるタブ切り替えボタンか、そのとなりにあるメインメニューを開いてから新規タブを選ぶ、という操作なんですが、左手で持って片手操作しているときには遠いので少々押しづらい。Safariだと右下にあるのでまだ楽。なんかジェスチェがあれば良いんだけど。
ブックマークの表示がアイコン表示
ブックマークは、大きなアイコンで横3×縦3.5ぐらいで表示されてそこから選ぶようになっています。
なんとなくアイコン表示よりリスト表示のほうが一度に沢山表示できるような気がします…が、実はMobileSafariでは一度にリストに表示される件数は8.5件ほど。
なので、9件+ちょっと表示されるChromeのほうが一度に表示される量は多い。
…けれど、使いやすさとなると別かな、と。
これも慣れなのかもしれないけど、私はリスト表示のほうが使いやすいと思っています。
というのも、やっぱり左手片手操作だからなのかな。右上が微妙に遠い。
ただ、favicon対応してるのは凄く良いので、今後小さいfavicon付きリスト表示に対応しないかなぁと期待してます。
とりあえずChromeをメインブラウザで使うことにしました
そんな訳でネガティブなことばかり書きましたが、メインブラウザをChromeにしました。
Googleアカウントを使ってブックマークが同期できる
PCでもChromeをメインブラウザにしているんですが、PCのChromeとMobileSafari間でブックマーク同期出来ないのが結構不便でした。
Mac使ってればその辺の不便は無いんだろうけど、Windowsでそれをしようと思うと、一旦IEを経由して同期とか、サードパーティのブックマーク同期サービスを使うとか、わりかし面倒だったので諦めてました。
iPhoneしか持ってないときにPCで付けたあのブックマークを開きたい、とか、出先でiPhoneにメモったブックマークの記事をPCで読みたいとか、時々だけどあったんですよね。その度にメールとか使ってましたよ。*2
iPhoneのブラウザを完全にChromeに切り替える
JB環境の人は、BrowserChangerというアプリをCydiaからインストールすれば、各アプリからOpen Safari等のボタンを使ったときや、メールに書かれたURLを選択した時などにも、SafariではなくChromeを開くように設定できます。
今のところ、Chromeに備わってる機能は最低限って感じなんですが、Googleのことなんで、今後また機能がどんどん追加されていくんじゃないかなーと思ってます。
なんとなく無理な気はするけど、開発者ツールとか搭載しないかなぁ…。
*1:BrowserChangerのこと以外はJB環境に依存することは書いてないと思うけど
*2:ソーシャルブックマークサービスはなんか馴染めないので使ってない。多分ブラウザからブックマークを開く間にワンアクション必要になるのが嫌なんだと思う
jEditのネタいろいろ
もっと評価されるべきエディタ、jEditでハマったのでメモ。
というか、本気でもっと評価されるべきだと思うんですよという意味でも積極的に記事は残さないとね…。
phpparserで保存時に構文チェックが行われない
jEditではいろいろなプラグインを使うことでかなり膨大な数のファイルの編集に対応してます。
構文解析自体は、SideKickという中核になるプラグインがあって、それによって構文チェックが行われて、加えてErrorListというプラグインと連携して、エラーの一覧を表示してくれます。
構文解析の定義もまたプラグインで提供されていて、PHPの場合は、PHPParserというのが担当してくれるわけです。
それで、SideKickが構文解析を行うタイミングというのが、PluginOptions→SideKick→General→Auto parsing Settingsで設定ができ、
- Parse on buffer switch バッファ((jEditが開いてるファイルのことをjEditではbufferと呼んでる)を切り替えた時
- Parse on buffer save バッファを保存した時
- Parse on keystroke キーボード入力時(秒数指定可能)
と、三種類あるんです、が、
Parse on buffer saveを設定しても、何故かPHPファイルを保存したタイミングで構文解析が行われない。
Parse on buffer switchやkeystrokeは正常に動くのだけれど、saveだけ無理。
以前はちゃんと動作していたような気がするんだけど、なんだろうバージョンの関係かとか思って、古いバージョンのプラグインを入れたり、逆に最新に切り替えたりJREを最新にしたり…と、試行錯誤した結果、問題が解決。
SideKickのParse on buffer saveは、SideKickタブを表示している状態で無いと動作しない
…と('ω`)
switchとかkeydtrokeはSideKickを表示していなくても動作するし、PHP ParserにLoad plugin on startupとかって項目もあるから、まさか表示しないと動かないとは思いもしなかった…。