Asudahlah.com Indonesia

Programming, tutorials, mechatronics, operating systems, dan artikel teknologi lainnya.

Mikrotik, Mengatasi tidak bisa resolve dan akses dns dari dalam hotspot

Tidak ada komentar
Setelah mengimplementasikan jaringan hotspot di tempat kerja saya. Semuanya berjalan lancar sampai ketika tiba-tiba client hotspot tidak bisa mengakses maupun me-resolve beberapa DNS. Terutama untuk DNS yang dihost oleh google seperti blogger dengan custom domain.

Saya coba ping melalui mikrotik terminal di winbox bisa tersambung, tapi ketika saya nslookup dari sisi client selalu request timed out, itu terjadi hanya untuk beberapa domain.

Setelah beberapa kali trial and error, ternyata yang jadi masalah adalah mikrotik hotspot membuat rule NAT secara dinamis yang me-redirect port DNS yaitu port TCP 53 dan UDP 53 untuk captive portal.

Solusinya yang sudah saya coba dan berhasil yaitu mem-bypass port 53 UDP dan TCP. Berikut informasinya:

/ip firewall nat
add action=accept chain=pre-hotspot disabled=no dst-port=53 protocol=udp
add action=accept chain=pre-hotspot disabled=no dst-port=53 protocol=tcp
/ip hotspot walled-garden ip
add action=accept disabled=no dst-port=53 protocol=udp
add action=accept disabled=no dst-port=53 protocol=tcp


Setelah saya pasang rule diatas, sekarang saya sudah bisa mengakses semua domain.

Sekian tulisan singkat saya kali ini. Semoga berguna.

Tidak ada komentar :

Posting Komentar

Cara membuat web browser sendiri dari C++ dengan QT Creator

Tidak ada komentar
Ini adalah postingan pertama setelah asudahlah migrasi dari wordpress ke blogger (banyak artikel-artikel sebelumnya yang ancur -.- ).

Pada postingan kali ini saya akan menyajikan sebuah tutorial cara membuat web browser sendiri dari bahasa pemrograman C++ dengan QT Creator sebagai IDE nya.

Langkah-langkah pada tutorial kali ini cukup mudah dan sederhana sekali. Bahkan anda tidak perlu memiliki keahlian koding sama sekali untuk dapat mengikuti tutorial ini. Memang web browser yang akan kita buat ini sangat sederhana. Namun dengan kreatifitas dan keinginian anda, anda dapat mengembangkannya dan menambahkan fitur-fitur sesuai dengan keinginian anda.

Langsung saja kita mulai.

Mendesain tampilan interface web browser di QT Creator.

Pertama buat sebuah project QT Widget Application, beri nama terserah anda.

Kemudian buka file .pro pada project anda (paling atas sendiri di tree view anda). Tambahkan :
QT += webkitwidgets
seperti pada gambar berikut.

Lalu buka form > nama main window anda. Dan tambahkan QWebView (drag and drop / seret) pada window designer anda. lalu tata sedemikian rupa sesuai selera anda. QWebView ini nantinya adalah tempat dimana halaman web akan tampil.

Lalu tambahkan juga Push Button dan ubah tulisannya dengan men-double click. Lalu tambahkan juga sebuah Line Edit untuk tempat memasukkan alamat url web. Lalu atur sedemikian rupa sehingga seperti ini:

Desain tampilan sudah selesai, berikutnya kita perlu menambahkan fungsionalitas pada aplikasi kita.

Menambahkan fungsi, slot dan signal untuk aplikasi web browser QT Creator

Pertama aktifkan mode edit slot & signal, seperti pada gambar berikut:

Lalu klik-drag dari tombol "back" ke QWebView kita tadi hingga terhubung.
 

Lalu saat muncul window confgure connection, pilih signal "clicked()" dan slot "back()" lalu klik OK. Seperti gambar berikut.
 

Lakukan hal yang sama untuk tombol-tombol lain dengan konfigurasi:
  • forward() untuk tombol forward.
  • reload() untuk tombol refresh.
Setelah itu kembali ke mode edit object.
 

Klik kanan tombol GO. pilih Go to slot...
Pilih clicked() kemudian klik OK

