Heroku power

27 November 2014

   Задался я значит целью снова изучить работу облачной платформы для приложений - Heroku. И.. как же тут всё хорошо! И удобная консольная утилита для работы, и удобная вэб-морда для управления приложением, и десятки подключаемых модулей баз данных, логирования, статистики, безопастности и прочего.. 

   Из минусов обычно утверждают что у них там всё дорого, но в платный сегмент пока не спешу. А вот повозится с настройками автоматизации grunt'а пришлось. Стандартный buildPack не хотел запускать grunt'овские задачи. Кто-то показывал варианты форсированного запуска через путь в node_modules, но после пяти падений с огромными логами у меня сложилось впечатление что такой запуск grunt'а влечет за собой неконтролируемый запуск серверных задач. Благо есть решение в виде другого buildPack'а! Heroku-buildpack-nodejs-grunt. Теперь всё завелось как по маслу.

   Но разрабатывать на одной машине, тем более из под консоли, не очень то удобно. По этому начал изучать способы клонировать приложение. Окей, всё есть в стандартных решениях. Клон через стандартные утилиты. Вот только нужно настроить правильно соединение и аутентификацию с ssh сервером. А вот тут начинаются windows-грабли. Под окнами, где нет стандартных решений ssh'а, к текущему времени оказалось несколько оных: установленный в комплекте с git'ом, установленный cygwin'ом и конечно же putty! И какой из них запускается - ещё тот пазл. И далеко не все из них правильно видят путь к домашней папке пользователя, что бы вычитать настройки в .ssh/confing. Но благо можно задать настройки через главный файл настроек.. 

   В добавку к теме о ssh - нашел мануал про организацию обратных устойчивых туннелей. Чуточку ссылок, и строка кода. После кода, к слову, нужно поменять права запуска сервису на пользовательские, иначе опять не там будет конфигурации искать.

cygrunsrv -I AutoSshTunnel -p c:\cygwin64\bin\sutossh.exe -a "-M 20000 -R 7557:127.0.0.1:22 user@dest.hostname.com" -e AUTOSSH_NTSERVICE=yes

   И коль пошли консольные комманды - три случая использования команды 'find', облегчающие жизнь. Раньше мучился, выборочно выкачивал каждый архив из подпапок, собирал их, а потом на другой машине так же руками по файлу распаковывал. Жуть. Теперь же пара команд - и дело сделано. Спасибо askUbuntu! В добавок нашел волшебный аргумент '-atime', помогающий вычищать мусор, который не использовали к примеру уже два дня.

find -maxdepth 2 -name "*.zip" | zip masters.zip -@
find -maxdepth 2 -name '*.zip' -exec sh -c 'echo unzip -d "${1%.*}" "$1"' _ {} \;
find -maxdepth 1 -atime +2 -exec rm -rf {} \;
find -maxdepth 1 -type f -not -name "removed.conf" -name "*.conf" -exec sh -c 'sed "s/cms1-dev/cms2-stage/g" $1 > $1.tmp && mv $1.tmp $1' _ {} \;
find `pwd` -maxdepth 2 -name "done" -atime +2 -exec sh -c 'echo "${1%/done}" && echo "${1%/done}.zip"' _ {} \;


instagram ]

Ещё одна попытка readonly

16 November 2014

   Raspberry "съедает" уже третью флешку.. Карта была microSD на 32Гб с адаптером. Не надежная техника пошла нынче, всего 1000 циклов перезаписи согласно исследованию на Хабре.. При чем вроде бы даже настроил всю систему работать с read-only-fs, но видимо не полностью. В этот раз раздобыл флешку по древней, полноформатную и менее ёмкую, а так же новый мануал как сделать систему с данными в памяти. И так, поехали.

   Вкратце: выключаем swap, удаляем проверки на время при загрузке, устанавливаем unionfs-fuse, делаем скрипт для его монтирования, правим fstab, создаём дополнительные папки для гибридной работы с unionfs. Папки var и etc мигрируют в память, что бы система могла работать, думая что в них можно писать. Получаем файловую систему без записи, но с рабочими журналами и сервисами. Так же рекомендуют установить busybox-syslogd, что бы уменьшить количество журналов и система вдруг не встала по отсутствию памяти.

   Самая хитрость тут - сделать режим для правильной работы установщика пакетов. В комментариях ко второй статье привели хороший скрипт, чутку мною допиленный для папки mnt:

#!/bin/bash

# remount root rw
mount -o remount,rw /

# prapare target paths
mkdir -p /chroot
mkdir -p /chroot/{bin,boot,dev,etc,home,lib,opt,proc,root,run,sbin,sys,tmp,usr,var,mnt}

# mount special filesystems
mount -t proc proc /chroot/proc
mount --rbind /sys /chroot/sys
mount --rbind /dev /chroot/dev

# bind rw directories
for f in {etc,var}; do mount --rbind /${f}_org /chroot/$f; done

# bind remaining directories
for f in {bin,boot,home,lib,opt,root,run,sbin,tmp,usr,mnt}; do mount --rbind /$f /chroot/$f; done

# chroot
echo "Note: /boot is still mounted read-only, remount to read-write if needed."
echo -e "\e[33mYou are now in read-write chroot. Use CTRL+D when done to exit chroot and mount read-only again.\e[39m"
chroot /chroot /usr/bin/env PS1="(rw) \u@\h:\w\$ " sudo -u pi RWMODE="yes" /bin/bash -l

# unmount mounts
for f in /chroot/{bin,boot,dev,etc,home,lib,opt,proc,root,run,sbin,sys,tmp,usr,var,mnt}; do
umount -l $f
done

sleep 1

# remount read-only again
echo -e "\e[32mChroot left, re-mounting read-only again.\e[39m"
mount -o remount,ro /

   Так же захотелось подсветки файлов при работе в режиме редактирования, по этому в скрипте выше нет аттрибута "--noprofile" из оригинала. В добавок в ".bashrc" добавились строчки для индикации режима записи. Очень надеюсь что такой подход позволит текущей флешке прожить дольше предшественников..

if [ "$RWMODE" = "yes" ]; then
   PS1="(rw) \u@\h:\w\$ "
fi

   И под завершение - велосипеды! С новыми колёсами закручивать на горку за Жисой через 51ую стало вполне себе обычным делом. Осилить бы ещё подъем от Автовокзала до Жисы.. Но там какой-то адовый градиент. Зато красивый закат.


instagram ]

NodeJs unit testing

25 September 2014

       Все сложные проекты рано или поздно приходится покрывать тестами. Надеюсь мне тут поможет свеже найденный обзор различных утилит:

   Блокировка через redis. Правильные флаги, и всякое такое:

Javascript WAT

20 July 2014

   Помнится раньше, когда читал книжки по PHP и проходил всякие тесты, было весьма популярно использовать тонкости языков. Различные хитрости про конвертации, канкатинации и наследования. Вот всё то, что мне раньше встречалось с PHP и C# - ничто посравнению с хитростями JavaScript'а! Вот они там шайтаны.. Воистину "== is the spawn of satan." (с)


© Oleksiy Tishyn 2018