Taman: Tanah Succulent

Ada tiga experiment yang aku buat untuk buat tanah yang boleh sokong succulent.

  1. Cocopeat bakar
  2. Tanah organik + batu kecil di bawah sebagai drainage
  3. Mix tanah organik 2/3 + batu kecil 1/3

Cocopeat bakar

Sedia maklum cocopeat adalah antara bahan yang bagus untuk dijadikan medium dalam tanaman berpasu / bekas. Seperti namanya, cocopeat yang dibakar menghasilkan arang kepada cocopeat yang mana berfungsi seperti cocopeat cuma lebih kurang mengalirkan kelembapan kerana strukturnya yang halus berbanding cocopeat asal yang berserat.

Keputusan: untuk permulaan adalah bagus, tetapi perlu amat berhati-hati dengan kadar air kerana aku ada dua succulent yang membusuk kerana ada cocopeat yang menyeliputi daun.

Tanah organik + batu kecil sebagai drainage

Aku gunakan tanah organik yang dibeli di nursery. Cuma meletakkan batu kecil sebagai drainage atau subsoil yang tidak telap air yang akan membantu dalam proses mengurangkan lebihan air di dalam tanah topsoil. Aku tidak pasti adakah kaedah ini akan membantu mengeluarkan air yang berlebihan tetapi dalam keadaan hari ni nampaknya seperti berkesan. Cuma mengharapkan cuaca yang lebih panas untuk membantu proses penyejatan air daripada tanah agar tanah lebih kering.

Keputusan: TBA.

Mix tanah organik + batu kecil

Tujuannya adalah untuk mengurangkan tahap kemampuan menyimpan air di dalam tanah topsoil secara total dan sekali gus membantu mengurangkan risiko air yang terlalu banyak. Tetapi bergantung juga adakah kaedah ini akan menyebabkan terlalu sedikit air yang akan tinggal di dalam tanah ataupun tidak. Jika terlalu sedikit, bahan organik yang mampu menyimpan air seperti cocopeat atau serpihan kayu adakah bahan yang sesuai untuk dijadikan sebagai penambah ruang penyimpanan air.

Keputusan: TBA.

Nota

Sebenarnya kalau nak pantas, beli saja tanah kaktus. Selesai. Tapi ini adalah satu eksperimen yang menggunakan bahan-bahan yang ada di dalam sekitar rumah.

Batu kecil yang digunakan adalah daripada pasir yang terkumpul di tepi jalan. Diasingkan untuk hanya mengambil batu kecil sahaja.

Taman: Topsoil

Antara perkara yang aku buat untuk pastikan tanaman sentiasa mendapat khasiat adalah menukar topsoil. Bila kali terakhir anda tukar topsoil untuk tanaman anda?

Apa itu topsoil?

Topsoil adalah lapisan yang paling atas yang dikatakan antara 2 hingga 8 inci daripada permukaan tanah. Kepentingan topsoil kepada tumbuhan adalah membekalkan nutrient kepada tanaman kerana di lapisan ini adalah lapisan yang mempunyai paling tinggi bahan organik mahupun organisma. Oleh kerana perkara tersebut kebanyakkan akar tumbuhan akan berada di bahagian ini untuk memudahkan proses penyerapan nutrient sebelum menuju ke bahagian subsoil jika tiada pilihan.

Dalam konteks tanaman kecil-kecilan, perkara yang selalu diabaikan adalah keadaan topsoil. Ini kerana selalunya apabila sesebuah pokok ditanam, kita jarang untuk membuat penanaman semula atau penukaran topsoil kepada tanaman kita. Akhirnya permasalahan seperti akar terlalu padat, tanah menjadi keras, pokok tidak mendapat nutrient akan berlaku. Maka ini adalah kaedah aku dalam membuat penyelengaraan tanaman.

  1. Keluarkan sekitar dua inci tanah (sekitar satu ruas ibu jari) daripada sekitar tanaman tidak kira sama ada di dalam pasu atau di atas tanah.
  2. Letakkan tanah baharu untuk menggantikan tanah yang lama.
  3. Siram seperti biasa untuk pastikan tanah baharu tersebut dalam keadaan lembap.
  4. Tertib.

