![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Таки решил начать писать цикл статей, где я буду долго, обстоятельно, и по пунктам, обосновывать почему мне так не нравится Линукс(и отчасти, 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 дистрибутив).
- http://ru.wikipedia.org/wiki/BLOB
- http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
- http://www.dwheeler.com/essays/filenames-in-shell.html
- http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html
- http://levgem.livejournal.com/357158.html
no subject
Date: 2012-03-11 03:14 pm (UTC)Это бред. В юниксе нет никакой разницы между текстом и нетекстом, ну то есть вообще. При винде (вернее мсдосе) головного мозга это трудно понять, но надо стараться!
no subject
Date: 2012-03-11 03:36 pm (UTC)Например: как узнать размер свободной памяти в винде и в линуксе, самым простым способом, программно?
no subject
Date: 2012-03-11 03:46 pm (UTC)no subject
Date: 2012-03-11 03:53 pm (UTC)WinAPI: GlobalMemoryStatusEx (&statex)...
no subject
Date: 2012-03-11 03:54 pm (UTC)no subject
Date: 2012-03-11 03:54 pm (UTC)no subject
Date: 2012-03-11 04:01 pm (UTC)Как, кстати, из cmd-файла в вендах узнать, сколько свободной памяти?
no subject
Date: 2012-03-11 04:05 pm (UTC)no subject
Date: 2012-03-11 04:11 pm (UTC)вот как из powershell:
no subject
Date: 2012-03-11 04:11 pm (UTC)powershell
no subject
Date: 2012-03-11 04:58 pm (UTC)no subject
Date: 2012-03-11 05:39 pm (UTC)no subject
Date: 2012-03-11 05:49 pm (UTC)А вообще, надо было Symbolics Genera развивать когда-то, эх..
Ну теперь вот надежда на MS, с их Singularity, Midori и прочим.
no subject
Date: 2012-03-11 06:34 pm (UTC)no subject
Date: 2012-03-11 07:11 pm (UTC)Примеры навскидку:
1. напиши программку, которая добавляет альяс на указанный пользователем сетевой интерфейс. А теперь запусти её на японской винде.
2. считай значение perfcounter-а с добавленного тобою альяса. А теперь смени сетевуху и повтори.
3. на японской винде слеши - это не слеши, и если ты пишешь скрипт на cmd, то очень легко словить те же проблемы, что и на юниксах.
И такого там не так уж и мало.
no subject
Date: 2012-03-11 07:11 pm (UTC)no subject
Date: 2012-03-11 07:15 pm (UTC)MS, с их Singularity, Midori и прочим.Plan 9fixed
no subject
Date: 2012-03-11 07:19 pm (UTC)в линухе все еще более хуево, потому что не стандартизовано
как в макоси - я не знаю.
no subject
Date: 2012-03-11 08:24 pm (UTC)Внезапно, всё правильно написал.
Итак, обосную, почему ты соснул.
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. ЛАВСАН ОПЯТЬ СОСНУЛ
no subject
Date: 2012-03-11 09:33 pm (UTC)no subject
Date: 2012-03-11 11:06 pm (UTC)А на баше я могу написать скрипт, работающий на любом юниксе начиная с 80-х годов.
no subject
Date: 2012-03-12 07:30 am (UTC)WMI как минимум типизированный и проще в использовании
no subject
Date: 2012-03-12 07:35 am (UTC)1) Начиная с Win7 он есть везде.
2) Установить вообще не проблема.
3) Не нравится PS - дык, кто заставляет, WMI можно хоть из встроенного WSH потрогать:
>А на баше я могу написать скрипт, работающий на любом юниксе начиная с 80-х годов.
Что-то я сомневаюсь что у всех юниксов одинаковые /proc.
Вон на макоси /proc/meminfo вообще нет, например, это чисто линуксовая фича.
no subject
Date: 2012-03-12 07:39 am (UTC)no subject
Date: 2012-03-12 07:40 am (UTC)Поставили новой - ну так, новое значение узнаем.
Зачем вообще - да хз, это пример просто.