Category: литература

Category was added automatically. Read all entries about "литература".

moth

Культурные мероприятия

Пощу для друга, есть один вопрос для местных френдов.

Человек с педагогическим и литературным бэгкраундом прощупывает почву относительно возможных социальных мероприятий.

1. Были бы вам интересны мероприятия, связанные с литературой (проводить литературные встречи, посиделки, обсуждения, встреча с писателями)?

2. Было бы интересно что-нибудь для детей - внеклассные занятия, кружок, конкурсы?

3. Существуют ли в нашей SF Bay Area подобные вещи и/или люди с подобными интересами, чтобы connect the souls together?
moth

Две любимых книжки

Однажды, когда я ещё переехал в США и работал в корпорации, но был джуниором, я попросил своего друга, продвинувшегося куда дальше по карьере, посоветовать мне полезных книжек. Он мне ответил так: книжки по программированию тебе не нужны, ты и так всё в доках и мануалах прочтёшь, или экспериментально освоишь, или ребята расскажут. Поэтому для карьеры есть одна-единственная полезная книжка:

Getting Things Done.

Я прочёл её, стал её использовать и продвинулся по карьере, а также стал её всем советовать как полезную книжку.

Обычно, когда советуешь кому-нибудь книжку, особенно очень полезную, по популярной психологии, то почти никто не будет её читать. Особенно книжку с названием "Getting Things Done" - ведь если она учит, как делать дела, то целевая аудитория книжки - люди, не способные делать дела. Смогут ли они осуществить чтение самой книжки? Секрет, конечно же, в том, что книжка учит завершать дела. Предполагается, что вы уже умеете их начинать :)

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

На радостях я решил написать этот пост, и заодно рассказать, про Вторую Книжку для карьеры. Да, их две. Эту вторую я нашёл сам. Она мне тоже помогла.
Рекомендую:

The Power of Full Engagement.

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

У этих книжек есть эквиваленты на русском. Первая называется "как привести дела в порядок", а вторая называется "на все сто". Но если вы хоть немного можете читать по-английски, рекомендую в оригинале, потому что переводы - говно💩.

* * *

Кстати, а вы задумывались, почему в мире так много бедных, несчастных и неудачливых людей среди интеллигенции, при том, что в открытом доступе выложена уйма материалов, могущих круто изменить жизнь к лучшему? Я задумывался, долго не мог понять, но потом понял со временем. Шёпотом: потому что эти материалы почти никто не читает, а те, кто прочли, очень редко используют их в своей жизни. (Но вы можете и прочесть, и использовать, и, таким образом, стать исключением из этой печальной статистики!)

Иногда люди рассуждают, логически приходя к выводу, что книжка не может быть полезной. Ведь если бы она действительно приносила в жизнь столько добра, то все могли бы её прочесть, а добра фиксированное количество, делится на то же количество людей. Откуда взяться новому добру?

К такому рассуждению есть несколько контр-аргументов. Во-первых, добро добывается в результате работы. Если все люди на планете стали бы работать вдвое продуктивнее, то добыли бы вдвое больше добра. Так что вот оно, новое добро.

Но это не единственный контр-аргумент. Мне больше нравится другой. Дополнительное добро делится между очень небольшим количеством людей, потому что никто не читает этих книжек. На своём опыте: это примерно 100500-й раз, когда я рекомендую эти две книжки друзьям. Я подарил десяток печатных экземпляров каждой книги, советовал при личном общении и писал ЖЖ посты. Меня самого уже раздражает моя же навязчивость, но я продолжаю рекомендовать уже скорее из любопытства, чтобы собрать статистику. Ну так вот, мне достоверно известно о трёх случаях прочтения первой книги по моей наводке, и об двух случаях имплементации, один из которых - тот успешный, о котором я упомянул выше. Во втором случае "попробовал, но не пошло". Это я к тому, что пропасть между "знаю о существовании хорошей книжки" и "фактически почитаю и попробую" - огромна, что полностью нивелирует аргумент про деление добра.
moth

Некурение

Я нередко пощу про всякие попытки улучшить жизнь прямо сейчас. Что я собираюсь делать, что я взялся делать сегодня, что я уже делаю пару дней и вот первые результаты. Это годные дневниковые записи, но по ним вряд ли можно "передать опыт", потому что настоящие результаты придут чуть позже, да и не факт, что я про них напишу. И вот я опять пишу про очередные попытки что-нибудь сделать такое этакое, полезное, крутое. С точки зрения внешнего читателя, наверное, невозможно определить, я делюсь реально крутыми перспективными вещами, или же это просто случайные попытки, которые ни к чему не приведут. А бывает даже так: вещи, в целом умные, просто я неумело их воплощу в жизнь, и они не сработают. Или не повезёт. А бывает и наоборот, результат придёт не благодаря какому-то действию, а вопреки.

Про "настоящие успехи" можно писать только задним числом, когда результат уже гарантировано достигнут, в порядке рефлексии. Даже в этом случае не факт, что докопаешься до настоящих причин успеха, но, как минимум, зафиксированный факт успеха сильно повышает эту вероятность.

По поводу освобождения от никотиновой зависимости, моя история такая:

Я начал курить в возрасте 14 лет (на самом деле в возрасте 7-8 лет был период, когда мы скурили с друганами несколько пачек "Астры", но это было не в тягу, и потому не считается.)

Весной 2008 я бросил курить, вместе с кучей полезных для здоровья инициатив, благодаря целому комплексу вещей:

* Был один семинар личностного роста - где-то на грани с сектанством, но всё же, наверное, он чуть не добирал до секты - который был мощным побудительным мотивом, зарядом позитива и радужных перспектив на будущее.

