Мой личный бложек. Пишу о жизни в Чехии, программировании и просто свои мысли обо всём. Пишу не часто.

 
Бляха, у WebSocket длина пакета хранится в big endian
Заметки не программиста
Ну хоть бы в одной документации об этом было сказано.
2 часа ушло на то, чтобы понять почему пакет не читается, хотя судя по дампу данных он приходил.
0
Delphi жив или мёртв?
Заметки не программиста
Скорее мёртв, чем жив. Он ещё используется в некоторых проектах, которые были написаны лет 20 назад, но и их со временем переписывают на другие языки.

Delphi был хорош отличным редактором форм, большим набором стандартных компонент и возможностью сделать очень быстро оконное приложение.
Lazarus/FreePascal - бесплатная opensource версия Delphi, теже возможности, но с кроссплатформенностью. Код без проблем компилируется на linux.

Меня бесит сам язык Pascal, я сторонник си-подобного синтаксиса. Вот если бы кто-нибудь заменил в Lazarus'е синтаксис на С++/D, оставив при этом всё остальное, то этот язык имел бы шансы на существование.
0
Что лучше C++ или D?
Заметки не программиста
C++ гораздо стабильнее и проверен временем.
В D синтаксис лучше, но есть баги и множество недоработок.

Вот если бы кто-нибудь объединил эти 2 языка, взяв синтаксис D и стабильность C++. Но это вряд ли, так что для серьёзных проектов по прежнему лучше C++.
0
C# хороший или плохой язык?
Заметки не программиста
Минусы:
Не кроссплатформенный, только для Windows. Да и то, чтобы установить написанную на нём программу надо пользователю установить .net framework, нормально работает только в Win 10, в более старых версиях может стоять старая версия .net framework и придётся объяснять пользователю как всё настроить, либо придётся делать инсталлятор, который это исправит.
Но есть же .net core и он работает в linux. Таки да есть, но работают только консольные программы, и для запуска надо ставить .net core на компьютер. Да и для консольных приложений в linux есть свои языки программирования, которые с этой задачей справятся лучше.

Медленный, потому что специальный байт-код, а  не в двоичный код процессора, любой более-менее сложный алгоритм на том же C или D работает быстрее.

Объектно ориентированное программирование, со своим зоопарком, которое не во всех проектах то и нужно. Иногда для простого проекта разработчики делают интерфейсы, потом по ним классы, потом наследники классов, потом фабрику классов, когда на деле нужен всего 1 класс со статическими глобальными переменными. У меня был проект из 20 с лишним файлов, стал оптимизировать и всё уменьшилось до 2х небольших файлов, код стал проще и понятнее.

Конфиги на xml, нет ну серьёзно? В 21 веке использовать xml, когда все нормальные языки используют json.

WPF это просто ёбаный пиздец, сложный для понимания, логика работы оч странная. Простое приложение жрёт память и процессор. Хотя в целом выглядит красиво. Мне кажется лучше встроить CLSID_WebBrowser в окно WinForms и верстать внешний вид окна как html-страницу, в этом случае памяти расходуется меньше, работает быстрее и не нужен специально обученный разработчик. html знает любой разработчик.

Entity framework - задумка неплохая, но пользы от него мало.

Тотальное помешательство на Model-View-Controller. Который хорош только как сферический конь в вакууме, но на практике есть куча исключений. Моё мнение лучше на этом вообще не заморачиваться, а делать так как лучше для конкретной задачи.

Тотальный похуизм на оптимизацию кода. Главное навернуть посложнее чтобы солиднее выглядело а не работало быстро. Разработчики стесняются что-ли писать короткий код.

unittest'ы мягко говоря не оч. В том же D они гораздо гармоничнее вписываются в код.

Плюсы:
Удобнее чем Java, ну лично мне так кажется. Достаточно неплохой синтаксис, хотя и местами не идеальный.

Его изучают в университетах, поэтому найти разработчиков на C# не сложно.

WinForms программы прилично выглядят, и удобнее программировать чем на c + winapi. Есть редактор форм. Оконное приложение можно достаточно быстро сделать.

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

Множество готовых пакетов и модулей под любые нужды.

