Как стать автором
Обновить
66
0
Andrei Zhlobich @anjensan

Human

Отправить сообщение

Секрет древней игры го. Почему компьютер до сих пор не обыграл человека?

Время на прочтение5 мин
Количество просмотров161K

Реми Кулом (слева) с компьютерной программой Crazy Stone против гроссмейстера Норимото Ёды

В 1994 году компьютер обыграл чемпиона мира по шашкам, в 1997 году — по шахматам. Сегодня компьютеры превосходят людей абсолютно во всех популярных играх с полной информацией, кроме одной — го.

У классической игры с 2500-летней историей очень простые правила, но компьютерные программы даже близко не могут подобраться к победе над лучшими гроссмейстерами, пишет Wired.
Читать дальше →
Всего голосов 199: ↑175 и ↓24+151
Комментарии232

Типы-значения в Java

Время на прочтение1 мин
Количество просмотров25K
Duke
Этот пост — вольно-краткий перевод документа State of the Values, предложения по введению типов-значений в JVM и сам язык Java, который написали Джон Роуз, Брайан Гоетц и Гай Стил, разбавленный моими мыслями. Опущены детали предложения по реализации типов-значений на уровне байт-кода, что не очень интересно для большинства Java-программистов.



Важнейшая мысль: объектная (ссылочная) идентичность нужна только для поддержки изменяемости объектов. Объект может изменить состояние, но по ссылке мы всегда можем проверить, что это «тот же» объект. Поэтому типы-значения будут строго неизменяемые.

Предполагаемые варианты использования типов-значений:
  • Числа: комплексные, беззнаковые, 128-битные, с фиксированной запятой и т. д. Все, что не описывается имеющимися примитивами.
  • Алгебраические типы: Optional, Choice<T,U>, перечисления
    Кортежи: пары, тройки, ...
    Итераторы, курсоры
    «Уплощение» сложных структур

  • Целевые фичи:
Читать дальше →
Всего голосов 29: ↑26 и ↓3+23
Комментарии25

Дизайн и архитектура в ФП. Часть 3

Время на прочтение21 мин
Количество просмотров13K
Свойства и законы. Сценарии. Inversion of Control в Haskell.

Совсем немного теории

В прошлой части мы убедились, что очень легко запутаться в плохо спроектированном коде. К счастью, с древних времен нам известен принцип “разделяй и властвуй”, — он широко применяется при построении архитектуры и дизайна больших систем. Мы знаем разные воплощения этого принципа, как-то: разделение на компоненты, уменьшение зависимости между модулями, интерфейсы взаимодействия, абстрагирование от деталей, выделение специфических языков. Это хорошо работает для императивных языков, и надо полагать, что будет работать в функциональных, за тем исключением, что средства реализации будут другими. Какими же?
Читать дальше →
Всего голосов 20: ↑17 и ↓3+14
Комментарии6

Ускоряем PHP (с ReactPHP)

Время на прочтение11 мин
Количество просмотров80K
В этом посте я хотел бы поделиться не совсем обычным, для мира PHP, способе построения приложения, если угодно — архитектурой. Данный подход позволяет средствами PHP увеличить количество обрабатываемых запросов в разы. Так же я поделюсь своими наработками в этом направлении. Конечно данный подход не бесплатен, в плане требований к коду, но давайте всё по порядку.
Читать дальше →
Всего голосов 51: ↑44 и ↓7+37
Комментарии64

Erlang. Параметры TCP/IP сокета

Время на прочтение3 мин
Количество просмотров13K
Небольшая шпаргалка по параметрам TCP/IP сокетов в Erlang по-русски. Все взято от сюда:

1) erlang.org/doc/man/gen_tcp.html
2) www.erlang.org/doc/man/inet.html#setopts-2
3) learnyousomeerlang.com/buckets-of-sockets#tcp-and-udp-brotocols
Подглядеть...
Всего голосов 25: ↑24 и ↓1+23
Комментарии0

Как нам выстроить информационную защиту России

Время на прочтение7 мин
Количество просмотров29K
Западъ намъ не указъ и не тюрьма. Его культура не есть идеалъ совершенства. Строеніе его духовнаго акта (или, вѣрнѣе, — его духовныхъ актовъ), можетъ быть, и соотвѣтствуетъ его способностямъ и его потребностямъ, но нашимъ силамъ, нашимъ заданіямъ, нашему историческому призванію и душевному укладу оно не соотвѣтствуетъ и не удовлетворяетъ. И намъ незачѣмъ гнаться за нимъ и дѣлать себѣ изъ него образецъ. У запада свои заблужденія, недуги, слабости и опасности. Намъ нѣтъ спасенія въ западничествѣ. У насъ свои пути и свои задачи. И въ этомъ — смыслъ русской идеи.
Иван Александрович Ильин «О русской идее» (1948)

