• Работа с реляционными базами данных в Scala
    +1
    Хм, да, с этим я думаю посложнее. Как-то я не внимательно прочитал первый абзац. :)

    scalikejdbc ближе всего к тому, что описано в данном посте. Я думаю его query DSL можно было бы дописать до необходимого уровня поддержки этих фич.

  • Работа с реляционными базами данных в Scala
    +2
    Slick, scalikejdbc, squeryl? м?

    Опять же вот есть scalikejdbc-async — https://github.com/scalikejdbc/scalikejdbc-async/tree/develop
  • А вы всё ещё используете Google Reader?
    +2
    Я наверное лет 6 (или больше уже) сидел на гугл ридере, в том числе на мобильной его версии. У меня порядка 400 подписок (~200 сообщений в день). Пробовал фидли — мобильный клиент при плохом интернете (в метро) работает отвратительно.

    В итоге перешел на Reeder reederapp.com — очень доволен. И мобильное приложение и десктопный клиент просто отличные.
    Правда reeder изначально был сильно завязан на api google reader'а, но сейчас уже есть альтернатива в виде feedbin.me/, и дальше автор обещает добавить поддержку еще пары подобных сервисов для синхронизации.

    Очень рекомендую, да.
    Mac/iOS only ;)
  • Обновление банковского приложения. Предварительный показ и приглашение реализовать ваши идеи в нашем приложении (силами наших разработчиков)
    +3
    Приложение выглядит современно и симпатично.
    От делать нечего накидал несколко мелких замечаний и придирок. Вдруг пригодится :)

    • Надпись Россия что означает? Можно поменять? Она определяется моим текущим местоположением? А если можно поменять, то покажите это как-то. Например маленькой стрелочкой-треугольничком слева или справа от нее.
    • Кнопка Демо слишком большая и слишком близко к кнопке Вход. Можно случайно нажать мимо.
    • А что делать если я забыл, потерял, не знаю логин/пароль? Я думаю стоит явно разместить ссылку с этой информацией. Возможно она скрывается в правом нижнем углу за кнопкой (i), но это совершенно не очевидно. А ее не с первого раза нашел.

    • Время работы важная информация при выборе банкомата — я бы показал его сразу в списке.
    • Сходу не понятно что означают зеленый, серый и темно-серый кружки.
    • Где строка поиска? А если я в Москве, но хочу посмотреть банкоматы в Питере? Куда вбивать адрес, район, город, страну в конце-концов? Не на карте же искать самому?
    • Зеленую статус-полоску «Банкомат в настоящее время работает» я бы объединил с временем работы. И писал бы более человеческим языком. Например: «Время работы: с 9:00 до 21:00. Сейчас работает» и зеленым цветом выделить.
    • В правой панельке самое важное — это расположение банкомата на карте. Стоит показывать сразу кусок карты с маркером, и дополнительно, при желании, можно нажать кнопку [Построить маршрут]. Избавите от лишнего клика и ожидания построения маршрута. А карту можно показывать в виде статической png-картинки и кешировать. Тогда не понадобится интернет для ее просмотра.
    • Слово «Ближайший» 3 раза повторяется в верхнем меню. Можно заменить на просто Банкомат, Отделение, Ближайшие скидки, Погашение кредита.
  • Type classes в Scala
    0
    а я параллельно на CoffeeScript много пишу, так постоянно путаю где нужно точки при вызове метода ставить, а где нет :) и скобочки еще там

    тогда уж и вот тут:
    implicit val personNameComparator = Comparator[Person] {

    наверное нужно new поставить:
    implicit val personNameComparator = new Comparator[Person] {
  • Type classes в Scala
    0
    Вот тут хорошо о том, когда следует применять context bounds, а когда целиком implicit parameters
    stackoverflow.com/a/2982293

  • Type classes в Scala
    0
    ан нет. это я не понимаю о чем я). сорри
    перепутал [T : Comparator] с [T <: Comparator]
  • Type classes в Scala
    0
    [T: Comparator] означает что Т подтип Comparator. А в данном примере это не так. Поэтому такой код не корректен. Если вы понимаете о чем я:)
  • Type classes в Scala
    0
    def compare(Person onePerson, Person anotherPerson): Int

    Чувствуется java бэкграунд :). Так в скале не пропрет.
    Видимо имелось в виду

    def compare(onePerson: Person, anotherPerson: Person): Int
  • Type classes в Scala
    0
    “Another thing to know about implicit parameters is that they are perhaps most often used to provide information about a type mentioned explicitly in an earlier parameter list, similar to the type classes of Haskell”

    Типа частный случай implicit параметров, которые предоставляют расширенную информацию о предыдущих аргументах функции. Если я правильно понял)
  • Type classes в Scala
    +1
    Интересно почему это называется Type classes, если это всего лишь обычные Implicit parameters?
  • Видео с конференции ScalaDev
    0
    Ну. Видимо у всего есть цена.
    Мы в основном используем нативные скалавские библиотеки (akka, squeryl, scalatra) и практически не имеем подобных проблеммы. Используем джавайский protobuf и там да, приходится заботится о конвертации коллекций, но, как вы уже сказали, имплисит спасает.

    Для многих библиотек уже есть удобные скалавские обертки, а если для чего-то еще нет — это хороший повод ее сделать :). хотя бы just for fun.
    Хотя с hibernate я думаю это будет не просто.
  • Видео с конференции ScalaDev
    0
    А в чем конкретно заключается проблемма интеграции с Java'шными либами?
    Может поделитесь опытом или ссылкой где об этом почитать.
    В своей работе ни разу не наткнулись на какие-нибудь подобные проблеммы. Может нам просто везет пока? :)
  • Nette PHP Framework: первое знакомство
    0
    Вычитал в документации:

    The first query will be SELECT * FROM application. Then NotORM stores the information about used columns to the cache and all next requests will issue SELECT id, title FROM application. If you change the script and add more columns then one extra SELECT * will be issued and all next queries will be optimal again.

    Очень интересный подход. Надо поизучать повнимательнее.
    Т.е. они анализируют паттерн использования и кешируют. Такой себе JIT прямо:)
  • Nette PHP Framework: первое знакомство
    0
    Тут все очень сильно зависит от. Подобный «ум» иногда помогает. Но создает очень непредсказуемое поведение.
    А что если нам будет нужно достать 100500 объектов $book, и только у первых 5ти вывести теги? Как об этом догадается ОРМ?
  • Nette PHP Framework: первое знакомство
    0
    Есть любопытный момент в этом примере.
    Если смотреть только на этот кусок шаблона, то кажется что он должен сделать N+1 запросов к БД, т.к. в цикле дергает $book->related('book_tag')
    Но! Но в документации написано что будет выполнен один запрос за тегами:
    SELECT `book_id`, `tag_id` FROM `book_tag` WHERE (`book_tag`.`book_id` IN (1, 4, 2, 3))


    Как? Как они это делают? И если действительно делают, то одно это достойно уважения.
    Теоретически они должны пробросить в $book контекст выполнения, чтобы метод related понимал что стоит сразу достать все теги для всех результатов запроса $database->table('book')->order('title')->limit(5)

    А если мы бы хотели сделать что-то типа:
    $books = $database->table('book')->order('title')->limit(5);
    $books[0]->related('book_tag');
    

    Он тоже достанет все теги для всех найденных книг? Или догадается что тут нам нужны только теги первой?
  • Параллельные вычисления, класс-обёртка для pcntl_fork()
    0
    да, согласен. шаред мемори должно быть быстрее. надо попробовать прикрутить.
  • Параллельные вычисления, класс-обёртка для pcntl_fork()
    0
    «бэдграундовских» — оговорочка по Фрейду :)
  • Параллельные вычисления, класс-обёртка для pcntl_fork()
    0
    Понравилось :)

    case SIGTERM:
        echo 'opa!';
        return;
  • Параллельные вычисления, класс-обёртка для pcntl_fork()
    +2
    У меня есть некоторые наработки в эту сторону github.com/kulikov/php-threads-manager

    там мультипроцессорность реализуется тремя способами (на выбор):
    1. через запуск отделных процессов через popen()
    2. через tcp сокеты stream_socket_client()
    3. через pcntl_fork() // не доделано

    В основном я пользовался popen как самым надежным и прозрачным способом. сокеты использовлись коллегами для дебага под виндой. а форки так и не доделал.
    Самый главный вопрос: как наиболее оптимально организовать обмен данными между родителем и потомком. По завершению работы в потомке складывать ответ во временный файл, а родитель из него потом все считывает? Пожалуй надо так и сделать. :)
  • Конференция Symfony Camp UA 2011
    0
    блин. блин. Клево вам.
    Хочу чтобы такое же было в Москве.
    Надо обязательно будет видео посмотреть.
  • Множественные CSRF уязвимости в крупнейших порталах Рунета
    0
    не всегда. если кука привязана к ip и UserAgent то использовать ее гораздо сложнее
  • Множественные CSRF уязвимости в крупнейших порталах Рунета
    0
    как вычислить токен? как минимум нужно знать secret и sessionId. узнать sid можно утянув куку, а как узнать secret? ну разве что брутфорсить :)
  • ООП Практикум PHP5: эмуляция примесей (mixin) в языке
    +1
    ну :) хоть это и немного офтоп, но я бы на вашем месте не стал ручаться за «прозрачность» zf. одна диспетчеризация чего стоит. на этот процесс влияет столько внешних факторов: сплошная магия.
    вот что будет после:

    $this->_forward('some-action');
    $this->getRequest()->setDispatched(true);
    

    Это прозрачно? ;)

    Я просто хочу сказать что не всегда удается использовать исключительно ясные и прозрачные методы. Но это не значит, что к этому не нужно стремиться.
  • ООП Практикум PHP5: эмуляция примесей (mixin) в языке
    +1
    в целом согласен, но думаю что область применения подобных техник лежит в другой плоскости: в библиотечных классах и различных апи. вот, например, в доктрине таких «магий» навалом. там это во много оправдано.
  • ООП Практикум PHP5: эмуляция примесей (mixin) в языке
    +1
  • Преступный переинженеринг
    +20
    «Решай проблеммы по мере их возникновения». Каждый раз себе это повторяю. Часто помогает. А вобще это очень тонкая материя. Тут, как и во всем остальном, серебрянной пули нет.

    Ну и рефакторинг никто не отменял.
  • Работа на двух экранах – повышение производительности или рассредоточение внимания?
    0
    и да
  • Работа на двух экранах – повышение производительности или рассредоточение внимания?
    0
    да
  • Работа на двух экранах – повышение производительности или рассредоточение внимания?
    0
    IMG_0187
    раз пошла такая пьянка :)
  • #ifdef в PHP
    +1
    остается только надеяться, что ваш код никто не будет поддерживать потом. а то он очень удивится :)
  • #ifdef в PHP
    0
    раскидать код по разным файлам/папкам. включать в сборку только нужную папку

    в самом примитивном случае выглядит так:

    define('DIR_CONTROLLER', COPY ? '/copy' : '/standart');
    require_once DIR_CONTROLLER . '/index.php';

  • Notice: Undefined variable. Допустимо?
    0
    Никаких нотисов разумеется быть не должно. и на dev-сервере всегда стоит error_reporting(E_ALL);

    Ну а реализация проверки всегда разная и зависит от обстоятельств
    Иногда достаточно if (!empty($value)), а иногда нужно и что-то более сложное:

    if (isset($_GET['query']) && trim($_GET['query']) !== '') {
        // ok
    }
    

    ну или в случае с использованием $request:

    $query = $request->getParam('query');
    if (trim($query) !== '') {
        // ok
    }
    
  • Notice: Undefined variable. Допустимо?
    +2
    у меня так:

    {if $error}
        <div class="error-msg">{$error}</div>
    {/if}
    
  • Notice: Undefined variable. Допустимо?
    +7
    if (!empty($_GET['query'])) {
         // do something
    }
    

    а лучше:

    if ($request->getParam('query')) {
         // TODO: решать проблему в корне
    }
    
  • Перевод: Шаблонизаторы в PHP
    0
    И рекомендую поменять if (!empty($a)) на if ($a)
    Лаконичнее, логичнее и красивее
  • Ошибки конфигурирования nginx (или как правильно писать рерайты)
    0
    при proxy_cache_valid 0; он ничего в кеш не записывает.
    ls -la /var/cache/nginx/ — всегда пусто (чтобы было понятно о чем я говорю)

    притом если поставить например proxy_cache_valid 5m; — то кешируются все запросы на 5 минут

    видимо ему нужно как то дать понять чтобы он в кеш писал каждый нормальный ответ апача в независимости от времени жизни кеша

    вот так более-менее работает:

    proxy_cache_use_stale http_503;
    proxy_cache_valid 200 301 302 304 1ms;
    

    но есть непонятные баги:
    во-первых если быстро рефрешить страницу в нормальном режиме (когда бекэнд отдает 200) nginx через раз показывает закешированную копию. так, будто время жизни кеша 1-2 секунды, а не 1 милисекунда.
    во-вторых в «аварийном» режиме (когда апач отдает 503) nginx отдает последнюю имеющуюся у него версию из кеша, но через раз вместо нее предлагает скачать какой-то файл. т.е. просто вываливается диалог сохранения/открытия файла с непонятным именем zEDex4TV.dms.part. причем происходит это бессистемно. мне так и не удалось понять в каком случае он отдает правильную страницу, а когда предлагает вдруг что-то сохранить/скачать. раз 5 показывает последнюю версию из кеша как и надо, а потом вдруг бац.

  • Ошибки конфигурирования nginx (или как правильно писать рерайты)
    0
    у меня тоже есть вопрос. не знаю возможно ли такое реализовать средствами nginx

    стандартная ситуация:

    location ~ \.(jpg|gif|png)$ {
        root images;
    }
    location / {
        proxy_pass ...;
    }

    можно ли кешировать ответы апача, но отдавать всегда свежий контент (ну как если бы мы кешировали с таймаутом в 0 секунд). а в случае если апач возвращает 50х ошибку — выдавать страницу из кеша.

    немного сумбурно объясняю, я просто сам еще толком не уяснил для себя как это должно работать.

    пример: все работает в штатном режиме — всегда отдается свежий контент без всякого кеширования. но вдруг на бекэнде что-то ломается (допустим отваливается база данных) и бекенд завершает работу с ошибкой 503 допустим. может ли nginx получив такой ответ посмотреть есть ли у него в кеше такая страничка (ее последняя нормальная версия) и если есть — отдать?
  • Мобильная версия Хабра
    –4
    ну во-первых на айфоне выглядит откровенно плохо.

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

    мне бы очень полезна была (крайне, просто мастхев) полная версия постов в рсс, без хабраката. вот за это я сказал бы бооольшое спасибо. а пока приходится искать сторонние решения типа яхо-пайпс.
  • Музыка для программистов
    +2