?

Log in

Кто-то обращает внимание на то, что детей могут судить с 14 лет за участие в беспорядках. Ну да, это для борьбы с потенциальными уличными движениями, которые могут разразиться в гипотетической предреволюционной ситуации. Ну ок (хотя не ок).

Гораздо, гораздо больше заботит требование предоставлять ключи для расшифровки коммуникации. Забудьте на секунду про политику. Это то, что позволит осуществлять промышленный, экономический шпионаж на беспрецедентном уровне. Как официальный, санкционированный государством, так и самодеятельный — на уровне провайдеров, у которых появятся какие-то базы данных, вокруг которых будут крутиться какие-то люди. Даже риск этого может останавливать компании от участия в экономической деятельности с Россией.

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

Да нет, это просто днище.
Утомительно слышать, как нас продолжают поправлять. Мол, не силиконовая долина, а кремниевая. Пока живу здесь, всё время долина была "силиконовая", от слова силикон, кремний, и никого точная этимология не колебала. Силиконовая долина своим чередом занимала умы русскоязычных предпринимателей и технологистов.



Но в какой-то момент российский истеблишмент понял, что в долине можно полить российские бабки. И послал сначала Чубайса, затем Медведева, а силиконовую долину начали показывать по федеральным каналам. И тут из нор повылезали какие-то граммар-наци с задранным вверх пальцем. Которые вообще до того, пока им по телевизору президента и айфон не показали, слыхом не слыхивали ни про какую силиконовую долину. Но им ведь важно, "как правильно", а не как принято. И начали на каждом углу переименовывать долину из силиконовой в кремниевую.

Всплеск красненького в районе 2010 года — это приезд Медведева и ассоциированный возбудёж граммар-наци, которые именно тогда впервые о долине и узнали.



Узбагойтесь уже... Фиг с вами. Пусть будет «Кремниевая долина», американский аналог «Сколково».
oleyka последние пару дней ошивается на какой-то программистской конференции (в Портланде? забыл спросить), я у детей за главного. Сели в кафешку, сидим-едим.

Марк (9) и Алиса (6) поочерёдно задают вопросы. Алиса:
— Папа, а могут девочки жениться на мальчиках, а девочки — на девочках?
— Да без проблем, Алиса, о чём речь.
— Ой, я хотела сказать, могут ли мальчики жениться на дев.. мальчиках, а девочки — на девочках?
— Да, могут, но это довольно редко происходит. Обычно всё же мальчики женятся на девочках, а девочки на мальчиках.
Марк навострил уши:
— А почему, мальчики с мальчиками же не могут создать семью?
— Ну как не могут. Могут. Вот ребёнка своего завести — не могут. А жениться и семью создать — могут. Только это редко происходит, примерно в одном проценте случаев.
— А почему они так делают?
— Ну обычно когда наступает puberty (в 12-13 лет), почти все люди начинают интересоваться противоположным полом, что приведёт потом к созданию семьи. Но у некоторых людей есть особенности развития, которые будут заставлять их интересоваться своим полом. И поэтому жениться они будут хотеть на таких же, как они.
— Что значит "заставлять"? Кто их заставляет?
— Ну представь, что ты ешь щупальце кальмара (у Марка вполне себе серьёзная фобия щупалец). Ты сможешь его есть, или тебе будет трудно это делать? Что тебя заставляет бояться щупалец? Ну вот примерно так тебя может мозг заставить что-то делать или не делать.
— Понятно. То есть, если взять четыре наших параллельных класса, то кто-то один скорее всего будет интересоваться мальчиками, если он мальчик, или девочками, если она девочка?
— Ну да.

Ну и всё, собственно.

P.S. По результатам математической олимпиады Кенгуру среди третьеклассников, Марк обошёл 75% своих сверстников в Калифорнии, которые участвовали в Олимпиаде, и, судя по баллам, обошёл бы 94% сверстников в России, если бы участвовал там.

P.P.S. Процент гей-браков, заключённых в Калифорнии в 2008 году: 0.83%. Процент американцев, которые считают, что геи не должны иметь право на брак: 47%.

P.P.P.S. Когда-то я набрёл на идеальный родительский ответ на «не совсем удобные» вопросы детей. «И так тоже бывает». Рекомендую.

Томас Скотт.

О мышах и людях кремниевой долины


Перевод — lionet. Оригинал: OF MICE AND MEN OF SILICON VALLEY, by Thomas Scott.


