Cara memasang mcrypt di dalam PHP 7.2

Mungkin ada di antara anda yang tahu bahawa modul mcrypt telah dibuang secara kekal daripada PHP 7.2 kerana moduk tersebut tidak mempunyai sebarang pembangunan lebih daripada 10 tahun. Hal ini agak menyusahkan bagi pengguna yang memerlukan mcrypt, tetapi harus dilakukan bagi mengekalkan kestabilan PHP.

Saya menggunakan Nginx sebagai panduan dan sekiranya anda menggunakan Apache, mungkin ada sedikit langkah berbeza.

Pertama, anda harus pastikan anda sedang menggunakan PHP 7.2.

$ php -v

Pasangkan beberapa pakej yang diperlukan untuk compile modul mcrypt, lalu pasang mcrypt.

$ sudo apt -y install gcc make autoconf libc-dev pkg-config php-pear php7.2-dev
$ sudo apt -y install libmcrypt-dev
$ sudo pecl install mcrypt-1.0.1

Apabila anda dipaparkan dengan pilihan seperti ini:

libmcrypt prefix? [autodetect] :

Tekan [ENTER].

Setelah selesai, akan terpapar mesej seperti ini

...
Build process completed successfully
Installing '/usr/lib/php/20170718/mcrypt.so'    ---->   this is our path to mcrypt extension lib
install ok: channel://pecl.php.net/mcrypt-1.0.1
configuration option "php_ini" is not set to php.ini location
You should add "extension=mcrypt.so" to php.ini

Kemudian anda perlu membuat konfigurasi di dalam PHP
Untuk php-cli:

$ sudo bash -c "echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/cli/conf.d/mcrypt.ini"

Untuk php-fpm:

$ sudo bash -c "echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/fpm/conf.d/mcrypt.ini"

Apabila selesai, sahkan mcrypt telah terpasang

php -i | grep "mcrypt"

Anda seharusnya akan melihat paparan seperti ini

/etc/php/7.2/cli/conf.d/mcrypt.ini
Registered Stream Filters => zlib.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, convert.iconv.*, mcrypt.*, mdecrypt.*
mcrypt
mcrypt support => enabled
mcrypt_filter support => enabled
mcrypt.algorithms_dir => no value => no value
mcrypt.modes_dir => no value => no value

Mencipta lebih daripada 20 bot di dalam Telegram

Anda mungkin seorang pakar yang mempunyai pelbagai idea atau seorang pemula yang mahu mencuba pelbagai kemahiran menulis bahasa pemprogram. Disebabkan itu anda menulis pelbagai bot di dalam Telegram lalu pada satu tahap @BotFather memberikan mesej ini:

That I cannot do.

You come to me asking for more than 20 bots. But you don't ask with respect. You don't offer friendship. You don't even think to call me Botfather.