Antara sebab untuk mengeluarkan tanah sekitar dua inci adalah kerana jika terdapat akar-akar rumpai pun akan terkeluar sekali. Dan dengan mengeluarkan tanah di atas tersebut juga dapat melonggarkan akar di atas dan menggalakkan pertumbuhan akar baharu. Digalakkan juga untuk menambah sungkupan seperti daun kering agar pertumbuhan rumpai baharu dapat dikawal kerana tanah yang baharu kaya dengan nutrient dan rumpai amat menyukainya. Tetapi jangan terlalu tebal kerana boleh membunuh pokok.

Tanah Lama?

Apa yang boleh dibuat dengan tanah yang lama? Selain dibuang (membazir sumber bagi pendapat aku), anda boleh memulakan kaedah kompos dengan menggunakan tanah yang telah diguna untuk dikitar semula menjadi tanah berkompos yang boleh digunakan untuk penyelengaraan akan datang.

Caranya, cari satu bekas yang legap, masukkan bahan kompos seperti rumput, sisa dapur yang tidak berminyak seperti kulit bawang, lapiskan di antara bahan kompos dengan tanah yang telah digunakan. setiap lapisan sekitar dua inci. Jika boleh di bahagian bawah bersambung dengan tanah agar mudah untuk ulat dan cacing untuk naik ke atas. Jika tidak, anda perlu memasukkan secara manual cacing dan ulat di dalam tanah untuk mempercepatkan proses penguraian bahan kompos.

Proses pembuatan kompos adalah perlahan. Kerana bergantung kepada jumlah organisma yang terdapat di dalam tana untuk membantu proses penguraian. Aku galakkan korang memastikan bahan organik tersebut dalam keadaan kecil bukannya besar untuk meningkatkan luas permukaan yang akan meningkatkan kadar penguraian. Jika kaedah anda buat adalah betul, bau bukanlah satu masalah.

Dalam masa dua bulan anda boleh menggunakan bahan kompos tersebut untuk diguna semula dalam proses penyelengaraan topsoil. Jimat duit dan anda baru sahaja membantu dalam mengurangkan penghantaran sisa organik ke tapak pelupusan sampah.

Nota: Jika tanaman dalam pasu dan akar terlalu padat, perlu buat penanaman semula. Antara ringkaskan akar (teknik bonsai) atau tukar pastu yang lebih besar. Keseluruhan tanah perlu ditukar.

Gutenberg

Ini adalah percubaan kepada Gutenberg. Satu editor yang masih dalam proses eksperimen di dalam WordPress. Ideanya adalah untuk memudahkan penghasilan entri yang lebih flexible mengikut keperluan tanpa memerlukan banyak kerja.

Kalau letak headsink di atas kubur, adakah yang di dalam kubur itu akan merasa lebih sejuk?

Memang menarik untuk menghasilkan content yang cepat dan cantik. Tapi kene buat banyak Javascript. Ideanya adalah letak sebagai component sebab WP dan jadi react based.

Masa diambil

512

saat

Cadangan Untuk Gobind

Aku tertarik dengan artikel yang mana Kementerian Komunikasi dan Multimedia bercadang untuk mengurangkan harga jalur lebar kepada separuh daripada harga sekarang. Aku biasa dengar janji-janji ini cuma berapa pantas dan berapa kerap dapat dibuat? Setakat ini aku nampak hanya pada janji sahaja. Pencapaiannya belum tentu.

