Консольный английский. Урок 2. Отсеять знакомое
Разжившись короткими англоязычными идеомами в виде mp3-файлов, я добросовестно стал прослушивать их и на десктопе, и на смартфоне. Очень скоро выяснилось, что методика действительно работает. Из глубин памяти начали восстанавливаться полузабытые слова и словосочетания, да и те, которые часто встречаю в технической литературе «освежились». Через какое-то время захотелось сосредоточиться на действительно незнакомых фразах, а усвоенные отсортировать в отдельную папочку. Для этого «на коленке» были написаны соответствующие скрипты.
Для начала, поскольку имена скачанных файлов были уж слишком пестрыми (разной длины, некоторые с пробелами), привел их к единому знаменателю:
т.е. все звуковые файлы были переименованы к виду 4-значный номер + расширение.
Теперь сам «учебный скрипт»:
Работает это так. В случайном порядке проигрываются файлы из текущего каталога. После каждой фразы — пауза, при которой предлагается нажать «y» если получилось перевести ее в уме или другую клавишу если нет. Когда нажимают «y», соответствующий файл метится атрибутом «исполняемый». По окончании цикла все такие файлы перемещаются в каталог known, где можно рекурсивно проделывать всё то же самое.
Весьма эффективная методика получилась. При ее создании удалось не только подкрепить знания английского, но и попрактиковаться в bash-программировании.
Кстати, вот ссылка на архив, может кому-то пригодится.
Для начала, поскольку имена скачанных файлов были уж слишком пестрыми (разной длины, некоторые с пробелами), привел их к единому знаменателю:
CNT=1100; ls -1 *.mp3 | while read l ; do mv "$l" "$CNT.mp3" ; CNT=$(($CNT + 1)); done
т.е. все звуковые файлы были переименованы к виду 4-значный номер + расширение.
Теперь сам «учебный скрипт»:
#!/bin/bash
function pause {
read -n1 -r -p "Press 'y' if now this..." y
if [ $y == 'y' ] ; then
mv $1 known/$1 #chmod +x $1
fi
}
mkdir -p known
cat learn.sh > known/learn.sh
for l in `ls -1 *.mp3 | sort -R`
do
mpg123 "$l"
pause "$l"
echo
done
Работает это так. В случайном порядке проигрываются файлы из текущего каталога. После каждой фразы — пауза, при которой предлагается нажать «y» если получилось перевести ее в уме или другую клавишу если нет. Когда нажимают «y», соответствующий файл метится атрибутом «исполняемый». По окончании цикла все такие файлы перемещаются в каталог known, где можно рекурсивно проделывать всё то же самое.
Весьма эффективная методика получилась. При ее создании удалось не только подкрепить знания английского, но и попрактиковаться в bash-программировании.
Кстати, вот ссылка на архив, может кому-то пригодится.
- —
- 17 апреля 2013, 16:28
- комментировать
Консольный английский. Урок 1. "Награбить" английских фраз
Люблю когда написанная программа делает именно то, ради чего создавалась, и затраченное на нее время со всей очевидностью окупается (бывает такое очень и очень… не всегда). Вот сегодня, например, написал скрипт, вытягивающий с полезного сайта нужные ресурсы.
Сайт этот — audio-class.ru/. Он помогает быстро освоить или подтянуть разговорный английский. Я туда зашел как раз с этой целью: понадобилось освежить речевые навыки. Чтобы не выглядеть наглым пиратом и неблагодарной скотиной, искренне хочу поспособствовать посещаемости этого отличного ресурса, который его авторы развивают, как говорится, не за страх, а за совесть. Отличный контент, с юмором всё сделано, доброжелательно и без всякой рекламы. Спасибо, чуваки, энергии вам в вашем благородном деле!
Теперь о шкурном интересе. Одной из самых важных фишек вышеупомянутого сайта является сборник озвученных фраз, запоминание которых на слух и является, как известно, залогом успеха в изучении языка. Всё там прекрасно работает: небольшие аудиофрагменты звучат прямо с веб-страницы, только успевай глазами соответствующий текст читать. Всего 8 страниц по 50 фраз, итого 400. Но есть недостаток. Память у меня пока еще довольно цепкая и при повторном прослушивании я поймал себя на том, что помню не саму фразу, а ее положение на странице. А хотелось бы рандомно… Вот эта мысль и толкнула на небольшое «преступление»: решил выкачать все аудиофрагменты и прослушивать локально.
( Читать дальше )
Сайт этот — audio-class.ru/. Он помогает быстро освоить или подтянуть разговорный английский. Я туда зашел как раз с этой целью: понадобилось освежить речевые навыки. Чтобы не выглядеть наглым пиратом и неблагодарной скотиной, искренне хочу поспособствовать посещаемости этого отличного ресурса, который его авторы развивают, как говорится, не за страх, а за совесть. Отличный контент, с юмором всё сделано, доброжелательно и без всякой рекламы. Спасибо, чуваки, энергии вам в вашем благородном деле!
Теперь о шкурном интересе. Одной из самых важных фишек вышеупомянутого сайта является сборник озвученных фраз, запоминание которых на слух и является, как известно, залогом успеха в изучении языка. Всё там прекрасно работает: небольшие аудиофрагменты звучат прямо с веб-страницы, только успевай глазами соответствующий текст читать. Всего 8 страниц по 50 фраз, итого 400. Но есть недостаток. Память у меня пока еще довольно цепкая и при повторном прослушивании я поймал себя на том, что помню не саму фразу, а ее положение на странице. А хотелось бы рандомно… Вот эта мысль и толкнула на небольшое «преступление»: решил выкачать все аудиофрагменты и прослушивать локально.
( Читать дальше )
Lua и Android
Прогаммирование для Android может и не сложнее, чем, скажем, просто написание программ на Java но требует соблюдения большого количества условностей: особая структура проекта, упаковка, отладка в эмуляторе. Всё это довольно трудоемко. Хочется же быстро попробовать, сразу увидеть результат. К сожалению, хотя в состав последних версий Android и входит JavaScript движок V8, написание программ на интерпретируемых языках для этой ОС требует, опять таки, дополнительных телодвижений. Есть, например, проект SL4A. Его используют приверженцы Python'a, но меня этот вариант не устраивает: JavaScript, на котором я интенсивно писал в последние месяцы, там поддерживается очень криво (через прокладку rhino, да и то не на всех прошивках).
Несколько лучше в SL4A обстоит дело с поддержкой скриптового языка lua, но тоже не блестяще (с 2010 года этот плагин не обновлялся и не стыкуется со свежей версией самого фреймворка). Но нет худа без добра. Ковыряясь с этим хозяйством я обнаружил, что lua очень похож на JS и освоить его быстро вполне себе можно. Есть даже фреймворк для lua-разработки прямо в мобильной среде — SigmaScript. Только вот возможности его, как мне показалось, весьма ограничены…
Среди массы проектов для программирования на lua под Android резко выделяется AndroLua. Автор этого довольно свежего проекта (код обновлялся 2 месяца назад) совершил как минимум два подвига. Во-первых, скомпилировал стандартный lua-движок в нативную андроидскую библиотеку, во-вторых, вкорячил в свое приложение еще и LuaJava — фреймворк для стыковки программ на lua и Java. Поскольку программы для Android как раз и работают в Java-среде (хотя и несколько специфической), это дает возможность обращаться практически ко всем возможностям ОС (точнее говоря API).
В AndroLua есть также возможность кодить не с экранной клавиатуры смартфона, а с нормальной, хардварной, подключенной к ПК. Это еще одна причина того, что я не стал делать ставку на SigmaScript, где такой возможности нет. Чтобы кодить в такой клиент-серверной среде нужно включить на мобильном устройстве режим отладки по сети, подключиться с ПК, пробросить порты, запустить на смартфоне AndroLua (она поднимает сервер-интерпретатор на порту 3333) и вводить команды прямо с консоли:
О том, что обращаться к Java-API Android-устройства действительно удается, свидетельствует скриншот:
Несколько лучше в SL4A обстоит дело с поддержкой скриптового языка lua, но тоже не блестяще (с 2010 года этот плагин не обновлялся и не стыкуется со свежей версией самого фреймворка). Но нет худа без добра. Ковыряясь с этим хозяйством я обнаружил, что lua очень похож на JS и освоить его быстро вполне себе можно. Есть даже фреймворк для lua-разработки прямо в мобильной среде — SigmaScript. Только вот возможности его, как мне показалось, весьма ограничены…
Среди массы проектов для программирования на lua под Android резко выделяется AndroLua. Автор этого довольно свежего проекта (код обновлялся 2 месяца назад) совершил как минимум два подвига. Во-первых, скомпилировал стандартный lua-движок в нативную андроидскую библиотеку, во-вторых, вкорячил в свое приложение еще и LuaJava — фреймворк для стыковки программ на lua и Java. Поскольку программы для Android как раз и работают в Java-среде (хотя и несколько специфической), это дает возможность обращаться практически ко всем возможностям ОС (точнее говоря API).
В AndroLua есть также возможность кодить не с экранной клавиатуры смартфона, а с нормальной, хардварной, подключенной к ПК. Это еще одна причина того, что я не стал делать ставку на SigmaScript, где такой возможности нет. Чтобы кодить в такой клиент-серверной среде нужно включить на мобильном устройстве режим отладки по сети, подключиться с ПК, пробросить порты, запустить на смартфоне AndroLua (она поднимает сервер-интерпретатор на порту 3333) и вводить команды прямо с консоли:
./adb connect 10.10.10.10
./adb forward tcp:3333 tcp:3333
lua interp.lua
О том, что обращаться к Java-API Android-устройства действительно удается, свидетельствует скриншот:
- —
- 28 марта 2013, 00:13
- комментировать
Crucible, инструмент для обзора кода (code-review tool)
В этой статье я попробую рассказать про один замечательный инструмент для группового анализа кода, как Crucible.
( Читать дальше )
( Читать дальше )
Вытащить базы данных из устройства с Android
Если подключить рутованный аппарат с Андроидом к ПК USB-шнуром, то с помощью штатной утилиты из комплекта Android SDK можно слить базу контактов такой командой:
Чтобы вытащить все СМС можно использовать
Источник.
$ adb pull /data/data/com.android.providers.contacts/databases/contacts2.db ; sqlite3 -batch <<EOF contacts2.db <CR> .header on <CR> .mode tabs <CR> select * from data; <CR> EOF
Чтобы вытащить все СМС можно использовать
adb pull /data/data/com.android.providers.telephony/databases/mmssms.db ; sqlite3 -batch <<EOF contacts2.db <CR> .header on <CR> .mode tabs <CR> select * from sms; <CR> EOF
Источник.
Корпорация Intel предоставляет бесплатные инструменты
Продукты Intel для разработчиков под Linux доступны бесплатно для некоммерческого использования.
Полностью поддерживаются следующие дистрибутивы Linux:RHEL, Fedora, SUSE Linux Enterprise Server. Частично поддерживаются: Ubuntu, Debian
Подробнее можно узнать на сайте Intel®
Полностью поддерживаются следующие дистрибутивы Linux:RHEL, Fedora, SUSE Linux Enterprise Server. Частично поддерживаются: Ubuntu, Debian
- Intel® Parallel Studio XE 2013 for Linux*
- Intel® C++ Studio XE 2013 for Linux
- Intel® Fortran Composer XE 2013 for Linux
- Intel® C++ Composer XE 2013 for Linux
- Intel® Math Kernel Library (Intel® MKL) 11.0 for Linux
- Intel® Integrated Performance Primitives (Intel® IPP) 7.1 for Linux
- Intel® VTune™ Amplifier XE 2013 for Linux
- Intel® Inspector XE 2013 for Linux
Подробнее можно узнать на сайте Intel®
Генерация идентификатора пользователя посредством PL/PGSQL
Возможности реляционных баз данных PostgreSQL можно существенно расширить за счет процедур на специальном языке — PL/PSQL. Он очень прост, существует давно и поэтому весьма стабилен. Дополнительным удобством является то, что вызов процедуры — это транзакция, поэтому если при ее выполнении происходит какой-нибудь сбой, данные не теряются. Просто происходит откат к прежнему состоянию.
На PL/SQL можно не только производить действия с таблицами, но и писать программы, возвращающие те или иные значения. Вот как, например, можно генерировать идентификатор пользователя, построенный по принципу «3 буквы 6 цифр» (при этом, правда, должен поддерживаться тип данных uuid, но о нем в другой раз):
На PL/SQL можно не только производить действия с таблицами, но и писать программы, возвращающие те или иные значения. Вот как, например, можно генерировать идентификатор пользователя, построенный по принципу «3 буквы 6 цифр» (при этом, правда, должен поддерживаться тип данных uuid, но о нем в другой раз):
create or replace function new_uid() returns varchar(9) as $$
declare
new_uuid text := uuid_generate_v4();
letters text := regexp_replace(upper(new_uuid), '[0-9]|-', '', 'g');
digits text := regexp_replace(upper(new_uuid), '[A-Z]|-', '', 'g');
uid_to_return varchar(9) := substring(letters from 1 for 3)||substring(digits from 1 for 6);
rw users%rowtype;
begin
if uid_to_return !~ '[A-Z]{3}[0-9]{6}' then
raise exception 'Какой-то херовенький идентификатор получился - %. Такое бывает редко, попробуйте еше раз.', uid_to_return;
end if;
select * from users where id = new_uuid into rw;
if found then
raise exception 'Пользователь с таким идентификатором уже есть в базе.';
end if;
return uid_to_return;
end
$$ language plpgsql;
Node.js: раздача бинарных файлов
Очень часто с веб-сервера требуется отправить браузеру картинку с динамически заданными характеристиками. Пример — аватарка пользователя, в случае отсутствия которой выдается картинка с серым силуэтом. Вот как это можно сделать:
Здесь getPath() — абстрактная функция, возвращающая путь до файла-картинки. Ее можно конкретизировать в зависимости от ситуации.
app.get('/getAvatar', function (req, res) {
var uid = req.query.uid;
['jpeg', 'png', 'gif'].forEach(function(item){
var fn = getPath(uid, item);
if(fs.existsSync(fn)){
var img = fs.readFileSync(fn);
res.writeHead('200', {'Content-Type': 'image/' + item});
res.end(img, 'binary');
return;
}
});
res.writeHead('200', {'Content-Type': 'image/png'});
var img = fs.readFileSync('/path/to/nobody.png');
res.end(img, 'binary');
});
function getPath(uid, ext){
// TODO ...
return hz;
}
Здесь getPath() — абстрактная функция, возвращающая путь до файла-картинки. Ее можно конкретизировать в зависимости от ситуации.
- —
- 12 декабря 2012, 22:47
- комментировать
Графический интерфейс в bash скриптах
Сегодня приведу небольшой пример того, как можно сделать графический интерфейс выбора из списка с помощью bash и т.н. zenity (gtk).
Окно выбора представляет собой список из 2х организаций, например (названия замазаны квадратиками)
Если нажать «Отмена» скрипт просто прекратит работу, если нажать «ОК» выбрав филиал, или просто 2 раза щелкнуть на названии филиала — сработает та или иная часть скрипта.
Сам скрипт:
( Читать дальше )
Окно выбора представляет собой список из 2х организаций, например (названия замазаны квадратиками)
Если нажать «Отмена» скрипт просто прекратит работу, если нажать «ОК» выбрав филиал, или просто 2 раза щелкнуть на названии филиала — сработает та или иная часть скрипта.
Сам скрипт:
( Читать дальше )
Выгрузка файлов с помощью Node.js
Выгрузка файлов через веб-форму на всех языках программирования является задачей несколько более сложной, чем просто извлечение параметров, переданных с помощью методов GET или POST. Несколько раз реализовывал такое на Java и могу сказать, что без привлечения специальных библиотек за это лучше не браться. До недавних пор написание программы выгрузки на node.js тоже требовало довольно большого количества строк, но несколько месяцев назад в проекте express появились средства, сводящие задачу к сущим пустякам.
Это полноценная программа, готовая к запуску! Естественно, нужно добавить проверки на ошибки и т.п., но лаконичность средств node.js воистину потрясает.
var express = require('express');
var fs = require('fs');
var app = express();
app.use(express.bodyParser()); // без этой строчки не работает!
app.use(express.limit('1mb')); // лимит на размер выгружаемого файла
app.post('/avatarUpload', function (req, res) {
var targetPath = '/tmp/avatar.jpg';
var tmpPath = req.files.avatar.path;
fs.rename(tmpPath, targetPath, function(err){
res.send(err ? 'Ничего не получилось.' : 'Выгрузка завершена успешно.');
});
});
Это полноценная программа, готовая к запуску! Естественно, нужно добавить проверки на ошибки и т.п., но лаконичность средств node.js воистину потрясает.