Linux для всех

индекс
247,21

Clip2net: unix-way или «Сделай сам»

Clip2net + Tux
На Хабре уже писали о сервисе Clip2Net (Clip2net — очень быстрая публикация в Сеть). Это довольно удобный сервис для публикации скриншотов (и вообще любых файлов) в сети. Цитата из описания:
Clip2net – это инструмент загрузки информации в сеть с акцентом на публикацию изображения с экрана компьютера. Основной момент – скорость, минимум операций, универсальность применения. На выходе программа дает ссылку на опубликованную информацию, которую можно использовать где угодно в Сети – будь-то сообщения по e-mail/IM или свой блог/сайт.

У проекта есть недостатки, главный из которых (на мой взгляд ;) — отсутствие клиента под Linux. Попытаемся исправить эту оплошность, а также продемонстрируем на конкретном примере всю прелесть операционных систем GNU/Linux, — философию «Unix-way».

Философия UNIX гласит:
  • Пишите программы, которые делают одну вещь и делают её хорошо.
  • Пишите программы, которые бы работали вместе.
  • Пишите программы, которые бы поддерживали текстовые потоки, поскольку это универсальный интерфейс.
Взято отсюда: http://ru.wikipedia.org/wiki/Философия_UNIX

В этой статье речь пойдёт непосредственно о сервисе clip2net.com, но применить данный подход к любому сервису с загрузкой файлов будет несложно.
И сразу же оговорюсь: я не имею к сервису clip2net.com никакого отношения.


Постановка задачи


Для начала давайте поставим задачу — определимся, какой функционал нам необходим для комфортной работы с сервисом Clip2Net:
  1. снятие скриншота всего экрана, всего окна текущей программы или произвольной области экрана (выделение мышью)
  2. выбор файла, который мы хотим отправить
  3. автоматическая отправка скриншота/файла на сервер clip2net
  4. получение ссылки на отправленный скриншот/файл, отображение её и копирование в буфер обмена

Программа Clip2Net, которую нам предлагают скачать с сайта (Windows-only) имеет ещё несколько режимов работы (например, «запись видео» или «публикация интернет-ссылки»), но нам они не интересны.

 

Функционал


Итак, в соответствии с философией «Unix-way», разобьём функционал нашей будущей «программы» на элеменратные действия:
  • снятие скриншота всего экрана
  • снятие скриншота окна текущей программы
  • снятие скриншота произвольной области экрана
  • выбор файла
  • закачивание файла на удалённый сервер
  • отображение произвольных сообщений
  • копирование произвольного текста в буфер обмена


Инструменты


А теперь определимся с инструментарием, который мы будем использовать для решения поставленной перед нами задачи:

 
Cнятие скриншота всего экрана, окна текущей программы и произвольной области экрана:

C этими задачами лучше всего справляется программа scrot (http://freshmeat.net/projects/scrot/) — она умеет делать снимки экрана и сохранять их в файл.
Здесь и далее я буду описывать процесс установки и настройки для Ubuntu Linux. Для других ОС отличия минимальны — за деталями обратитесь к man'ам, к Google'у или к знакомым линуксоидам =)

Устанавливаем программу:
> sudo apt-get install scrot
Читаем man:
> man scrot
Делаем выводы. Для реализации нашего функционала нам потребуется три команды:

> scrot -q 100
Делает скриншот всего рабочего стола. Параметр -q позволяет задать качество полученной картинки (1-100). По умолчанию параметр -q равен 75, — если вас устраивает это качество, то этот параметр можно опустить. Если вы хотите сэкономить трафик, то можно поставить значение поменьше.

> scrot -q 100 -u -b
Делает скриншот текущего активного окна. Параметр -b говорит программе о том, что в скриншот нужно включить оформление («рамку») окна. Если рамка вам не нужна — опустите этот параметр.

> scrot -q 100 -s
Делает скриншот выбранной пользователем области. Выбор происходит с помощью мыши — после запуска команды, необходимо выбрать произвольную прямоугольную область экрана — именно она будет сохранена в файл.

Файл сохраняется в домашнюю директорию текущего пользователя. Для того, чтобы над полученным изображением выполнить какие-либо действия, у программы scrot есть специальный параметр -e:
> scrot -q 100 -u -b -e 'ls -l $f'
сделает скриншот активного окна с рамкой и с максимальным качеством и выполнит команду «ls -l» на сохранённом файле.

 
Выбор файла и отображение произвольных сообщений

