Сен 29

SQL рецепты: курс валют ЦБ РФ

Была однажды необходимость загружать курс валют прямо в базу данных. Нужен был самый простой вариант. Вот мы его и написали.


DECLARE @hDoc INT
declare @xml xml
Declare @Object as Int;
Declare @ResponseText as Varbinary(8000);
Declare @Url as Varchar(MAX);
declare @usd float;
declare @today datetime;
select @Url = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req='+convert(varchar(100), getdate(),103)
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get', @Url, 'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responsebody', @ResponseText OUTPUT
Exec sp_OADestroy @Object
select @xml = cast (@ResponseText as xml)
EXEC sp_xml_preparedocument @hDoc OUTPUT,@xml
SELECT
@usd = cast(replace(value, ',','.') as float)
FROM
OPENXML(@hDoc, '//Value')
WITH
(
id nvarchar(100) '../@ID',
name nvarchar(100) '../Name',
value nvarchar(100) '../Value'
)
where id = 'R01235'
EXEC sp_xml_removedocument @hDoc

Таким образом в переменной @usd мы получаем сегодняшний курс доллара. R01235 — идентификатор USD. Документация API

Подробнее

Сен 29

SQL рецепты: скачивание файла и загрузка в базу

Сегодня я расскажу, как скачать файл из сети и загрузить его в базу данных.
В последних версиях Windows по умолчанию есть утилита Power Shell, этим мы и воспользуемся.

Напишем скрипт, которому в качестве аргументов передадим URL и Путь.


$webclient = New-Object System.Net.WebClient
$url = $args[0]
$file = $args[1]
$webclient.DownloadFile($url,$file)

Назовем файл download.ps1.

Затем нам всего лишь остается написать немного кода на t-sql


set @cmd = 'powershell.exe -file "C:\alpha\download.ps1" "'+@fullurl+'" "'+@filepath+'" '
EXEC xp_cmdshell @cmd
if object_id('tempdb..#Filedata') is not null
drop table #Filedata
create table #filedata(number int, filedata varbinary(max))
set @sql = 'insert into #filedata(number, filedata)
SELECT '+CAST(@IncidentNumber as varchar(max))+', CAST(bulkcolumn AS varbinary(max))
FROM OPENROWSET(BULK '''+@filepath+''', SINGLE_BLOB) as y'
exec (@sql)
select @datafile=filedata from #filedata

Таким несложным способом из комбинации Power Shell, Openrowset и динамического SQL мы получили во временной таблице наш файл в бинарном виде. Применяйте везде, где нужно.

Подробнее

Сен 28

SQL рецепты: удаление всех записей из таблиц

Еще один незаменимый рецепт, который просто спас однажды меня. Во-первых, это процедура, которая умеет делать все что хочешь с каждой таблицей в базе данных sp_msforeachtable, во-вторых, конечно же ее применение в реальной жизни.


exec sp_msforeachtable N'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
exec sp_msforeachtable N'ALTER TABLE ? DISABLE TRIGGER ALL'
exec sp_msforeachtable N'DELETE FROM ?'
exec sp_msforeachtable N'ALTER TABLE ? ENABLE TRIGGER ALL'
exec sp_msforeachtable N'ALTER TABLE ? CHECK CONSTRAINT ALL'

Этот код последовательно отключает проверку внешних ключей, все триггеры, затем удаляет все записи из таблиц, затем включает триггеры и проверку ключей обратно.
Обращаю внимание, что delete работает очень медленно и пишет в логи, гораздо быстрее работает truncate. Но truncate будет работать только если удалить все ключи (и те, которые ссылаются, и те, на которые ссылается таблица). Это легко делается через интерфейс SQL Management Studio, но восстанавливается, увы, не так быстро и только руками. В общем, выбирайте сами.

Подробнее

Сен 28

SQL рецепты: поиск по тексту процедур и триггеров

