Сколько у людей неактивные контакты живут
OlleGh: привіт
Я: Ми знайомі?
OlleGh: так я колсь 14.06.2007 20:54:25 питався Вас щось по асемблері :-D
Я: 0о
No title available

oozey mess
Misplaced Lens Cap
🩵 avery cochrane 🩵
No title available

No title available
h
Doug Jones
art blog(derogatory)
The Bowery Presents
2025 on Tumblr: Trends That Defined the Year
Noah Kahan
Cosimo Galluzzi
Cosmic Funnies

titsay
official daine visual archive

Jar Jar Binks Fan Club

izzy's playlists!
Sweet Seals For You, Always

Kiana Khansmith

seen from Canada

seen from Brazil

seen from Türkiye
seen from Venezuela

seen from United States

seen from Kenya
seen from Türkiye
seen from United States
seen from China
seen from Mali
seen from Netherlands
seen from United States
seen from Australia
seen from United Kingdom

seen from Spain
seen from United States
seen from Colombia
seen from Russia
seen from United Kingdom
seen from Canada
@ziumin-blog
Сколько у людей неактивные контакты живут
OlleGh: привіт
Я: Ми знайомі?
OlleGh: так я колсь 14.06.2007 20:54:25 питався Вас щось по асемблері :-D
Я: 0о
OpenID
Дошли руки до разборок с OpenID. Цель - прикрутить OpenID в качестве альтернативы регистрации/входу в проекте на Symfony2 PR4 (все некогда портировать на более новую версию).
Решил пойти стандартным в таких ситуациях путём:
почитал что такое OpenID;
нашел простую и работающую библиотеку (не самому же писать :3);
оформил в виде бандла к фреймворку, чтобы можно было использовать в других проектах (только разницу между pr4 и версией фреймворка нового проекта учесть, а это - мелочи).
Основы OpenID
OpenID делается в 3 основных шага:
Сгенерить URL, на который отправить пользователя для того, чтобы он подтвердил отправку своих данных;
Получить данные (после подтверждения пользователя перебрасывают обратно к нам с кучей GET-параметров информации);
Теневым запросом провайдеру OpenID проверить полученные данные (дабы юзер не наебал нас изменил данные, подменив GET запрос к нашей странице).
Первый шаг довольно просто пройти. От пользователя мы получаем его OpenID идентификатор, например, blablabla.livejournal.com. Используя этот идентификатор, с помощью Yadis discovery получаем URL провайдера, на который надо редиректнуть пользователя. Добавляем к полученному URLу параметров, где указываем информацию, которую хочется получить (мыло, имя...).
Для получения данных от провайдера достаточно реализовать скрипт, который может сграбить кучу GET-параметров, которые к нему попали.
После этого необходимо проверить полученные данные, послав теневой check_authentication запрос по ранее полученному URLу и отпарсить ответ.
В качестве готового решения был выбран простой как грабли класс LightOpenID by Mewp.
После этого - довольно легко был написан бандл (ознакомится с кодесом можно на гитхабе), который отдает сервис с методами start и finish. start реализует шаг 1, finish - получает и проверяет полученную от OpenID провайдера информацию, а также возвращает массив полученной информации (мыло, имя...).
При этом использование сервиса становится тривиальным.
/** * Example Action that sends OpenID request * and recieves returned attributes * @uses OpenIDService::start() * @uses OpenIDService::finsh() */ public function showAction() { /* * Get OpenIDService */ $oid = $this->get('openid'); /* * If it is first user request */ if (count($_GET) == 0) { /* * Redirect user to provider's authentification page */ $resp = $oid->start(); if ($resp) return $resp; /* * Or just die on error */ die('Invalid ID or another error happened'); } else { /* * When OpenID provider returned parameters via _GET * check them and show */ $attributes = $oid->finish(); if ($attributes) { var_dump($attributes); die(); } /* * Or just die on error */ die('User canceled request or another error happened (validation failed, etc...)'); } }
А вся настройка производится в конфигфайле:
# An example of ur config.yml: #openid.config: # openid: # required: # email: "contact/email" # required mail # first: "namePerson/first" # and first name from OpenID provider # # ...other required parameters # return: "openid" # name of return_to route # # if not set - returned to the same url that sent the request # default: "google.com/accounts/o8/id" # default identity is google one #
ct757:
Недавно пришлось заниматься исследованием того, как работает механизм изменения тем в Win7. Выяснилась интересная схема. За загрузку тем отвечает служба Themes, которая находится в бибилотеке system32/themeservice.dll и запускается процессом svchost.exe. При загрузке данная служба создает ALPC...
Постреляли немного
Собственно первый раз в жизни нормально пострелял с огнестрельного. До этого были только 3 выстрела с ПМ в конце прохождения военки.
Собственно после этого смотреть фильмы, где по главному герою херачит толпа и не попадает, будет довольно смешно. Ввиду того, что практически с любого оружия со 100 метров в 10ку не слишком то и сложно попасть даже людям, которые первый раз держат оружие в руках. А если еще и коллиматорный прицел привинчен, то процесс прицеливания становится схож с контролстрайком, где достаточно новести крестик куда надо.
Стреляле из:
АК-74:
АК-101 с коллиматорным прицелом:
СВД
Мосинко:
Гранд пауэр:
Чезет (правдо хз какая точно модель):
Также наблюдали за пристрелкой вот этой штуки
Только с глушителем и коллиматорным прицелом. Так гильзы громче падают, нежели эта штука стреляет.
Вобщем развлечение достойное да и правильное. Понраилось.
Попробовал Twig в связке с Symfony2
Twig and Symfony2
Как-то так получилось, что из всех фреймворков на PHP больше всего понравился Symfony. До недавнего времени использовал нативную PHP-шаблонизацию, но в последних PR Symfony2 в качестве дефолтного и рекомендуемого шаблонизатора используется Twig (http://www.twig-project.org/). Довольно давно присматривался к Twig'у, так как это один из немногих шаблонизаторов, который шаблоны сначала компилирует в нативный PHP, а потом попросту выполняет.
Решил доверится опыту гуру и в очередном проектике использовать Twig. B практически сразу наступил на грабли, о которых речь пойдет далее. Дело в том, что в некоторых случаях я предпочитаю строить результирующую страницу из блоков, которые разбросаны, например, по нескольким контроллерам. В итоге необходимо реализовать схему в которой есть некоторый шаблон наследует layout, в то же время включая в себя другие шаблоны. Казалось бы ничего страшного:
{% extends 'SomeBundle::layout.html.twig' %} {% block _content %} {% include 'SomeBundle:Some:first.html.twig' %} {% include 'SomeBundle:Some:second.html.twig' %} {% include 'SomeBundle:Some:third.html.twig' %} {% endblock %}
Но есть ньюансы. В данном случае результирующий документ формируется так: А нужно иметь возможность получать такую картинку (соответствующие блоки в шаблонах 3 уровня должны в итоге попасть в нужном порядке в блоки layout'a): И эта задача в первом приближении решается средствами твигла:
{% extends 'SomeBundle::layout.html.twig' %} {% import 'SomeBundle:Some:first.html.twig' as first %} {% import 'SomeBundle:Some:second.html.twig' as second %} {% import 'SomeBundle:Some:third.html.twig' as third %} {% block _content %} {{ first.content() }} {{ second.content() }} {{ third.content() }} {% endblock %} {% block script %} function some_script(){....} {{ first.script() }} {{ second.script() }} {{ third.script() }} {% endblock %}
Где first, second и third шаблоны разделены на части макросами и примерно выглядят так:
{% macro content() %} somecontent... {% endmacro %} {% macro script() %} function first(){....} {% endmacro %}
Но у этого подхода также есть недостатки. Первый - это то, что внутри макросов не видны переменные parent-шаблона. Это легко исправляется тем, что в макрос можно передать любой набор параметров. Усложняем задачу. А что если параметры для такого макро должны быть получены из стороннего контроллера? Это уже не очень легко решается чистым твиглом с симфони, хотя я, возможно, чего-то не досмотрел. render не подошел по тому же, что и include. По-этому, я решил быстренько накатать Helper, который предоставляет функцию, осуществляющую тупую передачу результата выполнения контроллера в твигло-шаблон:
/** * {@inheritdoc} */ public function getFunctions() { return array('action' => new \Twig_Function_Method($this, 'runAction')); } public function runAction($act, $par = array()) { return $this->container->get('http_kernel')->forward($act, $par, array())->getContent(); }
После этого можно строить шаблоны из блоков, которые отражают результаты работы разных контроллеров:
{% set action_result = action('SomeBundle:Another:another') %} {% import 'SomeBundle:Another:another.html.twig' as xxx %} {% block _content %} ..... {{ xxx.content(action_result) }} {% endblock %} {% block script %} function some_script(){....} {{ xxx.script(action_result) }} {% endblock %}
Возможно и грабли, но времени думать что-то более основательное не было. Придумаю - будет повод напейсать сюда ещё.
привет, подскажи как код подсвечивать ?
там где тему выбирать, там можно кастомный хтмл делать.
в самом конце где-то пишете<br /> SyntaxHighlighter.all()<br />
после этого в постах
function foo(){}
Системы контроля версий (wasm jabber conference)
microxa: а что за новая сущь эти JIT - ы?
zexodex: ну ему отписали, мол документация на борд установилась, тип что дальше :)))
komar: microxa: это пытаются побороть тормознутость всяких vm типа жава
komar: microxa: после первого прохода делается из байткода нативный код и тогда все гораздо быстрее работает
microxa: да я про интернет... git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
komar: zxdx: Ж:-))
komar: microxa: аа Ж;-) jit != git Ж:-)
komar: microxa: это csv тул. типа cvs, subversion и подобное. система контроля версий/патчей
microxa: ааа...
komar: microxa: очень рекомендую какую то из них освоить. svn попроще, git понавороченей. у каждой свои + и -. могу рассказать поподробней
microxa: komar: да я по трункам восновном.. если не отгружают gz-ипками в таре
zexodex: я выучил только git pull)))
komar: microxa: ну так пора в ногу со врменем Ж:-) даже одиночке удобно, не говоря уже о командной работе Ж:-)
komar: zxdx: надеюсь ты clone не перескочил? Ж;-))
FreeMаn: долго юзал свн (и продолжаю юзать), а сейчас вот решил понемногу меркуриал пощупать...
zexodex: перескочил :)
microxa: komar: да я что... кодописатель пицот тысяч строк чтоли..
zexodex: microxa: не скажи очень удобно иметь 1 и тотже код дома и на работе и случаев забыл, уже нету
komar: microxa: да меркуриал достойная альтернатива гиту. одобрямс
microxa: ладно бы.. за тебя оно всё писало
microxa: и так как надо...
komar: удобно не только в том что код один. а втом что можно следить за комитами, делать разные ветки, убирать неныжне патчи, перемешивать. в общем мащща. то что надо для автивно развивающегося кода
zexodex: кароче сделал я ветку
zexodex: сломал кароче потом репозиторий
zexodex: и решил без веток как нибудь :)))
FreeMаn: круто сделол
komar: репозиторий сложно сломать Ж:-) главное не тушеватся. "всегда можно сделать откат"
microxa: komar: ну для "избраных" мож и удобно.. а большинство - хеловорлд то не напишут.. не говоря уже о компиляции
FreeMаn: не, под любой проект надо репозиторий, даже если его делаешь сам и раз в месяц...
komar: microxa: ну сейчас это обязательная тулза программера в одном ряду с владением редактором, дебагером и тулзами сборки
zexodex: потом научился пользоваться свном) и всё стало нормально..
FreeMаn: свн да, самый простой и понятный. за полчаса даже домохозяйка освоит
FreeMаn: у меня даже юр. отдел приучен документы в свнке держать, а они блонди
komar: да svn норм. мы на фирме его года три использовали. потом по решили что по концепции нам больше git подходит. а то идешь на корабле в командировку на 3-4 недели, и без инета как обрубок. до репов не достучатся. в git-е все
komar: лонированное с собой. приехал - смержил работу с тем что коллеги налабали пока тебя небыло
komar: freeman: отличная дрессировка Ж:-)
Немного об ЭЦП в Украине
Использование электронной цифровой подписи (ЭЦП) регулируется законом Украины "Про електронний цифровий підпис". Этим законом предусматривается возможность использования ЭЦП в электронном документообороте (ЭДО) аналогично использованию обычной подписи/печати на бумаге. При этом дабы ЭЦП являлась и юридически равносильной обычной, необходимо, чтобы эта подпись была подтверждена усиленным сертификатом ключа. Остальные ЭЦП не есть предмет этой заметки.
Усиленные сертификаты ключей выдают аккредитованные центры сертификации ключей (АЦСК). Создание таких центров, их аккредитация, прохождение всяческих экспертиз - довольно муторное дело, да и к тому же - дорогостоящее (эдак от 3кк грн.). Поэтому центров в Украине всего-то 12 и они мягко говоря пока не дружат.
Для обычного юр. лица использование ЭЦП довольно прозрачно и удобно. Берем директора, гоним в АЦСК, подписываем договор. Собираем заявления по офису, берем уполномоченное лицо от конторы и посылаем его в АЦСК уже непосредственно за ключиками.
Грабли же получаются при использовании ЭЦП гос. учреждениями. А все из-за того, что существует постановление КМУ №1452 "Про затвердження Порядку застосування електронного цифрового підпису органами державної влади, органами місцевого самоврядування, підприємствами, установами та організаціями державної форми власності". В этом положении прописано, что каждое гос. учреждение пользуется услугами исключительно одного АЦСК. Под услугами подразумевается как поддержка собственных ключей, так и проверка статуса сертификата сторонних, что также зафиксировано в законах. Также для обеспечения нормальной и комфортной работы пользователей законодательством предусмотрена обязательная кросс-сертификация всех АЦСК (механизм, при котором я могу средствами своего АЦСК "Х" проверить подпись, полученную моим клиентом в АЦСК "Y").
Так вот, грабли в том, что никакой кросс-сертификации всех АЦСК в Украине нет. Поэтому гос. органы тут либо идут по пути нарушения законодательства, типа налоговой ("кто ж её посадит.."), либо вынужденны честно ограничить свой внешний ЭДО теми лицами, у которых есть ключ исключительно того АЦСК, с которым у гос. учреждения подписан договор. В случае если 2 гос. учреждения будут пользоваться услугами разных АЦСК - ЭДО между ними невозможен без нарушения законодательства. При этом в Украине идут разговоры о каком-то там электронном правительстве.
Но не всё так плохо. Вопросы ЭЦП и ЭДО - довольно интересны. Постепенно ДСТСЗИ встает на путь стандартизации механизмов ЭЦП, что в светлом будущем, возможно, приведет к кросс-сертификации не только украинских АЦСК, но и к возможности использовать наши ключи по всему миру
Конвеер и node.js
Сел делать сервисную функцию на ноде, которая должна выполнять ряд запросов последовательно, однообразно обрабатывая результаты запросов.
Если писать код используя метод "пишу и не думаю", то получается примерно такой кодес (который нифига не читабелен)
pg.connect(connectionString, function(err, client) { if(err) { util.log('pg.connect: '+err.message); process.exit(0); } else { var query = "SELECT ..."; clients.query(query, function(err, result) { if (err) { util.log('process fail: '+err.message); process.exit(0); } else { for (var i in result.rows) { ..... } query = "SELECT ..."; clients.query(query, function(err, result) { ..... clients.query(query, function(err, result) { ..... }); }); } });
В JS есть прекрасная возможность использования лямбда-функций (типа без имени), что позволяет делать вполне читабельный код:
pg.connect(connectionString, function(err, client) { if(err) { util.log('pg.connect: '+err.message); process.exit(0); } else { //Вот такой конвеерчег processFirst(client, processSecond(processThird(processFourth()))); } }); //Первая функция var processFirst = function (clients, done) { var query = "SELECT ..."; clients.query(query, function(err, result) { if (err) { util.log('process failed: '+err.message); process.exit(0); } else { //Обработка результатов for (var i in result.rows) { ... } //Вызов следующей функции done(clients); } }); }, //Функция, которая возвращает функцию, которая будет вызвана после //успешной отработки processFirst processSecond = function (done) { return function (clients) { var query = "SELECT ..."; clients.query(query, function(err, result) { .... //Вызов следующей функции done(clients); }); };}, processThird = function (done) { return function (clients) { var query = "SELECT ..."; clients.query(query, function(err, result) { .... //Вызов следующей функции done(clients); }); };}, processFourth = function (done) { return function (clients) { var query = "SELECT ..."; clients.query(query, function(err, result) { .... return result; }); };};
Принцип - в использовании функций, которая принимает в качестве параметра следующую функцию, которую надо выполнить. Использование в ноде (да и вообще в любом другом JS коде) функций таким образом - довольно распространенная практика.
Первая блогозапись
Тест тест.
Этот блог включает в себя как бестолково скопипижженный материал, который я счёл достойным, так и лично сгенерированный контент.
Записи в блоге нерегулярны как секс капитана дальнего плавания, ввиду того что иногда их некогда создавать, а порой - просто лень.