Snapshot of your working directory

We need two open source programs: Gzip is a compression utility with a high compression rate and free from patented algorithms. GnuPG is a complete and free encryption solution to protect confidential communication and digitally stored information. Create a /backup directory in each of your working directories.

backup.cmd

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
18:
@echo off

rem where the zip file resides
set p=d:\programme\system\

rem where GnuPG resides
set g=c:\Programme\GnuPG\

rem compress files
set z=%date:~6,4%%date:~3,2%%date:~0,2%.zip
%p%zip %cd%\backup\%z% %cd%\*.*

rem sign backup
%g%gpg -b -armor %cd%\backup\%z%

pause
exit


Write the above code in a file, put it somewhere in your path and assign an icon (I am running this from the buttonbar of TotalCommander (R)). One click – and your current directory is being saved as zip file and signed with your key.

Convert an Access(R) database into mySQL format

That should be a pretty straightforward task: Open in Access(R) the export function, select ODBC and send the tables to your local MySQL installation. This fails, however, on my system without any useful error message.

Access2MySQL(R) of DMSoft(R) does the job, costs 55$. The trial version stops after transfering 10 datasets; nevertheless the newly created database allows an hazzle-free phpMyAdmin import of .csv exported data.

mysqlrev.png

A database driven epidemiological questionnaire

During a past project I moved from a paper-based questionnaire directly to a database version. This has the advantage of generating at the same time an online version (with some interface scripts) and an offline version (by using a serial paper printing).

The whole package is written in standard HTML with some Cold Fusion(R) extension (where you need the Railo(R) or Blue Dragon(R) interpreter too).

Download (md5:1922125540), create a datasource “aerzte” and attached the included Access(R) database. Then run the following script in your browser.

frage.cfm

  1:
  2:
  3:
  4:
  5:
  6:
  7:
  8:
  9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 58:
 59:
 60:
 61:
 62:
 63:
 64:
 65:
 66:
 67:
 68:
 69:
 70:
 71:
 72:
 73:
 74:
 75:
 76:
 77:
 78:
 79:
 80:
 81:
 82:
 83:
 84:
 85:
 86:
 87:
 88:
 89:
 90:
 91:
 92:
 93:
 94:
 95:
 96:
 97:
 98:
 99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
195:
<CFINCLUDE TEMPLATE="top.cfm">

<CFSET #cookie_id#=3>

<CFSET #group#=1>
<CFIF #ParameterExists(URL.page)#>
    <CFIF #IsNumeric(URL.page)#>
        <CFSET #group#=#URL.page#>
    </CFIF>
<CFELSE>
    <CFABORT>
</CFIF>

<CFOUTPUT>
<div id="subnav">
<h3 class="selected">=#cookie_id#</h3>
<ul>
    <li <CFIF #group# is 1>class=selected</CFIF>>
<a href=frage.cfm?page=1>Block 1</a></li>
    <li <CFIF #group# is 2>class=selected</CFIF>>
<a href=frage.cfm?page=2>Block 2</a></li>
    <li <CFIF #group# is 3>class=selected</CFIF>>
<a href=frage.cfm?page=3>Block 3</a></li>
</ul>
</div>
</CFOUTPUT>

<!--- ------------------------------------------ --->

<div id="content" class="afternav">

<CFQUERY NAME="Get" DATASOURCE="aerzte">
SELECT qry.*
FROM qry
WHERE qry.group=#group# AND qry.active=1
ORDER BY qry.id ASC;
</CFQUERY>

<CFQUERY NAME="Already" DATASOURCE="aerzte">
SELECT qry_answer.*
FROM qry_answer
WHERE qry_answer.partcp_id=#cookie_id# AND qry_answer.active=1;
</CFQUERY>

<CFSET #error#="">
<CFSET #blacklist#= "#chr(59)#,#chr(34)#,#chr(39)#,%22,--">

