Weblog Tomasza Przechlewskiego [Zdjęcie T. Przechlewskiego]


scrum
random image [Photo gallery]
Zestawienie tagów
1-wire | 18b20 | 1wire | 2140 | 3rz | adamowicz | afera | alsamixer | amazon | amber | amman | anniversary | antypis | apache | api | applebaum | arm | armenia | astronomy | asus | atom.xml | awk | aws | bachotek | bakłażan | balcerowicz | balta | banan | bash | batumi | berlin | białowieża | białystok | bibtex | bieszczady | birzeit | biznes | blogger | blogging | blosxom | bme280 | bono | borne-sulinowo | breugel | bt747 | budapeszt | budyniowo | budyń | bursztyn | campagnolo | canon | cedewu | chaos | chello | chiller | chillerpl | chown | christophe dominici | chujowetaśmy | ciasto | cmentarz | contour | coronavirus | covi19 | covid | covid19 | cron | css | csv | cukinia | curl | cycling | d54250wykh | darkages | dbi | debian | dejavu | dhcp | dht22 | dia | docbook | dom | dp1500 | ds18b20 | duda | dulkiewicz | dulkiewiczowa | dyndns | dynia | ebay | economy | ecowitt | ekonomia | elka | elm | emacs | emacs23 | english | ep | erasmus | erasmusplus | ess | eu | eurostat | excel | exif | exiftool | f11 | fc | fc11 | fc15 | fc29 | fc5 | fc8 | fedora | fedora21 | fenix | ffmpeg | finepix | firefox | flickr | folau | fontforge | fontspec | fonty | food | fop | forms | foto | france | francja | fripp | froggit | fuczki | fuji | fuse | gammu | garden | garmin | gas | gawk | gazwyb | gdańsk | gdynia | gender | geo | geocoding | georgia | gft | ggplot | ghost | git | github | gmail | gmaps | gnokii | gnus | google | google apps script | googlecl | googleearth | googlemaps | gotowanie | gphoto | gphoto2 | gps | gpsbabel | gpsphoto | gpx | gpx-viewer | greasemonkey | gruzja | grzyby | gus | gw1000 | haldaemon | handbrake | helsinki | hhi | historia | history | hitler | holocaust | holokaust | hp1000se | hpmini | humour | iblue747 | ical | iiyama | ikea | imagemagick | imap | inkscape | inne | internet | j10i2 | javascript | jhead | jifna | jordania | k800i | kajak | kamera | karob | kibbeh | kleinertest | kml | kmobiletools | knuth | kociewie kołem | kod | kolibki | komorowski | konwersja | krutynia | krynki | kuchnia | kurski | kłamstwo | latex | latex2rtf | latex3 | lcd | legend | lenny | lesund | lewactwo | lgbt-folly | liban | liberation | linksys | linux | lisp | lisrel | litwa | lizbona | logika | ltr | lubowla | lwp | lwów | m2wś | malta | mapquest | mapsource | maradona | marchew | marimekko | marvell | math | mathjax | mazury | mbank | mediolan | mencoder | mevo | mex | mh17 | michalak | michlmayr | microsoft | monitor | mp4box | mplayer | ms | msc | mssql | msw | mswindows | mtkbabel | museum | muzyka | mymaps | mysql | mz | nafisa | nanopi | natbib | navin | neapol | nekrolog | neo | neopi | netbook | niemcy | niemieckie zbrodnie | nikon | nmea | nowazelandia | nuc | nxml | oauth | oauth2 | obituary | ocr | odessa | okular | olympus | ooffice | ooxml | opera | osm | otf | otftotfm | other | ov5647 | overclocking | ozbekiston | padwa | palestyna | panoramio | paryż | pdf | pdfpages | pdftex | pdftk | pedophilia | perl | photo | photography | pi | picasa | picasaweb | pim | pine | pis | pit | pizero | plain | plotly | pls | plugin | po | podcast | podlasie | podróże | pogoda | politics | polityka | polsat | portugalia | postęp | powerpoint | połtawa | prelink | problem | propaganda | pseudointeligencja | pstoedit | putin | python | pywws | r | r1984 | radio | random | raspberry | raspberry pi | raspberrypi | raspbian | refugees | relaxng | ridley | router | rower | rowery | roztocze | rpi | rsync | rtf | ruby | rugby | rumunia | russia | rwc | rwc2007 | rwc2011 | rwc2019 | ryga | rzym | salerno | samba | sds011 | selenium | sem | senah | sernik | sheevaplug | sienkiewicz | signature | sikorski | sks | skype | skytraq | smoleńsk | sqlite | srtm | sshfs | ssl | staszek wawrykiewicz | statistcs | statistics | stats | statystyka | stix | stretch | supraśl | suwałki | svg | svn | swanetia | swornegacie | szwajcaria | słowacja | tallin | tbilisi | terrorism | tesseract | tex | texgyre | texlive | thunderbird | tomato | totalnaopozycja | tourism | tramp | trang | transylwania | truetype | trzaskowski | ttf | turcja | turkey | turystyka | tusk | tv | tv5monde | tweepy | twitter | tykocin | typetools | ubuntu | uchodźcy | udev | ue | ukraina | umap | unix | upc | updmap | ups | utf8 | uzbekistan | varia | video | vienna | virb edit | virbedit | vostro | wammu | wdc | wdfs | weather | weathercloud | webcam | webdav | webscrapping | weewx | wenecja | wh2080 | wiedeń | wikicommons | wilno | win10 | windows | windows8 | wine | wioślarstwo | wojna | word | wordpress | wrt54gl | ws1080 | wtyczka | wunderground | ww2 | www | wybory | wybory2015 | włochy | węgry | xemex | xetex | xft | xhtml | xine | xml | xmllint | xsd | xslt | xvidtune | youtube | yum | zaatar | zakopane | zakupy | zawodzie | zdf | zdrowie | zeropi | zgarden | zgony | zprojekt | łeba | łotwa | świdnica | żywność
Archiwum
06/2023 | 02/2023 | 01/2023 | 11/2022 | 10/2022 | 09/2022 | 07/2022 | 06/2022 | 04/2022 | 03/2022 | 02/2022 | 12/2021 | 09/2021 | 03/2021 | 01/2021 | 12/2020 | 11/2020 | 10/2020 | 09/2020 | 08/2020 | 07/2020 | 04/2020 | 03/2020 | 02/2020 | 01/2020 | 12/2019 | 11/2019 | 10/2019 | 09/2019 | 08/2019 | 07/2019 | 06/2019 | 04/2019 | 02/2019 | 01/2019 | 12/2018 | 11/2018 | 10/2018 | 09/2018 | 08/2018 | 07/2018 | 05/2018 | 04/2018 | 03/2018 | 02/2018 | 01/2018 | 11/2017 | 10/2017 | 09/2017 | 08/2017 | 07/2017 | 06/2017 | 05/2017 | 04/2017 | 03/2017 | 02/2017 | 01/2017 | 12/2016 | 11/2016 | 10/2016 | 09/2016 | 08/2016 | 06/2016 | 05/2016 | 04/2016 | 02/2016 | 12/2015 | 11/2015 | 09/2015 | 07/2015 | 06/2015 | 05/2015 | 02/2015 | 01/2015 | 12/2014 | 09/2014 | 07/2014 | 06/2014 | 04/2014 | 02/2014 | 01/2014 | 12/2013 | 11/2013 | 10/2013 | 09/2013 | 08/2013 | 07/2013 | 05/2013 | 04/2013 | 03/2013 | 02/2013 | 01/2013 | 12/2012 | 11/2012 | 10/2012 | 09/2012 | 08/2012 | 07/2012 | 05/2012 | 03/2012 | 02/2012 | 01/2012 | 12/2011 | 11/2011 | 10/2011 | 09/2011 | 08/2011 | 07/2011 | 06/2011 | 05/2011 | 04/2011 | 03/2011 | 02/2011 | 01/2011 | 12/2010 | 11/2010 | 10/2010 | 09/2010 | 08/2010 | 07/2010 | 06/2010 | 05/2010 | 04/2010 | 03/2010 | 02/2010 | 01/2010 | 12/2009 | 11/2009 | 10/2009 | 09/2009 | 08/2009 | 07/2009 | 06/2009 | 05/2009 | 04/2009 | 03/2009 | 02/2009 | 01/2009 | 12/2008 | 11/2008 | 10/2008 | 09/2008 | 08/2008 | 07/2008 | 06/2008 | 05/2008 | 04/2008 | 03/2008 | 02/2008 | 01/2008 | 12/2007 | 11/2007 | 10/2007 | 09/2007 | 08/2007 | 07/2007 |
O stronie
wykorzystywany jest blosxom plus następujące wtyczki: tagging, flatarchives, rss10, lastbuilddatexhtmlmime. Niektóre musiałem dopasować nieco do swoich potrzeb. Więcej o blosxom jest tutaj
Subskrypcja
RSS 1.0
Nagrywanie ekranu

