マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

Ruby

ジャンプ命令追加 #8

今回はジャンプ命令追加。その前にvm.rbをいじっておく。getCodeをgetCode8という名前に変え更にgetSignedCode8というメソッドを追加する。これに伴いMoveRImm8やAddALImm8で呼び出しているgetCodeをgetCode8に直す必要がある def getCode8(index = 0) retur…

簡単なADD命令追加 #7

今回はオペコード0x04にあたるADD AL, Imm8を実装した。その追加に伴い以下のファイルを作成した ./vm/instruction/add/AddALImm8.rb 中身は require "./vm/register/RegisterIndex.rb" include RegisterIndex class AddALImm8 def execute(vm) al = vm.getR…

例外作成 #6

まず、以下のファイルを作成した ./vm/exception/Exception.rbそして中身は class NotImplementedException < Exception; end これはvmクラスのexecuteメソッドで使っている。取得した命令が未実装の場合、この例外を発生させる。メッセージには命令コードを…

更なる修正 #5

getCodeの文字コードの取得の部分はkeyesberryさんに教えてもらったString#ordを使うことにした def getCode(index = 0) return @memory[@registers[EIP] + index].ord end

MOV AL, 1を実行 #4

MOV AL, 1を実行できるようにしてみた。追加したファイルは以下の通り。またemulator.rbとVM.rbを変更している。 ./vm/instruction/InstructionMap.rb ./vm/instruction/move/MoveRImm8.rb読み込んでいるファイルはadd まずはMoveRImm8.rbから class MoveRIm…

さっそく変更 #2

文字列の任意の文字の文字コードの取得方法をsyonbori_techに教えて頂いたので、VMクラスのgetCodeを以下の変更しておく def getCode() return @memory[@registers[EIP]].bytes().to_a()[0] end

最初の準備 #1

とりあえずRubyでx86エミュレータを作ってみる。まず、以下のファイルを作る。 ./emulator.rb ./vm/VM.rb ./vm/register/RegisterIndex.rbまずRegisterIndex.rbから module RegisterIndex EAX = 0 ECX = 1 EDX = 2 EBX = 3 ESP = 4 EBP = 5 ESI = 6 EDI = 7 …

文字コードの取得?

ある文字列の1文字目の文字コードを取得したい場合、1.8の場合は "Hello World!"[0] で良かった気がするけど、1.9でこれやると1文字の文字列が返ってくるようだ。それでsliceなんかも試してみたけど1文字だけのときでも文字列が返ってくるようになったらし…

またまた修正 #3

getCodeをまた修正した def getCode() return @memory[@registers[EIP]].unpack("C")[0] end

あえて正規表現を使わずに

億とか京とかを見て書くことにした。MLでは何故だか正規表現で教えてほしいと書いてあるが、あえて正規表現を使わずに書いた。ただ最近Rubyを全然使って無いのでRubyを使いたかっただけだが。それより1ヶ月前のエントリへのトラックバックかっこいい! #!/us…

あるディレクトリにある全てのファイルの内容を置換する