<CFOUTPUT QUERY="Get">
    <CFIF #PARAMETEREXISTS(fieldnames)#>
        <CFIF #ReFindNoCase(qryvar,fieldnames)# is not 0>
            <CFSET #sc#=#Evaluate("FORM.#qryvar#")#>
            <CFLOOP index="i" list="#blacklist#">
                <CFIF #Find(i,sc)# is not 0>
                    <CFSET #msg# = "not allowed">
                    <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
                </CFIF>
            </CFLOOP>
            <CFIF #sc# is "" AND #qryvar# is not "terminator">
                <CFSET #msg# = "missing">
                <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
            </CFIF>
            <CFIF #Find("int",qrytype)# is not 0 AND NOT #Isnumeric(sc)#>
                <CFSET #msg# = "not numeric">
                <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
            </CFIF>
            <CFIF #Find("varchar",qrytype)# is not 0 AND NOT #IsSimpleValue(sc)#>
                <CFSET #msg# = "not character">
                <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
            </CFIF>
            <CFIF #Find("datetime",qrytype)# is not 0 AND NOT #IsDate(sc)#>
                <CFSET #msg# = "not a date">
                <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
            </CFIF>
            <CFIF #GetToken(valid,1,":")# is "range">
                <CFIF #sc# lt #GetToken(valid,2,":")# OR #sc# gt #GetToken(valid,3,":")#>
                    <CFSET #msg# = "out of range ">
                    <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
                </CFIF>
            </CFIF>
        <CFELSE>
            <CFSET #msg#="missing">
            <CFSET #error# = #error# & "|" & #qryvar# & ":" & #msg#>
        </CFIF>
    </CFIF>
</CFOUTPUT>

<!--- ------------------------------------------ --->

<CFIF #error# is not "" OR NOT #PARAMETEREXISTS(fieldnames)#>

    <CFOUTPUT>
    <FORM method=POST action="frage.cfm?page=#URL.page#">
    
    Block #group#<BR>
    </CFOUTPUT>
    
    <table width=400 border=0 bgcolor="lightyellow">
    
    <CFOUTPUT QUERY="Get">
    <tr><td colspan=3><hr size=1></td></tr>
    <tr>
    <td width=200>#text#</td>
    <td width=200 align=right <CFIF ListContains(error,qryvar,"|") gt 0>bgcolor=orange</CFIF>>
    
    <CFSET #ar#=""> 
    <CFIF #ListFind(ValueList(Already.qry_id),id)# gt 0>
        <CFSET #ar#=#ListGetAt(ValueList(Already.response),ListFind(ValueList(Already.qry_id),id))#>
    </CFIF>

    <CFIF #PARAMETEREXISTS(fieldnames)#>
        <CFIF #ReFindNoCase(qryvar,fieldnames)# is not 0>
            <CFSET #ar#=#Evaluate("FORM.#qryvar#")#>
        </CFIF>
    </CFIF>
    <CFIF #www# is "radio">
        <CFLOOP INDEX="i" LIST="#response#" DELIMITERS=":">
            <CFSET #s#="">
            <CFIF #i# is #ar#>
                <CFSET #s#="checked">
            </CFIF>
            <input type="radio" #s# name="#qryvar#" value="#i#">#i# 
        </CFLOOP>
    <CFELSEIF #www# is "select">
        <select name=#qryvar# size=3 multiple>
        <CFLOOP INDEX="i" LIST="#response#" DELIMITERS=":">
            <CFSET #s#="">
            <CFIF #i# is #ar#>
                <CFSET #s#="selected">
            </CFIF>
            <option #s# value="#i#">#i#</option>
        </CFLOOP>
        </select>
    <CFELSEIF #www# is "checkbox">
        <CFLOOP INDEX="i" LIST="#response#" DELIMITERS=":">
            <CFSET #s#="">
            <CFIF #i# is #ar#>
                <CFSET #s#="checked">
            </CFIF>
            <input type="checkbox" #s# name=#qryvar# value=#i#>#i# 
        </CFLOOP>
    <CFELSEIF #www# is "text">
        <INPUT type=text NAME=#qryvar# VALUE="#ar#" align=right>
    <CFELSEIF #www# is "textarea">
        <textarea name=#qryvar# rows=1 wrap="soft">#ar#</textarea>
    <CFELSEIF #www# is "password">
        <INPUT TYPE=password NAME=#qryvar# VALUE="">
    <CFELSEIF #www# is "hidden">
        <INPUT TYPE=hidden NAME=#qryvar# VALUE="hidden">
    </CFIF>
    <CFIF ListContains(error,qryvar,"|") gt 0>
        <BR>#GetToken(GetToken(error,ListContains(error,qryvar,"|"),"|"),2,":")#
    </CFIF>
    </td>
    
    </tr>
    
    </CFOUTPUT>
    
    <tr>
    <td colspan=2 align=right><input type=submit value="weiter &gt;&gt;&gt;"</td>
    </tr>
    
    </table>
    </FORM>

