http://mtaalamu.ru ru (http://mtaalamu.ru) (http://mtaalamu.ru) http://mtaalamu.ru http://mtaalamu.ru Консольный английский. Урок 2. Отсеять знакомое /blog/coding/2704.html /blog/coding/2704.html yababay Разжившись короткими англоязычными идеомами в виде 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-программировании.

Кстати, вот ссылка на архив, может кому-то пригодится.]]>
Wed, 17 Apr 2013 16:28:36 +0400 иностранный язык
Консольный английский. Урок 1. "Награбить" английских фраз /blog/coding/2703.html /blog/coding/2703.html yababay
Сайт этот — audio-class.ru/. Он помогает быстро освоить или подтянуть разговорный английский. Я туда зашел как раз с этой целью: понадобилось освежить речевые навыки. Чтобы не выглядеть наглым пиратом и неблагодарной скотиной, искренне хочу поспособствовать посещаемости этого отличного ресурса, который его авторы развивают, как говорится, не за страх, а за совесть. Отличный контент, с юмором всё сделано, доброжелательно и без всякой рекламы. Спасибо, чуваки, энергии вам в вашем благородном деле!

Теперь о шкурном интересе. Одной из самых важных фишек вышеупомянутого сайта является сборник озвученных фраз, запоминание которых на слух и является, как известно, залогом успеха в изучении языка. Всё там прекрасно работает: небольшие аудиофрагменты звучат прямо с веб-страницы, только успевай глазами соответствующий текст читать. Всего 8 страниц по 50 фраз, итого 400. Но есть недостаток. Память у меня пока еще довольно цепкая и при повторном прослушивании я поймал себя на том, что помню не саму фразу, а ее положение на странице. А хотелось бы рандомно… Вот эта мысль и толкнула на небольшое «преступление»: решил выкачать все аудиофрагменты и прослушивать локально.

]]>
Tue, 16 Apr 2013 14:10:44 +0400 bash автоматизация
Lua и Android /blog/coding/2688.html /blog/coding/2688.html yababay
Несколько лучше в 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-устройства действительно удается, свидетельствует скриншот:

]]>
Thu, 28 Mar 2013 00:13:13 +0400 Скриптовые языки мобильные платформы
Crucible, инструмент для обзора кода (code-review tool) /blog/coding/2649.html /blog/coding/2649.html w32blaster ]]> Fri, 25 Jan 2013 17:48:46 +0400 code-review crucible Вытащить базы данных из устройства с Android /blog/coding/2462.html /blog/coding/2462.html yababay
$ 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


Источник.]]>
Wed, 26 Dec 2012 16:46:15 +0400 bash
Корпорация Intel предоставляет бесплатные инструменты /blog/coding/2461.html /blog/coding/2461.html Engineer
Полностью поддерживаются следующие дистрибутивы 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®]]>
Tue, 25 Dec 2012 21:16:39 +0400 Intel компилятор библиотеки С++ Fortran
Генерация идентификатора пользователя посредством PL/PGSQL /blog/coding/2444.html /blog/coding/2444.html yababay
На 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;
]]>
Sun, 16 Dec 2012 17:32:34 +0400 базы данных pl/sql PostgreSQL
Node.js: раздача бинарных файлов /blog/coding/2440.html /blog/coding/2440.html yababay

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() — абстрактная функция, возвращающая путь до файла-картинки. Ее можно конкретизировать в зависимости от ситуации.]]>
Wed, 12 Dec 2012 22:47:58 +0400 веб-серверы
Графический интерфейс в bash скриптах /blog/coding/2439.html /blog/coding/2439.html Sergei_T
Окно выбора представляет собой список из 2х организаций, например (названия замазаны квадратиками)



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

Сам скрипт:]]>
Wed, 12 Dec 2012 14:35:57 +0400 bash консоль GTK linux
Выгрузка файлов с помощью Node.js /blog/coding/2436.html /blog/coding/2436.html yababay

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 воистину потрясает.]]>
Mon, 10 Dec 2012 22:10:56 +0400 веб-приложения
Готовая среда для Java-разработчика от Oracle /blog/coding/2435.html /blog/coding/2435.html yababay
Ну что-ж, тогда встречайте: настроенная виртуальная машина для Java-разработки от самого Oracle! В состав входят NetBeans для любителей гуёвых IDE, а также сервер приложений GlassFish. Всё это установлено на фирменный оракловский Linux (гы-гы-гы… уши CentOS торчат с первых минут загрузки).



При установке вас ожидает небольшой квест. Во-первых, нужно зарегистрироваться на сайте Oracle. Без авторизации скачивать не дают. Во-вторых, образ виртуального диска выложен 4-мя кусочками (3 по 700 и еще 200+ Мб). Для их склеивания прилагается нехитрый батничек (assemble.cmd). В-третьих, виртуальную машину лучше не создавать с нуля (хотя и так можно), а импортировать их прилагающегося xml-файла. В-четвертых, не очевидны имя пользователя и пароль (подсказываю: glassfish / glassfish).