Apa pun aku ingin mencadangkan beberapa perkara yang aku rasa boleh dicadangkan kepada Gobind;

  1. Untuk semua talian tetap di bawah TM, Streamyx dengan kelajuan 1mbps adalah termasuk di dalam pelan. Dengan maksud lain, Streamyx 1mbps adalah percuma. Mungkin dengan kuota atau tiada kuota. Ini dapat meningkatkan kadar penembusan internet di Malaysia terutamanya di kawasan-kawasan luar bandar yang mana penduduk masih bergantung kepada Streamyx yang prestasinya tidak sepadan dengan harganya. Dengan maksud lain, setiap rumah yang ada talian tetap TM, terus mempunyai internet percuma. Bayangkan peningkatan ketara kadar penembusan interent di Malaysia selepas perlaksanaan tersebut. Ini adalah matlamat pertama – meningkatkan penembusan internet di Malaysia.
  2. Memberikan pembekal servis yang lain untuk membentang backbone mereka ke seluruh Malaysia tanpa perlu bergantung kepada backbone TM sahaja. Ini sekaligus akan mengurangkan kuasa monopoli TM dan juga akan dapat merendahkan harga internet di Malaysia. Dan perlawanan di antara pembekal servis ini juga dilihat dapat mendekatkan jurang di antara kawasan luar bandar yang mempunyai purata kelajuan internet yang perlahan dan kawasan bandar yang mempunyai kelajuan mencapai 100 kali ganda daripada di luar bandar. Jika ini berjaya maka matlamat kedua dapat dicapai iaitu meningkatkan kelajuan purata internet di Malaysia.
  3. Meletakkan syarat kepada pembekal servis untuk membuat semakan semula harga langganan setiap 18-24 bulan. Ini akan memberikan kebaikkan kepada Malaysia dalam jangka masa yang sederhana yang mana peningkatan daripada sudut penembusan internet dan juga purata kelajuan internet negara akan bertambah dari tahun ke tahun. Seperti contoh kaedah yang digunakan oleh Unifi tempoh hari, pelanggan akan diberikan peningkatan kelajuan internet tetapi tidak menaikkan harga langganan.

Buat masa ini itu sahaja tiga perkara yang aku rasa sesuai untuk diketegahkan.

Git Permission Denied (Public Key)

Pagi tadi aku dapat satu kes yang perlukan bantuan. Kesnya adalah begini;

Apa bila developer membuat arahan git fetch akan keluar ralatpermission denied (public key). Maka dalam hal ini, berikut adalah step yang aku gunakan untuk cari masalah tersebut berpunca daripada mana.

  1. Pastikan ssh public key telah dijana oleh server. Kalau *nix based boleh lihat pada ~/.ssh/id_rsa.pub. Kalau tiada, sila jana dahulu.
  2. Pastikan ssh public key tersebut telah dimasukkan ke dalam git upstream server. Bermula daripada ssh-rsa, diikuti dengan signature yang unik dan berakhir dengan nama server. Jika salah, maka kene betulkan dahulu.
  3. Periksa bahawa server git upstream mengenal server kita. Kalau *nix based boleh cuba dengan arahan ssh -v git@<git upstream server domain> dan sepatutnya git server akan mengenal anda  dengan memberi jawapan seperti Welcome to GitLab, Syafiq Lomotech. Jika gagal sila periksa semula langkah 2. Jika masih berlaku cuba ke langkah 4.
  4. Periksa upstream url anda dengan melihat git config pada .git/config dan lihat pada bahagian url. Pastikan url tersebut sama dengan url yang dibekalkan daripada server git upstream. Dalam kes pagi tadi. Url ini tidak sama. Sepatutnya gitlab. Tetapi telah ditukarkan kepada github.

Jika masih tidak berjaya, aku tak de idea. Sebab tak sampai lagi tahap tu.

Tech: getElementById Hanya Akan Ambil Yang Pertama

Ada satu masalah petang semalam kepada seorang intern yang mana dia mahu membuat fungsi add to chart menggunakan javascript dan jquery kepada item yang diletakkan di dalam owl carousel tetapi yang peliknya daripada 20 item, hanya 10 item pertama sahaja yang boleh dimasukkan, selebihnya tidak dapat. dia memanggil satu function javascript apabila butang add to cart tersebut di tekan. Kita anggapkan sebagai addToChart(counter, item.id). Aku cuba untuk menjalankan secara manual dengan meletakkan kod tersebut di dalam snippet dan menjalankannya, function tersebut berjalan dengan jayanya. Maka kemungkinan function tersebut bermasalah boleh ditolak.

Aku cuba sekali lagi untuk menjalankan secara manual tetapi kali ini untuk mengubah textContent elemen tersebut dengan membuat $('#item-11').html('testing') dan fungsi tersebut juga tiada masalah. Cuma yang anehnya tiada sebarang perubahan yang terjadi kepada paparan. Tetapi jika di cari kembali di dalam element tab, perubahan tersebut berlaku. Cuma bukan pada tempatnya.

Setelah dicari lebih lanjut, aku perasan own carousel akan membuat clone separuh daripada senarai di atas senarai yang asal. Contohnya begini;

