• ↓
  • ↑
  • ⇑
 
Записи с темой: root@глупыйпингвин:~# (список заголовков)
21:51 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Практикум в Хагене меня фрустрирует (и я с некоторой ностальгией вспоминаю практикумы на физфаке, хотя они тоже учили в основном той мысли, что жизнь не мармелад), но есть и светлые моменты. Так, в документации, которую мы лопатим, есть удивительно проникнутые поэзией строчки:

Examples:
right now,
the moment at which a finger is detached in an industrial accident,
the moment at which a child is born,
the moment of death.

@темы: root@глупыйпингвин:~#, эх, дубинушка, ухнем

07:34 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Сонная сортировка (sleep sort) — шуточный алгоритм сортировки. Суть его в следующем: для каждого элемента списка мы запускаем процесс, который спит тем дольше, чем больше элемент, а затем просыпается, печатает этот элемент и завершается.

Примеры:

; Clojure
user> (dorun (pmap (fn [n] (Thread/sleep n) (println n)) [5 3 8 7 1]))
1
3
5
7
8
nil

% Erlang
1> [spawn(fun() -> receive after X -> io:format("~p~n", [X]) end end) || X <- [5, 3, 8, 7, 1]].
1
3
5
7
8
[<0.34.0>,<0.35.0>,<0.36.0>,<0.37.0>,<0.38.0>]

// Javasсript
> [5, 3, 8, 7, 1].forEach(function (n) { setTimeout(function() { console.log(n) }, n) })
undefined
1
3
5
7
8

Ну или можно не печатать, а прямо возвращать отсортированный список, это не принципиально:

; Clojure
(let [a (atom [])] (dorun (pmap (fn [n] (Thread/sleep n) (swap! a conj n)) [5 3 8 7 1])) @a)

% Erlang
[receive X -> X end || _ <- [spawn_link(fun() -> receive after X -> Parent ! X end end) || Parent <- [self()], X <- [5, 3, 8, 7, 1]]].

@темы: root@глупыйпингвин:~#

15:50 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Залогинился в скайп, увидел там статус двух-трёхлетней давности и сменил его на не такой элегантный, зато более современный и эксплицитный. Было:

a = 'a = %r; print a %% a'; print a % a

Стало:

s = 's = {!r}; print(s.format(s))'; print(s.format(s))

@темы: root@глупыйпингвин:~#

22:31 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Переписывать что-то с пайтона 3.4 на пайтон 2.7 — печальное занятие. Мелкие, но злые различия между ними вылезают из самых неожиданных мест. Сколько за эти годы всего поправили — это ж умом не объять. Ну вот, скажем, знали ли вы, что во втором пайтоне попытка красиво напечатать множество, содержащее больше одного числа, хотя бы одно из которых комплексное — это TypeError? Проверьте сами:

