Как стать автором
Поиск
Написать публикацию
Обновить

Парсер NPParser

Парсер NPParser


Сейчас я пишу программу-интерпретатор. Рабочее название — «SP-NetP» — расшифровываю так: Simple Programming — Net Programming. Хотелось бы придумать какое-нибудь интересное название… Для него написал свой парсер, так как стандартный мне не нравится. И решил выложить его код сюда, в блог: вдруг кому-то понадобится… Осознаю, что у каждого программиста особых проблем с написанием парсера не должно быть, но если писать его не хочется, то берите :).
Реализован как объект «TNPParser».

Для того, чтоб начать работу, надо добавить модуль NPParser в секцию uses и объявить экземпляр объекта, например — var parser:TNPParser;

Далее, для начала работы, надо инициализировать парсер текстом. Для этого есть два метода:
procedure TNPParser.SetFile(s: string);
procedure TNPParser.SetText(s: string);

Из названий следует, что первый — открывает файл и использует содержимое файла для разбора. Второй — использует для разбора текст, который передается в переменной s.

Давайте создадим проект — Application, с одной формой. Кинем на форму TMemo, допустим с именем Memo1.
Добавим в проект NPParser.pas и NPParser в uses модуля unit1.
Напишем в секции public формы parser:TNPParser;
Кинем 2 кнопки, одна — инициализация, другая — переход к следующей лексеме.
И, напоследок, TEdit — для просмотра текущей лексемы — «токена».
Для того, чтоб узнать, какая лексема рассматривается в данный момент используйте метод
function NowStr: string;

Напишем:
procedure TForm1.InitButtonClick(Sender: TObject);
begin
parser.SetText(Memo1.Lines.Text);
edit1.Text:=parser.NowStr;
end;

procedure TForm1.NextButtonClick(Sender: TObject);
begin
parser.Next;
edit1.Text:=parser.NowStr;
end;

Можете запустить. Введите какой-нибудь текст и нажмите инициализацию. Увидите первую лексему в edit1.
Нажимайте кнопку Next для просмотра последующих лексем.

Краткий обзор остальных методов и свойств:

function TNPParser.NextPreview:TNPLexeme; — позволяет, без перехода на следующую лексему, просмотреть ее.

function TNPParser.GetInfo: TNPLexeme; — узнать информацию о текущей лексеме.

function TNPParser.ReadIdent:string; — очень важный метод, позволяет прочитать несколько лексем подряд по правилу идентификаторов (как переменную). Например, «hello_1» прочитает как одну лексему. После вызова этого метода указатель будет стоять на следующей лексеме после идентификатора.

function TNPParser.NowType:TParserExpType; — также важный метод. Возвращает тип лексемы под указателем (текущей). Может принимать такие значения:
petNone, petString, petInt, petFloat, petOther, petSpace, petEOLN, petEOF. В объявлении типа также присутствует petOper, но он не используется здесь, а используется в математическом парсере.


function TNPParser.ReadToEOLN:string; — позволяет прочитать весь текст, пока не встретится конец строки.property ReadSpaces:boolean — свойство, указывающее парсеру, считать ли пробелы лексемами.

property ReadNegativeNumbers:boolean - считывать ли отрицательный числа, или разделять на 2 лексемы — отдельно знак минуса и число.

property ReadEOLN:boolean — аналогично ReadSpaces указывает, считать ли конец строки лексемой.


property NowPosition:cardinal — указывает текущее положение указателя.

property NowLength:cardinal — указывает общую длину разбираемого текста.Парсер удобно использовать, если вы пишете скриптовый язык, либо просто парсер командной строки.

Скачать парсер и пример

Посмотреть исходный код

10 современных альтернативных операционных систем и что они могут значит для будущего

Перевод (местами — вольный) 10 amazingly alternative operating systems and what they could mean for the future

Этот пост посвящен кое-каким, уже давно находящимся под наблюдением определенных людей, операционным системам, отличным от всем известных MS Windows, Mac OS X и инкарнаций Линукса, тысячи их.

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

Как будет видно, многие из них существенно отличаются от тех, которыми вы привыкли пользоваться. Об их потенциале и значении для будущего мы поговорить в конце статьи.

Ну, хватит вступления, начнем уж. Перед вами иллюстрированный обзор 10 альтернативных операционных систем, и начинается он со знакомого для многих имени…
Читать дальше →

Includes в Photoshop

Всем программистам знакома технология include – когда вы включаете в файл другие файлы. Это удобно, т.к. можно поменять что-то в одной часть и это поменяется везде, где эта часть используется. И тут меня посетила страшная мысль: а может ли Photoshop использовать подобную технологию? Например, при создании сайта иметь отдельно файл с шапкой и низом, которые бы использовались в других файлах.

Пример «на пальцах»:

image

Для примера мы делаем 3 файла: top.psd, bottom.psd и index.psd в который нужно их поместить. Первое что приходит на ум – пункт меню File-Place (Файл-Поместить), который создает Smart-объекты. Так и делаем.

image

Помещаем(File-Place) нужные файлы-части(top.psd, bottom.psd) в основной файл(index.psd).
image

Но вот в чем проблема: если что-то изменить в файле top.psd, то в файле index.psd ничего не изменится, Потому-что smart-объект не является ссылкой на файл. Это, скорее, копирование в index.psd. Получается, что top.psd не то же что smart-объект в index.psd[top].

image

Можно, нажав правой кнопкой мыши на Smart-объекте, заменить его на новый (Replace Contents), но это не наш подход. Можно сделать Action Script, который будет заменять созданные слои, но тогда для каждой части придется создавать свой Action Script.

После долгой борьбы за справедливость, первый раз открыв ExtendScript, был написан скрипт, который автоматически обновляет все smart-объекты. Скрипт находит все smart-объекты в файле и обновляет их, заменяя файлами в папке с исходным файлом. Cкрипт ориентируется по имени слоя и заменяет его файлом с соответствующим именем. (Для удобства выполнение скрипта можно повесить на горячую клавишу)

Для работы необходимо:


1. Добавить файл скрипта в папку фотошопа:
«С:\Program Files\Adobe\Adobe Photoshop CS4\Presets\Scripts\Update includes.jsx»
2. Поместить все файлы в один каталог
image
3. Создать smart-объекты необходимых частей, назвав их СООТВЕТСТВЕННО ИМЕНАМ ФАЙЛОВ.
image
4. Для обновления – нажать File->Scripts->Update Includes

Листинг скрипта:


// Copyright 2002-2007. Adobe Systems, Incorporated. All rights reserved.
// This script will launch JavaScript debugger.

// enable double clicking from the Macintosh Finder or the Windows Explorer
#target photoshop

// in case we double clicked the file
app.bringToFront();

function replaceSmartLayerContents( file ) {
var desc = new ActionDescriptor();
desc.putPath( charIDToTypeID( "null" ), file);
executeAction( stringIDToTypeID( "placedLayerReplaceContents" ), desc, DialogModes.NO );
};

function main() {
// Создаем указатель на текущий документ
var docRef = app.activeDocument;
// Получаем рабочий каталог текущего файла
var workFolder = app.activeDocument.path;
debugger;
//Проходим по все слоям...
for(i=0;i<docRef.layers.length;i++){
// ...и выбираем smart-объекты
if(docRef.layers[i].kind == LayerKind.SMARTOBJECT){
// Получаем имя файла из имени слоя
var filename = docRef.layers[i].name;
// Открываем файл
var updatefile = File (workFolder+'/'+filename);

//Проверяем наличие файла
if(updatefile.exists)
{
// Выделяем обновляемый слой
docRef.activeLayer = docRef.layers[i];
// Обновляем слой
replaceSmartLayerContents (updatefile);
docRef.activeLayer.name = filename;
}
}
}
};

main();

Zend Framework: Прямое использование Zend_Acl

Поделюсь с вами своим опытом в этом вопросе.

Задача:

Разграничение прав доступа по разделам сайта, с разными правами на каждый раздел, при этом они должны мнгновенно меняться если права для пользователя были изменены.

Тип сайта:

интранет.

Что будет использоваться:

Oracle, Zend Framework, Zend_Acl

1. База данных


Используем 3 таблицы, USERS, USERS_RIGHTS, MODULES

USERS:
CREATE TABLE "USERS" (
"ID" NUMBER NOT NULL ,
"USERNAME" VARCHAR2(50 BYTE) NULL ,
"PASSWORD" VARCHAR2(32 BYTE) NULL
);

USERS_RIGHTS:
CREATE TABLE "USER_RIGHTS" (
"USER_ID" NUMBER NULL ,
"RULE" VARCHAR2(100 BYTE) NULL ,
"TYPE" VARCHAR2(500 BYTE) NULL
);

MODULES:
CREATE TABLE "MODULES" (
"ID" VARCHAR2(20 BYTE) NOT NULL ,
"SHORTNAME" VARCHAR2(200 BYTE) NULL ,
"NAME" VARCHAR2(200 BYTE) NULL ,
"LINK" VARCHAR2(200 BYTE) NULL ,
"PARENT_ID" NUMBER NULL ,
"LANGUAGE" VARCHAR2(2 BYTE) DEFAULT 'lv'  NULL
);

Сайт построен таким образом, что модуль и контроллер должны быть указанны всегда (/module/controller). В результате Можно держать уникальные записи для каждого раздела. В моем случае это MODULES.SHORTNAME. В этом поле будут хранится связки module-controller, module-controller-action.

Добавим немного данных в таблицу MODULES:
INSERT INTO "MODULES" VALUES ('1', 'data', 'Данные', '/data', '0', 'ru');
INSERT INTO "MODULES" VALUES ('2', 'data-users', 'Пользователи', '1', 'ru');

В таблицу USERS:
INSERT INTO "USERS" VALUES ('1', 'demo_username', 'demo_password');

В таблицу USER_RIGHTS:
INSERT INTO "USER_RIGHTS" VALUES ('1', 'data', 'read');
INSERT INTO "USER_RIGHTS" VALUES ('1', 'data-users', 'read,add,edit,delete,search,export,history');

2. Настройка Zend_Acl


Следующий шаг будет изменение booststrap.php файла. В него нужно добавить запись о настройке Zend_Acl. Так как я использую классову структуру этого файла, то мой вариант может отличаться от того, как вы это реализуете.
public static function setupAcl() {
    	$auth = Zend_Auth::getInstance();
    	if ($auth->hasIdentity()) {
    		self::$acl = new Zend_Acl();
                self::$acl->addRole(new Zend_Acl_Role(null));

	        $db = self::$registry->database;

    		$sql = "SELECT shortname FROM modules WHERE ".$db->quoteInto("language = ?", $auth->getIdentity()->LANGUAGE);
	        $modules = $db->fetchAll($sql);

	        foreach ($modules as $v)
	        	self::$acl->add(new Zend_Acl_Resource($v['SHORTNAME']));

	        $sql = "SELECT rule,type FROM user_rights WHERE ".$db->quoteInto("user_id  = ?", $auth->getIdentity()->ID);
	        $rules = $db->fetchAll($sql);

	        foreach ($rules as $v) {
	        	$perms = explode(',', $v['TYPE']);
	        	if (self::$acl->has($v['RULE'])) self::$acl->allow(null, $v['RULE'], array_values($perms));
	        }

	        self::$registry->set('Zend_Acl', self::$acl);
    	}
    }

Немного обьяснения:
self::$acl->addRole(new Zend_Acl_Role(null));

По правилам мы должны назвать роль, например «administrator» или «user», но это делать не обьязательно. Наш вариант включает уникальные права для каждого, которые заданы в таблице USER_RIGHTS. По-этому мы опускаем эту «формальность».

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

Следующий шаг, это выбор прав пользователся: логика здесь такова, что мы выбираем все модули доступные пользователю и тип доступа, который хранится через запятую в поле USER_RIGHTS.TYPE.

И последним шагом является присвоение этих самых прав. И теперь когда мы будет проверять $acl->isAllowed(null, 'data-users', 'read') будем получать true, а если напишем вместо read какой-либо не существующий тип, то получим false. В общем то, к чему стремились.

3. Плагин для Фронт контроллера



class System_Rights extends Zend_Controller_Plugin_Abstract {
	public function preDispatch(Zend_Controller_Request_Abstract $request) {
		$db = Zend_Registry::get('Zend_Db');
		$query = array();
        $query[] = $request->getModuleName();

        if ($request->getControllerName() != 'index') $query[] = $request->getControllerName();
        if ($request->getActionName() != 'index') $query[] = $request->getActionName();

        /* define module/controller/action like /data/users/add */
        define('_CURRENT_MODULE', implode('-', $query));

        /* define current main module/controller like /data/users */
        if (count($query) > 2) array_pop($query);
        define('_CURRENT_MAIN_MODULE', implode('-', $query));
	}
}

Это пойдет в наш bootstrap.php:
$frontController->registerPlugin(new System_Rights());

