понедельник, 29 декабря 2014 г.

Почему YII2 Captcha может не работать

YII2 всеж таки посырее будет значительно, чем первый YII.  Не обошли стороной баги и капчу.  Если, вдруг, YII2 капча начнет ругаться Captcha  Could not read font, а  шрифт лежит на месте и все вроде как надо, то это не повод отчаиваться.
Вероятнее всего  ошибка выскакивает в  файле  CapthaAction.php в строке
с кодом
        $box = imagettfbbox(30, 0, $this->fontFile, $code);

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



среда, 10 декабря 2014 г.

YII2 SQL bind array

Свистоперделки рулят. Реальный код - нет.
SELECT * FROM table where field in(:param)

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

И это YII2.





среда, 29 октября 2014 г.

Node js полезные сведения для написания консольных программ

Итак, дорогой задро.неудачник. Раз ты  попал сюда и читаешь этот  текст, значит ты серьезно "попал". Наступил, вероятно, в детстве коту на хвост и попортил карму. Или переспал с несовершеннолетней внучкой босса, или.... да мало ли. Может просто накопились грехи за прошлые жизни. Так или иначе, тебе выпала тяжелая кара в виде написания консольной утититы на nodejs.  Ага. асинхронной и ага, работающей с текстовыми файлами. 
Так вот. Самый полезный тебе совет. Беги быстрее из той конторы нахрен.  Только гомосеки пишут консольные утилиты на node.js. Что не можешь? Прикован за ногу цепью к батарее? Отгрызай себе нахрен ногу и уползай оттуда. Лучше быть одноногим, чем быть одиноким заниматься разработкой на node.  Вся эта ипучая асинхронность в рамках однопоточности это только от тяжелых наркотиков бывает. 
В общем беги, ползи, умри, на худой конец. Вот тебе мой совет.

вторник, 21 октября 2014 г.

Node js кошмар в реальности

Ну кто бы мог подумать, что ночной кошмар воплотится в реальность. Я пишу на node.js. И не просто так, а коммерческий продукт.  И что? И ничего. Человек ко всему привыкает. Особенно за деньги. 



четверг, 2 октября 2014 г.

MySQL Дерево

 В очередной раз в очередном проекте встречаю в очередной раз  рекурсивное построение дерева  структуры id - parent_id .   Чуть больше сотни запросов в базу. Чуть  более  100% загрузки сервера.  Я согласен с тем, что программист должен быть тупым и ленивым. Но думать при этом все же нужно иногда.   Есть две типовые задачи, когда нужно шерстить дерево  или солидную ветку  целиком.  Первая - когда из-за  всеобщего пофигизма и косячества, в  страницу пронтенда надо выводить дерево категорий или его ветку  целиком без ленивой подгрузки. И вторая, когда нужно собрать идентификаторы всех потомков  начиная от  какого-то узла.

Первая задача - тривиальна и должна решаться построением дерева ссылок на основ единожды слизанного списка всех узлов. Да да. Это то самый случай, когда PHP уделывает MySQL на 1-2 порядка в скорости работы. Потому что  Ораклы так до сих пор и не сподобились сделать (скопипастить из большой базы ) возможность хранения деревьев в MySQL .

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

 
SELECT * from (
 ( SELECT :categoryId )
      union
 ( SELECT cat2.id AS id   FROM category AS cat1
          LEFT JOIN category AS cat2 ON cat2.parent_id = cat1.id
          WHERE cat1.parent_id =:categoryId and (not cat2.id is null) )
      union
 ( SELECT cat3.id AS id  FROM category AS cat1
          LEFT JOIN category AS cat2 ON cat2.parent_id = cat1.id
          LEFT JOIN category AS cat3 ON cat3.parent_id = cat2.id
          WHERE cat1.parent_id =:categoryId and (not cat3.id is null) )
) as bingo

Это вот, например, список всех идентификаторов, начиная с текущего узла, при уровне вложенности потомков  - два.

И перестаньте, наконец, делать рекурсивные запросы. MySQL этого не любит.


суббота, 27 сентября 2014 г.

32 битный ARM это круто

Ощущения от пересадки с 8 битного AVR на 32 битный ARM - непередаваемые!
Весь головняк и траходром  с арифметикой испарился без остатка. Наконец-то можно складывать лонги и не сжимать очко в ожидании нехватки тактов. Интегрирование MEMS датчиков превратилось в интегрирование, а не в шаманство с бубном по экономии пары тактов.
И да! Таки на Вильяма нашего Шекспира кватернионы можно по-людски замахнуться. 168 МГц и 32 бита. Супротив 16 МГц и 8 бит  это сила! А еще в нем FPU есть. Это вообще какое-то читерство после AVR.  
3.3 вольта немного напрягают. Надо повторители кое-где вешать. Но это такие мелочи в сравнении с возможностью писать вменяемую алгоритмику.

понедельник, 22 сентября 2014 г.

Все в жизни возвращается, на круги своя.

Взял вечером с полки почитать Кернигана и Ритчи.  Потому как одно дело в AVR-ках  баловаться, а другое дело STM32 контроллеры. Надо бы вспомнить как  оно было. Уж полтора десятка лет  без серьезной практики на Си. И так,  защемило, в душе.....   15 лет в профессии насмарку считай. Ну какого хрена я  перекинулся в веб программирование в свое время. Ну зачем я изменил старым добрым десктопам.  Чего мне было мало?  Денег? Почета?  Или может интерес пропал? Ну... может с последним чуть-чуть так и было. Захотелось чего-то нового, перспективного, как тогда казалось. И что? Прошло 15 лет. всяких перлов-пыхов и прочих html-ей со скриптами.  И стал я почетным сеньором интернет-говнокодером. 15 лет  однообразных страничек, формочек, админок.  И иногда по вечерам  поиграться с ардуинкой какой.  И все казалось так и должно быть,  пока  в руки не попала книга из той, прошлой, но очень настоящей жизни и настоящего программирования.
Эх жизнь, жестянка! 