Cпециально для таких целей была создана программа zenity (http://freshmeat.net/projects/zenity) — с помощью этой программы можно показать диалог выбора файла, вывести произвольный текст в окне и многое другое.

Устанавливаем программу (если она не установлена):
> sudo apt-get install zenity
Читаем man:
> man zenity

Для реализации нашего функционала нам потребуется следующие команды:

> zenity --title='Clip2net' --entry --text='Отправка успешна. Скопировать ссылку на файл в буфер обмена?' --entry-text='здесь будет ссылка'
выводит окно, с текстом, полем input и кнопками «OK» и «Cancel» — мы воспользуемся им для вывода полученной ссылки и запроса копирования этой ссылки в буфер обмена. Попробуйте запустить эту команду в консоли. Обратите внимание, что после нажатия на кнопку «OK» программа вернёт текст, который был в поле ввода, а после нажатия на кнопку «Cancel» — не вернёт ничего.
zenity entry

> zenity --title='Clip2net' --file-selection
Выводит окно выбора файла со списком файлов и кнопками «OK» и «Cancel». После нажатия на кнопку «OK» программа вернёт полный путь к файлу, а после нажатия на кнопку «Cancel» — не вернёт ничего.

> zenity --title='Clip2net' --info --text='info text'
Выводит окно с сообщением и кнопкой «OK».

> zenity --title='Clip2net' --question --text='question text'
Выводит окно с сообщением и кнопками «OK» и «Cancel».

> zenity --title='Clip2net' --error --text='error text'
Выводит окно ошибки с текстом ошибки и кнопкой «OK».

 
Копирование произвольного текста в буфер обмена

Программа xclip как раз предназначена для работы с буфером обмена. Я уже писал о ней на Хабре: Работа с буфером обмена в Linux: теория и практика, поэтому мы не будем останавливаться на ней подробно.
Устанавливаем программу (если она не установлена):
> sudo apt-get install xclip
Читаем man:
> man xclip

Использование (копируем текст «Test text» в буфер обмена):
> echo "Test text" | xclip

 
Закачивание файла на удалённый сервер

Мне не удалось найти программы, которая имела бы подобный функционал и подходила бы для наших целей, поэтому я набросал скриптик на языке Perl, который выполняет эту часть работы. Но прежде чем писать скрипт, нам необходимо выяснить, что, как и куда передаёт Windows-версия программы clip2net, т.е. провести реверс-инжиниринг (http://ru.wikipedia.org/wiki/реверс-инжиниринг).

 

Скрипт загрузчика файла на удалённый сервер


Итак, проанализируем протокол обмена данными программы clip2net с сервером clip2net.com. Для подобных целей на моём компьютере стоит виртуальная машина с ОС Windows, на которой установлена программа Wireshark. Устанавливаем на виртуальную машину программу clip2net, скачав её с официального сайта, запускаем Wireshark в режиме перехвата данных и отправляем скриншот с помощью программы clip2net на сайт. Анализируем полученные данные:
  1. Скриншот отправляется через обычный HTTP-протокол POST-запросом на сайт clip2net.com по адресу clip2net.com/upload/
  2. Для авторизации на сайте используется обычная basic-авторизация.
  3. Интересные факты: Данные на сайт отправляются дважды — первый раз отправляется запрос без авторизации, на него приходит ответ «401 Unauthorized» («Authentification requred»), и второй раз те же данные отправляются с авторизацией. При этом оба раза отправляется файл, который мы хотим передать на сайт, что выглядит странным — если мы передаём, к примеру, десятимегабайтный файл, то он будет передан два раза. Это влечёт за собой увеличение трафика и времени передачи файла в два раза. Кроме того, после передачи файла программа подгружает страницу с файлом, включая все JS, CSS, картинки и прочее. В целом, после анализа передаваемых данных складывается впечатление, что у разработчиков данного сервиса понятие «скорость» означает что-то иное, нежели быстродействие.
  4. Определим параметры, которые передаются в POST-запросе:
    — language = «Russian» (язык выбранный в программе)
    — mode = «upload»
    — title = "" (название скриншота)
    — folder = "" (папка на сайте, куда помещается скриншот)
    — expire = "" (дата, когда нужно удалить загруженный файл)
    — key = "" (непонятный параметр)
    — hwid = «A00A-AA00» (уникальный ID компьютера)
    — width = «0» (ширина изображения)
    — height = «0» (высота изображения)
    — extract = «0» (ещё один непонятный параметр)
    — orig_file = «clip.png» (название оригинального файла)
    — file (собственно, сам файл)
    Фактически мы передаём лишь пять параметров: language, mode, hwid, orig_file и file. Проведя несколько экспериментов, я пришёл к выводу, что обязательными параметрами являются только mode и file.
  5. Пишем скрипт для передачи произвольного файла на сервер clip2net.com (скачать файл):
    #!/usr/bin/perl -w
    use strict;
    use LWP::UserAgent;
    use HTTP::Request::Common;
    use constant USAGE => "Usage: clip2net-uploader USERNAME PASSWORD FILE\n";
     
    # получаем параметры из командной строки
    my $username = shift || undef;
    my $password = shift || undef;
    my $file     = shift || undef;
     
    # если не заданы имя пользователя или пароль - выходим
    unless (defined $username && defined $password) {
        print "Error: no username or password\n".USAGE;
        exit 0;
    }
     
    # если файл не найден, выводим соответствующую ошибку и выходим
    unless (defined $file && -$file) {
        print "Error: no file passed or file not exists\n".USAGE;
        exit 0;
    }
     
    # создаём объект браузера
    my $ua  = LWP::UserAgent->new('agent' => 'Linux clip2net uploader');
    # создаём объект для POST-запроса
    my $req = POST('http://clip2net.com/upload/',
        'Content_Type' => 'form-data',
        'Content' => [
            'mode' => 'upload',
            'file' => [$file],
        ]
    );
    # задаём данные для авторизации
    $req->authorization_basic($username, $password);
     
    # выполняем POST-запрос и проверяем ответ
    my $res = $ua->request($req);
    if ($res->is_success) {
        if ($res->content =~ /<url>(http:\/\/clip2net\.com\/.+?)<\/url>/s) {
            # выводим на экран ссылку на закачанный файл и выходим
            print "$1\n";
            exit 1;
        }
    }
     
    # получаем ошибку, выводим её на экран и выходим
    my $error = $res->content;
    chomp $error;
    print "$error\n";
    exit 0;

    Скрипт откомментирован, поэтому разобраться в нём не составит труда. При необходимости, нужно будет поставить модули LWP::UserAgent и HTTP::Request::Common, это можно сделать через cpan (читать: man cpan).
    Создаём файл /usr/local/bin/clip2net-uploader с приведённым выше кодом, ставим на файл права на запуск (sudo chmod +x /usr/local/bin/clip2net-uploader) и запускаем его, передав в качестве параметра логин, пароль на сайте clip2net и любой файл, который вы хотите выложить на сервер. Например, картинку:
    > clip2net-uploader user password example.jpeg

    В случае, если файл будет передан корректно, программа выдаст ссылку на файл, например:
    > user@local:~$ clip2net-uploader user password example.jpeg
    > clip2net.com/blah-blah-blah/example.jpeg
    > user@local:~$


    Если в процессе передачи файла возникнет ошибка, программа выдаст ошибку:
    > user@local:~$ clip2net-uploader user password example.jpeg
    > Incorrect username/password. Please check application settings.
    > user@local:~$



 

Собираем всё вместе


Итак, мы имеем все необходимые инструменты для того, чтобы выполнить поставленную задачу. Собираем всё воедино (скачать файл):
#!/bin/bash
QUALITY="-q 80"
USERNAME="username"
PASSWORD="password"
 
PARAM=""
FILE=""
REMOVE=
 
if [ -z "$1" ]then
    echo "Error: please, select mode (--help for more info)"
    exit
elif [ "$1" == "--help" ]then
    echo "Usage: clip2net MODE [FILENAME]"
    echo "Mode is:"
    echo "  --screen        - send whole screen"
    echo "  --window        - send active window"
    echo "  --area          - send area, selected with mouse"
    echo "  --file          - show file selection dialog and send selected file"
    echo "  --file FILENAME - send file FILENAME"
    exit
elif [ "$1" = "--file" ]then
    if [ -z "$2" ]then
        FILE=`zenity --title='Clip2net' --file-selection` || exit
    elif [ -f "$2" ]then
        FILE=$2
    else
        echo "Error: file is not exists"
        exit
    fi
else
    REMOVE=1
    if [ "$1" = "--screen" ]then
        CONFIRM="Отправить скриншот всего экрана на сайт clip2net.com?"
        PARAM=""
    elif [ "$1" = "--window" ]then
        CONFIRM="Отправить скриншот окна текущей программы на сайт clip2net.com?"
        PARAM="-q -b"
    elif [ "$1" = "--area" ]then
        CONFIRM="Отправить скриншот выделенной области на сайт clip2net.com?"
        PARAM="-s"
        zenity --title='Clip2net' --info --text="Выделите область на экране для отправки на сайт clip2net. Для отмены нажмите любую кнопку клавиатуры"
    else
        echo "Error: please, select correct mode (--help for more info)"
        exit
    fi
    FILE=`scrot $PARAM $QUALITY -e 'echo -n $f'` || exit
    zenity --title='Clip2net' --question --text="$CONFIRM" || exit
fi
 
if [ -z "$FILE" ]then
    echo "Error: no file to send"
    exit
fi
 
RES=`clip2net-uploader $USERNAME $PASSWORD $FILE`
if [ $? -eq 1 ]then
    zenity --title='Clip2net' --entry --text="Отправка успешна. Скопировать ссылку на файл в буфер обмена?" --entry-text="$RES" | xclip
else
    zenity --title='Clip2net' --error --text="$RES"
fi
echo $RES
 
if [ $REMOVE -eq 1 ]then
    rm $FILE
fi

Создаём файл /usr/local/bin/clip2net с приведённым выше кодом, ставим на файл права на запуск (sudo chmod +x /usr/local/bin/clip2net) и правим настройки в самом начале файла: качество изображения (переменная QUALITY), логин и пароль на сайте clip2net.com (переменные USERNAME и PASSWORD). Если у вас нет логина и пароля — нужно зарегистрироваться на сайте.
В этом месте я хотел бы сделать небольшое замечание: мне удобно хранить свои скрипты в директории ~/.bin/ — так я не боюсь их потерять (ежедневно создаётся резервная копия домашней директории).
По умолчанию исполняемые файлы пользователя хранятся в директории ~/bin/, которой может и не быть. Это поведение задаётся в файле ~/.profile следующими строками:
> if [ -d "$HOME/bin" ] ; then
>     PATH="$HOME/bin:$PATH"
>     fi

Для того, чтобы скрипты хранились в директории ~/.bin/ меняем эти строки на:
> if [ -d "$HOME/.bin" ] ; then
>     PATH="$HOME/.bin:$PATH"
>     fi

и создаём эту директорию:
> user@local:~$ mkdir ~/.bin/
Теперь вы можете сохранять исполняемые файлы (свои скрипты) в домашней директории и они будут находится системой без указания полного пути к ним.


 

Режимы работы


Краткую подсказку по использованию этого файла можно получить, набрав команду «clip2net --help». Чуть более подробно:

> clip2net --screen
Сделает скриншот всего экрана, выведет окно с запросом подтверждения отправки его на сайт clip2net.com и в случае положительного ответа отправит файл.
zenity entry

> clip2net --window
Сделает скриншот текущего окна, выведет окно с запросом и отправит скриншот на сайт.
zenity entry

> clip2net --area
Выдаст окно с информацией о том, что нужно выделить мышкой область на экране, дождётся выделения и покажет окно с запросом отправки файла на сайт. Отправит скриншот в случае утвердительного ответа.
zenity entry
zenity entry

> clip2net --file
выведет окно со списком файлов и отправит выбранный пользователем файл на сайт без предупреждения (в случае нажатия кнопки «ОК»).
zenity entry

> clip2net --file /home/user/pictures/example.jpeg
отправит файл /home/user/pictures/example.jpeg на сайт (без показа подтверждающего окна).
zenity entry

В случае возникновения ошибки, программа выдаст окно с ошибкой либо выдаст ошибку в STDOUT (если ошибка низкого уровня).

 

Управление


Открывать консоль и набирать нужную команду — это, конечно, «тру», но в повседневной работе это не всегда удобно. Можно сделать кнопки на панели задач, либо повесить сочетания клавиш на эти действия.
Дальше речь пойдёт о менеджере окон «Gnome».
Для настройки в KDE обратитесь к документации, гуглу или знакомому линуксоиду.
Для настройки в Awesome (а я использую именно его) обратитесь ко мне ;)

Для того, чтобы добавить кнопку на панель задач, нужно кликнуть на ней правой кнопкой и выбрать пункт «Добавить на панель...», выбрать апплет «Пользовательская кнопка запуска» и настроить запускаемое приложение (задать название, исполняемый файл и иконку). Например:
zenity entry

Для добавления горячей кнопки выбираем меню «Система->Параметры->Комбинации клавиш клавиатуры», нажимаем «Добавить» в открывшемся окне и вводим название команды и исполняемый файл:
zenity entry
Далее, выбираем новую команду, кликнув на ней мышью и нажимаем нужное сочетание клавиш. Всё, настройка закончена.

 

Что дальше?


Это всего лишь пример подхода к решению возникшей задачи с помощью инструментов ОС *NIX. Тем не менее, это вполне живой и рабочий пример, — я пользуюсь этой программой практически каждый день.

Совсем не обязательно ждать у моря погоды или писать разработчикам программы просьбы портировать её под Linux (тем более, что разработчикам это, зачастую, просто не нужно). Читайте маны, изучайте инструментарий и подходите с фантазией к любой задаче — и вы сможете решить её просто, быстро и элегантно.
Надеюсь, статья будет полезна как новичкам, так и продвинутым пользователям.

_________

Текст подготовлен в редакторе VIM ;)
+47
11 декабря 2009, 18:24
55

