Wednesday, October 1, 2014

Efek matrix with ruby

Bagi Anda tidak akrab dengan monyet patch, itu adalah mekanisme untuk "memperpanjang atau memodifikasi kode run-time dari bahasa dinamis tanpa mengubah kode sumber asli". Sebelumnya, saya menunjukkan bagaimana monyet patch dapat memodifikasi logika dari permata ketergantungan Rubyuntuk bekerja pengaturan konfigurasi sekitar hardcoded. Seperti yang Anda bayangkan, teknik ini, jika digunakan dalam film Matrix, akan menjadi keuntungan besar untuk kami favorit "hacker" Neo dalam usahanya untuk menjadi "The One".
Red_pill_blue_pill
Dalam posting blog ini, saya akan menunjukkan beberapa contoh kode Matrix dunia nyata yang menunjukkan bagaimana Anda (hacker) dapat meng-upgrade senjata Anda, belajar karate, dan menghindari ditembak oleh wanita dalam gaun merah.
Pilihannya adalah milikmu ...


Upgrade Senjata Anda (Metode Override)
Senjata
Jika Matrix ditulis dalam Ruby, kode untuk menentukan senjata semi-otomatis bisa terlihat seperti ini:
12345678910
kelas Gun
def memicu
api
end
pribadi
def api
menempatkan "BANG!"
end
end
melihat mentahgun.rb host dengan ❤ oleh GitHub
Apa yang Anda akan melihat tentang implementasi senjata ini adalah bahwa hal itu menghormati kendala tradisional senjata semi-otomatis yang nyata. Ini berarti bahwa setiap kali memicu ditarik senjata api hanya satu tembakan, seperti:
1234
>> Semiautomatic_gun = Gun.new ()
=> # <Gun: 0x00000102806a80>
>> Semiautomatic_gun.trigger
BANG!
melihat mentahirb_session.txt host dengan ❤ oleh GitHub
Sekarang, jika Anda berada di bertengkar dengan, katakanlah, Agen Smith; Anda mungkin perlu tingkat yang sedikit lebih tinggi dari api. Kita dapat mencapai ini adalah dengan mendefinisikan ulang Gun saat run-time.Kami melakukan ini dengan mengharuskan dalam versi monyet-patch dari Gun, yang tampak seperti aslinya, tetapi dengan memicu didefinisikan ulang untuk memecat tiga tembakan, bukan satu:
12345
kelas Gun
def memicu
3 . kali { api }
end
end
Dengan membutuhkan kode diubah ini, kita secara efektif mengubah yang sudah ada sebelumnya gun semi-otomatis untuk mendukung semburan 3 putaran.
12345678
>> Memerlukan 'monkey_patched_gun'
=> True
>> Semiautomatic_gun.trigger
BANG!
BANG!
BANG!
>> Semiautomatic_gun.to_s
=> "# <Gun: 0x00000102806a80>"
melihat mentahirb_session.txt host dengan ❤ oleh GitHub
Anda akan melihat bahwa ID objek tidak berubah (id yang sama), tapi ajaib perilaku yang tidak lagi sama.
Dengan menggunakan teknik ini, kita dapat menentukan metode apa yang lakukan untuk mengubah objek yang sudah ada dan baru bahkan jika kita tidak mengontrol kode sumber gun.rb. Kemampuan ini memungkinkan kita untuk mengubah perilaku run-time dari Gun dan realitas tikungan dengan kemauan kita.

Belajar Kung Fu (Instance Stomping Variable)
Kungfu
Sekarang, saya bisa membuktikan sebagai pengamat film avid daripada banyak kali Anda membutuhkan lebih dari senjata besar untuk mengalahkan orang jahat. Kadang-kadang Anda diminta untuk berpikir pada kaki Anda dan belajar sesuatu yang baru untuk mengatasi musuh Anda. Beruntung bagi Neo, Morpheous memiliki cara untuk meng-upload keterampilan baru sehingga siapa pun bisa belajar hal-hal seperti terbang helikopter atau belajar Kung Fu.
Jika saya harus membayangkan bagaimana otak Neo ini awalnya dilaksanakan di Matrix, itu mungkin akan tampak seperti ini:
123456789101112
kelas Otak
def initialize
skills = [
"Menyembunyikan" ,
"Lari" ,
]
end
 
