Pull to refresh
144
0
Александр Прохоров @Athari

Программист C#

Send message

Stack Overflow на русском: инструкция по убийству сообщества

Reading time 13 min
Views 32K

Когда разнеслись новости не только об открытии Stack Overflow на русском языке, но и об импорте неизвестного мне тогда "Хэшкода", то я решил присоединиться. Чем чёрт не шутит? И знаете, мне понравилось. Небольшое, но сплочённое сообщество, возможность реально улучшить состояние сайта — всё это было глотком свежего воздуха после закостенелого механизированного большого Stack Overflow. Всем телом ощущалась атмосфера демократии. Я был как одним из самых активных отвечающих, так и одним из самых активных дворников; много писал на Мете, активно общался в чате, даже чуть не стал модератором.



Однако сейчас я сижу в бане на год, общаюсь в стороннем чате с бывшими (и не очень бывшими) активными юзерами RuSO. Вместе со мной и ушедший топ-юзер сайта, и опальные модераторы. Чат на самом RuSO практически заброшен, активность на Мете никакая. Долгое время мы пытались исправить ситуацию, но ничего не добились.


Учитесь, что называется.

Читать дальше →
Total votes 81: ↑50 and ↓31 +19
Comments 242

GitHub превращается… превращается GitHub… в элегантный Windows 95

Reading time 7 min
Views 80K


В Твиттере какое-то время назад запостили шутку в честь приобретения Майкрософтом ГитХаба — страницу сайта, перестилизованную в стиле Windows 98. Я решил, что шутка слишком хороша, чтобы оставаться шуткой.

Давайте перекрасим GitHub!
Total votes 206: ↑202 and ↓4 +198
Comments 82

CsConsoleFormat: форматирование в консоли по-новому (.NET)

Reading time 10 min
Views 12K

Всем хорошо известны богатые средства форматирования в консоли: выравнивание пробелами, изменение текущего цвета текста и фона. Если вы хотите вывести пару строчек, то этого полностью хватает, хотя отсутствие переносов по пробелам временами раздражает. Если нужно вывести таблицу, приходится вручную рассчитывать ширину колонок, а часто просто хардкодить ширину. Если нужно раскрасить вывод, приходится испещрять вывод текста бесконечными переключениями и восстановлениями цвета. Если нужно вывести текст с переносами по словам или совместить всё перечисленное выше...


Код быстро превращается в нечитаемое месиво, в котором не разобрать, где логика, где текст, где форматирование. Это ужасно! Когда мы пишем GUI, у нас в распоряжении все прелести современной разработки: паттерны MV*, байндинги и прочие крутые штуки. После работы с GUI написание консольных приложений сродни возвращению в каменный век.


CsConsoleFormat спешит на помощь!

А что это?
Total votes 39: ↑39 and ↓0 +39
Comments 18

У Upwork проснулась монопольная жадность

Reading time 4 min
Views 62K

Глубокой ночью ничто не предвещало беды… Но в четыре утра от фрилансерской биржи Upwork пришло письмо с радостным, выделенным полужирным начертанием сообщением:


Чем больше вы работаете с клиентом на Upwork, тем больше из заработанного вы оставляете себе!


Казалось бы, радоваться надо, но если вчитаться, то обнаруживаются некоторые детали: комиссию Upwork не уменьшил, а увеличил. Если раньше на все контракты распространялась комиссия 10%, то сейчас она становится ступенчатой: 20%, 10% и 5% при порогах в $0, $500 и $10 000.

Добро пожаловать в мир монополий!
Total votes 37: ↑28 and ↓9 +19
Comments 120

LINQ для PHP: скорость имеет значение

Reading time 18 min
Views 16K
Если вы не знаете, что такое LINQ, и зачем он сдался на PHP, смотрите предыдущую статью по YaLinqo.

С остальными продолжаем. Сразу предупреждаю: если вы считаете, что итераторы — это ненужная штука, которую зачем-то притащили в PHP, что производительность из-за всех этих новомодных штучек с анонимными функциями зверски проседает, что нужно вымерять каждую микросекунду, что ничего лучше старого-доброго for не придумано — то проходите мимо. Библиотека и статья не для вас.