Senarai asal

  • item-1
  • item-2
  • item-3
  • item-4

Senarai tambahan

  • item-3 (clone)
  • item-4 (clone)
  • item-1
  • item-2
  • item-3
  • item-4
  • item-1 (clone)
  • item-2 (clone)

Aku nampak kerana mahu menjadikan slide tersebut tidak berpecah atau terpisah semasa mahu membuat pusingan. Dan disebabkan itu juga id yang mahu dibuat tidak dapat dimasukkan. Maka aku mencadangkan tukar kepada class dan masalah tersebut selesai.

Aku masih musykil kerana jika id tersebut diletakkan sebagai item-3 clone sepatutnya adalah unik berbanding item-3 sahaja. Dan aku telah cuba dengan membuat contoh mudah.

<div class="ul">
    <li id="basket-3">3 clone</li>
    <li id="basket-4">4 clone</li>
    <li id="basket-1">1</li>
    <li id="basket-2">2</li>
    <li id="basket-3">3</li>
    <li id="basket-4">4</li>
    <li id="basket-1">1 clone</li>
    <li id="basket-2">2 clone</li>
</div>

<script>
   $(function(){
        console.log($('#basket-3').text());
        console.log($('#basket-4').text());
        console.log($('#basket-3').attr('id', 'basket-3 clone'));
        console.log($('#basket-4').attr('id', 'basket-4 clone'));
        console.log($('#basket-3').text());
        console.log($('#basket-4').text());
   })
</script>

Dan daripada log, aku nampak sepert ini yang mana aku nampak mengikut konsep javascript yang biasa. Hari ini aku akan tengok balik apa masalah sebenarnya daripada own carousel tu.

javascript get element by id

Tech: Brew PHP Upgrade

Aku tak pasti kenapa dan mengapa diorang tukar kaedah simpan keg untuk php daripada php71 kepada php@7.1. Mungkin disebabkan pertukaran daripada homebrew/php kepada homebrew/core cuma aku perasan beberapa perkara;

Tidak konsistan

php@7.1 untuk php 7.1 tetapi php untuk php 7.2. Apa akan jadi jika php 7.3 atau 8.0 keluar?

non suffix php version brew
https://github.com/Homebrew/homebrew-core/pull/26137#pullrequestreview-109196492

Library asas telah dimasukkan sekali

jika dulu perlu brew install php71-intl kini tidak perlu kerana intl telah dimasukkan secara automatik. Dan ini juga menyebabkan ralat tidak perlu jika anda mempunyai external config sebelum ini.

Sukar untuk membuat pertukaran versi php

Disebabkan kaedah baru ini, agak sukar untuk membuat pertukaran antara versi dan kita perlu berjaga-jaga dengan tetapan sistem apabila keluarnya versi terkini PHP contohnya;

  • sekarang versi terkini php 7.2 – nama direktori php 7.2 => php
  • akan datang versi terkini php 7.3 – nama direktori php 7.2 => php@7.2

Maka semua projek yang menggunakan versi 7.2 yang tidak berhajat untuk masuk ke versi 7.3 perlu menukar tetapan php.

Secara positifnya, kita akan memastikan sistem kita sentiasa boleh dijalankan pada php yang terkini. Cuma, tidak semua klien boleh membuat kemaskini php versi terkini terutamanya badan kerajaan ehem.

Dan dengan ini juga, semasa menjalankan arahan composer, anda harus berhati-hati dengan versi php di cli. Aku gunakan tetapan interpreter dalam phpstorm. Jika tidak aku cadangkan membuat alias kepada setiap versi yang mahu digunakan.

Ralat

path

If you need to have this software first in your PATH instead consider running:
  echo 'export PATH="/usr/local/opt/php@7.0/bin:$PATH"' >> ~/.bash_profile
  echo 'export PATH="/usr/local/opt/php@7.0/sbin:$PATH"' >> ~/.bash_profile

Sila pastikan di dalam .bash_profile anda telah diletakkan pada versi yang mahu digunakan.

library, extension

/usr/local/etc/httpd/httpd.conf: Cannot load /usr/local/Cellar/php71/7.1.12_23/libexec/apache2/libphp7.so into server: dlopen(/usr/local/Cellar/php71/7.1.12_23/libexec/apache2/libphp7.so, 10): image not found

