четверг, 1 сентября 2016 г.

Языковая локализация C/C++

Локализация программного кода под язык (например, русский) очень слабо описана. На то есть несколько причин:
  • Современное представление текстов в Unicode появилось достаточно поздно (1991г.), а представление Unicode в UTF-8 кодировке ещё позже (1992г., Кен Томпсон и Роб Пайк);
  • Ранние описания, например знаменитая книга по C K&R, естественно, не могут даже упоминать о проблеме языковой локализации...
  • А более поздние зарубежные (и переводные) издания обходят эти вопросы стороной - им оно не актуально ... и "до лампочки"...
  • отечественные же учебники только пересказывают то, что они прочитали в переводных изданиях.
А вопросы по этому поводу многократно задают. И в обсуждениях рассказываются совершенно чудовищные картины локализации ... складывающиеся в больном воображении в отсутствии информации.
Поэтому пришлось собрать в одно место то, что я знаю по этому поводу, и описать единым текстом.
Как и раньше, особенно расписывать я здесь не стану, а для интересующихся, пожалуйста - скачивайте описательный текст + архив примеров кодов, которые можно компилировать, изучать и с которыми можно экспериментировать.

Сам текст : на Yandex и на на Google
Редакция 09, от 01.09.2016, стр. 22.

Архив примеров кода на Yandex и на на Google

Всё, что здесь описано, касается локализации в коде C и C++. Но вопросы локализации, вообще то говоря, определяются не столько языком программирования, сколько операционной системой и её настройками. Поэтому локализация на других языках, скажем Python, полностью наследуют описываемые здесь принципы, и только изображаются средствами API этого языка. В будущем, возможно, я расширю текст примерами ещё на нескольких языках программирования ... хотя это достаточно тривиально после C/C++.

Всё, что хотелось бы обсудить, уточнить, замечания и предожения по тексту - обсуждаем здесь: локализация строк в C-коде.

пятница, 26 августа 2016 г.

Начала STL и контейнеры C++

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

Кому интересно - берите и пользуйтесь...

Сам текст : на Yandex и на на Google
Редакция 12, от 24.08.2016, стр. 59.

Архив примеров кода на Yandex и на на Google

Всё, что хотелось бы обсудить, уточнить, замечания и предожения по тексту, какие бы ещё примеры и задачи включить в рассмотрение - обсуждаем здесь: Начала STL и контейнеры C++.

пятница, 27 мая 2016 г.

Задачи по программированию на языке C, обновление

Предыдущее сообщение Задачи по программированию на языке C, часть 1 содержало ссылки на документ, который обновлялся, расширялся много раз. Последняя редакция предлагаемого текста была 23 от 12.01.2016, объёмом 82 страниц. После этого текст достаточно стабилизировался, и оставался неизменным почти пол-года.

Сейчас назрел новый цикл обновлений. Главный его резон: рассмотреть расширения стандарта ISO/IEC 9899:2011 языка C (но накопились и другие нюансы). Поэтому новый цикл обновлений вынесен отдельно сюда.

Скачать свободно последнюю актуальную редакцию текста и архива кодов можно здесь:
Googleтекст, архив кодов
Сейчас это редакция 30 от 27.05.2016, страниц 89.

P.S. А по поводу самого стандарта C11, который не очень известен и доступен - черновик стандарта N1570, датированный 12.04.2011, можете скачать здесь.

суббота, 26 марта 2016 г.

четверг, 17 марта 2016 г.

Начала STL и контейнеры C++ (обновление)

Большое обновление серии заметок "Начала STL и контейнеры C++".
Только ссылки...

Архив примеров кода на на Google

И сами тексты:

Массивы со статической и динамической размерностью. Часть 1
Редакция 06, от 25.02.2016, на на Google

Контейнеры STL. Часть 2
Редакция 06, от 25.02.2016, на Google

Контейнеры STL. vector. Часть 3
Редакция 07, от 02.03.2016, на Google

Контейнеры STL. list. Часть 4
Редакция 08, от 16.03.2016, на Google

Классы string и wstring. Часть 5
Редакция 06, от 19.02.2016, на Google

Ассоциативные контейнеры STL. Часть 6
Редакция 06, от 07.03.2016, на Google

Контейнеры STL: map. Часть 7
Редакция 03, от 19.02.2016, на Google

Контейнеры STL: multimap. Часть 8
Редакция 03, от 19.02.2016, на Google

Контейнеры STL: set и multiset. Часть 9
Редакция 03, от 19.02.2016, на Google

Итераторы ввода-вывода. Часть 9A
Редакция 02, от 15.03.2016, на Google
(некоторых частей не было вообще в предыдущих редакциях, они вставные, чтобы не нарушать порядок именования частей они идут с буквенным индексом)

Алгоритмы. Часть 10
Редакция 04, от 21.02.2016, на Google

Функциональные объекты. Часть 11
Редакция 04, от 20.02.2016, на Google

Сортировка. Часть 12
Редакция 03, от 20.02.2016, на Google

Сортировка структур. Часть 13
Редакция 03, от 20.02.2016, на Google

