You are viewing [info]rvp74's journal

LiveJournal for rvp74.

View:User Info.
View:Friends.
View:Calendar.
View:Memories.
You're looking at the latest 20 entries. Missed some entries? Then simply jump back 20 entries.

Saturday, May 26th, 2012

Subject:дорожное
Time:1:09 pm.
послезавтра возвращаюсь в Киев.
Почти три месяца находился под боком (3 мили) от Майкрософтовского офиса (редмонд) и ни разу не съездил на него посмотреть или, чтобы сфоткаться на фоне него.

Майкрософт уже не тот. :) 
Comments: Add Your Own.

Sunday, February 19th, 2012

Subject:programming add-on for Blender 2.5
Time:2:18 pm.
Отличная книга: http://airplanes3d.net/pydev-000_e.xml

Расскажет как настроить eclipse, чтобы работал autocompletion для blender python api, и как отлаживать блендеровские скрипты прямо в эклипсе.
Comments: Add Your Own.

Saturday, February 18th, 2012

Subject:pdev & debug
Time:9:30 pm.
Оказывается, если в eclipse проинсталировать pdev плагин, то кроме питоновской консоли доступна полноценная отладка: точки останова, пошаговое управление, инспекция переменных на любом уровне...

Век живи, век учись.
Comments: Add Your Own.

Wednesday, December 14th, 2011

Subject:соревнование: у кого энтропия больше
Time:8:38 pm.
Меньше код не всегда лучше.
Помню в детстве  у меня тоже была бабушка мы тоже придумывали себе задачки кто найдет лучшее решение (напишет программу). Мы тоже старались написать меньшую программу, в том смысле что она должна воплощать более экономную идею (без лишних "сущностей"). Это значило найти лучший алгоритм. Еще неплохо было бы если он еще легко угадывался в тексте программы. Чтобы посмотрели и сказали: "елки палки, как я раньше не додумался до этой идеи".

А что сейчас: алгоритмы ушли на второй план и народ кинулся соревноваться чья программа содержит больше информации  
в n буквах. Превращая программу в трудно читаемый текст, имеющий, что-то общее с результатом работы программы-упаковщика. И уже никто не скажет "как я раньше не додумался до этой идеи". Потому что идею уже не видно. А виден какой-то мусор на экране. 
Comments: Read 1 or Add Your Own.

Sunday, December 11th, 2011

Subject:от clojure к incanter
Time:5:48 pm.
Кажется созрел скачать инструмент для компьютерной статистики:

Incanter is a Clojure-based, R-like statistical computing and graphics environment for the JVM. At the core of Incanter are the Parallel Colt numerics library, a multithreaded version of Colt, and the JFreeChart charting library, as well as several other Java and Clojure libraries.

Там тоже любят анализировать выборы:

Bayesian inference of multinomial distribution parameters
Comments: Add Your Own.

Subject:гистограммы в контексте фальсификаций добрались до СМИ
Time:12:38 am.
http://www.gazeta.ru/science/2011/12/10_a_3922390.shtml

Забавное совпадение, там и про подбрасывание монеты рассказали. :)
Comments: Add Your Own.

Friday, December 9th, 2011

Subject:к слову о "трамваях"
Time:3:09 pm.
Тех самых трамваях, которые могут вас задавить:

"...мысль свою Беликов старался запрятать в футляр. Для него были ясны только циркуляры и газетные статьи, в которых запрещалось что-нибудь. Когда в циркуляре запрещалось ученикам выходить на улицу после девяти часов вечера или в какой-нибудь статье запрещалась плотская любовь, то это было для него ясно, определённо; запрещено — и баста. В разрешении же и позволении скрывался для него всегда элемент сомнительный, что-то недосказанное и смутное. Когда в городе разрешали драматический кружок, или читальню, или чайную, то он покачивал головой и говорил тихо:
— Оно, конечно, так-то так, всё это прекрасно, да как бы чего не вышло." -- человек в футляре

Никогда не читал человека в футляре. Кажется пришло время.
Comments: Read 1 or Add Your Own.

Thursday, December 8th, 2011

Subject:632305222316434
Time:12:53 am.
Соболезную россиянам в связи с прошедшими "выборами"
Comments: Add Your Own.

Friday, December 2nd, 2011

Subject:задачка про подбрасывание монетки
Time:8:50 pm.
Монетка бросается 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

Subject:волна в функциональном стиле
Time:1:35 pm.
Долго придумывал себе задачку чтобы потренироваться новому языку 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

Subject:от Пенроуза к Сlojure
Time:10:23 pm.
После чтения Роджера Пенроуза захотелось немного отвлечься от сложных парадоксов квантовой физики.
Решил поизучать язык 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

Subject:нелепая мысль о мозге.
Time:11:18 pm.
Если сравнивать то как устроен мозг и общество ловлю себя на мысли как было бы абсурдно если бы мозг работал как общество.
В этом случае вырисовывается нелепейшая картина:
Представим себе выборы президента мозга: нейроны скажем каждые пять лет выбирают себе президента (нейрон). Который будет определять в ближайшие пять лет внешнюю политику мозга. Абсурднее устройство мозга сложнее придумать. 

Comments: Add Your Own.

Tuesday, October 11th, 2011

Subject:android - недосып/пересып
Time:9:37 pm.
Кто-то жалуется, что такая-то программа на телефоне много жрет батареи, или что хуже, жрет ее даже, когда телефоном не пользуются.
А вот у меня противоположная ситуация, наша программа пересыпает. И на sleep(30) спит не 30 секунд, а 2.5 минуты.
Потому что если не захватить явно лок спячки, телефон уйдет в спячку и отключит проц. Лишь когда кто-то другой кратковременно разбудит, у программы есть шанс проснуться окончательно и поделать свои дела.
Comments: Add Your Own.

Subject:C++11 и threads
Time:7:04 pm.
Как я понял, в С++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

Subject:strongly typed delegates
Time:11:22 pm.
Начал копать в сторону 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.

Subject:вменяемый метод filter для Java
Time:7:42 pm.
Наконец-то нашел юзабельный метод 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.

Subject:IO монада в java
Time:3:52 pm.
Внезапно:
https://github.com/functionaljava/functionaljava/blob/master/core/src/main/java/fj/data/IO.java
Comments: Add Your Own.

Wednesday, September 28th, 2011

Subject:generic vs domain specific
Time:12:43 am.
Сегодня читал две книги.
В одной рассказывается от том как круто писать в терминах функций и их применений. И что это сокращает все многообразие всяких 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

Subject:E-FRP на хаскел
Time:11:47 am.
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

Subject:haskell again
Time:10:59 am.
спустя три года впервые решил запустить ghci и немного вспомнить haskell.
Как результат битый час искал ошибку в одной строчке. Оказалось, я попутал и вместо >>= написал >=
А потом долго гадал чем отличается выведенный тип от ожидаемого, и почему при выведении типа не учитывается ожидаемый.
Comments: Add Your Own.

LiveJournal for rvp74.

View:User Info.
View:Friends.
View:Calendar.
View:Memories.
You're looking at the latest 20 entries. Missed some entries? Then simply jump back 20 entries.