Сим постом начинаю новую рубрику «SQL рецепты», ибо в работе часто приходится искать что-то, разбросанное по сети. Все в этой рубрике будет касаться MS SQL.

Дебютирует в этой рубрике самый популярный рецепт. Поиск по тексту триггеров и процедур:

SELECT o.name AS Object_Name,
o.type_desc
FROM sys.sql_modules m
INNER JOIN sys.objects o
ON m.object_id = o.object_id
WHERE m.definition Like '%search_string%'

Вместо search_string следует вставить свою строку.

Подробнее

Авг 27

Google speech api v2 для чайников

Привет. Сегодня я хочу рассказать об отличной вещи для разработчиков, распознавание речи силами Google. Ни для кого не секрет, что телефоны на базе Android умеют искать в Google то, что вы им надиктовали, и распознает это весьма успешно. Многие этим пользовались, реверсили запросы и использовали в своих проектах. Увы, где-то весной 2014го это закончилось, Google прикрыли доступ к первой версии своего API, изменили формат запроса и добавили аутентификацию для них.

Сейчас это вполне себе легальная функция для разработчиков, вполне документированная, но не без сложностей. Первую версию API застать мне не случилось, а вот вторую попросили коллеги помочь разобрать, ибо надо было что-то делать. К концу дня стало понятно, что не все подробно описано в рунете (да и в англоязычном тоже). Так что давайте по порядку.

UPD 07.01.2016:
Теперь Google Speech API не поддерживает стерео файлы формата Flac (про wav не уверена), только моно. Для записи тестового файла поспользуйтесь Audacity, внизу слева необходимо выбрать частоту 44100, справа сверху режим «Mono». При экспорте файла в формате Flac на всякий случай выберите уровень сжатия 0. Таким образом, статья все еще актуальна на эту дату.
В качестве бонуса работающий API-key AIzaSyCPYK77NqpUfWoHof_HlhnKaGZAsaMT02Q, но заведите лучше свой, интерфейс там немного поменялся,сейчас пункт называется API Manager, там в поиске надо найти Speech API, enable его, и завести в Credentials new API Key.
(for non-russian speakers: google speech api doesn’t support flac stereo files, so previous examples doesn’t works now, please, record your own test files via Audacity, use Mono recording channel, this option in top right conner of application, then use python file, which is at the bottom of this article, thanks)
/UPD

1. Надо обязательно зайти сюда и почитать о формате входных данных, выходных данных, используемых кодеков, а так же скачать примеры аудио-записей для тестов. После чего проверить (при наличии микрофона) https://www.google.com/intl/en/chrome/demos/speech.html , как это будет распознаваться в итоге и подходит ли под ваши задачи.

2. Если все понятно, то, в случае, если вам повезло иметь *nix-подобную систему под рукой, то можно тут же проверить при помощи Curl (пример есть по ссылке выше, API-key для тестов можно использовать AIzaSyAqk7vE0vQDR3JItUPgFp6bcPqgJz8h8tI, работал на август 2014, имейте совесть, заведите свой ключ для продакшена). Если вам не повезло, и под рукой есть только винда, то проверить можно Python скрипта, который опубликован в конце, или любым другим удобным для вас способом написания Post-запросов.
(далее…)

Подробнее

Ноя 27

TimeMachine, samba, Mountain Lion

Вспомнила, как на роутере пыталась настроить timemachine и столкнулась с трудностями, во всех инструкциях, предназначенных для предыдущих версий OS X отстутствовал один необходимый пункт, без него TimeMachine не работает по smb.
По пунктам, как заработало у меня:
1. В терминале пишем defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

2.
а) Пишем и запоминаем mac-адрес: ifconfig en0 | grep ether
б) Заходим System Preferences-Sharing (Системные настройки — Общий доступ) и запоминаем имя компьютера
в) hdiutil create -size G -fs HFS+J -volname 'Time Machine Backups' -type SPARSEBUNDLE .sparsebundle
г) hdiutil create -size 200g -fs HFS+J -volname “OSX Backup” mymac_000000000000.sparsebundle (где mymac — имя компьютера, а 000000000000 — mac-адрес)
3. Создаем файл с следующим содержанием:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.backupd.HostUUID</key>
<string>MYUUID</string>
</dict>
</plist>