Mesej tersebut seperti memberikan harapan, bukan? Hakikatnya anda tidak boleh membuat lebih daripada 20 bot. Apa yang boleh anda lakukan adalah:

  • Memadam bot-bot lama untuk digantikan dengan yang baharu.
  • Menggunakan akaun anda yang didaftarkan dengan nombor telefon lain.
  • Menggunakan akaun rakan anda (tidak disyorkan).
  • Menyelesaikan masalah Nginx yang bertindak tidak mengikut konfigurasi

    Saya menghabiskan masa hampir 3jam untuk membuat reverse proxy berjalan dengan betul. Pada mulanya segala konfigurasi yang saya tulis tidak berkesan walaupun saya telah merujuk pelbagai forum dan artikel. Saya reload konfigurasi menggunakan sudo systemctl reload nginx.

    Kemudian setelah berjam lamanya saya agak musykil dan mengesyaki sesuatu yang pelik berlaku kerana saya sedar segala konfigurasi yang saya taip, tidak dipatuhi. Malah saya cuba membuang bahagian location /path {} tetapi Nginx masih mengunakan bahagian yang telah saya buang itu.

    Apa yang saya lakukan adalah restart Nginx dengan systemctl restart nginx dan saya dapati Nginx gagal memuat semula kerana ketiadaan 1 folder yang berada di dalam konfigurasi. Saya membetulkan masalah itu lalu restart Nginx semula. Setelah itu, semua berfungsi secara yang saya kehendaki.

    Pengajarannya adalah, sentiasa memastikan Nginx berjalan dengan baik sebelum mengubah konfigurasi.
    Anda boleh menyemak sebarang kesilapan pada konfigurasi Nginx dengan menaip sudo nginx -t.

    Kesimpulannya, restart proses Nginx sekiranya Nginx tidak mematuhi konfigirasi yang telah anda tulis.

    Atasi masalah perkongsian ke Facebook di dalam Mobile Legends.

    Saya telah mengalami masalah ini mungkin sebulan yang lalu atau mungkin lebih. Pihak Mobile Legends masih tidak dapat memperbaiki masalah ini menyebabkan pemain kehilangan beberapa kelebihan.

    Bagi yang tidak tahu, perkongsian ke Facebook setiap hari akan memberikan anda kad Double BP. Selain itu fungsi ini digunakan untuk melengkapkan acara.

    Penyelesaian yang pertama adalah, membuang aplikasi Facebook. Ini akan menyebabkan Mobile Legends menggunakan browser untuk perkongsian. Cara ini mungkin tidak efisien bagi anda sekiranya memiliki kuota internet yang terbatas. Sekiranya Facebook dipasang pada telefon anda dari kilang, anda boleh menyahaktifkannya di dalam App setting.

    Cara yang kedua adalah menggunakan Facebook Lite. Tetapi, anda masih perlu membuang aplikasi Facebook yang asal. Cara ini berguna sekiranya anda mahu gunakan Facebook Lite untuk tempoh masa yang panjang.

    Namun bagi saya, kedua-dua cara di atas agak menyulitkan kerana aplikasi Facebook perlu dipasang semula sekiranya kita mahu menggunakannya. Jadi, sekiranya anda mempunyai akses root pada peranti, anda boleh menggunakan cara ketiga.

    Cara ketiga ini kemungkinan memerlukan akses root. Anda perlu memasang aplikasi Titanium Backup.

    1. Pilih tab Backup/Restore.
    2. Tekan kanta yang berada di atas kanan.
    3. Taipkan “Facebook”.
    4. Tekan Freeze !

      • Untuk menggunakan aplikasi Facebook kembali, tekan Defrost.

    Cara membina atau memasang XMR-Stak pada Ubuntu 16.04

    XMR-Stak adalah miner untuk pool Stratum. Saya menggunakan program ini untuk mine Monero.

    Saya menaip panduan ini berdasarkan penggunaan saya di Ubuntu 16.04, tetapi mungkin boleh juga digunakan pada mana-mana Debian dan Ubuntu bergantung kepada keberadaan dependencies.

    Pertama, anda perlu memasang beberapa pakej dan dependencies.

    $ sudo apt install libmicrohttpd-dev libssl-dev cmake build-essential libhwloc-dev git

    Klon source

    $ git clone https://github.com/fireice-uk/xmr-stak

    Secara default, 0.2% hash power akan diberikan kepada developer. Sekiranya anda tidak mahu memberikan sebarang hash power, anda boleh edit

    xmr-stak/build/xmrstak/donate-level.hpp
    

    dan mengubah 0.2 kepada 0.0.

    Kemudian buat satu folder dimana XMR-Stak akan dibina.

    $ mkdir xmr-stak/build
    $ cd xmr-stak/build
    

    Ubah beberapa parameter mengikut sistem anda. Saya mahu gunakan CPU, jadi command yang digunakan adalah

    $ cmake .. -DOpenCL_ENABLE=off -DCUDA_ENABLE=off
    

    Sekiranya anda mahu menggunakan GPU AMD,

    $ cmake .. -DCPU_ENABLE=off -DCUDA_ENABLE=off

    Dan jika anda mahu gunakan GPU Nvidia,

    $ cmake .. -DCPU_ENABLE=off -DOpenCL_ENABLE=off

    Anda boleh rujuk pautan ini untuk parameter tambahan yang lain.

    Sekarang kita sudah bersedia untuk membina XMR-Stak.

    $ make

    Apabila sudah selesai, anda perlu menjalankan XMR-Stak buat pertama kali untuk menjana fail konfigurasi.

    $ bin/xmr-stak

    Isikan maklumat seperti yang diminta. Tidak perlu gunakan nicehash sekiranya anda tidak mine pada pool NiceHash.

    Fail konfigurasi yang bernama config.txt, cpu.txt, amd.txt, dan nvidia.txt akan diletakkan di dalam folder build. Jika anda bina untuk CPU, akan ada config.txt dan cpu.txt. Begitulah seterusnya jika anda bina untuk AMD atau Nvidia. Anda boleh mengubah mana-mana perimeter mengikut kesesuaian anda.

    Saya telah menulis sebuah script untuk memudahkan anda untuk menjalankan XMR-Stak. Anda boleh mrnggunakannya sekiranya anda mahu.

    DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    $DIR/build/bin/xmr-stak --config $DIR/build/config.txt

    sysctl: cannot stat /proc/sys/vm/nr_hugepages: No such file or directory

    Saya mendapat error ini semasa cuba menggunakan Hugepages pada Ubuntu 16.04. Saya telah mencari di Google namun tiada hasil.

    Pada sebelum ini, saya telah cuba menukar saiz Hugepages dengan melakukan command:

    $ vm.nr_hugepages = 128

    Namun saya mendapat error sysctl: cannot stat /proc/sys/vm/nr_hugepages: No such file or directory

    Setelah saya menyiasat, saya dapati ini adalah kerana default kernel yang saya pakai tidak menyokong Hugepages. Oleh kerana itu, saya telah memasang kernel 4.10 daripada repository. Memandangkan saya menggunakan Ubuntu 16.04:

    $ sudo apt install linux-generic-hwe-16.04
    

    Kemudian reboot

    Cara memasang kernel pada sistem anda mungkin berbeza melainkan anda menggunakan Ubuntu 16.04 seperti saya.

    [Android] Cara menukar User Certificate kepada System

    Mungkin atas sebab-sebab tertentu, anda perlukan sesuatu certificate itu dipasang pada system. Saya menulis entri ini kerana tidak menjumpai cara yang terkini.

    Saya telah mencuba cara ini pada Android 7.1 AOSP. Untuk versi android yang lebih lama, path pemasangan user certificate adalah berlainan dan tidak akan anda temui di sini.

    Nota:

    1. Akses root diperlukan.
    2. Semak senarai user dan system certificate di Settings > Security > Trusted Credentials.
    3. User certificate: /data/misc/user/0/cacerts-added
    4. System certificate: /system/etc/security/cacerts

    Langkah 1:

    Buang semua certificate kecuali yang anda mahu pindahkan. Ini untuk memudahkan pencarian kerana certificate tersebut tidak disimpan dengan nama asal.

    Langkah 2:

    Buka /data/misc/user/0/cacerts-added menggunakan file manager anda. Anda akan melihat senarai certificate yang namanya berakhir dengan 0 sebagai contohnya, c8750f0d. Semua di sini adalah user certificate yang anda telah pasang.

    Langkah 3:

    Salin certificate tadi ke dalam /system/etc/security/cacerts. Kemudian reboot.

    [PHP] Masalah menetapkan permission pada mkdir() dan chmod()

    Situasi masalah kali ini agak mengelirukan kerana saya sudahpun merujuk pelbagai laman web tentang contoh penggunaan mkdir() serta chmod(). Tetapi, masalah sama tetap muncul di mana permission yang saya tetapkan untuk folder yang saya hendak buat tidak sama dengan permission folder yang diberikan kepada folder tersebut.

    Saya menggunakan mkdir() seperti ini:

    mkdir("./test", 777);

    Tetapi yang terhasil adalah 007.
    Jadi saya cuba menggunakan chmod():
    mkdir("./test", 777);
    chmod("./test", 777);

    Tetapi masih juga sama. Lalu saya cuba mengubah mask:

    $oldmask = umask(0);
    mkdir("./test", 777);
    umask($oldmask);
    

    Tekanan semakin terasa apabila hasilnya tetap sama!

    Setelah beberapa minit merenung hidup, saya merujuk semula dokumentasi PHP dan mendapati saya mempunyai kesalahan menaip. Permission yang saya taip sepatutnya adalah 0777 dan bukannya 777. Jadi code akhir saya yang berfungsi adalah:

    mkdir("./test", 0777);

    Pengajarannya adalah sentiasa menumpukan perhatian.

    [PHP][MYSQL] Statement tidak berfungsi

    Saya mengalamai satu masalah di mana query MySQL UPDATE tidak berfungsi. Agak pelik apabila $db->prepare dan $db->query memberi respon yang kosong, tiada perubahan database server tiada juga error dalam log.

    Disebabkan itu, saya cuba melakukan query tersebut di sekeliling code untuk mencari di manakah query tersebut berfungsi dan di mana tidak. Lalu saya dapati query tersebut tidak berfungsi selepas code ini:

    if($sqlexec = $db->prepare("SELECT time from download_log WHERE userid=? ORDER BY id DESC LIMIT 1")){
        $sqlexec->bind_param("i", $userID);
        $sqlexec->execute();
        $sqlexec->bind_result($time);
        while($sqlexec->fetch()){
            $timeout = (time()-$time);
            if($timeout<5*60){   
              $msg->send("You must wait ".(5*60-$timeout)." seconds before adding a new link.", "HTML"); exit;
            }      
            break;
         }
    }

    Saya berfikir sejenak lalu memutuskan untuk menutup statement SQL tersebut menggunakan $sqlexec->close():

    if($sqlexec = $db->prepare("SELECT time from download_log WHERE userid=? ORDER BY id DESC LIMIT 1")){
        $sqlexec->bind_param("i", $userID);
        $sqlexec->execute();
        $sqlexec->bind_result($time);
        while($sqlexec->fetch()){
            $timeout = (time()-$time);
            if($timeout<5*60){
                $msg->send("You must wait ".(5*60-$timeout)." seconds before adding a new link.", "HTML"); 
                exit;
            }
            break;
        }
        $sqlexec->close();
    }

    Berjaya! Saya tidak tahu kenapa statement ini tidak tertutup sendiri setelah selesai, tetapi mungkin membiasakan diri untuk menutup prepared statement setelah selesai adalah sesuatu yang bagus sekaligus dapat mengelakkan bug yang tidak dijangka.