8 Kebiasaan Nabi Muhammad SAW

KEBIASAAN-KEBIASAAN NABI SAW SEKITAR SHALAT

  1. Selalu shalat sunnah fajar
  2. Meringankan shalat sunnah fajar
  3. Membaca surat Al-Ikhlas dan Al-Kafirun dalam shalat fajar (ayat lain yang dibaca Nabi dalam shalat sunnah fajar)
  4. Berbaring sejenak setelah shalat sunnah fajar
  5. Mengerjakan shalat sunnah di rumah
  6. Selalu shalat sunnah empat rakaat sebelum dhuhur
  7. Mengganti dengan empat rakaat setelah duhur jika tidak sempat shalat sebelumnya
  8. Shalat sunnah dua atau empat rakaat sebelum ashar
  9. Shalat sunnah dua rakaat sesudah maghrib
  10. Shalat sunnah setelah Isya'
  11. Mengakhirkan shalat Isya'
  12. Memanjangkan rakaat pertama dan memendekkan rakaat kedua
  13. Selalu shalat malam (waktu shalat malam Rasulullah saw)
  14. Menggosok gigi apabila bangun malam
  15. Membuka shalat malam dengan 2 rakat ringan
  16. Shalat malam sebelas rakaat (format shalat malam Nabi sebelas rakaat)
  17. Memanjangkan shalat malamnya
  18. Membaca surat Al-A'la, Al-Kafirun dan Al-Ikhlas dalam shalat witir
  19. Mengganti shalat malam di siang hari jika berhalangan
  20. Shalat dhuha empat rakaat
  21. Tetap duduk hingga matahari bersinar setelah shalat subuh
  22. Meluruskan shaf sebelum mulai shlaat jama'ah
  23. Mengangkat kedua tangan saat takbiratul ihram, akan ruku' dan bangun dari ruku'
  24. Meletakkan tangan kanan di atas tangan kiri
  25. Mengarahkan pandangan ke tempat sujud
  26. Merenggangkan kedua tangan ketika sujud hingga tampak ketiaknya yang putih
  27. Memberi isyarat dengan jari telunjuk ketika tasyahhud dan mengarahkan pandangan ke arah jari telunjuk
  28. Meringankan tasyahhud pertama
  29. Meringankan shalat jika berjama'ah
  30. Menghadap ke arah kanan makmum selesai shalat jama'ah
  31. Bersegera ke masjid begitu masuk waktu shalat
  32. Selalu memperbarui wudhu setiap kali akan shalat
  33. Tidak menshalatkan jenazah yang masih berhutang
  34. Menancapkan tombak sebagai pembatas jika shlaat di tanah lapang
  35. Mengajari shalat kepada orang yang baru masuk Islam

 

KEBIASAAN-KEBIASAAN NABI SAW DI HARI JUM'AT DAN DUA HARI RAYA

  1. Membaca surat As-Sajdah dan Al-Insan dalam shalat subuh di hari Jum'at
  2. Memotong kuku dan kumis setiap hari Jum'at
  3. Mandi pada hari Jum'at
  4. Memakai pakaian terbaik untuk shalat jum'at
  5. Memendekkan khutbah Jum'at dan memanjangkan shalat
  6. Serius dalam khutbahnya dan tidak bergurau
  7. Duduk di antara dua khutbah Jum'at
  8. Membaca surat Al-A'la dan Al-Ghasyiyah dalam shalat Jum'at
  9. Shalat sunnah setelah jum'at
  10. Tidak langsung shalat sunnah setelah Jum'at
  11. Mandi sebelum berangkat shalat Id
  12. Memakai pakaian teraik ketika shalat Id
  13. Makan terlebih dahulu sebelum berangkat shalat Idul Fitri
  14. Baru makan sepulang dari melaksanakan shalat Idul Adha
  15. Shalat Id di tanah lapang
  16. Mengajak semua keluarganya ke tempat shalat Id
  17. Memperlambat pelaksanaan shalat Idul Fitri dan mempercepat pelaksanaan shalat Idul Adha
  18. Langsung shalat Id tanpa Adzan dan Iqomah
  19. Dua kali khutbah dengan diselingi duduk
  20. Pergi dan pulang melalui jalan yang berbeda
  21. Berjalan kaki menuju tempat shalat Id
  22. Membaca surat Qaaf dan Al-Qamar dalam shalat Id
  23. Menyembelih hewan kurban di tempat pelaksanaan shalat Id

 

KEBIASAAN-KEBIASAAN NABI SAW DALAM MASALAH PUASA

  1. Puasa dan berbuka secara seimbang
  2. Berbuka puasa sebelum shalat maghrib
  3. Berbuka dengan korma
  4. Tetap puasa meskipun bangun dalam keadaan junub
  5. Berpuasa jika tidak mendapatkan makanan di pagi hari
  6. Membatalkan puasa sunnah jika memang ingin makan
  7. Banyak puasa di bulan sya'ban
  8. Puasa enam hari syawal
  9. Puasa hari Arafah
  10. Puasa Asyura atau sepuluh Muharam
  11. Puasa hari senin dan kamis
  12. Puasa tanggal 13, 14 dan 15 setiap bulan
  13. Mencium istri di siang hari

 

KEBIASAAN-KEBIASAAN NABI SAW DI BULAN RAMADHAN

  1. Memperbanyak sedekah
  2. Memperbanyak membaca Al-Qur'an
  3. Megnakhirkan waktu sahur
  4. Puasa wishal
  5. Memperbanyak shalat malam (menghidupkan malam ramadhan)
  6. I'tikaf
  7. Menghidupkan sepuluh malam terakhir dan membangunkan keluarganya
  8. Menyuruh para sahabat agar bersungguh-sungguh mencari lailatul qadar

 

KEBIASAAN-KEBIASAAN NABI SAW DALAM MAKAN DAN MINUM

  1. Tidak pernah mencela makanan
  2. Tidak makan sambil bersandar
  3. Makan dan minum dengan tangan kanan
  4. Makan dengan tiga jari
  5. Menjilati jari-jemari dan tempat makan selesai makan
  6. Mengambil nafas tiga kali ketika minum
  7. Minum dengan duduk dan berdiri
  8. Mulai makan dari pinggir tempat makan
  9. Berdo'a sebelum dan sesudah makan
  10. Tidak pernah kenyang dua hari berturut-turut
  11. Tidak pernah makan di depan meja makan

 

KEBIASAAN-KEBIASAAN NABI SAW DALAM TIDURNYA

  1. Tidur dalam keadaan suci (punya wudhu)
  2. Tidur di atas bahu sebelah kanan
  3. Meletakkan tangan di bawah pipi
  4. Meniup kedua tangan dan membaca do'a lalu mengusapkannya ke badan
  5. Tidak suka tidur sebelum Isya'
  6. Tidur pada awal malam dan bangun di sepertiga akhir
  7. Berwudlu dulu jika akan tidur dalam keadaan junub
  8. Berdo'a sebelum dan setelah bangun tidur
  9. Membaca do'a jika terjaga dari tidur
  10. Tidur matanya namun tidak tidur hatinya
  11. Menyilangkan kaki jika tidur di masjid
  12. Tidur hanya beralaskan tikar
  13. Tidak menyukai tidur tengkurap

 

KEBIASAAN-KEBIASAAN NABI SAW DALAM BEPERGIAN

  1. Berlindung kepada Allah dari beban perjalanan jika hendak bepergian
  2. Sengang bepergian pada hari kamis
  3. Senang pergi pada pagi hari
  4. Menyempatkan tidur dalam perjalanan di malam hari
  5. Melindungi diri atau menjauh jika buang hajat
  6. Berada di barisan belakang saat bepergian
  7. Bertakbir tiga kali ketika telah berada di atas kendaraan
  8. Bertakbir saat jalanan naik dan bertasbih saat jalanan menurun
  9. Berdo'a jika tiba waktu malam
  10. Berdo'a jika melihat fajar dalam perjalanan
  11. Berdo'a ketika kembali dari bepergian
  12. Mendatangi masjid terlebih dahulu saat baru tiba dan shalat dua raka'at
  13. Mengundi istri-istrinya jika bepergian
  14. Shalat di atas kendaraan
  15. Menghadap ke arah kiblat terlebih dahulu jika shalat di atas kendaraan
  16. Mendo'akan orang yang ditinggal pergi
  17. Mendo'akan orang yang akan bepergian
  18. Memberi bagian tersendiri kepada orang yang diutus pergi

 