W Linuksie sprawa prosta: recordmydesktop, ale ja potrzebuję też pokazać jak coś wykonać w Windows. Programów jest dużo: ten wbudowany w Windows10 nagrywa nawet OK, ale tylko okno, no a ja potrzebuję cały pulpit; komercyjny recmaker jest też OK, ale (zawsze jest jakieś ale w Windows) w wersji free nagrywa tylko 120 sekund.

W końcu instaluję OBS Studio; dość kobylaste, ale robi wszystko co trzeba. Konfiguruję go, że Alt-R zaczyna nagrywanie a Alt-S kończy.

url | Wed, 09/12/2020 03:38 | tagi: , ,
Nowy dysk, nowy system

Dysk nowy kupiłem Samsung Evo 1T msata bo taki mam interfejs w moim NUCu.

Z tej okazji wymyśliłem sobie nie tylko zmienić dysk, ale także używaną wersję Linuksa, bo Fedora, której byłem wierny od początku (od 1999 r czyli 20 lat) ostatnio mnie mocno zaczęła wkurzać niedoróbkami (na przykład kompletnie dupiata obsługa mojej drukarki w wersji FC29, podczas gdy w wersji FC21 było zupełnie dobrze; usunięcie starych całkiem fajnych programów i zastąpienie ich czymś innym ale wcale nie lepszym). Może Debian będzie lepszy? Zresztą o tyle Debian dla mnie nie jest czymś zupełnie nowym, że używam go na serwerach (Sheeva/Raspberry.)

