Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2014-07-17

Safe way to setup firewall

В сети можно найти массу инструкций по правильной настройке файрволла (говоря «файрволл» я подразумеваю интерфейс iptables в Linux). Но надо довольно долго искать, прежде чем найдется практически полезное руководство. В частности, как настроить файрволл на удаленной машине и не потерять коннект? Что будет, если вы подключились по SSH к станции, до которой три года на оленях и, настраивая файрволл, случайно зарубили порт 22?
Ага, то-то.

Предлагаю вашему вниманию инструкцию по безопасной настройке файрволла.

Сначала описание алгоритма действий:
1. create script for disabling firewall (disable_fw.sh)
2. add disable_fw.sh to crontab for run every 5 minutes
3. check if it's working
4. write iptables rules, test config
5. save rules to file
6. create startup script (e.g. /etc/rc.local) for loading rules
7. remove disable_fw.sh from crontab

Для дистров на базе RedHat все несколько упрощается, ибо старт/стоп файрволла там оформлен в виде службы iptables и настроечных файлов в /etc/sysconfig

Итак, скрипт для отключения файрволла
#!/bin/bash
# disable_fw.sh - Reset (disable) firewall
# ---------------------------------------------------------------------------------------------------------------
# Initially Written by Vivek Gite <vivek@nixcraft.com>
# Rewrited by Valentin Fedulov <vasnake@gmail.com>
# Source: http://www.cyberciti.biz/faq/turn-on-turn-off-firewall-in-linux/
#         https://gist.github.com/vasnake/de19b6162ed97b0fd92b
# ---------------------------------------------------------------------------------------------------------------
# You can copy / paste / redistribute this script under GPL version 2.0 or above
# =============================================================

# set to true if it is CentOS / RHEL / Fedora box
RHEL=false

### no need to edit below  ###

IPT=/sbin/iptables
IPT6=/sbin/ip6tables

main() {
    if [ "$RHEL" == "true" ];
    then
        # reset firewall using redhat script
        /etc/init.d/iptables stop
        /etc/init.d/ip6tables stop
    else
        # for all other Linux distro use following rules to reset firewall
        reset_iptables ${IPT} "/proc/net/ip_tables_names"
        reset_iptables ${IPT6} "/proc/net/ip6_tables_names"
    fi
}

reset_iptables() {
    local ipt_bin="${1}"
    local tables="${2}"

    $ipt_bin -P INPUT ACCEPT
    $ipt_bin -P OUTPUT ACCEPT
    $ipt_bin -P FORWARD ACCEPT
    $ipt_bin -F
    $ipt_bin -X
    $ipt_bin -Z

    for table in $(<$tables)
    do
        $ipt_bin -t $table -F
        $ipt_bin -t $table -X
        $ipt_bin -t $table -Z
    done
}

main

Теперь добавить скрипт в кронтаб для срабатывания каждые 5 минут
chmod +x /root/disable_fw.sh
nano /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
*/5  *  *  *  * root /root/disable_fw.sh

Проверить, как работает предохранитель. Для этого создать какое-нибудь разрешительное правило
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
и посмотреть, как оно исчезнет меньше чем через 5 минут
watch -d "iptables -L --line-numbers -nv"
Кстати, для IPv6 все почти также, только команда «ip6tables».

Теперь, когда мы убедились в работоспособности предохранителя, можно заняться составлением правил для файрволла и не бояться накосячить при этом. Правила лучше сразу писать в виде скрипта или файла в формате iptables-save/iptables-restore.
Если вдруг случится косяк, надо просто подождать 5 минут и все порты опять будут открыты.

После отладки лично у меня получился такой файл
/etc/sysconfig/iptables

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --set -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
Сравните с версией для IPv6
/etc/sysconfig/ip6tables

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --set -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
-A FORWARD -j REJECT --reject-with icmp6-adm-prohibited
COMMIT


В случае с CentOS или другим РедХатовским дистром, имея показанные файлы, делать больше ничего и не надо, эти правила загружаются при старте служб
iptables, ip6tables.
В других дистрах надо любым доступным способом (хоть в /etc/rc.local) прописать загрузку правил, типа
iptables-restore < /root/working.iptables.rules
предварительно сохранив рабочий набор правил
iptables-save > /root/working.iptables.rules

Последним шагом, когда все работает, надо закомментировать в crontab спасительный скрипт отключения файрволла.

