love5an: (Default)
Dmitry Ignatiev ([personal profile] love5an) wrote2012-03-11 06:59 pm
Entry tags:

Почему Линукс - говно. Часть 1. п╒п╣п╨я│я┌.

Таки решил начать писать цикл статей, где я буду долго, обстоятельно, и по пунктам, обосновывать почему мне так не нравится Линукс(и отчасти, Unix вообще), и даже больше - почему я считаю его просто говном.


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




Заголовок можно расшифровать вот тут:
http://www.artlebedev.ru/tools/decoder/

Да, все вещи, связанные с этим вот словом - одна из очень веских причин называть линукс говном(да и не только его - и многие другие unix-like системы тоже).

Вообщем, с текстом в линуксе ад и погибель.

В Windows все просто и прозрачно - с кодировками мы мучаемся только когда работаем с данными из файлов и прочих бинарных блобов[1].

Для системных же вызовов, включая чтение текста с консоли, у нас всегда есть функции с суффиксом «W», про которые мы точно знаем - там и на входе и на выходе используется UTF-16, вне зависимости от того, как локализована система, или, скажем, аниму какой страны производства смотрит пользователь в данный момент.

В именах файлов Windows всё так же просто и понятно - имена файлов, и, вообще, имена каких-либо объектов системы, это именно текст, и не просто бинарные блобы, содержащие хрен пойми что вплоть до управляющих символов, заставляющих терминал издавать звуки, а буквы юникода закодированные в UTF-16. Для имен файлов и вообще, путей, существуют четкие и строгие соглашения, навязываемые самой системой - например, имена разделяются или слэшем(причем слэш это вам не байт 00101111b(47), а буква из юникода с кодом 002Fh), и/или обратным слэшем(причем только им, если путь в форме UNC), например, и в них не может быть некоторых литер - и с путями другого вида система просто не работает[2].

Но в линуксе, и многих подобных ему unix-like системах - ничего такого просто нет. Имя файла это просто куча байт.

Поэтому, например, существуют целые талмуды о том, как правильно работать с путями файлов даже из банального bash[3], заточенного, казалось бы, на юникс по самые уши.

Если говорить о кодировках, то большинство разработчиков, админов и пользователей Linux по умолчанию подразумевает под текстом ASCII-7, Latin-1, или UTF-8, но на практике, это просто не правильно, и часто просто не работает, и ломается при первом же шаге в сторону(и ломается даже не только у пользователей из каких-нибудь восточных стран с их иероглифами в CJK, а даже просто у каких-нибудь ретроградов из бСССР, у которых любимая кодировка - что-нибудь из линейки KOI8), или при переносе файла с других операционных систем или просто с переносных носителей.[4]

Самое смешное что линукс, да и вообще юникс, при этом всем, ориентирован именно на текстовые протоколы.

То есть, хотя бы в том плане, что если на Windows мы, для работы с системой, используем какие-либо функции из системных DLL, которые работают со структурами языка Си и вообще, со структурированными данными, со стабильным ABI, если для системных API и межпроцессного взаимодействия у нас есть объектно-ориентированный COM, то на линуксе для решения задач, связанных с общением с системой и другими программами принято гонять plain-текстом по файлам(в т.ч. VFS), пайпам и сокетам, использовать текстовые конфигурационные файлы(привет DOS и Win3x с их .ini!), использовать для многих программ и сервисов разнообразные кривые скриптовые языки программирования, типа bash, perl, python или ruby(которые добавляют своих приколов[5]), и т.п.

Кроме проблем с представлением текста это всё, понятное дело, приносит в систему неслабые такие накладные расходы по производительности, памяти и месту на диске(хотя последнее в наше время уже не так актуально, да, если только вы не используете source-based дистрибутив).


  1. http://ru.wikipedia.org/wiki/BLOB

  2. http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx

  3. http://www.dwheeler.com/essays/filenames-in-shell.html

  4. http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html

  5. http://levgem.livejournal.com/357158.html


[identity profile] kika.livejournal.com 2012-03-11 03:14 pm (UTC)(link)
то на линуксе для решения задач, связанных с общением с системой и другими программами принято гонять plain-текстом по файлам(в т.ч. VFS), пайпам и сокетам

Это бред. В юниксе нет никакой разницы между текстом и нетекстом, ну то есть вообще. При винде (вернее мсдосе) головного мозга это трудно понять, но надо стараться!

[identity profile] love5an.livejournal.com 2012-03-11 03:36 pm (UTC)(link)
Нету то нету, но приняты текстовые протоколы.
Например: как узнать размер свободной памяти в винде и в линуксе, самым простым способом, программно?

