|
|
|
послезавтра возвращаюсь в Киев. Почти три месяца находился под боком (3 мили) от Майкрософтовского офиса (редмонд) и ни разу не съездил на него посмотреть или, чтобы сфоткаться на фоне него.
Майкрософт уже не тот. :)
|
|
Comments: Add Your Own.
|
|
Sunday, February 19th, 2012
|
|
Saturday, February 18th, 2012
|
|
|
Оказывается, если в eclipse проинсталировать pdev плагин, то кроме питоновской консоли доступна полноценная отладка: точки останова, пошаговое управление, инспекция переменных на любом уровне...
Век живи, век учись.
|
|
Comments: Add Your Own.
|
|
Wednesday, December 14th, 2011
|
|
|
Меньше код не всегда лучше. Помню в детстве у меня тоже была бабушка мы тоже придумывали себе задачки кто найдет лучшее решение (напишет программу). Мы тоже старались написать меньшую программу, в том смысле что она должна воплощать более экономную идею (без лишних "сущностей"). Это значило найти лучший алгоритм. Еще неплохо было бы если он еще легко угадывался в тексте программы. Чтобы посмотрели и сказали: "елки палки, как я раньше не додумался до этой идеи".
А что сейчас: алгоритмы ушли на второй план и народ кинулся соревноваться чья программа содержит больше информации в n буквах. Превращая программу в трудно читаемый текст, имеющий, что-то общее с результатом работы программы-упаковщика. И уже никто не скажет "как я раньше не додумался до этой идеи". Потому что идею уже не видно. А виден какой-то мусор на экране.
|
|
Comments: Read 1 or Add Your Own.
|
|
Sunday, December 11th, 2011
|
|
Friday, December 9th, 2011
|
|
|
Тех самых трамваях, которые могут вас задавить:
"...мысль свою Беликов старался запрятать в футляр. Для него были ясны только циркуляры и газетные статьи, в которых запрещалось что-нибудь. Когда в циркуляре запрещалось ученикам выходить на улицу после девяти часов вечера или в какой-нибудь статье запрещалась плотская любовь, то это было для него ясно, определённо; запрещено — и баста. В разрешении же и позволении скрывался для него всегда элемент сомнительный, что-то недосказанное и смутное. Когда в городе разрешали драматический кружок, или читальню, или чайную, то он покачивал головой и говорил тихо: — Оно, конечно, так-то так, всё это прекрасно, да как бы чего не вышло." -- человек в футляре
Никогда не читал человека в футляре. Кажется пришло время.
|
|
Comments: Read 1 or Add Your Own.
|
|
Thursday, December 8th, 2011
|
|
|
|
Соболезную россиянам в связи с прошедшими "выборами"
|
|
Comments: Add Your Own.
|
|
Friday, December 2nd, 2011
|
|
|
Монетка бросается 10000 раз. Какова вероятность что количество выпаданий "орла" будет в диапазоне от a до b включительно. Раньше эту задачу я бы решал с помощью треугольника Паскаля. Но оказывается тот подход с волной, что расписан в предыдущем посте прекрасно ложится и на эту задачу, (будучи более универсальным средством, чем треугольник паскаля). Но сначала приведем эту задачу к эквивалентной: фишка стартует с позиции [0 0] и на каждым шаге с равной вероятностью остается либо на месте либо перемещается на одну позицию вдоль x: (из [x y] в [(+ 1 x) y]). То есть, если на шаге n-1 вероятность обнаружить фишку в позиции [x y] равна (p [x y]) для любого x и y, то на следующем шаге мы получаем вероятность для [x y] следующую: 0.5 * (p [x y]) + 0.5 * (p [(- x 1) y]).
Тоже самое делает spread-all функция из предыдущего поста, если в качестве spread функции взять следующую:
(defn spread-to-forward [m loc]
(let [[x y] loc
v (* 0.5 (m loc))]
{[x y] v [(+ x 1) y] v}))
Эта функция делит поровну значение заданной ячейки между собой и соседней клеткой спереди по x. Все эти контрибуции и складываются в spread-all.
Прежде чем идти дальше отмечу, что spread-all зависит от spread функции, а не от spread-to-forward, поэтому первое что сделаем, это параметризуем spread-all функцией spread-f. И второе усовершенствование будет касаться убирания слишком маленьких значений, чтобы наша волна (или "облако", если угодно) не сильно разрасталась:
(def epsilon 1E-10)
(defn spread-all [spread-f m]
(let [m1 (apply (partial merge-with +)
(map #(spread-f m %) (keys m)))]
(select-keys m1 (for [[k v] m1 :when (> v epsilon)] k))))
Теперь осталось создать "волну" для нашей монеты:
(defn mk-wave [spread-f]
(fn [m]
(iterate #(spread-all spread-f %) m)))
(def coin-wave (mk-wave spread-to-forward))
стартуя с состояния {[0 0] 1} наша волна начнет разрастаться и каждый шаг будет порождать новое распределение вероятности. Для десяти тысячи бросков это распределение можно получить в выражении: (nth (coin-wave {[0 0] 1}) 10000)
В этом распределении нас будет интересовать только ячейки в диапазоне от [a 0] до [b 0], а вернее сумма этих ячеек:
(defn x-in-range? [a b [x y]]
(and (= y 0) (>= x a) (<= x b)))
(defn solve [a b n]
(let [p (nth (coin-wave {[0 0] 1}) n)]
(apply + (for [[loc v] p :when (x-in-range? a b loc)] v))))
Делаем подсчеты:
=> (time (solve 0 10000 10000)) "Elapsed time: 11930.706618 msecs" 0.9999992236118189
=> (time (solve 4900 5100 10000)) "Elapsed time: 11950.532606 msecs" 0.955574108777632
Итого: 95% вероятности сосредоточено в диапазоне 5000-+100
Первый результат позволяет оценить какая суммарная величина была отброшена в ходе сокращения "облака" (1-0.9999992236118189)
|
|
Comments: Read 3 or Add Your Own.
|
|
Monday, November 28th, 2011
|
|
|
Долго придумывал себе задачку чтобы потренироваться новому языку clojure и, наконец, придумал:
есть клетка (ячейка) с координатами [0 0] и значением 1. Есть правило, одинаковое для всех непустых клеток: свое значение они поровну распределяют между соседними клетками (слева, справа, сверху/снизу). Например, для начальной клетки, как описано выше, второй шаг закончится тем что она станет пустой (nil), а четыре соседа обретут значение 1/4. Поскольку правило повторяется для всех непустых клеток, непустых клеток становиться с каждым шагом все больше. В задачке спрашивается, как будет меняться со временем значение ячейки [0 0].
Самое сложное было это решить как суммировать микроволны от каждой непустой ячейки. Но, к счастью, в clojure есть замечательная функция merge-with, которая успешно справляется с объединением map'ов при этом выполняя "cуммирующую" функцию, какую захотим.
Ниже текст кода: генерирующий волну (бесконечную серию map'ов):
;----------------------------------------------- ; spread - правило распределения значения ячейки loc из m (микроволна). Возвращает map (defn spread [m loc] (let [[x y] loc v (* 1/4 (m loc))] {[(+ x 1) y] v [(- x 1) y] v [x (+ y 1)] v [x (- y 1)] v}))
; spread-all - суммирует все микроволны от непустых ячеек в m (defn spread-all [m] (apply (partial merge-with +) (map #(spread m %) (keys m))))
; wave - это бесконечная серия map (defn wave [m] (iterate spread-all m)) ;-----------------------------------------
Теперь мы можем спросить как будет меняться ячейка [0 0] первые 16-ть шагов:
(take 16 (map #(get % [0 0]) (wave {[0 0] 1}))) ; --> (1 nil 1/4 nil 9/64 nil 25/256 nil 1225/16384 nil 3969/65536 nil 53361/1048576 nil 184041/4194304 nil)
Стоит заметить, что ячейка не так быстро затухает как фронт волны. Видимо 50% значения расплывается не так шустро как 100%.
|
|
Comments: Add Your Own.
|
|
Sunday, November 20th, 2011
|
|
|
После чтения Роджера Пенроуза захотелось немного отвлечься от сложных парадоксов квантовой физики. Решил поизучать язык Clojure. Язык динамический, поэтому в нем можно писать такие формы как (if cond 1 true). C точки зрения статического языка, вопрос о типе этого выражения не имеет смысла в compile time. Зато в run-time выражение имеет вполне конкретный тип в зависимости от значения cond. О типе можно узнать набрав (type (if cond 1 true)). А что если расширить систему типов чтобы выражение имело смысл и для статического языка. В этом случае получится что выражение имеет тип (Либо Integer Bool).
И тут меня осенило: все эти вопросы имеют какие то аналогии с тем что я прочитал у Пенроуза про квантовую физику: Тип "Либо" напоминает суперпозицию квантовых состояний. А переход от статического языка к динамическому напоминает редукцию волновой функции.
Жесть. Вот что бывает когда перепрыгиваешь резко с одной темы на другую.
|
|
Comments: Read 1 or Add Your Own.
|
|
Sunday, November 6th, 2011
|
|
|
Если сравнивать то как устроен мозг и общество ловлю себя на мысли как было бы абсурдно если бы мозг работал как общество. В этом случае вырисовывается нелепейшая картина: Представим себе выборы президента мозга: нейроны скажем каждые пять лет выбирают себе президента (нейрон). Который будет определять в ближайшие пять лет внешнюю политику мозга. Абсурднее устройство мозга сложнее придумать.
|
|
Comments: Add Your Own.
|
|
Tuesday, October 11th, 2011
|
|
|
Кто-то жалуется, что такая-то программа на телефоне много жрет батареи, или что хуже, жрет ее даже, когда телефоном не пользуются. А вот у меня противоположная ситуация, наша программа пересыпает. И на sleep(30) спит не 30 секунд, а 2.5 минуты. Потому что если не захватить явно лок спячки, телефон уйдет в спячку и отключит проц. Лишь когда кто-то другой кратковременно разбудит, у программы есть шанс проснуться окончательно и поделать свои дела.
|
|
Comments: Add Your Own.
|
|
|
Как я понял, в С++11 поддержка тредов все еще не дотягивает до уровня поддержки их в ява. В частности где executor framework?
"Further high-level threading facilities such as thread pools have been remanded to a future C++ technical report. They will not be a part of C++11"
|
|
Comments: Add Your Own.
|
|
Sunday, October 2nd, 2011
|
|
|
Начал копать в сторону java reflection и откопал многообещающую технику:
"...strongly typed delegates allow us to add ActionListener(s) without the need for anonymous classes". -- http://weblogs.java.net/blog/alexwinston/archive/2005/04/strongly_types_1.html
Наверное подобную технику можно использовать чтобы любой метод превратить в функцию
UPDATE: ссылка ближе к теме лямбд: http://www.javalobby.org/java/forums/t75427.html
|
|
Comments: Add Your Own.
|
|
|
Наконец-то нашел юзабельный метод filter. Он входит в состав библиотеки functional java (http://code.google.com/p/functionaljava/).
Богатые возможности библиотеки строить функции позволяют не опускаться до уровня создания анонимных классов:
// пример кода import static fj.data.Stream.stream; import static fj.pre.Show.intShow; import static fj.pre.Show.streamShow; import static fj.pre.Show.listShow; import static fj.pre.Ord.intOrd; import static fj.data.List.list;
import fj.data.List; import fj.data.Stream;
public final class FjTest {
public static void main(String[] args) { Stream<Integer> result = stream(1,2,3,4,5,6).filter(intOrd.isLessThan(4)); List<Integer> result2 = list(1,2,3,4,5,6).filter(intOrd.isGreaterThan(4));
streamShow(intShow).println(result); listShow(intShow).println(result2); }
}
|
|
Comments: Read 6 or Add Your Own.
|
|
Wednesday, September 28th, 2011
|
|
|
Сегодня читал две книги. В одной рассказывается от том как круто писать в терминах функций и их применений. И что это сокращает все многообразие всяких callback интерфейсов в JDK. Другая посвящена coding style. В частности в ней есть такое досадное замечание: "Many developers will make the mistake of creating generic terms for concepts when perfectly good terms already exist in the industry/domain."
В общем эти книги никак не удается подружить между собой. Нетрудно догадаться что первая книга посвящена функциональному программированию на java.
|
|
Comments: Add Your Own.
|
|
Monday, September 26th, 2011
|
|
|
E-FRP это попытка взять часть FRP (даже часть RT-FRP) и сделать ее пригодной для компиляции для микроконтроллеров. Вот только синтаксис какой-то слишком облегченный. Пытаюсь выразить это подмножество средствами хаскель но получается что-то совсем непохожее на E-FRP даже по части семантики.
Вот как можно на хаскель построить такую конструкцию:
s = init x = 0 in { Timer0 => 0 leter, Stripe => x + 1 }
сложность тут в том что в обработчике может встречаться как связанная переменная (snapshot), так и свободная переменная (behavior)
|
|
Comments: Add Your Own.
|
|
Wednesday, September 21st, 2011
|
|
|
спустя три года впервые решил запустить ghci и немного вспомнить haskell. Как результат битый час искал ошибку в одной строчке. Оказалось, я попутал и вместо >>= написал >= А потом долго гадал чем отличается выведенный тип от ожидаемого, и почему при выведении типа не учитывается ожидаемый.
|
|
Comments: Add Your Own.
|
|
|