четверг, 5 февраля 2015 г.

Практикум по Linux Kernel

Я начал составлять (не важно для каких целей) набор вопросов и задач, относящихся к Linux Kernel и программированию модулей ядра в Linux.

Спектр задач там очень широкий получается: начиная от простейших вопросов, но которые с подтекстом, но разобраться с ними требуется 15 минут - и заканчивая задачами написания реальных драйверов (упрощённых, естественно, насколько можно), которые могут потребовать 2-3 дня плотной работы.

Если кого интересует этот предмет - присоединяйтесь к обсуждению. Найти его можно на форуме Linux, вот здесь: практикум по Linux Kernel

Работа только в самом начале. Объём примеров и задач будет прирастать...
Пока что, если у кого-то возникнет интерес "а как сделать нечто?" - формулируйте, и это станет очередной задачей, и найдёт своё решение.


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

Драйверы и модули ядра Linux (очередной цикл обновлений)

Предыдущий цикл обновлений рукописи "Драйверы и модули ядра Linux" завершён 10 июля 2014 года, одновременно с завершением цикла лекций по этому материалу для разработчиков компании  Global Logic, а также преподавателей и аспирантов некскольких киевских университетов.
Я предполагал некоторое время ... пожить спокойно, не возвращаться к этому тексту и архиву примеров кодов к нему. Если бы не...
... в версии ядра 3.17 разработчики радикально поменяли прототипы ключевых макросов ... по-крайней мере, то что мне сразу удалось отследить - в подсистеме сетевого стека ("удалось отследить" - это то, что сразу перестали компилироваться как драйвер, например, WiFi чипа Broadcom Corporation BCM43228, так и полтора десятка примеров модулей в архиве этой рукописи).
Какие изменения (те, что я заметил):

1. В <linux/netdevice.h> - создание сетевого интерфейса: 

- было:
#define alloc_netdev( sizeof_priv, name, setup )

- стало:
#define alloc_netdev( sizeof_priv, name, name_assign_type, setup )

Как легко видеть, теперь вместо 3-х параметров 4, 3-й из которых — константа, определяющая порядок нумерации создаваемых интерфейсов, описанная в том же файле определений:
/* interface name assignment types (sysfs name_assign_type attribute) */
#define NET_NAME_UNKNOWN     0 /* unknown origin (not exposed to userspace) */
#define NET_NAME_ENUM        1 /* enumerated by kernel */
#define NET_NAME_PREDICTABLE 2 /* predictably named by the kernel */
#define NET_NAME_USER        3 /* provided by user-space */
#define NET_NAME_RENAMED     4 /* renamed by user-space */


2. Во всём, что касается стандартов WiFi (файл <net/cfg802211.h>) ... в тексте и примерах это никак не нашло отражения, но всё же : начиная с 3.14 ядра изменилось число параметров и стало:
/*
 * cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS
 * @dev: network device
 * @bssid: the BSSID of the IBSS joined
 * @channel: the channel of the IBSS joined
 * @gfp: allocation flags
 *
 * This function notifies cfg80211 that the device joined an IBSS or
 * switched to a different BSSID. Before this function can be called,
 * either a beacon has to have been received from the IBSS, or one of
 * the cfg80211_inform_bss{,_frame} functions must have been called
 * with the locally generated beacon -- this guarantees that there is
 * always a scan result for this IBSS. cfg80211 will handle the rest.
 */
void cfg80211_ibss_joined( struct net_device *dev, const u8 *bssid,
                           struct ieee80211_channel *channel, gfp_t gfp );


Здесь новый 3-й параметр имеет определение (в том же <net/cfg802211.h>):
/*
 * struct ieee80211_channel - channel definition
 *
 * This structure describes a single channel for use
 * with cfg80211.
 *
 * @center_freq: center frequency in MHz
 * @hw_value: hardware-specific value for the channel
 * @flags: channel flags from &enum ieee80211_channel_flags.
 * @orig_flags: channel flags at registration time, used by regulatory
 * code to support devices with additional restrictions
 * @band: band this channel belongs to.
 * @max_antenna_gain: maximum antenna gain in dBi
 * @max_power: maximum transmission power (in dBm)
 * @max_reg_power: maximum regulatory transmission power (in dBm)
 * @beacon_found: helper to regulatory code to indicate when a beacon
 * has been found on this channel. Use regulatory_hint_found_beacon()
 * to enable this, this is useful only on 5 GHz band.
 * @orig_mag: internal use
 * @orig_mpwr: internal use
 * @dfs_state: current state of this channel. Only relevant if radar is required
 * on this channel.
 * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
 * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
 */
struct ieee80211_channel {
   enum ieee80211_band band;
   u16 center_freq;
   u16 hw_value;
   u32 flags;
   int max_antenna_gain;
   int max_power;
   int max_reg_power;
   bool beacon_found;
   u32 orig_flags;
   int orig_mag, orig_mpwr;
   enum nl80211_dfs_state dfs_state;
   unsigned long dfs_state_entered;
   unsigned int dfs_cac_ms;
};

