SQLite AUTOINCREMENT

На днях столкнулся с проблемой, при создании таблицы в sqlite, при указании полю свойства autoincrement, значение поля не инкрементируется. Так как это был уже второй раз, когда я сталкивался с этой проблемой, и оба раза пришлось потратить некоторое время на поиски решения (т.к. найденное в первый раз решение конечно же забылось), записываю тут рецепт на следующий раз. Итого, варианты:

create table tbl (id INTEGER AUTO_INCREMENT,some_field TEXT,PRIMARY KEY (id));
create table tbl (id INTEGER,some_field TEXT,PRIMARY KEY (id));
create table tbl (id INTEGER PRIMARY_KEY,some_field TEXT);
create table tbl (id INTEGER PRIMARY_KEY AUTOINCREMENT,some_field TEXT);

не работают!
По крайней мере у меня не заработало, хотя у кого-то, судя по сообщениям на форумах  работало.

Рабочее решение:

create table tbl (id INTEGER PRIMARY KEY AUTOINCREMENT, some_field TEXT);

Проверяем:

sqlite> create table tbl (id INTEGER PRIMARY KEY AUTOINCREMENT, some_field TEXT);
sqlite> insert into tbl  (some_field) values ('123456');
sqlite> select * from tbl;
1|123456
sqlite> insert into tbl  (some_field) values ('123457');
sqlite> insert into tbl  (some_field) values ('123458');
sqlite> insert into tbl  (some_field) values ('123459');
sqlite> select * from tbl;
1|123456
2|123457
3|123458
4|123459
Рубрика: Без рубрики | Добавить комментарий

Памятка по Curl

сURL — утилита командной строки и библиотека, позволяющая осуществлять передачу данных по множеству протоколов с URL синтаксисом. Рассмотрим несколько типовых операций, которые можно выполнить с помощью cURL в коммандной строке.

GET запрос:

curl -i -X GET http://hostname/

GET c JSON

curl -i -H "Accept: application/json" \
-H "Content-Type: application/json" \
-X GET http://hostname/

GET c XML

curl -i -H "Accept: application/xml" \
-H "Content-Type: application/xml" \
-X GET http://hostname/

POST запрос:

curl -i --data "param1=value1&param2=value2" \
-X POST http://hostname/

или

curl -i --data @filename -X POST http://hostname/

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

POST запрос c JSON:

curl -i -H "Content-Type: application/json" \
-X POST -d '{"param1":"value1","param2":"value2"}'  http://hostname/

Ключ -i будет включать печать заголовков в ответе.

Если в ответе json данные, то для форматирования можно воспользоваться командой:

curl -X GET http://hostname/ | python -m json.tool

Это напечатает ответ в удобном для чтения виде. Обратите внимание на отсутвие ключа -i.

Запрос с аутентификацией:

curl -X GET -u user:password  http://hostname/
Рубрика: Без рубрики | Добавить комментарий

Реализация Singleton на Perl

Singleton (одиночка) — хорошо известный шаблон проектирования который позволяет создавать единственный экземпляр класса. Относится к порождающему типу шаблонов.

Когда стоит использовать singleton

Данный шаблон может быть полезен в следующих случаях:

  • У вас имеется единственный ресурс, который нужно использовать в различных частях вашей системы. Например объект, который выполняет логирование сообщений системы. (Log::log4perl реализует шаблон singleton).
  • Класс не может корректно выполнять свои функции при наличии более чем одного экземпляра (например файловая система или игровой цикл)
  • Вам нужен singleton как компонент другого шаблона проектирования.

Реализация класса singleton

Добавим проверку на существование экземпляра класса в конструкторе. В случае, если один экземпляр уже существует, возвращаем его, иначе создаем новый.

package Singleton;

my $instance = undef;

sub new {
    $instance = bless {}, shift unless $instance;
    return $instance;
}

1;

Проверим работу шаблона:

#!/usr/bin/perl
use strict;
use warnings;
use Singleton; 