Как вы могли заметить в планине нет ничего особенного… в принципе там нет ничего :) Просто это не весь функционал, который был в него заложен, но для ознакомление с этим вариантом этого достаточно.

4. View


Теперь можно запускать проверки в шаблонах в виде:
<?php if ($this->acl->has(_CURRENT_MAIN_MODULE) && $this->acl->isAllowed(null, _CURRENT_MAIN_MODULE, 'read')):?>
Все окей прав достаточно
<?php else:?>
Уля ля, куда это вы ?
<?php endif;?>


_CURRENT_MAIN_MODULE или _CURRENT_MODULE использовать в зависимости от надобности и выданных прав.
В контроллерах также нужно проверять $acl->isAllowed(); или же можно дописать немного плагин, который сам будет проверять, может ли человек смотреть тот раздел сайта, в котором находится.

Если кто-то заинтересуется более подробно этим вопросом, могу выложить demo код, который будет включать в себя все то, что мы здесь проделали :)

Виртуализация в linux при помощи kvm

Часто по долгу службы приходится запускать в виртуальной машине различные ОС. В процессе посика решения перечитал множество документации по теме. Следует заметить, что информации — море. Виртуализация нынче «в моде». Тем не менее, не нашел ни в одной статье краткого описания готового решения, которое бы просто работало. Попытаюсь восполнить пробел. На ваш суд статья о том, как быстро и без лишних телодвижений запустить виртуальную машину в linux при помощи kvm.

Читать дальше →

Проблемы Active Record в CodeIgniter — Вложенные запросы, Внутренние функции БД

Ошибка в результирующем запросе при использовании встроенных функций БД



Есть код который генерирует не правильный SQL-запрос.
$p = $this->db->dbprefix('table');
$sub = $this->db->dbprefix('sec_table');

$this->db->select($p.'.id', false);
$this->db->select($p.'.main_name', false);
$this->db->select('(COUNT('.$sub.'.id) + 1) AS pages_count', false);
$this->db->from($sub);
$this->db->join($p, $sub.'.profile_id = '.$p.'.id', 'RIGHT');
$this->db->where($p.'.is_vip', 1, false);
$this->db->where($sub.'.is_enable', 1, false);

$res = $this->db->get();


генерируемый SQL имеет добавочный префикс таблиц — pr_(COUNT(pr_sec_table.id) + 1) AS pages_count

К сожалению, расширение классов базы данных не возможно стандартными средствами CI. Как избавиться от такого спецэффекта без правки кода самого фреймверка? только ручным формированием кода запроса?
Читать дальше →

IE. Проблема при динамическом создании radio инпутов

В internet explorer ниже 8 версии существует такая проблема: при динамическом создании радио инпутов, они(инпуты) отображаются неактивными(т.е. невозможно выбрать инпут кликом по нему).
Читать дальше →

JpGraph — монстер для ваших php-приложений. Часть первая.

О...

Итак, библиотека JpGraph была разработана Шведской компанией Aditus Consulting, которую возглавляет Йохан Перссон. Эта библиотека очень мощна, и её объем достигает 3,5 мегабайт. Имеется хорошая документация по классам и методам этой библиотеки на английском языке. Последнюю версию можно скачать на сайте разработчика.
Читать дальше →

Программирование с J2ME. Intro

Если я получу инвайт, то этой статьей откроется серия материалов для желающих творить на J2ME (:

Итак, %username%, ты хочешь наполнить свой телефон выхлопами продуктами своего творчества? Я попытаюсь доступно рассказать тебе как.

Читать дальше →

Баг масштабирования в IE7

Введение



Хочу рассказать о баге масштабирования в IE7 и двух способах его решения. Если вы знаете что такое идеальная верстка и как браузеры масштабируют страницы, то следующие два раздела статьи можно смело опустить. :)

Читать дальше →

Professional Music: from VST to hardware

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

Эта статья раскрывает идею о переходе с софт решения на железное для музыкальной группы, играющей электронную музыку наживо. А также «аппаратные» планы и идеи на будущее. Статья ориентированна на музыканто, имеющих опыт в электронной музыке.

Продолжение...

Отладка проектов на удаленных web серверах в NuSphere