комментарии (51)

+1
sergz #
Спасибо! Некоторое время назад перешел на ubuntu и стало очень нехватать функционала clip2net
+9
Dreadatour #
Рад, что скрипт оказался полезен =)
Хотя основная цель статьи — показать на конкретном примере, что в Linux можно легко и элегантно сделать практически любые вещи.
+1
sergz #
да, я еще сделал аплоад картинки на свой сервер. теперь я независим :)
+3
dionix #
Очень красиво, спасибо!
+1
Paskal #
Всё хорошо, советую добавить одно — в конце описать, как забиндить clip2net --screen на printscreen — это будет полный unix-way (:
+2
melksoft #
Система => Параметры => Комбинации клавиш клавиатуры
Так в Ubuntu и наверное в гноме вообще
0
Dreadatour #
Спасибо!
А я написал, и как раз в конце =) В разделе «Управление» написано про это. Возможно, не так подробно, как хочется, но я и так написал слишком много — не хотелось раздувать размер статьи.
+1
Paskal #
Просто можно сделать универсальней, .systemrc или где-то там в ~ — так, чтобы работало в любом оконном менеджере либо в консоли.
Кстати, как раз сейчас впервые ставлю на свой eeepc arch, там же впервые нашёл упоминание awesome, сейчас буду ставить — если не сложно, подскажите лично, как там можно будет настроить использование скрипта?
0
Dreadatour #
Для настройки сочетаний кнопок можно воспользоваться xmodmap или actkbd.
Насчёт Awesome — там всё элементарно (можно просто посмотреть файл rc.lua и всё станет понятно =). На всякий случай оставил контакты в личке.
0
Paskal #
Вдруг им будет интересно? clip2net.reformal.ru/proj/?ia=35678
Я искренне порадуюсь мировой справедливости, если они свяжутся с тобой, и предоставят твой скрипт у себя на сайте.
0
naryl #
Кросс-DE решение одно — xbindkeys.
0
Dreadatour #
Или actkbd — работает даже без «иксов» ;)
+1
naryl #
Ура! Пол года искал (скорее, ждал) xbindkeys для консоли.
НЛО прилетело и опубликовало эту надпись здесь
–1
lol2Fast4U #
Почему жаль? GNU = GNU's Not Unix.
+1
Remitmaster #
Отлично! Начал замечать что все больше и больше стали переходить на линукс. Я вот уже вторую неделю, и такие вот статьи очень и очень полезны.
0
el777 #
Спасибо, отличная штука!
Только почему-то не работает если запускать через комбинацию клавиш — появляется первое окно, область выделяется, но дальше ничего не происходит.
Если же запустить через консоль clip2net --area, то все нормально.
0
Dreadatour #
Попробуйте настроить горячие кнопки через gconf-editor:
«apps» -> «metacity» -> «keybinding_commands», далее меняем либо «command_screenshot» и «command_window_screenshot» (эти команды вешаются на стандартные сочетания с кнопкой Print Screen), либо добавляем новую команду (например «run_command_1»). Далее переходим в «apps» -> «metacity» -> «global_keybindings» и настраиваем сочетание кнопок для выбранной команды (например, «run_command_1»).
0
el777 #
Я настроил через GUI. Меню-> Система -> Параметры -> Сочетания клавиш.
Это может иметь значение?
Приложение-то запускается, но вот что дальше?