Дополнительная информация:
выключить/включить службу файрволла в РедХатских дистрах
chkconfig iptables off
chkconfig iptables on
Нечто вроде визарда/мастера по первичной настройке правил
system-config-firewall-tui
Полезные сцылки



original post http://vasnake.blogspot.com/2014/07/safe-way-to-setup-firewall.html

2014-07-16

PEP 20

У Python есть свой Дзен:

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!


Как это применять на практике?


А дальше сами https://www.google.ru/search?q=pep20


original post http://vasnake.blogspot.com/2014/07/pep-20.html

2014-07-15

Фантомы / Shutter 2008

Третьего дня отсмотрел фильму «Фантомы», что в оригинале Shutter (2008).
Типа, мистический триллер, про то, как успешный фотограф и его новая (от слова «вчера поженились») жена не могут сделать ни одной толковой фотографии. На всех фотках проявляется какая-то мутная фигня.
Жена думает, это душа той чудачки, которую она сбила машиной. Но всё гораздо хуже.

А потом начинают умирать друзья мужа...

Я вообще триллеры не люблю, мне бы экшн, фантастику или детектив. А лучше, все вместе. И этот триллер не стал исключением, что там смотреть, удары скучные, защита не интересная?


Так себе, ничего особенного.


original post http://vasnake.blogspot.com/2014/07/shutter-2008.html

2014-07-14

Logging ProjectMate

Не так давно мне рассказали душещипательную историю об уровне поддержки корпоративных клиентов. За достоверность не ручаюсь, излагаю как запомнил.
Один корпоративный клиент, использующий ProjectMate в своей работе, захотел добавить функцию контроля (фактически отслеживания) хода дел, учитываемых в PM. По простому — пользователь изменил запись, атрибут карточки, параметры объекта — и сведения о состоявшемся изменении пошли к начальству. Журналирование операций по нашему.
Обратившись к изготовителю PM с запросом на добавление такой функциональности, клиент был мягко послан в поход.

Тогда клиент обратился ко мне. И вместе мы придумали простое решение проблемы — записывать изменения на уровне базы данных.

В принципе, в MS SQL есть то, что нужно – CT, CDC. Но, по разным причинам, нам это не подошло. То лицензия на базу «не энтерпрайз», то журнал разбросан по разным таблицам, сейчас уже и не вспомню всех резонов. Помню, что решили сделать по простому: навесить на нужные таблицы данных ПроджектМейта триггеры и заставить эти триггеры записывать инфу в журнал.

Подробнее можно почитать в тут: https://github.com/vasnake/pmate-log/blob/master/readme.pdf

А остальные подробности и код можно взять тут: ttps://github.com/vasnake/pmate-log

Код, собственно, состоит из скрипта создания таблицы журнала и скрипта генерации триггеров по заданному списку таблиц.

Решение должно работать практически в любой БД MS SQL и не только с ПрожектМейтом.



original post http://vasnake.blogspot.com/2014/07/logging-projectmate.html

2014-07-11

Recommender Systems


А потом начались нейросети — Neural Networks.
Потом нас учили правильно применять изученные алгоритмы (Advice for Applying Machine Learning).
А потом нам рассказали про Support Vector Machines (SVMs) и Kernels.
А потом была неделя посвященная темам Clustering (K-Means) и Dimensionality Reduction (PCA).
А после были рассмотрены алгоритмы систем Anomaly Detection и, отдельно, Recommender Systems.

Что мы знаем про Recommender Systems.

Как обычно, начинать лучше с примера. Вот у нас есть пузомерка, которая собирает у пользовавтелей мнения о фильмах в виде рейтинга от одной звезды * до пяти *****.

Задача — предсказать, какой фильм из еще неотсмотренных/неоцененных мог бы понравится тому или иному пользователю. Здравый смысл подсказывает, что для угадывания предпочтений пользователя, нам надо, чтобы он рассказал нам о своих любимых/нелюбимых фильмах. То есть, если он еще ни одного фильма не отрейтинговал, рекомендовать мы ему сможем только те фильмы, которые нравятся всем без исключения.

К такой проблеме есть два подхода. Один называется Content-based recommender systems. Другой – Collaborative filtering.

Content-based reccomender systems так называются потому, что у нас есть информация о фильмах — фичи, свойства фильмов. Например — жанровая направленность.

Итак, у нас есть данные — фичи фильмов, имеющиеся рейтинговые оценки пользователей. Надо уметь предсказывать рейтинг фильмы i для пользователя j.

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