* Была программа по бросанию курить, оплачиваемая из рабочего медицинского бенефита, в которой довольно солидный brainwashing, советы, средства, методики, и особо запомнившаяся методика "Light & Write" - такие небольшие таблички, которые распечатываешь, вырезаешь и вкладываешь в каждую пачку сигарет, чтобы перед тем, как закурить, подписывать, насколько сильно хотелось, какое было настроение, и что я вообще делал в этот момент дня. Одно лишь это позволило без боли снизить курение вдвое.

* Была известная книжка Аллена Карра. Мне казалось, что в ней много bullshit'а, но также казалось, что "я понял как она работает", и когда видел bullshit, пытался угадать message, который закладывал автор, и подыскивал убедительные аргументы в своей системе координат вместо того, что пыталась "скормить" книга.

* В первые три дня непосредственно после "бросания cold turkey", были никотиновые пластыри. Но потом я их бросил, т.к. они делали мне передоз с утра и провоцировали ломку вечером, не равномерно доставляли никотин.

Это был мощнейший "забег", в котором всё "получилось". У меня также получилось сбросить почти 30 кг лишнего веса за год.
Но потом ЗОЖные инициативы стали заброшены, вес понемногу поднимался, были всякие неудовлетворённости жизнью, которые впоследствии материализовались в развод, и я снова начал курить. Обстоятельства, конечно, были неблагоприятные, но если бы я очень хотел, я бы воздержался. А я начал курить по глупости, ну, типа, выкурю пару сигарет, погрущу. На второй день после этого я уже курил пачку в день, как будто никогда не бросал.

После этого очень долгое время не получалось ничего, хотя были попытки бросить разной серьёзности. В 2010 заплатил за гипноз от курения. Он мне помог на полтора дня. Хотя гипноз реально работающий. Один из "suggestion" в гипнозе был сделан, видимо, по приколу, чтобы "доказать, что всё работает", типа "и, кстати, теперь красный цвет ты будешь видеть необычайно ярко и насыщенно". Я тогда ещё посмеялся над этим. Но уже прошло 10 лет, и я до сих пор красный свет вижу необычайно ярко. Светофоры, задние огни машин, волосы женщин, если они окрашены правильным тоном красного :) Я даже (в шутку) подумывал, не вернуться ли к гипнотизёру, чтобы он мне на других цветах тоже яркость подкрутил, чтобы вся картинка была веселее.

Пробовал перечитать книгу Аллена Карра. Она, конечно, одноразовая. Второй раз ты уже не просто понимаешь, что она bullshit, а ещё и имеешь доказательство, что этот bullshit не работает. Хотя... попытки при помощи книжки я предпринимал.

Пробовал замечательные таблетки "Табекс". Их всё ещё можно купить в Украине в свободном доступе, но в те времена она ещё на ебее продавались. Бросить курить они мне не помогли, но там была замечательная побочка - "жирные", сочные, цветные сны. С интересным сюжетом, как "живые", очень затягивающие и увлекательные. Прям настолько, что к концу недели я устал от интересных снов и бросил эти таблетки. Но держу их в запасе, вдруг захочу посмотреть клёвых мультиков ночью.

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

Я читал уйму литературы на тему зависимостей, а также много статей по neuroscience, о том, как работает мозг в принципе, и что с ним можно делать :) Пробовал разное. Но не получалось.

Потом, в районе 2017, был первый небольшой успех: я перешёл на вейп. Перейти на вейп не легко, это примерно как половина от настоящего "бросания" курить - нужно перетерпеть мощную ломку и недели три сильно мучиться. Но при этом никотин поступает в организм, потому концентрация внимания падает не так сильно, и нет такого плохого эффекта на работу. Впрочем, время от времени хотелось сигарет, приходилось терпеть. Вейп отличается тем, что, во-первых, в нём нет разных смол и неникотиновых токсичных веществ, к которым ты тоже привыкаешь. Во-вторых, даже с мощным "модом", тебе даёт в голову в течение 30-60 секунд. Обычная сигарета торкает с первой затяжки, за 5-10 секунд. Зависимость возникает не просто от вещества и удовольствия, а ещё и от шаблона его получения - сила всплеска, высота пика удовольствия играют большую роль. Кстати, поэтому мои первые попытки перейти на электронные сигареты не увенчались успехом, потому что через них была совсем слабая тяга. Крутые sub-ohm койлы и мод на 200 ватт - это must.

Вейп немножко менее вреден, чем сигареты. Во-первых, есть по этому поводу исследования, во-вторых, это сразу видно по результатам в спортзале. Хотя, конечно, появляются дополнительные риски, ведь ароматические добавки делают из пищевых, а они "одобрены" для попадания в организм через желудок, а не через лёгкие. Я внимательно изучил предмет в то время, и все "плохие истории" сводились к некачественным или опасным вкусовым добавкам (поэтому важно выбрать один вкус и всегда придерживаться его, а не вейпить что попало), а также к пожарам от несоблюдения правил безопасности. Всё-таки 200 ваттный мод это девайс, работающий от трёх батареек типа 18650 (те же батарейки, что и в автомобиле Тесла, и в батарейках от ноутбука), но батарейки соединены параллельно. 200 ватт на 3 батарейки это значит, каждая выдаёт 18 ампер тока на 3.7V. Это мегадохуя и может быть опасно. Особенно если батарейки некачественные, если их чрезмерно заряжать и пр. Кстати, не любой тип 18650 батареек может давать 20 ампер, надо смотреть бренд, в котором, возможно, меньше ёмкость, зато выше пиковая сила тока.

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