Po krótkiej konsultacji z Internetem, ściągnąłem 64-bitową wersję pn. netinst (czyli mówiąc konkretnie stosowny plik ze strony https://www.debian.org/CD/netinst/). Skopiowałem toto po prostu na USB (cf Preparing a USB stick using a hybrid CD or DVD image)

# cp debian.iso /dev/sdX
# sync

USB odpalił i bez problemu zainstalował system na dysku. Teraz dociągnąłem programy, z których korzystam:

apt update
apt emacs mc texlive evince gimp imagemagick vlc gpsbabel r-base \
    r-base-dev gretl sshfs
 apt install chromium-driver python-selenium python3-selenium
 apt install dia dia-common fontforge xpdf
 apt install git gpsprune libclang-dev libxml2-utils
 apt install mlocate python-tweepy python3-tweepy
 apt install qgis
 ## r-cran-ggplot2 spowodowało zainstalowanie prawie wszystkiego
 ## zaczynającego się od r-cran (i dobrze)
 apt install r-cran-ggplot2 r-cran-tibble
 apt install sqlite sqlite3
 apt install thunderbird
 apt install vim
 apt install xscreensaver
 apt install xsltproc

Ręcznie doinstalowałem dwa programy, których nie ma w repozytoriach debiana:

## Google chrome
dpkg -i google-chrome-stable_current_amd64.deb
## Rstudio
dpkg -i rstudio-1.2.5019-amd64.deb

Z jakiś powodów znikły niektóre fonty w Firefoksie (który jest oryginalnie domyślną przeglądarką w systemie) na niektórych stronach (na Twitterze wszystkie, same rysunki wyświetlał). Konsultacje z google w temacie okazały się nieskuteczne więc zrobiłem reinstall:

apt remove firefox-esr
apt install firefox-esr

Problem zniknął. Pojawił się też (na etapie instalowania pakietów R na przykład) dziwny komunikat o niemożliwości zainstalowania pakietu, bo cośtam z podpowiedzią żeby wykonać:

apt --fix-broken install

i faktycznie po wykonaniu powyższego, pakiety dały się instalować.

Przeniesienie środowiska z FC29 na Debian10

Przenoszę pliki konfiguracyjne i startowe i modlę się żeby nie trzeba było za dużo zmieniać.

Problem #1: inaczej działają pliki startowe basha (.bash_profile w szczególności w ogólnie nie jest czytany za to czytany jest .profile).

Problem #2: emacs w trybie nxml pluje błędem: symbol's function definition is void: string-to-int, bo string-to-int has been an obsolete function since Emacs 22.1, and it was removed in 26.1. A ja miałem tak skonfigurowanego Emacsa, że nie korzystał z dystrybucyjnej (że tak powiem) wersji nxml, tylko ładował starą kopię umieszoną w ~/.emacs-local Zmieniam i działa. Przy okazji robię niewielki porządek w .emacs.

Wnioski: pierwsze koty za płoty zachęcające, Zobaczymy co będzie dalej bo jeszcze nie uruchomiłem wszystkiego czego używałem na starym systemie.

BTW: Ten post wysłany jest już z nowego systemu (za pomocą tych samych skryptów, które używałem w starym.)

url | Tue, 26/11/2019 18:13 | tagi: , ,
Emergency Mode

Mam między innymi taki dziwny komputer pn Asus X205TA. W sumie to go nie używam, bo mam jeszcze 4 laptopy (no i PCta). Razem wychodzi wszystkiego sześć: trzy z Windows i trzy z Linuksem, tyle że Linuks na PC, na klocowym Laptopie i na X205TA.

Asus jest dziwny bo nie ma dysku tylko 30 Gb pamięci flash (nominalnie, w praktyce mniej). Że jest mało pamięci, a komputer ma gniazdo mikro SDHC, to wsadziłem w to gniazdo kartę 32Gb. Do /etc/fstab wpisałem:

UUID=#### /media/tomek/sdhc ext4 auto,user,rw,exec 0 0 

No i zapomniałem o tych wszystkich nastawach. Wczoraj potrzebowałem Laptopa z Linuksem więc przypomniałem sobie o X205TA. Wyjąłem oryginalną, że tak powiem, kartę bo potrzebowałem wsadzić inną i uruchomiłem Asusa:

Welcome to emergency mode! 
After login in, type "journalctl -xb" to view system logs
...

Cyt (za https://blog.dsinf.net/): chyba każdy Linuksowiec korzystający z dystrybucji z systemd ujrzał kiedyś taki napis w trakcie rozruchu:

Welcome to emergency mode! 
After login in, type "journalctl -xb" to view system logs, \
  "systemctl reboot" to reboot, 
"systemctl default" to try again to boot in default mode.

Okazuje się, że rozwiązanie problemu może być bardzo proste [...] Jeśli mamy w /etc/fstab na sztywno wpisanego jakiegoś NTFSa [...] Rozwiązanie: na początek w /etc/fstab komentujemy wszystko poza rootfsem, zapisujemy i reboot -- sugerowany systemctl default nie przeładuje systemd od odpowiedniego momentu. Jeśli po restarcie wszystko działa trzeba ręcznie sprawdzić każdy wpis w /etc/fstab i zaktualizować plik...

U mnie o tyle jeszcze bardziej proste, że wystarczyło wsadzić z powrotem kartę. Nb i a propos każdego Linuksowca (ja na przykład używam Linuksa od 20 lat): może już miałem emergency mode, ale tak dawno, że zapomniałem i tylko dzięki google dowiedziałem się co robić...

url | Mon, 18/11/2019 07:47 | tagi:
Aktualizacja systemu do wersji Fedora Core 29

Wreszcie się zdecydowałem na aktualizację fc21 na fc29. Czemu wreszcie? Bo u mnie aktualizacja to zawsze kilkudniowa PITA jest. Coś tam po aktualizacji nie działa i ogólne zamieszanie jest. Ale jak nie teraz to kiedy? Przy okazji to się pochwalę, że moim pierwszym linuksem była fedora w wersji RHL 5, zainstalowana w 1999 roku (albo coś koło tego roku, w Bachotku to na pewno, i na pewno przez Piotra Bolka.) Wychodzi że tym roku będzie rocznica 20 lat używania, tyle że przez pierwsze nie wiem ile lat (kilka) miałem dual boot. Poprzednia Fedora była zainstalowana circa 2015 roku czyli wcale nie aż tak dawno, a jeszcze bardziej poprzednia w 2011 (wersja 11). W sumie to ja tych wersji aż tak dużo nie miałem 5 (redhat), 8, 11, 21 teraz 29. Pewnie jeszcze coś było pomiędzy 5rhl a 8fl, ale co konkretnie to już nie pamiętam.

Tak poza tym to sobie wymyśliłem, że ponieważ mam dwa dyski w NUCu, to zainstaluję nową Fedorę na tym, z którego nie bootuję systemu, więc w razie emergency będę mógł się przełączyć. Nie do końca to działa--stary system się nie bootuje ale na razie nie jest to specjalnie potrzebne. Inny problem to był taki, że NUC po włączeniu w biosie opcji fastboot przestał reagować na F2, tj. niemożliwa była jakakolwiek zmiana ustawień tegoż biosa. Nie miałem pojęcia, że za niemożność przejścia do biosa odpowiada fastboot: Can't Access BIOS Setup with F2 Key for Intel NUC (Fast Boot in BIOS reduces computer boot time. With Fast Boot enabled: You can't press F2 to enter BIOS Setup. USB mice and keyboards are unavailable until after the operating system loads. Disable Fast Boot from the power button menu. Access the power button menu with this sequence: Make sure the system is off, and not in Hibernate or Sleep mode. Press the power button and hold it down for three seconds. Then, release it before the four-second shutdown override. The power button menu displays. Press F3 to disable Fast Boot.)

Powyższe znalazłem jak już problem rozwiązałem. A rozwiązałem go przez przypadek. Jak mi się zasilanie wyłączyło awaryjnie, to NUC zareagowł na f2. Jednym słowem odkryłem nieudokumentowany ficzer NUCa: wyciągnij kabel zasilający z gniazdka, a wtedy f2 też zadziała, mimo opcji fastboot. Sądząc z zawartości google (nuc fast boot enter bios), ta opcja nie tylko jest kłopotliwa dla mnie.

Po bezproblemowej aktualizacji sytemu, wykonałem co następuje:

## Post system update
dnf update
rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-29.noarch.rpm
rpm -ivh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-29.noarch.rpm
dnf -y install grip emacs mc vlc gpsbabel zip unarj 
dnf -y install gimp xsane ffmpeg dia ImageMagick wine
dnf -y install texlive
dnf -y install @xfce-desktop
dnf -y install fuse-sshfs beep geeqie 
dnf -y install mariadb mariadb-server
dnf -y install R
dnf -y install system-config-printer
dnf -y install aspell aspell-pl aspell-de aspell-es aspell-en

## pobrać trzeba google-chrome-stable_current_x86_64.rpm
dnf -y install google-chrome-stable_current_x86_64.rpm
##
wget 'https://download1.rstudio.org/rstudio-1.1.463-x86_64.rpm'
dnf -y install rstudio-1.1.463-x86_64.rpm 
dnf -y install gretl

Dotąd wszystko działa. Do komunikowania się z blogspotem używam skryptu w Pythonie, który wymaga biblioteki oauth2client. Doinstalowałem z rozpędu także biblioteki Perlowe, które pamiętałem że używam (takie jak perl-Geo-Distance na przykład):

 
dnf install perl-Net-Twitter.noarch perl-Test-LWP-UserAgent.noarch \
  perl-Flickr-Upload.noarch perl-Flickr-API perl-Geo-Distance \
  perl-LWP-Protocol-https.noarch perl-Crypt-SSLeay.x86_64 
##
dnf install python2-httplib2.noarch python3-httplib2.noarch
pip install --upgrade oauth2client

Nie instaluję thunderbirda. Nie widzę potrzeb. Będę czytał pocztę w google-chrome.

Instaluję gtk-recordmydesktop

## zawartość mbriza-recordmydesktop-fedora-29.repo  pobrana ze strony
## https://copr.fedorainfracloud.org/coprs/mbriza/  
dnf config-manager --add-repo mbriza-recordmydesktop-fedora-29.repo
dnf install recordmydesktop

Nie działa sprawdzanie słownika pod Emacs. Ale mój .emacs to bagno więc problem trzeba rozwiązać z tej strony. Podejrzewam w szczególności, że aspell nie działa bo używam kodowania iso w przypadku niektórych plików. Byłoby utf to by działał albo należy dokonfigurować aspella. Wybieram docelowo pierwszy wariant, ale na dziś dokonfiguruję emacsa pod iso-88592. Działa.

Kompilowanie i konfigurowanie ydpdic

Używam czegoś takiego jak ydpdic nieistniejącej już YDPoland. W fedorze trzeba w tym celu posłużyć się nakładką W. Kaniewskiego, a tym celu należy:

dnf install autoconf sysconftool automake libtool
dnf install ncurses-devel gettext-devel  gettext-common-devel
# ściągamy libydpdict/ydpdict ze repozytorium na github
# następnie kompilujemy najpierw bibliotekę potem nakładkę
./autogen.sh
./configure
make && make install
# u mnie z jakiś powodów trzeba to robić jako root

Skrypty obsługujące flickr.com

Wysyłanie zdjęć na flickr.com to u mnie bagno, bo używam śmiertelnie splecionych skryptów napisanych lata temu w Emacs Lispie i Perlu. Oczywiście te skrypty wywołują różne zewnętrzne programy. Całość to klasyczny, patologiczny monolit. Skrypt główny to flickr_upld.pl, który wywołuje flickr_xload.pl. Dane autoryzacji są umieszczone w flickr_utils.rc oraz login2flickr.rc. Te ostatnie są dodawane za pomocą require:

require 'flickr_utils.rc';
require 'login2flickr.rc';

Perl szuka plików-argumentów require w katalogach podanych na liście @INC. Standardowo są to różne katalogi systemowe (/usr/cośtam). Nie chcąc mnożyć bytów -- w sensie rozrzucać moich plików konfiguracyjnych po całym systemie -- modyfikuję @INC w pliku .bashrc:

export PERLLIB=$PERLLIB:/home/tomek/bin
export PATH=~/opt/tex/bin:$PATH

Aby flickr_upld.pl zadziałał trzeba zainstalować Flickr::Upload/Flickr::API (to już zrobione, bo o tym pamiętałem). Się okazuje że trzeba doistalować także:

dnf -y perl-Text-Iconv perl-ExtUtils-MakeMaker perl-Test-Number-Delta
perl-Image-ExifTool
## oraz ręcznie zainstalować (bo tego nie ma w rpmach):
Geo::Coordinates::DecimalDegrees

Po tym wszystkich działa. Aha, nowy Emacs zgłosił błąd przy kompilowaniu funkcji:

(defun My-flickr-remove-all-thumbnails
  ;; usunięcie miniaturek ;;
  (shell-command "rm /tmp/*.thmb")
)

Brak (). Winno być nazwa-funkcji(). Staremu Emacsowi pasowało bez nawiasów ale nowemu już nie. Dobrze wiedzieć i dobrze, że błąd dało się łatwo zdiagnozować (Malformed arglist).

TeX

Miła niespodzianka, że domyślną wersją TeXa jest TeXLive 2018 czyli nowszy niż ten którego sam do tej pory używałem. Niemiłą z kolei jest radykalna zmiana w formacie LaTeX: In current LaTeX release (2018 and later) You do not need to load inputenc as UTF-8 encoding, equivalent to \usepackage[utf8]{inputenc}.

Moje pliki kodowane w iso-88592. Muszę się zastanowić co z tym fantem zrobić. Na razie zastosuję rozwiązanie podane w FAQu: \usepackage[latin2]{inputenc}:

%& --translate-file=il2-pl %% usuń w TL2018
\documentclass[a4,portrait]{seminar}
\usepackage[latin2]{inputenc} %% dodaj TL2018
\usepackage[T1]{fontenc} %% dodaj TL2018

Działa.

R

dnf -y install R-reshape R-reshape2
dnf install R-ggplot2
Brak wyników dla parametru: R-ggplot2
Błąd: Brak wyników
## 
install.packages("ggplot2", dependiencies=TRUE)
## błąd
dnf install R-scales
install.packages("ggplot2")
## Teraz działa ale
#> library("ggplot2");
#Komunikat ostrzegawczy:
#W poleceniu 'strsplit(.Internal(Sys.getenv(character(), "")), "=", fixed = TRUE)':
#  niepoprawny łańcuch wejściowy 63 w lokalizacji

Pomimo tego działa, ale zobaczymy co z tego wyjdzie w dłuższej perspektywie, że tak powiem.

Podsumowanie

System generalnie działa jak działał. Mogę się łączyć z neptune/umbrielem za pomocą moich skryptów (sshfs). TeX działa -- będę testował granice kompatybilności TL2018. Skrypty do obsługi flickr.com działają. YDPdic też działa. Wygląda, że wyszedłem na prostą i zostały ewentualne drobiazgi.

url | Mon, 18/02/2019 06:39 | tagi: , , , ,
Instalowanie Debiana Stretch na SheevaPlug

Stretch zainstalowany

Co to jest SheevaPlug? Przodek rapberryPi. Ciągle używam, bo jest niezawodne, a z rapberryPi jest gorzej -- czasami przestaje działać. Rzadko bo rzadko ale się zdarza.)

Ponieważ SheevaPlug (dalej Szewa) jest taka stara to i Debian na niej do nowych nie należy. Sytuacja dojrzała do wymiany. Mam na szczęście rezerwową/testową Szewę, co ułatwia decyzję, bo w razie problemów z aktualizacją nie zostanę z niczym.

Korzystam z tej samej strony co lata temu kiedy zaczynałem z Szewą, tj. Installing Debian on Plug Computers, która opisuje wszystko detalicznie i zawiera wszystko co potrzeba. Procedura jest prosta:

1. Należy uaktualić firmware zwany U-bootem. W tym celu trzeba się połączyć z Szewą kablem miniUSB-USB i uruchomić na PCcie program cu:

cu -s 115200 -l /dev/ttyUSB0

