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
.