среда, 24 декабря 2008 г.

QR-Коды

Намутил прикольные коды с помощью http://mojiq.kazina.com/:






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

воскресенье, 7 декабря 2008 г.

Flash: Amateurs Lega Calcio Serie A

Недавно закончил работу над flash-приложением с использованием vkontakte API. Все необходимые функции реализованы, сейчас жду лишь баг-репортов пользователей (а их порядка 50-100 в день) для исправления недостатков. Все данные, включая имена команд, хранятся на сервере вконтакте и являются настраиваемыми. Больше всего напрягло ограничение на 3 запроса в секунду, да и вообще работа с запросами. Правда об этом я уже писал в предыдущем посте.

Адрес страницы с приложением: Amateurs Lega Calcio Serie A
Читать дальше

суббота, 22 ноября 2008 г.

AS3 + VKontakte API

Давненько я не писал сюда ничего. На днях решил попробовать писать на AS3 (Action Script 3) в среде Adobe Flash CS3 с использованием "ВКонтакте API". Помучавшись с запросами к api.vkontakte.ru нашёл классы, призванные облегчить нам общение с ВКонтактом: vkontakte-as3

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

import flash.utils.*;
package main
{
 import ru.vkontakte.VKApp;

 public class TimeMgr
 {
    public var vk:VKApp = null;
    private var isWaiting:Boolean = false;
    private var prePreLastTime:Number = 0; // PrePreLast query time
    private var preLastTime:Number = 0;  // PreLast query time
    private var lastTime:Number = 0;  // Last query time
    private var arr:Array = new Array();
    private var realFunc:Function = null;
 
    public function TimeMgr(vk_:VKApp) {
     vk = vk_;
    }
 
    public function addQuery( ... args):void
    {
     arr.push(args);
     if (isWaiting == false) {
        isWaiting = true;
        sendQuery(arr[0]);
     }
    }
 
    private function justReleased(res:XML)
    {
     // Если ошибка
     if ((res.name() != 'response') &&
        (res.toString().indexOf('Too many') == 0))
     {
        setTimeout(sendQuery, 1000, arr[0]);
        return;
     }
 
     // Отправка по месту назначения
     if (realFunc != null)
        setTimeout(realFunc, 0, res);
 
     // Отправка следущего запроса из очереди
     arr.shift();
     if (arr.length > 0)
        sendQuery(arr[0]);
     else
        isWaiting = false;
    }
 
    private function sendQuery(arg:Array)
    {
     // Куда передать ответ
     if (arg[0] == vk.getVariable)
        realFunc = arg[2];
     else if (arg[0] == vk.putVariable)
        realFunc = arg[3];
 
     var t:Number = (new Date()).time;
     if (t - prePreLastTime >= 1500) {
        if (arg[0] == vk.getVariable)
         vk.getVariable(arg[1], justReleased);
        else if (arg[0] == vk.putVariable)
         vk.putVariable(arg[1], arg[2], justReleased);
     } else {
        if (arg[0] == vk.getVariable)
         setTimeout( arg[0], 1500 - (t - prePreLastTime),
                     arg[1], justReleased);
        else if (arg[0] == vk.putVariable)
         setTimeout( arg[0], 1500 - (t - prePreLastTime),
                     arg[1], arg[2], justReleased);
     }
 
     prePreLastTime = preLastTime;
     preLastTime = lastTime;
     lastTime = t;
    }
 }
}


* This source code was highlighted with Source Code Highlighter.

Теперь пишем код так:
// Не забудьте инициализацию vk:VKApp
var timer:TimeMgr = new TimeMgr(vk);

// Функция вызываемая при получении ответа севера
function vFunc(res:XML):void {
 trace(res.name() + ':' + res.toString());
}

// <span style="font-style:italic;">Было раньше:</span>
// vk.putVariable(50, 'Test data', null);
// vk.getVariable(50, vFunc);

// <span style="font-style:italic;">Стало теперь:</span>
timer.addQuery(vk.putVariable, 50, 'Test data', null);
timer.addQuery(vk.getVariable, 50, vFunc);


