arilou: (Default)
Для быстрого практического въезжания и применения, ориентированное на того, кто много на чём программировал, и потому в сотый раз объяснять ему про наследование и полиморфизм не нужно.

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

Ну и хотелось бы, по возможности, под ту версию, что надо вот уже прямо сейчас использовать мне: SE 7. Заглянул в "Библиоглобус": там всё больше EE 7 и 8, видел и SE 8, вроде бы. Но читать, держа постоянно в голове, что "некоторая неизвестная заранее часть этого в нашем случае не сработает" не хотелось бы.

Vim

Jun. 9th, 2016 02:51 pm
arilou: (Default)
С самого начала, как узнал и освоил редактор vim (лет 15 назад, кажется), воспринимал его название только как сокращение от "Vi IMproved" (или "Vi Improved More").
Сегодня вдруг узнал, что слово 'vim' есть в нормальном человеческом английском. И нельзя сказать, чтобы его значение было совсем уж неподходящим для программы. ;)
arilou: (Exquemelin)

echo "main(i){for(i=0;;i++)putchar(((i*(i>>17|i>>9)&46&i>>3))^(i&i>>10|i>>100));}" | gcc -x c - && ./a.out | aplay


;)
arilou: (Default)
Нужно мне иметь небольшой файлик данных, вполне достаточно формата ключ-значение.
Ставить ради этого какую-то "серьёзную" базу данных лениво и вряд ли нужно. И sqlite не хочется, потому что лишний слой sql-запросов мне тут нафиг не нужен.
Дикого быстродействия не требуется.
Но и просто вариант текстового файла, перезаписываемого каждый раз целиком, думаю, уже не годится.
Смотрю, что есть в питоне... dbm, gdbm, bsddb (и dbhash поверх него).
В простейшем случае, наверное, можно брать что угодно.
Но всё же, есть ли какие соображения за/против?
arilou: (Default)
На работе в соседней комнате идёт техническая дискуссия про особенности работы с сетью.
В какой-то момент долетают две фразы:
«
– ...Хорошо, расскажи нам своё ви́дение.
– У меня не ви́дение, я только что перечитал документацию.
»
arilou: (Default)
А кто что скажет про такой способ недопущения запуска второго экземпляра процесса? (При условии, что у меня нет потребности извне узнавать PID уже запущенного экземпляра.)
import socket
import sys
import time

def get_lock(process_name):
    global lock_socket   # Without this our lock gets garbage collected
    lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
    try:
        lock_socket.bind('\0' + process_name)
        print 'I got the lock'
    except socket.error:
        print 'lock exists'
        sys.exit()

get_lock('running_test')
while True:
    time.sleep(3)

О том, что это Linux specific, я уже прочитал.
arilou: (Default)
Какой из способов проверки существования процесса лучше и чем:
1) проверить существовании каталога /proc/PID (где вмето PID - значение pid процесса)
2) послать ему сигнал 0 и проверить успешность

Что более переносимо? (вопрос не про винду, конечно, там /proc нет)
Какие ещё плюсы или минусы?
arilou: (Default)
Вот что меня удивляет в синтаксисе питона, так это почему внутри конструкци итератора (оно же list comprehension) в случае "многоэтажного" цикла самым внешним оказывается самый левый, а не самый правый цикл.
При том, что в случае одиночного цикла этот цикл заключает в себе стоящее слева выражение, было бы логично, чтобы при двух циклках правый заключал в себе левый (а тот, в свою очередь, так же заключал в себе стоящее слева выражение).
arilou: (Default)
Ищем программиста хорошего. Писать в основном на Python (2.7), в основном под линукс (хотя какие-то скрипты может потребоваться делать совместимыми с виндой). Основное направление работ -- функциональное тестирование и прочая инфраструктура разработки.

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

Upd.: скорректировал насчёт junior'ов. Junior'ы не рассматриваются.
arilou: (Default)
Вот такая задачка:
Есть некий скрипт, писанный на питоне, крутится более-менее постоянно (под screen).
Обощённо цикл работы состоит из проверки, не пришли ли "данные" для обработки, и если пришли -- происходит довольно долгая (десятки минут) обработка.
Захотелось его перезапускать для обновления, не ловя момент окончания обработки.

Простейшие варианты:

1) Функции семейства os.exec* -- успешно подменят старый процесс новым, всё замечательно, но если новый почему-либо не стартует, то это надо заметить, потом исправить -- только тогда работа продолжится.

2) Вызвать новый скрипт через subprocess.Popen, убедиться, что он нормально взлетел, после чего завершить старый. Исправляет недостаток первого пункта, но новый скрипт, используя ту же "консоль" (те же stdin/stdiut, stderr), при этом выпадает из jobcontrol'а, т.е. крутится в фоне по отношению к шеллу, из которого был запущен старый скрипт, а из старого мы попадаем обратно в шелл. И при том отт фоновый новый скрипт не может подхватить команда fg.

Есть ли способ избавиться от недостатков обоих методов, не выделяе контроль за перезапуском в отдельный процесс?
Кроссплатформенности от данного механизма (пока?) не требуется.

(На крайняк мне пока годится первый вариант, поскольку перезапуски пока что как правило контролируются вручную, да и короткий даунтайм в общем-то не страшен. Но всё же интересно, может, есть простое решение?)
arilou: (Default)
Странным образом ведёт себя mercurial, когда в репозитории есть бранчи, имена которых оказываются префиксами других бранчей (наприммер: 'dev_2.4', 'dev_2.4_tests', 'dev_2.4_main', 'dev_2.4_main_bugs' -- первое имя является префиксом остальных трёх, третье является префиксом четвёртого).

