Sabtu, Juli 23

How to install Laravel 5 with Xampp (Windows)

 sumur : codementor.io

Requirements

  • PHP >= 5.5.9
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Mbstring PHP Extension
  • Tokenizer PHP Extension

Install Xampp

First of all, we need Xampp, so we can download it from the official page: Download Xampp

Composer

After you've downloaded and installed Xampp, we need to install Composer.
Composer is a PHP package manager that is integrated with Laravel Framework. In Windows we can install it easy going to the official page and download the installer.
Composer Download page
After install it, we can open a Windows terminal and write composer for execute the command:

Xampp Virtual Host

We will configure a Virtual Host in Xampp for a Laravel project, and in this example, we want to configure the domain laravel.dev for our project.
We need to edit httpd-vhosts.conf that is located in C:\xampp\apache\conf\extra\httpd-vhosts.conf and add following lines at the end of the file:
# VirtualHost for LARAVEL.DEV

<VirtualHost laravel.dev:80>
    DocumentRoot "C:\xampp\htdocs\laravel\public"
    ServerAdmin laravel.dev
    <Directory "C:\xampp\htdocs\laravel">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
After this, our apache is listening to laravel.dev connections, but we have to configure our hosts file that allows to redirect laravel.dev to the localhost that is located in C:\Windows\System32\drivers\etc

IMPORTANT!: To edit this file, maybe we should give access, click properties and allow your user to modify this file. Edit hosts file adding our localhost for laravel.dev:
# localhost name resolution is handled within DNS itself.
#    127.0.0.1       localhost
#    ::1             localhost

127.0.0.1    laravel.dev
Save the file and we are ready to install laravel.

Install Laravel Framework

We are prepared to install and configure a Laravel Framework. First of all, we have to navigate to htdocs folder to install it and run this following command:
composer create-project laravel/laravel laravel "5.1.*"
Will start the installation of the Framework:

When it finishes, it will create following directory schema:

Finally, start our apache and MySql from Xampp control panel:

Success!
Navigate to laravel.dev and Laravel it's installed!



Alternative Distinct dan Group By

Sumur : Distinct Alternative

You want to select distinct values from a column in a table. No problem. You use DISTINCT or GROUP BY in your query. But did you know that there is a third way to suppress duplicates? For example:

Both
select distinct department_id  
from employees
and
select department_id  
from employees
group by department_id
return
DEPARTMENT_ID          
---------------------- 
100                    
30                     

90                     
20                     
70                     
110                    
50                     
80                     
40                     
60                     
10                     

12 rows selected
Boring. Nothing new here.

But wait a minute, here is what I learnt today, another way to return distinct department ids, using the function ROW_NUMBER:
select department_id
from (
  select department_id,
         row_number( ) over 
           (partition by department_id 
            order by department_id) rownumber
    from employees
         ) t
   where rownumber = 1
 returns
DEPARTMENT_ID          
---------------------- 
10                     
20                     
30                     
40                     
50                     
60                     
70                     
80                     
90                     
100                    
110                    


12 rows selected
It’s the same output as the first two queries, except that it is ordered differently.
To be honest, I will continue using DISTINCT or GROUP BY for such requirements, however, it does not hurt to know that there are alternatives.

Minggu, Juni 26

15 Cara Menulis Self-documenting JavaScript

Sumur : sitepoint

Apakah menyenangkan menemukan dokumentasi diluar code dan tidak bermanfaat?

Ini adalah kesalahan yang rawan : Anda mengubah beberapa code, dan lupa untuk menghapus atau memperbarui dokumentasi. Memang dokumentasi yang buruk tidak akan merusak code, tapi bayangkan apa yang akan terjadi saat debugging. Anda membaca dokumentasi. Dokumentasi bilang A, tapi code bilang B. Bisa-bisa waktu kita terbuang hanya karena kepo kok akan hal ini, dan dalam kasus terburuk, bahkan bisa menyesatkan!

Tapi menulis code tanpa dokumentasi bukan merupakan pilihan. Dari 15 tahun pengalaman dalam dunia programing sang penulis yg saya kutip ini, ia belum pernah menemukan dokumentasi yang tidak berguna dalam sebuah code.