Вывод:
Неплохо подходит для разработки Desktop-приложений не требующих большой скорости работы для использования в офисе. Также подходит для веб-приложений не работающих с большой нагрузкой, типа сайтов магазинов и фирм. Т.е. для тех случаев когда приложение устанавливает специально обученный админ, а пользователь просто пользуется. Для всего остального лучше использовать другие языки.
0
string ~ int
Заметки не программиста
Lang:
int x = 0; string s = "Hello world " ~ x;


Вот этот код не выдаёт ошибки, к строке добавляется 0, как символ с кодом 0.
Иногда можно забыть поставить x.to!string, компилятор мог бы хотя бы выдать warning, но нет.
0
Грёбаный garbage collector в D
Заметки не программиста
Оказывается garbage collector в D на posix системах занимает сигналы SIGUSR1 и SIGUSR2 для своих нужд, нахрена??? Зачем занимать самые нужные сигналы???
Если программа установит свой обработчик на эти сигналы, то сборка мусора перестанет работать. Вместо них приходится использовать сигналы core.sys.posix.signal.SIGRTMINcore.sys.posix.signal.SIGRTMIN + 1 и т.д.
0
enum статический массив работает быстрее, чем enum динамический массив
Заметки не программиста
Lang:
enum ubyte[8] bits_mask = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80];
работает раза в 3-4 быстрее чем
enum ubyte[] bits_mask = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80];


Интересно почему?
По идее оба массива константы, оба должны представляться в памяти как статические массивы, т.к. размер константы изменять нельзя. Но нет
0
foreach, opApply и return в D
Заметки не программиста
Lang:
struct Test
{
struct Item
{
bool x;
}
Item[] items;

@trusted int opApply(scope int delegate(ref Item[]) dg)
{
for (size_t i = 0; i < this.items.length; i++)
{
if (dg(this.items[i])) return 1;
}
return 0;
}
}

bool test(ref Test[] test)
{
foreach (ref item; test)
{
  if (item.x) return true; // !!! этот код не выходит из процедуры
}
return false;
}


В D есть замечательный оператор opApply перегрузив который можно реализовать foreach для структуры. И всё было бы просто супер, если бы не особенность реализации. Компилятор транслирует цикл foreach в вызов оператора opApply с делегатом, и "return" внутри foreach делает выход из делегата.
Компилятор при этом никак не ругается на такой return считая его валидным, что сильно затрудняет отладку программы.
0
Грёбаный garbage collector в D
Заметки не программиста
Lang:
struct Test
{
private void *ptr;

void start(size_t mem_sz)
{
this._ptr = GC.calloc(mem_sz, GC.BlkAttr.NO_MOVE | GC.BlkAttr.NO_SCAN | GC.BlkAttr.APPENDABLE);
}

@trusted ~this()
{
if (this._ptr)
{
GC.free(this._ptr);
}
}
}


Казалось бы хороший код, при выходе из scope вызывается деструктор структуры и очищает память. Но нет! Грёбаный garbage collector в D игнорирует GC.free, если он вызывается из деструктора. А аттрибут GC.BlkAttr.NO_SCAN не даёт автоматически очистить память. В результате происходит утечка памяти. Компилятор мог бы выдавать какой-нибудь warning при попытке использовать GC.free в деструкторе, но нет.

Решение:
заменить функции GC.calloc -> pureCalloc и GC.free -> pureFree
0
~ или Appender?
Заметки не программиста
Lang:
string s;
for (size_t i = 0; i < 1000; i++)
{
s += 'x';
}

// или
Appender!string s;
s.reserve(1000);
for (size_t i = 0; i < 1000; i++)
{
s += 'x';
}


Я сравниваю не appender из phobos, а Appender из нашего фреймворка, он немного отличается.

Сторонники Appender'а аргументируют выбор, тем что он реже вызывает GC.alloc, а если размер памяти заранее известен, то память выделяется 1 раз при вызове reserve(). Однако, массивы в D (и тип string в том числе) имеют свойство .capacity, и если его вывести на экран, то видно что массив тоже увеличивает свою память не на +1, а блоками, так что GC.alloc тоже не каждый раз вызывается.

Моё мнение:
Для небольших массивов <256KB разница в скорости особо не заметна, к тому же конкатенация генерирует меньше кода, чем использование Appender. Да и GC.alloc работает достаточно быстро.