(Anonymous) 2012-03-11 03:53 pm (UTC)(link)
linux: open("/proc/meminfo...
WinAPI: GlobalMemoryStatusEx (&statex)...

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-11 15:54 (UTC) - Expand

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-11 15:54 (UTC) - Expand

(no subject)

[identity profile] 4da.livejournal.com - 2012-03-11 16:05 (UTC) - Expand

(no subject)

[identity profile] nponeccop.livejournal.com - 2012-03-12 21:19 (UTC) - Expand

[identity profile] 4da.livejournal.com 2012-03-11 04:01 pm (UTC)(link)
Прочитать /proc/meminfo и прочитать вторую строку. И ничего плохого в этом не вижу: не нужно городить биндинги для разных языков, чтобы узнать информацию о системе.

Как, кстати, из cmd-файла в вендах узнать, сколько свободной памяти?

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-11 16:11 (UTC) - Expand

(no subject)

[identity profile] 4da.livejournal.com - 2012-03-11 18:34 (UTC) - Expand

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 07:30 (UTC) - Expand

(no subject)

[identity profile] 4da.livejournal.com - 2012-03-12 08:21 (UTC) - Expand

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 11:10 (UTC) - Expand

(no subject)

[identity profile] 4da.livejournal.com - 2012-03-12 11:29 (UTC) - Expand

(no subject)

[identity profile] 4da.livejournal.com - 2012-03-12 11:31 (UTC) - Expand

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 11:44 (UTC) - Expand

(no subject)

[identity profile] 4da.livejournal.com - 2012-03-12 14:28 (UTC) - Expand

(no subject)

[identity profile] kika.livejournal.com - 2012-03-11 23:06 (UTC) - Expand

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 07:35 (UTC) - Expand

(no subject)

[identity profile] kika.livejournal.com - 2012-03-12 08:14 (UTC) - Expand

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 10:27 (UTC) - Expand

(no subject)

[identity profile] stdray.livejournal.com - 2012-03-11 16:11 (UTC) - Expand

(no subject)

[identity profile] neograff.livejournal.com - 2012-03-13 12:53 (UTC) - Expand

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 07:39 (UTC) - Expand

(no subject)

[personal profile] develop7 - 2012-03-12 08:52 (UTC) - Expand

[identity profile] 13-49-ru.blogspot.com (from livejournal.com) 2012-03-11 09:33 pm (UTC)(link)
Размер какой именно свободной памяти? Что такое свободная память? Что делать, если при запуске твоей поделки памяти X, а потом её стало Y, потому что админ добавил тазик DRAM-модулей? Нах.я тебе вообще размер свободной памяти сдался?

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 07:40 (UTC) - Expand

(no subject)

[identity profile] 13-49-ru.blogspot.com - 2012-03-12 16:44 (UTC) - Expand

[identity profile] samurai-within.livejournal.com 2012-03-11 03:46 pm (UTC)(link)
всегда хихикаю читая в доке про режим "rb" или "wb" для бедняжек.

(Anonymous) 2012-03-11 04:58 pm (UTC)(link)
А тут предполагается, что некоторые другие ОС - не говно? :) Или Windows - венец эволюции прослойки между железками и человеком?

[identity profile] love5an.livejournal.com 2012-03-11 05:49 pm (UTC)(link)
Windows тоже говно, но менее говно, чем линукс.

А вообще, надо было Symbolics Genera развивать когда-то, эх..
Ну теперь вот надежда на MS, с их Singularity, Midori и прочим.

(Anonymous) 2012-03-11 07:15 pm (UTC)(link)
Ну теперь вот надежда на MS, с их Singularity, Midori и прочим. Plan 9
fixed

(no subject)

[identity profile] 4da.livejournal.com - 2012-03-12 08:33 (UTC) - Expand

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 11:07 (UTC) - Expand

[identity profile] grundik.livejournal.com 2012-03-11 07:11 pm (UTC)(link)
венец - это макось. и я почти не шучу.

[identity profile] grundik.livejournal.com 2012-03-11 07:11 pm (UTC)(link)
В винде с текстом не совсем так хорошо, как у тебя написано.

Примеры навскидку:
1. напиши программку, которая добавляет альяс на указанный пользователем сетевой интерфейс. А теперь запусти её на японской винде.
2. считай значение perfcounter-а с добавленного тобою альяса. А теперь смени сетевуху и повтори.
3. на японской винде слеши - это не слеши, и если ты пишешь скрипт на cmd, то очень легко словить те же проблемы, что и на юниксах.

И такого там не так уж и мало.

[identity profile] love5an.livejournal.com 2012-03-12 11:02 am (UTC)(link)
1, 2. А какие могут быть подводные камни, и по каким причинам?
3. На CMD - возможно да(он отображается по-другому, из-за обратной совместимости), но по сути это тот же слеш.
wizzard: (Default)