Другой подход называется Collaborative filtering. Это потому, что у нас есть только значения рейтингов, проставленных разными пользователями для разных фильмов. Алгоритм самостоятельно определит фичи фильмов, наиболее точно отвечающие показаниям рейтингов.

То есть, имея значения рейтингов и матрицу Тета, мы можем посчитать значения фич для фильмов — задача обратная расчету матрицы Тета по значениям фич и рейтингов. Пока понятно.

Поняв про прямое и обратное вычисление мы переходим к сути — у нас есть только рейтинги. Чтобы хоть с чего-то начать, мы произвольно выбираем Тета, находим фичи Х и считаем рейтинг. Потом, минимизируя ошибку считаем новую Тета и считаем рейтинг. И опять, минимизируя ошибку считаем фичи Х, … до схождения. Это и есть алгоритм Collaborative Filtering.

Итак, у нас есть проблема курицы и яйца

Но мы можем решить ее в один заход

Такая Cost Function позволяет нам одновременно найти оптимальные параметры Тета и фичи Х.

Так, алгоритм Collaborative Filtering в целом следующий

Предварительная инициализация Х и Тета произвольными малыми значениями; минимизация Cost Function; вычисление рейтинга перемножением Тета и Х.

Мы теперь умеем предсказывать, какой рейтинг поставил бы пользователь данному фильму.

Другой вопрос — какие фильмы понравились бы данному пользователю?
Поскольку мы умеем вычислять характеристики фильмов, достаточно найти фильмы с характеристиками близкими к тем, для которых пользователь поставил высокий рейтинг — очень просто

А что же делать, если пользователь не поставил еще ни одной оценки? В таком случае мы считаем его среднестатистическим пользователем и нормализуем оценки по среднему значению  

Если же у фильма нет еще ни одной оценки, лучше убрать этот фильм из расчетов.


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


original post http://vasnake.blogspot.com/2014/07/recommender-systems.html

2014-07-10

Anomaly Detection, Recommender Systems


А потом начались нейросети — Neural Networks.
Потом нас учили правильно применять изученные алгоритмы (Advice for Applying Machine Learning).
А потом нам рассказали про Support Vector Machines (SVMs) и Kernels.
А потом была неделя посвященная темам Clustering (K-Means) и Dimensionality Reduction (PCA).
А после были рассмотрены алгоритмы систем Anomaly Detection и, отдельно, Recommender Systems.

Сегодня посмотрим на Детектор Аномалий.

Детектор аномалий — Anomaly Detection, это довольно просто. К примеру, испытывая авиадвигатели и снимая с датчиков разные показатели (температура, вибрация, …) мы получаем массив данных. Задача детектора аномалий заключается в том, чтобы, обучившись на данных испытаний заведомо исправных двигателей, переваривать результаты испытаний новых двигателей и определять — данные в норме или найдена аномалия, суть — возможный дефект.

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

Еще пример: мониторинг нагрузки на компьютеры датацентра, состояние компьютеров. Температура, ввод/вывод, нагрузка на процессор, сетевой трафик, … Обучаем детектор и оставляем его следить за порядком в датацентре. если что — он пришлет СМС-ку.

Модель, применяемая в детекторе аномалий, довольно простая. Вычисляется вероятность наличия аномалии путем оценки плотности. Эту мудрость лучше всего постигать глядя на картинку.

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

Многие уже догадались, что в основе вычислений здесь находится Нормальное aka Гауссово распределение со средним значением мю и распределением сигма^2.
Соответственно, мю и сигма это параметры модели. Их надо вычислять для каждой фичи тренировочного датасета.

И весь алгоритм детектора аномалий тогда выглядит так: выбрать фичи наиболее явно отражающие аномалии; для каждой фичи обработать записи и найти параметры распределения — мю и сигма; вычислить произведение (продукт) вероятностей по каждой фиче интересующей записи. Если результат меньше порога эпсилон — мы имеем аномалию.

Как уже было неоднократно замечено, для оценки успешности алгоритма нам нужны числовые метрики.
Чтобы получить такие метрики, мы разделим тренировочные данные на три датасета — трен.набор, набор кросс-валидации и тестовый набор.
В трен.наборе будут только нормальные записи, в наборах кросс-валидации и тестовом будут и нормальные и аномальные записи.
Используя разные фичи, разные пороговые значения эпсилон мы тестируем разные модели используя технику кросс-валидации и применяя метрики типа F1-score.

