Wednesday, April 29, 2009

How to search for Kanji characters?

A friend of mine asked me about what a tea was based only on pictures of the Japanese writing on the tea bag. How can I do that? I knew it was Kanji, or the Chinese style of writing, but I had no idea what to do. Looked for online Kanji character recognition, Kanji character list, etc. Nothing really worked. Until I accidentally (half through painstaking translation) bumped into nciku! Why, of course, you idiot! If they are Chinese style characters, wouldn't you be able to find an online dictionary for Chinese, not Japanese characters?

Well, nciku has a nice feature called "Handwrite Characters" which pretty much allowed me to translate the rest of the text. But the trick is to take the recognized character, then go to... Wikipedia! Because you don't really need the Chinese translation, but the Japanese one. You get the translation and the use and other useful things.

So, use nciku for online Japanese Kanji/Chinese character recognition. Yatta! :)

Monday, April 27, 2009

Friday, April 24, 2009

Changes to the blog

I have hidden the private chat [that's the blue one] by default. In order to access it, you need to click on the "Show private chat" link in the top-left. I did that because I would like people to help each other rather than talk only with me, so I recommend using the Jabbify chat [the slightly annoying orange pop-up one]. Also, when entering your name, use a real looking name or nickname. I will not even answer anymore to people called "asfdd", "sfd", "hi" and "can you help me". People with correct names that start conversations with "adsdfs" will also be ignored.

I have also added a small piece of code to remove unwanted spam comments. If you feel that your comment was not spam and it was flagged as spam, let me know in the chat (or another comment :) ) and I will fix the issue.

I urge you again to tell me if there is anything that is bothering you about the blog in order to facilitate positive change.

Have fun, keep trying and good luck!

Update: I have fixed an issue with the layout and IE making the text disappear, especially when scrolling. Also I added a little something on the left that you can copy paste to your blog. So, if you want to help me spread the knowledge put it into your blogs. I am not making any money out if this, so make Siderite famous!! :)

Monster - dark and interesting anime, too long, though

DVD cover I wrote a while ago about Pluto being a very nice manga and about the author also doing work on something called Monster. The story in Monster, as in Pluto, has finished after 162 manga chapters or 74 anime episodes. I didn't read the manga, instead I have watched the anime, but it took forever, because after a while, frankly, it got boring.

The idea is very interesting and one close to my heart: there is a sociopath capable of controlling other people by understanding their fears and manipulating them with words. He also has no problems with killing people. The main character is a brilliant Japanese doctor living in Germany who has the misfortune of saving the "Monster" in a brain surgery. The rest of the show is the doctor trying to find the guy and kill him while concomitantly running from the police who blame him for some murders. In a way is like The Fugitive meets Silence of the Lambs :)

I would say that the way people are portrayed and the deep darkness of the series make is a brilliant one, an even better effort than the later Pluto, but it fails somewhere in the middle. Characters are very emotional and act in a very predictable way and after a few tens of episodes in which the doctor is following the killer and not being able to kill him (because he is the GOOD guy!!) one starts fantasizing about going to Tenma, the doctor, slapping his face, taking the gun, killing Johann the monster and then giving the gun back and silently leaving the manga. In a sense, this is what happens in the end :) but I am not going to spoil it for you.

My advice is to at least watch the first 10 to 20 episodes and decide if you will read/watch further.

Thursday, April 23, 2009

Composing javascript external files and the Microsoft ajax framework.

I have seen a small video presentation about the new ASP.Net 3.5 SP1 Script Combining feature. Basically you take a bunch of scripts (like the ones from AjaxControlToolkit) and you bundle them together in a single cacheable file. This decreases the number of concurrent connections on your production site.

The problem was that you had to use some component to see what script files were being loaded and then manually add them to the ScriptManager CompositeScript Scripts collection. And this applies only to correctly registered scripts, not stuff that is embedded in the HTML or what not. Isn't it easier to just parse the generated HTML and then replace the script tags, I thought?

Well, I did a small Response filter/IHttpHandler in about two hours. It would take all consecutive external file references and combine them in a single cached and cacheable call. Then I tested it with Asynchronous postbacks. Epic Fail! The main problem was that the combined scripts would re-register themselves at postback and throw all kinds of errors therefore. But how did they know if they were registered or not before?!

