<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4356926631391905302</id><updated>2011-04-22T10:41:55.715+08:00</updated><category term='Linux Kernel'/><category term='Linux VFS'/><category term='bookmarks'/><category term='gdb'/><category term='HereMyPage'/><title type='text'>Banal Banana's BLOG</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bshyu.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bshyu.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Banana Shyu</name><uri>http://www.blogger.com/profile/00646069880288847277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4356926631391905302.post-8289727816081503257</id><published>2008-06-26T11:30:00.006+08:00</published><updated>2008-07-01T10:18:33.522+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux Kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux VFS'/><title type='text'>kernel concepts: confusing dentry &amp; nameidata</title><content type='html'>The &lt;span style="font-style: italic;"&gt;dentry &lt;/span&gt;itself is at first not easy to catch on of its concept within VFS. On one hand, it doesn't like &lt;span style="font-style: italic;"&gt;superblock, inode &lt;/span&gt;and alike structures, which maps directly to the physical disk image. On the other hand, it also doesn't like &lt;span style="font-style: italic;"&gt;file, vfsmount&lt;/span&gt; structures, which even though without physical mapping, but they do have direct process activities relationship - such as open / mount. That is to say, dentry isn't a concept at a surface level where human can catch at first sight.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-style: italic; font-weight: bold;"&gt;dentry &lt;/span&gt;is used for the pathname resolution. However, during the pathname resolution procedure, &lt;span style="font-style: italic;"&gt;path_lookup &lt;/span&gt;or &lt;span style="font-style: italic;"&gt;do_path_lookup&lt;/span&gt;, there is actually another structure involved: struct &lt;span style="font-style: italic; font-weight: bold;"&gt;nameidata&lt;/span&gt;. They are confusing at first, indeed.&lt;br /&gt;&lt;br /&gt;Their major differences are (not clearly stated in books / articles I've read):&lt;br /&gt;&lt;br /&gt;The variables for &lt;span style="font-style: italic;"&gt;nameidata &lt;/span&gt;are always temporary and locally declared, used during the pathname resolution, even though we can see their pointers being passed here and there. There's no such thing of kmalloc or kmem_cache_alloc for them.&lt;br /&gt;&lt;br /&gt;On the other hand, the &lt;span style="font-style: italic;"&gt;dentry &lt;/span&gt;variables are global entities. Even though they are generated dynamically during the pathname lookup procedure, they are not randomly specified. If we look up first the file: /aa/bb/cc.txt, afterwards the file: /aa/bb/dd.txt, then the dentry for 'bb' will be exactly the same object for both lookup: first time by d_alloc to get a new dentry, afterwards by d_lookup to get that same object.&lt;br /&gt;&lt;br /&gt;Another important mission: since &lt;span style="font-style: italic;"&gt;inode &lt;/span&gt;struct objects are &lt;span style="font-style: italic;"&gt;unnamed &lt;/span&gt;entities, to associate them with their proper &lt;span style="font-style: italic;"&gt;name&lt;/span&gt;, it is within kernel by the &lt;span style="font-style: italic;"&gt;dentry &lt;/span&gt;object to provide this liaison - by d_inode field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4356926631391905302-8289727816081503257?l=bshyu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bshyu.blogspot.com/feeds/8289727816081503257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4356926631391905302&amp;postID=8289727816081503257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/8289727816081503257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/8289727816081503257'/><link rel='alternate' type='text/html' href='http://bshyu.blogspot.com/2008/06/linux-kernel-hacking-vfs-dentry.html' title='kernel concepts: confusing dentry &amp; nameidata'/><author><name>Banana Shyu</name><uri>http://www.blogger.com/profile/00646069880288847277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4356926631391905302.post-7482581663494797368</id><published>2008-06-26T08:23:00.003+08:00</published><updated>2008-07-01T10:18:49.661+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux Kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux VFS'/><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><title type='text'>kernel hacking with GDB: VFS mount</title><content type='html'>&lt;span style="font-family:arial;"&gt;"In most traditional Unix-like kernels, each filesystem can be mounted only once. However, Linux is different: it is possible to mount the same filesystem several times. Of course, if a filesystem is mounted &lt;span style="font-weight: bold; font-style: italic;"&gt;n&lt;/span&gt; times, its root directory can be accessed through &lt;span style="font-style: italic; font-weight: bold;"&gt;n&lt;/span&gt; mount points, one per mount operation. Although the same filesystem can be accessed by using different mount points, it is really unique. Thus, there is only one superblock object for all of them, no matter of how many times it has been mounted." -- quoted from Understanding the Linux Kernel.&lt;br /&gt;&lt;br /&gt;So, let's do some experiments to verify it:&lt;br /&gt;&lt;br /&gt;First, we need to have GDB to watch the kernel's memory, typically as:&lt;br /&gt;gdb -x /dev/shm/gdb-script /usr/src/lki/vmlinux /proc/kcore&lt;br /&gt;where '&lt;/span&gt;&lt;span style="font-family:arial;"&gt;gdb-script' is my tiny GDB scripts to facilitate this observations, &lt;/span&gt;&lt;span style="font-family:arial;"&gt;/usr/src/lki/vmlinux is just this working kernel's ELF image file. Note that you need to have &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;CONFIG_DEBUG_INFO &lt;/span&gt;&lt;span style="font-family:arial;"&gt;being set, which will turn on '-g' GCC's flag within Makefile.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Here is the related command lines:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;[bshyu@vmBShyu gdb-scripts]$ &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;sudo mount /dev/disk/by-uuid/448c9c30-4a09-40f6-8e01-d3c577cd250d /media/linux&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;[bshyu@vmBShyu gdb-scripts]$ &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;sudo mount /dev/disk/by-label/FAT32 /media/FAT32&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[bshyu@vmBShyu gdb-scripts]$ ls /media/FAT32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bsdbg  data       knoppix.img  mypage    setup-cygwin.exe  VirtMachine  zycova&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;BShyu  linux        Recycled  temp              www&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;[bshyu@vmBShyu gdb-scripts]$ &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;sudo mount --bind /media/FAT32 /media/FAT32/temp&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;[bshyu@vmBShyu gdb-scripts]$ &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;sudo mount --bind /media/linux /media/FAT32/linux/&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now we are going to play with GDB, but first, listed here the fore-mentioned tiny GDB scripts, which we help us to observe Linux's link-list data structures, (assume you are already familiar with Linux's struct list_head thing, :-) :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;define bsScan&lt;br /&gt;&lt;br /&gt;# get the address of the list_head&lt;br /&gt;set $head = (struct list_head*) $arg0&lt;br /&gt;# set $CStructOffset = (unsigned long)(&amp;amp;((struct $arg1 *)0)-&gt;$arg2)))&lt;br /&gt;set $CStructOffset = &amp;amp;(((struct $arg1 *)0)-&gt;$arg2)&lt;br /&gt;#set $CStruct = $arg1&lt;br /&gt;&lt;br /&gt;printf "\n================================================================\n"&lt;br /&gt;printf "\tdisplay list of structures\n"&lt;br /&gt;print *($arg0)&lt;br /&gt;printf "================================================================\n"&lt;br /&gt;&lt;br /&gt;set $ptr = $head-&gt;next&lt;br /&gt;bsNext $arg0 $arg1 $arg2&lt;br /&gt;end&lt;br /&gt;define bsNext&lt;br /&gt;if $ptr != $head&lt;br /&gt;        set $ent = ((struct $arg1 *)((char*)($ptr) - (unsigned)$CStructOffset))&lt;br /&gt;        printf "\n\n#--------------- 0x%08x ---------------#\n", $ent&lt;br /&gt;        print *$ent&lt;br /&gt;        set $ptr = $ptr-&gt;next&lt;br /&gt;        printf "\nUse print *$ent to show list entity\n"&lt;br /&gt;        printf "Use set $a = $ent to store the entity\n"&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;document bsScan&lt;br /&gt;-----------------------------------------------------------&lt;br /&gt;Bernard Shyu's LIST display script&lt;br /&gt;-----------------------------------------------------------&lt;br /&gt;bsScan  &lt;pointer&gt;  &lt;structure&gt;  &lt;list&gt;&lt;br /&gt;bsNext  &lt;pointer&gt;  &lt;structure&gt;  &lt;list&gt;&lt;br /&gt;&lt;br /&gt;Scan a list of elements one by one&lt;br /&gt;&lt;br /&gt;Ex.  bsScan  &amp;amp;inode_in_use      inode         i_list&lt;br /&gt;&lt;/list&gt;&lt;/structure&gt;&lt;/pointer&gt;&lt;/list&gt;&lt;/structure&gt;&lt;/pointer&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;        Ex.  bsNext  &amp;amp;inode_in_use      inode         i_list&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;So, we will start from INIT process's namespace, which in more than 99% cases will be just the namespace to be used by all processes. My kernel version is: 2.6.25.4, where, the namespace structure has been through a big change since the book of ULK - the process's namespace has been replaced by nsproxy :-)  (%% You always need to keep note the kernel version being used when you want to tell the story of Linux Kernel, otherwise, we will very like miss the point you mentioned. %%)&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) p *init_task.nsproxy-&gt;mnt_ns-&gt;root&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;$114 = {mnt_hash = {next = 0xcf80c808, prev = 0xcf80c808}, mnt_parent = 0xcf80c808,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_mountpoint = 0xcf4018e0, mnt_root = 0xcf4018e0, mnt_sb = 0xcf80dab8, mnt_mounts = {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    next = 0xcf80cf98, prev = 0xcf80cf98}, mnt_child = {next = 0xcf80c828, prev = 0xcf80c828},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_flags = 0, mnt_devname = 0xcf802440 "&lt;span style="color: rgb(255, 0, 0);"&gt;rootfs&lt;/span&gt;", mnt_list = {next = 0xcf80cfa8,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    prev = 0xcf802410}, mnt_expire = {next = 0xcf80c840, prev = 0xcf80c840}, mnt_share = {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    next = 0xcf80c848, prev = 0xcf80c848}, mnt_slave_list = {next = 0xcf80c850,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    prev = 0xcf80c850}, mnt_slave = {next = 0xcf80c858, prev = 0xcf80c858}, mnt_master = 0x0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_ns = 0xcf802408, mnt_count = {counter = 2}, mnt_expiry_mark = 0, mnt_pinned = 0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_ghosts = 0}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) bsScan &amp;amp;init_task.nsproxy-&gt;mnt_ns-&gt;root-&gt;mnt_mounts vfsmount mnt_child&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;================================================================&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;        display list of structures&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;$115 = {next = 0xcf80cf98, prev = 0xcf80cf98}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;================================================================&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;#--------------- 0xcf80cf78 ---------------#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;$116 = {mnt_hash = {next = 0xcf80b408, prev = 0xcf80b408}, mnt_parent = 0xcf80c808,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_mountpoint = 0xcf4018e0, mnt_root = 0xcf421718, mnt_sb = 0xcf1a1318, mnt_mounts = {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    next = 0xcf80cf10, prev = 0xcf80cbe0}, mnt_child = {next = 0xcf80c820, prev = 0xcf80c820},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_flags = 0, mnt_devname = 0xcf183590 "&lt;span style="color: rgb(255, 0, 0);"&gt;/dev/root&lt;/span&gt;", mnt_list = {next = 0xcf80cf20,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    prev = 0xcf80c838}, mnt_expire = {next = 0xcf80cfb0, prev = 0xcf80cfb0}, mnt_share = {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    next = 0xcf80cfb8, prev = 0xcf80cfb8}, mnt_slave_list = {next = 0xcf80cfc0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    prev = 0xcf80cfc0}, mnt_slave = {next = 0xcf80cfc8, prev = 0xcf80cfc8}, mnt_master = 0x0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_ns = 0xcf802408, mnt_count = {counter = 755}, mnt_expiry_mark = 0, mnt_pinned = 0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_ghosts = 0}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Use print *$ent to show list entity&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Use set $a = $ent to store the entity&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) set $root = $ent&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The 2nd vfsmount structure is the real root of the filesystems directory tree we will play around soon. This is just the mount structure corresponding the '/' - the root directory in every pathname we will always use (note that we we in the most case: only one namespace).&lt;br /&gt;What about the 1st, it's initramfs.&lt;br /&gt;&lt;br /&gt;"For each mounted filesystem, a circular doubly linked list including all child mounted filesystems. The head of each list is stored in the &lt;span style="font-style: italic; font-weight: bold;"&gt;mnt_mounts &lt;/span&gt;field of the mounted filesystem descriptor; moreover, the &lt;span style="font-style: italic; font-weight: bold;"&gt;mnt_child &lt;/span&gt;field of the descriptor stores the pointers to the adjacent elements in the list." -- ULK&lt;br /&gt;&lt;br /&gt;Note that we've set $root to the struct vfsmount for the root directory (/dev/root), so &lt;/span&gt;&lt;span style="font-family:arial;"&gt;$root-&gt;mnt_mounts will be the link list of all child mounted filesystems we will loop on, by the mnt_child field.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) bsScan &amp;amp;$root-&gt;mnt_mounts vfsmount mnt_child&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;================================================================&lt;br /&gt;display list of structures&lt;br /&gt;$117 = {next = 0xcf80cf10, prev = 0xcf80cbe0}&lt;br /&gt;================================================================&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#--------------- 0xcf80cef0 ---------------#&lt;br /&gt;$118 = {mnt_hash = {next = 0xcf80b310, prev = 0xcf80b310}, mnt_parent = 0xcf80cf78,&lt;br /&gt;mnt_mountpoint = 0xcf420128, mnt_root = 0xcf417c70, mnt_sb = 0xcf1526c8, mnt_mounts = {&lt;br /&gt;next = 0xcf80c938, prev = 0xcf80ca48}, mnt_child = {next = 0xcf80ce88, prev = 0xcf80cf90},&lt;br /&gt;mnt_flags = 0, mnt_devname = 0xcf1fca60 "&lt;span style="color: rgb(255, 0, 0);"&gt;/dev&lt;/span&gt;", mnt_list = {next = 0xcf80ce98,&lt;br /&gt;prev = 0xcf80cfa8}, mnt_expire = {next = 0xcf80cf28, prev = 0xcf80cf28}, mnt_share = {&lt;br /&gt;next = 0xcf80cf30, prev = 0xcf80cf30}, mnt_slave_list = {next = 0xcf80cf38,&lt;br /&gt;prev = 0xcf80cf38}, mnt_slave = {next = 0xcf80cf40, prev = 0xcf80cf40}, mnt_master = 0x0,&lt;br /&gt;mnt_ns = 0xcf802408, mnt_count = {counter = 48}, mnt_expiry_mark = 0, mnt_pinned = 0,&lt;br /&gt;mnt_ghosts = 0}&lt;br /&gt;&lt;br /&gt;Use print *$ent to show list entity&lt;br /&gt;Use set $a = $ent to store the entity&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) bsNext &amp;amp;$root-&gt;mnt_mounts vfsmount mnt_child&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#--------------- 0xcf80ce68 ---------------#&lt;br /&gt;$119 = {mnt_hash = {next = 0xcf80b3e0, prev = 0xcf80b3e0}, mnt_parent = 0xcf80cf78,&lt;br /&gt;mnt_mountpoint = 0xcf420e38, mnt_root = 0xcf4017b0, mnt_sb = 0xcf80d688, mnt_mounts = {&lt;br /&gt;next = 0xcf80c1c8, prev = 0xcf80cb58}, mnt_child = {next = 0xcf80ce00, prev = 0xcf80cf10},&lt;br /&gt;mnt_flags = 0, mnt_devname = 0xcf1fca28 "&lt;span style="color: rgb(255, 0, 0);"&gt;/proc&lt;/span&gt;", mnt_list = {next = 0xcf80ce10,&lt;br /&gt;prev = 0xcf80cf20}, mnt_expire = {next = 0xcf80cea0, prev = 0xcf80cea0}, mnt_share = {&lt;br /&gt;next = 0xcf80cea8, prev = 0xcf80cea8}, mnt_slave_list = {next = 0xcf80ceb0,&lt;br /&gt;prev = 0xcf80ceb0}, mnt_slave = {next = 0xcf80ceb8, prev = 0xcf80ceb8}, mnt_master = 0x0,&lt;br /&gt;mnt_ns = 0xcf802408, mnt_count = {counter = 6}, mnt_expiry_mark = 0, mnt_pinned = 0,&lt;br /&gt;mnt_ghosts = 0}&lt;br /&gt;&lt;br /&gt;Use print *$ent to show list entity&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-family:courier new;" &gt;Use set $a = $ent to store the entity&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);"&gt;(gdb)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#--------------- 0xcf80cde0 ---------------#&lt;br /&gt;$130 = {mnt_hash = {next = 0xcf80b3e8, prev = 0xcf80b3e8}, mnt_parent = 0xcf80cf78,&lt;br /&gt;mnt_mountpoint = 0xcf420ed0, mnt_root = 0xcf401978, mnt_sb = 0xcf80dcd0, mnt_mounts = {&lt;br /&gt;next = 0xcf80cdf8, prev = 0xcf80cdf8}, mnt_child = {next = 0xcf80c9c0, prev = 0xcf80ce88},&lt;br /&gt;mnt_flags = 0, mnt_devname = 0xcf1fc9f0 "&lt;span style="color: rgb(255, 0, 0);"&gt;/sys&lt;/span&gt;", mnt_list = {next = 0xcf80c1d8,&lt;br /&gt;prev = 0xcf80ce98}, mnt_expire = {next = 0xcf80ce18, prev = 0xcf80ce18}, mnt_share = {&lt;br /&gt;next = 0xcf80ce20, prev = 0xcf80ce20}, mnt_slave_list = {next = 0xcf80ce28,&lt;br /&gt;prev = 0xcf80ce28}, mnt_slave = {next = 0xcf80ce30, prev = 0xcf80ce30}, mnt_master = 0x0,&lt;br /&gt;mnt_ns = 0xcf802408, mnt_count = {counter = 1}, mnt_expiry_mark = 0, mnt_pinned = 0,&lt;br /&gt;mnt_ghosts = 0}&lt;br /&gt;&lt;br /&gt;Use print *$ent to show list entity&lt;br /&gt;Use set $a = $ent to store the entity&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then, to continue to scan through the list of child mounts, we can do either repeat the command &lt;span style="font-style: italic;"&gt;bsNext &amp;amp;$root-&gt;mnt_mounts vfsmount mnt_child&lt;/span&gt;, or simply by ENTER (by GDB, it will repeat last command). We will find the mounted childs, such as '/dev', '/proc', '/sys', as shown by my machine.&lt;br /&gt;&lt;br /&gt;Not shown here, but if we continue with ENTER to observe the child mounts of the root, we will notice the BIND mounts (&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;mount --bind /media/FAT32 /media/FAT32/temp, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;mount --bind /media/linux /media/FAT32/linux/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;) can't be found here. Where did they go? This is because they are grand-children, rather that direct children of the root mount.&lt;br /&gt;&lt;br /&gt;So, let's find the mount for&lt;span style="font-style: italic;"&gt; /media/FAT32&lt;/span&gt;, and from there to find its children.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-family:courier new;font-size:85%;"  &gt;...&lt;br /&gt;...&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#--------------- 0xcf80cab0 ---------------#&lt;br /&gt;$143 = {mnt_hash = {next = 0xcf80b978, prev = 0xcf80b978}, mnt_parent = 0xcf80cf78,&lt;br /&gt;mnt_mountpoint = 0xcf406848, mnt_root = 0xcf56a1c0, mnt_sb = 0xcf294470, mnt_mounts = {&lt;br /&gt;next = 0xcf80cac8, prev = 0xcf80cac8}, mnt_child = {next = 0xcf80c140, prev = 0xcf80c9c0},&lt;br /&gt;mnt_flags = 0,&lt;br /&gt;mnt_devname = 0xcf26f238 "&lt;span style="color: rgb(255, 0, 0);"&gt;/dev/disk/by-uuid/448c9c30-4a09-40f6-8e01-d3c577cd250d&lt;/span&gt;",&lt;br /&gt;mnt_list = {next = 0xcf80cb68, prev = 0xcf80ca58}, mnt_expire = {next = 0xcf80cae8,&lt;br /&gt;prev = 0xcf80cae8}, mnt_share = {next = 0xcf80caf0, prev = 0xcf80caf0}, mnt_slave_list = {&lt;br /&gt;next = 0xcf80caf8, prev = 0xcf80caf8}, mnt_slave = {next = 0xcf80cb00, prev = 0xcf80cb00},&lt;br /&gt;mnt_master = 0x0, mnt_ns = 0xcf802408, mnt_count = {counter = 2}, mnt_expiry_mark = 0,&lt;br /&gt;mnt_pinned = 0, mnt_ghosts = 0}&lt;br /&gt;&lt;br /&gt;Use print *$ent to show list entity&lt;br /&gt;Use set $a = $ent to store the entity&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) set $L1 = $ent&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#--------------- 0xcf80cbc0 ---------------#&lt;br /&gt;$137 = {mnt_hash = {next = 0xcf80be00, prev = 0xcf80be00}, mnt_parent = 0xcf80cf78,&lt;br /&gt;mnt_mountpoint = 0xcf7098e0, mnt_root = 0xcf709ed0, mnt_sb = 0xcfa68080, mnt_mounts = {&lt;br /&gt;next = 0xcf80cc68, prev = 0xcf80cd78}, mnt_child = {next = 0xcf80cf90, prev = 0xcf80c0b8},&lt;br /&gt;mnt_flags = 0, mnt_devname = 0xc94cc750 "&lt;span style="color: rgb(255, 0, 0);"&gt;/dev/disk/by-label/FAT32&lt;/span&gt;", mnt_list = {&lt;br /&gt;next = 0xcf80cc78, prev = 0xcf80c0c8}, mnt_expire = {next = 0xcf80cbf8,&lt;br /&gt;prev = 0xcf80cbf8}, mnt_share = {next = 0xcf80cc00, prev = 0xcf80cc00}, mnt_slave_list = {&lt;br /&gt;next = 0xcf80cc08, prev = 0xcf80cc08}, mnt_slave = {next = 0xcf80cc10, prev = 0xcf80cc10},&lt;br /&gt;mnt_master = 0x0, mnt_ns = 0xcf802408, mnt_count = {counter = 3}, mnt_expiry_mark = 0,&lt;br /&gt;mnt_pinned = 0, mnt_ghosts = 0}&lt;br /&gt;&lt;br /&gt;Use print *$ent to show list entity&lt;br /&gt;Use set $a = $ent to store the entity&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 102);font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) set $F1 = $ent&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;So we've set two GDB variables: $L1 and $F1 to point to the interested mounts. Since we don't mount anything under the mount $L1, it's mnt_mounts is an empty list: as we can see:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-family:courier new;font-size:85%;"  &gt;(gdb) p $L1-&gt;mnt_mounts&lt;br /&gt;$153 = {next = &lt;span style="color: rgb(255, 0, 0);"&gt;0xcf80cac8&lt;/span&gt;, prev = &lt;span style="color: rgb(255, 0, 0);"&gt;0xcf80cac8&lt;/span&gt;}&lt;br /&gt;(gdb) p &amp;amp;$L1-&gt;mnt_mounts&lt;br /&gt;$154 = (struct list_head *) &lt;span style="color: rgb(255, 0, 0);"&gt;0xcf80cac8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's go through the children of $F1.&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) bsScan &amp;amp;$F1-&gt;mnt_mounts vfsmount mnt_child&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;================================================================&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;        display list of structures&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;$158 = {next = 0xcf80cc68, prev = 0xcf80cd78}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;================================================================&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;#--------------- 0xcf80cc48 ---------------#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;$159 = {mnt_hash = {next = 0xcf80be30, prev = 0xcf80be30}, mnt_parent = 0xcf80cbc0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_mountpoint = 0xcf709f68, mnt_root = 0xcf709ed0, mnt_sb = 0xcfa68080, mnt_mounts = {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    next = 0xcf80cc60, prev = 0xcf80cc60}, mnt_child = {next = 0xcf80cd78, prev = 0xcf80cbd8},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_flags = 0, mnt_devname = 0xc94c61d8 "/dev/disk/by-label/FAT32", mnt_list = {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    next = 0xcf80cd88, prev = 0xcf80cbf0}, mnt_expire = {next = 0xcf80cc80,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    prev = 0xcf80cc80}, mnt_share = {next = 0xcf80cc88, prev = 0xcf80cc88}, mnt_slave_list = {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    next = 0xcf80cc90, prev = 0xcf80cc90}, mnt_slave = {next = 0xcf80cc98, prev = 0xcf80cc98},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_master = 0x0, mnt_ns = 0xcf802408, mnt_count = {counter = 1}, mnt_expiry_mark = 0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_pinned = 0, mnt_ghosts = 0}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Use print *$ent to show list entity&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Use set $a = $ent to store the entity&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) set $F2 = $ent&lt;br /&gt;&lt;br /&gt;(gdb) bsNext &amp;amp;$F1-&gt;mnt_mounts vfsmount mnt_child&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;#--------------- 0xcf80cd58 ---------------#&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;$160 = {mnt_hash = {next = 0xcf80bf38, prev = 0xcf80bf38}, mnt_parent = 0xcf80cbc0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_mountpoint = 0xc4eaf2f0, mnt_root = 0xcf56a1c0, mnt_sb = 0xcf294470, mnt_mounts = {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    next = 0xcf80cd70, prev = 0xcf80cd70}, mnt_child = {next = 0xcf80cbd8, prev = 0xcf80cc68},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_flags = 0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_devname = 0xcf26fbd8 "/dev/disk/by-uuid/448c9c30-4a09-40f6-8e01-d3c577cd250d",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_list = {next = 0xcf802410, prev = 0xcf80cc78}, mnt_expire = {next = 0xcf80cd90,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    prev = 0xcf80cd90}, mnt_share = {next = 0xcf80cd98, prev = 0xcf80cd98}, mnt_slave_list = {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;    next = 0xcf80cda0, prev = 0xcf80cda0}, mnt_slave = {next = 0xcf80cda8, prev = 0xcf80cda8},&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_master = 0x0, mnt_ns = 0xcf802408, mnt_count = {counter = 1}, mnt_expiry_mark = 0,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;  mnt_pinned = 0, mnt_ghosts = 0}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Use print *$ent to show list entity&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;Use set $a = $ent to store the entity&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(gdb) set $L2 = $ent&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;So, we have $L1, $L2, $F1, $F2 for the 4 mounts we want to observe. Let's first check with $F1 &amp;amp; $F2, the mounts for the FAT32 file systems.&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;They are indeed different structures: $F1 = 0xcf80cbc0, $F2 = 0xcf80cc48&lt;/li&gt;&lt;li&gt;They have the same superblocks: $F1-&gt;mnt_sb =  $F2-&gt;mnt_sb = 0xcfa68080. This reflect what is described in ULK: only one superblock structure for what ever number of mounts.&lt;/li&gt;&lt;li&gt;Just as expected, $F2-&gt;mnt_parent = 0xcf80cbc0, the address of $F1&lt;/li&gt;&lt;li&gt;Even they are different mounts, their mnt_root (struct dentry) are the same: $F1-&gt;mnt_root = $F2-&gt;mnt_root = 0xcf709ed0. That also indicate mnt_root is bound to the file system, rather than to the mount.&lt;/li&gt;&lt;li&gt;On the other hand, the vfsmount's another dentry: mnt_mountpoint are obviously different, for their repective mount points: $F2-&gt;mnt_mountpoint = 0xcf709f68, $F1-&gt;mnt_mountpoint = 0xcf7098e0&lt;br /&gt;&lt;ul&gt;&lt;li&gt;$F2-&gt;mnt_mountpoint-&gt;d_mounted = 1&lt;/li&gt;&lt;li&gt;$F2-&gt;mnt_mountpoint-&gt;d_parent-&gt;d_mounted = 0&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;The reference counter: $F1-&gt;mnt_count = 3, $F2-&gt;mnt_count = 1.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:arial;"&gt;For the mounts of Linux ext3 filesystems: $L1 and $L2, they show similar results, except the reference counter: $L1-&gt;mnt_count = 2, &lt;/span&gt;&lt;span style="font-family:arial;"&gt; $L2-&gt;mnt_count = 1.&lt;br /&gt;&lt;br /&gt;That's it, using my tiny script snippets: bsScan &amp;amp; bsNext, you can also play around with Linux kernel internally. Here we have observed the tree of file system mountings by going through the mnt_mounts &amp;amp; mnt_child, starting from the namespace.&lt;br /&gt;&lt;br /&gt;Note that another way to play around with the system's mounting structures, much more straightforward, is simply by looping through the namespace's list field. Belows are the GDB commands to navigate the whole mounts of the namespace:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;(gdb)  bsScan &amp;amp;init_task.nsproxy-&gt;mnt_ns-&gt;list vfsmount mnt_list&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(gdb)  bsNext &amp;amp;init_task.nsproxy-&gt;mnt_ns-&gt;list vfsmount mnt_list&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enjoy it.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4356926631391905302-7482581663494797368?l=bshyu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bshyu.blogspot.com/feeds/7482581663494797368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4356926631391905302&amp;postID=7482581663494797368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/7482581663494797368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/7482581663494797368'/><link rel='alternate' type='text/html' href='http://bshyu.blogspot.com/2008/06/linux-vfs-study-note-1.html' title='kernel hacking with GDB: VFS mount'/><author><name>Banana Shyu</name><uri>http://www.blogger.com/profile/00646069880288847277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4356926631391905302.post-3474728852136886565</id><published>2008-06-05T13:58:00.001+08:00</published><updated>2008-10-02T15:07:03.607+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HereMyPage'/><title type='text'>Elements of HereMyPage</title><content type='html'>The &lt;a href="http://heremypage.info/"&gt;HereMyPage.com&lt;/a&gt; contains the following technical ingredients:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;On the client side&lt;/li&gt;&lt;ul&gt;&lt;li&gt;jQuery based Javascript framework&lt;/li&gt;&lt;li&gt;igoogle compatible gadget API library, a from-scratch work&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;On the Server side&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Smarty template engine&lt;/li&gt;&lt;li&gt;SimplePie RSS proxy&lt;/li&gt;&lt;li&gt;Joomla content management system for publishing contents &amp;amp; user management&lt;br /&gt;&lt;/li&gt;&lt;li&gt;External wordpress weblog system  (TODO)&lt;/li&gt;&lt;li&gt;External wiki system for on-line document  (TODO)&lt;/li&gt;&lt;li&gt;External forum system for discussion  (TODO)&lt;/li&gt;&lt;li&gt;External News system for latest news announcement  (TODO)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;The service elements it will contain are (TO DO ...) :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Personal home portal, front-end:  http://www.heremypage.com. A tab paged personalized contents.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Personal home portal, back-end:  http://www.heremypage.com/settings&lt;/li&gt;&lt;li&gt;Personal share page: http://www.heremypage.com/&lt;span style="font-style: italic;"&gt;user &lt;/span&gt;or http://&lt;span style="font-style: italic;"&gt;user&lt;/span&gt;.heremypage.com &lt;/li&gt;&lt;li&gt;Community page: http://www.heremypage.com/community. A tab paged contents managed and seen by community users.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;World page: http://www.heremypage.com/world. A tab paged contents managed and seen by all users.&lt;/li&gt;&lt;li&gt;Blog: http://blog.heremypage.com/&lt;span style="font-style: italic;"&gt;user&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Special pagelet:&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Feedburner pagelet, providing RSS feeds burning service from any site&lt;/li&gt;&lt;li&gt;Designer pagelet, providing an easy place to design / modify a pagelet spec.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;...... to be continued&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4356926631391905302-3474728852136886565?l=bshyu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bshyu.blogspot.com/feeds/3474728852136886565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4356926631391905302&amp;postID=3474728852136886565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/3474728852136886565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/3474728852136886565'/><link rel='alternate' type='text/html' href='http://bshyu.blogspot.com/2008/06/elements-of-heremypage.html' title='Elements of HereMyPage'/><author><name>Banana Shyu</name><uri>http://www.blogger.com/profile/00646069880288847277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4356926631391905302.post-8308381157053507177</id><published>2008-06-05T13:15:00.000+08:00</published><updated>2008-06-26T08:22:40.056+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bookmarks'/><title type='text'>Hot links for Web Designers</title><content type='html'>&lt;h3 class="post-title entry-title"&gt; &lt;a href="http://calos-tw.blogspot.com/2008/05/blog-post_17.html"&gt;寫程式需要的網站們~&lt;/a&gt;&lt;/h3&gt;(ref: http://calos-tw.blogspot.com/2008/05/blog-post_17.html)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;PHP&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.php.net/index.php#id2008-05-01-1"&gt;PHP 5.2.6 Released&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.devshed.com/c/a/PHP/Benchmarking-Applications-with-PHP/"&gt;Benchmarking Applications with PHP&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://matbyrne.com/2008/4/20/dynamic-domain-objects-in-php"&gt;Dynamic Domain Objects in PHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.free-php.net/"&gt;Free PHP scripts, resources and tutorials&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.patternsforphp.com/wiki/Main_Page"&gt;Patterns For PHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.makemepulse.com/2008/04/21/spl-autoloading-in-php/"&gt;SPL autoloading in PHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.newearthonline.co.uk/index.php?page=article&amp;amp;article=424"&gt;Caching PHP pages: PEAR - Cache_Lite&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mtabini.blogspot.com/2008/04/5-php-5-features-you-cant-afford-to.html"&gt;5 PHP 5 features you can't afford to ignore&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://plog.longwin.com.tw/programming/2008/04/24/php_rss_atom_date_format_generator_2008"&gt;PHP 產生 RSS/ATOM pubDate/created 所需格式&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.leigeber.com/2008/04/eaccelerator-php-accelerator/"&gt;eAccelerator PHP Accelerator&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hasin.wordpress.com/2008/04/29/web-scrapping-in-a-smart-way-making-a-today-in-history-object/"&gt;Web scrapping in a smart way, making a "Today in History" object in PHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidwalsh.name/css-variables-php-dynamic"&gt;CSS Variables Using PHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.finalwebsites.com/snippets.php?id=49"&gt;Free PHP scripts and classes: RSS parser using cache&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Zend Framework&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.astrumfutura.com/archives/351-An-Example-Zend-Framework-Blog-Application-Part-1-Introductory-Planning.html"&gt;An Example Zend Framework Blog Application - Part 1: Introductory Planning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.astrumfutura.com/archives/353-An-Example-Zend-Framework-Blog-Application-Part-2-The-MVC-Application-Architecture.html"&gt;An Example Zend Framework Blog Application - Part 2: The MVC Application Architecture&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.astrumfutura.com/archives/355-An-Example-Zend-Framework-Blog-Application-Part-3-A-Simple-Hello-World-Tutorial.html"&gt;An Example Zend Framework Blog Application - Part 3: A Simple Hello World Tutorial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.astrumfutura.com/archives/356-An-Example-Zend-Framework-Blog-Application-Part-4-Setting-the-Design-Stage-with-Blueprint-CSS-Framework-and-Zend_Layout.html"&gt;An Example Zend Framework Blog Application - Part 4: Setting the Design Stage with Blueprint CSS Framework and Zend_Layout&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.astrumfutura.com/archives/358-An-Example-Zend-Framework-Blog-Application-Part-5-Creating-Models-with-Zend_Db-and-adding-an-Administration-Module.html"&gt;An Example Zend Framework Blog Application - Part 5: Creating Models with Zend_Db and adding an Administration Module&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.astrumfutura.com/archives/354-Subversion-for-the-Example-Zend-Framework-Blog-Tutorial-Series.html"&gt;Subversion for the Example Zend Framework Blog Tutorial Series&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cogo.wordpress.com/2008/04/24/translating-zend_form-error-messages-and-more/"&gt;Translating Zend_Form error messages and more&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cogo.wordpress.com/2008/04/25/using-objects-with-zend_views-partialloop-helper/"&gt;Using objects with Zend_View's PartialLoop helper&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://framework.zend.com/wiki/display/ZFPROP/Zend_Tree+-+Andries+Seutens"&gt;Zend_Tree&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://devzone.zend.com/article/3448-Zend-Framework---The-Big-QA"&gt;Zend Framework - The Big Q&amp;amp;A&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://devzone.zend.com/article/3412-View-Helpers-in-Zend-Framework"&gt;View Helpers in Zend Framework&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;CakePHP Framework&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jamesfairhurst.co.uk/tags/view/cakephp"&gt;jamesfairhurst's cakephp articles&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snook.ca/archives/cakephp/"&gt;snook.ca articles&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;JavaScript&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.yoren.info/2008/04/21/514/"&gt;30+ Lightbox特效屬性動態比較表&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://stevenlevithan.com/regex/xregexp/"&gt;XRegExp - A JavaScript regular expression library&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/bundle-fu/"&gt;bundle-fu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/ie/archive/2008/04/23/what-happened-to-operation-aborted.aspx"&gt;IEBlog : What Happened to Operation Aborted?&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://ejohn.org/blog/versions-of-javascript/"&gt;Versions of JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hurricanesoftwares.com/2008/04/21/cross-site-scripting-attacks-how-to-prevent/"&gt;Cross-site scripting attacks : How to Prevent?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.nihilogic.dk/2008/04/making-javascript-video-player.html"&gt; Making a Javascript Video Player&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://peter.michaux.ca/article/7742"&gt;Wrapping functions in JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.phpied.com/strftime-in-javascript/"&gt;strftime() in JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nagoon97.wordpress.com/2008/04/06/reading-binary-files-using-ajax/"&gt;Reading binary files using Ajax&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://realazy.org/blog/2008/04/22/javascript-memoization/"&gt;JavaScript Memoization&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://synthesis.sbecker.net/pages/asset_packager"&gt;AssetPackager – JavaScript and CSS Asset Compression for Production Rails Apps&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.leigeber.com/2008/04/5-javascript-best-practices/"&gt;5 JavaScript Best Practices&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.leigeber.com/2008/04/custom-javascript-dialog-boxes/"&gt;Custom JavaScript Dialog Boxes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.robertnyman.com/2008/04/23/where-to-include-javascript-files-in-a-document/"&gt;Where to include JavaScript files in a document&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.miniasp.com/post/2008/04/Introduce-Useful-webiste-MiniAjax-com.aspx"&gt;介紹好網站：MiniAjax.com&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://nettrace.blogspirit.com/archive/2008/04/21/%E7%94%A8-javascript-%E4%BE%86%E4%BF%AE%E9%A3%BE%E4%BD%A0%E7%9A%84%E8%B6%85%E9%80%A3%E7%B5%90.html"&gt;用 JavaScript 來修飾你的超連結&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://ejohn.org/blog/running-java-in-javascript/"&gt;Running Java in JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://roshanbh.com.np/2008/04/how-to-know-handle-disabled-javascript.html"&gt;How to know and handle disabled javascript in browser&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://ejohn.org/blog/ajax-accessibility/"&gt;Ajax Accessibility&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://peter.michaux.ca/article/7746"&gt;Macros in JavaScript please&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.quirksmode.org/dom/events/index.html"&gt;Javascript - Event compatibility tables&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;jQuery&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.noupe.com/tutorial/51-best-of-jquery-tutorials-and-examples.html"&gt;51+ Best of jQuery Tutorials and Examples&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://roshanbh.com.np/2008/04/ajax-login-validation-php-jquery.html"&gt;Ajax login in PHP using jQuery&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://css.dzone.com/news/jquery-image-cross-fade-transi"&gt;Image Cross Fade Transition with jQuery&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://css-tricks.com/improved-current-field-highlighting-in-forms/"&gt;Improved Current Field Highlighting in Forms&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.webappers.com/2008/04/22/jquery-masked-input-plugin/"&gt;jQuery Masked Input Plugin&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.joanpiedra.com/jquery/thumbs/"&gt;jQuery Thumbs: A JQuery plugin to easily create thumbnails&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://devblog.jasonhuck.com/2008/04/25/jquery-combo-select-redux/"&gt;jQuery Combo Select Redux&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://west-wind.com/weblog/posts/332037.aspx"&gt;jQuery.ui Sortable&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://css-tricks.com/better-pull-quotes/"&gt;Better Pull Quotes: Don't Repeat Markup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://deseloper.org/read/2008/04/a-simple-modal/"&gt;Simple Modal Window Example built on jQuery&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;CSS&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://cssglobe.com/post/1614/4-uber-cool-css-techniques-for-links"&gt;4 Uber Cool Css Techniques For Links&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://css-tricks.com/can-we-prevent-css-caching/"&gt;Can We Prevent CSS Caching?&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://css-tricks.com/ie-css-bugs-thatll-get-you-every-time/"&gt;IE CSS Bugs That'll Get You Every Time - CSS-Tricks&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sitepoint.com/blogs/2008/04/25/css-gradients-transforms-animations-and-masks/"&gt;CSS Gradients, Transforms, Animations, and Masks&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.noupe.com/css/using-css-to-do-anything-50-creative-examples-and-tutorials.html"&gt;Using CSS to Do Anything: 50+ Creative Examples and Tutorials&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.leigeber.com/2008/04/css-shorthand-cheat-sheet/"&gt;CSS Shorthand Cheat Sheet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://veerle.duoh.com/blog/comments/starting_with_css_and_bug_fixing_tips/"&gt;Starting with CSS and bug fixing tips&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://css-tricks.com/update-on-css-caching/"&gt;Update on CSS Caching&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.comesolvego.com/2008/05/02/the-quickest-css-hack-fix-for-ie/"&gt;The quickest CSS and PNG alpha transparency fix for IE (internet explorer)&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Database&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://database-programmer.blogspot.com/2008/04/advanced-table-design-resolutions.html"&gt;The Database Programmer: Advanced Table Design: Resolutions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;MySQL&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.bubble.ro/how-to-make-multiple-updates-using-a-single-query-in-mysql/"&gt;How to make multiple updates using a single query in MySQL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mysqlperformanceblog.com/2008/04/28/the-mysql-optimizer-the-os-cache-and-sequential-versus-random-io/"&gt;The MySQL optimizer, the OS cache, and sequential versus random I/O&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Oracle&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jebriggs.com/blog/oscon/mysql-4x-to-oracle-10g-migration-notes.html"&gt;MySQL 4.x to Oracle 10g Migration Notes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nostalgix.org/blog/2007/07/migration-made-easy-with-oracle-sql.html"&gt;Migration made easy with Oracle SQL Developer&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technology/tech/migration/workbench/files/omwb_getstarted.html"&gt;Getting Started: SQL Developer Migration Workbench&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.csdn.net/guipei/archive/2007/06/30/1672582.aspx"&gt;Oracle 清除用戶對象方法&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://snk.blogbus.com/logs/12757104.html"&gt;oracle drop all object&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.psoug.org/reference/recyclebin.html"&gt;Oracle Recycle Bin Flashback Purge&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rejeev.blogspot.com/2008/04/update-query-with-join-in-oracle.html"&gt;Update Query with Join in Oracle Database&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Service&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.eirikhoem.net/index.php/2008/04/29/handy-online-regex-tool-for-php-perl-js-and-python/"&gt;Handy online regex tool for PHP, Perl, JS and Python&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Project&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://andyblog.wordpress.com/2008/04/28/%e6%ba%9d%e9%80%9a%e6%98%af%e5%b0%88%e6%a1%88%e7%b6%93%e7%90%86%e8%a6%81%e5%ad%b8%e7%bf%92%e7%9a%84%e7%ac%ac%e4%b8%80%e8%aa%b2/"&gt;溝通是專案經理要學習的第一課&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Software&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.miniasp.com/post/2008/04/Useful-tools-IECapt.aspx"&gt;介紹好用工具：IECapt&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.goston.net/2008/05/02/1286/"&gt;任意縮放被固定大小的視窗 - ResizeEnable&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://meebox.blogspot.com/2008/04/render.html"&gt;翻譯名詞：render&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;SCM&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://coding-time.blogspot.com/2008/04/subversion-visually-explained-in-30sec.html"&gt;Subversion visually explained in 30 sec&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/04/19/version-control-with-subversion-so-easy-my-wife-can-do-it.aspx"&gt;Version control with Subversion: so easy my wife can do it&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Design&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.webappers.com/2008/04/23/icojoy-free-mini-icons-for-any-project/"&gt;Icojoy Free Mini Icons for Any Project&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hkpug.net/node/252"&gt;靠右對齊的導航菜單減慢閱讀速度&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Web&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hyperdogmedia.com/blog/2008/04/18/5-web-development-techniques-to-prevent-google-from-crawling-your-html-forms/"&gt;5 web development techniques to prevent Google from crawling your HTML forms&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.yoren.info/2008/05/%e7%b6%b2%e7%ab%99%e9%96%8b%e7%99%bc%e4%ba%ba%e5%93%a1%e7%9a%84seo%e5%b0%8f%e6%8a%84/"&gt;網站開發人員的SEO小抄&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://lifehacker.com/386567/kotatsu-automates-html-table-generation"&gt; Kotatsu Automates HTML Table Generation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4356926631391905302-8308381157053507177?l=bshyu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bshyu.blogspot.com/feeds/8308381157053507177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4356926631391905302&amp;postID=8308381157053507177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/8308381157053507177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/8308381157053507177'/><link rel='alternate' type='text/html' href='http://bshyu.blogspot.com/2008/06/hot-links-for-web-designers.html' title='Hot links for Web Designers'/><author><name>Banana Shyu</name><uri>http://www.blogger.com/profile/00646069880288847277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4356926631391905302.post-2290866813956645889</id><published>2008-06-05T11:29:00.000+08:00</published><updated>2008-06-05T13:14:53.838+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HereMyPage'/><title type='text'>HereMyPage.com preparation for on-line</title><content type='html'>This isn't a formal announcement, but just an test for the rules of web world.&lt;br /&gt;&lt;br /&gt;I've created a website:&lt;br /&gt;   &lt;a href="http://heremypage.info/"&gt;HereMyPage.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's just like netvibes.com or google.com/ig, providing a personal web portal service. I know it's already a late comer product in this field. Therefore, some differentiations lies here, in the slight hope of attracting some web-fans.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;User gets more space than netvibes or igoogle&lt;/li&gt;&lt;li&gt;The so called pagelet in my term, supports igoogle's gadget API&lt;/li&gt;&lt;li&gt;Freedom of customizing user's home page, by downloading the public themes, make your modifications, upload to your personal folders or share folders, then you have your own home page&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;li&gt;More to come&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4356926631391905302-2290866813956645889?l=bshyu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bshyu.blogspot.com/feeds/2290866813956645889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4356926631391905302&amp;postID=2290866813956645889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/2290866813956645889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/2290866813956645889'/><link rel='alternate' type='text/html' href='http://bshyu.blogspot.com/2008/06/heremypagecom-preparation-for-on-line.html' title='HereMyPage.com preparation for on-line'/><author><name>Banana Shyu</name><uri>http://www.blogger.com/profile/00646069880288847277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4356926631391905302.post-2872179085310077639</id><published>2007-10-31T19:09:00.001+08:00</published><updated>2008-06-05T13:53:38.490+08:00</updated><title type='text'>Testing</title><content type='html'>This is just a test.&lt;br /&gt;&lt;br /&gt;Oh, do you know the site &lt;a href="http://www.heremypage.com"&gt;HereMyPage&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Yes, it's a new site created &amp;amp; hosted by me.&lt;br /&gt;&lt;br /&gt;Enjoy it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4356926631391905302-2872179085310077639?l=bshyu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bshyu.blogspot.com/feeds/2872179085310077639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4356926631391905302&amp;postID=2872179085310077639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/2872179085310077639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4356926631391905302/posts/default/2872179085310077639'/><link rel='alternate' type='text/html' href='http://bshyu.blogspot.com/2007/10/testing.html' title='Testing'/><author><name>Banana Shyu</name><uri>http://www.blogger.com/profile/00646069880288847277</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