Помогли несколько свежих идей:

1. Чёрт с ним - с продуктивностью на работе - бросить курить важнее. Даже если придётся год без работы посидеть. А за год я уж точно перетерплю. (В последствии оказалось, что потеря продуктивности - это психологический барьер. Достаточно перестать его бояться, и можно вернуть продуктивность. Да, первые две-три недели это особенно трудно, но на четвёртую уже можно, продолжая прикладывать должные усилия. А ещё - чрезвычайно важно смотреть на объективные метрики, т.к. после отказа от никотина сильно растягивается ощущение времени. Тебе кажется, что ты час мучаешься и прокрастинируешь, на самом деле, ты всего 15 минут прокрастинировал и сейчас быренько всё наверстаешь.)

2. Бросание курить это не разовый марш-бросок. Это решение вести борьбю всю оставшуюся жизнь. Да, соблазнов будет меньше, ломка будет, в целом, спадать, но всё равно придётся всегда быть на чеку и иногда терпеть, когда будет хотеться. (Что, в последствии, оказалось правдой.) Я подумал, что довёл себя до достаточно плохого здоровья, что постоянно бороться с ломкой может дать мне сумарно лучшее самочувствие, чем продолжать курить. (Что так и есть).

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

4. Небольшая ломка, возникающая как желание покурить очередную сигарету (ну, или сделать очередную сессию вейпа), ощущается как дискомфорт, напоминающий голод. Что, на самом деле, за 20+ лет курения, почти полностью ассоциировало любые дискомфорты в "желание покурить". Это почти отучило меня распознавать разные сигналы организма о том, что ему надо. Надо заново учиться чувствовать голод, жажду, желание поспать, раздражение в отношении людей, усталость и многое другое. Кроме того, у меня настолько запущенное здоровье в целом, что мне может быть дискомфортно без всякой ломки, просто я привык считать это ломкой и "хотеть курить", а курение действовало как анальгетик. Кстати, об анальгетиках - ибупрофен мне помог перетерпеть самую сильную ломку в первые пару недель. Три таблеточки по 200 мг и я снова человек.

5. Наркотическая зависимость завязана на мотивационный цикл (на гормоны, в нём участвующие), а, значит, завязана на память и на убеждения. Другими словами, с зависимостью трудно бороться "логикой", потому что у тебя обязательно будут убеждения, оправдывающие приём наркотика, без этого никак. У разных людей это могут быть разные убеждения, и чем более умный человек, тем у него это может быть глубже "инсталлировано" в мировоззрение. Он будет принижать вред, находить пользу, принижать важность или срочность и т.п. - всё, что угодно, лишь бы продолжить. Т.е. борьба с зависимостью - это в некотором смысле борьба с собой. Очень трудно чинить "баги" в левом полушарии мозга (в котором система "рациональных" доводов) путём рассуждений, потому что сам механизм рассуждения, способность рассуждать, это тоже прерогатива левого полушария. В нём тоже может быть баг! (Зависимости могут подрывать способность логические мыслить => разрушают личность -- упс, упс!). Помните времена DOS-а, когда вирусы, загружаясь резидентно, перехватывали системные прерывания для работы с файлами, чтобы показывать антивирусу другое содержимое файлов? Чтобы избавиться от вируса, нужна была незаражённая внешняя система - с незавирусованной дискетки, на которой антивирус. Тут похожий эффект. Нужно что-то внешнее. Внешнее - это правое полушарие. Желание, интуиция, плюс решение. Одно твёрдое решение, что ты собираешься это сделать вне зависимости от *каких угодно* доводов против, которые ты потом сможешь найти, просто потому что ты так решил, и потому что ты понимаешь, что зависимость слишком сильно влияет на саму твою способность рассуждать взвешенно на эту тему.

Все эти мысли не разовые. Это как постоянная "инсталляция", из которой ты черпаешь силы и мудрость каждый раз, когда приходит ломка. А она приходит. Время от времени продолжает накатывать. Ломка не становятся мягче, но она становятся всё реже. Если первую неделю ты думаешь о курении 50% времени, то через месяц уже думаешь несколько раз в день по полчаса. А спустя год можешь целую неделю не думать о никотине вообще, а потом вдруг очень сильно хочется и надо перетерпеть 10 острых минут. Я отношусь к этому философски, и меня уже не напрягают такие эпизоды. Они ничем не хуже эпизодов, когда внезапно разболелась голова, или очень хочется есть, или вспомнил что-то очень грустное и надо перетерпеть и вернуть позитивный настрой. Нет ничего плохого в том, чтобы *не всегда* чувствовать себя идеально - это норма жизни (и это ещё одна мысль, помогающая справиться).

Я уже больше года без никотина вообще и три года без курения сигарет. Так что к этому моменту это моя самая результативная инициатива по отказу от никотина.

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

Ещё, кстати, забавный вывод - бросить курить не должно быть рациональным решением. Курильщик принципиально не может (не должен) дойти логикой до возможности отказаться от курения, и даже если ему покажется, что он дошёл, эта рациональная почва будет жидка и легко найдутся другие рациональные соображения, чтобы потом отказаться от этой идеи и вернуться к курению. Если подумать, то желание покурить - это есть дискомфорт, сопровождаемый навязчивыми мыслями, подсказывающими, почему покурить - это хорошая идея. Постоянно отбиваться от рациональных аргументов рациональными контр-аргументами вряд ли получится - скорее, с очередным приходом ломки подсознание найдёт какую-то лазейку, которую не удастся заткнуть. Получается, что можно впечатлиться какими-то выкладками и разумными доводами, но само решение бросить должно быть строго иррациональное, и это решение придётся много раз вспоминать в борьбе с ломкой. "Вы бросаете курить, потому что вы так решили, и больше ни по какой другой причине." Такая формула, как мне кажется, является одним из важнейших ключей к успеху, и мне очень много лет этот момент не был очевиден. (Хоть я и слышал про это раньше.)
moth

