Рейтинг
+1.26
голосов:
1
avatar

Кодинг  

Консольный английский. Урок 2. Отсеять знакомое

Разжившись короткими англоязычными идеомами в виде mp3-файлов, я добросовестно стал прослушивать их и на десктопе, и на смартфоне. Очень скоро выяснилось, что методика действительно работает. Из глубин памяти начали восстанавливаться полузабытые слова и словосочетания, да и те, которые часто встречаю в технической литературе «освежились». Через какое-то время захотелось сосредоточиться на действительно незнакомых фразах, а усвоенные отсортировать в отдельную папочку. Для этого «на коленке» были написаны соответствующие скрипты.

Для начала, поскольку имена скачанных файлов были уж слишком пестрыми (разной длины, некоторые с пробелами), привел их к единому знаменателю:

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-программировании.

Кстати, вот ссылка на архив, может кому-то пригодится.

Консольный английский. Урок 1. "Награбить" английских фраз

Люблю когда написанная программа делает именно то, ради чего создавалась, и затраченное на нее время со всей очевидностью окупается (бывает такое очень и очень… не всегда). Вот сегодня, например, написал скрипт, вытягивающий с полезного сайта нужные ресурсы.

Сайт этот — 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) и вводить команды прямо с консоли:


./adb connect 10.10.10.10
./adb forward tcp:3333 tcp:3333
lua interp.lua


О том, что обращаться к Java-API Android-устройства действительно удается, свидетельствует скриншот:

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® 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, но о нем в другой раз):

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: раздача бинарных файлов

Очень часто с веб-сервера требуется отправить браузеру картинку с динамически заданными характеристиками. Пример — аватарка пользователя, в случае отсутствия которой выдается картинка с серым силуэтом. Вот как это можно сделать:


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() — абстрактная функция, возвращающая путь до файла-картинки. Ее можно конкретизировать в зависимости от ситуации.

Графический интерфейс в bash скриптах

Сегодня приведу небольшой пример того, как можно сделать графический интерфейс выбора из списка с помощью bash и т.н. zenity (gtk).

Окно выбора представляет собой список из 2х организаций, например (названия замазаны квадратиками)



Если нажать «Отмена» скрипт просто прекратит работу, если нажать «ОК» выбрав филиал, или просто 2 раза щелкнуть на названии филиала — сработает та или иная часть скрипта.

Сам скрипт:

( Читать дальше )

Выгрузка файлов с помощью Node.js

Выгрузка файлов через веб-форму на всех языках программирования является задачей несколько более сложной, чем просто извлечение параметров, переданных с помощью методов GET или POST. Несколько раз реализовывал такое на Java и могу сказать, что без привлечения специальных библиотек за это лучше не браться. До недавних пор написание программы выгрузки на node.js тоже требовало довольно большого количества строк, но несколько месяцев назад в проекте express появились средства, сводящие задачу к сущим пустякам.


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 воистину потрясает.