А куда программа должна выводить ошибки?
Где их мжно посмотреть?
0
Dreadatour #
Проблема в том, что scrot не может созранить файл. Лог — тут:
> tail -f ~/.xsession-errors

Ошибка:
giblib error: Saving to file 2009-12-11-233726_275x255_scrot.png failed
0
el777 #
Странно. Настроил через gconf-editor — заработало!
Интеречно, в чем «фикус»?
0
Dreadatour #
Скорее всего, это я виноват. Сам пользуюсь Awesome, гнома давно в глаза не видел =)
Сейчас пофиксю статью.
+1
sindrom #
Отличная статья, демонстрирующая, что для человека с головой нет ничего невозможного.
Попробую переписать ваш скрипт загрузчика на питоне, тогда будет совсем православно :)
0
twangel #
Может, не unix-way, но
sudo apt-get install shutter
+1
Mad_Fish #
Сим комментом выражаю свой респект автору за способствование святой миссии пришествия линукса в массы.
Теперь я знаю про scrot и zenity. Спасибо.
0
Romulka #
У меня программа спокойно запустилась через wine. Но это конечно не оч. круто.
+4
naryl #
Несколько замечаний по «девелоперскому этикету» :)

1. Есть стандартные коды ошибок. Посмотреть можно в /usr/include/sysexits.h. Конечно это для C и C++, но т.к. для скриптов подобного стандарта нет, можно использовать и их. В любом случае возвращать 1 на любую ошибку не стоит. Неправильные ключи — 64 (EX_USAGE), ошибка на сервере — 75 (EX_TEMPFAIL), если упал сервер или 76 (EX_PROTOCOL), если сервер вернул ошибку, нет perl или скрипта для закачки — 69 (EX_UNAVAILABLE), упал скрипт на perl — 70 (EX_SOFTWARE).