В связи с последними бурными политическими событиями важность информационной защиты России резко возросла, и, очевидно, будет ещё возрастать вместе с усилением влияния нашей страны в мире.

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

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

Не претендую на детальное раскрытие полной картины. Это лишь предварительные наброски, которые требуют уточнения, обобщения и доработки.

Итак, защита России:

1) Мобильные устройства: существенная опасность заключается в огромном количестве неконтролируемых мобильных устройств.

Решение: перезагрузка операционной системы устройств при пересечении границы России. «Внешняя» («чужая») ОС записывается в депозитарий пункта пограничного контроля, заменяется на аналогичную нашу ОС. Доступ к мобильной сети разрешается только «своим» устройствам. Аппаратура мобильных операторов отслеживает попытку доступа «чужих» устройств и немедленно подает сигнал тревоги. То же самое с радиосвязью. То же самое с устройствами космической связи. Доступ должен быть лишь к разрешённым спутникам (на уровне государства).
Читать дальше →
Всего голосов 250: ↑34 и ↓216-182
Комментарии123

Профайлинг Twisted-приложений

Время на прочтение1 мин
Количество просмотров3K
Часто сам забываю, как профилировать легко и быстро Twisted-приложения (с некоторым изменениями подойдет для любых Python-приложений). Кроме Twisted нам понадобится еще KCachegrind.

Запускаем наше приложение с включенным профайлингом:
twistd -n --savestats --profile=myprog.hotshot myprog

Подаем нагрузку, профайл собирается. Теперь с помощью утилиты hotshot2cg из поставки KCachegrind превращаем hotshot-профайл в calltree-профайл, который уже умеет KCachegrind «кушать».
hotshot2cg myprog.hotshot > myprog.calltree

Запускаем KCachegrind, открываем в нем полученный профайл:
kcachegrind myprog.calltree
Всего голосов 20: ↑17 и ↓3+14
Комментарии1

Внедрение зависимостей the Python way

Время на прочтение3 мин
Количество просмотров36K
Зачем нужно внедрение зависимостей? Оно уменьшает связанность компонентов в приложение и упрощает тестирование. У некоторых разработчиков есть мнение, что внедрение зависимостей нужно только в больших проектах и что оно сильно усложняет программы. Думаю, это исторически сложилось из-за популярный фрейморков вроде Спринга или Джуса в Джаве. Особенно из-за Спринга, который является невероятным комбайном.

Python-inject — это небольшая библиотека для внедрения зависимостей в Питоне. Третья версия написана в unix-стиле, т.е. она прекрасно выполняет только одну функцию и не пытается быть всем. В отличие от уже упомянутых Спринга и Джуса Инжект не ворует конструкторы классов у разработчиков, не навязывает разработчикам необходимость писать приложение в каком-то определенном стиле и не пытается управлять всем графом объектов приложения.

Инжект практически не требует конфигурации (об этом подробнее подкатом) и очень прост в использовании.
Например в тестах
# Возможные зависимости
class Db(object): pass
class Mailer(object): pass

# Внедряем зависимости в класс пользователя
class User(object):
    db = inject.attr(Db)
    mailer = inject.attr(Mailer)
    
    def __init__(self, name):
        self.name = name
    
    def register(self):
        self.db.save(self)
        self.mailer.send_welcome_email(self.name)


 # Используем в тестах inmemory базу данных и моки.
class TestUser(unittest.TestCase):
    def setUp(self):
        inject.clear_and_configure(lambda binder: binder \
            .bind(Db, InMemoryDb()) \
            .bind(Mailer, Mock()))
        
        self.mailer = inject.instance(Mailer)
    
    def test_register__should_send_welcome_email(self):
        # Пример теста.
        user = User('John Doe')
        
        # Регистрируем нового пользователя.
        user.register()
        
        # Должно отправиться письмо с приветствием.
        self.mailer.send_welcome_email.assert_called_with('John Doe')


Читать дальше →
Всего голосов 31: ↑27 и ↓4+23
Комментарии38

Классические паттерны проектирования на Scala

Время на прочтение14 мин
Количество просмотров37K
Об авторе:
Pavel Fatin работает над Scala plugin'ом для IntelliJ IDEA в JetBrains.

Введение



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

Содержание статьи составляет основу моего выступления на JavaDay конференции (слайды презентации).

Читать дальше →
Всего голосов 40: ↑38 и ↓2+36
Комментарии29

Дизайн и архитектура в ФП. Введение и Часть 1