Appender стоит использовать в буфферах чтения/записи, когда происходит очень интенсивный обмен данными. А также на больших объёмах данных >=256KB.
0
Стоит ли валить в Чехию?
Заметки не программиста
В этом году точно не получится, т.к. коронавирус и границы закрыты. Но я буду рассматривать чехию до коронавируса.

Как турист
Хотя бы 1 раз в жизни слетать посмотреть. Билеты стоят относительно недорого, визу делают за 3-5 дней. Имея 100-150тыс руб можно неплохо двоём отдохнуть. В туристических местах многие говорят по русски, во многих магазинах есть русскоговорящие продавщицы (в основном украинки).
Что посмотреть? Прага, очень много интересных мест, Карловы Вары, Чески Крумлов. Цены не сильно дороже российских.


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

Цены
На еду и одежду не сильно отличаются от российских, что-то немного дешевле, что-то немного дороже. Транспорт - если покупать билет, то около 70руб на 1 час поездки. Но, если покупать годовой проездной, то получается дёшево, около 10тыс руб в год. Самое дорогое это жильё - аренда квартиры стоит около 40-50тыс руб в месяц, это сравнимо с ценами в Москве, но заметно выше цен в регионах.

Пиво - действительно ли в Чехии вкуснее?
Это миф. Обычное пиво в чешском магазине ничем не отличается от обычного пива в России.
В России очень много магазинчиков, продающих пиво на разлив, и часто оно достаточно хорошее и вкусное. В чехии таких магазинчиков нет, вообще. Пиво на разлив можно купить только в баре или ресторане. Очень много крафтовых мини-пивоварен прямо при ресторане, тут же варят и тут же наливают. Вот оно вкусное. Но опять таки крафтовое пиво и в России вкусное.
Так что пиво это не повод переезжать, пиво можно и в России попить.

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

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

Однако стоит отъехать подальше от центра и тишина, все спят, всё спокойно.

Чешский язык
Да в нём много слов, которые звучат и в русском и в чешском одинаково и имеют одинаковый смысл. Да там живёт много русскоговорящих, сваливших туда в 90ые и в начале 2000ых (когда ещё было легко свалить), причём украинцев там больше, чем русских. Для туриста это идеально, в любом ресторане тебя поймут. Но, если, например, надо сходить за какой-нибудь справкой, бумажкой или в нетуристическое место, то там тебя уже не поймут.
Если решил валить в Чехию - надо учить язык и не по туристическому разговорнику, а хорошо учить. В России почти нет курсов чешского языка, может где-то в Москве можно найти, а в регионах вряд ли. И тут 2 варианта, либо репетитор по скайпу, желательно чех. Либо ехать в чехию на 1 год и изучать язык там. Удовольствие не дешёвое, стоит около 300-500тыс руб + проживание.
Можно ли переехать без знания языка и учить уже на месте общаясь с людьми? У меня так не получилось. Первый раз я приезжал в Чехию на 3 месяца думал буду общаться выучу язык, но как общаться? Типа подходить к прохожим и говорить: "Драсьте, я Вася давате пообщаемся?" В итоге получилось лишь с соседями иногда парой слов перекидываться и всё.

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

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

Программистам и экономистам проще, в Праге очень много русских IT и финансовых компаний, в которых как правило почти все русские работают. Но есть и минус, в этих компаниях чаще всего всё как в россии, в плохом смысле. Но на первое время не самый плохой вариант. Чешские компании тоже берут русских, не так охотно, но берут.

Оформляя рабочую визу ты будешь привязан к месту работы, до тех пор пока не получишь ПМЖ. Нет сменить работу можно, но после увольнения у тебя есть всего 2 месяца, чтобы найти новую (насчёт срока я не уверен, может и не 2 месяца, может меньше). Причём за это время надо не просто найти новую работу, а чтобы новый работодатель заново доказал что местным чехам эта работа не подходит, и он вынужден взять иностранца, это занимает 30 дней, но с учётом всей бюрократии обычно 1.5 - 2 месяца. Т.е. получается что новую работу ты должен найти заранее, ещё работая на старой. И это ещё не всё, за эти 2 месяца ты должен только подать заявление на смену места работы, в идеале его рассматривают за 2-3 недели и в случае положительного ответа переходишь на новую работу. Одному моему знакомому рассматривали аж 3 месяца, и им было похуй что он без зарплаты сидит и что ему за квартиру надо платить. Пособие по безработице иммигратам не платят, это же не Германия.
Но в любом случае люди как-то же решают эти проблемы.