Teraz trzeba włączyć Szewę, a w terminalu PCta należy szybko nacisnąć dowolny klawisz co przerywa normalną sekwencję startu systemu i U-boot przechodzi do trybu interaktywnego zgłaszając się znakiem zachęty. Polecenie:

Marvell>> version

Pokazuje wersję system. Jeżeli w nazwie jest Marvell albo wersja jest stara (przed 2014/10) to należy dokonać aktualizacji. Przed aktualizację należy koniecznie ustalić MAC adres urządzenia Ja miałem przepisany z dokumentacji na obudowie; jak ktoś nie wie jaki ma adres, to może wydać polecenie:

print ethaddr

Teraz pobieramy stosowny firmware i kopiujemy go na (bootowalny) pendrive. Pendrive wsadzamy do Szewy, po czym wydajemy polecenie:

usb start
fatload usb 0:1 0x0800000 u-boot.kwb

Następnie

nand erase 0x0 0x80000
nand write 0x0800000 0x0 0x80000

Restartujemy szewę

reset

Na koniec przywracamy MAC adres

setenv ethaddr 00:50:43:01:c0:ab
saveenv
reset

Uwaga: przy (re)starcie komputer zawiśnie na etapie ładowania systemu, którego jeszcze nie ma...

2. Poniższy opis zakłada instalowanie systemu z karty SDHC (bo tak jest najprościej, skoro system ma potem być z tejże karty uruchamiany). Zatem należy sformatować kartę SDHC jako ext2 (wyłącznie ext2, nie należy używać innych typu ext4, że niby lepsze). Do tego użyłem gparted.

3. Pobieramy instalator składający się z 2 plików (SheevaPlug without eSATA: uImage and uInitrd). Pobrane plik kopiujemy na sformatowaną kartę. Kartę wsadzamy do Szewy, z którą połączymy się kablem miniUSB/USB i programem cu w sposób identyczny jak w przypadku aktualizacji firmware'a), wydajemy polecenie (jeżeli karta jest sformatowana jako vfat to zamiast ext2load ma być fatload):

ext2load mmc 0:1 0x00800000 /uImage
ext2load mmc 0:1 0x01100000 /uInitrd

Uruchamiamy instalator:

setenv bootargs console=ttyS0,115200n8 base-installer/initramfs-tools/driver-policy=most
bootm 0x00800000 0x01100000

Instalacja trochę trwa, ale jest bezproblemowa. Well, był problem bo zapomniałem wpisać następującej sekwencji (When the installation is done, you have to configure u-boot so it will automatically boot Debian. Interrupt the boot process of u-boot and enter the following commands.):

setenv bootargs_console console=ttyS0,115200
setenv bootcmd_mmc 'ext2load mmc 0:1 0x00800000 /uImage; ext2load mmc 0:1 0x01100000 /uInitrd'
setenv bootcmd 'setenv bootargs ${bootargs_console}; run bootcmd_mmc; bootm 0x00800000 0x01100000'
saveenv

Przyznam się bez bicia, że ponieważ pominąłem ten krok i system zawisł beznadziejnie potrzebna była konsultacja aż samego Marina Michlmayra.

Uwaga: 0:1 to nazwa bootowalnej partycji. Może być inna, można to ustalić wpisując (pierwsza wypisana jest bootowalna):

Marvell>> usb dev
Marvell>> usb part 0

Ostatecznie:

run bootcmd

Znowu dałem D... Nie przywracając MAC-adresu, co objawiło się tym że wprawdzie system się bootował ale instalator nie mógł się połączyć z Internetem. Należy czytać dokumentację uważnie i bez pośpiechu cnd.

Z uwagi na to, że projekt Szewa wydaje sie być dead&burried skopiowałem co trzeba lokalnie tutaj, na wypadek gdyby zniknęło w Internecie.

url | Wed, 22/11/2017 08:31 | tagi: , , , ,
Przeniesienie bloga zarządzanego przez WordPress na inny komputer

Problem jest oto taki, że chcę przenieść kopię bloga (oryginał jest/był na serwerze nazwa.pl) na Sheevaplug (taki rodzaj NAS), która byłaby dostępna przez Internet. Pierwszy krok do likwidacji bloga na nazwa.pl, bo drogo BTW.

Na Sheevaplug jest zainstalowany Debian w wersji Stretch i nie ma WordPressa.

Rozpocząłem od pobrania narzędzia wp-cli ze strony wp-cli.org/. Zainstalowałem toto (prawie) w sposób opisany na ww. stronie, tj.:

https://raw.github.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
php wp-cli.phar --info
chmod +x wp-cli.phar
sudo mv wp-cli.phar ~/bin/wp

Heurystycznie ustaliłem, że treść tego konkretnego klonowanego bloga znajduje się bazie mysql (teksty) oraz w katalogu wp-content, w którym to w szczególności są zdjęcia (wp-content/gallery) oraz filmy i chmara jakiś plików .gif (wp-content/wp-uploads). Oprócz tego są jeszcze katalogi themes, upgrade, plugins, ngg oraz languages. Uprzedzając wydarzenia wszystko kopiuję jak leci ze starej instalacji (w obu jest/będzie ta sama wersja WP). Natomiast teksty z bazy eksportuję (do pliku SQL):

 wp db export

Można też to zrobić logując się do URL-BLOGA/wp-admin. Teraz wszystko ściągam korzystając z rsync (/media/WP-SITE/ oraz /media/WPSQL/ to oczywiście przykłady):