Disebabkan beberapa extension telah dimasukkan secara automatik dan dijalankan terus, anda perlu memastikan external configuration (dalam kes ini httpd.conf) atau autoloader tidak memanggil semula extension tersebut.

Periksa juga di dalam <span class="s1">/usr/local/etc/php untuk memastikan tiada konfigurasi lain yang mengganggu.

brew php remove autoloader
https://github.com/Homebrew/homebrew-php/issues/4826#issuecomment-377548781

Anda hanya perlu membuat komen atau memadamkan baris yang memanggil extension tersebut.

Notakaki: jika anda tidak mempunyai sebarang keperluan untuk upgrade, jangan upgrade. Guna apa yang ada.

Tech: CSS Grid – fr

Sebelum ini aku telah ceritakan bagaimana grid dalam css berfungsi, maka untuk kali ini aku sambung sedikit lagi sekitar perkara ini.

Di dalam CSS Grid, terdapat satu unit yang diperkenalkan, fr iaitu fraction.

Kegunaan fr dapat ditonjolkan dengan situasi seperti ini;

<!doctype html>
<html lang="en">
<head>
    <style>
        body {
            margin-top: 40px;
        }

        #container {
            width: 800px;
            margin: auto;
            background: #e3e3e3;

            display: grid;
            grid-template-columns: 100px 100px 100px;
            grid-template-rows: repeat(3, 50px);
            grid-gap: 1em;
        }

        #container > div {
            background: #999;
            font-weight: bold;
            color: white;
            font-family: sans-serif;
        }
    </style>
</head>
<body>
<section id="container">
    <div>1</div>
    <div>2</div>
    <div>3</div>
</section>
</body>
</html>

Aku ada 3 kotak, dua kotak pertama bersaiz 100px dan kotak ketiga aku mahukan dia mengambil baki saiz yang ada. Dalam kes ini 800px - 100px - 100px - 1em - 1em. Ya aku boleh capai dengan kaedah begitu tetapi sedikit “matematik”.

Maka diperkenalkan unit fr atau fraction ke dalam CSS grid. Tugasnya adalah untuk mengambil bahagian baki yang ada berdasarkan pecahan yang dinyatakan.

Sebagai contoh apabila kita tukarkan grid-template-columns: 100px 100px 100px; kepada grid-template-columns: 100px 100px 1fr;,  secara automatik browser akan membuat kiraan untuk kita seperti ini;

jumlah width = 800px
jumlah width telah digunakan = 100px + 100px
jumlah grid-gap dan margin = 1em + 1em
jumlah pecahan = 1
pecahan semasa = 1

baki width = 800px - 100px - 100px - 1em - 1em
           = 568px

∴ width grid pecahan = baki width * (pecahan semasa / jumlah pecahan)
                     = 568px * 1/1
                     = 568px

Yang akan menghasilkan grid kiraan manual tadi.

css-grid-fr-unit

Soalan: Jika boleh menggunakan kaedah manual, mengapa perlu menggunakan kaedah fr?

Jawapan: Jika kita memerlukan fr lebih daripada satu, maka kiraan manual akan menjadi rumit. Sebagai contoh;

kotak 1 = 100px

kotak 2 = 2/3 daripada baki width

kotak 3 = 1/3 daripada baki width

Dengan menggunakan kaedah fr, kita hanya perlu menukarkan kepada grid-template-columns: 100px 2fr 1fr; yang akan memberikan arahan kepada browser untuk memberikan 2 bahagian daripada 3 (2fr + 1fr) kepada kotak 2 dan 1 bahagian kepada kotak 3.

css grid 2 fr

Kaedah ini juga lebih kurang sama dengan flex: flex: 100px 2 1; tetapi seperti mana yang aku katakan pada entri yang sebelum ini, terdapat perbezaan keperluan untuk flex dan grid.

Nota: entri ini aku kecilkan kepada fraction sahaja kerana entri lepas terlalu banyak gambar.

Tech: Nativescript iOS – Unable to apply changes on device

Aku dalam proses membuat satu percubaan untuk membina satu aplikasi mobil untuk sistem HR menggunakan Nativescript + Vuejs. Tetapi apabila aku cuba jalankan kod ke dalam emulator terdapat ralat yang menganggu.