ПМЖ
До получения ПМЖ (трвалы побыт) надо прожить в стране 5 лет, всё это время надо каждый год или даже каждые полгода (смотря какая виза) ходить в миграционную службу и продлеваться, причём делать это заранее и своевременно. Если не так заполнил бланк, твои проблемы. Бывает что их сотрудник может тебе посоветовать как заполнять бланки. Иногда это хороший совет, а иногда они какую-нибудь херню советуют и они за это ответственности не несут. Так что лучше чтобы бланк помогал заполнять тот кто знает как заполнять.
Заявление на продление рассматривают 2-3 месяца, но бывает и дольше, бывали случаи когда рассматривали 6-8 месяцев и всё это время вместо визы ходишь со справкой, с которой не можешь выехать даже в соседнюю страну евросоюза. Можно конечно вклеить временную визу, но это тоже геморой и не всегда её вклеивают.
Но после получения ПМЖ это всё заканчивается и больше не надо каждый год продлеваться, ты больше не привязан к своему типу визы. Просто живёшь в своё удовольствие.

А кому ты там нужен?
Да я и в России никому особо не нужен? Государству похуй на тебя, что в России, что в Чехии. Просто там немного комфортнее.

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

Также при устройстве на работу в чешскую фирму можно встретить менеджера русофоба, который на собеседовании будет прямо говорить что русские им тут не нужны и всё такое. Просто берёте и уходите с собеседования нахрен такая фирма не нужна.

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

Футбольные фанаты
Если до или после матча проезжать рядом со стадионом, то набивается целый трамвай фанатов, орут свои кричалки, немного страшновато, но они в целом не агрессивные, просто радуются игре.

Геи
Кстати, не смотря на разрешённые браки, их тут особо не видно. 1 раз в году выходят на свой парад, а в остальное время их незаметно. Для сравнения в той же Москве я их видел гораздо в большем количестве на улице.

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

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

Сдавать бутылки это норма
1 пивная бутылка - 10руб. Поэтому бутылки тут никто не выкидывает, а собирают в большие пакеты, а потом относят в ближайший супермаркет где есть автомат для приёмки бутылок. Засовываешь бутылки, автомат выдаёт талончик на стоимость бутылок, которым потом на кассе можно рассчитаться как деньгами.
Как-то после пивного фестиваля я ходил с мешком и собирал бутылки, прилично так насобирал что хватило и покушать купить и на пиво.

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

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

Однажды мне довелось попасть в больницу, что-то нехорошее вечером съел и ночью скрутило желудок. И как назло у меня закончились запасы активированного угля, а ночью аптеки не работают. Страховка у меня была хорошая, полноценная, всё покрывает. Приехал на такси в больницу. Уже еле иду, мне хреново, говорю медсестре, помираю спасайте. Она такая - ложитесь в зал ожидания и ждите своей очереди, вот вам номерочек как увидите на табло врач вас примет. Я лежу, 5 минут, 10 минут врача нет, 20 минут, потом привезли какого-то деда, похоже сердце прихватило (но это не точно), его прямо на носилках оставили в зале ожидания тоже с номерком. Мне всё хуже и хуже, думаю если ничего не сделать то я сейчас кони двину. Прошёлся по корридору, увидел аптеку, открыта, ночью. Купил 2 пачки активированного угля, минералку и выпил всё это. Вроде полегчало, но врача всё нет. Потом весь этот уголь пошёл обратно, еле до туалета добежал. Стою блюю, а струя чёрного цвета, мимо проходил мужик подумал, наверное, что из меня демон выходит, жутко выглядело. Ну короч меня отпустило, сижу уже на веселе, смотрю доктор наконец-то деда принял спустя час. Потом меня принял спустя столько времени. Ну я ему говорю что мол выпил уголь, проблевался полегчало. Он взял кровь на анализ, ничо не нашёл. Поставил капельницу, выписал справку, до свидания. Больничка кстати неплохая в плане оборудования, да и доктор норм, но как мне потом сказали у них нехватка врачей, поэтому доктор всех принять не успевает.

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

Стоматология - достаточно дорогая, студенческая виза её не покрывает, рабочая покрывает но не все услуги, что-то всё равно придётся оплачивать из своего кармана. Поэтому выгоднее лечить зубы в России.

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

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

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

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

