Introducing Squasher!

Assalamualaikum semua! Apa khabar? Saya sihat… anda juga… etc, etc.

Okay, so have I mention before that running ubuntu live from usb stick feels actually faster than an installed Ubuntu? Yes, there are several reason for that, and one of those are the installation is compressed into a squashfs image. A squashfs image should be about three times smaller than an uncompressed directory. Canonical use squashfs in the live image so that the whole ubuntu installation could fit into a CD (its DVD now). The problem with squashfs image is that, it is a read only image, meaning you can’t install anything the live image. Of course, there are ways to overcome this, like unetbootin’s persistant storage, but that is a different story. So, bottomline, when you install Ubuntu, what the installer does actually is it uncompress the squashfs image to your hard disk. Because the uncompressed file is about three times bigger, the hard disk will need to read three time more data to start your system. You can, of course, manually set up an ubuntu intallation into using a partial squashed installation by following this guide, but that for me is quite a hassle to do manually. So, I’ve come up with a script I called Squasher written in bash that will automatically compress your /usr into an image and set up fstab and help in updating the squashfs image.

So, here is how you use it. First download the script from its github repo. Copy it to wherever you want, just not in /usr. Then, install the package squashfs-tools and aufs-tools. You can use the command “sudo apt-get install squashfs-tools aufs-tools” to install it or you can click this link which supposedly will open ubuntu software center and install the package.

For example, I’ve put the in my home directory. Don’t put it too many folder because we will execute it in command prompt.

 Then, right click on it, and press properties. Make sure you checked “allow executing file as program”. This will come in handy later.

 Next, restart and enter recovery mode. If you use ubuntu 12.10, the recovery mode is in the “Advanced option for Ubuntu”

Then, on the Recovery Menu, choose “Drop to root shell prompt”.

Notice, on the bottom of the screen, you can now type stuff. Navigate to where you keep the script, and run it. If it says something like “access denied”, you probably did not check “allow executing file as program”. As a workaround, type “mount -o remount,rw /” and “chmod +x”.

The script will prompt you to disable AppArmor. This will prevent AppArmor to start at startup. Disabling AppArmor is recommended because many thing may not work if you leave it. Even so, after disabling it, some profile (namely cupsd) may still be loaded at startup, meaning printers may not work. You may want to remove AppArmor completely to fix that.

 Next, it will prompt to squash /usr. The script will start modifying the system after this, so it asked you to continue.

 If you pick Yes, it will start by compressing /usr into an image.

 And if everything goes well, you should be prompted to restart your system.

 By the way, the old /usr is not deleted. It had only been renamed to /usr.backup/. Delete it manually if you are sure everything is ok.

Now, your partial squashfs system has already been set up. You could see some load time improvement when starting applications. You can install new application, and do stuff normally. Be advised though, that new application will not be automatically compressed. In this setup, any write to /usr will be written in /var/squashed/rw. While you squashed image is mounted in /var/squashed/ro. Aufs then will merge both of these forder into /usr.

As for example, the screenshot above is right after I squashed my system. The /var/squashed/rw is empty because I have no installed anything.

Now, for example sake, I install gparted. Notice that the gparted binary is in /var/squashed/rw/bin. But it is not compressed.

To recompress it, repeat the procedure to start the script. the script will automatically detect your configuration. Make sure the parameter is about the same as above. If you did not do anything with your fstab, this should work just well.

Select continue to recompress /usr. You should see a similar progress status as before, as when you compress /usr for the first time. When it finish, restart your system. Beware that the script does not delete your old squashfs image and read write branch. For security, you MUST delete them manually before running the script again.

Notice on the screenshot above there are two image with size about 600MB. Delete the one with the ‘.old’ postfix, once you are sure everything is ok.

The same is also true for the read write branch. On the screenshot above, the read write branch is empty. The old rw branch has been renamed to “rw.old”. Delete it and you should see that your newly installed application is still available and compressed.

Performance gain.
On a Virtualbox I’ve notice that it does start faster, but I have no number to prove that. On my laptop, and a stopwatch, I did not see any start up loading time improvement. Uncompressed or compressed, it took 55 second to boot and start chromium. But the number do strip down to 40 second once I’ve reconfigure ureadahead. I do notice however, is that nautilus and common application do load faster in this configuration. Unfortunately it is still not as fast as using a thumbdrive. Probably because the script only compress /usr.

So if you are still using a conventional hard disk, squasher may be worth a look. Until btrfs become optimized, a squashfs image is probably a solution to speed up loading time by compression.

WARNING: If at some time you dist-upgrade your system, AppArmor profile for some of the updated file may be loaded after you restart. I’m still not sure how did this happen. So you could try removing apparmor completely, or ‘invoke-rc.d apparmor teardown’ for temporary solution.


Why people use Ubuntu(or its derivative) instead of other distro

Remember the old Ubuntu? Before plymouth or KMS, around Ubuntu 9.10, with it slick boot screen, as if you notebook is turning into some kind of transformer robot, and then you boot into gnome 2 desktop, top and bottom panel just swiftly but with nice timing slide into the screen with it black elegent theme. And you could enter you Facebook/Twitter/Google Talk account and chat right from the desktop with new message notification which is just… damn! You can even post picture right from nautilus!

No, you have to see it for yourself. The logo fade in and out like it was… booting.
Now look at Ubuntu today… damn… (say it sadly)… What happen? If you are not the kind of person to keep up to date with these stuff, you probably not know what happen. Let me recap it for you, KMS enter the world, many bugs, ubuntu’s theme started to be more.. “mature” or “static” if I may say so, then Gnome 3 happen, the community retaliate, Ubuntu retaliate but in an even more different way than the community hoped for. KDE4 just… seems to not learn fast enough . Compiz is dying, then MATE, Cinnamon, Unity, Elementary, gnome has never been so fragmented. And here we are, in a strange distant land. 
Not to say that Gnome 3 is bad, don’t get me wrong, its great. Its my favorite desktop environment (with extensions of course), but if I have to choose between gnome2 in ubuntu 9.10 or gnome3 or unity, I would pick gnome 2 hands on. No because of the software, but because of the integration.
Ubuntu started of as a linux distro aims for the ‘normal’, mere mortal human being instead of being server oriented or even a universal distro. Sadly right now Canonical may have put the definition of ‘normal’ human being too far by introducing Unity to the land of cluttered gnome, with its lack of customization. Probably the only thing that you can change in the desktop(without third party apps) is the wallpaper (IOS anyone?). Because of this, Ubuntu’s throne in the DistroWatch ranking right now has plummeted to the number 3, even surpassed by the relatively young, Mandriva based Mageia.
Despite that, other old-time distro such as Fedora and OpenSuse still has trouble catching up to Ubuntu even though ubuntu is handicapped the notoriously infamous Unity. Some may like it, some may not,old timers definitely not, the Unity desktop environment main problem is probably customization and not so intuitive way of task switching, but one thing for sure, most people do not like it (at least at first). Other than that, we have KDE or Gnome3 which is quite universal for all distro. And yet Ubuntu based distro (see Linux Mint over there), overall still a win. Why is that so?
1. The installation, it actually work.
Recently, due to boredom I’ve decided to replace my ubuntu 12.04 for OpenSuse 12.2, you know, just for fun. But the catch is, I have no CD-R. Who use them nowadays anyway? With thumbdrive being more reliable and faster. So, like always, I ran the Startup USB Disk Creator, in Ubuntu, and it fail to open the ISO (no warning whatsoever). So, like a normal human being, I blame it on the USB Disk Creator, cause I know it is buggy. Then I restart to Windows 7 (please, I just being human), use the trusty unetbootin, and tada! Disc created. Rebooted, “fail to find gfxboot”. I’ve done this with Ubuntu/Mint ISO so many times, but today my faith on unetbootin has been tainted. And so, like many other stupid geeks, I love to do it the hard way, boot Windows 7, run VirtualBox where my (real)partition has been setup and installed it from there. I knew there would be some boot error(my bad), but hey, How hard is it to reinstall grub? I was wrong… In Ubuntu, “grub-install –bootdirectory=’stuff’ /dev/sda” would work, in OpenSuse, grub-install open the famous Yast2 tools to set the bootloader, which did not work. And I’m stuck with manually typing “linux (hd0,3)..and stuff” on grub terminal. I’ve tried both grub2 and grub-legacy, grub-install.unsupported in opensuse and yet no menu whatsoever. Just a grub terminal. Right then I change to fedora. Ok, sure, its my fault. I should have known that the iso would not work using unetbootin. I’m suppose to dd-it. But Ubuntu ISO works just fine right?