Хочу рассказать всем, кто пользуется NuSphere IDE(или собирается начать пользоваться) как настроить remote debugging. так как локальный отладчик встроенный в SVN web сервер(встроенный в IDE) не подходит для более менее сложных проектов.
Итак приступим, буду рассматривать настройку этой процедуры на win XP. У вас должна быть установлена NuSphere и собственно сам web сервер. Установку первого смотри тут, установка и настройка web сервера смотри тут, вообщем в этом проблем возникнуть не должно.
После всех этих установок идем по этой ссылке и качаем NuSphere PHP Debugger Wizard Script — он нам заметно поможет в настройке remote debugging.
Затем закидываем этот скрипт в корневой каталог сайта в моем случае это C:\apache\test.com\www, затем запускаем сервер и переходим на test.com/dbg-wizard.php, там довольно подробные инструкции, но если вы не слишком любите инглиш, то смысл там в следующем:
  • Заходим в каталог с установленным NuSphere в подкаталог debugger\server и там выбираем ту OC под которой работает web сервер, и копируем dbg-php-5.2.dllв подкаталог php\ext
  • Затем открываем php.ini и проверяем такую строку extension=dbg-php-4.4.so если ее нет, то добавляем ее
  • После добавляем так же в php.ini, такие строки:
    [debugger]
    debugger.enabled=on
    debugger.profiler_enabled=on
    debugger.hosts_allow=host1 host2
    debugger.hosts_deny=ALL
    debugger.ports=7869, 10000/16

  • Затем перегружаем сервер и ГОТОВО!

Чтобы проверять все ли работает, нужно создать проект, основными настройками которого будут:
  • root directory и oot remote directory здесь укажите путь к корневому каталогу сайта(в моем случае C:\apache\test.com\www)
  • run mode выбирете 3rd party web server

Если что оказалось не допонятым вот вам видео установке отладчика правда на английском.
Ну вот пожалуй и все!!! Наслаждайтесь;-)

PDA vs Linux. Устанавливаем Familiar 0.8.4 на HP iPAQ h2210.

Доброго времени суток, уважаемые хабра жители.
Хочу поделиться с вами опытом установки linux системы на кпк. И надеюсь получить приглашение на Хабру ^_^.
Так получилось что мне в руки попала конкретная модель от HP, а именно iPAQ h2210, и так как отдавали мне её с условием, что я установлю туда этот самый linux, то первым делом, когда я пришёл домой, я занялся поиском информации как это сделать и возможно ли это вообще. Сразу скажу, что русскоязычных ресурсов, статей али чего другого в сети я не нашёл. Для начала методом запроса через гугол было выяснено что есть такой порт, поддерживающий мою серию кпк h2xxx. Соответственно отправился на страницу порта(то есть сюда), где с помощью нехитрых манипуляции скачал дистрибутив с Qtopia-based GPL graphical interface(скриншоты понравились). Получил тарбол, распаковал его в домашнюю папку и воззрился на содержимое. В содержимом было несколько файлов( bootopie-xx.jffs2, bootopie-xxx.tar.bz2, LAB-image-xxx.htc, zImage-2.6.15-hh2-h2200) и естественно никакой инструкции по установке, не говоря уже про настройку. Полез искать дальше, нашёл подходящую инструкцию по этому адресу >> .
Дальше все просто, сделал все точно так как написано в инструкции. Создал два раздела на флэшке…
Ах да, совсем забыл сказать, во избегании потери работоспособности кпк я решил устаналивать порт на MMC карточку а не в память устройства.
Так вот, создал два раздела. Первый fat16 на 50 метров и второй ext2 на оставшееся место(флэшка двух гиговая).
Создал на первом разделе фаил startup.txt с содержимым как указано в инструкции и скопировал три файла из распакованной папки(bootopie-xx.jffs2, LAB-image-xxx.htc, zImage-2.6.15-hh2-h2200). Оставшийся трабол распаковал на второй раздел флэшки. Дальше мне стало непонятно, так как в инструкции сказано о необходимости запуска некоего файла haret-*.exe из под винды на кпк. В дистрибутиве его не оказалось, полез искать на просторах ресурса. Нашёл по этому адресу >> .
Дальше все просто, вставил карточку в кпк, запустил там фаил haret-*.exe в следствии чего на экране появился пингвин с градусником, шкала градусника заполнилась цветом и у пингвина покраснели глаза, экран стал чёрным, работала только подствека. Дальше я подождал немного… потом ещё немного, а потом ещё чуть чуть, но терпения не хватило и я решил что ничего не получается. Стал читать дальше, ничего особенного не начитал и решил ещё раз попробовать, запустил haret.exe, появился чёрный экран и… и тут мне позвонили, разговаривал я долго, где то 15 минут, после чего взглянув на экран кпк я обнаружил приглашение загрузчика откалибровать экран. Тут я естественно с замиранием сердца обрадовался несказанно, потыкал в экран, выставил время, ввёл имя пользователя и вуаля — загрузился рабочий стол!
На этом можно статью и заканчивать, хочю только рассказать впечатления после того как я немного поюзал этот порт и посмотрел что там есть.
Первое что бросилось в глаза это большое количество программ уже инсталлированных в рабочее окружение. Тут и pdf вьювер и редактор текста и пять каких-то игр и консоль и куча настроек, irc клиент… вообщем куча всего. Для начала я потыкал во всяческие индикаторы(батарея, синезуб, инфракрасник). Индикатор батареи не работает. Синезуб, работает. Но, как выснилось потом, менеджер синезуба падает при попытке передать фаил с устройства на другое устройство. Инфракрасник вроде как работает, но проверить не получилось( нет у меня других девайсов с инфракрасным портом). Там же, рядом с этими индикаторами\аплетами есть иконка програмки, которая делает скриншоты с экрана, чем я и воспользовался, и могу теперь показать вам (see -> ).
Придя на работу и показав кпк бывшему хозяину, который ставил условие по установке на кпк линукса, я оставил устройство ему на некоторое время. Зря я это сделал :)
Первое что захотел проверить бывший хозяин это как отреагирует система на soft ресет. Система попыталась уйти в ребут, но ничего не вышло :) кпк полностью завис, не реагировал ни на что, горели только лампочки индикации. Ресет кнопачкой на задней панели не помог, вытаскивание аккумулятора не спасло, пришлось искать инструкцию по хард ресету устройства. Нашёл( две нижние кнопачки на передней панели, обозначенные как календарь и стрелочка возврата + кнопка ресета на задней панельки, подержать пять сек и ещё раз нажать отдельно кнопку ресета на задней панельке) сделал, устройство ребутнулось и заработало.
Все.