Время на прочтение11 мин
Количество просмотров28K

Введение


В мире функционального программирования есть один большой пробел, а именно почти не освещена тема высокоуровневого дизайна больших приложений. Я решил для себя изучить этот вопрос. Есть ли существенные отличия дизайна приложений в ФП-мире от оного в мире императивном? Что такое «каноничный ФП-код»? Какие существуют идиомы разработки, есть ли смысл вообще говорить о паттернах проектирования в применении к ФП? Эти и другие важные вопросы часто вспыхивают то там, то здесь, но покамест мне не известно ни одной книги, аналогичной книге Банды Четырех. Вероятно, мои изыскания уже кто-то повторил, однако тем лучше: схожие результаты подтвердят правильность, иные — укажут на место в теории, которое необходимо доработать.
Читать дальше →
Всего голосов 34: ↑33 и ↓1+32
Комментарии41

Самодельная эргономичная клавиатура CatBoard ][

Время на прочтение16 мин
Количество просмотров146K


CatBoard — это самодельная эргономичная компактная клавиатура с открытым исходным кодом, имеет множество нестандартных решений, таких как: нестандартная аппаратная раскладка со стандартными клавиатурными сочетаниями; быстрый автоповтор нажатой клавиши; Fn слой с клавишами управления курсором, цифровым блоком, функциональными клавишами; отдельные клавиши переключения раскладок; более удобное расположение Ctrl и Shift; отдельную кнопку AltTab; режим совместимости с Macintosh, позволяющий работать на нём точно так же, как и на PC; возможность прошивки без дополнительного оборудования; возможность устанавливать поверх ноутбучной клавиатуры. Благодаря открытому коду, с клавиатурой можно делать что угодно, новая прошивка заливается в считанные секунды, поэтому экспериментировать можно прямо на ходу.
Читать дальше →
Всего голосов 111: ↑102 и ↓9+93
Комментарии127

Нейросистема: исправляем ошибки

Время на прочтение4 мин
Количество просмотров7.3K
Мой прошлый пост с треском провалился. А все потому, что я допустил серьезную ошибку, построив многоуровневую абстрактную модель. Будем исправлять.
Читать дальше →
Всего голосов 49: ↑14 и ↓35-21
Комментарии30

Google представил умные контактные линзы для диабетиков

Время на прочтение1 мин
Количество просмотров36K
Лаборатория Google X сегодня представила умные контактные линзы, которые будут помогать диабетикам в измерении уровня глюкозы в крови.



Компания пишет, что в настоящий момент тестирует прототип таких линз, в которых встроен крошечный измеритель глюкозы и беспроводный передатчик. В качестве «исходного» материала для измерений линзы используют слезы – по словам ученых, они прекрасно отражают происходящие в организме изменения. Ранее они были для этого просто недоступны, вряд ли многие из людей регулярно готовы плакать, а линзы получают слезы естественным образом.
Читать дальше →
Всего голосов 82: ↑78 и ↓4+74
Комментарии87

Единство формы и содержания

Время на прочтение2 мин
Количество просмотров44K
Прислал мне тут один программист смешную круглую программку на языке C, там был #define определяющий подчерк, а потом из подчерков и минусов был нарисован круг:

            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
        _-_-_-_-_-_-_-_
            _-_-_-_


При вычислении этого выражения получалось число π. Ну на самом деле, там чего-то съехало и вместо π получалось 0.250, но не в этом дело.

Читать дальше →
Всего голосов 126: ↑99 и ↓27+72
Комментарии35

Зачем нам всем нужен SAT и все эти P-NP (часть вторая)

Время на прочтение10 мин
Количество просмотров24K
В предыдущей части были освещены общедоступные вопросы, касающиеся SAT и P-NP: история проблемы, интуитивные определения классов и задач, указаны основные приложения SAT и основные последствия, в случаи решения P ?= NP (там же можно найти достаточное число ссылок на различный материал для самостоятельного изучения тематики).

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



картинка из статьи Boolean Satisfiability: From Theoretical Hardness to Practical Success (Communications of ACM)

Читать дальше →
Всего голосов 54: ↑51 и ↓3+48
Комментарии24

Передача треков Google Analytics сторонним доменам без javascript

Время на прочтение4 мин
Количество просмотров5.5K


О чем статья?


  • О междоменном отслеживании
  • О том, что если чего-то нет в официальной документации, то это не повод печалится, а повод добавить такую возможность.

Зачем передавать?


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

Почему без javascript?


  • Если нужно выполнить редирект пользователя после обработки логики запроса на сервере.
  • Google Analytics api и так хорошо документирован, а читать копипаст документации это не уровень хабра, не так ли?

Суть метода проста. Берем все куки вида __utm и передаем их, как параметры, в урле на другой домен. Ничего не происходит. Расходимся. Добавляем последним параметром __utmk, который является особым хешем всех остальных кук гугл аналитики. Поздравляю мы сделали, то что делаем функция _link в известном файле ga.js от Google Analytics.
И так если у вас переход на другие сайты обрабатывал контроллер, то вам не надо во все ссылки добавлять конструкцию вида:

onclick="_gaq.push(['_link', 'https://www.payment-system.com?contractId=example']); return false;"


Если нужны исходники формирования хеша для ключа utmk, прошу в github.
Далее история о процессе получения данного метода.

Читать дальше →
Всего голосов 13: ↑13 и ↓0+13
Комментарии0

Устанавливаем Linux-программы на смартфон под управлением Android

Время на прочтение11 мин
Количество просмотров178K


Многие владельцы Android-фонов испытывают трудности с запуском настоящего Linux-софта на своих девайсах. По всем законам он вроде должен здесь работать, да вот только для его установки почему-то нужны права root, сам он распространяется в каких-то самодельных инсталляторах, а выбор программ сильно ограничен. Эта статья предложит ответ на вопрос, почему так получилось, и подскажет решение — удобный способ установки и запуска почти любого Linux-софта в Android.
Подробности
Всего голосов 110: ↑93 и ↓17+76
Комментарии41

Несколько интересностей и полезностей для веб-разработчика #10

Время на прочтение4 мин
Количество просмотров41K
Доброго времени суток, уважаемые хабравчане. За последнее время я увидел несколько интересных и полезных инструментов/библиотек/событий, которыми хочу поделиться с Хабром. Это последняя подборка в этом году и я постарался сделать ее наиболее информативной и нужной.

image
Летом 2013 года издательство The Guardian обновило свой сайт, согласно всем современным трендам/нормам/правилам. Но самым главным событием является то, что разработчики выложили весь фронтенд сайта в открытый доступ на GitHub. Свыше 1500 старов, 10 000 коммитов и 100 веток. Там целый джентельменский набор. Для многих это будет кладезь знаний.

imageCenny.js — plug 'n play бэкенд для веб-приложений. Быстрый, защищенный, расширяемый.
var server = new Cenny();
server.set({data: [1,2,3]});
server.get(function(data){ 
   console.log(data); 
});


imageМаленький скрипт от Filament Group (один из первых спонсоров jQuery). Overthrow.js это полифил для отзывчивого дизайна, который стабилизирует работу стандартного скроллинга контента HTML элементов (overflow: auto/scroll) на тач устройствах. Для тех, кто не совсем понял о чем речь, сравните на вашем гаджете работу обычного скроллинга и действие Overthrow.

Читать дальше →
Всего голосов 75: ↑72 и ↓3+69
Комментарии23

Peewee – лёгкая, гибкая и очень быстрая ORM на Python

Время на прочтение5 мин
Количество просмотров117K
image

Предлагаю всем джангистам/алхимистам немного отвечься и почитать вольную интерпретацию вводного туториала и частично документации по Peewee – stand-alone ORM, обязательной к ознакомлению любому питонщику и, в особенности, фласкеру. Пишут о ней мало, а зря. С Peewee очень просто подружиться, особенно если вы уже знакомы с какой-нибудь ORM на ActiveRecord. Что более важно – с ней приятно дружить :) Ну, начнём.


Установка
С pip:
pip install peewee


Из репозитория:
git clone https://github.com/coleifer/peewee.git cd peewee python setup.py install


Тесты:
python setup.py test


Есть обвязка для flask:
pip install flask-peewee



Определение моделей или «попахивает джангой»


Весь нижеследующий код можно повторить один к одному в интерактивном интерпретаторе или отдельном скрипте.

from peewee import *

db = SqliteDatabase('people.db')

class Person(Model):
    name = CharField()
    birthday = DateField()
    is_relative = BooleanField()

    class Meta:
        database = db  # модель будет использовать базу данных 'people.db'


Типов полей много, на все случаи жизни. Peewee берёт на себя преобразование питоновских объектов в значения, подходящие для базы данных, и наоборот.
Читать дальше →
Всего голосов 50: ↑48 и ↓2+46
Комментарии46

Профилирование и отладка Python, отладка

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

Сегодня я предлагаю рассмотреть методы отладки программ.

Начнём!
Всего голосов 50: ↑48 и ↓2+46
Комментарии26

Информация

В рейтинге
Не участвует
Откуда
Warszawa, Польша
Дата рождения
Зарегистрирован
Активность