Возникает вопрос, если мы используем labeled данные для обучения машины, почему бы нам не использовать техники Supervised Learning? Ответ: детектор аномалий применяется там, где в наборах данных слишком мало записей о ненормальностях. При этом ненормальности бывают разных типов. Короче — недостаточно данных для четкого различения нормы от аномалии. Skewed classes.

Про правильный выбор фич для скармливания детектору аномалий.
Очевидно, значения выбранных фич должны укладываться в нормальное распределение, раз уж в основе модели лежит Гауссово распределение.

Другой случай — значения фич могут коррелировать между собой. Например загрузка процессора и сетевой трафик. Тогда аномалия может детектироваться, если привнести в модель синтетическую фичу = CPU load / Network traffic.

Multivariate Gaussian Distribution.
В рассмотренном выше решении есть одна проблема. Распределения фич получаются сфероидными, грубо говоря. Вот иллюстрация проблемы

Чтобы сузить области нормального распределения придумали Multivariate Gaussian Distribution.

В этой модели используется вектор мю и матрица Сигма. С их помощью можно отражать корреляцию между фичами:

Учитывая такую математическую модель, алгоритм детектора аномалий получается такой

В принципе, оригинальная модель это просто частный случай мультивариативной модели

Значит ли это, что нужно всегда использовать мультивариативную модель? Нет. Если надо экономить вычислительльные ресурсы, или если количество фич больше чем количество записей трен.сета — необходимо использовать оригинальную модель детектора.


Вот и вся история про Anomaly Detection. По известным «правильным» записям данных мы вычисляем параметры гауссовых распределений. Потом смотрим, в какое место гауссового «колокола» попадают новые данные. Если выходят за пределы пороговых значений — имеем аномалию. Великое искусство заключается в том, чтобы выбрать и собрать нужные показания — фичи. Они должны быть способны отражать наличие аномалий. 

P.S.
А на практических занятиях мы писали программу, определяющую аномалии в состоянии серверов в датацентре.
Звучит, конечно, круто, но на практике все несколько проще, чем кажется. Всего-то реализовали модель и прогнали через нее заранее заготовленные данные


original post http://vasnake.blogspot.com/2014/07/anomaly-detection-recommender-systems.html

2014-07-09

Автошкола-онлайн

Опять про Автошколу-онлайн (никак сюрпризы не закончатся).
Предыдущие заметки:

Внутренние экзамены, теория. Чтобы успешно закончить автошколу и приступить к сдаче экзаменов в ГИБДД, необходимо сдать внутрениие экзамены. Два практических (площадка, город) и четыре по теории: первая помощь, устройство автомобиля, основы безопасности, ПДД.
Теорию, первые три, сдать можно очень просто. Для этого достаточно купить в офисе на Волгоградке соответствующие DVD и изучить их. На диски записана программка, внутре которой есть тексты, картинки и видеоролики — это обучающий материал. Еще внутре программки есть экзаменатор, выдающий билеты и принимающий ответы на эти билеты, все незатейливое, под MS Windows.
После изучения материала надо прорешать билеты с этих дисков и, после успешного прорешивания, согласиться с отправкой «сертификата» в автошколу, через Интернет.
За один день можно изучить и сдать один предмет (один диск). После такого дистанционного экзамена нужно еще раз посетить центральный офис и на ресепшене поставить отметки в «карточку прогресса». Если очереди нет, это занимает одну минуту, не считая дороги в офис, конечно.
С ПДД несколько сложнее — билетов больше, учить дольше. Но процедура, подозреваю, точно такая же.

Лично я успел сдать теорию (кроме ПДД) еще до окончания занятий на тренажерах, поэтому смог отметить успехи в карточке прогресса по ходу посещения тренажерного класса. Тренажеры, напоминаю — только в центральном офисе.

Кстати, три занятия (из четырех) на тренажерах проходят вот на таких игрушках.
Прикольные. За три занятия вы получите начальные навыки по основным телодвижениям, покатаетесь по степи, горной дороге, городу с довольно интенсивным движением, учебной площадке с эстакадой, змейкой и проч.
Мне тренажеры понравились, я бы еще покатался.

