вторник, ноября 25, 2014

Yosemite is not responding

Всегда устанавливаю операционные системы с нуля, чтобы избежать побочных эффектов. С Yosemite все не заладилось с самого начала, потому что инсталлер в самом конце подзавис. Но самый ад начался потом, когда каждый раз при загрузке не запускался Google Chrome, Adium. Процессы просто зависали, писали Not Responding. Приходилось их многократно снимать и запускать заново до приведения в работоспособное состояние. При этом Safari и Firefox запускались отлично. В какой-то момент я начал думать что так выглядит грязная борьба Apple против Google.
В общем сегодня меня это достало окончательно, и методом проб и ошибок решение было найдено. Необходимо отключить рассылку приглашений Bonjour без отключения службы DNS. Для этого в Yosemite надо добавить параметр --no-multicast для com.apple.networking.discoveryd в файле /System/Library/LaunchDaemons/com.apple.discoveryd.plist
Ссылки по теме:
http://apple.stackexchange.com/questions/151485/how-do-i-disable-bonjour-visibility-after-yosemite-install?answertab=active#tab-top
http://blog.spikie.info/osx-10-10-yosemite-how-to-disable-bonjour-service-advertising-without-disabling-dns/
Неужели Apple после ухода Джобса постепенно превращается в нечто унылое?

ЗЫ: на самом деле трюк не сработал. Переустановка сверху тоже не помогла. Что интересно, когда подключаешь второй монитор, глюка нет.

четверг, ноября 13, 2014

Печать в pdf в Mac OS X в терминале 2X RDP

Если:
- Вы используете Mac OS X
- Вынуждены пользоваться RDP
- Программы в этом RDP печатают на принтер по умолчанию
- Но Вам нужен pdf
То устанавливайте PDFWriter и ищите свои pdf в private/var/spool/pdfwriter или в Macintosh HD/Users/Shared/PDFwriter
Победитель номинации Костыли-2014.

среда, октября 22, 2014

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

Конкантенация файлов в scala

В spray.io надо было склеить чанки, каждый из которых сливался в отдельный файл и родилась такая вот конструкция для конкантенации нескольких файлов. Мне кажется красиво и функциональщина в тему.

import java.io.{ FileInputStream, FileOutputStream }

val newFileChannel = new FileOutputStream("result.txt") getChannel ()
List("a.txt","b.txt", "c.txt").foldLeft(0L)((offset, f) => offset + (newFileChannel transferFrom (new FileInputStream(f) getChannel, offset, Long.MaxValue)))


вторник, сентября 09, 2014

Русифицируем asciidoctor-pdf

Очередной раз поднялся вопрос в чем писать документацию, чтобы:
1) была простая разметка, которую можно было редактировать в простом текстовом редакторе
2) можно было получить diff в версиях, как следствие текстового представления сырца
3) была генерация html
4) была генерация pdf без всяких docbook, latex и прочего

Если под первые три пункта подходит тот же markdown, то по последнему мною было обнаружено только одно хоть как-то работающее решение - https://github.com/asciidoctor/asciidoctor-pdf. И то в состоянии альфы.
Вообще, конечно, странно в 2014 году не иметь нормальных прямых решений генерации pdf из разметки. Видимо, это никому особо не надо - взяли ворд и вперед вместе с pdf-принтерами.

В asciidoctor-pdf тоже вылезла проблема - с русским языком. По крайней мере у меня на Mac OS X. Причина, как ожидаемо, в шрифтах.
Для лечения в Mac OS X нужно закачать правильные шрифты в папку /Library/Ruby/Gems/2.0.0/gems/asciidoctor-pdf-1.5.0.alpha.4/data/fonts, которые позаимствовать из папки системных шрифтов /Library/Fonts/
Затем решить как прописываем установки шрифтов - глобально или локально. Если глобально - работаем с файлом конфигурации asciidoctor-pdf /Library/Ruby/Gems/2.0.0/gems/asciidoctor-pdf-1.5.0.alpha.4/data/themes/default-theme.yml. Если локально - переписываем эту конфигурацию в папку со своим документом.
В конфигурации добавляем еще одну секцию font:catalog:
и указываем новый шрифт в секции base:font_family:

Будет выглядеть как-то так:

font:
  catalog:
    Arial:
      normal: Arial.ttf
      bold: Arial Bold.ttf
      italic: Arial Italic.ttf
      bold_italic: Arial Bold Italic.ttf