Kemudian pada code editor ketikkan:
ui->webView->load(ui->lineEdit->text());
untuk lineEdit disesuaikan dengan nama dari Line Edit yang anda tambahkan. Biasanya secara default, namanya lineEdit.

Sampai titik ini, browser anda sudah bisa digunakan. Untuk menjalankannya, klik tombol run pada pojok kiri bawah, tunggu hingga proses compile selesai.
Anda bisa mencoba dengan mengakses alamat http://google.com .

Sekian tutorial cara membuat web browser sendiri dari C++ dengan QT Creator.

Sebenarnya masih ada lagi versi yang lebih lengkap dengan beberapa fitur tambahan, memang sengaja tidak saya tampilkan seluruhnya disini. Namun bisa anda saksikan dalam video tutorial saya berikut:


Tidak ada komentar :

Posting Komentar

Membuat kalkulator IP Address menggunakan java netbeans 8

3 komentar

Tutorial kali ini adalah video tutorial, berikut hanya saya lampirkan source code yang digunakan dalam tutorial ini. Untuk step by step nya, silahkan anda stream di youtube (karena lumayan agak panjang).

int prefix=Integer.valueOf(mask.getText());
int pos=prefix/8; //important octet position
int rem=prefix % 8; //binary digit of importan octet

String binIpFull="";
String subBinary="";
String subBinaryFull="";
String binnetidFull="";
String binbcidFull="";
String netmaskFull="";
String netidFull="";
String bcidFull="";

//loop to generate binary mask from octet pos
for(int i=1;i<=8;i++){
if(i<=rem){
subBinary+="1";
}else{
subBinary+="0";
}
}

//netmask (integer version of subBinary
int netmask=Integer.parseInt(String.valueOf(subBinary),2);

//ip octets array
int[] oct={
Integer.valueOf(oct1.getText()),
Integer.valueOf(oct2.getText()),
Integer.valueOf(oct3.getText()),
Integer.valueOf(oct4.getText())
};

//binary of important octet
String binOct=String.format("%8s",Integer.toBinaryString(oct[pos])).replace(' ','0');

String binNetId="";
String binBcId="";

for(int i=0;i<8;i++){
String binPointer=subBinary.substring(i,i+1);
if(binPointer.equals("1")){
binNetId += binOct.substring(i,i+1);
binBcId += binOct.substring(i,i+1);
}else{
binNetId += "0";
binBcId += "1";
}
}

//loop to generate display-ready strings
for(int i=0;i<=3;i++){
binIpFull += String.format("%8s",Integer.toBinaryString(oct[i])).replace(' ','0');
if(i<pos){ ="" subbinaryfull+="11111111" ;="" netmaskfull="" +="255" binnetidfull="" ','0');="" binbcidfull="" netidfull="" bcidfull="" ="" }else="" if(i="">pos){
subBinaryFull+="00000000";
netmaskFull += "0";
binnetidFull+="00000000";
binbcidFull += "00000000";
netidFull += "0";
bcidFull += "1";
}else{
subBinaryFull+=subBinary;
netmaskFull += String.valueOf(netmask);
binnetidFull+=binNetId;
binbcidFull+=binBcId;
netidFull+=Integer.parseInt(String.valueOf(binNetId),2);
bcidFull+=Integer.parseInt(String.valueOf(binBcId),2);
}
if(i!=3){
subBinaryFull+=".";
netmaskFull+=".";
binnetidFull+=".";
binbcidFull+=".";
netidFull+=".";
bcidFull+=".";
binIpFull+=".";
}
}
subBinLabel.setText(subBinaryFull);
netMaskLabel.setText(netmaskFull);
netBinLabel.setText(binnetidFull);
bcBinLabel.setText(binbcidFull);
netIdLabel.setText(netidFull);
bcIdLabel.setText(bcidFull);
ipBinLabel.setText(binIpFull);



Videonya bisa anda saksikan disini:



3 komentar :

Posting Komentar

Mengatasi MS Office di wine hang karena my network places

Tidak ada komentar
Terkadang para pengguna MS Office di wine dikesalkan karena Office hang atau not responding ketika hendak menyimpan pekerjaan, umumnya itu terjadi karena tidak sengaja klik my network places.



