tag:blogger.com,1999:blog-66401892024-03-13T23:50:16.510+05:30Walk with meMy daily walk of life, Linux, open source and more...Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.comBlogger81125tag:blogger.com,1999:blog-6640189.post-1125058082355173522018-12-07T15:10:00.001+05:302018-12-07T15:10:35.473+05:30MS 2.0<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-qL-eKRkoJqo/XAo-yniYj1I/AAAAAAAAHCM/R1t__FysNdglgbdFmvjDNn7B08Pqc2g2ACLcBGAs/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="303" data-original-width="990" height="194" src="https://4.bp.blogspot.com/-qL-eKRkoJqo/XAo-yniYj1I/AAAAAAAAHCM/R1t__FysNdglgbdFmvjDNn7B08Pqc2g2ACLcBGAs/s640/Untitled.png" width="640" /></a></div>
Web and Microsoft has come a long way in the past decade. Remember this?<br />
<blockquote class="tr_bq" style="text-align: left;">
<span style="text-align: center;"><span style="color: blue;">This site is best viewed on IE in 1024x768 resolution</span></span></blockquote>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
</div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-70558692635389316562018-11-09T18:53:00.000+05:302018-11-09T18:53:23.737+05:30Red + Blue<div dir="ltr" style="text-align: left;" trbidi="on">
I moved one of my <a href="https://github.com/vijairaj/psbb-omr-alerts" target="_blank">toy cloud app</a> from Redhat to Bluemix and then this hapenned...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-lS-1b7G4ZEI/W-WJ2XUxxPI/AAAAAAAAHA4/1WXXB0-BxRYYsCn45v1_f0SZ2R2bFYgxwCLcBGAs/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="470" data-original-width="645" height="290" src="https://2.bp.blogspot.com/-lS-1b7G4ZEI/W-WJ2XUxxPI/AAAAAAAAHA4/1WXXB0-BxRYYsCn45v1_f0SZ2R2bFYgxwCLcBGAs/s400/Untitled.png" width="400" /></a></div>
<br />
<br /></div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-91996071621940636482018-10-18T06:16:00.001+05:302018-10-18T06:18:33.945+05:30What a big shift in Microsoft's attitude towards open source<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
Open source contributions made by employees of different organizations</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-mdLNvZyi_sY/W8fX0DjKGdI/AAAAAAAAG_I/bGmbaeOO2UURo7_6xaTb5Nnj6fJETiEWwCLcBGAs/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="898" data-original-width="477" height="640" src="https://2.bp.blogspot.com/-mdLNvZyi_sY/W8fX0DjKGdI/AAAAAAAAG_I/bGmbaeOO2UURo7_6xaTb5Nnj6fJETiEWwCLcBGAs/s640/Untitled.png" width="337" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div style="text-align: center;">
<span style="color: #cccccc;">Courtesy: https://octoverse.github.com/projects</span></div>
<div style="text-align: center;">
<br /></div>
</div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-5320238445306385792018-10-08T11:54:00.002+05:302018-10-08T11:57:20.555+05:30One of those things that hasn't changed in the past 15 years<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-pD3CuJYH7sc/W7r4wf9hZBI/AAAAAAAAG-E/-wx8vsFQZVYoYjjAM7G9v9hD6Cu64fyQACLcBGAs/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="685" data-original-width="1267" height="216" src="https://2.bp.blogspot.com/-pD3CuJYH7sc/W7r4wf9hZBI/AAAAAAAAG-E/-wx8vsFQZVYoYjjAM7G9v9hD6Cu64fyQACLcBGAs/s400/Untitled.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br /></div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-4252014672518600412018-08-26T23:26:00.000+05:302018-08-26T23:27:35.799+05:30Cutting the corners<div dir="ltr" style="text-align: left;" trbidi="on">
No day passes by without a discussion of the traffic woes during the lunch. Everyone narrates their ordeal during the morning commute and we all end up agreeing that this is not going to change. If at all, it's going to become worse. The location is Chennai but similar discussions are common place around India. No amount of blaming or outrage is going to change the situation, instead i just want to document some common mistakes on the road I encounter regularly.<br />
<br />
Being a non-native English speaker, I encountered the term "cutting the corners" in a different context and only later realized that the term could have originated by the behaviour on road.<br />
<h4 style="text-align: left;">
Cutting corners #1</h4>
<span id="goog_467572511"></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Tgv-uQHBWec/W4Lo_BFzecI/AAAAAAAAG5M/iPDPc52d4tg3Qpb22fS97q-xt9S_7UDXQCEwYBhgL/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="577" data-original-width="1465" height="155" src="https://4.bp.blogspot.com/-Tgv-uQHBWec/W4Lo_BFzecI/AAAAAAAAG5M/iPDPc52d4tg3Qpb22fS97q-xt9S_7UDXQCEwYBhgL/s400/Untitled.png" width="400" /></a></div>
<br />
<h4 style="text-align: left;">
Cutting corners #2</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-ST2rv-cfIhM/W4Lo2SM1HuI/AAAAAAAAG5Q/KAwnfAwA8TA_eoAG38r3oDGTEIQak-x0ACEwYBhgL/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="553" data-original-width="1465" height="150" src="https://1.bp.blogspot.com/-ST2rv-cfIhM/W4Lo2SM1HuI/AAAAAAAAG5Q/KAwnfAwA8TA_eoAG38r3oDGTEIQak-x0ACEwYBhgL/s400/Untitled.png" width="400" /></a></div>
<br /></div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-33342112265743643542017-05-12T01:56:00.000+05:302017-05-12T01:56:22.643+05:30setuptools - dealing with compiling custom modules on windows<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Courier New, Courier, monospace;">pip install</span> has hugely simplified how python modules are installed and managed but sometimes it simply can't compile custom extensions despite having all the prerequisites. This simply boils down to pip not being able to automatically determine the required visual studio environment. The simplest fix I found and that I keep forgetting is to get to visual studio command prompt and set a couple of environment variables to prevent distutils from auto discovering the visual studio environment.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">%path_to%\vcvarsall.bat x64</span><br />
<span style="font-family: "Courier New", Courier, monospace;"><br /></span>
<span style="font-family: "Courier New", Courier, monospace;">SET DISTUTILS_USE_SDK=1</span><br />
<span style="font-family: Courier New, Courier, monospace;">SET MSSdk=1</span><br />
<div>
<br /></div>
<div>
<br /></div>
</div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-34798155450310950142016-12-03T19:32:00.000+05:302016-12-03T19:32:43.484+05:30Pausing...<div dir="ltr" style="text-align: left;" trbidi="on">
<span id="docs-internal-guid-a535afad-c4fa-a94d-6fe4-7a3530a7131f"><span style="font-family: Arial; font-size: 14.6667px; vertical-align: baseline; white-space: pre-wrap;">This thought came up one day when I was in my second job. My first job was all about exciting stuff such as device drivers, firmware for smart card terminals, cryptography and a whole lot of cutting edge technologies, the fancy and glamorous stuff that would be a dream for many aspiring programmers. But I cannot say the same thing about my second job. To my surprise I didn't even realize it till very long into my job. Motorola 68k, serial communication, matrix keypad and text display can’t be called cutting edge even 15 years back, that’s when this thought popped up - What was I doing all these 6 years? Was I in a long hibernation, isolated and lost in the career path? I sure was not idle all these years, rather I was very busy fixing things, so it definitely should have some value addition and learnings that I didn’t realize. That’s when I set out to reflect on my experience working on legacy software and hardware platforms.</span></span></div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-62515641806052943972016-03-17T23:11:00.001+05:302016-03-17T23:11:41.440+05:30Self driving cars - the Indian dilemma<div dir="ltr" style="text-align: left;" trbidi="on">
I read an <a href="http://www.wired.com/2016/03/self-driving-cars-wont-work-change-roads-attitudes" target="_blank">article about self driving cars </a>which got me thinking about the prospects of such a car in an Indian context. Aside from the general problems that autonomous cars have to tackle, I could instantly think of a few additional and unique problems of its own in an Indian context.<br />
<h4 style="text-align: left;">
</h4>
<div style="text-align: left;">
<b>The direction dilemma:</b> At times when I end up in a new intersection, I have a few problems waiting to be solved before I can proceed towards the destination.</div>
<ul style="text-align: left;">
<li>Missing signal posts</li>
<li>Misaligned signal posts</li>
<li>Signal post not visible from the stop line because it's sometimes right over the head and even behind it.</li>
</ul>
<b>The stop dilemma:</b> On one occasion, the car in front stopped and I stopped behind it as well but later realized that the car has "pulled off" for a break without any indication.<br />
<br />
<b>The indicator dilemma:</b> How many times I have driven behind a vehicle with the indicator on assuming that it will take a turn but later realized that it wouldn't because the driver had forgot to switch it off after the last turn.<br />
<br />
<b>The pass dilemma:</b> I have wondered for a long time why the switch to blink the headlight is marked as "pass" on my motorcyle. In India this is used for the exactly opposite purpose, i.e. to THREATEN the oncomers to STOP when one wants to take a turn.<br />
<br />
<b>The indicator dilemma:</b> Driving on highways, it took me some time to realize that the turn indicator is used by a vehicle in the front to signal it's intention to allow the vehicle behind it to overtake.<br />
<br />
<b>The honking dilemma:</b> I am riding and not doing anything wrong and some one honks from behind - what should I do.<br />
<br />
These are just a few scenarios that came to my mind instantly. SURPRISES are the norm here, even an experienced driver has to think twice before making a decision, leave alone the self driving cars. Last night I was taken by surprise when I saw the display board on a minibus flashing green LEDs and for a second thought that it was the traffic signal. U-turns, I don't even want to talk about it. Many assumptions that is a starting point for the self driving cars will be rendered untrue, we need to raise to the ground fist before building on top of it. The irony is that, these cars will one day teach us how to behave on the road!</div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-54005590007721951382015-02-09T20:35:00.001+05:302015-02-09T20:35:52.769+05:30The first Ubuntu Phone<div dir="ltr" style="text-align: left;" trbidi="on">
Eagerly awaiting more details to emerge on the first Ubuntu phone - <a href="https://www.google.com/search?q=bq+aquaris+e4.5" target="_blank">BQ Aquaris E4.5</a>. Especially on the software and how Canonical has managed to build the GUI stack and multimedia playback. Given that the Linux support is not something to cheer about when it comes to graphics drivers and video decoding, the fact that there's now a real consumer device is something interesting and awaiting some real reviews on the device. There has been quite a bit of discussions on the <a href="https://www.google.com/search?q=Mir+Display+Server" target="_blank">Mir Display Server</a> and <a href="https://www.google.com/search?q=libhybris" target="_blank">libhybris</a> - Waiting to see how these have shaped up for the phone.</div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-21315539762304585192015-01-21T09:56:00.002+05:302015-01-21T09:57:39.893+05:30A tribute to my PC<div dir="ltr" style="text-align: left;" trbidi="on">
Back in 2004, I bought my first Personal Computer. It was assembled by a local seller and had a Gigabyte motherboard with a VIA K8M800 chipset and a Socket 754 for AMD Athlon 64 bit processor. I was very excited and was eagerly awaiting the delivery and this was around the Pooja holidays. One fine night it arrived, the PC and it's accompanies - a Samsung CRT monitor, a Samsung PS/2 Keyboard with multimedia keys and a dedicated sleep/shutdown button, a Logictech PS/2 Optical mouse and an APC UPS. It came with Windows XP which I never intended to use and my plan was to have Linux installed.<br />
<br />
That was a time when high speed internet meant 64Kbps (Internet cafes proudly advertised that they had high speed ISDN lines at 64Kbps), Cable broadband meant 128Kbps and the only broadband operator was Sify who wouldn't offer me a connection because they didn't have cables running to my neighborhood. All these meant that download a Linux distro over the internet is nearly impossible. There were other other options though - A well known Linux magazine called "Linux For You" provide a companion CD, usually a bootable live CD with latest distros and other free software, and another option was the Local Linux User group <a href="http://ilugc.in/">http://ilugc.in</a> where we used to maintain a directory with an index of all the CDs each member had so that we could borrow and take a copy. I lost count of all the distros that I had tried - Knoppix, Fedora, Debian, Gentoo, and numerous others. My PC made it an interesting proportion to try the various distros since none of them would work out of the box. GUI being the first bottleneck - The S3 Unichrome onboard GPU is not the mostly widely used that many wouldn't even have heard off. Obviously there were no graphics drivers so many would just fallback to the console, the ones that actually booted up to the GUI would use the vesa driver with a reduced resolution and a not so great GUI experience, then there was the multimedia keyboard that I had to figure the scan code and map them to the specific operations in the X keyboard layout configuration, Then there was this APC UPS which had a USB interface so I can hook it up to the PC and monitor the battery charging/draining status. Initially I had to compile the kernel modules to get this to working but sooner many distros started shipping all the necessary components to make it a breeze.<br />
<br />
Then came the "Warty Warthhog" - the first ever version of the Ubuntu. Canonical, the makers of Ubuntu had a nice program where I could order a set of CDs online and they would ship it to me for FREE. They encouraged to order a pack of CDs instead of singles so that I can give it to my friends and spread Linux. This was a totally nice and refreshing experience, where minimalism was the main theme. That was a Gnome based desktop and the whole desktop looked polished and fresh with an unusual brown theme. I loved the CD pouches with the Ubuntu logo. In fact they even shipped a few Ubuntu decals so that I can have them applied on my PC.<br />
<br />
(to be continued...) <br />
<br /></div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-2745980711176846672014-12-17T19:44:00.001+05:302014-12-17T19:45:37.032+05:30Flash memory Vs eMMC<div dir="ltr" style="text-align: left;" trbidi="on">
Flash memory and eMMC are the two most common non-volatile memory found on embedded systems.<br />
<br />
<b>Lets start with Flash - There are two types of them:</b><br />
1) NOR Flash - Byte addressable (<i>Read a byte, Write a byte (only flip bit:1s to 0s but not vice versa), Erase a sector/block to set all the bits to 1</i>)<br />
2) NAND Flash - Block addressable (<i>Read/Write one block - typically one block is read in to memory before individual bytes in the block can be accessed</i>)<br />
<br />
Both types are connected to the system address bus, i.e. they are memory mapped and can be accessed by referencing their memory address.<br />
<br />
<b>eMMC:</b><br />
Embedded Multimedia Controller is basically Flash memory bundled along with a controller. The flash memory can be accessed only via the controller using the eMMC protocol.</div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-74233452869589337492014-10-10T13:08:00.002+05:302014-10-10T13:08:25.201+05:30Remote debugging a QNX application running on an ARM target<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: left;">
<b>On the target</b></h2>
<i>Make sure pdebug is running and listening on port 8000</i><br />
<h2 style="text-align: left;">
<b>On the host</b></h2>
<i>Start the gdb</i><br />
<blockquote class="tr_bq">
<span style="background-color: #cccccc;"><span style="font-family: "Courier New",Courier,monospace;">ntoarm-gdb</span></span></blockquote>
<i>Connect to the target</i><br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: #cccccc;">target qnx remote-ip:8000</span></span></blockquote>
<i>List all the process running on the target</i><br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: #cccccc;">info pidlist</span></span></blockquote>
<i>Attach to a process (Use the above listing to find the pid of the required process)</i><br />
<blockquote class="tr_bq">
<span style="background-color: #cccccc;"><span style="font-family: "Courier New",Courier,monospace;">attach pid</span></span></blockquote>
<i>Debug the process</i><br />
<blockquote class="tr_bq">
<span style="background-color: #cccccc;"><span style="font-family: "Courier New",Courier,monospace;">info / step / continue</span></span></blockquote>
<i>Kill the process</i><br />
<blockquote class="tr_bq">
<span style="background-color: #cccccc;"><span style="font-family: "Courier New",Courier,monospace;">kill</span></span></blockquote>
<i>Detach from the process</i><br />
<blockquote class="tr_bq">
<span style="background-color: #cccccc;"><span style="font-family: "Courier New",Courier,monospace;">detach</span></span></blockquote>
</div>
Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-75126452499616293052010-02-28T11:58:00.002+05:302010-02-28T12:02:47.117+05:30My shortlist of diesel cars<div><b>Looking to buy a diesel car with good safety features, comfort and a nice look.</b></div><div><b><i><br /></i></b></div><div><b><i>My short list:</i></b></div><div>1. Fiat Punto - Emotion (~6.5 L on road chennai)</div><div>2. Volkswagen Polo - Comfortline (~6.5 L on road chennai)</div><div>3. Ford Figo - Titanium (~6 L on road chennai)</div><div>4. Maruti Ritz - ?</div><div><br /></div><div><b><i>Tata motors/Fiat showroom, Ambattur:</i></b></div><div>I was impressed at the solid build of the Punto. One can feel the solidness just by touching the doors. The seats are comfortable and it's easy to get in to and out of the car - thanks to its height and ground clearance. I am very much impressed by this car but waiting to see the Polo before deciding. The only bad part is that sales and service are from Tata and I had a first hand bad experience when I walked in to the show room - There were no body to attend and 5-6 visitors who were looking at the cars. The booking amount is Rs.10K and it takes 15 days to deliver.</div><div><br /></div><div><b><i>Volkswagen showroom, CIT nagar:</i></b></div><div>Polo will be available in showroom during 2nd week of march. 80 cars have already been booked in chennai. Petrol car delivery starts from April. One have to wait till june for the diesel engine. 50 K is the booking amount and it takes one month for delivery.</div><div><br /></div><div><b><i>MPL Ford, Anna salai:</i></b></div><div>Figo is already available in showroom but one has to wait another week for a test drive. The 1.4L diesel engine is the same one from Fiesta. The top end model Titanium has airbags and ABS, but no rear power windows. It has an excellent boot space and good leg room at the back. The car doesn't look stylish though. 25K is the booking amount and it takes one month for delivery. Already 240 Figo's are booked in Chennai. (There is also a new MPL showroom near SRP Tools OMR)</div><div><br /></div><div><i>Yet to visit a Maruti showroom.</i></div>Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-9738973720077671372009-01-08T15:50:00.000+05:302009-01-08T15:54:41.214+05:30Parsing and using custom extension in X.509 certificates <br><font size=2 face="sans-serif">In the last two posts we saw how to create certificates with custom extensions and how to view extension in X.509 certificates, now it's time that we use them for some real purpose. The main purpose of placing custom extension is to express certain capabilities of the certificate holder. The receiving systems verifies the capabilities of the holder based on the presence of these extensions and the corresponding values in the extensions. </font> <br> <br><font size=2 face="sans-serif">In the current example we will see the parsing of a non-standard extension called </font><a href="http://www.oid-info.com/get/1.3.36.8.3.3"><font size=2 color=blue face="sans-serif">Admission with oid: 1.3.36.8.3.3</font></a><font size=2 face="sans-serif"> which is defined in the</font><a href="http://www.teletrust.de/Dokumente/ISIS-MTT_Core_Specification_v1.1.pdf"><font size=2 color=blue face="sans-serif"> ISIS-MTT</font></a><font size=2 face="sans-serif"> document</font> <br> <br><font size=2 face="sans-serif">The ASN.1 description of the extension is given below</font> <br> <table border width=100%> <tr valign=top> <td width=100% bgcolor=#f7f7f7><font size=2 color=#4f4f4f face="Courier New">AdmissionSyntax ::= SEQUENCE {</font> <br><font size=2 color=#4f4f4f face="Courier New"> admissionAuthority GeneralName OPTIONAL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> contentsOfAdmissions SEQUENCE OF Admissions }</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">Admissions ::= SEQUENCE {</font> <br><font size=2 color=#4f4f4f face="Courier New"> admissionAuthority [0] EXPLICIT GeneralName OPTIONAL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> professionInfos SEQUENCE OF ProfessionInfo }</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">NamingAuthority ::= SEQUENCE {</font> <br><font size=2 color=#4f4f4f face="Courier New"> namingAuthorityId OBJECT IDENTIFIER OPTIONAL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> namingAuthorityUrlQUENCE OF OBJECT IDENTIFIER OPTIONAL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> registrationNumber PrintableString (SIZE(1..128)) OPTIONAL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> addProfessionInfo OCTET STRING OPTIONAL }</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">ProfessionInfo ::= SEQUENCE {</font> <br><font size=2 color=#4f4f4f face="Courier New"> namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),</font> <br><font size=2 color=#4f4f4f face="Courier New"> professionOIDS SEQUENCE OF OBJECT IDENTIFIER,</font> <br><font size=2 color=#4f4f4f face="Courier New"> registrationNumber PrintableString (SIZE(1..128)) OPTIONAL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> addProfessionInfo OCTET STRING OPTIONAL }</font></table> <br> <br><font size=2 color=#4f4f4f face="sans-serif">If we build a certificate with this extension and try to display the contents using the method described in the previous post, we will not be able to see the particulars of this extension nor will we be able to query any of the fields from this extension. This is because OpenSSL doesn't yet know to parse the contents of the extension. To help OpenSSL in parsing the data we have to define the structure of the extension. Which is done as follows.</font> <br> <br><font size=2 face="sans-serif">First, the needed data structures are defined:</font> <br> <table border width=100%> <tr valign=top> <td width=100% bgcolor=#f7f7f7><font size=2 color=#4f4f4f face="Courier New">typedef struct NamingAuthority_st {</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_OBJECT* namingAuthorityId;</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_IA5STRING* namingAuthorityUrl;</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_STRING* namingAuthorityText;</font> <br><font size=2 color=#4f4f4f face="Courier New">} NAMING_AUTHORITY;</font> <br><font size=2 color=#4f4f4f face="Courier New">DECLARE_ASN1_ITEM(NAMING_AUTHORITY)</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">typedef struct ProfessionInfo_st {</font> <br><font size=2 color=#4f4f4f face="Courier New"> NAMING_AUTHORITY* namingAuthority;</font> <br><font size=2 color=#4f4f4f face="Courier New"> STACK_OF(DIRECTORYSTRING)* professionItems;</font> <br><font size=2 color=#4f4f4f face="Courier New"> STACK_OF(ASN1_OBJECT)* professionOIDs;</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_PRINTABLESTRING* registrationNumber;</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_OCTET_STRING* addProfessionInfo;</font> <br><font size=2 color=#4f4f4f face="Courier New">} PROFESSION_INFO;</font> <br><font size=2 color=#4f4f4f face="Courier New">DECLARE_ASN1_ITEM(PROFESSION_INFO)</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">typedef struct Admissions_st {</font> <br><font size=2 color=#4f4f4f face="Courier New"> GENERAL_NAME* admissionAuthority;</font> <br><font size=2 color=#4f4f4f face="Courier New"> NAMING_AUTHORITY* namingAuthority;</font> <br><font size=2 color=#4f4f4f face="Courier New"> STACK_OF(PROFESSION_INFO)* professionInfos;</font> <br><font size=2 color=#4f4f4f face="Courier New">} ADMISSIONS;</font> <br><font size=2 color=#4f4f4f face="Courier New">DECLARE_ASN1_ITEM(ADMISSIONS)</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">typedef struct AdmissionSyntax_st {</font> <br><font size=2 color=#4f4f4f face="Courier New"> GENERAL_NAME* admissionAuthority;</font> <br><font size=2 color=#4f4f4f face="Courier New"> STACK_OF(ADMISSIONS)* contentsOfAdmissions;</font> <br><font size=2 color=#4f4f4f face="Courier New">} ADMISSION_SYNTAX;</font> <br><font size=2 color=#4f4f4f face="Courier New">DECLARE_ASN1_ITEM(ADMISSION_SYNTAX)</font></table> <br> <br><font size=2 face="sans-serif">and then the C translation of ASN.1 representation.</font> <br> <table border width=100%> <tr valign=top> <td width=100% bgcolor=#f7f7f7><font size=2 color=#4f4f4f face="Courier New">ASN1_SEQUENCE(NAMING_AUTHORITY) = {</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_OPT(NAMING_AUTHORITY, namingAuthorityId, ASN1_OBJECT),</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_OPT(NAMING_AUTHORITY, namingAuthorityUrl, ASN1_IA5STRING),</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_OPT(NAMING_AUTHORITY, namingAuthorityText, DIRECTORYSTRING),</font> <br><font size=2 color=#4f4f4f face="Courier New">} ASN1_SEQUENCE_END(NAMING_AUTHORITY)</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">ASN1_SEQUENCE(PROFESSION_INFO) = {</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_EXP_OPT(PROFESSION_INFO, namingAuthority, NAMING_AUTHORITY, 0),</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_SEQUENCE_OF(PROFESSION_INFO, professionItems, DIRECTORYSTRING),</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_SEQUENCE_OF(PROFESSION_INFO, professionOIDs, ASN1_OBJECT),</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_OPT(PROFESSION_INFO, registrationNumber, ASN1_PRINTABLESTRING),</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_OPT(PROFESSION_INFO, addProfessionInfo, ASN1_OCTET_STRING),</font> <br><font size=2 color=#4f4f4f face="Courier New">} ASN1_SEQUENCE_END(PROFESSION_INFO)</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">ASN1_SEQUENCE(ADMISSIONS) = {</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_EXP_OPT(ADMISSIONS, admissionAuthority, GENERAL_NAME, 0),</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_EXP_OPT(ADMISSIONS, namingAuthority, NAMING_AUTHORITY, 1),</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_SEQUENCE_OF(ADMISSIONS, professionInfos, PROFESSION_INFO),</font> <br><font size=2 color=#4f4f4f face="Courier New">} ASN1_SEQUENCE_END(ADMISSIONS)</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">ASN1_SEQUENCE(ADMISSION_SYNTAX) = {</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_OPT(ADMISSION_SYNTAX, admissionAuthority, GENERAL_NAME),</font> <br><font size=2 color=#4f4f4f face="Courier New"> ASN1_SEQUENCE_OF(ADMISSION_SYNTAX, contentsOfAdmissions, ADMISSIONS),</font> <br><font size=2 color=#4f4f4f face="Courier New">} ASN1_SEQUENCE_END(ADMISSION_SYNTAX)</font></table> <br> <br><font size=2 color=#4f4f4f face="sans-serif">Once this is done we have to some how say about our new extension to openssl:</font> <br> <table border width=100%> <tr valign=top> <td width=100% bgcolor=#f7f7f7><font size=2 color=#4f4f4f face="Courier New">static X509V3_EXT_METHOD ext_admission = {</font> <br><font size=2 color=#4f4f4f face="Courier New"> .ext_nid = 0,</font> <br><font size=2 color=#4f4f4f face="Courier New"> .ext_flags = 0,</font> <br><font size=2 color=#4f4f4f face="Courier New"> .it = ASN1_ITEM_ref(ADMISSION_SYNTAX),</font> <br><font size=2 color=#4f4f4f face="Courier New"> .i2s = NULL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> .s2i = NULL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> .i2v = NULL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> .v2i = NULL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> .r2i = NULL,</font> <br><font size=2 color=#4f4f4f face="Courier New"> .i2r = i2r_AdmissionSyntax,</font> <br><font size=2 color=#4f4f4f face="Courier New">};</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">/*</font> <br><font size=2 color=#4f4f4f face="Courier New"> * Tell about our new extension to OpenSSL</font> <br><font size=2 color=#4f4f4f face="Courier New"> */</font> <br><font size=2 color=#4f4f4f face="Courier New">void x509_add_custom_extensions()</font> <br><font size=2 color=#4f4f4f face="Courier New">{</font> <br><font size=2 color=#4f4f4f face="Courier New"> ext_admission.ext_nid</font> <br><font size=2 color=#4f4f4f face="Courier New"> = OBJ_create("1.3.36.8.3.3", "Admission", "Admission");</font> <br><font size=2 color=#4f4f4f face="Courier New"> X509V3_EXT_add(&ext_admission);</font> <br><font size=2 color=#4f4f4f face="Courier New">}</font></table> <br> <br><font size=2 color=#4f4f4f face="sans-serif">Now if we have an extension we can convert it to the corresponding data structure and then play with fields / verify them.</font> <br> <table border width=100%> <tr valign=top> <td width=100% bgcolor=#f7f7f7><font size=2 color=#4f4f4f face="Courier New">ADMISSION_SYNTAX* x = (ADMISSION_SYNTAX*) X509V3_EXT_d2i(ext);</font> <br><font size=2 color=#4f4f4f face="Courier New">sk_num(x->contentsOfAdmissions)</font> <br><font size=2 color=#4f4f4f face="Courier New">sk_value(x->contentsOfAdmissions, iAdmission);</font></table> <br> <br><font size=2 color=#4f4f4f face="Courier New">i2r_AdmissionSyntax</font><font size=2 color=#4f4f4f face="sans-serif"> is a simple function (that you may write/or set to NULL) which converts the internal data structure to some human understandable form and is used when the function </font><font size=2 color=#4f4f4f face="Courier New">X509V3_EXT_print_fp</font><font size=2 color=#4f4f4f face="sans-serif"> is called.</font>Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com2tag:blogger.com,1999:blog-6640189.post-61424702990465619672009-01-06T15:19:00.000+05:302009-01-06T15:23:19.292+05:30Viewing extensions in X.509 certificates <br><font size=2 face="sans-serif">In the last post we saw how to create certificates with custom extensions - as a second step let us see how we can access these extensions and make sense of them. The code below opens a certificate, counts the number of extensions in it and iterates over every extension and prints a representation of the extension understandable to, us, humans.</font> <br> <table border width=100%> <tr valign=top> <td width=100% bgcolor=#f7f7f7><font size=2 color=#4f4f4f face="Courier New">X509V3_add_standard_extensions();</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">inf = fopen("mycrt.crt", "r");</font> <br><font size=2 color=#4f4f4f face="Courier New">cert = (X509*) PEM_read_X509(inf, NULL, NULL)</font> <br><font size=2 color=#4f4f4f face="Courier New">count = X509_get_ext_count(cert);</font> <br> <br><font size=2 color=#4f4f4f face="Courier New">for(i = 0; i < count; i++) {</font> <br><font size=2 color=#4f4f4f face="Courier New"> ext = X509_get_ext(cert, i);</font> <br> <br><font size=2 color=#4f4f4f face="Courier New"> printf("%s\n", OBJ_nid2ln(OBJ_obj2nid(ext->object)));</font> <br><font size=2 color=#4f4f4f face="Courier New"> if(!X509V3_EXT_print_fp(stdout, ext, 0, 0)) {</font> <br><font size=2 color=#4f4f4f face="Courier New"> ERR_print_errors_fp(stderr);</font> <br><font size=2 color=#4f4f4f face="Courier New"> }</font> <br><font size=2 color=#4f4f4f face="Courier New"> printf("\n");</font> <br><font size=2 color=#4f4f4f face="Courier New"> X509_EXTENSION_free(ext);</font> <br><font size=2 color=#4f4f4f face="Courier New">}</font></table> <br> <br><font size=2 face="sans-serif">It doesn't print the human representation of all the extensions found but only for the built in extensions, because the library doesn't yet know to represent the custom extensions that we have placed in the certificate.</font> <br> <br><font size=2 face="sans-serif">More about parsing custom extensions and making sense of the values in it in a later post.</font>Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-50459719045033264612009-01-06T14:29:00.000+05:302009-01-06T14:33:19.207+05:30Creating X.509 certificates with custom extensions <br><font size=2 face="sans-serif">Every time when I need to do something with OpenSSL, it involves searching lot of places including the library code itself to achieve my target - This time the requirement is to generate a X509 v3 certificate which contains non-standard/custom extensions. Luckily I found convincing documents early enough.</font> <br> <br><font size=2 face="sans-serif">Here the task is to generate a CA certificate with standard extensions and then to create another certificate containing custom extensions and sign it with the newly created CA. The code below achieves both of the tasks.</font> <br> <br><font size=2 face="sans-serif">1. To generate the ca certificate, run the script as ./genkey.sh myca ==> which generates myca.key and myca.crt</font> <br><font size=2 face="sans-serif">2. To generate the authentication certificate, run the script as ./genkey.sh myca mycrt ==> which generates mycrt.key and mycrt.crt and signs it with myca.key</font> <br> <br><font size=2 face="sans-serif">The script is mostly self explanatory and contains an inline openssl config file - The main points to note are:</font> <br><font size=2 face="sans-serif">1. Extension are to be placed separately in a named section </font> <br><font size=2 face="sans-serif">2. Custom extension are of the form oid=DER:<DER-Encode-Hex-Values></font> <br><font size=2 face="sans-serif">3. openssl command x509 should be given the extension file name and section name</font> <br> <br> <table border width=100%> <tr valign=top> <td width=100% bgcolor=#f7f7f7><font size=2 face="Courier New">#! /bin/sh</font> <br><font size=2 face="Courier New"># Filename: genkey.sh</font> <br> <br><font size=2 face="Courier New">if [ $# -lt 1 ]; then</font> <br><font size=2 face="Courier New"> echo "Usage: $0 ca-name [new-cert]"</font> <br><font size=2 face="Courier New"> exit -1</font> <br><font size=2 face="Courier New">fi</font> <br> <br> <br><font size=2 face="Courier New">ca="$1"</font> <br><font size=2 face="Courier New">new=${ca}</font> <br> <br><font size=2 face="Courier New">if [ $# -ge 2 ]; then</font> <br><font size=2 face="Courier New"> new="$2"</font> <br><font size=2 face="Courier New">fi</font> <br> <br><font size=2 face="Courier New">if [ -f ${new}.key ]; then</font> <br><font size=2 face="Courier New"> echo "${new} already exists: Delete ${new}.key & ${new}.crt to proceed"</font> <br><font size=2 face="Courier New"> exit -1</font> <br><font size=2 face="Courier New">fi</font> <br> <br> <br><font size=2 face="Courier New">#----[ inline config file ]--------------------------------------------</font> <br> <br><font size=2 face="Courier New">ca_extensions="ca_extensions"</font> <br><font size=2 face="Courier New">cert_extensions="cert_extensions"</font> <br> <br><font size=2 face="Courier New">config=.${new}.config</font> <br><font size=2 face="Courier New">cat > ${config} << EOF</font> <br><font size=2 face="Courier New">[ req ]</font> <br><font size=2 face="Courier New">default_bits = 2048</font> <br><font size=2 face="Courier New">default_keyfile = ${new}.key</font> <br><font size=2 face="Courier New">distinguished_name = req_distinguished_name</font> <br><font size=2 face="Courier New">attributes = req_attributes</font> <br><font size=2 face="Courier New">prompt = no</font> <br> <br><font size=2 face="Courier New">[ req_distinguished_name ]</font> <br><font size=2 face="Courier New">CN = ${new}</font> <br><font size=2 face="Courier New">OU = ouTest</font> <br><font size=2 face="Courier New">O = oTest</font> <br><font size=2 face="Courier New">C = IN</font> <br> <br><font size=2 face="Courier New">[ req_attributes ]</font> <br> <br><font size=2 face="Courier New">[ ${ca_extensions} ]</font> <br><font size=2 face="Courier New">basicConstraints=critical,CA:true</font> <br><font size=2 face="Courier New">subjectKeyIdentifier=hash</font> <br><font size=2 face="Courier New">keyUsage=keyCertSign,cRLSign</font> <br><font size=2 face="Courier New">authorityInfoAccess=OCSP;URI:</font><a href=http://ocsp.test.com:8080/><font size=2 face="Courier New">http://ocsp.test.com:8080/</font></a> <br> <br><font size=2 face="Courier New">[ ${cert_extensions} ]</font> <br><font size=2 face="Courier New">subjectKeyIdentifier=hash</font> <br><font size=2 face="Courier New">keyUsage=critical,digitalSignature,keyEncipherment</font> <br><font size=2 face="Courier New">certificatePolicies=1.2.276.0.76.4.64</font> <br><font size=2 face="Courier New">crlDistributionPoints=URI:ldap://ocsp.test.com:389/cn=test Komponenten Testreferenz CA01</font> <br><font size=2 face="Courier New">authorityInfoAccess=OCSP;URI:</font><a href=http://ocsp.test.com:8080/CMOCSP/OCSP><font size=2 face="Courier New">http://ocsp.test.com:8080/CMOCSP/OCSP</font></a> <br><font size=2 face="Courier New">authorityKeyIdentifier=keyid</font> <br><font size=2 face="Courier New">1.3.36.8.3.3=DER:\</font> <br><font size=2 face="Courier New">304DA421301F310B30090603550406130244453110300E060355\</font> <br><font size=2 face="Courier New">040A130767656D6174696B302830263024302230150C13416E77\</font> <br><font size=2 face="Courier New">656E64756E67736B6F6E6E656B746F72300906072A8214004C0477</font> <br><font size=2 face="Courier New">extendedKeyUsage=clientAuth,serverAuth</font> <br> <br><font size=2 face="Courier New">EOF</font> <br> <br> <br><font size=2 face="Courier New">#----[ Generate key and sign ]------------------------------------------</font> <br> <br> <br><font size=2 face="Courier New"># 1. Generate Key & CSR</font> <br><font size=2 face="Courier New">openssl req -new -nodes -config ${config} > ${new}.csr</font> <br> <br> <br><font size=2 face="Courier New"># 2. Self sign (or) Sign with CA</font> <br><font size=2 face="Courier New">if [ ${new} == ${ca} ]; then</font> <br><font size=2 face="Courier New"> echo "Generating self signed CA: ${ca}.crt"</font> <br><font size=2 face="Courier New"> openssl x509 -extfile ${config} -extensions ${ca_extensions} \</font> <br><font size=2 face="Courier New"> -sha1 -req -signkey ${ca}.key < ${new}.csr > ${new}.crt</font> <br><font size=2 face="Courier New">else</font> <br><font size=2 face="Courier New"> echo "Signing ${new}.crt with ${ca}.crt"</font> <br><font size=2 face="Courier New"> openssl x509 -extfile ${config} -extensions ${cert_extensions} \</font> <br><font size=2 face="Courier New"> -sha1 -req -CAkey ${ca}.key -CA ${ca}.crt < ${new}.csr > ${new}.crt</font> <br><font size=2 face="Courier New">fi</font> <br> <br><font size=2 face="Courier New">rm ${new}.csr</font> <br><font size=2 face="Courier New">rm ${config}</font> <br></table> <br>Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-3932539346553481402009-01-03T11:12:00.001+05:302009-01-03T11:12:14.138+05:30Resolutions for the year and after1. To overcome my laziness.<br>2. To be more focussed and ignore distraction.<br><br>Top two things needed to shape myself in to a better person.<br>Hopefully I will be able to overpower laziness and distraction.<br> Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-51277341166382345782008-12-30T13:43:00.000+05:302008-12-30T13:47:35.766+05:30Bypassing Websense <br><font size=2 face="sans-serif">Websense is a kind of proxy server that filters request to the internet and will block certain kinds of request - The most common way of blocking is to check the requested url against a black list.</font> <br><font size=2 face="sans-serif">The most common HTTP request is GET and looks like:</font> <br> <br><font size=2 face="Courier New">GET /path-to-file HTTP/1.0</font> <br><font size=2 face="sans-serif">Simply replacing this with something like the one below seems to confuse Websense, making it to believe that the url is <b>not </b>in the black list.</font> <br> <br><font size=2 face="Courier New">GET /path-to-file <2048-space> HTTP/1.0</font> <br><font size=2 face="sans-serif">While some web servers are also confused by such a request some others behave normally.</font> <br> <br><font size=2 face="sans-serif">To change the request from the first format to the second one needs some one in between and the easiest is a proxy server and if it's in python it only gets more easier.</font> <br><font size=2 face="sans-serif"><i>TIP: If using windows, the extension of the proxy file can be set as .pyw to run it invisibly.</i></font> <br> <br><font size=2 face="sans-serif">The browser has to be configured to use a proxy but since some sites doesn't work with this proxy due to the request mangling, it is worth writing a </font><a href="http://en.wikipedia.org/wiki/Proxy_auto-config"><font size=2 color=blue face="sans-serif">proxy.pac</font></a><font size=2 face="sans-serif"> file that uses the proxy only for certain sites.</font> <br><a href="https://addons.mozilla.org/en-US/firefox/addon/1557"><font size=2 color=blue face="sans-serif">QuickProxy </font></a><font size=2 face="sans-serif">is a nice add-on for Firefox that makes it easy to switch proxy configuration.</font>Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-74837424194557105942008-12-20T10:27:00.000+05:302008-12-20T10:31:12.044+05:30Yet another revival <br><font size=2 face="sans-serif">Time and again I try to keep my blog alive but after a few posts the interest fades away mainly due to the effort involved in posting. I have tried different tools but none could stand my laziness - but this time posting via email seems to be easy enough to carry forward my lazy ass.</font>Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com1tag:blogger.com,1999:blog-6640189.post-49634533432284177012008-09-03T11:02:00.003+05:302008-09-03T11:17:40.073+05:30Here it is - Google ChromeIt's here to flame up the fire and I am exploring it right after waking up.<br /><br />The first thing that can be noticed is the location of tabs, the tabs are located above the url box - It's like different independent browser windows joined together rather than a single window containing different web pages.<br /><br />The URL is colour coded - The server name appears dark and the rest of the path appears in grey. https is highlighted in green. A tiny thing but it's much easier to identify the server name.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SBPyA5RgxaQ/SL4ieW_XWMI/AAAAAAAABJs/vmxLQm7eo0E/s1600-h/2.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_SBPyA5RgxaQ/SL4ieW_XWMI/AAAAAAAABJs/vmxLQm7eo0E/s320/2.JPG" alt="" id="BLOGGER_PHOTO_ID_5241664921268607170" border="0" /></a><br />By default there are two processes while opening Chrome. The process count increases on creating the first new tab but subsequent new tabs doesn't increase the process count - The count increases only on loading a page.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SBPyA5RgxaQ/SL4i1tBU2II/AAAAAAAABJ0/GV1XJIx3kkM/s1600-h/1.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_SBPyA5RgxaQ/SL4i1tBU2II/AAAAAAAABJ0/GV1XJIx3kkM/s320/1.JPG" alt="" id="BLOGGER_PHOTO_ID_5241665322319403138" border="0" /></a><br />Killing a process displays a message in the tab corresponding to that process and doesn't kill the entire browser - Good.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SBPyA5RgxaQ/SL4i1r5KaJI/AAAAAAAABJ8/KZq-GOmbbm8/s1600-h/crash.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_SBPyA5RgxaQ/SL4i1r5KaJI/AAAAAAAABJ8/KZq-GOmbbm8/s320/crash.JPG" alt="" id="BLOGGER_PHOTO_ID_5241665322016729234" border="0" /></a><br />Very spacious - Tabs are merged with the title bar, no status bar, no menu bar.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_SBPyA5RgxaQ/SL4jUKaxA3I/AAAAAAAABKE/HblL94AH9Ks/s1600-h/space.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_SBPyA5RgxaQ/SL4jUKaxA3I/AAAAAAAABKE/HblL94AH9Ks/s320/space.JPG" alt="" id="BLOGGER_PHOTO_ID_5241665845606810482" border="0" /></a><br />Acid test results:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SBPyA5RgxaQ/SL4jgVOnE5I/AAAAAAAABKM/oRqFlU5kfJw/s1600-h/acid_test.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_SBPyA5RgxaQ/SL4jgVOnE5I/AAAAAAAABKM/oRqFlU5kfJw/s320/acid_test.JPG" alt="" id="BLOGGER_PHOTO_ID_5241666054667047826" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SBPyA5RgxaQ/SL4jgsNAq5I/AAAAAAAABKU/dgu6n8vqJ_s/s1600-h/acid3_test.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_SBPyA5RgxaQ/SL4jgsNAq5I/AAAAAAAABKU/dgu6n8vqJ_s/s320/acid3_test.JPG" alt="" id="BLOGGER_PHOTO_ID_5241666060834352018" border="0" /></a><br />Only a boot strap is available for download which in turn downloads and installs the actual browser - This possibly may be for region specific customization but I had prefer the real installer.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_SBPyA5RgxaQ/SL4klpc4DEI/AAAAAAAABKc/pB1EdxwXOIo/s1600-h/search.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_SBPyA5RgxaQ/SL4klpc4DEI/AAAAAAAABKc/pB1EdxwXOIo/s320/search.JPG" alt="" id="BLOGGER_PHOTO_ID_5241667245506563138" border="0" /></a><br />Missing:<br />- Profiles<br />- Addons<br />- Couldn't find offline mode<br /><br />@Me, should find more time to exploreVijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-78100395903903309052008-09-02T10:00:00.001+05:302008-09-02T10:01:55.359+05:30Yet another new from Google's stable, Google Chrome, an opensource browserThe war starts again, now with an extra battalion by the name of Google Chrome. With Firefox eating in to the shares of IE, Opera and Flock gaining popularity and with Safari's presence felt, the war is only going to heat up. Microsoft is already pushing IE8 as a safe and standards compliant browser. Firefox3 has set a new bench mark as a secure browser. Success for the new generation browsers will firstly depend on the security they provide against malware and phising sites, then secondly on the customization capabilities. <a href="http://blogoscoped.com/archive/2008-09-01-n47.html">Promises</a> look good but wait till <a href="http://www.google.com/chrome">tomorrow</a>.Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-76028467187857977842008-09-01T13:52:00.000+05:302008-09-01T13:54:33.748+05:30Unified versioning for windows drivers<div xmlns='http://www.w3.org/1999/xhtml'>Every new release of a windows driver involved updating the version number in a lot of places, mainly:<br/>- The resource file<br/>- The inf file<br/>- The source file (Mainly for debug purposes)<br/>This was a lot hectic until one day I sat down to unify the version updation to one file, which can be used in all places.<br/><br/>The result is the following file, which we shall call 'version.h'<br/><br/><font face='Courier New'><br/><table bgcolor='lightgrey'><tbody><tr><td><br/>#ifndef _VERSION_H_<br/>#define _VERSION_H_<br/><br/>#if 0<br/>STAMPINF_VERSION=1,0,0,1<br/>STAMPINF_VERSION_STR="01.00.00.01"<br/>STAMPINF_DATE="12/21/2007"<br/>#else<br/>#define VER_PRODUCTVERSION 1,0,0,1<br/>#define VER_PRODUCTVERSION_STR "01.00.00.01"<br/>#endif<br/><br/>#endif<br/></td></tr></tbody></table><br/></font><font face='sans-serif'>It can be included in the source and resource file and the defines </font><font face='sans-serif'>VER_PRODUCTVERSION and VER_PRODUCTVERSION_STR can be used.<br/><br/>It can also be safely included in makefile.inc and the defines STAMPINF_VERSION, STAMPINF_VERSION_STR and STAMPINF_DATE can be used to update the inf files using the stampinf utility that comes with WDK.<br/><br/>Now, every new release requires updating only a single file and has become a lot easier.<br/></font></div>Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-64635713945261298582008-08-26T13:53:00.001+05:302008-08-26T13:57:24.113+05:30German health card - overly complexThe German health card system seems to be overly complex for a health sector.Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-81418093892764985852008-05-05T09:15:00.001+05:302008-05-05T09:17:15.907+05:30Test post from ScribeFire<div xmlns='http://www.w3.org/1999/xhtml'>A <b>sample </b>post from <a href='http://www.scribefire.com/' target='_blank'><b><font color='#333333'>Scribe</font><font color='#ff6600'>Fire</font></b></a>.</div>Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com0tag:blogger.com,1999:blog-6640189.post-27249116242981429142007-12-29T21:22:00.000+05:302007-12-30T21:25:03.492+05:30Today's karate syllabusKATA-VASA++Vijairajhttp://www.blogger.com/profile/07107736124306715930noreply@blogger.com2