2. Уберите подтверждения на --screen и --window. XD
+2
naryl #
Эти изменения сделают ваш clip2net намного более приятным для использования в скриптах.

Так же не помешает добавить ключи:
--nox — не использовать zenity
-y — выполнять без подтверждения
-q — не выводить ничего в stdout. Сообщения об ошибках должны выводиться в stderr в любом случае.
0
Dreadatour #
Вы, несомненно, правы =)
Постараюсь выкроить время и поправить скрипт на выходных. Статью писал в первую очередь для того, чтобы показать возможности линукса, но если скрипт полезен и будет использоваться — то нужно довести его до ума =)

Спасибо за sysexits.h — очень полезная информация. Век живи, век учись =)
0
naryl #
Сам нагуглил только что. :) Просто знал, что коды ошибок могут быть разными, а значит велик шанс, что где-то стандартизованы.
0
Dreadatour #
Кажется, парсер Хабра съел все символы «0» в скриптах.

Этот код:
<p><font color="#111111">1</font><font color="#222222">0</font>2</p>

В итоге будет выглядеть так:
12
Т.е. ноль будет вырезан.

Видимо, парсер при разборе проверяет содержимое тега на истинность, а ноль, как известно, это false. Как минимум нужно ещё и длину строки проверять.

P.S. Вот только кому тут писать об этом глюке — не знаю.
0
Dreadatour #
Хабр глючит. Писал коммент в корень ветки обсуждений.
0
hshhhhh #
я себе в ~/.wmii3-5/wmiirc написал:
Key Print
import -window root ~/screenshots/$(date +%Y%m%d_%H%M%S).png &
Key Shift-Print
import -frame ~/screenshots/$(date +%Y%m%d_%H%M%S).png &

