torstai 28. elokuuta 2008
Dellin näppäimistön pikanäppäinten säätäminen
keskiviikko 27. elokuuta 2008
Adobe Readerin käyttäjä PDF-tiedoston tekijän armoilla
maanantai 25. elokuuta 2008
memmapfile-funktion käyttö MATLABissa
MATLABissa on jo muutaman version ajan ollut memmapfile
-funktio, joka hyödyntää käyttöjärjestelmien tarjoamaa tiedostojen muistiinkuvauspalvelua. Tiedosto voidaan siis kuvata prosessin muistiin ikään kuin se olisi muistissa, vaikka se tosiasiassa onkin vain massamuistissa. Palvelua hyödyntävän ohjelmoijan ei tarvitse itse ladata osia tiedoston sisällöstä muistiin käsittelyä varten, vaan käyttöjärjestelmä hoitaa tämän tylsän ja virhealttiin tehtävän. Palvelu on oikeastaan todella tärkeä ajatellen nykyistä massamuistin ja keskusmuistin suhdetta: massamuistia voi olla tavallisissa mikrokoneissakin teratavu tai useampia, mutta fyysistä muistia on usein vain gigatavu. tai pari. Lisäksi MATLAB tuo vielä oman rajoitteensa muistinkäyttöön, sillä sille ei riitä, että muistia on yhteensä jokin määrä. MATLAB pystyy nimittäin tallentamaan matriiseja vain yhtenäiselle muistialueelle. Lisäksi ainakin Windowsissa MATLABin käytössä oleva muistialue pirstoutuu käytön aikana, jolloin kahden gigatavunkin muistilla varustetussa koneessa pystyy käsittelemään vain muutamaa sadan megan matriisia yhtä aikaa. MATLAB-ohjelmia on myös helppo kirjoittaa niin, että tarvitaan useita kopioita samasta matriisista.
memmapfile
n käyttö on onneksi melko yksinkertaista. Oletetaan, että on olemassa 500 megatavun Level 4 MAT-tiedosto aikasarja.mat, jossa matriisi y sisältää jonkin systeemin syötteen rivillä kaksi, vasteen rivillä kolme ja ajan rivillä yksi. Seuraavalla koodilla
s = whos('-file', 'aikasarja.mat');syntyy objekti map, jossa itse aikasarjoihin pääsee käsiksi notaatiolla map.Data.y. Tässä on ensin whos-funktiolla otettu tiedoston sisältämän matriisin ominaisuudet talteen rakenteeseen s. Matriisin koko on syötetty suoraan
map=memmapfile('aikasarja.mat',...
'Format', {'double' s(1,1).size 'y'},...
'Repeat', 1,...
'Offset', 22);
memmapfile
n Format-argumenttiin, joka tarvitsee lisäksi ohjeen datan tulkitsemiseksi (double) ja nimeämiseksi (y). Tämän jälkeen voi vaikkapa laskea varsin siedettävällä muistinkäytöllä taajuusvaste-estimaatin: [FRF, frequency] = tfestimate(map.Data.y(2,:), map.Data.y(3,:));Oleellista on tietää, missä muodossa data on tiedostossa.
memmapfile
on sen verran matalalla tasolla, että helposti joutuu lukemaan MAT-tiedostoformaatin dokumentaatiota pystyäkseen antamaan oikean arvon Offset-argumentille. Tässä tapauksessa oikea offset on 22, koska matriisin nimen pituus on kaksi tavua (y-kirjain ja null-merkki). Tiedostojen tarkastelussa tarvitaan hyvä tiedostonmuokkain. Paras löytämäni on KHexEdit, joka tosin toimii vain Linuxissa. Ehkäpä samat toiminnot tarjoava ohjelma on olemassa myös Windowsille.
Rekursiivinen hakemistolistaus MATLABissa
>> pwd
ans =
D:\Ohjelmistot\MATLAB\R2008a\bin
>> s = rlsdir('.');
>> s.name
ans =
.\registry
ans =
.\util
ans =
.\win32
ans =
.\util\mex
ans =
.\win32\accessible
ans =
.\win32\codecs
ans =
.\win32\imageformats
ans =
.\win32\ipp20
ans =
.\win32\mbuildopts
ans =
.\win32\mexopts
>> s = rlsdir('registry');
>> s.name
>> s = rlsdir('util');
>> s.name
ans =
util\mex
>>
Toiminta perustuu oletukseen, että hakemistot . ja .. ovat ensimmäisenä listassa. Tämä ei toteudu ainakaan silloin, jos hakemisto(i)ssa on tiedostoja, jotka alkavat #:lla. Esimerkiksi Emacs jättää jälkeensä tällaisia tiedostoja.
Koodi (jota saa käyttää vapaasti):
function dirs = rlsdir(root)
% DIRS = RLSDIR(ROOT)
% Returns a recursive listing of subdirectories of ROOT in structure DIRS
% similar to that returned by the built-in function DIR. The pathname of
% the NAME field of the structure DIRS is given relative to ROOT.
temp = dir(root); % List the root dir
temp(1:2)=[]; % Remove this directory (.) and upper level (..)
n = 1;
for n = 1:length(temp) % Loop through directories and files
if temp(n).isdir == 1 % If a directory is found ...
temp(n).name = [root '\' temp(n).name]; % concatenate the root level
temp = [temp; rlsdir(temp(n).name)]; % directory name and the newly
end % found directory to a
end % temporary variable and list
m = []; % the contents of the new dir.
for n = 1:length(temp) % Remove all non-directories from the temporary
if temp(n).isdir == 0 % variable.
m = [m ; n];
end
end
temp(m) = [];
dirs = temp; % Return the temporary variable.
end
sunnuntai 24. elokuuta 2008
Ubuntu piipittää
Satunnaisesti HP Compaq 6820s:n herätessä keskeytystilasta (Ubuntu-termi) kone piippaa viisi tai kuusi kertaa. Piippaukset kestävät noin 0,1-0,5 sekuntia ja niiden välissä on noin 0,1 sekunnin tauko. Jokainen piippaus nousee ja häipyy pehmeästi. Ääni lienee sinimuotoinen ja taajuudeltaan noin 1-2 kHz. Alsamixerin näyttämän Master-kanavan voimakkuusasetus vaikuttaa piipityksen voimakkuuteen. Ubuntu käyttää kyseistä ääntä ilmoittaakseen virheestä. Äänen voi ruksata päälle ja pois virranhallinnan asetuksista:
Keskeytystilasta herättäessä ilmeisesti oletetaan, että näyttö ei ole käytettävissä virheilmoitusten esittämiseen. On ehkä mahdollista ruksata jostain päälle tekstuaalinen ilmoituskin. Pikaisella silmäyksellä lokeista löytyi vain seuraavat virheet (debug-tiedostosta):
Aug 24 12:23:43 hp kernel: [ 0.419762] APIC error on CPU1: 00(40)Lokien syövereissä saattaa toki olla virheilmoituksia, jotka vain jäävät ymmärtämättä ilman parempaa Linux-osaamista. Vai pitäisikö osata lukea rivien välistä?
Aug 24 12:23:43 hp kernel: [ 0.419764] APIC error on CPU0: 00(40)
lauantai 23. elokuuta 2008
Linux ei löytänyt CD-asemaa
Miten on mahdollista, että Linux 2.6.20 ei löydä CD/DVD-asemaa? Luulisi näin tavallisen laitteen toimivan ilman muuta ajanmukaisessa Ubuntu 8.04:ssä. Laitetiedostoa ei kertakaikkiaan ollut, eikä asemaan asennettu levy saanut lyhytkestoista viserrystä lukuun ottamatta aikaan mitään muuta toimintaa. Voisiko vika johtua siitä, että 2.6.20 oli käytössä Hardy Heronissa, jossa pitäisi olla 2.6.24? Joka tapauksessa 2.6.24 löytää CD-aseman ongelmitta, joten se näkyy nyt lshw
:n listauksessakin:
*-cdrom
description: DVD-RAM writer
product: CD/DVDW TS-L632M
vendor: TSSTcorp
physical id: 0.0.0
bus info: scsi@3:0.0.0
logical name: /dev/cdrom
logical name: /dev/dvd
logical name: /dev/scd0
logical name: /dev/sr0
version: 0A17
capabilities: removable audio cd-r cd-rw dvd dvd-r dvd-ram
configuration: ansiversion=5 status=open