Dan itu sangat menjengkelkan sekali karena seluruh pekerjaan yang sudah dilakukan hilang karena tidak bisa tersimpan. Untung-untung kalau masih bisa di-recover. tapi tetap saja menjengkelkan.

Apabila di windows, icon places tersebut tidak menjadi masalah. Tetapi di wine lain halnya, karena pada dasarnya kita tidak menjalankan sistem operasi window sehingga path untuk my network places tidak mengarah kemana-mana, menyebabkan loading yang tidak kunjung selesai ketika mengaksesnya.

Salah satu cara (menurut saya satu-satunya) untuk mengatasi masalah tersebut adalah dengan tidak menampilkan tombol tersebut agar kedepannya kita tidak salah "klik".

Disini saya tidak mengajarkan untuk menggunakan aplikasi yang saya sebut, niat saya disini hanya untuk share masalah yang pernah saya alami dan cara mengatasinya. Siapa tahu bakal berguna untuk orang lain kedepannya.

Menyembunyikan tombol my network places di ms office wine



  1. Langkah pertama adalah dengan membuka registry editor wine, caranya jalankan aplikasi winetrick.

  2. Lalu pilih menu "select the default wineprefix".

  3. Pilih "run regedit".

  4. Setelah muncul registry editor, buka :
    HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Common\Open Find\Places\StandardPlaces
    Note : Yang diwarnai hijau mungkin berbeda, tergantung versi office yang anda miliki. pilih saja angka yang paling tinggi.

  5. Kemudian pada setiap key yang ada didalam StandardPlaces, ubah value dari registry DWORD "Show" menjadi 0 dengan klik kanan pada registry di panel kanan, lalu pilih modify, ubah Value ke 0, lalu OK. (Jika ada registry bernama "View", ubah juga nilainya ke 0).


  6. Apabila tidak ada registry DWORD yang bernama "Show", silahkan buat sendiri dengan cara klik kanan dipanel kanan, lalu pilih New > DWORD Value, kemudian beri nama "Show" tanpa petik kemudian enter. Secara default Value-nya adalah 0.

  7. Ulangi step 5 dan 6 untuk key Recent, Publishing, My Computer dan Desktop

  8. Pastikan sudah benar, lalu keluar dari registry.

  9. Silahkan coba buka aplikasi MS Office kembali, lalu open file. Harusnya di panel kiri sudah tidak ada my network places.

Sekian tips singkat untuk mengantisipasi "sakit hati" yang disebabkan oleh fitur bawaan MS.

Tidak ada komentar :

Posting Komentar

Mengatasi fungsi suspend yang hilang di cinnamon ubuntu

Tidak ada komentar
Setelah lama menggunakan xfce di laptop ubuntu saya. Akhirnya beberapa hari lalu (karena ditipu guru saya) saya terpaksa mengganti desktop saya menjadi cinnamon.

Selama ini, saya tidak pernah mematikan / shut down laptop saya. Setiap saya selesai menggunakan, selalu saya suspend agar tidak perlu menunggu booting saat ingin menggunakan lagi.

Nah, muncul sebuah masalah setelah saya menginstall cinnamon, yaitu tidak ada menu suspend ketika klik quit di launcher. Yang muncul hanya tombol "Restart", "Cancel" dan "Shut Down".

Pada kasus saya, yang menjadi sumber masalah adalah settingan cinnamon session yang default-nya tidak menggunakan logind. Untuk menggeceknya, bisa anda gunakan perintah:

gsettings get org.cinnamon.desktop.session settings-daemon-uses-logind

gsettings get org.cinnamon.desktop.session session-manager-uses-logind

apabila kedua setting diatas menghasilkan "false". Maka artinya cinnamon session tidak menggunakan logind. Kita harus mensetnya secara manual dengan perintah:


gsettings set org.cinnamon.desktop.session settings-daemon-uses-logind true
gsettings set org.cinnamon.desktop.session session-manager-uses-logind true
gsettings set org.cinnamon.desktop.session screensaver-uses-logind false


setelah restart, tombol suspend sekarang muncul di window session

Akhirnya sekarang saya sudah bisa suspend. :)

