2013-12-05

Android, что я натворил

Запоздалый пост о том, что я напрограммировал под Android и выложил в Google Play, пока увлекался этим. В данный момент эти приложения заброшены и я объясню почему.
Первое - это приложение TaskPoint, предназначенное для создания напоминалок с привязкой к географическому расположению. Актуально для меня, постоянно забывающего зайти в магазин или аптеку по дороге домой. Замысел такой: иду мимо аптеки и получаю напоминание - "Купить витамины".
Сначала все было хорошо, потом я понял, что использовать GPS постоянно не получится, ибо батарея садится очень быстро. WiFi рядом не всегда, поэтому тоже отпадает. Тогда я сделал возможность использовать координаты от сотовых вышек, но в какой-то момент данные от них стали настолько неточными, что пропал весь смысл. В итоге - приложение вроде работает, но сильно зависит или от батареи, или от данных сотовых операторов. Несколько раз не получив напоминания вовремя, понял, что именно поэтому таких приложений до сих пор не существовало.
Второе приложение - Столичная ярмарка, создавалось для доступа со смартфона к одноименному сервису бесплатных объявлений. До ума довести не удалось, слишком много задач приходилось делать одновременно, но представление получить можно, и даже попользоваться. Развитие остановлено также по причине смены места работы.

Сортировка по имени в Finder

То, с чем сталкиваются все перешедшие на Mac OS - это непривычная сортировка файлов в Finder. Во-первых - это то, что папки сортируются наравне с файлами, а не идут первыми. Это поведение можно изменить, используя расширение для Finder - XtraFinder, он бесплатный. К тому-же, в нем много других приятных фич, сделавших использование файлового менеджера более привычным.
Второе будет заметно пользователям с русской локалью: русские имена идут в начале списка, в том числе в iTunes. Это изменяется штатными средствами. Идем в "Системные настройки", там выбираем "Язык и регион" и изменяем параметр "Порядок сортировки списков" с "Русский" на "Универсальный". Вот и всё. При желании там-же можно изменить язык системы на английский, если кому привычнее.

2013-11-26

Переход с Ubuntu на Mac

Так уж получилось. Увидел macbook с retina display и не устоял. Не буду тут воспевать яблоки, потому что, как я давно понял, совершенства на земле нет.
Несколько лет Ubuntu служила мне верой и правдой, а теперь придётся ей развиваться без меня. Честно, жаль, но устанавливать на макбук убунту всё-же считаю как минимум странным делом.
Конечно, как разработчику, мне было бы некомфортно без консоли. Пришлось забыть об apt, но, к счастью, есть замена, и даже две: MacPorts и  HomeBrew. Я остановил выбор на втором, показалось попроще. Через него установил vim, mc, s3cmd, enca, apache, mysql и иже с ними. Вобщем, жить и работать можно.
Из приложений с графическим интерфейсом - Sequel Pro, Sublime Text, IntelliJ Idea. Старые добрые Gimp и Inkscape есть и под мак.
В связи со всем этим, разработку приложений под Ubuntu, или интеграцию в неё придётся заморозить. Постараюсь делать что-то более платформонезависимое.

2013-08-04

Встречайте BibleTools

После довольно долгого времени я наконец собрался воплотить свой давний замысел. А именно: набирая текст в GEdit, через сочетание клавиш разворачивать библейские ссылки типа "Ин.3:16" в полный текст. Вообще планы по развитию утилиты большие, но то, ради чего всё затевалось, уже можно использовать. Прогресс будет описываться на этой странице, и возможно, пока вы читаете этот пост, версия уже обновилась :) В составе синодальный перевод и консольная утилита, которую можно использовать так:

$ bibletools --link "Ин.3:16-18"

Далее. Чтобы прикрутить к GEdit, нужно активировать плагин "Внешние инструменты", и добавить свой. Основные пути:

Edit > Preferences > Plugins > External Tools
Tools > Manage External Tools

Добавленный инструмент может выглядеть примерно так:


Пишем текст в редакторе, выделяем ссылку, жмём Alt+1 и получаем текст Писания. Пока это всё, жду заинтересованных откликов!

P.S. А интересен ли вам вот такой функционал?

2013-07-30

IntelliJ Idea и автоматизация конвертации SCSS в CSS, а CSS в minify-версию

Для того, чтобы автоматизировать работу с определёнными категориями файлов, нужно установить плагин File Watchers. В нём есть несколько предустановленных механизмов, однако они требуют для своей работы сторонние скрипты. Например, чтобы автоматически конвертировать SCSS-файлы в CSS, нужно установить ruby-gem sass, а для сжатия CSS и JS нужен компрессор. В Ubuntu это всё можно сделать одной командой bash:

sudo apt-get install ruby-sass yui-compressor

Настройка File Watcher выглядит тривиально. Вот так:

2013-07-29

Неожиданное применение автоматического тестирования

У всех в работе бывают косяки. Я не исключение, поэтому однажды, при написании довольно сложной формы допустил очень неочевидную ошибку, в результате чего, прежде чем я успел этому помешать, несколько сотен раз пользователи сохранили неверные данные.

Когда форма была исправлена, встал вопрос: что делать? Вопрос "Кто виноват", понятное дело, не стоял. Исправление можно было произвести двумя путями: один - это писать скрипт, учитывающий все условия формы и прогонять сохранённые данные через него. Можно, но времени разбираться на этот момент не было (форма всё-таки и правда не тривиальная была). Второй способ - это заставить пользователей снова открывать форму для редактирования и пересохранить данные, т.е. просто открыть страницу с определённым URL и нажать кнопку "Сохранить". Конечно, они в этом не виноваты, и страдать не должны. Делать это мне? Ещё дольше, чем скрипт писать!

А почему бы не поручить это кому-нибудь, у кого много свободного времени, кто не будет возражать и способен делать рутинную работу без всякого ропота? Среди людей таких нет. Тогда обратимся к роботам.

Ну и тут, как вы догадались, Selenium спешит на помощь. Буквально несколько минут, и готов тестовый скрипт, который займётся всей работой. Запускаем Selenium server ...


java -jar selenium-server-standalone-2.33.0.jar

... и наш скрипт ...


python test.py

... и наблюдаем, как человек-невидимка открывает браузер, переходит по ссылкам и нажимает кнопки. Что нам и нужно было.

А вот, собственно, скрипт.


#!/usr/bin/env python
#coding:utf8

from selenium import webdriver
import unittest
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

class Wd(unittest.TestCase):
 def setUp(self):
  self.driver = webdriver.Remote(
   command_executor='http://0.0.0.0:4444/wd/hub',
   desired_capabilities=DesiredCapabilities.FIREFOX)
  self.driver.implicitly_wait(30)
  self.base_url = "http://my.address.ru"

 def test_saveButtonClick(self):
  driver = self.driver
  for id in [222706,426061,441101]:
   url = "%s/edit_page_%d" % (self.base_url,id)
   driver.get(url)
   driver.find_element_by_id("saveform").click()

 def tearDown(self):
  self.driver.quit()

if __name__ == "__main__":
 unittest.main()

2013-07-22

Использование оператора for в Twig: итератор

Некоторое время пользуюсь шаблонизатором Twig, где циклы в шаблонах задаются практически только с использованием оператора for:

{% for item in some_array %}
 {{ item }}
{% endfor %}

При обходе массива (что и делается в большинстве случаев) вопросов не возникало. Но тут приспичило мне сделать цикл типа while. То есть подразумевалось нечто вроде

{% while item = some_array.next() %}
 {{ item }}
{% endwhile %}
однако, while не реализован в Twig.

Недолгий гуглёж привёл меня (внезапно!) на страницу документации Twig, где черным по английскому написано: "A sequence can be either an array or an object implementing the Traversable interface." Итак, решается задачка таким образом: создаётся объект, имплементирующий методы стандартного PHP-интерфейса Iterator, подаётся в оператор for и всё работает. Как-то так:


class SomeItems implements Iterator{
 private $position = 0;
 private $items = [];

 public function add($item){
  $this->items[] = $item;
 }

 public function current() {
  return $this->items[$this->position];
 }
 public function key() {
  return $this->position;
 }
 public function valid() {
  return isset($this->items[$this->position]);
 }
 public function rewind() {
  $this->position = 0;
 }
 public function next(){
  ++$this->position;
 }
}

$items = new SomeItems();
$items->add('One');
$items->add('Two');
$twig->display('page.twig', ['items'=>$items]);

На странице page.twig используем обычную конструкцию:

{% for item in items %}
 {{ item }}
{% endfor %}
В результате на странице выведены слова "One" и "Two".

2013-05-15

IntelliJ Idea + Solarized Color Schemes

Стал пользоваться IntelliJ Idea для всех проектов. Совершенно невероятно продуманная IDE, но речь не об этом. Захотелось сразу же прикрутить туда популярные цветовые схемы Solarized, к которым я уже привык. Делается это несложно. А именно:
cd ~/.IntelliJIdea12/config/colors/
wget https://raw.github.com/altercation/solarized/master/intellij-colors-solarized/Solarized%20Dark.xml
wget https://raw.github.com/altercation/solarized/master/intellij-colors-solarized/Solarized%20Light.xml
Заускаем Idea, в настройках находим список цветовых схем, а в них - Solarized Dark и Light.

2013-04-28

Нафаршированный ffmpeg : готовый deb-пакет и немного записи

Примерно год назад я писал о том, как установить ffmpeg со всевозможными кодеками в Ubuntu 12.04. Это работает и в 13.04, без изменений. Но, так как я люблю моих читателей, и предполагаю, что им лень собирать это самостоятельно, предлагаю скачать уже собранный под 32-битную версию Ubuntu 13.04 пакет.
Вот ссылка.

P.S. Прошу прощения, установленный пакет у меня не заработал на машине, где предварительно я не установил всю ту кучу библиотек, нужную для сборки. Так что лучше из исходников собирать.

P.S. Кстати, а вы знали, что с помощью ffmpeg можно записывать то, что слушаете, к примеру в интернете? Например, с Яндекс.Музыки. Я раньше писал о том, как это сделать, так вот что касается pavucontrol - обязательно, а вместо заморочек с audacity можно сделать так:

ffmpeg -f alsa -ac 2 -i pulse -acodec libmp3lame -aq 4 file.mp3

Это даст нам файл mp3 с переменным битрейтом 140-185 (-aq 4). О том, какие битрейты можно выставить, прочтите здесь. Самое сложное - вовремя включить и выключить запись. Я пробовал записывать подряд, и потом разбить трек на части с помощью mp3splt по секунде тишины, но 1) возникают артефакты в месте разрыва и 2) иногда в композициях бывает тишина, так надо. Вобщем, пока думаю, как бы это автоматизировать, а вы присоединяйтесь!

2013-04-02

Цветной Python: выводим в консоль красиво

Наигравшись с nodejs возвращаюсь к старому доброму python. Запишу себе на память шпаргалку о том, как сделать стандартный вывод в консоль цветным.
Используются стандартные ANSI escape code, применение выглядит так:

print '\033[36mCYANCOLOR\033[0m'
print '\033[96mINTENSIVECYANCOLOR\033[0m'

Кодов 109 штук, но применимыми выглядят только эти:


  • 0 - по умолчанию
  • 1 - усиленный (жирный или более интенсивный цвет)
  • 2 - ослабленный (нежирный или менее интенсивный цвет)
  • 4 - подчёркнутый
  • 7 - негативные цвета
  • 8 - скрытый
  • 9 - перечёркнутый
  • 30 - черный
  • 31 - красный
  • 32 - зелёный
  • 33 - желтый
  • 34 - синий
  • 35 - пурпурный
  • 36 - голубой
  • 37 - белый (светло-серый)
  • 40-47 - аналогично 30-37, но цвет применяется к фону
  • 90-97 - аналогично 30-37, но цвет более интенсивный
  • 100-107 - аналогично 40-47, но цвет более интенсивный


