• ↓
  • ↑
  • ⇑
 
14:28 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Или вот ещё раздражающие мелочи. Например, модуль json. Он всем хорош, но в 2.7 и 3.4 ведёт себя слегка по-разному. Я не видел, чтобы документация об этом говорила. Может, где-то об этом есть. Но я не видел. Когда именно поведение изменилось — ведает один Миктлантекутли. Рассмотрим бесполезный пример (не делайте так всерьёз):

class Frequency(int):
   def __str__(self):
      return int.__str__(self) + " Hz"

json.dumps(Frequency(42))

Во втором это '42 Hz' (с понятными последствиями при попытке раскодировать обратно). В третьем это '42'.

Кто-то ожидал бы TypeError: <__main__.Frequency object at 0x7f66d0c07ef0> is not JSON serializable, как было бы, если бы Frequency не наследовал от int. Увы ему.

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

13:14 

из старого

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
«настойка на берёзовых и можжевеловых кашалотиках»

10:31 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Неінтуїтивний факт з американської історії: коли Новий Амстердам вже було перейменовано на Нью-Йорк, а в місті Квебек вже жило півтисячі людей в сімдесяти будинках, на острові посеред озера Петен-Іца (наголос: Пете́н-Іца́) все ще стояв Нохпетен, також відомий як Тайясаль — живе місто майя, столиця королівства народу іца.

Тільки через тридцять три роки іспанці завоюють його і перейменують на Нуестра Сеньора де лос Ремедіос і Сан Пабло, Лагуна де Іца. Нуестра Сеньора де лос Ремедіос і Сан Пабло, Лагуна де Іца, Карле!

Зараз це місто зветься Флорес. Іца досі існують, їх близько двох тисяч. Їхня мова майже зникла і рідна лише для трьох із половиною стареньких анонімусів.

06:34 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
«Обед по восточноазиатским мотивам: на первое хуйцаа, на второе уже намуль, а на десерт вообще доухуа».

* * *


Пихта великая, пихта замечательная, пихта великолепная, пихта миловидная
— Пихта хорошая, пихта умная, пихта молодец
— Пихта всё знает и умеет, у пихты всё получится

16:56 

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

06:56 

Bärenhüter

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Вы все Волопасы, а я Эридан.

@темы: космически прах

23:09 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Или вот, например, Julia. Там решили пойти своим путём: если у нас есть юникодная строка из четырёх символов, нет никаких гарантий, что они будут пронумерованы именно как «первый, второй, третий, четвёртый». В этом решении есть своя мудрость (символы ведь занимают разное количество байт), но при первой встрече ему сложно не удивиться:

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

А есть литералы для массивов байтов. Они вдохновлялись пайтоновскими, но сделаны с учётом местного колорита. В третьем пайтоне bytes — отдельный тип, отличающийся и от bytearray, и от array.array, и от numpy.ndarray, исторически родственный строке, но очень этого стесняющийся и от смущения кидающий ошибки, если ему об этом родстве напомнить. В жюлии это просто ещё одна запись для уже существующего типа:

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

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

00:19 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Как по-испански чупакабра? Вовсе не *la chupacabra, как можно подумать, но el chupacabras (дословно — «сосёткоз»). Это не множественное число: слово образовано по той же модели, что и el salvavidas («спасаетжизни», спасательный круг), el matamoscas («убиваетмух», мухобойка) или, скажем, Santiago Matamoros («убиваетмавров», Иаков-Мавробойца), el chotacabras («доиткоз», козодой), el engañapastores («обманываетпастухов», другое название козодоя), el atajacamino («перекрываетдорогу»? «срезаетдорогу»? не уверен. Это ещё одно название козодоя, и на этом его имена не кончаются).

В следующих выпусках: шлагбаум по-немецки не шлагбаум, а штангенциркуль не штангенциркуль.

@темы: превед, языковед

23:52 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Слово hemidemisemiquaver. Если вы думаете, что оно странное — по польски оно sześćdziesięcioczwórka.

23:36 

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

Но когда используешь версию шестилетней давности и одновременно с ней новую, и отличаются они в мелочах, и мелочей этих очень много, и исправлению некоторых из них ты в своё время очень обрадовался и счастливо забыл, как оно было раньше — вот тогда не раздражаться сложно.

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

14:47 

Brötchen mit Käse

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

Вот, скажем, обычное третьепайтоновское 'Brötchen mit {}'.format('Käse'), которое возвращает 'Brötchen mit Käse'. Что ему соответствует во втором? А во втором было два типа строк и, соответственно, четыре комбинации, и все делают не совсем то:

u'Brötchen mit {}'.format('Käse') кинет UnicodeDecodeError.
'Brötchen mit {}'.format(u'Käse') кинет UnicodeEncodeError.
'Brötchen mit {}'.format('Käse') вернёт 'Br\xc3\xb6tchen mit K\xc3\xa4se'.
u'Brötchen mit {}'.format(u'Käse') вернёт u'Br\xf6tchen mit K\xe4se'.

(если последние две строки напечатать при помощи print, выглядят они одинаково, Brötchen mit Käse. Это чтобы люди легче путались. Вести себя они, однако, будут по-разному)

Оператор % ведёт себя в этом плане похоже на .format, но всё же чуть иначе: 'Brötchen mit %s' % u'Käse' кинет не UnicodeEncodeError, но UnicodeDecodeError.

Всё это я заметил благодаря Флориану, который держит рабочие файлы в каталоге по имени Arbeitsfläche.

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

22:13 

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

17:34 

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

12:11 

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

URL
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@глупыйпингвин:~#, эх, дубинушка, ухнем

16:40 

Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
Я є здоров і менї веде ся добре.
На сїй картцї не вільно нїчо більш повідомляти.

(@@@)

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@глупыйпингвин:~#

18:42 

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

@темы: по всей Германии wetter

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@глупыйпингвин:~#

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

главная