I vaguely remembered an old post of mine about the notifyScriptLoaded function that must be called at the end of every external javascript registrations. Examining the system a little I realised that the flow was like this:
  1. register the script (either include it in the HTML in regular render or sending it to the UpdatePanel javascript engine to be registered as a new dynamically script element in the Head page section)
  2. if the registration is an async dynamic one, check in an array if the script is loaded and if it is, don't register it
  3. in the script call Sys.Application.notifyScriptLoaded() which would take the src of the script element and use it as a key in the above mentioned array to declare it has been loaded


Of course, that means combining all the scripts in a single file registers only that file and you get the original files registered again. Then you get errors like 'Type [something] has already been registered.' or (because there are more than one script file bundled together) 'The script [something] contains multiple calls to Sys.Application.notifyScriptLoaded(). Only one is allowed.'.

Well, I did manage to solve the problem by following these steps:
  1. forcefully remove Sys.Application.notifyScriptLoaded() from bundled scripts
  2. add Sys.Application.notifyScriptLoaded() at the end of all scripts
  3. surround the various scripts with a code that looks like
    sb.AppendFormat(@"if (!window.Sys||!Sys._ScriptLoader||!Sys._ScriptLoader.isScriptLoaded('{0}')) {{
    {1}
    if (window.Array&&Array.add&&window.Sys&&Sys._ScriptLoader) Array.add(Sys._ScriptLoader._getLoadedScripts(), '{2}');
    }}
    ", HttpUtility.HtmlEncode(src), content.Replace("Sys.Application.notifyScriptLoaded();", ";"),src);
.

With problem solved, the AutoScriptCombiner works, but it feels wrong. I wanted to post it on CodePlex, you see, but in the end I've decided not to. However I did learn something about how the Asp.Net Ajax framework functions internally and I wanted to share it with you.

Tuesday, April 21, 2009

Native JSON in IE8 and FF3

Another great blog post from Rick Strahl made me investigate a little the new JSON support in the latest browsers. Internet Explorer 8 already has it and FireFox has it in its beta version and soon to be released 3.5 version.

Rick's article says more than I could. A short summary:
  • use the native JSON object
  • much faster and safer than any js library
  • still has problems with types of data which have no native notation or type, like datetime
.

Update: the native JSON object is not something that Microsoft and Mozilla got together and decided is a good idea (which for me seems the natural way of deciding the direction of code versus compatibility, not overbloated committees and standards) but because the release of the latest ECMA Javascript specs which contains, among other things, the JSON thing and the getter/setter syntax.

Gödel, Escher, Bach - one of the best books I've ever read

Book cover
Gödel, Escher, Bach by Douglas Hofstadter has won a Pulitzer Prize and I believe it is the only thing that ever made me want to read other Pulitzer Prize books. I have to thank Meaflux for pointing me to this book and if he ever writes anything in his blog, you can find it here. Anyway, here is my humble review:

I have just finished reading the book and, in its self-referential spirit, I am also starting reading it. A strange loop of sorts, when starting to read a book follows finishing it. It is not an easy read, but it is certainly worth it. I was instantly both in awe and full of envy on this Hofstadter guy that I have never even heard about before.

What is the book about? I believe the most basic answer is it is about the roots of consciousness, and before you run away thinking this is some sort of new age pseudo (or fully) religious crap, let me assure you it is not. The title itself shows the perspective one gains by reading it: look at the same thing from the viewpoints of a mathematician (meta-mathematician, at that), an abstract painter and a great music composer. It's a definition of abstract thought by intersecting the works of three great abstract thinkers. But it is more than that.

The most intriguing part of the book it is how self referential it is. There are portions in the book that are modeled after Bach fugues while paraphrasing Escher drawings in order to illustrate a mathematical idea of Gödel. It talks about artificial intelligence, consciousness, the workings of the brain, formal systems, computer programming, music, art, science, mathematics, quantum mechanics, biology, genetics and does so in a way that links all these things together in a reasonably easy to understand way. It does not feel like a book made out of separate chapters, but one master-single-piece linked to itself in the most imaginative and twisted ways.

I urge you to buy the book, if you find it. I have read a text OCR version of it and I know I missed a lot. If you can't afford it, there it a torrent on the net with the PDF scanned version as well as the music, paintings and other media the book talks about.