Параметр --branch команды hg incoming выполняет не сравнение точно сравнение имени бранча, а выбирает все бранчи, имена которых начинаются с указанной строки. Т.е.
hg in -b dev_2.4
проверит (и вытащит, если с --bundle) мне все вышеперечисленные бранчи, а не только сам dev_2.4
Аналогично и команда
hg pull -r dev_2.4
вытащит все 4 перечисленных бранча.

Какого-либо ключа для ограничения выборки только точным соответствием имени бранча - не нашёл.
Баг? Мисфича? Или я чего не понял?

Да, я уже сообразил, что при большом желании можно написать скрипт, который проверит все changeset'ы, которые вернёт hg in, составит список нужных и укажет их явным образом. Но это всё же workaround, а не правильное использование правильно спроектированной фичи.
arilou: (Default)
Вроде бы с нынешними широкими экранами старое правило "строки кода должны быть не длиннее N символов", где N колебалось от 72 до 80, кажется неактуальным. Строка на 160 символов на экране помещается...
Но стоит начать пользоваться двустраничными диффами (когда слева старый вариант, а справа новый), как удобство ограничения в 80-100 или типа того символов тут же актуализируется. ;)
arilou: (Default)
Внезапно наткнулся на то, что MySQL при COLLATE utf8_general_ci (или utf8_unicode_ci) не различает не только большие и маленькие буквы (что как раз нужно, и суффиксу _ci соответствует), но также не отличает буквы с диакритикой от их "обычных" аналогов, в частности 'Melkor' == 'Melkör' и 'kossak' == 'KOŞŞAK'.

Если задать COLLATE utf8_bin -- то теряем и регистронезависимость, что не устраивает.

Погугли немного, поискал на http://stackoverflow.com -- похоже, решение на уровне базы данных отсутствует, т.е. придётся включать utf8_bin, а регистронезависимость реализовывать на уровне приложения.
arilou: (Default)
Из чатика с коллегами (а туда - из фэйсбучика попало).
Переделка известного анекдота, но всё равно хорошо.

Программист на приёме у психиатра.
ПРОГРАММИСТ. Доктор, что мне делать? Мой код проходит все тесты с первого раза без единой ошибки!
ВРАЧ (не отрываясь от бумаг). Ничего страшного, вот вам рецептик, попрограммируете недельку регэкспы, и всё пройдёт.
ПРОГРАММИСТ. Доктор, но я выполняю все задания точно в срок!
ВРАЧ. Да, случай интересный, но бывает. Вот вам направление к опытному ПиЭму, посидите на совещаниях часика по четыре, позаполняете таймшиты - через месяц будете факапить, как все.
ПРОГРАММИСТ (в отчаянии). Доктор! Я чувствую и понимаю потребности пользователей!
ВРАЧ (роняя пенсне). Оп-паньки!..
arilou: (Default)
Видим в чужом коде такую функцию и ужасаемся:
def reprList( _list, divider=',' ):
    param_string = ""
    if _list:
        for val in _list:
            param_string += repr(val) + divider
        return param_string[:-(len(divider))]
    return param_string

Тут же делаем свой вариант, который и короче, и понятнее:
def reprL( list_, divider=',' ):
    return divider.join(repr(val) for val in list_)


Затем берём модуль timeit, пробуем на нескольких примерах, и радость наша сменяется озадаченностью:
Read more... )
arilou: (Default)
В рабочем чатике позабавились тем, что у одного из коллег по статистике svn число удалённых строк гораздо превосходит число добавленных и изменённых. Вспомнили и про "Delete your code".

После чего (наверняка по ассоциации со скороговорочкой "Шёл Шива по шоссе, сокрушая суще") мне вдруг пришло в голову это слово: "Шива-кодинг".
arilou: (Techno-samurai)
К тому, что винда падает в синий экран или винвордик вдруг рушится с несохранённым документом -- все уж давно привыкли, как к непогоде за окном.
Когда во время важного/срочного звонка вдруг "повисает" шибко умная звонилка -- это бесит, но тоже как-то терпимо.
А если такого же (или куда хуже) качества код и железо управляют вашим автомобилем?

http://ko.com.ua/kachestvo_vstraivaemogo_po_ili_pogrom_vsyo-taki_sluchilsya_98518

P.S.: Комментарий Лёхи Шукаева (после коротенькой дискуссии о том, что в "умной машине" должен быть тумблер, переводящий всё на ручник или хотя бы на холостые обороты): "Просто никто и никогда не рассматривает комфорт как риск".

P.P.S.: Да, "умные дома" -- та же жопа, только в профиль. Даже такая простая штука, как включение света по датчику движения требует дублирования кнопкой.

Update: И ещё подобное: http://itc.ua/news/v-nhtsa-podana-zhaloba-na-neprednamerennoe-uskorenie-tesla-model-s/
arilou: (Default)
http://www.computerra.ru/79247/jbig2/
Шикарный баг, лишний раз напоминающий старую шутку:
"Если бы строители строили так, как программисты программируют, то случайно залетевший дятел мог бы разрушить всю цивилизацию."
Которая всё менее похожа на шутку. :(
arilou: (work-new)
Кинули тут коллеги картинку (с Хабра)
Read more... )
arilou: (Default)
На работе в программистском чате промелькнуло:

x/=x&-x;

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

Profile

arilou: (Default)
Danil "Eleneldil G. Arilou" Lavrentyuk

February 2017

S M T W T F S
   1 234
567891011
12131415161718
19202122232425
262728    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 28th, 2017 04:46 pm
Powered by Dreamwidth Studios