our micro wasp

The first insect that I took under my photomicroscopy setup is this little guy that I found on our patio. First I thought that it’s a kind of fly. But after seeing it’s eyes and mouth I realized that it’s not a fly and updated my guess as a small bee or a flying ant. It turned out to be that it’s a kind of a small wasp. According to the wikipedia the definition of wasp is:

The term wasp is typically defined as any insect of the order Hymenoptera and suborder Apocrita that is neither a bee nor ant“.

So it was a very close guess but a wasp never occurred to me. I think this guy is a member of the Lysiphlebus testaceipes family, not sure though. Please note that this little fellow is a cruel parasitic creature who lays its eggs inside the living bugs with a following chestburster hatch. Does it sounds familiar? Well of course in the nature there is no cruelty, it’s just the nature as is, this little guy tries to live just like all of us do.

Before continuing with the pictures probably I should warn you that those are “very” close-up pictures which some people may find disturbing or scary. So if you have a kind of Insectophobia (Entomophobia) you may consider before proceeding the rest of the post. Images are not gross, just close-up head pictures which I find pretty interesting.

Continue reading »

 

This year my birthday present was a microscope; Celestron 44104. Işıl knows that I’m interested in macro- and micro-photography (the correct terms are photomacrography and photomicrography but oh well) so it was a perfect gift indeed.

It’s a basic compound microscope but more than enough for a starter, it has exchangeable objectives, oculars (eye pieces), pretty robust frame, focus and axis knobs, sub-millimeter scale for x, y, and z axes even an Abbe condenser.

Visualizing and seeing the world in a way which lie outside of my eyes’ capability range always excited me; seeing the very slow/fast events, seeing the very small/large objects, seeing the things in non-visible light spectrum, seeing very dim objects etc. So here I’m with the device which will let me to see the very small. I’ve spent many days checking out the samples that came with the microscope; a set of 100 pre-prepared slides. Işıl taught me the basics and also explained me the different types of human cells etc. I’ve also read a lot about microscope technologies and how to use them. There are two very extensive online resources for microscopy, www.olympusmicro.com and www.microscopyu.com . They are from two big microscope manufacturers; Olympus and Nikon and are curiously similar to each other. I’ve learned the basics of many microscopy techniques, such as dark field, phase contrast, confocal, objective design goals, optical trade-offs, eyepiece designs etc etc. Very fun stuff to learn. Check those sites out if you are into optics.

Seeing the internals of cells and such is fun, but I know that a bigger fun would be checking out the 3D objects. Since microscopes have a very shallow depth of field (few micrometers), viewing thick objects with high magnifications usually gives you nothing but a blurry image with a very narrow sharp-focused band. Something like this (even shallower)

Although still very interesting, seeing the whole thing in sharp focus would give you better ideas about the tiny thing’s form. Fortunately enough there is a computational method called focus stacking which combines many shallow depth of field images to generate a single deep focus image. So I had to find a way to attach my camera to my brand-new microscope so that I can try focus stacking.

You can take a photograph by pointing your camera through the eyepiece opening but there are many problems with this approach. First you can’t keep the camera stationary and the image is very sensitive to camera position, thus each image shows different sections of the specimen. Second, if your camera has a lens which is not very small in diameter, the image doesn’t fill the frame; image will be visible in the frame as a small cropped circle, rest of the frame will be black. The reason is that the normal eyepieces are designed for your eyes which have very small lens diameter and can go very close to the eyepieces.

There are digital eye pieces that you can insert into the microscope tube instead of a normal eyepiece but they are not cost-effective in my opinion. Cheap ones are toy-like providing only 640×480 pixel resolution and still around $100. Probably their optics are not the best either. There are of course good ones but they are starting from $400; too expensive for a new hobbyist. I already have a decent camera (Canon G10), I want to use that with my microscope if possible.

There are some other (potentially cheaper) methods for photomicrography

1- Use a camera with small objective diameter with a normal eye-piece.

2- Use a camera with normal objective diameter but use a tele-lens so that the small cropped circle fill the whole frame.

3- use a special photo eyepiece which will project the image directly on you camera’s CCD; you don’t need to use a lens. Well this works with cameras which have removable lenses (e.x. SLRs). Mine is not removable.