* This source code was highlighted with Source Code Highlighter.


Запросов можно делать теперь сколько угодно, менеджер сам распределит их по времени. А вообще считаю это ограничение слишком уж строгим, ну хоть 10 в секунду было бы уже нормально. Можно было бы делать достаточно динамичные игры. Например, сетевой змейке - 3 запроса в секунду явно перекрыли кислород . . .


Полезные ссылки:
1. Повышение производительности AS3 приложений
2. Bitwise gems - fast integer math


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

воскресенье, 19 октября 2008 г.

Лучший бесплатный софт для iPhone 3G

Программы:
1. Palringo Instant Messenger [iTunes]
2. PanoLab [iTunes]
3. YouNote [iTunes]
4. Stanza [iTunes]

Игры:
1. Galcon Lite [iTunes]
2. Square Master Lite [iTunes]
3. Gaia Lite [iTunes]
4. Labyrinth Lite Edition [iTunes]
5. Jelly Car [iTunes]
Читать дальше

Глюк с рингтонами в iPhone

Недавно столкнулся с таким глюком:
1. Перетакскиваю несколько мелодий m4r формата в iTunes->iPhone->Рингтоны
2. В iPhone вижу лишь 1 мелодию, но зато в нескольких копиях . . .

Потыкался по гуглу с запросами "iPhone глюк с рингтонами" . . .
10, 20, 30 минут . . . безрезультатно . . . методом тыка нашёл выход)))

Решил проблему так:
1. Перетащите мелодии сначала в iTunes->Медиатека->Рингтоны
2. Из iTunes->Медиатека->Рингтоны перетащите в iTunes->iPhone->Рингтоны
3. Все мелодии нормально видны из айфона.

Не ожидал от Apple такой подставы, если честно . . .
Интересно, была бы у меня эта проблема, если б я пользовался синхронизацией?

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

З.Ы.
ТТХ: [iTunes 8.0.1 (Windows Vista 32)] + [iPhone 3G FW 2.1 (official)]

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

понедельник, 13 октября 2008 г.

The Neo Cube



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

Связанные ссылки:
1. TheNeoCube.com
2. TheNeoCube.ru
3. MagnetBalls.ru
4. icq: 468-857-140 (1200р)

Я купил в Magnet Balls за 1500р по почте, оплата наложенным платежом.
Шарики хорошего качества, руки после игры железом не пахнут)))
Остался доволен, правда он не такой уж и послушный как на видео)))
Например, кубик ровно на 2 части разломить оо-очень непросто . . .
А в кубик шарики сложить вообще не мог первые 20-30 минут)))))
Читать дальше

воскресенье, 28 сентября 2008 г.

Японский::Хирагана

Оптимисты учат английский.
Пессимисты зубрят китайский.
А реалисты осваивают автомат Калашникова...
И только японский... изучают для души!

Хира́гана (яп. 平仮名) — японская слоговая азбука, одна из составляющих японской письменности наряду с катаканой, кандзи, арабскими цифрами и ромадзи (латинским алфавитом). Хирагана и катакана вместе составляют систему каны, в которой один символ выражает одну мору. Знак каны может передавать гласный звук (например, а あ); сочетание согласного с последующей гласной (например, та た), либо назальный сонант н ん, который, в зависимости от контекста, может звучать как русские н, м, английский ng (IPA ŋ) или как французские назальные гласные.

Полезные ссылки в порядке уменьшения релевантности:
1. http://www.komi.com/japanese/
2. http://kanji.dersu.ru
3. http://nihongo.aikidoka.ru/
Словари: Yarxi и Jardic
Незаменимое: http://translate.google.ru
Читать дальше

воскресенье, 21 сентября 2008 г.

Kalyway MAC OS X 10.5.5 Update

У меня сейчас стоит Kalyway 10.5.3 Update на Kalyway 10.5.2 Intel.
Для последнего iPhone SDK for iPhone OS 2.1 (9M2517) (1.38 GB),
нужна система не ниже MAC OS X 10.5.4 . . .

1. Скачиваем MAC OS X 10.5.5 Combo Update(601MB)

2. Запускаем Terminal.app, пишу команды:
sudo -s
*Ввожу пароль*
while sleep 1; do rm -rf /System/Library/Extensions/AppleIntelCPUPowerManagement.kext; done

Консоль оставляем открытой.

3. Начинаем устанавливать скачанный MacOSXUpdCombo10.5.5.dmg (610MB) После окончания установки НЕ НАЖИМАЕМ перезагрузить.

4. В консоли нажимаем Ctrl+C для остановки цикла, а затем открываем файл "/System/InstallAtStartup/scripts/1" в текстовом редакторе. Находим там строку "/System/Library/Extensions/Dont Steal Mac OS X.kext" и заменяем ее на "/System/Library/Extensions/dsmos.kext". Сохраняем и жмём на перезагрузку в апдэйтере.

5. При первом запуске система не дойдет до GUI (графической оболочки), что-то поделает и перезагрузится. Во второй раз запускайте с параметром "-v". После того, как вы увидите рабочий стол, можно, для профилактики, обновить кеш фреймворков, в консоли пишем: "sudo update_prebinding -debug -force -root /"

У меня после обновления перестали работать тачпад, клаватура и сетевая карта. Щас вот ищу необходимые дрова . . .

1) Починил работу Marvell Yukon 88E8055
"IOPCISecondaryMath" = "0x10c11734"
2) PS/2 тачпад и клавиатуру тоже починил с помощью архива:
http://rapidshare.com/files/147454425/PS2_Batt_Working.zip.html
(целый день искал его . . . в итоге через бут двд права проставлял)

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

пятница, 12 сентября 2008 г.

Загадка про сумму и произведение двух чисел.

Загадка:
Некто загадал двум мудрецам два натуральных числа, больших 1, сумма которых меньше 100. Мудрецу "С" Некто сообщил сумму загаданных чисел, мудрецу "П" - произведение.
Далее произошел следующий диалог:
а) "П": Я не знаю, что это за числа.
б) "С": Я заранее знал, что ты не знаешь, что это за числа.
в) "П": Теперь я знаю, что это за числа.
г) "С": Тогда и я знаю, что это за числа.

Какие числа загадал некто?
Читать дальше

четверг, 4 сентября 2008 г.

Оптимизация настроек Mozilla Firefox

Последние 4 года я пользуюсь браузером Mozilla Firefox, он меня полностью устраивает в плане скорости, удобности и потребления памяти. Но, случается, ни с того, ни с сего памяти он жрёт ОгОгО((( Бывает метров по 200-300, а то и более. Благодаря гибкости Firefox в его настройках возможно снизить потребление памяти и увеличить скорость работы на столько, на сколько это возможно.

1. Снизить поедание RAM-а, который используется для кэширования:
* Набрать “about:config” в адресной строке Firefox
* “browser.sessionhistory.max_total_viewer” = “0″

2. Увеличить скорость загрузки страницы:
* Набрать “about:config” в адресной строке Firefox
* “network.http.pipelining” = “true”
* “network.http.proxy.pipelining” = “true”
* “network.http.pipelining.maxrequests” = “30″ (30 запросов за раз)
* Создать New->Integer: “nglayout.initialpaint.delay” = “0″
* Создать New->Boolean: “network.dns.disableIPv6″ = “false”
* “content.notify.backoffcount” = “5″
* “plugin.expose_full_path” = “true”
* “ui.submenuDelay” = “0″ (ноль)

3. Снизить поедание RAM-а до 10МБ когда Firefox свёрнут:
* Набрать “about:config” в адресной строке Firefox
* Создать New->Boolean: “config.trim_on_minimize” = “true”
* Перезагрузить Firefox

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

вторник, 2 сентября 2008 г.

Конвертер систем счисления

Решил написать простенькую программку - конвертер чисел в различные системы счисления. Скачать архив с программой и её и исходниками можно тут: QBase_sources.rar(10.4Кб). Сама программа написана на C++ с использованием кроссплатформенной графической библиотеки Qt.


Весь программный код описан ниже.

#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QComboBox>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>

class QBase : public QWidget
{
  Q_OBJECT
private:
  QComboBox *m_baseFrom, *m_baseTo;
  QLineEdit *m_inputNumber, *m_outputNumber;
public:
  QBase(QWidget *parent = 0, Qt::WFlags flags = 0);
  ~QBase();
private slots:
  void convert(const QString & text);
  void toConvert();
};

QBase::QBase(QWidget *parent, Qt::WFlags flags)
  : QWidget(parent, flags)
{
  QHBoxLayout *mainLayout = new QHBoxLayout(this);
  QVBoxLayout *leftLayout = new QVBoxLayout;
  QVBoxLayout *rightLayout = new QVBoxLayout;
  mainLayout->addLayout(leftLayout);
  mainLayout->addLayout(rightLayout);

  m_baseFrom = new QComboBox;
  leftLayout->addWidget(m_baseFrom);
  for (int i=2; i<=10; i++)
     m_baseFrom->addItem(QString("%1").arg(i));
  m_baseFrom->addItem("16");
  m_baseFrom->setCurrentIndex(8);

  m_baseTo = new QComboBox;
  rightLayout->addWidget(m_baseTo);
  for (int i=2; i<=10; i++)
     m_baseTo->addItem(QString("%1").arg(i));
  m_baseTo->addItem("16");
  m_baseTo->setCurrentIndex(9);

  m_inputNumber = new QLineEdit;
  leftLayout->addWidget(m_inputNumber);

  m_outputNumber = new QLineEdit;
  rightLayout->addWidget(m_outputNumber);
  m_outputNumber->setReadOnly(true);

  connect( m_inputNumber, SIGNAL(textChanged(QString)),
            this, SLOT(convert(QString)) );
  connect( m_baseFrom, SIGNAL(currentIndexChanged(int)),
            this, SLOT(toConvert()) );
  connect( m_baseTo, SIGNAL(currentIndexChanged(int)),
            this, SLOT(toConvert()) );

  m_inputNumber->setFocus(Qt::OtherFocusReason);
  setTabOrder(m_inputNumber, m_baseFrom);
  setTabOrder(m_baseFrom, m_baseTo);
  m_outputNumber->setFocusPolicy(Qt::NoFocus);
}

QBase::~QBase() {
  delete m_baseFrom;
  delete m_baseTo;
  delete m_inputNumber;
  delete m_outputNumber;
}

void QBase::convert(const QString & text) {
  bool b;
  int baseFrom = m_baseFrom->currentText().toInt(&b,10);
  int baseTo = m_baseTo->currentText().toInt(&b,10);
  QString str = QString("%1").arg(text.toInt(&b,baseFrom),0,baseTo);

  if (!m_inputNumber->text().length())
     m_outputNumber->setText("");
  else if (!b || (text[0]=='-') || (text[0]=='+'))
     m_outputNumber->setText("Invalid number");
  else
     m_outputNumber->setText(str);
}

void QBase::toConvert() {
  convert(m_inputNumber->text());
}

int main(int argc, char *argv[]) {
  QApplication a(argc, argv);
  QBase w;
  w.show();
  a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
  return a.exec();
}


* This source code was highlighted with Source Code Highlighter.


Если установлен интегратор Qt в MicroSoft Visual Studio, то распакуйте исходники из архива в одну папку, запустите Visual Studio и в меню выберите пункт "Qt"->"Open Solution from .pro File" и укажите путь к файлу QBase.pro. В этом случае Visual Studio сама создаст проект.


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

Моддинг Win+R

Сегодня сделал небольшой моддинг своей винды. Модернизировал диалоговое окошко "Пуск->Выполнить...", также известное как Win+R.


Сделал это следующим образом:
1) Открыл файл c:\windows\system32\shell32.dll в программе Resource Hacker. Выбрал ресурс Shell32.dll:\Dialog\1003\1049 и поменял в нём код:
1003 DIALOGEX 0, 0, 227, 95
STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Запуск программы"
LANGUAGE LANG_RUSSIAN, 0x1
FONT 8, "MS Shell Dlg"
{
CONTROL 160, 12297, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE, 7, 11, 18, 20
CONTROL "Введите имя программы, папки, документа или ресурса Интернета, и Windows откроет их.", 12289, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 42, 11, 182, 18
CONTROL "&Открыть:", 12305, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 7, 39, 32, 8
CONTROL "", 12298, COMBOBOX, CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 42, 37, 177, 100
CONTROL "Запустить в отдельной области &памяти", 12306, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_TABSTOP, 42, 54, 183, 10
CONTROL "ОК", 1, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 62, 70, 50, 14
CONTROL "Отмена", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 116, 70, 50, 14
CONTROL "Об&зор...", 12288, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 170, 70, 50, 14
}

на код:
1003 DIALOGEX 0, 0, 237, 110
STYLE DS_FIXEDSYS | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Запуск программы"
LANGUAGE LANG_RUSSIAN, 0x1
FONT 8, "MS Shell Dlg"
{
CONTROL "\"taskmgr\" - Диспетчер задач\n\"regedit\" - Редактор реестра\n\"msconfig\" - Настройка системы\n\"services.msc\" - Список сервисов\n\"dcomcnfg\" - Служба компонентов\n\"compmgmt.msc\" - Управление ПК\n\"devmgmt.msc\" - Диспетчер утр-в\n\"wupdmgr\" - Обновление системы", 12289, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 3, 118, 65
CONTROL "\"dxdiag\" - Ср-во диагностики\n\"eventvwr.msc\" - События\n\"dfrg.msc\" - Дефрагментация\n\"fsquirt\" - Bluetooth manager\n\"shutdown -a\" - Не выключать\n\"charmap\" - Таблица символов\n\"osk\" - Экранная клавиатура\n\"iexpress\" - IExpress 2.0", 12289, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 129, 3, 104, 65
CONTROL "&Открыть:", 12305, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 17, 74, 32, 8
CONTROL "", 12298, COMBOBOX, CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_DISABLENOSCROLL | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 52, 72, 177, 100
CONTROL "З", 12306, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 24, 90, 20, 10
CONTROL "ОК", 1, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 72, 90, 50, 14
CONTROL "Отмена", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 126, 90, 50, 14
CONTROL "Об&зор...", 12288, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 180, 90, 50, 14
}

2) Действуя аналогично, изменил значения в файле c:\windows\system32\taskmgr.exe. Поменял значение строки taskmgr:\String Table\626\1049:
10002,  "Введите имя программы, папки, документа или ресурса Интернета, и Windows откроет их."

заменил на:
10002,  "\"taskmgr\" - Диспетчер задач\n\"regedit\" - Редактор реестра\n\"msconfig\" - Настройка системы\n\"services.msc\" - Список сервисов\n\"dcomcnfg\" - Служба компонентов\n\"compmgmt.msc\" - Управление ПК\n\"devmgmt.msc\" - Диспетчер утр-в\n\"wupdmgr\" - Обновление системы"

3) Загрузился с Live-CD (любая другая ОС) и подменил файлы c:\windows\system32\shell32.dll и c:\windows\system32\taskmgr.exe на новые, не забыв сделать резервные копии оригинальных файлов))

З.Ы.
И кстати, всё может вернуться назад когда вы обновите винду, а может и не вернуться . . .

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

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

Первое сообщение

Сегодня, 1 сентября 2008 . . .
С началом нового учебного года решил завести этот блог. Ещё не знаю, что буду сюда писать. Но хочется что-нибудь полезное. Может это будут важные для меня новости, может какие-то программы, может просто ссылки. Жаль у гугла всё ещё нет файлового хранилища. Если нужно будет что-то выложить, наверно сделаю это на http://narod.yandex.ru/
Читать дальше