Namun, ada cara untuk mengurangi ketergantungan akan dokumentasi. Kita dapat menggunakan teknik coding tertentu untuk memperjelas code, gampangnya sih kita bisa menggunakan bahasa pemrogaman untuk keuntungan kita. 

Hal ini tidak hanya membantu membuat code kita lebih mudah untuk dipahami, tetapi dapat juga membantu memperbaiki desain program secara keseluruhan! 

Teknik conding jenis ini sering disebut juga dengan self documenting. Kita bisa menggunakan teknik ini dalam menulis code. Contoh yang diberikan di sini dalam JavaScript, kita dapat menerapkan sebagian besar teknik ini dalam bahasa lain juga. 

Overview of Techniques 

Beberapa programmer memasukkan dokumentasi sebagai self documenting dalam sebuah code. Pada artikel ini, kita hanya akan fokus pada code. Dokumentasi memang penting, tapi itu topik yang besar dan akan dibahas secara terpisah. 

Kita dapat membagi teknik ini dalam tiga kategori:
  • structural, di mana struktur code atau directories digunakan untuk memperjelas tujuan 
  • naming related, sejenis penamaan function atau variable  
  • syntax related, di mana kita menggunakan (atau menghindari penggunaan) fitur bahasa pemrogaman untuk memperjelas code.  
Kelihatannya bukan hal yang sulit ya. Tantangannya adalah menentukan kapan dan teknik mana yang harus digunakan. Mari kita lihat beberapa contoh praktis seperti apa penggunaanya. 

 

Structural

Pertama, mari kita lihat kategori struktural. perubahan struktural mengacu pada perubahan code untuk memperjalas kegunaannya.

Masukkan code dalam function 

Ini sama dengan "extract function" refactoring - yang berarti bahwa kita mengambil code yang ada dan memindahkannya ke function baru: kita "extract" code keluar ke fungsi yang baru. 

Sebagai contoh, bayangkan ouput dari line berikut: 
var width = (value - 0.5) * 16;
Tidak begitu jelas; memberi dokumentasi bisa sangat membantu. Atau, kita bisa membuat function dan menjadikannya sebagai dokumentasi:
var width = emToPixels(value);

function emToPixels(ems) {
    return (ems - 0.5) * 16;
}
Yang berubah adalah pemindahan perhitungan kedalam function. Nama function adalah deskripsi kegunaannya, jadi code tidak membutuhkan lagi komentar. Manfaat lainnya adalah, kita sekarang memiliki helper function yang bisa digunakan ditempat lain, jadi metode ini dapat membantu mengurangi duplikasi code.

Mengganti conditional expression dengan function

If dengan banyak operan bisa sulit untuk dipahami tanpa adanya dokumentasi. Kita bisa menggunakan metode diatas untuk memperjelasnya:
if(!el.offsetWidth || !el.offsetHeight) {
}
Apa tujuan dari kondisi di atas?
function isVisible(el) {
    return el.offsetWidth && el.offsetHeight;
}

if(!isVisible(el)) {
}
Sekali lagi, kita pindahkan code ke dalam function dan code ini jauh lebih mudah untuk dipahami.

Mengganti expression dengan variable

Mengganti sesuatu dengan variable mirip-mirip sih seperti memindahkan code dalam bentuk function, tapi dari pada function, kita hanya menggunakan variable. 

Mari kita lihat contoh dengan if lagi:
if(!el.offsetWidth || !el.offsetHeight) {
}
Alih-alih penggunaan function, kita juga bisa menjelaskannya dengan membentuk variabel:
var isVisible = el.offsetWidth && el.offsetHeight;
if(!isVisible) {
}
Ini bisa menjadi pilihan yang lebih baik dari pada penggunaan function - ambil contoh, ketika kita ingin menjelaskan logika yang spesifik untuk algoritma tertentu yang hanya digunakan di satu tempat saja.