пятница, 19 сентября 2014 г.

О вакансиях на удаленную работу PHP программисту.

Интересно, все работодатели, ищущие на постоянную должность PHP разработчика на удаленку,  неадекватные идиоты с комплексом наебывальщика, или все-таки  найдется хоть один вменяемый?






четверг, 18 сентября 2014 г.

stm32f407 и i2c

Ух тыж... ... мать....
Других слов нет. Если в какой ардунине или тексасовой мпушке i2c заводится на раз левой задней ногой. То аппаратный i2c на stm32 серии   при таком же подходе, как к ардуине будет в лучшем случае работать глючно и виснуть. В худшем, вообще не заведется. отчего, Собственно, говоря, куча народу занимается   на этих камнях безысходными говновелосипедами  реализацией софтверного i2c на тех же самых  выводах, путем ногодрыга по таймеру.
Я тоже не избежал участи сей.  Бег по граблям был долгим и неприятным.  Но победил.
Для начала я пробежался по всем детским  граблям, связанным с тактированием и делителями частот,   STM32F407 - классный камень, но блин..... Не все такие крутые шаманы, чтобы лихо  нащелкать нужных делителей и множителей на нужные ноги и интерфейсы. Особенно угнетает, что даже для демо плат, той же STM32F4Discovery , нету простых заголовочных файлов, тупо включающих в той или ной комбинации всю периферию на максимальной частоте от внешнего кварца. Ну почему? Типа чтоб разработчик сразу познавал дзен? 
Ну да. Я познал дзен. Путем нескольких бессонных ночей я таки собрал нужные настройки по частоте. И хрен я теперь этот файл когда буду менять.  Незачем просто.  Вот может соберусь и выложу в доступ.
Далее. После детских граблей, когда частоты правильно выставлены, ноги затактированы, подтяжечные резисторы включены  и на  потуги управлять интерфейсом  даже меняются уровни на ножках,  наступает вторая фаза. Уровни со стороны мастера меняются, а слейв отвечает не в попад или не всегда, или тупит, ил теряет что-то или потоком читает из одного регистра, а  потом виснет.   И наступает второй цикл бессонных ночей, когда качаешь их интернета всякие  примеры работы с шиной. А они однотипно не работают. Или работают  не дальше, чем чтение регистра WHO_IM. И свирипеешь. И понимаешь, что где-то какая-то жопа. Или думаешь, что камень кривой, или думаешь что что-то спалил. А потом краем глаза где-то в интернетах читаешь, что у кого-то тоже не работало, так он провода укоротил до датчиков и все заработало. И ты укорачиваешь и без того коротенькие провода. и паяешь и наращиваешь толщину. И все равно та же жопа. И что обидно. Эта же плата  с датчиками, воткнутая в ардуинку,  работает как швейцарские часики даже с двухметровым кабелем, скрученным из остатков китайской витой пары.  И ты свирипеешь еще больше. И тут приходит осознание. 3.3 вольта. Питание с шины от которой живет процессор.   Думаешь....   И приходит озарение. Паять времени нет.  В три часа ночи трясущимися руками ты подводишь к датчику непонятных три вольта от двух китайских батареек и случается чудо!  На байт! Ack! На еще! Ack!  еще, еще, еще Ack!  байтики бегут, параметры собираются. Ты уже прикидываешь как правильно интегрировать гироскоп..... Но тут некстати виснет отладчик. Перегружаешься и .... Ага и ничего не работает. Нифуа ни ресеты ни пляски с бубном. 
На следующий день - следующий раунд. Собираешь все обратно. Подтыкаешь   батарейки и то, что вчера не работало, опять  бодро работает.  Чертовщина какая-то.  Пара тестов туда-сюда и опять жопа. Тыцкаешь в ножки  щупом померять уровни, так блад и есть,  плата датчиков зажала шину и держит.   Втыкаешь в ардуину для теста. Там как всегда все хорошо.
Начинаешь думать. И мысль приходит - вероятно мастер не закончил прием. Тут же моделируешь ситуацию, и да. 100% воспроизведение. Шина залочена слейвом.
Ну что. Как бы решение простое.  Дать слейву дотрындеть то, что не успел, из-за прерывания или из за еше чего-то.
И все. Все работает. Но блин как все строго.  Развращенный ардуинками, где на шине все само, поимел кучу седых волос, чтобы завести i2c на STM32  .  Но!  По-большому счету это вероятно правильно.  Спецификацию нужно соблюдать на 100%.   Хотя произхводителям других кристаллов честь и хвала за то, что многие кривости работы с интерфейсом они прощают.



суббота, 13 сентября 2014 г.

L3G4200D лыжи не едут

L3G4200D - очень странный гироскоп.    На осях гироскопа,  находящихся перпендикулярно  или  около того к оси вращения, моментально накапливаются совершенно дичайшие погрешности.  После даже медленного поворота на 90 градусов туда и обратно, может набраться погрешность до 60 градусов в любую сторону.  Причем этот же датчик этой же оси, при вращении именно  в ее измерительном направлении, вполне себе врет на процент- другой, не больше.
Или я интегрировать разучился, или конкретно мой экземпляр  битый, или есть какая-то хитрость....

вторник, 9 сентября 2014 г.

jQuery EasyUI Что-то это мне напоминает.

Посмотрел давеча близко и пристально на  jQuery EasyUI.

И  возникло смутное дежавю. Где-то я это все уже когда-то видел.  Ну конечно. Это же вылитый ExtJS  6-7 летней давности.