KEBIASAAN-KEBIASAAN NABI SAW DALAM DZIKIR DAN DO'ANYA

  1. Senang berdoa dengan do'a yang ringkas
  2. Membaca istighfar tiga kali dan berdzikir selepas shalat
  3. Membaca istighfar tujuh puluh kali hingga seratus kali setiap hari
  4. Membaca shalat dan salam atas dirinya jika masuk dan keluar dari masjid
  5. Membaca do'a di pagi dan sore hari
  6. Membaca do'a di akhir majlis
  7. Membaca do'a saat keluar rumah
  8. Berdo'a jika masuk dan keluar kamar kecil
  9. Berdoa jika memakai pakaian baru
  10. Berdo'a jika merasa sakit
  11. Berdo'a jika melihat bulan
  12. Memanjatkan do'a di saat sulit
  13. Berdo'a jika takut pada suatu kaum dan saat bertemu musuh
  14. Berdo'a jika bertiup angin kencang
  15. Berdo’a dengan mengangkat kedua tangan hingga terlihat putih ketiaknya

 

PERNAK-PERNIK KEBIASAAN NABI SAW

  1. Selalu mengingat Allah di setiap waktu
  2. Mengulangi perkataan hingga tiga kali dan bicara dengan suara yang jelas
  3. Selalu mendahulukan yang kanan
  4. Menutup mulut dan merendahkan suara apabila bersin
  5. Tidak menolak jika diberi minyak wangi
  6. Tidak pernah menolak hadiah
  7. Selalu memilih yang lebih mudah
  8. Bersujud syukur jika mendapat kabar gembira
  9. Bersujud tilawah jika membaca ayat sajdah
  10. Tidak datang ke rumah pada wkatu malam melainkan pada pagi dan sore hari
  11. Tidak suka berbincang-bincang setelah Isya'
  12. Tidak senang menyimpan harta dan selalu memberi jika ada yang meminta
  13. Mengulang salam hingga tiga kali
  14. Turut mengerjakan pekerjaan rumah
  15. Pergi ke masjid Quba setiap Sabtu
  16. Sangat marah jika hukum Allah dilanggar namun tidak marah jika dirinya disakiti
  17. Berubah warna mukanya jika tidak menyukai sesuatu
  18. Memilih waktu yang tepat dalam menasehati
  19. Tidak bohong dalam bergurau
  20. Berdiri apabila melihat iringan jenazah
  21. Baru mengangkat pakaian jika telah dekat dengan tanah saat buang hajat
  22. Menyuruh istrinya agar memakai kain jika ingin menggaulinya dalam keadaan haidh
  23. Buang air kecil dengan jongkok

Bermusyawarah jika membicarakan suatu masalah yang penting

27 Daftar Surat dalam Al-Qur'an (Arti, Jumlah Ayat, Statistik)

Bagi Anda yang ingin cepat menguasai atau menghapal seluruh nama surat lengkap dengan nomor urut dan artinya, sangatlah tepat Anda mengunjungi blog ini. Karena di sini saya bagikan file yang memuat hal tersebut.
 
