「byte」を含む日記 RSS

はてなキーワード: byteとは

2019-06-29

私はIT企業で働くプログラマだ。

最近ではコードレビューシステムを取り入れてる会社は多いだろうが

まともに運用できているのか知りたい。

私が以前勤めていた会社では地獄運用がされていた。

変数プラス1するだけのパッチでも

いちゃもんつけては10回、時には100回以上書き直させるというキチガイが暴れていたからだ。

1文字の変更でも数十行はコミットメッセージを書かねばならず、

ブーリアン型を2つ使っているだけでも

メモリ無駄からビット演算しろとか

同じ処理をしている2行が一度でも現れたら関数化しなければならなかった。

重要なのは、別の修正ブーリアン型を2つ使っている箇所をByte型のビット演算にして

同じ処理をしている2行が一箇所でもあればそれらを全部関数化すると

今度は読みづらい・非効率から直せと言われる。

まり間違っているから直さなくてはいけないのではなく、

正確さを追求しているのでもなく、効率化でも、高速化でも、平易化でもなく

難癖つけてやり直しを命じることが目的になっていた。

出来上がったコードはひどい出来だった。

簡単コードが難解になればなるほど彼は満足げだった。

やり直すごとにクソになっているのに書き直さなくてはいけないのが本当に苦痛だった。

ときには、嫌がらせ目的パッチのすべての行に「is it correct?」と書いたり、

すべてのパッチ作成直後に減点してコミットできないようにしたりしていた。

変数名を決めるだけで5個ぐらい候補を上げてどれが好みですか、とキチガイメールで聞くことすらあった。

この会社でのコードレビューシステムは完全に崩壊していて

一人でそれができてしまう、というのがとても気がかりだ。

今はまともな職場で働けているが、いつかまたそういう職場にあたってしまうかもしれない。

(そういう会社に限っていつも大量に募集してるものだ)

1文字修正でも10回以上やりなおせと言われる職場はどれくらいの割合存在するのか。知りたい。

2019-04-10

PC98版 YU-NOメッセージファイルフォーマット

アニメがはじまったついでにPC98版 YU-NOメッセージファイルフォーマットを解析してみた。

メッセージファイル

"*.MES"

ファイル構成

+0 offset(2byte)

+2 辞書データ(offset - 2 byte) sjis2byte文字のつめあわせ

+offset データ本体(ファイルの終わりまで)

データ形式

0x06 次の0x06までのデータファイル
0x11 入力待ち
0xC0-0xCF,0x60-0x7F 0x20を足して次の1byteを追加すればsjisの1文字になる
0xD0-0xFF 0xD0を引いて2倍した数値に該当する辞書データの1文字
0x133003 主人公名前に置き換え

他にもコマンドいろいろあるみたい

2019-01-10

anond:20190110164836

サンドボックス環境アプリ側が動的にメモリ解放はしねえからmallocコードがあっても実質既に確保済みの byte ** を返してるだけって事だよ。

2018-06-25

あんものは、やった体にしただけのガラクタなのになぁ。

もし本気で言ってるのなら、品質なんて担保できるわけがないのだ。

あのドキュメント群が、どのようにしてこの世に産まれ出たのか、顧客エンドユーザーではない)も開発チームも知っているはずだ。

決して詳細設計ではなく、「プログラミングを一切知らないエンドユーザーが見て解る」機能について説明しただけのドキュメントなのだ

そして更に、上っ面の機能ではなく内部仕様までこと細かく記述した「詳細設計書は作成しない」ことになったのだ。

それを顧客⇔開発チーム双方合意したうえで書かれたモノである

すなわち今あるドキュメントは、たとえば「○○画面には△△が入力でき、決定ボタンホストシステム登録されます。」ということが書かれているだけで、決して「入力された△△を5byteと3byteと8byte位置で分割し、□□と連結したもの送信XMLほにゃららタグにセットしてからホスト送信する。」といったことは書かれていないのだ。

なぜなら、システマティック知識を持たないエンドユーザーが読んでもわからいからだ。

エンドユーザーは、仕組みはどうあれ、思った通りに入力したデータホストシステム登録できることだけを望んでいるのだ。

ところが、だ。