А в остальном всё очень мило, можно включить поддержку русского языка, хотя NetBeans, конечно, придется поднастроить. Предупреждаю также о том, что Firefox там настроен через прокси, так что может показаться, что нет соединения с Интернетом.]]>
Mon, 10 Dec 2012 00:08:14 +0400 Java разработка IDE виртуальные машины
RPC на JavaScript /blog/coding/2433.html /blog/coding/2433.html yababay материал об удаленных процедурах, выполняемых с помощью фреймворка GWT. В то время эта технология действительно выглядела прорывом. Еще бы: клиентский и серверный код пишутся на одном и том же языке! Но за прошедшее время произошло много событий, которые побуждают меня всё чаще писать на чистом JavaScript, особенно там, где не требуется задействовать мощные библиотеки и API.

На стороне сервера использую 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 в экспресс-проектах, когда городить огород некогда и незачем.]]>
Sat, 08 Dec 2012 23:43:52 +0400 JavaScript JSOW RPC GWT
Стереотипы /blog/coding/2402.html /blog/coding/2402.html dos65 ]]> Mon, 03 Sep 2012 09:47:26 +0400 java кодинг сало 10 случайных обоев из командной строки /blog/coding/2388.html /blog/coding/2388.html yababay
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 минут. Вот такой получился «улов».



Остальное под катом.
]]>
Thu, 26 Jul 2012 15:13:38 +0400 for fun coding bash
Qr-код из текста /blog/coding/2382.html /blog/coding/2382.html yababay
$ qrencode -o contact.png ?`cat contact.vcs`?


vcs — текстовой формат для обмена визитными карточками.]]>
Thu, 12 Jul 2012 13:08:03 +0400 bash консоль
Здравый смысл против копирайта на Java API /blog/coding/2360.html /blog/coding/2360.html yababay
Сыр бор разгорелся из-за того, что Oracle упрекала Google в создании собственной реализации «принадлежащего» первой из упомянутых корпораций языка программирования. В суде было доказано, что да, в исходниках VM Dalvik целых 9(!) строк кода из классической реализации Java. И за это Google заплатит несколько миллионов долларов штрафа. Но и только. Дальнейшие поползновения Oracle в направлении приватизации Java были отвергнуты.

Джеймс Гослинг цитирует в своем блоге золотые слова одного из судей, прозвучавшие на процессе:

Поскольку для реализации методов используются специфические программы, любой человек свободен писать свой собственный код, реализующий любые функции или спецификации, использованные в Java API. И не важно, что декларации или заголовочные строки могут при этом совпадать у разных авторов. По правилам, принятым в Java, они (декларации и заголовки) должны быть идентичными, хотя реализация может различаться. Когда есть лишь один способ выразить идею или функцию, никто не вправе это монополизировать. И хотя в ОС Android имена методов и классов могли бы отличаться от соответствующих имен в (классической) Java, копирайт не распространяется на имена и короткие фразы.
]]>
Sun, 10 Jun 2012 03:05:39 +0400 корпорации закон
Отмена автопереноса строк в Vim /blog/coding/2350.html /blog/coding/2350.html yababay
if(id == null || ref == null || getInitParameter("allowed_ips").indexOf(ip) < 0)


Это позволяет видеть больше строк на экране одновременно. Знаю, что не очень это приветствуется в профессиональных кругах и много раз пытался писать «по правилам», но привычка берет своё. Для того, чтобы строки не переносились автоматически, следует добавить в конфиг vim'а

set nowrap


Однако с какого-то момента vim стал поставляться с настройками, при которых происходит не просто враппинг, а принудительный разрыв длинных строк. Чтобы отключить этот эффект нужно добавить в конфиг

set textwidth=0
]]>
Thu, 31 May 2012 22:50:18 +0400 редактирование текста
Список каталогов и файлов в виде дерева /blog/coding/2347.html /blog/coding/2347.html yababay
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'




Источник.]]>
Wed, 30 May 2012 21:42:00 +0400 bash консоль
HelloWorld Explorer /blog/coding/2341.html /blog/coding/2341.html yababay
представил первую версию инструмента GCC Exlorer, предназначенного для наглядного просмотра результата компиляции участков исходного кода на языках C/C++ в инструкции на языке ассемблера. GCC Explorer позволяет быстро просмотреть результат компиляции произвольного участка кода, оценить качество его оптимизации, а также наглядно изучить техники оптимизации, применяемые GCC.

А я как раз о программировании сегодня лекцию читал и два раза на разных языках HelloWorld писал. Пришлось дома писать в третий раз:



Подробности.]]>
Thu, 24 May 2012 22:13:57 +0400 программирование Open Source web-сервисы GCC
Свободному сообществу подарили Lotus /blog/coding/2333.html /blog/coding/2333.html yababay


В 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'ы начинают нервно покуривать в сторонке .]]>
Thu, 17 May 2012 11:49:35 +0400 системы электронного документооборота