[В нескольких милях к югу от Сан-Франциско, пузырь недвижимости распух до треска, а поток инвестиционных денег сливается в глубокую зелёную реку. Однажды вечером, в дешёвом мотеле близ Пало-Альто...]


ЛЕННИ: Джордж, расскажи как всё будет.

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

ЛЕННИ: Расскажи, что делать-то, Джорж!

ДЖОРЖ: Мы должны запустить наш стартап с венчурным капиталом или ангельскими инвестициями. Мы погорбим спину, кодируя, запустимся через несколько месяцев, быстро расширим нашу пользовательскую базу, затем окэшимся, выйдя на IPO. Тогда у тебя будут твои кролики. И фермерские сливки будут такие жирные и свежие, что ты их сможешь ножиком резать.

ЛЕННИ: Ты чертовски прав, что будут жирные и свежие! Я буду кормить сливками моих кроликов и они будут торчать от этого, господи Иисусе!

ДЖОРЖ: Только запомни: никому ни слова. Как только инвесторы увидят, сколько кода ты можешь наколбасить, всё станет хорошо. Но если ты посмеешь открыть свою пасть, они должны будут выставить нас за дверь. Поэтому позволь уж мне согласовывать условия.

ЛЕННИ: Я не скажу ни слова, Джорж.

— — —

[В офисе ангельского инвестора...]


ДЖОРЖ: Сорян, мы припозднились. Наш, этот, водила Uber выкинул нас в квартале отсюда. Убер-Сусанин.

АНГЕЛ-ИНВЕСТОР: Пацаны, я посмотрел на ваше предложение. Мне очень нравится. Расскажите о вашем последнем проекте.

ДЖОРЖ: Это в Сиэттле было. Уволили, как только мы закончили работу.

АНГЕЛ-ИНВЕСТОР: А тебя тоже?

ДЖОРЖ: И его тоже, ага.

АНГЕЛ-ИНВЕСТОР: А он не слишком говорлив, верно?

ДЖОРЖ: Нет, но работящ и кропотлив. Он может код писать так, что ты-б подумал, что там двое. Я не говорю, что он смышлён, но работник что надо.

— — —

[Неделей позже в новом офисе, после получения финансирование от ангела...]


ДЖОРЖ: Эй, Кэнди! Что за ерунду ты делаешь, приводя эту чёртову собаку сюда?

КЭНДИ: Эту собаку? Слушай. Это для того, чтобы создавать расслабляющую атмосферу. Вместе с этой пинбол-машиной и этими бескорпусными матрасами. Эту собаку ращу со щенка. Он со мной был все эти годы. Я его завела ещё тогда, когда у меня были здоровые руки, хаха.

ДЖОРЖ: Допустим, но он воняет адски. Убери его с нашей стороны. И, к слову, это твоей деревянной кистью ты объясняешь то, как медленно ты работаешь?

КЭНДИ: [нервно поглаживая свою ампутированную руку] Я думаю, что у меня неплохо получается и с одной. Короче, так...

ДЖОРЖ: Не, это я тебе скажу, что короче. Если ты будешь продолжать так плестись и потратишь ещё один дедлайн, эта собака получает пулю в глаз.

— — —

[Одиннадцатью месяцами позже, тот же офис...]


ДЖОРЖ: Хороша работа, Ленни. Господи, ты кодируешь как сукин сын!

ЛЕННИ: Это значит, что ты позволишь мне держать кроликов, Джорж?

ДЖОРЖ: Мы все там будем, Ленни. Мы всё ещё должны расширить нашу пользовательскую базу и модифицировать нашу конверсионную воронку перед тем, как мы доберёмся до IPO-фазы. Но мы не далеко от неё, впрочем.

ЛЕННИ: И тогда — кролики?

ДЖОРЖ: Ага, да, тогда много сраных кроликов. На, ешь свои суши.

ЛЕННИ: Мне нравятся суши с кетчупом.

ДЖОРЖ: У нас нема кетчупа.

— — —

[Позже тем же вечером, пока Ленни всё ещё на работе, а Джорж отлучился...]


ГОРБУН: Ты знаешь, что Джоржик тебя использует? Он не даст тебе кроликов.

ЛЕННИ: Это неправда! Он скоро мне даст их, он говорит.

