tiistaina 3. marraskuuta 2009

Muistidumppi suoritettavasta prosessista

Toisinaan koodia kehittäessä tai softaa testatessa voi prosessin ajonaikaisesta muisti-imagesta olla apua mahdollisten ongelmien selvittämiseen. Windows-alustalle on saatavissa hyviä valmiita työkaluja. Niin muistidumppien generoitiin kuin myös moneen muuhunkin debuggaus ongelmaan. Voisinkin vaiheessa kirjoittaa Windows työkaluista ja niiden käytöstä enemmänkin. Mutta keskitytään nyt tähän.

Ensinnä; Tarvitset mitä todennäköisimmin ylläpitäjän oikeudet. Ainakin ne auttaa. :)

Windowseissa on työkalu nimeltään drwtsn32.exe jonka tehtävänä on tuottaa muisti-image proseseista jotka kaatuvat. Tätä työkalua voi myös käyttää ajossa olevan prosessin imagen luomiseen seuraavasti:
  1. Käynnistä drwtsn32.exe komentoriviltä
  2. Konfiguroi täydet muistidumpit ja aseta kirjoituspolut miten haluat
  3. Etsi prosessinumero (PID) prosessille jonka imagen haluat
  4. Suorita komentoriviltä drwtsn32.exe -p 123456 (korvaa 123456 oikealla PID:llä)
Tämä kirjoittaa muistista dumpin ja logitiedoston Dr. Watsonissa konfiguroituun polkuun. -Ikävä sivuoire on että tämä tappaa prosessin mutta ainakin saat materiaalia sen tutkimiseen mitä oli tekeillä ja mitä oli prosessin muistissa hetkellä jolloin dumppi generoitiin.

keskiviikkona 28. lokakuuta 2009

Grafiikkaa LaTeX dokumenttiin

Akateemisissa julkaisuissa yleisesti käytetty LaTeX on ylivertainen työkalu mitä tulee taittokelpoisen materiaalin tekemiseen. Työkalun oppiminen vie aikansa, mutta on sen väärti kun pääsee työssä liikenteeseen.

Nykyisin julkaisuissa tulee olla mukana myös grafiikkaa. Asioiden visualisointi yleensä helpottaa niiden ymmärtämistä. Ja esimerkiksi erilaisten graafien liittäminen julkaisuun vaatii kuvien liittämistä teokseen.

Kuten jo aikaisemmin mainittu, koitan tehdä kaikenlaisen kuvien kanssa työskentelyn lähtökohtaisesti vektorigrafiikkana SVG-formaatissa. LaTeX ei kuitenkaan osaa käsitellä SVG tiedostoja, joten SVG tulee konvertoida johonkin muuhun formaattiin. PNG on luoteva valinta ja joissain netistä löytyvistä artikkeleista löytyy esimerkkejä miten PNG:t saa liitettyä LaTeX dokumenttiin.

Ensimmäinen asia mitä siis tehdä on konvertoida SVG kuva PNG formaattiin:


ja kun tämä on tehty, liittää se osaksi LaTeX dokumenttia:

Jostakin syystä Inkscapen PNG konversio kuitenkin menee pieleen. -Tai ainakaan LaTeX ei lopputulosta hyväksy. Tehtäessä lopullista DVI-tiedostoa työkalu valittaa että PNG-kuvasta puuttuu bounding box joka määrittäisi kuvan alueen. Tämä siitäkin huolimatta että --export-area-canvas argumentti oli käytössä.




Virheilmoitus:

! LaTeX Error: Cannot determine size of graphic in foo.png (no BoundingBox).

kertoo tämän meille.

EPS:t tuntuivat menevän LaTeX:n hyvin, mutta Inkscapesta exportoitu EPS oli todella ruman näköinen lopullisessa DVI-tiedostossa. Mutta koska PNG näytti hyvältä, jotain muuta voisi keksiä. Lopulta ratkaisuksi löytyi ImageMagick ja sieltä convert työkalu. Tällä sai PNG:stä konvertoitua hyvän näköisen EPS:n joka näyttää hyvältä myös lopputulemana syntyvässä DVI-tiedostossa.



Muuta yllä olevasta LaTeX koodin kuvasta .png tiedoston pääte .eps:ksi ja homma toimii.

Inkscape ja clipart