Closed-source libraries, really?

В поиске библиотеки, наткнулся на https://www.chilkatsoft.com/.

Чувак пишет сотни полезных библиотек на сотне языков программирования, куда входит реализация различных протоколов и форматов файлов.
Гляньте слева - https://www.example-code.com/cpp/ - там такие вещи, как Amazon S3 и Dropbox стоят рядом с HTTP, SSH, MIME.
А сверху языки программирования.
Прелестно.

Но:
* Чувак продаёт header'ы с бинарниками, шифруя их каким-то unlock кодами (эээ... привет девяностые?)
* Чувак пишет, будто бы среди customer'ов есть Microsoft, Oracle, Intel, Google, US. Dept of Homeland Security, US Senate, Nato, NASA, UN... really? https://www.chilkatsoft.com/customers.asp

Как все эти люди могут *покупать* *бинарники* библиотек?
Это сейчас-то, во времена всякой вирусни-троянщины, ворующей кредитки, и хитрожопых government backdoor'ов, а также опенсорса, который гарантирует защиту от оных?

Неужели он гонит про customers?
Или просто отдельные работники или контракторы перечисленных компаний до такой степени без мозгов, чтобы покупать библиотеку в бинарнике?
moth

Гитарное

Сдела вчера мега-проект. Взял весь свой старый репертуар... почти весь... кроме вещей, которые я разучивал с Юрой, они у меня ещё не отсканены и отдельно лежат, аккуратно распечатал его на тонкой бумаге (эко-тонкая, 80%) с двух сторон и сшил comb binder'ом. Всё то, что раньше влезало в несколько толстенных folders с пластиковыми files, стало одной маленькой книжечкой на 6мм. Иметь всё под рукой создаёт огромную инспирация и желание играть. Поиграл многие старые вещи. Оказывается, что если не играть два года, то не забывается всё. Вернее, забывается, но простые и средние по сложности вещи можно за полчаса восстановить.

moth

Книги, которые "сделали меня мной"

Вот, что навскидку вспомнилось. Наверняка там больше есть всего.

Математика, естествознание:
- Сборник Мартина Гарднера по занимательной математике (штук 15 книжек, они до сих пор у меня все есть).
- Д.Пойа "Как решать задачу" и "Математическое открытие" (и эти книжки есть).
- "Математический энциклопедический словарь" (и даже эта есть).
- Большая Детская Энциклопедия, первые 4 тома (издание из 12 томов) (а это недавно сдал в Goodwill, извините).

Программирование:
- Джордейн, "Справочник персональных компьютеров типа IBM PC, XT и AT" (эту книжку у меня спёрли, но я восстановил).
- Данкан, "Профессиональная работа в MSDOS" (справочник по функционалу INT 21h и многое другое) (эту книжку тоже спёрли, не восстановил; если кто-нибудь мне подарит копию, расцелую; это большая сине-зелёная книга в мягком переплёте с глянцевой обложкой).
- Фигурнов, "IBM PC для пользователя" (читал все первые 6 изданий, книжки не сохранились; расцелую за первые два издания)

Художественная литература:
- Булгаков, "Мастер и Маргарита".
- Соловьёв, "Повесть о Ходже Насреддине".