С остальными продолжаем. LINQ — это замечательно, но насколько проседает производительность от его использования? Если сравнивать с голыми циклами, то скорость меньше раз в 3-5. Если сравнивать с функциями для массивов, которым передаются анонимные функции, то раза в 2-4. Так как предполагается, что с помощью библиотеки обрабатываются небольшие массивы данных, а сложная обработка данных находится за пределами скрипта (в базе данных, в стороннем веб-сервисе), то на деле в масштабах всего скрипта потери небольшие. Главное — читаемость.

Так как со времени создания моей библиотеки YaLinqo на свет появилось ещё два конкурента, которые действительно являются LINQ (то есть поддерживают ленивые вычисления и прочие базовые возможности), то возникают позывы библиотеки сравнить. Самое простое и логичное — сравнить функциональность и производительность. По крайней мере это не будет избиением младенцев, как в прошлом сравнении.

(А также появление конкурентов наконец-то мотивировало меня выложить документацию YaLinqo онлайн.)

Дисклеймер: это тесты «на коленке». Они не дают оценить все потери в производительности. В частности, я совершенно не рассматриваю потребление памяти. Отчасти потому что я не знаю, как это нормально сделать. Если что, pull requests are welcome, что называется.
Даёшь скорости!
Total votes 26: ↑19 and ↓7 +12
Comments 6

Прошу вернуть удалённые хабы

Reading time 1 min
Views 5.8K
В давние времена на Хабре здравствовал славный хаб «Я негодую», в котором можно было поделиться нежданной болью с ближним и посочувствовать всевозможным мытарствам, на которые обрекает гиков злодейка-судьба в стране победившей стабильности. Хаб был жестоко удалён, а все топики без разбора перенесены с глаз долой в «Чулан».

Также некогда на Хабре можно было постить потешные картинки, но сия свобода была пресечена ещё до регистрации вашего почтенного слуги на сайте. Я придерживаюсь мнения, что в уморительных картинках для гиков нет греха, коль скоро оные разнообразны и тематически, и хаб для оных будет уместен и будет пользоваться великом спросом.

Если вы считаете, что какой-либо из убиенных хабов также достоин воскрешения, то делитесь мнениями в комментариях. У меня не возникает сомнений, что умерщвлённых хабов несчесть, иначе не быть «Чулану» наипопулярнейшим хабом со ста тридцати девятью тысячами пятьюстами тридцатью девятью подписчиками.
Total votes 86: ↑75 and ↓11 +64
Comments 19

YaLinqo (LINQ to Objects для PHP) — версия 2.0

Reading time 6 min
Views 15K
Что-что?

LINQ — это штука, которая позволяет писать запросы, чем-то похожие на SQL, прямо в коде. LINQ to Objects, собственно, позволяет писать запросы к объектам, массивам и всему тому, чем вы оперируете в коде.

Это ещё зачем?

Если у вас есть база, то у вас есть любимый ORM (или любимый голый SQL — кому как по вкусу). Но иногда объекты приходят из веб-сервисов, из файлов, да и вообще тьма тьмущая объектов может требовать нетривиальной обработки: преобразование, фильтрация, сортировка, группировка, агрегация… Применить бы привычный ORM или SQL — но базы-то нет. Тут на помощь приходит LINQ to Objects, в данном случае YaLinqo.

Что умеет?

  • Самый полный порт .NET LINQ на PHP, со многими дополнительными методами. Всего реализовано более 70 методов.
  • Ленивые вычисления, текст исключений и многое другое, как в оригинальном LINQ.
  • Детальная документация PHPDoc к каждому методу. Текст статей адаптирован из MSDN.
  • 100% покрытие юнит-тестами.
  • Коллбэки можно задавать замыканиями, «указателями на функцию» в виде строк и массивов, строковыми «лямбдами» с поддержкой нескольких синтаксисов.
  • Ключам уделяется столько же внимания, сколько значениям: преобразования можно применять и к тем, и к другим; большинство коллбэков принимает на вход и то, и другое; ключи по возможности не теряются при преобразованиях.
  • Минимальное изобретение велосипедов: для итерации используются Iterator, IteratorAggregate и др. (и их можно использовать наравне с Enumerable); исключения по возможности используются родные похапэшные и т.п.
  • Поддерживается Composer, есть пакет на Packagist.
  • Никаких внешних зависимостей.