The bottom line is that it is an amazing book. For someone like me, a software programmer dreaming of AI, it was a shame I didn't read it before. I almost believe that you will see me in buses like those old ladies reading the Bible, only with GEB in hand. I can't imagine anyone over 15 years of age that shouldn't read this book. I doubt anyone under 15 can truly comprehend it and, as Frank Herbert's Dune, it must be read every 10 years or less, just to see how much more you can understand from it.

Update: I found on the Internet a full length movie based on Hofstadter's ideas. Interesting, in a geeky/goofy kind of way. Here it is: Victim of the Brain.

Monday, April 20, 2009

LaCie external harddrive clicks and ticks, but does not work

A while ago I bought this LaCie 500Gb external hard drive and I was rather satisfied with it. With the occasion of the horrible Easter holidays I finally turned off my computer (after weeks of it working continuously). So imagine my dismay when I came back home, turned the LaCie on, then the computer and all I had to show for it was an USB mass storage controller error in the Hardware Manager.

After trying a few things (and noticing that the hard drive would not actually turn on, instead a tick-tock sound was heard from inside) I decided to open up the drive box, proudly written on it "Designed by F. A. Porsche". Well, fuck you, Porsche! I had to almost destroy the box to open it, then the insides had so many "one installation, no after service" components that I felt like walking on broken glass.

Anyway, inside the LaCie there is a small USB controller and an SATA Seagate Barracuda 7200.10 hard drive. I installed the hard drive as an internal drive and... nothing! Windows XP blue screen 0x0000007B. The computer wouldn't even recognize the drive in the boot up screen.

Well, after looking for drivers and stuff like that, I was resolved that the hard drive was defective and all my music, movies and books were lost. But shutting the computer down I noticed that the drive was actually spinning in its internal setup configuration. So, desperately, I tried to use the power from the internal computer power source and the rest of the drive in its USB setup... and IT WORKED!

Now I am going to buy another drive and get all data from this one, but still, if you are desperate that your USB hard drive is lost, try to open it up and power the internal drive with a normal computer power chord.

As for why the internal drive did not work directly on the computer? I have almost no idea. The Seagate site says clearly that SATA drives do not require drivers, but the various SATA controllers do! Since I already have a SATA internal drive, I think that that is not the issue. Rather, the people at LaCie used another drive firmware! The Seagate drive also provides with some downloadable firmware so it is clearly possible. As a completely desperate option to recover your lost data, I guess trying to rewrite the hard drive firmware could work, but I don't recommend it and I wonder how it is possible, considering it wouldn't allow me to boot Windows.

I hope this helps somebody. And Happy Easter everybody!

Update September 2012: after three years and a half, the drive (powered by both USB and internal computer power) started to develop bad sectors. It still works, mind you, I just removed it because I didn't need it as much. Thus ends the saga of the mutant harddrive in the computer that never sleeps and never dies [creepy music in the background] :)

Wednesday, April 15, 2009

XSD (XML Schema) Hierarchical Unique Contraint

While working on RegexConverter I've started learning things about XML. I disliked it before, but now... I loathe it completely. It feels like the XML people are from another planet and I have to twist my brain at straight angles just to understand what they meant.

One of the problems I met was "how to declare in an XML schema a unique constraint/index on the entire document when there are nested elements of the same type". In other words, something like this:
<regex>
<group index="1">
<group index="2">
</group>
<group index="3">
</group>
</group>


Bottom line:
  1. Use the declared namespace
  2. Declare the index in the root element
  3. Use the name of the nested element (in my case group) in the selector
  4. Use the one or more levels deep selector (.//)
  5. Use the declared namespace AGAIN.
.

Concrete example:
<xs:element name="regex" type="regexType">
<xs:unique name="uniqueIndex">
<xs:selector xpath="mstns:group|.//mstns:group"></xs:selector>
<xs:field xpath="@index"></xs:field>
</xs:unique>
</xs:element>


I tried to solve this for two hours only to find the solution was this idiotic. Neither one of "group","mstns:group","mstns:group|.//group" work. The only one is "mstns:group|.//mstns:group".

Grrrr...

Thursday, April 09, 2009

RegexConverter on CodePlex!

Update: two more days of work and a huge text file of regular expressions and I know a lot more about the syntax of .Net Regex than even MSDN :)
The third (Apr11) release of the library has a huge load of bug fixes and new features and it is now... [Tadaaaaa]... a stable version. At least I think of it that way :) Go download it.!