なぜか今は、その上っ面の機能けが書かれたドキュメントだけに基づいてシステム要件検討されていると言うのだ。

無理に決まっている。

上っ面の機能ですら必ずしもすべて書いてあるわけではないのだ。

誰がどう見ても数字しか入力しない入力欄には、誤って英字や全角文字を入れてしまうことが無いようチェックしたりしているのだが、「そんなの当たり前でしょ?」的なレベルのことは省略されていることも多々ある。

そしてその「それは書かなくて良いんじゃん?」には明確な基準は無く、レビュアー感覚、さじ加減次第で省略されるのだ。

経緯は絶対に知っているはずだ。

絶対ということは絶対にない!と言うのなら、ドキュメント作成から上流工程に携わっている人間でも知らない可能性が無いこともないのだろう。

だが、本気で「知らない」と言うのであれば、恐らくそ人間ポンコツの極みである

そのような経緯があるにも関わらず、今になって「ドキュメントに書かれていないこと」を見つけると、「ドキュメント不備だ」「きちんと書かれていないから正しい要件調整ができないじゃあないか」「不具合なのだからすぐ直せ」だとか……もうね、アホかと、バカかと。

期限と費用を重視して、詳細設計書を省略したんじゃねえのかよ?

であれば、追加開発時に改めて現状把握のためにソースコードの解析を伴う調査必要になるに決まってるじゃねえかよ。

でもその工数を開発チームに与えることはしない。

製造が始まっているのに不安定要件がある。

定義部分は末端の担当者に「ユーザー質問してみて」と、体の良い形で実のところ調整作業自体を丸投げする。

遅れや障害でも発生しようものなら「なぜだ?!」の追及の手は緩めず「対策を考えろ」とか、根本原因の大部分を上流が占めていることを認めようとは決してしない。

それで「このプロジェクトウォーターフォールから」とか、どの口?

もうね、アホかと、バカかと。

浄化しない排水を上流から流すせいで下流人間うんこまみれの水飲まされんだよ。

2018-03-28

[]ブクマを集めたがホットエントリーになれなかったのは具体的にはどんなエントリー

はてなブックマークブックマーク数を多数集めたがホットエントリーに入らなかったエントリー

集計期間 2018年3月23日 2010分 〜 2018年3月27日 1時0分、3日間(77時間)

集計対象2018年3月23日 2010分以降ファーストブクマされたエントリーで新着エントリーに入ったエントリーに限った