Туристическое и разное:
- Рига. Атлас туриста. (за период возраста 7-9 лет я купил штук 10 копий, потому что, путешествуя по городу с этим атласом, я быстро убивал его в хлам; недавно удалось купить копию в ностальгических целях)
- Дубровин. Русские фразеологизмы в картинках. (добыл hard-copy, но оно всё есть на сайте http://idioms.chat.ru/ - прекрасное)

Психологическое, organizing, self-help:
- David Allen, "Getting Things Done" (в отличие от многих других книжек этого списка, эту я прочёл уже в зрелом возрасте, после переезда в США).
- Jim Loehr, Tony Schwartz "The Power of Full Engagement" (и эту тоже).

* * *

С математическим энциклопедическим словарём я играл в занимательную игру, которую я сам придумал. Берёшь в руки словарь (он весит пару килограмм). Разбегаешься и прыгаешь с ним на кровать. Начинаешь болтать ногами, лёжа на животе, и улыбаешься в предвкушении. Открываешь на случайной странице. Начинаешь читать случайную статью. Первое же непонятное слово ищешь в этом же словаре, и читаешь статью по нему. В ней - то же самое. По непонятному слову переходишь. Иногда возвращаешься. Для возврата используешь пальцы одной руки (соотв., размер стека для возвратов около 4, больше - труднее). Если совсем тяжело, пытаешься разобраться по другим книжкам. Например, под рукой хорошо бы иметь "Справочник по математике" Бронштейна и Семендяева. Играешь пока не проголодаешься. Если играть в эту игру на протяжении достаточно длительного времени, то в какой-то момент критическая масса статей становится читаемой до конца. Дочитывать статью до конца - это особый, редкий кайф.
moth

Я не граммар-наци

Да и сам делаю ошибки.
Но...
Есть такие ошибки, которые вообще вымораживают, когда слышишь.
Мало того, некоторые ошибки делают мои друзья, в остальном грамотные люди, не подозревающие о своём вопиющем косноязычии.

Слова облЕгчить и углУбить транслировались многоуважаемым господином Горбачёвым по телевизору в конце 80х.
Я сам помню.
Открою горькую правду жизни: не всё, что сходит с телевизора, орфографически корректно.

Правильно: облегчИть, углубИть.

Нашёл в интернетах замечательные стихи, которые позволят запомнить, как правильно:

Чтобы легче было жить,
знания нужно углубИть.

Корабли не смогут плыть –
Канал здесь нужно углубИть.

Надо ранки полечить,
Чтоб страданье облегчИть.

Чтобы верно ударение заучить,
Стихи задачу вам помогут облегчИть.


Полезная миниатюра Задорнова в тему:

star

Письмо себе из прошлого - 1

Тут сейчас модно слать письма себе из прошлого. Конечно, всё это несерьёзно, потому что если бы действительно можно было передать информацию в прошлое, вполне достаточно было бы одной вещи: цена биткоина между июлем 2010 и декабрём 2017 поднимется более, чем в миллион раз.

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

Ладно, поехали:

1. Здоровье, как физическое, так и умственное, это первейший приоритет. Он важнее школы, важнее родителей, важнее всего на свете, и эффект от здорового образа жизни отложенный. Мало того, привычки выработанные в период до 20 лет, очень помогут в возрасте 25-40.

2. Слух не восстанавливается. Зрение восстанавливается с трудом и не всегда. Зубы лечить легко, но очень дорого. Освобождаться от зависимостей очень трудно и дорого.

3. "Не выносить сор из избы" это такая русская поговорка, задуманная чтобы покрывать домашнее насилие и другой беспредел. Потому что если не обсуждать эти вещи с другими людьми открыто, никогда не сможешь определить, где оно "всё ещё нормальное", а где опасный перегиб. Забей на эту поговорку и выноси сор из избы! Особенно важно выносить сор в правоохранительные органы, когда этот сор находится в их компетенции. Прочти все законы как только в достаточной мере научишься читать.

Похоже у меня тут много идей. Даже из того, что вот так сходу записывается уже больше десятка "сообщений". Так что разобью тему на серию постов, по нескольку сообщений в каждом - легче будет обсуждать.
star

Детская радость

Мне удалось запустить MessageBox!

Untitled


...из Scala :)

Потратил весь вечер.

Сначала я погуглил, как вызывают нейтив код из Java/Scala. Есть JNA и JNI. Первый удобнее, последний на пару порядоков быстрее. Десятичных порядков. Конечно, мне захотелось то, что быстрее.

Потом я долго разбирался с JNI. У меня наотрез отказывался загрузиться USER32.DLL, он его типа не может найти. Думал, что C:\Windows\System32 не в путях. Мне не хотелось добавлять путь аргументы JVM - целый час искал, как прописать его в путях через рантайм. Нашёл один грязный хак. Но он не работал... Потом плюнул и решил добавить аргументы в build.sbt. Они тоже не работали. Потом выяснилось, что и аргументы JVM, указанные напрямую, не работают. Оказалось, что System.LoadLibrary нужно давать просто имя библиотеки, USER32, без .DLL.

Потом оказалось, что JNI так просто не работает. Нельзя написать заголовок функции, объявить его @native, подгрузить библиотеку и пошлó. Нет, не пошлó! Оказывается, JNI работает только если написать специальный враппер на плюсах. Тут я схватился за голову, и решил пожертвовать перформансом ради удобства. Чёрт с ним, пусть будет JNA.

JNA - красавчик, и на нём можно писать примерно такой или такой код. Пришлось потрахаться с настройками SBT, потому что com.sun.jna.platform.win32 в упор не хотел импортироваться, не смотря на то, что com.sun.jna подлинкован правильно. Оказалось, что он лежит не в com.sun.jna, а в "net.java.dev.jna" % "jna-platform".

В общем, можно написать import com.sun.jna.platform.win32.User32.{ INSTANCE => User32 }, и там в User32 всё будет, все интерфейсы как часть уже нативной для Скалы библиотеки, со скаловскими объектами Pointer, HWND, WString... Но тут очередной облом. Именно MessageBox туда не включён. Но, на счастье, JNA позволяет подгружать библиотеку и генерить скалавский прокси динамически (теперь понятно, почему он медленный!). Примеры, конечно же, только на Java, потому, видимо, я первый извращенец, вызывающий WinAPI на Scala. Пришлось ещё ломать голову, как эти примеры переводить на человеческий язык. То бишь, скалавский. Конечный результат выглядит примерно так:
package dima.apps
import com.sun.jna.{ Library, Native, WString }
object Example {
  trait u32 extends Library {
    def MessageBoxW(whnd: Int, text: WString, caption: WString, flags: Int)
  }
  def main(args: Array[String]): Unit = {
    val lib = Native.loadLibrary("user32", classOf[u32]).asInstanceOf[u32]
    lib.MessageBoxW(0, new WString("Test"), new WString("Test"), 0)
  }
}
Ну и ещё две строчки в build.sbt:
libraryDependencies += "com.sun.jna" % "jna" % "3.0.9"
libraryDependencies += "net.java.dev.jna" % "jna-platform" % "4.5.1"
Ура!
moth

Программирование, очерк об утилитах и их разработке, в историческом разрезе

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

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

Пытался понять, по какой причине у меня затык. Нарисовалось следующее:

1. Всё-таки взрослый человек, нет времени. Есть работа, есть всякие хобби, есть жена, дети, мама и всякие ответственности. Годно? С натяжкой. Времени-то оно не так много отнимает.