Penggunaan umum untuk metode ini adalah perhitungan matematika:
return a * b + (c / d);
Kita bisa memperjelasnya dengan memisahkan perhitungan:
var multiplier = a * b;
var divisor = c / d;
return multiplier + divisor; 
Bayangkan contoh di atas memiliki beberapa algoritma yang mudah dimengerti. Dalam kasus apapun, intinya kita bisa memindahkan complex expressions dalam variable yang bisa mempermudah untuk pemahaman code.

Class dan module interfaces

Interface - adalah, public methods dan properties - dari sebuah class atau module yang bisa bertindak sebagai dokumentasi atas cara penggunaannya. 

Mari kita lihat contoh:
class Box {
    setState(state) {
        this.state = state;
    }

    getState() {
        return this.state;
    }
}
Class ini bisa memiliki beberapa code lain di dalamnya. Sengaja penulis ini memberikan kita contoh sederhana, untuk menggambarkan bagaimana public interface didokumentasikan.

Dapatkah pembaca memberitahu bagaimanakah penggunaan class ini? Mungkin dengan mencobanya..., ehm tetapi itu tidak begitu jelas.

Kedua function memiliki nama yang wajar: apa yang dilakukan adalah jelas dari namanya. Namun, tidak terlalu jelas bagaimana kita harus menggunakannya. Kemungkinan besar kita perlu membaca code yang lain atau dokumentasi class untuk mengetahuinya.

Bagaimana jika kita mengubahnya menjadi seperti ini:
class Box {
    open() {
        this.state = 'open';
    }

    close() {
        this.state = 'closed';
    }

    isOpen() {
        return this.state === 'open';
    }
}
Jauh lebih mudah untuk mengetahui kegunaannya, iya kan?. Perhatikan kita hanya mengubah public interface, representasi internal masih sama dengan properti this.state.

Sekarang kita dapat mengetahui sekilas bagaimana class Box digunakan. Hal ini menunjukkan bahwa meskipun versi pertama memiliki penamaan function yang baik, paket lengkap tetap membingungkan, dan bagaimana, dengan sesuatu yang sederhana seperti ini, sesuatu bangetkan?. Yang sulit adalah kita harus memiliki pandangan yang luas. 

Code grouping

Pengelompokan bagian berbeda dari code dapat juga berperan sebagai dokumentasi.

Misalnya, kita selalu ingin mendeklarasikan variabel sedekat mungki dimana mereka segera akan digunakan, dan mencoba untuk menggunakan kelompok variabel bersama-sama.

Ini dapat digunakan untuk menunjukkan hubungan antara bagian-bagian yang berbeda dari code, sehingga siapa pun yang merubahnya dikemudian hari tidak membutuhkan waktu yang lama untuk mengetahui bagian mana saja yang perlu diubah.

Perhatikan contoh berikut:
var foo = 1;

blah()
xyz();

bar(foo);
baz(1337);
quux(foo);
Sekilas bisa kita lihat berapa kali foo digunakan? Bandingkan dengan ini:
var foo = 1;
bar(foo);
quux(foo);

blah()
xyz();

baz(1337);
Dengan mengelompokkan penggunaan foo bersama-sama, kita dapat dengan mudah melihat bagian mana dari code yang berhubungan dengannya.

Use pure functions

Pure function jauh lebih mudah dimengerti daripada function yang bergantung pada state.

Apa itu pure function? Saat memanggil function dengan parameter yang sama, dan selalu menghasilkan output yang sama, kemungkinan besar bisa disebut "pure" function. Ini berarti function tidak harus memiliki efek atau bergantung pada state - seperti time, object properties, Ajax, dll.

Function ini mudah untuk dipahami, karena nilai-nilai yang memperngaruhi output dipassing secara explisit. Kita tidak perlu utak atik code sekitar untuk mencari tau asalnya bagaimana, atau apa yang mempengaruhi hasil, karena semuanya sudah jelas.

Alasan lainnya function jenis ini dibuat sebagai self-documenting code adalah kita bisa yakin akan hasil outputnya. Tidak peduli apa pun, function ini akan selalu menggembalikan output hanya berdasarkan parameter yang berikan. Hal ini juga tidak akan mempengaruhi eksternal, sehingga kita tidak perlu khawatir akan sesuatu yang tak terduga.