All of the above solutions require two adapters:

A- mechanical adaptation so that you can “attach” your camera to the microscope tube.

B- optical adaptation so that the image is formed on your camera’s sensor

I’ve bought few cheap mechanical adapters for canon G10, the lens attachment kit with 58mm thread, an 58mm to 42mm (T-Mount) step down ring and a T-mount eyepiece holder. Although when combined they let me to achieve the mechanical adaptation, it failed on the optical one. The camera lens can’t come close enough to the eyepiece. I guess the eyepiece holder is for photo eyepieces, not for normal ones. Gah! Anyhow most of those mechanical adapters are useful for other tasks too, I’ll use them somewhere.

So my remaining options are: I could buy a tele-converter (option 2) for my G10 and try that but it’s a not a guarantee that it’d work, it’s jut a 1.4x tele. I could also buy a photo eyepiece (option 3) but they are expensive and still no guarantee there either. While searching the web for solutions I come up with many old setups where people used Nikon Coolpix 995 camera with their microscope using various mechanical adapters. Since CP 995 has a very small objective diameter (28mm), it’s a good solution indeed (Option 1). Guess what? I still have my old CP 995 which I kept using until 2 years ago. I knew I would re-use that.

The camera is 10 years old, its sensor is about to die, half of the pixels are dead/stuck and even in its best days it had very bad light gathering capabilities compared to today’s cameras. But well it will let me to try the basic ideas, such as focus stacking. If it becomes a more serious hobby, I can definitely seek and buy better stuff as this setup will teach me what I need.

I purchased a very cheap ($5) 28mm filter set and super-glued one of them to one of my eye pieces. The eyepiece is still usable for looking through with naked eye. So this concludes the very cheap and dirty v1.0 of my photomicroscopy setup:

Next: I’ll post some cute and creepy creatures. Stay tuned…

 

On May 22, 2010 Martin Gardner, an American mathematics and science writer, died at the age of 95. I didn’t know his name until I heard his death from several science blogs and tweets, looks like I’ve missed a lot.

When I learnt that he run a very successful corner in Scientific American for many years and readers requested his return for many years after his quit, I realized that I may have heard about this guy. What I remembered is Douglas Hofstadter‘s book “Metamagical Themas“. He explains the name of the book in the introduction section; it is actually the name of the corner he wrote for a magazine from which the book’s articles are compiled. The magazine asked him to prepare a corner to replace the current one, and he found the task very very hard as the current corner was a very successful one. So he somehow wanted to keep the name; as an anagram of the old corner’s name. Old corner was named “Mathematical Games”. This is all that I remember, since I read that book more than 10 years ago I don’t remember other details.

And yes, that hard-to-be-replaced, beloved author of the Mathematical Games corner turned out to be Martin Gardner. I’ll definitely buy and read some of his 70 books.

Here is a great quote from him that I heard today in Skeptic’s Guide to the Universe podcast.

“Biographical history, as taught in our public schools, is still largely a history of boneheads: ridiculous kings and queens, paranoid political leaders, compulsive voyagers, ignorant generals – the flotsam and jetsam of historical currents. The men who radically altered history, the great scientists and mathematicians, are seldom mentioned, if at all.” Martin Gardner

 

In the process of moving to USA all my data is scattered around. It has been almost 2 years now but still I need to re-organize most of the data which are saved in various random places for redundancy. Having a couple of HDD failures didn’t help either.

All of the pictures are organized now; I had to write few Python scripts which check the EXIF data to find duplicates though. Well, it’s another story, now I’ll talk about the SVN installation.

Few weeks ago I started to gather my personal codebase part of which was in CVS repository. I wanted to port it to Subversion. For that I installed the SVN server and setup a repository on our Windows7 computer which we use as a home server.

Note to Self 1: This is the web page that helped me to learn the main steps of the process.

Note to Self 2: Also the cvs2svn script was a life saver, which preserved all of the history of the projects. Although they say that cvs2svn does not officially support CVSNT repositories, in my case the conversion went pretty smooth.

The next step is digging out more of my old sources and adding them to the repository.

 

