PostgreSQL: insert on duplicate key
Да-да. Постгрес не умеет делать
insert * on duplicate key ...
Но это легко эмулируется последовательностью запросов.
UPDATE table SET field='C', field2='Z' WHERE id=3;
INSERT INTO table (id, field, field2)
SELECT 3, 'C', 'Z'
WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3);
Интересное в сети
Алгоритмы
- Neural Networks and Deep Learning
- Алгоритм поиска наименьшего по мощности покрытия конечного множества его подмножествами
- Книга: введение в распределенные вычисления
- Сравнение алгоритмов распозавания аудио
- Интересная задача по переводам текста с несуществующего языка
- Каскад Хаара в OpenCV
JavaScript
- Eloquent JavaScript
- Рисование красивых графов в js и немножко физики
- Timbre.js - библиотека для синтеза звука
- Синтезируем молнию
- Реализация методов для симуляции стохастических процессов
- Поиск кода по JavaScript библиотекам
- Детектируем темп аудио при помощи Web Audio API
Ruby
Python
Инструменты
- Поисковик кода
- Еще один поисковик кода, но только на Java
- Маленькая виртуальная машина на C
- 16-битная forth-машина на VHDL
- Окружение для построения системы анализа сложных данных
- Распознавание речи для чайников
Linux
- A Visual Expedition Inside the Linux File Systems
- The Hercules System/370, ESA/390, and z/Architecture Emulator
- x86 assembler in Bash
- Дебаты Торвальдса и Таненбаума
- Визуальное погружение в дебри файловой системы никсов
Всякое
- Сборник оправданий для разработчика
- Несколько мифов о функциональном программировании
- Смотрим с помощью wi-fi сквозь стену
- Логгирование статистики с помощью e-mail
- Позитывный рассказ о том, как начать конструировать дронов
- Перевод руководства по фреймворку GStreamer
- 64 миллисекунды после нажатия
- Автодополнение на стероидах: redis, lua и nginx
- Объединяем все скидочные карты в одну (и как оно разрабатывалось)
- Ось для калькуляторов Tizen
- Симпсоны на CSS
- Реверс-инжиниринг алгоритмов хранения данных в nand-памяти
Ростелеком: постоянные обрывы соединения
Все было бы нормально если бы не одно но.
Адсл-модем уверенно устанавливал соединение и. И что самое интересное просто так обрывал pppoe-коннект с фразой “pppoe connection terminated unexpectedly”.
Расследование показало, что перед тем, как соединение будет сброшено в лог (что немаловажно в отладочный дл которого надо повысить уровень отладочных сообщений до dbg) падало сообщение о том, что “no response on 3 echo requests”.
Выяснилось следующее:
- падение происходило каждые полторы минуты
- в конфиге для текущего соединения найдена строка lcp echo 30 3
О как! Оказывается, что модем проверяет жизнеспособность соединения при помощи lcp-запросов, а выяснилось, что ростелекомовский adsl их рубит сразу.
Вывод: отключить lcp echo и проверять наличие соединения пингами.
Для zyxel keenetic нужно будет зайти по telnet и выполнить набор команд
(config)> interface PPPoE0
(config-if)> no lcp echo
(config-if)> exit
(config)> system config-save
(config)> exit
Тем самым мы отключим проверку, которая обрушивает соединение.
Yum: поиск пакетов установленных из какого-то репозитария
$ yumdb search from_repo repoid
http://james.fedorapeople.org/yum/commands/find-repos-of-install.py
Локальный DNS для разработчика
Итак. У нас море проектов, море виртуалок. И мы хотим как-то удобно с этим всем работать.
Мне по нраву выделять отдельную доменную зону для всех своих виртуалок и подключать к ней нужные адреса.
Предположим, что все проекты у нас будут собраны в доменной зоне *.dev (удобно же).
И каждый из них будет резолвиться по разным адресам.
Составим для себя список хотелок:
- машины поднимаются вагрантом или еще какой системой (это не так уж и важно)
- после появления машины в сети ее ip связывается с доменом проекта, который на ней крутится
- после завершения привязка уделяется
Начинаем хотелки реализовывать.
Ставим named
$ sudo yum install named
Заставляем его слушать только локалхост (он же девелоперский).
Для этого редактируем named.conf и добавляем в раздел options
listen-on port 53 { 127.0.0.1; };
listen-on-v6 port 53 { ::1; };
Теперь нам надо подключить нашу новую зону.
Добавляем подключение описания в named.conf
zone "dev" IN {
type master;
file "named.dev";
allow-query {any;};
allow-update {
127.0.0.1;
::1;
};
};
В этом описании мы сразу же видим раздел allow-update, который позволяет удаленно изменять зону при помощи команды nsupdate. Разрешаем правку только с локалхоста.
Теперь непосредственно сам файл зоны прямого преобразования - /var/named/named.dev
$ORIGIN dev.
$TTL 86400 ; 1 day
@ IN SOA dev. rname.invalid. (
4 ; serial
86400 ; refresh (1 day)
3600 ; retry (1 hour)
604800 ; expire (1 week)
10800 ; minimum (3 hours)
)
NS dev.
A 127.0.0.1
AAAA ::1
* IN A 127.0.0.1
Последняя строчка нам нужна для того, чтобы все домены, для которых не прописан адрес резолвились на локалхост.
Все. Нам осталось перезапустить.
$ sudo service named restart
Проверяем
$ nslookup test.dev 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: test.dev
Address: 127.0.0.1
Кдасс. А как нам связывать домен с адресом?
Для этого нам нужен скрипт.
#!/bin/bash
TTL=86400
RECORD=$1
IP=$2
(
echo "server dev."
echo "zone dev"
echo "update delete ${RECORD} A"
echo "update add ${RECORD} ${TTL} A ${IP}"
echo "send"
) | /usr/bin/nsupdate
Пробуем
$ ./named.sh test.dev 1.1.1.1
``````shell
$ nslookup test.dev 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: test.dev
Address: 1.1.1.1
Возможные проблемы:
- неправильно установлены права на папку /var/named
- неправильно указан адрес с которого можно обновлять зону
- запрет в selinux - решается выполнением
shell $ sudo setsebool -P named_write_master_zones 1
Теперь можно настроить окружение так, чтобы при запуске виртуалки ее адрес обновлялся в файле зоны через скрипт в автоматическом режиме.