<CFELSE>

    <CFTRANSACTION>
    <CFIF #ListLen(ValueList(Already.qry_id))# gt 0>
        <CFQUERY NAME="Save" DATASOURCE="aerzte">
            UPDATE qry_answer
            SET qry_answer.active=0
            WHERE qry_answer.qry_id IN (#ReReplaceNoCase(ValueList(Get.id),",{1,20}",",","ALL")#) AND qry_answer.partcp_id=#cookie_id#;
        </CFQUERY>
    </CFIF>

    <CFOUTPUT QUERY="Get">
        <CFQUERY NAME="Save" DATASOURCE="aerzte">
            INSERT INTO qry_answer (qry_id,partcp_id,response,active,date_entry)
            VALUES (#id#,#cookie_id#,'#Evaluate("FORM.#qryvar#")#',1,'#ACTIME#');
        </CFQUERY>
    </CFOUTPUT>
    </CFTRANSACTION>

    <CFIF #PARAMETEREXISTS(fieldnames)#>
        <CFIF #ReFindNoCase("terminator",fieldnames)# is not 0>
            done
        <CFELSE>
            <CFLOCATION URL="frage.cfm?page=#int(group+1)#">
        </CFIF>
    </CFIF>
</CFIF>
    
<CFINCLUDE TEMPLATE="bottom.cfm">

Convert external maps to OziExplorer

Many map software vendors like German TOP 50 do not include export functions. Printing, however, is usually not a problem.

I therefore suggest to use the print function for exporting map data. Just print your desired map area into a PDF file (TOP 50 nicely allows to set anchor points for that).

A PDF printer driver will be already installed on many systems (if not, please go to sourceforge and download pdfcreator). Write down the upper left and lower right GPS coordinates of your rectangle as you will need them later in OziExplorer.

You will need to download also two graphics packages: netpbm and xpdf.

Move your PDF print export and all downloaded executables into one directory. After running the following script you will see a bmp file that can be imported and calibrated in OziExplorer. Happy navigating!

ozi.cmd

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
27:
@echo off & setlocal enableDelayedExpansion

rem our working directory
set p=c:\Programme\OziExplorer\
rem our pdf with the map
set d=print.pdf
set w=ping 127.0.0.1 -n 2 -w 1000

:1
rem we extract the figures from the PDF
pdfimages %p%%d% %p%%d%

:2
rem we rename the first and concatenate all further pictures
rem note: the ping is only used to slow down the batch ;-) 
rename %d%-000.ppm block
for %%a in (%p%*.ppm) do %w%>nul & pnmcat -tb %%a block >tmp & %w%>nul & copy tmp block>nul & echo %%a done

:3
rem finally we create a bmp file and clear the space
ppmtobmp %p%block >%p%%d%.bmp
del *.ppm>NUL

:ende
pause
exit

How many human diseases do we have?

… asked my daughter this morning. I can´t renember having heard any figure before – my rough estimate is about 10,000. It depends very much how you count each viral/bacterial disease and how you are dealing with the ageing process (the recent German invention of IGEL services in medical practice may have doubled disease numbers).
Nevertheless there are only 379 chapters in the renowned Harrisons textbook with the most frequent diseases are about 15. This was the result of a projection already 10 years ago in Nature Medicine. Yea, yea.

Is religion a natural phenomenon?

I do not want to discuss the rather polemic view of Daniel Dennetts “Breaking the spell” or promote other books of the new secularism. The Guardian digital edition writes on 29th Oct 2006

Secularism is suddenly hip, at least in the publishing world. A glut of popular science books making a trenchant case against religion have soared up the bestseller lists both here and in America. The phenomenon represents a backlash against a perceived rise in religious fundamentalism and recent crazes for ‘spirituality’ by way of books such as The Da Vinci Code. Secularists are now eager to show that the empiricism of science can debunk the claims of believers.

More interesting is the question if human morality is an inborn trait or not. Nicholas Wade has a nice essay in the NYT:

Marc D. Hauser, a Harvard biologist, has built on this idea to propose that people are born with a moral grammar wired into their neural circuits by evolution. In a new book, “Moral Minds” (HarperCollins 2006), he argues that the grammar generates instant moral judgments which, in part because of the quick decisions that must be made in life-or-death situations, are inaccessible to the conscious mind. People are generally unaware of this process because the mind is adept at coming up with plausible rationalizations for why it arrived at a decision generated subconsciously. Dr. Hauser presents his argument as a hypothesis to be proved, not as an established fact. But it is an idea that he roots in solid ground, including his own and others’ work with primates and in empirical results derived by moral philosophers.

I renember also an article by Roger Higfield in the Washington Times (24th March 2003) than unfortunately vanished from the internet:

Scientists are hunting for a “God gene” that underpins our ability to believe. The idea of genes linked with beliefs does not look far-fetched, given the influence of genetics on the developeing brain.

Higfield is refering to an empirical twin study:

To investigate the heritability of religiousness and possible age changes in this estimate, both current and retrospective religiousness were assessed by self-report in a sample of adult male twins (169 MZ pairs and 104 DZ pairs, mean age of 33 years). Retrospective reports of religiousness showed little correlation difference between MZ (r=.69) and DZ (r=.59) twins. Reports of current religiousness, however, did show larger MZ (r=.62) than DZ (r=.42) similarity. Biometric analysis of the two religiousness ratings revealed that genetic factors were significantly weaker (12% vs. 44%) and shared environmental factors were significantly stronger (56% vs. 18%) in adolescence compared to adulthood. Analysis of internal and external religiousness subscales of the total score revealed similar results. These findings support the hypothesis that the heritability of religiousness increases from adolescence to adulthood.

Time on Oct 17, 2004 referred to a book of Dean Hamer “The God Gene”

Chief of gene structure at the National Cancer Institute, Hamer not only claims that human spirituality is an adaptive trait, but he also says he has located one of the genes responsible, a gene that just happens to also code for production of the neurotransmitters that regulate our moods. Our most profound feelings of spirituality, according to a literal reading of Hamer’s work, may be due to little more than an occasional shot of intoxicating brain chemicals governed by our DNA. “I’m a believer that every thought we think and every feeling we feel is the result of activity in the brain,” Hamer says.

This looks very much like a completely physical view of spiritual affairs (Hamer became famous for his failure of the “gay gene” before abandoning science).

So we may better turn to the question if there is any theological background? I renember a famous guest lecture in Marburg 1980 about the Epistle to the Romans by Herbert Braun (Braun is a Bultmann scholar. Ernst Fuchs was in Marburg too; together with Ernst Käsemann and Günther Bornkamm they are all famous scholars of Rudolf Bultmann. Käsemann and Fuchs both wrote a “Commentary on Romans”).

Fuchs highlighted Rom 2:14 in King James translation saying:

13 For not the hearers of the law are just before God, but the doers of the law shall be justified.
14 For when the Gentiles, which have not the law, do by nature the things contained in the law, these, having not the law, are a law unto themselves:
15 Which shew the work of the law written in their hearts, their conscience also bearing witness, and their thoughts the mean while accusing or else excusing one another;

Science and theology are not far away here. Maybe it is even common sense that most humans have an inherited deep feeling of religiousness.

Some privacy…

Every click leaves many traces in the internet. To enjoy at least some privacy, I recommend to install the CookieCuller, that will destroy all cookies (except some protected cokkies) when closing your browser. A slightly higher level of privacy may be obtained by using TORPARK, that is now even available in a standalone USB stick version form www.torrify.com. Even by using TORPARK you are still identified by your network card – SMAC is the ultimate solution, yea, yea.

cookie.png

Addendum

Science writes:

As you browse the Internet, many Web sites such as Google’s record a string of tex–the cookie–representing the identity of your computer. And when you use Google, its servers keep track not only of what you search for but also where you go next. People add new entries to this record at the rate of 200 million Web searches per day. This electronic record is key to Google’s business model: Most of its $1 billion annual revenue comes from Internet advertising targeted to individuals.

Another tip – disable also Flash super cookies in the online applet.
flashcookie.png

Genetic code and God’s language -cont’d-

There is a new book by Francis Collins “The language of God“, one of the leading persons in human genome sequencing. As the commentary says:
Genetic code and God’s language -cont’d- weiterlesen

Reporters sans frontières call for action

“Reporters sans frontières” ask to click their site between Nov 7, 11:00 Uhr until Nov 8, 11:00 Uhr.

2005 was the deadliest year for journalists since 1995: 63 journalists and 5 media assistants were killed doing their job or for having expressed their opinion; more than 1, 300 physical assaults were recorded and more than 1, 000 media were censored, an increase of 60% compared to 2004.

You may want to look also at the nice brochure at their website:

couverture-en.jpg

The Rosetta stone and the genetic code

p5080008.JPG

The Rosetta stone (I took the picture above earlier this year in the British museum) has become the key to decipher Hieroglyphic as it contained the same text also in Demotic Egyptian and Greek. Discovered by a French in 1799, brought to England in 1802 it become eventually translated in 1822 by Jean-François Champollion.
The Rosetta stone and the genetic code weiterlesen

Hidden feature at PUBMED

No, it is not really a hidden feature – but keep your mouse on “links” at the right part of the citation, wait for the drop-down, select “Link-out” and there is a good chance to jump directly to the publisher site, yea, yea.

Addendum

The nodalpoint blog” writes about MEDIE, a new PUBMED parser:

…is an “intelligent” semantic search engine that retrieves biomedical correlations from over 14 million articles in MEDLINE. You can find abstracts and sentences in MEDLINE by specifying the semantics of correlations; for example, What activates tumour suppressor protein p53? So just how useful is MEDIE and is it at the cutting edge?

Who goes first?

A recent example of self-experimentation is the famous trial where Dr. Barry Marshall swallowed a tube full with Helicobacter pylori which led him to develop gastritis. Lawrence K. Altman, M.D. has written the story of self-experimentation in medicine covering the many facets of these heroic experiments. Published already in 1987, I discovered this book only now. Highly recommended, yea, yea.

For some, the system is working well

Just received an email – the fall 2006 desk-to-desk message from Dr. Zerhouni, “Making it Work for our Emerging Scientists”
http://www.nih.gov/about/director/newsletter/Fall2006.htm. It says “For some, the system is working well. The best and brightest are reaching their full potential in solid, research careers. We have the evidence in the number of competitive grant applications being submitted. For others, the queue is backing up… Between 1980 and 2004 the average age of Ph.D. scientists earning their first R01 award went from 37 to 42 years… The problem appears to be largely the result of the ever-increasing age at which a researcher receives his or her appointment as an assistant professor.”
I would like to add that the average life expectancy also increased between 1980 and 2004, so the relative age remains the same. Yea, yea.

Addendum

Science magazine has different data on salaries of postdocs: academic salaries rose from $74,000 to $78,000 and industry salaries of $106,000 to $116,000 between 2005 and 2006.

Addendum

German salaries in biotech lab, research and marketing increased at the same time by 3.7% to €99,000 (for leading positions) and 3.3% to €74.000 (for specialists) according Laborwelt 1/2006 page 45.

Is “vitamin” D a biological hub?

Folllowing up numerous emails to my recent review about allergy and vitamin D exposure, I wonder if there could be a quantitative relationship if we look at the vitamin D system as a major biological hub. This is not so much about connecting different playgrounds but of integrating signals (as shown in the hourglass blog). The East-West German difference, the farming studies as well as numerous other studies would even allow a quantitative effect. Yea, yea.

Addendum

Biospektrum will publish in their next issue a summary of the vitamin D story.

Addendum

4-07-2007 The list of vitamin D dependent genes that are associated with allergy (IL12B, IL12RB, SPP/OPN, CD14, CD23, VDR, TNF, GC, IFN, IL1RN, IL8, ADRB2, CARD15, IL4R, ALOX5, FLG, SOCS3) is expanding: TSLP and CD86