Не заливает на сервер только потому что не надо. работает через imagemagick, мне нравится такой вот unix-way )
0
falone #
Я долго пользовался клип2нет, но после монетизации постепенно отказался от них. Слишком уж урезана бесплатная версия (всего 100 Мб картинок) да и стабильность стала похуже, некоторые картинки просто не открываются. А 55 долларов за год имхо дороговато.
0
el777 #
Может сделать вариант для других картинкохостингов?
0
Dreadatour #
Запросто.
По сути всё, что требуется — исправить скрипт clip2net-uploader =)
0
non7top #
спасибо за скриптик
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
0
VolCh #
Кстати, ожидал что это будет описано в конце статьи :)
0
Dreadatour #
Спасибо! Как-то даже не подумал об этом.
Спасибо за статью о сборке deb-пакетов. Добавил в избранное =)
0
naryl #
Укажите лицензию в архиве. Пока вы этого не сделаете формально никто не имеет права его использовать. :) Хотя бы # This code is put into public domain by Dreadatour <host@server.ru>
0
Dreadatour #
Спасибо за замечание. Всё время забываю про это =)
0
naryl #
Вот, кстати, ебилд: stashbox.org/732374/clip2net-20091212.ebuild
+2
VolCh #
В который раз убеждаюсь, что в *никсе главное узнать, что кто-то, когда-то бОльшую часть нужного тебе функционала реализовал (ну и найти кто и когда :) ). А так респект, отличная статья именно по unix-way. Поставил бы себе такую задачу — написал бы практически весь функционал на сипп/питоне с qt даже не задумавшись о том, что могут быть (да еще в стандартном репозитории) утилиты КОМАНДНОЙ строки для снятия скриншотов или вывода диалоговых окон. Хотя и свой «велосипед» сделал бы управляемым из консоли :)
+2
naryl #
Реализовано гораздо больше, чем в виндовых пригодных для скриптования утилитах. При решении любой задачи *первым делом* посмотрите, есть ли для этого готовое решение.