>>> from pprint import pprint
>>> pprint({1j, 0})
set([Traceback (most recent call last):
File "", line 1, in
File "pprint.pyc", line 59, in pprint
File "pprint.pyc", line 117, in pprint
File "pprint.pyc", line 199, in _format
File "pprint.pyc", line 82, in _sorted

TypeError: no ordering relation is defined for complex numbers

Насколько я понимаю, версия pprint из 2.7 пытается это множество упорядочить по возрастанию. Она вполне закономерно терпит неудачу: про два комплексных числа нельзя сказать, какое из них больше. Почему же она вообще пытается? Почему никто так долго не замечал, что этот подход приводит к проблемам? Потому что во втором пайтоне можно было упорядочивать хоть список из черта лысого и дьявола морского. Всякие 1 < "a" или {} < [] там не ошибки, а просто тихонько выдают бессмысленный результат. И даже 1j < '' < 2j там не ошибка. И только если напрямую сравнить комплексные числа (скажем, 1j < 2j) или на крайняк комплексное с обычным интом или флоутом, вот тогда это будет ошибкой.

И вот таких мелочей, которые тогда были, а сейчас исправлены, очень много.

@темы: root@глупыйпингвин:~#

09:51 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Как вы думаете, если в консоль Javasсript вбить следующее выражение, что она ответит и почему?

42

Строчка для копирования в консоль, но лучше сначала подумайте: [!+[]<<!![,]]+[]+-[]-~![]<<+![][[]]|[[[]]]

Увы, тот, кто его не знает, вряд ли поймёт, а тот, кто знает — вряд ли удивится.

@темы: root@глупыйпингвин:~#

21:41 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
R умеет вызывать функции, написанные на C. Делает он это аж двумя разными способами. Чтобы первый способ работал, функция должна возвращать SEXP и принимать SEXP. Много вы видели функций, возвращающих и принимающих SEXP? Думаю, только если сами их писали. Для этого этот способ и существует, а не чтобы вызывать всё, что изволится. Чтобы второй способ работал, функция должа возвращать void и принимать указатели. А ещё R будет любой её аргумент перед вызовом копировать, будь это хоть вектор на триста мегабайт — чтобы, значит, злой мутабельный C ничего в этом векторе случайно не запорол. Впрочем, тут есть нюансы, зависящие от версии R.

Пайтоновские ctypes после этого ощущаются как нечто божественно прекрасное и ослепительно сверкающее.

@темы: root@глупыйпингвин:~#

20:01 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь

Вопрос: ?
1. ESC :wq ENTER  12  (41.38%)
2. C-x C-s C-x C-c  17  (58.62%)
Всего: 29

@темы: root@глупыйпингвин:~#

18:46 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Там, где нормальный пролог (например, SICStus) выдаст предупреждение в духе clauses are not together, встроенный пиколисповский pilog ни о чём предупреждать не станет, а просто будет вести себя неожиданным образом. Минимальный пример для пролога:

| ?- ['user'].
% compiling user...
| oyvey(oy).
| x(y).
| oyvey(vey).
* clauses for user:oyvey/1 are not together
|
% compiled user in module user, 0 msec 416 bytes
yes
| ?- oyvey(X).
X = oy ? ;
X = vey ? ;
no

Тот же пример в пиколиспе:

: (be oyvey (oy))
-> oyvey
: (be x (y))
-> x
: (be oyvey (vey)) # старый факт стирается
-> oyvey
: (? (oyvey @X))
@X=vey
-> NIL

Нехорошо. Впрочем, я могу понять, зачем так.

@темы: root@глупыйпингвин:~#

07:45 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
На работе продолжаю проволокой приматывать трепетную лань к коню. Выглядит это так:

Тогда Rinternals.h будет жить с Python.h, и SEXP возляжет рядом с указателем на PyObject, и младенец будет играть над норою Py_Initialize(); и npy_intp будет пастись с R_xlen_t, и PROTECT, и allocVector, и PyMem_Malloc будут вместе, и детеныши их... то есть как это вываливается с ошибкой?!

@темы: root@глупыйпингвин:~#

01:53 

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

@темы: мамонты и кузнечики, root@глупыйпингвин:~#

21:04 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Если посмотреть внимательно на историю Пайтона, можно узнать Шокирующие Факты.

Например, речь о Python 3.0 рутинно велась в PEP'ах уже тогда, когда ещё даже Python 2.2 не вышел.

А, скажем, сотрудничество с numpy — очень давняя штука: так, синтаксис x[::i] был введён в незапамятные времена (1.4) специально для тогдашнего предка numpy, и лишь много лет спустя его начали поддерживать встроенные списки и кортежи.

Надеюсь, эти знания не пригодятся мне на практике. Впрочем, кто знает, не далее как в декабре 2012-го мне пришлось ещё работать с 2.4 — версией стрёмной и бородавчатой; там нельзя было в try-блоке одновременно использовать except и finally, ближайшим аналогом x if p else y было что-нибудь вроде (p and [x] or [y])[0], и это только начало.

@темы: root@глупыйпингвин:~#

07:52 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Когда забираешься внутрь R достаточно глубоко, начинаешь регулярно натыкаться то на «здесь нужна функция, принимающая указатель на массив даблов и возвращающая void», то на макросы с именами CAAR и CADDDR, то на что-то очень характерное с GOTO, отступами в шесть пробелов и пометками на полях. Через какое-то время, видимо, докопаюсь до «Олавюр Нормалдреивинг вырезал этот код в память о своей удаче» и базальтовой стелы с ягуаром-оборотнем.

@темы: root@глупыйпингвин:~#

04:09 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Использовать numpy из R довольно просто, если не бояться C. Игрушечный пример: создаём вектор в R и вызываем на нём метод numpy.ndarray.sort.

читать дальше

@темы: root@глупыйпингвин:~#

21:29 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Загадка про пайтон.

x = [0, 0, 0]
x = x, x, x

x = [0, 0, 0]
x[:] = x, x, x

В чём разница между этими двумя кусками кода? Какой x мы получим в первом случае, какой в другом?

Наводящие вопросы

Ответ

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

for i, in x: i
for [i] in x: i
for [i,] in x: i

Ответ

И ещё загадка.

def f():
   global x
   global g
   global A
   global math
   x = 0
   def g(): pass
   class A: pass
   import math

Все ли четыре global подействуют одинаково?

Ответ

@темы: root@глупыйпингвин:~#

21:18 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
попытка перенести одну хаскеллевскую идиому в другие языки

А теперь серьёзно. Приведённый выше код на Clojure довольно быстро вылетит с ArithmeticException. Но это ладно, это лечится заменой + на +'.
Что до примеров кода на F# и пайтоне, то они относятся к категории «не делайте так никогда». Даже для не очень длинных последовательностей (первые десятки элементов) они вывалятся с System.OutOfMemoryException (или, соответственно, MemoryError).
Не надо так переносить.
запись создана: 31.08.2015 в 12:48

@темы: root@глупыйпингвин:~#

09:56 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Могут ли быть в интерпретаторе пайтона какие-то неожиданные эффекты от одного лишь печатания строчки кода, без попытки её исполнить?

Замечательная IPython QtConsole в процессе печатания даёт пользователю подсказки — например, показывает докстринг и тип вызываемого объекта, ну и ещё некоторые данные запрашивает. Она рассчитывает, что объект их ей сам добровольно скажет. Ну а если нет?

Пусть кто-нибудь, не предупредив нас, определил следующий код (или более заковыристый, потому что жизнь не мармелад):

class M(type):
   def __getattr__(self, name):
      print("Aaaа!")

class N(metaclass = M): pass

И вот мы вбиваем: N(

На энтер, заметим, не жмём.

Консоль по открытой скобочке понимает, что N, похоже, сейчас захотят вызвать, вострит уши, принюхивается...

...Ничем хорошим это, конечно, не кончается.

@темы: root@глупыйпингвин:~#

17:47 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Раздражает, когда графический редактор пытается имитировать кисти, перья, карандаши, аэрографы и даже, о ужас, стирательные резинки.

Перед нами двумерный массив пикселей. Каждый из них может принимать, скажем, 0xFF**3 различных значений без учёта прозрачности. Если мы хотим другую палитру, то к нашим услугам такие-то и такие алгоритмы дитеринга (например, Флойд-Штейнберг). Ещё мы можем работать с несколькими такими массивами одновременно и клепать из них анимированные изображения (с такими-то и такими-то алгоритмами уменьшения размера итогового файла, использующими, например, тот факт, что многие пиксели от кадра к кадру не меняются). А вот вейвлет-разложение. А вот оператор Собеля. А вот скрипты, которыми мы всё это автоматизируем. А вот перед нами уже вообще не растровая графика, а кривые Безье, вводить их опорные точки можно таким-то и таким-то способом, вот у нас объединение, пересечение, разность и симметрическая разность двух контуров, а вот клотоиды...

Какой, к стержням графитовым, карандаш в таком месте? Какое, к чертям чернильным, перо?!

@темы: root@глупыйпингвин:~#

13:28 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Вот это порождение нечестивого хаоса — синтактически корректный пайтон:

ы . ы , ы [
:,::...,:...,:...:
...,...:,...::...,
...:...,...:...:...
] . ы , ы ,

пояснения и не очень практичный пример

@темы: root@глупыйпингвин:~#

15:46 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Старенький агрегат пережил уже второй ноут и снова меня спасает в трудную минуту.

Довольно странно смотреть на срез своей жизни, законсервированный два года назад.

@темы: root@глупыйпингвин:~#

13:25 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Ещё из рубрики.

В пайтоне, как известно, есть замыкания:

читать дальше

Свободные переменные, которые теперь по уму должны быть видны только самой функции, всё равно можно посмотреть, хоть это и неудобно:

читать дальше

А ещё их можно изменять (посредством чОрной, чОрной магии):

читать дальше

А, например, в R та же магия куда менее черна, и попытка использовать что-то такое в реальном коде уже не обязательно относится к «ни в коем случае»:

читать дальше

@темы: root@глупыйпингвин:~#

Эх, разум, да ещё разум

главная