Membuat PC Desktop Menjadi Dedicated Server

http://www.youtube.com/watch?v=bYJ0uZ9C9mk

Web hosting adalah salah satu hal mutlak yang diperlukan dalam membuat sebuah website. Meski tidak sedikit yang menyediakan webhosting gratis, terkadang rasanya tidak puas karena banyak sekali batasan-batasan dan aturan yang harus dipenuhi. Bahkan untuk hosting berbayar pun pasti masih banyak aturan yang jika kita melanggar langsung dapat teguran, atau lebih parah lagi suspended.

Dedicated server (DS) merupakan pilihan jika kita ingin lebih bisa mengatur secara penuh server yang kita gunakan, kalau mau lebih bisa custom dari segi hardware untuk menyesuaikan dengan kebutuhan kita, colocation server (CS) tentunya semakin dapat menyesuaikan apa yang dibutuhkan dalam definisi terhadap penggunaan server.

Dedicated server maupun colocation server keduanya memang menjanjikan kepuasan atas manajemen server. Namun, saat ini tentunya harga yang mahal masih menjadi kendala bagi para pemula terlebih bila sebenarnya hanya untuk belajar.

Ada banyak cara supaya kita tetap bisa mencicipi citarasa dedicated server (bahkan colocation server) meski cara ini hanya sekedar nggombal, tidak menunjukkan sumber daya colocation server sebenarnya (terutama dalam hal upstream dan downstream bandwidth). Intinya, untuk membuat dedicated server profesional sendiri harus memiliki kecepatan internet yang tinggi terutama upstream-nya.

Pada dasarnya cara ini adalah membuat IP Dinamik (Dynamic IP) yang kita dapatkan dari supaya seolah-olah menjadi IP Statis (Static IP). Pengguna modem telepon seluler (misal di Indonesia ada XL, Indosat, Telkomsel, 3, Axis, dll.) biasanya hanya mendapatkan IP dinamis yang setiap kali kita terputus ke jaringan dan tersambung kembali, alamat IP kita berubah. Beberapa ISP memang menyediakan IP Static, tetapi belum tentu bisa diakses dari seluruh tempat (pembuktian bisa mencoba menggunakan proxy untuk akses alamat IP kita).

Dalam video yang saya buat dicontohkan cara membuat dedicated server dan colocated server sendiri memakai layanan gratis. Komputer yang dipakai adalah komputer desktop biasa, dan tentunya harus tersambung dengan internet. Berikut ini langkah-langkah membuat dedicated server menggunakan komputer desktop. Untuk lebih jelasnya bisa sambil lihat video.

  1. Install aplikasi server di komputer desktop anda (misal XAMPP atau AppServ).
  2. Buat account di http://no-ip.com, klik saja yang free (hanya untuk belajar).
  3. Selanjutnya setelah registrasi dan verifikasi alamat email silakan login. Buat alamat host (sub domain) melalui add host atau manage host (maksimal 3 buah untuk yang free).
  4. Download dan install aplikasi klien (DUC) di komputer kita untuk mengenali alamat IP dinamis kita dan mengubah IP (A record) dari alamat host (nama sub domain).
  5. Setelah terinstall, buka aplikasi dan login.
  6. Pilih host yang ingin kita gunakan sebagai alamat domain untuk mengakses server kita.
  7. Setelah selesai, coba akses alamat host atau IP host dari web browser, maka halaman yang muncul adalah halaman localhost kita.
  8. Untuk test, coba akses menggunakan proxy atau melalui komputer lain yang terhubung internet.

Selamat mencoba….

Solve WordPress function.stripos Error

Click This (See Update – 19 December 2012)

Warning: stripos() [function.stripos]: needle is not a string or an integer in /home/user/public_html/wp-includes/function.php on line 658


METHODE 1


This stripos function error caused by WordPress and Jetpack plugin. Not all of Jetpack module caused this error. It is caused by share module. So to solve this problem, go to wordpress administrator (dashboard), click Jetpack, click Learn More on sharing module box, then last action click deactivate.

Check again your page that shown error warning.

Voila, everything all right…

Note: Your sharing button on the end of your post will disappear, it is take effective and quick if you have too much posts that show error.


METHODE 2


  1. Go to your wordpress back end (dashboard).
  2. Click Posts (or All Posts).
  3. Click edit on your post that show “function.stripos” error.
  4. Focus on featured image, click add featured image.
  5. Upload or use some image in your media library as featured image.
  6. Set featured image, then click update post.
  7. After updated, view your post for final check.

Note: This is better solution without disabling your sharing button, but if you have too much posts that shown error you will so tired to edit each post one by one.