Перевод статьи о ZFS

Перевод статьи
«ZFS Uncovered» By David Chisnall.
оригинал http://www.informit.com/articles/article.aspx?p=712746&seqNum=1
Перевод мой. Конструктивная критика и пожелания приветствуются.


Неприкрытая ZFS

Когда в Sun проектировали ZFS, они выбросили сборник правил и создали нечто, не имеющее прямых аналогов в любой другой UNIX-подобной системе. David Chisnall рассмотрел какие произвели изменения обычных моделей хранения, какие основы заложены в систему, и как это все совмещается друг с другом.

Каждые несколько лет, кто-то делает предсказание относительно того, как много частных компьютерных ресурсов, вероятно, потребуется в будущем. Позже, все смеются над собой, над тем насколько наивны они были. В проектировании ZFS Sun попыталась избежать данной ошибки.
Читать дальше →

Verbarius Лебедева в App store

В App Store был обнаружен лебедевский Verbarius, а точнее его копия для Iphone. Функционал судя по всему аналогичен железному устройству. Доступны три языка: русский, английский, французский. Стоит программа 99 центов, что в 200 с лишним раз дешевле аналогичного продукта в красивой коробке и упаковке :)

Вот собственно скриншот программы:
image

И ссылка на Verbarius в App Store (откроется в iTunes)

Работа с XML в Silverlight2

Известно, что XML (Extensible Markup Language) — это замечательный формат для обмена структурированными данными. В данной статье, я бы хотел поделиться опытом работы с XML средствами Silverlight, по средствам объекта XmlReader.
Читать дальше →

Даешь VPS каждому! О пользе Virtual Private Server в быту и народном хозяйстве

Virtual Private Server (VPS) – это, грубо говоря, виртуальная машина, работающая на физическом сервере компании-хостера, сдаваемая в аренду. Берущий в аренду такую виртуальную машину получает полный административный доступ к этой виртуальной машине и может создавать новых пользователей, доставлять или компилировать любое программное обеспечение, и запускать любые серверные приложения. Бывают VPS с линуксом, а бывают и с Windows.

Уже долгое время цены на VPS держатся на адекватных уровнях. Так, стоимость начальных тарифных планов часто достигает уровня в $15/month (при выделенном дисковом пространстве в 10GB).

