はてなキーワード: Shift_JISとは
2ちゃんねるには2つある
この2つだ(今はGoogleも「こいつらケンカしてるだけだ」とわかったのかだいたい等価だ、しかし.netがサーバ移転元のスレを止めないという間抜け処理をしたため検索有利性が木阿弥に)
で、おそらくはscのほうに書き込んだのだろう
マックでも良いけど、惰性で窓。
どこ行っても書くから、軽量(1kg未満)・小型(11.6インチ)なやつ。
タブレットや2 in 1みたいな、キーボードと本体をBluetoothで接続するのはダメ。
UTF-8のプレーンテキストが望ましい。Shift_JISは亜種あって困る。
どうしてもリッチなドキュメントが必要な時はOffice Online、Google Document使う。
縦書で出力する時はVerticalEditor使ってる。
ローカルは64GBのSSD。扱うファイルがほとんどプレーンテキストだからこの容量で済む。
物理メディア(USBメモリ、外付けHDD)より、大手各社が運用するサーバーの方が相対的に信頼性高い。
ローカル、クラウドの2箇所に同じデータがあるようにしている。
本当は3箇所(ローカルとクラウド2つ)に保存しておくと安全だけど面倒だからやってない。
今朝のスッキリで手巻きピザが紹介されたせいで、ピザーラのサイトが一時的にアクセス集中でエラーになった
おそらく503エラーと思われるが、httpヘッダがshift_jisなのに、aspxのデフォ設定がUTF-8のままっぽくてエラー文がutfで吐き出されてた。
IEならこれでも表示できちゃうんだろうけど、firefoxとかだとおもいっきし文字化けする
返ってきた文章は、「今はエラーも出ずにちゃんと見れてますので確認してみてください。エラーの設定は影響範囲が広いので考えさせて」といったもの。
まあそんなもんだろ。通常あるべき姿でないときに表示されるメッセージに不具合があったところで、誰も困るわけじゃない。
そもそもエラーメッセージすら出ずに白紙になるサイトなんてゴマンとある。至極まっとうな返事かもしれない。
「おたくのお店、停電したとき壁に変な模様が出ますから直したらどうですか?」って言ってるようなものだ。そもそも停電なんて普通起こらない。そこに金かけるかと。
こう来るのは分かってたんだけどねえ。じゃなんで問い合わせしたんだろ。問い合わせないと気がすまなかったのか。
言われる側としては迷惑な話じゃないのか。他人のアラにばかり目が行ってテメエの会社のサーバーはどうなんだおい、と。
まあそんなことを考えさせられました。
---------------------------------------------------------------------------
---------------------------------------------------------------------------
前回の続き
エロサイトのコンセプトを「誰もがオナニーライフを充実できるように多くのカテゴリを持つ総合エロ動画サイト」
に決めた僕。
さて、稼げるかどうかは、どういう広告をどう貼るかが問題なんだけど、ちょっと難しいので、
これは、もう少し後で、紹介します。
今回は、実際のエロサイトをどうやって作るかです。
さっそくgoogle先生にお願いしてみた。
何度もお呼び立てして申し訳ございません。
私、webサイトのwの字も存知上げません。
どうかこの愚生をご引導ください。
先生が言うにはどうやらWEBサイトはhtmlというもので作られているらしい。
えいちーてぃーえむえる?
他にもphpやcgiなどのプログラミング言語で作成もできるらしい。
ふむふむ、google先生によるとWEBサイトはどんなものでもhtmlソースが見れるらしい。
フフフ、先生
僕はあなたの全てが見たいんです!!
とりゃー!
は?
へべ?
もぎょぶ?
ナンナンダ!コレハ!
みんなこんな訳わからん英文字を駆使して
ホームページ作ってたのか!
<head>もなんとなくわかる気もする。上の方ね。頭の方って事ね。(違うけど)
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">で完全に思考停止。
知らない事が多すぎる。
なんだかまた不安になってきた。
知らないって超こわーい
「おいら、上に立つ人間っていうのは完全に孤独じゃなきゃいけないって思う」
500G師匠?
振り返ると、備え付けハードディスクに入った500G師匠が僕を見つめていた。
師匠ありがとうございます。僕がんばります!
僕が意気込みを見せると、500G師匠はちょっと照れくさそうに頭を掻いた。
「あんちゃんが売れたら、おいら使ってくれよな」
つづく
少し遅れた感があるけど、解いてみた。
出力がテキストでないけど・・・。
仕事の合間を使ってやったものの、昼前に始めたのが5時頃にようやくできる程度。
これを25分とは尋常じゃないな、大口叩くだけあってよっぽど優秀なんだろう。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <style type="text/css"> <!-- pre { font-family: monospace; } --> </style> <script type="text/javascript"> <!-- window.onload = function() { var q = new Map(); q.load("maptest.txt"); q.search(); var answer = document.getElementsByTagName("pre").item(0); var answerText = "\r\n"; for(var ix = 0; ix < q.route.length; ix++) { answerText += q.route[ix].join("") + "\r\n"; } answer.firstChild.data = answerText; alert("終了しました。"); }; /** マップオブジェクト */ function Map() { this.ymap = []; this.route = []; } //マップの読み込み Map.prototype.load = function(filePath) { //ファイルシステム var fileSystem = new ActiveXObject("Scripting.FileSystemObject"); //ファイル読み込み var file = fileSystem.OpenTextFile(filePath); while(!file.AtEndOfLine) { var fileBuffer = file.ReadLine(); this.ymap.push(fileBuffer.split("")); } file.Close(); fileSystem = null; }; //マップの探索 Map.prototype.search = function() { var that = this; //マップコピー var ymap = this.ymap.concat(); for(var y = 0; y < ymap.length; y++) { ymap[y] = ymap[y].concat(); for(var x = 0; x < ymap[y].length; x++) { if(ymap[y][x] == "S") var start = new MapNode(y, x); if(ymap[y][x] == "G") var goal = new MapNode(y, x); } } var openList = []; var closeList = []; start.costf = start.distance(goal); openList.push(start); //経路探索 while(openList.length > 0) { var node = openList.shift(); //探索終了 if(goal.equal(node)) { createRoute(node); break; } closeList.push(node); //隣接ノードの作成 var tonari = []; if( ymap[node.positionY][node.positionX - 1] == " " || ymap[node.positionY][node.positionX - 1] == "G" ) tonari.push(new MapNode(node.positionY, node.positionX - 1, node)); if( ymap[node.positionY - 1][node.positionX] == " " || ymap[node.positionY - 1][node.positionX] == "G" ) tonari.push(new MapNode(node.positionY - 1, node.positionX, node)); if( ymap[node.positionY][node.positionX + 1] == " " || ymap[node.positionY][node.positionX + 1] == "G" ) tonari.push(new MapNode(node.positionY, node.positionX + 1, node)); if( ymap[node.positionY + 1][node.positionX] == " " || ymap[node.positionY + 1][node.positionX] == "G" ) tonari.push(new MapNode(node.positionY + 1, node.positionX, node)); //隣接ノードの検索 for(var tx = 0; tx < tonari.length; tx++) { var openIn = false; var closeIn = false; tonari[tx].cost = node.cost + 1; var costf = tonari[tx].cost + tonari[tx].distance(goal); tonari[tx].costf = costf; //オープンリストから検索し入れ替える。 for(var ox = 0; ox < openList.length; ox++) { if(tonari[tx].equal(openList[ox])) { openIn = true; if(costf < openList[ox].costf) { openList.splice(ox, 1); push(openList, tonari[tx]); } break; } } //クローズリストから検索し、オープンリストへ移す。 for(var cx = 0; cx < closeList.length; cx++) { if(tonari[tx].equal(closeList[cx])) { closeIn = true; if(costf < closeList[cx].costf) { closeList.splice(cx, 1); push(openList, tonari[tx]); } break; } } //どちらにもない場合、オープンリストへ追加する。 if(!openIn &amp;&amp; !closeIn) push(openList, tonari[tx]); } } //適切な位置に追加する。 function push(array, item) { for(var ix = 0; ix < array.length; ix++) { if(item.costf < array[ix].costf) { array.splice(ix, 0, item); return; } } array.push(item); } //ルートマップの作成 function createRoute(lastNode) { var node = lastNode.parent; while(node.parent) { ymap[node.positionY][node.positionX] = "$"; node = node.parent; } that.route = ymap; } }; /** マップノード */ function MapNode(y, x, parentNode) { this.positionY = y; this.positionX = x; this.parent = parentNode; this.cost = 0; this.costf = 0; } //同一ノードかチェックする。 MapNode.prototype.equal = function(targetNode) { if( this.positionY == targetNode.positionY &amp;&amp; this.positionX == targetNode.positionX ) return true; return false; }; //直線距離を求める。 MapNode.prototype.distance = function(targetNode) { sabunY = this.positionY - targetNode.positionY; sabunX = this.positionX - targetNode.positionX; return sabunY ^ 2 + sabunX ^ 2; }; // --> </script> <title>経路探索:A*</title> </head> <body> <pre>&nbsp;</pre> </body> </html>
↓
<style type="text/css">dt{float:left;clear:left;width:10em;}</style>
<meta content="charset=Shift_JIS"/>
<script type="text/javascript"></p> <p>window.onload = init;</p> <p>var url = [</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html">http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm">http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm">http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html">http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html">http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html">http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html">http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/data03_04.html">http://www.senkyo.metro.tokyo.jp/data/data03_04.html</a>",</p> <p> "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html">http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html</a>"</p> <p>];</p> <p>var base = "<a href="http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/">http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/</a>";</p> <p>var file = ["chiyoda","chuou","minato","shinjyuku","bunkyo",</p> <p> "taitho","sumida","koutho","sinagawa","meguro",</p> <p> "ohta","setagaya","shibuya","nakaono","suginami",</p> <p> "toshima","kita","arakawa","itabashi","nerima",</p> <p> "adachi","katushika","edogawa"];</p> <p>for(var i=0; i<23; i++){</p> <p> url.push(base + file[i] + "\.html");</p> <p>}</p> <p>var id = [</p> <p> "2007 参院比", "2005 衆院比", "2005 都議会", "2004 参院比", "2003 衆院比",</p> <p> "2001 参院比", "2001 都議会", "2000 衆院比", "1998 参院比", "1997 都議会"</p> <p>];</p> <p>var ku = [</p> <p> "千代田","中央","港","新宿","文京",</p> <p> "台東","墨田","江東","品川","目黒",</p> <p> "大田","世田谷","渋谷","中野","杉並",</p> <p> "豊島","北","荒川","板橋","練馬",</p> <p> "足立","葛飾","江戸川"</p> <p>];</p> <p>var regexku = new RegExp("(" + ku.join("|") + ")区");</p> <p>var iframe = [];</p> <p>var data = {};</p> <p>var parse = [ function(){</p> <p> var d = iframe[0].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<10; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "0"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[1].contentWindow.document;</p> <p> var nobr = d.getElementsByTagName("nobr");</p> <p> for(var i=0, l=nobr.length; i<l; i++){</p> <p> if(regexku.test(nobr[i].firstChild.nodeValue)){</p> <p> for(var j=0, e=nobr[i].parentNode; j<4; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "1"] = e.firstChild.nodeValue;</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[2].contentWindow.document;</p> <p> var nobr = d.getElementsByTagName("nobr");</p> <p> for(var i=0, l=nobr.length; i<l; i++){</p> <p> if(regexku.test(nobr[i].firstChild.nodeValue) && nobr[i].parentNode.tagName == "SPAN"){</p> <p> for(var j=0, e=nobr[i]; j<6; j++){</p> <p> e = e.parentNode;</p> <p> }</p> <p> var e2 = e.nextSibling.nextSibling.firstChild.childNodes[2].firstChild;</p> <p> var k = 0;</p> <p> data[RegExp.$1 + "2"] = 0;</p> <p> while(e2){</p> <p> if(e2.firstChild.firstChild.nodeValue.indexOf("公明党") != -1){</p> <p> data[RegExp.$1 + "2"] += parseInt(e2.parentNode.nextSibling.childNodes[k+2].firstChild.nodeValue.replace(",",""), 10);</p> <p> }</p> <p> e2 = e2.nextSibling;</p> <p> k++;</p> <p> }</p> <p> data[RegExp.$1 + "2"] = int2str(data[RegExp.$1 + "2"]);</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[3].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<19; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "3"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[4].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> var regexku2 = /(大田|世田谷|練馬|足立|江戸川)/;</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.nodeValue)){</p> <p> data[RegExp.$1 + "4"] = td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(/\.\d+/,"");</p> <p> continue;</p> <p> }</p> <p> if(regexku2.test(td[i].firstChild.nodeValue)){</p> <p> data[RegExp.$1 + "4"] = (data[RegExp.$1 + "4"] || 0) </p> <p> + parseInt(td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(",","").replace(/\.\d+/,""));</p> <p> }</p> <p> }</p> <p> for(var j=0; j<5; j++){</p> <p> data[ku[[10,11,19,20,22][j]]+"4"] = int2str(data[ku[[10,11,19,20,22][j]]+"4"]);</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[5].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<10; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "5"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[6].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<7; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "6"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"").replace("-","0");</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[7].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p> <p> for(var j=0, e=td[i]; j<9; j++){</p> <p> e = e.nextSibling;</p> <p> }</p> <p> data[RegExp.$1 + "7"] = e.firstChild.firstChild.nodeValue;</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(){</p> <p> var d = iframe[8].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p> <p> data[RegExp.$1 + "8"] = int2str(td[i].nextSibling.firstChild.firstChild.firstChild.nodeValue);</p> <p> }</p> <p> }</p> <p> show();</p> <p>}, function(n){ return function(){</p> <p> var d = iframe[n+9].contentWindow.document;</p> <p> var td = d.getElementsByTagName("td");</p> <p> data[ku[n]+"9"] = 0;</p> <p> for(var i=0, l=td.length; i<l; i++){</p> <p> if((((td[i].firstChild || 0).firstChild || 0).nodeValue || "").indexOf("公明") == 0){</p> <p> data[ku[n]+"9"] += parseInt(td[i].parentNode.lastChild.firstChild.firstChild.nodeValue.replace(",",""));</p> <p> }</p> <p> }</p> <p> data[ku[n]+"9"] = int2str(data[ku[n]+"9"]);</p> <p> show();</p> <p>}}];</p> <p>function init(){</p> <p> for(var i=0; i<23; i++){</p> <p> var dl = document.createElement("dl");</p> <p> dl.appendChild(document.createTextNode("\n【" + ku[i] + "区における公明票】\n"));</p> <p> for(var j=0; j<10; j++){</p> <p> var dt = document.createElement("dt");</p> <p> var dd = document.createElement("dd");</p> <p> dt.innerText = id[j];</p> <p> dl.appendChild(dt);</p> <p> dl.appendChild(dd);</p> <p> }</p> <p> document.body.firstChild.appendChild(dl);</p> <p> }</p> <p> for(var i=0; i<32; i++){</p> <p> var e = document.createElement("iframe");</p> <p> iframe[i] = e;</p> <p> e.style.display = "none";</p> <p> if(i<9) var f = parse[i];</p> <p> else var f = parse[9](i-9);</p> <p> e.attachEvent("onload", f);</p> <p> e.src = url[i];</p> <p> document.body.appendChild(e);</p> <p> }</p> <p>}</p> <p>function show(){</p> <p> for(var i=0; i<23; i++){</p> <p> var dl = document.body.firstChild.childNodes[i];</p> <p> for(var j=0; j<10; j++){</p> <p> var dt = dl.childNodes[j*2+1];</p> <p> dt.innerText = id[j] + " " + (data[ku[i]+j] || "");</p> <p> dt.nextSibling.innerText = bar(data[ku[i]+j], j);</p> <p> }</p> <p> }</p> <p>}</p> <p>function int2str(num){</p> <p> return new String(num).split("").reverse().join("").replace(/(\d{3})/g,"$1,").split("").reverse().join("");</p> <p>}</p> <p>function bar(str, flag){</p> <p> str = str || "";</p> <p> if(str == "" || str.length < 5) return "";</p> <p> var num = parseInt(str.match(/\d+/)) + 1;</p> <p> var arrow = (flag == 2 || flag == 6 || flag == 9) ? " ←" : "";</p> <p> var _bar = new Array(num).join("|") + arrow;</p> <p> return _bar;</p> <p>}</p> <p></script>
うん。「Expires」は日付。百歩譲って、RFCに「0の場合は特別扱いしろ」とかいてあるので0はありだと思うが、「-1」は論外。
つぎに「JSESSIONID」のSet-Cookie。ルートディレクトリのコンテンツに対する要求なのに「Path=/cs」がついてる。ありえん。っていうか他のページも行くたんびに同じSet-Cookieがでてる。ぱっと探してみたところ「/cs」のパスを持つコンテンツはないので、なんかの設定ミスだろうな。
「SS_X_JSESSIONID」のSet-Cookieは見ての通り。
あとはcharsetのWindows-31J。IANA的には全く問題ないんだが、MSIEがこれを認識できないバグを持っているので、Shift_JISを使うのが常道。一部のサーバーソフトがShift_JISだと問題を起こすんでWindows-31Jにしてるんだろうけど、この問題を回避する方法は有名。知らないのはモグリ。
あと、「サーバーが超混雑しててつながりにくくてしょうがない」という状況で、KeepaliveのTimeoutがデフォルトの15秒のままってのもなー。3~5秒でいいよ。
どうしたんかいな、とネットワークトレースをとってみた。そしたら、トップ画面の要求に対してこんな応答が返っていた。
GET / HTTP/1.1 Host: www.yodobashi.com Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive HTTP/1.1 200 OK Date: Wed, 29 Oct 2008 02:02:31 GMT Server: Apache Pragma: no-cache Cache-Control: private Expires: -1 Set-Cookie: JSESSIONID=FAE13F42154EB566479E047B57CBF2EA; Path=/cs Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/ Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/ Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/ Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/ Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/ Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/ Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/ Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/ Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/ Set-Cookie: BIGipServerPool_www_yodobashi_com_cms=1258399936.20480.0000; path=/ Content-Length: 83878 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html;charset=Windows-31J
えーと。どこから突っ込んでいいのやら。
私は単なる一増田でしかないのだが、なんとなく今日を増田的情報セキュリティの日とすることに決めた。
なぜって、今日は、年末年始という忙しく、そして狙われやすい時期をはさみ、2月2日からきっかり103日前だからである。
決して、はまちちゃんとエガミ君のやり取りがあったとか、増田はセキュリティ関連の話題に乏しいとか思ったからではない。
さて、一口にセキュリティといっても、その幅は広い。まずは定番から攻めるのが定石であろう。何が定番なのかについては、例えば「Webアプリ脆弱性オタがふつーのSEの彼女に脆弱性世界を軽く紹介(ry」などが参考になるだろう。
しかし、たとえば「初心者はPHPで脆弱なウェブアプリをどんどん量産すべし」といったような初心者には、まずは10というよりも1から脱初心者していただくのがよいであろう。
そんなわけで、今年のテーマはXSSとする。繰り返すが、はまちちゃんとエガミ君のやり取りがあったとか、XSS以外のネタが少ないとかではない。
さて、このように、今年のテーマはXSSとなった。それではXSSとは何か、どのように起き、どう対処すればよいのか、そのような実例ちょうど良いエントリが「エガミくんの脆弱性のやつ」である。
さらに、このエントリをよんで、実際に「XSSしたい><」と思った人に読んでいただきたいのは「今昔さっき物語」であろうか。
さて、非常に簡単にXSSについて書いたが、このXSS、実はその他のさまざまな脆弱性の基礎でもある。
出力がHTMLならXSSだが、SQLならSQLインジェクションだし、シェルならコマンドインジェクション、メールヘッダならメールヘッダインジェクション等々になりえる。とくに、初心者にとってシェルは予想外のところで使われているから、気をつけよう。
その他セキュリティに関心があればsecurityタグをお勧めしたい。セキュリティよりもsecurityの方が濃いのである。
今時Shift_JISでプログラミングするバカな奴はいないだろうけど折角まとめたので公開
@ | [ | \ | ] | ^ | _ | ` | { | | | } | ~ | |
---|---|---|---|---|---|---|---|---|---|---|---|
40 | 5B | 5C | 5D | 5E | 5F | 60 | 7B | 7C | 7D | 7E | |
81 | ー | ― | ‐ | / | \ | ?? | + | ?? | ± | × | |
82 | ・ | ・ | ・ | ・ | ・ | ・ | A | ・ | ・ | ・ | ・ |
83 | ァ | ゼ | ソ | ゾ | タ | ダ | チ | ボ | ポ | マ | ミ |
84 | А | Ъ | Ы | Ь | Э | Ю | Я | к | л | м | н |
85 | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
86 | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
87 | ?? | ?? | ?? | ?? | ・ | ?? | ?? | ・ | ・ | ・ | ?? |
88 | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
89 | 院 | 閏 | 噂 | 云 | 運 | 雲 | 荏 | 閲 | 榎 | 厭 | 円 |
8A | 魁 | 骸 | 浬 | 馨 | 蛙 | 垣 | 柿 | 顎 | 掛 | 笠 | 樫 |
8B | 機 | 擬 | 欺 | 犠 | 疑 | 祇 | 義 | 宮 | 弓 | 急 | 救 |
8C | 掘 | 啓 | 圭 | 珪 | 型 | 契 | 形 | 鶏 | 芸 | 迎 | 鯨 |
8D | 后 | 梗 | 構 | 江 | 洪 | 浩 | 港 | 砿 | 鋼 | 閤 | 降 |
8E | 察 | 纂 | 蚕 | 讃 | 賛 | 酸 | 餐 | 施 | 旨 | 枝 | 止 |
8F | 宗 | 充 | 十 | 従 | 戎 | 柔 | 汁 | 旬 | 楯 | 殉 | 淳 |
90 | 拭 | 深 | 申 | 疹 | 真 | 神 | 秦 | 須 | 酢 | 図 | 厨 |
91 | 繊 | 措 | 曾 | 曽 | 楚 | 狙 | 疏 | 捜 | 掃 | 挿 | 掻 |
92 | 叩 | 端 | 箪 | 綻 | 耽 | 胆 | 蛋 | 畜 | 竹 | 筑 | 蓄 |
93 | 邸 | 甜 | 貼 | 転 | 顛 | 点 | 伝 | 怒 | 倒 | 党 | 冬 |
94 | 如 | 納 | 能 | 脳 | 膿 | 農 | 覗 | 倍 | 培 | 媒 | 梅 |
95 | 鼻 | 票 | 表 | 評 | 豹 | 廟 | 描 | 府 | 怖 | 扶 | 敷 |
96 | 法 | 房 | 暴 | 望 | 某 | 棒 | 冒 | 本 | 翻 | 凡 | 盆 |
97 | 諭 | 夕 | 予 | 余 | 与 | 誉 | 輿 | 養 | 慾 | 抑 | 欲 |
98 | 蓮 | 麓 | 禄 | 肋 | 録 | 論 | 倭 | ・ | ・ | ・ | ・ |
99 | 僉 | 兌 | 兔 | 兢 | 竸 | 兩 | 兪 | 几 | 處 | 凩 | 凭 |
9A | 咫 | 喙 | 喀 | 咯 | 喊 | 喟 | 啻 | 嘴 | 嘶 | 嘲 | 嘸 |
9B | 奸 | 媼 | 媾 | 嫋 | 嫂 | 媽 | 嫣 | 學 | 斈 | 孺 | 宀 |
9C | 廖 | 彈 | 彌 | 彎 | 弯 | 彑 | 彖 | 悳 | 忿 | 怡 | 恠 |
9D | 戞 | 拏 | 拿 | 拆 | 擔 | 拈 | 拜 | 掉 | 掟 | 掵 | 捫 |
9E | 曄 | 杣 | 杤 | 枉 | 杰 | 枩 | 杼 | 桀 | 桍 | 栲 | 桎 |
9F | 檗 | 歇 | 歃 | 歉 | 歐 | 歙 | 歔 | 毬 | 毫 | 毳 | 毯 |
E0 | 漾 | 濕 | 濬 | 濔 | 濘 | 濱 | 濮 | 炮 | 烟 | 烋 | 烝 |
E1 | 瓠 | 畆 | 畚 | 畩 | 畤 | 畧 | 畫 | 痣 | 痞 | 痾 | 痿 |
E2 | 磧 | 禺 | 秉 | 秕 | 秧 | 秬 | 秡 | 窖 | 窩 | 竈 | 窰 |
E3 | 紂 | 綣 | 綵 | 緇 | 綽 | 綫 | 總 | 縵 | 縹 | 繃 | 縷 |
E4 | 隋 | 膽 | 臀 | 臂 | 膺 | 臉 | 臍 | 艝 | 艚 | 艟 | 艤 |
E5 | 蕁 | 藜 | 藹 | 蘊 | 蘓 | 蘋 | 藾 | 蛔 | 蛞 | 蛩 | 蛬 |
E6 | 襦 | 觴 | 觸 | 訃 | 訖 | 訐 | 訌 | 諚 | 諫 | 諳 | 諧 |
E7 | 蹇 | 躰 | 軆 | 躱 | 躾 | 軅 | 軈 | 轆 | 轎 | 轗 | 轜 |
E8 | 錙 | 鐚 | 鐔 | 鐓 | 鐃 | 鐇 | 鐐 | 閔 | 閖 | 閘 | 閙 |
E9 | 顱 | 饉 | 饅 | 饐 | 饋 | 饑 | 饒 | 驅 | 驂 | 驀 | 驃 |
EA | 鵝 | 鷦 | 鷭 | 鷯 | 鷽 | 鸚 | 鸛 | 黠 | 黥 | 黨 | 黯 |
EB | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
EC | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
ED | 纊 | 倞 | 偆 | 偰 | 偂 | 傔 | ?? | 垬 | 埈 | 埇 | ?? |
EE | 犾 | 劯 | 砡 | 硎 | 硤 | 硺 | ?? | 葈 | 蒴 | 蕓 | 蕙 |
EF | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
F0 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
F1 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
F2 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
F3 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
F4 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
F5 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
F6 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
F7 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
F8 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
F9 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
FA | ?? | ∵ | 纊 | 褜 | 鍈 | 銈 | 蓜 | 傔 | ?? | 僘 | 兊 |
FB | 涖 | 犱 | 犾 | 猤 | ?? | 獷 | 玽 | 硺 | ?? | ?? | ?? |
FC | 髜 | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
40 | 5B | 5C | 5D | 5E | 5F | 60 | 7B | 7C | 7D | 7E | |
@ | [ | \ | ] | ^ | _ | ` | { | | | } | ~ |
# ちなみに「??」って表示されてるのはまー外字部分だしそんなに気にしなくていいかと
これらの文字コードには気をつけること。
特に2バイト目が5C(\)ものは要注意。
"や'と引っ付くのでまともにプログラミングできない。
print '予定表'; print "無能";
特にPerlの場合は文字列中に展開できる構文が多いのもあり、色々なエラーを出せるので注意が必要だ。
print qq[夕焼け小焼け]; # 「夕」の2バイト目でエラー print "警察24時!"; # @24という変数とみなされる
また、正規表現でも厄介な問題が起きまくるので注意すべし。
my $str = 'ダ'; print 'match' if $str =~ /_/; # マッチしちゃう
こういう様々な理由からShift_JISでプログラミングをしてはいけないわけだ。
だからUTF8を使うべきだ。UTF8が無理でもせめてEUC-JPのどちらかでプログラミングすることをオススメする。
まーEUC-JPはEUC-JPでShift_JISと一部文字コードが重なっているので正直扱いにくいのでやっぱりUTF8を強く推奨する。
これから就職活動するバカはいないだろうけど、そういう人もいるだろうから少し書いておこう。
どちらかというと、アンチMS派なUnix技術者がWindowsだけの世界で仕事をする辛さを。
Unix技術者は、業務実績にSolaris/AIX/Linuxって書いてあってもちゃんと質問しろ。Windowsの仕事は無いですよね?って。
僕が食べるために職を手にしているこのIT業界というのは、バッドノウハウとMicroSoftとExcelで出来ている。
その為、僕が手にしたUnixの知識は、特定の仕事以外でしか役に立たないし、使わない。
viだろうが、TeXだろうが、Xの知識よりも、MFCとVBAのちょっとした知識のあるヤツが上にみられる。
ExcelとWindowsの知識があればそれだけで仕事になるからだ。
いいか、viやTeX、Xなんて捨てちまえ、Excelがあればそれでいいのだ。
MSでは、ActiveXを使ってCOMを操作し、クライアントのレジストリを操作し、IE単体でできないことをやってしまうヤツがハッカーと思われている。
VBAマクロで作ったなんちゃってツールを3時間で作れるほうが、
perlやruby/pythonで、より少ない時間で作ったツールよりも凄く思われてしまう。
そして、それができるヤツの方が、Unix技術者よりもよりハッカーであり、技術力があると思われている。
ブラウザを例にしたが、
javascriptでalert/confirmを出すよりも、vbscriptでMsgBoxの方が多くのことができるから、
javascriptでNumberの計算よりも、vbscriptでDecimalを使った方が倍密度の計算ができるから、
vbscriptを駆使できるヤツは、凄く重宝される。
いいか、javascriptで汎用的に書くのなんてナンセンスだ。javascriptなんて捨てちまえ、覚えるのはJScript実装(WSH)だ。
この業界、何が不満になるかというと、
MSの、もっというとWindowsのことしか知らないヤツが多すぎるということ。
そういうヤツらは、Windowsだったらこんなこともできるのに、なぜUnix/Linuxだとこんなこともできないのか。と言う
そういうヤツらは、Windowsの未修正バグの合間を縫いながら中途半端な実装しかしない。
だって、中途半端(もしくは大雑把)な実装で動いているものの中で動くから。それ以上に実装しようとしてもできないのだ。
いいか、win32のメッセージングの仕組を覚えるんだ。無理矢理send_keyみたいなコードを書けるようにしろ。
コマンドを連結するよりも、結果に近いコードを書くんだ。線形になろうがヤツらは気にしないだろう。
何故か。
それは、.NETで作ればお客さんの要望が実現でき、Excelと連携できるからだ。
ヤツらは、C/Sの世界でこそ役に立つ技術者だが、Webの世界に連れてきてはならない。すぐに実装がIEだけになる。
ヤツらにLLを覚えさせるのは無理だ。
クロージャなんて知らないし、高階関数やカリーなんてコードを教えてみろ。後から辛くなるのは自分だ。
ヤツらにはPHPを教えておけ、それだけで満足する。すごいヤツになった気にさせれる。
バッドノウハウ慣れしているヤツらはそれを使ってコードを書いてもらえ、rubyで書かせるよりも修正が20倍楽だ。
いいか、まとめるぞ。
今まで一生懸命Unixを勉強してきたのは無駄だ。いますぐ忘れるんだ。
Excelを今から覚えろ。VBAを覚えろ。そしてMSの動きを身に着けるんだ。
Windowsでは単位がFormだ。それが標準出力と標準入力と思え。ときどきSheetとかWorkbookになるぞ。
ストリームやファイル操作には気をつけろ。Unixの気分でいると思わぬところで抜けが出るぞ。
IRCは使うな。Jabberを使うな。メッセンジャーを使え。移行のお薦めはGaimだ。Windows版がある。
viの使用頻度を減らせ、変なコマンドを身に着ける前に、秀丸マクロを書けるようにしろ、Notepadのショートカットを覚えとけ。
BindとかApache(Httpd)の知識はいらない。IISだ。ActiveDirectoryだ。
文字コードはCp943cを何がなんでも押せ。Shift_JISっていう大雑把な伝えかたはダメだ。絶対cp943cにしろ。UTF8/UTF7との格闘で身も心もぼろぼろになるぞ。
汎用性なんて無いんだ。Windowsというプラットフォームがあれば。
ああ、心が渇いていく。