Contoh yang pas dalam hal ini adalah document.write(). Developer JS yang berpengalaman tahu tidak harus menggunakannya, tapi banyak pemula terjebak akan hal ini. Kadang bejalan dengan baik - dilain kesempatan tidak, dalam keadaan tertentu, dapat menghapus bersih seluruh halaman. Berbicara tentang efek samping!.

Untuk gambaran jelas tentang pure function, kunjungi link ini Functional Programming: Pure Functions.

Directory dan file structure

Ketika penamaan file atau directory, ikuti kesepakatan penamaan yang sama dengan yang digunakan dalam project, ikuti standar dari bahasa pemrogaman yang dipilih.

Misalnya, jika kita menambahkan code UI-related cari function serupa dalam proyek. Jika kode UI terkait ditempatkan di src / ui /, kita harus menambahkannya dilokasi yang sama.

Dengan demikian akan mempermudah dalam mencari code dan menunjukkan tujuannya, berdasarkan apa yang kita sudah tahu tentang potongan-potongan lain dari kode dalam proyek. Semua kode UI berada di tempat yang sama, setelah semua, seharusnya UI-related.

 

Naming

Ada sebuah kutipan populer tentang dua hal yang sulit dalam ilmu komputer:
Hanya ada dua hal yang sulit di Ilmu Komputer: Pembatalan cache dan penamaan sesuatu.
 - Phil Karlton -
Jadi mari kita lihat bagaimana menggunakan penamaan untuk membuat code self-documenting.

Rename function

Penamaan function sering tidak terlalu sulit, tetapi ada beberapa aturan sederhana yang bisa kita ikuti:
  • Hindari menggunakan kata-kata yang samar seperti "handle" atau "manage": handleLinks(), manageObjects().
  • Gunakan kata kerja aktif : cutGrass(), sendFile() - function yang aktif melakukan sesuatu.
  • Menunjukkan return value :  getMagicBullet(), readFile(). Ini bukan sesuatu yang dapat selalu kita lakukan, tapi itu membantunya jadi lebih masuk akal.
  • Bahasa dengan strong typing dapat digunakan mengetik tanda untuk membantu menunjukkan return value dengan baik 

 

Rename variable

Dengan variabel, di sini adalah dua aturan praktis yang baik:
  • Menunjukkan satuan: jika kita memiliki parameter numerik, kita dapat menyertakan satuan yang diinginkan. Misalnya, widthPx bukannya width untuk menunjukkan nilai dalam pixel bukan beberapa satuan lainnya.
  • Jangan menggunakan shortcuts: a atau b adalah nama yang tidak pantas, kecuali untuk counter dalam loop. 

 

Follow established naming conventions

Cobalah untuk mengikuti kesepakatan penamaan yang sama dalam code. Misalnya, jika Anda memiliki sebuah objek dari jenis tertentu, sebut saja nama yang sama:
var element = getElement();
Jangan tiba-tiba memutuskan untuk menyebutnya node:
var node = getElement();
Jika kita mengikuti kesepakatan yang sama seperti di tempat lain di codebase, siapa pun yang membaca dapat membuat asumsi aman tentang makna dari sesuatu berdasarkan apa artinya tempat lain.

 

Use meaningful errors

Undefined bukan sebuah object!

Mari coba untuk tidak mengikuti contoh JavaScript, dan mari kita pastikan kesalahan dalam code memiliki pesan yang bermakna di dalamnya.

Apa yang membuat pesan kesalahan bermakna?
  • Itu harus menjelaskan apa masalahnya 
  • Jika mungkin, harus mencakup nilai variabel atau data lain yang menyebabkan kesalahan 
  • Key point: kesalahan harus membantu kita mencari tahu apa yang salah - oleh karenanya bertindak sebagai dokumentasi tentang bagaimana function seharusnya bekerja.  

 

Syntax

