intrakosmologie http://dond.hudbanda.cz/index.html vesmír introvertního exhibicionisty cs-CZ Copyright 2010 Thu, 29 Jul 2010 08:43:59 +0200 Thu, 29 Jul 2010 08:43:59 +0200 http://thingamablog.sf.net http://blogs.law.harvard.edu/tech/rss Vlnka <p class="small"> (<em>Varov&#225;n&#237;:</em> Tento text <em>nen&#237;</em> o&#160;<a href="http://wave.google.com/">Google Wave</a>. Tento text naopak <em>je</em> dost technick&#253;.) </p> <p> Protože často p&#237;&#353;u př&#237;spěvky (sem, do diskuz&#237;, do Astropis&#237;ho redakčn&#237;ho syst&#233;mu) v&#160;HTML a&#160;často je p&#237;&#353;u buď jenom č&#225;stečně (tedy kousek, kter&#253; se pak někam vlož&#237;), nebo před zam&#253;&#353;len&#253;m zveřejněn&#237;m (<em>do foroty</em> &#8211; ostatně jako tomu bylo v&#160;př&#237;padě tohoto textu), p&#237;&#353;u je pochopitelně ve sv&#233;m obl&#237;ben&#233;m editoru. Jelikož tento disponuje vnitřn&#237;m skriptovac&#237;m rozhran&#237;m, připravil jsem si jednoduchou pomůcku, kter&#225; mi vlož&#237; nezlomiteln&#233; mezery tam, kde to je (vět&#353;inou) vhodn&#233;. Jde o&#160;velmi primitivn&#237; n&#225;hradu za program <a href="http://ftp.linux.cz/pub/tex/local/cstug/olsak/vlna/">vlna</a> od Petra Ol&#353;&#225;ka, ale pro moje potřeby naprosto stač&#237;. </p> <p> Funguje to tak, že z&#160;inicializačn&#237;ho <tt>.vimrc</tt> souboru načtu soubor <tt>HtmlVlna.vim</tt>, kter&#253; obsahuje definici funkce <code>Vlna_recode()</code>, jej&#237;ž vol&#225;n&#237; je namapovan&#233; na funkčn&#237; kl&#225;vesu <tt>F12</tt>. </p> <pre class="Vim:nocontrols:firstline[231]" name="code">au FileType html source ~/.vim/plugin/HtmlVlna.vim au FileType html map &lt;F12&gt; :call VLNA_recode()</pre> <p> Takže p&#237;&#353;u, když m&#225;m pocit, že jsem sepsal v&#353;echno, co jsem chtěl světu sdělit, zm&#225;čknu <tt>F12</tt> a&#160;funkce <code>VLNA_recode()</code> najde mezery za jednop&#237;smenn&#253;mi předložkami a&#160;spojkami a&#160;nahrad&#237; je nezlomitelnou mezerou. Mechanizmus hled&#225;n&#237; je velmi primitivn&#237; a&#160;cel&#225; funkce vypad&#225; takhle: </p> <pre class="Vim:nocontrols:firstline" name="code">function! VLNA_recode() &quot; skocime na zacatek souboru execute &quot;normal gg&quot; &quot; najdeme vsechno, co chceme nahradit while search('[^&lt;]\&lt;[AaIiKkOoSsUuVvZz]\&gt;\s\+',&quot;W&quot;)&gt;0 &quot; vypisem cislo radky, kterou menime echo &quot;Vlnkuju radek &quot;.line(&quot;.&quot;) &quot; samotna vymena znaku - hlidani pocatecniho '&lt;' zabrani vlozeni &amp;nbsp; do &lt;a&#160;href=... s/\([^&lt;]\)\&lt;\([AaIiKkOoSsUuVvZz]\)\&gt;\s\+/\1\2\&amp;nbsp;/g &quot; spocitame, kolik jsme nezlomitelnych mezer jsme nahradili let s:currLine=getline(&quot;.&quot;) let s:index=0 let s:nbspCount=0 while match(s:currLine,'&amp;nbsp;',s:index)&gt;-1 let s:found=match(s:currLine,'&amp;nbsp;',s:index) let s:index=s:found+5 &quot; posunem kurzor na konec let s:nbspCount=s:nbspCount+1 endwhile let s:tmp=trunc(s:nbspCount/10.0) let s:nbspCount=s:nbspCount-float2nr(10*s:tmp) &quot; vypiseme pocet nalezenych nezlom. mezer if s:nbspCount==1 echon &quot; [&quot;.s:nbspCount.&quot; nezlomitelna mezera]\n&quot; elseif s:nbspCount&gt;2&amp;&amp;s:nbspCount&lt;5 echon &quot; [&quot;.s:nbspCount.&quot; nezlomitelne mezery]\n&quot; else echon &quot; [&quot;.s:nbspCount.&quot; nezlomitelnych mezer]\n&quot; endif endwhile endfunction</pre> <p> V&#353;echnu pr&#225;ci tedy obstar&#225; jeden regul&#225;rn&#237; v&#253;raz (na ř. 11), zbytek je jen om&#225;čka okolo, kter&#225; vypisuje informace o&#160;vyměněn&#253;ch mezer&#225;ch. </p> <p> V&#160;tomhle př&#237;spěvku funkce na&#353;la a&#160;nahradila 17 mezer. :-) </p> <div class="hr"> </div> <p> Pochopitelně v&#237;m, že snažit se na webu o&#160;splněn&#237; typografick&#253;ch pravidel t&#237;mto způsobem je poněkud nesystematick&#233; (přinejlep&#353;&#237;m), ale o&#160;ničem lep&#353;&#237;m nev&#237;m. Přinejmen&#353;&#237;m mně vad&#237; jednop&#237;smenn&#233; č&#225;stice na konc&#237;ch ř&#225;dků, proto tuhle &#250;pravu děl&#225;m &#8211; v&#237;m, že podle typografick&#253;ch pravidel patř&#237; nezlomiteln&#225; mezera pouze za <em>neslabičn&#233;</em> předložky nebo předložky na zač&#225;tku věty; vět&#353;inou ji ale d&#225;v&#225;m v&#353;ude, protože samotn&#225; p&#237;smena na konc&#237;ch ř&#225;dků prostě vypadaj&#237; divně (a&#160;obvykle jsou tam poměrně bezdůvodně). </p> <script language="javascript" src="/shCore.js"></script> <script language="javascript" src="/shBrushVim.js"></script> <script language="javascript"> dp.SyntaxHighlighter.HighlightAll('code'); </script> http://dond.hudbanda.cz/archives/02-01-2010_02-28-2010.html#195 http://dond.hudbanda.cz/archives/02-01-2010_02-28-2010.html#195 ViM Tue, 23 Feb 2010 23:38:43 +0100 Javascript API 1.4 ve ViMu <p>Dost často pro různé demo ukázky programuju něco malého a&nbsp;rychlého v&nbsp;<a href="http://resources.esri.com/arcgisserver/apis/javascript/arcgis/index.cfm?fa=home">Javascript API</a> nad <a href="http://www.arcdata.cz/produkty-a-sluzby/software/esri/arcgis-servery/arcgis-server/">ArcGIS Serverem</a>. Je to hezké, použitelné, většinou to funguje ve všech prohlížečích. ESRI se pochlapila a&nbsp;k celému API je dostupná poměrně podrobná <a href="http://resources.esri.com/help/9.3/arcgisserver/apis/javascript/arcgis/help/jsapi_start.htm">dokumentace</a>.</p> <p>Abych si život co nejvíc ulehčil, vygeneroval jsem si pomocí několika udělátek <a href="/media/jsapi1.4.dict" title="Slovník&nbsp;názvů metod a&nbsp;vlastností objektů z&nbsp;JS API 1.4">seznam názvů všech metod a&nbsp;vlastností</a> jednotlivých JS tříd, které jsou v&nbsp;Javascript API 1.4 definovány. Třeba se to může někomu hodit, užívejte dle libosti.</p> <p>Použití ve ViMu je jednoduché: nejdřív&nbsp;se přidá seznam do proměnné <code>dictionary</code> výběr z&nbsp;položek je potom dostupný pod standardní klávesovou zkratkou <code>CTRL-X CTRL-K</code> (já mám výběr ve slovníku namapovaný na dvojkombinaci <code>CTRL &lt;SPACE&gt;</code>). Přidání do slovníku lze realizovat např. ve <tt>_vimrc</tt></p> <pre name="code" class="Vim:nocontrols:firstline[145]"> au FileType javascript set dict+=$HOME/vimfiles/dict/jsapi1.4.dict </pre> <p>nebo v&nbsp;<em>in-line</em> nastaveních pro jednotlivé soubory.</p> <script language="javascript" src="/shCore.js"></script> <script language="javascript" src="/shBrushVim.js"></script> <script language="javascript"> dp.SyntaxHighlighter.HighlightAll('code'); </script> http://dond.hudbanda.cz/archives/09-01-2009_09-30-2009.html#145 http://dond.hudbanda.cz/archives/09-01-2009_09-30-2009.html#145 ArcGIS Server ViM Thu, 03 Sep 2009 21:35:38 +0200 Šablona dokumentu pro ConTeXt <p> <em>Varování: tenhle článek je <strong>technický</strong> (a hodně). Povídání o&nbsp;blondýnkách bude zase příště.</em> </p> <p> V&nbsp;souvislosti s&nbsp;př&#237;pravou <a href="/archives/2009/02/entry_72.html" title="Kompletní Španělsko 2008">den&#237;čku o &#352;panělsku</a> jsem se zase začal trochu věnovat l&#225;m&#225;n&#237; v&nbsp;TeXu &ndash; konkr&#233;tně v&nbsp;ConTeXtu (o&nbsp;tom jindy). Při př&#237;pravě maker jsem hodně experimentoval, studoval a zkou&#353;el, což mj. znamen&#225;, že jsem vytv&#225;řel spoustu souborů. Pro ty &#250;čely jsem zrevidoval někter&#233; postupy, kter&#233; jsem dlouho použ&#237;val pro editaci TeXov&#253;ch zdroj&#225;ků. Kupř&#237;kladu, narozdíl od dob, kdy jsem v&#353;echno (tj. diplomku, čl&#225;nky a dokumentaci k&nbsp;tehdy několika zdroj&#225;kům) psal v&nbsp;PlainTeXu, už mě nebav&#237; při vytv&#225;řen&#237; každ&#233;ho nov&#233;ho dokumentu ťukat z&#225;hlav&#237;, v&nbsp;němž je typicky definice velikosti str&#225;nky, p&#237;sma, popis, co je to za soubor, atp. </p> <p> Zap&#225;tral jsem v&nbsp;paměti a vzpomněl si, že jsem si kdysi podle jak&#233;hosi n&#225;vodu na webu připravil &#353;ablonu pro vytv&#225;řen&#237; nov&#253;ch Java tř&#237;d. Pohrabal jsem se ve <tt>vimfiles</tt> a trochu opr&#225;&#353;il experimentov&#225;n&#237; s&nbsp;makry ViMu. V&#253;sledek je k viděn&#237; n&#237;že &ndash; nen&#237; to ž&#225;dn&#225; světobornost, ale funguje to a u&#353;etř&#237; to ručn&#237; psan&#237; p&#225;r ř&#225;dek. Původn&#237; <a href="http://www.root.cz/clanky/kostry-dokumentu-ve-vim/" title="Kostry dokumentů ve VIM">čl&#225;nek o&nbsp;syst&#233;mu &#353;ablon</a> (v&nbsp;čl&#225;nku se jim ř&#237;k&#225; kostry) v&#353;ak doporučuji pozornosti, v&nbsp;něm popsan&#253; syst&#233;m je flexibilněj&#353;&#237; a může se hodit, pokud chce m&#237;t člověk &#353;ablon v&#237;c. </p> <p> A&nbsp;jak to funguje? Do <tt>_vimrc</tt> přibyla ř&#225;dka </p> <pre name="code" class="Vim:nocontrols:firstline[175]"> au BufEnter *.context source ~/vimfiles/template_context.vim </pre> <p> kter&#225; ViMu ř&#237;k&#225;, že při otevřen&#237; souboru s&nbsp;př&#237;ponou <tt>.context</tt> m&#225; prov&#233;st, co najde v&nbsp;<tt>template_context.vim</tt>. Korektn&#237; by bylo tenhle soubor nač&#237;st při ud&#225;losti <em>BufNewFile</em>, ale z&nbsp;nějak&#233;ho důvodu to na Windows nefunguje (v&nbsp;linuxu ano). K&#243;d v&nbsp;&#353;abloně proto obsahuje pojistku, kter&#225; zjist&#237;, jestli nač&#237;tan&#253; soubor něco obsahuje &ndash; pokud ano, &#353;ablona se nevkl&#225;d&#225;. Do pr&#225;zdn&#233;ho souboru se načte obsah <tt>template.context</tt>, kter&#253; obsahuje samotnou &#353;ablonu. Funkce pro načten&#237; &#353;ablony pot&#233; zavol&#225; několik regul&#225;rn&#237;ch v&#253;razů, kter&#233; v&nbsp;načten&#233;m textu vyměn&#237; vzorov&#233; řetězce za aktu&#225;ln&#237; hodnoty (jm&#233;no souboru, datum, př&#237;p. dal&#353;&#237;) a skoč&#237; na určen&#253; ř&#225;dek. Obsah <tt>template_context.vim</tt> vypad&#225; takhle </p> <pre name="code" class="Vim:nocontrols"> "" " vkladani sablony pro ConTeXt, 11. 3. 2009 dond " fce pro nacteni obsahu sablony function! TEMPLATE_on_new_context_file() if(&amp;modifiable==0) return endif " kontrola, jestli editor otevira neprazdny soubor (do nej se sablona nenacita) if(line2byte(line("$")+1)>1) return endif " nacteme sablonu let template=expand("~/vimfiles/templates/template.context") exe "0r ".template " odstranime posledni prazdny radek, ktery vznikl :0r $d " nahradime retezce v sablone call TEMPLATE_replace() " skocime na zacatek textu 1 :18 endfunction " fce pro vlozeni aktualnich informaci function! TEMPLATE_replace() exe "%s/TEMPLATE_CREATION_DATE/".strftime("%d. %m. %Y")."/ge" exe "%s/TEMPLATE_FILE_NAME/".expand("%:t")."/ge" exe "%s/TEMPLATE_USERNAME/".$USERNAME."/ge" endfunction " nakonec zavolame pripravenou funkci call TEMPLATE_on_new_context_file() </pre> <p> a &#353;ablona <tt>template.context</tt> obsahuje </p> <pre name="code" class="Vim:nocontrols"> %%% % TEMPLATE_FILE_NAME % % TEMPLATE_USERNAME TEMPLATE_CREATION_DATE \setupoutput[pdftex] \enableregime[utf] \mainlanguage[cz] \usetypescript[modern][ec] \setupbodyfont[rm,12pt] %\setuppagenumbering[location=] \setuppapersize[A4][A4] \setuplayout[backspace=2cm,header=0pt,footer=0pt,width=middle,topspace=2cm,height=middle,location=middle] \starttext \stoptext % TEMPLATE_FILE_NAME % vim: set enc=utf-8 : </pre> <p> Nakonec to nebylo nic těžkého, líbí se mi (esteticky) způsob zjištění (ne)prázdnosti načítaného souboru v&nbsp;bufferu. Mám rád svůj oblíbený editor. :-) </p> <script language="javascript" src="/shCore.js"> </script> <script language="javascript" src="/shBrushVim.js"> </script> <script language="javascript"> dp.SyntaxHighlighter.HighlightAll('code'); </script> http://dond.hudbanda.cz/archives/03-01-2009_03-31-2009.html#79 http://dond.hudbanda.cz/archives/03-01-2009_03-31-2009.html#79 ViM Fri, 13 Mar 2009 14:10:35 +0100 Konfigurační soubor pro ViM ve windows doméně <p> Dlouho jsem si l&#225;mal hlavu, jak zař&#237;dit, aby na v&#353;ech poč&#237;tač&#237;ch v na&#353;&#237; dom&#233;ně, kde občas edituju nějak&#253; konfiguračn&#237; soubor nebo zdroj&#225;k, byl dostupn&#253; centr&#225;ln&#237; konfiguračn&#237; soubor pro <a href="http://www.vim.org/">ViM</a>, <tt>_vimrc</tt> (obdoba UNIXov&#233;ho <tt>.vimrc</tt> souboru). </p> <p> N&#225;&#353; dom&#233;nov&#253; server nastavuje při přihl&#225;&#353;en&#237; automaticky <q>domovsk&#253;</q> adres&#225;ř do s&#237;ťov&#233;ho disku <tt>\\server\home</tt>, což je na jednu stranu pohodln&#233;, na druhou stranu to přin&#225;&#353;&#237; někter&#233; probl&#233;my. Původn&#237; ře&#353;en&#237; probl&#233;mu, tj. m&#237;t centr&#225;ln&#237; nastaven&#237; pro ViM pr&#225;vě na tomhle disku (na kter&#253; je nav&#237;c automaticky přesměrovan&#225; environment&#225;ln&#237; proměnn&#225; <tt>%HOME%</tt>), se brzy uk&#225;zalo jako nedostatečn&#233;. Ze dvou důvodů. </p> <p> Tedy, popravdě hlavně proto, že se zn&#225;m a potřebuji, aby editor ukl&#225;dal historick&#233; verze editovan&#253;ch souborů do nějak&#233;ho z&#225;ložn&#237;ho adres&#225;ře &#8211; kolikr&#225;t se mi podařilo soubor smazat nebo přepsat jeho obsah něč&#237;m nevhodn&#253;m... No, a tady je k&#225;men &#250;razu: na každ&#233;m poč&#237;tači může b&#253;t (a v praxi často je) &#250;loži&#353;tě pro <em>backup</em> někde jinde. Na poč&#237;tač&#237;ch, kter&#233; použ&#237;v&#225;m př&#237;ležitostně, při předv&#225;děčk&#225;ch nebo na konferenci, mě obvykle um&#237;stěn&#237; souborů netr&#225;p&#237; a v&#353;echny konfiguračn&#237; a <q>okolosouvisej&#237;c&#237;</q> soubory nech&#225;v&#225;m v <em>Documents &amp; Settings</em>. Na sv&#233;m poč&#237;tači nebo na virtu&#225;ln&#237;m stroji, kde moment&#225;lně pracuju, chci m&#237;t věci v&#237;c pod kontrolou a taky po ruce. </p> <p> Druh&#253; důvod je ten, že se velmi z&#225;hy uk&#225;zalo, že na noebooku je taky dobr&#233; m&#237;t lok&#225;ln&#237; kopii konfiguračn&#237;ch souborů pro editor &#8211; ve chv&#237;li, kdy poč&#237;tač vezmu s sebou mimo pracovn&#237; s&#237;ť, přijdu o připojen&#237; k domovsk&#233;mu adres&#225;ři. To s sebou sice nese nutnost m&#237;t konfiguraci na v&#237;ce m&#237;stech, což je nepř&#237;jemn&#233;, ale těžko jinak ře&#353;iteln&#233;. </p> <p> Ře&#353;en&#237;, kter&#233; jsem nakonec vybral jako nejlep&#353;&#237;, je n&#225;sleduj&#237;c&#237;. V domovsk&#233;m adres&#225;ři je um&#237;stěn&#253; soubor <tt>_vimrc</tt>, kter&#253; obsahuje pouze: </p> <pre name="code" class="Vim:nocontrols"> source C:/Documents\ and\ Settings/dond/_vimrc </pre> <p> ViM při spu&#353;těn&#237; hled&#225; konfiguračn&#237; soubor v adres&#225;ř&#237;ch <tt>%HOME%</tt> a <tt>%VIM%</tt> (v tomto pořadí). V př&#237;padě, že jsem přihl&#225;&#353;en&#253; do dom&#233;ny, <tt>%HOME%</tt> ukazuje na s&#237;ťov&#253; disk, kde se načte v&#253;&#353;e zm&#237;něn&#253; soubor, kter&#253; editor přesměruje na lok&#225;ln&#237; <tt>_vimrc</tt>. V př&#237;padě, že nejsem v dom&#233;ně, <tt>%HOME%</tt> ukazuje rovnou do <em>D&amp;S</em>, takže se lok&#225;ln&#237; souboru načte rovnou. V lok&#225;ln&#237;m <tt>_vimrc</tt> jsou potom pro každ&#253; poč&#237;tač nastaven&#233; př&#237;slu&#353;n&#233; parametry pro <em>backup</em>, <tt>_viminfo</tt> ad.: </p> <pre name="code" class="Vim:nocontrols:firstline[13]"> ... set backup set backupdir=D:/backup set runtimepath+=C:/Documents\ and\ Settings/dond/vimfiles set viminfo='100,\"1000,h,%,nC:/Documents\ and\ Settings/dond/_viminfo ... </pre> <p> Řešení to není úplně ideální, protože na každém stroji musím mít svoje <tt>vimfiles</tt>, což zatím dokážu skousnout (mám je uložené v ZIPu, který jenom po instalaci ViMu rozbalím). Až začneme používat Vistu nebo další <em>vyspělý-operační-systém</em>, bude také asi třeba změnit umístění adresáře s lokálním <tt>_vimrc</tt>, nejspíš na něco jako <tt>C:/temp/_vimrc</tt>. </p> <script language="javascript" src="/shCore.js"></script> <script language="javascript" src="/shBrushVim.js"></script> <script language="javascript"> dp.SyntaxHighlighter.HighlightAll('code'); </script> http://dond.hudbanda.cz/archives/02-01-2009_02-28-2009.html#29 http://dond.hudbanda.cz/archives/02-01-2009_02-28-2009.html#29 ViM Tue, 10 Feb 2009 14:16:04 +0100