def what_to_do?
skills [ rand ( 2 ) ]
end
end
melihat mentahbrain.rb host dengan ❤ oleh GitHub
Sebelum proses upload sihir Morpheus ', Anda bisa cukup banyak menganggap ini akan menjadi hasil yang mungkin untuk Neo jika ia pernah berlari ke agen.
12345678
>> Membutuhkan 'otak'
=> True
>> Neo_brain = Brain.new ()
=> # <Brain: 0x0000010218aee0skills = ["menyembunyikan", "run"]>
>> Neo_brain.what_to_do?
=> "Menyembunyikan"
>> Neo_brain.what_to_do?
=> "Run"
melihat mentahirb_session.txt host dengan ❤ oleh GitHub
Tapi ... melalui keajaiban dari apa yang saya hanya bisa berasumsi untuk menjadi monyet patch, Neo bisa benar-benar belajar keterampilan baru segera.
12345678
kelas Otak
def get_new_skills
skills = [
"Rumah round kick" ,
"Karate chop" ,
]
end
end
12345678910111213141516
>> Otak = Brain.new ()
=> # <Brain: 0x00000102802f98skills = ["menyembunyikan", "run"]>
>> Brain.what_to_do?
=> "Run"
>> Memerlukan 'monkey_patched_brain'
=> True
>> Brain.what_to_do?
=> "Run"
>> Brain.get_new_skills
=> ["Tendangan sekeliling rumah", "karate chop"]
>> Brain.what_to_do?
=> "Round house kick"
>> Brain.what_to_do?
=> "Karate chop"
>> Brain.to_s
=> "# <Brain: 0x00000102802f98>"
melihat mentahirb_session.txt host dengan ❤ oleh GitHub
Sekali lagi, Anda akan melihat kami ID objek yang sama, tetapi otak sekarang memiliki kemampuan baru setelah mendapatkan keterampilan baru.
Dengan menggunakan teknik ini, kita berhasil dapat menimpa variabel misalnya yang sebelumnya tidak langsung antarmuka diakses dari otak. Hal ini memungkinkan kita untuk menentukan metode baru seperti yang kita lihat dengan contoh gun, tetapi juga menunjukkan bagaimana untuk menimpa variabel instan yang menentukan bagaimana akhirnya berperilaku.

Lady di Red Dress (Warisan Pembajakan)
Perempuan
Aku selalu bertanya-tanya bagaimana agen di Matrix dapat mengontrol orang lain. Hal ini mengingatkan saya simulasi di mana wanita dalam perubahan gaun merah ke agen dan poin pistol tepat di wajah Neo.
Sekali lagi, dengan asumsi Matrix ditulis dalam Ruby, wanita berbaju merah dapat diterapkan seperti:
12345
kelas Perempuan
def do_something
puts "Say Hello"
end
end
melihat mentahwoman.rb host dengan ❤ oleh GitHub
Sekarang, kita bisa selalu mengganti metode #do_something menggunakan teknik yang sama yang telah kita bahas. Ini akan efektif, tetapi di Matrix itu berarti bahwa agen perlu mencari setiap individu untuk membuat ini strategi yang efektif untuk melacak Neo.
Namun, solusi yang sedikit lebih tidak langsung adalah lebih mungkin. Alih-alih mengejar individu, mari kita pergi setelah esssence dari apa yang membuat mereka manusia. Dalam matriks ini adalah beberapa bentuk kode sumber. Ketika kita melihat obyek Ruby, mereka mempertahankan pohon warisan di mana banyak benda Ruby mewarisi dari Object. Dugaan saya adalah bahwa dalam rangka untuk agen untuk mengambil kendali atas setiap orang, mereka hanya menimpa metode primitif pada Obyek seperti:
12345
kelas Object
def puts ( Data )
Super ( "Bunuh Neo" )
end
end
melihat mentahagent.rb host dengan ❤ oleh GitHub
Efektif bersih ini adalah sebagai berikut:
123456789101112
>> Memerlukan 'wanita'
=> True
>> Wanita = Woman.new ()
=> # <Perempuan: 0x0000010119c268>
>> Woman.do_something
Say Hello
=> Nil
>> Memerlukan 'agent'
=> True
>> Woman.do_something
Bunuh Neo
=> Nil
melihat mentahirb_session.txt host dengan ❤ oleh GitHub
Jelas, ini adalah beberapa bisnis yang benar-benar rumit yang dilakukan oleh agen. Aku hanya bisa membayangkan mengapa orang-orang yang datang sebelum Neo tidak dapat mengetahuinya. Saya kira itu hanya masalah waktu sebelum Neo menyadari bahwa meskipun Obyek umumnya dianggap sebagai puncak rantai makanan, itu benar-benar mewarisi dari awal yang lebih primitif BasicObject. BasicObject ini sering diabaikan dan aku menebak itulah bagaimana Neo mengambil alih dengan permata kecil ini setelah agen akhirnya mencoba untuk masuk ke dalam dirinya untuk melihat siapa orang ini adalah:
123456
kelas BasicObject
def id
memperingatkan "game over"
batalkan
end
end
melihat mentahneo.rb host dengan ❤ oleh GitHub
Sekarang, kunci misteri ini adalah bahwa ketika Neo akhirnya mengacak-acak bulu Agen Smith, ia harus mencari siapa pahlawan kita benar-benar, dan itu adalah kesalahan yang besar. Di Ruby, jika Anda pernah ingin melihat apa unik mengidentifikasi objek Anda selalu dapat merujuk ke id objeknya. Jadi, ketika Agen Smith melihat ke siapa Neo benar-benar ia benar-benar berhasil untuk mengatur sisa matriks gratis, seperti:
123456
>> Memerlukan 'neo'
>> Neo = Neo.new ()
=> # <Neo: 0x00000103005858>
>> Neo.id
permainan berakhir
$
melihat mentahirb_session.txt host dengan ❤ oleh GitHub

No comments:

Post a Comment