Here is the Python script that I use to launch Visual Studio for working on Brazil code locally. It sets the proper search paths -including 3ds max SDK folders- for the compiler and linker for the chosen target platform and 3ds max version, then launches the correct visual studio.

import os
import msvcrt
import platform
import subprocess
from winsound import *

#===============================================================================
# Machine dependent Values
#===============================================================================
MaxBins={
	3:"c:\\graphic\\3d\\3dsmax3\\",
	4:"c:\\graphic\\3d\\3dsmax4\\",
	5:"c:\\graphic\\3d\\3dsmax5\\",
	6:"c:\\graphic\\3d\\3dsmax6\\",
	7:"c:\\graphic\\3d\\3dsmax7\\",
	8:"c:\\graphic\\3d\\3dsmax8\\",
	9:"c:\\graphic\\3d\\3dsmax9\\",
	10:"c:\\graphic\\3d\\3dsmax2008\\",
	}

MaxSDKs={
	3:"C:\\dev\\SDK\\Maxsdk3\\",
	4:"C:\\dev\\SDK\\Maxsdk4\\",
	5:"C:\\dev\\SDK\\Maxsdk5\\",
	6:"C:\\dev\\SDK\\Maxsdk6\\",
	7:"C:\\dev\\SDK\\Maxsdk7\\",
	8:"C:\\dev\\SDK\\Maxsdk8\\",
	9:"C:\\dev\\SDK\\Maxsdk9\\",
	10:"C:\\dev\\SDK\\Maxsdk10\\",
}

VCExes = {
	6:"C:\\dev\\vs6\\Common\\MSDev98\\Bin\\MSDEV.EXE",
	7:"C:\\dev\\vs7\\Common7\\IDE\\devenv.exe",
	8:"C:\\dev\\vs8\\Common7\\IDE\\devenv.exe",
	}

SetVarBatchesVC8x64={  #host OS dependent batches for target platform
	"x86"  :"C:\\dev\\vs8\\VC\\bin\\x86_amd64\\vcvarsx86_amd64.bat",
	"AMD64":"C:\\dev\\vs8\\VC\\bin\\amd64\\vcvarsamd64.bat",
	}

SetVarBatches = {
	"x86":{
		6:"C:\\dev\\vs6\\VC98\\Bin\\vcvars32.bat",
		7:"C:\\dev\\vs7\\vc7\\Bin\\vcvars32.bat",
		8:"C:\\dev\\vs8\\vc\\Bin\\vcvars32.bat"
		},
	"x64":{
		8:SetVarBatchesVC8x64[os.environ["PROCESSOR_ARCHITECTURE"]]
		}
	}

BrazilProjectPaths = {
	1: "D:\\_works\\dev\\SplutterFishCVS\\B1Max\\",
	2: "D:\\_works\\dev\\SplutterFishCVS\\Daedalus_01\\"
	}

BrazilTypeDefs = {
	"P": "BRAZIL_PRO_EDITION",
	"B": "BRAZIL_BASIC_EDITION",
	"R": "BRAZIL_RIO_EDITION",
	"E": "BRAZIL_EDU_EDITION",
	"N": ""
	}	

#===============================================================================
# Generic Values
#===============================================================================
MaxSDKIncSub = "\\include"
MaxSDKLibSubs= {"x86":"\\lib", "x64":"\\x64\\lib"}

#===============================================================================
# Functions
#===============================================================================

#_______________________________________________________________________________
def choose_max():
	while True:
		print "\nMAX version        [ 3 | 4 | 5 | 6 | 7 | 8 | 9 | 1(0) | Q ]    : ",
		choice = msvcrt.getche().capitalize()
		if choice=="Q": exit()
		if choice in ["3","4","5","6","7","8","9"]:	return choice
		if choice=="0": return "10"
		print " incorrect input!",
		MessageBeep(MB_ICONHAND) 

#_______________________________________________________________________________
def choose_platform():
	while True:
		print "\nPlatform Type      [ (3) x86 | (6) x64 | (Q)uit ]              : ",
		choice = msvcrt.getche().capitalize()
		if choice == "Q": exit()
		if choice == "3": return "x86"
		if choice == "6": return "x64"
		print " incorrect input!",
		MessageBeep(MB_ICONHAND) 