わけあって、あるディレクトリ(サブディレクトリを含む)にある全てのファイルの内容の正規表現に一致した部分を置換するプログラムを作ってみた。コマンドライン引数で、対称となる文字列(正規表現)、置換後の文字列、対象のディレクトリ(省略可、デフォルト…

TwitterのListからメンバーを削除する

今度はListにメンバーを削除する。usernameとpasswordは名前の通り。追加したいListの名前をlistnameに、削除したいメンバーのidをmemberidに入れれば削除できる。名前じゃなくてidなので注意 require 'net/http' username = "hoge" password = "hoge" listn…

TwitterのListにメンバーを追加する

今度はListにメンバーを追加する。usernameとpasswordは名前の通り。追加したいListの名前をlistnameに、追加したいメンバーのidをmemberidに入れれば追加できる。名前じゃなくてidなので注意 require 'net/http' username = "hoge" password = "hoge" listn…

TwitterのListを作成する

タイトルの通りTwitterのListを作成するだけのスクリプト。同じリスト名を持つリストを作成しようとすると後ろに番号がつくらしい require 'net/http' username = "hoge" password = "hoge" listname = "test" listmode = "public" request = Net::HTTP::Pos…

フォローしているけど、フォローされてない人を探してみる その2

前回のやつの改良型。フォローの数が100を越えても大丈夫になった。取得したユーザー数が100未満でループ脱出だと、ブロックしてるユーザーがいる場合(それも消えてない場合)にループを抜けてしまうっぽいので、取得したユーザー数が0になったときにループを…

フォローしているけど、フォローされてない人を探してみる

twitterでフォローしているけど、フォローされていない人を探すスクリプトを作った。ただしフォローしている、もしくはされているのどちらかが100を越えている場合は使えない。改良しなければ!またfriendsとfollowersを入れ替えれば逆もできる。 require 'n…

はてなメッセージ一覧を取得してみる

Rubyではてなメッセージ一覧を取得するスクリプトを書いてみた。フォーム情報の取得、送信にはMechanizeを使ってる。 require 'rubygems' require 'mechanize' username = 'hoge' password = 'password' class HatenaMessage def initialize() @agent = WWW:…

特定のホストまでのルータを表示してみる その2

前回の特定のホストまでのルータを表示してみるではICMPソケットの読み込みでブロッキングしてしまい返事が返ってこなかったときの処理ができなかったけど、今回はIO::selectを使うことで解決した。というか、forループで回してるところは、selectを使わない…

RubyでGoogle急上昇ワードを取得する

RubyでGoogle急上昇ワードを取得するに書いてあるスクリプトをいじってみた。REXMLに詳しいかはわからないけど、XPath大好きなので、XPathを使って書き直した。 require 'rexml/document' require 'net/http' url = 'www.google.co.jp' ret = Net::HTTP.star…

特定のホストまでのルータを表示してみる

今回は、tracerouteと同じような機能を持つscanrouteというプログラムを作ってみた。引数で渡されたホストまでのルータを表示する。Googleなんか指定すると結果が返ってくるのに、Yahooを指定すると途中で止まってしまう。何でだろう?原因不明。『基礎から…

Raw Socketを使ってみる その6

ICMPの種類のいくつかに対応。対応してないICMPパケットが来ても落ちないようにした。ICMPのクラスを増やした割には、使ってるのは共通する部分だけだったりhttp://github.com/d-kami/packet-dump/tree/3d9df8e9277ac084e1807f08a2c787d757e7bee2/socket

Raw Socketを使ってみる その5

ICMP ECHOとICMP ECHOREPLYに対応。ICMPでそれ以外が来たら落ちる。次で対応するICMPのタイプを増やす http://github.com/d-kami/packet-dump/tree/fb27f05d8e577d5959e72d7713865a0694c2b9a5/socket

はてなハイクで☆をつけるスクリプト

はてなハイクで☆をつけるスクリプトをつけるスクリプトを作った。例としておはようキーワードの新着20件に対して☆を付けるスクリプトを書いた。パスワードは通常使ってるものではなくhttp://h.hatena.ne.jp/apiに書かれてるものを使うことに注意 #! /usr/bin…

Raw Socketのスクリプト更新

githubのsocket.rbをrecvfromを使ったものに置き換えた。パディングによるずれの問題も起こらないようなので良かった http://github.com/d-kami/packet-dump/blob/e6d377fa90c57afa3287922d216baac29341be8d/socket/socket.rb

recvfrom

readだと指定したバイトまで読み込んでいたけど、recvfromなら1フレーム毎に読み込んでくれたのでrecvfromを使うことにした。これなら、毎回フレームのサイズを気にしたり、パディングの問題を気にする必要もないので、楽ができる。最初からrecvformを使っ…

Raw Socketのスクリプトをgithubに載せてみた

Raw Socketのスクリプトをgithubに載せてみた、本体はsocket.rb。まだパディングの問題は直ってないけど http://github.com/d-kami/packet-dump/tree/669818cdadd4d40a00d82b9ec8cf086e1a954f22/socket

はてなハイクに投稿するスクリプトを書いてみた

はてなハイクに投稿するスクリプトを書いてみた。注意するのはパスワード、http://h.hatena.ne.jp/apiに書いてある、例えばあなたのパスワードは〜です、という部分を使うこと。 require 'net/http' require 'rexml/document' require 'uri' require 'kconv'…

WWW::Mechanizeでエラーが出る

mixiにログインして書き込み確認画面まで行くプログラムを作ったが問題が発生した。以下のスクリプトを実行するとエラーがでる。エラーメッセージは`iconv': "\245\306\245\271\245\310" (Iconv::IllegalSequence)で@agent.submit(diary_form)のところで発生…

Raw Socketを使ってみる その4

今回はRaw Socketを使ってみる その3にARPを表示する機能を付けた。しかし、問題がある。今回、俺がパディングのことを理解してなかったため、相手からARPが送られてきた場合、ARPの後のEthernetフレームを正しく読み込めないという問題が発生している。ARP…

WWW::Mechanizeでmixiにアクセスするまで

まずmechanizeが入ってなかったのでインストールgem install mechanizeしかしlibxml2が入って無いようなメッセージと共にyum install libxml2しろと書いてあった。ただlibxml2はすでにインストール済みだったので何でだろう?と思いGoogleで検索したら解決策…