I've been working for two days on an idea. What can I do to make those long regular expressions that I always leave in my code more readable and easy to understand without having to compile automatons in your head?

I have first researched on Google regular expression converters. Nothing was even close to what I wanted. Also, on the more scientific side, people were talking a lot about BNFs, as a superset of regular expression syntax. I looked at BNF. Yes, it describes anything in a human readable form, it is used in RFCs but I hate it even more than XML! So XML it is. Most of the inspiration for the code came from this link: Regular expressions and regular grammars

I give you, RegexConverter. It is a library+demo that transforms a Regex into an XML and then back again. The demo application demonstrates (duh!) this by having two panes, one in which to write regex and the other in which to write XML. Changing one, also changes the other. It warns you of errors in both Regex, RegexConverter and then checks if what it got can be safely converted into your changed string!

Please tell me what you think. I believe it can be a real help in understanding regular expressions, some specific ones or regular expression syntax in general, whether one is a pro or a complete noob.

I've worked hard to design the library source in a way that is understandable, I also added comments everywhere. I tried to implement all the specifications of .NET regular expressions from the MSDN site so if you have a regex that is valid but can't be turned into XML or the conversion is not perfect, let me know.

The link is: RegexConverter on CodePlex.

I will update this post with more science and links to my places of inspiration for this, so stay tuned.

RegexConverter Update: Ok, so I haven't updated this post much. Shame on me. I was reminded of this project when I got an email from the FamousWhy site which said RegexConverter "has been granted the Famous Software Award". I know it's probably an automatically generated message and went to many or all of the Codeplex people, but still: automated attention is still attention :) Then the email suggested I add a link to their site on mine. Ok, here it is:

Friday, April 03, 2009

Type names for nested classes

Just a small mention of a thing I've learned today: what is the FullName of a Type of a class that is nested into another?

Usually, you would use it inside Visual Studio as ParentClass.ChildClass, but if you ever want to use the full name of the ChildClass Type (as when declaring it in web.config) you have to separate them with the + (plus) sign.

So let's assume you have this MyHandler class in the MyNamespace namespace which has a nested class Configuration in it. In the code you do a
var conf = new MyNamespace.MyHandler.Configuration();
while when using the handler type name to declare it in web.config you do it like this:
type="MyNamespace.MyHandler+Configuration"
.

customErrors=Off not working!

First off, I have to say something about forums: stop copying content from one another, jerks!. I have been trying to find a solution for this problem and I found a zillion forum pages with the same "problems" and the same "solutions" again and again and again!

Much better! Now, I have been trying for an hour to understand why setting customErrors="Off" in the web.config of my ASP.Net application would not work. I tried just about anything, including the bloody forums. customErrors Off did not work!.

In the end I found one little comment for a StackOverflow question: set the retail setting in the machine.config file to "false"!! So, go to %WINDOWS%\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config and set retail to false!. Setting it to true means it will NEVER show you any useful debugging message.

Thursday, April 02, 2009

Wednesday, April 01, 2009

Internet Explorer 8 installation fails and then browser crashes. Solved by updating Sun's Java?!

Today Internet Explorer 8 appeared to me in the Automatic Updates list. I have been using IE8 for months now and so I was glad that the official release finally came out. So I downloaded and installed IE8.

The installation process has several steps. First is the removal of any previous version of IE, then a reboot, then several small steps of the setup program: Downloading IE8, Downloading IE8 updates, Installing IE8, Installing updates, Finishing installation. Well, for me, at the Installing updates step it threw an error that said the installation cannot complete because the station is shutting down, then my computer restarted.

I did have Internet Explorer available, though, so I tried a few pages. After the pages loaded, I was invariably getting an error and IE closed. "Internet Explorer has encountered a problem and needs to close. We are sorry for the inconvenience.". Well, so was I!

I was trying the installation of IE the third time now and suddenly a Java update traybar icon appeared. I updated Java, then I was amazed to see that IE was no longer crashing! So, my solution for Microsoft IE errors: update Sun Java! :)

Well, the Java update probably completed some steps that the installer failed to. But still :)

And interesting link I found regarding any IE error that causes the browser to excuse itself and leave is on Sandi's Site