И называем его com.apple.TimeMachine.MachineID.plist (вместо MYUUID — UUID вашей машины (можно посмотреть в сведениях о компьютере, на закладке «Аппаратные средства»)
4. в терминале копируем plist-файл в наш образ: cp com.apple.TimeMachine.MachineID.plist .sparsebundle/
5. Образ (sparsebundle) копируем в smb-шару (сервер, роутер..).
6. В терминале: hdiutil attach -verbose /path/to/sparsebundle (скорее всего будет что-то вроде /Volumes/TimeMachine/mymac_000000000000.sparsebundle/)
7. Еще раз в терминале: sudo tmutil setdestination /Volumes/mounted_sprase_bundle (что-то вроде /Volumes/OSX Backups/)
8. Открываем TimeMachiene и выбираем наш новый диск

Все. Эта инструкция гарантировано работала у меня с Mountain Lion, роутером и samba в октябре 2012.

С помощью automator я создала на рабочем столе скрипт, который запускает hdiutil attach -verbose /path/to/sparsebundle Просто запускаю его после включения компьютера, а дальше TimeMachine его вполне видит.

P.s. Скорее всего для работы этого метода в пункте 2 называть по особенному файл не обязательно, пункт 3-4 скорее всего тоже можно опустить, но для совместимости с предыдущими версиями (и инструкциями в инете) я их оставила.

Подробнее

Ноя 24

Tomato firmware tagged Vlan

Внимание! В этом посте содержится окончательный ответ на вопрос, что делать, если провайдер использует тегированые вланы, а я не хочу покупать Dlink DIR-100, потому что хочу, чтобы моя железка за 4..9 тыс.руб. должна это уметь!

Теперь, когда вы предупреждены, можно начать. Бывает ситуация, когда провайдер дома работает с сервисами типа IPTV или телефонии с помощью VLAN, при чем растегирование происходит на оборудовании у вас дома, с помощью нехитрой железки DIR-100 или аналога. Но занимать лишнюю розетку не хочется да или вообще, охота использовать все возможности.

Предполагается, что у Вас есть роутер с Tomato Firmware, у которого во вкладке Advanced есть пункт VLAN (сборки Toastman, shibby и другие). Так же у вас есть доступ по telnet или ssh. Проверялось все на Asus rt-n66u.

(далее…)

Подробнее

Ноя 19

Идеальный Торрент монитор и прочие радости жизни. Мысли вокруг да около.

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

Сменила я недавно свой любименький asus rt-n16, пришлось оставить у родителей. Не забирать же у них в связи с тем, что дочь выросла и уехала жить отдельно, правильно? Мучались с старым нетгиром полгода, и наконец-то купили новенький, с иголочки топовый Asus RT-n66u. Радости было.. Захотелось сразу написать, как я собирала прошивку для него сама (все та же томата, все того же тостмана, ничего не изменилось). Потом, какие серверы я поднимала и как настраивала тайм-машину и daap-сервер..
Но что-то не пошло. Может еще напишу.

А пока у меня есть более любопытная тема.

На хабре нашла статью про любопытное приложение TorrentMonitor (http://habrahabr.ru/post/157319/). Попало оно как раз в жилу, если бы не оно, я бы сама начала что-то похожее писать. Скриншоты выглядели радужно, очень обнадеживающе. Как мне показалось, при наличии роутера, крутящегося на нем веб-сервера, подключенного жестака и трансмишн, там же работающем в постоянном режиме, TorrentMonitor был как раз кстати и вписывался в картину почти идеально. Не без проблем (http://habrahabr.ru/post/157319/#comment_5392719 ) я его поставила и запустила.

Никто не будет отрицать, что во времена таких клевых сериалов, как Декстер, Теория большого Взрыва и так далее хочется держать руку на пульсе и иметь всегда свежие версии. В случае с utorrent можно добавить rss-ленты и скачивать автоматом. Transmission тоже предлагает свои варианты такой реализации (мне не подходящие, кстати). Почти все клиенты дают возможность мониторить папку с торрентами и добавлять в загрузку появившиеся там файлы.

Но, увы, все это только костыли. Большинство торрент-трекеров не имеют своей ленты rss с торрентами, а если и имеют, накладываются всякие другие ограничения, поэтому появление TorrentMonitor зажгло в моей душе надежду, что все это наконец-то в прошлом.
К сожалению, за красивой аякс-оболочкой скрывался скудный функционал, не достойный такого дизайна (извините меня, пожалуйста, автор). Кому-то наверное достаточно 4х трекеров и единственного функционала складывания ентого в папочку. Но этого конечно мало. Теперь по порядку.

(далее…)

Подробнее

Дек 14

Asus RT-N16

Доброго времени суток.
Хотелось бы рассказать всем обладателям сего девайса и просто интересующимся о своих приключениях с этой железкой, равно как и побеседовать о его настройках и прошивках.
Родная прошивка этого чуда современной техники настолько простая и незамысловатая, что даже рассказывать о настройке не хочется, отмечу только что одновременный доступ в сеть и в локальную сеть там есть, а впнка легко и не напрягаясь тянет 32мбита, бОльшие скорости просто не тестировались пока. А родной торрент клиент с его софтиной для компа как-то совсем не впечатлили и работали через пень-колоду. Да и ко всему прочему с последней асустековской прошивкой падал роутер безбожно. Два дня отмучался, после чего было принято решение зарядить его чем-нибудь поинтересней.
Прошивка от энтузиастов была отложена на неопределённый срок из-за её кислотных цветов веб-морды. Эстетика, знаете ли, тоже важна =)
Не особо долго думая была вкатана dd-wrt, как самая популярная из альтернативных прошивок почти на все устройства.
Сразу впечатлила своим бесчисленным количеством настроек и симпатичной страничкой настройки, на уровне родной асусовской.
Но, увы, не умеет она static IP вместе с l2tp, прожила она сутки с pptp и так же как и асустековская ушла в /dev/null. На русскоязычном форуме dd-wrt наткнулась на раздувшуюся тему не столь известной в русскоязычных кругах как dd-wrt и Олеговская(энтузиастов) прошивке tomato, почти не найдя там отрицательных отзывов решилась на то, что бы поставить её.
Сказать, что я была приятно удивлена это не сказать ничего. В нашей сети (пр.автора: l2tp static ip dual acceess) сеть завелась с полоборота. Никаких дополнительных настроек, только сеть и маршрутизация.

Примерно так это выглядит:

Всё до безобразия просто. Но это если мы просто хотим использовать устройство для доступа в интернет. Но ведь мы пойдём дальше, у нас есть два usb выхода, у меня к нему подключен 2х-терабайтный WD Elements, который в сетевом окружении тоже стал сразу виден, вот некоторые настройки usb:

В общем-то на этом очевидная часть заканчивается.

Начинается более интересная и замысловатая. Как мы все помним, на роутерах стоят у нас линуксы, а это даёт нам некоторые расширенные возможности. Первое, что захотелось поставить, это вменяемый торрент-клиент. Остановив свой выбор на transmission я начала в его сторону гуглить.

Для начала, для расширения памяти маршрутизатора и снятия с нас ограничений на установку программ я воткнула в свободный usb порт флешку, отформатированную в ext2 (необходимо либо отформатировать один из разделов в внешнем жёстком под Ext2 или Ext3, либо довольствоваться встроенной памятью маршрутизатора, либо так же как и я  подключать флешку, форматировать в fat или ntfs не прокатит, система на неё ставить не позволит нужные нам програмки). Рекомендуется пару раз смонтировать и размонтировать через веб-интерфейс как флешку, так и жёсткий, дабы убедиться, что они монтируются в одно и то же место. Заходим по telnet на роутер, в качестве логина используем root, в качестве пароля используем тот, с которым заходим на веб-интерфейс. Далее следуем инструкции. Приводить здесь её текст смысла не вижу, там всё описано довольно подробно и на русском. После установки Transmission я не ставила пользоваться веб-интерфейсом, он показался мне тормозным и неудобным, да ещё и в опере не работал. Я поставила Transmission Remote Gui, интерфейсом похожая на uTorrent, позволяющая из обычного окошка настраивать многое. Стоит помнить, что для подключения к Transmission возможно необходимо будет указать пароль, его можно найти в settings.json.

Всё. Теперь роутер умеет  качать торренты, которые мы ему подсовываем на внешний хард, доступ к которому мы имеем по сетевому окружению и откуда можем не качая смотреть какие-нибудь очередные серии Хауса.

Теперь самое сложное, тем и интересное. В нашей сети есть хоть и тестовое, но стабильное iptv вещание. Работать оно отказывалось наотрез, я почти расстроилась, перекопала множество информации, от ответа была я далека. Пробовала завести udpxy, он работать тоже не хотел, пробовала прописывать статическую маршрутизацию для тех источников, что используются у нас (234.1.1.0/24), не помогало. Даже по кабелю от маршрутизатора  к ноутбуку, не то что по wi-fi. Неожиданно нашла я информацию о пакете igmpproxy, который и должен был быть виновен в раздаче мультикаста. Он неожиданно для меня в прошивке уже был (это на словах всё быстро, на деле заняло пару дней =) ), зайдя по ssh на маршрутизатор и увидя, какой конфиг igmpproxy кушает сразу закралось неладное. Выглядел он примерно так:
quickleave
phyint ppp0 upstream
altnet 0.0.0.0/0
phyint br0 downstream ratelimit 0