Tapi disini saya menemui masalah lagi, yaitu ketika laptop lid saya tutup, ubuntu saya tidak mau suspend. Padahal di power setting sudah saya atur demikian.

Akhirnya saya menemukan solusi, yaitu dengan cara uncomment pada satu baris konfigurasi di file:
/etc/systemd/logind.conf
gunakan text editor kesayangan anda untuk merubahnya, jangan lupa perintah sudo.

sudo nano /etc/systemd/logind.conf

cari baris yang memuat konfigurasi "HandleLidSwitch=suspend", kemudian hilangkan tanda pagar diawal baris. (uncomment).

Lalu restart, dan hilanglah masalah "suspend" di laptop ubuntu cinnamon saya.

Setelah itu, masih banyak lagi masalah yang saya temui saat masa transisi ke cinnamon. yang akan saya share di artikel lain.

Sekian coretan singkat saya, mudah-mudahan bisa berguna.

Tidak ada komentar :

Posting Komentar

Cara Menambahkan Repository PPA ke Linux Ubuntu

Tidak ada komentar
Seringkali ketika kita melakukan perintah apt, entah itu menginstall, update, maupun uninstall/remove. Kita menemui masalah, mulai dari masalah sepele hingga masalah yg mengakibatkan kita tidak dapat melanjutkan operasi. Salah satunya yang paling umum adalah pesan error:

E: Could not get lock /var/lib/dpkg/lock - open (11 Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/) is another process using it?


Umumnya hal ini disebabkan karena kita menghentikan secara paksa saat melakukan perintah apt-get. Biasanya dengan interrupt atau Ctrl+C (halt). Hal itu menyebabkan proses berhenti mendadak dan tidak sempat membuka lock yang mencegah berjalannya proses apt secara bersamaan.

Pada dasarnya, apt tidak diperbolehkan untuk berjalan lebih dari satu proses, karena dapat mengacaukan dependensi. sehingga diperlukan sebuah lock yang mengatur agar hanya ada 1 proses yang berjalan. Ketika kita menjalankan perintah apt, maka otomatis apt akan membuat sebuah lock, dan ketika kita menjalankan perintah apt lain, maka proses apt yg baru akan memeriksa apakah ada lock, kalau ada, maka proses apt yg kedua akan berhenti dan menampilkan pesan error diatas.

Dalam kasus pemberhentian paksa (halt) tadi, proses apt sebelumnya tidak sempat menghapus lock. Sehingga apt yg kita jalankan masih menganggap ada proses apt lain yang berjalan, padahal tidak ada, akhirnya kita tidak dapat menjalankan apt.

Cara mengatasinya cukup mudah, hanya perlu menghapus lock tadi secara manual. Tetapi untuk melakukannya, kita memerlukan hak akses root. Cukup dengan perintah:

sudo rm /var/lib/apt/lists/lock atau

sudo rm /var/cache/apt/archives/lock

nah, itu saja. mudah bukan?

Tidak ada komentar :

Posting Komentar

Cara menambahkan PPA repository ke linux ubuntu

Tidak ada komentar
PPA adalah repository linux non-official, digunakan untuk menampung aplikasi-aplikasi buatan pengembang indi yang tidak termasuk kedalam repository resmi / official. Seringkali ketika kita hendak menginstall sebuah program aplikasi di linux, aplikasi tersebut ternyata belum ada di repository official. Dengan adanya repository PPA ini, kita tidak perlu mendownload source aplikasinya, kemudian mengcompile sendiri yang tentu merepotkan dan belum tentu aplikasi tersebut berjalan sempurna.

Kita hanya perlu menambahkan entry ppa kedalam repository kita, dan aplikasi yang ada pada repository ppa tersebut dapat kita install dengan package manager.

Ada beberapa cara untuk menambahkan repository ppa, saya hanya akan meng-cover 2 cara yaitu melalui terminal dan gui.

Menambahkan PPA repository melalui terminal


Buka terminal emulator anda, lalu masukkan perintah:

sudo add-apt-repository ppa:achadwick/mypaint-testing
Dimana ppa:achadwick/mypaint-testing adalah entry ppa yang bisa anda dapatkan di website launcpad.net untuk aplikasi yang bersangkutan.

