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.
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ć.
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.)
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 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ć...
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.
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
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).
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.
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.
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.
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.
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:-)
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...
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?
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...
W 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.
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.
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.
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:
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
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...
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
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.
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
.
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
.
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.
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
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ć.
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