Обобщённые численные алгоритмы. Часть 14
Редакция 03, от 20.02.2016, на Google

Скалярное произведение, фильтрация. Часть 14B
Редакция 03, от 20.02.2016, на Google

Другие обобщённые алгоритмы. Часть 14C
Редакция 03, от 20.02.2016, на Google

Обобщённые алгоритмы на массивах. Часть 14Z
Редакция 03, от 20.02.2016, на Google

Адаптеры. Часть 15
Редакция 03, от 20.02.2016, на Google

Указатели в контейнерах. Часть 16
Редакция 03, от 20.02.2016, на Google

Что почитать?. Часть 17
Редакция 03, от 23.02.2016, на Google


суббота, 13 февраля 2016 г.

Начала STL и контейнеры C++

P.S. Как оказалось, редактор сообщений этого блога (вместе с его авторами) - полное говно. Так что я приношу прощения за слабую читаемость этого сообщения, или полную его нечитаемость... не за свою вину. Опасаясь вообще за сохранность даже ссылок для самого себя, любимого - я уношу этот цикл полностью (пока?) в форум: Начала STL и контейнеры C++ . Ссылки ниже на 20.02 актуальны, но дальше я их корректировать не буду, и дополнять список не стану - нельзя бесконечно работать на сортир! Буду ли продолжать этот блог? Не знаю...=

Это вот такой цикл коротеньких заметок по массивам C & C++, контейнерам STL, использованию их с применением новых синтаксических конструкций стандартов последнего времени: C99 и C++11 - всё это там сильно переплетается ... ну и всяких сопутствующих вопросов.
Этот цикл заметок, первоначально, появился по просьбе одного из сайтов, по обучению C++ начального уровня ... для пионеров, школьников и других нерадивых студентов... Но со временем заметки стали обрастать подробностями, а заказчики мягко выражать неудовольствие, что всё это становится слишком длинно и заумно. Упрощать описание до уровня "на пальцах" не хочется, но и потерять сделанное жалко, независимо от того, опубликует ли это обучающий сайт и в каком виде. Тем более, что материал стал обрастать интересными подробностями (жить своей жизнью), особенно на стыке с выразительными средствами стандартов C99 и C++11, позволяющих значительно упростить использование. А в литературе этого не найти, потому что очень свежие вещи.В итоге, решил я это всё хозяйство задублировать сюда в блог. Тем более, что всплывают всякие нетривиальные детали, каждая из частей обрастает обновлениями (и ещё будут), и это уже далеко не тот текст, который появился первоначально. Может кому-то ещё это покажется интересным.
Естественно, все заметки сопровождаются короткими примерами иллюстрирующего кода. Весь код написан "с нуля" под эти тексты. Поскольку кода не много, все примеры кода, ко многим частям собственно заметок, собраны в один архив. Но соответствие кода частям текста очень легко восстановить по именам файлов примеров, которые фигурируют в тексте. Архив кодов можете взять на Google (архив будет обновляться, но эти ссылки будут корректироваться на актуальную версию).
 

Вопрос (спрашивают): почему названия, ссылки и даты последних редакций там сильно "пляшут", даже давно размещённые части, из самых первых?
Ответ: потому, что, идя навстречу пожеланиям трудящихся, я делаю то, что никогда не делал - выверяю и корректирую коды примеров в виртуальной машине с Windows 7, в IDE Code::Blocks 2013. 
А сами тексты - вот они (ссылки бeдут помещаться и обновляться по мере выверки и размещения):

Массивы со статической и динамической размерностью. Часть 1 
Редакция от 19.02.2016, ссылка на Google  
Контейнеры STL. Часть 2 
Редакция от 19.02.2016, ссылка на Google
Контейнеры STL: vector. Часть 3 
Редакция от 19.02.2016, ссылка на Google 
Контейнеры STL: list. Часть 4 
Редакция от 19.02.2016, ссылка на Google
Классы string и wstring. Часть 5
Редакция от 19.02.2016, ссылка на Google
Ассоциативные контейнеры STL. Часть 6
Редакция от 19.02.2016, ссылка на Google  
Контейнеры STL: map. Часть 7
Редакция от 19.02.2016, ссылка на Google 
Контейнеры STL: multimap. Часть 8
Редакция от 19.02.2016, ссылка на Google  
Контейнеры STL: set и multiset. Часть 9 
Редакция от 19.02.2016, ссылка на Google 
Алгоритмы. Часть 10
Редакция от 20.02.2016, ссылка на Google  
Функциональные объекты. Часть 11
Редакция от 20.02.2016, ссылка на Google  




вторник, 29 декабря 2015 г.

Задачи по программированию на языке C++, часть 2

Это подолжение обещанного в предыдущем сообщении "Задачи по программированию на языке C, часть 1" : так же задачи, но уже на языке C++.

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

Немного, но есть пересечения по формулировкам задач с 1-й частью - некоторые задачи любопытно посмотреть в сравнении: как это делается на C и что нового привносит C++.