Metode terkait syntax untuk code self-documenting bisa berupa sedikit bahasa yang spesifik. Misalnya, Ruby and Perl memungkinkan kita untuk melakukan segala macam trik sintaks aneh, which, in general, harus dihindari.

Mari kita lihat yang terjadi dengan JavaScript.

 

Don’t use syntax tricks

Jangan menggunakan trik aneh, ini bisa membingungkan:
imTricky && doMagic();
Setara dengan code ini, tampak jauh lebih manusiawi:
if(imTricky) {
    doMagic();
}
Selalu gunakan bentuk terahir. Trik syntax tidak akan membantu siapa pun.

 

Use named constants, avoid magic values

Jika kita memiliki value kusus dalam code - seperti angka atau string - pertimbangkan penggunaan constant. Tampak lebih jelas dari pada  sebelumnya, ketika melihat lagi coding setelah satu atau dua bulan lagi, tak akan ada yang mempertanyakan mengapa ada nomor tertentu dalam code.
const MEANING_OF_LIFE = 42;
(Jika tidak menggunakan ES6, bisa juga kita gunakan var sama saja kok.)

 

Avoid boolean flags

Boolean flag dapat membuat kode sulit dipahami. Pertimbangkan hal ini:
myThing.setData({ x: 1 }, true);
Apakah nilainya true ? Kita sama sekali tidak tau, kecuali kita masuk ke dalam setData() dan mencari tahu.

Sebaliknya, kita menambahkan function lain, atau mengubah nama function yang ada:
myThing.mergeData({ x: 1 });
Sekarang kita dapat segera tahu apa yang terjadi.

 

Use language features to your advantage

Kita bahkan dapat menggunakan beberapa fitur dari bahasa pemrogaman yang dipilih untuk mencari tahu maksud di balik beberapa kode.

Sebuah contoh yang tepat di JavaScript adalah metode iterasi array: 
var ids = [];
for(var i = 0; i < things.length; i++) {
  ids.push(things[i].id);
}
Kode di atas mengumpulkan ID ke dalam array. Namun, untuk mengetahui itu, kita perlu membaca keseluruhan dari loop. Bandingkan dengan menggunakan map():
var ids = things.map(function(thing) {
  return thing.id;
});
Dalam hal ini, kita langsung tahu bahwa ini menghasilkan array dari sesuatu, karena itulah tujuan dari map(). Ini bisa menguntungkan terutama jika kita memiliki logika perulangan yang lebih rumit. Berikut detail metod array iteration.

Contoh lain dengan JavaScript adalah key word const. 

Seringkali, kita deklarasi variable yang nilainya seharusnya tidak berubah. Sebuah contoh yang sangat umum adalah ketika load modul dengan CommonJS:
var async = require('async');
Kita bisa membuat maksud tidak pernah berubah ini lebih jelas:
const async = require('async');
Sebagai manfaat tambahan, jika seseorang tidak sengaja merubahnya, kita akan mendapatkan error.

 

Anti-patterns

Dengan semua metode ini, kita bisa melakukan beberapa hal yang menakjubkan. Namun kita tetap harus waspada tentang...

 

Extracting for the sake of having short functions

Beberapa orang menyarankan menggunakan function yang kecil, ketika kita extract semua, itulah yang kita dapat. Namun, ini dapat mempengaruhi bagaimana mudahnya code untuk dipahami.

Sebagai contoh, bayangkan kita debugging beberapa code. Kita melihat dalam function a(). Kemudian, menemukan penggunaan b(), yang kemudian menggunakan c(). Dan seterusnya.

Function singkat memang bagus dan mudah dimengerti, jika kita menggunakan function itu hanya disatu tempat, pertimbangkan untuk menggunakan metode "Mengganti expression dengan variable" sebagai gantinya.

 

Don’t force things

Seperti biasa, tidak ada cara yang benar-benar mutlak untuk melakukan hal ini. Oleh karena itu, jika sepertinya tidak cocok, jangan dipaksakan.

 

Conclusion 

