Visual Studioでオートフォーマットされるのを防ぐ
Visual Studioのインデント機能は便利なのだが、
変数代入時などの処理を複数行記述したときに、=で縦に揃えたいときに
オートフォーマットがかかって、見ずらくなるのは困る。
そんなときはVisualStudioのメニューからツール>オプション>テキストエディタ>C#>書式設定>全般
2つある『オートフォーマット』のチェックボックスを外す
トラックバック URL :
コメント (7)Visual Studioのインデント機能は便利なのだが、
変数代入時などの処理を複数行記述したときに、=で縦に揃えたいときに
オートフォーマットがかかって、見ずらくなるのは困る。
そんなときはVisualStudioのメニューからツール>オプション>テキストエディタ>C#>書式設定>全般
2つある『オートフォーマット』のチェックボックスを外す
トラックバック URL :
コメント (7)Apache 2.0.46以降であれば
httpd.confで
AllowEncodedSlashes On
とすることで回避できることは有名ですが、
.htaccessで設定できないことから
レンタルサーバー等で運用していて
上記設定が不可能な場合アプリケーション側で対応する必要があります。
方法としては%2fだけ二重にエスケープすることで回避します。
で、具体的な回避方法が見当たらなかったので自分用メモとして
書き残しておきます。
phpサンプル
str_ireplace("%2f","%252f",urlencode($url))
トラックバック URL :
コメント (0)PHPのheader関数で304を返すと勝手にContent-Typeをtext/plainに書き換える。
どうやらcgi版のphp 5.2.6以前だけに起こるphpのバグらしいのだが,修正されている筈の5.2.8になっても治ってない。
header関数で、再度Content-Typeを指定してあげても、強制的にtext/plainに書き換えられるのでお手上げ。
本来は304 statusの時にはContent-Type自体送って来ないのが正しいです。
で、なんでこれが問題になるのかというと
IE7ではセキュリティ強化がされていて、キャッシュの内容とcontent-typeの異なる304 statusが返って来るとローカルキャッシュへのアクセスが拒否されてしまう。尚、firefox等の他のブラウザでは問題ない。
さらにうっとおしい事に、一度キャッシュに残ってしまうと『アクセスが拒否されました』というエラーメッセージと共にスーパーリロード(ctrl+F5)でも、キャッシュの再取得が出来なくなるということ、こうなると、直接、キャッシュフォルダを開いて該当のキャッシュファイルを削除するしか方法がなくなる。
おまけ
アクセスが拒否されましたというページは、内部javascriptによって以下のようなHTMLページが生成されています。
<html><head> <script src="res://mshtml.dll/objectembed_neutral.js"</script> </head><body objectSource="http://対象キャッシュファイルのURL" onload="ObjectLoad();" leftmargin=0 topmargin=0 scroll=no> <form id="objectDestination"></form></body></html>
トラックバック URL :
コメント (98)基本的にaddEventListenerを使う。IEは現時点で対応してないのでattachEventを使う。※仮に今後対応した場合も大丈夫なようにしておいてある。これだけなら、どこにでもある実装で面白くないので、onXXXXX系(onclick等)のIE旧来イベントにも一応対応。記事としてはこっちがメイン。onXXXXX系は、複数指定すると、前の内容を上書きしてしまう特性がある。が、前の関数をappendすることによってそれを回避している。肝は自分自身の関数を一時的に別の変数に格納しているところ。ここを直接指定してしまうと無限ループに陥り、スタックオーバーフローを起こす。また、PHPの可変変数のようにwindow.onclick = window[”onclick”] のようにアクセスしているのもポイント。
/* Event関数 */ function addEvent(elm,type,func){ if(! elm){ return false;} if (elm.addEventListener) { //for W3C DOM elm.addEventListener(type, func, false); } else if (elm.attachEvent) { //for IE elm.attachEvent('on' + type, func); } else if ( 'on' + type in elm) { //onXXXX // 別の変数に格納しないと // 無限ループしてstack overflowを起こす f = elm[ 'on' + type ]; elm[ 'on' + type ] = function(){ if(f!==null){f();};func(); } } else { return false; } }
トラックバック URL :
コメント (77)最近IE6ベースからIE7にようやく乗り換えました。
で、IE7のGoogle検索窓が日本語に対応していなかったので、さっそく
OpenSerachで日本語googleに変更しようと思ったら…項目が見当たりませんのね。
その後、しばらく放置していたのですが、間違って検索窓を使って英語googleで検索してしまうことが
多く、そのたびにくやしい思いをするのが嫌だったのでぐぐってみました。
レジストリ変えなきゃいかんのね。
トラックバック URL :
コメント (62)さくらインターネットでcatch-allする方法でしたが、実は失敗します。
というのは、gmailがMailer-Daemonを迷惑メールとして判定してしまうため
そこで、転送が止まってしまうからです。
基本的に、どうにもならないとwikipediaにも書かれていましたが、
世の中どうにかしている人はいるもので、こちらの記事を参考にして設定してみました。
Gmailの迷惑メールフィルタを無効にする
なんとか無事にできたようです。
あとは、ここの記事にも書かれていますが、定期的にログインさせないといけないみたい。
トラックバック URL :
コメント (63)verpを使いたくて、メールをcatch-allしたかったのですが、さくらインターネットのレンタルサーバーはMTAにsendmailを使用している為出来ません。なのでgmailを一旦介して受け取るようにします。設定が複雑なので、そのときのメモを残しておきます。前提条件として
作業手順
…あまりにも作業内容が長いので以下要点だけ
ここでアカウントを登録無料のアカウント登録
1.まずはcatch-allしたい独自ドメインexample.comをgoogle APPに認証する為にgoogle APPで発行されたgoogleXXXXXXXXXXXXをサブドメインとして登録します。
googleXXXXXXXXXXXXXXXX CNAME google.com.
※google.com.の行末の.(ドット)を付け忘れないように注意してください。2.次に認証が通ったらgoogle APPのMXを登録します。ここで元から設定されていたさくらへのMXは削除します。3.SPFを記述します。google APPからの送信と、さくらの共有サーバーからの送信を許可しておきます。※SPFの設定についてはこちらを参照させて頂きました。
@ NS ns1.dns.ne.jp. NS ns2.dns.ne.jp. MX 10 ASPMX.L.GOOGLE.COM. MX 20 ALT1.ASPMX.L.GOOGLE.COM. MX 20 ALT2.ASPMX.L.GOOGLE.COM. MX 30 ASPMX2.GOOGLEMAIL.COM. MX 30 ASPMX3.GOOGLEMAIL.COM. MX 30 ASPMX4.GOOGLEMAIL.COM. MX 30 ASPMX5.GOOGLEMAIL.COM. TXT "v=spf1 +a:wwwXXX.sakura.ne.jp include:_spf.google.com ~all" googleXXXXXXXXXXXXXXXX CNAME google.com. mail A AAA.BBB.CCC.DDD ftp A AAA.BBB.CCC.DDD www A AAA.BBB.CCC.DDD
※ 注意)NSはさくらのDNSに自動的に設定されるのでここでは設定しないように、設定するとおかしくなります。
通常のさくらのドメインを使用する設定ではなく『他社で取得、または他社で管理中のドメインを移して使う>> ドメインの追加へ進む (非推奨)』で追加するようにします。
ret+*@example.comに来たメールをret-XXX@XXXXXX.sakura.ne.jpの固定アドレスへ転送するように設定します。verpは本当は-(ハイフン)を使うので本来はret-*@example.comなのですが、gmailのエイリアス機能は+なので+を使います。 ちなみに+記号をメールアドレスに使うのはRFCに準拠してないです。なので、gmailのエイリアスはWEBサービスの登録に使う場合に使えないことが多いです。ちなみに+文字はメールアドレスでは特別な意味を持ちます。あんまり使わないので詳細は忘れました(笑)。話が脱線しましたが、verpでは問題ないのでこんな設定で行きます。※ 尚、gmailのキャッチオールアドレス機能は使いません。エイリアス機能のみ使います。1.新しいユーザーを作成
姓 return 名:addressユーザー名: ret @example.com
2.新しいユーザーでログイン3.メール転送とPOP/IMAP設定
次の宛先にメールを転送受信メールをXXX@XXX.sakura.ne.jpに転送しメールのコピーを削除
/HOME/ユーザー名/Mailbox/XXX/.mailfilter
.mailfilterの設定内容はこんな感じ
to "| /home/ユーザー名/bin/verp.php 2>&1 >> /home/ユーザー名/logs/verp.log"
でVERPを処理するプログラムを記述テスト中は上の用にログを吐いておくとデバックしやすいが、放置しておくとログがサーバーのディスク容量を圧迫するので、安定稼動したら以下のように/dev/nullに捨てておくこと。
to "| /home/ユーザー名/bin/verp.php 2>&1 >> /dev/null
qmailでは環境変数(Return-Path)から取り出していたところをメールヘッダーのDelivered-Toあたりを抜き出してret+hogehoge=sample.com@example.jpを処理する。くどいようですが”-”を”+”に変えるのを忘れない。phpのプログラムサンプル
#!/usr/local/bin/php -q< ?$prefix = "ret";$delimiter = '+';$delimiter = preg_quote($delimiter);$domain = "example.com";$domain = preg_quote($domain);$alnum = "a-zA-Z0-9";$target = "Delivered-To"; $regex ='/'."^".$target.": ".$prefix.$delimiter."("."[{$alnum}_.-]+"."=[{$alnum}_.-]+."."[{$alnum}]+".")"."@".$domain.'/';echo "正規表現: ".$regex."n"; $buffer = file("php://stdin");foreach($buffer as $buf){ if(!$is_body and preg_match($regex,$buf,$match)){ $verp = $match[1]; $verp = str_replace("=","@",$verp); echo "VERPアドレス: ".$verp."n"; } if(preg_match("/^(n|rn|r)$/",$buf)){ $is_body = true; }}print_r($buffer);
トラックバック URL :
コメント (66)kernel: CPU0: Running in modulated clock mode
コメントSPAMのDOSでサーバーが死にそうなので
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW -m recent --set --name HTTP iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 60 --rttl --name HTTP -j DROP
sshのブルートフォースアタック対策と同様iptables のresent モジュールでアクセスを遮断
トラックバック URL :
コメント (63)IE6以下でcssで透過PNGを使用する際にAlphaImageLoaderを使用するがAlphaImageLoaderは背景というよりも最前面にイメージをロードする仕様なのでリンクの上や入力フォームの上のレイヤーに置かれてしまい、formのinputタグやaタグを使うと不具合が生じる。対処方法は、aタグやinputタグの外側にspanタグなどで囲みそこでbackground及び、AlphaImageLoaderを設定する。その後中のAタグやINPUTタグの部分で position:alternativeを指定し、強制的にAlphaImageLoaderの上に表示させるようにする。
/* search form */ #searchform { position: absolute; top: 0px; right: 0px; background: url(/_img/searchform-bg.png) no-repeat right bottom; _background:none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=/_img/searchform-bg.png); height: 60px; width: 259px; } #searchform #s{ position: relative; background: #ffffff url(/_img/form-field-bg.gif) no-repeat ; height: 17px; width: 148px; margin: 6px 5px 0px 35px; padding: 3px 7px 2px 5px; color: #999999; border: none; } #searchform #searchsubmit { background: url(/_img/search-btn.png) no-repeat left top; _background:none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=/_img/search-btn.png); height: 24px; width: 24px; border: none; text-indent: -999%; line-height: 1px; margin-top: 6px; }
このサイトの検索窓がそんな感じになってました。
トラックバック URL :
コメント (71)IE7からAlphaImageLoaderでなくても透過PNGができるようになったので、*(アスタリスク)ハックで下のように書いてIE7でもAlphaImageLoaderを使うのは辞めましょう。AlphaImageLoaderは前のエントリーの通り色々問題があるので使わないのが吉です。
background: url(/_img/search-btn.png) no-repeat left top; _background:none; *background:none; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=/_img/search-btn.png);
↓
IE7では_(アンダースコア)ハックが効かないのを利用して、filterの方を止めます。
background: url(/_img/search-btn.png) no-repeat left top; _background:none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=/_img/search-btn.png);
トラックバック URL :
コメント (47)