my $singleton_1 = Singleton->new;
$singleton_1->{favourite_animal} = 'dog';

my $singleton_2 = Singleton->new;

print $singleton_2->{favourite_animal} . "\n";

В результате запуска получаем:

[root@maxhost]# perl script.pl 
dog
Рубрика: Без рубрики | Добавить комментарий

SSH подключение через socks proxy

В сети достаточно много материала о том, как сделать socks прокси средствами ssh, и при этом гораздо меньше сведений о том, как подключиться к удаленному хосту по ssh через socks прокси. В linux и  Mac OS для этого можно воспользоваться командой:

ssh -o ProxyCommand='nc -x socksHost:socksPort %h %p' remote_host
Рубрика: Без рубрики | Добавить комментарий

Установка tftp сервера в Debian / Ubuntu

Рассмотрим установку tftpd в операционных системах Debian / Ubuntu. В качестве tftpd сервера остановимся на atftp. Atftp это многопоточный TFTP сервер, который также поддерживает мультикаст протокол, известный  как  mtftp, определенный в  PXE спецификации.  Сервер поддерживает как режим запуска через inted, так и работу в режиме демона, с использованием скриптов инициализации.

Установка atftp сервера

sudo aptitude install atftpd

Конфигурация сервера

По умолчанию atftpd сервер запускается через inetd. Изменим его поведение и заставим запускаться не через inetd. Для этого нужно отредактировать файл  /etc/default/atftpd. Открываем файл для редактирования в вашем любимом редакторе, например в vi:

sudo vi /etc/default/atftpd

Меняем строку

USE_INETD=true

на

USE_INETD=false

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

sudo mkdir /tftpboot
sudo chmod -R 777 /tftpboot
sudo chown -R nobody /tftpboot

Запускаем сервер:

sudo service atftpd start

Если сервер не стартует, а  в логах вы наблюдаете ошибку

atftpd: invalid IP address

добавьте в файле /etc/default/atftpd в строке аргументов параметр

--bind-address <ip address>

где <ip address> адрес на хосте, на котором будет работать atftp.

Проверка tftp сервера

Теперь проверим работоспособность нашего сервера. Для этого попробуем передать файл с клиентской машины  на сервер. В примере, в качестве клиента используется компьютер с Linux на борту.

Создаем на клиентской стороне текстовый файл для передачи:

touch test.txt
tftp> <tftpd server ip>
tftp> put test.txt
tftp> quit

Проверяем наличие файла в директории /tftpboot на сервере:

ls -l /tftpboot/
total 0
-rw-r--r-- 1 nobody nogroup 0 Aug 20 17:06 test.txt

Наличие файла говорит об успешном окончании установки.

Рубрика: howto | Добавить комментарий

Пример использования MySQL интерфейса для С (C API)

C API предоставляет низкоуровневый доступ к MySQL клиент/серверному протоколу и позволяется программам на языке С получать доступ к базе данных. Код C API распространяется с MySQL и реализован в библиотеке libmysqlclient.  Для того, чтобы воспользоваться API, необходимо установить пакет mysql-devel (название может варьироваться в зависимости от операционной системы). Ниже приведен простой пример подключения к базе данных ‘mysql’ и получения данных из таблицы ‘user':

#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"

MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;

void exiterr(int exitcode)
{
  fprintf(stderr, "%s\n", mysql_error(&mysql));
  exit(exitcode);
}                                                                                                         

int main()
{
  uint i = 0;
  if (!(mysql_real_connect(&mysql,"127.0.0.1","user","password","mysql",3306,NULL,0)))
     exiterr(1);
  if (mysql_query(&mysql,"SELECT host,user FROM user"))
     exiterr(3);
  if (!(res = mysql_store_result(&mysql))) exiterr(4);
  while((row = mysql_fetch_row(res))) {
    for (i=0 ; i < mysql_num_fields(res); i++)
      printf("%s \t",row[i]);
    printf("\n");
  }
  if (!mysql_eof(res)) exiterr(5);
  mysql_free_result(res);
  mysql_close(&mysql);
}