rsync -avzP -e "ssh" USER@BLOG:PATH-TO-WP/wp-content/* /media/WPSITE/
rsync -avzP -e "ssh" USER@BLOG:PATH-TO-WP/_sqldump_/* /media/WPSQL/

Zamiast rsync można użyć ftp albo:

scp -r USER@BLOG:path/to/files/

Teraz pobrałem archiwum WP ze strony wordpress.org/download/ i rozpakowałem je (Uwaga: być może można skopiować po prostu całą starą instalację WP na nowy komputer i będzie działać, ale ja tak nie robiłem.):

wget https://wordpress.org/latest.tar.gz
tar -zxvf latest.tar.gz

Za pomocą klienta mysql stworzyłem użytkownika pn. wordpress, który otrzymał stosowne uprawnienia. Utworzyłem następnie bazę pn. wordpress:

  mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
  mysql> CREATE DATABASE wordpress;
  Query OK, 1 row affected (0.00 sec)
 
  mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'user'@'localhost'
  -> IDENTIFIED BY '*password*';
    Query OK, 0 rows affected (0.00 sec)

Następnie wstawiłem stosowne wpisy do wp-config.php

define('DB_NAME', 'wordpress');
define('DB_USER', '**USER**');
define('DB_PASSWORD', '**PASSWORD**');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');

Teraz zaimportowałem treść bloga do bazy:

wp db import kopia-bazy.sql --path='/var/www/html/'

Doczytałem, że trzeba zmienić URLe ze starych na nowe:

wp search-replace 'STARY-URL' 'NOWY-URL' --dry-run

Konkretnie w moim przypadku:

  wp search-replace 'http://nazwabloga.nazwa.pl/' 'http://oberon.pinkaccordions.org/' \
  --path='/var/www/html/' --dry-run
  ## --dry-run nic nie zmienia ale wyświetla raport
  ## jeżeli wszystko jest OK:
    wp search-replace 'http://nazwabloga.nazwa.pl/' 'http://oberon.pinkaccordions.org/' \
     --path='/var/www/html/'

Sprawdzam i nie działa, ale wypisuje, że nie ma jakiegoś theme. No to kopiuję jak leci ze starej instalacji katalogi themes, upgrade, plugins, ngg, languages, o czym już pisałem. Teraz działa.


Jeszcze został problem udostępnienia tego w Interncie poprzez DynDNS. Sprawę komplikuje to, że mam już dwa zarejestrowane serwisy a Tomato wydaje się obsługiwać tylko dwa hosty. Okazuje się wszakże że pole host niekoniecznie musi zawierać pojedynczy wpis, może zawierać listę oddzielonych przecinkami nazw hostów. No to dopisałem następny host z puli, którą mam oraz dopisałem co trzeba w Tomato.

Dodatkowa komplikacja jest taka, że chcę ten sklonowany blog udostępnić na innym komputerze. Konkretnie do tej pory udostępniałem jeden komputer, a teraz będą dwa. Na taką okoliczność oprócz dopisania nazwy hosta do listy trzeba także zmodyfikować wpis w części port forwarding (por. rysunek). Drugi komputer wymaga mianowicie zadeklarowania innego ExPort-u.)

Po tym wszystkim nadal działa:-)

url | Mon, 20/11/2017 11:26 | tagi: , , , ,
Stacja pogodowa WS1080

Zakupiłem używaną (z przeznaczeniem do rejestrowania parametrów pogody w innym miejscu BTW -- nie żebym chciał używać dwie różne stacje na raz w tym samym miejscu). Ponieważ akurat pod ręką był c.h.i.p (aka the world's first 9USD computer), podłączyłem na razie stację do chipa.

chip@chip:~/Crontab$ lsusb 
Bus 002 Device 003: ID 1941:8021 Dream Link WH1080 \
 Weather Station / USB Missile Launcher

root@chip:~# apt-get update 
root@chip:~# apt-get install python-pip
root@chip:~# pip install pywws
...
Successfully installed pywws tzlocal pytz
Cleaning up...
root@chip:~# pywws-hourly -v /home/chip/Logs/weather\
  >> /home/chip/Logs/weather/Hourly.log
cat /home/chip/Logs/weather/Hourly.log
Unknown weather station type. Please edit weather.ini
and set 'ws type' to '1080' or '3080', as appropriate.
Your station is probably a '1080' type.

# wpisać 1080 w weather.ini
# zmienić wpis dotyczący /tmp/weather w weather.ini

root@chip:~/Crontab#  pywws-hourly -v /home/chip/Logs/weather\
 >> /home/chip/Logs/weather/Hourly.log
03:07:00:pywws.Logger:pywws version 16.12.0, build 1367 (e917ba9)
03:07:00:pywws.Logger:Python version 2.7.9 (default, Mar  1 2015, 13:48:22) 
[GCC 4.9.2]
03:07:00:pywws.WeatherStation.CUSBDrive:using pywws.device_libusb1
03:07:02:pywws.DataLogger:Synchronising to weather station
03:09:00:pywws.weather_station:live_data missed
03:09:44:pywws.DataLogger:Fetching data
03:09:45:pywws.Process:Generating summary data
03:09:45:pywws.Calib:Using default calibration

I działa...

url | Mon, 12/06/2017 09:49 | tagi: , , ,
Installing Ubuntu in Asus X205TA

Ubuntu 16.04 @ X205TA

MS Windows broke down making the box unusable (no keybord/mouse/WiFi etc...) and as Google says it is not easy to recover the system on this particular machine I try Ubuntu, which was installed within 30 minutes (including 20 minutes for copying the files)

Sound is not working, but I suppose it is just a problem of installing proper drivers. After intalling the system 21Gb of 30Gb memory is free, while it was only 10Gb left on Windows (due to 10Gb non-removable recovery partition).

Still any doubts which system is better?

url | Fri, 31/03/2017 09:35 | tagi: , , , ,
Instalowanie Ubuntu na Asus X205TA

Ubuntu 16.04 @ X205TA

Popsuł się system. Nie mi tylko Jankowi, który usiłował go naprawiać (w jakimś serwisie). W rezultacie serwisant odtworzył system, który wszelako w zasadzie nie działał (klawiatura, touchpad, dźwięk, wskaźnik baterii i pewnie wiele innych rzeczy nie działały)...

Pisali kiedyś w Internetach, że Linuksa nie da się zainstalować, ale sprawdziłem czy stan rzeczy się nie zmienił. No i się zmienił, jest na przykład działająca wersja Ubuntu, której zainstalowanie zajęło mi 30 minut.

Wszystko działa za wyjątkiem dźwięku. Pewnie dźwięk też działa, potrzeba tylko pogimnastykowania się ze sterownikami. Na razie nie mam czasu...

inferior-systemie (czyli w Windows) z 32Gb dostępnej pamięci, po zainstalowaniu kilku aplikacji zostawało 10Gb wolnego miejsca, ponieważ 10 Gb zajęte było przez recovery partition (której nie dawało się usunąć/przenieść na przykład na pamięć USB bez uszkodzenia systemu--w tym Asusie tak było), podczas gdy w Ubuntu jest do dyspozycji całe 30 Gb, a po zainstalowaniu systemu zostaje aż 21 Gb (dwa razy tyle co w Windows)

Any questions?

PS: dla pewności kopiuję procedurę instalacyjną z podanej wyżej strony

# Write ISO to USB
# Assuming USB flashdrive assigned to /dev/sdb
sgdisk --zap-all /dev/sdb
sgdisk --new=1:0:0 --typecode=1:ef00 /dev/sdb
mkfs.vfat -F32 /dev/sdb1
mount -t vfat /dev/sdb1 /mnt
7z x ubuntu-16.04.2-desktop-amd64-asus-x205ta-4.10-kernel.iso -o/mnt/
umount /mnt

# Installation on X205TA
# BIOS setup
# Make sure the X205TA is off & plug in the USB flash drive
# Start the X205TA and continue to press F2 to get into BIOS.
# Under Advanced tab, USB Configuration -> USB Controller Select set to EHCI
#   otherwise mouse and keyboard will not work
# Under Security tab, Secure Boot menu -> Secure Boot Control set to Disabled.
#   Otherwise, you may get a SECURE BOOT VIOLATION on boot.
# Under Save & Exit tab, Save Changes (NOT Save Chances and Exit)
# Lastly, while still in Save & Exit tab, under Boot Override,
# select the USB flash drive.

PS2: WiFi działało z USB, po zainstalowaniu systemu do pamięci komputera (bo on nie ma dysku) przestało. Jak rozwiązać problem jest na przykład tutaj.

url | Fri, 31/03/2017 09:17 | tagi: , , , ,
Instalowanie skype w Fedora Linux

W zasadzie nie używam ale Elka chciała, w sumie też nie wiadomo po co. Okazało się że działa bezproblemowo, nie licząc problemu polegającego na blokowaniu ekranu logowania komunikatem o rzekomym błędzie nieprawidłowego adresu email (program nie czeka na wpisanie kompletnego emaila, tylko wyświetla okno z tekstem o błędzie i ni-chu-chu pozbyć się tego okna).

Skopiowane z tej strony.

## Doinstalowanie ew. brakujących zależności:
yum install alsa-lib.i686 fontconfig.i686 freetype.i686 \
  glib2.i686 libSM.i686 libXScrnSaver.i686 libXi.i686 \
  libXrandr.i686 libXrender.i686 libXv.i686 libstdc++.i686 \
  pulseaudio-libs.i686 qt.i686 qt-x11.i686 zlib.i686 qtwebkit.i686

## Ściągnięcie skype:
wget --trust-server-names http://www.skype.com/go/getskype-linux-dynamic

mkdir /opt/skype
tar xvf skype-4.3* -C /opt/skype --strip-components=1

## Link skype.desktop ##
ln -s /opt/skype/skype.desktop /usr/share/applications/skype.desktop

## Link icons (copy and paste all rows at once) ##
## Thank you Andrej Podzimek for this code and idea ##
for icon in /opt/skype/icons/*; do
ressuffix="${icon##*_}"
res="${ressuffix%%.*}"
ln -s "$icon" /usr/share/icons/hicolor/"$res"/apps/skype.png
done

## Update gtk icon cache (needed at least Gnome/GTK envorinments) ##
gtk-update-icon-cache /usr/share/icons/hicolor

## Create empty /usr/bin/skype file and set permissions ##
touch /usr/bin/skype
chmod 755 /usr/bin/skype

Teraz należy na przykład stworzyć plik skype w katalogu /usr/local/bin:

#!/bin/sh
export SKYPE_HOME="/opt/skype"
 
$SKYPE_HOME/skype --resources=$SKYPE_HOME $*

I to wszystko.

url | Thu, 22/12/2016 04:52 | tagi: , ,
Czujnik 1-Wire, USB-UART i nanoPi Neo

W ramach testowania nanoPi Neo podłączyłem do niego czujnik 18B20. Tym razem nie za pomocą układu MP00202 (FT232RL/DS2480B) który jest dość drogi (circa 60 PLN), ale wykorzystując USB-UART RS232 PL2303HX (za 4,40 PLN na Allegro + wysyłka.)

Podłączenie czujnika jest banalnie proste, mianowicie: styki oznaczone jako GND oraz +5V (na płytce układu USB-UART) łączy się z odpowiednimi stykami czujnika DS18B20, natomiast styki oznaczone jako RX oraz TX należy ze sobą połączyć a następnie połączyć ze stykiem DATA (środkowym) czujnika DS18B20.

I to wszystko. Korzystając z programu digitemp należy użyć digitemp_DS9097 (FT232RL/DS2480B działało z wariantem digitemp_DS9097U).

Nawiasem mówiąc nanoPi Neo działa tak średnio (wyrażając się oględnie), bo już go musiałem reistalować. Na dokładkę przy czytaniu dużych plików z pendrive'a USB się odłączał a system zgłaszał błędy -- powodem było być może zasilanie (jakiś super-wydajny zasilacz by pomógł/aktywny hub?).

Tak czy siak SheevaPlug działa mi bezawaryjnie a nanoPi Neo nie za bardzo.

url | Tue, 20/12/2016 05:46 | tagi: , , , , , , ,
Nowy ARM: NanoPi Neo

Działałem według opisu ze strony NanoPi NEO, tzn. ściągnąłem plik nanopi-neo-linux-rootfs-core-qte-sd4g-20160804.img.zip (BTW downloads: 1632, czyli jestem hipsterem/trendsetterem!). Rozpakowałem, wsadziłem kartę (micro SDHC 8Gb Toshiba, za +20 PLN BTW) do czytnika kart i za pomocą dd wykonałem obraz systemu:

NeoPo
NeoPi
dmesg
[10869.916710] sd 1:0:0:0: [sdb] 15196160 512-byte logical blocks: (7.78 GB/7.24 GiB)

Czyli karta jest w urządzeniu /dev/sdb. Zatem:

dd bs=4M if=nanopi-neo-linux-rootfs-core-qte-sd4g-20160804.img of=/dev/sdb

Kartę wyjąłem z czytnika, wsadziłem do Neo, urządzenie podłączyłem pod ładowarkę do smartfona i kabel sieciowy RJ45. W instrukcji jest napisane, że po podłączeniu zasilania nastąpi uruchomienie systemu sygnalizowane świeceniem się niebieskiej diody LED. I tak było w istocie: dioda świeci jak nie przymierzając kogut na radiowozie MO. Aby połączyć się z komputerkiem należy teraz wykonać (,,fabryczne'' hasło to fa):

  ssh -l root@192.168.1.123

Adres 192.168.1.123 ustaliłem łącząc się z routerem i oglądając device list (w instrukcji jest inny adres, pod którym urządzenie powinno być podłączone). Teraz:

apt-get update && apt-get upgrade
## dla pewności
apt-get install rsync less vim

Instalowanie mc

apt-get install mc # nie ma

apt-get install software-properties-common
## teraz zadziała

$add-apt-repository ppa:eugenesan/ppa
$ sudo apt-get update
$ sudo apt-get install mc

# dalej kicha 
$ apt-get install mc-data
# jakiś dziwny pakiet bez binarów, rzekomo zastępujący mc
# https://mail.gnome.org/archives/mc/2015-December/msg00020.html
# chyba jest problem z kompilacją na arma

Stay tuned

url | Sun, 30/10/2016 08:57 | tagi: , , , , ,
Asus X205TA

Asus X205TA

Kupiłem to cudo w celu używania na wyjazdach. W domu działam na PCie (bezwiatrakowy Intel NUC, opisany tutaj).

Z tego co piszą w Internetach Linuksa nie da się zainstalować (przed zakupem wydawało mi się, że się da, ale okazuje się, że są tylko jakieś alfa wersje, nie do końca działające). Z 32Gb dostępnej pamięci, 10Gb zajęte jest przez recovery partition, której nie da się usunąć/przenieść na przykład na pamięć USB. Po zainstalowaniu kilku aplikacji zostało 10Gb wolnego miejsca.

Teraz plusy

Na plus tego komputera bez wątpienia należy zaliczyć: 1. waży tylko 0,9kg (1,1kg z ładowarką); 2. potrafi ponad 10 godzin pracować na baterii; 3. jest całkiem szybki i wygodny (klawiatura).

Pewnie airBook byłby lepszy ale nie za 780 PLN no i trochę byłby cięższy (ten airBook).

Problem z pamięcią rozwiązałem (mam nadzieję -- na ile skutecznie, to wyjdzie w praniu) w taki sposób, że kupiłem kartę mikroSD 32Gb z przeznaczeniem na dane. Wsadziłem ją ,,na stałe'' do czytnika po sformatowaniu do NTFS. Gdzieś coś wyczytałem, że Windows10 pozwala na przeniesienie recovery partition, ale ja się boję tego Win10 i zostaję na razie z Win8.1 (być może niesłusznie). Zresztą przy instalowaniu byłem brutalnie zachęcany do zmiany domyślnego Win8.1 na Win10, co tylko pogłębiło moje obawy czy warto...

url | Mon, 22/02/2016 17:44 | tagi: , , , ,
Uploading pictures to Picasaweb with Perl/LWP::UserAgent

Previously described bash script allows for uploading a file to PicasaWeb only. With the following (simplified) Perl script one can upload pictures as well as upload with metadata (title description and tags) or create/list albums:

#!/usr/bin/perl

use strict;

use LWP::UserAgent;
use Getopt::Long;
use File::MimeInfo;
use XML::LibXML;

my $AlbumId ="6170354040646469009";
my $profileID="default";

my $Action = 'u'; ## x| u | c | l (default action is Upload)
my $entryTitle = ''; my $entryDescription = '';
my $entryKeywords = '';
my $ActionUpload =''; my $ActionList = '';
my $ActionCreate = ''; my $ActionXload = '';
my $ImageFile = '';
my $dummyReq='';

GetOptions("xload" => \$ActionXload, "upload" => \$ActionUpload,
  "list" => \$ActionList, "create" => \$ActionCreate,
  "title=s" => \$entryTitle, "description=s" => \$entryDescription,
  "keywords=s" => \$entryKeywords,
  "file=s" => \$ImageFile,
  "album=s" => \$AlbumId, ## UploadFile to Album
) ;

## Determine action:
if ( $ActionUpload ) {$Action = 'u'} elsif ( $ActionList ) { $Action = 'l'}
elsif ( $ActionCreate ) { $Action = 'c'}
elsif ( $ActionXload ) { $Action = 'x'}

OAuth 2.0 authorization is handled with Python script oauth2picasa.py. The script is an adapted/copy-pasted fragment of code borrowd from picasawebsync:

### Authenticate with external script (oauth2picasa.py):
my $ACCESS_TOKEN=`oauth2picasa.py`;
chomp($ACCESS_TOKEN);
print STDERR "*** AccessToken: $ACCESS_TOKEN [AlbumId: $AlbumId]\n";

my $req ; my $blog_entry ;

my $picasawebURL = "https://picasaweb.google.com/data/feed/api/user/$profileID";

if ( $Action eq 'c' ) {## Action: create album
  $req = HTTP::Request->new(POST => $picasawebURL );
  $req->header( 'Content-Type' => 'application/atom+xml' );

  $blog_entry = "<entry xmlns='http://www.w3.org/2005/Atom'
     xmlns:media='http://search.yahoo.com/mrss/'
     xmlns:gphoto='http://schemas.google.com/photos/2007'>"
  . "<title type='text'>$entryTitle</title>"
  . "<summary type='text'>$entryDescription</summary>"
  . "<media:group><media:keywords>$entryKeywords</media:keywords></media:group>"
  . "<category scheme='http://schemas.google.com/g/2005#kind'
     term='http://schemas.google.com/photos/2007#album'></category></entry>";

    $req->content($blog_entry);
} 
elsif ( $Action eq 'l' ) {## Action: list albums
  $req = HTTP::Request->new(GET => $picasawebURL );

} 
elsif ( $Action eq 'u' ) {## Action: Upload 1 photo w/o metadata
  my $mimeType = mimetype($ImageFile);

  ## https://developers.google.com/picasa-web/docs/2.0/developers_guide_protocol
  $req = HTTP::Request->new(POST => "$picasawebURL/albumid/$AlbumId" );
  $req->header( 'Content-Type' => "$mimeType" );
  $req->header( 'Slug' => "$ImageFile" );

  ## http://www.perlmonks.org/?node_id=131584
  open(FILE, $ImageFile);
  $req->content(join('',<FILE>));
  close(FILE);
}

To upload the binary image data along with its metadata, use MIME content type "multipart/related"; send photo metadata in one part of the POST body (Content-Type: application/atom+xml), and binary-encoded image data in another part. This is the preferred approach according to Picasa Web Albums Data API Picasa Web Albums Data API

elsif ( $Action eq 'x' ) {## Action: Upload 1 photo with metadata
  # https://groups.google.com/forum/#!topic/google-picasa-data-api/2qRfP0EIFhk
  my $mimeType = mimetype($ImageFile);

  $req = HTTP::Request->new(POST => "$picasawebURL/albumid/$AlbumId" );
  $req->header( 'Content-Type' => "multipart/related" );

  open(FILE, $ImageFile);
  my $add_photo_metadata = "<entry xmlns='http://www.w3.org/2005/Atom' 
     xmlns:media='http://search.yahoo.com/mrss/'>"
  . "<title type='text'>$entryTitle</title>"
  . "<summary type='text'>$entryDescription</summary>"
  . "<media:group><media:keywords>$entryKeywords</media:keywords></media:group>"
  . "<category scheme='http://schemas.google.com/g/2005#kind' 
     term='http://schemas.google.com/photos/2007#photo'></category></entry>";

  my $add_photo_data = join('',<FILE>); close(FILE);

  ## http://www.perlmonks.org/?node_id=131584
  $req->add_part(HTTP::Message->new(['Content-Type'
      => 'application/atom+xml'], $add_photo_metadata));
  $req->add_part(HTTP::Message->new(['Content-Type'
      => "$mimeType"], $add_photo_data));
}

$req->header( 'Authorization' => "Bearer $ACCESS_TOKEN" );
$req->header( 'GData-Version' => '2' );

## ### ###
my $res ;
my $ua = LWP::UserAgent->new;

$res = $ua->request($req);

if ($res->is_success) {
   my $decoded_response = $res->decoded_content;
   print "*** OK *** $decoded_response\n";
}

Usage:

Upload with metadata

picasaweb.pl -xload -title PICTURE-TITLE -descr DESCRIPTION \
  -keywords 'TAG1,TAG2' -file FILE.jpg -album ALBUMID

Upload w/o metadata:

picasaweb.pl -upload -file FILE.jpg -album 12345

Create album:

picasaweb.pl -create -title ALBUM-TITLE -descr DESCRIPTION \
   -keywords 'TAG1,TAG2'

List album:

picasaweb.pl -list

Source code: picasaweb.pl

url | Thu, 30/07/2015 09:48 | tagi: , , , ,
Mój nowy PCet
Intel NUC/Akasa case
Intel NUC/Obudowa Akasa

Niedawno zdecydowałem się na upgrade i stanęło na Intel NUC, konkretnie model D54250WYKH wyposażony w procesor Core i5-4250U/Haswell (nieobciążony pobiera podobno 6 watów!). Jak wiadomo NUC sprzedawany jest jako tzw. kadłubek/barebone zatem trzeba samodzielnie dokupić i zamontować dysk oraz pamięć RAM. Intel coś tam rekomenduje i jest dostępna na stosownej stronie (URL tej strony można znaleźć w kartonie z NUCem) lista zweryfikowanego sprzętu, ale ja wybrałem coś czego na liście nie było: pamięć 2x Kingston SODIMM PC-1600 DDR3L 4GB CL11 KVR16LS11/4 oraz dysk SSD Samsung 850 EVO (500 Gb) z interfejsem SATA bo taki miałem (domyślnym jest mSATA, z tym że obudowa D54250WYKH jest na tyle duża, że pozwala na instalację dwóch dysków, a system może być uruchamiany z obu).

NUC ma w środku wiatrak i do tego ten wiatrak całkiem wyraźnie słychać -- być może jestem przewrażliwiony bo są też opinie w stylu: jest praktycznie niesłyszalny gdy pracuje. Usiłowałem zmniejszyć prędkość wiatraka poprzez stosowne ustawienia BIOSa (zmiana control mode na manual plus zmniejszenie duty cycle z fabrycznych 40% na 30%, por. Intel NUC DN2820FYKH Bay Trail System Review) i wtedy faktycznie komputer działał ciszej, ale temperatura procesora (pod obciążeniem) potrafiła wzrosnąć do 85 stopni.

Nie po to kupowałem dysk SSD żeby coś mi się tam kręciło -- za następne 300 PLN kupiłem obudowę Akasa Newton X fanless case. Obudowa jest większa od oryginalnej i znacząco cięższa (1,3 kg wg producenta), ale faktycznie pozwala na wyłączenie wiatraka (podczas przekładania płyty do nowej obudowy wiatrak został odkręcony zresztą). Temperatura procesora jaką odnotowałem nigdy nie była wyższa od 55 stopni a zwykle znajduje się w przedziale 35--45 stopni.

Z instalacją Fedory 21 -- bo takiej wersji Linuksa używam, nie było żadnych problemów (z okładnością do błędów Fedory). Aby móc dalej korzystać z wiekowej drukarki HP6P kupiłem na Allegro za całe 9,90 PLN przejściówkę pn. konwerter kabel USB 2.0 wtyk--LPT gniazdo DB25 ponieważ NUC nie posiada gniazda LPT/IEEE 1284. Konwerter zadziałał od pierwszego strzału, co było miłym zaskoczeniem.

Drobny problem wystąpił z równie wiekowym skanerem Canon LIDE 25, który wieszał się po zeskanowaniu jednej strony. Się okazało, że powodem jest błąd w programie XSane/sane-backends w wersji 1.0.24. Rozwiązaniem było ściągnięcie z githuba i skompilowanie wersji 1.0.25.

Recenzji NUCa jest w Internecie multum, np. tutaj.

url | Tue, 23/06/2015 20:41 | tagi: , ,
Wysyłanie plików na Picasaweb za pomocą Curla

Taki oto (uproszczony) skrypt basha używałem do niedawna do wysyłania plików na konto Picasaweb (por. Using cURL to interact with Google Data services oraz PicasaUploader):

USERNAME=SomeUsername # GoogleAccountUsername
PASSWORD=SomePasswd # GoogleAccountPasswd
ALBUM_ID=6008849823888405298 # ID of picasaweb album

MY_PIC="$1" ## filename of the picture to upload ##
PIC_TITLE=`basename $MY_PIC` # filename w/o extension
PIC_TYPE=`file -b --mime-type "$MY_PIC"`

AUTH_KEY=$( curl -s https://www.google.com/accounts/ClientLogin -d Email="$USERNAME"@gmail.com \
  -d Passwd="$PASSWORD" -d accountType=GOOGLE \
  -d source=Google-cURL-Example -d service=lh2 | awk -F\= '/^Auth=/{print $2}' )
ALBUM_XML="http://picasaweb.google.com/data/feed/api/user/$USER_ID/albumid/$ALBUM_ID?authkey=$AUTH_KEY"

URL=`curl -s --request POST --data-binary "@$MY_PIC" --header "Slug: $PIC_TITLE" \
 --header "Content-Type: $PIC_TYPE" \
 --header "Authorization: GoogleLogin auth=$AUTH_KEY" "$ALBUM_XML" | \
sed 's/.*media:content url='"'"'\([^'"'"']*\).*media:thumbnail url='"'"'\([^'"'"']*\).*/\1/'`