[personal profile] wizzard 2012-03-11 07:19 pm (UTC)(link)
в венде все хуево, потому что UTF-16LE, а не UTF-8

в линухе все еще более хуево, потому что не стандартизовано

как в макоси - я не знаю.

(Anonymous) 2012-12-22 11:31 am (UTC)(link)
Хуй ты угадал, как раз в юниксах существует стандарт POSIX.

[identity profile] cyber-lynx.livejournal.com 2013-01-11 08:05 am (UTC)(link)
Да что Вы говорите? (http://ru.wikipedia.org/wiki/Windows_NT)
В отличие от большинства свободных Unix-подобных ОС, Windows NT сертифицирована институтом NIST на совместимость со стандартом POSIX.1, и даже с более строгим стандартом FIPS 151-2. Библиотекой psxdll экспортируются стандартные функции POSIX, а также некоторые функции Native API, не имеющие аналогов в POSIX — например, для работы с кучей, со структурными исключениями, с Unicode. Внутри этих функций используются как Native API, так и LPC-вызовы в подсистему psxss, являющуюся обычным Win32-процессом/
Напомнить, в каком году Windows NT был? Windows уже тогда был совместим с POSIX, в отличие от.

(Anonymous) 2012-03-11 08:24 pm (UTC)(link)
> А вообще, надо было Symbolics Genera развивать когда-то, эх..
Внезапно, всё правильно написал.

Итак, обосную, почему ты соснул.

Linux: UTF-8 во все поля, весь код GNU прозрачно работает с UTF-8, как с char*, не нужно еботни с wchar_t. Ретрограды из бСССР - сами себе злобные буратины, ибо нехуй выёбываться.

Windows:
0. "Для системных же вызовов, включая чтение текста с консоли, у нас всегда есть функции с суффиксом «W»" - теперь скажи, почему я несчастным первокурсникам на парах по ЯПМТ обязан объяснять, что это за кракозяблы у них в консоли, и почему они в каждой программе обязаны звать setlocale(LC_ALL, "Russian"), а с вводом с консоли коноёбиться отдельно, вызывая CharToOem? А я тебе скажу - потому что стандартизации в венде, как всегда, нет - в половине мест UTF-16, в половине мест блядская восьмибитная cp1251, причём ещё и от локализации зависит. Да я ебал такую прозрачность.
1. Что выбрать между char и wchar_t?
2. GetWetPisichkaA или GetWetPisichkaW?
3. А _T() нужно?
4. Анальный COM доставляет веселухи с BSTR, который, по сути, pascal-строка (в 2012, на секундочку, году).
5. Вюндикс не умеет в BOM.
6. ????
7. ЛАВСАН ОПЯТЬ СОСНУЛ

[identity profile] 4da.livejournal.com 2012-03-12 08:32 am (UTC)(link)
Кстати, да. Постоянно спрашивают "ПАЧИМУ _tmain unresolved блаблала, TCHAR WCHAR _T()" как починить, все сломалось. ага.

[identity profile] love5an.livejournal.com 2012-03-12 10:44 am (UTC)(link)
Хуйню какую-то ты написал.

  • wchar_t - utf-16le, никакой ебли.

  • А что такое русский текст и как он представлен, им сначала объяснять не надо, да? Перед тем как они его начинают в программы добавлять вообще. Никакие CharToOem вызывать не надо, и setlocale тем более(кстати, да, надо было написать в постинге про эту смешную функции и извращения с ней в контексте линукса). Надо использовать UTF-16 функции. Всё! В винде нигде cp1251 нет, вообще. Там либо UTF-16(в т.ч. внутри ядра везде), либо ASCII-7, для функций, где юникод в принципе не поддерживается(компиляторы HLSL из DX например, и т.п.). Если не считать A-функции естественно, но их считать не надо, и использовать тем более, это вообще осталось только для обратной совместимости со всяким древним хламом.

  • WCHAR(он же wchar_t)

  • W. A-функций остались для обратной совместимости, еще раз! Их вообще использовать не надо. В новым API один только юникод. Да даже вон в OLE тоже один только юникод.

  • Нет, не нужно. Просто добавляешь префикс L к строкам.

  • А ты вообще в курсе что такое паскалевские строки? Это один байт на длину и байты на буквы. BSTR это _не_ паскалевские строки, это LPWSTR(UTF-16) плюс 32-битное машинное слово под длину. И кстати, что вместо такой структуры данных использовать, по-твоему? Нуль-терминированные строки чтоли? Спасибо, поржал.

  • Нахрена BOM для строк, живущих исключительно внутри программы и передающихся в системные функции? У LPWSTR Native Endianness.

[identity profile] 4da.livejournal.com 2012-03-12 11:26 am (UTC)(link)
> Надо использовать UTF-16 функции.
Хочу cout-ом вывести рюсске текст. куда обратиться?

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 11:53 (UTC) - Expand

(no subject)

[identity profile] 4da.livejournal.com - 2012-03-12 14:29 (UTC) - Expand

(no subject)

[identity profile] love5an.livejournal.com - 2012-03-12 14:47 (UTC) - Expand

(no subject)

(Anonymous) - 2012-03-12 21:40 (UTC) - Expand

(no subject)

(Anonymous) - 2012-08-01 01:06 (UTC) - Expand

[identity profile] shmat-razum.blogspot.com (from livejournal.com) 2012-03-13 05:57 am (UTC)(link)
Но в линуксе, и многих подобных ему unix-like системах - ничего такого просто нет. Имя файла это просто куча байт.
При этом байты '\0' и '/' запрещены, создать файл с такими байтами в имени нельзя. Аналогично описанной тобой ситуации в винде. Да, запрещены байты, а не символы, но это не является проблемой для однобайтовых кодировок (ASCII, Latin-1, KOI8), и для многобайтовых (Shift-JIS, UTF8), в которых '\0' и '/' не могут быть частью многобайтовой последовательности. Сейчас все поголовно используют UTF8, как указал анонимус выше, и все счастливы, никаких проблем.

Поэтому, например, существуют целые талмуды о том, как правильно работать с путями файлов даже из банального bash[3], заточенного, казалось бы, на юникс по самые уши.
Эти рецепты призваны обходить кривость bash как языка. Возьми, я не знаю, Python, и никаких подобных трюков не понадобится.
Edited 2012-03-13 06:09 (UTC)

(Anonymous) 2012-06-05 11:46 am (UTC)(link)
Очень сильно соглашусь с автором. Программил под Линух 8 лет. Сделал для себя вывод - Линух это гавно.

(Anonymous) 2012-07-06 08:57 am (UTC)(link)
Автору респект - хотя он немного Капитан Очевидность.
О том, что Линукс - никому не нужное говно, говорит количественная статистика в соотношении с Виндовс. Сколько там, господа красноглазики? Один процент? А, уже целых два ? ))))) Поздравляю, это несомненный прогресс))))))
Имел опыт общения с Линуксом на протяжении года - было время, под Виндовс не было софта для перехвата спутникового интернета. Поюзал. С появлением софта под Виндовс с облегчением выкинул на помойку.
Причина: мне не нужна операционная система как факт её наличия. Мне нужен функционал. Компьютер должен быть многозадачным - то есть, обеспечивать комортную работу с мультимедиа, для меня также - с вёрсткой, графикой, уметь играть в любые игры. Гимп вместо Фотошопа? Не смешите меня. Вайн для запуска игр? Под столом. Видеодрайвера без поддержки 10-го директа? А зачем мне тогда современная видеокарта? )))
За вёрстку вообще промолчу - слишком уж убого выглядят линуксовые состряпанные на коленке поделия даже на фоне банального Коррела 4-летней давности - не говоря про Ин-Дизайн. Было дело, купил звуковую карту Creative X-Fi Titanium... Каково же было моё удивление, когда ни одна фишка на ней тупо НЕ РАБОТАЛА! Для того, чтобы поставить банальный драйвер на спутниковый тюнер , нужно провести стопиццот ненужных операций-компиляций-хренаций - вместо того, чтобы дважды кликнуть на один файл (!!!!!) в Виндовсе.
Вывод: линукс нужен только для одного: чтобы в компании гордо кричать: "А у меня не винда!! Я крут!! Я пользуюсь свободным и бесплатным ПО!!!"
Так бесплатное хорошим не бывает - и Линукс это чудесно подтверждает. Виндовс у меня, кстати, тоже бесплатный - на любом торрент-трекере (открою секрет) его можно скачать и установить.

[identity profile] Руслан Птушник (from livejournal.com) 2013-08-22 06:08 am (UTC)(link)
linux - говно!
Винда - Заебись!

(Anonymous) 2014-01-08 08:26 am (UTC)(link)
Да конечно говно. Причем говно ебанное.
Придуманное такими же ебанными уебками.
Windows - простота, быстрота, доступность. Windows 7 так вообще легенда по стабильности, юзаю 4 год!!! Не переустанавливал, игры заебок прут.
Сервер на линуксе? Да идите нахуй, на винде лучше.
Если у вас комп дрова вот и ебитесь с линуксо-говном и не толкайте вашу ебанную псевдо-ОС нормальным юзерам.