#_______________________________________________________________________________
def choose_brazil_ver():
	while True:
		print "\nBrazil r/s version [ 1 | 2 | N | Q ]                           : ",
		choice = msvcrt.getche().capitalize()
		if choice=="Q":	exit()
		if choice in ["1","2","N"]:	return choice
		print " incorrect input!",
		MessageBeep(MB_ICONHAND) 

#_______________________________________________________________________________
def choose_brazil_type():
	while True:
		print "\nBuild Type         [ (P)ro | (B)asic | (R)io | (E)du | (Q)uit ]: ",
		choice = msvcrt.getche().capitalize()
		if choice=="Q":	exit()
		if choice in ["P","B","R","E"]: return choice
		print " incorrect input!",
		MessageBeep(MB_ICONHAND) 

#_______________________________________________________________________________
def choose_compiler():
	while True:
		print "\nCompiler Type      [ (M)icrosoft | (I)ntel | (Q)uit ]          : ",
		choice = msvcrt.getche().capitalize()
		if choice=="Q":	exit()
		if choice in ["M","I"]:	return choice
		print " incorrect input!",
		MessageBeep(MB_ICONHAND) 	

#_______________________________________________________________________________
def choose_asm_generation():
	while True:
		print "\nGenerate ASM code  [ (Y)es | (N)o | (Q)uit ]                   : ",
		choice = msvcrt.getche().capitalize()
		if choice=="Q":	exit()
		if choice in ["Y","N"]:	return choice
		print " incorrect input!",
		MessageBeep(MB_ICONHAND) 

#_______________________________________________________________________________
def choose_pdb_generation():
	while True:
		print "\nGenerate PDB files [ (Y)es | (N)o | (Q)uit ]                   : ",
		choice = msvcrt.getche().capitalize()
		if choice=="Q":	exit()
		if choice in ["Y","N"]:	return choice
		print " incorrect input!",
		MessageBeep(MB_ICONHAND) 

#_______________________________________________________________________________
def do_menu():
	global max_ver, platform, brazil_ver, brazil_type, compiler_type, gen_asm, gen_pdb
	# ask max version
	max_ver = int(choose_max())

	# ask target platform
	if max_ver==9:	platform = choose_platform()
	else:			platform = "x86"

	# ask Brazil version
	brazil_ver = choose_brazil_ver()

	# ask Brazil type
	if brazil_ver != "N":
		brazil_ver  = int(brazil_ver)
		brazil_type = choose_brazil_type()
	else:
		brazil_ver	= 0
		brazil_type = None

	# ask Compiler
	compiler_type = choose_compiler()

	#ask ASM and PDB generation
	gen_asm = choose_asm_generation()
	gen_pdb = choose_pdb_generation()

#_______________________________________________________________________________
def run_msvc():
	# determine vc version
	if 	 max_ver in range(3, 6):vc_ver = 6
	elif max_ver in range(6, 9):vc_ver = 7
	elif max_ver in range(9,11):vc_ver = 8
	else:
		print "unsupported max version"
		exit();

	# determine the include and lib paths
	max_sdk_inc = MaxSDKs[max_ver] + MaxSDKIncSub
	max_sdk_lib = MaxSDKs[max_ver] + MaxSDKLibSubs[platform]

	# prepare the common command strings
	call_bat_cmd= "call " + SetVarBatches[platform][vc_ver]
	vc_exe_cmd 	= VCExes[vc_ver] + " /USEENV"

	# prepare the environment variables
	lib_env	= MaxSDKs[max_ver]+MaxSDKLibSubs[platform]
	inc_env	= MaxSDKs[max_ver]+MaxSDKIncSub
	cl_env  = ""
	link_env= ""

	# do the version specific adjustments to the commands
	if compiler_type=="I":
		cl_env +=" /DUSING_INTEL_COMPILER"
	if vc_ver==6:
		vc_exe_cmd +=" /Y3" # show build time (undocumented switch)
	if vc_ver==8:
		cl_env +=" /D_CRT_SECURE_NO_DEPRECATE" 	

	# set brazil type
	if brazil_type<> None:
		cl_env += " /D" + BrazilTypeDefs[brazil_type]

	# Turn on ASM List Generation
	if gen_asm=="Y":
		cl_env	+=" /FAs"

	# Turn on PDB Generation
	if gen_pdb=="Y":
		cl_env	+=" /Zi"
		link_env+=" /DEBUG" 

	# Display the variables
	print "\n\n"
	print "========================================================================="
	print "call_bat_cmd=" , call_bat_cmd
	print "vc_exe_cmd  =" , vc_exe_cmd
	print "lib_env     =" , lib_env
	print "inc_env     =" , inc_env
	print "cl_env      =" , cl_env
	print "link_env    =" , link_env
	print "=========================================================================\n"

	# set the environment variables of the sub process
	env_vars = os.environ
	env_vars.update({
		"LIB"		: lib_env,
		"INCLUDE"	: inc_env,
		"CL"		: cl_env,
		"LINK"		: link_env,
		})

	# have sub cmd interpreter execute the commands that needs to be in the same process tree
	print "running the compiler..."
	command_str = "cmd /s /c "
	command_str+= call_bat_cmd
	command_str+= " && " + "call ListDevEnvVars.bat"
	command_str+= " && " + vc_exe_cmd
	subprocess.call(command_str, env=env_vars )