Zmienna URL zawiera url wysłanego na Picasaweb obrazka (otrzymany przez zaaplikowanie w potoku odpowiedniego skryptu seda).

Skrypt przestał działać ostatnio, ponieważ Google nie obsługuje już protokołu OAuth 1.0 (por. Google Identity Platform). Na szczęście w łatwy sposób możliwe było dopasowanie skryptu nowszego protokołu OAuth 2.0:

ACCESS_TOKEN=$(oauth2picasa.py) ## Acces token is managed with Python's script now
## Note that ALBUM_XML URL starts now from https:// now
ALBUM_XML="https://picasaweb.google.com/data/feed/api/user/$USER_ID/albumid/$ALBUM_ID"

URL=`curl -s --request POST --data-binary "@$MY_PIC" \
--header "GData-Version: 2" --header "Slug: $PIC_TITLE" \
--header "Content-Type: $PIC_TYPE" -H "Authorization: Bearer $ACCESS_TOKEN" $ALBUM_XML |  \
sed 's/.*media:content url='"'"'\([^'"'"']*\).*media:thumbnail url='"'"'\([^'"'"']*\).*/\1/'`

Uwaga: Autoryzację OAuth 2.0 obsługuje Pythonowy skrypt oauth2picasa.py. Skrypt jest (zapożyczonym) fragmentem z projektu picasawebsync:

#!/usr/bin/python

import os
import time
import httplib2
## https://github.com/google/oauth2client
## installed with pip install --upgrade oauth2client (or some other way)
from oauth2client import client

def oauthLogin():
        # using http://stackoverflow.com/questions/20248555/list-of-spreadsheets-gdata-oauth2/29157967#29157967
        from oauth2client.file import Storage

        filename = os.path.join(os.path.expanduser('~'), ".picasawebsync")
        client_secrets = os.path.join(os.path.expanduser('~'), ".config", "picasawebsync.json")

	storage = Storage(filename)
        credentials = storage.get()
        if credentials is None or credentials.invalid:  
	        flow = client.flow_from_clientsecrets(client_secrets,
		       scope='https://picasaweb.google.com/data/',
		       redirect_uri='urn:ietf:wg:oauth:2.0:oob')     
                auth_uri = flow.step1_get_authorize_url()       
                print 'Authorization URL: %s' % auth_uri
                auth_code = raw_input('Enter the auth code: ')
                credentials = flow.step2_exchange(auth_code)
                storage.put(credentials)
        if credentials.access_token_expired:
                credentials.refresh(httplib2.Http())
                
        return credentials.access_token

# start of the program

gd_client = oauthLogin()

print '%s' % gd_client

Jak stworzyć OAuth 2.0 client ID opisano tutaj. Należy wybrać Client ID for native application. Następnie należy pobrać plik JSON, zmienić nazwę tego pliku na picasawebsync.json umieszczając go w katalogu .config swojego katalogu domowego (albo zmodyfikować skrypt, jeżeli plik ma być w innym miejscu).

Uruchomiony po raz pierwszy skrypt oauth2picasa.py wypisuje URL, który należy skopiować/wkleić do przeglądarki, celem uzyskania authcode. Pobrany authcode wklejamy w odpowiedzi na prompt Enter the auth code:.

Opisane skrypty są tutaj: picasa_upld.sh oraz oauth2picasa.py.