NO NAMA SURAT ARTI JUMLAH AYAT
1  AL-FATIHAH  PEMBUKAAN 7
2  AL-BAQARAH  SAPI BETINA 286
3  ALI IMRAN  KELUARGA IMRAN 200
4  ANNISA  WANITA 176
5  AL-MA`IDAH  HIDANGAN 120
6  AL-AN'AM  BINATANG TERNAK 165
7  AL-A'RAF  TEMPAT TERTINGGI 206
8  AL-ANFAL  RAMPASAN PERANG 75
9  ATTAUBAH  PENGAMPUNAN 129
10  YUNUS  NABI YUNUS 109
11  HUD  NABI HUD 123
12  YUSUF  NABI YUSUF 111
13  ARRA'DU  GURUH 43
14  IBRAHIM  NABI IBRAHIM 52
15  AL-HIJRU  DAERAH HIJIR 99
16  ANNAHLU  LEBAH 128
17  AL-ISRA  PERJALANAN DI MALAM HARI 111
18  AL-KAHFI  GUA 110
19  MARYAM  SITI MARYAM 98
20  TOHA  TOHA 135
21  AL-ANBIYA  NABI-NABI 112
22  AL-HAJJ  HAJI 78
23  AL-MU`MINUN  ORANG-ORANG YANG BERIMAN 118
24  ANNUR  CAHAYA 64
25  AL-FURQAN  PEMBEDA 77
26  ASY-SYU'ARA  PENYAIR-PENYAIR 227
27  ANNAMLU  SEMUT 93
28  AL-QASHASH  KISAH-KISAH 88
29  AL-'ANKABUT  LABA-LABA 69
30  ARRUM  BANGSA RUM 60
31  LUQMAN  LUQMAN 34
32  ASSAJDAH  SUJUD 30
33  AL-AHZAB  GOLONGAN YANG BERSEKUTU 73
34  SABA`  NEGERI SABA 54
35  FATHIR  PENCIPTA 45
36  YASIN  YASIN 83
37  ASH-SHAFFAT  YANG BERBARIS 182
38  SHAD  SHAD 88
39  AZZUMAR  ROMBONGAN-ROMBONGAN 75
40  AL-MU`MIN  ORANG BERIMAN 85
41  FUSHSHILAT  YANG DIJELASKAN 54
42  ASY-SYURA  MUSYAWARAH 53
43  AZZUKHRUF  PERHIASAN 89
44  ADDUKHAN  KABUT 59
45  AL-JATSIYAH  YANG BERLUTUT 37
46  AL-AHQAF  BUKIT-BUKIT PASIR 35
47  MUHAMMAD  NABI MUHAMMAD 38
48  AL-FATHU  KEMENANGAN 29
49  AL-HUJURAT  KAMAR-KAMAR 18
50  QAF  QAF 45
51  ADZ-DZARIYAT  ANGIN YANG MENERBANGKAN 60
52  ATH-THUR  BUKIT THUR 49
53  ANNAJMU  BINTANG 62
54  AL-QAMAR  BULAN 55
55  ARRAHMAN  MAHA PEMURAH 78
56  AL-WAQI'AH  HARI KIAMAT 96
57  AL-HADID  BESI 29
58  AL-MUJADILAH  WANITA YANG MENGAJUKAN GUGATAN 22
59  AL-HASYR  PENGUSIRAN 24
60  AL-MUMTAHANAH  PEREMPUAN YANG DIUJI 13
61  ASH-SHAF  BARISAN 14
62  AL-JUMU'AH  HARI JUM'AT 11
63  AL-MUNAFIQUN  ORANG-ORANG MUNAFIK 11
64  ATTAGHABUN  HARI DITAMPAKKAN 18
65  ATH-THALAQ  TALAQ 12
66  ATTAHRIM  MENGAHARAMKAN 12
67  AL-MULKU  KERAJAAN 30
68  AL-QALAM  QOLAM 52
69  AL-HAQQAH  HARI KIAMAT 52
70  AL-MA'ARIJ  TEMPAT-TEMPAT NAIK 44
71  NUH  NABI NUH 28
72  AL-JINN  JIN 28
73  AL-MUZAMMIL  ORANG-ORANG BERSELIMUT 20
74  AL-MUDDATS-TSIR  ORANG YANG BERKEMUL 56
75  AL-QIYAMAH  HARI KIAMAT 40
76  AL-INSAN  MANUSIA 31
77  AL-MURSALAT  MALAIKAT YANG DIUTUS 50
78  ANNABA`  BERITA 40
79  ANNAZI'AT  MALAIKAT YANG MENCABUT 46
80  'ABASA  BERMUKA MASAM 42
81  ATTAKWIR  MENGGULUNG 29
82  AL-INFITHAR  TERBELAH 19
83  ATTATHFIF  KECURANGAN 36
84  AL-INSYIQAQ  TERBELAH 25
85  AL-BURUJ  GUGUSAN BINTANG 22
86  ATH-THARIQ  YANG DATANG DI MALAM HARI 17
87  AL-A'LA  YANG PALING TINGGI 19
88  AL-GHASYIYAH  HARI PEMBALASAN 26
89  AL-FAJR  FAJAR 30
90  AL-BALAD  NEGERI 20
91  ASY-SYAMSU  MATAHARI 15
92  AL-LAIL  MALAM 21
93  ADH-DHUHA  WAKTU DUHA 11
94  AL-INSYIRAH  KELAPANGAN 8
95  ATTIN  BUAH TIN 8
96  AL-'ALAQ  SEGUMPAL DARAH 19
97  AL-QADAR  KEMULIAAN 5
98  AL-BAYYINAH  BUKTI 8
99  AZZILZAL  KEGONCANGAN 8
100  AL-'ADIYAT  KUDA PERANG YANG BERLARI KENCANG 11
101  AL-QARI'AH  HARI KIAMAT 11
102  ATTAKATSUR  BERMEGAH-MEGAHAN 8
103  AL-'ASHR  WAKTU 3
104  AL-HUMAZAH  PENGUMPAT 9
105  AL-FIL  GAJAH 5
106  QURAISY  SUKU QURAISY 4
107  AL-MA'UN  BARANG-BARANG YANG BERGUNA 7
108  AL-KAUTSAR  NIKMAT YANG BESAR 3
109  AL-KAFIRUN  ORANG-ORANG KAFIR 6
110  ANNASHRU  PERTOLONGAN 3
111  ALLAHAB  GEJOLAK API 5
112  AL-IKHLASH  PEMURNIAN KEESAAN ALLAH 4
113  AL-FALAQ  WAKTU SHUBUH 5
114  ANNAS  MANUSIA 6
STATISTIK JUMLAH TOTAL AYAT 6236
JUMLAH SURAT DENGAN AYAT LEBIH DARI 120 11
JUMLAH SURAT DENGAN AYAT ANTARA 80 SAMPAI 120 16
JUMLAH SURAT DENGAN AYAT KURANG DARI 80 87
Sumber

2 Fungsi GROUP BY dan HAVING untuk Pengelompokkan Data di MySQL

Database MySQL merupakan salah perangkat lunak untuk penyimpanan data yang sangat populer untuk saat ini. Salah satu alasan banyak orang memilih MySQL adalah keunggulan dan kelengkapan fitur-fitur di dalamnya. Salah satu fitur dari MySQL adalah dukungan terhadap berbagai fungsi agregat GROUP BY dan HAVING untuk pengelompokkan data. Pada tutorial ini dijelaskan mengenai fitur GROUP BY dan HAVING tersebut, disertai contohnya.

Sebelum mencoba fungsi GROUP BY dan HAVING, perlu diketahui bahwa keduanya sangat berkaitan dengan fungsi agregat. Fungsi agregat merupakan kelompok fungsi di MySQL yang memungkinkan untuk memiliki parameter berupa kelompok data. Sebagai contoh dari fungsi agregat adalah fungsi SUM() yang akan menjumlahkan seluruh nilai yang menjadi parameternya. Contoh lain adalah fungsi MAX() yang akan menghasilkan nilai terbesar dari keseluruhan nilai yang menjadi parameternya.

Berikut ini beberapa fungsi agregat yang ada di MySQL:

Name Description
AVG() Return the average value of the argument
BIT_AND() Return bitwise and
BIT_OR() Return bitwise or
BIT_XOR() Return bitwise xor
COUNT(DISTINCT) Return the count of a number of different values
COUNT() Return a count of the number of rows returned
GROUP_CONCAT() Return a concatenated string
MAX() Return the maximum value
MIN() Return the minimum value
STD() Return the population standard deviation
STDDEV() Return the population standard deviation
SUM() Return the sum
VARIANCE() Return the population standard variance

Untuk memudahkan pemahaman bagaimana fungsi GROUP BY dan HAVING digunakan, kita akan menggunakan contoh data di MySQL. Buatlah tabel nilai yang menyimpan data nilai mahasiswa, strukturnya sebagai berikut:

Column Type Comment
nim varchar(10)  Nim mahasiswa
nama varchar(30)  Nama mahasiswa
matkul varchar(20)  Nama Matakuliah
nilai int(3)  Nilai mahasiswa

Selanjutnya isi tabel tersebut dengan beberapa data. Bagi yang ga mau repot bikin, ini sudah disiapkan perintah untuk bikin tabel dan mengisi datanya dalam bentuk file .sql. Silahkan download nilai.sql.

Berikut ini beberapa contoh persoalan yang dapat diselesaikan dengan fungsi GROUP BY dan HAVING.

Contoh Kasus #1. Tampilkan rata-rata nilai dari seluruh mahasiswa.

Untuk menyelesaikannya tidak perlu menggunakan GROUP BY karena yang diminta adalah seluruh mahasiswa. Untuk mendapatkan rata-rata nilai, kita dapat menggunakan fungsi AVG(). Berikut ini query untuk kasus tersebut.

SELECT AVG(nilai) as rata_rata FROM nilai;

Berikut ini hasil dari query di atas.

+-----------+
| rata_rata |
+-----------+
| 79.6800   |
+-----------+
Contoh Kasus #2. Tampilkan rata-rata nilai untuk setiap mahasiswa

Karena yang diminta adalah rata-rata untuk setiap mahasiswa, maka kita harus menggunakan GROUP BY untuk mengelompokkan rata-rata berdasarkan field tertentu. Query dan hasilnya kurang lebih sebagai berikut:

SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim;
+------------+------+-----------+
| nim        | nama | rata_rata |
+------------+------+-----------+
| 0911500101 | ADI  | 82.0000   |
| 0911500102 | IDA  | 81.0000   |
| 0911500103 | EDI  | 80.6000   |
| 0911500104 | INA  | 70.4000   |
| 0911500105 | ANI  | 84.4000   |
+------------+------+-----------+
Contoh Kasus #3. Tampilkan nilai terbesar dan terkecil untuk setiap mahasiswa.

Query untuk menyelesaikan kasus ketiga di atas sebenarnya sama saja dengan yang sebelumnya. Perbedaannya hanya pada fungsi agregat yang digunakan untuk menampilkan nilai terbesar dan terkecil yaitu MAX() dan MIN(). Berikut ini query dan hasil query-nya.

SELECT nim, nama, MAX(nilai) as terbesar, MIN(nilai) as terkecil FROM nilai GROUP BY nim;
+------------+------+----------+----------+
| nim        | nama | terbesar | terkecil |
+------------+------+----------+----------+
| 0911500101 | ADI  | 90       | 65       |
| 0911500102 | IDA  | 90       | 70       |
| 0911500103 | EDI  | 88       | 60       |
| 0911500104 | INA  | 80       | 50       |
| 0911500105 | ANI  | 92       | 68       |
+------------+------+----------+----------+
Contoh Kasus #4. Tampilkan rata-rata nilai yang didapat mahasiswa untuk setiap matakuliah

Cukup jelas bahwa pada kasus ini, mirip dengan kasus kedua di atas, namun pengelompokkan data berdasarkan matakuliah, bukan berdasarkan mahasiswa. Querynya kurang lebih sebagai berikut:

SELECT matkul, AVG(nilai) as rata_rata FROM nilai GROUP BY matkul;
+-----------------+-----------+
| matkul          | rata_rata |
+-----------------+-----------+
| ALGORITMA       | 84.4000   |
| KALKULUS        | 62.6000   |
| PBO             | 82.0000   |
| PEMROGRAMAN WEB | 86.4000   |
| PTI             | 83.0000   |
+-----------------+-----------+
Contoh Kasus #5. Tampilkan rata-rata nilai untuk setiap mahasiswa, yang rata-rata nilai lebih besar dari 80

Perhatikan kembali kasus kedua di atas. Hasil query menunjukkan bahwa untuk setiap mahasiswa akan ditampilkan nilai rata-rata yang diperoleh. Nah pada kasus ke-5 ini yang ingin ditampilkan adalah hanya mahasiswa yang nilainya lebih dari 80. Artinya untuk mahasiswa atas nama “INA” yang mendapat nilai rata-rata 70.4 tidak boleh ditampilkan. Solusinya adalah dengan menambahkan kondisi pada query kasus kedua diatas. Nah, jika kondisi suatu query terkait dengan fungsi agregat, maka kita tidak bisa menggunakan kondisi WHERE. Penggunaan WHERE pada fungsi agregat akan menyebabkan error.

Cobalah query berikut ini.

SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim WHERE AVG(nilai)>80;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE AVG(nilai)>80' at line 1

Lalu bagaimana solusinya jika tidak bisa menggunakan WHERE ? MySQL (dan juga database yang lainnya) memiliki struktur kondisi khusus terkait fungsi agregat yaitu HAVING. Jika query diatas diperbaiki dan menggunakan HAVING, maka hasilnya sebagai berikut:

SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim HAVING AVG(nilai)>80;
+------------+------+-----------+
| nim        | nama | rata_rata |
+------------+------+-----------+
| 0911500101 | ADI  | 82.0000   |
| 0911500102 | IDA  | 81.0000   |
| 0911500103 | EDI  | 80.6000   |
| 0911500105 | ANI  | 84.4000   |
+------------+------+-----------+

Gampang kan?

Silahkan Anda berkreasi berdasarkan contoh-contoh di atas. Semoga tutorial ini bermanfaat untuk kita semua. Amin

 

Sumber

1 7 Variasi Perintah INSERT di MySQL yang Sering Terlupakan

Data Manipulation Language (DML) merupakan bagian dari perintah SQL (Structured Query Language) yang terdiri dari berbagai perintah untuk memanipulasi data di dalam suatu database. Empat perintah utama yang termasuk dalam perintah DML adalah perintah SELECT, INSERT, UPDATE dan DELETE. MySQL sebagai salah satu software database terkemuka tentunya mendukung keempat perintah DML tersebut dengan sangat baik. Di dalam tutorial kali ini, akan dibahas mengenai perintah INSERT dimana ternyata cukup banyak variasi perintah INSERT di MySQL yang sering terlupakan (terabaikan), namun sebenarnya sangat berguna.

Selain bentuk dasar perintah INSERT, setidaknya ada 7 (tujuh) variasi bentuk perintah INSERT yang  suatu saat akan berguna untuk Anda. Berikut ini ketujuh perintah INSERT tersebut yang selanjutnya akan dijelaskan satu per satu.

  1. INSERT INTO (field1, field2, …) VALUES (…)
  2. INSERT … SELECT …
  3. INSERT IGNORE …
  4. INSERT DELAYED …
  5. INSERT LOW PRIORITY | HIGH PRIORITY …
  6. INSERT … ON DUPLICATE KEY UPDATE
  7. REPLACE INTO …

Untuk mempermudah pemahaman terhadap tutorial ini, maka seluruh contoh yang disajikan akan mengacu pada struktur tabel sebagai berikut:

Nama tabel: tblmhs

mysql> desc tblmhs;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| nim      | varchar(10) | NO   | PRI | NULL    |       |
| nama     | varchar(40) | NO   |     | NULL    |       |
| alamat   | text        | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

Di sini tidak dibahas mengenai bagaimana membuat struktur tabel di atas.

Bentuk Dasar Perintah INSERT

Sebelum membahas variasi dari perintah INSERT, alangkah baiknya kita mengingat kembali mengenai bagaimana bentuk dasar dari perintah INSERT tersebut. Perintah INSERT pada dasarnya merupakan perintah yang dapat digunakan untuk memasukkan data (record) ke sebuah tabel di database. Bentuk perintah ini cukup sederhana. Berikut ini contoh sederhana perintah INSERT untuk memasukkan data seorang mahasiswa dengan nim ‘1011500100‘, nama ‘ACHMAD SOLICHIN‘ dan alamat di JAKARTA SELATAN.

INSERT INTO tblmhs VALUES('1011500100', 'ACHMAD SOLICHIN', 'JAKARTA SELATAN');

Hal yang penting dari contoh perintah INSERT di atas adalah urutan dari nilai data yang akan ditambahkan harus sama dengan urutan field (kolom) di tabel. Urutan field di dalam tabel tblmhs adalah nim, nama lalu alamat, sehingga waktu melakukan INSERT urutan seharusnya juga nim, nama dan alamat. Jika urutan tidak sesuai, maka data yang dimasukkan bisa jadi menempati kolom yang salah juga

#1. INSERT INTO tabel (field1, field2) VALUES …

Pada bentuk dasar perintah INSERT di atas, kita harus menyebutkan nilai dari seluruh kolom. Jadi jumlah nilai yang akan ditambahkan harus sesuai dengan jumlah kolom dalam tabel. Namun ada kalanya kita hanya ingin menambahkan sebagian dari kolom tabel, jadi tidak semua kolom kita masukkan. Jika demikian, variasi perintah INSERT yang pertama ini tentu tepat untuk digunakan. Kita menyebutkan kolom-kolom yang akan di-insert-kan di belakang nama tabel. Urutannya juga tidak harus sesuai dengan urutan di dalam struktur tabel. Sebagai contoh, kita akan memasukkan data nim dan nama seorang mahasiswa, tanpa memasukkan alamatnya. Urutan fieldnya sengaja dibalik, nama terlebih dahulu baru nim. Berikut perintahnya:

INSERT INTO tblmhs (nama, nim) VALUES('CHOTIMATUL MUSYAROFAH', '1012501983');

Terlihat pada contoh di atas bahwa urutan yang harus disesuaikan adalah urutan field yang berada di belakang nama tabel ‘tblmhs’ dan urutan data (values) yang akan di-insert-kan.

#2. INSERT … SELECT …

Ada kalanya kita ingin memindahkan atau meng-copy sejumlah data yang berada pada suatu tabel ke tabel yang lainnya. Singkatnya copy data antar tabel. Untuk menyelesaikan permasalahan tersebut, tentunya sangat kurang efektif jika kita harus melakukan insert satu per satu. Untuk melakukan copy record antar tabel, akan lebih efektif jika kita menggunakan bentuk perintah “INSERT … SELECT …” yang menggabungkan proses insert (menambahkan data) dan select (mengambil data). Sebagai contoh, kita ingin memindahkan data nim dan nama mahasiswa yang berada di tabel tblpendaftaran ke tabel tblmhs, berikut ini perintahnya:

INSERT INTO tblmhs(nim, nama) SELECT nim, nama FROM tblpendaftaran;

#3. INSERT IGNORE

Penulis pernah membuat suatu absensi pada suatu perusahaan dimana data absensi diimport dari suatu file teks hasil keluaran dari mesin finger. Setelah diimport, data absensi karyawan akan diperiksa dan dilengkapi oleh staf HRD. Proses import dari teks file dapat terjadi berulang-ulang sehingga diperlukan mekanisme agar pada saat proses import data yang mungkin sudah diedit oleh staf HRD tidak tertimpa. Jadi intinya, saat proses import, harus diperiksa apakah data absensi yang akan dimasukkan ke tabel sudah ada atau belum. Jika sudah ada, maka tidak perlu dilakukan insert, namun jika tidak ada maka lakukan proses import. Awalnya terpikir untuk melakukan pengecekan data ke database terlebih dahulu sebelum insert, namun dari isi efektivitas tentu hal ini tidak baik, apalagi jika datanya cukup banyak. Beruntung kemudian ketemu bentuk perintah INSERT IGNORE … di MySQL. Dengan perintah ini, permasalahan tersebut dapat terselesaikan hanya dengan satu perintah.

Dalam contoh berikut ini, akan melakukan insert data ke tabel tblmhs hanya jika data nim belum ada di tabel. Pemeriksaan data didasarkan pada field yang menjadi primary key. Jadi jika terjadi duplikasi primary key maka data akan diabaikan (ignored).

INSERT IGNORE INTO tblmhs VALUES('1012501983','BUNGA', 'TANGERANG');

#4. INSERT DELAYED

Bentuk perintah INSERT DELAYED … merupakan bentuk perintah yang mungkin akan kita perlukan saat membuat suatu aplikasi transaksional dengan beberapa pengguna dalam satu waktu. Dengan tambahan perintah “DELAYED” maka proses menambahkan data akan ditangguhkan hingga tidak ada user yang mengakses tabel. Contoh berikut ini menggambarkan bagaimana perintah tersebut:

INSERT DELAYED INTO tblmhs (nim, nama) VALUES ('1011500121', 'LINTANG', 'TANGERANG');

Penjelasan lebih lanjut mengenai perintah ini dapat dilihat di manual MySQL.

#5. INSERT LOW PRIORITY | HIGH PRIORITY

Tambahan perintah LOW PRIORITY atau HIGH PRIORITY dibelakang perintah INSERT dapat digunakan untuk mengatur prioritas dari perintah INSERT yang akan dijalankan. Perintah dengan prioritas lebih tinggi tentu akan didahulukan untuk dijalankan. Sama seperti bentuk perintah INSERT DELAYED, perintah ini juga berguna saat kita “bermain” dengan proses transaksional. Berikut ini contoh sederhananya:

INSERT INTO tblmhs VALUES('1111500111', 'INDAH', 'JAKARTA');

#6. INSERT … ON DUPLICATE KEY UPDATE

Variasi perintah INSERT ini mungkin suatu saat akan kita perlukan. Misalnya pada kasus dimana pada proses insert sejumlah data, jika datanya sudah ada, dalam arti terjadi duplikasi primary key, maka lakukan perintah update untuk kolom tertentu. Sebagai contoh, kita akan melakukan penambahan data ke tblmhs, jika datanya sudah ada, maka update field alamat dengan alamat yang baru. Berikut ini perintahnya:

INSERT INTO tblmhs (nim, nama, alamat) VALUES('1111500111', 'WULAN', 'MALANG') ON DUPLICATE KEY UPDATE alamat='JAKARTA';

Untuk penjelasan lebih rinci terkait perintah ini dapat dilihat di dokumentasi MySQL (http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html).

#7. REPLACE INTO …

Penulis sangat senang dengan adanya bentuk perintah REPLACE di MySQL ini. Perintah ini sangatlah membantu. Contohnya saat penulis ingin melakukan penambahan data secara massal seperti pada kasus import absensi karyawan di atas. Jika pada proses import, kita menginginkan agar data selalu up to date, maka jika data sudah ada harus dilakukan proses update. Perintah REPLACE INTO berperan untuk melakukan dua tugas sekaligus, yaitu INSERT jika datanya belum ada dan UPDATE jika datanya sudah ada. Berikut ini contoh perintah ini:

REPLACE INTO tblmhs VALUES('1011500100', 'ACHMAD SOLICHIN', 'TANGERANG SELATAN');

Demikian ketujuh bentuk variasi perintah INSERT di dalam MySQL yang sering terlupakan namun seringkali kita butuhkan. Semoga postingan ini bermanfaat untuk kita semua. Mari terus semangat berbagi demi Indonesia!

 

Sumber

6 7 Rahasia CSS yang (mungkin) belum anda ketahui dan wajib diketahui

CSS pasti sudah menjadi hal yang wajib dipelajari jika anda ingin membuat website. Sekarang saya akan memberitahu rahasia CSS yang mungkin belum anda ketahui dan wajib diketahui, karena dapat memperkecil ukuran file CSS anda. Inilah dia rahasia CSS yang (mungkin) belum anda ketahui:

1. Memasang 2 class pada 1 tag HTML

Hei, apa anda tau bahwa kita bisa memasang 2 class untuk satu tag HTML? Jawabannya bisa.. Jika kita biasanya hanya membuat kode seperti ini:

<p class="content">

Maka jika kita ingin bahwa <p> mengikuti dua aturan class yang berbeda maka kita cukup mengubahnya menjadi:

<p class="content isi">

Jadi jika anda memiliki class content dan isi maka kedua aturan pada class tersebut akan dimasukkan kedalam <p>. Ingat hanya 2 tidak bisa lebih dan dipisahkan dengan spasi.

2. Hilangkan px untuk nilai 0

Oke, katakanlah anda memiliki kode CSS seperti ini:

.box {
border-top:10px;
border-left:0px;
padding:0px;
}

px disini berarti satuannya pixel dan kita harus menuliskannya, tetapi ternyata ada pengecualian untuk angka 0 (angka 0 saja) jadi kita bisa menuliskannya seperti ini:

.box {
border-top:10px;
border-left:0;
padding:0;
}

Ya, angka 0 tidak perlu menggunakan px, ini berarti kita memperkecil sedikit ukuran file CSS kita :)

3. Gunakanlah selalu shorthand

Apa sih shorthand? Shorthand merupakan aturan di CSS untuk menyingkat kode CSS anda. margin, dan padding merupakan contoh yang bisa kita singkat. Perhatikan contoh CSS berikut ini:

.box {
border-top:10px;
border-left:0;
border-right:20px;
border-bottom:15px;
padding-top:0;
padding-bottom:10px;
padding-left:12px;
padding-right:9px;
}

Dapat anda singkat menjadi:

.box {
border:10px 20px 15px 0;
padding:0 9px 10px 12px;
}

Lihat berapa banyak yang bisa kita hemat :) yang paling penting adalah urutannya dari kiri ke kanan dimulai dari posisi atas kemudian bergerak searah jarum jam.

4. Shorthand pada warna

Yap, warna pun bisa kita singkat, jika kita memiliki warna putih maka kita menggunakan #ffffff bisa disingkat menjadi #fff. Demikian juga jika kita memiliki warna #111111 menjadi #111. Tapi kita tidak bisa menyingkat warna #abcdef. Harus warna yang memiliki angka hexa yang sama.

5. Shorthand pada font

Siapa bilang font tidak bisa disingkat? Jika anda memiliki kode seperti ini:

.box {
font-style: italic;
font-weight: bold;
font-variant: small-caps;
font-size: 1em;
line-height: 1.5em;
font-family: verdana,sans-serif;
}

Dapat anda singkat menjadi 1 baris: font: bold italic small-caps 1em/1.5em verdana,sans-serif;
Perlu diingat bahwa untuk menyingkat font anda wajib mengatur font-size dan font-family yang diletakkan paling akhir. Untuk yang lainnya tidak wajib ada.

6. Menyingkat yang sudah disingkat

Kita bisa menyingkat yang sudah disingkat. Sudah singkat tapi masih bisa disingkat lagi? Nggak masuk akal.. Bisa. Perhatikan contoh berikut ini:

.box {
border-top:10px;
border-left:20px;
border-right:20px;
border-bottom:10px;
padding-top:0;
padding-bottom:0;
padding-left:15px;
padding-right:15px;
}

Oke, jika kode diatas disingkat maka hasilnya seperti ini:

.box {
border:10px 20px 10px 20px;
padding:0 15px 0 15px;
}

Dan karena nilai atas dan bawah serta kiri dan kanan nya sama. Maka bisa disingkat lagi menjadi:

.box {
border:10px 20px;
padding:0 15px;
}

Sip kan.. Ingat ini hanya berlaku jika nilai atas dan bawah serta kiri dan kanan sama.

7. Menengahkan objek

Anda ingin menengahkan suatu objek, misal images atau div. Gampang gunakan saja auto pada margin. Perhatikan contoh berikut ini:

#content{
width: 600px;
margin: 0 auto;
} 

auto disini berarti kita membiarkan CSS mendeteksi lebar kiri dan kanan secara otomatis berdasarkan lebar layar. Maka otomatis hasilnya akan ketengah. Tidak berlaku jika kita ingin menengahkan secara vertikal.

Bagaimana menarik bukan? itu baru sebagian kecil, dan masih banyak lagi rahasia dan trik CSS yang perlu diketahui.

Sumber

11 Ajax Sederhana Menggunakan JQuery

AJAX adalah sebuah teknik pemrograman yang memungkinkan kita melakukan pertukaran data dengan server di belakang layar, sehingga halaman web tidak harus dipanggil ulang hanya untuk mengganti sebagian kecil dari isi halaman. Dengan framework jQuery, proses development ajax bisa menjadi lebih mudah. Salah satu fungsi di jQuery untuk mempermudah penggunaan ajax adalah fungsi load(), yang memiliki 3 buah parameter sbb:

load(url, params, callback)

    keterangan:
  • url (String): URL dari file html yang akan di load
  • params (Object): Data yang akan dikirimkan ke server (optional)
  • callback (Function): Fungsi yang akan dijalankan ketika data berhasil di load (optional)
Contoh Penggunaan

$(function(){
     $("#menu a").click(function() {
          url = $(this).attr("href");
          $("#container").load(url);
          return false;
     });
     $(document).ajaxStart(function(){
          $("#loading").fadeIn();
          $("#container").fadeIn(function(){
               $(this).css({"opacity":"0.1"});
          });
     });
     $(document).ajaxComplete(function(){
          $("#loading").hide();
          $("#container").css({"opacity":"1"});
     });
});

    keterangan:
  • #menu a, adalah link berupa elemen a didalam id menu yang akan di klik
  • url = $(this).attr('href'); adalah isi variabel url yang merupakan isi dari atribut link berupa href
  • $('#container').load(url); adalah funsi untuk menampilkan content dari url yang di klik ke elemen ber-id container
Untuk mempercantik tampilan loading sebelum data ajax terload semua, saya menambahkan fungsi tertentu ketika ajax start dan ajax complete.

Untuk lebih jelasnya silakan lihat demo Demo Atau Anda bisa mendownload source code nya di sini: Download referensi: gawibowo

2 Instalasi Yaz Extension untuk PHP di XAMPP

Download paket yang dibutuhkan di sini

Extract, paket tersebut.
Akan ada dua folder dalam paket tersebut.
copy semua isi folder bin ke C:\xampp\apache\bin
copy isi folder ext ke C:\xampp\php\ext

Edit file C:\xampp\php\php.ini lalu tambahkan text "extension=php_yaz.dll" pada bagian extension.



Restart service apache.

1 Install Postfix (SMTP-AUTH and TLS) Courier-IMAPCourier-IMAP-SSL (for IMAPs on port 993) and Courier-POP3Courier-POP3-SSL (for POP3s on port 995)

In order to install Postfix with SMTP-AUTH and TLS do the following steps:
aptitude install postfix libsasl2-2 sasl2-bin libsasl2-modules procmail

You will be asked two questions. Answer as follows:
General type of mail configuration: <-- Internet Site
System mail name: <-- server1.example.com

Then run
dpkg-reconfigure postfix

Again, you'll be asked some questions:
General type of mail configuration: <-- Internet Site
System mail name: <-- server1.example.com
Root and postmaster mail recipient: <-- [blank]
Other destinations to accept mail for (blank for none): <-- server1.example.com, localhost.example.com, localhost.localdomain, localhost
Force synchronous updates on mail queue? <-- No
Local networks: <-- 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
Use procmail for local delivery? <-- Yes
Mailbox size limit (bytes): <-- 0
Local address extension character: <-- +
Internet protocols to use: <-- all

Next, do this:
postconf -e 'smtpd_sasl_local_domain ='
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'smtpd_sasl_security_options = noanonymous'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'
postconf -e 'inet_interfaces = all'
echo 'pwcheck_method: saslauthd' >> /etc/postfix/sasl/smtpd.conf
echo 'mech_list: plain login' >> /etc/postfix/sasl/smtpd.conf

Afterwards we create the certificates for TLS:
mkdir /etc/postfix/ssl
cd /etc/postfix/ssl/
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024

chmod 600 smtpd.key
openssl req -new -key smtpd.key -out smtpd.csr

openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt

openssl rsa -in smtpd.key -out smtpd.key.unencrypted

mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

Next we configure Postfix for TLS (make sure that you use the correct hostname for myhostname):
postconf -e 'myhostname = server1.example.com'

postconf -e 'smtpd_tls_auth_only = no'
postconf -e 'smtp_use_tls = yes'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtp_tls_note_starttls_offer = yes'
postconf -e 'smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt'
postconf -e 'smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem'
postconf -e 'smtpd_tls_loglevel = 1'
postconf -e 'smtpd_tls_received_header = yes'
postconf -e 'smtpd_tls_session_cache_timeout = 3600s'
postconf -e 'tls_random_source = dev:/dev/urandom'

The file /etc/postfix/main.cf should now look like this:
cat /etc/postfix/main.cf

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = server1.example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = server1.example.com, localhost.example.com, localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
smtpd_sasl_local_domain =
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtpd_tls_auth_only = no
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Authentication will be done by saslauthd. We have to change a few things to make it work properly. Because Postfix runs chrooted in /var/spool/postfix we have to do the following:
mkdir -p /var/spool/postfix/var/run/saslauthd

Now we have to edit /etc/default/saslauthd in order to activate saslauthd. Set START to yes and change the line OPTIONS="-c -m /var/run/saslauthd" to OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r":
vi /etc/default/saslauthd

# Settings for saslauthd daemon
# Please read /usr/share/doc/sasl2-bin/README.Debian for details.
#

# Should saslauthd run automatically on startup? (default: no)
START=yes

# Description of this saslauthd instance. Recommended.
# (suggestion: SASL Authentication Daemon)
DESC="SASL Authentication Daemon"

# Short name of this saslauthd instance. Strongly recommended.
# (suggestion: saslauthd)
NAME="saslauthd"

# Which authentication mechanisms should saslauthd use? (default: pam)
#
# Available options in this Debian package:
# getpwent  -- use the getpwent() library function
# kerberos5 -- use Kerberos 5
# pam       -- use PAM
# rimap     -- use a remote IMAP server
# shadow    -- use the local shadow password file
# sasldb    -- use the local sasldb database file
# ldap      -- use LDAP (configuration is in /etc/saslauthd.conf)
#
# Only one option may be used at a time. See the saslauthd man page
# for more information.
#
# Example: MECHANISMS="pam"
MECHANISMS="pam"

# Additional options for this mechanism. (default: none)
# See the saslauthd man page for information about mech-specific options.
MECH_OPTIONS=""

# How many saslauthd processes should we run? (default: 5)
# A value of 0 will fork a new process for each connection.
THREADS=5

# Other options (default: -c -m /var/run/saslauthd)
# Note: You MUST specify the -m option or saslauthd won't run!
#
# WARNING: DO NOT SPECIFY THE -d OPTION.
# The -d option will cause saslauthd to run in the foreground instead of as
# a daemon. This will PREVENT YOUR SYSTEM FROM BOOTING PROPERLY. If you wish
# to run saslauthd in debug mode, please run it by hand to be safe.
#
# See /usr/share/doc/sasl2-bin/README.Debian for Debian-specific information.
# See the saslauthd man page and the output of 'saslauthd -h' for general
# information about these options.
#
# Example for postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
#OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Next add the postfix user to the sasl group (this makes sure that Postfix has the permission to access saslauthd):
adduser postfix sasl

Now restart Postfix and start saslauthd:
/etc/init.d/postfix restart
/etc/init.d/saslauthd start

To see if SMTP-AUTH and TLS work properly now run the following command:
telnet localhost 25

After you have established the connection to your Postfix mail server type
ehlo localhost

If you see the lines
250-STARTTLS

and
250-AUTH LOGIN PLAIN

everything is fine. The output on my system looks like this:
root@server1:/etc/postfix/ssl# telnet localhost 25
Trying ::1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 server1.example.com ESMTP Postfix (Ubuntu)
ehlo localhost
250-server1.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.
root@server1:/etc/postfix/ssl#

Type
quit

to return to the system's shell. Run this to install Courier-IMAP/Courier-IMAP-SSL (for IMAPs on port 993) and Courier-POP3/Courier-POP3-SSL (for POP3s on port 995):
aptitude install courier-authdaemon courier-base courier-imap courier-imap-ssl courier-pop courier-pop-ssl courier-ssl gamin libgamin0 libglib2.0-0

You will be asked two questions:
Create directories for web-based administration? <-- No
SSL certificate required <-- Ok

During the installation, the SSL certificates for IMAP-SSL and POP3-SSL are created with the hostname localhost. To change this to the correct hostname (server1.example.com in this tutorial), delete the certificates...
cd /etc/courier
rm -f /etc/courier/imapd.pem
rm -f /etc/courier/pop3d.pem

... and modify the following two files; replace CN=localhost with CN=server1.example.com (you can also modify the other values, if necessary):
vi /etc/courier/imapd.cnf

[...]
CN=server1.example.com
[...]

vi /etc/courier/pop3d.cnf

[...]
CN=server1.example.com
[...]

Then recreate the certificates...
mkimapdcert
mkpop3dcert

... and restart Courier-IMAP-SSL and Courier-POP3-SSL:
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop-ssl restart

If you do not want to use ISPConfig, configure Postfix to deliver emails to a user's Maildir*:
postconf -e 'home_mailbox = Maildir/'
postconf -e 'mailbox_command ='
/etc/init.d/postfix restart

*Please note: You do not have to do this if you intend to use ISPConfig on your system as ISPConfig does the necessary configuration using procmail recipes. But please go sure to enable Maildir under Management -> Server -> Settings -> EMail in the ISPConfig web interface.

Source

2 Mail Server Menggunakan Postfix Dovecot dan Roundcube


Perenacanaan:
Mail server menggunakan OS Ubuntu 11.04 Server
Menggunakan aplikasi postfix, dovecot, sasl authentication, smtp auth, tls, dan roundcube
Web Server menggunakan apache2 serta dukungan php5 dan mysql-server
Dns Server menggunakan bind9
Ip Address Server 192.168.1.1/24
Domain yang digunakan adalah erwin.com
Domain untuk mail server adalah mail.erwin.com
Sertifikat menggunakan default bawaan ubuntu (snake-oil)
Diasumsikan user yang digunakan untuk konfigurasi adalah "erwinheldy" dengan password "jaringan"

Install paket-paket yang dibutuhkan

apt-get install bind9 apache2 dovecot-postfix mysql-server php5 php5-mysql php5-mcrypt php-pear sasl2-bin libsasl2-modules libsasl2-2

Saat proses instalasi ada beberapa konfigurasi yang harus diisi yaitu

mysql root password = password untuk user root
system mail name = nama sistem mail yang digunakan (erwin.com) yang nantinya digunakan untuk domain pada mail (user@erwin.com)

Buat konfigurasi untuk dns server

cd /etc/bind
cp named.conf.default-zones named.conf.local
cp db.local db.erwin.com
cp db.127 db.192

Edit konfigurasi named.conf.local

nano named.conf.local
zone "erwin.com" {
        type master;
        file "/etc/bind/db.erwin.com";
};

zone "1.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/db.192";
};

Edit konfigurasi db.erwin.com

nano db.erwin.com
;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     ns.erwin.com. root.erwin.com. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.erwin.com.
@       IN      A       192.168.1.1
@       IN      AAAA    ::1
ns      IN      A       192.168.1.1
        IN      MX 1    mail.erwin.com
mail    IN      A       192.168.1.1
www     IN      CNAME   @

Edit konfigurasi db.192

nano db.192
;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@       IN      SOA     ns.erwin.com. root.ns.erwin.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.erwin.com.
1       IN      PTR     ns.erwin.com.

Restart bind9

invoke-rc.d bind9 restart

Edit konfigurasi resolv agar mengarahkan dns server ke ip 192.168.1.1

nano /etc/resolv.conf
nameserver 192.168.1.1

Lakukan pengujian dns server menggunakan nslookup

nslookup mail.erwin.com

Pastikan hasil nslookup seperti berikut

Server:         192.168.1.1
Address:        192.168.1.1#53

Name:   mail.erwin.com
Address: 192.168.1.1

Tahap berikutnya adalah konfigurasi postfix

dpkg-reconfigure postfix

Tahapan konfigurasi yang harus diisi yaitu

Ok
Internet Site
erwin.com
erwinheldy       --> keterangan: salah satu username yang digunakan
OK
No
127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.1.0/24         --> keterangan: tambahkan network address
0
+
all

Ubah beberapa konfigurasi postfix di file main.cf

nano /etc/postfix/main.cf

Baris yang harus diubah antara lain

smtpd_sasl_path = private/dovecot-auth
menjadi
smtpd_sasl_path = private/auth-client

smtpd_tls_auth_only = yes
menjadi
smtpd_tls_auth_only = no

Edit konfigurasi dovecot

nano /etc/dovecot/dovecot.conf

Beberapa baris yang harus diubah antara lain

socket listen {
    #master {
      # Master socket provides access to userdb information. It's typically
      # used to give Dovecot's local delivery agent access to userdb so it
      # can find mailbox locations.
      #path = /var/run/dovecot/auth-master
      #mode = 0600
      # Default user/group is the one who started dovecot-auth (root)
      #user =
      #group =
    #}
    client {
      # The client socket is generally safe to export to everyone. Typical use
      # is to export it to your SMTP server so it can do SMTP AUTH lookups
      # using it.
      path = /var/spool/postfix/private/auth-client
      mode = 0660
      user = postfix
      group = postfix
    }
  }
mechanisms = plain
menjadi
mechanisms = plain login

Edit konfigurasi sasl

nano /etc/default/saslauthd
START=no
menjadi
START=yes

Restart konfigurasi

invoke-rc.d postfix restart
invoke-rc.d dovecot restart
invoke-rc.d saslauthd restart

Untuk melihat jika SMTP-AUTH dan TLS bekerja dengan semestinya, jalankan perintah berikut

telnet mail.erwin.com 25

Setelah terlihat status connected ke postfix mail server, ketik

ehlo mail.erwin.com

Jika terlihat baris berikut diantara yang lainnya, berarti semuanya telah bekerja dengan semestinya. ketik quit untuk keluar

250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME

Selanjutnya proses instalasi roundcube, diasumsikan paket tarbal roundcube telah ada di folder /usr/share

cd /usr/share

Extract Roundcube

tar xzf roundcube_0.7.1.tar.gz

Selanjutnya rename folder untuk memudahkan, ganti kepemilikan, dan hak akses untuk roundcube

mv roundcube_0.7.1/ roundcube/
chown -R www-data:www-data roundcube/
chmod -R 755 roundcube/
chmod -R 777 roundcube/logs/
chmod -R 777 roundcube/temp/

Masuk ke mysql console

mysql -u root -p

Buat database untuk roundcube, dan berikan privileges untuk user (dicontohkan user:erwinheldy dengan paswd:jaringan)

create database roundcubemail;
grant all privileges on roundcubemail.* to erwinheldy@localhost identified by 'jaringan';
flush privileges;
exit

Import tabel sql ke database

mysql -u erwinheldy -p roundcubemail < roundcube/SQL/mysql.initial.sql

Edit konfigurasi apache

nano /etc/apache2/sites-available/default

Tambahkan baris berikut di paling bawah

<VirtualHost *:80>
    ServerName mail.erwin.com
    DocumentRoot /usr/share/roundcube
    <Directory "/usr/share/roundcube/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride All
        Order deny,allow
        Allow from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</Virtualhost>

Aktifkan modul rewrite

a2enmod rewrite

Restart apache

invoke-rc.d apache2 restart

Akses web

http://mail.erwin.com/installer
Start Installation
Next
product_name        = Erwin Webmail
database username   = erwinheldy
database password   = jaringan
default_host        = erwin.com
smtp_user/smtp_pass = erwinheldy jaringan
checklist           "Use the current IMAP username and password for SMTP authentication"
language            = en_US
checklist           "If preview pane is enabled"
Next>>

Masuk ke folder konfig roundcube

cd roundcube/config

Ketikkan perintah berikut

cp main.inc.php.dist main.inc.php
cp db.inc.php.dist db.inc.php
echo "" > main.inc.php
echo "" > db.inc.php

Edit file main.inc.php lalu copy paste script php yang ada di web sesuai dengan nama file-nya

nano main.inc.php

Edit juga file db.inc.php lalu copy paste script php yang ada di web sesuai dengan nama file-nya

nano db.inc.php

Klik CONTINUE

Instalasi Selesai, hapus folder installer pada roundcube

rm -rf /usr/share/roundcube/installer/

Masuk ke

http://mail.erwin.com

Jika berhasil, maka akan muncul tampilan login roundcube, login dengan username: erwinheldy password: jaringan

Tambahkan folder melalui Settings --> Folders, Klik tanda plus di pojok kiri bawah

Masukkan Folder Name sebagai berikut satu per satu
Drafts
Junk
Trash

Pengujian terakhir yaitu mengirim email ke akun sendiri yaitu ke erwinheldy@erwin.com dari roundcube

Periksa log untuk meyakinkan bahwa proses autentikasi dilakukan dengan secured

tail -f /var/log/mail.log
Feb  1 18:58:54 server dovecot: imap-login: Login: user=, method=PLAIN, rip=192.168.1.1, lip=192.168.1.1, secured
Feb  1 18:58:54 server dovecot: IMAP(erwinheldy): Disconnected: Logged out bytes=91/764

Periksa juga log untuk error log. Jika tidak ada respon maka konfigurasi tidak mengalami error

tail -f /var/log/mail.err

14 Tutorial Membuat Halaman Login Sederhana Yang Aman

Kali ini saya akan memberikan contoh penggunaan database, session, dan enkripsi MD5 untuk menjadikannya sebagai halaman login yang cukup aman.

Kebutuhan:
- Webserver dengan dukungan PHP
- Myslq Database Server

Secara sederhana, cara kerjanya adalah sbb:
- Ketika user memasukkan username dan password-nya, maka yang pertama kali dilakukan adalah mengeceknya dalam database apakah username tersebut telah terdaftar.
- Jika telah terdaftar dan berhasil melakukan login, maka sang user akan diberi sebuah session yang diambil dari usernamenya
- Jika kesemuanya tidak sesuai maka sang user akan diredirect ke halaman login.php, sehingga terlihat seperti diam ditempat.

Pertama-tama kita buat databasenya

create database coba;
use coba;
CREATE TABLE IF NOT EXISTS `users` (
  `username` varchar(20) NOT NULL,
  `password` varchar(200) NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



selanjutnya kita buat file-file php-nya

config.php

<?php 
//membuat koneksi ke database
mysql_connect("localhost", "root", "admin");

//localhost = nama server-nya
//root  = user mysql
//admin  = password user root
 
//memilih database
mysql_select_db("coba");
?>


login.php

<?php 
//memulai session
session_start(); 

//cek adanya session, jika session sudah ada maka diarahkan ke index.php
if (ISSET($_SESSION['username'])){
header("location: index.php");
}
?>


<form method="post" action="cek.php">
<pre>Username <input name="username" type="text">
Password <input name="password" type="password">
  <input name="submit" value="Login" type="submit">

  Bukan Member? Silahkan Daftar
  <a href="signup.php">Daftar</a>
  
</pre>
</form>  


cek.php

<?php 
//memulai session
session_start(); 

//koneksi ke database
include "config.php" ; 

//mengambil data dari form
$username    = $_POST['username']; 
$password    = $_POST['password']; 

//enkripsi password dengan md5
$password_md5   = md5($password);

//cek username dan password dari database
$perintah   = "select * from  users where username='$username'&&password='$password_md5'"; 
$perintah_di_query = mysql_query($perintah); 
$ketersediaan  = mysql_num_rows($perintah_di_query); 

//Cek adanya username dan password di database dilanjutkan dengan membuat session
if ($ketersediaan >= 1 ){ 
$_SESSION['username'] = $username; 
header("location: index.php"); 
}else{
header("location: login.php"); 
}
?>


index.php

<?php 
//memulai session
session_start(); 

//cek adanya session
if (ISSET($_SESSION['username'])){
echo "Anda Login Sebagai ";
echo $_SESSION['username']; 
echo "<br><a href='logout.php'>logout</a>"; 

//jika tidak ada session
}else{
header("location: login.php");
}
?> 
<html><body>
<br><br><h2>
Home Page
<br><br></h2>
</body></html>


logout.php

<?php  
//memulai session
session_start(); 

//cek adanya session, jika session ada maka akan di unset dan dilanjutkan dengan destroy session
if(ISSET($_SESSION['username'])) { 
UNSET($_SESSION['username']); 
} 
header("location: index.php"); 
session_destroy(); 
?>


signup.php

<form method="post" action="signup_process.php">
<pre><h2>Form Pendaftaran</h2>
Username <input name="username" type="text">
Password <input name="password" type="password">
  <input name="submit" value="Daftar" type="submit">
</pre>
</form>


signup_process.php

<?php 
include "config.php";

///mengambil data dari form
$username  = $_POST['username'];
$password  = $_POST['password'];
$password_md5 = md5($password);

//cek pengisian data
if($username=='' || $password==''){
echo "Data tidak lengkap<br--><a href=signup.php>Back</a>";

//jika data sudah lengkap, dilanjutkan input data ke database
}else{
$perintah   = "insert into users values ('$username', '$password_md5')"; 
$perintah_di_query = mysql_query($perintah); 

//Jika input data berhasil, dilanjutkan dengan pemberitahuan pendaftaran berhasil
if ($perintah_di_query) {
echo "Daftar berhasil, silakan <a href='index.php'>login</a>";

//jika input data gagal, dilanjutkan dengan pemberitahuan pendaftaran gagal
}else{
echo "Daftar gagal atau username telah terdaftar silakan <a href='signup.php'>Ulangi</a> atau <a href='login.php'>Login</a>";
}
}
?>



- Pengujian dilakukan dengan membuat sebuah user dan melakukan proses login, jika berhasil maka Home Page akan tampil.

1 Security Image Menggunakan PHP

Security image adalah bentuk perlindungan terhadap suatu form dari serangan SPAM. Sebagai contoh, anda mengisi formulir pendaftaran untuk mendapatkan account tertentu dan contoh lainnya adalah pengisian kotak komentar di halaman tertentu yang menggunakan security image.

Screenshot:


----------------------------------------------------------------------------









Cara kerjanya:
- Formulir akan menampilkan security code yang di generate oleh script PHP, apabila page tersebut di refresh maka security code akan  di generate lagi sehingga berubah codenya hal ini sangat berguna sekali untuk menangkal serangan spam.
- Setelah di submit, script php akan memvalidasi data anda dan mencocok kan security code yang telah anda masukkan apabila security code tidak sama, maka proses akan di batalkan apabila security code sama, maka proses akan dilanjutkan.

Berikut file-file yang akan digunakan:
- index.html
- action.php
- captcha.php
- DoradoHeadline.ttf

File index.html

<form action="action.php" method="post">
Pesan: 

<textarea cols="50" name="message" rows="10"></textarea>



<img src="captcha.php">

Security Code: <input id="security_code" name="security_code" type="text">

<input name="submit" value="Submit" type="submit"> 
</form>


File action.php

<?php   
session_start(); 
if( isset($_POST['submit'])) { 
   if(($_SESSION['security_code'] == $_POST['security_code']) &&  
(!empty($_SESSION['security_code'])) ) { 
      // masukkan script anda jika validasi benar 
      echo 'Terimakasih Pesan anda sudah muncul
"'.$_POST['message'].'"'; 
   echo "
<a href='index.html'>kembali</a>";
   } else { 
      // masukkan script anda jika validasi salah 
      echo 'Sorry, anda memasukkan security code yang salah
'; 
      include "index.html"; 
   } 
} else { 
      include "index.html"; 
    } 
?>


File captcha.php

<?php 
session_start();

class CaptchaSecurityImages {

   var $font = './DoradoHeadline.ttf';
   
   function generateCode($characters) {
      /* list all possible characters, similar looking characters and vowels have been removed */
      $possible = 'BCDFGHJKMNPQRSTVWXYZ23456789bcdfghjkmnpqrstvwxyz';
      $code = '';
      $i = 0;
      while ($i < $characters) {
         $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
         $i++;
      }
      return $code;
   }

   function CaptchaSecurityImages($width='120',$height='40',$characters='6') {

      $code = $this->generateCode($characters);

      /* font size will be 75% of the image height */
      $font_size = $height * 0.50;
      $image = imagecreate($width, $height) or die('Cannot initialize new GD image stream');

      /* set the colours */
      $background_color = imagecolorallocate($image, 255, 255, 255);

      /* red text */
      //$text_color = imagecolorallocate($image, 220, 10, 10);

      /* black text */
      $text_color = imagecolorallocate($image, 1, 1, 1);

 $rndR = rand(98,198);
 $rndG = rand(98,198);
 $rndB = rand(98,198);
      $noise_color = imagecolorallocate($image, $rndR, $rndG, $rndB);

      /* generate random dots in background */
      for( $i=0; $i<($width*$height)/3; $i++ ) {
         imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
      }

      /* generate random lines in background */
      for( $i=0; $i<($width*$height)/150; $i++ ) {
         imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
      }

      /* create textbox and add text */
      $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
      $x = ($width - $textbox[4])/2;
      $y = ($height - $textbox[5])/2;
      imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');

      // Show the image.
 if (function_exists('imagegif'))
 {
  header('Content-type: image/gif');
  imagegif($image);
 }
 else
 {
  header('Content-type: image/png');
  imagepng($image);
 }

 // Bail out.
 imagedestroy($image);

      $_SESSION['security_code'] = $code;

      die();


   }

}

$width = isset($_GET['width']) && $_GET['height'] < 600 ? $_GET['width'] : '132';
$height = isset($_GET['height']) && $_GET['height'] < 200 ? $_GET['height'] : '36';
$characters = isset($_GET['characters']) && $_GET['characters'] > 2 ? $_GET['characters'] : '6';

$captcha = new CaptchaSecurityImages($width,$height,$characters);

?>