base:
  font_family: Arial

если используете русский язык в коде, которые вставляется директивой source, не забудьте в секции code/font_family указать шрифт, поддерживающий кириллицу:
code:
     font_family: Arial

Далее, русификация наименования секций Chapter -> Глава
https://github.com/asciidoctor/asciidoctor-pdf/commit/43584be1cae1853c6e8479c76c6d7ba561782b34
после этого можно писать в заголовке
:chapter-label: Глава
 и все получится

Для переименования Table of context -> Оглавление
можно просто переопределить переменную toc-title.
Для этого прямо в документе пишем
:toc-title: Оглавление

Для перевода Version -> Версия добавь
:version-label: Версия

При формировании нумерованных списков может потребоваться настройка размера отступа текста от номера, что можно сделать через переменную outline_list indent в конфигурации темы:
outline_list:
  indent: $horizontal_rhythm * 2.25

Как верно подсказали в комментариях - не стоит портить дефолтную тему, имеет смысл закачать в папку /Library/Ruby/Gems/2.0.0/gems/asciidoctor-pdf-1.5.0.alpha.4/data/fonts нужны шрифты, а определения стилей хранить прямо около документа, запуская генерацию командой
asciidoctor-pdf -a pdf-style=path/to/*-theme.yml *.adoc

среда, июля 30, 2014

Запись синтезированного голоса в Mac OS X

Мне кажется что неплохой синтезатор голоса сделан на ivona.com. Голос гуглопереводчика показался каким-то тормозным.
В Mac нет звукового loopback, поэтому для записи проигрываемого звука надо ставить отдельные программные инструменты. Вполне адекватно работает soundflower. После его установки необходимо выставить soundflower как input и output source. Теперь можно писать звук с звуковой карты. Обрезать лишнее можно с помощью audacity, для поддержки им сохранения в mp3 надо установить lame.

четверг, июля 24, 2014

iOS 7 + Phonegap + Leaflet + Google Maps Plugin = freeze after zoom

Напоролся на проблему, что в phonegap-приложении под iOS 7 с использованием Leaflet и плагина для просмотра Google Maps после зума карта морозится.
Помогло https://github.com/Leaflet/Leaflet/issues/2693#issuecomment-45146332
map.on('zoomanim', debounce(map._onZoomTransitionEnd, 250));
Все остальное не помогло и не повлияло.

среда, июля 09, 2014

Mithril templates

Обычно во всех джаваскриптовых MV*-фреймворках темплейты могут иметь только один корневой элемент. Иногда это создает сложности для разметки. В Mithril можно возвращать массив. С использованием JSX for Mithril код темплейта может выглядеть так.

Ссылки 2014-07

Fixed persistent header and scroll to focussed input fields
Просто постоянные проблемы в с position:fixed в вебвью разных OS в cordova. То заголовок уезжает в iOS, то в андройде скролл тормозит если контент внутри fixed div.

How to Create a 4GB/s RAM Disk in Mac OS X
Что-то gulp и browserify стали долго делать инкрементальную сборку проекта, последняя мера по ускорению диска - работать с проектом на RAM-диске. Диск не персистентный, существует только в памяти, поэтому коммитить наружу надо чаще. Если что зависнет - потеряешь сделанные изменения. Зато прирост в скорости сразу в 3 раза. Больше из железки уже просто не выжать.

пятница, июня 20, 2014

Идиоматический асинхронный линеаризированный javascript на node.js с использованием Q

Если не принять мер, рано или позно callback-hell в javascript начнет отравлять вашу жизнь и вы будете искать способ линеаризации кода для композиции асинхронных и синхронных вызовов.
Лично я для линеарилизации асинхронных вызовов предпочитаю использовать библиотеку Q. Впрочем, у всех подобных библиотек примерно одинаковая семантика. Рассмотрим, к примеру, гипотетическую последовательность действий при регистрации пользователя:
1. Регулярными выражениями проверяем что e-mail правилен (sync)
2. Проверяем что пароль сложен (sync)
3. Проверяем существует ли пользователь с таким именем в базе (async)
4. Записываем в базу новую учетную запись, если за это время кто-то другой не создал запись (async)
5. Возвращаем сериализованную запись пользователя или ошибку


Какие выводы можно сделать из вышеприведенного кода?
1. В асинхронной функции создается Q.defer(), возвращается promise, в нужный момент вызываются reject с ошибкой или resolve с результатом выполнения.
2. В синхронной функции возвращается значение или кидается ошибка.
3. Обработку fail имеет смысл централизовать.
4. Поскольку в следующий .then аргументом передается результат выполнения предыдущего, то в этих случаях оберток не требуется (createUser передает user в serializeUser)

среда, апреля 02, 2014

Ссылки 2014-04

http://www.bluthemes.com/blog/3/clearing-bootstrap-3-columns
Clearing Bootstrap 3 columns
Суперхак для нормального выравнивания бутстраповских гридов. Must have.

https://github.com/OverZealous/run-sequence
Решение проблем с зависимостями между задачами в gulp.

http://blog.oio.de/2014/04/04/internet-explorer-11-source-map-based-debugging/
Internet Explorer 11 will support source maps based debugging!!!

https://github.com/eugeneware/deglobalify
A browerify transform to stops 3rd party javascript modules writing to the global window object, and to return a module.exports object instead.


среда, марта 05, 2014

Ссылки 2014-03

https://github.com/jrudolph/sbt-dependency-graph/
Полезный плагин к sbt, позволяющий посмотреть граф зависимостей между библиотеками

https://github.com/kinkadzs/twirlsbt13
пример с twirl 0.7.0-snapshot (play framework template engine) на scala 2.10

https://github.com/spray/spray/tree/master/site
сайт spray.io с использованием twirl 0.7.0

понедельник, февраля 17, 2014

clustered node.js vs spray.io vs erlang в ping-pong

Автор (https://github.com/jakubkulhan/node-spray-bench) почему-то решил сравнивать некластеризованный Node.js и Spray.io. Естественно, что Node.js сильно проигрывал. Пришлось исправить ошибку и кластеризовать ноду (https://github.com/olegsmith/node-spray-bench). Ну и в догонку добавить Erlang, чтобы были представлены все ключевые виртуальные машины.

Тесты на моем макбуке Mid 2011 показали:
1) Erlang и кластерный Node.js показывают числа одного порядка.
2) Spray.io при увеличенной конкурентности будет побыстрее Erlang и кластерного Node.js раза в полтора-два.
3) у Spray.io ниже средняя латентность, но сильно хуже стандартное отклонение

PS: Автор переименовал репо https://github.com/jakubkulhan/hit-server-bench и добавил http-kit на clojure, который показал неожиданно высокую производительность и маленькое стандартное отклонение латентности. Будем смотреть.


Node

Running 10s test @ http://127.0.0.1:8080/
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   116.22us   77.97us   5.97ms   99.52%
    Req/Sec     7.95k   546.35     8.67k    75.03%
  74852 requests in 10.00s, 10.42MB read
Requests/sec:   7487.30
Transfer/sec:      1.04MB

Running 10s test @ http://127.0.0.1:8080/
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   521.68us    1.39ms  44.86ms   99.24%
    Req/Sec    10.26k     1.97k   14.44k    68.55%
  192574 requests in 10.00s, 26.81MB read
Requests/sec:  19258.40
Transfer/sec:      2.68MB

Running 10s test @ http://127.0.0.1:8080/
  10 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     3.06ms    3.31ms  37.70ms   89.96%
    Req/Sec     2.41k     1.32k    7.00k    51.13%
  193808 requests in 10.00s, 26.99MB read
Requests/sec:  19378.43
Transfer/sec:      2.70MB

Running 10s test @ http://127.0.0.1:8080/
  20 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     6.60ms    4.97ms  36.03ms   64.39%
    Req/Sec     1.10k   661.64     5.18k    72.07%
  183343 requests in 10.00s, 25.53MB read
Requests/sec:  18328.81
Transfer/sec:      2.55MB

Spray.io

Running 10s test @ http://127.0.0.1:8080/
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   125.49us   33.17us   2.54ms   98.52%
    Req/Sec     7.24k   507.78     8.11k    75.55%
  68564 requests in 10.00s, 9.35MB read
Requests/sec:   6856.59
Transfer/sec:      0.94MB

Running 10s test @ http://127.0.0.1:8080/
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.59ms   12.91ms 140.62ms   98.93%
    Req/Sec    13.30k     3.26k   25.67k    87.42%
  235621 requests in 10.00s, 32.13MB read
Requests/sec:  23562.77
Transfer/sec:      3.21MB

Running 10s test @ http://127.0.0.1:8080/
  10 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    10.73ms   35.13ms 155.83ms   93.35%
    Req/Sec     3.77k     1.48k   20.44k    88.13%
  347999 requests in 10.00s, 47.46MB read
Requests/sec:  34804.40
Transfer/sec:      4.75MB

Running 10s test @ http://127.0.0.1:8080/
  20 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     3.87ms    8.87ms  78.06ms   97.79%
    Req/Sec     1.99k   490.15    15.78k    88.91%
  372251 requests in 10.00s, 50.77MB read
Requests/sec:  37237.53
Transfer/sec:      5.08MB

Erlang

Running 10s test @ http://127.0.0.1:8080/
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   140.07us   33.36us   1.26ms   97.17%
    Req/Sec     6.75k   517.40     8.11k    73.23%
  63944 requests in 10.00s, 7.50MB read
Requests/sec:   6394.53
Transfer/sec:    768.09KB

Running 10s test @ http://127.0.0.1:8080/
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   618.15us  295.73us   7.04ms   77.63%
    Req/Sec     8.18k   839.32    10.78k    74.76%
  155008 requests in 10.00s, 18.18MB read
Requests/sec:  15501.56
Transfer/sec:      1.82MB

Running 10s test @ http://127.0.0.1:8080/
  10 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     3.27ms    2.05ms  18.03ms   69.48%
    Req/Sec     1.62k   298.53     3.50k    73.85%
  154527 requests in 10.00s, 18.13MB read
Requests/sec:  15454.23
Transfer/sec:      1.81MB

Running 10s test @ http://127.0.0.1:8080/
  20 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     6.97ms    4.64ms  40.03ms   68.73%
    Req/Sec   763.11    163.90     1.50k    70.78%
  147900 requests in 10.00s, 17.35MB read
Requests/sec:  14792.68
Transfer/sec:      1.74MB

суббота, февраля 08, 2014

Ссылки 2014-02

http://benninger.ca/posts/akkascala-deploying-an-actor-remotely/
AKKA+SCALA: DEPLOYING AN ACTOR REMOTELY

http://benninger.ca/posts/creating-an-akka-actor-from-a-dynamically-loaded-jar-file-in-scala/
CREATING AN AKKA ACTOR FROM A DYNAMICALLY LOADED JAR FILE IN SCALA

http://techblog.net-a-porter.com/2013/12/ask-tell-and-per-request-actors/
ASK, TELL AND PER-REQUEST ACTORS

http://tuxdna.wordpress.com/2014/02/03/a-simple-scala-parser-to-parse-44gb-wikipedia-xml-dump/
A simple Scala parser to parse 44GB Wikipedia XML Dump

http://blog.trifork.com/2013/08/01/server-side-clustering-of-geo-points-on-a-map-using-elasticsearch/
SERVER-SIDE CLUSTERING OF GEO-POINTS ON A MAP USING ELASTICSEARCH

https://github.com/triforkams/geohash-facet
Geohash Facet Plugin for elasticsearch

https://groups.google.com/forum/#!msg/akka-user/8fZ75MlVEYc/YaZGsysG8mcJ
В Akka начались подвижки в направлении Rx

http://danielwestheide.com/blog/2013/01/23/the-neophytes-guide-to-scala-part-10-staying-dry-with-higher-order-functions.html
Staying DRY With Higher-order Functions

Обзор проблем распределенных систем и Akka-way

понедельник, января 13, 2014

пятница, января 10, 2014

JAVA_HOME in Mac OS X 10.7 - 10.9

export JAVA_HOME="/usr/libexec/java_home -v 1.7"

понедельник, января 06, 2014

Ссылки 2014-01

OData
http://www.odata.org/documentation/odata-v2-documentation/uri-conventions/

JSTS Topology Suite
https://github.com/bjornharrtell/jsts

OData query string parser for node.js. OData query -> JSON Expression tree
https://github.com/qraftlabs/node-odata-parser

ODataQueryBuilder: a JavaScript library for building OData queries
http://www.odata.org/2013/08/odataquerybuilder-a-cross-browser-javascript-library-for-building-odata-queries-3/

OGR bindings for node
https://github.com/zhm/node-ogr

Единственный публичный файлшаринг-сервис, который позволил закачать 200 мегов без регистраций и денег
http://turbobit.net/

Мой список блогов