Компиляция программы осуществляется следующей командой:

$ cc -I/usr/include/mysql -L/usr/lib/mysql mysqlapi.c -o mysqlapi -lm -lmysqlclient

mysqlapi.c — файл, содержащий исходный код примера,
/usr/include/mysql — директория, где распологаются заголовочные файлы,
/usr/lib/mysql — директория с библиотеками mysql.

После компиляции в вашей рабочей директории должен появиться исполняемый файл mysqlapi. Полное описание API можно получить на странице документации MySQL или на оpennet.

 

Рубрика: Без рубрики | Добавить комментарий

Backup виртуальных машин в vmware esx(i)

Народная мудрость гласит: «админы деляться на тех кто еще не делает бекапы и тех, кто УЖЕ делает».  В случае с виртуализацией наличие своевременных бекапов особенно актуально. Ведь если выйдет из строя сервер, на котором стоит гипервизор с несколькими виртуальными машинами, вы можете потерять сразу несколько важных сервисов.  Если у вас стоит vmware esxi и вы желаете организовать бекап ваших виртуальных машин, то эта статья для вас.

Читать далее

Рубрика: Без рубрики | Метки: | 1 комментарий

Отправка почты из командной строки с помощью netcat

Если нужно отправить сообщение на почтовый ящик из командной строки, можно воспользоваться утилитой netcat. Простой пример:

#/bin/nc host.example.com 25
220 host.example.com, ESMTP EXIM 4.72
HELO host.example.com
250 host.example.com Hello host.example.com [192.168.1.1]
MAIL FROM:<user@host.example.com>
250 OK
RCPT TO:<user2@host.example.com>
250 Accepted
DATA
354 Enter message, ending with "." on a line by itself
<Body of email>
.
250 OK id=1U9xIe-000KV6-NV
QUIT
221 host.example.com closing connection

Где:
host.example.com — почтовый сервер, через который будем отправлять почту
<user@host.example.com> — почтовый адрес отправителя
<user2@host.example.com> — почтовый адрес получателя
<Body of email> — текст сообщения

Можно вынести данные в отдельный файл:

#vi maildata.txt
HELO host.example.com
MAIL FROM:<user@host.example.com>
RCPT TO:<user2@host.example.com>
DATA
<Body of email>
.
QUIT

и тогда чтобы отправить почту надо ввести:

#/bin/nc host.example.com 25 < maildata.txt

Если вы получаете ошибку 554 SMTP synchronization error, значит на почтовом сервере выставлена принудительная синхронизация. Если есть доступ к серверу и там стоит exim, синхронизацию можно отключить, указав в конфигурационном файле:

smtp_enforce_sync = false

 

 

Рубрика: Без рубрики | Метки: | Добавить комментарий

Аутентификация в ssh с использованием ключей

Часто возникает необходимость зайти на сервер не вводя пароля. В основном это бывает нужно в различных скриптах, для автоматизации каких-либо действий. Использование ключей может быть полезно в случаях, когда на сервер заходят разные пользователи, но пользуются при это одной учетной записью. Чтобы не сообщать основной пароль учетной записи всем, можно для каждого пользователя создать пару ключей. При этом у каждого будет свой личный ключ, который для дополнительной безопасности может быть защищен паролем. А если нужно запретить пользователю доступ, достаточно удалить его ключ на сервере.
Читать далее

Рубрика: Без рубрики | Метки: , | Добавить комментарий

Подбор забытого пароля к видеорегистратору MDR-16800

Видеонаблюдение все плотнее входит в нашу жизнь. Камеры окружают нас повсюду, в метро, на улице, бизнес центрах и даже поездах. ТСЖ нашего дома решило тоже не стоять на меcте и установить на доме систему видеонаблюдения. Решено было приобрести видеорегистратор MDR-16800 фирмы MICRODIGITAL.

Читать далее

Рубрика: Без рубрики | Метки: | Комментарии (6)