Go to this wordpress support thread will help you how to fix this error, better if you have a lite experience to edit PHP code. http://wordpress.org/support/topic/jetpack-youtube-embeds#post-3616676


Arduino Differential ADC and Gain ADC

Arduino is an open source hardware kit that widely used by any electronic control and automation geeks around the world. Analog data acquisition system is useful things inside Arduino. By default, ADC programming system inside Arduino setting up in single ended mode. Means analog input in range only from 0V to +5V, or in another way from 0V to Vref, there are no negative input on Arduino analog pin.

I try to make Arduino enabled their differential input support (read ATmega2560 datasheet p.290-292 table 26-4). Other way, also I try to enabling gain inside ATmega2560 microcontroller. So, you can use this differential input ±4.5V (read datasheet p379) for your analog data acquisition system and use analog input with gain 1x, 10x, or 200x. This wiring_differential.c is a modification from wiring_analog.c inside Arduino.

/*
  wiring_differential.c - analog differential input
  by Muh Nahdhi Ahsan http://sekarlangit.com/arduino-differential-gain.php

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General
  Public License along with this library; if not, write to the
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  Boston, MA  02111-1307  USA

  wiring_differential.c modified from wiring_analog.c
  wiring_analog.c - Copyright (c) 2005-2006 David A. Mellis
  wiring_analog.c - modified 28 September 2010 by Mark Sproul
  wiring_analog.c - Part of Arduino - http://arduino.cc

  $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $
*/

#include "wiring_private.h"
#include "pins_arduino.h"

uint8_t analog_reference = DEFAULT;

void analogReference(uint8_t mode)
{
	// can't actually set the register here because the default setting
	// will connect AVCC and the AREF pin, which would cause a short if
	// there's something connected to AREF.
	analog_reference = mode;
}

// Read Analog Differential without gain (read datashet of ATMega1280 and ATMega2560 for refference)
// Use analogReadDiff(NUM)
// NUM	|	POS PIN		|	NEG PIN		| 	GAIN
//	0	|	A0			|	A1			|	1x
//	1	|	A1			|	A1			|	1x
//	2	|	A2			|	A1			|	1x
//	3	|	A3			|	A1			|	1x
//	4	|	A4			|	A1			|	1x
//	5	|	A5			|	A1			|	1x
//	6	|	A6			|	A1			|	1x
//	7	|	A7			|	A1			|	1x
//	8	|	A8			|	A9			|	1x
//	9	|	A9			|	A9			|	1x
//	10	|	A10			|	A9			|	1x
//	11	|	A11			|	A9			|	1x
//	12	|	A12			|	A9			|	1x
//	13	|	A13			|	A9			|	1x
//	14	|	A14			|	A9			|	1x
//	15	|	A15			|	A9			|	1x

int analogReadDiff(uint8_t pin)
{
	uint8_t low, high;

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
	if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#elif defined(__AVR_ATmega1284__)
	if (pin >= 24) pin -= 24; // allow for channel or pin numbers
#else
	if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

#if defined(__AVR_ATmega32U4__)
	pin = analogPinToChannel(pin);
	ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#elif defined(ADCSRB) && defined(MUX5)
	// the MUX5 bit of ADCSRB selects whether we're reading from channels
	// 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
	ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#endif
	// set the analog reference (high two bits of ADMUX) and select the
	// channel (low 4 bits).  this also sets ADLAR (left-adjust result)
	// to 0 (the default).
#if defined(ADMUX)
	ADMUX = (analog_reference << 6) | ((pin | 0x10) & 0x1F);
#endif

	// without a delay, we seem to read from the wrong channel
	//delay(1);

#if defined(ADCSRA) && defined(ADCL)
	// start the conversion
	sbi(ADCSRA, ADSC);

	// ADSC is cleared when the conversion finishes
	while (bit_is_set(ADCSRA, ADSC));

	// we have to read ADCL first; doing so locks both ADCL
	// and ADCH until ADCH is read.  reading ADCL second would
	// cause the results of each conversion to be discarded,
	// as ADCL and ADCH would be locked when it completed.
	low  = ADCL;
	high = ADCH;
#else
	// we dont have an ADC, return 0
	low  = 0;
	high = 0;
#endif

	// combine the two bytes
	return (high << 8) | low;
}