Что случилось?

Прошёл год, как вышел PHP 5.5 со всякими вкусностями типа генераторов и исправленных итераторов. Так как на моей совести самый полноценный порт LINQ на PHP, то я решил, что настало время его обновить и воспользоваться новыми фичами языка.

Что нового?
Total votes 34: ↑29 and ↓5 +24
Comments 45

ВКонтакте: 451 Unavailable For Legal Reasons

Reading time 1 min
Views 33K
Когда вводились законы о цензуре, многие мечтали: «Вот ВКонтакте заблокируют — и все заметят, насколько законы вредны для Интернета, потому что это коснётся очень многих». Что ж, ВКонтакте прислали чёрную метку. И ВКонтакте заблокировал сообщества. Так что чуда не будет, расходимся.

ВКонтакте ввёл «географическую сегрегацию», то есть закрыл доступ к некоторым частям сайта по российским IP. Отныне вы больше не сможете просматривать «террористические», «экстремистские» и «националистические» сообщества, которые освещают события в соседней стране с позиции, отличной от российских официальных средств массовой информации.

Роскомнадзор отчитался, что сообщества «удалены», хотя на самом деле этого не произошло. Интересно, в курсе ли они. Вообще, сообщение 451 на ВК выглядит следующим образом:
Данный материал заблокирован на территории Российской Федерации решением Роскомнадзора №01КМ-7376 от 02.03.2014.
Код, к сожалению, 200 OK.

Читать дальше →
Total votes 108: ↑98 and ↓10 +88
Comments 41

Поправки к закону против интернета внесены!… хотя постойте…

Reading time 1 min
Views 87K
ГосдураЗаконопроект № 342640-6
О внесении изменений в Граждански кодекс Российской Федерации, Гражданский процессуальный кодекс Российской Федерации, Арбитражный процессуальный кодекс Российской Федерации и Федеральный закон «Об информации, информационных технологиях и о защите информации»
НАХОДИТСЯ НА РАССМОТРЕНИИ
17.09.2013 10:52

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

Что там внутри?
Total votes 199: ↑180 and ↓19 +161
Comments 298

Парсер CSS для .NET, написанный на C#

Reading time 4 min
Views 14K
Понадобилось мне однажды распарсить CSS, чтобы вынуть @import, url(). Но для .NET были только разной степени кривоты поделки. Лучшей библиотекой была ExCSS, но она загибалась на таких тривиальных вещах, как медиа-запросы. Поэтому я решил заполнить пробел.

Были варианты: расковырять Chrome, расковырять Firefox, расковырять левую библиотеку. Нужно было гарантированное качество и регулярное обновление, поэтому последний вариант отпадал. В Chrome парсинг CSS и HTML генерировался на основе грамматик, и беглое изучение разнообразия инструментов для .NET повергло в уныние, что уж говорить о совместимости инструментов, поэтому Chrome отпал. Остался Firefox с вручную написанными парсерами.

Приступим!
Total votes 36: ↑28 and ↓8 +20
Comments 27

The Greenlight Supershow (Live 18:30 MSK)

Reading time 1 min
Views 3.8K


В 18:30 MSK (10:30 AM EDT, 14:30 UTC) намечается The Greenlight Supershow.

Суть: эвент с рассказыванием и показыванием 25 игр со Steam Greenlight. Геймплей, специальные гости, вопросы и ответы, халява, секреты, печеньки* — прилагаются. Короче говоря, веселуха в компании разработчиков и игроков.

Описание здесь: robotloveskitty.com/supershow
Смотреть здесь: www.twitch.tv/robotloveskitty