最大到達ブックマークタイトルドメイン新着リスト滞留時間(時間)新着リスト最終時間ファーストブクマ時間
1174ActiveRecordデータ処理アンチパターン / active-record-anti-patterns // Speaker Deckspeakerdeck.com302018-03-27 01:002018-03-25 18:25
2136技術チュートリアルnoteで売る」っていう社会実験をしてみた結果、めっちゃくちゃ可能性を感じた話|Review of My Lifereview-of-my-life.blogspot.com292018-03-27 01:002018-03-25 19:57
3113私服OKIT企業でそこそこにちゃんとした格好をする方法 - ミネム珈琲ブログwww.minemura-coffee.com432018-03-26 11:502018-03-24 16:20
490発表資料: Elasticsearchによる 全文検索実装 - Islands in the byte streamgfx.hatenablog.com422018-03-26 12:002018-03-24 17:10
590正しく失敗しながら進むプロダクト開発/railsdm2018 // Speaker Deckspeakerdeck.com332018-03-27 01:002018-03-25 15:52
686Rails Developers Meetup 2018 で「MySQL/InnoDB の裏側」を発表しました - あらびき日記abicky.net342018-03-27 01:002018-03-25 14:46
77890%が間違えてる!?転職エージェントの選び方と効果的に使いこなす徹底マニュアルcareer-rules.com452018-03-26 08:002018-03-24 11:00
877厳選7種のチャートパターン活用したFXエントリー方法【事例付き】mugen-fx.com142018-03-27 01:002018-03-26 11:00
976suikahara漫画 : ★専門学校blog.livedoor.jp142018-03-27 01:002018-03-26 10:37
1074ウルティマ オンラインMMORPG元祖がもたらした、多数の発明とは? “ロード・ブリティッシュ”らが明かす開発秘話GDC 2018】 - ファミ通.comwww.famitsu.com432018-03-26 17:402018-03-24 21:43
1170小泉進次郎氏「平成政治史に残る大事件」森友文書改ざん朝日新聞デジタルwww.asahi.com302018-03-27 01:002018-03-25 18:27
1266うる星やつら同窓会 実は杉山佳寿子ラム役を狙っていた? - otoCotootocoto.jp242018-03-27 01:002018-03-26 00:35
1366Linuxカーネルソースの減量 // Speaker Deckspeakerdeck.com442018-03-26 11:502018-03-24 15:42
1464Realworld Domain Model on Rails // Speaker Deckspeakerdeck.com322018-03-27 01:002018-03-25 16:02
1564Microservices Maturity Model on Rails // Speaker Deckspeakerdeck.com422018-03-26 13:402018-03-24 19:25
1663僕が毎月「妻の布ナプキン」で手を血に染める理由鈴木 大介) | 現代ビジネス講談社(1/4)gendai.ismedia.jp462018-03-26 12:002018-03-24 13:31
1763牧野由依はなぜ復帰作で“声”をテーマにしたのか 本人が明かす、歌手活動休止真相と次の一歩 - Real Sound|リアルサウンドrealsound.jp462018-03-26 09:002018-03-24 10:05
1862デス様じゃねーか」「オーキド博士いるぞ!」 「ポプテピピック最終回さまざまな意見が寄せられる - ねとらぼnlab.itmedia.co.jp332018-03-27 01:002018-03-25 15:58
1961子ども能力遺伝子検査を受けてみたよ!ともちんの意外な能力!? - ともちんブログwww.tomochinchin.com152018-03-27 01:002018-03-26 09:09
2060バス因子が自分バス因子を脱するための方法 // Speaker Deckspeakerdeck.com322018-03-27 01:002018-03-25 16:01
2156ノンデザイナーのためのコンセプト & ロゴ作り実践講座 feat. savanna.io // Speaker Deckspeakerdeck.com442018-03-26 10:002018-03-24 13:34
2254インターネットでどうやってお金を稼ぐの?家で出来ちゃう最近副業」を16選まとめてみた。kanemotilevel.com352018-03-26 21:202018-03-25 10:10
2354銃器老舗レミントン経営破たんトランプ政権下で財務悪化 写真1枚 国際ニュースAFPBB Newswww.afpbb.com72018-03-27 01:002018-03-26 17:15
2454これからGolang開発を行うRubyistたちへ - Qiitaqiita.com552018-03-26 11:202018-03-24 03:39
2553個人のためのコードレビューサービスを開発しました。 - Qiitaqiita.com142018-03-27 01:002018-03-26 10:13
2653昭恵氏の影響「総理しか説明できない」 小泉進次郎氏:朝日新聞デジタルwww.asahi.com432018-03-26 11:502018-03-24 16:25
2753これ一本でフルカラー描写可能に!「CMYKペン」 | ギズモード・ジャパンwww.gizmodo.jp462018-03-26 05:502018-03-24 07:45
2852ソーシャルメディアを「タダ」で使うコスト松井博|notenote.mu432018-03-26 12:302018-03-24 17:07

27日1時以降にホットエントリー入りした可能性は残っている。ただし新着エントリー24時間以上いてからホットエントリーに上がれるケースは稀。

3ブックマーク集めても新着エントリーに入れなかったエントリーもあるはずだが、それは集計の対象外になっている。

ホットエントリーになれないエントリースライド共有サービスSpeaker Deckからエントリーが目立つ。Speaker Deck以外でもテック系のエントリーが目立つ。

関連: anond:20180328202931

2015-02-23

http://anond.hatelabo.jp/20150223114637

ちったぁ自分で調べろや。ろくなプログラマになれんぞ。

IsNumeric Function (Visual Basic)

IsNumeric returns True if the data type of Expression is Boolean, Byte, Decimal, Double, Integer, Long, SByte, Short, Single, UInteger, ULong, or UShort, or an Object that contains one of those numeric types. It also returns True if Expression is a Char or String that can be successfully converted to a number.