Menambahkan PPA repository melalui GUI (Software Source)


Buka Software Sources, lalu masukkan password anda. lalu:

  1. Klik tab PPA

  2. Klik Add new PPA

  3. Copas entry PPA

  4. Klik OK, lalu ikuti prosesnya.

  5. Jika proses penambahan ppa sudah selesai, lik refresh list

Tidak ada komentar :

Posting Komentar

Tutorial membuat Kalkulator IP Address dengan javascript & html (video)

Tidak ada komentar
Step 1

[code lang="html"]<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>[/code]



Step 2

[code lang="html"] <title>IP Calculator</title>[/code]

Step 3

[code lang="html"] <h1>IP Address calculator</h1>[/code]

Step 4

[code lang="html"] IP Address
<input type='text' class='addr' id='q1'> .
<input type='text' class='addr' id='q2'> .
<input type='text' class='addr' id='q3'> .
<input type='text' class='addr' id='q4'> /
<input type='text' class='addr' id='cidr'>
<button>Calculate</button>[/code]



Step 5

[code lang="html"] <style>
body {
font-family:monospace;
font-size:16px;
}
.addr {
width:30px;
}
</style>[/code]



Step 6

[code lang="html"] <hr>
<div class='result'>
<span class=label>IP Address :</span>
<span class=value id=resIP></span>
</div>
<div class='result'>
<span class=label>Subnet mask :</span>
<span class=value id=resMask></span>
</div>
<div class='result'>
<span class=label>Net Address :</span>
<span class=value id=resNet></span>
</div>
<div class='result'>
<span class=label>Broadcast Address :</span>
<span class=value id=resBC></span>
</div>
<div class='result'>
<span class=label>Standard Class :</span>
<span class=value id=resClass></span>
</div>
<div class='result'>
<span class=label>Range :</span>
<span class=value id=resRange></span>
</div>
<div class='result'>
<span class=label>IP Binary :</span>
<span class=value id=resBinIP></span>
</div>
<div class='result'>
<span class=label>Mask Binary :</span>
<span class=value id=resBinMask></span>
</div>
<div class='result'>
<span class=label>Net Address Binary :</span>
<span class=value id=resBinNet></span>
</div>
<div class='result'>
<span class=label>BC Address Binary :</span>
<span class=value id=resBinBC></span>
</div>[/code]



Step 7

[code lang="css"].result {
border-bottom: 1px solid #6a6ade;
border-right: 1px solid #6a6ade;
}
.result .label {
display:inline-block;
width:200px;
background:#aaf;
}[/code]

Step 8

[code lang="html"] <script type='text/javascript'>
function calculate(){
alert("calculate button pressed");
}
</script>[/code]

Step 9

[code lang="html"] <button onclick='calculate();'>Calculate</button>[/code]

Step 10

[code lang="javascript"]//get values from input box
var q1=document.getElementById('q1').value;
var q2=document.getElementById('q2').value;
var q3=document.getElementById('q3').value;
var q4=document.getElementById('q4').value;
var cidr=document.getElementById('cidr').value;