url | Tue, 23/06/2015 16:06 | tagi: , , , ,
Uploading pictures to Picasaweb with Curl

My (simplified) old bash script for uploading images to Picasaweb (cf. Using cURL to interact with Google Data services and PicasaUploader):

USERNAME=SomeUsername # GoogleAccountUsername
PASSWORD=SomePasswd # GoogleAccountPasswd
ALBUM_ID=6008849823888405298 # ID of picasaweb album

MY_PIC="$1" ## filename of the picture to upload ##
PIC_TITLE=`basename $MY_PIC` # filename w/o extension
PIC_TYPE=`file -b --mime-type "$MY_PIC"`

AUTH_KEY=$( curl -s https://www.google.com/accounts/ClientLogin -d Email="$USERNAME"@gmail.com \
  -d Passwd="$PASSWORD" -d accountType=GOOGLE \
  -d source=Google-cURL-Example -d service=lh2 | awk -F\= '/^Auth=/{print $2}' )
ALBUM_XML="http://picasaweb.google.com/data/feed/api/user/$USER_ID/albumid/$ALBUM_ID?authkey=$AUTH_KEY"

URL=`curl -s --request POST --data-binary "@$MY_PIC" --header "Slug: $PIC_TITLE" \
 --header "Content-Type: $PIC_TYPE" \
 --header "Authorization: GoogleLogin auth=$AUTH_KEY" "$ALBUM_XML" | \
sed 's/.*media:content url='"'"'\([^'"'"']*\).*media:thumbnail url='"'"'\([^'"'"']*\).*/\1/'`

URL contains url of uploaded picture (obtained with piping curl's output via sed).

This script stoped working recently as Google no longer supports OAuth 1.0 (cf. Google Identity Platform). Fortunately it was pretty easy to modify it to support OAuth 2.0:

ACCESS_TOKEN=$(oauth2picasa.py) ## Acces token is managed with Python's script now
## Note that ALBUM_XML URL starts now from https:// now
ALBUM_XML="https://picasaweb.google.com/data/feed/api/user/$USER_ID/albumid/$ALBUM_ID"

URL=`curl -s --request POST --data-binary "@$MY_PIC" \
--header "GData-Version: 2" --header "Slug: $PIC_TITLE" \
--header "Content-Type: $PIC_TYPE" -H "Authorization: Bearer $ACCESS_TOKEN" $ALBUM_XML |  \
sed 's/.*media:content url='"'"'\([^'"'"']*\).*media:thumbnail url='"'"'\([^'"'"']*\).*/\1/'`

NOTE: OAuth 2.0 authorization is handled with tiny Python script oauth2picasa.py. The script is an adapted/copy-pasted fragment of code borrowd from picasawebsync:

#!/usr/bin/python

import os
import time
import httplib2
## https://github.com/google/oauth2client
## installed with pip install --upgrade oauth2client (or some other way)
from oauth2client import client

def oauthLogin():
        # using http://stackoverflow.com/questions/20248555/list-of-spreadsheets-gdata-oauth2/29157967#29157967
        from oauth2client.file import Storage

        filename = os.path.join(os.path.expanduser('~'), ".picasawebsync")
        client_secrets = os.path.join(os.path.expanduser('~'), ".config", "picasawebsync.json")

	storage = Storage(filename)
        credentials = storage.get()
        if credentials is None or credentials.invalid:  
	        flow = client.flow_from_clientsecrets(client_secrets,
		       scope='https://picasaweb.google.com/data/',
		       redirect_uri='urn:ietf:wg:oauth:2.0:oob')     
                auth_uri = flow.step1_get_authorize_url()       
                print 'Authorization URL: %s' % auth_uri
                auth_code = raw_input('Enter the auth code: ')
                credentials = flow.step2_exchange(auth_code)
                storage.put(credentials)
        if credentials.access_token_expired:
                credentials.refresh(httplib2.Http())
                
        return credentials.access_token

# start of the program

gd_client = oauthLogin()

print '%s' % gd_client

How to create an OAuth 2.0 client ID in the Google Developers Console is described here. Choose Client ID for native application. Next download JSON file, rename it to picasawebsync.json and move it to .config directory in your HOME directory (or modify the script).

First time used oauth2picasa.py prompts to sign on to google and paste the link back to authenticate.

Source code: picasa_upld.sh and oauth2picasa.py.

url | Mon, 22/06/2015 11:40 | tagi: , , , , ,
My old Canon LIDE 25 scanner works only once

My old Canon CanoScan LIDE 25 scanner is not working properly with my new hardware (Intel NUC) and Fedora 21.

I suspected Fedora 21 bug, but the problem is with the hardware, exactly as describe here. Works once and got stuck when scanning next.

It is claimed problem is solved in version 1.025 of Sane. To compile Sane one has to install libusb-devel package first:

yum install libusb-devel

Then:

git clone git://git.debian.org/sane/sane-backends.git
cd sane-backends

# I would like to install whole stuff in /usr/local
# without removing original fedora package
./configure --prefix=/usr/local --sysconfdir=/usr/local/etc \
    --localstatedir=/var BACKENDS=plustek
make
make install

Sane works now.

I would like to avoid mixing original Sane files with the new ones, so I use --prefix and --sysconfdir options with appropriate values. New Sane will be installed in /usr/local and it will be run by default--no need to remove original Fedora packages.

url | Thu, 28/05/2015 08:33 | tagi: , , ,
Cron i ostatni dzień miesiąca

Wprawdzie nie wiadomo który dzień jest ostatnim w miesiącu, ale na pewno po nim będzie dzień z numerem 1. Numer dnia, który będzie jutro można zaś ustalić wykorzystując date:

$ date +%d -d tomorrow
$ 19

W dniach 28--31, o godzinie 23:55 sprawdź czy następny dzień ma numer jeden. Jeżeli tak, wykonaj SKRYPT.sh:

55 23 28-31 * * [ "$(date +%d -d tomorrow)" = "01" ] && SKRYPT.sh

url | Mon, 19/01/2015 17:25 | tagi: ,
Lista argumentów za długa

Ponieważ w przeciwieństwie do MSW w Linuksie długość wiersza poleceń jest absurdalnie duża zapomniałem, że jednak jest skończona:

system ("perl", "clickshop-delete.pl", "-items", join (',', @AllItems)) 

Program clickshop-delete.pl nie jest wykonywany. Żeby ustalić czemu dodaję:

system ("perl", "clickshop-delete.pl", "-items", join (',', @AllItems)) \
== 0 or warn "system failed: $? [$!]\n";

Teraz wiadomo czemu nie działa:

system failed: -1 [Lista argumentów za długa]

Poniższe ustala jak długi może być wiersz poleceń (Debian Lenny na Sheevaplug/ARM):

tomek@neptune:~$ getconf ARG_MAX
131072

Prosty sposób na zmodyfikowanie skryptu z wykorzystaniem splice:

my $max2process=6000; # każdy element @AllItems ma 12 znaków, więc 6000 jest OK
while ( my @items2process = splice @AllItems, 0, $max2process ) {
      system ("perl", "clickshop-delete.pl", "-items", join (',', @items2process)) == \
        0 or warn "system failed: $? [$!]\n";
   }

Powinno działać.

url | Thu, 12/06/2014 20:36 | tagi: ,
Ethernet connection drop on Raspberry Pi

From time to time internet connection to my Raspberry Pi disappears (AFAIK it is well known feature of Pi). Removing and reconnecting the ethernet cables did not work, so one has to reboot by pulling the plug (risking to corrupt file systems from improper shutdown).

To reconnect I use the following bash script (found here):

#!/bin/bash
# Check if Internet connection is still alive *** 
# Insert into crontab at *.16
LOGLOG="/home/pi/Logs/Cron/Reboot.log"
WLAN=eth0

if /sbin/ifconfig $WLAN | grep -q "inet addr:" ; then
  echo "Network connection up!"
else
  echo "Attempting reconnect [`date +%Y%m%d%H%M`]" >> $LOGLOG
  /usr/bin/sudo /sbin/ifup --force $WLAN
fi

Note: use ifconfig -a to identify relevant interface (WLAN):

pi@raspberryberrystar ~ $ ifconfig -a ifconfig -a
eth0      Link encap:Ethernet  HWaddr b8:27:eb:f5:9a:d7  
          inet addr:192.168.1.146  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

My other Pi is connected to internet not through a cable but with WiFi dongle. The relevant interface is:

pi@blackberrystar ~ $ ifconfig -a
wlan2     Link encap:Ethernet  HWaddr 10:fe:ed:12:ef:2c  
          inet addr:192.168.1.144  Bcast:192.168.1.255  Mask:255.255.255.0

The connection is checked every 20 minutes with the following crontab entry:

## Check Internet connection every 7th, 27th, 47th minute:
7,27,47 * * * * /home/pi/bin/chk_www_alive.sh > /dev/null 2>&1

url | Sun, 09/02/2014 17:38 | tagi: , , ,