Показ дописів із міткою bash. Показати всі дописи
Показ дописів із міткою bash. Показати всі дописи

одним рядком

написав собі функцію для «розрізання» текстового рядка на слова.

split_parameters () {
($DEBUG) && printf "Received: «%s»\n" "$PARAM_STRING"
($DEBUG) && printf "Start parsing parameters string...\n"
  # Parameters string is not empty, contains
  #   at least one character
  local TOKEN=""
  local CHAR=""
  local i=0
  # Split the raw parameters string into array
  while [[ i -lt "${#PARAM_STRING}" ]] ; do
    local CHAR="${PARAM_STRING:$i:1}"
($DEBUG) && printf "  Reading %s: «%s» (current token: «%s», string=%s)\n" $i "$CHAR" "$TOKEN" "$STRING"
    case "$CHAR" in
      " " )
        PARAM_ARRAY+=("$TOKEN")
        TOKEN=""
        CHAR=""
      ;;
      * )
        # Any other character just goes to the current token
        TOKEN="$TOKEN$CHAR"
        CHAR=""
      ;;
    esac
    i=$( expr $i + 1 )
  done
  # Do not forget that token still contains last parameter
  PARAM_ARRAY+=("$TOKEN")
($DEBUG) && printf "Finished parsing. Checking array...\n"
  # Process the parametrs array to set options and read value
  for (( i=0; i <= $(expr ${#PARAM_ARRAY[@]} - 1 ) ; i++ )) ; do
    printf "  Element %s: «%s»\n" $i "${PARAM_ARRAY[i]}"
  done
}

вельми задоволений собою. але те саме робиться одним рядком:

IFS=', ' read -r -a PARAM_ARRAY <<< "$PARAM_STRING"

насправді, звісно, не все так просто. я знав про рішення з read, але сподівався навчитися зберігати фрагменти між лапками ("…") вкупі, в одному елементі масиву. не вийшло — бо оболонка прибирає ті рядки ще на етапі передачі параметрів скрипту, як я зрозумів.

тому повернувся до простішого one-liner'а.

p.s. вподобав собі розставляти чекпоінти для зневадження, згодом DEBUG=true вельми спрощує життя, якщо коли щось іде не так:

($DEBUG) && printf "…\n"

gauge

— петько́, прилади?!
— триста!
— що «триста»?
— а що «прилади»?
(бородатий анекдот)

після налаштування отого монітора процесора на іскрах мені дуже захотілося змайструвати ще кілька моніторів — пам'яті, дискового простору

тож закатав рукава і попрацював трохи на bash'тані.

результат на скрінкасті (чи то пак на відеознятку). це мій gauge — універсальний псевдографічний візуалізатор відсотків для командного рядка на bash. він приймає як параметр число, і малює горизонтальний або вертикальний індикатор. додатковими параметрами можна наказати йому малювати рамки чи ні, домальовувати числове значення з різними розмірностями тощо.

динамічні індикатори на скрінкасті — то тестові скрипти, що в циклі викликають gauge.

одна біда: десь я нахімічив, і скрипт глючить, якщо параметри передавати не явно, а запомповувати в stdin, приміром так:

echo 45 | gauge

але я знайду причину, і тоді ніщо не спинить мене наклепати різних індикаторів до системної панельки.

монітор процесора на іскрах

індикатор завантаження процесора на скріншоті — текстова псевдографіка. вивід зліплено з пари простеньких bash-скриптів та вбудованої функції виводу панелі tint2 (так, я знову на openbox'і).

найцікавіший з двох скриптів — генератор спарклайнів spark, що я його колись давно випадово надибав на github'і та трохи підправив для своїх потреб.

оті «спарклайни» — цікавинка, я не стрічав раніше цієї назви. англійська вікіпедія про них знає, українська — поки що ні. і конче треба вигадати якусь українську назву для них.

другий скрипт, для розрахунку навантаження на процесор, я запозичив на rosetta code і теж досить сильно похакав.

p.s. скрінкаст (ще один претендент на цікавий новотвір) записано за допомогою вельми приємної невеличкої софтинки peek для linux.

ноутбук в режимі планшета

припустімо, у вас є сучасний ноутбук-трансформер з сенсорним дисплеєм, і на ньому linux, і це не ubuntu… тоді є висока ймовірність, що…
  • серсорний екран працює в примітивному режимі (без мультитача і жестів на кшалт скролу двома пучками);
  • після складання в планшет клавіатура і тачпад не працюють;
  • екранної клавіатури немає «з коробки»;
  • нема як швидко повернути зображення на екрані в портретну орієнтацію та назад;
  • автоматичний поворот зображення не працює.
і так, ubuntu не пропонувати (так само як встановлення kde/plasma, якщо там все це працює з коробки).

поки що не все з цього пофіксив, але дещо знайшов.

екранна клавіатура

поки що користуюсь onboard, але без зручностей, до яких звикаєш на мудрофоні: скажімо, відкривати клавіатуру доводиться руками з системного меню (хоча onboard має опцію автоматичного вигульку, але вона не працює без модуля gnome, який в мене не вставновлений і поки що не потрібен.

увімкнення клавіатури і тачпада

клавіатура і тачпад автоматично відключаються, якщо скласти транформера в планшетний режим, як і має бути — але залишаються заблоковані після зворотньої трансформації. знайшов невеликого скрипта (на жаль, вже забув, де… пригадав!), що відновлює роботу, але поки що не дійшли руки розібратися, як запускати його автоматично під час зміни конфігурації:

#!/bin/sh
[ "root" != "$USER" ] && exec sudo $0 "$@"
lsmod | grep '^[^ ]*hid' | cut -f1 -d " " | xargs -n1 rmmod
udevadm trigger
sleep 1
xinput|grep SYN1B|cut -f2 -d"="|cut -f1|xargs -n1 xinput --enable

скрипт потребує рутових прав для роботи, довелося трохи поморочитися із sudoers'ами, аби дозволити виконання з користувацького профіля.

поворот зображення

для повороту знайшов інший простий скрипт. довелося трохи змінити один рядок, бо в мене xrandr не позначає поточний екран як primary:

XDISPLAY=`xrandr --current | grep " connected" | sed -e 's/ .*//g'`

так, в лапках є пробіл перед connected, інакше, природньо, grep видає також рядки з disconnected. запускається з параметром normal / left / right / inverted для встановлення відповідної орієнтації, рута не потребує.

додав у системне меню та «повісив» на клавіатуру (super+стрілки), працює але хочеться колись прив'язати до акселерометра, тож ще гуглитиму.

далі буде.

цікава стаття про форматування sd

надибав дуже цікаву статтю в тенетах, яку обов’язково треба колись вивчити уважніше, ніж я можу собі дозволити зараз:
окрім детального огляду логічної побудови флеш-пам’яті та особливостей запису інформації, стаття містить код bash-скрипта для форматування карток sd з вирівнюванням сторінок. треба вчитатися.

bash та python в тенетах

за прикладом двох попередніх збірок посилань, котрі допомагають мені вивчати французьку та шведську мови, зберу тут найцікавіше для самостійного вивчення скриптування в bash та програмування на python. а ну як колись стане по-справжньому в пригоді. зрозуміло, що ресурсів у цій галузі надзвичайно багато, — але я відберу лише найцікавіше.

bash

  • серія посібників на tldp.org:
    • посібник bash programming - introduction how-to. mike g для чайників (tldp.org)
    • посібник bash guide for beginners. machtelt garrels для початківців (tldp.org)
    • посібник advanced bash-scripting guide. mendel cooper для більш досвічених користувачів (tldp.org
  • посібник the bash guide. maarten billemont aka lhunat (guide.bash.academy)

python

програмування

  • курс основи програмування cs50 гарвардського університету, перекладений українською (prometheus.org.ua)
  • книжка the art of unix programming. eric steven raymond (catb.org)

скрипт quaketerm: проблема xy

поміняв два рядки у скриптику для «квейкізації» терміналу — вирішив остаточно проблему з фокусом вікна. щоправда…

…спершу довелося усвідомити, що пошук способу керувати фокусом був типовим випадком «проблеми XY»: коли програміст перестає бачити суть задачі, замість цього борячись із проблемами свого уявлення про її вирішення, чи якось так.

зненацька усвідомив, що зовсім не обов'язково робити shade, below для вікна терміналу! — все одно повна аналогія з терміналом quake не працює через брак візуалізації розгортання вікна згори донизу. а коли так — достатньо мінімізувати вікно, і фокус автоматично повертається до попереднього вікна в стеку.

все, задачу вирішено.

щоправда, довелося скористатися xdotool, бо wmctrl наразі не вміє мінімізувати вікна. тепер міркую, що треба було би взагалі весь скрипт переписати під xdotool.

bash прочищає мізки

складаю «правильний» скрипт для перевіки нової пошти на gmail просто в командному рядку. правильний в тому сенсі, що не одним рядком на колінці (таке нескладно нагуглити), а з перевірками на дурня, акуратним кодом тощо.

не стільки той gmail потрібен, як добре прочищає мізки і дозволяє повправлятися в bash'уванні.

що вже працює:
  • основа коду з читанням логіну (параметр командного рядка) та пароля (щоби не зберігати в скрипті);
  • завантаження фіду gmail з діагностикою помилок зʼєднання/автентифікації;
  • відображення кількости непрочитаних.
доробити в першій робочій версії:
  • детальний розбір фіду та відображення відправника, теми та часу останніх N непрочитаних.
ідеї на потім:
  • параметри командного рядка для відображення лише кількости непрочитаних чи детального переліку повідомлень;
  • (можливо) тимчасове зберігання захешованого пароля, щоби не вводити щоразу в одній сесії?
  • поновлено (2016-03-29): двоетапна автентифікація gmail?
можливо, ще щось вигадається.

генератор корпоративної маячні

хай йому грець! на оцій коротенькій команді можна залипнути надовго:

curl -s http://cbsg.sourceforge.net/cgi-bin/live | grep -Eo '^<li>.*</li>' | sed s,\</\\?li\>,,g | shuf -n 1

ще не знаю, куди його прикрутити, але руки чешуться =)

вдосконалений скрипт quaketerm

мав трохи часу та натхнення вдосконалити той простий скрипт для квейкізації терміналу:
  • розміри терміналу тепер у % від стільниці з автоматичним центруванням;
  • скрипт автоматично визначає розміри стільниці;
  • значно акуратніший код.
на жаль, поки що не подужав виправити головний недолік: ховаючись, термінал не віддає фокус іншому вікну — поки що не знаю, як це зробити.

як ще можна вдосконалити? може, додати можливість вибрати емулятор терміналу, а якщо вибраний не встановлено — запускати заданий в $term?

кому треба — скрипт під катом.

поновлення (2016-03-27). поборов проблему з фокусом за допомогою xdotool, під катом оновлений код.

поновлення (2016-03-28). ні, не поборов: запускаю нову версію через alt+f2 (gmrun) — працює, але «вішаю» на хоткей openbox — не працює =/

quaketerm і brocket — прості bash’ики

днями відкрив для себе два хаки, і тепер навіть не уявляю, як користувався ноутбуком без них раніше:
  • terminator в режимі quake;
  • brocket.
прості скрипти справді роблять комп'ютер зручнішим.

    terminator в режимі quake

    спершу був термінал quake, потім та ж красива ідея дала yakuake, tilda і guake. але я давно користуюся terminator'ом, звик до нього. простенький bash-скрипт дозволяє перетворити будь-який термінал на pull-down у стилі quake:
    #!/bin/sh
    TerminalName="Quaketerminal"
    TerminalX=183
    TerminalY=0
    TerminalW=1000
    TerminalH=500
    # Check if Terminator window exists
    # and launch terminator if it doesn't
    wmctrl -l | grep ${TerminalName}
    if [ $? -ne 0 ]; then
      terminator --title=${TerminalName} --geometry=${TerminalW}x${TerminalH}+${TerminalX}+${TerminalY} &
    fi
    # Unshade and bring to front
    if [ -f $HOME/.quaketerm.shaded ]; then
      wmctrl -F -R ${TerminalName}
      wmctrl -F -r ${TerminalName} -b remove,below
      wmctrl -F -r ${TerminalName} -b remove,shaded
      rm $HOME/.quaketerm.shaded
    # Shade and send to back
    else
      wmctrl -F -r ${TerminalName} -b add,shaded
      wmctrl -F -r ${TerminalName} -b add,below
      touch $HOME/.quaketerm.shaded
    fi
    exit 0

    чернетку скрипта знайшов у тенетах, трохи вдосконалив для себе. я назвав скрипт quaketerm, кинув до $HOME/bin і «причепив» на win-t. працює як годинник. хоча код кривуватий і потребує ще допилювання:
    • задавати ширину терміналу в % від екрану і центрувати автоматично;
    • знайти спосіб повертати фокус до попереднього вікна, ховаючи термінал.

    brocket

    ще одна цікава знахідка, якої мені давно бракувало, але я цього не усвідомлював: скрипт, котрий перевіряє, чи запущена вже програма, і якщо так — переключає фокус на неї, а якщо ні — запускає (і опційно перекидає на поточну стільницю, або ж переходить на ту, де програму відкрито).

    тепер достатньо на win-f (або win-w) «повісити» таке:

    brocket -c firefox

    і більше ніколи не плутатися в кількох копіях вогнелиса на різних стільницях: лише одне активно вікно, всі вкладки в ньому. те саме для файлового менеджера, текстового редактора тощо.

    підказка: скрипти bash без sed/cut/awk

    в розділі tips, tricks and scripts англомовного форуму crunchbang знайшов цю підказку за авторством imbecil: як уникнути використання (чудових!) утиліт sed, cut і awk для нескладної обробки текстових рядків у bash-скриптах. стаття досить детально викладена, з прикладами — тож вирішив перекласти повністю і зберегти тут собі на згадку.

    може ще комусь стане в пригоді? тоді не полінуйтеся, будь ласка, зареєструватися на форумі й подякувати авторові =)

    1. вступ
    2. приклади
      2.1. спосіб «sed+cut»
      2.2. спосіб «лише bash»
    3. швидкодія
      3.1. тестовий скрипт
      3.2. результати тестування швидкодії
    4. заключне слово

    1. вступ

    що?

    чимало скриптів bash часто потребують інформації з текстових змінних (або з виводу команд), приміром:

    variable="   якийсь текст XXXX-YYYY-ZZ 0xab2345 траляля"
    #         ^^^ зауважте пробіли на початку текстового рядка


    потребуючи й сам такого і шукаючи рецептів у тенетах, я помітив, що більшість пропонованих рішень використовують утиліти sed, cut та/або awk в різних комбінаціях. найчастіше текстовий рядок спрощують за допомогою sed, і згодом «вирізають» потрібну частину рядка за допомогою cut чи awk.

    чому?

    будучи впертим (уникаю використання python/ruby/perl) пуристом (навіщо викликати сторонні утиліти на кшалт sed у випадках, коли bash і сам достатньо потужний), я натрапив на згадку про «дивовижну кількість команд для операцій з текстовими рядками» та «масиви», інтегровані у bash, і відкрив для себе, що чимало операцій можна запрограмувати за допомогою цих команд замість вдаватися до запуску sed, cut і awk. а оскільки більшість пошукових запитів у google приводять саме на рецепти з sed/cut/awk, мені видалося непоганою ідеєю порекламувати інтегровані команди bash за допомогою кількох прикладів.

    як?

    робиться це навдивовижу просто, і, на мою гадку, семантично елегантніше в порівнянні до рецептів з sed, cut і awk. є певні недоліки, зокрема деякі однорядні команди (one-liners) неможливо зконструювати в силу особливостей роботи команд bash. для обробки тексту і масивів, проте загальне враження таке, що використання інтегрованих команд bash робить скрипти більш зрозумілими для читання.

    далі йтимуть декілька прикладів…

    2. приклади

    гаразд, ось дуже простий приклад. я хочу витягти кожне чотирицифрове число в окрему змінну рядка на кшалт такого:

    1680x1050+2880+23


    звісно, неважко впізнати звичний рядок з «геометрією» дисплея, такі видає команда xrandr.

    2.1 спосіб «sed+cut»

    ось простий скрипт, щоби зробити це за допомогою sed:

    # приклад SED
    # задаймо текстовий рядок
    xrandroutput="1680x1050+2880+23"

    # визначмо символ табуляції TAB ('\t')
    # знадобиться для sed та cut
    TAB=$(echo -e "\t")

    # замінімо «x» на тауляцію '\t'
    array=`echo "$xrandroutput" | sed "s/x/$TAB/"`

    # замінімо «+» на табуляцію '\t'
    array=`echo -e "$array" | sed "s/+/$TAB/g"`

    # збережімо потрібні значення
    H=`echo -e "$array" | cut -f 1`
    W=`echo -e "$array" | cut -f 2`
    X=`echo -e "$array" | cut -f 3`
    Y=`echo -e "$array" | cut -f 4`


    гакери скрикнуть: «навіщо sed двічі?!» — і матимуть рацію, скрипт можна трошки скоротити:


    # приклад SED
    # задаймо текстовий рядок
    xrandroutput="1680x1050+2880+23"

    # визначмо символ табуляції TAB ('\t')
    # знадобиться для sed та cut
    TAB=$(echo -e "\t")

    # замінімо «x» і «+» на тауляцію '\t'
    array=`echo "$xrandroutput" | sed "s/[x+]/$TAB/g"`

    # збережімо потрібні значення
    H=`echo -e "$array" | cut -f 1`
    W=`echo -e "$array" | cut -f 2`
    X=`echo -e "$array" | cut -f 3`
    Y=`echo -e "$array" | cut -f 4`


    десь так… принаймні такі приклади я стрічав зазвичай. мабуть, це можна ще трохи оптимізувати, але суть не зміниться.

    2.2 спосіб «лише bash»

    а тепер обіцяний приклад використання лише інтегрованих команд bash:

    # приклад ARRAY
    # задаймо текстовий рядок
    xrandroutput="1680x1050+2880+23"

    # замінімо всі «x» на пробіли « », скориставшись
    # потужною інтегрованою в bash командою заміни
    # тексту за шаблоном:
    # ${string//substring/replacement},
    # і збережімо результат до змінної «array»
    # (поки що це не масив)
    array=${xrandroutput//x/" "} # результат: "1680 1050+2880+23"

    # замінімо всі «+» на пробіли « » і збережімо
    # результат тепер як масив у змінній «array»,
    # використавши дужки «(» і «)»
    # заувага: дужки приймають пробіл як роздільник
    # і таким чином створюють масив значень
    array=( ${array//+/" "} ) # результат: ( "1680" "1050" "2880" "23" )

    # надрукуймо результат
    echo "array[0] = ${array[0]}"
    echo "array[1] = ${array[1]}"
    echo "array[2] = ${array[2]}"
    echo "array[3] = ${array[3]}"


    звісно ж дві команди заміни можна об’єднати в одну:

    # приклад ARRAY-SINGLE
    ...
    # замінімо всі «x> і «+» на пробіли « »
    # і збережімо результат в масив з назвою «array»
    array=( ${xrandroutput//[x+]/" "} )
    ...


    ну хіба ж не простіше і зрозуміліше? вже мовчу про те, що на виході всі дані маємо в одному масиві, а це досить зручно і не захаращує код назвами змінних.

    аж зголоднів, поки писав це. мушу щось з’їсти і хильнути пива, перш ніж перейти до тестування швидкодії.

    3. швидкодія

    3.1 тестовий скрипт

    чи справді варто використовувати інтегровані команди bash для обробки рядків і масивів, — а чи може це лише альтернативний спосіб і не більше? можна прогнати кілька тестів і подивитися, скільки за часом виконується кожен варіант. спершу я поясню, як саме я тестував. далі подаю чернетку тестового скрипта. ідея проста: запустити декілька (багато) подібних прикладів і заміряти час виконання.

    #!/bin/bash
    # використання: test [кількість_ітерацій]

    iter=10000
    # перевірмо, чи задано кількість ітерацій в командному рядку
    if [ -n "$1" ]
    then
    iter="$1"
    fi

    TAB=$(echo -e "\t")

    # проженімо ітерації
    for i in `seq $iter`
    do
    #
    # робочий код для тестування
    #
    done


    цей тестовий скрипт запускається таким чином:

    $ /usr/bin/time -f "\nReal: %E\nUser: %U\nSys: %S" ./test 100000


    всередині циклу «do … done» вміщуємо тестовий код (я прибрав коментарі задля компактності):

    # приклад SED
    xrandroutput="1680x1050+2880+23"
    array=`echo "$xrandroutput" | sed "s/x/$TAB/"`
    array=`echo -e "$array" | sed "s/+/$TAB/g"`
    H=`echo -e "$array" | cut -f 1`


    а потім другий варіант:

    # приклад ARRAY
    xrandroutput="1680x1050+2880+23"
    array=${xrandroutput//x/" "} # "1680 1050+2880+23"
    array=( ${array//+/" "} ) # ( "1680" "1050" "2880" "23" )


    зауважте, що у варіанті «приклад SED» ми змушені зберігати результат до змінної «H», тоді як у варіанті «приклад ARRAY» всі чотири значення зберігаються в одному масиві з доступом через «array[i]».

    3.2 результати тестування швидкодії

    щоби отримати надійний результат, я прогнав кожен тест кілька разів (міг би зробити це більш системно, підбивши якусь статистику, проте різниця настільки разюча, що в цім не було необхідности). далі я спробвав підібрати кількість ітерацій так, щоби скрипт виконувався приблизно 10 секунд, і таким чином нормалізувати результати.

    а результати такі:

    приклад SED: 1000 ітерацій = 2,17 секунд
    приклад ARRAY: 1000 ітерацій = 0,011 секунд


    так, різниця 200-кратна на користь варіанту «приклад ARRAY». отже, інтегровані команди bash працюють значно швидше, ніж виклик sed.

    дивно? ну, я очікував дещо вищої продуктивності, але ж не 200-кратно… насправді, тут я запрошую знавців написати оптимальніший код з використанням sed. можливо, це можна зробити краще, ніж вийшло у мене.

    4. заключне слово

    отже, чи варто користуватися інтегрованими командами bash? спробую підсумувати:

    переваги (аргументи на користь внутрішніх команд bash:
    + це значно швидше;
    + код зрозуміліший (на мою думку), з меншою кількістю змінних;
    + мені здається, що це простіше програмувати.

    недоліки (проти):
    - значна залежність від bash;
    - хоча масиви і команди обробки рядків мають бути доступні в сучасних версіях bash (вище третьої), все-таки можуть виникати проблеми сумісності в старших версіях;
    - неможливо реалізувати деякі однорядкові команди (one-liners), які досить просто отримати перенаправленням виводу.

    наостанок кілька слів:

    а) сподіваюся, комусь це стане в нагоді. розумію, що хтось скаже: «о, я це й так знав», інші запитають «про що це він взагалі говорить?», проте я таки сподіваюся, що хтось навчиться чогось нового;
    б) перепрошую, що не спромігся пояснити коротше; також перепрошую за кострубату англійську;
    в) не соромтеся збиткуватися з мене, якщо я десь тут припустився помилки.

    кінець.

    на bash’тані тетріси дозріли

    несподівано натрапив на цікаву реалізацію тетріса… на чистому bash’і.

    тепер я мушу витратити час і розібрати це «на запчастини»! хоча б для того, щоби пофіксити одну «фічу» цього скрипта і зафіксувати кольори блоків, як цього вимагає стандарт the tetris company.

    todo.txt

    нещодавно я згадував у щоденнику техніку використання звичайного паперового записника для організації задач та нотаток — bullet journal. чудова, красива ідея, котрою я не можу скористатися: ну не ношу я з собою, як правило, нічого, окрім смартфона… а без паперу ідея втрачає сенс.

    але сьогодні я знайшов, мабуть, її еквівалент в електронному вигляді: todo.txt!

    суть у кількох словах: простий текстовий файл з переліком задач на dropbox1; один рядок — одна задача; формат рядка дозволяє зручно реалізувати мінімальну множину ідей gtd (контекст, проекти). але це, звісно, ще не все…

    подужав! після того, як трішки освоївся із sed’ом та bash’ем — пішло як по маслу, ще й інтерес прокинувся по-справжньому. щоправда, результат ще не фінальний — тепер мені не подобається компоновка елементів на екрані, — хочеться зібрати інший конфіг conky, і переписати скрипт читання стрічки так, щоби скористатися форматуванням. тим не менш, вже юзабельно.

    поточний результат на скріншоті під катом.

    власне скрипт, котрий завантажує twitter-стрічку (точніше архів власних твітів, тому що після відписування від усіх стрічка пуста) і форматує для виводу в conky, виглядає так:

    знайшов у тенетах bash-скрипт для завантаження світлин до альбомів picasa прямо з командного рядка. шукав таке давненько — без python’а, java чи інших perl’ів… звісно, ідеально була б софтинка на c/с++ та ще від самого google’а — але і чистий bash піде.

    навіщо? хочу «прикрутити» скрипт до файлового менеджера і навчити його завантажувати вибрану світлину до picasa простим кліком з випадаючого меню — свого часу так налаштував собі швидку підготовку світлин для інтернету.