Сразу после четвертого занятия на тренажерах надо бежать записываться на вождение, там же, в центральном офисе. Потребуется медсправка, ее надо уже иметь на руках. Тут, в отделе вождения, вас ждет очередное разочарование — водить вы начнете не раньше чем через месяц, ибо машин на всех не хватает, в очередь, сукины дети. Про то, что площадок для вождения гораздо меньше, чем врут в рекламе, я уже упоминал — будьте готовы разочароваться и тут.
Если повезет, то занятия по вождению уложатся в два месяца. Если выкроить время на посещение уроков вам трудно и нужен особый график (дни, часы), готовьтесь к трем, четырем месяцам. По минимуму, итого: две недели до завершения тренажеров, месяц ждать, два месяца учиться вождению = три с половиной месяца от звонка до звонка. И это если не зевать. А еще экзамены в ГИБДД.

Так что обещания «получите права через 2 — 2.5 месяца» это наглая рекламная ложь. Шанс есть, но он стремится к 0.


original post http://vasnake.blogspot.com/2014/07/blog-post_9.html

2014-07-08

subprocess.Popen

Дано: Python 2.7; на диске файлы с именами, грубо говоря, в Unicode; обработчик таких файлов, вызываемый через subprocess.Popen; желание сделать решение работающее как в MS Windows, так и в POSIX.

Версия первая.
    # posix works OK with unicode
    res = subprocess.Popen([u'python', unicode(fb2desc), u'-l', fname],
        stdout=subprocess.PIPE).communicate()[0]
тут fname — имя файла, строка в Unicode.
Сниппет прекрасно работает в Linux, только надо иметь в виду, что возвращаемый результат будет в кодировке UTF-8 (ну или какая там у вас локаль).

Пробуем запустить это в MS Windows. Не работает:
Traceback (most recent call last):
  File "C:\Python27\Lib\runpy.py", line 162, in _run_module_as_main
...
  File "fb2tools\zipname.py", line 104, in callFb2desc
  File "C:\Python27\Lib\subprocess.py", line 710, in __init__
    errread, errwrite)
  File "C:\Python27\Lib\subprocess.py", line 958, in _execute_child
    startupinfo)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 29-34: ordinal not in range(128)
модуль subprocess не хочет Unicode, он хочет байтовую строку.
Подробнее про это можно почитать тут:

Суть в том, что в Python 2 это работать не будет, потому, что уже работает в Python 3 и никто не хочет переделывать старый код. Слишком много работы. Проще обойти, задействовав напрямую ctypes.windll.kernel32.CreateProcessW

ОК, версия вторая, через CreateProcessW.
    if sys.platform == "win32":
        res = []
        def pout(s):
            res.append(unicode(s))
        def perr(s):
            print "Error: '%s'" %s
        cmd = u' '.join([u'cmd.exe', u'/C', u'dir "%s" /B' % fname])
        with win32proc.Win32ShellCommandController(cmd, False) as scc:
            scc.run(pout, None, perr)
        return u''.join(res)
Ура, работает. Но есть проблема с выводом, где-то по дороге всё, что не попадает в ascii превращается в вопросительные знаки, типа так:
Input filename: 'c:\t\p\fb2\юникод\бабенко авангардист.fb2'
fb2desc output: '??????? ???????????.fb2'
Но это еще не беда. Беда в том, что несмотря на отработку теста с «cmd.exe», вариант с вызовом Python снова не проходит:
Input filename: 'c:\t\p\fb2\юникод\бабенко авангардист.fb2'
Error: 'Traceback (most recent call last):
  File "c:\t\p\fb2tools\fb2desc.py", line 704, in <module>
    main()
  File "c:\t\p\fb2tools\fb2desc.py", line 688, in main
    data = open(raw_filename).read()
IOError: [Errno 22] invalid mode ('r') or filename: 'c:\\t\\p\\fb2\\??????\\???????'
Очевидно, интерпретатор не переваривает на входе Unicode.

Что мы имеем в итоге?

Вывод раз: можно использовать Unicode при запуске из Python 2 внешних процессов. Только надо заменить вызовы subprocess на что-нибудь более другое, использующее CreateProcessW. Я использовал
if sys.platform == "win32":
    import _process_win32_controller as win32proc
Если разобраться, что там происходит с выводом, то можно применять спокойно.

Вывод два: нет смысла подавать Unicode данные на вход процессу интерпретатора Python 2. Он это все равно не переварит. Посему, тут надо применять подход озвученный в
а именно — использовать байтовые строки в UTF-8. Ребятам оказалось удобнее использовать utf8 везде и только иногда переводить строки в Unicode. Я, видимо, предпочту использовать Unicode везде и переводить строки в utf8 только для коммуникации с внешним процессом. Правда, придется вносить правки в вызываемый модуль, чего делать не хотелось. А придется.