2. Технологии рванули вперёд, а по работе я углубился в бэкэнд. Сначала в бэкэнд для юзеров, потом в бэкэнд для других разработчиков. Сейчас вот работаю в группе, которая делает движки/фреймворки для разработчиков бэкэнда, пользователями которого являются рабоработчики бэкэнда application layer'а, и где-то через несколько этажей от этого всего находятся пользователи, которые нормальные люди. В общем, я забурился максимально далеко от того, чтобы делать софт для людей. Утилиты это всё-таки софт для людей. Даже если это чисто для себя, там нужен какой-то гуй, или хотя бы удобный CLI, там нужно думать о юс-кейсах. Думать о том, чтобы такое написать, чтобы оно не протухло со временем, но при этом было полезным, и всё такое прочее.

3. Я, с одной стороны, застрял на Винде, с другой стороны, плотно врос в пользователи Юниксов. К полезному софту повышаются требования - хочется портабельности. Что-то непортабельное писать прям противно. А как подумаешь о портабельности, так сразу всё сложно-сложно. К тому же ещё и тормознуто, и отвратительно с виду.

4. Надвигаются мобильные девайсы, а это совсем другой технологический стек. Лениво и нет времени его учить. Есть одна лазейка: это web. Но web-приложения сильно ограничены, особенно их интеграция с desktop'ом.

5. Надвигаются cloud-сервисы и cloud-storage. Проблемы, скажем, с организацией файлов, как бы те же, но сражаться с ними нужно уже на другом поле битвы.

6. Ну и технологии... в старые добрые времена многие вещи можно было писать под DOS, даже если они для Винды. Под DOS это Borland Pascal, замечательный своей простотой и скоростью разработки. Встроенных библиотек настолько мало, что всё, что нужно, можно знать наизусть. Можно херачить код без help'а. Открываешь и пишешь. IDE запускается за секунду со всеми наворотами, окнами, отладчиком и всем чем хочешь. Компилируется всё за десятки миллисекунд, лишь самые сложные вещи требуют одной или даже пары секунд. Впрочем, модули можно откомпилировать отдельно и использовать TPU, тогда всё опять со свистом. За менее, чем секунду, можно сделать полностью самодостаточный standalone EXE-шник. Все эти удобства и скорости - это огромная стимуляция творчества, потому что мозг может быть 99% времени занят задачей, а не настройками build environment, поиском багов в dependencies, ожиданием билда и прочим геморроем. На смену Borland Pascal, пришёл Delphi и Visual Studio, которые хоть и затрудняли разработку (теперь проект это не один-два файла, а директория с поддиректориями, с кучей всякого перманентного и промежуточного говна), но всё-таки после изначальной настройки работали быстро. Инкрементальные улучшения в софт можно было вносить за секунды и всё перебилживать.

А вот дальше - всё это умерло. Заниматься софтом для людей стало неинтересно. Дотнет был немеренной тормознёй, кроме того, требовавшей установки рантайма. Невозможно было скопировать куда-то тулу, нужно было делать к ней инсталлер или давать инструкции, вот, установи фреймворк такой-то версии. Нет, вот эту оставь тоже. А вот эту снеси. Ну не ужас ли? Visual Studio как бы разделился на два направления - .NET-овое пошло по стопам Дельфей, где "всё в одном" и визуальный редактор форм, но при этом без 3rd-party копмонент, т.е. всё глубоко завязано на M$-овские технологии. C++-е направление VS не развилось вообще никуда, потому что слил позиции под напором библиотек. Зачем делать что-то своё, если есть QT, который лучше прямого GDI программинга?

Вот, кстати, про библиотеки... это ещё один интересный момент истории. Программерское сообщество заболело вирусом "DRY". Есть такой принцип, don't repeat yourself. Это очень важный принцип, без которого можно с лёгкостью писать несопровождаемый говнокод. Но религия преклонения этому принципу перетянула в другую сторону: повторяться вот настолько прям нельзя, что каждая маленькая хрень это отдельная библиотека, и теперь внутри отдельно взятой библиотеки царит красота и порядок, а любой проект состоит из говнокучи хитросплетений зависимостей между сотнями этих библиотек. Мне временами кажется, что программистам теперь платят не за способность написать хороший код, а за способность не утонуть в этом болоте из мини-модулей, каждый из которых живёт какой-то своей жизнью. С каждым апдейтом он ломает сотню соседей, и главное, что любая система, собирающее все эти сопли воедино, обязательно требует, чтобы в конечном соплепродукте каждая сопля входила ровно по одному разу, одной своей версией (ну, DRY же!). Сопли ломаются не зависимо друг от друга, continuous deployment'ы и прочие продвинутые дев-процессы ускоряют скорость выкатывания новых багов, баги требуют апгрейда соплей, апгрейд одной сопли требует заапрейдить два десятка других (новая сопля уже не совместима с прежними версиями, вы чо, уже ж целый месяц прошёл! innovation, ёпть!), когда апгрейдишь эти другие сопли, соответственно, подтаскиваешь их свежие баги... в конце концов, понимаешь, что все эти идеи о компонентности яйца выеденного не стоят, копируешь сырцы библиотеки в поддиректорию своего проекта, чинишь там ровно те баги, про которые ты знаешь, и, наконец, можешь пописать свой код, пока вокруг ничего снова не сломалось. Кстати, самые ярые приверженцы принципа DRY это, как правило, fresh grad'ы. Они ещё не понимают, что такое инкапсуляция и компонентизация, но уже понимают, что нельзя повторяться. Поэтому там где есть хоть какое-то повторение, у них 10 уровней абстракции, чтобы не дай Б. ни строчка не повторилась, а там где повторения нет, у них функции на 300 строк по вертикали и 150 позиций по горизонтали. Можно же разбить на логические задачи, но "разделение обязанностей" это видимо, более продвинутый design pattern, чем DRY, до него не все доходят головой.