ГОРБУН: Может быть, даст. Но что если ты узнаешь, что есть люди, которые могут подкинуть тебе мягких кроликов прямо сейчас?

ЛЕННИ: Я не... Я не буду ничего делать, не спросив Джоржа.

ГОРБУН: Ну как хочешь. Твоя потеря. [Разворачивается, чтобы уйти]

ЛЕННИ: Постой-ка! Вернись!

— — —

[На следующий день, в офисе...]


КЁРЛИ: [возвращаясь из туалета в свой кубикл] Эй, где моя перчатка? Кто взял мою перчатку?

ДЖОРЖ: Я не видел.

КЁРЛИ: Но я не могу кодировать без моей перчатки, иначе у меня вазелин по клавишам размажется! Кто, блин, взял её? Этот сукин сын?

ДЖОРЖ: Не мог это быть Ленни. Он весь день на больничном. Сказал, что-то с желудком.

КЁРЛИ: Лежит больной! Чёрт возьми, у нас остались сутки до IPO!

— — —

[В это время, в другом конце города...]


ПРЕДСТАВИТЕЛЬ ГУГЛА: Окей, Ленни, по рукам?

ЛЕННИ: Я хочу пощупать их, для начала. Чтобы понять, что они такие мягкие, как вы обещали.

— — —

[На следующее утро, дома у Ленни и Джоржа...]


ДЖОРЖ: Собирайся, Ленни. Нам на работу.

ЛЕННИ: Мы не идём туда больше, Джорж. Мы идём кое-куда ещё.

ДЖОРЖ: Ленни, перестань шутить.

ЛЕННИ: Джорж, должен тебе что-то сказать.

ДЖОРЖ: Нет, слушай меня, Ленни. Чёрт возьми, я хотел тебя порадовать на работе, но IPO сегодня. Мы сделали это, братан! Я не хотел говорить тебе, чтобы ты фокус не потерял. Вечером пойдём и я куплю тебе самого большого чёртового кролика, какого ты только видел.

ЛЕННИ: Ох.

ДЖОРЖ: Что?

ЛЕННИ: Джорж. Я плохо сделал.

ДЖОРЖ: Что ты там натворил?

[К дому подъезжает Гугловый автобус и открывает для них двери.]

ДЖОРЖ: [выглядывая в окно] Что происходит? Это ведь не к нам, да?

ЛЕННИ: Я сделал плохое дело, Джорж. Я подписал нас работать на Google.

ДЖОРЖ: О, боже мой, Ленни.

ЛЕННИ: Я должен был, Джорж. Я должен был получить моих кроликов! Я не знал!

ДЖОРЖ: Ленни, господи, пожалуйста, пожалуйста скажи мне ты не сдал нас работать на Гугл за еду! Пожалуйста скажи мне, что ты не записал нас горбить спину, кодируя за кроликов.

ЛЕННИ: Нет, нет, Джорж. Не за кроликов, Джорж. За миллион кроликов. Мягких.

Tags:

Go vs Swift vs C++ microbenchmark

Looking at the Swift vs Go vs Python battle, couldn't help but notice its old age. It was written almost 12 months ago and the weight of time clearly shows. In a fast paced race towards ecosystem simplicity that we observe nowadays, a year is a lot.

So on my Macbook Air (1.7 GHz Intel Core i5) I decided to repeat the test, and add C++ to the mix. It is too easy to test against python (which is about 10x slower than the "compiled" languages), so C++ should be a fair competition. Go 1.5.3, Swift 2.1.1, C++ clang-700.1.81.

I don't propose taking my test seriously. The micro-benchmarking doesn't tell us much about about the language ecosystem, tooling, maintainability, surface area of a language, etc, etc. It even doesn't tell us too much about performance. But you know the drill. If you see a micro-benchmark, puke and close the window. Don't read any further.

Nevertheless! There's some source.

GoSwiftC++
package main
import "fmt"

func main() {
    var sum int64 = 0

    for e := 0; e < 200; e++ {
        sum = 0

        var x[]int64
        for i := 0 ; i < 1000000; i++ {
            x = append(x, int64(i));
        }

        var y[]int64
        for i := 0 ; i < 1000000-1; i++ {
            y = append(y, x[i]+x[i+1]);
        }

        for i := 0 ; i < 1000000; i += 100 {
            sum += y[i];
        }
    
    }
    
    fmt.Println(sum);
}
var sum : Int64 = 0