Ubuntu installer does not always work for me, but compared with other distro, Ubiquity  works relatively well.

2. Synaptics and apt-get rules!

You know, whenever you use Yast2 or yum to install a package, it will first download the index even if you just update it 5 minute ago. Sure, it only download the header, but still, that could take 15 second of non-interactivity which basically do nothing. Things are even more horrible on fedora, where most of the GUI frontend depends on packagekit. Now imagine, at some inappropriate time, yum is doing an index update, and you want to install, lets just say… an applet. Apper will hang until the backround yum is done. Not to say that the same thing does not happen in Ubuntu, but it happen a lot less, and it’s easy to set it off. Now, about Apper, have you tried searching for a package using it before? It basically call packagekit which then call yum, which I don’t know what it does, it seems to be doing nothing for the first 3 second, then my disk start to get busy. Happen every single time you search. Now imagine if yum is doing an update in the middle of your package browsing. Compare that to synaptics experience and ubuntu is starting to really shine. One thing I don’t like about apt-get (in ubuntu) is that it does not have delta updates like Fedora or OpenSuse or even Debian. From what I understand, they did not implement it because of something not suitable with Ubuntu’s infrastructure. This cause and Ubuntu update to be unnecessarily large. Just imagine, having to re-downloads kde-wallpapers (70MB) for  minor version update. 

3. Personal Package Archive (PPA) System

xorg-edgers, bringing new xorg since 10.04

Some may say that Ubuntu does not contribute much back to the opensource community. They mostly use whatever they think is suitable, than refine it into a distro. After all, that is what a distro is for. But there are great things that Canonical make, for example, UpStart and the PPA system. Personally, I think PPA is one of Ubuntu’s greatest strength. For a long time, the problem about a non-rolling-release distribution is getting up to date software. Look at Debian for example. A rolling-release distro in another hand tend to get a bit unstable. The PPA system fix the problem (up to certain point) of a non-rolling-release distro by making it easy for other contributor to publish their own package without the hassle of putting it in the official repository. Not to say that other distro does not have their own solution, Opensuse has its own third party repo, while Fedora has RpmFusion. But Canonical make their PPA System much easier to use by implementing it with the Launchpad system. As a result, if you want to try the newest Xorg, or Linux Kernel, or some other bleeding edge software, there is a ppa for it. This increase the number of application you can install by a whole lot, even though the number of  packages from Debian itself has reach more than 20,000. Now, if only it has one click installation from browser…

4. Popularity

DistroWatch may put Ubuntu on the third place, but Its no secret Ubuntu is in fact, if you count person new to this Linux stuff, a very famous distribution even though the person you are asking does not know what is a ‘distro’. When people say about Linux, I mean, normal people who does not work in the IT sector, they will probably say “Linux? That is Ubuntu right?”. Yes, I know, Linux and Ubuntu are not the same thing, but those people probably think so, and they probably don’t care much. The point is if they need something other than Mac or Windows, the first choice would be Ubuntu. And because of this traction, other people in the IT sector, who depends on these people (let say… for living) would probably support Ubuntu as well. This give Canonical a very competitive edge in terms of free support. In addition other hardware vendors would most likely target their driver to work well with Ubuntu releases, much like AMD or Nvida drivers being scheduled for Ubuntu release. Proprietary software developer will also most likely to provide binaries for Ubuntu or Fedora (because of Red Hat), than other distribution such as Gentoo, although Gentoo user are most probably competent enough to work around it. Plus, Ubuntu Software Center has support for paid software. Because ubuntu-based distribution like Linux Mint are simply Ubuntu, plus some additional repositories, things that work in Ubuntu are most likely to also work with no or little changes. In some way, the biggest contribution from Canonical is probably their marketing effort for Ubuntu which indirectly also affect other distributions.  

OMG! Its on the cover page!

Automatic IIUM Schedule (AIIUMSF) sekarang dengan "vertical layout".

Ok, long story short, Automatic IIUM Schedule Formatter sekarang ada “Vertical Layout”, yakni jadual disusun dari atas ke bawah daripada kiri ke kanan. Untuk menggunakannya, cuma pakai theme gallery, kemudian tekan “Vertical Layout” seperti anak panah di atas, dan tada! Jadual anda secara automagically vertically layouted.

By the way, kalau korang perasan, secara default korang tak patut nampak screenshot theme kat dalam kotak macam kat screenshot atas. Itu pasal ada sikit security issue. Korang boleh “on” screenshot tu dengan tekan “allow” kat atas waktu chrome kata website ni tengah akses insecure resource.


Jangan memalukan orang Islam

Assalamualaikum rakan-rakan sekelian. Untuk kali ini, dari lubuk hati saya, saya mintak kamu untuk tolong sebarkan apa yang ada dalam minda saya ini. Saya tak kisah kalau kamu nak copy-paste setiap HTML dari post ini ke blog anda, saya secara ikhlasnya galakkan anda untuk buat apa sahaja asalkan mesej dari post ini disampaikan sejauh yang mungkin.

Isu yang saya nak bincangkan hari ini ada kaitan dengan orang Islam seperti yang ditunjukkan di atas. Di screenshot di atas, di comment yang terakhir, saya ada tulis:

Seriusly ADA SAPA-SAPA kat comment ni yang dah check!! Itu laman web berita biasa aje! Dan tulisan jawi tu merupakan “nawaret” dalam jawi. Kenapa benda macam ni dibesar-besarkan? Ia hanya akan melalaikan kita. Melemahkan kita,kalau orang kafir nampak ni, diorang gelak kat kita pasal kita share MACAM ORANG BODOH! Tak check benar atau tidak apa yang dikatakan. MEMALUKAN nama Islam dan Al Quran. Siapa yang pertama menyebarkan benda ni patut sedar implikasinya terhadap maruah orang Islam.

Kalau tak percaya pergi sendiri ke ““. Tulisan tu dalam bahasa jawi, so google translate aje, dan kamu patut lihat bahawa itu hanyalah laman web berita biasa. Tapi bukan itu yang saya nak sebarkan di sini, tetapi saya nak tegur seluruh orang islam tentang satu mindset yang nampaknya tegar dalam minda kebanyakan orang islam.

Kita selalu dengar perkataan “Islamophobia”. Tapi dalam kes ini ianya ibarat “fobia orang islam”. Let me get straight to the point:

->Jangan mendewa-dewakan orang kafir<-