К сожалению, DRY-мания победила, и к сегодняшнему дню полсотни библиотек для того, чтобы напечатать Hello, World! это уже в порядке вещей. Единственное, что радует, это то, что скорость интернета и объёмы дисков растут немножко быстрее, чем способность community выносить полезные повторяющиеся куски кода в отдельные сопле-пакеты, и сегодня с этим уже можно жить.

Тут недавно был хороший вброс в useless_faq на тему почему современный софт такой тормозной и жирный, когда делает, в принципе, то же самое:
https://useless-faq.livejournal.com/15477816.html
Полезные библиотеки это оно.

В защиту библиотек надо сказать, что они таки повышают производительность труда, потому что решают все эти сложности, которые преподносит современный мир. И многообразие онлайн сервисов, сетевых протоколов, файловых форматов, многопоточность, датацентры, всякие новые технологии, алгоритмы и подходы. Я думаю, последние 10 лет происходил процесс постепенного повышения качества опенсорсных библиотек до того уровня, что если раньше "писать своё" это было competitive, то сегодня писать своё это в большинстве случаев глупость, а competitive - это писать бизнес-логику, умело используя имеющиеся библиотеки. Ну или же писать своё, но на совсем низком уровне, где знания архитектуры процессора и девайсов доминируют. Впрочем, даже "там" появляется всё больше универсальных фреймфорков, и все эти фреймфорки смело вплетаются в сопливую сеть зависимостей от других готовых компонент.

Одновременно с этим, разные технологии, которые я лично считал тормознёй, перестали ею быть. Отчасти потому что железо стало побыстрее, а отчасти потому что их оптимизировали разработчики в процессе эволюции продукта. Для веба - JavaScript. Он стал очень достойным по скорости. Для не-веба - Java. Опять же, во многих задачах, и если умело пользоваться, порядок скоростей может быть такой же, как у C++. А разрабатывать на порядок быстрее и на полтора-два порядка дешевле. C++ видоизменился таким образом, что совмещает идею "язык способен максимально полно использовать возможности процессора" с примитивами функционального программирования и другими прогрессивными штуками. Сегодня уже никто не будет писать свой смартпоинтер, а 10-15 лет назад это было модно, потому что язык был не достаточно мощным.

Ладно, к чему же это я...
Я, вот, решил попробовать Java, или даже нет... Scala (!) в качестве подручного языка для утилит, посмотреть, могу ли я вернуться к этому благому делу, в плане которого у меня накопилось уже много интересных идей. Причём попробовать настроить всё под виндой, но, понятно, с заделом на портабельность.

Для начала я решил взять тривиальную утилиту из очень старых, которая у меня была и всё ещё работала, это CRC.exe. Даёшь ей имя одного файла, она его всасывает и выплёвывает стандартный CRC32 хэш. Полезная утилитка для сравнения больших файлов, проверки integrity, а также как составная часть более сложных задач: например, задача найти дубликаты файлов на диске может состоять из составления списка файлов, их размеров и хэшей, а потом уже по этим трём параметрам можно группировать и что-то делать с группами.

CRC.exe занимает 22 килобайта. Работает 75 миллисекунд на 14-MB файле (из которых 20 мс - overhead на запуск EXE-шника, а 55 мс - сама работа) и 9.5 секунд на 2.25-GB файле. Я помню, что он был написан на Дельфях, без ассемблерных вставок, но с хорошо оптимизированным кодом, я там вычислял полезную look-up таблицу. Я сравнивал с имеющимися на тот момент другими библиотеками и утилитами, и моя работала без заметного замедления. В чистом виде именно на посчитать CRC у меня ушло тогда пару дней трудов, но я помню, что игрался с этим неделю, потому что я решал родственные задачи. Например:
- какие 4 байта прописать в указанное место в файле, чтобы его CRC стал равен заданному,
- какие 4 байта прописать в указанное место в файле, чтобы его CRC стал равен этим 4 байтам,
- решил общую задачу - заданы позиции отдельных битов, которых не менее 32, определить, можно ли подкрутить их так, чтобы получить заданный CRC, и если да, то подкрутить. Если биты идут подряд, то они всегда линейно независимы, а если не подряд, то не всегда. Частный случай этой задачи - это подкрутить 8 байт таким образом, чтобы они образовывали ASCII hex-репрезентацию от CRC файла, но если честно, я не помню, был ли там всегда успешный результат... кажется, был,
- ещё помню задачу, как из CRC отдельных последовательных кусков быстро составить CRC всего куска. Там можно за O(log(n)) посчитать CRC от массива нулей такой же длины как первый кусок, и потом выполнить несколько O(1) операций, чтобы совместить. Эта задача даёт возможность, скажем, рекурсивно зачитать директорию, посчитать CRC отдельных файлов, не важно, в каком порядке, потом отсортировать, и быстро посчитать CRC от массива, как будто все эти файлы были склеены. Это позволяет быстро определить, идентичны ли две директории.
Но это лирическое отступление, просто чтобы продемонстрировать, что даже такие забитые задачи как подсчёт CRC могут быть весёлым развлечением на неделю1. Впрочем, даже если скомпилировать все эти навороты, вряд ли они бы сильно увеличили размер EXE-шника. Может, было бы не 22 килобайта, а 24.

