Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://www.bictor.com/feed/

  1. <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
  2. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  3. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  4. xmlns:dc="http://purl.org/dc/elements/1.1/"
  5. xmlns:atom="http://www.w3.org/2005/Atom"
  6. xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  7. xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  8. xmlns:georss="http://www.georss.org/georss"
  9. xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
  10. >
  11.  
  12. <channel>
  13. <title>Bictor Tips</title>
  14. <atom:link href="http://www.bictor.com/feed/" rel="self" type="application/rss+xml" />
  15. <link>http://www.bictor.com</link>
  16. <description>Your Help In Digital World</description>
  17. <lastBuildDate>Sat, 27 Apr 2024 11:23:28 +0000</lastBuildDate>
  18. <language>en</language>
  19. <sy:updatePeriod>
  20. hourly </sy:updatePeriod>
  21. <sy:updateFrequency>
  22. 1 </sy:updateFrequency>
  23. <generator>https://wordpress.org/?v=6.2.5</generator>
  24.  
  25. <image>
  26. <url>https://i0.wp.com/www.bictor.com/wp-content/uploads/2018/05/cropped-CompleteLogo_small.jpg?fit=32%2C32</url>
  27. <title>Bictor Tips</title>
  28. <link>http://www.bictor.com</link>
  29. <width>32</width>
  30. <height>32</height>
  31. </image>
  32. <site xmlns="com-wordpress:feed-additions:1">64334160</site> <item>
  33. <title>Ubuntu Rescue Guide</title>
  34. <link>http://www.bictor.com/2024/04/27/ubuntu-rescue-guide/</link>
  35. <comments>http://www.bictor.com/2024/04/27/ubuntu-rescue-guide/#respond</comments>
  36. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  37. <pubDate>Sat, 27 Apr 2024 16:53:25 +0000</pubDate>
  38. <category><![CDATA[Linux]]></category>
  39. <guid isPermaLink="false">http://www.bictor.com/?p=485</guid>
  40.  
  41. <description><![CDATA[Common commands useful when debugging in rescue mode Checking login sessions for various server can be done using View the most recent logins If you just want to check the most recent logins, it&#8217;s even simpler. Back in the command-line,]]></description>
  42. <content:encoded><![CDATA[
  43. <p>Common commands useful when debugging in rescue mode</p>
  44.  
  45.  
  46.  
  47. <p>Checking login sessions for various server can be done using </p>
  48.  
  49.  
  50.  
  51. <pre class="wp-block-code"><code>sudo less /var/log/auth.log</code></pre>
  52.  
  53.  
  54.  
  55. <h3 class="wp-block-heading" id="view-the-most-recent-logins">View the most recent logins</h3>
  56.  
  57.  
  58.  
  59. <p>If you just want to check the most recent logins, it&#8217;s even simpler. Back in the command-line, type&nbsp;<code>last</code>&nbsp;and press Enter.</p>
  60.  
  61.  
  62.  
  63. <p>The output will look something like this:</p>
  64.  
  65.  
  66.  
  67. <pre class="wp-block-code"><code>root     pts/0        12.34.567.89    Fri Jan  8 15:30   still logged in
  68. root     pts/0        12.34.567.89    Fri Jan  8 15:13 - 15:29  (00:16)
  69. reboot   system boot  5.4.0-1009-kvm   Fri Jan  8 15:07   still running
  70. </code></pre>
  71.  
  72.  
  73.  
  74. <p>The&nbsp;<code>last</code>&nbsp;tool pulls its data from&nbsp;<code>/var/log/wtmp</code>, which is written to each time a user logs in. It&#8217;ll show username, tty, IP address, date and time, and session start/stop times.</p>
  75.  
  76.  
  77.  
  78. <p>If that&#8217;s too verbose, you can apply filters to the command with the following syntax:</p>
  79.  
  80.  
  81.  
  82. <pre class="wp-block-code"><code>last &#91;OPTIONS] &#91;USER] &#91;&lt;TTY&gt;...]</code></pre>
  83.  
  84.  
  85.  
  86. <p>Let&#8217;s look at an example. If we wanted to view all of the logins from the root user, we could run:</p>
  87.  
  88.  
  89.  
  90. <pre class="wp-block-code"><code>last root</code></pre>
  91.  
  92.  
  93.  
  94. <pre class="wp-block-code"><code>OUTPUT:
  95. root     pts/0        12.345.678.90    Fri Jan  8 15:30   still logged in
  96. root     pts/0        12.345.678.90    Fri Jan  8 15:13 - 15:29  (00:16)</code></pre>
  97.  
  98.  
  99.  
  100. <h3 class="wp-block-heading" id="see-when-users-last-logged-in">See when users last logged in</h3>
  101.  
  102.  
  103.  
  104. <p>If you notice an unauthorized change to the system, it&#8217;s often useful to see when each user last logged in. This way, you can determine who made the adjustment. We can do this via the&nbsp;<code>lastlog</code>&nbsp;command, which pulls data from&nbsp;<code>/etc/log/lastlog</code>&nbsp;and sorts them by&nbsp;<code>/etc/password</code>&nbsp;entries:</p>
  105.  
  106.  
  107.  
  108. <pre class="wp-block-code"><code>lastlog</code></pre>
  109.  
  110.  
  111.  
  112. <pre class="wp-block-code"><code>Username         Port     From             Latest
  113. root             pts/0    12.345.678.90    Fri Jan  8 15:30:06 +0000 2021
  114. daemon                                     **Never logged in**
  115. bin                                        **Never logged in**
  116. sys                                        **Never logged in**
  117. sync                                       **Never logged in**
  118. bitlaunch        pts/1    83.253.230.46    Fri Jan  8 16:09:53 +0000 2021
  119. hack0r           pts/1    83.253.230.46    Fri Jan  8 16:10:20 +0000 2021
  120. </code></pre>
  121.  
  122.  
  123.  
  124. <p>You&#8217;ll notice quite a few users with a&nbsp;<code>**Never logged in**</code>&nbsp;entry in the&nbsp;<code>Latest</code>&nbsp;column. This is normal on account of them being system users.</p>
  125.  
  126.  
  127.  
  128. <h2 class="wp-block-heading" id="mounting-the-drives-in-the-rescue-system">Mounting the drive(s) in the Rescue System</h2>
  129.  
  130.  
  131.  
  132. <p>First, you should determine the partition identifiers of your system by running the command <code>lsblk</code>.</p>
  133.  
  134.  
  135.  
  136. <pre class="wp-block-code"><code>root@rescue ~ # lsblk
  137. NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
  138. loop0     7:0    0     4G  1 loop
  139. sda       8:0    0 447.1G  0 disk
  140. ├─sda1    8:1    0     4G  0 part
  141. ├─sda2    8:2    0   512M  0 part
  142. └─sda3    8:3    0 442.6G  0 part
  143. sdb       8:16   0 447.1G  0 disk
  144. └─sdb1    8:17   0   446G  0 part</code></pre>
  145.  
  146.  
  147.  
  148. <p>Now you can mount the correct partition within an empty folder, for example, using <code>/mnt</code>.</p>
  149.  
  150.  
  151.  
  152. <p><code>mount /dev/md2 /mnt</code></p>
  153.  
  154.  
  155.  
  156. <h2 class="wp-block-heading" id="resetting-the-root-password">Resetting the root password</h2>
  157.  
  158.  
  159.  
  160. <p>To reset the root password of an installed Linux or BSD system, you need to&nbsp;<code>mount</code>&nbsp;the system partition as explained in the previous section of this article:&nbsp;<em>&#8220;Mounting the Drive(s) in the Rescue System&#8221;</em>. Then use&nbsp;<code>chroot</code>&nbsp;to switch into the root environment of the mounted system.</p>
  161.  
  162.  
  163.  
  164. <pre class="wp-block-code"><code>chroot-prepare /mnt
  165. chroot /mnt</code></pre>
  166.  
  167.  
  168.  
  169. <p>You can now change the password of the user &#8220;root&#8221;.</p>
  170.  
  171.  
  172.  
  173. <pre class="wp-block-code"><code>passwd</code></pre>
  174.  
  175.  
  176.  
  177. <p>Finally, exit the root environment.</p>
  178.  
  179.  
  180.  
  181. <pre class="wp-block-code"><code>exit</code></pre>
  182. ]]></content:encoded>
  183. <wfw:commentRss>http://www.bictor.com/2024/04/27/ubuntu-rescue-guide/feed/</wfw:commentRss>
  184. <slash:comments>0</slash:comments>
  185. <post-id xmlns="com-wordpress:feed-additions:1">485</post-id> </item>
  186. <item>
  187. <title>Ubuntu bug affecting Firefox Chromium and other Keyboard Issues</title>
  188. <link>http://www.bictor.com/2023/12/17/ubuntu-bug-affecting-firefox-chromium-and-other-keyboard-issues/</link>
  189. <comments>http://www.bictor.com/2023/12/17/ubuntu-bug-affecting-firefox-chromium-and-other-keyboard-issues/#respond</comments>
  190. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  191. <pubDate>Sun, 17 Dec 2023 21:24:39 +0000</pubDate>
  192. <category><![CDATA[Linux]]></category>
  193. <guid isPermaLink="false">https://www.bictor.com/?p=478</guid>
  194.  
  195. <description><![CDATA[The main problem was AppArmor not giving permission to connect to ibus in the root account Workaround was to change the input method from ibus to none im-config -n none]]></description>
  196. <content:encoded><![CDATA[
  197. <p>The main problem was AppArmor not giving permission to connect to ibus in the root account</p>
  198.  
  199.  
  200.  
  201. <p>Workaround was to change the input method from ibus to none</p>
  202.  
  203.  
  204.  
  205. <p><code>im-config -n none</code></p>
  206.  
  207.  
  208.  
  209. <p></p>
  210. ]]></content:encoded>
  211. <wfw:commentRss>http://www.bictor.com/2023/12/17/ubuntu-bug-affecting-firefox-chromium-and-other-keyboard-issues/feed/</wfw:commentRss>
  212. <slash:comments>0</slash:comments>
  213. <post-id xmlns="com-wordpress:feed-additions:1">478</post-id> </item>
  214. <item>
  215. <title>Ubuntu 22.04 LAMP Installation</title>
  216. <link>http://www.bictor.com/2023/07/09/ubuntu-22-04-lamp-installation/</link>
  217. <comments>http://www.bictor.com/2023/07/09/ubuntu-22-04-lamp-installation/#respond</comments>
  218. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  219. <pubDate>Sun, 09 Jul 2023 16:43:34 +0000</pubDate>
  220. <category><![CDATA[Linux]]></category>
  221. <guid isPermaLink="false">http://www.bictor.com/?p=468</guid>
  222.  
  223. <description><![CDATA[To install the LAMP stack on Ubuntu 22.04 LTS, follow these steps.]]></description>
  224. <content:encoded><![CDATA[
  225. <p>To install the LAMP stack on Ubuntu 22.04 LTS, follow these steps.</p>
  226.  
  227.  
  228.  
  229. <ol>
  230. <li>Using <code>apt</code>, update the Ubuntu packages:<br><code>sudo apt update <strong>&amp;&amp;</strong> sudo apt upgrade</code><br></li>
  231.  
  232.  
  233.  
  234. <li>Install the Apache web server using <br><code>apt</code>:<code>sudo apt install apache2</code><br></li>
  235.  
  236.  
  237.  
  238. <li>Install the MySQL web server:<br><code>sudo apt install mysql-server</code><br></li>
  239.  
  240.  
  241.  
  242. <li>Install PHP, along with additional PHP modules for Apache and MySQL:<br><code>sudo apt install php libapache2-mod-php php-mysql</code><br></li>
  243.  
  244.  
  245.  
  246. <li><strong>(Optional)</strong> Install the following commonly-used PHP modules.<br><code>sudo apt install php-curl php-json php-cgi</code><br></li>
  247.  
  248.  
  249.  
  250. <li><strong>(Optional)</strong> To host a WordPress site on the server, install the following PHP components:<br><code>sudo apt install php-curl php-gd php-mbstring php-xml php-xmlrpc</code><br></li>
  251. </ol>
  252. ]]></content:encoded>
  253. <wfw:commentRss>http://www.bictor.com/2023/07/09/ubuntu-22-04-lamp-installation/feed/</wfw:commentRss>
  254. <slash:comments>0</slash:comments>
  255. <post-id xmlns="com-wordpress:feed-additions:1">468</post-id> </item>
  256. <item>
  257. <title>Ubuntu 22.04 Modify Open File Limits</title>
  258. <link>http://www.bictor.com/2022/07/17/ubuntu-16-04-modify-open-file-limits/</link>
  259. <comments>http://www.bictor.com/2022/07/17/ubuntu-16-04-modify-open-file-limits/#respond</comments>
  260. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  261. <pubDate>Sun, 17 Jul 2022 15:19:52 +0000</pubDate>
  262. <category><![CDATA[Linux]]></category>
  263. <guid isPermaLink="false">http://www.bictor.com/?p=452</guid>
  264.  
  265. <description><![CDATA[To check current limits Edit /etc/security/limits.conf &#8211; Add the following lines, also remember like root is a username, you should add all the usernames on which you wish to increase the limit Edit /etc/pam.d/common-session &#8211; Add the following line Edit]]></description>
  266. <content:encoded><![CDATA[
  267. <p>To check current limits </p>
  268.  
  269.  
  270.  
  271. <pre class="wp-block-code"><code>ulimit -a</code></pre>
  272.  
  273.  
  274.  
  275. <p>Edit /etc/security/limits.conf &#8211; Add the following lines, also remember like root is a username, you should add all the usernames on which you wish to increase the limit</p>
  276.  
  277.  
  278.  
  279. <pre class="wp-block-code"><code>* soft nproc 9999999
  280. * hard nproc 9999999
  281. * soft nofile 9999999
  282. * hard nofile 9999999
  283. root soft nproc 9999999
  284. root hard nproc 9999999
  285. root soft nofile 9999999
  286. root hard nofile 9999999</code></pre>
  287.  
  288.  
  289.  
  290. <p>Edit /etc/pam.d/common-session &#8211; Add the following line</p>
  291.  
  292.  
  293.  
  294. <pre class="wp-block-code"><code>session required pam_limits.so</code></pre>
  295.  
  296.  
  297.  
  298. <p>Edit the following file&nbsp;<code>/etc/systemd/user.conf</code>: &#8211; Add the following line</p>
  299.  
  300.  
  301.  
  302. <pre class="wp-block-code"><code>DefaultLimitNOFILE=9999999</code></pre>
  303.  
  304.  
  305.  
  306. <p>Edit /etc/sysctl.conf &#8211; Add the following line</p>
  307.  
  308.  
  309.  
  310. <pre class="wp-block-code"><code>fs.file-max=9999999
  311. vm.max_map_count=9999999
  312. </code></pre>
  313.  
  314.  
  315.  
  316. <p>Edit individual service file like for MongoDB Database &#8211; Edit /lib/systemd/system/mongod.service</p>
  317.  
  318.  
  319.  
  320. <pre class="wp-block-code"><code>&#91;Unit]
  321. Description=MongoDB Database Server
  322. Documentation=https://docs.mongodb.org/manual
  323. After=network.target
  324.  
  325. &#91;Service]
  326. User=mongodb
  327. Group=mongodb
  328. EnvironmentFile=-/etc/default/mongod
  329. ExecStart=/usr/bin/mongod --config /etc/mongod.conf
  330. PIDFile=/var/run/mongodb/mongod.pid
  331. # file size
  332. LimitFSIZE=infinity
  333. # cpu time
  334. LimitCPU=infinity
  335. # virtual memory size
  336. LimitAS=infinity
  337. # open files
  338. LimitNOFILE=9999999
  339. # processes/threads
  340. LimitNPROC=9999999
  341. # locked memory
  342. LimitMEMLOCK=infinity
  343. # total threads (user+kernel)
  344. TasksMax=infinity
  345. TasksAccounting=false
  346.  
  347. # Recommended limits for for mongod as specified in
  348. # http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
  349.  
  350. &#91;Install]
  351. WantedBy=multi-user.target</code></pre>
  352.  
  353.  
  354.  
  355. <p>Run the following command in terminal</p>
  356.  
  357.  
  358.  
  359. <pre class="wp-block-code"><code>systemctl daemon-reload</code></pre>
  360.  
  361.  
  362.  
  363. <p>Done</p>
  364.  
  365.  
  366.  
  367. <p></p>
  368. ]]></content:encoded>
  369. <wfw:commentRss>http://www.bictor.com/2022/07/17/ubuntu-16-04-modify-open-file-limits/feed/</wfw:commentRss>
  370. <slash:comments>0</slash:comments>
  371. <post-id xmlns="com-wordpress:feed-additions:1">452</post-id> </item>
  372. <item>
  373. <title>MacBook Pro 2009 &#8211; Ubuntu 20.04 Installation</title>
  374. <link>http://www.bictor.com/2021/06/16/macbook-pro-2009-ubuntu-20-04-installation/</link>
  375. <comments>http://www.bictor.com/2021/06/16/macbook-pro-2009-ubuntu-20-04-installation/#respond</comments>
  376. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  377. <pubDate>Wed, 16 Jun 2021 08:45:20 +0000</pubDate>
  378. <category><![CDATA[Linux]]></category>
  379. <guid isPermaLink="false">http://www.bictor.com/?p=421</guid>
  380.  
  381. <description><![CDATA[Download Ubuntu for Desktop (20.04) Burn on Pen Drive using Rufus (UEFI mode) Install normally as per the instructions provided on the screen Install full kde using sudo apt-get install kde-full sudo lshw -businfo -class bridge -class display Bus info]]></description>
  382. <content:encoded><![CDATA[
  383. <ol><li>Download Ubuntu for Desktop (20.04)</li><li>Burn on Pen Drive using Rufus (UEFI mode)</li><li>Install normally as per the instructions provided on the screen</li><li>Install full kde using</li></ol>
  384.  
  385.  
  386.  
  387. <p><code>sudo apt-get install kde-full</code></p>
  388.  
  389.  
  390.  
  391. <p>sudo lshw -businfo -class bridge -class display</p>
  392.  
  393.  
  394.  
  395. <p style="font-size:11px">Bus info          Device      Class          Description<br>========================================================<br>pci@0000:00:00.0              bridge         MCP79 Host Bridge<br>pci@0000:00:03.0              bridge         MCP79 LPC Bridge<br>pci@0000:00:09.0              bridge         MCP79 PCI Bridge<br>pci@0000:00:0c.0              bridge         MCP79 PCI Express Bridge<br><strong>pci@0000:00:10.0              bridge         MCP79 PCI Express Bridge<br>pci@0000:03:00.0              display        C79 [GeForce 9400M]</strong><br>pci@0000:00:15.0              bridge         MCP79 PCI Express Bridge<br>pci@0000:00:16.0              bridge         MCP79 PCI Express Bridge<br><br>Note: The addresses are of the display entry and PCI-E just before the display entry<br>It might vary and you might need to find the correct one</p>
  396.  
  397.  
  398.  
  399. <p>Now create a new file 01_enable_vga.conf</p>
  400.  
  401.  
  402.  
  403. <p class="has-small-font-size"><strong>Contents of the file created above : </strong><br>sudo setpci -s &#8220;00:10.0&#8221; 3e.b=8<br>sudo setpci -s &#8220;03:00.0&#8221; 04.b=7</p>
  404.  
  405.  
  406.  
  407. <p>sudo chmod 755 01_enable_vga.conf<br>sudo mv 01_enable_vga.conf /etc/grub.d<br>sudo update-grub</p>
  408.  
  409.  
  410.  
  411. <p>Reboot and Check</p>
  412. ]]></content:encoded>
  413. <wfw:commentRss>http://www.bictor.com/2021/06/16/macbook-pro-2009-ubuntu-20-04-installation/feed/</wfw:commentRss>
  414. <slash:comments>0</slash:comments>
  415. <post-id xmlns="com-wordpress:feed-additions:1">421</post-id> </item>
  416. <item>
  417. <title>Fix Old MacBook Windows 10 Reboot Issue</title>
  418. <link>http://www.bictor.com/2020/06/07/fix-old-macbook-windows-10-reboot-issue/</link>
  419. <comments>http://www.bictor.com/2020/06/07/fix-old-macbook-windows-10-reboot-issue/#comments</comments>
  420. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  421. <pubDate>Sun, 07 Jun 2020 21:46:49 +0000</pubDate>
  422. <category><![CDATA[Linux]]></category>
  423. <guid isPermaLink="false">http://www.bictor.com/?p=383</guid>
  424.  
  425. <description><![CDATA[I have MacBook 5,2 which i needed with Windows 10 as new MacOS is no further supported on it and i didn&#8217;t wanted to waste some good hardware engineering by Apple in it 🙂 However the installation of Windows 10]]></description>
  426. <content:encoded><![CDATA[
  427. <p>I have MacBook 5,2 which i needed with Windows 10 as new MacOS is no further supported on it and i didn&#8217;t wanted to waste some good hardware engineering by Apple in it <img src="https://s.w.org/images/core/emoji/14.0.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
  428.  
  429.  
  430.  
  431. <p>However the installation of Windows 10 was pretty straight forward &#8211; I made the installation disk with Rufus (with UEFI option) and put it in the MacBook and installed everything on the hardware. After initial installation I copied bootcamp drivers which i saved from Windows 7 disk and installed  them also on the notebook which made almost all the functionality come alive on the MacBook. Along with those drivers Nvidia Display drivers were also intalled.</p>
  432.  
  433.  
  434.  
  435. <p>Initially working without reboot everything was working fine but as soon it got rebooted it got stuck in the reboot loop .. with Windows Automatic Repair showing again and again. Finally i started researching on the problem and found that the problem was in the UEFI</p>
  436.  
  437.  
  438.  
  439. <p><code>While Windows 10 no longer expects an EFI system to have VGA-compatible video, Nvidia drivers apparently still do and crash if they don’t detect it. The above commands are supposed to enable the VGA support in the graphics card."</code></p>
  440.  
  441.  
  442.  
  443. <p>In order to fix the above issue, we need to somehow enable this in the UEFI firmware and i used the below technique to achieve it.</p>
  444.  
  445.  
  446.  
  447. <ul><li>Boot your windows in Safe mode With Networking</li><li>Open DiskPart utility of windows</li></ul>
  448.  
  449.  
  450.  
  451. <p><code>diskpart<br>select disk 0<br>select partition 2<br>assign letter=f</code></p>
  452.  
  453.  
  454.  
  455. <p>In the above commands we assume that Disk 0 is where Windows are installed, Partition 2 is your boot partition made by Windows</p>
  456.  
  457.  
  458.  
  459. <ul><li>Download Explorer++ from the net, its free &#8211;<a href="https://explorerplusplus.com/">https://explorerplusplus.com/</a></li><li>Open explorer++</li><li>Navigate to folder F:\EFI\Microsoft\Boot</li><li>Rename the original file bootmgfw.efi to bootmgfw_o.efi</li><li>Download the EFI shell from <a href="http://www.softcruise.com/shell_full.efi">http://www.softcruise.com/shell_full.efi</a></li><li>Copy shell_full.efi to F:\EFI\Microsoft\Boot</li><li>Make a new file by the name startup.nsh in the same folder</li><li>Write the following lines in it</li></ul>
  460.  
  461.  
  462.  
  463. <p><code>mm 0010003E 1 ;PCI :8<br>mm 03000004 1 ;PCI :7<br>fs0:\EFI\Microsoft\Boot\bootmgfw_o.efi</code></p>
  464.  
  465.  
  466.  
  467. <p>Now reboot your computer and it should boot without any trouble what-so-ever</p>
  468.  
  469.  
  470.  
  471. <blockquote class="wp-block-quote"><p><strong><em>Note:</em></strong><br>Registers on your MacBook might be different from<br>mm 0010003E 1 ;PCI :8<br>mm 03000004 1 ;PCI :7<br><br>In order to identify the right registers you can make use of the following commands</p><p>03 00 00 is Display VGA<br>00 10 00 is Bridge Control<br><br>To find out the register value through efi shell</p><p>Shell> pci -b<br>Shell> pic -i 00 10 00 -b<br>Shell> mm 0001003E -PCI 8<br>Shell> pci -i 03 00 00 -b<br>Shell> mm 03000004 -PCI 7</p><p>As I found out in another older mac the VGA controller was with id 02 instead of 03, so your&#8217;s might differ</p></blockquote>
  472.  
  473.  
  474.  
  475. <p><code><br></code></p>
  476. ]]></content:encoded>
  477. <wfw:commentRss>http://www.bictor.com/2020/06/07/fix-old-macbook-windows-10-reboot-issue/feed/</wfw:commentRss>
  478. <slash:comments>3</slash:comments>
  479. <post-id xmlns="com-wordpress:feed-additions:1">383</post-id> </item>
  480. <item>
  481. <title>Running VLC in Ubuntu as root</title>
  482. <link>http://www.bictor.com/2020/05/24/running-vlc-in-ubuntu-as-root/</link>
  483. <comments>http://www.bictor.com/2020/05/24/running-vlc-in-ubuntu-as-root/#respond</comments>
  484. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  485. <pubDate>Sun, 24 May 2020 10:57:18 +0000</pubDate>
  486. <category><![CDATA[Linux]]></category>
  487. <guid isPermaLink="false">http://www.bictor.com/?p=374</guid>
  488.  
  489. <description><![CDATA[Run the&#160;sed command&#160;below to make changes in the VLC binary file, it will replace the&#160;geteuid&#160;variable (which determines the effective user ID of the calling process) with&#160;getppid&#160;(which will determine the parent process ID of the calling process). In this command, ‘s/geteuid/getppid/‘]]></description>
  490. <content:encoded><![CDATA[
  491. <p>Run the&nbsp;<a href="https://www.tecmint.com/linux-sed-command-tips-tricks/" target="_blank" rel="noreferrer noopener">sed command</a>&nbsp;below to make changes in the VLC binary file, it will replace the&nbsp;<strong>geteuid</strong>&nbsp;variable (which determines the effective user ID of the calling process) with&nbsp;<strong>getppid</strong>&nbsp;(which will determine the parent process ID of the calling process).</p>
  492.  
  493.  
  494.  
  495. <p>In this command, ‘<strong>s/geteuid/getppid/</strong>‘ (<strong>regexp=geteuid, replacement=getppid</strong>) does the magic.</p>
  496.  
  497.  
  498.  
  499. <pre class="wp-block-preformatted">$ sudo sed -i 's/geteuid/getppid/' /usr/bin/vlc</pre>
  500. ]]></content:encoded>
  501. <wfw:commentRss>http://www.bictor.com/2020/05/24/running-vlc-in-ubuntu-as-root/feed/</wfw:commentRss>
  502. <slash:comments>0</slash:comments>
  503. <post-id xmlns="com-wordpress:feed-additions:1">374</post-id> </item>
  504. <item>
  505. <title>Enable root user in Ubuntu 20.04</title>
  506. <link>http://www.bictor.com/2020/04/26/enable-root-user-in-ubuntu-20-04/</link>
  507. <comments>http://www.bictor.com/2020/04/26/enable-root-user-in-ubuntu-20-04/#respond</comments>
  508. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  509. <pubDate>Sun, 26 Apr 2020 13:41:55 +0000</pubDate>
  510. <category><![CDATA[Linux]]></category>
  511. <guid isPermaLink="false">http://www.bictor.com/?p=368</guid>
  512.  
  513. <description><![CDATA[Step 1: Login into your account and open terminal Step 2: Type the following command to setup password for root account sudo passwd root Step 3: Open file /etc/pam.d/gdm-password sudo nano /etc/pam.d/gdm-password Step 4: Comment out the following line by]]></description>
  514. <content:encoded><![CDATA[
  515. <p>Step 1: Login into your account and open terminal</p>
  516.  
  517.  
  518.  
  519. <p>Step 2: Type the following command to setup password for root account</p>
  520.  
  521.  
  522.  
  523. <pre class="wp-block-preformatted">sudo passwd root</pre>
  524.  
  525.  
  526.  
  527. <p>Step 3: Open file /etc/pam.d/gdm-password</p>
  528.  
  529.  
  530.  
  531. <pre class="wp-block-preformatted">sudo nano /etc/pam.d/gdm-password</pre>
  532.  
  533.  
  534.  
  535. <p>Step 4: Comment out the following line by placing # infront of it</p>
  536.  
  537.  
  538.  
  539. <pre class="wp-block-preformatted">#auth    required    pam_succeed_if.so user != root quiet_success</pre>
  540.  
  541.  
  542.  
  543. <p>Step 5: sudo gedit<strong> /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf</strong></p>
  544.  
  545.  
  546.  
  547. <p>Step 6: At the end of the file append <strong>greeter-show-manual–login = true</strong></p>
  548.  
  549.  
  550.  
  551. <p>Step 7: Reboot the server</p>
  552. ]]></content:encoded>
  553. <wfw:commentRss>http://www.bictor.com/2020/04/26/enable-root-user-in-ubuntu-20-04/feed/</wfw:commentRss>
  554. <slash:comments>0</slash:comments>
  555. <post-id xmlns="com-wordpress:feed-additions:1">368</post-id> </item>
  556. <item>
  557. <title>Enable root user in Ubuntu 16.04</title>
  558. <link>http://www.bictor.com/2020/04/26/enable-root-user-in-ubuntu-16-04/</link>
  559. <comments>http://www.bictor.com/2020/04/26/enable-root-user-in-ubuntu-16-04/#respond</comments>
  560. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  561. <pubDate>Sun, 26 Apr 2020 13:30:35 +0000</pubDate>
  562. <category><![CDATA[Linux]]></category>
  563. <guid isPermaLink="false">http://www.bictor.com/?p=364</guid>
  564.  
  565. <description><![CDATA[By default root user account is disabled for login in Ubuntu. Steps mentioned below will allow you to enable the root user and login as root on the OS. Login to your account and open Terminal sudo passwd root Type]]></description>
  566. <content:encoded><![CDATA[
  567. <p>By default root user account is disabled for login in Ubuntu. Steps mentioned below will allow you to enable the root user and login as root on the OS.</p>
  568.  
  569.  
  570.  
  571. <ol><li>Login to your account and open Terminal</li><li>sudo passwd root</li><li>Type in the new password for UNIX</li><li>sudo gedit<strong> /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf</strong></li><li>At the end of the file append <strong>greeter-show-manual–login = true</strong></li></ol>
  572.  
  573.  
  574.  
  575. <p>That’s all, now reboot the system and you can login to root account using manual login.</p>
  576. ]]></content:encoded>
  577. <wfw:commentRss>http://www.bictor.com/2020/04/26/enable-root-user-in-ubuntu-16-04/feed/</wfw:commentRss>
  578. <slash:comments>0</slash:comments>
  579. <post-id xmlns="com-wordpress:feed-additions:1">364</post-id> </item>
  580. <item>
  581. <title>MySQL on Ubuntu 18.04</title>
  582. <link>http://www.bictor.com/2020/04/24/mysql-on-ubuntu-18-04/</link>
  583. <comments>http://www.bictor.com/2020/04/24/mysql-on-ubuntu-18-04/#respond</comments>
  584. <dc:creator><![CDATA[thinkofashish@gmail.com]]></dc:creator>
  585. <pubDate>Fri, 24 Apr 2020 12:58:31 +0000</pubDate>
  586. <category><![CDATA[Linux]]></category>
  587. <guid isPermaLink="false">http://www.bictor.com/?p=362</guid>
  588.  
  589. <description><![CDATA[Introduction MySQL&#160;is an open-source database management system, commonly installed as part of the popular&#160;LAMP&#160;(Linux, Apache, MySQL, PHP/Python/Perl) stack. It uses a relational database and SQL (Structured Query Language) to manage its data. The short version of the installation is simple:]]></description>
  590. <content:encoded><![CDATA[
  591. <h3 class="wp-block-heading" id="introduction">Introduction</h3>
  592.  
  593.  
  594.  
  595. <p><a href="https://www.mysql.com/">MySQL</a>&nbsp;is an open-source database management system, commonly installed as part of the popular&nbsp;<a href="https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-ubuntu-18-04">LAMP</a>&nbsp;(Linux, Apache, MySQL, PHP/Python/Perl) stack. It uses a relational database and SQL (Structured Query Language) to manage its data.</p>
  596.  
  597.  
  598.  
  599. <p>The short version of the installation is simple: update your package index, install the&nbsp;<code>mysql-server</code>&nbsp;package, and then run the included security script.</p>
  600.  
  601.  
  602.  
  603. <pre class="wp-block-code"><code>sudo apt update
  604. sudo apt install mysql-server
  605. sudo mysql_secure_installation
  606. </code></pre>
  607.  
  608.  
  609.  
  610. <p>This tutorial will explain how to install MySQL version 5.7 on an Ubuntu 18.04 server. However, if you’re looking to update an existing MySQL installation to version 5.7, you can read&nbsp;<a href="https://www.digitalocean.com/community/tutorials/how-to-prepare-for-your-mysql-5-7-upgrade">this MySQL 5.7 update guide</a>&nbsp;instead.</p>
  611.  
  612.  
  613.  
  614. <h2 class="wp-block-heading" id="prerequisites">Prerequisites</h2>
  615.  
  616.  
  617.  
  618. <p>To follow this tutorial, you will need:</p>
  619.  
  620.  
  621.  
  622. <ul><li>One Ubuntu 18.04 server set up by following&nbsp;<a href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04">this initial server setup guide</a>, including a non-<strong>root</strong>&nbsp;user with&nbsp;<code>sudo</code>&nbsp;privileges and a firewall.</li></ul>
  623.  
  624.  
  625.  
  626. <h2 class="wp-block-heading" id="step-1-—-installing-mysql">Step 1 — Installing MySQL</h2>
  627.  
  628.  
  629.  
  630. <p>On Ubuntu 18.04, only the latest version of MySQL is included in the APT package repository by default. At the time of writing, that’s MySQL 5.7</p>
  631.  
  632.  
  633.  
  634. <p>To install it, update the package index on your server with&nbsp;<code>apt</code>:</p>
  635.  
  636.  
  637.  
  638. <pre class="wp-block-code"><code>sudo apt update
  639. </code></pre>
  640.  
  641.  
  642.  
  643. <p>Then install the default package:</p>
  644.  
  645.  
  646.  
  647. <pre class="wp-block-code"><code>sudo apt install mysql-server
  648. </code></pre>
  649.  
  650.  
  651.  
  652. <p>This will install MySQL, but will not prompt you to set a password or make any other configuration changes. Because this leaves your installation of MySQL insecure, we will address this next.</p>
  653.  
  654.  
  655.  
  656. <h2 class="wp-block-heading" id="step-2-—-configuring-mysql">Step 2 — Configuring MySQL</h2>
  657.  
  658.  
  659.  
  660. <p>For fresh installations, you’ll want to run the included security script. This changes some of the less secure default options for things like remote root logins and sample users. On older versions of MySQL, you needed to initialize the data directory manually as well, but this is done automatically now.</p>
  661.  
  662.  
  663.  
  664. <p>Run the security script:</p>
  665.  
  666.  
  667.  
  668. <pre class="wp-block-code"><code>sudo mysql_secure_installation
  669. </code></pre>
  670.  
  671.  
  672.  
  673. <p>This will take you through a series of prompts where you can make some changes to your MySQL installation’s security options. The first prompt will ask whether you’d like to set up the Validate Password Plugin, which can be used to test the strength of your MySQL password. Regardless of your choice, the next prompt will be to set a password for the MySQL&nbsp;<strong>root</strong>&nbsp;user. Enter and then confirm a secure password of your choice.</p>
  674.  
  675.  
  676.  
  677. <p>From there, you can press&nbsp;<code>Y</code>&nbsp;and then&nbsp;<code>ENTER</code>&nbsp;to accept the defaults for all the subsequent questions. This will remove some anonymous users and the test database, disable remote root logins, and load these new rules so that MySQL immediately respects the changes you have made.</p>
  678.  
  679.  
  680.  
  681. <p>To initialize the MySQL data directory, you would use&nbsp;<code>mysql_install_db</code>&nbsp;for versions before 5.7.6, and&nbsp;<code>mysqld --initialize</code>&nbsp;for 5.7.6 and later. However, if you installed MySQL from the Debian distribution, as described in Step 1, the data directory was initialized automatically; you don’t have to do anything. If you try running the command anyway, you’ll see the following error:Output</p>
  682.  
  683.  
  684.  
  685. <pre class="wp-block-code"><code>mysqld: Can't create directory '/var/lib/mysql/' (Errcode: 17 - File exists)
  686. . . .
  687. 2018-04-23T13:48:00.572066Z 0 &#91;ERROR] Aborting
  688. </code></pre>
  689.  
  690.  
  691.  
  692. <p>Note that even though you’ve set a password for the&nbsp;<strong>root</strong>&nbsp;MySQL user, this user is not configured to authenticate with a password when connecting to the MySQL shell. If you’d like, you can adjust this setting by following Step 3.</p>
  693.  
  694.  
  695.  
  696. <h2 class="wp-block-heading" id="step-3-—-optional-adjusting-user-authentication-and-privileges">Step 3 — (Optional) Adjusting User Authentication and Privileges</h2>
  697.  
  698.  
  699.  
  700. <p>In Ubuntu systems running MySQL 5.7 (and later versions), the&nbsp;<strong>root</strong>&nbsp;MySQL user is set to authenticate using the&nbsp;<code>auth_socket</code>&nbsp;plugin by default rather than with a password. This allows for some greater security and usability in many cases, but it can also complicate things when you need to allow an external program (e.g., phpMyAdmin) to access the user.</p>
  701.  
  702.  
  703.  
  704. <p>In order to use a password to connect to MySQL as&nbsp;<strong>root</strong>, you will need to switch its authentication method from&nbsp;<code>auth_socket</code>&nbsp;to&nbsp;<code>mysql_native_password</code>. To do this, open up the MySQL prompt from your terminal:</p>
  705.  
  706.  
  707.  
  708. <pre class="wp-block-code"><code>sudo mysql
  709. </code></pre>
  710.  
  711.  
  712.  
  713. <p>Next, check which authentication method each of your MySQL user accounts use with the following command:</p>
  714.  
  715.  
  716.  
  717. <pre class="wp-block-code"><code>SELECT user,authentication_string,plugin,host FROM mysql.user;
  718. </code></pre>
  719.  
  720.  
  721.  
  722. <pre class="wp-block-code"><code>Output+------------------+-------------------------------------------+-----------------------+-----------+
  723. | user             | authentication_string                     | plugin                | host      |
  724. +------------------+-------------------------------------------+-----------------------+-----------+
  725. | root             |                                           | auth_socket           | localhost |
  726. | mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
  727. | mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
  728. | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
  729. +------------------+-------------------------------------------+-----------------------+-----------+
  730. 4 rows in set (0.00 sec)
  731. </code></pre>
  732.  
  733.  
  734.  
  735. <p>In this example, you can see that the&nbsp;<strong>root</strong>&nbsp;user does in fact authenticate using the&nbsp;<code>auth_socket</code>&nbsp;plugin. To configure the&nbsp;<strong>root</strong>&nbsp;account to authenticate with a password, run the following&nbsp;<code>ALTER USER</code>&nbsp;command. Be sure to change&nbsp;<code>password</code>&nbsp;to a strong password of your choosing, and note that this command will change the&nbsp;<strong>root</strong>&nbsp;password you set in Step 2:</p>
  736.  
  737.  
  738.  
  739. <pre class="wp-block-code"><code>ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
  740. </code></pre>
  741.  
  742.  
  743.  
  744. <p>Then, run&nbsp;<code>FLUSH PRIVILEGES</code>&nbsp;which tells the server to reload the grant tables and put your new changes into effect:</p>
  745.  
  746.  
  747.  
  748. <pre class="wp-block-code"><code>FLUSH PRIVILEGES;
  749. </code></pre>
  750.  
  751.  
  752.  
  753. <p>Check the authentication methods employed by each of your users again to confirm that&nbsp;<strong>root</strong>&nbsp;no longer authenticates using the&nbsp;<code>auth_socket</code>&nbsp;plugin:</p>
  754.  
  755.  
  756.  
  757. <pre class="wp-block-code"><code>SELECT user,authentication_string,plugin,host FROM mysql.user;
  758. </code></pre>
  759.  
  760.  
  761.  
  762. <pre class="wp-block-code"><code>Output+------------------+-------------------------------------------+-----------------------+-----------+
  763. | user             | authentication_string                     | plugin                | host      |
  764. +------------------+-------------------------------------------+-----------------------+-----------+
  765. | root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
  766. | mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
  767. | mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
  768. | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
  769. +------------------+-------------------------------------------+-----------------------+-----------+
  770. 4 rows in set (0.00 sec)
  771. </code></pre>
  772.  
  773.  
  774.  
  775. <p>You can see in this example output that the&nbsp;<strong>root</strong>&nbsp;MySQL user now authenticates using a password. Once you confirm this on your own server, you can exit the MySQL shell:</p>
  776.  
  777.  
  778.  
  779. <pre class="wp-block-code"><code>exit
  780. </code></pre>
  781.  
  782.  
  783.  
  784. <p>Alternatively, some may find that it better suits their workflow to connect to MySQL with a dedicated user. To create such a user, open up the MySQL shell once again:</p>
  785.  
  786.  
  787.  
  788. <pre class="wp-block-code"><code>sudo mysql
  789. </code></pre>
  790.  
  791.  
  792.  
  793. <p><strong>Note:</strong>&nbsp;If you have password authentication enabled for&nbsp;<strong>root</strong>, as described in the preceding paragraphs, you will need to use a different command to access the MySQL shell. The following will run your MySQL client with regular user privileges, and you will only gain administrator privileges within the database by authenticating:</p>
  794.  
  795.  
  796.  
  797. <pre class="wp-block-code"><code>mysql -u root -p
  798. </code></pre>
  799.  
  800.  
  801.  
  802. <p>From there, create a new user and give it a strong password:</p>
  803.  
  804.  
  805.  
  806. <pre class="wp-block-code"><code>CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
  807. </code></pre>
  808.  
  809.  
  810.  
  811. <p>Then, grant your new user the appropriate privileges. For example, you could grant the user privileges to all tables within the database, as well as the power to add, change, and remove user privileges, with this command:</p>
  812.  
  813.  
  814.  
  815. <pre class="wp-block-code"><code>GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
  816. </code></pre>
  817.  
  818.  
  819.  
  820. <p>Note that, at this point, you do not need to run the&nbsp;<code>FLUSH PRIVILEGES</code>&nbsp;command again. This command is only needed when you modify the grant tables using statements like&nbsp;<code>INSERT</code>,&nbsp;<code>UPDATE</code>, or&nbsp;<code>DELETE</code>. Because you created a new user, instead of modifying an existing one,&nbsp;<code>FLUSH PRIVILEGES</code>&nbsp;is unnecessary here.</p>
  821.  
  822.  
  823.  
  824. <p>Following this, exit the MySQL shell:</p>
  825.  
  826.  
  827.  
  828. <pre class="wp-block-code"><code>exit
  829. </code></pre>
  830.  
  831.  
  832.  
  833. <p>Finally, let’s test the MySQL installation.</p>
  834.  
  835.  
  836.  
  837. <h2 class="wp-block-heading" id="step-4-—-testing-mysql">Step 4 — Testing MySQL</h2>
  838.  
  839.  
  840.  
  841. <p>Regardless of how you installed it, MySQL should have started running automatically. To test this, check its status.</p>
  842.  
  843.  
  844.  
  845. <pre class="wp-block-code"><code>systemctl status mysql.service
  846. </code></pre>
  847.  
  848.  
  849.  
  850. <p>You’ll see output similar to the following:Output</p>
  851.  
  852.  
  853.  
  854. <pre class="wp-block-code"><code>● mysql.service - MySQL Community Server
  855.   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
  856.   Active: active (running) since Wed 2018-04-23 21:21:25 UTC; 30min ago
  857. Main PID: 3754 (mysqld)
  858.    Tasks: 28
  859.   Memory: 142.3M
  860.      CPU: 1.994s
  861.   CGroup: /system.slice/mysql.service
  862.           └─3754 /usr/sbin/mysqld
  863. </code></pre>
  864.  
  865.  
  866.  
  867. <p>If MySQL isn’t running, you can start it with&nbsp;<code>sudo systemctl start mysql</code>.</p>
  868.  
  869.  
  870.  
  871. <p>For an additional check, you can try connecting to the database using the&nbsp;<code>mysqladmin</code>&nbsp;tool, which is a client that lets you run administrative commands. For example, this command says to connect to MySQL as&nbsp;<strong>root</strong>&nbsp;(<code>-u root</code>), prompt for a password (<code>-p</code>), and return the version.</p>
  872.  
  873.  
  874.  
  875. <pre class="wp-block-code"><code>sudo mysqladmin -p -u root version
  876. </code></pre>
  877.  
  878.  
  879.  
  880. <p>You should see output similar to this:Output</p>
  881.  
  882.  
  883.  
  884. <pre class="wp-block-code"><code>mysqladmin  Ver 8.42 Distrib 5.7.21, for Linux on x86_64
  885. Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
  886.  
  887. Oracle is a registered trademark of Oracle Corporation and/or its
  888. affiliates. Other names may be trademarks of their respective
  889. owners.
  890.  
  891. Server version      5.7.21-1ubuntu1
  892. Protocol version    10
  893. Connection      Localhost via UNIX socket
  894. UNIX socket     /var/run/mysqld/mysqld.sock
  895. Uptime:         30 min 54 sec
  896.  
  897. Threads: 1  Questions: 12  Slow queries: 0  Opens: 115  Flush tables: 1  Open tables: 34  Queries per second avg: 0.006
  898. </code></pre>
  899.  
  900.  
  901.  
  902. <p>This means MySQL is up and running.</p>
  903. ]]></content:encoded>
  904. <wfw:commentRss>http://www.bictor.com/2020/04/24/mysql-on-ubuntu-18-04/feed/</wfw:commentRss>
  905. <slash:comments>0</slash:comments>
  906. <post-id xmlns="com-wordpress:feed-additions:1">362</post-id> </item>
  907. </channel>
  908. </rss>
  909.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//www.bictor.com/feed/

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda