03.11.2018


Пошёл ты, gettext! Я не хочу париться с компиляцией строк в бинарники!

Модуль предоставляет очень простой и неоптимальный способ перевода скриптов, ботов или приложений. В простоте его сила: всё что нужно для создания различных наборов фраз под несколько языков — это скормить библиотеке JSON-, YAML- или INI-файл (или даже dict). После этого остаётся только получить объект словаря для конкретного языка и извлекать из него фразы по ключам.

В принципе, конечному пользователю нужно знать только про класс LocalizationContainer с его статическим методом from_file(), который читает файл по переданному ему пути и возвращает фабрику локализаций. Хотя инстанциировать её можно и через конструктор с помощью готового dict'а. Затем получить словарь фраз (объект одного из потомков класса LanguageDictionary) можно по коду языка с помощью метода get_lang(). Ещё один вариант — это метод get_language(), который отдельно принимает коды языка и страны.

Поскольку описание может быть несколько туманным и непонятным, то далее будут представлены примеры файлов локализации в различных форматах и код, демонстрирующий использование модуля. Также ознакомиться с его работой можно на конкретном примере в виде кода бота @textUtilsBot.

Установка:

# базовая истановка
pip install klocmod
# или с поддержкой YAML-файлов
pip install klocmod[YAML]

JSON (сперва язык):

{
  "en": {
    "yes": "yes",
    "no": "no"
  },
  "ru-RU": {
    "yes": "да",
    "no": "нет"
  }
}

JSON (сперва фраза):

{
  "yes": {
    "en": "yes",
    "ru-RU": "да"
  },
  "no": {
    "en": "no",
    "ru-RU": "нет"
  }
}

INI:

[DEFAULT]
yes = yes
no = no

[ru-RU]
yes = да
no = нет

YAML (требуется библиотека PyYAML):

# сперва язык
en:
  yes: yes
  no: no
ru-RU:
  yes: да
  no: нет
---
# сперва фраза
yes:
  en: yes
  ru-RU: да
no:
  en: no
  ru-RU: нет

Пример кода:

from klocmod import LocalizationsContainer

localizations = LocalizationsContainer.from_file("localization.json")
ru = localizations.get_lang("ru")
# или
en = localizations.get_lang()    # получить язык по умолчанию
# затем
print(ru['yes'])    # вывод: да
# альтернативные варианты получить конкретную фразу:
localizations.get_phrase("ru-RU", "no")
localizations['ru-RU']['no']

Более подробную информацию можно прочитать в документации (в кои-то веки полноценная документация, сгенерированная Sphinx'ом!). Правда, на английском языке.

Ну и в конце на всякий случай ещё раз напомню, что данный пакет вырос из модуля botutils.multilang, который я упоминал буквально в каждой публикации из цикла статей про ботов в Telegram.

18.03.2017


Git-репозиторий


Уже почти 3 года прошло с тех пор, как я выложил шаблон-фреймворк для очень простого сайта. Пришла пора его обновить и немного вырасти, избавившись от слова «очень».

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

  • Congrats.Cf — настоящий полнофункциональный проект с AJAX-запросами, админкой и API.
  • Exams.Gq — небольшой сайт из нескольких страничек-шпаргалок, удобно генерируемых из лекций, предусмотрительно написанных на KozMUL.

По сравнению с предыдущим шаблоном этот фреймворк обладает куда большей расширяемостью и удобством поддержки (как мне кажется; из-за столь значительных изменений я и решил вынести его в отдельный пост, а не дописать "апдейтом"). Для этого он предлагает Вам придерживаться паттерна MVC и отделять логику от данных и представления, разнося их в разные части приложения (сайта).
К тому же новая версия обладает более современным дизайном и использует часть из моих последних разработок в качестве библиотек. А ещё есть скрипт для сборки готового для загрузки на продакшн-сервер продукта с помощью модулей NodeJS.

А вообще не вижу смысла повторяться: я написал вполне подробное описание структуры фреймворка в README.md, так что просто прошу проследовать в репозиторий и почитать, что написано там. Единственное, что можно добавить, это то, что для корректной работы всех возможностей фреймворка Вам нужно иметь на машине:

Если Вы используете Linux и чего-то из вышеперечисленного у Вас нет, то можете подсмотреть в коде KozConfigurator'а, как это установить.
Для скачивания всех необходимых библиотек и разрешения зависимостей запустите файл install-dependencies (bat для Windows и sh для Linux). Всё, можно работать!


Обновление от 26 марта 2017 (v1.0.1)

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

Старая версия


Обновление от 29 марта 2017 (v1.0.2)

Имена всех PHP-файлов приведены к нижнему регистру, так так только так подгрузка классов работает нормально на Linux-системах. В стилях добавлено отключение горизонтального «ресайза» у textarea. Файлу, запускающему установку зависимостей под Linux, установлены права на выполнение.

Старая версия

22.01.2017


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

SimpleCache
v1.0.1 от 21.01.2017

Репозиторий
Composer: composer require kozalo/simple-cache

Эта библиотека является реализацией простой файловой системы кэширования. В Congrats.Cf она используется (спойлер: в API, которое сейчас разрабатывается), чтобы уменьшить количество обращений и парсинг данных с внешнего сайта.

В документации всё расписано, так что даже не знаю, что ещё я здесь должен сказать. Двигаемся дальше.


Stopwatches
v1.0.0 от 22.01.2017

Репозиторий
Composer: composer require kozalo/stopwatches

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

16.01.2017


Давайте сегодня поговорим о базах данных. Почему нет? Разумеется, в этом посте я дам ссылки на свои очередные библиотеки, как Вы уже могли догадаться по разделу, в котором он находится. Но это же не значит, что нам нельзя будет чуть-чуть и отвлечься. Так? Ладно, поехали!

KozDbBridge
альфа-версия от 15.11.2016

Репозиторий

Начнём с библиотеки, которую я на самом деле уже выкладывал. Но на сайте её так и не было, так что нужно исправить это. Да, KozDbBridge (как всегда, офигенное название) — это небольшой мост для Delphi, которая позволяет выполнять SQL-запросы через единый интерфейс к базе данных, используя либо ODAC, либо стандартный dbExpress. Впрочем, никто не мешает написать реализацию интерфейса для других инструментов.
Ну а больше этот класс ничего и не умеет. Да, всего лишь транслирует запросы и возвращает результат. Мне он нужен был лишь по той причине, что экстренно пришлось переезжать с ODACа, у которого кончился trial-период, на использование стандартных компонентов.

А вообще я Delphi не люблю. Несмотря на то, что когда-то я писал на нём неплохие приложения (сам себя не похвалишь, так никто не похвалит :с), сейчас он безбожно устарел и откровенно бесит. К хорошему быстро привыкаешь и после C# возвращаться на это чудо ну никак не хочется. А ведь местные оборонные предприятия застряли в нулевых и до сих пор заставляют вузики готовить паскалешкольников без малейшего понятия о построении архитектуры приложения, но зато умеющих за ночь сваять кривую диаграмму бизнес-процессов. Это и есть один из тех факторов, почему задерживаться в этом городе надолго мне бы не хотелось. Осталось понять, как решиться на переезд и из «мамкиной корзиночки» стать полноценным самостоятельным человеком без суицидальных наклонностей.


SimpleDatabaseAdapter
v1.1.0 от 21.01.2017

Репозиторий
Также можно добавить к проекту, используя Composer: composer require kozalo/simple-database-adapter

А вот и добрались до героя сегодняшнего дня! SDBA или SimpleDatabaseAdapter похож на предыдущую библиотеку, но уже несколько более серьёзен. Это небольшой посредник между базой данных под управлением СУБД MySQL и Вашим PHP-кодом, использующий для своей работы стандартный модуль mysqli. В чём же соль? Опять бесполезная игрушка? Ну для сложных приложений эта библиотека также не подойдёт. А вот для простых может немного упростить жизнь. Итак, соль.

SDBA позволяет Вам вообще избавиться от SQL-кода! У него есть ряд простых и понятных методов (Select(), Insert(), Update() и т. п.), которые принимают в качестве параметров простые и привычные для PHP стуктуры данных: строки, числа, массивы. Например, чтобы получить имена и адреса электронной почты пользователей некоего сайта из таблицы users достаточно выполнить такой код:

Пример кода, использующего SDBA

У библиотеки есть подробная документация на русском языке, так что не вижу причины объяснять тут ещё что-то. Просто зайдите, почитайте и решите, нужна ли она вам. Вот и всё.


Заключение

Ну пока это всё, что готово на данный момент. На самом деле, у меня ещё начат проект расширяемого интерфейса для языка Python. Как минимум, там сразу будет реализация под SQLite. В отличие от двух вышеприведённых библиотек, эта будет работать с данными в БД по объектно-ориентированной схеме. Уже чувствуется размах и серьёзность? База данных будет генерироваться из миграций, сгенерированных на основе моделей, описанных на Python. И эти же модели будут использоваться для правильного соотношения типов. В общем, задумка годная, но когда будет реализована — хрен знает. Так что приведу пример описания таблицы и будем закругляться.

Пример модели для таблицы Users на языке Python

Вообще, только намучившись с переносом состояния базы данных через экспорты-импорты одного SQL-файла, я понял всю прелесть миграций в Laravel и Entity Framework. Это реально классная штука!

06.01.2017


Этот пост был написан 12 минут назад...

Часто в PHP приходится генерировать строки, похожие на эпиграф. В частности, это было одним из заданий тестового кейса, которое дают в некой местной веб-студии. А также подобная строка отображается у поздравлений на Congrats.Cf (никогда не устану рекламировать! по крайней мере, пока буду выкладывать расчленённые на библиотеки части этого сайта).

Есть готовые решения. В частности, я видел подобный класс для Laravel. Но быстрым поиском я так и не нашёл простого решения без кучи зависимостей от классов различных фреймворков. Вероятно, используя какие-то продвинутые классы, эти решения работают куда корректнее моего велосипеда, учитывая различные часовые пояса и всё такое. Я лично это даже не проверял и, честно говоря, хрен знает, как поведёт себя код в таких условиях (напишите мне что ли — учту и внесу правки).

Не буду здесь приводить какую-либо справочную информацию или туториал, ибо всё есть в файле README.md (а также здесь и здесь). Просто оставлю ссылку на архив и прочие репозитории.

>>  СКАЧАТЬ  <<
v1.0.0 от 06.01.2017

Последнюю версию всегда можно найти в репозитории.
Также доступна установка через Composer: composer require kozalo/russian-datetime

25.12.2016


Merry X'mas!        Merry Christmas

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

Теперь перейдём к делу.

>>  СКАЧАТЬ  <<
v1.0.2 от 02.01.2017

Посмотреть самую последнюю версию в репозитории.
Также можно подключать по ссылке: http://libs.nekochan.ru/KozMUL.js
Ну и через Bower: bower install kozmul.

Сегодня я представляю на суд общественности следующую разработку, появившуюся на свет благодаря работе над одним сайтом, релиз которого, надеюсь, будет в ближайшее время. Леди и джентльмены, разрешите представить вам KozMUL — Kozalo's Mark-Up Language!

Что же это такое? KozMUL — это язык оформления простеньких HTML-страниц без использования самого языка разметки гипертекста. Людям, знакомым с похожим языком Markdown, будет проще понять смысл моей разработки. Также KozMUL — это моя библиотека для преобразования текста на этом языке в обычный HTML-код.
Я написал подробное руководство по языку, используя только средства самого языка (во как!), и выложил сюда. Та же HTML-страница вместе с отдельным kml-файлом находится в архиве, приложенном к этому посту. Знатоки английского языка могут также почитать международную версию мануала, красиво сгенерированную одним из генераторов вышеупомянутого Markdown'а. Поиграться же можно в онлайн-редакторе.

На самом деле не знаю, что ещё можно тут написать, кроме пачки ссылок. Я и так потратил кучу времени на то, чтобы написать все эти отдельные статьи.

Дисклеймер: картинки с аниме-девочками я просто взял случайным образом из ленты в VK и никоим образом не претендую на их авторство или что-нибудь ещё.

18.12.2016


>>  СКАЧАТЬ  <<
v1.1.1 от 9.06.2018

Посмотреть самую последнюю версию в репозитории.
Также можно подключать файл, содержащий в себе всю библиотеку: http://libs.nekochan.ru/KozUtils-AIO.js.
Ну и можно установить через Bower: bower install kozutils.

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

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

Итак, какие функции есть уже сейчас? Сперва уточним, что библиотека состоит из 4 отдельных файлов:

  1. KozExceptions.js — содержит набор готовых классов-исключений, которые выбрасываются остальными скриптами (но данный файл можно и не подключать; тогда будут выбрасываться текстовые исключения).
  2. KozStrUtils.js — расширяет возможности базового строкового класса.
  3. KozUtils.js — содержит общие вспомогательные функции.
  4. KozYouTubeUtils.js — состоит из парочки функций, помогающих в работе с YouTube API.

Также есть пятый, all-in-one, файл: KozUtils-AIO.js, который представляет собой сконкатенированную и минифицированную версию всех файлов сразу. Он и хранится на Libs.NekoChan.Ru.


KozUtils

  • initOptions(options, defaultOptions) — используйте эту функцию, когда есть функция, которая принимает определённый набор параметров в виде объекта. Данный объект следует передать, как options, а в качестве второго параметра нужно передать объект по умолчанию со всеми возможными параметрами. Функция объединит объекты, давая преимущество значением из пользовательского объекта, и вернёт итоговый объект. Если параметр options не опредён или равен null, просто возвращает объект по умолчанию.
  • checkMissingParameters(parameters, funcName, paramNames) — функция предназначена для того, чтобы убедиться, что в функцию передали все необходимые параметры. В качестве первого параметра принимает массив параметров, остальные два (название функции и массив названий параметров) используются для вывода более информационного сообщения об ошибке, если обнаружится отсутствующий параметр. В качестве funcName можно передавать не только строку, но и ссылку на функцию, а parameters и paramNames могут быть не только массивами, но и единственными значениями (для случаев, если функция принимает только один параметр). Если какой-то параметр пропущен, возбуждается либо KozExceptions.missingArgument (если нужная библиотека подключена), либо простое текстовое исключение.
  • checkParameters(parameters, types, funcName, paramNames) — расширяет предыдущую функцию. Проверяет не только отсутствие параметров, но и правильность их типов, для чего появляется параметр types, принимающий массив строк с названиями типов ("string", "number", "function" и т. д.), но может быть и одинокой строкой, если параметр один. Соответственно, может возбуждать не только KozExceptions.missingArgument, но и KozExceptions.invalidArgument.
  • getActualSize(element) — принимает любой HTMLElement и возвращает реальные размеры элемента после вычисления всех стилей в виде объекта из полей width и height.

KozExceptions

  • invalidArgument(argumentName, message) — следует бросать, когда в функцию пришёл аргумент не того типа либо значение недопустимо.
  • missingArgument(argumentName, message) — следует бросать, когда в функцию не был передан обязательный параметр.
  • notImplementedYet() — простая заглушка для методов и функций, которые только планируются к реализации.
  • abstractClass() — следует бросать из функций-конструкторов абстрактных классов.
  • unresolvedDependency(library) — следует бросать, когда при проверке наличия объекта нужной библиотеки в области видимости скрипта было выявлено его отсутствие.

KozStrUtils

  • matchAll(regExp) — ищет в строке все вхождения заданного регулярного выражения (которое может быть строкой, которую метод сам обернёт с RegExp) и возвращает массив объектов, состоящих из двух полей: index — позиция первого символа из найденной строки, string — всё совпавшее выражение.
  • shortenTo(length) — используйте эту функцию, чтобы получить строку не больше указанной длины (+1 символ на троеточие) и сокращённой до ближайшего слова. Например, для строки "очень длинная строка" с параметром 17 (середина слова "строка") вернёт "очень длинная…".

KozYouTubeUtils

  • parseId(text) — ищет в строке ссылки на YouTube-видео и возвращает идентификатор первого найденного видео. Если не находит ничего, возвращает false. Например, "Воу, какой крутой урок по C#! https://youtu.be/uI3rZYk2sYk?list=PLWCoo5SF-qAMDIAqikhB2hvIytrMiR5TC" вернёт "uI3rZYk2sYk".
  • durationToString(str) — конвертирует время длительности видео из формата YouTube (на самом деле там какой-то стандарт, но я не помню названия) в более читаемое и привычное представление. Например "PT3M54S" станет "03:54".

Вот в общем-то и всё. Все функции нужны были лично мне и использованы в реальных проектах, так что остальное будет добавлено потом, по надобности. Хотя можете оставлять свои предложения в комментариях! Ну и найденные ошибки тоже пишите.


Обновлено 20.12.16:

  • исправлено построение минифицированных версий скриптов, чтоб KozStrUtils.js и KozUtils-AIO.js не отваливались;
  • добавлено новое исключение: unresolvedDependency.

Обновлено 09.06.18: исправлена ошибка в KozYouTubeUtils, связанная с неправильным парсингом идентификаторов видео, содержащих знак «-», у коротких ссылок.

10.05.2014


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

Итак, в последнее время я сделал ряд небольших сайтиков, выполняющих какую-то одну узкоспециализированную задачу. Не знаю, практично ли такое разделение труда, но время покажет. Color Blindness Test получился довольно своеобразным (но и занял больше всего времени), а вот два последних (один из которых выходит одновременно с ЭТИМ) не отличаются разнообразием. Они построены по одному макету, по одному шаблону, по одному дизайну... Можно как угодно это назвать, но в создании второго использовалась приличная часть материалов из первого. И мне в голову пришла мысль: "А это же довольно-таки удобный дизайн для таких небольших проектов. Хм. А вдруг я захочу ещё что-нибудь подобное сделать? Может стоит его обобщить, разделив на модули и отделив общее от конкретного [ну и сказанул - прим. из внекавычного пространства]? Может стоит сделать шаблон? Движок? Фреймворк?" Таким образом и родилась идея ЭТОГО. На движок оно не тянет, на фреймворк тоже не особо похоже, а шаблоны у меня ассоциируются с шаблонами для движков. Так что фиг знает. Назвал пока так, как назвал: шаблоном-фреймворком. А в англоязычной документации употребил выражение pattern-framework.

Честно говоря, я вообще сомневаюсь, что ЭТО может кому-то пригодиться, но раз уж сделал, то сделал. Ниже разлеглась ссылка на архив с примером небольшого обобщённого сайтика, сопровождённого комментариями и небольшой документацией (небольшой?! да её там чуть ли не больше, чем рабочих символов!), с помощью которого можно за 2 минуты понять, как работать с ЭТИМ. Итак...

>> СКАЧАТЬ ЭТО <<


Лирическое отступление:
В последнее время стиль у меня стал уж какой-то совсем разговорный, б**дь. Может сказывается не особая серьёзность раздела, может некоторые изменения в личности (в последнее время много чего изменилось; может быть, когда-нибудь напишу заметочку-рассуждение об этом), может чумачечая весна, может наркотики я с ума сошёл ещё что-то - не знаю. Но прошу меня извинить за такую вольность. Или же Вам нравится такой стиль? Дайте мне знать, если не картошка пень лень (вот уже и на "ты" перешли; вообще ппц).
Ну а если серьёзно, то во время чистки и сортировки я подчищу весь этот bullsh*t.

13.12.2011


Вот она - моя первая DLL-библиотека! Она написана на Delphi и содержит четыре функции: countSymbols(), delSymbols(), decToBin(), binToDec(). Первая принимает две строки: собственно строку, где искать, и строку/символ, который надо искать - и возвращает число - количество найденных строк/символов. Вторая удаляет в указанной строке (первый параметр) все подстроки (второй параметр) и, не изменяя исходную строку, возвращает обрезанную (можно использовать, например, для удаления пробелов или переводов строк). Третья и четвёртая переводят числа из десятичной системы счисления в двоичную и обратно. Третья принимает число и возвращает строку, а четвёртая принимает строку и возвращает число.

Для проверки DLL'ки я сделал простенькую программу, с которой вы cможете ознакомится и посмотреть на возможности библиотеки.

Скачать ZIP-архив с библиотекой и демонстрационной программой.

Подсказка для Delphi-программистов:
Как передавать строки в функции? Если говорить точнее, то они принимают не "string", а "pchar" (по архитектуре Win32). Для конвертации этих форматов есть две простые функции: StrPas() - принимает pchar-строку и возвращает её string-эквивалент, PChar() - принимает string-строку и возвращает её pchar-эквивалент.

<<   / 1   >>