Зима
Её тут нет, ну почти нет. Снег выпадает обычно в конце декабря под новый год и в лучшем случае держится до конца января. Бывает вообще зима без снега с плюсовой температурой. Правда одна зима была холодной, аж -10 градусов, все местные мёрзли, а я пошёл гулять и мне было норм.

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

Интернет
Стоит дороже, в среднем 1500руб в месяц. Бывает 2х видов: ADSL - через телефонную линию, и xDSL - через кабельное тв. Скорость не особо большая, обычно 25-40Мбит/сек, но если повезёт могут и до 300Мбит/сек провести. Также если повезёт, то в доме может проходить домовая сеть (в России раньше тоже такие были), стоит дешевле раза 2-3, и скорость 100Мбит/сек.

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

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

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

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

Пикники и загар
Тут вообще норма если люди стелят плед на траве и устраивают пикник, или просто ложатся и загорают прямо в городе.

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

Зайчики
Таки да прямо по городу бегают зайчики, настоящие. Никого не боятся.

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

Собаки
Местные все держат собак, почти в каждой семье есть собака. Но при этом они не агрессивные, я не видел чтобы на людей кидались. Да и вид у них достаточно добрый. А вот котов мало, реально мало.

Музыкальные фестивали и концерты
Большой плюс Праги, сюда регулярно приезжают все знаменитые музыканты. Каждое лето по 3-4 крупных музыкальных фестиваля и множество просто концертов.

Вежливость
Мне кажется чехов с детства учат быть вежливыми. Вот заходишь домой в подъезд, соседи идущие на встречу обязательно поздороваются, даже если они тебя не знают.
В каждом магазине всегда говорят: "Добрый день" с улыбкой на лице, иногда даже кажется что они реально рады видеть посетителей. А после покупки желают хорошего дня. В России со мной здоровалась только одна продавщица за всё время и то она была стажёркой. Наверное сейчас уже и она не здоровается с покупателями :-) А ну ещё в алко-маркете продавщица здоровалась, ну тут понятно.

Спорт
Спортом занимаются почти все. Но если в России считается, что ты должен показывать результаты, ходишь в спортзал - покажи мышцы, иначе зачем ходишь? То в Чехии занимаются спортом для удовольствия, никто не бьёт рекорды, каждый делает столько сколько может и так чтобы это было удовольствие, а не мучение.

Click below to see a continuation →
0See full →  
Стоит ли программировать на D? И почему я на нём программирую?
Заметки не программиста
Если кратко:
D + стандартные библиотеки - гавно,
пропатченный D + наш фреймворк + наш билдер - хороший годный язык программирования

Почему я программирую на D?
Последние лет 15 я разрабатываю свой фреймфорк, сначала он был написан на C как библиотека для Perl, потом в какой-то момент Perl стал устаревать, да и в нём нерешённая проблема с утечками памяти.
Поэтому я начал искать удобный язык программирования сочетающий в себя мощь C и гибкость скриптовых языков и возможность кросскомпиляции под разные платформы. А также возможность заменить стандартную библиотеку своим фреймворком. Так я и нашёл D. Выкинул phobos, слегка пропатчил компилятор и добавил свой фреймворк в качестве стандартной библиотеки. Добавил тип var реализующий переменные как в скриптовых языках, например var x = 1; x = "Hello World"; x = true; x = [1, 2, 3];

Получилось идеально. Мощь C и скриптовых языков, кросскомпилятор.


Почему не стоит программировать на D?
Да тут 100500 причин.

Отсутствие документации. Есть лишь комментарии к функциям, из которых строится документация. При этом есть множество нестандартного поведения, которое нигде не задокументировано. Также почти нет книг по D. Хотя не всё так печально, кое что всё же есть.

Баги в релизах. Таки да. Главная фишка языка удобные unittest'ы, но при этом нет unittest'ов самого языка, чтобы они проверяли что в новой версии языка ничего не херится. Из-за этого пришлось в нашем фреймворке создать целую папку с такими тестами языка.

DMD долго компилирует (потому что нет инкрементальной сборки) и при этом жрёт много памяти и тем больше, чем сложнее проект, 2Гб легко, может и 3 и 4Гб. LDC ещё хуже в 1.5 раза, дольше собирает и больше памяти расходует за счёт связки с LLVM, который сам по себе ресурсоёмкий.

