はてなキーワード: UNICODEとは
http://anond.hatelabo.jp/20071019103537
結局のところは程度問題なのだけれど、今回の件は特にひどかった。メールアドレス判定の方が大きく言われているが(いや、これも1文字目には数字以外なら記号でもunicodeでも何でもOKな所がひどいけれど)、個人的にはIPアドレスの方がひどいと思う。あの正規表現をもっとシンプルに書くと、
([0-9]{2,}.){3}[0-9]{2,}
日本語だと(微妙に違うけど)、「数字2つ以上で始まって、2文字離れていれば数字以外が1文字3回まではOKで数字2文字以上で終わる11文字以上の文字列」、たとえば「03-3456-7890#123」とか「123456.123456」とか何でもあり。だけど、例にある「255.255.255.0」は、最後が数字2文字以上なくて、10文字だから駄目というもの。あまりにこれはひどい。
OSSが引き合いに出されているが、OSSに限らずほぼすべてのソフトウェアには免責条項が付いていて、ソフトウェアの価格以上の保障はしないというのが一般的だ。それはマイクロソフトとて例外ではないが、だからといってまったく検証していないわけではないし、問題があればパッチだって提供している。そりゃ、完璧にバグフィクスはされていないけれど、概ね受け入れられている。しかし、人によっては厳しい事を言う人もいる。時には政府だって口を出す。なぜかといえば、これだけのユーザーを抱えるとてつもなく「影響力の大きい」ソフトウェアだからなのだ。
メディアもまた同様で、マスメディアはちょっとしたことでも大きく言われるし、時には法的責任だって問われる。それは、ひとえに影響力の大きさからくるものである。誰も読みもしないチラシに嘘があってもほぼ問題にならないが、大手新聞に嘘があれば問題になるし、内容によっては国際問題にだってなる。それでも、ちょっとした誤植程度ならやっちまった程度で済む。つまり、程度問題。
UTF8/UTF7との格闘で身も心もぼろぼろになるぞ。
て書いてあるから、unicode変換かな?
http://b.hatena.ne.jp/entry/4156231
javaか。
http://anond.hatelabo.jp/20070722053313
元 Excel 設計チームの Joel Spolsky 氏はこう書いている。
広く書かれていることだが、生産的な利益は、知識労働者に空間と静かさとプライバシーを与えることによってもたらされる。古典的なソフトウェア管理の本「ピープルウェア」はこれらの生産性が広範囲に渡ることを述べている。
ここに問題がある。我々はみな知識労働者が「すらすらできる」状態のとき、"in the zone"(自分の中に入った状態)としても知られているが、完全に仕事に集中していて周りの環境から遮断されてしているときにベストの仕事をできるということを知っている完全に集中している間に、時間を忘れて素晴らしいものを作り上げるのだ。これが、生産的な仕事をやりとげる時だ。ライター・プログラマ・科学者、そして野球選手さえもが、完全に集中した状態について語ることができるだろう。
問題は、「集中する」ことは簡単ではないということだ。計ってみるならば、最高の生産性の状態で仕事を始めるまでに平均15分かかるようだ。時には、疲れているときやその日にすでに沢山の生産的な仕事をしてしまったときには、集中することすらできず、残りの就業時間をぶらぶらしたりウェブサイトをみたり、テトリスで遊んだりしてすごすことすらある。
もうひとつ、集中した状態から覚まされることがとてもた易いことだ、という問題がある。騒音、電話のなる音、昼食、コーヒーのためにスターバックスまで5分のドライブ、そして同僚による割り込み、特に同僚による割り込みが問題だが、これらのことはすべて君を集中から覚ますものだ。同僚が君に質問すると1分間の割り込みが入る。しかしそのことで、君は集中が途切れ、再び生産的な状態に入るまで30分を要し、君の全体の生産性にとっては深刻な問題となる。もし君がカフェイン中毒のドットコム企業のやつらが作りたがる、騒々しい牛の囲い場のような環境にあって、営業担当者がプログラマの隣りで電話に向かって叫んでいるとしたら、君の生産性は落ち込むだろう。というのも、そんな環境では知識労働者は次から次へと割り込まれ、決して集中することができないからだ。
プログラマについていうと、この問題は特に厄介だ。プログラマの生産性というのは、細々した沢山のことをちょっとずつ記憶しながら同時に操ることができるかどうかにかかっているからだ。いかなる時に割り込みが入っても、そういった細かいことがクラッシュする。仕事に戻ったとき、君は細かいこと(使っているローカル変数の名前や検索アルゴリズムのどこまでを終えたかなど)を思い出せないだろう。そして、そういったことを思い出すことからやり直して、そのために元のスピードに戻るまでには多くの時間がかかる。
ここに簡単な計算式がある。いいかい、(これまで書いてきたように)あるプログラマの邪魔をしたとすると、たとえそれが1分間でも実際には15分間の生産力を吹き飛ばしたことになる。例えば、ここに二人のプログラマがいるとしよう。ジェフとマットだ。典型的なディルバート式の囲いの中に隣り合わせで座っている。(訳註:ディルバートは、1989年よりアメリカの新聞各紙で連載されたコミックの主人公。うだつのあがらない係長で、彼の働くオフィスはキュービクルと呼ばれる一人ずつのパーティションに区切られている。)マットはstrcpyのUNICODEバージョンの関数名が思い出せない。マットは関数名を30秒かけて自分で探すこともできるし、15秒かけてジェフに聞くこともできる。ジェフは隣りに座っているから、ジェフにたずねる。ジェフは注意を逸らされ、15分の生産を失う。(マットの15秒を節約するために、だ。)
さて、二人を壁とドアで区切られた別々の部屋に引越しさせるとしよう。そうするとマットは関数名を忘れたときにはやはり30秒かけて自分で探すか、今や45秒かかり立ち上がることも必要となったが、(プログラマの平均的運動能力からいってこれは簡単なことではない)ジェフに聞くこともできる。立ち上がりたくないので、マットは自分で調べる。マットは30秒の生産を失うが、ジェフの15分は節約できた。ハハハ!
パソコンに詳しい人は、普段から「 Windows のことはわかりません( Linux 専門です)」と云っておいた方がいいかもしれない。 Linux なんて触ったことさえなくともね。
217 名前:[名無し]さん(bin+cue).rar[sage] 投稿日:2007/07/10(火) 13:49:40 ID:FXQEOZ3v0
http://d.hatena.ne.jp/hasegawayosuke/20061222/p1
【偽装ファイル例】
[アニメ] ○×△ 第01話 (704x396 DivX651 MXTVEXE.avi と画面上では表示されているけど・・
↓↓↓
[アニメ] ○×△ 第01話 (704x396 DivX651 MXTV(U+202E)avi.EXE 本当は実行ファイル(=ウィルスorトロイ)
↑
223 名前:[名無し]さん(bin+cue).rar[sage] 投稿日:2007/07/10(火) 14:08:11 ID:uF6q4aE80
>>219
よく知らないけど、RLOを複数埋め込んで巧妙に隠すんだそうだ。
.EXEの.とEとXとEが見た目上並んでるとは限らないらしい。
228 名前:[名無し]さん(bin+cue).rar[sage] 投稿日:2007/07/10(火) 14:27:58 ID:3bMjMnB90
1. コントロールパネル>管理ツール>ローカルセキュリティポリシーを開く
2. ソフトウェア制限のポリシー>追加の規則(無ければ新規作成する)を右クリック
3. 新しいパスの規則を選択
4. 参照を選択
5. 禁止したいフォルダを選択
Unicode の文字合成で実現できないかな、と思って調べたけどそういう好き勝手な合成はできないっぽかった。何でも合成しまくれればおもしろいのに。
'/** Requestオブジェクトから受信したデータを取り出します。 ' * @return byte配列を格納した連想配列を返します。 ' */ Function getRequestItem() If Request.TotalBytes <= 0 Then getRequestItem = Null Exit Function End If Dim data Dim separator Dim dataArray Dim buffer Dim filePath Dim fileName Dim ix Dim stringIndex Dim myCrLf Dim items Dim itemName myCrLf = convertAsc(vbCrLf) Set items = Server.CreateObject("Scripting.Dictionary") data = Request.BinaryRead(Request.TotalBytes) data = LeftB(data, UBound(data) - 3) & myCrLf separator = MidB(data, 1, InStrB(1, data, myCrLf) + 1) dataArray = SplitB(data, separator) For ix = 2 To UBound(dataArray) Step 1 '1行読み込み buffer = MidB(dataArray(ix), 1, InStrB(1, dataArray(ix), myCrLf) - 1) 'アイテム名の取得 stringIndex = InStrB(1, buffer, convertAsc("name=")) If stringIndex > 0 Then itemName = convertUnicode(MidB(buffer, stringIndex + 6, InStrB(stringIndex, buffer, ChrB(34)) - stringIndex)) Else itemName = "" End If 'ファイル名の取得 stringIndex = InStrB(1, buffer, convertAsc("filename=")) If stringIndex > 0 Then filePath = MidB(buffer, stringIndex + 10, InStrB(stringIndex, buffer, ChrB(34)) - stringIndex) fileName = RightB(filePath, LenB(filePath) - LastInStrB(0, filePath, convertAsc("\"))) Else fileName = "" End If 'データ部の取得、改行コードの切り捨て buffer = RightB(dataArray(ix), LenB(dataArray(ix)) - InStrB(1, dataArray(ix), myCrLf & myCrLf) - 3) buffer = LeftB(buffer, LenB(buffer) - 2) items.Item(itemName) = parseBytes(buffer) Next Set getRequestItem = items Set items = Nothing End Function '/** 文字列の最後尾から指定文字を検索します。 ' * @param Start 検索する開始文字位置を指定します。 ' * @param String1 検索対象の文字列を指定します。 ' * @param String2 検索する文字列を指定します。 ' */ Function LastInStrB(ByRef Start, ByRef String1, ByRef String2) Dim ix Dim lastIndex Dim searchLength searchLength = LenB(String2) lastIndex = LenB(String1) - searchLength + 1 If Start > 0 And Start < lastIndex Then lastIndex = Start End If For ix = lastIndex To 1 Step -1 If MidB(String1, ix, searchLength) = String2 Then LastInStrB = ix Exit Function End If Next LastInStrB = 0 End Function '/** アスキー文字列に変換します。 ' * @param String 対象の文字列を指定します。 ' */ Function convertAsc(Byref String) Dim ix Dim ascii ascii = "" For ix = 1 To Len(String) Step 1 ascii = ascii & ChrB(AscB(Mid(String, ix, 1))) Next convertAsc = ascii End Function '/** Unicode文字列に変換します。 ' * @param AscString 対象のアスキー文字列を指定します。 ' */ Function convertUnicode(Byref AscString) Dim ix Dim unicode unicode = "" For ix = 1 To LenB(AscString) Step 1 unicode = unicode & Chr(AscB(MidB(AscString, ix, 1))) Next convertUnicode = unicode End Function '/** バイナリ対応版Split関数です。 ' * @param String 対象の文字列を指定します。 ' * @param Delimiter 区切り文字を指定します。 ' */ Function SplitB(Byref String, Byref Delimiter) Dim ix Dim lastIndex Dim searchLength Dim start Dim datas() Dim dataIndex dataIndex = 1 start = 1 delimiterLength = LenB(Delimiter) lastIndex = LenB(String) - delimiterLength + 1 '最初から1文字ずつ繰り返します。 For ix = 1 To lastIndex Step 1 'データを比較します。 If MidB(String, ix, delimiterLength) = Delimiter Then 'データを取り出せたら配列に格納します。 ReDim Preserve datas(dataIndex) datas(dataIndex) = MidB(String, start, ix - start) dataIndex = dataIndex + 1 start = ix + delimiterLength End If Next SplitB = datas End Function '/** Byte配列を返す関数です。 ' * @param data 対象のデータを指定します。 ' */ Function parseBytes(Byref data) Const adLongVarBinary = 205 Dim recordset If LenB(data) <= 0 Then parseBytes = CByte(0) Exit Function End If Set recordset = Server.CreateObject("ADODB.Recordset") recordset.Fields.Append "UpLoadBinary", adLongVarBinary, LenB(data) recordset.Open recordset.AddNew recordset.Fields("UpLoadBinary").AppendChunk data recordset.Update parseBytes = recordset.Fields("UpLoadBinary").Value recordset.Close Set recordset = Nothing End Function