Vektorigrafiikka voittaa rasterigrafiikan. Nykyisellään koitan pääasiallisesti välttää minkäänlaisten kaavioiden tai vastaavien tekemistä muulla kuin vektorigrafiikalla. Syynä siihen vektorigrafiikan tarkkuus ja muokattavuus erilaisiin julkaisuihin.

Hyvä ilmainen työkalu vektorigrafiikan kanssa työskentelyyn on Inkscape. Yleensä työstän tällä piirustukseni SVG formaatissa. Tämän jälkeen exporttaan kuvan bitmap muodossa (PNG) sopivalla resoluutiolla. Esimerkiksi käytettäväksi web-sivujen grafiikkaelementeissä, esityksissä, dokumenteissa jne.

Inkscapen nykyisen version 0.46 kanssa on ikävä ongelma oletusasetusten kanssa. Jos haluan käyttää kuvassa clipart:a tekee Inkscape viittauksen tiedostoon josta bitmap in importattu. Tämä viittaus kohdistuu yleensä paikalliseen levyjärjestelmään, joten jos SVG tiedosto siirretään jonnekin toisaalle puuttuu Inkscapen tiedostosta kaikki clipart.

Ratkaisu tähän ongelmaan on sulauttaa (embed) bitmapit SVG tiedostoon. -Järkevää, mutta Inkscape ei vaan tee tätä oletusarvoisesti. Homma ratkeaa kun valitaan ylävalikoista "Effects" -> "Images" -> "Embed all images". Tämän jälkeen Inkscapen kuvaan tuodut kuvat on sulautettu samaan tiedostoon.

tiistaina 1. syyskuuta 2009

Sourceforge community awards 2009

Sourceforgen yhteisöpalkinnot vuodelle 2009 jaettiin. Mukana oli paljon tuttuja, mutta myös tuntemattomia ja (omasta mielestäni) turhiakin softia.

Mutta Portableapps vaikutti sellaiselta mitä voisi jatkossa pitää silmällä omaa työkalupakkia ajatellen... Harmi että sieltä kuitenkin puuttuu paljon hyödyllistä tavaraa. -Mitenhän mahtaa mennä tekijänoikeusasiat siinä tapauksessa jos tuonne haluaisi esimerkiksi windbg:n tahi Power shellin?

Python olisi mitä oivin työkalu Portableapp:n. Olen aikaisemmin pyöritellyt "portable Python" ideaa, mutta todennut sen työlääksi. -Viimeksi kun katselmoin Python 2.5:n koodikantaa IO-funktioiden abstrahointi ja tiedostojärjestelmän polkujen käsittelyn muokkaus loaderien puolella vaatisi aikaa. Huomattavasti enemmän mitä itselläni on ollut viimeisen parin vuoden aikana harrastusmielessä käytettävissä.

sunnuntaina 5. heinäkuuta 2009

Tietojen palauttamista

Siivotessani komeroita eteeni jäi vino pino vanhoja CD-levyjä ja levykkeitä. Näiden päälle ei oltu kirjoitettu mitään, joten toki ne kaikki pitää käydä läpi jottei mitään tärkeää tietoa pääse hukkumaan.

CD levyjen kanssa kokee monenlaista. Toiset levyt toimivat hienosti, sisältöä pääsi selaamaan ja lukemaan. Joitain pääsi selaamaan ja dataa lukemaan, mutta jonkin aikaa luettua tuleen jonkin tiedoston kohdalla virhe ja lukeminen tyssää siihen. -Tiedosto menetetty? Toiset CD-levyt ei taasen edes kiinnity levyjärjestelmään koska niiden tiedostojärjestelmän tunnisteet ovat vioittuneet.

Disketit on taasen hieman hankalempi tapaus. Ne ovat alttiimipia ulkoisille häiriöille verrattuna CD-levyihin. Toisekseen; Nämähän ovat pääsääntöisesti todella vanhoja. Ensimmäinen disketti jonka otin tutkailtavaksi käynyt koneen sisällä arviolta 5-8 vuotta sitten. Tästä ei saanut sitten mitään irti... Ei kiinni levyjärjestelmään, ei mitään. Heitin ensi-istumalta kaikki mahdolliset loitsut mitä keksin ja sain disketiltä vaivaiset 22% pelastettua.

Kummastusta tosin aiheutti kun tämän pettymyksen jälkeen satuin ajamaan badblocks komennon uudelleen ja huomasin näiden vähentyneen... Ja seuraavalla ajokerralla oli ainoastaan yksi vioittunut blokki. Voisiko tämä johtua pölystä levykeasemassa, pölystä levykkeellä tai jostain muusta? Lopulta sain kaiken datan kuitenkin ulos.