ここは普通のことをいっている。 IsNumeric が True を返すのは以下のとき

から問題があるのは Empty のほう。

VBE Glossary (Empty)

Empty

Indicates that no beginning value has been assigned to a Variant variable. An Empty variable is represented as 0 in a numeric context or a zero-length string ("") in a string context.

Empty は context にあわせて以下のように解釈される。

というわけで IsNumeric(Empty) は Empty が数値として解釈されて 0 になるので True を返す。

2014-05-29

WinInetを使ってVBAでPOSTする

Option Explicit

Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Private Const INTERNET_OPEN_TYPE_DIRECT = 1
Private Const INTERNET_OPEN_TYPE_PROXY = 3
Private Const INTERNET_SERVICE_HTTP = 3
Private Const INTERNET_DEFAULT_HTTP_PORT = 80
Private Const INTERNET_FLAG_RELOAD = &H80000000

Private Declare Function InternetOpenA Lib "wininet.dll" (ByVal sCallerName As String, ByVal dwAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal dwFlags As Long) As Long
Private Declare Function InternetConnectA Lib "wininet.dll" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nProxyPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal dwService As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumberBytesToRead As Long, ByRef lNumberOfBytesRead As Long) As Long
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternetHandle As Long) As Long
Private Declare Function HttpOpenRequestA Lib "wininet.dll" (ByVal hConnect As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal sAcceptTypes As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function HttpSendRequestA Lib "wininet.dll" (ByVal hRequest As Long, ByVal sHeaders As String, ByVal dwHeadersLength As Long, ByVal lpOptional As String, ByVal dwOptionalLength As Long) As Long

Private Function submitPost(ByRef host, ByRef url_path, ByRef sendString) As Variant

  Dim dataArray() As Byte, dataPosition, dataSize

 'WinInet初期化
  Dim hInternet
  hInternet = InternetOpenA(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
  If hInternet = 0 Then
    submitPost = dataArray
    Exit Function
  End If

 'サーバ接続
  Dim hConnect
  hConnect = InternetConnectA(hInternet, host, INTERNET_DEFAULT_HTTP_PORT, vbNullString, vbNullString, INTERNET_SERVICE_HTTP, 0, 0)
  If hConnect = 0 Then
    InternetCloseHandle hInternet
    submitPost = dataArray
    Exit Function
  End If

 'リクエスト初期化
  Dim tmpURL As String * 255
  tmpURL = url_path
  Dim hRequest
  hRequest = HttpOpenRequestA(hConnect, "POST", tmpURL, "HTTP/1.1", vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
  If hRequest = 0 Then
    InternetCloseHandle hConnect
    InternetCloseHandle hInternet
    submitPost = dataArray
    Exit Function
  End If

 'リクエストを送信
  Const strHeader = "Content-Type: application/x-www-form-urlencoded"
  HttpSendRequestA hRequest, strHeader, Len(strHeader), sendString, Len(sendString)

 'データ取得
  Dim readResult, tmpArray(1023) As Byte, tmpPosition, tmpSize
  dataPosition = 0
  dataSize = 0
  Do
    tmpSize = 0
    Erase tmpArray
    readResult = InternetReadFile(hRequest, tmpArray(0), 1024, tmpSize)
    If Not readResult = 1 Or tmpSize = 0 Then
      Exit Do
    End If

    dataSize = dataSize + tmpSize
    ReDim Preserve dataArray(dataSize - 1)
    For tmpPosition = 0 To tmpSize - 1 Step 1
      dataArray(dataPosition) = tmpArray(tmpPosition)
      dataPosition = dataPosition + 1
    Next
  Loop

 'クローズ処理
  InternetCloseHandle hRequest
  InternetCloseHandle hConnect
  InternetCloseHandle hInternet

  submitPost = dataArray

End Function

Public Function downloadFilePost(ByRef targetURL, ByVal sendArray, ByRef savePath) As Boolean

 'URLの分解
  Dim startE, endE, host, url_path
  startE = InStr(1, targetURL, "//") + 2
  endE = InStr(startE, targetURL, "/")
  endE = IIf(startE > endE, Len(targetURL) + 1, endE)
  host = Mid(targetURL, startE, endE - startE)
  url_path = Mid(targetURL, endE)

 'ポストデータエンコード
  Dim jscript
  With CreateObject("ScriptControl")
    .Language = "JScript"
    Set jscript = .CodeObject
  End With
  Dim ix, sendBuffer
  For ix = 0 To UBound(sendArray) Step 1
    sendBuffer = Split(sendArray(ix), "=")
    sendArray(ix) = sendBuffer(0) & "=" & jscript.encodeURIComponent(sendBuffer(1))
  Next
  Set jscript = Nothing

  Dim data
  data = submitPost(host, url_path, Join(sendArray, "&"))

  If LenB(data) <= 0 Then
    downloadFilePost = False
    Exit Function
  End If

 'バイナリで書き込み
  With CreateObject("ADODB.Stream")
    .Type = 1
    .Open
    .Write data
    .SaveToFile savePath, 2
    .Close
  End With

  downloadFilePost = True

End Function

2013-03-23

プロテクト強化後のもふったーも予想以上に酷かった件(追記あり)

ことのあらまし
  1. Twitterクライアントもふったーの作者「TweetDeckのconsumer secret簡単に抜ける、終わってる」(http://blog.livedoor.jp/blackwingcat/archives/1760823.html)
  2. 別の誰か「もふったーのconsumer secretも簡単に抜ける」(http://d.hatena.ne.jp/kusano_k/20130318/1363640368)
  3. もふったーの作者「プロテクト強化した」(http://blog.livedoor.jp/blackwingcat/archives/1762970.html)

プロテクトかけたアルゴリズムを実装したバージョン差し替え」たなんて言われると本当に「プロテクト」がかかっているのか確かめてみたくなるのが人情というもの。というわけで、プロテクト強化後のもふったー(v0.9.6b)からconsumer secretが抜けるか試してみた。結論から言うと、あっけなく取り出せた。以下に手順を記す。

手順

動作がよくわかっていないアプリケーションを解析して仕様を明らかにすることをリバースエンジニアリングと呼ぶ。ソフトウェアリバースエンジニアリングは基本的に対象を逆アセンブルしてひたすら読むことによって行う(その補助に1命令ずつ実行してレジスターやメモリーの様子を観察することもある)。しかし、よっぽど小規模なものでなければオブジェクトコード全体を逆アセンブルして最初から最後まで読むなんてのは不可能だ。人間の読速度には限界があるし、時間も有限だからだ。そして、詳しい動作を知りたい部分というのは全体のごく一部であることが多いので全逆アセンブリを読むのには非常に無駄が多い。

からリバースエンジニアリングはいかに詳らかにすべき動作を行っているコードを絞り込むか(=読むべき逆アセンブリを少なくするか)が重要になる。

この場合も同様だ。TwitterGUIクライアントを頭から読むのは到底無理なので、どうやって解析すべきコードの範囲を狭めるかを考えた。それにはOAuth認証においてconsumer secretがどのような役割を果たすのかを知る必要がある。

OAuth認証で、consumer secretはそのままサーバーに送信されたりはしない。signatureの生成にHMAC-SHA1が使われ、その鍵にconsumer secretが使われる。HMACは次のように算出される。

HMAC (K,m) = H ((K ⊕ opad) ∥ H ((K ⊕ ipad) ∥ m))

ここで

である

まずはこのあたりから攻めようと思った。SHA-1計算はいくつか特徴的な定数が使われるので、そこからSHA-1計算に使われているであろう関数444190を特定する。この関数エントリーポイントに中断点(ブレークポイント)を設定してOAuth認証をさせるべくもふったーの「ブラウザ認証ボタンを押す。狙い通り中断するので関数を抜けるまで実行する。関数401100の4012DAに出た。少し下を見るとこのようになっている。

CPU Disasm
Address   Hex dump          Command                                      Comments
00401311  |.  33F6          xor     esi, esi
00401313  |   8D8C24 A40000 /lea     ecx, [local.54]
0040131A  |.  394C24 14     |cmp     dword ptr ss:[local.90], ecx
0040131E  |.  75 0E         |jne     short 0040132E
00401320  |.  3BF5          |cmp     esi, ebp
00401322  |.  73 29         |jae     short 0040134D
00401324  |.  0FB68434 A400 |movzx   eax, byte ptr ss:[esi+esp+0A4]
0040132C  |.  EB 21         |jmp     short 0040134F
0040132E  |   3BF5          |cmp     esi, ebp
00401330  |.  73 1B         |jae     short 0040134D
00401332  |.  8B5424 18     |mov     edx, dword ptr ss:[local.89]
00401336  |.  52            |push    edx                                 ; /Arg1 =  [LOCAL.89]
00401337  |.  8D8C24 FC0000 |lea     ecx, [local.33]                     ; |
0040133E  |.  8BD6          |mov     edx, esi                            ; |
00401340  |.  E8 CB4D0000   |call    00406110                            ; \mofooter.00406110
00401345  |.  83C4 04       |add     esp, 4
00401348  |.  0FB6C0        |movzx   eax, al
0040134B  |.  EB 02         |jmp     short 0040134F
0040134D  |   33C0          |xor     eax, eax
0040134F  |   34 5C         |xor     al, 5C
00401351  |.  888434 B80000 |mov     byte ptr ss:[esi+esp+0B8], al
00401358  |.  83C6 01       |add     esi, 1
0040135B  |.  83FE 40       |cmp     esi, 40
0040135E  |.^ 72 B3         \jb      short 00401313
00401360  |.  895C24 3C     mov     dword ptr ss:[local.80], ebx
0040134F  |   34 5C         |xor     al, 5C

が注意を引く。もしかしてこれはopadとのxorではないか?

00401351  |.  888434 B80000 |mov     byte ptr ss:[esi+esp+0B8], al

xorした結果を格納している。

先ほどの中断点は無効化しこのループを抜けた地点である401360まで飛ばす。この時点でesp+0B8を見ると次のようになっている。

Hex dump
64 2E 16 64|37 04 32 6D|0F 0D 26 29|3A 37 1F 2F|
18 69 6E 6E|0D 25 29 33|11 34 29 69|12 36 24 1E|
05 16 33 6A|04 3B 0E 68|7A 5C 5C 5C|5C 5C 5C 5C|
5C 5C 5C 5C|5C 5C 5C 5C|5C 5C 5C 5C|5C 5C 5C 5C|

あとはこれと5Cとをxorすればconsumer secretが手に入る。終わり。

追伸

はてな増田スーパーpre記法で半角の<>が含まれていると投稿が出来ないのを早く直してください。

3/23 18:45追記

もふったーの作者から反応があった。「本気だったつもりのもふったーのデバッグ処理が残ってた」らしい(http://blog.livedoor.jp/blackwingcat/archives/1763951.html)。修正したとのことなので最新版(v0.9.6e)を見てみた。確かに若干変更されているが何の問題もない。SHA-1の呼び出しに中断点を設置して渡されているバイト列を見るだけ。

CPU Disasm
Address   Hex dump          Command                                  Comments
00401324  |.  8D4424 20     |lea     eax, [local.102]
00401328  |.  50            |push    eax                             ; /Arg1 = 
00401329  |.  E8 623A0400   |call    00444D90                        ; \mofooter.00444D90

ここでeaxが指すメモリーを見ると以下のようになっている。

01 23 45 67|89 AB CD EF|FE DC BA 98|76 54 32 10|
F0 E1 D2 C3|00 02 00 00|00 00 00 00|40 00 00 00|
40 4F 73 53|62 54 5C 7E|59 57 53 42|55 45 7A 57|
61 47 7A 5B|42 4F 7B 61|5D 66 5E 7A|42 7F 40 63|
79 66 05 55|79 4C 60 42|02 10 36 36|36 36 36 36|
36 36 36 36|36 36 36 36|36 36 36 36|36 36 36 36|

先頭32バイトゴミ無視して0x36とxorすればconsumer secretが得られる。

2010-11-17

[] MotionState

sizeof(MotionState) = 0xa8
+0x00	byte ?
+0x01	byte ?
+0x02	byte ?
+0x03	byte ?
+0x04	short x_offset;
+0x06	short y_offset;
+0x08	short duration;
+0x0a	short imageNumber;
+0x0c	short transform_origin_x;
+0x0e	short transform_origin_y;
+0x10	short tex_width;
+0x12	short tex_height;
+0x14	byte blend_mode;
+0x15	BAADF00D (3)
+0x18	RenderInfo* type2;
+0x1c	short damage;
+0x1e	short proration;
+0x20	short guard_damage;
+0x22	short spirit_damage;
+0x24	short untech;
+0x26	short damage_motion_percentage;
+0x28	short limit;
+0x2a	short self_hitstop_hit;
+0x2c	short enemy_hitstop_hit;
+0x2e	short self_hitstop_guard;
+0x30	short enemy_hitstop_guard;
+0x32	short cardgain_hit;
+0x34	short cardgain_guard;
+0x36	short hit_effect_air;
+0x38	short hit_effect_ground;
+0x3a	BAADF00D (2)
+0x3c	float velocity_x;
+0x40	float velocity_y;
+0x44	short sound_type;
+0x46	short effect_type;
+0x48	byte attack_level;
+0x49	byte combo_correction;
+0x4a	BAADF00D (2)
+0x4c	uint fflags;
+0x50	uint aflags;
+0x54	Rect* collision;
+0x58	BAADF00D (4)
+0x5c	Rect* hitboxes;
+0x60	Rect* hitboxes_end;
+0x64	Rect* hitboxes_end;
+0x68	BAADF00D (4)
+0x6c	Rect* attackboxes;
+0x70	Rect* attackboxes_end;
+0x74	Rect* attackboxes_end;
+0x78	BAADF00D (4)
+0x7c	void* ?
+0x80	void* ?
+0x84	void* ?	
+0x88	short ?
+0x8a	short ?
+0x8c	byte ?
+0x8d	byte ?
+0x8e	byte ?
+0x8f	byte ?
+0x90	void* ?
+0x94	void* ?
+0x98	short ?
+0x9a	short ?
+0x9c	byte ?
+0x9d	byte ?
+0x9e	byte ?
+0x9f	byte ?
+0xa0	short ?
+0xa2	short ?
+0xa4	short ?
+0xa6	BAADF00D (2)

2009-07-06

C#用FMFリーダー

platinumで吐き出せるFMFを読み取るためクラスを置いておく。特に反省はしてない。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;

namespace RPG
{
    class MapFile
    {
        //FMFファイルのヘッダー
        struct FMFHeader
        {
            public string dwIdentifier;	// ファイル識別子 'FMF_'
            public int dwSize;			// ヘッダを除いたデータサイズ
            public int dwWidth;		// マップの横幅
            public int dwHeight;		// マップの高さ
            public byte byChipWidth;	// マップチップ1つの幅(pixel)
            public byte byChipHeight;	// マップチップ1つの高さ(pixel)
            public byte byLayerCount;	// レイヤーの数
            public byte byBitCount;		// レイヤデータビットカウント
        }

        private FileStream fs;
        private BinaryReader br;
        private FMFHeader _head;
        private byte[] _data8 = null;
        private short[] _data16 = null;

        public int width
        {
            get { return _head.dwWidth; }
        }

        public int height
        {
            get { return _head.dwHeight; }
        }

        public int chip_width
        {
            get { return _head.byChipWidth; } 
        }

        public int chip_height
        {
            get { return _head.byChipHeight; }
        }

        //マップファイルを読み込む。
        //エラーが起きた場合は例外を投げます
        public void Load(String fname)
        {
            try
            {
                fs = new FileStream(fname, FileMode.Open);
                br = new BinaryReader(fs);

                //識別子を確認する
                _head.dwIdentifier = new String(br.ReadChars(4));
                if (_head.dwIdentifier != "FMF_")
                {
                    throw new Exception("ファイルが壊れています");
                }

                //ヘッダーの残りの情報を読み込む
                _head.dwSize = br.ReadInt32();
                _head.dwWidth = br.ReadInt32();
                _head.dwHeight = br.ReadInt32();
                _head.byChipWidth = br.ReadByte();
                _head.byChipHeight = br.ReadByte();
                _head.byLayerCount = br.ReadByte();
                _head.byBitCount = br.ReadByte();
                switch (_head.byBitCount)
                {
                    case 8:     //8bit layer
                        _data8 = br.ReadBytes(_head.dwSize);
                        break;
                    case 16:    //16it layer
                        int count = _head.dwSize / 2;
                        _data16 = new short[count];
                        for(int i = 0; i < count; i++)
                            _data16[i] = br.ReadInt16();
                        break;
                }
            }
            catch(Exception ex)
            {
                throw ex;
            }
            finally
            {
                br.Close();
            }
        }
        //マップファイルを閉じます
        public void close()
        {
            //読み込んだデータを破棄する
            _data8 = null;
            _data16 = null;
        }
        //マップファイルからチップ番号を取得します
        public int getValue(int layer_index, int x, int y)
        {
            if (_data8 == null &amp;amp;&amp;amp; _data16 == null)
                return -1;
            if (layer_index &gt;= _head.byLayerCount ||
                x &gt;= _head.dwWidth ||
                y &gt;= _head.dwHeight)
                    return -1;

            int index = 0;
            int layer_offset = getLayerAddr(layer_index);
            switch (_head.byBitCount)
            {
                case 8:     //8bit layer
                    index = _data8[layer_offset + x + y * _head.dwWidth];
                    break;
                case 16:    //16it layer
                    index = _data16[layer_offset + x + y * _head.dwWidth];
                    break;
            }
            return index;
        }
        //該当レイヤーが存在する_dataのindexを返す
        private int getLayerAddr(int layer_index)
        {
            if (layer_index &gt;= _head.byLayerCount || (_data8 == null &amp;amp;&amp;amp; _data16 == null))
                return -1;
            return _head.dwWidth * _head.dwHeight * layer_index;
        }
    }
}

#訂正

致命的なバグがあったので修正しました&データを取得する部分をわかりやすくした

2008-04-26

転送量制限について考えてみる。

プロバイダDとNTTBフレッツでつなげてる自宅鯖で、合法的なisoイメージbittorrent seederをやってみた。

周囲の迷惑もあるかなと思って、ピーク流量が1,000K[byte/sec] になるよう制限した。

昨日1日でだいたい平均 500K[byte/sec]の転送があったみたいだ。

Bフレッツだぜ? 光だぜ? 100Mだとか言ってるんだぜ? 余裕余裕。

で、これが月でどれくらいの転送量になるのか計算してみたんだ。

0.5M[byte/sec]*60[sec/min]*60[min/h]*24[h/day] = 43,200M[byte/day]

43.2G[byte/day]*30[day/month] = 1,296G[byte/day]

月1.3テラバイトとか! ちりも積もれば山となるな。

さてここで問題です。俺はこの調子でbittorrentを回し続けても大丈夫なのでしょうか。

また調子こいてピーク流量の制限をもっとゆるくしても平気でしょうか。

他の人が使ってるプロバイダだったらどう?

2007-11-15

やっぱオライリーはバカだな

"What Is Web 2.0" Tim O'Reilly 2005/9/30

http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html

Core Competencies of Web 2.0 Companies

In exploring the seven principles above, we've highlighted some of the principal features of Web 2.0. Each of the examples we've explored demonstrates one or more of those key principles, but may miss others. Let's close, therefore, by summarizing what we believe to be the core competencies of Web 2.0 companies:

  • Services, not packaged software, with cost-effective scalability
  • Control over unique, hard-to-recreate data sources that get richer as more people use them
  • Trusting users as co-developers
  • Harnessing collective intelligence
  • Leveraging the long tail through customer self-service
  • Software above the level of a single device
  • Lightweight user interfaces, development models, AND business models

ノイズを除去してまとめれば、要するに相互接続性を確保したWebサービスのことだ。

そしてそう言えばいいのである。

「どんなデータベース資産を蓄積してるんだい?」とかアホと違うか。外部から利用できないならそんなのどうでもいいんだよ。ソフトウェアをそのByte量で評価するのと変わらん。大きいコードにはいっぱい機能が詰まってるはずだみたいな。

結局分かってないから適切な表現ができないのだろう。

それに言ってること微妙に変えてないか、こいつ。

2007-04-13

ASPファイル受信

'/** 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
 
アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん