http://mtaalamu.ru
Для начала, поскольку имена скачанных файлов были уж слишком пестрыми (разной длины, некоторые с пробелами), привел их к единому знаменателю:
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-программировании.
Кстати, вот ссылка на архив, может кому-то пригодится.]]>
Сайт этот — audio-class.ru/. Он помогает быстро освоить или подтянуть разговорный английский. Я туда зашел как раз с этой целью: понадобилось освежить речевые навыки. Чтобы не выглядеть наглым пиратом и неблагодарной скотиной, искренне хочу поспособствовать посещаемости этого отличного ресурса, который его авторы развивают, как говорится, не за страх, а за совесть. Отличный контент, с юмором всё сделано, доброжелательно и без всякой рекламы. Спасибо, чуваки, энергии вам в вашем благородном деле!
Теперь о шкурном интересе. Одной из самых важных фишек вышеупомянутого сайта является сборник озвученных фраз, запоминание которых на слух и является, как известно, залогом успеха в изучении языка. Всё там прекрасно работает: небольшие аудиофрагменты звучат прямо с веб-страницы, только успевай глазами соответствующий текст читать. Всего 8 страниц по 50 фраз, итого 400. Но есть недостаток. Память у меня пока еще довольно цепкая и при повторном прослушивании я поймал себя на том, что помню не саму фразу, а ее положение на странице. А хотелось бы рандомно… Вот эта мысль и толкнула на небольшое «преступление»: решил выкачать все аудиофрагменты и прослушивать локально.
]]>
Несколько лучше в 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-устройства действительно удается, свидетельствует скриншот:
]]>
$ 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
Источник.]]>
Полностью поддерживаются следующие дистрибутивы Linux:RHEL, Fedora, SUSE Linux Enterprise Server. Частично поддерживаются: Ubuntu, Debian
Подробнее можно узнать на сайте Intel®]]>
На 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;
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() — абстрактная функция, возвращающая путь до файла-картинки. Ее можно конкретизировать в зависимости от ситуации.]]>
Окно выбора представляет собой список из 2х организаций, например (названия замазаны квадратиками)
Если нажать «Отмена» скрипт просто прекратит работу, если нажать «ОК» выбрав филиал, или просто 2 раза щелкнуть на названии филиала — сработает та или иная часть скрипта.
Сам скрипт:]]>
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 воистину потрясает.]]>
Ну что-ж, тогда встречайте: настроенная виртуальная машина для Java-разработки от самого Oracle! В состав входят NetBeans для любителей гуёвых IDE, а также сервер приложений GlassFish. Всё это установлено на фирменный оракловский Linux (гы-гы-гы… уши CentOS торчат с первых минут загрузки).
При установке вас ожидает небольшой квест. Во-первых, нужно зарегистрироваться на сайте Oracle. Без авторизации скачивать не дают. Во-вторых, образ виртуального диска выложен 4-мя кусочками (3 по 700 и еще 200+ Мб). Для их склеивания прилагается нехитрый батничек (assemble.cmd). В-третьих, виртуальную машину лучше не создавать с нуля (хотя и так можно), а импортировать их прилагающегося xml-файла. В-четвертых, не очевидны имя пользователя и пароль (подсказываю: glassfish / glassfish).
А в остальном всё очень мило, можно включить поддержку русского языка, хотя NetBeans, конечно, придется поднастроить. Предупреждаю также о том, что Firefox там настроен через прокси, так что может показаться, что нет соединения с Интернетом.]]>
На стороне сервера использую Node.js, развивающийся в последние месяцы просто космическими темпами. На стороне же клиента — не менее интенсивно развивающийся jQuery, который, помимо возможности рисовать красивые интерфейсы, содержит мощные средства выполнения асинхронных запросов. Ну, а посредником между клиентом и сервером может выступать код в формате JSON (я и раньше его иногда использовал, в GWT для этого есть необходимые пакеты).
Вот как можно организовать передачу JSON-объекта на сервер. На стороне клиента:
var queryParams = {greeting: 'Hello, World!', someBool: true};
$.getJSON('/hello', queryParams, function(data){
// асинхронный разбор прилетевшего с сервера JSON-объекта.
}
Как принять на стороне сервера (задействован пакет express):
app.get('/hello', function (req, res) {
res.setHeader('Content-Type', 'application/json; charset=utf-8');
var someObject = {
replay: 'Воистину ' + req.query.greeting,
yesOrNo: req.query.someBool
};
res.send(JSON.stringify(someObject));
}
Вот так, довольно бесхитростно. Учитывая то, что с сервера можно присылать довольно сложные объекты, этот метод вполне может заменить GWT в экспресс-проектах, когда городить огород некогда и незачем.]]>
for i in {1..10}; do wget $(wget -O- -U "" "http://images.google.com/images?imgsz=xxlarge&hl=en&q=wallpaper&sa=N&start=$(($RANDOM%700+100))&ndsp=10" --quiet | grep -oe 'http://[^"]*\.jpg' | head -1);done
А почему бы и не испытать этот трюк? Скопипастить строку в консоль и дождаться результата закачки при хорошем соединении займет не более 3 минут. Вот такой получился «улов».
Остальное под катом.
]]>
$ qrencode -o contact.png ?`cat contact.vcs`?
vcs — текстовой формат для обмена визитными карточками.]]>
Сыр бор разгорелся из-за того, что Oracle упрекала Google в создании собственной реализации «принадлежащего» первой из упомянутых корпораций языка программирования. В суде было доказано, что да, в исходниках VM Dalvik целых 9(!) строк кода из классической реализации Java. И за это Google заплатит несколько миллионов долларов штрафа. Но и только. Дальнейшие поползновения Oracle в направлении приватизации Java были отвергнуты.
Джеймс Гослинг цитирует в своем блоге золотые слова одного из судей, прозвучавшие на процессе:
Поскольку для реализации методов используются специфические программы, любой человек свободен писать свой собственный код, реализующий любые функции или спецификации, использованные в Java API. И не важно, что декларации или заголовочные строки могут при этом совпадать у разных авторов. По правилам, принятым в Java, они (декларации и заголовки) должны быть идентичными, хотя реализация может различаться. Когда есть лишь один способ выразить идею или функцию, никто не вправе это монополизировать. И хотя в ОС Android имена методов и классов могли бы отличаться от соответствующих имен в (классической) Java, копирайт не распространяется на имена и короткие фразы.
]]>
if(id == null || ref == null || getInitParameter("allowed_ips").indexOf(ip) < 0)
Это позволяет видеть больше строк на экране одновременно. Знаю, что не очень это приветствуется в профессиональных кругах и много раз пытался писать «по правилам», но привычка берет своё. Для того, чтобы строки не переносились автоматически, следует добавить в конфиг vim'а
set nowrap
Однако с какого-то момента vim стал поставляться с настройками, при которых происходит не просто враппинг, а принудительный разрыв длинных строк. Чтобы отключить этот эффект нужно добавить в конфиг
]]>set textwidth=0
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
Источник.]]>
представил первую версию инструмента GCC Exlorer, предназначенного для наглядного просмотра результата компиляции участков исходного кода на языках C/C++ в инструкции на языке ассемблера. GCC Explorer позволяет быстро просмотреть результат компиляции произвольного участка кода, оценить качество его оптимизации, а также наглядно изучить техники оптимизации, применяемые GCC.
А я как раз о программировании сегодня лекцию читал и два раза на разных языках HelloWorld писал. Пришлось дома писать в третий раз:
Подробности.]]>
В 80-х и начале 90-х Lotus-123 какое-то время был лидером рынка. В России, например, это название было знакомо компьютерной тусовке не меньше, чем продукты от Microsoft. Его, кажется, даже на КаМАЗе внедрили. Потом MS-Office выбился в безусловные лидеры и о пакете от IBM (его более позднее название — Lotus Notes/Domino) стали забывать. Позднее и другие конкуренты появились: OpenOffice, разработки от сообщества KDE, Google Docs. Тягаться с такими драконами — себе дороже и IBM поступила грамотно, по принципу «На тебе, боже, что нам не гоже». Теперь наработки Lotus Symphony будут интегрированы в OpenOffice, развивающийся с недавних пор под эгидой фонда Apache.
«Поинтегрировать» там есть что: ведь Lotus — это не столько офисный пакет, сколько полноценная система электронного документооборота с возможностью ведения внутрикорпоративной переписки, электронными подписями, интеграцией с OpenLDAP и т.д. В связи с этим всякие Directum'ы, MS-Exchang'и и даже Zimbr'ы начинают нервно покуривать в сторонке .]]>