* если принесёте свои

Подробностей нет
Total votes 13: ↑7 and ↓6 +1
Comments 3

.NET Framework: Какую версию вы используете?

Reading time 2 min
Views 28K
Фреймворк .NET развивается очень быстро, в языки с каждой версией добавляется множество новых возможностей. Однако интересно, как быстро этими обновлениями удаётся воспользоваться.

Краткая историческая справка (неполная):

.NET 4.5 (Windows Vista SP2+): Metro, async/await, Unicode console, generics in MEF, IDN, EAI, ZIP; WPF: Ribbon control, async validation, VirtualizingPanel pixel scrolling, static properties bindings, live shaping, better weak events support.

.NET 4.0 (Windows XP SP3+): Parallel Extensions, Parallel LINQ, Task Parallel Library, dynamic dispatch and DLR, covariance and contravariance, named parameters, optional parameters, indexed properties, code contracts, BigInteger and Complex classes.

Углубиться в историю
Total votes 37: ↑32 and ↓5 +27
Comments 50

Альтернативный WPF язык JAML = XAML − XML + JSON

Reading time 7 min
Views 18K
На дворе наступал Новый год, а из головы никак не выходила мысль, что XAML может быть лучше. И, чтобы ему быть лучше, ему нужно перестать быть. Так родилась затея написать альтернативу кошмарному и ужасному XAML'ю: без <Setter.Value>, без {Binding Path=Name, RelativeSource={RelativeSource AncestorType={x:Type Button}}, Converter={StaticResource Converter}}, без FirstValueEqualsToSecondValueOrThirdValueEqualsNullConverter, без <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions>, без <MultiDataTrigger> <MultiDataTrigger.Triggers> <DataTrigger> <DataTrigger.Binding> <MultiDataBinding>..., без xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml", без всего этого барахла, от написания которого в десятый раз возникают позывы нежно погладить компьютер табуретом и вспоминаются далёкие индусские родственники разработчиков WPF.

Читать дальше →
Total votes 53: ↑41 and ↓12 +29
Comments 103

Семь лет WPF: что изменилось?

Reading time 8 min
Views 70K
Прим. перев.: это перевод статьи Six years of WPF; what's changed?, написанной 3 августа 2012 года. Сейчас WPF уже не шесть, а семь лет, однако ничего не изменилось.

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

Шесть лет назад я написал статью про валидацию в WPF на Code Project. Ещё я написал свой error provider, который поддерживает IDataErrorInfo, потому что — вы не поверите! — WPF 3.0 не поддерживал IDataErrorInfo. Позже я работал над несколькими опенсорсными WPF проектами вроде Bindable LINQ (первоначального реактивного программирования для WPF, ещё до изобретения Rx) и Magellan (MVC для WPF а-ля ASP.NET). Я даже некоторое время состоял в клубе, посвящённому превозносению MVVM и киданию ссылок на Code Project, известном как WPF Disciples («Приверженцы WPF»).

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

Вот как в далёком 2006-м году выглядела разметка относительно простого окошка (код позаимствован из проекта, над которым я тогда работал):

	<Window x:Class="PaulStovell.TrialBalance.UserInterface.MainWindow"
	  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	  xmlns:tb="clr-namespace:PaulStovell.TrialBalance.UserInterface"
	  xmlns:tbp="clr-namespace:PaulStovell.TrialBalance.UserInterface.Providers"
	  xmlns:system="clr-namespace:System;assembly=mscorlib"
	  Title="TrialBalance" 
	  WindowState="Maximized"
	  Width="1000"
	  Height="700"
	  Icon="{StaticResource Image_ApplicationIcon}"
	  Background="{StaticResource Brush_DefaultWindowBackground}"
	  x:Name="_this">

Только взгляните на все церемонии! x:Class! Пространства имён XML! Почему бы не объявить всё это в одном месте, почему бы стандартные пространства имён не включать неявно?