dub - это просто ёбаный стыд. Для мелких проектов вполне подходит, но чем крупнее становится проект тем больше понимаешь что нехватает функционала. При подключении внешних модулей половина из них вообще не собирается.

Нет стандартного GUI, вообще. Даже более того не ни одного вменяемого кроссплатформенного GUI.

Нет своей IDE. Самый нормальный вариант делать связку VSCode + плагин для D, но единственное что плагин делает хорошо - это подсветка кода, всё остальное в нём не работает. Выпадающие подсказки просто подвешивают VSCode намертво, да и к тому же они часто вообще не в тему. Есть неплохой вариант MonoDevelop + плагин для D, всё работает, но на больших проектах (>500 файлов) начинает сильно зависать.

Нет встроенной системы локализации, если пишешь мультиязычное приложение. Есть какие-то модули из dub для этого, но все они гавно полное.

Нет нормальной родной библиотеки для работы с изображениями. 

Ну и самый пиздец - форум на официальном сайте. Просто ебическая система отправки постов, надо чото посылать на какой-то e-mail текст поста потом он публикуется. Я понимаю что это привязка к e-mail конференциям из usenet, но блять их эпоха давно прошла. Сейчас немного улучшили, посты можно создавать прямо на форуме, но всё равно форум выглядит как какая-то хуета начала 2000ых. Это полбеды, спрашивать на форуме можно только что-нибудь примитивное, что ты и так нашёл бы в документации, любой вопрос посложнее остаётся либо без ответа, либо ну да да это надо бы сделать, но мы пока не можем. Ну то есть форум там нахуй не нужен.

Click below to see a continuation →
0See full →  
Уёбищные math ldc.intrinsics в LDC
Заметки не программиста
LDC предлагает замечательный модуль ldc.intrinsics, который заменяет вызов некоторых функций встроенным кодом, оптимизированным под процессор, что в теории должно значительно ускорить работу программы.

Но не всё так замечательно. Математические функции, такие как pragma(LDC_intrinsic, "llvm.sin.#f"), cos, sqrt и тому подобные в реальности заменяются на функции из стандартной библиотеки phobos. Что в этом плохого?
Во-первых эти функции должны быть в core-модуле, а не в phobos, т.к. я  например некоторые проекты собирают без phobos. Во-вторых, а нахрена тогда этот intrinsic нужен если всё равно вызывается функция? Если я захочу вызывать функцию лучше я её явно вызову чем вот через такую жопу.

Такое ощущение, что математические intrinsics делали на отъебись, типа начальник сказал чтобы они были, но ему похуй как они там будут. Это бы было простительно для обычного проекта, но не для языка программирования.
0
Просто уёбищная поддержка Android и iOS в компиляторе LDC
Заметки не программиста
В DMD есть поддержка только x86 платформ и это фатальный недостаток классического D компилятора. Но появляется компилятор LDC, который транслирует код через LLVM, тем добавляя возможность компилировать D код под все известные платформы. Ну не прелесть ли? Большинство всяких нестандартных платформ обычно нужно 3.5 анонимусам и не более. Но вот поддержка arm/aarch64 выводят D на совершенно новый уровень, делая его более привлекательным и перспективным языком. На IT-сайтах появляются статьи что на D теперь можно писать под Android и iOS.

Но чтоже с этим не так?
Да практически всё. Нет примеров чуть более чем полность. Есть какая-то вырвиглазная инструкция как собрать Hello World под Android, половина комманд в ней не работают т.к. она писалась несколько лет назад и за это время аргументы запуска компилятора поменялись. Чтобы собрать Hello World нужно потратить неделю времени. И в итоге получается очень большой shell script для сборки с кучей ебических параметров.

TLS не поддерживается, а ведь TLS в D это наше всё. Приходилось все static переменные заменять на __gshared, что не есть гуд. В последних версиях наконец-то пофиксили.
Программа линкуется только ld.bfd, при том что на Android ld.gold уже давно стал нормой. В последних версиях пофиксили, ld.gold стал поддерживаться, но местами выдаёт странные баги из-за того что по другому располагает сегменты данных в памяти, так что до сих пор стабильно можно использовать только ld.bfd.

D заявляет себя как кроссплатформенный компилятор, например размеры типов данных на всех платформах одинаковые, например long на любой платформе 8 байт (в том же C это не так).