Вывод три: полноценная поддержка Unicode в Python 3 сильно облегчает жизнь разработчика. По крайней мере в некоторых случаях.

Вывод четыре: не взирая на технологическое превосходство ядра MS Windows (https://speakerdeck.com/trent/pyparallel-how-we-removed-the-gil-and-exploited-all-cores), тот компот, который устроили разработчики смешав в кучу коней и людей в ейном API, сильно вредит и мешает писать простые и надежные программы. Впрочем, это общеизвестный факт.


Некоторые могут спросить — а нахрена ты вызываешь внешний процесс Python из Python? Ведь проще импортнуть модуль и вызвать напрямую его функции? И я отвечу — а по приколу. Это не промышленная программа а, скорее, тренировка. Которая, очевидно, пошла на пользу, вскрыв описанные выше нюансы.


original post http://vasnake.blogspot.com/2014/07/subprocesspopen.html

2014-07-07

Автошкола-онлайн

Опять про Автошколу-онлайн.
Я уже демонстрировал некоторые особенности их бизнеса

Поэтому никого не должно уже удивить то, что я сейчас расскажу.

Стоимость обучения на 70-80% состоит из оплаты практических занятий. Вождение как бы. Мы уже знаем, что сколько бы занятий мы не выбрали (одно занятие — два академических часа = полтора часа чистого времени), четыре первых надо провести на тренажерах.
А вот то, что пока не все знают: первое занятие из этих четырех проводится в классе за партами, к которым на соплях струбцинами прикручены рули. Из полутора часов занятия мы полчаса эти рули крутили, получали первичные навыки руления.
Нехуевый такой тренажер, правда? А деньги заплачены как за настоящий.


original post http://vasnake.blogspot.com/2014/07/blog-post_7.html

2014-07-04

Pumping

30 июня 2014 года в Строгино опять дуло. Не так хорошо как в прошлый раз, на бластинг не вытаскивало, но было близко к тому. По прогнозу должно было быть 6-10 метров/с.
Мы не могли пропустить такой прогноз и поехали катацца — виндсерфинг форева!
Было относительно тепло, короткого гидрика было достаточно, если не купаться — вода не выше 15 градусов.
Солнечно, за пару часов я заметно подрумянился.

Хорошо покатались, душевно.
Я осмелел настолько, что начал осваивать пампинг для выхода на глиссирование при нехватке ветра. Пару раз получилось вытолкнуть доску и разогнаться, но, увы, доска сходит с режима — ветра таки не хватало чуть-чуть. И мастерства тоже.






original post http://vasnake.blogspot.com/2014/07/pumping.html

2014-07-03

Водный старт в петлях

Где-то я краем уха слышал про «водный старт в петлях». Решил поинтересоваться, что это и зачем.

Ответ довольно прост и вытекает из ответа на другой вопрос — а зачем вообще на доске петли (footstraps)? Для контроля и стабильности, чтобы доской управлять и не свалиться с нее. Короче, если колбасит сильно, чоп/волны, доска маленькая и скользкая — попробуйте водный старт сразу в петлях.




original post http://vasnake.blogspot.com/2014/07/blog-post.html

2014-07-02

-fno-delete-null-pointer-checks

На днях видел прекрасное:

Доступны корректирующие выпуски DNS-сервера BIND 9.10.0-P2, 9.9.5-P1 и 9.8.7-P1, в которых устранена серия уязвимостей и решена проблема, способная привести к краху процесса в непредсказуемые моменты обработки запросов. Примечательно, что проблема проявляется только при сборке с использованием GCC 4.9.0 и более новых выпусков и вызвана изменением работы оптимизатора GCC. В частности, начиная с GCC 4.9 по умолчанию включается режим удаления лишних операций сравнения с указателями NULL


Какая прелесть! Лишние операции проверки на NULL. Я понимаю, некая сермяга в этом есть, конечно. Типа, код надо писать правильно. Но скажите мне, кто в состоянии написать хоть сотню строк абсолютно правильно? А разработчики компилятора в нас верят, очевидно. Спасибо им за это.

Иллюстрация того, что именно оптимизатор GCC 4.9 считает лишними проверками на NULL:

The gcc optimization level 2 or higher will delete null-pointer checks
beyond the first use/test of a pointer. For targets such as the ARM7
that do not have a hardware memory manager, this can cause silent
failures...for example, consider the following code:

void bad_code(void *a) {
    int *b = a;
    int c = *b;
    static int d;

    if (b) {
        d = c;
    }
}

If using -O2 or higher, the conditional test for b will not be
performed (i.e. d=c will always be executed regardless of whether a
value of 0 was passed into the function).


This can be fixed by using the compiler flag:
-fno-delete-null-pointer-checks

Используйте этот флаг при компиляции с оптимизацией -O2 или выше. А не то пожалеете :)

