28 января, 2013

Ошибка ld: symbol(s) not found for architecture x86_64

При попытке собрать php-5.2.10 на macOS 10.8.2, появляется ошибка ld: symbol(s) not found for architecture x86_64.

Решить проблему можно следующем образом:

1) добавляем в Makefile строку

EXTRA_CFLAGS=-lresolv

2) меняем в ext/iconv/iconv.c

#define iconv libiconv to #define iconv iconv

После этого php собирается отлично и без проблем.

28 декабря, 2012

Выравнивание дива по вертикали и горизонтали

Иногда бывает нужно отцентрировать div на странице, это достаточно просто сделать через абсолютное позиционирование:

<!DOCTYPE html>
<html>
<head>
    <style type="text/css">
        div {
            background-color: #000;
            height: 500px;
            left: 50%;
            margin: -250px 0 0 -250px;
            top: 50%;
            position: absolute;
            width: 500px;
        }
    </style>
</head>
<body>
<div></div>
</body>
</html> 

Это создаст квадрат Малевича 500×500 пикселей по центу страницы.

14 октября, 2012

Отрывок из книги Сергея Тормашева «Наследие»

Даже волки, преследуя стадо оленей и пожирая слабых и плохо приспособленных, убивали лишь следствие. ГМО же боролось с самой сутью проблемы — уничтожала стадо по генетическому принципу. Ты не хочешь заботиться о себе и будущем своих детей? Тебе наплевать, что происходит с планетой и какая экология тебя окружает? Тебя не интересует, что ты ешь, пьешь, вдыхаешь? У тебя не хватает мозгов заработать достаточно денег на покупку чистой пищи в магазинах МАГБ? Тогда ГМО для тебя, добро пожаловать в фаст-фуд. Ешь на здоровье, и природа вздохнет спокойно — твои дети родятся нежизнеспособными и не дадут потомства. После твоей смерти уже никто не передаст следующему поколению твои гены тупоумия и недалекости. Вот что такое естественный отбор по Уэйну! Да будет так, и так будет!

, ,

3 августа, 2012

Групповое переименование файлов по маске

По долгу службы встала задача переименовать группу файлов в директории по маске ( убрать у php файлов префикс и постфикс ).
Исходные файлы вида aqNameClass.class.php нужно привести к виду NameClass.php

Решается эта задача одной командой shell:

for i in *.class.php; do mv "$i" `echo "$i" | sed "s/\.class//" | sed "s/^aq//"`; done

, ,

9 июля, 2012

Монтирование SD карты с правами пользователя в arch linux

Задача:

примонтировать SD карту на 64G как дополнительный жесткий диск, чтобы не-root мог читать ее и записывать в нее.

Решение:

mount -o uid=<uid> /dev/<dev_id> /mnt/<mount_point>

где,

<uid> — id пользователя ( узнать можно командой id или посмотреть в /etc/passwd )

<dev_id> — устройство sd карты

<mount_point> — каталог в который будет примонтирована SD-карта.

в /etc/fstab добавляем опцию монтированя uid=<uid>

и всё.

25 декабря, 2010

Скругление углов на PHP / GD

<?php

$filename = 'image.jpg';
$radius = 15;

/**
 * Чем выше rate, тем лучше качество сглаживания и больше время обработки и
 * потребление памяти.
 *
 * Оптимальный rate подбирается в зависимости от радиуса.
 */
$rate = 3;

$img = imagecreatefromstring(file_get_contents($filename));
imagealphablending($img, false);
imagesavealpha($img, true);

$width = imagesx($img);
$height = imagesy($img);

$rs_radius = $radius * $rate;
$rs_size = $rs_radius * 2;

$corner = imagecreatetruecolor($rs_size, $rs_size);
imagealphablending($corner, false);

$trans = imagecolorallocatealpha($corner, 255, 255, 255, 127);
imagefill($corner, 0, 0, $trans);

$positions = array(
    array(0, 0, 0, 0),
    array($rs_radius, 0, $width — $radius, 0),
array($rs_radius, $rs_radius, $width — $radius, $height — $radius),
array(0, $rs_radius, 0, $height — $radius),
);

foreach ($positions as $pos) {
    imagecopyresampled($corner, $img, $pos[0], $pos[1], $pos[2], $pos[3], $rs_radius, $rs_radius, $radius, $radius);
}

$lx = $ly = 0;
$i = —$rs_radius;
$y2 = —$i;
$r_2 = $rs_radius * $rs_radius;

for (; $i <= $y2; $i++) {

    $y = $i;
    $x = sqrt($r_2 — $y * $y);

$y += $rs_radius;
$x += $rs_radius;

imageline($corner, $x, $y, $rs_size, $y, $trans);
imageline($corner, 0, $y, $rs_size — $x, $y, $trans);

$lx = $x;
$ly = $y;
}

foreach ($positions as $i => $pos) {
    imagecopyresampled($img, $corner, $pos[2], $pos[3], $pos[0], $pos[1], $radius, $radius, $rs_radius, $rs_radius);
}

header(‘Content - Type: image / png’);
imagepng($img);

19 декабря, 2010

Шелл на PHP

Небольшая тулза на PHP+Ajax, которая позволяет выполнять shell команды.

<?php
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    if (!empty($_POST['command'])) {
        exec($_POST['command'], $result);
        if (is_array($result)) {
            foreach ($result as $str)
                $res[] = htmlspecialchars($str);
            $res = isset($res) ? implode("<br />", $res) : '';
        } else {
            $res = $result;
        }
        echo $res;
    }
    exit();
}
?>

<!DOCTYPE HTML>
<html>
<head>
    <title>Shell</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript">
        function clear(c) {
            c.attr("value", "");
        }

        $(document).ready(function () {
            var c = $("input[name='command']");
            clear(c);
            c.focus(function () {
                $("span").hide();
            });
            c.blur(function () {
                $("span").show();
            });
            c.keyup(function (event) {
                if (event.keyCode == 13)
                    $.post('sh.php', {
                        command: $(this).val()
                    }, function (data) {
                        $("div").html(data);
                        clear(c);
                    });
            });
        });
    </script>
    <style type="text/css">
        * {
            background: #000;
            border: 0;
            color: green;
            font: 62.5% Arial, Helvetica, sans-serif;
            width: 100%;
        }

        body {
            font-size: 1.5em;
            margin: 0;
            padding: 0;
        }

        input {
            background-color: #000;
            font-size: 1em;
            width: 80%;
        }

        div {
            background: #000;
            font-size: 1em;
            height: 100%;
            min-height: 20px;
            width: 90%;
        }

        strong {
            color: #fff;
        }

        hr {
            color: #fff;
            background-color: #fff;
            height: 1px;
            margin-top: 0;
            width: 100%;
        }

        blink {
            font-size: 1.5em;
        }

        p {
            background: #fff url(http://www.catb.org/~esr/hacker-emblem/glider.png) no-repeat top right;
            display: block;
            height: 55px;
            right: 20px;
            position: absolute;
            width: 55px;
        }
    </style>
</head>
<body>
<?php system('hostname')?>&gt;<span><blink>_</blink></span>
<input name="command"/>
<hr/>
<p></p>
<div></div>
</body>
</html>

18 декабря, 2010

И снова fluxbox

После примерно полугода использования в качестве оконного менеджера XFCE4,
я все таки решил вернуться к старому доброму fluxbox, может это от того, что у меня
тяга ко всему простому и аскетичному, может от того что на еже fluxbox смотрится прикольний,
но так или иначе мне пришлось восстонавливать все настройки с нуля, собственно поэтому решил написать пост, чтобы
сохранились настройки, ну и может кому пригодиться, в конце поста представлен скриншот того, что получилось.

Для начала обнаружил, что после перехода у меня слетела возможность переключаться на русский язык.
Это показалось странным так как setxkbmap у меня запускался в .xsession, но как я понял после запуска fluxbox
любые команды прописанные в startup игнорируются, поэтому прописал

<code>setxkbmap -layout us,ru -variant ,winkeys -option </code>
<code>grp:caps_toggle,grp_led:scroll,terminate:ctrl_alt_bksp,compose:ralt</code>


в файл .fluxbox/startup перед командой запуска fluxbox

<br><code>exec fluxbox</code><br>

Прописал так же в этом же файле запуск коньков

<br><code>conky&amp;</code>

Туда же добавляем обои рабочего стола, закидываем обои куда-нибудь в .fluxbox/bg/ и прописываем путь к обоене. В качестве обоены я решил использовать няшку из манги с тату-логотипом арчилинукса %))
Например вот так:

<br><code>fbsetbg -f bg/archMangaBabe.jpg</code><br>

Название виртуальных столов в панели — «Рабочий стол <N>» смотрится уныло и слишком длинно, поэтому решил поправить название на D<N>, правится это в файле .fluxbox/init:

<br><code>session.screen0.workspaceNames: D1,D2,D3,D4</code>


Можно немного сэкономить место на экране и сделать автоскрытие тулбара

<br><code>session.screen0.toolbar.autoHide: true</code>


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

session.screen0.toolbar.widthPercent: 80


Редактим .fluxbox/menu и добавляем то что хотим видеть в меню, а так же убираем ненужные пункты, у меня получилось что-то вроде этого:

[begin] (Trinity)
[encoding] {UTF-8}
[exec] (Terminal) {terminal}
[separator]
[exec] (Mc) {mc}
[exec] (Thunar) {thunar}
[separator]
[exec] (Eclipse) {eclipse}
[separator]
[exec] (Firefox) {firefox}
[separator]
[exec] (Climm) {terminal -e climm}
[exec] (Skype) {skype}
[separator]
[exec] (Moc) {terminal -e mocp}
[exec] (Alsamixer) {terminal -e alsamixer}
[exec] (Alsa reload) {terminal -e sudo alsactl restore}
[separator]
[exec] (Gimp) {gimp}
[separator]
[submenu] (System Tools)
[exec]
 (top) {xterm}
[exec]
 (top) {xterm -e top}
[separator]
[end]
[submenu] (Fluxbox menu)
[config] (Configure)
[submenu] (System Styles) {Choose a style...}
[stylesdir] (/usr/share/fluxbox/styles)
[end]
[submenu] (User Styles) {Choose a style...}
[stylesdir] (~/.fluxbox/styles)
[end]
[workspaces] (Workspace List)
[commanddialog] (Fluxbox Command)
[reconfig] (Reload config)
[exec] (About) {(fluxbox -v; fluxbox -info | sed 1d) | xmessage -file - -center}
[end]
[separator]
[exec] (Xlock) {xlock -mode blank}
[separator]
[restart] (Restart)
[exit] (Exit)
[endencoding]
[end]

28 июля, 2010

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

Как-то поднадоело мне постоянно редактировать вручную httpd.conf и /etc/hosts и я решил написать скрипт, который бы позволил автоматизировать этот процесс
Вот такой скрипт:

#!/bin/sh

# Константы:
HOSTS='/tc/hosts'; # Путь к файлу hosts
HTTPD_CONF='/etc/httpd/conf/extra/httpd-vhosts.conf';

# Путь к файлу с настройками виртуальных хостов
DIR_HTTP='/srv/http/'; # Путь к директориям с хостами
IP_MASK='127.0.0.'; # Маска по которой будет формироваться новый IP
INDEX_FILE='index.php'; # Index файл в корневой папке нового виртуального хоста
DIR_LOG='/var/log/httpd/'; # Путь к папке с логами
EMAIL_ADMIN='wikide@gmail.com'; # Email админестратора

# Функция вывода ошибок
get_error() {
    echo $1;
    exit 0;
}

# Функция проверки ip
check_ip() {
    if [ "`cat $HOSTS | grep \"$ip\"`" ]; then
        echo 1;
    fi
}

# Проверяем наличея параметра с именем хоста
if [ "$1" ]; then
    if [ "$2" ]; then
        # Если задан свой IP
        new_ip=$2;
        if [ "`check_ip $new_ip`" ]; then # Проверка на наличее в файле
            get_error 'Такой ip адрес - '$new_ip' уже занят. Введите другой или пусть скрипт '$0' сам сгенерирует ip адресс для нового хоста.';
        fi;
    else
        # Получаем IP автоматически
        new_ip=$IP_MASK$((`tail -1 $HOSTS | awk '{ split($1, ip, "."); print ip[4]}'`+1));
    fi

    # Если корневая папка нового хоста уже существует
    if [ -d $DIR_HTTP$1/ ]; then
        get_error 'Директория '$1' уже есть в '$DIR_HTTP'. Подберите другое имя.';
    else
        # Создаем корневую директорию виртуального хоста
        mkdir $DIR_HTTP$1;
        echo -e "
    <html>
     <head>
      <title>New host</title>
     </head>
     <body>
        <h1>Created host '$1'!</h1>
     </body>
    </html>" > $DIR_HTTP$1'/index.php';
  
    # Запись в hosts
        sudo echo $new_ip  $1 | sudo tee -a $HOSTS 1>/dev/null;

    # Запись в конфиг Apache
        sudo echo -e "#Create date: `date '+%F %T'`
          DirectoryIndex $INDEX_FILE
          ServerAdmin $EMAIL_ADMIN
          DocumentRoot \"$DIR_HTTP$1/\"
          ServerName $1
          ServerAlias $1
          ErrorLog \"$DIR_LOG$1.log\"
          CustomLog \"$DIR_LOG$1\" common" | sudo tee -a $HTTPD_CONF 1>/dev/null;

        # Перезапускаем сервер
        sudo apachectl restart;

        # Выводими сообщение

        echo 'Виртуальный хост "'$1'" успешно создан'
    fi
else
    get_error 'Нужно обязательно указать название нового хоста $0 NAME_HOST [IP_HOST]';
fi

exit 0;

,

27 июля, 2010

Скрипт запуска wifi в ARCH Linux

Небольшой скрипт для подключения к сетям wifi в ARCH linux

#!/bin/bash

# Определяем интрфейс ( в моем случае это - wlan0)
if [ "$2" ]; then 
	dev=$2;
else 
	dev="wlan0";
fi

# Действие
case "$1" in
	start)
		sudo ifconfig $dev up;
		sudo wpa_supplicant -B -i$dev -c/etc/wpa_supplicant.conf;
		sleep 3;
		sudo dhcpcd $dev 2&gt;/dev/null;
	;;
	stop)	
		sudo killall -9 dhcpcd 3&gt;/dev/null;
		sudo killall -9 wpa_supplicant 3&gt;/dev/null;
		sudo ifconfig $dev down;
	;;
	list)
		sudo ifconfig $dev up;
		sleep 1;
		sudo iwlist $dev scanning;
		sudo ifconfig $dev down;
	;;
	restart)
		$0 stop;
		$0 start;
	;;
	status)
		echo -n 'IP arrdess: '; ifconfig wlan0 | grep "inet addr" | awk '{print $2}' | sed 's/addr://'
		echo -n "Essid: "; iwconfig wlan0 | grep "Ralink STA" | awk '{print $4}' | sed 's/ESSID://'
	;;
	*)

	if [ "$1"  ]; then
		echo "usage: $0 {start|stop|list|restart}"; 
	else 
		echo "Restarting";
		$0 restart;
	fi

esac

exit 0

Вот такой вот скрипт :)

,

26 июля, 2010

Запись звука в Linux

Запись звука в Linux из консоли.
На моём субноуте есть микрофон, вот подумал, что неплохобы понять как записывать снимать звук с него, вот что нашёл:

Запись в wav:

$ arecord test.wav 

Переконвертировать wav в mp3 можно вот так:

$ cat test.wav | lame - > test.mp3

или сразу создать mp3

$ arecord | lame - > test.mp3

Вот так можно записать ядро системы linux в mp3 :)

$ cat /boot/mykernel.img > /dev/dsp &amp; arecord | lame - > test.mp3

,

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

Вот очередной велосипед на тему показа статуса аккумулятора для нэтбука на ARCH Linux :)

Вот такой получается скрипт на sh (думаю все ясно из комментов):

#!/bin/zsh

# Определяем уровень заряда аккумулятора на текущий момент
remaining_bat=`cat /proc/acpi/battery/BAT0/state | grep remaining | awk {'print $3'}`;

# Определяем 100% заряда для аккумулятора
full_bat=`cat /proc/acpi/battery/BAT0/info | grep full | awk {'print $4'}`;

# Определяем подключён сетевой провод или нет
stat=`cat /proc/acpi/battery/BAT0/state | grep charging | awk {'print $3'}`;

if [ $stat = 'charging' ]; then
stat='+'; # Провод подключён ( ноут зяряжеается )
else if [ $stat = 'charged' ]; then
stat=''; # ( Аккумулятор зяряжен)
else
stat='-'; # Провод не подключён ( ноут разряжается )
fi
fi

# получаем заряд батареи в % ( Школьная математика - Рулит! :) )
bat=$(($remaining_bat*100/$full_bat));

# основные цвета ( ESC - последовательности, подробнее - $ man console_codes )
RED="\033[31m"; # Красный
YELLOW="\033[33m"; # Жёлтый
WHITE="\033[38m"; # Белый

# Цвет по-умолчанию
DEFAULT="\033[0m";

if [ $bat -lt 10 ]; then # Если заряд аккамулятора меньше 10% (краасные цвет)
result="$RED$stat$bat";
else if [ $bat -lt 30 ]; then # Если заряд аккамулятора меньше 30% (жёлтый цвет)
result="$YELLOW$stat$bat";
else
result="$WHTE$stat$bat"; # Заряд аккамулятора больше 30% ( белый цвет )
fi
fi

# Выводим результат
echo -e $result%%$DEFAULT;

exit 0;

Далее говорим zsh о том, что нужно выводить в PROMPT результат этого скрипта.
В файле ~/.zshrc в функции precmd() прописываем где-нибудь в начале:

precmd() {
   BAT=`binf.sh`;
   PROMPT="battery:(`echo $BAT`)::%{$reset_color%}%{$fg_bold[green]%}%m {$reset_color%}::%{$fg_bold[crey]%}[ %~ ]%{$rese+t_color%}&gt; "
.....

Как-то вот так, где binf.sh — скрипт выше.
Обязательно нужно, чтобы binf.sh лежал по пути в переменной PATH, я для этой цели создал папку bin в домашней директории и сделал ссылку на файл в папке /bin

В precmd() — можно запихнуть любые команды, которые будут выполнятся при обновлении командной строки.

,

Получить снимок с web камеры через консоль Linux

Вот способ получисть снимок с web камеры из шел.
Искал способ как получить снимок (фото) с web камеры
Наткнулся только на статью про видеозахват через — ffmpeg. Вот ссылка — http://www.newmoldova.com/?q=node/85

Почитав немного ман по ffmpeg попробовал вот такую конструкцию:

$ ffmpeg -f video4linux2 -s 1024x768 -i /dev/video0 -f image2 snapshot.jpg 2&gt;/dev/null

Вроде работает :)
-f video2linux — формат видео для захвата
-s 1024×768 — размер кадра захвата
-i /dev/video0 — файла web камеры
-f image2 snapshot.jpg — выходной тим и имя файла

,

17 июля, 2010

javascript как узнать все свойства объекта

Небольшая функция на javascript, которая позволяет узнать все свойства объекта

Вот сама функция:

function fnShowProps(obj, objName) {
    var result = "";
    for (var i in obj) // обращение к свойствам объекта по индексу
        result += objName + "." + i + " = " + obj[i] + "\n";
    document.write(result);
}