К счастью, сейчас 2013-й год, и WPF был проделан огромный путь. Вот так код будет выглядеть сегодня:
Даёшь прогресс!
Total votes 76: ↑63 and ↓13 +50
Comments 226

Школьные поделки: Battlecruiser & DeathCraft

Reading time 8 min
Views 72K
ОСТОРОЖНО! Концентрированная ностальгия! Описанное здесь морально устарело много-много лет назад. Более того, оно устарело до того, как было реализовано. Из статьи вы не узнаете ничего нового.
В давние-давние времена, когда Embarcadero CodeGear Borland Delphi RAD Studio C++ Builder был версии 4, когда Autodesk 3ds Max Discreet 3dsmax 3D Studio Max был версии 3, когда 80 Гб и 200 МГц были не в холодильниках, а в компьютерах, когда Интернет был неведомым и таинственным существом, каждое прикосновение к которому было магическим… я учился в старших классах школы и учился программировать. А также моделировать. И ещё всякое-разное по мелочи.
Подозрительный скриншот:


Много картинок и ностальгии
Total votes 275: ↑261 and ↓14 +247
Comments 115

Бот для браузерки Angry Pets

Reading time 6 min
Views 11K
Предупреждение: бот прост до безобразия. Вы вряд ли научитесь чему-то новому. Статья just for fun.

Решил, что спустя год можно поглядеть, чем френды вконтакте развлекаются. Кроме традиционных тонн политоты, картинок с котятами и прочих непотребств обнаружил ссылку на браузерку Angry Pets. В браузерки никогда не играл, поэтому решил посмотреть, что это за зверь такой. Выяснилось следующее: картинки кавайнейшие (милые котики, пингвинчики и белочки бьют друг другу морды), донат анальнейший (за деньги доход умножают в 8 раз), сюжет, стратегия, безбажность, мануал и прочие привычные удобства отсутствуют.

Игра чуть менее, чем полностью, состоит из следующих нехитрых операций: построить здание, подождать 10 минут, построить юнитов, подождать 10 минут, найти жертву, отправить юниты в атаку, подождать 10 минут, найти жертву, отправить юниты в атаку, подождать 10 минут… (10 минут на высоких уровнях растут экспоненциально. За ускорение — отдельная плата.)

Что делать с такой игрой? Правильно, писать бота. Не играть же в это, честное слово.

Приступаем к делу!
Total votes 54: ↑42 and ↓12 +30
Comments 17

LINQ для PHP. Часть 2. Если гора не идёт к Магомету, Магомет идёт к горе

Reading time 9 min
Views 5.3K
Как можно было заметить из моей предыдущей статьи со сравнением библиотек LINQ для PHP, библиотек много, а качества мало: ленивые вычисления не реализованы ни в одной библиотеке, тесты есть в половине случаев, типы коллбэков ограничены, а иногда и вовсе незнамо что выдаётся за LINQ. Поэтому я написал свою библиотеку. Встречайте:

YaLinqo — Yet Another LINQ to Objects for PHP

Возможности:

  • Самый полный порт .NET LINQ на PHP, со многими дополнительными методами. Некоторые методы отсутствуют, но работа ведётся. Всего реализовано более 70 методов.
  • Ленивые вычисления, текст исключений и многое другое, как в оригинальном LINQ.
  • Детальная документация PHPDoc к каждому методу. Текст статей адаптирован из MSDN.
  • 100% покрытие юнит-тестами.
  • Коллбэки можно задавать замыканиями, «указателями на функцию» в виде строк и массивов, строковыми «лямбдами» с поддержкой нескольких синтаксисов.
  • Ключам уделяется столько же внимания, сколько значениям: преобразования можно применять и к тем, и к другим; большинство коллбэков принимает на вход и то, и другое; ключи по возможности не теряются при преобразованиях.
  • Минимальное изобретение велосипедов: для итерации используются Iterator, IteratorAggregate и др. (и их можно использовать наравне с Enumerable); исключения по возможности используются родные похапэшные и т.п.

Пример кода:

// Отфильтровать продукты с ненулевым количеством, поместить в соответствующие категории,
// отсортированные по имени. Продукты отсортировать сначала по убыванию количества, потом по имени.

from($categories)
    ->orderBy('$v["name"]')
    ->groupJoin(
        from($products)
            ->where('$v["quantity"] > 0')
            ->orderByDescending('$v["quantity"]')
            ->thenBy('$v["name"]'),
        '$v["id"]', '$v["catId"]', 'array("name" => $v["name"], "products" => $e)'
    );

Детальное описание, обсуждение архитектуры, ссылки
Total votes 63: ↑52 and ↓11 +41
Comments 24

Я ненавижу опросы, потому что…

Reading time 1 min
Views 682
Решил, что при карме 50 можно с чистой совестью слить половину кармы, но всё-таки узнать ответ на давно мучающий меня вопрос. Дамы и господа, минусуйте на здоровье, только карму больше, чем на −30, не опускайте, пожалуйста — я ещё топики про PHP писать хотел и ещё немного по разработке игр.

(К моему предыдущему опросу это не относится — он действительно безынтересный, и минусы ожидаемы. Однако я видел множество заминусованных интересных опросов.)
Total votes 83: ↑21 and ↓62 -41
Comments 20

Если мне надо скачать галерею deviantART, канал YouTube, плейлист VKontakte и т.п., то я использую…

Reading time 1 min
Views 5.3K
Есть позывы написать софтинку: вводишь URL, по нему предлагаются соответствующие варианты, что качать (галерею, избранное, избранное друзей, избранное друзей друзей), куда качать (как распихать по папкам, возможно, как записать в базу), как качать, когда качать и т.п. Размещение данных на сайте (где на странице какой блок информации), связь между ними (граф — что с чем какое имеет отношение) и т.п. задаются декларативно (XPath, RegEx и т.п. в иерархии) и частично скриптами (Lua, JS и т.п.). Хочу универсальный инструмент: с одной стороны, чтобы было глубокое понимание структуры сайта, как у специализированных качалок; с другой стороны, чтобы была мощь настроек универсальных качалок. Хочу, чтобы был нормальный режим проверки обновлений (не надо заново проверять всю галерею, чтобы скачать два добавившихся файла).

Опрос создаю для того, чтобы прощупать почву: нужно оно кому-нибудь или нет.
Total votes 51: ↑19 and ↓32 -13
Comments 22

LINQ для PHP. Часть 1. Я его слепила из того, что было, а потом, что было, то и полюбила

Reading time 9 min
Views 8.1K
Сказ о том, как LINQ на PHP портировали. Сравнение ныне существующих библиотек с табличками, но без графиков — прилагается.

Картинка код для привлечения внимания (картинок не дождётесь!)
echo Phinq::create($people)
  ->groupBy(function($person) { return $person->residence->region; })
  ->select(function($grouping) {
    $obj = new stdClass();
    $obj->people = $grouping;
    $obj->region = $grouping->getKey();
    return $obj;
  })->orderBy(function($obj) { return $obj->people->count(); }, true)
  ->aggregate(function($current, $next) {
    $count = $next->people->count();
    return $current . sprintf(
      "%d %s (%s) live in the %s region\n",
      $count,
      $count === 1 ? 'person' : 'people',
      $next->people->aggregate(function($current, $next) {
        if ($current !== null) {
          $current .= ', ';
        }
        return $current . sprintf('%s [%s]', $next->name, $next->residence->code);
      }),
      $next->region
    );
  });
Кто видел C# или любой функциональный язык — при виде этого шедевра закатит глаза (если они предварительно не вылетят из орбит). И, наверное, будет прав. Но можно ещё вот так:
$lowNums =
	from('$n')->in($numbers)->
	where('$n < 5')->
	store($digits)->into('digits')->
	select('$digits[$n]');
А как ещё можно? Осторожно, много текста!
Total votes 54: ↑44 and ↓10 +34
Comments 55
1

Information

Rating
Does not participate
Location
Казань, Татарстан, Россия
Date of birth
Registered
Activity