for e in 0..<200 {
    sum = 0 
    
    var x : [Int64] = []
    for (var i = 0; i < 1000000; i++) {
        x.append(Int64(i));
    }
        
    var y: [Int64] = []
    for (var i = 0; i < 1000000-1; i++) {
        y.append(x[i] + x[i+1]);
    }
        
    for (var i = 0; i < 1000000; i+=100) {
        sum += y[i]
    }   
}
        
print(sum)  
#include <vector>
#include <iostream>

int main() {
    int64_t sum = 0;

    for(int e = 0; e < 200; e++) {
        sum = 0;

        std::vector<int64_t> x;
        for(int i = 0; i < 1000000; i++) {
            x.push_back(i);
        }

        std::vector<int64_t> y;
        for(int i = 0; i < 1000000-1; i++) {
            y.push_back(x[i] + x[i+1]);
        }

        for (int i = 0; i < 1000000; i += 100) {
            sum += y[i];
        }
    }

    std::cout << sum << std::endl;
}


Why I chose int64 instead of int? On my 64-bit platform the C++'s int is 32 bit, whereas Go's and Swift's default ints are 64-bit. I wanted to level the playing field a little.

Anyway. Let's the battle begin:

go build -o test-go go/test.go
swiftc -O -o test-swift swift/test.swift
c++ -O3 -o test-c cplusplus/test.cc
GOMAXPROCS=2 time ./test-go
9999010000
        4.32 real         5.99 user         0.38 sys
GOMAXPROCS=1 time ./test-go
9999010000
        3.93 real         3.89 user         0.05 sys
time ./test-swift
9999010000
        3.96 real         2.82 user         1.12 sys
time ./test-c
9999010000
        2.37 real         1.74 user         0.62 sys


What we see here? With Go, GOMAXPROCS adds measurable overhead. As expected. But not that huge. C++ is predictably faster. No surprise here. In fact, this appears to be mostly a competition of memory allocators and GCs (where applicable), and Swift and Go are rather on par with each other.

But let's try a smaller array so memory allocation becomes a bit less of an issue. The following test was made with e<=2000 (instead of 200) and loop iterations to 100k instead of 1m:

go build -o test-go go/test.go
swiftc -O -o test-swift swift/test.swift
c++ -O3 -o test-c cplusplus/test.cc
GOMAXPROCS=2 time ./test-go
99901000
        4.40 real         5.65 user         1.10 sys
GOMAXPROCS=1 time ./test-go
99901000
        5.06 real         5.07 user         0.83 sys
time ./test-swift
99901000
        2.32 real         2.29 user         0.01 sys
time ./test-c
99901000
        1.39 real         1.37 user         0.01 sys


Now, we're talking. Go is lagging behind, perhaps because of its reliance on its own code generator. This gets us into "3x slower than C" domain. Swift is using LLVM, the same code generator my C++'s compiler uses under the hood. But it adds some checks and GC, so Swift also exhibits a serious slowdown, though well within 2x of C++.

What we can take from it?

I suspect that if Swift had first class concurrency support while managing to retain its speed, many people would consider it instead of Go. But we can't have both. Either we have a speedy and high maintenance language, or concurrent but a bit slow language, and then Swift.

...and we also have Erlang, but its benchmark didn't fit on my charts :)

Swift, Apple Watch, and Dynamic Graphs

To Hacker News fellas: please recognize the phrase about a week worth of battery is just a joke. Today I learned that even HN trolls don't understand a concept of trolling. Read into the technical side of this writeup, ignore opinions.


I tried to write something for Apple Watch as a weekend project to polish my rough Swift skills. Swift got me rather excited. It takes some things from OCaml and FP, having a strong nod to immutability concerns. Constants are defined via let, and variable are allowed to vary through a var. Though constants are lame, as only the binding itself is constant and you can change everything inside them as usual.

Nevertheless, Swift is a step in right direction. I enjoyed programming for the most part. However, XCode was traditionally nauseous with its hiccups and interventions into my editing process.

I made an app which shows a dynamic 30fps graph inside the Watch Emulator. Incidentally, had to figure out how to made the animated gifs use solid colors, rather than being hellishly dithered. There's a two step process. First, you have to generate a single palette out of all frames. Then you apply that same palette in the second conversion. The overall workflow would look like this: use a standard QuickTime player to record a screencast, then filter that .MOV through this script to get a .GIF.