Membuat code kita self documenting salah satu cara untuk meningkatkan pemeliharaan code. Setiap dokumentasi adalah code tambahan yang tidak diinginkan yang harus dipelihara, sehingga meminimalkan dokumentasi adalah sasuatu yang baik.

Namun, code self documenting tidak menggantikan dokumentasi atau komentar. Misalnya, kode terbatas dalam mengekspresikan maksud, sehingga kita perlu memiliki dokumentasi yang baik juga. Dokumentasi API juga sangat penting untuk lib, seperti harus membaca code sungguh hal yang rumit kecuali lib kita sangat kecil.
 

Kamis, Februari 16

Membuat Laporan Excel dengan PHP


###Database###
CREATE TABLE nilaimhs(
nim varchar(10),
namaMhs varchar(30),
nilai int(11),
PRIMARY KEY(nim)
)

INSERT INTO nilaimhs VALUES
('M0197001', 'Faza Fauzan Kh.', 80),
('M0197002', 'Dwi Amalia Fitriani', 75),
('M0197003', 'Rosihan Ari Yuana', 45),
('M0197004', 'Nada Hasanah', 83),
('M0197005', 'Muh. Ahsani Taqwim', 90);


####Script PHP ####
<?php
// nama file

$namaFile = "report.xls";

// Function penanda awal file (Begin Of File) Excel

function xlsBOF() {
echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
return;
}

// Function penanda akhir file (End Of File) Excel

function xlsEOF() {
echo pack("ss", 0x0A, 0x00);
return;
}

// Function untuk menulis data (angka) ke cell excel

function xlsWriteNumber($Row, $Col, $Value) {
echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);
echo pack("d", $Value);
return;
}

// Function untuk menulis data (text) ke cell excel

function xlsWriteLabel($Row, $Col, $Value ) {
$L = strlen($Value);
echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
echo $Value;
return;
}

// header file excel

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");

// header untuk nama file
header("Content-Disposition: attachment; filename=".$namaFile."");

header("Content-Transfer-Encoding: binary ");

// memanggil function penanda awal file excel
xlsBOF();

// ------ membuat kolom pada excel --- //

// mengisi pada cell A1 (baris ke-0, kolom ke-0)
xlsWriteLabel(0,0,"NO");            

// mengisi pada cell A2 (baris ke-0, kolom ke-1)
xlsWriteLabel(0,1,"NIM");           

// mengisi pada cell A3 (baris ke-0, kolom ke-2)
xlsWriteLabel(0,2,"NAMA MAHASISWA");

// mengisi pada cell A4 (baris ke-0, kolom ke-3)
xlsWriteLabel(0,3,"NILAI");

// mengisi pada cell A5 (baris ke-0, kolom ke-4)
xlsWriteLabel(0,4,"STATUS KELULUSAN");

// -------- menampilkan data --------- //

// koneksi ke mysql

mysql_connect("localhost", "username", "password");
mysql_select_db("database");

// query menampilkan semua data

$query = "SELECT * FROM nilaimhs";
$hasil = mysql_query($query);

// nilai awal untuk baris cell
$noBarisCell = 1;

// nilai awal untuk nomor urut data
$noData = 1;

while ($data = mysql_fetch_array($hasil))
{
// menampilkan no. urut data
xlsWriteNumber($noBarisCell,0,$noData);

// menampilkan data nim
xlsWriteLabel($noBarisCell,1,$data['nim']);

// menampilkan data nama mahasiswa
xlsWriteLabel($noBarisCell,2,$data['namaMhs']);

// menampilkan data nilai
xlsWriteNumber($noBarisCell,3,$data['nilai']);

// menentukan status kelulusan
if ($data['nilai'] >= 60) $status = "LULUS";
else $status = "TIDAK LULUS";

// menampilkan status kelulusan
xlsWriteLabel($noBarisCell,4,$status);

// increment untuk no. baris cell dan no. urut data
$noBarisCell++;
$noData++;
}

// memanggil function penanda akhir file excel
xlsEOF();
exit();

?>

Sabtu, Februari 4

Mengambil attachments gambar pada email