А вообще прэлестно, да.



original post http://vasnake.blogspot.com/2014/07/fno-delete-null-pointer-checks.html

2014-07-01

Еще про Автошколу-онлайн

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

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

Фокус тут простой и, как тут заведено, бъет по вашему карману. Площадок (автодромов) не больше десятка (ну, может и больше, я не считал) и уж точно не у каждой станции метро. Но есть опция — инструктор вас встретит у выбранной станции метро и отвезет на площадку. Время, потраченное на эти маневры, вычитается из времени занятия (90 минут). С учетом того, что инструктору позволительно опоздать на 15 минут, от занятия остается хорошо если половина.

Правильный способ прохождения практики — заранее выбить из работников автошколы местоположение автодрома и самостоятельно приезжать туда. Без опозданий.
Это уже не так легко и удобно, как обещано на сайте, правда?

А вот два показательных отзыва от учеников:

МИНУСЫ:

1.дорого (не стоит доверять тому, что посчитаете по информации на сайте). Подробнее в нижеописанном

2.директор автошколы — хам и крайне неприятный человек, которого не уважают и не любят сами работники автошколы

3. персонал автошколы хамоват и не слишком то вежлив (приветлив только при записи в школу)

4.придется раз 15 съездить на Волгоградский проспект (заплатить, расписать первый этап занятий, расписать второй этап занятий, лекция по медицине, зачет по медицине, 4 занятия на тренажерах, докупить занятия по вождению, привезти документы, снова привезти документы и т.д. и т.п.)

5.площадки не имеют искусственного освещения и не оборудованы (кроме Волгоградки) — вечером занимаетесь вслепую

6.если не заниматься на Волгоградке, то сдать там внутренний по площадке нереально, т.к. крайне плохой рельеф

7.занятия по вождению никогда не проходят положенных 1,5 часа, т.к. у инструкторов вообще нет перерывов между учениками. 5-10 минут от каждого занятия — в итоге за 3 занятия я просто подарила деньги автошколе

8. первые 4 обязательных занятия на раздолбаных компьютерных тренажерах — бессмысленная трата денег и времени (стоят столько же, сколько и обычные занятия на авто). Потом на авто все приходится заново учиться делать.

9.до отдела вождения дозвониться практически нереально (из 10 попыток удались 2, и то менеджер по Профсоюзной площадке всегда отсутствует на месте)

10. много идиотских нелогичных и неудобных правил (например, почему не соединить по телефону с другим менеджером, если мой отсутствует на месте; а если я приеду лично, то меня примет этот другой менеджер)

11.экзамен в ГИБДД ждала месяц!

12.внутренняя организация процессов отвратительная. Клиентами не дорожат и ни во что их не ставят. Например, почему бы не предупредить своих клиентов на экзаменах в ГИБДД, что после сдачи площадки нужно подождать в здании ГИБДД, пока ее не сдадут остальные ученики. Если приехать сразу к месту сдачи Города, то можно прождать 4 часа (на улице минус).

13.запись на практику на авто только после тренажеров, но при этом приходится ждать 2 недели, т.к. могут быть заняты все инструкторы

14.если пропустишь занятие – реальная проблема его откатать из за высокой загрузки инструкторов

15. на лекциях может не хватать мест учащимся!

ПЛЮСЫ:

1. Преподаватели и инструкторы

Если решились выбрать эту автошколу:

1. Берите минимум пакет Полный – сдаете внутренний по площадке главному инструктору, а внутренний город – своему. Потом ГИБДД. НЕ ПРОБУЙТЕ покупать Стандарт, т.к. сдать внутренний директору нереально.

2. На практику берите только Волгоградку – есть освещение, сложный рельеф, что пригодится и в ГИБДД, хорошо оборудована, так что инструктору не приходится тратить ваше время на то, чтобы переставлять столбики. Городской маршрут там также сложный, но потом проще в ГИБДД.