// Read Analog Differential with gain (read datashet of ATMega1280 and ATMega2560 for refference)
// Use analogReadGain(NUM)
// NUM	|	POS PIN		|	NEG PIN		| 	GAIN
//	0	|	A0			|	A0			|	10x
//	1	|	A1			|	A0			|	10x
//	2	|	A0			|	A0			|	200x
//	3	|	A1			|	A0			|	200x
//	4	|	A2			|	A2			|	10x
//	5	|	A3			|	A2			|	10x
//	6	|	A2			|	A2			|	200x
//	7	|	A3			|	A2			|	200x
//	8	|	A8			|	A8			|	10x
//	9	|	A9			|	A8			|	10x
//	10	|	A8			|	A8			|	200x
//	11	|	A9			|	A8			|	200x
//	12	|	A10			|	A10			|	10x
//	13	|	A11			|	A10			|	10x
//	14	|	A10			|	A10			|	200x
//	15	|	A11			|	A10			|	200x

int analogReadGain(uint8_t pin)
{
	uint8_t low, high;

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
	if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#elif defined(__AVR_ATmega1284__)
	if (pin >= 24) pin -= 24; // allow for channel or pin numbers
#else
	if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

#if defined(__AVR_ATmega32U4__)
	pin = analogPinToChannel(pin);
	ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#elif defined(ADCSRB) && defined(MUX5)
	// the MUX5 bit of ADCSRB selects whether we're reading from channels
	// 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
	ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#endif
	// set the analog reference (high two bits of ADMUX) and select the
	// channel (low 4 bits).  this also sets ADLAR (left-adjust result)
	// to 0 (the default).
#if defined(ADMUX)
	ADMUX = (analog_reference << 6) | ((pin | 0x08) & 0x0F);
#endif

	// without a delay, we seem to read from the wrong channel
	//delay(1);

#if defined(ADCSRA) && defined(ADCL)
	// start the conversion
	sbi(ADCSRA, ADSC);

	// ADSC is cleared when the conversion finishes
	while (bit_is_set(ADCSRA, ADSC));

	// we have to read ADCL first; doing so locks both ADCL
	// and ADCH until ADCH is read.  reading ADCL second would
	// cause the results of each conversion to be discarded,
	// as ADCL and ADCH would be locked when it completed.
	low  = ADCL;
	high = ADCH;
#else
	// we dont have an ADC, return 0
	low  = 0;
	high = 0;
#endif

	// combine the two bytes
	return (high << 8) | low;
}

For using this library, follow this procedure:

  1. Download this AnalogDiff library first. (download here)
  2. Extract to anywhere on your disk.
  3. Copy AnalogDiff folder file to this directory: <arduino_dir>/libraries. Else, just copy wiring_differential.c to <arduino_dir>/hardware/arduino/cores/arduino
  4. Add this library into your code first by writing #include <wiring_differential.c>

Use analogReadDiff(num) on your code for read analog input in differential mode without gain or use analogReadGain(num) for read analog input with gain. Please refer to this table below for num inside and analog input pin for your input.

Actually, for this now I just test for differential on A0 and A1 channel with AnalogReadDiff(0). Another test applied on Analog read differential with 10x gain by using AnalogReadGain(1) and 200x gain with AnalogReadGain(3). Please correct me about the table (I think something went wrong about pin numbering).

This is a simple sample code how to use differential ADC and gain ADC, modified from Analog Read Serial basic sample code (compiled with Arduino 1.0.1).

/*
  AnalogReadSerial
  Reads an analog input on pin 0, prints the result to the serial monitor.
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

 This example code is in the public domain.
 */

#include <wiring_differential.c>

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorSended = analogRead(A0); // reading single ended input A0 - GND
  int sensorDiff = analogReadDiff(0); // reading differential A0 - A1
  int sensorGain10 = analogReadGain(1); // reading differential gain 10x A0 - A1
  int sensorGain200 = analogReadGain(3); // reading diferential gain 200x A0 - A1

  // arrange integer value (read ATMega 2560 Datashet p.288) figure 26-15
  if (sensorDiff > 511 )
  {
    sensorDiff = sensorDiff - 1023 ;
  }
  if (sensorGain10 < 511 )
  {
    sensorGain10 = -1 * sensorGain10 ;
  }
  else
  {
    sensorGain10 = -1 * ( sensorGain10 - 1023 ) ;
  }
  if ( sensorGain200 < 511 )
  {
    sensorGain200 = -1 * sensorGain200 ;
  }
  else
  {
    sensorGain200 = -1 * ( sensorGain200 - 1023 ) ;
  }

  Serial.print("Single ended reading : ");
  Serial.println(sensorSended);
  Serial.print("Differential reading : ");
  Serial.println(sensorDiff);
  Serial.print("Differential 10x gain reading : ");
  Serial.println(sensorGain10);
  Serial.print("Differential 200x gain reading : ");
  Serial.println(sensorGain200);
  delay(1000);        // delay for a while
}

Update: March, 27th 2013

Referrer Mencurigakan Shortlink #SobatBumi

