пятница, декабря 24, 2010

А как умеет ваш язык это делать?

Результат будет одинаковый:
about_logo

python -c 'import re;s="http://www.google.ru/intl/ru/images/about_logo.gif"; m = re.match(".*\/(.*)\.gif$",s); print m.group(1)'
perl -e '$e="http://www.google.ru/intl/ru/images/about_logo.gif"; $e =~ /.*\/(.*)\.gif$/i; print $1."\n";'
php -r '$e="http://www.google.ru/intl/ru/images/about_logo.gif"; $pat = "/.*\/(.*)\.gif$/"; preg_match($pat,$e,$m);print $m[1]."\n";'

вторник, декабря 07, 2010

Android SDK 2.3 - "Unknown Android Packaging Problem"

После обновления SDK согласно документам
http://developer.android.com/intl/zh-TW/sdk/adding-components.html
http://developer.android.com/intl/zh-TW/sdk/installing.html
http://developer.android.com/intl/zh-TW/sdk/eclipse-adt.html

перестала работать отладка adb
Эта программа переехала в другую папку, нужно обновить .bashrc
export PATH=${PATH}:/tools:/platform-tools
т.е. по сути добавить папку platform-tools
Далее перестала работать сборка, выходит следующая ошибка
Error generating final archive: java.io.FileNotFoundException: 
/home/user/android/bin/resources.ap_ does not exist
Android
Unknown Android Packaging Problem

Решение нашел здесь
http://stackoverflow.com/questions/4372574/many-errors-in-android-project-after-i-upgraded-to-android-sdk-2-3
Вкратце, если в файле res/values/strings.xml вы используете конструкции вида
<string name="page_number">%d results, showing page %d of %d</string> 
то теперь нужно использовать индексы для элементов больше одного, т.е. вот так
<string name="page_number">%1$d results, showing page %2$d of %3$d</string> 

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

Глобальная переменная $_REQUEST в php

Заметил интересное поведение в глобальной переменной
$_REQUEST в php, похоже она создается по запросу
~$ php -r 'echo (int)isset($GLOBALS["_REQUEST"])."\n";'

ответ 0, но если
~$ php -r '$_REQUEST;echo (int)isset($GLOBALS["_REQUEST"])."\n";'

ответ уже 1

понедельник, августа 30, 2010

Mysql ERROR 1005 (HY000): Can't create table (errno: 150)

Уже который раз спотыкаюсь об одни и те же грабли, решил записать.

т.е. после создания таблиц:

CREATE TABLE sf_guard_user
(
id BIGINT AUTO_INCREMENT,
first_name VARCHAR(255),
last_name VARCHAR(255),
email_address VARCHAR(255) NOT NULL UNIQUE,
username VARCHAR(128) NOT NULL UNIQUE,
algorithm VARCHAR(128) DEFAULT 'sha1' NOT NULL,
salt VARCHAR(128), password VARCHAR(128),
is_active TINYINT(1) DEFAULT '1',
is_super_admin TINYINT(1) DEFAULT '0',
last_login DATETIME, created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
INDEX is_active_idx_idx (is_active),
PRIMARY KEY(id)
)ENGINE = INNODB;

CREATE TABLE sf_guard_user_profile
(
id BIGINT AUTO_INCREMENT,
user_id BIGINT, first_name VARCHAR(20),
last_name VARCHAR(20),
email VARCHAR(255),
email_hash VARCHAR(255),
INDEX user_id_idx (user_id),
PRIMARY KEY(id)
) ENGINE = INNODB;


я пытаюсь создать ключи:


ALTER TABLE sf_guard_user_profile
ADD CONSTRAINT sf_guard_user_profile_user_id_sf_guard_user_id
FOREIGN KEY (user_id)
REFERENCES sf_guard_user(id)
ON DELETE CASCADE;

и получаю ошибку ERROR 1005 (HY000): Can't create table (errno: 150)
mysql говорит, что не может найти поле на которое ссылаемся

mysql> SHOW ENGINE INNODB STATUS;
...
100830 20:59:41 Error in foreign key constraint of table s1/#sql-477_152:
FOREIGN KEY (user_id) REFERENCES sf_guard_user(id) ON DELETE CASCADE:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
...


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

sfGuardUserProfile:
tableName: sf_guard_user_profile
columns:
user_id: integer(4)
first_name: varchar(20)
last_name: varchar(20)
email: varchar(255)
email_hash: varchar(255)
relations:
Users:
class: sfGuardUser
refClass: sfGuardUserGroup
local: group_id
foreign: user_id
foreignAlias: Groups
sfGuardUser:
type: one
foreignType: one
class: sfGuardUser
local: user_id
foreign: id
onDelete: cascade
foreignAlias: Profile

надо :

sfGuardUserProfile:
tableName: sf_guard_user_profile
columns:
user_id: integer
first_name: varchar(20)
last_name: varchar(20)
email: varchar(255)
email_hash: varchar(255)
relations:
Users:
class: sfGuardUser
refClass: sfGuardUserGroup
local: group_id
foreign: user_id
foreignAlias: Groups
sfGuardUser:
type: one
foreignType: one
class: sfGuardUser
local: user_id
foreign: id
onDelete: cascade
foreignAlias: Profile


а именно поле user_id должно быть таким же как в у sfGuardUser

среда, июня 02, 2010

Как сделать слайд-шоу для рабочего стола gnome

В ubuntu 9.10 появились обой рабочего стола в виде слайд-шоу



его пример лежит в папке
/usr/share/backgrounds/cosmos/background-1.xml

Это простой xml файл с простыми инструкциями.
Его можно создать вручную, схема довольно проста.
Но можно использовать этот скрипт:

#!/usr/bin/perl

$staticDuration = "300.0";#1795.0
$transitionDuration = "5.0";#5.0

print <<"TBEGIN";
<background>
<starttime>
<year>2009</year>
<month>08</month>
<day>04</day>
<hour>00</hour>
<minute>00</minute>
<second>00</second>
</starttime>
TBEGIN

$pwd = `pwd`;
$pwd =~ s/[\n]//;
$isStart = 0;
opendir(DIR,".");
while ($name = readdir(DIR)) {
if($name =~ /jpg|png/){
if($isStart){
$pathLast = $pwd."/".$lastName;
$pathCurr = $pwd."/".$name;
print <<"Tname";
<static>
<duration>1795.0</duration>
<file>$pathLast</file>
</static>
<transition>
<duration>5.0</duration>
<from>$pathLast</from>
<to>$pathCurr</to>
</transition>
Tname
} else {
$pathFirst = $pwd."/".$name;
}
$lastName = $name;
$isStart = 1;
}
}
closedir(DIR);

print <<"TEND"
<static>
<duration>1795.0</duration>
<file>$pathCurr</file>
</static>
<transition>
<duration>5.0</duration>
<from>$pathCurr</from>
<to>$pathFirst</to>
</transition>
</background>
TEND


создайте текстовый файл gen.pl с этим кодом и положите в папку с фотографиями.
выполните команду:
perl gen.pl > background-2.xml


Теперь добавьте этот файл в "Параметры внешнего вида" - "Фон", вуаля.

вторник, мая 18, 2010

Плагин по regexp для gedit

Потребовался инструмент для мелкого редактирования текста с использованием regexp
То что может стандартный gedit уже не хватает, такие вещи как замена теста с использованием спец-символов таких как отступ(\t), конец строки(\n) решаются довольно просто, но дальше уже сложно.
Есть такой плагин в одном блоге описано как его поставить
Я повторюсь, его нужно скачать и распаковать в папку ~/.gnome2/gedit/plugins/
Создать если не существует.
Теперь можно использовать такие конструкции как поиск функции название которой вы точно не помните, например ищете Что_то_тамSave
function\s+.*Save.*

вторник, апреля 20, 2010

Настройка времени под linux

Самый простой способ:
sudo ntpdate 0.ru.pool.ntp.org

Список всех серверов:
0.ru.pool.ntp.org
1.ru.pool.ntp.org
2.ru.pool.ntp.org
3.ru.pool.ntp.org

Теперь по порядку:

1.Установить часовой пояс


sudo dpkg-reconfigure tzdata

2.Синхронизация


ntpdate 0.ru.pool.ntp.org

3.Настройка обновления


$ sudo bash
# echo "ntpdate 0.ru.pool.ntp.org" > /etc/cron.daily/ntpdate
# chmod 755 /etc/cron.daily/ntpdate

четверг, апреля 08, 2010

Простой способ вывода сообщения


public class MyActivity extends Activity
{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(
MyActivity.this,
"Ваше сообщение",
Toast.LENGTH_LONG
).show();
}
}

вторник, апреля 06, 2010

Как передать картинку в Activity через Intent

Короткий пример:

Uri imageUri = intent.getData();
mBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
Intent intent = new Intent(TakePictureActivity.this, PreviewActivity.class);
intent.putExtra(EXTRA_BITMAP_DATA, mBitmap);
startActivityForResult(intent, REQUEST_PREVIEW);