#_______________________________________________________________________________
def incremental_backup():
	print "daily backup ..."
	subprocess.call("daily_backup.bat")

#===============================================================================
# MAIN
#===============================================================================

do_menu()
run_msvc()
incremental_backup()

#exit
print "press any key to exit...\n"
MessageBeep(MB_ICONASTERISK)
msvcrt.getch()
 

Approximately 1 month ago I downloaded a .gz file which supposed to be an iso file of an software installation DVD from the software company’s own site. I’ll not disclose the company name in case this is a weird security method (which should not since I’ve legit access to that file and they should inform how to open that file.) Anyhow to be on the safe side I’ll not tell which company and which product. That’s not important indeed.

After downloading 1.5GB of data with my 1024kbit ADSL line, I failed to open the file with WinRAR which is able to open gz files normally. I downloaded the gzip utility thinking that the file may be a in a new gz format that WinRAR is not aware of… Nope! that didn’t work either. The 3rd thing I tried was renaming the file from xxx.iso.gz to xxx.iso hoping that the file is uncompressed somehow on the way (I read that’s possible, client de-compressing the gz file during download). That approach failed to.

So there was only one thing to do, re-downloading the file as it’s obviously broken. I did a second download (many more hours). And guess what? The new file is broken too!!! GRRR! I did a binary comparison on the first and second files and they were identical (WinHex is a very powerful life-saver tool BTW). So the file is either broken on the server or it’s being spoiled -in a consistent way- by something on the way or on my end. Since I’ve already spent so much time, I changed the plan and downloaded a public-trial version of the software and that was enough for me.

That was 1 month ago. Then today…

Today one of my co-workers downloaded the new (next) version of that software from that legit location again. This time it’s a 2.3GB download and guess what? Yup: she could not open the gz file. I was curious and I started downloading it. Meanwhile I started poking the old file, that I failed to open last month. I kept that file in case I can open it someday. I’m glad that I did.

First I opened the file with WinHex. I did a spectral analysis on the file (counting bytes to see which characters are occurring in which frequency).
spectrum of gz file
Almost all the characters were occurring with the same frequency and that was a good indicator that the file contains compressed data (very basic check for high entropy). For a comparison here is the spectrum of uncompressed iso file (with obviously low entropy):
spectrum of iso file
Since the file looks like compressed file, then I decided to check if the file matches the gz file format. I googled the web and found this gz file format descriptor text.

The first few bytes of my gz file was like this:

3C 8B 08 08 2B 3C FC 46 00 03

I started cross-checking.

offset:0      2 bytes  magic header  0x1f, 0x8b (\037 \213)

my file has “3C 8B” instead of “1F 8B”. Weird. This didn’t match but since one byte is matching I went on…

offset:2      1 byte   compression method
0: store (copied)
1: compress
2: pack
3: lzh
4..7: reserved
8: deflate

My file has 08 which is logical (deflate)

 offset:3      1 byte   flags