Ceritanya, apabila aku jalankan arahan yarn run watch:ios pada terminal akan keluar ralat seperti dibawah;

Unable to apply changes on device: <device_id>. Error is: Command failed: ruby -e "require 'xcodeproj'; Xcodeproj::Config.new('/Users/syafiq/Developer/ost-hr-mobile/dist/platforms/ios/plugins-debug.xcconfig').merge(Xcodeproj::Config.new('/Users/syafiq/Developer/ost-hr-mobile/dist/app/App_Resources/iOS/build.xcconfig')).save_as(Pathname.new('/Users/syafiq/Developer/ost-hr-mobile/dist/platforms/ios/plugins-debug.xcconfig'))"
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- xcodeproj (LoadError)
        from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from -e:1:in `<main>'

Daripada pembacaan aku, orang di internet mencadangkan untuk membuat diagnos menggunakan tns doctor (macam brew doctor untuk tujuan diagnos),

WARNING: xcodeproj gem is not installed or is not configured properly.
You will not be able to build your projects for iOS.
To be able to build for iOS and run apps in the native emulator, verify that you have installed xcodeproj.

Maka aku pasang pakej xcodeproj dengan command gem install xcodeproj. Setelah selesai aku jalankan semula arahan yarn run watch:ios dan akhirnya aku dapat jalankan kod ini di dalam emulator.

Nota: Nativescript + Vuejs baru dalam versi 1.0, maka sebenarnya tidak berapa sesuai untuk digunakan untuk sistem yang sebenar. Aku jadikan sistem HR dalaman sebagai bahan eksperimen untuk mengetahui sejauh mana fungsi yang ada di dalam versi Vuejs ini. Fungsi yang aku cuba akan masukkan adalah authentication dan geolocation dahulu. Kamera, autosync dan lain-lain akan menyusul.

Tech: Redirect Berdasarkan Role Selepas Log Masuk

Aku adaptasi artikel ini daripada artikel asal, Redirect after login or register in Laravel: Adding a custom method. Aku ada dua jenis pengguna:

  1. Pengguna berdaftar
  2. Admin sistem

Dan aku perlukan mereka ini dihantar kepada dua tempat berlainan selepas proses log masuk.

Pengguna URL
Pengguna Berdaftar /home
Admin Sistem /admin

Aku gunakan modul auth daripada Laravel, daripada LoginController ada satu variable yang menyatakan url yang diletakkan secara lalai untuk sebarang log masuk yang berjaya dibuat.

/**
 * Where to redirect users after login.
 *
 * @var string
 */
protected $redirectTo = '/home';

Kita boleh mengubah variable tersebut kepada function untuk memudahkan membuat if else. Kenapa tidak menggunakan ternary atau if else biasa sahaja seperti kod di bawah?

/**
 * Where to redirect users after login.
 *
 * @var string
 */
if(auth()->user()->is_admin) {
  protected $redirectTo = '/admin';
} else {
  protected $redirectTo = '/home';
}

// atau

protected $redirectTo = auth()->user()->is_admin ? '/admin' : '/home';

Untuk memudahkan proses membuat test script dan masih boleh digunakan jika sistem perlu menambah golongan ketiga, keempat mahu pun kelima kelak. Lebih future proof.

Maka daripada kod asal, aku tukarkan kepada kod ini;

/**
 * Where to redirect users after login.
 *
 * @return string
 */
public function redirectTo(): string
{
    if(auth()->user()->is_admin) {
        return '/admin';
    } else {
        return '/home';
    }
}

Dengan ini, apabila pengguna dapat membuat log masuk ke dalam sistem, sistem akan terus menyemak adakah pengguna ini seorang admin atau pengguna biasa, jika admin sistem akan membawanya kepada paparan admin. Jika tidak maka pengguna tersebut akan dibawa kepada paparan pengguna biasa.

Nota: Kaedah ini tidak akan menyelesaikan masalah jika pengguna biasa masuk ke paparan admin menggunakan kaedah menukar alamat laman web. Untuk menyelesaikan masalah ini sila gunakan middleware atau fungsi di dalam route untuk memastikan hanya admin yang boleh masuk ke paparan admin.