Z pewnym opoźnieniem odnotowuję, że 29 lipca 2010 przekroczyłem 140,000 km przejechanych na rowerze (odkąd liczę, tj. od 1990 r.). Wiem, wiem... żadna rewelacja z punktu widzenia typowego zawodnika, co 20--30 tys. albo i lepiej przejeżdża co rok.... A ja tylko i zaledwie trochę mniej niż 7 tys...
sobota, 28 sierpnia 2010
poniedziałek, 23 sierpnia 2010
Implementacja prostej procedury ustalania trafności różnicowej
Bagozzi i Dholakia [BagozziDholakia2006] stosują następującą procedurę ustalania trafności różnicowej (discriminant validity) skali wieloczynnikowej: 1) oszacowanie bazowego modelu CFA (swobodnie korelujące ze sobą czynniki); 2) oszacowanie ograniczonego modelu CFA, tj. modelu w którym korelacja pomiędzy dwoma czynnikami skali jest ustalona jako równa 1 (co oznacza, że czynniki te de facto stanowią jeden czynnik). Oszacowanie modelu ograniczonego dla każdej pary czynników skali; 3) ustalenie czy wartość różnicy statystyk χ2 jest istotna statystycznie.
Istotność statystyki χ2 świadczy iż jakość dopasowania modelu ograniczonego (krok 2) jest istotnie gorsza od modelu bazowego (krok 1), a zatem korelacja pomiędzy parą czynników jest mniejsza od 1, czyli czynniki te się różnią... Trafność dyskryminacyjna skali jest potwierdzona jeżeli wszystkie (a przynajmniej zdecydowana większość) wartości różnic są istotne statystycznie.
Jeżeli skala składa się z n czynników, to należy oszacować (n (n-1))/2 modeli ograniczonych (np. dla n=6, jest to 15 modeli), co jest pracochłonne. Skrypt LISRELa dla modelu CFA oraz modelu ograniczonego różni się zaś od modelu bazowego tylko jednym wierszem:
VA 1 PHI(i,j)
gdzie i oraz j są numerami odpowiednich czynników. Można to wszystko zautomatyzować, w sposób następujący: 1) oblicz model bazowy; z pliku OUT Lisrela pobierz wartość statystyki χ2; 2) w pętli dla każdej pary i,j wykonaj skrypt wyznaczający model ograniczony, pobierz wartość statystyki χ2; 3) oblicz różnicę i wydrukuj...
Skrypt Perlowy wykonujący powyższe (z przykładem wykorzystania) jest tutaj.
Literatura
- BagozziDholakia2006
- Bagozzi, R. P., Dholakia, U. M. Open Source Software User Communities: A Study Of Participation In Linux User Groups Management Science 7/52, 2006, p. 1099--1115.
Wycieczka do Rzucewa
W sobotę pojechałem SKM do Redy. Potem już rowerem przez przez Kępę Pucką (Połchowo, Mrzezino i Zelistrzewo) do Rzucewa. Na plaży przed pałacem smród aż mdli ale byli tacy co się opalali/pływali. Ciekawe czy tak jest zawsze czy tylko ja miałem szczęście?
Z powrotem wróciłem przez dolinę Redy i Kępę Oksywską (Mosty, Pierwoszyno). Chciałem podjechać obejrzeć Torpedowaffenplatz, ale z tej strony, z której próbowałem to chyba się nie da, bo po drodze jest lotnisko...
Bardzo przyjemna trasa, w szczególności znikomy ruch samochodów ale miejscami nawierzchnia dróg kiepska. Ślad jest tutaj.
niedziela, 22 sierpnia 2010
Gpsbabel i /dev/ttyUSB0 w fedora 11
Poprawne działanie mojego skryptu My-get-GPX.sh, który służy do pobierania danych w formacie GPX z urządzeń GPS wymaga w systemie Fedora 11 ręcznego zainstalowania pakietu perla Geo::Distance oraz dopasowanie systemu według zaleceń z wiki.openstreetmap.org. Mianowicie w pliku /etc/modprobe.d/blacklist.conf umieszczamy [Nb. z mojego opisu instalacji MapSource pod wine, wynika że może się to gryźć z MapSource. Na razie się nie gryzie bo ww. MS mam na komputerze ze starszą wersją Fedory....]:
blacklist garmin_gps
oraz zmieniamy uprawnienia do urządzenia (bez tego ściągać dane może tylko root), dodając do katalogu /etc/udev/rules.d/ plik 51-garmin.rules zawierający:
SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="0666"
Teraz należy nowe reguły załadować:
sudo udevadm control --reload-rules
Uwaga: gpsbabel widzi urządzenie jako usb:0 a nie jak poprzednio, w starszej wersji Fedory /dev/ttyUSB0. W nowej fedorze przestał też działać -- zapewne z uwagi na havoc z urządzeniami -- bt747. Szukając zamiennika doczytałem, że gpsbabel też potrafi ściągnąć dane z i-Blue 747:
gpsbabel -t -w -i mtk,erase -f /dev/ttyUSB0 -o gpx -F out.gpx
Opcja erase powoduje wyczyszczenie zawartości pamięci... Oprócz pliku .gpx dane są ściągane w formacie binarnym i zapisywane do pliku data.bin. Gpsbabel nie umie m.in. manipulować ustawieniami loggera, ale nie jest to dla mnie aż tak wielka strata, bo nigdy nic nie ustawiałem... Ciekawostką jest, że dla i-Blue 747 działa /dev/ttyUSB0 a w przypadku Legenda wspomniane usb:0. Trochę to dziwne, albo znowu czegoś nie doczytałem...
Anyway, skrypt My-get-GPX.sh obsługuje teraz zarówno Garmin Legend jak i Blue 747. Dodałem też opcję -publish, działającą w ten sposób, że po pobraniu pliku GPX jest wycinany ślad ,,z dziś'' (tj. od 6.00 do 23.00 dla bieżącej daty), który to ślad jest następnie wysyłany w odpowiednie miejsce na serwerze (np. tutaj). Reasumując: po przyjechaniu z wycieczki rowerowej wystarczy wsadzić kabel USB, włączyć urządzenie i wpisać:
My-get-GPX.sh
A reszta zrobi się sama...
czwartek, 19 sierpnia 2010
Cena postępu
W Pyrach, 25 lipca 1939 roku odbyło się spotkanie, na którym szef Polskiego Biura Szyfrów podpułkownik Gwido Langer przekazał delegacjom sojuszniczych Francji i Anglii, na których czele stali odpowiednio major Gustave Bertrand i pułkownik (komandor) Alastair Denniston całą polską wiedzę nt. maszyny szyfrującej Enigma... Kopie Enigmy przekazano wkrótce pocztą dyplomatyczną...
Tak mi się to skojarzyło jak wczoraj z mediów się dowiedziałem, iż dwie wizyty niejakiego J. Millera w Moskwie (jakby nie było, a przynajmniej nominalnie ministra), to mało żeby przywieźć głupi CDrom z kopią rejestratorów z wiadomego Tupolewa... Trzecie podejście wykonuje generał, a i to pewnie będzie mało...
środa, 11 sierpnia 2010
Spływ Czarną Hańczą
Ślad GPX (ze zdjęciami) ze spływu kajakowego fragmentem Czarnej Hańczy (od Wysokiego Mostu do Głębokiego Brodu).
sobota, 24 lipca 2010
Obliczanie AVE i CR z pliku out LISRELa
Zaproponowane przez Fornella i Larckera [HairetAl98,FornellLarcker81] rzetelność łączna (composite reliability, CR) oraz przeciętna wariancja wyodrębniona (average variance extracted, AVE) stały się często wykorzystywanymi miarami rzetelności wewnętrznej oraz trafności zbieżnej. CR obliczana jest według następującej formuły [por. także zencaroline.blogspot.com/2007/06/composite-reliability]:
CRη = (∑i ληi )2 / ( (∑i ληi )2 + ∑i var(εi))
gdzie: var(εi) = 1 - (ληi2); ληi to wektor (zestandaryzowanych) ładunków czynnikowych dla zmiennej ukrytej η.
Minimalną akceptowaną wartością CR jest 0,7
Podobny do CR jest wskaźnik przeciętnej wariancji wyodrębnionej (average variance extracted, AVE), służący do oceny trafności zbieżnej (convergent validity). Jest on obliczany według następującej formuły:
AVEη = (∑i (ληi )2 ) / ( ∑i (ληi)2 + ∑i var(εi) )
Znaczenie symboli jest identyczne, jak we wzorze określającym rzetelność łączną. Minimalną akceptowaną wartością AVE jest 0,5.
Znając zestandaryzowane wartości ładunków czynnikowych ληi policzenie CR oraz AVE jest proste. Dodanie opcji SC (completely standardized solutions) do polecenia OUTPUT spowoduje wydrukowanie zestandaryzowanych wartości ładunków czynnikowych. Poniższy skrypt obliczy na tej podstawie CR/AVE dla każdej zmiennej ukrytej:
#!/usr/bin/perl
# Computes/prints Composite Reliability (CR) and Average Variance Extracted (AVE)
# from LISREL OUT file. Measures can load on several factors
#
# (c) 2010; t.przechlewski http://pinkaccordions.homelinux.org/staff/tp/
# GPL license
#
# The formulas for CR and AVE are as follows [cf. Hair, Anderson, Tatham and Black, Multivariate Data Analysis, 5th Ed., Pearson Education, p. 637]:
# CR = (\sum standardized loading)^2 / ( (\sum standardized loading)^2 + \sum indicator measurement error ),
# AVE = (\sum (standardized loading)^2 ) / ( \sum (standardized loading)^2 + \sum indicator measurement error )
# where: indicator measurement error = 1 - loading^2
# see also: http://zencaroline.blogspot.com/2007/06/composite-reliability.html
#
# usage: perl print_cr_and_ave lisrel-output-file
#
my $scan = 0; ## flag to figure out where we are
my $initial_latent_var_no = 0;
while (<>) {
chomp;
# We are looking for the line with `Completely Standardized Solution' (CSS), which
# starts the block containing relevant data
if (/Completely Standardized Solution/) { $scan = 1 ;
print STDERR "*** Found *** $_ ***\n"; next ; }
# After CSS line we look the line with LAMBDA-* (there are up to two such lines)
if ( $scan > 0 && /LAMBDA-[XY]/ ) { $scan++;
print STDERR "*** Found *** $_ (initial: $initial_latent_var_no) ***\n";
$_ = <> ; $_ = <> ; $_ = <> ; ## eat exactly next three lines
## ok we are about to scan LAMBDA-X/Y matrix
while (<>) { chomp;
if (/^[ \t]*$/) { # exmpty line ends LAMBDA-X/Y matrix
## before reading next block store the number of latent vars from the 1st block
## first latent var number in the second block = number of vars in the previous block +1
$initial_latent_var_no += $#loadings;
print STDERR "*** Initial var number = $initial_latent_var_no ***\n";
last ; ## OK, all rows in matrix was read...
}
s/- -/xxx/g; # change `- -' to `xxx'
@loadings = split ' ', $_;
# column number = latent var number ; column `0' contains measurement variable name
for ($l=1; $l <= $#loadings; $l++) {
if ($loadings[$l] !~ /xxx/) { ## store in hash
$Loadings{$l + $initial_latent_var_no }{$loadings[0]} = $loadings[$l];
}
}
}
}
}
print STDERR "*** Latent variables = $initial_latent_var_no ***\n";
print "=======================================================\n";
### Compute/print CR i AVE ### ### ### ###
for $l (sort keys %Loadings ) {
$loadings = $sqloadings = $errors = 0;
print STDERR "*** Xi/Eta: $l ***\n";
for $m ( sort keys %{ $Loadings{ $l }} ) {
$load = $Loadings{$l}{$m};
print STDERR "$m ($l) = $load\n";
$loadings += $load ;
$sqloadings += $load * $load ;
$errors += (1 - $load * $load);
}
$cr = ($loadings * $loadings) / ( ($loadings * $loadings) + $errors ) ;
$ave = $sqloadings / ($sqloadings + $errors ) ;
printf "Xi/Eta_%2d -> CR = %6.3f AVE = %6.3f\n", $l, $cr, $ave;
}
print "=======================================================\n";
Skrypt można także pobrać tutaj.
Literatura
- FornellLarcker81
- Fornell, C. i Larcker, D. F. (1981). Evaluating structural equation models with unobservable variables and measurement error. Journal of Marketing Research, 18(1):39--50.
- HairetAl98
- Hair, J. F., Black, B., Anderson, R. E., i Tatham, R. L. (1998). Multivariate Data Analysis. Prentice Hall.
piątek, 25 czerwca 2010
Gmap-pedometer i ograniczenia Legenda
Intensywne używanie http://www.gmap-pedometer.com/ spowodowało, iż dotarłem do granic możliwości Legenda, o których NB. do niedawna nie miałem pojęcia. Otóż Legend może przechować do 1000 punktów (waypoints), 20 śladów (tracks) oraz do 50 tras (routes), każda o długości do 250 punktów... Ponieważ punkty trasy liczą się do puli punktów, 5 tras 200 punktowych zawala pamięć ,,na amen''. Co zresztą niedawno miało miejsce...
Usunięcie wszystkich punktów i wszystkich tras z Garmina jest bardzo łatwe. Tyle, że chciałbym niektóre zachować... Można wprawdzie usuwać punkty według związanych z nimi symboli, ale to by wymagało porządku przy ich definiowaniu. A ja, póki co, mam w tym względzie bałagan. Zatem:
-
Zgrałem zawartość pamięci Garmina do pliku. Wywaliłem wszystkie trasy i ślady oraz związane z nimi punkty (są one łatwo rozpoznawalne po nic nie mówiącej nazwie typu Turn 233 albo GRTP-202). Pozostawiłem pozostałe punkty. (Wywalając trasy trzeba usunąć wszystkie, bo nie wiadomo jaki punkt należy do jakiej trasy -- tak jest szybciej i prościej.)
-
Wyczyściłem pamięć urządzenia. W tym celu w menu głównym należy wybrać ikonę Waypoints→przycisk menu/find→Delete. Teraz wybrać All Symbols i potwierdzić. Uwaga: przycisk menu/find jest po lewej na dole pod przyciskami góra/dół.
-
Załadowałem z powrotem plik GPX (nazwałem go
LEGEND_MEM.gpx):
gpsbabel -r -w -t -i gpx -f LEGEND_MEM.gpx -o garmin -F /dev/ttyUSB0
Plik LEGEND_MEM.gpx zawiera moją bazę podstawowych punktów i tras (jeżeli takowe są)... Resztę będę ładował w miarę potrzeby, a jak się znowu zapełni pamięć Legenda, to powtórzę opisaną wyżej procedurę... Przy okazji 225 jako górny limit punktów na trasie wygląda na zbyt dużo. Spróbuję 100 punktów, wtedy zmieści się więcej tras....
środa, 23 czerwca 2010
Odtwarzanie zakodowanych płyt Video
Płyta DVD/Video (Ballando Ballando Ettore Scoli) się nie odtwarza. Konsultując problem z Google (Encrypted DVD support unavailable), ustaliłem, że zapewne brakuje czegoś co się nazywa libdvdcss. Doinstalowałem:
rpm -ivh http://dl.atrpms.net/f11-i386/atrpms/stable/libdvdcss2-1.2.10-5.fc11.i586.rpm
rpm -ivh http://dl.atrpms.net/f11-i386/atrpms/stable/libdvdcss-1.2.10-5.fc11.i586.rp
Być może drugi z pakietów jest zbędny, ale doinstalowałem w desperacji bo ciągle nic. Już się miałem poddać ale oko mi się oparło na dyskusji na forum użytkowników Ubuntu, w której to dyskusji pojawia się coś co nazywa się regionset. Doinstalowałem i to:
yum install regionset
Nie musiałem nawet ,,odpalać regionseta i ustawiać region na 2'' (co jest opisane na ww. forum). Samo zainstalowanie wystarczyło...
sobota, 5 czerwca 2010
Mod_rewrite
Włączyłem mod_rewrite:
cd /etc/apache2/mods-enabled
ln -s ../mods-enabled/rewrite.load rewrite.load
W pliku /etc/apache2/sites-available/pinkaccordions trzeba dopisać (w innych wirtualnych hostach też, jeżeli są):
RewriteEngine On
RewriteOptions Inherit
oraz zamienić:
AllowOverride None
na
AllowOverride All
Zrestartować Apacha
/etc/init.d/apache2 restart
Podobno zamiast powyższego wystarczy a2enmod rewrite plus restart Apacha. Teraz działa http://pinkaccordions.homelinux.org/wblog zamiast /cgi-bin/blosxom.cgi, albo http://pinkaccordions.homelinux.org/gpx/id_pliku, np. http://pinkaccordions.homelinux.org/gpx/20100605.
czwartek, 27 maja 2010
Konfigurowanie Apacha
Rozpoczynam od założenia w serwisie dyndns.org konta. Potem przechodzę do My Services→Host services, wybieram nazwę hosta (w moim przypadku pinkaccordions) i domeny (homelinux.org). Typ usługi: Host with IP address. Resztę pól można zostawić niewypełnione. Darmowe konto pozwala na przydzielenie 5 adresów...
Teraz w menu Tomato klikam w Basic→DDNS. Jako service wybieram DynDNS -- static, Username/Password to dane z rejestracji w serwisie DynDNS, hostname to z kolei wybrana przez nas nazwa hosta, tj. w moim przypadku pinkaccordions.homelinux.org. Więcej niczego nie trzeba wpisywać wystarczą dane domyślne. Można ustawić w ten sposób dwa adresy... Por też notatki tutaj.
Pozostaje wreszcie uruchamienie usługi port forwarding na routerze z działającym Tomato. Jest to bardzo proste i sprowadza się do wypełnienia pól Proto, Ext Ports, Int Address oraz opcjonalnie Description (por. ekran obok).
Instalacja serwera apache oraz php w systemie Debian Lenny.
apt-get install apache2 apache2-mpm-prefork apache2-utils apache2.2-common
apt-get install php5 libapache2-mod-php5 php5-common php5-curl
apt-get install php5-dev php5-gd php5-imagick php5-mcrypt php5-memcache php5-mhash \
php5-mysql php5-pspell php5-snmp php5-sqlite php5-xmlrpc php5-xsl
W pliku /etc/apache2/ports.conf umieszczam komentarz przed dyrektywą NameVirtualHost:
#NameVirtualHost *:80
Zaś powyższą dyrektywę umieszczam w /etc/apache2/httpd.conf.
Konfiguracja wirtualnego hosta; plik /etc/apache2/sites-available/pinkaccordions powstaje przez skopiowanie pliku domyślnego:
cd /etc/apache2/sites-available/ ; cp default pinkaccordions
Następnie plik modyfikuję dopisując ServerName i ServerAlias
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName pinkaccordions.homelinux.org
ServerAlias pinkaccordions.homelinux.org
DocumentRoot /var/www_pinkaccordions/
<!-- dalej w zasadzie niezmienione -->
</VirtualHost>
Teraz:
cd /etc/apache2/sites-enabled && ln -s ../sites-available/pinkaccordions pinkaccordions
To samo dla drugiego i ewentualnie kolejnych hostów. Innych plików za wyjątkiem opisanych wyżej httpd.conf, ports.conf oraz plików z katalogu ./sites-available/ i linków z katalogu ./sites-enabled/ nie ruszam. Teraz
/etc/init.d/apache2 restart
# albo apache2ctl graceful
No i powinno działać...
Dopisane 15 września 2010: Aby logrotate nie usuwał najstarszego przechowywanego pliku modyfikuję /etc/logrotate.d/apache2 i dodając stosowane prerotate...endscript:
sharedscripts
prerotate
if [ -f "/path2logs/access.log.52.gz" ] ; then
cp /path2logs/access.log.52.gz /path2archive/access.`date +%Y%m%d`.log.gz ; fi
if [ -f "/path2logs/access.fabians.log.52.gz" ] ; then
cp /path2logs/access.log.52.gz /path2logs/access.`date +%Y%m%d`.log.gz ; fi
endscript
Teraz (mam nadzieję), plik access.log.52.gz przed skasowaniem zostanie skopiowany w inne miejsce i ocaleje. Pewnie można by prościej, przykładowo brutalnie wpisując po prostu rotate 156.