Типы float/double обязательно должны быть выравнены на границу 8 байт, что с одной стороны является нормой, но на x86 невыравненные данные не выдают ошибку, а на arm/aarch64 выдают, а компилятор не выводит никаких warning'ов. Где вообще это может понадобиться? При парсинге пакетов данных в структуру, пакет естественно хранит данные как можно компактнее. И для arm/aarch64 приходится читать эти данные как uint/ulong, а при сохранении в структуру делать cast в float/double.

ubyte x = 0xF0; x >>= 8;
чему равно??? На x86 - 0, на arm/aarch64, хер там плавал, x - будет абсолютно рандомным. Це ж просто ёбаный пиздец. Компилятор хотя бы выдавал бы warning, но он молча компилирует в ubyte x = random.

asm {}
не работает чуть более чем полностью, вместо этого используется ебический шаблон __asm!T(``); с LLVM-ассемблером, который мягко говоря очень специфический. Мои эксперименты показали, что не соблюдается call convention для arm, т.е. параметры передаются не через те регистры, которые заявлены в документации к arm. Сам же LDC вообще не предоставляет документации о call convention под arm.

iOS
Все теже баги что на Android, только всё ещё хуже, документации нет, примеров нет, phobos до недавнего времени вообще не собирался под iOS. В последних версиях пофиксили, но он всё равно уёбищно работает. LDC нужно патчить, иначе некоторые блоки кода просто не компилируются.

Биндинги и интеграция с Objective-C в LDC не поддерживатеся, в DMD хотя бы начали работу в этом направлении, но в целом там тоже это не работает как надо.
Единственный способ сделать двусторонний мост Objective-C <-> D, это сделать промежуточные функции на чистом C, которые могут вызываться из обоих языков.

Но есть ведь плюсы?
Да есть. Если выкинуть стандартную библиотеку phobos и заменить его нашим framework'ом, который фиксит все эти баги, то программа стабильно работает.  Причём даже сложные проекты собираются под Android и работают, и работают достаточно быстро.

Что в итоге у меня получилось?
  • Сборка консольного приложения
  • Сборка консольного приложения в режиме unittest + скрипт для автоматической заливки тестируемого проекта по adb на устройство/эмулятор с автоматическим запуском, не требующий root-прав.
  • Классическое графическое приложение, .apk файл состоящий из небольшого java-кода и .so файла с скомпилированным D-кодом, двусторонний мост java <-> D, позволяющий вызывать функции друг друга и синхронизирующий результаты, т.к. D и java работают в разных потоках.
  • .apk с unittest'ами, таки да, даже это работает.
  • iOS? Таки да, тоже всё перечисленное работает, но проверялось только на симуляторе, т.к. у меня просто нет iPhone. Отладка честно говоря несколько неудобная, приходится запускать MacOSX под VirtualBox, а из под него запускать iOS Simulator, и это очень медленно работает. Но за счёт того что наш framework полностью кроссплатформенный и даёт одинаковый результат на всех платформах, то тестировать логику приложения можно на Android или вообще на Desktop, а на iOS Simulator проверять только пред-релиз версию на наличие специфических багов.

Click below to see a continuation →
0See full →  
2 фатальных недостатка CTFE в D
Заметки не программиста
1) Любой более-менее сложный код на CTFE сильно жрёт память, т.к. переменные занимают в больше места, чем в скомпилированной программе
2) Если в коде CTFE возникает бесконечный цикл, то компилятор зависает, и очень часто зависает вместе с компьютером, отжирая всё больше и больше памяти при каждой итерации зависшего цикла
0
foreach + массив структур
Заметки не программиста
Lang:
struct Item
{
int x;
}
Item[] items;

foreach (item; items)
{
// что делает этот код??? делает копию item
}

foreach (ref item; items)
{
// а вот этот код не делает копию а работает с ссылкой
}


Проблема в том, что foreach по значению используется очень редко, возможно только для каких-то маленьких структур когда её размер <=16 байт, потому что для больших структур сильно упадёт производительность за счёт ненужного копирования данных. В большинстве случаев используется foreach + ref item,
однако в D нет никакой возможности добавить warning на foreach без ref.
Т.е. получается D нет вообще никакого инструмента для поискаи отладки таких участков кода.
0