3. Рассчитывайте на период обучения 6 месяцев (я так и училась, хотя делала хорошие успехи). По общению с другими учащимися – это стандарт. 2,5 мес – просто нереально, хотя бы из за времени ожидания экзаменов в ГИБДД, если конечно вы уже не умеете хорошо водить авто

4. Сходите на 1(из 4-х) занятие по медицине, чтобы отметиться. Диск покупать не нужно – всю инфу можно найти в интернете, тем более, что на сайте автошколы вывешены вопросы к зачету и можно подготовиться заранее.

5. Не пытайтесь качать права, т.к. только свои нервы потеряете и больше ничего не добьетесь. Если в компании такой руководитель, как в этой автошколе, то поправить ничего нельзя.

6. Последний совет: ВЫБИРАЙТЕ ДРУГУЮ АВТОШКОЛУ!




Давно собиралась написать отзыв об автошколе Онлайн и вот наконец руки добрались)

Скажу сразу — права лежат на полочке и я очень довольна!

Пошла учиться с подругой на последней неделе августа в филиале Ясенево. Оплатили вначале теорию, потом через неделю съездили оплатили практику (брали мы максимальное количество часов — 52).

Теорию нам рассказывал очень хороший преподаватель, фамилию к сожалению не помню. Рассказывал все очень подробно, так что вопросов просто не оставалось.

Где-то через неделю после начала теории, мы подъехали в центральный офис и записались на тренажеры (они проводятся там же). Распределили все 4 занятия (это обязательно) сразу на ближайшую неделю. Так как мы студенты, и времени было довольно много, то с распределением проблем не было.

После того, как прошло последнее занятие по тренажерам, мы, в этот же день, пошли расписывать себе практические занятия. Как они и предупреждали, пришлось назначать занятия на 2-3 недели позже, так как очень большая загрузка у инструкторов. Распределили сразу на все время, так что подъезжать по поводу практики больше не приходилось.

Когда пришло время практики, я созвонилась с инструктором, мы встретились у моего метро и начали занятия. Мне попался инструктор Алексеев Р.Г. Хочу высказать ему благодарность за то, чему он меня научил! Уже на втором занятие я ездила змейку задом, на 4 (!) я уже выехала в город, а еще через занятие поехала в центр Москвы! И это при 52, максимальных часах! Так что все оставшиеся 15 занятий у меня прошли в городе, с заездами на площадку.

Он очень быстро нашел ко мне подход и выбрал методику обучения.

Экзамен в автошколе мы сдавали в режими онлайн, что мне кажется удобным не только по тому, что сидишь дома, а потом просто приезжаешь поставить зачет, а хотя бы по тому что тебе нужно по 2 раза пройти каждый экзаменационный билет! Что является хорошей практикой перед сдачей теории в гаи! Также для права сдавать в гаи, нужно было еще сдать «медицину» (оказание первой медицинской помощи). По ней читают отдельные 4 лекции. На первую сходить обязательно, на другие по желанию. Те, что приходит первый раз, могут купить за символическую сумму (по-моему 50 р.) диск с полными лекциями, и подготовиться к тесту. На самом деле лекции были очень интересными, и я даже жалею, что мы сходили лишь на одно занятие. Дома можно подготовиться, и прийти в определенный день (он есть на каждой неделе) и написать тест. Можно допустить лишь одну ошибку из 20 вопросов.

Когда пришло время сдачи в гаи, проблем тоже не было. Мы приехали к назначенному времени, нас там встретил представитель автошколы с нашими карточками. У некоторых возникла путаница с документами (кто-то поздно подвозил копии паспортов) и их переназначили на другие даты. Это пожалуй и было самым неприятным. Но у меня все было норМально, так что я спокойно пошла на теорию и сдала ее. Потом пошли на площадку. Ждать пришлось около 1.5 часов на морозе, но и с этим справилась, сдала площадку. С городом повезло меньше и сдать его не удалось с первого раза. Не буду лукавить, но сдала город только с 4 раза (экзамен назначали почти каждую неделю). По сути, сдавать в гаи не сложно, тем более что у них сейчас везде видео регистраторы стоят, так что если ты и валишься, то только на своих ошибках! У меня было именно так! Я сразу же осознавала, что сделала не так. Но с четвертого раза у меня получилось совладать с собой.

Оценка автошколе 5 !

Так что все в ваших руках! Подводят нас, только наши нервы!!!




original post http://vasnake.blogspot.com/2014/07/blog-post_1.html

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) Baltic (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)