Kepada yang bukan Islam, from the bottom of my heart, no offense. Macam mana kamu mendewa-dewakan mereka. Macam ni, sejak dulu lagi, banyak orang kata “Bill Gates tu orang Yahudi”. Dan kemudian apabila Apple semaki maju “Steve Jobs tu Yahudi”. Kemudian pula “Mark Zuckerburg itu Yahudi”. Rakan-rakan, saya nak tanya, kamu nampak ke Bill Gates dilahirkan di Israel? Bapa Steve Jobs orang Yahudi ke? Ada kamu cuba untuk mencari kebenaran terlebih dahulu ke sebelum kamu membenarkan apa yang dikatakan tersebut? Rakan-rakan, saya tak tahu kalau mereka memang orang Yahudi, seperti mana saya tak tahu adakah saya orang Yahudi, tapi polanya di sini adalah, apabila orang itu berkuasa saja, kamu anggap dia orang Yahudi, kamu kata dia berketurunan Yahudi, kamu benarkan apabila orang kata begitu. MACAM TU LAH KAMU MENDEWA-DEWAKAN ORANG YAHUDI.

Apa yang penting di sini adalah untuk kita menyedari bahawa adakan mereka Yahudi atau tidak, itu tidak penting langsung. Mereka tetap Kafir. Malah orang yang mengaku Islam sekalipun belum tentu sebenar-benar Islam. Apa yang penting adalah diri kita sendiri, adakah kita akan bangkit bersaing, atau duduk memegah-megahkan mereka? Bercakap sahaja tak akan menggerakkan bumi. Menyebarkan kenyataan-kenyataan “israel itu”, “israel ini” yang entah mana betul atau tidak, tidak akan membebaskan palestin. Malah ia akan membongkakkan lagi mereka, memburukkan nama Islam, sekaligus menyebabkan orang-orang kafir diluar sana yang tidak bertanggungjawab atas apa yang berlaku di palestin memandang orang Islam macam manusia tidak bertamadun aka “Terrorist”.