bit 0 set: file probably ascii text
bit 1 set: continuation of multi-part gzip file, part number present
bit 2 set: extra field present
bit 3 set: original file name present
bit 4 set: file comment present
bit 5 set: file is encrypted, encryption header present
bit 6,7: reserved

I have 08 which means “original file name present” and yeah I see the iso file name after few bytes. Hmm.

offset:4      4 bytes  file modification time in Unix format

I have 2B 3C FC 46 which is 0x46FC3C2B which makes 1190935595 in decimal. And that converts to “Fri Sep 28 2007 02:26:35 GMT+0300 (GTB Daylight Time)” which makes sense.

offset:8      1 byte   extra flags (depend on compression method)

I have 00 which is meaningful too. And lastly

offset:9      1 byte   OS type

I got 03 there and that means Unix which makes complete sense too. And after this point I have null-terminated string having the iso file name.

So it seems that only the first byte of the file is wrong and besides that the rest of the file is indeed a gzip file. I modified that first byte with WinHex to 1F so that my file starts with bytes

1F 8B 08 08 2B 3C FC 46 00 03

instead of

3C 8B 08 08 2B 3C FC 46 00 03 

… and YAY! WinRAR can now open and uncompress that file happily. I did a brief search on the net to see if there is a variant of gzip file with 3C 8B header magic instead of 1F 8B but I failed to find such info. I still wonder how that happened both to me and my colleagues. But anyhow we have a solution now. Since my co-worker didn’t have a WinHex license, I sketched this Python code which changes the first byte of the given file to 0x1f

f=open('C:\\foo.gz', 'r+b')
f.seek(0)
f.write("\x1F")
f.close()

If anybody know anything about those weird gz files, I’d like to hear.

 

At Splutterfish we decided that Brazil r/s should support earlier 3ds max versions too. We support max 4 and above (Earlier max versions lack some of the core functionality that Brazil relies on). Unfortunately, because of the relatively poor design of the 3ds max API, max plugins need to be compiled with the same compiler that the max is compiled with. This is mainly due to the heap mismatches between the run time libraries (RTL) of the different versions of compilers. I’ll briefly explain why this compiler dependency occurs.

In some part of the 3ds max API design, the plugin needs to allocate memory and pass it to host application (3ds), which frees that memory itself afterwards. This unbalanced allocation/deallocation location becomes a problem if the host and the plugin are compiled with different compilers as the memory is allocated by one RTL and deallocated by another. This problem is usually/normally dealt with adding a DeleteThis() method to classes so that each object knows how to free itself, so every object is created by a factory in the plugin module and freed by itself which is also in the plugin module. For non-object memory blocks similar create and delete functions can be added. This makes sure that all allocation and de-allocation is done on the plugin module thus uses the same RTL. In fact 3ds max API generally makes use of this DeleteThis() approach. The problem is it’s not used everywhere! Don’t ask me why, I have no idea! Therefore the heap mismatches become a problem.

With 3ds max 6, they started to export the 3ds max RTL’s memory allocation and de-allocation methods in the max API libraries. This gives the plugins the opportunity to use max’s allocation and de-allocation routines with some tricky overrides. So if the plugin uses those routines instead of the ones in it’s own RTL, then all allocation and de-allocation will be done by the RTL of the host application thus the problem is solved. It’s not a clean solution though, it’s more like a hack in my opinion. Some data is still being allocated on one side (plugin) and being deleted on the other side (host application). This is a poor design and Autodesk’s solution of “forcing both sides to use the memory routines from the same RTL” is not correcting the design problem, but just patches it. Please note that plugin will use memory routines from the host application’s RTL but will continue to use other routines of it’s own RTL. So the plugin will use two RTL’s; RTL1 for memory operations, RTL2 for other operations. Personally I’d prefer them fixing the design problems in the API by removing the tightly coupled allocation/de-allocation. Probably they decided to avoid the changes which would force them rewrite and retest some part of the 3ds, but took this “clever” route. What I’ve learned through my professional software development experience is that “local smart” solutions will be pain in the ass in the long term. You should save your intelligence to come up with a good design instead. Autodesk developers are not very happy about this solution either (they should not indeed) and they too recommend using the same compiler as the max for the plugins. Which is wise in my opinion too and it’s what we’d do regardless their recommendation.