//validate input value
if(
(q1>=0 && q1<=255) &&
(q2>=0 && q2<=255) &&
(q3>=0 && q3<=255) &&
(q4>=0 && q4<=255) &&
(cidr>=0 && cidr<=32)
){
//display IP address
document.getElementById('resIP').innerHTML=q1 + "." + q2 + "." + q3 + "." + q4;

//get IP Address binaries
var ipBin={};
ipBin[1]=String("00000000"+parseInt(q1,10).toString(2)).slice(-8);
ipBin[2]=String("00000000"+parseInt(q2,10).toString(2)).slice(-8);
ipBin[3]=String("00000000"+parseInt(q3,10).toString(2)).slice(-8);
ipBin[4]=String("00000000"+parseInt(q4,10).toString(2)).slice(-8);

//decide standart class
var standartClass="";
if(q1<=126) {
standartClass="A";
}else if (q1==127) {
standartClass="loopback IP"
}else if (q1>=128 && q1<=191) {
standartClass="B";
}else if (q1>=192 && q1<=223) {
standartClass="C";
}else if (q1>=224 && q1<=239) {
standartClass="D (Multicast Address)";
}else if (q1>=240 && q1<=225) {
standartClass="E (Experimental)";
}else {
standartClass="Out of range";
}

//netmask
var mask=cidr;
var importantBlock=Math.ceil(mask/8);
var importantBlockBinary=ipBin[importantBlock];
var maskBinaryBlockCount=mask%8;
if(maskBinaryBlockCount==0)importantBlock++;
var maskBinaryBlock="";
var maskBlock="";
for(var i=1;i<=8;i++){
if(maskBinaryBlockCount>=i){
maskBinaryBlock+="1";
}else{
maskBinaryBlock+="0";
}
}
//convert binary mask block to decimal
maskBlock=parseInt(maskBinaryBlock,2);

//net & broadcast addr
var netBlockBinary="";
var bcBlockBinary="";
for(var i=1;i<=8;i++){
if(maskBinaryBlock.substr(i-1,1)=="1"){
netBlockBinary+=importantBlockBinary.substr(i-1,1);
bcBlockBinary+=importantBlockBinary.substr(i-1,1);
}else{
netBlockBinary+="0";
bcBlockBinary+="1";
}
}

//put everything together, create a string container variables
var mask="";
var maskBinary="";
var net="";
var bc="";
var netBinary="";
var bcBinary="";
var rangeA="";
var rangeB="";
//loop to put whole strings block together
for(var i=1;i<=4;i++){
if(importantBlock>i) {
//blocks before the important block.
mask+="255";
maskBinary+="11111111";
netBinary+=ipBin[i];
bcBinary+=ipBin[i];
net+=parseInt(ipBin[i],2);
bc+=parseInt(ipBin[i],2);
rangeA+=parseInt(ipBin[i],2);
rangeB+=parseInt(ipBin[i],2);
}else if (importantBlock==i) {
//the important block.
mask+=maskBlock;
maskBinary+=maskBinaryBlock;
netBinary+=netBlockBinary;
bcBinary+=bcBlockBinary;
net+=parseInt(netBlockBinary,2);
bc+=parseInt(bcBlockBinary,2);
rangeA+=(parseInt(netBlockBinary,2)+1);
rangeB+=(parseInt(bcBlockBinary,2)-1);
}else {
//block after the important block.
mask+=0;
maskBinary+="00000000";
netBinary+="00000000";
bcBinary+="11111111";
net+="0";
bc+="255";
rangeA+=0;
rangeB+=255;
}
//add . separator except the last block
if(i<4){
mask+=".";
maskBinary+=".";
netBinary+=".";
bcBinary+=".";
net+=".";
bc+=".";
rangeA+=".";
rangeB+=".";
}
}
//write the results to the page.
document.getElementById('resMask').innerHTML=mask;
document.getElementById('resNet').innerHTML=net;
document.getElementById('resBC').innerHTML=bc;
document.getElementById('resRange').innerHTML=rangeA + " - " + rangeB;
document.getElementById('resBinIP').innerHTML=ipBin[1]+"."+ipBin[2]+"."+ipBin[3]+"."+ipBin[4];
document.getElementById('resBinMask').innerHTML=maskBinary;
document.getElementById('resBinNet').innerHTML=netBinary;
document.getElementById('resBinBC').innerHTML=bcBinary;
document.getElementById('resClass').innerHTML=standartClass;
}else{
alert("invalid value");
}
[/code]

Instruction video



Another version.


As requested by one of my subscriber. I made some customization which allows the calculator to guess subnet id using provided possible hosts number.