Как и раньше, ссылки даются на последнюю актуальную редакцию - ссылки будут меняться без какого-либо уведомления. Скачать свободно последнюю актуальную редакцию текста и архива кодов можно здесь:
Googleтекст, архив кодов
Сейчас это редакция 38 от 13.09.2016, стр. 85.
(после достаточно продолжительного перерыва произошло весьма обстоятельное обновление)

В отношении авторских прав повторю:
Ничто из представленного в этом тексте не заимствовано ни из каких источников (кроме, возможно, идей постановок некоторых задач). Все представленные варианты решений - авторские, со всеми возможными ошибками и неточностями.

Как и всё опубликованное ранее, этот текст и все сопутствующие ему материалы представляется под лицензией: Creative Commons Attribution ShareAlike (http://legalfoto.ru/licenzii/) ("общественное достояние"):
... допускается копирование, коммерческое использование произведения, создание его производных при чётком указании источника, но при том единственном ограничении, что при использовании или переработке разрешается применять результат только на условиях аналогичной лицензии.

четверг, 24 декабря 2015 г.

Задачи по программированию на языке C, часть 1

Здесь я собрал большой набор вопросов и задач по программированию на языке C. Это систематизированная подборка тех материалов, которые обсуждались на протяжении нескольких лет на форуме (жалко стало, если затеряется). В составе: текст описания (задачи и решения) и архив кодов решений задач. Все решения проверены и делались в Linux, но, в основной своей части, не должны зависеть от операционной системы (некоторые проверялись в VirtualBox в Windows).

Спектр задач достаточно широкий получается: начиная от простых (но не очевидных) вопросов (которые с подтекстом), и заканчивая задачами, написание решений которых могут потребовать 2-3 дня плотной работы. Главным образом, этот материал предназначен для изучающих язык C. Но некоторые задачи потребуют пошевелиться и профессионалов в C, чтобы "не застаиваться" (как этюды для пианиста). Часть задач мне подбрасывали в разные годы те, кто изучали C (под моим ... кураторством, или каким другим образом), и борьба с частью таких задач вызывала азарт интереса.

Работа в процессе. Объём задач будет прирастать. Поэтому я даю ссылки на актуальные (последние) редакции текста и архива для скачивания, но ссылки будут обновляться и указывать на следующие редакции (можно видеть по номеру редакции в именах файлов).

И последнее ... почему "часть 1"? Потому что в работе находится такой же сборник, но по языку C++. Я являюсь последовательным сторонником точки зрения, рассматривающей язык C++ не как некоторое абсолютно автономное изобретение, а как надмножество языка C. И того, что изучать C++ лучше через изучение C с дальнейшим расширением до C++ (Существует другая, противоположная точка зрения). Так вот, "Задачи по программированию на языке C++" - это и будет часть 2.

Скачать свободно последнюю актуальную редакцию текста и архива кодов можно здесь:
Googleтекст, архив кодов
Сейчас это редакция 23 от 12.01.2016, страниц 82.

В отношении авторских прав повторю:

Ничто из представленого в этом тексте не заимствовано ни из каких источников (кроме, возможно, идей постановок некоторых задач). Все представленные варианты решений - авторские, со всеми возможными ошибками и неточностями.

Как и всё опубликованное ранее, этот текст и все сопутствующие ему материалы представляется под лицензией: Creative Commons Attribution ShareAlike (http://legalfoto.ru/licenzii/) ("общественное достояние"):

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

вторник, 20 октября 2015 г.

Планирование параллельного исполнения в Go

О некоторых особенностях языка Go я уже писал здесь в блоге (Go конспект). Но одно из самых интересных мест Go - это как-раз то, как организуются параллельные ветви выполнения (и на различных процессорах в SMP). Утверждается, что после версии GoLang 1.1 (2012г.-2013г.) этот механизм Go-рутин радикально переделан, улучшен и сделан ещё существенно более эффективным, чем ранее.

Теперь используется алгоритм планирования с заимствованием работ (в оригинале даже "воровством работ", но в русскоязычной терминологии уже установился благозвучный термин заимствование). Обстоятельнейший (на 29 страниц) анализ самих принципов, на которых построен этот механизм, описан в Scheduling Multithreaded Computations by Work Stealing. Там же проведе сложнейший и детальный математический анализ производительности.

Коротко ("на пальцах") механизм описан в заметке The Go scheduler (by Daniel Morsing 30 June 2013). Это настолько интересно, что мной сделан перевод этой заметки, который вы можете найти на странице Диспетчер Go.

Утверждается (и это подтвердают эксперименты), что механизм Go-рутин (параллельного исполнения фрагментов кода) позволяет эффективно выполнять в параллель десятки, если не сотни, тысяч ветвей. К детальному рассмотрению этих механизмов ещё придётся не раз возвращаться.

4 способа писать в защищённую страницу

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

Перечислению, опробыванию и корректировке предлагаемых способов и посвящена очередная заметка "4 способа писать в защищённую страницу". Поскольку она не такая уж и маленькая (8 страниц), а, главное, требует для подтверждения предоставления подтверждающего кода, то я не вкопирываю текст сюда, а как и раньше просто даю ссылки где это всё можно взять.

Скачать текст можно здесь.
А код, соответственно, здесь.

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