2013-02-28

Использование Git


Использовать систему контроля версий GIT очень просто. Для начала вот краткий инструктаж. Устанавливаем git:
sudo apt-get install git

Перемещаемся в корневой каталог проекта и инициализируем проект:
cd ~/Projects/myProjectName
git init

Для хостинга проекта я использую Bitbucket. Зарегистрируйтесь на сайте и получите
имя пользователя, допустим, это myBBname. Теперь нужно создать проект, думаю, разберётесь. Пусть он называется myProjectName. Добавим запись о нём, назовём запись REPONAME:
git remote add REPONAME https://myBBname@bitbucket.org/myBBname/myProjectName.git

Добавляем файл(ы) в репозатарий
git add *.php

Когда закончим добавлять новые/изменённые файлы/каталоги, подтверждаем и указываем комментарий:
git commit -m "Пояснение к коммиту"

Теперь можно залить изменённые данные на сервер; используем запись REPONAME, основная ветка:
git push -u REPONAME master

BitBucket запросит пароль аккаунта для myBBname. Если всё было сделано правильно, то файлы зальются на сервер, а в вашем аккаунте появится информация о пределанных операциях.

Через несколько push-ей у вас повится зуд в пальцах от того, что каждый раз нужно вводить пароль. Нужно это как-то поправить. Решение - в использовании SSH и ключей. Запустим утилиту `ssh-keygen`:
ssh-keygen

Она будет предлагать варианты действий, ключевым из которых будет имя создаваемого
файла ключа (как правило, это `~/.ssh/id_rsa.pub`) и passphrase. Придумайте что-нибудь сами.
Теперь у нас есть файл ключа, закинем его в аккаунт Bitbucket (с учетом названия вашего аккаунта): https://bitbucket.org/account/user/myBBname/ssh-keys/

Там всё просто: Add Key, даём ему понятное название, в текстовое поле вносим содержимое файла ключа, сохраняем.
Добавим новую запись о проекте, через которую будем осуществлять доступ к серверу, в варианте для SSH (назовём её SSHREPONAME):
git remote add SSHREPONAME ssh://git@bitbucket.org/myBBname/myProjectName.git

Отлично. Теперь сделаем так, чтобы наш пароль был ассоциирован с ssh-ключом. Запустим `ssh-agent` для оболочки:
ssh-agent bash
ssh-add

У нас спросят ту самую passphrase, которую мы вводили, когда генерировали файл-ключ с помощью `ssh-keygen`.
Теперь, отправляя файлы на сервер, можно использовать ssh-запись, и будет использован ключ, а не пароль.
git push -u SSHREPONAME master

В завершении скажу, что можно использовать плагин Git в Sublime Text 2,
особенно если создать проект ровно в том-же каталоге, где и создан репозитарий git. И это очень удобно.

2013-02-19

Pidgin и ошибка аутентификации

Что-то я такое сделал, что при попытке соединения Pidgin с GTalk и chat.facebook.com мой верный IM выдавал ошибку с текстом:
"Сервер не использует ни одного поддерживаемого метода аутентификации"
Перепробовав все настройки, и даже предприняв попытку собрать версию Pidgin посвежее, остановился на смене клиента. Gajim работал, но пришлось держать запущенными аж два приложения: Gajim для jabber-протокола и Pidgin для ICQ.
Сегодня натолкнулся на причину такого странного отказа довольно надёжного клиента сообщений. А именно: в ходе баловства с виртуальными поддоменами апача я правил файл /etc/hosts и сделал так, что адрес 127.0.0.1 перестал соответствовать имени компьютера, прописанному в /etc/hostname. Просто дописав в /etc/hosts 
127.0.0.1 имякомпьютера
решил проблему.