Rakan-rakan, mari saya berikan satu dua fakta tepat yang orang memang tahu. Pertama, Tahukah kamu tentang Processor chip Intel? Tahu kan? Syarikat pembuat chip terbaik di dunia. Processor keluaran mereka, dari Pentium M hingga ke Sandy Bridge sekarang ini direka di Israel. Itu satu fakta yang orang ramai tahu bahawa Intel ada pusat kajian di Israel. Fakta kedua, (kalau tak silap saya dari sumber yang sangat tinggi credibilitinya ( ), Kurang setahun lepas, Apple telah menandatangani satu kontrak pembinaan data center di Israel yang akan digunakan untuk pelbagai benda contohnya pemprosesan “Siri”.

Kenapa saya bagitau kamu perkara ini? Saya nak kamu tahu bahawa orang-orang yahudi ini bijak. Mereka telah meletakkan aset-aset penting dunia di Israel. Jadi, sesiapa tidak boleh serang Israel begitu sahaja. Bayangkan jika tiba-tiba app store iphone tidak berfungsi di seluruh dunia? Bayangkan jika processor-processor yang digunakan di hampir semua komputer/laptop kita meningkat harganya berkali-kali ganda? Mereka kuat bukan kerana mereka letak dadah kat tentera mereka (again: “Tentera Israel dibius dengan dadah untuk menjadikan mereka kuat, dan tak rasa sakit.” <- MACAM NI LAH KAMU MENDEWA-DEWAKAN ORANG YAHUDI ), tetapi kerana mereka menghasilkan komoditi-komoditi yang penting, lantas menguasai ekonomi dunia, dan sekaligus kapitalis yang bergantung kepada komuditi ini. Rakan-rakan sekelian, saya mintak anda untuk tukar mindset anda. Pertama, “Do not fear them”. Mereka manusia seperti kita juga. Jangan kamu jadikan alasan bahawa orang yahudi itu genius sebab makanan dari syurga. Think of it this way, kebanyakan orang yahudi telah dibunuh orang nazi. Saya tak ingat documentari mana saya tengok, tapi apa yang dikatakan mereka orang-orang yahudi di Israel itu adalah keturunan satu/dua orang yahudi asal sahaja. Kebanyakan baka diorang dah bercampur dengan arab/palestine/iraq sebagainya. So, apa yang membezakan mereka dengan kita? Ingat, bukan semua orang Kafir musuh kita. Rasulullah SAW pernah berkata, hormatilah orang kafir yang tidak memusuhi orang Islam. Nabi sendiri kata “hormatilah”. Pernah dalam satu lagi hadir, seorang kafir memberi salam kepada Aishah. Aishah menjawah “waalaikumussam” atau maksudnya “celakalah kamu”. Kemudian Rasulullah SAW menegur Aishah supaya menjawab salam orang kafir dengan perkataan “waalaika” atau maksudnya “kepada kamu juga”. Ingat pada zaman salahuddin, antara cara untuk menembusi tembok Constantinople adalah dengan menggunakan meriam yang sangat besar. Adakah orang Islam yang mereka meriam itu? Tidak! Orang kafir yang membina meriam itu, diupah oleh Salahuddin. “De not fear them. Befriend them.” Kedua, kuatkan diri anda dan orang Islam. Belajar untuk tahu, supaya anda dapat berbakti apabila khidmat anda diperlukan. Rakan-rakan sekelian, post ini pertama sekali akan sampai ke pelajar IIUM. Jika anda pelajar IIUM, saya ada soalan untuk anda, jika ada satu tempat dimana orang Islam mengumpul kekuatan ilmiah, dimanakah tempat tersebut? Dimanakan tempat dimana belia-belia Islam mengumpul Ilmu dengan harapan untuk menerbalikkan dunia kembali? Dimanakan tempatnya orang Islam seluruh dunia menaruh harapan untuk menghasilkan insan-insan yang mampu untuk meningkatkan ekonomi orang Islam? Jika akan ada syarikat-syarikat Islam yang akan membuka mata dunia, dari manakah mereka? Tips: IIUM ialah singkatan untuk International Islamic University Malaysia. Please… live up to the name. Ada pepatah mengatakan “A wise man hire a person wiser than him”. Sepandai manapun kamu, jika akhirnya kamu bekerja dibawah syarikat orang kafir, hakikatnya orang kafir itu lebih pandai dari kamu, dan kamu sedang membantu mereka. Sebanyak mana gaji yang mereka berikan, banyak lagi keuntungan yang mereka dapat dari kamu. Ingat, di syurga, tempat peniaga-peniaga itu di sebelah nabi. Di masa-masa sebegini, perniagaan itu adalah peperangan. Untuk menguasai ekonomi, kita perlukan perniagaan. Saya nasihatkan anda dan diri saya, lepas graduate, kerja 3 tahun, pastu kumpulkan member-member lama, buat bisnes. Jangan takut muflis. Percayalah, orang yang pernah muflis berkemungkinan besar akan berjaya dalam perniagaan. Kita kuasai ekonomi, kita kuasa aset, kita tingkatkan kepentingan kita di dunia, kita jadi kuat. Rakan-rakan sekelian, esok, kita akan keluar dari rumah, berjalan pergi kelas macam biasa. Tapi saya harap, janganlah kamu lupa apa yang saya luahkan kepada kamu hari ini. Biar dari luaran, kita pelajar biasa, belajar apa yang kita mampu, tapi dari dalam, kita ada niat, niat yang mana satu hari nanti bila kita pergi meninggalkan dunia, apabila Dia bertanya, kita boleh jawab dengan yakin apa yang kita telah lakukan di dunia untuk Islam. Ingat cerita tentang burung pipit yang cuba memadam api yang membakar Nabi Ibrahim AS. Walaupun sedikit sekurang-kurangnya dia berusaha. Jika kamu faham tentang pentingnya artikel ini, tolonglah sebarkannya melalui apa sahaja medium yang kamu tahu. Itu sahaja daripada saya. Asalamualaikum.

Personal Projects

Status update!

Assalamualaikum semua! Apa khabar!

Status update:
 Saya akan kembali ke CFS IIUM lusa nanti. Tada! Tak sabar nak balik. Bila dah sampai nak balik rumah pulak. Tak tetap pendirian.

YourAgregator mode:

So, semalam(kalau tak silap saya) saya dah upload YourAgregator update terkini. Untuk upload ini, saya telah update Styler, tambah kebolehan untuk PM walaupun buat masa ini, dashboard PM sangat tidak berfungsi, kebolehan Styler untuk mengubah setiap style telah ditambah so, moderator boleh ubah style Chatter dan agpages yang lain, sedikit perubahan dengan sanitize feed, ada thumbnail untuk post yang ada gambar (walaupun tak ada dalam gambar di atas), dan yang paling jelas, perubahan style asal seperti yang diatas. Somehow, saya rasa ianya tidak appropriate. But its nice to see a new face. Oh ya! Styler sekarang boleh upload gambar untuk dijadikan background.

Automatic IIUM Schedule Formatter mode:
AIIUMSF punya save to facebook button sekarang akan bukak di tab yang baru. So, there is no need for Save dulu baru Save to FB. Dan beberapa bugfix, yang paling ketara ialah sekarang ianya boleh digunakan dengan Firefox (dulu tak boleh, masalah teknikal).


Bagamana nak buat program GUI Ringkas dengan C# dan .Net Framework

WARNING: Saya rasa ada banyak kesilapan ejaan dan keterlajuan dalam article ini. So… good luck.

Assalamualaikum semua! Apa khabar! Pada hari ini, saya akan tulis tentang bagaimana untuk buat program Graphical User Interface (GUI) yang ringkas dengan C#. Article ini adalah terjemahan dari article saya yang lain kat RookieCode, so kemungkinan besar akan ada banyak masalah terjemahan.

Oh, mari kita mulakan. Mula-mula sekali mari kita mengenal C# dan sejarahnya. C#(disebut C-sharp) merupakan satu bahasa programming yang agak baru. Bahasa ini diperkenalkan oleh Microsoft sebagai bahasa rasmi .Net Framework mereka. C# bertujuan untuk menggabungkan kelebihan-kelebihan C++ dan Java dalam satu platform. Ia lebih laju dari Java dan jauh lebih mudah untuk digunakan dari C++. Seperti Java, C# bukanlah compiled language semata-mata. Ianya adalah gabungan compiled language dan interpreted language. Source Code C# tidak di-compile terus kepada machine-code, tetapi ianya di-compile kepada sejenis bytecode khas yang mana akan dicompile pula kepada machine code oleh .Net CLR(Common Language Runtime) ketika program itu dijalankan. Disebabkan ini, program C# boleh di-optimumkan kepada CPU pengguna tanpa perlu binary berlainan. .Net Framework (disebut Dot-Net framework), merupakan satu kolleksi library/API yang boleh diakses daripada beberapa programming language yang menyokong .Net Framework. Bahasa utamanya adalah C#, namun ia juga boleh digunakan dengan bahasa programming yang lain seperti C++, J# dan Visual Basic .Net. Bahasa programming tersebut perlu dicompile kepada bytecode khas sepertimana juga C#. Ini membolehkan bahasa programming lain mengakses utility yang dibuat menggunakan bahasa programming yang lain dengan cara yang sangat portable. .Net Framework sudah diinstall secara default atas Windows XP service pack 2 dan keatas. Windows XP sebelum service pack 2 boleh download .Net Framework secara berasingan. .Net Framework tidak boleh digunakan untuk Windows Millennium dan sebelumnya. Untuk Linux, satu projek yang dipanggil “mono” membolehkan program .Net untuk berfungsi walaupun dengan sedikit masalah compatibility.

Di post ini, kita akan menggunakan Microsoft Visual C# Express Edition untuk buat program kita. Edisi Express boleh didapati secara percuma di sini . Microsoft Visual Studio ialah koleksi IDE(Integrated Development Environment) untuk pembangunan program, Lesen standardnya tidak percuma walaupun ianya mungkin adalah IDE terbaik sekali.

Baiklah, mari kita mulakan. Start Visual C#, anda akan jumpa screen seperti dibawah.

Tekan butang “New Project”.

Pilih “Windows Forms Application” dan tukar nama projek kepada “MyMouseFollower” atau apa-apa yang kamu suka.Tekan “OK” dan screen pertama yang sepatutnya kamu jumpa ialah form builder seperti dibawah.

Form builder adalah satu peralatan yang membolehkan anda untuk menyusun komponen program anda dengan mudah tanpa menggunakan kod directly. Di bahagian atas kiri form builder ada satu butang “Toolbar”. Tekan butang tersebut dan senarai “Control” yang kamu boleh gunakan akan muncul.

Untuk projek ini, kita akan menggunakan “Panel”. Secara ringkasnya, Panel adalah ruang kosong yang mana kita akan lukis diatasnya nanti.Tekan “Panel” dan drag-drop atas “Form”

Juga, pilih “Label” dan letakkannya dibawah panel tadi.

Sekarang tulisan di label itu ialah ‘label1’ dan itu bukanlah apa yang kita nak. Right click diatasnya, kemudian tekan “properties”. Satu tab akan muncul di belah kanan screen.

Tab ini membolehkan anda untuk mengubah property Control yang dipilih. Edit property “Text” label1 kepada “My mouse follower” atau apa-apa yang kamu suka. Tulisan di label1 patut bertukar dari “label1” kepada “My mouse follower”.

Kamu boleh jalankan program tersebut menggunakan butang “Start Debugging” yang terletak di toolbar atas. Satu window yang berfungsi akan muncul walaupun dalam keadaanya sekarang ianya tidak berguna dan membosankan.

Baiklah, sekarang mari kita buat programming. Di bahagian kanan screen,

Ada tab yang menunjukkan file-file yang ada dalam projek. Pilih “Form1.cs” (file yang tengah kita pakai), right click-nya, dan tekan “View Code”.

Ini adalah kode untuk Form1 ditulis dalam C#. Lapan baris pertama terdiri dimulakan dengan perkataan “using”. Kata kunci “using” memberitahu compiler namespace mana yang kita gunakan. .Net Framework merangkumi banyak program/utility. Untuk memudahkan pengurusan program tersebut, utiliti-utiliti tersebut dikumpulkan dalam kumpulan yang dipanggil namespace. namespace bermaksud ruang nama. Ianya digunakan untuk mengelakkan kekeliruan antara class yang mempunyai nama yang sama dan juga untuk mengatur class yang sama jenis/kegunaan. Dalam kod diatas, class “Form1” terkandung antara dua “curly braces” yang dimulakan dengan perkataan “namespace MyMouseFollower”. Ini menunjukkan yang class Form1 terletak didalam namespace MyMouseFollower. class dari namespace lain boleh mengakses class Form1 menggunakan nama penuhnya iaitu “MyMouseFollower.Form1”. Ataupun, kita boleh letak baris “using MyMouseFollower” di permulaan source code class tersebut dan hanya menggunakan “Form1”. Kita akan lihat bagaimana ia dilakukan nanti.

Baris “public partial class Form1:Form” mengisytiharkan class yang bernama “Form1”. Dalam object oriented programming, class ialah kod yang “define” sesuatu object. Fikirkan perkataan “class” itu lebih kepada “kereta ber-class C” dan bukannya “class room”. Butiran Object Oriented Programming agak sukar untuk diterangkan di peringkan ini. Buat masa ini, aggap sahaja bahawa class Form1, mengumpulkan beberapa kode. Kata kunci “public”, bermaksud class ini boleh diakses dari luar namespacenya dan kata kunci “partial” bermaksud source code ini hanyalah sebahagian daripada Form1 yang mana sebahagian lagi dijana oleh form builder.

Baris “public Form1()” mengisytiharkan satu method/subroutine/function. subroutine, secara ringkasnya adalah sekumpulan kode-kode. Dalam kes ini, hanya ada satu baris kod iaitu “InitializeComponent()”. Kode ini bermaksud, jalankan method yang bernama “InitializeComponent” yang diisytiharkan oleh form builder di partial yang lain. Lihat bahawa method “Form1” mempunyai nama yang sama dengan class tersebut. Method yang mempuntai nama yang sama dengan class adalah constructor kepada class itu. Ini bermakna method “Form1” merupakan constructor kepada class “Form1”. Apabila sesuatu object diwujudkan, constructor kepada class object tersebut dijalankan untuk membina object tersebut.

Sekarang ini, kode hanya menyusun control kepada form itu sahaja. Mari kita ubahnya untuk buat sesuatu yang lebih menarik. Dibawah baris “InitializeComponent”, tulis “pa”.

Satu dropdown menu akan muncul, menyenaraikan perkataan-perkataan yang sesuai diletakkan. Antara perkataan tersebut adalah “panel1”. Ingat bahawa nama panel yang kita letak di form builder adalah “panel1”. Form builder akan secara automatiknya, membuat satu global variable yang sama nama dengan panel tersebut di partial yang lain untuk memudahkan kita mengakses control tersebut. Atas perkataan “panel1”, ada perkataan “Panel”. Panel adalah nama class yang “define” satu panel dalam form. Nama penuhnya adalah System.Windows.Form.Panel. Tetapi, disebabkan kita telah meletakkan baris “using System.Windows.Form”, perkataan “Panel” sudah mencukupi. Secara konvensional, nama class dimulakan dengan huruf besar manakala nama property dimulakan dengan huruf kecil. Kamu boleh menggunakan Panel untuk meletakkan panel secara manual, namun, bukan itu yang kita akan buat pada hari ini. Rujukan lengkap tentang class apa yang ada dalam .Net Framework boleh didapati di sini. Sekarang, tekan Tab dan ia akan lengkapkan perkataan tersebut. Kemudian taip lagi “.pa” dihadapannya.

Sekarang satu lagi dropdown menu muncul tetapi dengan perkataan yang lain. Apabila kita menggunakan symbol ‘.’, kita menyatakan bahawa kita sedang memilih property/attribute/member object tersebut. Dan itu yang kita akan lakukan. Kita akan lihat nanti bagaimana untuk buat property kita sendiri. Sekarang, tekan tab untuk auto-complete perkataan Paint. Kemudian, tambah “+=” dihadapannya.

Property “Paint” ialah sejenis delegate satu lagi feature C# yang agak advance. Untuk kali ini, kita tidak belajar secara mendalam tentang delegate. Kita hanya akan menggunakannya. Secara ringkasnya, delegate merupakan satu system event-handler yang ada dalam C# yang membolehkan kita untuk menjalankan sesuatu method apabila satu event berlaku. Dalam kes ini, event “Paint” berlaku apabila control tersebut dilukis. Tekat Tab dua kali dan ia akan menjana satu method.

method yang baru dijanakan sebentar tadi dinamakan “panel1_Paint”. Kata kunci “void” bermaksud method ini tidak me-“return” sebarang data. Apa yang dimaksudkan dengan “return” itu tidak akan kita bincangkan pada hari ini memandangkan setiap method yang kita buat pada hari ini adalah method yang tidak me-return sebarang variable. Method ini juga mempunyai parameter “object sender” dan “PaintEventArgs e”. parameter adalah nilai/variables yang boleh diberi kepada method ini. variable atau dalam bahasa melayunya pembolehubah merupakan tempat untuk meletakkan nilai atau object sepertimana juga property yang mana kemungkinan besar merupakan public variable. Kita akan lihat bagaimana untuk mengisytihar variable sebentar nanti. Secara defaultnya method ini mengandungi satu baris kode yakni “throw new NotImplementedException()”. Secara ringkasnya, kode ini akan menghasilkan satu exception. exception merupakan “simbol masalah yang terkawal”. Dalam kes ini, ia akan menghasilkan exception kerana kita tidak memberitahu apa yang nak dibuat. Disamping itu, lihat bahawa setiap statement diakhiri dengan semicolon ‘;’. Dalam C#, setiap statement diakhiri dengan semicolon. Sekarang, padam baris exception tersebut dan salin kode dibawah.

Baris pertama “Graphics g=e.Graphics;” menunjukkan cara untuk mengishtihar dan meletakkan object kepada satu variable baru yang bernama ‘g’. C# ialah sejenis bahasa programming yang ‘strongly type’. Ini bermakna, setiap variable perlu ada ‘jenis/type’ yang jelas. ‘jenis/type’ dalam kontext ini adalah satu nama class ataupun jenis yang sudah terbina dalam C#. Dalam kes ini ‘g’ adalah satu variable berjenis ‘Graphics’. ‘Graphics’ ialah satu class yang membolehkan kita untuk melukis di atas sesuatu. Nama penuhnya adalah ‘System.Drawing.Graphics’. Simbol ‘=’ adalah simbol ‘assignment/peletak’, yang bermakna nilai di sebelah kanan simbol akan disalin ke variable di sebelah kiri simbol. Secara ringkasnya, kita sedang membuat satu variable bernama ‘g’ yang berjenis ‘Graphics’ dengan nilai daripada ‘e.Graphics’ yang mana ‘Graphics’ di sini adalah property kepada variable ‘e’ yang merupakan parameter kepada method ‘panel1_Paint’.

Di baris seterusnya kita sedang call/memanggil method ‘DrawString’ daripada variable g. Lihat di tooltip ada perkataan ‘1 of 6’ dan anak panah di tepinya. Jika kamu click anak panah tersebut, kamu akan lihat method DrawString boleh menerima lebih dari satu jenis set parameter dengan susunan jenis yang berbeza. Dalam kes ini ada 6 set. Ini dipanggil method/function overloading. Sebenarnya dalam class Graphics, ada 6 method yang mempunyai nama yang sama yakni “DrawString” tetapi setiap satu mempunyai set parameter yang berlainan. Compiler akan secara automatiknya memilih method yang betul bergantung kepada variable yang diberi semasa method call.

Dalam kes ini kita akan menggunakan overload yang ketiga. Isikan method call ini mengikut screenshot dibawah. Kamu tidak perlu untuk click anak panah untuk memilih function overload. Tool tip tersebut hanyalah alat bantuan semata-mata.

Oh ya! semasa kamu sedang mengisi parameter ‘brush’, tooltip akan keluarkan beberapa kata kunci yang bermula dengan ‘Bru’ dan berkaitan dengannya. Buat masa ini, saya cadangkan kamu gunakan sahaja “Brushes” yang mengandungi koleksi ‘Brush’ yang sudah sedia ada.

Apabila kamu sudah melengkapkan kod tersebut, jalankan program dengan menekan butang “Start debugging” atau menggunakan shortcut F5. Kamu patut lihat satu window seperti di bawah.

Begitulah caranya programmer melukis diatas panel. Perhatikan bahawa nilai x adalah 5, manakala nilai y adalah 50. Dalam kebanyakan programming toolkit, origin (x=0,y=0) terletak di atas kiri screen/panel dan nilai positif y menghala ke bawah. Ini bermakna apabila nilai y meningkat, lukisan akan begerak ke bawah, dan apabila nilai x meningkat, lukisan akan bergerak ke kanan. 
Sekarang, mari kita buat sesuatu yang lebih menarik. Ishtiharkan dua global variable seperti di bawah.

global variable secara ringkasnya adalah variable yang diishtiharkan di luar class method. Bezanya adalah global variable boleh diakses dari mana-mana class method, dan sebarang perubahan terhadap global variable akan dikekalkan sepanjang hayat object tersebut. Berbanding global variable, local variable (variable didalam method) hanya boleh diakses didalam method tersebut dan diishtiharkan semula setiap kali method itu digunakan. “int” pula bermaksud “integer” iaitu salah satu type/jenis yang sudah terbina dalam C#, digunakan untuk menyimpan nombor bulat.

Seterusnya, kita tambah lagi satu handler untuk “MouseMove” event seperti mana yang kita lakukan dengan “Paint” event.

Dalam mouse handler, gunakan kode seperti di atas.

Kemudian, ubah paint handler kepada kod diatas.

So, apabila tetikus bergerak di atas panel, ia patut tukar variable “myx” dan “myy” kepada kedudukan tetikus dan apabila panel dilukis, ia akan melukis dua garisan yang akan bertemu di kedudukan tetikus. Sekarang, mari kita cuba program itu, tekan F5 dan kamu patut lihat window seperti di bawah.

Cuba gerakkan tetikus di atas panel tersebut, adakah garisan itu bergerak? Kenape? Tips: Minimize, kemudian maximize window tersebut. Sekarang garisan itu patut berada di kedudukan yang berbeza.

Masalahnya di sini adalah, event paint hanya berlaku ketika window perlu dilukis semula. Contohnya ketika window tersebut didedahkan daripada bawah window yang lain atau dalam kes ini, apabila window sedang di maximize. Sistem Operasi (selalunya) tidak akan ingat bagaimana rupa sesuatu window apabila ia di maximize, jadi ia minta program tersebut untuk melukis dirinya sendiri. Dan pada waktu itulah paint handler digunakan, yang mana ketika itu, ia akan melukis garisan bergantung kepada kedudukan tetikus yang disimpan. Untuk membuatkan garisan itu bergerak mengikut tetikus, kita perlu invalidate(bermaksud tidak sah) panel apabila mouse bergerak.

Untuk invalidate panel tersebut, kita gunakan method Invalidate(). Secara ringkasnya, method ini akan menandakan panel itu sebagai tidak sah, jadi ia perlu dilukis semula. Ubah kode di mouse handler seperti di atas dan jalankan program.

Sekarang kamu patut lihat garisan itu bergerak mengikut tetikus. Sekarang, mari kita buat sesuatu yang lebih menarik. Ubah paint handler anda seperti di bawah.

Baris “int phase=(DateTime.Now.Milisecond/100)%10” secara ringkasnya bermaksud, dapatkan masa sekarang dalam milisaat, bahagi dengan 100 dan kemudian dapatkan baki jika dibahagi lagi dengan 10. Hasilnya ia akan menjadi nombor diantara 0 hingga 9 yang meningkat 1 setiap 100 milisaat. Bagaimana ia berguna akan ditunjuk sebentar nanti.

Kata kunci ‘while’ akan menyebabkan komputer menjalankan kode didalam curly bracket(loop/block) selagi expression “i<5" itu benar. Expressi "i<5" dikira benar selagi nilai dalam variable "i" itu kurang dari 5. Disebabkan "i" asalnya 0, dan ianya ditambah 1 setiap kali block ini dijalankan, code didalam block ini akan dijalankan sebanyak 5 kali. Didalam block tersebut, kita mengira ‘ciclesize’ iaitu 10 x nombor loop + phase. Kemudian kita lukis bulatan di tengah-tengah panel. Apa yang ia lakukan? Well, mari kita jalankannya dan program kamu patut jadi sebegini.

Lima bulatan didalam bulatan yang lain. Jika kamu terus menggerakkan tetikus kamu, kamu akan perasan yang ianya sebenarnya satu animasi. Tetapi untuk ia bergerak, kamu perlu terus menggerakkan tetikus kamu supaya ia akan invalidate panel tersebut supaya panel itu akan dilukis semula. Untuk membolehkan ia bergerak tanpa menggunakan mouse, kita boleh gunalan Timer.

Ubah kod anda menjadi seperti yang diatas. Event “Tick” pemasa, akan berlaku setiap 100 milisaat jika di set seperti yang diatas. Di dalam handler, ia invalidate panel1. Disebabkan panel1 invalidate setiap 100 milisaat, kita tidak perlu invalidatenye dalam MouseMove handler. Tetapi tidak ada salahnya jika kita biarkan sahaja kod tersebut. Sekarang, bulatan itu akan terus bergerak walaupun tetikus tidak bergerak.

Sekarang, cuba anda tukar kod di paint handler seperti yang diatas. Cuba teka apa yang berlaku?

Sekarang bulatan itu akan mengikut tetikus! Dua perubahan ringkas dan ia lakukan sesuatu yang nampak komplex. Membuat program itu senang, tetapi buat program bagus yang senang diubah itu susah.

Kamu perasan tak yang lukisan ini macam berkelip/flicker. Itu kerana, lukisan ini ditunjukkan walaupun ia belum siap. Ada technique ringkas yang boleh mengatasi masalah ini. Ia dipanggil double buffering. Secara ringkasnya ia bermaksud, kita lukis diatas satu image(buffer), kemudian kita lukis image tersebut diatas panel. Panel ada double buffering sedia ada yang tidak dihidupkan. Namun, untuk set double buffering, kita perlu subclass Panel terlebih dahulu, sesuatu yang agak mengelirukan buat masa ini. Jadi kita akan buat implementasi double buffering kita sendiri.

Secara ringkasnya, kita akan buat satu Bitmap(sejenis Image) yang sama saiz dengan panel, kemudian kita lukis atas Bitmap itu, dan kemudian kita lukis Bitmap itu diatas panel. Jalankan program ini, dan kamu patut lihat pengurangan flicker yang agak drastik. Dan apa yang kita lakukan cumalah tambah dua baris dan ubah satu. Disebabkan kita simpan e.Graphics di variable g terlebih dahulu dan kemudian lukis menggunakan g dan bukannya secara terus dari e.Graphics, kita hanya perlu ubah ‘g’ dan segalanya akan berubah.

So, apa yang kita belajar hari ini? Ada banyak benda yang boleh dibuat dalam program. Buat program itu senang, tapi buat program yang bagus itu susah. So, sekarang ni, apa kata kamu try ubah kod kamu mengikut apa yang kamu suka. Selamat berjaya, good luck dan Assalamualaikum.


Automatic IIUM Schedule Formatter, now v4.0!

Assalamualaikum semua! Apa khabar? What are you thinking? May be you are thinking “What? 4.0 already?”. Well, versi sebelum ini adalah 3.3, macam mana boleh sampai situ saya tak tau, dan kali ini ada sikit incompatible update, so “git tag v4.0”.

So whats new? Sebenarnya ada dua aje benda yang baru, pertama styler yang baru dan kedua kebolehan untuk save sebagai gambar di facebook. Styler tersebut merupakan update daripada YourAgregator yang ada sekarang yang mana datang daripada AIIUMSF yang dulu yang mana datang daripada YourAgregator yang asal. So, mari kita lihat screenshot…..

Di bawah kiri ada butang expand/shrink.

Styler yang baru ini secara layoutnya berlainan dengan styler yang lama. Di styler yang lama, css mengandungi senarai ‘selector’ yang boleh di style-kan. Layout control, kedudukan slider untuk border, padding dan sebagainya fixed. Malangnya design tersebut sangat tidak sesuai untuk css yang mana untuk ubah sesuatu mungkin kita perlu ubah ‘parent’ kepada sesuatu itu. Tambahan lagi, ianya susah nak digunakan.

Berbeza dengan dahulu, css sekarang ini mengandungi layout kepada control tersebut. Ini bermakna, kedudukan setting sesuatu di styler boleh diubah dengan mengedit css. Kalau tak faham tak ape. Senang cakap, designer sekarang boleh meletakkan ‘control’ di tab mana yang diorang suka, membolehkan mereka untuk me-layout untuk memudahkan pengguna.

Jika kita lihat di css yang asal, ia menganding satu comment bertanda ‘layout’ yang mengandungi JSON(JavaScript Object Notation) yang menandakan kedudukan sesuatu control serta css selector yang control tersebut kawal.

By the way, ini adalah default style yang baru.

Lagi satu tambahan AIIUMSF adalah butang “Save in FB”. Basically, ia akan keluarkan dialog di facebook meminta kebenaran untuk publish stream, benarkan dan jadual anda patut ada dalam gallery. Amaran, “Save in FB” tidak keluar dalam tab yang baru macam “Save”, dan kemungkinan besar jadual anda tidak akan render dengan betul di FB. Ianya disebabkan kelemahan Google Conversion api, dan disebabkan saya tidak menggunakan ‘server’ yang sebenar, saya tak boleh buat apa-apa untuk membetulkannya. So, saya rekemen kamu “Save” dahulu sebelum “Save in FB”.

And… thats about what it should do. Arahan penggunaan boleh didapati di, tolong like page tersebut, Bye bye dan Assalamualaikum.


Welcome to YourAgregator!

Ini adalah salinan daripada post di YourAgregator….


Assalamualaikum semua. Apa khabar? Selamat datang ke iium-news hosted di YourAgregator.
So, sedikit sejarah, lebih kurang 6 bulan lepas, saya telah buat blog pribadi saya, yakni And so, me-market-kan blog it di seluruh group facebook. Pada awalnya sambutan agak ok-lah, namun selepas itu, kita lihat kalau tak share, maka tak jadi apa-apa. Ini sesuatu yang agak menyedihkan kerana sesetengah blog agak best untuk dibaca, namun tidak ada saluran yang menunjukkan mana satu post yang best. So, akhirnya, di blog post saya, , saya menceritakan tentang hasrat saya untuk membuat satu website yang adalah untuk mengumpulkan (aggregate) blog post-blog post, di satu tempat, siap dengan rating system yang unik yang boleh menyelesaikan masalah ini, maka muncullah YourAgregator. 
So pada hari ini, 25 Mei 2012, YourAgregator telah sampai ke tahap yang saya kata boleh kata…. beta-alpa stage.So hari ini saya memulakan marketing YourAgregator kepada anda semua (blogger iium) dengan harapan, anda semua akan mencuba iium-news, satu Agregator di YourAgregator, untuk memasarkan blog anda. 

Bagaimana IIUM-NEWS berfungsi?

Di blog post ini  saya ada menceritakan sedikit tentang falsafah YourAgregator dengan agak detail. Secara ringkasnya, YourAgregator bertindak sebagai hosting kepada aggregator-aggregator yang mempunyai subdomain di Contohnya, url untuk IIUM-NEWS adalah Di, setiap agregator, ada beberapa moderator dan member. Member kepada agregator itu boleh submit blog diorang kepada agregator tersebut, dan kemudian moderator boleh approve blog tersebut untuk memastikan integriti blog tersebut. Selepas mensubmit blog, blog post tersebut akan diindexkan dekat feedroll (muka depan aggregator).
So, setiap kali orang melawat, benda pertama yang diorang jumpa adalah senarai-senarai blog post yang paling baru atau rating yang paling tinggi. Post-post yang diatas mempunyai peluang yang lebih tinggi untuk di-click, maka pelawat akan melawat pula blog anda di post tersebut.

Apa yang membezakan blog post yang bagus dengan yang tak bagus.

Sistem “niceness”, yakni sistem rating YourAgregator. Di youragregator, kita ada satu consept yang dipanggil “niceness” yang secara ringkasnya merupakan score kepada sesuatu. Di YourAgregator post, feed, dan member mempunyai niceness. Post ialah blog-post atau berita. Feed adalah sumber post, contohnya blog. Setiap member boleh rate “niceness” post atau feed. Apabila mereka rate sesuatu post/feed, niceness post/feed tersebut ditambah/ditolak dengan niceness member tersebut. Dan apabila member rate post atau feed, niceness mereka naik. Dan disebabkan niceness asal post yang baru adalah niceness member+niceness feed, maka post yang datang dari member yang ada niceness yang tinggi mempunyai niceness yang banyak berbanding post yang lain.
Bottomline, the more you rate other’s post, the higher you post’s rating. 

So, apa yang saya patut buat?

1. Login menggunakan link di atas kanan (saya recommend login dari Facebook). Twitter login tidak berfungsi, so takyah try.
2. Join IIUM-NEWS. Link di atas kanan juga.
3. Submit blog anda.
4. Baca dan rate blog post orang. 

By the way… di-hostkan di Google App Engine dengan free quota. Dalam kata yang lain, disebabkan saya takde duit, maka hosting YourAgregator agak lemah and so, akan ada masa anda akan jumpa screen yang mengatakan quota sudah penuh. Jangan risau, youragregator akan berfungsi kembali sepenuhnya pada keesokan hari, lebih kurang dalam pukul 3. Dan lagi satu, buat masa ini YourAgregator di-bangunkan oleh seorang manusia sahaja, so berkemungkinan besar ada banyak lagi “bug-bug” merata tempat. Sesiapa yang berminat untuk membantu dari segi tenaga kerja atau kewangan sangat dialu-alukan….

Compilation of YourAgregator TODO

Hi there! These are YourAgregator’s old and new TODO list.

  1. A middleware for agregator and member (for consistency).(on testing)
  2. A decorator for member only.(on testing)
  3. Move the commment template to javascript (reduce server workload and increase responsiveness). Did that, for 5% performance, it’s not worth it.
  4. Hash hack backup plan for ajax page.
  5. Add a favicon.ico.
  6. Ubah kedudukan perkataan ‘post’.
  7. Set default kepada recent.
  8. Use jQuery UI accordian in the submit page.
  9. Add suppost to submit just Post instead of RSS.
  10. Rasanya ada bug sikit. Cuba submit blog hzaid tak boleh. Kenape yek? (ada sikit bug, patut dah dibetulkan. ini disebabkan ada agregator lain yang ada rss yang sama link.
  11. When auto approve is on, when user join or submit, show the correct message.
  12. Fix the ‘at’ None problem. Done a fix but don’t know if it work.
  13. META tags.Did some.
  14. Unified menu for all pages and remove the back button.
  15. Make the rss reloader allow hyperlinks and .
  16. Make a decorator ‘mainpage-only’ the opposite of ‘indomaindecorator’
  17. A central page in the main webpage that list all available agregator.
  18. Database optimization using db.Models.values()
  19. Allow admin to make ‘pages’. 
  20. In manage-mamber, kat permission field, render elok sikit 🙂
  21. The feed table in manage-submission, make select all button and load only part of the data and make pages for the table and make sorting.
  22. On agregator, when no data and when search is not empty, prompt user that that is a search result.
  23. Major overhaul on the theming system.Improve template speed.
  24. Allow admin to make ‘pages’.
  25.  Chat support in agregator.
  26. Make an option to open a dialog when the user click join so user can send message to admin saying something.
  27. ROBOT.txt
  28. Somehow, view post only from some rss or someone.>make advance sort/limit
  29. In manage-submission, when delete rss feed, prompt to delete post too or handle the dereference of feed or agregator will crash.
  30. Make the reloadrss reload rss with the same url only once.
  31. Add max/min value to the Styler.
  32. Add an about page.
  33. Theme gallery
  34. Refactor the media file.
  35. Make use of Jinja2
  36. New niceness system
  37. Make use of hubsub protokol
  38. Make a feed page.
  39. Agregator page’s url modification. 
  40. Help in googlebot scraping.]
  41. Complete the ClientChannel api.
  42. Port Chatter to use ClientChannel
  43. Escape some variables in templates.
  44. In the manager, new way to rename agpages.
  45. Redesign top menu
  46. Ability to scrape post with certain tags only,
  47. More caching!
  48. Better user information (photo, inbox)
  49. Messaging sistem.
  50. Heavy design work on the main page.
  51. Build a layout system
  52. Add a blog (main blog not agregator blog)
  53. Heavy design work on the main page.
  54. Terms and Policy
  55. Add a system where moderator can ask question to new member.
  56. Feedback to moderator.
  57. Documentation.
  58. Ability to rearrange page order in menu.
  59. Manage interface redesign.
  60. Moderator can host media file.
  61. Category
  62. Add error status when cannot get rss.
  63. Different color for post with different rating.
  64. Ability to make agregator, public/private.
  65. Change the default style to conform with the new layout.
  66. Sidepane, pane.
  67. Mainpage style.
  68. Agpages that show online members.
  69. Agpages that show part of agregators.
  70. Notification based on ClientChannel that shows when someone is online or a blog has been updated.
  71. Messaging system between users.
  72. New styler with ability to describe layout of styler from css.
  73. Better ranking algorithm, member cannot just increase point by rating everything. There need to be a cooldown duration. And ablity only partially rank a post and ‘de-rank’ a post.
  74. More than one default style.
  75. Forum agpages.

YourAgregator Refresh!

Assalamualaikum dan selamat pagi. So. pada hari ini, saya akan membincangkan tentang status terkini tentang YourAgregator. Seperti yang dibincangkan di post yang lepas, nampaknya saya sudah tidak membincangkan sangat tentang YourAgregator dalam blog ini. Malah lebih mengejutkan, selepas saya melihat kembali post-post  saya, saya baru sedar yang post terakhir tentang YourAgregator adalah pada 5 januari 2012, 4 bulan yang lepas.

So, apa ceritanya tentang YourAgregator? Seperti yang telah dikatakan dengan briefly pada pada post lepas, YourAgregator masih lagi dalam pembangunan, malah jika kita lihat screenshot bawah ini, sebenarnya banyak jugak commit yang tidak diceritakan.

Dan ada lagi dua muka surat sebelum 5 januari. So, pada hari ini, saya akan buat refresh tentang apa yang saya telah letak kat youragregator, bermula dari 5 january sehingga semalam, of course bukan hari-hari lah, so, mari kita lihat. Sebenarnya kebanyakan commit di atas adalah Fix, dan hanya sebahagian merupakan tambahan feature.

24 Februari 2012
-Now search will only react to tags.
    Maknanya, sekarang search hanya akan search tags.Ini adalah kerana search index mengambil banyak database ops, so saya buat ia hanya akan pakai tags. Disebabkan perubahan ini, YourAgregator sekarang boleh menerima lebih kurang 20 blogs setiap hari.

 18 Mey 2012
-Change the feedroll blog link to default on internal link.
   Apa yang dimaksudkan di sini adalah, kat blogroll, kat ada link kepada blog kan? Pastu kat sebelah dia ada “>” yang link kepada rss page tentang blog to kat dalam youragregator, sekarang dah terbalik, “>” pergi blog, nama blog pergi youragregator.

9 April 2012
-Now the topmenu is using a dropdown menu.
In another word:

Hover your mouse on it.

14 April 2012
-Updated the styler and now using jquery ui radiobutton on some attributes.
Less word, more screenshot!

Update dari Automatic IIUM Schedule Formatter

24 February 2012 – 1 Mei 2012

The Agpages System, Channel API, Port of Chatter to use Agpages and Channel API.

Yang ni, tak boleh di explain menggunakan gambar semata-mata. Tapi boleh membantu. Jika anda lihat di sekarang, anda akan perasan chatter di belah atas kiri sudah hilang. Kemana ia pergi?

By the way, tengok! feedback button kat bawah kanan.

Well, selepas saya letak chatter, saya perasan yang ianya buruk dan mengambil ruang. Tambahan lagi, bila kita pakai screen 4:3 yang lama dulu, ia nampak lebih buruk dari biasa, so saya rasa saya nak letak chatter tu sebagai pages. Pastu, terfikir pulak cam mana nak buat setting untuk rearrange menu kat atas memandangkan ada flatpages+agregator+submit+chat yang menggunakan system yang berlainan tambahan lagi boleh ada lebih daripada satu flatpages. So, akhirnya muncullah konsept AgPages (singkatan untuk Agregator pages). Asalnya saya nak panggil plugins tapi perkataan tu terlalu salah, pastu nak pakai Pages, tapi YourAgregator menggunakan istilah ‘pages’ kat tiga tempat lain secara dalaman, so ia sangat mengelirukan, so akhirnya saya pilih nama AgPages.
So, apa itu Agpages? Well, agpages adalah muka surat yang boleh ditambah kat youragretor. Mari kita lihat screenshot manager pages:

You see, sekarang kita boleh tambah agpages, rename agpages, configure agpages dan rearrange agpages. Berbeza dengan custom pages yang dulu, agpages ini bertindak lebih seperti plugins, kita boleh configure diorang, dan diorang ada code sendiri. Contohnya, bila kita tekan configure untuk agpages About This yeng merupakan jenis flatpages, kita akan jumpa ini:

Yang membolehkan kita untuk edit flatpages tersebut. Itulah Agpages. Technically agpages ini direka untuk membolehkan website lain buat agpages untuk YourAgregator, sama macam facebook tabs, tapi disebabkan masalah dalam mereka REST API dengan segala masalah keselamatan, ianya tidak dijalankan lagi.

So far setakan ini ada tiga jenis agpages iaitu chatter, flatpage dan submit page. More will come later.

Apa pula Channel API? 

Well, nama sebenarnya adalah ClientChannel (untuk mengelakkan kekeliruan dengan google channel api), dan ia timbul apabila saya sudah port chatter kepada agpages.  Masalahnya, agpages boleh ada lebih daripada satu, dan chatter akan diinitialize setiap kali agpages chatter itu dibuka. The problem is, channel api yang diberi oleh  google ada quota sebanyak 100 connection sehari. So, untuk menjimatkan quota dan membolehkan saya untuk buat push notification yang mana belum dibuat, saya telah mereka satu system yang saya panggil Client Channel, yang memboleh lebih daripada satu agpages dan benda lain kat clientside untuk berkomunikasi dengan benda-benda lain kat server side. Ok, so korang tak faham, takpe saya faham. Basically ianya adalah benda internal yang membolehkan saya untuk buat macam-macam benda menarik yang lain. That is ClientChannel API.

9 Mei 2012(semalam)

-Added tha ability to filter post to index based on tags.
Kat screenshot di atas, ada dua field baru iaitu with tags dan without tags. Dengan ini, youragregator hanya akan index post yang ada tags di atas ataupun yang tak ada tags yang dinyatakan.

9 Mei 2012 (jugak)
-Added question support for the moderator to approve new member.
In another word, sekarang moderator boleh tanya soalan kat sapa-sapa yang nak jadi member. Macam nie:

So, itu sajalah yang telah diletakkan. Harap-harap banyak lagi masalah quality yang boleh diselesaikan. So, thats it, bye! Assalamualaikum.