Thursday, October 18, 2007

CSharp. The best tutorial

Congratulation you would soon be able to hack CsGL but there is one last step you should understand : interop (with C code).
You will need a C compiler, I advise gcc for windows called MinGW, it's free, it's good, it's GCC!
We will create 3 file:

echo.c

#include

#define DLLOBJECT __declspec(dllexport)
DLLOBJECT void writeln(char* s)
{
printf("%s\n", s);
}


echo.cs

using System;
using System.Runtime.InteropServices;

namespace HelloUtil
{
public class Echo {
[DllImport("echo.native.dll", CallingConvention=CallingConvention.Cdecl)]
static extern void writeln(string s);

string myString;

public Echo(string aString) {
myString = aString;
}

public void Tell() {
writeln(myString);
}
}
}

hello.cs

using System;
using HelloUtil;

public class Hello
{
public static void Main() {
Echo h = new Echo("Hello my 1st interop code !");
h.Tell();
}
}

Hehe, here you discover a completly new thing, Attribute.
"[DllImport(.." is an attribute.
You could tag any method/field/class with any number of attribute.
They generate extra information that could be used by anyone who could understand them.
This DllImport attribute is understand by the compiler and told him that the function below is in fact in a DLL whose name is "echo.native.dll". I add a calling convention parameter as the default .NET calling convention is __stdcall whereas, in C, it's __cdecl.
By the way, if you look for DllImport in the documentation, look for DllImportAttribute, because you remove "Attribute" to attribute classname when using them, it's like this.

And now let's compile this!
> csc /nologo /t:library /out:echo.dll echo.cs
> csc /nologo /out:hello.exe /r:echo.dll hello.cs
>
> rem "if the following line don't work, read bellow.."
> gcc -shared -o echo.native.dll echo.c
> strip echo.native.dll

the 2 last line (the gcc & strip command) are for building the "C-DLL".
If they don't work maybe gcc is not in a directory listed in your path environment variable ? check with:
%lt; echo %PATH%
Well it's probably not,anyway, so type, assumin mingc is in C:\MinGW:
set PATH=C:\MinGW;%PATH%
And try again... you sure it's not a syntax error ?
If it compile test it now: hello
Great isn't it ?

Now I should admit I didn't tell you all the truth. echo.dll and echo.native.dll are not the same kind of DLL. It's not just the language (C / C#) the C one is a plain executable full of, probably, x86 instruction, whereas the C# one is what MS call a portable executable.. anyway they are different.
If you install echo.dll in the GAC it wont work because it won't find echo.native.dll except if you put in into the PATH (like C:\Windows\System32).
In the same manner when you add the reference in VS.NET echo.native.dll is overlooked and your program won't work....
So either put the native one in your path or copy it in the debug/release directory of VS.NET.
Or do everything by hand (makefile? build.bat?) and put all your dll in you build directory, and everything work fine..

Wednesday, October 10, 2007

vi (самый удобный редактор или его придумал больной мозг)

После установки редактора vi (в данном случае у меня установлен gVim - графический vi) попробуем поработать с ним. После открытия нужного нам текстового файла (я это делаю командой gvim mytxt.txt) мы не можем сразу работать с текстом, как например в notepad. Мы попадаем вначале в командный режим, а из командного режима мы можем перейти в режим набора текста и иже с ним. Как это все устроено.

Любая команда начинается с двоеточия (:), называемая еще ex-mode command

Esc - переход в командный режим
h - перемещение по тексту влево
j - перемещение по тексту вниз
k - перемещение по тексту вверх
l - перемещение по тексту вправо
0 (нуль) - перескочить на первый символ в строке
$ - перескочить на последний символ в строке
x - удаляет текущий символ под курсором
r (и другой символ) - заменить символ под курсором на другой символ
dd - удалить текущую строку текста
J - присоединить следующую строку к текущей строке
. - повторить команду
dw - удаление части текста от текущей позиции курсора до начала следующего слова
d) - удаление вплоть до следующего конца предложения
d} - удаление всего остатка абзаца
u - отменить операцию
i - переход в режим ввода текста перед текущим символом
I - ввод текста вначале текущей строки
а - переход в режим ввода текста после текущего символа
A - ввод текста в конце текущей строки
о, О - создать пустую строку после, перед текущей
с - замена (cc - текущую строку, с$ - текущую строку до конца строки, с0 (нуль) - от начала строки до курсора)
3w - перескочить вперед на 3 слова
CTRL + F - перейти на страницу вперед (можно PageDown)
CTRL + B - перейти на страницу назад (можно PageUp)
w, W - перемещение на первый символ следующего слова ( - для больших слов)
e, E - перемещение на следующий последний символ слова
b, B - cдвинуться на предыдущий первый символ слова
(, ) - переход на начало предыдущего или следующего предложения
{, } - переход на начало предыдущего или следующего параграфа
CTRL+W CTRL+W - переключение между буфферами
number G - перейти на строку с номером number
/text - искать текст text
n - повторить поиск в прямом (N- обратном) направлении

:q - выход из программы
:q! - выход из программы без вопроса о сохранении
:x, :wq - сохранить и выйти из программы
:w newtxt.txt - сохранить файл с именем newtxt.txt
:set tabstop=4 - установить табуляцию 4 символа
:sp - открыть новый буффер (можно указать, чтобы открыл новый буффер с файлом :sp new.txt)

Статья собрана и адаптирована в виде шпоргалки благодаря сайту Gentoo

Wednesday, October 3, 2007

PC-BSD 1.4 (Хочу переключать раскладку)

Вышла новая версия десктопной ОС PC-BSD. Всю информацию можно узнать на сайтах
http://www.pcbsd.org
http://www.pcbsd.ru