Что буквально означало, что апстрим он собирался брать из интерфейса, который смотрит в глобальную сеть, в то время как iptv вещался в локальной сети. Не особо уже на что-то надеясь я создала файл с другим названием и заменила ppp0 на название интерфейса, который смотрел у меня в локальную сеть и имел внутренний серый IP, узнать его название можно выполнив команду ifconfig (найти в списке всех интерфесов тот самый, который обладает внутренним ип-адресом или тем маком, который смотрит во внешнюю сеть, смотря как вам удобнее искать).

В тот самый миг у меня был запущен vlc плеер, в котором безуспешно пытался проиграться как-то канал. Аллелуйа, в тот самый миг, что я скормила igmpproxy другой, исправленный конфиг, картинка в плеере оживилась и из динамиков донёсся звук. Счастью не было предела.

Дабы автоматизировать процесс сразу после загрузки маршрутизатора пришлось, за неимением должных знаний и из-за природной лени прописать в скриптах при загрузке примерно следующее:

killall igmpproxy
igmpproxy /opt/etc/igmpp.conf

Для того-то чтобы убить igmpproxy с неверным конфигом и запустить его с нужным, предварительно, разумеется скинув его в соответствующую папку на нашей подготовленной флешке.

Всё, мечта сбылась, маршрутизатор работает на удивление стабильно, никаких зависаний, прерываний, картинка в iptv не сыпется на квадратики при работе по wi-fi.

Из особенность именно в этой прошивке хотелось бы отметить довольно долго подключение wi-fi модуля после ребута и подключения l2tp, могут занимать примерно по 2-3 минуты. Но из-за чрезвычайной стабильности эти минуты вам придётся ждать нечасто.

При написании этого текста ни один роутер, флешка, кошка и помидор не пострадали. Использовалась прошивка http://depositfiles.com/files/xawy7zzqy .

Подробнее