вторник, 16 ноября 2010 г.

Первый урок - Hello world на C(си)

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

При выполнении программы, написаной на C необходимо описать главную функцию main, которая и будет вызываться при запуске.
Функция main является такой-же обычной функцией как и все остальные, в целом у нее есть два несколько прототипов описания.
void main(), int main(), int main(int,char **) и void main(int,char **).

Первое слово перед main это тип функции - тип значения которое она может веруть int - целочисленное число, void (пусто) ничего.
Затем идет имя функции (в нашем случае main), а далее в круглых скобках - принимаемые параметры, также сначала тип, а затем название переменной.
Причем как в описании, так и в самой функции названия могут отсутствовать.
Отсутствие название переменных и для чего это - обсудим потом


Тут нужно учесть, что компилятор gcc считает что функция main должна обязательно иметь тип int, для того чтобы вернуть код выполнения программы, а вот скажем bcc от Borland допускает и тип void, хотя в этом случае на самом деле возвращает 0.
Чтобы поддерживать общие стандарты лучше описывать функцию main все-же через тип int

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

И так самый примитивный рабочий код на C!
int main()
{
return 0;
}

Данный код можно скомпилировать в программу и даже выполнить - правда, он ничего не выполнит, потому как единственная строка кода в нем return 0; - выйти из функции и вернуть значение 0.
Ну да в C - разделитель комманд точка с запятой ';'


Для того. чтобы что-нибудь вывести на экран нужно вызвать функцию для вывода, впрочем большинство стандартных функций уже давно написаны. Например для вывода на экран(консоль) есть специальная библиотека stdio, которая содержит тьму функций.
Но нам интересна пока только одна - printf - форматированный вывод на экран.
Чтобы подключить библиотеку нужно указать директиву include с указанием имени библиотеки, имя библиотеки можно написать в угловых скобках (тогда компилятор библиотеку будет искать в стандартной папке, либо в двойных ковычках тогда он сначала ищет в текущем каталоге, а потом в стандартом)
Все директивы - это команды к препроцессору, т.е. процессу вызываемому до компиляции, это облегчает жизнь программистам, в противном случае им пришлось бы самим писать все прототипы функций вручную.
Ну и директивы пишутся через знак #, всего их не очень много основные: include, define, ifdef, else, error

Для нашего примера это #include <stdio.h> - т.е. включить заголовки(описания прототипов) от библиотеки stdio (расширение .h - как раз указывает что это заголовки от англ. header)

Функция printf поддерживает множество аргуметов, но пока нас интересует только первый - а именно базовая строка, которая будет выводится на экран.
Cамый примитивный рабочий код на C с выводом на экран!
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
return 0;
}



Т.к. в качестве первого аргумента функции printf является строка, то приходится квотировать некоторые символы, например \n - означает перевод строки, а \" - двойную кавычку


Теперь скомпилировав и выполнив это программу, увидем на экране Hello, World

Если, вы конечно, запускаете ее из консоли (в винде через cmd), а в линуксе через терминал.

Ну и чтобы скомпилировать программу - команда gcc hello.c -ohello.exe - это если у вас gcc

понедельник, 15 ноября 2010 г.

Подумал тут

И решил сделаю я курс обучения C/C++ (сначала основы, а потом классы и полиморфизм ;) )
Я все потому, что прочитал я в блоге Шелвина, что это интересует массы.

А прочитал я блог, потому что автор устраивает марафон на 60 дней для набора подписчиков.
Обещает горячие темы и жаркие посты, так что думаю можно и подписаться.

УТКИ НА СТАРТ!

четверг, 11 ноября 2010 г.

Авторизация на ya.ru (через passport.yandex.ru)

Попросили меня (за практически спасибо) написать модуль для авторизации и постинга постов на ярушку (ya.ru).