Все хорошо, но в новой версии я не заметил файла XF86Config. В папке остался толькo xorg.conf.
По стечению обстоятельств, появился еще один способ смены раскладки, помимо описанного ранешь в этом блоге. Это способ наиболее приближен к Windows-настройкам (его мне подсказали с русского сообщества поддержки PC-BSD, но я его доработал и описал более подробно для всех). Итак начнем

Настройка раскладки
1. Переходим Центр настройки -> Региональные настройки -> Раскладка клавиатуры
2. На вкладке "Раскладка" удаляем "Английский язык", оставляя/добавляя только "Русский язык"
3. Ставим галочку рядом с пунктом "Включить латинскую раскладку"
4. Выбираем вариант раскладки winkeys.
5. На вкладке "Параметры переключения" убираем все галочки
6. На вкладке "Параметры XKB" ставим галочку рядом с пунктом "Использовать переключатели XKB",
7. Снимаем галочку "Игнорировать параметры системы"
8. Из списка выбираем
ALT+SHIFT (переключает группу)
9. Принимаем изменения
10. Ставим из порторв kkbswitch (индикатор раскладки в трее) см. ниже

Установка kkbswitch из портов
1. Найдем собственно порт kkbswitch командой (чтобы точно знать адрес, я могу ошибаться)
$whereis
kkbswitch
2. Установим kkbswitch
$cd
/usr/ports/sysutils/kkbswitch
$
make & make install
3. Перезагрузим систему.

Все. Радуемся жизни.

Thursday, August 16, 2007

Модуль "Фотогаллерея"

На днях пришла идея для CMS L.F.E. написать модуль для работы с фотографиями. Изучив подобные решения, я накидал небольшое ТЗ, что должен выполнять данный модуль. Вот требования к нему:
1. Локальная загрузка фотографий
2. Автоматическое изменение фотографий под сайт
3. Предварительный просмотр фотографий на сайте
4. Комментарии к фотографиям
5. Счетчик просмотров фотографий
6. Оценка фотографий
7. Категории для фотографий. Комментарии категорий (класс также должен быть и для файлов)

Wednesday, July 18, 2007

PixelArt (стиль игры?)

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

Чем пользоваться для pixelart'a:
1. Adobe Photoshop
2. Paint
3. Macromedia Fireworks

Сайты по pixelart'y:
http://pixel.nascimpact.com/tutoriaux.php
http://ozmoz.net/mob/tutoriaux.php
http://www.gas13.ru/tutorials/
http://www.pixelate.ru/modules/news/index....hp?storytopic=2
http://www.over-the-moon.org/dollz/tutorials/
http://eozee.fatal.ru/

Wednesday, June 27, 2007

Flash-игра

Решился я тут все-таки заняться разработкой простой flash-игры. Ничего особенного на сегодняшний день не предвидется, но несколько основных положений стоит упомянуть:
1. Игра будет похожа на Crimsonland и в то же время немаловажную роль будет играть стратегия
2. Жанр все-таки оставлю аркадный
3. Игра идет на очки
4. Число уровней не ограниченно
5. Видом NPC на сегодняшний день планируется делать немного.

Friday, June 22, 2007

L.F.E. CMS (если вы не хотите писать свой сайт)

Наконец завершил сессию и теперь могу спокойно начать писать свою CMS систему совместно с http://webos.isrv.ru. Идей много - нужно лишь много свободного времени, а что из этого выйдет - увидим.
Сам движок бесплатен, афункционал можно наблюдать здесь http://lfe.litehosting.ru

P.S. Поскольку я отвечаю за внешний функционал, пока перекладывается работа с AJAX на меня. Вот несколько полезных ссылок по работе с AJAX-технологией
http://www.ajax-tutorials.com/tutorial-list/Ajax-and-PHP/?start=1
http://www.hotscripts.com/Detailed/66345.html

Sunday, June 17, 2007

PC-BSD (несколько шагов)

1. Руссификация и раскладка

Заходим под рутом и открываем /etc/X11/XF86Config

Section "InputDevice"
Identifier "Keyboard0"
Driver "keyboard"
Option "XkbModel" "microsoftpro"
Option "XkbLayout" "us,ru"
Option "XkbOptions" "grp:ctrl_shift_toggle,grp:lwin_switch,grp_led:scroll"
Option "XkbVariant" "winkeys"
EndSection


2. Прозрачность окон (/etc/X11/xorg.conf)

Section "Extensions"
Option "Composite" "Enable"
Option "RENDER" "Enable"
EndSection

Monday, June 11, 2007

Азы программирования под *nix

Немного разобрался с программированием под Unix. Нужно заметить, что для людей которые программировали под Windows - будет проблематично перейти под *nix, но это исключительно мое субъективное мнение.
Итак, начнем. Что нужно усвоить обязательно - это вызов функции fork().
В двух словах. fork() - функция порождает дочерний процесс на основе родительского, не наследует только семафоры. При корректной отработки функции у нас получается дочерний процесс с идентификатором 0 и родительский с PID дочернего. После вызова данной функции вызывается вначале
дочерний процесс, а уже потом родительский.
Более подробную информанию можно почитать в мануалах.
А теперь перейдем непосредственно к программированию (см. в комментарии)

Monday, June 4, 2007

Предварительный анализ

За последнее время накопилось много всего и хотелось бы грамотно все организовать. Чтобы хотелось освоить и разработать
1. Изучить VRML
2. Создать CMS-систему вместе с http://webos.isrv.ru
3. Переписать Java-игру для мобильника по мотивам японского кроссворда "Судоку"
4. Перейти наконец с Windows на FreeBSD
5. Научиться писать программы под *nix
6. Написать софт для обработки текстовых изображений.
На этом пока все...