[code lang="html"]<!DOCTYPE html>
<html>
<head>
<title>IP Calculator</title>
<style>
body {
font-family:monospace;
font-size:16px;
}
.addr {
width:30px;
}
.result {
border-bottom: 1px solid #6a6ade;
border-right: 1px solid #6a6ade;
}
.result .label {
display:inline-block;
width:200px;
background:#aaf;
}
</style>
</head>
<body>
<h1>IP Address calculator</h1>
IP Address
<input type='text' class='addr' id='q1'> .
<input type='text' class='addr' id='q2'> .
<input type='text' class='addr' id='q3'> .
<input type='text' class='addr' id='q4'>
<br>
# of host
<input type='text' class='addr' id='hostNum'><br>
# of subnet
<input type='text' class='addr' id='subnetNum'>
<br>
Note:
<br>
Netmask will be automatically guessed using #of host first
<br>
# of subnet isn't really used here as the netmask is already guessed from # of host
<br>
<button onclick='calculate();'>Calculate</button>
<hr>
<div class='result'>
<span class=label>IP Address :</span>
<span class=value id=resIP></span>
</div>
<div class='result'>
<span class=label>Subnet mask :</span>
<span class=value id=resMask></span>
</div>
<div class='result'>
<span class=label>Subnet Id (CIDR) :</span>
<span class=value id=resSubnetId></span>
</div>
<div class='result'>
<span class=label>Net Address :</span>
<span class=value id=resNet></span>
</div>
<div class='result'>
<span class=label>Broadcast Address :</span>
<span class=value id=resBC></span>
</div>
<div class='result'>
<span class=label>Standard Class :</span>
<span class=value id=resClass></span>
</div>
<div class='result'>
<span class=label>Important Block :</span>
<span class=value id=resImportantBlock></span>
</div>
<div class='result'>
<span class=label>Range :</span>
<span class=value id=resRange></span>
</div>
<div class='result'>
<span class=label>IP Binary :</span>
<span class=value id=resBinIP></span>
</div>
<div class='result'>
<span class=label>Mask Binary :</span>
<span class=value id=resBinMask></span>
</div>
<div class='result'>
<span class=label>Net Address Binary :</span>
<span class=value id=resBinNet></span>
</div>
<div class='result'>
<span class=label>BC Address Binary :</span>
<span class=value id=resBinBC></span>
</div>
<div class='result'>
<span class=label>Max # of Subnet :</span>
<span class=value id=resMaxNet></span>
</div>
<div class='result'>
<span class=label>Max # of Host :</span>
<span class=value id=resMaxHost></span>
</div>
<div style=font-size:11px;><a href="http://asudahlah.com">By. Gemul Cybermujahidz</a></div>
</body>
<script type='text/javascript'>
function calculate(){
//get values from input box
var q1=document.getElementById('q1').value;
var q2=document.getElementById('q2').value;
var q3=document.getElementById('q3').value;
var q4=document.getElementById('q4').value;
//var cidr=document.getElementById('cidr').value;
var netNum=document.getElementById('subnetNum').value;
var hostNum=document.getElementById('hostNum').value;

//guessing netmask by # of host
var hostNumDbg=0;
for(var i=32;i>=0;i--){
if(hostNum >= Math.pow(2,i)){
//hostNumDbg=Math.pow(2,i+1);
hostNumDbg=32-(i+1);
break;
}
}
var cidr=hostNumDbg;


//validate input value
if(
(q1>=0 && q1<=255) &&
(q2>=0 && q2<=255) &&
(q3>=0 && q3<=255) &&
(q4>=0 && q4<=255) &&
(cidr>=0 && cidr<=32)
){
//display IP address
document.getElementById('resIP').innerHTML=q1 + "." + q2 + "." + q3 + "." + q4;

//get IP Address binaries
var ipBin={};
ipBin[1]=String("00000000"+parseInt(q1,10).toString(2)).slice(-8);
ipBin[2]=String("00000000"+parseInt(q2,10).toString(2)).slice(-8);
ipBin[3]=String("00000000"+parseInt(q3,10).toString(2)).slice(-8);
ipBin[4]=String("00000000"+parseInt(q4,10).toString(2)).slice(-8);

//decide standart class

var standartClass="";
if(q1<=126) {
standartClass="A";
}else if (q1==127) {
standartClass="loopback IP"
}else if (q1>=128 && q1<=191) {
standartClass="B";
}else if (q1>=192 && q1<=223) {
standartClass="C";
}else if (q1>=224 && q1<=239) {
standartClass="D (Multicast Address)";
}else if (q1>=240 && q1<=225) {
standartClass="E (Experimental)";
}else {
standartClass="Out of range";
}

//netmask
var mask=cidr;
var importantBlock=Math.ceil(mask/8);
var importantBlockBinary=ipBin[importantBlock];
var maskBinaryBlockCount=mask%8;
if(maskBinaryBlockCount==0)importantBlock++;
var maskBinaryBlock="";
var maskBlock="";
for(var i=1;i<=8;i++){
if(maskBinaryBlockCount>=i){
maskBinaryBlock+="1";
}else{
maskBinaryBlock+="0";
}
}
//convert binary mask block to decimal
maskBlock=parseInt(maskBinaryBlock,2);

//net & broadcast addr
var netBlockBinary="";
var bcBlockBinary="";
for(var i=1;i<=8;i++){
if(maskBinaryBlock.substr(i-1,1)=="1"){
netBlockBinary+=importantBlockBinary.substr(i-1,1);
bcBlockBinary+=importantBlockBinary.substr(i-1,1);
}else{
netBlockBinary+="0";
bcBlockBinary+="1";
}
}

//put everything together, create a string container variables
var mask="";
var maskBinary="";
var net="";
var bc="";
var netBinary="";
var bcBinary="";
var rangeA="";
var rangeB="";
//loop to put whole strings block together
for(var i=1;i<=4;i++){
if(importantBlock>i) {
//blocks before the important block.
mask+="255";
maskBinary+="11111111";
netBinary+=ipBin[i];
bcBinary+=ipBin[i];
net+=parseInt(ipBin[i],2);
bc+=parseInt(ipBin[i],2);
rangeA+=parseInt(ipBin[i],2);
rangeB+=parseInt(ipBin[i],2);
}else if (importantBlock==i) {
//the important block.
mask+=maskBlock;
maskBinary+=maskBinaryBlock;
netBinary+=netBlockBinary;
bcBinary+=bcBlockBinary;
net+=parseInt(netBlockBinary,2);
bc+=parseInt(bcBlockBinary,2);
rangeA+=(parseInt(netBlockBinary,2)+1);
rangeB+=(parseInt(bcBlockBinary,2)-1);
}else {
//block after the important block.
mask+=0;
maskBinary+="00000000";
netBinary+="00000000";
bcBinary+="11111111";
net+="0";
bc+="255";
rangeA+=0;
rangeB+=255;
}
//add . separator except the last block
if(i<4){
mask+=".";
maskBinary+=".";
netBinary+=".";
bcBinary+=".";
net+=".";
bc+=".";
rangeA+=".";
rangeB+=".";
}
}

//additional : count maximum host, maximum net and current subnets
var binaryHost="";
for(var i=(31-cidr);i>=0;i--){
binaryHost=binaryHost+"1";
}
var maxHost=parseInt(binaryHost,2);
var binarySubnet="";
for(var i=cidr;i>=0;i--){
binarySubnet=binarySubnet+"1";
}
var maxSubnet=parseInt(binarySubnet,2);
var binaryCurrentSubnetBlock="";
for(var i=maskBinaryBlockCount;i>=0;i--){
binaryCurrentSubnetBlock=binaryCurrentSubnetBlock+"1";
}
var maxCurrentSubnetBlock=parseInt(binaryCurrentSubnetBlock,2);

//write the results to the page.
document.getElementById('resMask').innerHTML=mask;
document.getElementById('resNet').innerHTML=net;
document.getElementById('resBC').innerHTML=bc;
document.getElementById('resRange').innerHTML=rangeA + " - " + rangeB;
document.getElementById('resBinIP').innerHTML=ipBin[1]+"."+ipBin[2]+"."+ipBin[3]+"."+ipBin[4];
document.getElementById('resBinMask').innerHTML=maskBinary;
document.getElementById('resBinNet').innerHTML=netBinary;
document.getElementById('resBinBC').innerHTML=bcBinary;
document.getElementById('resClass').innerHTML=standartClass;
document.getElementById('resSubnetId').innerHTML=cidr;
document.getElementById('resMaxHost').innerHTML=maxHost+" possible host(s) in current subnet";
document.getElementById('resMaxNet').innerHTML=maxSubnet+" of total possible subnet, "+maxCurrentSubnetBlock+" possible subnet in current block";
document.getElementById('resImportantBlock').innerHTML=importantBlock;
}else{
alert("invalid value");
}

}
</script>
</html>
[/code]

Tidak ada komentar :

Posting Komentar