This brings us another (relatively minor) problem: We need to be able run different compilers (different versions of Visual Studio) on the same computer. This is, of course, possible but you need to be careful about it, especially about the path clashes. 32-bit and 64-bit target (and host) platforms makes the things a bit more complicated. In the next post I’ll talk about the system that I came up with to use VS 6, VS .NET 2002 (7.0) and VS .NET 2005 (8.0) on the same computer along with 8 different versions of max SDKs, starting from max3 up to max 10 (aka max 2008).

 

The Blind Watchmaker I’ve just finished reading this 1986 book (from Penguin Books) by Richard Dawkins. Although the book is more than 20 years old, some of the information in it was new to me (Well I need to say that I’m a regular science reader and documentary watcher just like any other geek). The book expresses the importance of the “natural selection” theory and suggests (with lots of solid examples as well as deep theoretical discussions) that it’s the only theory so far that explains the adaptive complexity of the living organisms on the Earth (and possible somewhere else). Although the “natural selection” theory has been the most plausible explanation for me, after reading this book, I’ve realized that I had been giving the chance factor (aka mutations) too much credit. Dawkins gives solid numbers and calculations which persuaded me that random events have less affect in evolution than I was thinking.

Dawkins is a natural teacher, he knows how to explain things and like all good teachers he knows the pitfalls the reader may fall into and pulls them up at the exact moment they are about to fall into those. He’s quite aware of the misunderstandings his sentences may cause and immediately clarify those in the next paragraph or so. So you can follow him quite easily without getting lost in your “but what if….” like train of thoughts. He is a good mental guide ;)

The book is, thus, quite easy to follow and quite educating… well, until the last few chapters where Dawkins switches from the education mode to the argument mode. To tell the truth, I get bored while reading those chapters since I get the feeling that Dawkins is not talking to us but argues with his colleagues who has opposing theories. Those chapters are educative too but the smooth information and idea flow that’s present in the previous chapters are unfortunately no longer there.

In sum; I’ve found this book quite educative and fun to read. He gives lots of analogies between biology and computers which made the discussion extra interesting for me.

After searching internet a bit, I found an applet which is quite similar to BioMorph program that Dawkings wrote and used to create examples in this book. While looking for the BioMorph software, I came across with another neat java applet: Ant Viewer. It’s an interactive applet with parametric ant colonies and resources where ants wander randomly and use pheromones (and sun location) to mark the path between resource (food) and the nest. Try it, it’s fun to play.

 

Mulksuzler

Today I finished reading Ursula Le Guin‘s famous book “The Dispossessed” (Turkish: “Mülksüzler”). This book was in my todo (toread) list for quite a while. I’m glad that I could finally read it and I’m sorry that I haven’t done it before. It’s more a political/social book rather than (Hard) Science Fiction as it’s always been in Le Guin’s books.What stroke me first is the interlaced timeline of the story. The book starts with the most important event which is the right middle of the story and events before and after that are followed in interlaced manner. This makes the story more interesting.

Different people may get very different messages (or so to say; may enjoy very different aspects). Besides the SciFi part, you can find analysis of politics, regimes and their impact on people. Also the author shows the barriers between individuals and between ideas, shows how difficult to see the world as other people see thanks to differences in principle ideas that are injected into our brains by the society and environment.

Anyhow this is one of the very best SciFci novels I’ve read, It forces the reader’s empathy and vision skills.

 

Well, I need to start blogging from somewhere and in my opinion it doesn’t need to be a typical “welcome yo!” message. So this is about what I’m working at the moment. Maybe later I can add a proper first(!) post.

Currently I’m debugging a minidump file for a remote crash and since the crash was not on my computer, I needed to tell visual studio where to find corresponding binaries in my computer (if you are not familiar with postmortem debugging, here you can find a very nicely prepared article). I know that it’s the MODPATH argument that points to local module path.

But it didn’t work… After digging around a bit, I found a little information here:

In previous versions of Visual Studio, the MODPATH argument was used to specify additional module search paths. Visual Studio 2005 looks for modules in the specified symbol search paths and does not use MODPATH.

Grrr! :)

© 2012 Notes to Shelf Suffusion theme by Sayontan Sinha