Быстренько накидал через свои компоненты, а что сложного-то? GET my.ya.ru далее получаем форму для авторизации через passport.yandex.ru заполняем поля и далее через n редиректов в идеале попадаем на my.ya.ru уже авторизованными.

В чем сложность №1. Понятно что авторизация не совсем обычная (не через тривиальные куки) - и понятно что яндекс(домен) свои куки не отдает даже домену ya.ru.

Первый и быстро написаный код не работал - вернее он явно авторизовал на passport.yandex.ru (видно было по выдаче), но на my.ya.ru был редирект без кук и сессий.

Ломал над этим голову долго, причем этот код замечательно работал для mail.yandex.ru и webmaster.yandex.ru - на это и понятно - это один и тот-же домен.

Перебрал все, установил сниффер - вижу что при первичной загрузке my.ya.ru в браузере срабатывает редирерт, на my.ya.ru/pass где получают куки и возвращают опять же редиректом на my.ya.ru.
С точки зрения пользователя ничего не происходит он вбивает my.ya.ru и видит страницу авторизации.

Но в моем случае этого не было! Было просто загрузка формы логина, без редиректа и без принятия кук.

Оказалось что я не передавал в хедере HTTP тэг accept = html/text и прочее.
И именно из-за этого my.ya.ru не делал редирект и не подсовывал кук.
Как только начал указывать - все получилось.

В кратце:
GET my.ya.ru -> my.ya.ru/pass -> my.ya.ru
Заполняем форму
POST passport.ya.ru -> ... -> pass.yandex.ru -> my.ya.ru -> pass.yandex.ru -> my.ya.ru
Мы авторизованы! (В предпоследнем ya.ru передается сессия, а в последнем уже авторизованные куки для ya.ru)

пятница, 29 октября 2010 г.

Непростая сортировка.

Иногда нужно отсортировать данные как числа, но сами данные не совсем числа, а сборная солянка из цифр и букв

Допустим у вас есть такие данные: 90A,89B,90C,102A,89A ;) их нужно отсортировать по возрастанию - на самом деле - код очень простой:



use Data::Dumper;

sub exsortproc
{
return $a<=>$b if ($a != $b) ;
return $a cmp $b;
};


my @data=('90A','89B','90C','102A','89A');
my @out;
@out = sort exsortproc @data;

die Dumper(\@out);


Output:

$VAR1 = [
'89A',
'89B',
'90A',
'90C',
'102A'
];

Все дело в том что если нужно перл кастует скаляр '90A' к числу 90.

Успехов вам и побольше 90C :)

суббота, 16 октября 2010 г.

Рабочее

На работе есть вроде внутреннего корпоративного сайта, так вот с недавних пор он стал странно грузиться.
Боковая панель - подгружалось полностью где-то за 15 секунд.

Искали и нашли причину, в футоре стоял счетчик, сервер который сейчас не доступен, причем ответ что от сервера отрубает именно по таймауту.

пятница, 8 октября 2010 г.

Обитель зла 4 vs Блэйд-ХЗ

Вчера посмотрел обитель зла в 3D, пипец хрень полная - начало так вообще подумал от сучки какие, а потом это мнение закрепилось.

Нет, я не против пары трупов, но ведь хороших когда убивают, значит это - плохой?

Затем эти новые зомби - пипец, лучшие зомби - это "рассвет мертвецов" а эти - как тетки из СССР в очереди за колбасой - и догонят и загрызут!

Эти раскрывающие рты и красные глаза у супер-злодея? Это точно не вампиры из блэйда? Чувствуется один и тот-же реквизит.

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

понедельник, 27 сентября 2010 г.

Работа

Знаете как трудно сосредоточиться на работу, когда лень?
Ищешь кучу причин, посмотреть почту, интернет или даже поиграть в конце-концов.

Но!
Стоит понимать, что каждый сделанный час работы, приближает тебя (хочется написать к пенсии ;)) к финалу твоей мечты.

Это и только это заставляет меня работать, когда лень и когда не охота работать.