Как это обычно бывает, в старых кодах драйверов, вместо этого 3-го параметра в вызовах cfg80211_ibss_joined(), можно поставить просто NULL (проверено - работает для BCM43228).

В итоге - пришлось сесть за пересмотр текста и примеров раньше, чем это планировалось.

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

Номер последней редакции: 223
Объём (страниц): 425
Размер файла текста: 1478880
Размер архива кодов:  893557
Дата размещения: 20 января 2015

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив 
Yandex: текст и архив

вторник, 21 октября 2014 г.

Сравнительное обозрение языков программирования

Этот текст объединяет ранее уже публиковавшиеся наброски о сравнении исходных кодов эквивалентных приложений, но выполненных на разных языках программирования — занятие и интересное, и познавательное, и поучительное.
Это не есть прямое механическое объединение текстов, показанных ранее. Достаточно много дополнено, изменено, или уточнено. На сегодня в это сравнительное обозрение уже включено 15 языков программирования (или больше?).
Как и раньше, объём слишком большой, чтобы его выкладывать непосредственно в блог. Выкладываю только ссылки, где вы можете всё это свободно взять. По мере развития файлы смогут освежаться по редакции, а ссылки будут в корректном состоянии.
Был бы крайне признателен за замечания и предложения.

Номер последней редакции: 31
Объём (страниц): 63
Размер файла текста: 325687
Размер архива кодов: 341989 
Дата создания: 21 октября 2014

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив 

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

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

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

среда, 24 сентября 2014 г.

Параллелизм, конкурентность, многопроцессорность в Linux

Давно копившиеся заметки: "Параллелизм, конкурентность, многопроцессорность в Linux". Потому что параллелизм - это далеко не конкурентность, а с массовым распространением многопроцессорности всё становится куда запутаннее и веселее...

Вот такие вот, пока, наброски ... правда набросков уже накопилось на сотню страниц:

Номер последней редакции: 05
Объём (страниц): 97
Размер файла текста: 
185153 
Размер архива кодов: 
314749
Дата размещения: 23 сентябра 2014

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив 


В архиве примеры кода - как это делается на разных языках программирования: C, Python, Go ... временами C++. И то, как на N процессорных ядрах попытаться ускорить выполнение в N раз ... и что из этого получается.

В примерах кода там есть весьма неожиданные, временами, результаты.
Которые любопытно было бы обсудить...

суббота, 16 августа 2014 г.

Go конспект

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

Это сжатые заметки для программистов на языках C и C++ о том, как им быстро пересесть на язык Go, если в том возникнет необходимость. А возникнуть она может совершенно реально, потому как только за последний месяц (июль 2014) ко мне обратились целых 3 (!) крупных софтверных компании из аутосорсинга (т.е. тех, кто не выбирает проекты, а которым их предлагают) с предложениями-обсуждениями того, как быстро обучить их программистов языку Go. В поисках (моих) ответа на эти вопросы и появился этот конспект.

Почему Go? Потому что по моим наблюдениям (конечно очень субъективным) за рынком предложений, на сегодня есть 2 языка программирования, которые срочно должны осваивать молодые начинающие программисты, чтобы с успехом войти в индустрию разработки программного обеспечения, это - Pyton и Go. Но по Python уже существует достаточно много и литературы, и публикаций, и документации. По Go всего этого нет.

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

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

Номер последней редакции: 1.42
Объём (страниц): 124
Размер файла текста: 601866
Размер архива кодов: 120492 
Дата редактирования: 17 апреля 2017

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив
Yandex: текст и архив

Этот текст и все сопутствующие ему материалы представляется под лицензией, которая явно обозначена в тексте: Creative Commons Attribution-ShareAlike 3.0 (полный текст можете почитать здесь Creative Commons Attribution - ShareAlike 3.0 Unported) :
... допускается копирование, коммерческое использование произведения, создание его производных при чётком указании источника, но при том единственном ограничении, что при использовании или переработке разрешается применять результат только на условиях аналогичной лицензии.

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

вторник, 17 июня 2014 г.

Сетевое программирование в Linux


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

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

В тексте 3 больших, очень разнородных, раздела:
1. О сети вообще (архитектура; стек протоколов Linux; сеть IP: адресация, маршрутизация; инструменты диагностики и управления).
2. Программирование сокетов (приложений пространства пользователя).
3. Программирование драйверов (модулей ядра) сетевых интерфейсов и протоколов.

Совместное рассмотрение сетевой архитектуры в ядре Linux и в слое прикладных программ позволяет совершенно по-новому, цельно взглянуть на архитектуру сетевых приложений, и делает совершенно прозрачным весь тракт прохождения информации сквозь сеть.

Номер последней редакции: 23
Объём (страниц): 102
Размер файла текста: 765978  
Размер архива кодов: 473598
Дата размещения: 27 июля 2014
На редакции 22 завершилось чтение экспресс-курса, поэтому все последующие редакции - это достаточно чистовой материал, с мелкими последующими подчистками и дополнениями.

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив
Yandex: текст и архив

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

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

понедельник, 12 мая 2014 г.

