![:)](http://static.diary.ru/picture/3.gif)
понедельник, 31 декабря 2012
...новым 1937 годом ![:)](http://static.diary.ru/picture/3.gif)
![:)](http://static.diary.ru/picture/3.gif)
воскресенье, 30 декабря 2012
В Delphi можно написать:
Похожий приём работает с классами, только чуть иначе.
Но что, если мы напишем так?
type HexString = string;
Так мы отметим специальный тип строк, который хранит в себе hex. Но для компилятора они ничем не отличаются от обычных. Вот это скомпилируется нормально:var a: HexString;
b: string;
begin
a := b;
end;
Что, если мы не хотим разрешать такое копирование? (А обычно мы должны не хотеть! Разные по смыслу вещи нельзя присваивать, это опасно). Компилятор можно попросить создать "независимый тип":type HexString = type string;
Теперь строку типа HexString нельзя присвоить строке типа string, и наоборот.Похожий приём работает с классами, только чуть иначе.
type
HexStringList = TStringList; //можно присваивать HexStringList -> StringList и обратно!
HexStringList = class(TStringList); //можно присваивать только HexStringList -> StringList, но не обратно!
Классы, в отличие от простых типов, поддерживают наследование. Более "частный" класс можно положить в переменную более общего, но не наоборот. Если мы объявляем тип без "class
", то мы просто создаём для него другое имя: оба типа на самом деле одно и то же. А с помощью "class(TStringList)
" мы говорим компилятору "HexStringList - это частный случай StringList, он от него наследует".Но что, если мы напишем так?
type HexStringList = type TStringList;
Или так?type HexStringList = type class(TStringList);
Ответы на это в следующий раз!
четверг, 27 декабря 2012
Опять программирование. Когда пишешь одну функцию, часто подмывает заодно написать с десяток - и обратное преобразование, и с параметром, и Анси-версию, чтоб уж сразу была библиотечка всего такого на потом. Программисты обожают библиотечки. У каждого программиста своя работа со строками и своё буферизованное чтение в запасах.
Но понемногу я пришёл к выводу, что это вредно.
Даже не тем, что тратится лишнее время. Функции могут однажды пригодиться, и потом, это мелочи, тут нечто гораздо более страшное.
Написав ненужный код, вы его не тестируете. Его не на чем тестировать: в текущем проекте он нигде не используется, ведь если бы он использовался, то это был бы нужный код! И если вы серьёзно хотите, чтобы я поверил, что вы оторвётесь от работы над проектом и напишете юнит-тест для каждой функции, которые вам сейчас толком и не нужны, то тренируйтесь врать. Я - точно не напишу. Мне лень.
В результате получается код, который написан, лежит вперемешку с правильным, похож на правильный, но содержит ошибки.
Возможно, вы узнаете об этом через год, отлаживая загадочные баги в новой программе, использующей старую, давно проверенную библиотеку. Наткнётесь на ошибку в коде функции, удивитесь: "Да как оно вообще работало?" А оно и не работало.
Даже если вы не тестируете новые функции специально, нужные функции сами собой проверяются в ходе работы программы. Пусть это не полноценное тестирование, но большинство путей кода всё-таки оказываются покрыты. Дополнительные же функции не вызывались ни разу, поэтому баг может быть где угодно, даже на самом виду.
Но мало того, когда вы захотите исправить ошибку, вам вдруг станет страшно. Вы подумаете: "А что, если?.."
Что, если эта функция кем-то используется? Ведь неспроста она оказалась в библиотеке. Никто не будет писать функции просто так. Значит, какой-то из проектов вызывает эту функцию и притом работает.
Если вы её сейчас исправите - не сломается ли он?
Да, у вас тут индексация с нуля, а не с единицы, как сказано в комментарии. Вызывая функцию правильно, получить хороший результат невозможно. Значит, кто-то вызывает её неправильно, по ошибке передаёт как раз нужный ошибочный индекс. Если вы функцию почините, тот проект сломается.
Неизвестно, какой. Неизвестно, когда и где. Но что сломается - это почти наверняка.
Нет такого программиста, которому нравилось бы наугад портить свои проекты. И вы откатываете правки и оставляете функцию сломанной, а рядом пишете новую, functionName2(). На этот раз правильную.
И заодно ещё что-нибудь.
Но понемногу я пришёл к выводу, что это вредно.
Даже не тем, что тратится лишнее время. Функции могут однажды пригодиться, и потом, это мелочи, тут нечто гораздо более страшное.
Написав ненужный код, вы его не тестируете. Его не на чем тестировать: в текущем проекте он нигде не используется, ведь если бы он использовался, то это был бы нужный код! И если вы серьёзно хотите, чтобы я поверил, что вы оторвётесь от работы над проектом и напишете юнит-тест для каждой функции, которые вам сейчас толком и не нужны, то тренируйтесь врать. Я - точно не напишу. Мне лень.
В результате получается код, который написан, лежит вперемешку с правильным, похож на правильный, но содержит ошибки.
Возможно, вы узнаете об этом через год, отлаживая загадочные баги в новой программе, использующей старую, давно проверенную библиотеку. Наткнётесь на ошибку в коде функции, удивитесь: "Да как оно вообще работало?" А оно и не работало.
Даже если вы не тестируете новые функции специально, нужные функции сами собой проверяются в ходе работы программы. Пусть это не полноценное тестирование, но большинство путей кода всё-таки оказываются покрыты. Дополнительные же функции не вызывались ни разу, поэтому баг может быть где угодно, даже на самом виду.
Но мало того, когда вы захотите исправить ошибку, вам вдруг станет страшно. Вы подумаете: "А что, если?.."
Что, если эта функция кем-то используется? Ведь неспроста она оказалась в библиотеке. Никто не будет писать функции просто так. Значит, какой-то из проектов вызывает эту функцию и притом работает.
Если вы её сейчас исправите - не сломается ли он?
Да, у вас тут индексация с нуля, а не с единицы, как сказано в комментарии. Вызывая функцию правильно, получить хороший результат невозможно. Значит, кто-то вызывает её неправильно, по ошибке передаёт как раз нужный ошибочный индекс. Если вы функцию почините, тот проект сломается.
Неизвестно, какой. Неизвестно, когда и где. Но что сломается - это почти наверняка.
Нет такого программиста, которому нравилось бы наугад портить свои проекты. И вы откатываете правки и оставляете функцию сломанной, а рядом пишете новую, functionName2(). На этот раз правильную.
И заодно ещё что-нибудь.
понедельник, 24 декабря 2012
Рискуя всех разозлить, скажу, что сериал скучный. Очередной бултых про взросление вообще, с моралью, что детство - это драгоценные воспоминания, которые проносишь через всю жизнь.
Разумеется, герои сами в эту сторону идти не хотят (а кто захочет?!), так что автор загоняет их пинками. А ну отказались от детских фантазий! Со скорбными лицами! Приняли решение повзрослеть! Совершили ошибку! Мучайте себя, мучайте!
Если считать, что написание книги - это доказательство тезиса примером, то автор успешно доказал свой: что свежих идей у него нет. Все эти разбивающиеся о трезвость жизни волшебные фантазии, эти рассыпающиеся от бессилия спеллы Декомори, это радостное "магия в нашем сердце" в конце, это всё НА-ДО-Е-ЛО.
Не знаю, какой там Шуклин в этом видит "всплеск".
Магии в проруби?
Про тююнибё в этом сериале было только пятнадцать секунд вступления.
- Знакомо ли вам слово "тююнибё", господа? Да-да: та самая ужасная и удивительная болезнь, что поражает молодёжь примерно к восьмому классу средней школы - когда проснувшееся вдруг сознание своей индивидуальности вкупе с неистово пылающим воображением заставляют школьников вести себя - ну вы знаете, как. В жизни не читавший ничего, кроме манги, школьник признаёт теперь только английские оригиналы книг. А другой из принципа пьёт только кофе без молока, хотя на вкус одно от другого не отличит. Третий считает, что у него магические способности, и целыми днями только о своих фантазиях и говорит. Ну вот и наш герой...
...увы, не имеет ко всему этому никакого отношения.
КОНЕЦ.
Разумеется, герои сами в эту сторону идти не хотят (а кто захочет?!), так что автор загоняет их пинками. А ну отказались от детских фантазий! Со скорбными лицами! Приняли решение повзрослеть! Совершили ошибку! Мучайте себя, мучайте!
Если считать, что написание книги - это доказательство тезиса примером, то автор успешно доказал свой: что свежих идей у него нет. Все эти разбивающиеся о трезвость жизни волшебные фантазии, эти рассыпающиеся от бессилия спеллы Декомори, это радостное "магия в нашем сердце" в конце, это всё НА-ДО-Е-ЛО.
Не знаю, какой там Шуклин в этом видит "всплеск".
Магии в проруби?
Про тююнибё в этом сериале было только пятнадцать секунд вступления.
- Знакомо ли вам слово "тююнибё", господа? Да-да: та самая ужасная и удивительная болезнь, что поражает молодёжь примерно к восьмому классу средней школы - когда проснувшееся вдруг сознание своей индивидуальности вкупе с неистово пылающим воображением заставляют школьников вести себя - ну вы знаете, как. В жизни не читавший ничего, кроме манги, школьник признаёт теперь только английские оригиналы книг. А другой из принципа пьёт только кофе без молока, хотя на вкус одно от другого не отличит. Третий считает, что у него магические способности, и целыми днями только о своих фантазиях и говорит. Ну вот и наш герой...
...увы, не имеет ко всему этому никакого отношения.
КОНЕЦ.
вторник, 18 декабря 2012
Wakan 1.80.8 переводит 1 мегабайт текста за 4 секунды!
Стабильная версия, 1.67, на него же тратила 26.5 минут.
Ещё он понимает Аозора-Руби. Можно вставлять текст в таком: 大人《おとな》びた雰囲気 - формате, и вот эти скобочки превратятся в подпись над 大人. А ещё Вакан может сохранять свой собственный автоматический перевод в виде руби! Это значит, что можно загрузить книжку, нажать "Auto-Translate", и Вакан расставит чтение всем тем словам, которые вы ещё не выучили. И эту книжку потом можно читать в любой из тысяч поддерживающих руби читалок, и слова будут подписаны!
Стабильная версия, 1.67, на него же тратила 26.5 минут.
Ещё он понимает Аозора-Руби. Можно вставлять текст в таком: 大人《おとな》びた雰囲気 - формате, и вот эти скобочки превратятся в подпись над 大人. А ещё Вакан может сохранять свой собственный автоматический перевод в виде руби! Это значит, что можно загрузить книжку, нажать "Auto-Translate", и Вакан расставит чтение всем тем словам, которые вы ещё не выучили. И эту книжку потом можно читать в любой из тысяч поддерживающих руби читалок, и слова будут подписаны!
четверг, 13 декабря 2012
Фильм про группу товарищей, которые случайно сделали машину времени. Говорят, это головоломка. "Тот, кто сумеет с первого раза понять происходящее в Праймере - либо гений, либо брехун". Действительно, поначалу всё понятно, но чем дальше, тем сложнее успевать за сюжетом. Как на экзамене: пропустил пару слов - и всё, уже не догонишь.
Научно-фантастическая головоломка с машинами времени - это очень круто.
Но, к сожалению, Праймер - это не очень круто.
Потому, что у него отсутствует "научно-фантастическая" часть.
Праймер хорошо притворяется фантастикой. Но для головоломки авторы сделали страшную вещь: они махнули на некоторые подробности рукой.
Так с головоломками делать нельзя. Каждый кусочек паззла в них должен встать на место. Если заранее знаешь, что некоторые детали лишние, а кое-каких не хватает, то и собирать не хочется!
"Я специально не дал этому объяснения", - говорит режиссёр, - "Герои тоже не знают ответа. Я хотел показать, что они запутались, не понимают, почему и что происходит".
Ну здравствуйте! Либо дудочка, либо кувшинчик. Либо фильм о том, как чувствуют себя путешественники во времени - либо головоломка. Праймер очень непонятный фильм, и только одно заставляет разбираться в нём: наличие правильного ответа. Такого, при котором каждому факту найдётся место.
Этого ответа в Праймере нет. В глубине своей Праймер - гуманитарный, а не естественно-научный фильм. Это студент филологического факультета, который выучил все термины математики и в каких сочетаниях их можно использовать. Его слова нельзя сразу отвергнуть, как чушь. Возможно, он гений. Либо просто говорит что попало. Праймер - второе.
Похожее чувство было от Remember11, но там... Но там Remember11! Там нашёлся правильный ответ. Неожиданный, сложный, но действительно объясняющий всё, и даже мелкие детали, на которые без него не обращаешь внимания. Пятьдесят на пятьдесят, что авторы его и имели в виду.
Научно-фантастическая головоломка с машинами времени - это очень круто.
Но, к сожалению, Праймер - это не очень круто.
Потому, что у него отсутствует "научно-фантастическая" часть.
Праймер хорошо притворяется фантастикой. Но для головоломки авторы сделали страшную вещь: они махнули на некоторые подробности рукой.
Так с головоломками делать нельзя. Каждый кусочек паззла в них должен встать на место. Если заранее знаешь, что некоторые детали лишние, а кое-каких не хватает, то и собирать не хочется!
"Я специально не дал этому объяснения", - говорит режиссёр, - "Герои тоже не знают ответа. Я хотел показать, что они запутались, не понимают, почему и что происходит".
Ну здравствуйте! Либо дудочка, либо кувшинчик. Либо фильм о том, как чувствуют себя путешественники во времени - либо головоломка. Праймер очень непонятный фильм, и только одно заставляет разбираться в нём: наличие правильного ответа. Такого, при котором каждому факту найдётся место.
Этого ответа в Праймере нет. В глубине своей Праймер - гуманитарный, а не естественно-научный фильм. Это студент филологического факультета, который выучил все термины математики и в каких сочетаниях их можно использовать. Его слова нельзя сразу отвергнуть, как чушь. Возможно, он гений. Либо просто говорит что попало. Праймер - второе.
Похожее чувство было от Remember11, но там... Но там Remember11! Там нашёлся правильный ответ. Неожиданный, сложный, но действительно объясняющий всё, и даже мелкие детали, на которые без него не обращаешь внимания. Пятьдесят на пятьдесят, что авторы его и имели в виду.
среда, 12 декабря 2012
Сегодня международный день проверки микрофона: 12.12.12.
А 20-го будет международный день перемены порядка байт: 2012.12.20.
А 20-го будет международный день перемены порядка байт: 2012.12.20.
воскресенье, 09 декабря 2012
С тех пор прошло два года, так что надо бы эту историю рассказать.
Кирино, Куронеко и Саори в "Имоте" познакомились через японский вконтактик, создав группу "Девочки-отаку, объединяйтесь!" И вот, летом 2010-го показывали этот сериал, а зимой мне однажды было скучно, и я решил созвать сходочку Ычана.
Но не в /b/, а в /a/ - я хотел созвать анимешников.
И назвал тему, конечно, "Девочки-отаку, объединяйтесь!"
Логика тут была следующая. Во-первых, понять референс к имоте могут только хорошие люди. Во-вторых, если правда придут девочки, что, я буду жаловаться?
План был - посидеть в кафе, потрындеть об аниме.
Не могу сказать, что я рассчитывал увидеть сплошных девушек, но и что придут одни парни, тоже не думал.
Реалистично рассуждая, должны были придти человек пять парней, и одна, максимум две девушки. Потому, что такой процент девушек среди анимешников.
Тема не утонула, народ в ней общался, и человек пять-шесть даже собрались идти на встречу. Мы договорились встретиться у выхода на Лубянке.
А дело было зимой. Надев пальто, я поехал по холодной Москве к месту встречи... и приехал последним.
Выходя из метро на зимний ветер и поднимаясь по лестнице, я искал компанию взглядом.
Можно уже догадаться, чем кончилось.
Пришёл один человек.
Мы с ним подождали ещё десять минут, но никого больше не было. Тогда мы поехали к его приятелю пить водку.
Так собрались русские девочки-отаку.
Кирино, Куронеко и Саори в "Имоте" познакомились через японский вконтактик, создав группу "Девочки-отаку, объединяйтесь!" И вот, летом 2010-го показывали этот сериал, а зимой мне однажды было скучно, и я решил созвать сходочку Ычана.
Но не в /b/, а в /a/ - я хотел созвать анимешников.
И назвал тему, конечно, "Девочки-отаку, объединяйтесь!"
Логика тут была следующая. Во-первых, понять референс к имоте могут только хорошие люди. Во-вторых, если правда придут девочки, что, я буду жаловаться?
План был - посидеть в кафе, потрындеть об аниме.
Не могу сказать, что я рассчитывал увидеть сплошных девушек, но и что придут одни парни, тоже не думал.
Реалистично рассуждая, должны были придти человек пять парней, и одна, максимум две девушки. Потому, что такой процент девушек среди анимешников.
Тема не утонула, народ в ней общался, и человек пять-шесть даже собрались идти на встречу. Мы договорились встретиться у выхода на Лубянке.
А дело было зимой. Надев пальто, я поехал по холодной Москве к месту встречи... и приехал последним.
Выходя из метро на зимний ветер и поднимаясь по лестнице, я искал компанию взглядом.
Можно уже догадаться, чем кончилось.
Пришёл один человек.
Мы с ним подождали ещё десять минут, но никого больше не было. Тогда мы поехали к его приятелю пить водку.
Так собрались русские девочки-отаку.
пятница, 07 декабря 2012
Да, я понимаю, что тут никто не пишет на дельфи, но раз уж я иногда что-то пишу о ней, то позвольте мне.
В дельфи есть элемент языка, которым все пренебрегают. Очень крутой. Это атрибут входного параметра const.
Вместо:
Получится:
Зачем?
Строки в Дельфи ведут учёт ссылок. Каждое присваивание увеличивает счётчик на 1. Каждое зануление - уменьшает его. Поэтому любая функция, которая получает строки, преобразуется компилятором в следующую:
На помощь спешит модификатор const! Он говорит компилятору, что вы клянётесь героиней любимого мультика не трогать полученной строки. Тогда можно учёт ссылок не вести, и фрейм try..finally тоже не нужен. Вместо 60 ассемблерных инструкций ваша функция внезапно компилируется в шесть!
Но это ещё не всё.
Мало добавлять const к строковым параметрам. Строки могут передаваться неявно. Функция, которая получает структуру со строкой внутри, тоже требует учёта ссылок и фрейма try..finally. Даже хуже: вместо прямолинейного UStrLAsg будет вызван AddRefRecord, который с помощью некоего подобия рефлекшна изучает вашу структуру и решает, каким полям нужен какой учёт ссылок. И так в каждой функции!
Дельфи не глупая, и если структуре совсем не нужен учёт ссылок, она поймёт это при компиляции, и фрейм не вставит. Но когда хоть одно поле требует учёта, вы получите пенальти в размере полного разбора всей структуры дважды.
Поэтому ставьте const везде, где можно. Ставьте const всему, что передаёте на копирование во всевозможные "SetSomething" или "InitSomething". В крайнем случае он будет просто подсказкой читающему код.
Ещё очень важная информация: отключайте "String format checking" в настройках компиляции. Всегда. Сразу же. Эту опцию следовало бы назвать "замедлить в три раза все операции со строками, для того, чтобы спрятать от вас чудовищные баги в вашем коде".
В дельфи есть элемент языка, которым все пренебрегают. Очень крутой. Это атрибут входного параметра const.
Вместо:
function IsStringAbrakadabra(s:string): boolean
Получится:
function IsStringAbrakadabra(const s:string): boolean
Зачем?
Строки в Дельфи ведут учёт ссылок. Каждое присваивание увеличивает счётчик на 1. Каждое зануление - уменьшает его. Поэтому любая функция, которая получает строки, преобразуется компилятором в следующую:
UStrLAsg(s); //увеличить счётчик ссылок
try
//сама функция
finally
UStrLClr(s); //уменьшить счётчик ссылок
end;
Два лишних вызова! И фрейм try..finally (это очень дорогая конструкция). Эта обёртка легко может тратить больше времени, чем сама ваша функция! Скомпилите и посмотрите в ассемблер - инлайнить такую дуру тоже пропадает всякая выгода.На помощь спешит модификатор const! Он говорит компилятору, что вы клянётесь героиней любимого мультика не трогать полученной строки. Тогда можно учёт ссылок не вести, и фрейм try..finally тоже не нужен. Вместо 60 ассемблерных инструкций ваша функция внезапно компилируется в шесть!
Но это ещё не всё.
Мало добавлять const к строковым параметрам. Строки могут передаваться неявно. Функция, которая получает структуру со строкой внутри, тоже требует учёта ссылок и фрейма try..finally. Даже хуже: вместо прямолинейного UStrLAsg будет вызван AddRefRecord, который с помощью некоего подобия рефлекшна изучает вашу структуру и решает, каким полям нужен какой учёт ссылок. И так в каждой функции!
Дельфи не глупая, и если структуре совсем не нужен учёт ссылок, она поймёт это при компиляции, и фрейм не вставит. Но когда хоть одно поле требует учёта, вы получите пенальти в размере полного разбора всей структуры дважды.
Поэтому ставьте const везде, где можно. Ставьте const всему, что передаёте на копирование во всевозможные "SetSomething" или "InitSomething". В крайнем случае он будет просто подсказкой читающему код.
Ещё очень важная информация: отключайте "String format checking" в настройках компиляции. Всегда. Сразу же. Эту опцию следовало бы назвать "замедлить в три раза все операции со строками, для того, чтобы спрятать от вас чудовищные баги в вашем коде".
четверг, 06 декабря 2012
Смысла которых никто не знает:
1. Всплеснуть руками.
2. Трагически заламывать руки.
Как "всплескивают руками"? Когда это делают? Вспоминается только, что со словами "Какой кошмар!". А заламывание рук - знак отчаяния.
1. Всплеснуть руками.
2. Трагически заламывать руки.
Как "всплескивают руками"? Когда это делают? Вспоминается только, что со словами "Какой кошмар!". А заламывание рук - знак отчаяния.
понедельник, 03 декабря 2012
Дочитал Оторимоногатари (История о приманке).
"Кабукимоногатари" и "Ханамоногатари" приучили к тому, что в мире Моногатарей ничего не меняется, разве что Арараги машину купил. Каждая книга возвращает рычаг в положение ноль.
Не тут-то было!
Оторимоногатари как перевёл рычаг в крайнее положение, так там его и оставил. Книга начинается с того, что Коёми-онии-тян с оторванной рукой идёт убивать Надеко, и ясно, что это пугалка - подерутся и помирятся. Ну запуталась Надеко, связалась с кайи, Арараги её сейчас выручит...
Но этого не происходит.
Всё меньше страниц остаётся до конца книги, а развязки нет и нет.
Даже любопытно: как Нисио Исин собирается распутывать весь это бардак за сорок? Двадцать? Восемь страниц?..
И когда страниц остаётся пять или четыре, вдруг понимаешь: а он и не собирается. Не будет никакого "мальчик сел в свою машину времени, полетел назад и всё отменил".
Так всё и кончается - необратимыми переменами. Какими - не угадаете, но странными и мрачными.
"Кабукимоногатари" и "Ханамоногатари" приучили к тому, что в мире Моногатарей ничего не меняется, разве что Арараги машину купил. Каждая книга возвращает рычаг в положение ноль.
Не тут-то было!
Оторимоногатари как перевёл рычаг в крайнее положение, так там его и оставил. Книга начинается с того, что Коёми-онии-тян с оторванной рукой идёт убивать Надеко, и ясно, что это пугалка - подерутся и помирятся. Ну запуталась Надеко, связалась с кайи, Арараги её сейчас выручит...
Но этого не происходит.
Всё меньше страниц остаётся до конца книги, а развязки нет и нет.
Даже любопытно: как Нисио Исин собирается распутывать весь это бардак за сорок? Двадцать? Восемь страниц?..
И когда страниц остаётся пять или четыре, вдруг понимаешь: а он и не собирается. Не будет никакого "мальчик сел в свою машину времени, полетел назад и всё отменил".
Так всё и кончается - необратимыми переменами. Какими - не угадаете, но странными и мрачными.
суббота, 01 декабря 2012
"Люди свободны. Люди не принадлежат сами себе. Каждое мгновение - развилка, определяющая, как дальше пойдёт история. Всё предрешено прошлым и будущим, изменить ничего нельзя. Любое наше действие порождает волны, которые расходятся по времени. Каждый проступок и каждое доброе дело отражаются снова и снова. Главное - быть храбрым. Любовь - это движущая сила вселенной. Негров обижать нельзя.
Мы как кванты, которые... в общем, кванты."
Если забыть о прекрасной музыке, увлекательном сюжете и общей грандиозности, вы только что посмотрели "Облачный атлас". В его обширном философском подтексте каждый найдёт свои любимые ответы на свои любимые вопросы.
Мы как кванты, которые... в общем, кванты."
Если забыть о прекрасной музыке, увлекательном сюжете и общей грандиозности, вы только что посмотрели "Облачный атлас". В его обширном философском подтексте каждый найдёт свои любимые ответы на свои любимые вопросы.
пятница, 30 ноября 2012
В японской прозе постоянно встречается "обычная", "повседневная" или "будничная одежда" (shifuku, 私服 ). "Навстречу мне вышел отец в обычной одежде", "в коридоре стояла Кирино в обычной одежде", "по пути нам встретился Акаги в повседневной одежде".
Понятно, что это значит "не в школьной форме, не в костюме готик-лолиты и не в рабочем пиджаке". Но переводить-то неудобно! Читатель скажет - вот заладили: обычная одежда, обычная одежда... Если она обычная, чего о ней говорить?
Дело в том, что в Японии значительно теплее, чем у нас.
В России десять месяцев из двенадцати на улице ветер, слякоть или мороз. Поэтому у нас существуют "домашняя" и "уличная одежда". Мы привыкли к ним так же, как японцы привыкли к своей "обычной". Нам не покажутся странными фразы:
"Навстречу мне вышел отец в домашней одежде"
"В коридоре стояла Кирино в уличной одежде"
"По пути нам встретился Акаги в уличной одежде"
Это какие-никакие, а уточнения. Конечно, лучше бы сказать "Акаги в джинсах и куртке поверх футболки", но "Акаги в обычной одежде" звучит хуже, согласитесь.
Итак, если текст позволяет - если нет картинок - заменяйте "обычную одежду" на "домашнюю" или "уличную", по обстоятельствам. Ничего страшного, если герой в "уличной одежде" сразу пройдёт к себе в комнату: в тёплом климате Японии это не вызовет вопросов (на самом деле ведь так и происходит).
А если мешают картинки (трудно назвать "уличной одеждой" майку с шортами) - просто замените "обычную одежду" её описанием.
Это вольность перевода, но результат того стоит.
Понятно, что это значит "не в школьной форме, не в костюме готик-лолиты и не в рабочем пиджаке". Но переводить-то неудобно! Читатель скажет - вот заладили: обычная одежда, обычная одежда... Если она обычная, чего о ней говорить?
Дело в том, что в Японии значительно теплее, чем у нас.
В России десять месяцев из двенадцати на улице ветер, слякоть или мороз. Поэтому у нас существуют "домашняя" и "уличная одежда". Мы привыкли к ним так же, как японцы привыкли к своей "обычной". Нам не покажутся странными фразы:
"Навстречу мне вышел отец в домашней одежде"
"В коридоре стояла Кирино в уличной одежде"
"По пути нам встретился Акаги в уличной одежде"
Это какие-никакие, а уточнения. Конечно, лучше бы сказать "Акаги в джинсах и куртке поверх футболки", но "Акаги в обычной одежде" звучит хуже, согласитесь.
Итак, если текст позволяет - если нет картинок - заменяйте "обычную одежду" на "домашнюю" или "уличную", по обстоятельствам. Ничего страшного, если герой в "уличной одежде" сразу пройдёт к себе в комнату: в тёплом климате Японии это не вызовет вопросов (на самом деле ведь так и происходит).
А если мешают картинки (трудно назвать "уличной одеждой" майку с шортами) - просто замените "обычную одежду" её описанием.
Это вольность перевода, но результат того стоит.
четверг, 29 ноября 2012
Помните, год назад я говорил, что блюреи не нужны? Ну так вот, купив телевизор, который их проигрывает, я, разумеется, поменял мнение на противоположное: теперь я объективно могу заявить, что блюреи - лучшее из всего, что случалось с человечеством после предыдущей случившейся с ним не менее хорошей вещи.
Теперь-то мне стало понятно, зачеммыII-Subs выпускали Бакемоногатри в BD-формате. Это затем, чтоб я его через пару лет на телевизоре посмотрел. От качества перехватывает дыхание. (Ну или в комнате наконец надо проветрить)
Но лучше я расскажу о телевизоре - возможно, кого-то заинтересует.
Оказывается, современные телевизоры умеют подключаться к рутеру по Wi-Fi и проигрывать видео с компьютеров напрямую. Не нужно тянуть никакие провода, кроме обычного электричества. И понимают они почти все популярные форматы и кодеки, включая матрёшку. Только новомодное десятибитное видео на телевизоре пока проигрывается с подтёками.
Можно поставить телевизор, воткнуть в розетку и смотреть по воздуху всё, что лежит у вас на компьютере!
Да если б я знал раньше, я бы из больницы в магазин побежал.
Конечно, на деле всё немного неудобней. Просто расшарить файлы нельзя: нужно ставить программу, сервер медиа-вещания, и объяснять ей, где у вас что лежит. Программа пожует-пожуёт ваши файлы, и они станут доступны на телевизоре.
Хорошие новости: таких программ много. Не обязательно использовать глючную отSamsungвашего корейского производителя телевизора, можно скачать бесплатную открытую и более надёжную Serviio, например (к ней ещё есть плагины). Ну или любую другую.
Хорошие новости: Serviio и некоторые другие программы умеют перекодировать на лету. Если телевизор всё-таки не поддерживает формат файла, так его можно посмотреть.
Плохие новости: безупречных медиа-вещателей нет. Все они глючны, какие больше, какие меньше! Один раз настроить и забыть не выйдет; привыкайте, что с каждым новым сериалом или фильмом придётся минут 15 возиться, перезагружая сервер, скармливая ему файлы, гладя по головке, упрашивая проиндексировать... Ну почему ты не индексируешь? Ну что тебе не нравится? Ах не под тем аккаунтом ты запущен? Ах под администратором тебе не нравится? Запустить твою службу под обычным пользователем? Конечно, запущу, ты только не плачь.
Привыкайте, что телевизор будет файл за файлом отказываться проигрывать, упрямо глядя на вас, как баран, и талдыча: "Ничего не знаю, формат пока не поддерживается". Что перекодированный файл он не сможет скроллить. Вот так! Смотрите от начала и до конца. Что наткнувшись на восьмую серию Нисемоногатари, медиа-сервер сойдёт с ума, и все дальнейшие папки на телевизоре будут одинаково называться "Ore no imouto".
Но зато вы можете посмотреть Бакемоногатари в офигенном разрешении 1080p. Это правда очень красиво.
P.S. Плохие новости: медиа-серверы не очень любят внешние сабы, только встроенные. И у встроенных теряется разметка.
Хорошие новости: скоро Новый год.
P.P.S. Забыл сказать, что на телевизор можно устанавливать приложения для работы с интернетом. Например, можно смотреть ютюб. Только это неудобно.
Теперь-то мне стало понятно, зачем
Но лучше я расскажу о телевизоре - возможно, кого-то заинтересует.
Оказывается, современные телевизоры умеют подключаться к рутеру по Wi-Fi и проигрывать видео с компьютеров напрямую. Не нужно тянуть никакие провода, кроме обычного электричества. И понимают они почти все популярные форматы и кодеки, включая матрёшку. Только новомодное десятибитное видео на телевизоре пока проигрывается с подтёками.
Можно поставить телевизор, воткнуть в розетку и смотреть по воздуху всё, что лежит у вас на компьютере!
Да если б я знал раньше, я бы из больницы в магазин побежал.
Конечно, на деле всё немного неудобней. Просто расшарить файлы нельзя: нужно ставить программу, сервер медиа-вещания, и объяснять ей, где у вас что лежит. Программа пожует-пожуёт ваши файлы, и они станут доступны на телевизоре.
Хорошие новости: таких программ много. Не обязательно использовать глючную от
Хорошие новости: Serviio и некоторые другие программы умеют перекодировать на лету. Если телевизор всё-таки не поддерживает формат файла, так его можно посмотреть.
Плохие новости: безупречных медиа-вещателей нет. Все они глючны, какие больше, какие меньше! Один раз настроить и забыть не выйдет; привыкайте, что с каждым новым сериалом или фильмом придётся минут 15 возиться, перезагружая сервер, скармливая ему файлы, гладя по головке, упрашивая проиндексировать... Ну почему ты не индексируешь? Ну что тебе не нравится? Ах не под тем аккаунтом ты запущен? Ах под администратором тебе не нравится? Запустить твою службу под обычным пользователем? Конечно, запущу, ты только не плачь.
Привыкайте, что телевизор будет файл за файлом отказываться проигрывать, упрямо глядя на вас, как баран, и талдыча: "Ничего не знаю, формат пока не поддерживается". Что перекодированный файл он не сможет скроллить. Вот так! Смотрите от начала и до конца. Что наткнувшись на восьмую серию Нисемоногатари, медиа-сервер сойдёт с ума, и все дальнейшие папки на телевизоре будут одинаково называться "Ore no imouto".
Но зато вы можете посмотреть Бакемоногатари в офигенном разрешении 1080p. Это правда очень красиво.
P.S. Плохие новости: медиа-серверы не очень любят внешние сабы, только встроенные. И у встроенных теряется разметка.
Хорошие новости: скоро Новый год.
P.P.S. Забыл сказать, что на телевизор можно устанавливать приложения для работы с интернетом. Например, можно смотреть ютюб. Только это неудобно.
среда, 28 ноября 2012
Был у нас переходник с евророзетки на советскую. Маленький белый такой. Если присмотреться, он состоял из двух частей, воткнутых одна в другую и соединённых болтом.
Кто-то пришёл.
Болт выкрутил.
Унёс.
А две части оставил.
Вот нафига? Болтов других не было?
Кто-то пришёл.
Болт выкрутил.
Унёс.
А две части оставил.
Вот нафига? Болтов других не было?
В пятом сезоне каждая серия - это очередной гвоздь в крышку гроба для симпатий к Волтеру Вайту. Столбик градусника приязни падает на глазах: теперь уже хочется, чтобы Волт проиграл. Он умудрился, не став по-настоящему крутым, как этого все ждали, стать по-настоящему плохим. Получился трусоватый и нелепенький, но жестокий учитель химии с манией величия.
Трусость, конечно, понемногу уходит, но заменяет её не уверенность в себе, а ощущение вседозволенности. Выходит, Breaking Bad показывает нам историю становления диктатора того сорта, который в глубине души остался кроликом, просто вырастил броню и когти-ножи.
Майк - старикан-убийца - сказал про Волтера: "Это бомба с часовым механизмом, который отстукивает: тик-так, тик-так, тик-так. Рано или поздно она рванёт, и уничтожит всех вокруг, и я не хочу в это время быть рядом". Наверное, он говорил про манию величия: для химика нет правил, он никогда не удовлетворится тем, что имеет. Волт всегда будет рисковать, бросаться в огонь:
"You asked me if I'm in it for the money business or the drug business? I'm neither. I'm in it for the empire business."
Я сочувствовал Волту первые сезоны, даже когда ему приходилось поступать жестоко - именно потому, что его вынуждали обстоятельства. Я сочувствовал ему даже тогда, когда Волт был сухарём и врал, что ему жалко погибшего ребёнка: некоторые люди просто лишены эмоций, тут ничего не поделаешь. Но теперь Волтера всерьёз решили сделать плохишом.
Трусость, конечно, понемногу уходит, но заменяет её не уверенность в себе, а ощущение вседозволенности. Выходит, Breaking Bad показывает нам историю становления диктатора того сорта, который в глубине души остался кроликом, просто вырастил броню и когти-ножи.
Майк - старикан-убийца - сказал про Волтера: "Это бомба с часовым механизмом, который отстукивает: тик-так, тик-так, тик-так. Рано или поздно она рванёт, и уничтожит всех вокруг, и я не хочу в это время быть рядом". Наверное, он говорил про манию величия: для химика нет правил, он никогда не удовлетворится тем, что имеет. Волт всегда будет рисковать, бросаться в огонь:
"You asked me if I'm in it for the money business or the drug business? I'm neither. I'm in it for the empire business."
Я сочувствовал Волту первые сезоны, даже когда ему приходилось поступать жестоко - именно потому, что его вынуждали обстоятельства. Я сочувствовал ему даже тогда, когда Волт был сухарём и врал, что ему жалко погибшего ребёнка: некоторые люди просто лишены эмоций, тут ничего не поделаешь. Но теперь Волтера всерьёз решили сделать плохишом.
if AnsiCompareStr(uppercase(value),uppercase(s))<0 then r:=c else
if AnsiCompareStr(uppercase(value),uppercase(s))>0 then l:=c+1 else
if AnsiCompareStr(uppercase(value),uppercase(s))=0 then r:=c;
Мало того, что "<=" разбито на "<" и "=" с одинаковым исходом, так тут вообще достаточно одной проверки:
if AnsiCompareStr(uppercase(value),uppercase(s))<=0 then r:=c else l:=c+1;
UPD. Я в этот пост буду складывать все такие примеры!
if (doall) then
begin
if not doall then
begin
Пока рефакторю чужой код, постоянно ловлю себя на мысли из Стругацких:
Мы здесь не для того, чтобы их спасать.
Всем строкам кода не поможешь, их слишком много, а наши силы ограничены! Закрой глаза на это чудовищное условие для while из 15 строк. Отвернись, когда видишь, как одна и та же проверка снова и снова вызывается в цикле. Занимайся своим делом: переписывай самые медленные места, а остальное оставь как есть. Тут просто эпоха такая.
Мы здесь не для того, чтобы их спасать.
Всем строкам кода не поможешь, их слишком много, а наши силы ограничены! Закрой глаза на это чудовищное условие для while из 15 строк. Отвернись, когда видишь, как одна и та же проверка снова и снова вызывается в цикле. Занимайся своим делом: переписывай самые медленные места, а остальное оставь как есть. Тут просто эпоха такая.
четверг, 22 ноября 2012
Ну вот, после моих переделок текст, который раньше переводился в Вакане минуту 10 секунд, переводится за 5 секунд.
Хо-хо!
Полюбуйтесь, что для этого пришлось нагородить:
Это я здесь сравниваю строки из 4-символов (4 байта на хекс-код).
Хо-хо!
Полюбуйтесь, что для этого пришлось нагородить:
{$IFDEF INTEGER_HELL}
{
Note on integer comparison optimization:
We're not checking if roma_t[i].hiragana has one or two 4-chars.
It's okay. If it has one, then roma_t[i].hiragana[5]==#00, and it wouldn't match
to any 4-char hex combination.
It also won't AV because the memory's dword aligned and hiragana[5] is accessible already.
}
if ((pinteger(ps)^=pinteger(roma_t[i].hiragana_ptr)^)
and (pinteger(integer(ps)+4)^=pinteger(integer(roma_t[i].hiragana_ptr)+4)^))
or ((pinteger(ps)^=pinteger(roma_t[i].katakana_ptr)^)
and (pinteger(integer(ps)+4)^=pinteger(integer(roma_t[i].katakana_ptr)+4)^)) then begin
{$ELSE}
if FcharCmp(ps, roma_t[i].hiragana_ptr, 2)
or FcharCmp(ps, roma_t[i].katakana_ptr, 2) then begin
{$ENDIF}
Это я здесь сравниваю строки из 4-символов (4 байта на хекс-код).
среда, 21 ноября 2012
Хотите посмотреть на код, от которого хочется плакать кровавыми слезами? Исходный код Вакана... Я когда-то его выпросил у автора в рассчёте исправить баги.
Только посмотрите на TfUser.DicSearch... TfUser.RenderText... Да на что угодно! Эти простыни непрокомментированного кода! Эти сотни переменных с именами s, i, w, f, buf, ws, wss, wcs, l, ls, dp, tp, jtt, dot, s2, s3! Эти затычки для экспшнов повсюду, где (автор удивлённо пожимает плечами) почему-то случаются эксепшны... Эти названия компонентов Label1-Label123! Это ДНК. Никому не ясно, как в нём работает, что в нём работает, и зачем оно в нём работает.
Функция перебирает строку по символу (на самом деле, по 4 символа):
Если номер символа меньше девяти, то мы добавляем куда-то... какую-то хрень с нулём в середине. Если больше девяти, то без нуля. Что? Почему?! Почему девять? Что это за нули? Что это за F? Куда мы их добавляем? В чём смысл жизни?! Есть ли бог?! Почему мы сравниваем с девятью i, а вычитаем из девяти j?! Все эти вопросы оставлены без ответа.
На всякий случай скажу, что к автору Вакана претензий нет - он не обязан был публиковать код, и когда я просил его открыть, то сказал, чтоб он не стеснялся кривого кода, я разберусь; этим сейчас и занимаюсь. Но того, что код кошмарный, это не меняет.
Только посмотрите на TfUser.DicSearch... TfUser.RenderText... Да на что угодно! Эти простыни непрокомментированного кода! Эти сотни переменных с именами s, i, w, f, buf, ws, wss, wcs, l, ls, dp, tp, jtt, dot, s2, s3! Эти затычки для экспшнов повсюду, где (автор удивлённо пожимает плечами) почему-то случаются эксепшны... Эти названия компонентов Label1-Label123! Это ДНК. Никому не ясно, как в нём работает, что в нём работает, и зачем оно в нём работает.
Функция перебирает строку по символу (на самом деле, по 4 символа):
if i<=9 then se.Add(inttostr(9-j)+'0'+inttostr(i)+'F'+copy(s,1,i*4)) else se.Add(inttostr(9-j)+inttostr(i)+'F'+copy(s,1,i*4));
Если номер символа меньше девяти, то мы добавляем куда-то... какую-то хрень с нулём в середине. Если больше девяти, то без нуля. Что? Почему?! Почему девять? Что это за нули? Что это за F? Куда мы их добавляем? В чём смысл жизни?! Есть ли бог?! Почему мы сравниваем с девятью i, а вычитаем из девяти j?! Все эти вопросы оставлены без ответа.
На всякий случай скажу, что к автору Вакана претензий нет - он не обязан был публиковать код, и когда я просил его открыть, то сказал, чтоб он не стеснялся кривого кода, я разберусь; этим сейчас и занимаюсь. Но того, что код кошмарный, это не меняет.