Для закачивания файлов, кстати, есть. cURL. Читайте man curl. Ключ -F/--form
+1
VolCh #
Дело даже не в том, что реализовано больше, а в том, что надо из своей задачи выделить подзадачи, которые уже могут быть кем-то реализованы. Образ мышления не тот — понадобилось бы мне закачивать скриншоты на clip2net — погуглил бы «clip2net linux», может «screenshot upload linux» и т. п., но не стал был гуглить «make screenshot from cli» (по которой легко находится описанный scrot) или «work with clipboard from cli» (то же про xclip). А гуглил бы (после того, как убедился, что инструмента нужного нет) апи работы с экраном и буфером обмена. Разве что cURL (когда понял направленность поста — удивился, что автор его не использовал :) ) использовал бы для закачки файлов (благо знаком с ним лет 10), да и то, скорее слинковал бы свой «комбайн» c libcurl. И даже реализовав свой комбайн с нуля, естественно разбив внутри всё на подзадачи, в голову бы не пришло сделать классы/функции, реализующие эти подзадачи, автономными CLI приложениями. Понадобились бы в другой задаче — копипаст кода или, в лучшем случае, оформил как библиотеки/модули.

Автор поста мне, можно сказать, глаза открыл на unix-way. Не на оторванных от жизни простого пользователя «десятиэтажных» команд в консоли, которыми пользоваться можно только копипастом (если после часа гугления получилось найти, при том, что в гуи «ручками» это можно сделать за полчаса :) ), а на типичной мелочи (ГУИ мелочи, замечу), затрудняющей переход этого простого пользователя на Linux с «сами знаете чего». Причём для реализации этой мелочи нужно только (или «только» — в кавычках? :) ) научиться думать по другому, а скрипт, связующий все «чужие» утилиты в одно целое, решающее главную задачу, может написать даже начинающий программист, более того, даже начинающий веб-программист, и даже (о, ужас!) на PHP.
+1
Jey #
автору респект :)
как вы отнесетесь к размещению этой инструкции на самом clip2net.com?
0
Dreadatour #
Спасибо =) Вам тоже респект за сервис ;)

Размещайте ради Бога, — я только «за». Можно сразу разместить и deb-пакет.
(единственное условие — указание авторства. могу, кстати, взять на себя поддержку скрипта в актуальном состоянии и поддержку пользователей Linux =)
0
SpooNesT #
разместмли таки инструкцию на сайте clip2net.com/linux.html — здОрово. Приятно видеть такие статьи. Пусть немного с опозданием, но все равно спасибо. Это, наверное, лучшая статья, которую я читал на хабре!
0
naryl #
Вы вот объясните, почему все так упорно игнорируют наличие ебилда, постоянно упоминая deb?
habrahabr.ru/blogs/linux/78006/#comment_2275743

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.