Mutta asiaan!

Työkaluja joita tarvitaan on jo edellä mainittu badblocks, jolla saadaan selville kuinka moni blokki levyltä on siinä kunnossa ettei voida lukea. Tämä on osa Linux perustyökaluja. Diskettien kanssa tämä osottautui korvaamattomaksi mittariksi siitä mikä on levykkeen tila.



Toinen korvaamaton työkalu tällaisten vanhojen medioiden (tai esimerkiksi vioittuneiden kovalevyjen) lukemiseen on ddrescue. Tällä työkalulla saa luettua suoraan laitteesta (levykeasema, CD-/DVD-asema, kovalevy) koko levyn pinnan yhteen tiedostoon. Jos lukemisessa tulee virheitä niin työkalu koittaa korjata niitä parhaansa mukaan uudelleen lukemalla. Jos mikään ei auta niin ongelma lopulta vain ohitetaan ja lukeminen etenee edelleen. Muut työkalut usein luovuttaa tässä vaiheessa ja loput tiedot jää lukematta. Näin menetelleen saa siis talteen mahdollisimman paljon levyn sisällöstä jälkikäsittelyä varten.



Jos tietoa ei ole menetetty liikoaa niin tiedostoon tallennetun levyjärjestelmän pystyy liittämään osaksi paikallista levyjärjestelmää ja tiedot saa helposti kopioitua talteen. Esimerkki sekvenssi komennoista voisi siis olla jotain seuraavaa:


badblocks -v /dev/fd0
...
dd_rescue /dev/fd0 levy.img
...
mount -t vfat ./levy.img /mnt -o loop,ro
...


jonka jälkeen /mnt hakemisto edustaa levykkeen levyjärjestelmää. Kopioi tiedot talteen ja homma hoidettu.

Jos onni ei myötäinen, on levyjärjestelmän tunnistetiedot saattaneet tuhoutua. Tällöin levyä ei saada näkyviin tiedostojärjestelmään ja homma mutkistuu. Ainoaksi vaihtoehdoksi jää hieman opportunistisemmat menetelmät joilla koitetaan etsiä levyn pintaa edustavasta tiedostosta tavusekvenssejä jotka vihjaavat niiden liittyvän johonkin tiedostoon. Tähän sopiva työkalu on foremost. Tämä työkalu etsii levyltä tuttuja tiedostorakenteita ja koittaa rakentaa niistä kokonaisia tiedostoja.



Erään CD-levyn tapauksessa (ei yllä olevassa kuvassa) näin k3b-työkalulla, että CD-levy oli datalevy sisältäen tiedostoja. Tämä oli kuitenkin vaurioitunut niin, että CD:tä (tai sen pinnasta tehtyä tiedostoa) ei saatu liitettyä levyjärjestelmään. Käyttämällä foremost:a sain kuitenkin eroteltua levyltä työkalun tuntemat tiedostot. Esimerkiksi kaikki kuvatiedostot palautui täydellisesti. Muidenkin tiedostojen osalta sain sen verran selvää ettei siellä ollut mitään muuta mikä olisi ollut kovikaan merkittävää... Mutta kaikenkaikkaan kunnioitettava temppu.

keskiviikkona 1. heinäkuuta 2009

Verkkoyhteyksistä palvelinpuolella

Pitkästä aikaa törmäsiin loistavaan artikkeliin, jonka linkin olin
jossain vaiheessa hukannut. Pistetään se tänne talteen. Toimii hyvänä
johdatuksena jos aiot ohjelmoida palvelinohjelmistoa joka kuuntelee
verkkoa.

http://www.kegel.com/c10k.html

sunnuntaina 31. toukokuuta 2009

Yksittäisen partition mounttaus kovalevyimagesta

Tarvitaan device mapper moduli kerneliin (dm_mod).

Tämän jälkeen liitetään imagetiedosto loopback deviceen:

losetup /dev/loop0 hdimage.img


kpartx:llä tehdään partitioista
device mapper nodet jonka jälkeen voidaan mountata yksittäinen partitio
device mapperistä:


kpartx -v -a /dev/loop0
mount -t ntfs-3g /dev/mapper/loop0p1 /mnt/foo -o ro