Разработка программных проектов в Linux (цикл обновлений)



"Инструменты Linux" (этот же текст известен в некоторых публикациях в Интернет как "Инструменты в Linux для программистов из Windows") - это рукопись, которая в последней своей редакции была показано здесь в блоге достаточно давно: 25 ноября 2012г. Тогда это была редакция 2.70, от 28.10.2012г., объёмом в 170 страниц. За прошедшее время были сделаны существенные дополнения текста. Но, кроме того, в настоящее время начат активный цикл внесения правок, изменений, серьёзных дополнений. Это связано с тем, что крупная международная софтверная компания обратилась с желанием провести обучение работников их русскоязычных филиалов по этому предмету. Такой тренинговый курс займёт 3-4 месяца, а это значит, что всё это время текст (и код примеров, что ещё важнее) будет постоянно обновляться. 
Начиная с редакции 105 изменяется заголовок текста на "Разработка программных проектов в Linux", потому как, по пожеланиям читателей, рукопись дополнена целыми разделами и главами с подробными описаниями инструментов и технологий, используемых в работе над программными проектами.

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

Номер последней редакции: 114
Объём (страниц): 307
Размер файла текста: 2493316 
Размер архива кодов: 2623890
Дата размещения: 09 августа 2014 

© 2011 — 2014

Скачать эту редакцию текст и архив примеров к нему можно:
Googleтекст и архив
Yandex: текст и архив

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

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

вторник, 8 апреля 2014 г.

Драйверы и модули ядра Linux (цикл обновлений)

Последнее обновление "Программирование модулей ядра Linux" было показано здесь в блоге 1 ноября 2013 года, редакция 173 (380 страниц).
Весной-летом был проведен активный цикл внесения правок, изменений, серьёзных дополнений, и ревизии относительно последних версий ядра Linux. Это было сделано в связи с прочтением большого, 48 часового курса лекций по этому материалу для программистов-разработчиков международной софтверной компании Global Logic и преподавателей и аспирантов ведущих киевских университетов. Все вопросы, обсуждения, замечания, пожелания, возникающие в процессе, отражались в тексте, а коды примеров выверялись и корректировались под последние версии ядра Linux (3.13, 3.14, 3.15). 

Итогом стала последняя свежая редакция, которая, как легко видеть, "выросла" с 380 страниц до 422. Желающие смогут свободно обновить свой экземпляр.


Номер последней редакции: 222
Объём (страниц): 422
Размер файла текста: 1318467 
Размер архива кодов:  858802  
Дата размещения: 10 июля 2014

Скачать эту редакцию текст и архив примеров к нему можно:
Google: текст и архив 

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

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

четверг, 13 марта 2014 г.

Ещё несколько экзотических ЯП


Недавно (от 10 февраля, здесь же в блоге) я помещал сравнение ("Сопоставление: 10 языков программирования"): реализации одной и той же задачи, но на разных языках программирования. Чтобы на них можно было взглянуть сравнительно.

Теперь предлагается, в некотором смысле, продолжение темы: та же задача, реализованная ещё на нескольких языках, реже упоминаемых. Я назвал их "экзотическими", но это никакое преуменьшение их достоинств, а просто констатация того факта, что в практических публичных проектах они применяются не так широко. И на то бывают разные основания:
- какой-то из языков ещё слишком нов (Go);
- какой-то используется в отдельных областях (Lisp, Scheme);
- какой-то - в академической среде, образовании и научных исследованиях (Haskell);
Основания бывают разные...

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


На сегодня в сравнение вошли следующие языки:

  • Go
  • Scheme
  • Scala
  • Ocaml
  • Haskell

P.S. Пока это всё... Не исключено, что я этот обзор расширю, включив новые языки ... но это всё зависит от многих обстоятельств: время, здоровье, вдохновение... Не станем загадывать.


Я не копирую текст сюда, прямо в блог, для прочтения, потому как объём его уже на сегодня 29 страниц OpenOffice - многовато будет для онлайн чтения...

Вот файлы на Yandex: архив и текст.
А вот это - то же, но лежащее на Google-диск: архив и текст.

пятница, 21 февраля 2014 г.

Языки программирования: скорость

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

Конечно, такое сравнение очень условно, оно зависит: от класса и конкретного вида решаемой задачи, реализации языкового инструмента (компилятора, интерпретатора), версии этой реализации, степени используемой оптимизации (для компиляции) и т.д. Но это и не есть сравнение скоростей, это есть сравнение порядков скоростей, которые могут отличаться, как увидим, на 2-3 порядка.

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

Полученные результаты описываются в тексте. Пока в сравнении охвачены языки:

  • C
  • C++ (GCC)
  • C++ (Clang, LLVM)
  • Java
  • Perl
  • Python
  • Ruby
  • JavaScript
  • PHP
  • Lua
  • bash
  • Go
  • Ocaml
  • PureBasic
  • Scheme
  • Haskell

Ну вот пока и всё...
Текст и архив примеров кодов можно взять здесь:

- на Google:
Это текст (в формате OpenOffice), и архив к нему. 

- на Yandex:
текст и архив