The Watch App sources are here: https://github.com/vlm/ExampleWatchGraph (look for WatchKit Extension — that's the very part that runs on a Watch).

The Watch SDK has a strong Apple-style feel, if you get my french. For example, in order to draw something dynamic on a screen, you have to do the following 30 times a second:
  1. Create a graphics context using a size known in advance. You can't just get the WKInterfaceImage dimensions, that'd be too easy. You can only set the user interface element size, not get it.
  2. Draw what's needed through a CoreGraphics (Quartz 2D, runs on a CPU) — that seems to be the easy part.
  3. Convert the context into a .PNG and assign that .PNG to the WKInterfaceImage. Check this out: https://github.com/vlm/ExampleWatchGraph/blob/master/ExampleWatchGraph%20WatchKit%20Extension/GraphPainter.swift#L117

In the end of the day, the watch battery is there just to shuffle these .PNGs around. When Apple realizes how to avoid that, the watch will last for a week instead of hours.

Here's my profiling session showing this .PNG madness:

Swift, Apple Watch, and dynamic Graphs

Поробовал я попрограммировать под Apple Watch на досуге. На Swift'е. Свифт очень даже ничё так. Похож на OCaml чем-то. Например, константы определяются через let, переменные через var. Но константы дутые: внутри них можно менять всё, что там меняется.

Swift, определённо, шаг в правильную сторону. Программировать было, в основном, приятно. Впрочем, XCode традиционно раздражал своими тормозами и подсказками.

Сделал приложение, которое показывает динамический график, движущийся со плавностью в 30fps в эмуляторе. Заодно разобрался, как сделать так, чтобы анимированные гифки были с нормальными цветами, а не все в дизере. Для этого надо сначала со всех кадров собрать палитру, затем её в дальнейшем и использовать. В итоге workflow выглядит так: обычным QuickTime'ом делается скринкаст, затем обрабатывается скриптом, делающим из .MOV → .GIF.



Исходники приложения здесь: https://github.com/vlm/ExampleWatchGraph (см. в сторону WatchKit Extension — это именно то, то выполняется на часах).

Проблема с часовым API заключается в том, что там всё через ж всё в Apple-стиле. Например, чтобы нарисовать что-то динамическое на экране, надо 30 раз в секунду:
  1. Создать графический контекст заданного заранее размера. Потому что вычислить размер WKInterfaceImage, в который вставлять будешь получившийся битмап, нельзя. Размер интерфейсного элемента можно задать (set), но не опросить (get).
  2. Нарисовать, что нужно, через CoreGraphics (Quartz 2D) — это лёгкая часть.
  3. Превратить контекст в .PNG, и уже этот .PNG разместить на WKInterfaceImage. См. здесь: https://github.com/vlm/ExampleWatchGraph/blob/master/ExampleWatchGraph%20WatchKit%20Extension/GraphPainter.swift#L117


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

Ну или я что-то не понял.

Pandoc and Manual Pages

Итак, надоело мне рисовать мануальные страницы через nroff. Как в asn1c, например:



Проблемы с подготовкой документации в nroff такие:
Проблемы с nroffCollapse )

Про Крым и медиков

Привет.

Если так-то, у меня родственники в Крыму, в Алуште. Ну, то есть, можно позвонить и провентилировать, если СМИ не доверяешь. Они были рады выйти из Украины, населению же заранее рассказали, чего надо хотеть и как надо думать. Воодушевление какое-то было, как рассказывали.

Час в день дают электричество. В магазинах всё попортилось, холодильников-то нет. Супермаркеты закрылись из-за этого. Туристический сезон свернули, естественно. Хотя какой особый сезон в ноябре. Но, тем не менее.

Кстати о погоде. В Ульяновской области уже несколько учебных заведений начали готовить медработников — медсестёр, медицинских биологов, etc. Есть проблемы с тем, что эти заведения раньше кадрами для федерального НИИ атомных реакторов занимались, ещё какой-то местной спецификой. Учителей готовили, например. Теперь будут медсестёр готовить.

Медсестёр, товарищ. А если это не только в Ульяновской области? Если по всей стране медсестёр начали готовить?

Зачем стране столько медсёстр? Когда и кому они пригодятся, медсёстры эти?

Где найти столько больных? Риторический вопрос, наверное. Потому что в моём твиттере на это не ведутся. Может, потому что знают чего-то. А может, потому что наоборот.