Sudah tujuh hari ini statistik website ini menunjukkan suatu keanehan. Terdapat referrers ke halaman yang saya ikutkan dalam kontes blog Pertamina Sobat Bumi yang hampir konstan sekitar angka 20 visit dari referrer bit.ly. Kecurigaan saya semakin bertamah setelah melihat statistik di http://bit.ly/Energi1+. Selama tujuh hari selalu ada visitor minimal 20 visitor per hari. Setelah saya telusuri lebih lanjut ternyata selalu terdapat 20 visitor bersumber dari satu buah alamat IP. Setiap hari selalu pada waktu yang hampir sama, hampir setiap satu jam sekali.

Hasil penelusuran saya selanjutnya menunjukkan adanya “spam bot” yang masuk melalui shortlink http://bit.ly/Energi1. Beberapa kali saya mencoba menebak “jalur” yang digunakan, hasilnya cukup sederhana. Spam bot berasal dari server cron gratisan. Server cron ini akan secara kontinyu memanggil alamat URL http://bit.ly/Energi1 setiap satu jam sekali.

Cron atau dalam halaman administrasi cronojob merupakan perintah yang akan dieksekusi oleh server secara terjadwal dan periodik. Dapat diatur periodenya hingga pada skala paling kecil satu kali per menit. Semakin sering perintah dieksekusi akan semakin membebani kinerja server sehingga beberapa server cron membatasi periode pengeksekusian tercepat pada skala satu jam sekali.

Terkadang cron yang dijalankan dapat merugikan, misal dalam kasus yang saya alami diatas, satu halaman yang dipanggil oleh server cron berukuran 300kb, halaman dipanggil sebanyak 20x sehari. Artinya bandwidth yang termakan untuk “melayani” cron saja sudah 6MB per hari. Maka dalam 30 hari sudah menghabiskan 180MB per halaman. Maka jika terdapat 10 halaman yang “terpanggil”, dalam satu hari kehabisan bandwidth 60MB dan dalam satu bulan 1,8GB hanya untuk melayani cron. Dengan harga bandwidth yang tidak murah untuk server di Indonesia maka 1,8GB bisa menghabiskan Rp 20.000,00 untuk membayar ekstra bandwidth. Dalam waktu satu tahun? Untungnya untuk server yang saya gunakan adalah server gratis yang disediakan oleh idhostinger.

Langkah yang dapat saya lakukan adalah memblokir alamat IP server cron yang memanggil halaman rujukan http://bit.ly/Energi1.

Statistik

Sebenarnya saya sedikit memperhatikan para pengunjung blog ini. Dalam artian saya sekedar memperhatikan perilaku pengunjung, bukan jumlah pengunjungnya. Saya tidak terlalu memusingkan mengenai jumlah pengunjung karena memang saya tidak mengejar pengunjung yang banyak. Melihat statistik pengunjung adalah hal yang menyenangkan. Lagi lagi bukan statistik jumlah pengunjung, melainkan perbandingan pengunjung yang datang melalui berbagai cara.

Berdasarkan sumber kedatangan (traffic source), pengunjung blog ini memiliki porsi yang hampir sama. Pengunjung dari mesin pencari sebanyak 38% dari total pengunjung. Pengunjung yang datang dari klik di website/blog lain ada sekitar 31%, dan begitu juga pengunjung yang berkunjung langsung dengan mengetikkan alamat blog ini di web browser mereka sebanyak 31%.

Berdasarkan web browser yang pengunjung gunakan, Mozilla Firefox masih mendominasi disusul dibawahnya ada Google Chrome. Firefox mendominasi lebih dari separuh pengunjung, 54% dari total pengunjung. Angkanya hampir seperti perhitungan kemenangan Jokowi dalam pilkada putaran kedua saja. Google Chrome menduduki peringkat kedua dengan perolehan 28% dari total pengunjung. Di bawahnya secara berurutan ada Opera Mini (mobile), Safari Browser, Android Browser, Internet Explorer, Opera, Mozilla, Mozilla Compatible Agent, dan ada Blackberry Browser.

Dari sisi jenis perangkat yang digunakan, pengguna desktop masih sangat mendominasi pengunjung. Pengguna desktop meraih angka 94% dari total pengunjung. Pengguna perangkat bergerak baik internet tablet maupun mobile phone hanya menguasai 6% dari total pengunjung.

Dari statistik diatas dapat diperoleh kesimpulan sederhana bahwa secara seimbang pengunjung datang dari mesin pencari, related link, dan direct browsing. Pengunjung kebanyakan menggunakan web browser Firefox. Perangkat komputer (desktop dan laptop) mendominasi sebagai jenis perangkat yang kebanyakan digunakan oleh pengunjung.