Пользователь может арендовать дополнительные ресурсы для виртуальной машины хостера – например, купить еще 1 IP адрес (около $1/month), дополнительное дисковое пространство (примерно $1/month за 1GB), или увеличить оперативную память, гарантированно выделяемую виртуальной машине.

При данных ценах, которые очень даже невелики, каждый ИТ — специалист может в состоянии владеть своим VPS сервером.

Для чего может быть полезен VPS сервер в быту и народном хозяйстве?
Читать дальше →

No wheel reinvention или собираем ACL + Auth на PHP

В свете того, что на habr’е появились уже две статьи про ACL — Система разделения прав доступа в веб-приложении — часть 1, теория и Система разделения прав доступа в веб-приложении и обе они сводятся к переизобретению реализации механизмов контроля доступа, то мне хотелось рассказать о другом подходе.

Первая статья – описание довольно спорного подхода. Битовая арифметика это кончено прикольно и все такое ;), но мне бы лично не хотелось с ней часто встречаться, особенно если поддержке, в рамках которой часто нужно менять, то можно пользователям разных групп. Вторая – написана довольно «сумбурно», если можно так сказать. Делать физическую модель сверху вниз (сущности -> атрибуты -> нормализация) для такой маленькой модели вообще смысла нет. Человеку, проектировавшему реальные модели, нужно приложить усилия, чтобы сделать модель ниже 3-ий нормальной формы ;). И в коде (пример использования) чего-то там клонируется, include’ится. IMHO для такой постановки вопроса совсем не KISS ;)

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

Проблема: удобный (API) механизм аутентикации и авторизации для интернет-приложения.

Слово «аутентикация» я использую без «фи» т.к. в том слове, от которого оно произошло (authentication) это самое «фи» отсутствует, а еще так говорил один мой преподаватель – сын гордого, южного народа отстаивал именно такое произношение не только среди своих студентов, методом «кнута и пряника», но и среди коллег, но уже другим методом ;).
Читать дальше →

Забудьте о проблемах с памятью!

Все программисты на C++ знают, что такое memory leak и сколько сил требует борьба с этим недугом, если он вдруг появился. Спасение ищется во всевозможных smart pointer-ах – объектах, которые автоматически управляют памятью, освобождая ее в тот момент, когда объект становится недоступен.
Основная проблема этих оберток – они не универсальны, и каждый раз для нового объекта приходится писать уже надоевшие конструкторы копирования, перекрывать операторы и заниматься прочей неблагодарной и черной работой.

Статья рассчитана на программистов, которые уже освоили С++, но еще не выработали собственных рабочих методов борьбы с утечками памяти. Методы могут быть разные, однако большинство из них требуют определенной аккуратности и методичности в выделении и освобождении памяти.

Не лучше ли приучать программистов к аккуратности, а не перекладывать проблему с больной головы на здоровую? Оставим этот вопрос философам. В нашем мире многое (в том числе размер зарплаты) решает эффективность работы программиста, а не его религиозные убеждения об абсолютном вреде смартпойнтеров.

Особенно полезна эта статья будет тем людям, которые, разрабатывая приложения на C# (а написание приложений со сложной бизнес-логикой эффективнее просто ввиду того, что C# позволяет практически сразу сосредоточиться на логике работы приложения, а не на проблемах указателей и кодировок), уткнулись в то, что шарп не все может, и некоторые вещи приходится писать на «плюсах». Я в таких случая использую связку из «плюсовых» ActiveX, которые подключаются через стандартный для C# механизм COM Interop.

C# — поганый язык. Поганый он тем, что хороший, а к хорошему быстро привыкаешь. После полугода работы на C# понять «плюсовую» логику становится очень тяжело. В таком случае, можно принести капельку «шарпа» в «плюсы» — делать memory-safe объекты и работать с ними, используя «шарповый» синтаксис — без амперсандов и звездочек.

Читать дальше →

Majordomo. Обзор хостинга.

imageУже наверно около нескольких месяцев сижу на данном хостинг-провайдере. И вот решил поделиться мнением и так сказать, ощущениями от использования. Честно говоря заманил провайдер меня своими ценами. Ну ещё-бы, за 70 рублей в месяц получить 250 мб места, MySQL, PHP, Cron, CGI — просто сказка. Но есть конечно и минусы. Но всё это подробнее.
Читать дальше →