Вот пример исползования:

fnShowProps(window.location, "location")

Результат:

location.pathname = /JavaScript/
location.protocol = http:
location.search = ?8
location.hash =
location.hostname = htmlcssjs.ru
location.href = http://htmlcssjs.ru/JavaScript/?8
location.host = htmlcssjs.ru
location.port =
location.reload = function reload() { [native code] }
location.replace = function replace() { [native code] }
location.assign = function assign() { [native code] }

Источник: http://htmlcssjs.ru/JavaScript/?8

 

,

foreach в javascript

Во несколько способов реализации foreach в javascript

Вариант 1:

for (var key in some_array) {
            var val = some_array [key];
	    alert (key+' = '+val);	
}

Вариант 2:

for(i=0, c=arr.length; i&lt;c; i++) {
	my_func(arr[i]);
}

Нужно отметить, что второй вариант не совсем реализует foreach, так как перебираются только значения массива без ключей.

15 июля, 2010

Немного об svn

Вот небольшой мануал по использованию svn

Создать репозитарий можно вот так:

$ svnadmin create new_repo

Настраиваем svn вот так:
Идем в new_repo/conf и открываем в любимом редакторе файл svnserve.conf.
В нём мне пригодилось исправить только секцию [general] вот так:

[general]<br>anon-access = none<br>password-db = passwd

anon-access = none — этим сообщаем, что анонимный доступ нужно запретить
password-db = passwd — этим сообщаем, что пароли и логины пользователей svn находится в файле passwd

Файл passwd правим таким образом:

[users]<br>user = password


Запуск серванта svn в FreeBSD:
Если уже запущен, то убиваем процесс (скорее всего прекращать работу сервера через killall -9 не совсем правильно, да простит меня Джа)

$ killall -9 svnserve<br>$ svnserve -d -r ./new_repo

Чекаем свой проджект вот так:

$ svn co svn://my_name_user@host_svn/new_repo project_dir

my_name_user — пользователь svn
host_svn — хост с svn
new_repo — наша директория с репозитарием
project_dir — локальная папка проекта

Далее svn спросит пароль, имя ползователя и возможно задаст ещё пару вопросов, отвечаем..
Если всё правильно, то svn выдаст сообщение типа — Checked out revision n,
где n — номер версии (если репозитарий чекается первый раз, то версия будет 0)

Далее добавляем файлы своего проекта в папку проекта (project_dir) и делаем вот так :

$ svn add * Отправляем обновление на svn сервер:
$ svn commit -m "Добавляем файло в нашу репу ;) "

Вот и все! Кратко, дёшево и сердито, как и должно быть у бадлокодера %)))

З.Ы. Не забывайте про руководства svn и google! Всем удачи!

,

14 июля, 2010

Поиск файла по содержимому этого файла

То что давно хотел узнать :)

Вот так можно найти строку по содержимому файла.

$ find /etc -type f -exec grep -Hn "nameserver" {} \; 2&gt;/dev/null

Вот так можно найти все файлы в каталоге /etc в которых есть слово «nameserver»
Опции grep:

H — выводим имя файла со строкой.
n — номер строки в файле.

Ошибки перенаправляем в /dev/null
При желании можно написать вот такой скрипт:

#/bin/sh

dir='.';
if [ -z $1 ] 
then
	echo 'Команду нужно запускать вот так: find.str  [dir]';
else
	if [ -z $2 ]
	then
		dir=$2
	fi
	
	find . -type f -exec grep -Hn $1 {} \; 2>/dev/null
fi

 

,

13 июля, 2010

Unix — пример работы с текстом

Скачал тут недавно книгу из двух текстовых файлов в koi8-r и с переводами строки в стиле Win (^M)

Решил поправить это дело таким вот образом:

$ cat book_p1.txt book_p2.txt | sed 's/\r//' | iconv -f koi8-r -t utf8 > book.txt

Вот так вот :) Unix — это круто!