<Html>
<head>
    <link rel="stylesheet" href="../css/gallery.css" type="text/css" />
<style>
#contain{
width:990px;
height:auto;
border-radius:0px 20px 0px 20px;
padding:5px;
border:1px solid #999999;
-moz-box-shadow: 0 0 5px 5px #888;
-webkit-box-shadow: 0 0 5px 5px#888;
box-shadow: 0 0 10px 10px #888;

}
.isi{
width:320px;
height:320px;
margin:5px;

}
</style>

</head>


<body>
<?php

   $ServerName = "{MAILSERVER:PORT/novalidate-cert}INBOX"; // For a IMAP connection    (PORT 143)
  
   $UserName = "USERNAME";
   $PassWord = "PASSWORD";
  
  if (!$mbox = imap_open($ServerName, $UserName,$PassWord))die("Could not open Mailbox - try again later!");
  
if ($hdr = imap_check($mbox))
    $msgCount = $hdr->Nmsgs;
else
    die ("Failed to get mail");


$MN=$msgCount;
                    ?>
                    <!--<div align="center">
                    <div id="contain" align="center">
                    -->
                    <?php
while($MN>=1)
  {

$overview=imap_fetch_overview($mbox,"$MN");

foreach ($overview as $message) {
    $msgStruct = imap_fetchstructure($mbox, $message->msgno);

    // if it has parts, there are attachments that need reading
    if ($msgStruct->parts) {
        foreach ($msgStruct->parts as $key => $part) {
            switch (strtoupper($part->subtype)) {
                case 'GIF': case 'JPEG':case 'PNG':
                    $fileContent = imap_fetchbody($mbox, $message->msgno, $key + 1);
                   
                    ## Mulai Proses pembuatan width dan height ##
                    //Membuat gambar dari hasil decode
                    $img = 'data:image/jpg;base64,' .$fileContent;
                   
                    //membuat widht dan height baru dengan hasil 25%
                    $percent = 0.25;
                    list($width, $height, $type, $attr) = getimagesize($img);
                    $newwidth = 320;//$width * $percent;
                    $newheight = 320;//$height * $percent;
                   
                    ## Akhir Proses pembuatan width dan height ##
                   
                    //menampilkan gambar &nbsp;
                    //echo '<img src="data:image/jpg;base64,' . $fileContent . '" class="isi" height="'.$newheight.'" width="'.$newwidth.'" />'."";
               
                    ## Mulai Proses menyimpan file pada folder ##   
                   
                    // encode decode proses
                    $encode = base64_encode($fileContent);                           
                    $img = 'data:image/jpg;base64,' . base64_decode($encode);
                    //$img = 'data:image/jpeg;base64,'.$fileContent;
                    // penyesuaian karakter untuk proses penyimpanan
                    $comma = strpos($img, ',');
                    $data = base64_decode(substr($img, $comma+1));   
               
                    //proses pembuatan nama file                   
                    //$encode = base64_encode($fileContent);
                    $vowels = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",);
                    $str = str_replace($vowels, "", $encode);
                    if (strlen($str) > 1000){
                       
                        $trim = substr($str,1000,6);
                        $name = $trim ."_". $MN ;                       
                           
                    }
                    elseif(strlen($str) > 100) {
                           
                        $trim = substr($str,100,6);
                        $name = $trim ."_". $MN ;   
                    }
                    else {
                           
                        $trim = substr($str,10,6);
                        $name = $trim ."_". $MN ;
                    }
                   
                    //set rirektory file dan nama file
                    $myname = '../image/mail_image/'.$name.'.jpg';
                   
                    //proses simpan hasil penyesuaian karakter
                    file_put_contents($myname, $data);

                    ## akhir Proses menyimpan file pada folder ##
            break;
            }
        }
    }
}
 $MN--;
 }
                    ?>
                    <!--</div>
                    </div>
                    -->
                    <?php
    ## Baca semua email ##
    $MN--;
   
    ## Baca Email Terakhir ##
    //$MN=0;

//redirect ke demo2.php
header("Location: ../demo/demo2.php");
exit;
?>

</body>
</Html>