CRC.exe, сделанный на Scala, занял 11 мегабайт. Работал 800 миллисекунд на 14-MB файле (из которых 785 мс - overhead на запуск EXE-шника, а 15 мс - сама работа) и 2.2 секунды на 2.25-GB файле (соответственно, 785 мс - overhead на запуск, и 1.4 секунды сама работа, в 6.7 раз быстрее!). Вся работа заняла 7 часов. Из них:

*) Один час - установка и настройка IntelliJ IDEA + Scala + JDK, чтобы оно вообще могло откомпилировать пустой проект и "Hello, World!".

*) *Одна минута* - решение задачи с CRC "в лоб" (засасываем весь файл в Array[Byte] и используем java.util.zip.CRC32), порядка 5 строк.

*) *Две минуты* - улучшенное решение (читаем файл блоками по 64K, обновляя бегущий хэш походу дела), порядка 10 строк. Но нужно было добавить параметры командной строки. Для этого нужен парсер. Для этого нужна библиотека. Я быстро понял, что нужен scopt, но как его заполучить?

*) Три часа - выбор способов, как закачивать библиотеки в IntelliJ, выбор между SBT и Maven в пользу SBT (выбирал, что проще настроить), много секса с SBT, чтобы заработало хоть что-нибудь. Ребята прикололись и в документации SBT написали, что, типа, если ты очень-очень спешишь, то прочти хотя бы вот эти три главы, типа, гайд для идиотов, базовые концепты. Но мы не гарантируем, что тебе этого хватит. Я попробовал прочесть базовые концепты для идиотов, понял, что я идиот утону и за сегодня не закончу, а читать весь гайд мне вообще влом, поэтому разбирался сам, как полагается, об коленку и с моими верными друзьями по имени StackOverflow и StackExchange.

*) Час - поиск библиотеки для logging-а, выбор между log4j и slf4j в пользу log4j (опять же, на халяву выбрал), много секса, чтобы всё заработало. Интернет замусорен советами для первой версии log4j, которая существенно отличается от второй (log4j2).

*) Полтора часа - поиск возможности сбилдить Jar, а также, самое главное - Jar Jar'ов. Т.е. упаковать все dependencies в одном Jar'е, чтобы получить самодостаточный пакет, который можно копировать на другие компьютеры. Если на компьютере должен быть Java runtime (JRE8), это ещё куда ни шло, но я-то уже использую кучу библиотек! И одна строчка логгинга (время засечь), и парсинг аргументов командной строки (имя файла и параметр -v чтобы печатать время). Это ж огого! :) В результате обильного секса, мне удалось настроить плагин sbt-assembly.

*) Полчаса - выбор инструмента для создания EXE-шника. Перебрал и опробовал три варианта (exe4j, nsis, launch4j), больше всего подошёл launch4j. Размер это почти не увеличило, что JAR 11MB, что EXE 11MB, но зато удобство, что не нужно отдельно иметь JAR, а отдельно CMD-файл для его запуска, теперь всё в одном. Время запуска одинаковое, что напрямую java.exe -jar путь-к-JAR, что через EXE wrapper.

Отдельно отмечу, что SBT скачал 200 MB вспомогательных библиотек в репозиторий (user-profile/.ivy2/cache/...), там 37 пакетов, всё это dependencies тех 4 пакетов, которые мне были нужны. Кстати, 5-й пришлось добавить, чтобы разрулить конфликт версий (разным соплям нужны разные версии неких одноимённых соплей, так что... выбираем соплю поновее и молимся, что она обратно совместима с соплёй на 3 минорных версии старше неё).
Кстати, а что внутри этого 11-мегабайтного JAR-а? Внутри него:
- 20 KB - откомпилированная версия тех 3 KB исходников, которые я написал,
- 165 KB - модуль scopt,
- 4466 KB - org.apache.logging.log4j - чтобы вывести одну строчку в лог, как видите, нужно тащить 5 MB говна,
- 22 MB - scala. Да, конечно, scala не входит в JRE, с точки зрения Java это просто ещё одна библиотека. Но если делать standalone утилиты, то в каждую из них придётся запихивать всю скАлу целиком. А вы что думали? Теперь понятно, почему софт стал таким большим и так неповоротливо запускается? На самом деле, JRE занимает ещё 180 MB, и часть его тоже подгружается при запуске любой Java программы, отсюда и эти 800 мс на запуск...

Мне кажется, этот пример как бы резюмирует, в какую сторону оно всё повернулось:
- Скорость разработки таки увеличилась. Было два дня (когда-то давно), стал один (сегодня). Библиотеки рулят.
- Скорость работы алгоритма тоже заметно увеличилась, не смотря на то, что язык интерпретируемый, а не компилируемый. Библиотеки дважды рулят!
- Скорость начального запуска уменьшилась до borderline-приемлемого. Впрочем, это улучшение, раньше то же самое заняло бы много секунд.
- Время на саму "соль" программы несоизмеримо (на два порядка!) меньше, чем время на геморрой с соплепакетами и с системой, которая призвана приструнить растекание соплей в адский кисель.

Попробую потом с этим поиграться ещё. Мне кажется, что есть шанс, что overhead будет постепенно уменьшаться, по мере накопления опыта и уже скаченных библиотек. Отдельно интересно, можно ли снизить время первого старта (800 мс) без ущерба удобства, что всё в одном файле? Подозреваю, что если писать на чистой джаве, без скалы, может быть лучше. С другой стороны, это ж я только две сторонние библиотеки подключил. А что будет, когда я их подключу два десятка?..

_____
1 кстати, если решить те же задачи для md5, то можно стать очень богатым или очень известным человеком.