Mohon maaf nih gan, kalau ane sok2 ngajarin. Kebetulan ane juga belum lama juga belajar Ruby-nya. Maksud ane cuma pengen share aja bahasa pemrograman favorit ane, supaya dapat banyak teman diskusi.
Kalau agan udah jago Ruby mohon masukannya, gan.
Buat yang pemula, mudah2an ada manfaatnya.
Untuk yang belum tau algoritmanya key smadav, silakan cek ke sini: [share] dapetin SN SMADAV 8.4 PRO pake nama yang agan pengen disini...
Ane sebenernya bukan dapat algoritma dari tret di atas, tapi dari tret lain lagi yang ane udah lupa.
Soalnya pertama kali bikin keygen smadav udah lama banget, waktu ane masih belajar Java. Tapi tenang aja, cuma ada sedikit perbedaan kok antara algoritma yang ane pake sama tret di atas.
Spoiler for Disclaimer:
- Tret ini gak ada hubungannya sama Rails. Ini untuk belajar dasar-dasar pemrograman bahasa Ruby (yang seharusnya udah dikuasai programmer sebelum belajar Rails).
- Program yang dibuat untuk dijalankan di comand line (command prompt atau terminal di komputer turunan Unix), karena menurut ane intinya pemrograman bukan di GUInya.
- Jujur, ane gak tau algoritma ini masih berlaku apa gak. Soalnya ane udah gak pake windows lagi. Silakan dites aja, gan.
- Kalau berhasil, tolong tetep donasi ke smadav, gan. Kasihan yang buat smadav. Ane dulu juga meskipun udah bikin program ini tetep donasi, meskipun cuma bayar 30 rb.
- Program ini belum betul2 object oriented, meskipun semua yang ada di Ruby itu object, karena program ini simpel banget.
Langsung aja, gan:
Code:
#!/usr/bin/ruby
$find_x = [38,56,57,57,99,15,58,12,13,17,19,18,88,58,52,52,12,13,12,57,52,98]
def generate_key name, acc_type
name = name.gsub(/[^A-Za-z0-9]/,"").upcase
acc_type = acc_type.upcase
name_array = name.split("")
data = [0, 0, 0]
name_array.each_slice(3) do |i|
i.each_with_index do |j, index|
data[index] += j.ord*name.length
end
end
data.map! {|i| i % 100 }
spec_code = case acc_type
when "PERUSAHAAN" then 99
when "WARNET" then 77
when "PERSONAL" then 18
end
data.push(spec_code, spec_code)
x = (data.inject(:+)*name.length)%22
data.pop(2)
mr_x = $find_x.at(x)
if acc_type == "PERSONAL"
spec_code1 = "08"
spec_code2 = "00"
else
spec_code1 = spec_code2 = spec_code
end
data.map! {|i| "0"*(2-i.to_s.length)+i.to_s}
key = [spec_code1,mr_x,spec_code2].push(data).join
end
print "Name : "
name = gets.chomp
print "Type : "
type = gets.chomp
type = "PERSONAL" if type == ""
key = generate_key name, type
puts "Key : #{key}"
Program di atas sudah langsung bisa dijalanin di Ruby 1.9+ (untuk Ruby versi sebelumnya mungkin perlu penyesuaian sedikit, misal seperti komennya agan fauzieuy).
UPDATE:
Quote:
Ringkasan algoritma:
- Untuk mendapatkan key dibutuhkan input: namadan tipe akun
- Cara mengolahnya:
1. Input nama hanya dipakai yang alfanumerik (alfabet dan nomer)nya saja dan dalam format uppercase (huruf besar semua). Artinya input nama seperti $@iya akan dianggap sebagai IYA karena underscore, special character, dan whitespace gak dianggep dan ASCII number (Integer ordinal disebutnya klo dalam Ruby) yang dicari adalah dari bentuk uppercasenya.
2. Pisahkan masing2 karakter nama untuk diolah satu persatu.
3. Masing2 karakter diconvert ke ASCII.
4. Kalau menurut tret di link di atas, masing2 karakter dibagi perkelompok tiga nilai lalu dikalikan dengan jumlah total karakter nama, lalu dimod (%) 100, trus hasilnya dijumlahkan ke tiga bagian berikutnya dstnya. Padahal hasilnya sama aja dengan dijumlahkan dulu setiap kelipatan tiga (karakter ke 1 dengan ke 4, ke 7, dstnya) lalu dikalikan dengan jumlah total karakter nama, akan didapat 3 buah nilai integer. Lalu stelah itu tiga hasil yg didapat di % 100. Tiga data ini akan kita pakai kemudian sebagai bagian dari key.
5. Ke dalam kelompok data tiga nilai tersebut kita tambahkan 2 data lagi yang didapat berdasarkan pilihan tipe akun yang dipilih. Data sekarang berisi 5 nilai integer.
6. Untuk langkah selanjutnya, lagi2 dipersulit di link tret di atas. Seharusnya tinggal dijumlahkan aja semuanya, dikalikan dengan total karakter nama, lalu di % 22. Akan didapat 1 nilai integer yang nantinya akan dicocokkan dengan index dari data khusus yang berisi kelompok 2 digit integer.
7. Selanjutnya 2 digit tersebut disisipkan di antara nomer key yang akan kita generate bersama dengan integer tambahan berdasarkan tipe dan tiga data yang diperoleh di awal.
Kalau belum jelas, saya akan coba lebih perjelas lagi sambil menjelaskan arti dari masing2 baris kode.
Penjelasan Kode:
Quote:
Untuk baris pertama(yang pake #!), itu disebutnya shebang. Di windows mungkin gak jadi persoalan mau pake shebang ato gak, asal filenya disimpen dalam .rb .
Quote:
Baris keduaadalah sekumpulan data kelompok 2 digit dalam bentuk Array (yang akan kita pakai di akhir) yang kita assign ke variable global (karena dimulai dengan tanda $) bernama $find_x. Kenapa variabel global? Karena variabel biasa (tanpa $) gak terdeteksi oleh method (fungsi) kecuali kalau find_x ikut kita lempar sebagai parameter dari generate_key bersama dengan name dan type. Kenapa methodnya gak bisa membaca adanya variabel biasa? Alasannya, deklarasi method merupakan salah satu scope gate (perbatasan scope) yang memulai scope baru. Jadi dia hanya membawa variabel global ($...), class variable (@@...), class instance variable (@...) atau constant (dimulai dari huruf kapital) ke dalam scopenya. Jadi selain $find_x sebenernya pakai @@find_x, @find_x, atau Find_x juga bisa.
Quote:
Di baris ketiga, kita memulai deklarasi method(yang ane bahas di atas) dengan nama generate_key dan parameter name, dan acc_type. Semua kode yang menghasilkan key smadavnya ada di dalam method ini.
Quote:
Nah, di baris keempatini baru kita mulai prosesnya. Satu baris ini berfungsi sebagai langkah pertama dari ringkasan algoritma di atas. Ane akan potong2 kodenya dan jelasin maksudnya satu persatu. gsub (global substitution) adalah method yang dipakai untuk mensubstitusi bagian string yang match dengan Regular Expression (singkatnya Regexp atau regex) /pattern/ (atau pola ekspresi reguler?? ) yang diberikan di argumen pertama untuk digantikan dengan argumen keduanya.
Formulanya gini:
Kurung siku ([....]) itu berisi karakter yang pengen kita cari. Jika setelah kurung siku buka ada ^, maka artinya cari selain karakter tersebut. Karena gsubfungsinya untuk mensubstitusi karakter, maka kita harus mencari karakter selain yang kita inginkan untuk bisa kita ganti menjadi "" (string kosong). Selain pake gsub, kita juga bisa pake scan, versi globalnya match. Ini yang ane paling suka dari Ruby, "Ada banyak jalan menuju Roma". Hehe..
Code:
name = name.[B]scan[/B](/[A-Za-z0-9]/).join
Kalau mau tau lebih lengkap tentang regex, silakan baca di sini.
Setelah itu, string yang kita dapat diubah ke bentuk uppercasenya (huruf gede semua) pake .upcase.
Quote:
Baris kelimacuma ngubah acc_type (tipe akun) ke format uppercasenya pake .upcase sama kek di baris keempat.
Quote:
Di baris keenam, kita ubah string jadi array karakter dengan cara kita splitdengan delimiter"" (string kosong). Jadi artinya pisahkan masing2 karakter dan masukkan ke dalam array setiap setelah tidak ketemu karakter apa2. Lalu array itu kita assign ke variabel name_array.
Quote:
Di baris ketujuh, kita buat array yang berisi 3 buah nilai nol (0) lalu kita simpan di variabel data. Buat apa? Rencananya, di baris kedelapan sampai keduabelas, kita akan ubah karakter2 di string nameke dalam bentuk ordinalnya lalu dijumlahkan nilainya setiap kelipatan tiga. Maksudnya nilai yang pertama akan dijumlahkan dengan nilai keempat, ketujuh, kesepuluh, dst.
Contohnya:
Misalnya nilai ordinalnya
Untuk itu kita butuh inisiasi data sebelum menjumlah nilai2 Integer tersebut dengan nilai Integer 0. Karena kalau kita inisiasi seperti ini
Code:
data = []
artinya data diisi dengan nil(Null atau null di bahasa lain), akan memunculkan error ketika kita melakukan operasi penjumlahan pada baris kesepuluh. Sebabnya, Integer tidak bisa dijumlahkan dengan nil.
Sebenarnya ada cara lain untuk membuat array dengan 3 buah nilai 0, yaitu:
Code:
data = Array.new(3, 0)
Quote:
Untuk baris kedelapan sampai keduabelas, kita membuat variabel datamenjadi seperti yang dicontohkan di penjelasan untuk baris ketujuh. Pertama, kita potong2 array menjadi array dengan kelipatan 3 dengan each_slice(3). Lalu kita iterasi bertingkat terhadap nilai ordinal di dalam kelompok tiga (hasil slice) dan masing2 kelompok tiga untuk kita jumlahkan nilai ordinal masing2 karakternya setelah dikalikan dengan jumlah karakter string name. (Maaf, kalau ngejelimet, gan. Intinya kita melakukan seperti yang ada di contoh penjelasan untuk baris ketujuh.)
Di baris kedelapan, array data kita kelompokkan pertiga data lalu masing2 tiga data tersebut dilempar ke blok (dimulai dari do di baris ini sampai ke end di baris keduabelas) lalu ditangkap oleh blok dan diberi nama i (|i|).
Di baris kesembilan, i kita iterasi lagi dengan each_with_index dimana iterator tersebut akan melemparkan 2 buah objek yaitu nilai ordinal masing2 karakter di dalam 3 data (i) yang kita tangkap dengan variabel j (|j|) dan urutan iterasi (atau biasa disebut index di ruby) yang kita tangkap dengan variabel (yang kebetulan kita kasih nama) index. Baris kesepuluh adalah penjumlahan yang udah kita bahas di atas.
Untuk lebih jelasnya, baris ini
Code:
data[index] += j.ord * name.length
artinya sama aja ama ini
Code:
data[index] = data[index] + j.ord * name.length
Baris ke 11 - 12(end) untuk nutup masing2 blok iterasi.
Quote:
Pada baris ke 13, data diiterasi dengan maplalu masing2 data di % 100. Hasil berupa array yang disimpan lagi di variabel data. Tanda ! artinya agar dipergunakan dengan hati2 karena map! mengubah array di tempat.
Quote:
Pada baris ke 14 - 18, case- when digunakan seperti switch - case di bahasa lain, yaitu pernyataan bersyarat yang akan mengembalikan nilai atau menjalankan suatu instruksi apabila nilai setelah case cocok dengan nilai setelah when. Dalam kasus ini Integer akan diberikan oleh pernyataan case - when dan diassign ke variabel spec_code (special code) apabila acc_type sesuai dengan salah satu string setelah when. Contohnya, apabila acc_type adalah "WARNET", maka nilai 77 akan diassign ke variabel spec_code.
Quote:
Di baris ke 19, spec_code ditambahkan ke array data lewat belakang sebanyak dua kali. Artinya spec_code menjadi anggota ke 4 (indeks no 3) dan ke 5 (indeks no 4) di array data.
Untuk sisanya silakan dipelajari sendiri, gan.
Diubah oleh kaskus.junker 25-08-2014 12:57
0
3.1K
Kutip
20
Balasan
Tulis komentar menarik atau mention replykgpt untuk ngobrol seru
Urutan
Terbaru
Terlama
Tulis komentar menarik atau mention replykgpt untuk ngobrol seru