Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

Показаны сообщения с ярлыком misc. Показать все сообщения
Показаны сообщения с ярлыком misc. Показать все сообщения

среда, 2 ноября 2011 г.

Скрипт для подсчета числа файлов java, xml и др.

Нужно было посчитать статистику по файлам java и др. Вот что получилось:
import os
 
startPath = os.getcwd()
 
java = 0
xmlxsd = 0
 
def findFiles(path):
    global java
    global xmlxsd
    files = os.listdir(path)
    for f in files:
        p = os.path.join(path, f)
        if os.path.isdir(p):
            findFiles(p)
        else:
            fn, fe = os.path.splitext(p)
            print fe
            if fe == '.java':
                java = java+1
            elif fe in ['.xsd', '.xml', '.html', '.xhtml']:
                xmlxsd = xmlxsd + 1 
 
def main():
    findFiles(startPath)
    print 'java = %d ' % java
    print 'xmlxsd = %d' % xmlxsd
 
 
if __name__ == "__main__":
    main()   

четверг, 11 августа 2011 г.

Как узнать, какую версию Ubuntu вы используете


user1:~$ cat /etc/issue
Ubuntu 10.10 \n \l

user1:~$


или через GUI: System -> Administration -> System Monitor

или:


user1:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.10
Release: 10.10
Codename: maverick

Установка пароля админа в Glassfish 3

Как установить админский пароль в Glassgish v3:

  1. Запустить Glassfish - GF_HOME/glassfish/bin/startserv

  2. Вызвать скрипт asadmn: GF_HOME/bin/asadmin change-admin-password




~/dev/glassfishv3/bin$ ./asadmin change-admin-password
Enter admin user name [default: admin]> admin
Enter admin password>
Enter new admin password>
Enter new admin password again>

Command change-admin-password executed successfully.
~/dev/glassfishv3/bin$

пятница, 3 июня 2011 г.

Небольшой скрипт на python для удаления .svn директорий

Скрипт, который рекурсивно удаляет каталоги .svn из дерева директорий:

import os
import shutil
 
startPath = 'C:\\usr\\dbTracer\\fennel-webapp-OBO\\FENNEL_OBO'
 
def findDeleteSvn(path):
files = os.listdir(path)
for f in files:
p = os.path.join(path, f)
if os.path.isdir(p):
print p
if f == '.svn':
shutil.rmtree(p, True)
else:
findDeleteSvn(p)
 
def main():
findDeleteSvn(startPath)
 
if __name__ == "__main__":
main()

среда, 25 мая 2011 г.

Builder и natures проекта в Eclipse

Каждый проект в Eclipse имеет ассоциированные с ним билдеры (builders) и natures. Что это такое?

Builder - внутри Eclipse билдеры используются чтобы взять некий вход и сгенерировать по нему некий выход (output). Билдеры могут быть инкрементальными - это положительно влияет на производительность, т.к. такой билдер перестраивает только ту часть проекта, которая изменилась с последнего билда.

Nature - используется, чтобы ассоциировать проект с каким-либо плагином, или другим функционалом, например, билдером.

Файл проекта .project c билдерами и natures может выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>super-project</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.maven.ide.eclipse.maven2Nature</nature>
</natures>
</projectDescription>
 

пятница, 20 мая 2011 г.

Ай да Рид, ай да сукин сын!!!

Отличная статья про IPO LinkedIn. См: http://dennydov.blogspot.com/2011/05/blog-post_20.html

Баг-репорт ExtJS 4.0.0

Сегодня утром отправил баг-репорт на форум Sencha. См. Null error (Null Pointer Exception) in Ext.data.Connection.

Ошибка заключается в следующем: иногда xhr.getAllResponseHeaders() возвращает null. А возвращаемое значение не проверяется и используется сразу.

Вот сниппет из класса Ext.data.Connection:

/**
* Create the response object
* @private
* @param {Object} request
*/

createResponse : function(request) {
var xhr = request.xhr,
headers = {},
lines = xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n'),
count = lines.length,
line, index, key, value, response;
 
// other code goes here....
}


Несложно догадаться, что строка
lines = xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n'),
 
приведет к ошибки, если xhr.getAllResponseHeaders() возвратит null. Что и происходит в данном случае.

Фикс этого безобразия следующий:

lines = xhr.getAllResponseHeaders() ? xhr.getAllResponseHeaders().replace(/\r\n/g, '\n').split('\n') : '',

четверг, 19 мая 2011 г.

Ключевое слово transient

В Java есть ключевое слово transient. Оно применяется к полям класса и означает, что данное поле не входит в персистентное состояние класса. Т.е. при сериализации данное поле не будет записываться. И, соответственно, при де-сериализации оно не будет восстанавливаться из потока байтов.

Применение:
private transient <member-variable>;
или
transient private <member-variable>;

Пример кода:
public class Foo {
private String saveMe;
private transient String dontSaveMe;
private transient String password;
//...
}

вторник, 3 мая 2011 г.

Снятие наличных с карты Payoneer

Есть такая контора - Payoneer, которая выпускает предоплаченные дебетовые карты, которые используются всякими фрилансерскими сайтами для перечисления заработанных средств. Я пользуюсь карточкой Payoneer, и вот настало время, когда мне понадобилось снять некоторую сумму с этой карты. Карта номинирована в USD, и снимать я также хотел не рубли, а доллары.

В Питере (особенно, в центре) есть много мультивалютных банкоматов, которые позволяют снять не только рубли, но и доллары. Сначала я попробовал СитиБанк (угол Литейного и Невского проспекта - Невский, 45) - за одну транзакцию банк позволяет снять не более 500 долларов. Отмечу, что суточный лимит на карте - всего лишь тысяча долларов. Окей, значит мне пришлось два раза совать карту в банкомат, чтобы снять штуку. СитиБанк с каждой транзакции снял по 11.15 USD, т.е. на 1000 долларов расходы составили 22.30 - что составляет 2.2 %. В общем неплохо, но я также решил попробовать и другие банки.

В следующий раз я пошел в банк Barclays, Невский, 3 (второй дом по Невскому проспекту от Дворцовой площади). Там максимум за транзакцию - 800 долларов. Ладно, снял я 800 долларов и стал ждать отчета от Payoneer о комиссии банка. Отчет меня не обрадовал - свех 800 баксов Барклайс еще снял 32.84 USD как комиссию. Напомню, что Сити с 1000 долларов снял 22.15.

Пока что наш выбор - Сити =)

Кто-нибудь знает еще другие банкоматы в Питере с низкой комиссией?

Отпишитесь в комментах, плиз!

пятница, 29 апреля 2011 г.

Регулярное выражение для проверки времени

Задача: написать регулярное выражение для проверки введенного времени в формате hh:mm (24-часовой формат!). Регулярное выражение следующее:
^(([0,1][0-9])|(2[0-3])):[0-5][0-9]$

Теперь давайте разберем его "по косточкам".

Итак, время в 24-часовом формате может принимать, например, следующие значения: 06:00, 11:15, 23:59 и т.д. Первые две цифры (hh) обозначают часы с ведущим нулем (т.е. пишем 06, а не 6). Значение часов может быть от 0 (т.е. 00) до 23. Поэтому мы пишем следующее выражение:
[0,1][0-9]
- что означает, что первый символ может быть 0 или 1, а следующий символ может принимать значение от 0 до 9 (т.е. любая цифра). т.е. любые значения от 00 до 19 подходят под эту регулярку.

Теперь рассмотрим значения часов от 20 до 23. Если первый символ - двойка, то следующий символ может быть цифрой от 0 до 3. Это нас приводит к выражению
2[0-3]
- под него подходят числа 20, 21, 22, 23. Объединяя эти два выражения (с помощью логического "ИЛИ" - |)для часов, получаем первую часть нашей регулярки (для проверки только часов):
([0,1][0-9])|(2[0-3])

Идем дальше: теперь нужно поставить двоеточие и проверять минуты. Первую часть регулярки (проверка часов) заключим в круглые скобки и после них поставим двоеточие:
(([0,1][0-9])|(2[0-3])):(здесь_будет_проверка_минут)

С минутами все просто - минуты принимают значение от 0 (т.е. 00) до 59. Мы это опишем следующей регуляркой:
[0-5][0-9]
Смысл регулярки таков: первый символ принимает значения от 0 до 5, а второй символ - от 0 до 9 (т.е. любая цифра).

Надо отметить, что конечная версия регулярки выглядит так:
^(([0,1][0-9])|(2[0-3])):[0-5][0-9]$
, т.е. имеются символы начала и конца строки (^ и $, соответственно), которые мы еще не разобрали. Рассмотрим их.

Если бы не было символа начала строки, т.е. регулярное выражение выглядело бы следующим образом:
(([0,1][0-9])|(2[0-3])):[0-5][0-9]
, то тогда проходили бы валидацию следующие строки: abc23:50, здесь был Вася в 16:40 и т.п. Символ начала строки позволяет указать, что сравнение с образцом должно начинаться с начала строки.

Аналогично с символом конца строки: $. Если бы его не было, т.е. регулярное выражение выглядело бы следующим образом
^(([0,1][0-9])|(2[0-3])):[0-5][0-9]
то тогда валидацию бы проходили следующие строки: 12:15 - время обеда, 13:10 eeeee и так далее. Использование символа конца строки позволяет эти строки отсечь.

Регулярные выражения - очень мощный инструмент, которым нужно уметь пользоваться.

См. библиотеку регулярных выражений: http://www.regxlib.com/DisplayPatterns.aspx

См. также онлайн-тестер регулярных выражений: http://regexpr.ru/

К сожалению, долго не писал в блог

Всем привет снова! К сожалению, долго не писал в блог. Это было связано с большими загрузками на работе, а также другим проектам, которыми я занимаюсь. Теперь, однако, стало полегче, и я вновь возвращаюсь к блогу.

Из новостей: по работе я теперь занимаюсь GWT + server-side Java (активно юзается Spring Framework). Работаю в команде, у которой есть чему поучиться, что большой плюс =)
Также активно юзал MongoDB, python и т. п. В общем, рассказать есть что.

четверг, 16 декабря 2010 г.

HyperGraphDB

Borislav Iordanov делает 20-минутную презентацию по архитектуре HyperGraphDB. HyperGraphDB - расширяемое распределенное хранилище для работы с гиперграфами. Гиперграфы широко используются в машинном обучении, AI, моделировании.

Проект выпущен под LGPL, хостится на Google Code. Сайт проекта - http://www.hypergraphdb.org.

воскресенье, 28 ноября 2010 г.

Модель Мараско, описывающая типы людей

Я закончил читать книгу Джона Мараско "IT-проекты - фронтовые очерки". Книга читается легко, и из нее можно почерпнуть много полезных идей, а также интересных наблюдений. Но одну из глав я прочел с бОльшим интересом, чем все другие. В этой главе Джон описывает типы людей, причем он их разделяет на три типа - шлеппер, махер и менш. Мне эта классификация показалась настолько интересной, что я даже перепечатаю часть главы к себе в блог.






Долгие годы наблюдений и размышлений привели меня к убеждению,
что легче в этом разобраться, если упростить задачу. В моей модели есть
три базовых состояния, характеризуемых на идише словами шлеппер,
махер и менш (schlepper, macher, mensch). Сначала я опишу эти состояния
и то, как люди переходят из одного состояния в другое. Затем я объясню,
как можно застрять в одном из предшествующих состояний и как бороть-
ся с такой ситуацией. Кроме того, я поговорю о том, что в различные пе-
риоды своей жизни люди в каждый данный момент могут пребывать
в разных состояниях. Наконец, я обращусь к вопросу о том, как люди коли-
чественно распределяются по разным состояниям и как это учитывать,
живя в реальном мире.

Здесь я хочу немного уточнить значение слов. Я называю эти три со-
стояния «фазами», потому что считаю, что они могут естественным обра-
зом последовательно сменять одна другую, причем в каждом человеке. Эти
фазы наступают по мере того, как люди взрослеют, приобретают опыт,
примиряются с окружающим миром и учатся находить компромисс между
системой своих убеждений и требованиями повседневной жизни. К сожа-
лению, иногда люди застревают на одной фазе и не двигаются дальше. Это
побуждает рассматривать их как «класс» людей. Однако слово «класс» ассо-
циируется с таким количеством других понятий, в том числе социальных,
что я постарался не употреблять его.

Почему это важно? Мы склонны считать, что жизнь – сложное явление,
и вопросам взаимодействия общественных групп в различных контекстах:
семейном, деловом, трудовом и т. д. – посвящена масса научных исследо-
ваний. В большинстве своем они недоступны обычному человеку. Я при-
шел к убеждению, что данная очень простая модель в значительной мере
объясняет явления, наблюдаемые в реальном мире, и позволяет делать оп-
ределенные предсказания. Простая модель, которую людям легко понять
и применить, и которая оказывается действенной в 80% случаев, полезнее,
чем сложная и трудная для применения, которая действует в 95% случаев.


Шлеппер



Начнем с первого состояния. Люди на этой фазе развития в совокупно-
сти называются шлепперами. Слово происходит от глагола «schlep»,
на идише означающего «тащить». В разговорной речи он также означает
«пронести что-либо», например, «пронести вещи через аэропорт». В обиходе
слово «шлеппер» указывает на ленивого и неаккуратного человека, но
я хочу применить его с другим оттенком значения. Для меня «шлеппер» –
это человек, находящийся на первой стадии своего развития.
В буквальном смысле шлеппер – это носильщик. В старые добрые времена
идеальный пример шлеппера являл кэдди – мальчик, таскавший сумку
с клюшками для гольфа. Когда что-то тащишь, не требуется особого напряжения
мысли: ты выполняешь полезную, но преимущественно «черную»
работу, обычно обслуживая кого-то другого. Быть шлеппером не слишком
почетно, но не стоит и недооценивать важность этой работы.
Во-первых, если ты шлеппер, никто не запрещает тебе думать. На самом
деле верно как раз обратное: поскольку работа шлеппера не требует особых
раздумий, во время нее можно думать и учиться. Когда что-то
волочишь, часто рождаются творческие мысли. Например, как бы сделать, чтобы
тратить на эту работу меньше сил? В результате в каменном веке какой-то
шлеппер изобрел колесо. Нежелание рутинно совершать скучную и неинтересную
работу или тратить непомерные усилия для достижения обыденной
цели часто приводит к возникновению идей даже у самого тупого
шлеппера – нужда (ощущаемая через боль или усталость) становится матерью
прогресса. Мой опыт говорит, что люди, которым приходилось быть
шлепперами, часто обнаруживают новые и интересные способы избежать
нудной работы, даже если это касается новой для них области. У них развивается
инстинктивная способность предвидеть возникновение тягомотной
работы и предотвращать это. Из экс-шлепперов, например, получаются
замечательные инженеры.

Вообще говоря, каждому следует пройти через шлепперство. Оно воспитывает
характер, как бы банально это ни звучало. Оно учит нас смирению –
тому смирению, которое говорит: «Если я что-нибудь не придумаю,
то буду тащить лямку всю свою жизнь». У этого явления есть интересные
стороны.

Шлепперы быстро начинают ощущать несправедливость жизни. Вот он
я – молодой, умный, красивый и т. д. – и я должен ишачить на старого толстого идиота,
который почему-то оказался моим хозяином! Как это получилось?

Иногда этот хозяин может оказаться действительно глупым – настолько,
чтобы заставлять тебя ишачить больше, чем это необходимо. Иногда он
может еще сильнее отравить тебе жизнь, намеренно проявляя жестокость.
И поскольку тебе предназначено быть шлеппером, у тебя есть две возможности:
продолжать молча «шлепать» здесь или отправляться «шлепать»
в другое место. Третий вариант – поднять шум – обычно оказывается контрпродуктивным,
поскольку шлепперы взаимозаменяемы по определению,
и тем, кто много шумит, быстро находится замена.

Наблюдательный шлеппер обнаруживает некоторые поразительные
вещи. Например, у молчаливого шлеппера развивается эрозия стенки желудка,
и если он способен делать выводы, то постарается изменить свою
работу или социальное положение, чтобы уменьшить переживания. Уходить,
чтобы продолжать тянуть лямку в другом месте (вариант номер два),
обычно смысла не имеет, т. к. это не решает проблему, потому что как все
шлепперы взаимозаменяемы, так и работа для них всюду в принципе одинакова.
Чаще всего получается переход «из огня да в полымя».
Пропускать фазу шлепперства опасно, даже если такая возможность
предоставляется. Правда, кое-кому это удается, например тем, кто родился
в богатой семье. Им никогда не удастся испытать преимущества «шлепперства»,
например радость творчества, когда тянешь лямку, или гордость, испытываемую,
когда удачно что-то дотащишь. В результате им оказывается
неведомо, как живет большинство в этом мире. Слишком многое они считают
само собой разумеющимся и плохо понимают реальность. А если вы
не начали жизнь как шлеппер, то практически невозможно, чтобы вы когда-нибудь им стали.

Но что существеннее всего, вы не получите важных уроков – смирения,
цены заработанного тяжким трудом доллара, органической несправедливости
мира и напряженности жизни рядовых людей. Другой незаменимый
урок дает общение с огромным разнообразием людей, с которыми встречается
шлеппер в реальном мире – ворами, лжецами, мошенниками и теми,
кого в менее политкорректные времена называли «простым народом». А самое
главное, встречаются удивительные люди, которые разглядят в тебе нечто
и подумают: «А что тут делает этот парень? Он явно способен на большее», –
и что-то сделают для тебя. Они становятся нашими наставниками,
тренерами и защитниками, и это один из путей покинуть фазу шлеппера.

Рано или поздно каждый шлеппер должен понять, что его прогресс зависит
от способности выйти из фазы шлепперства. Но для этого требуются
усилия. Можно остаться шлеппером навсегда и винить в этом пороки классовой
системы, рыночный капитализм или что-то иное – все с одинаковой
пользой. Выйти из этой фазы можно, если принять такие меры, после которых
твой начальник скажет: «Послушай, я плачу тебе не за то, чтобы ты сам
таскал мешки! Поищи другого, кто этим займется!» Часто для этого требуется
получить образование, что-то придумать и просто сделать нечто, что покажет
тебя в положительном свете. Необходимы, говоря словами Черчилля,
кровь, пот, слезы и труд.1 Вы должны показать, что можете приносить
пользу на следующем уровне. Этот план состоит из двух частей. Во-первых,
вы должны получить образование, приобрести мастерство, добиться результата,
сделать дело. Затем кто-то, кто обладает влиянием, должен
обратить внимание, что произошли перемены и вы готовы перейти из шлепперов
в следующую фазу. Это те наставники, о которых я говорил выше.

Итак, все мы начинаем как шлепперы. В любой семье дети – это шлепперы.
Можно рассматривать шлепперство как ученичество. Дети учатся
на взрослого. Если они будут внимательны, не погибнут и иногда будут
прислушиваться, то благополучно закончат учебу и перейдут во взрослые.
Иначе они останутся детьми навсегда.

Смиритесь с тем, что в любом занятии – на каждой новой работе, в каждом
новом виде спорта, в каждой новой связи – вы начинаете как шлеппер.
Как долго вы им останетесь, зависит от вас. И помните о необходимости
соблюдать достоинство, пока вы находитесь в учениках.


Махер



Вторая фаза жизни – это фаза махера. Я полагаю, что происхождение
слова связано с глаголом, означающим «делать». Эта вторая фаза самая
длинная и в некотором смысле самая приятная фаза жизни. Махер – тот,
благодаря кому совершаются вещи и происходят события, кто добивается
результатов. Эта фаза чрезвычайно продуктивна, и большинство махеров
получает глубокое удовлетворение от того, чем занимается. Некоторым махерам
это так нравится, что они остаются в этом качестве навсегда, и это не
так уж плохо. Если бы не махеры, мы бы все оставались шлепперами.

Махеры не просто изобретатели, предприниматели, художники и гении,
хотя все эти люди обычно махеры. Махер выделяется тем, что создает
новую ценность и изменяет порядок вещей. Обычно махер ассоциируется
с высокой, не рядовой, продуктивностью. Тот, кто отрабатывает свои восемь
часов и редко задерживается, не махер; это в некотором смысле лишь
продвинутый шлеппер. Нет, махер принадлежит к той категории людей,
про которых часто говорят: «Чтобы справиться с этим, нам нужен настоящий махер!».
Во многих фирмах махеры – это «чудотворцы», те, на ком держится
бизнес. Лакмусовая бумажка для проверки: уберите махера, и организация
не просто сильно пострадает, она просто станет другой.

У махеров есть следующие интересные свойства:
• Обычно они очень сосредоточены, на грани одержимости.
• Они впечатлительны.
• Они ориентированы на результат.
• Они видят цель и могут поймать ее в прицел. Лучше не вставать на
пути между махером и результатом, к которому он стремится.
• Махеры харизматичны – в хорошем и плохом смысле. Отсутствие
у махера харизмы встречается редко, потому что эта черта очень
часто связана с лидерством. Существуют исключения, но достаточно
редко, чтобы останавливаться здесь на них.

Есть и отрицательная сторона. Махеры часто склонны думать, что цель
оправдывает средства. Они бывают совершенно безжалостны. Те, кто сам
щепетилен в отношении чувств других людей, часто прибегают к помощи
махеров, у которых не возникает угрызений совести. Махер нисколько не
заблуждается в отношении того, за что ему платят деньги: за полученный
результат. Но если говорить правду, то махер почти всегда готов работать
бесплатно: успех – это очень сильный наркотик.

Махеры умеют сдерживать себя. Самые способные из них быстро обнаруживают,
что опасно бить слишком много посуды. Настрой против себя
слишком много людей, и ты не сможешь найти себе помощников, даже
среди таких же махеров! Есть очень много противных молодых махеров,
но очень мало противных пожилых махеров. Причина очевидна: махерам
трудно продвигаться вперед, если они не могут сколачивать группы, состоящие
из других махеров. Объем проблем, которые им предлагаются для
решения, растет и достигает такой степени, что единственным вариантом
становится игра в команде. Если махер не в состоянии выработать в себе
искусство общения, необходимое для привлечения в игру других игроков,
он окажется в изоляции, и его обгонят более толковые махеры.

Махеры получают некоторое побочное преимущество, которое не стоит
недооценивать. В какой-то мере являясь «примадоннами», они могут
устанавливать свои правила. Почему? Потому что многие люди и организации
терпят довольно вызывающее поведение, если проблема, которую
нужно решить, серьезна или ожидаемая прибыль достаточно высока. Поэтому
махер может в значительной мере избежать мелочной тирании организаций
и бюрократий, прямо поместив себя за рамками обычаев системы.
Многие махеры идут этим путем просто потому, что иначе не могут
функционировать: им необходим контекст, в котором они могут делать дело
по своим правилам. В любом другом контексте они не справятся с задачей,
потому что им придется подчиняться ограничениям, которые они
считают для себя слишком обременительными. Но кому много дано, с того
и спрос больше. Когда махер терпит неудачу, недостатка в желающих его
закопать не бывает – с годами врагов у него становится только больше,
и у них долгая память. Чтобы выжить, поставив себя вне системы, необходимо
обладать действительно выдающимися качествами. Иначе твоя первая
ошибка станет и последней.

Иногда махеров пьянит сила, которой они обладают, и они действительно
выходят из-под контроля. В конечном итоге чрезмерно агрессивный
махер обречен на саморазрушение, но сначала он вызовет заметный
переполох. Махеры редко уходят тихо; обычно это происходит при ослепительном
фейерверке. Высокомерие и здесь вмешивается, и поскольку
у махеров все происходит с размахом, их провал также обычно
оказывается зрелищным.

Можно ли стать махером, не пройдя фазы шлеппера? Да, но это удается
редко. Махеры, которые в той или иной мере не прошли ученичества,
обычно оказываются в чем-то неполноценными. Тяжело быть махером,
если у вас нет крепкого понимания реальности, которое приходит в
результате выполнения черной работы.

Махеры склонны оставаться в своей фазе, потому что они представляют
собой элиту. В мире бизнеса они получают массу более или менее ощутимых
наград в обмен на результаты, которые получает от них организация.
Их постоянно привлекают к решению все более крупных и интересных задач.
Это замечательная жизнь, которая предполагает невысокий
риск – иногда отрицательная реакция организации, иногда преждевременные
сердечные заболевания в силу выраженного поведения типа A.
В большинстве своем махеры с этим справляются.

В других сферах жизни быть махером – значит быть компетентным,
фактически это означает высочайшую компетентность в работе. Обычно
махер рассчитывает добиться того же в любой сфере жизни. Большое разочарование
он может испытать, если окажется, что его компетентность распространяется
только на одну предметную область. Ergo, многие махеры
становятся узкими специалистами, направляя всю свою энергию в ту область
в которой они сильнее всего. Поскольку по своей природе они склонны
к соперничеству, здесь есть реальная опасность застоя. Если ты лучше
большинства своих коллег, то к чему еще можно стремиться?
Как ни высоко положение махеров, существует еще более высокое состояние.
Слово из идиша, которым оно обозначается – mensch – практически непереводимо.

Менш



Менш – это джентльмен, «утонченная натура». Но этим не вполне передается
чувство, заложенное в фразе: «это настоящий менш!» Сущность
понятия менш» в том, что это человек с всеобъемлющим видением,
склонный к интроспекции и философии и обладающий добротой. Менш
умеет выслушивать и очень хорошо понимает чужую точку зрения.
Следует отметить, что слово Mensch в немецком языке означает, во-первых,
человека и, во-вторых, мужчину. Хотя в таком смысле эта фаза становится
доступной обоим полам, он более расширителен, чем в идише.
На идише не все люди «менши».

Между «махерами» и «меншами» есть большая разница. Во-первых,
махеры обычно резче в общении; менши добродушнее, мягче и спокойнее.
У махеров есть чувство необходимости; у меншей есть чувство неизбежности.
Менш серьезно полагает, что все должно уладиться. Шлеппера часто
считают бестолковым или глупым, хотя вся его вина может заключаться
в невежестве; махера считают толковым или умным; менша всегда считают
мудрым. Вы обращаетесь к махеру, когда надо решить задачу сегодняшнего
дня; вы обращаетесь к меншу, когда требуется перспективное решение.
В каком-то смысле шлеппер не умеет делать ничего, махер – преимущественно
тактик, а менш – стратег.

Прежде чем вы придете к выводу, что менш – это воплощенный Йода,
должен отметить, что менш не просто источник рекомендаций, но и человек
дела. Особое положение менша заключается в том, что он не только
знает, что следует делать, но и действует соответственно, даже в ущерб себе.
В отличие от махера, менш нисколько не заинтересован в похвале за
получение результата. Его интересует результат ради него самого и его
редко волнует, знают ли люди о его участии. Типичным для менша поступком
будет, например, крупное анонимное пожертвование.

Иногда из махеров получаются хорошие наставники, но практически
всегда это побочный эффект при достижении их главной цели – результата.
Махеры чаще обучают более молодых махеров, а не шлепперов. Напротив,
из меншей получаются прекрасные тренеры и наставники, потому что
они очень хорошо чувствуют потребности других; они всем помогают, потому
что к каждому испытывают симпатию. Они также обладают способностью
предвидеть существенные черты отдаленного будущего, поэтому
понимают значение развития каждого и создания инфраструктуры. Они
находят прелесть в том, чтобы привнести в систему энергию, не зная
о времени и месте появления положительных последствий этого действия,
но не сомневаясь, что они обязательно будут.

Менш также способствует погашению конфликтов в любой организации.
Он выше драки, будучи преданным организации и ее целям, но не
преследуя личных целей, в отличие от махера, у которого они всегда имеются.
У махера есть своя территория, менш экстерриториален. Менш постарается
стать миротворцем, посредником и изобретательно искать решение,
когда кажется, что его не существует. Вопреки внешней видимости
менш оказывается очень эффективен. Его сила основана на способности
дружно работать со всеми и на уважении, которое все испытывают к нему.
Можно ли стать меншем, не пройдя стадии махера? Есть две точки зрения.

Первая заключается в том, что переход от шлеппера к меншу равнозначен
переходу от ученика к мастеру без промежуточной стадии просто
квалифицированного работника. Согласно этой точке зрения мудрость,
проявляемая меншем, накапливается за годы бытности махером. Хорошего
махера выдерживают годами, и в итоге он становится меншем.

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


Еще о меншах



Швейцарский физик и эколог Оливье Гизан 30 лет назад сказал мне,
что ключ к взрослению в том, чтобы, держа глаза открытыми, не
огрубеть сердцем. Важно в процессе созревания, когда мы учимся справляться
с подчас отвратительными реалиями жизни, не стать циником. Типичный
шлеппер – пессимист, а махер – циник. Менш является оптимистом.
Он верит в то, что люди добры, а цивилизация сможет найти решение
сложных проблем. Конечно, отчасти это связано с его собственной
гуманностью, но он этого не замечает.

Уже упомянутый психолог Михай Чиксентмихайи описал в своей книге
«Поток: психология оптимального переживания»1 некую модель. По его
теории существует конфликт знаний и навыков мастерства с решаемой
задачей. Если задача слишком проста, людям становится скучно, они
несчастны. Если задача очень сложна относительно компетентности, то люди
напрягаются, испытывая тревогу. В случае разумного компромисса –
не слишком легко и не слишком тяжело – достигается состояние «потока».
Чиксентмихайи называет достижение состояния потока каналом потока,
потому что при этом охватывается некоторый диапазон компетентности
и сложности задач. Поток – это благодатное состояние, в котором велики
достижения и испытывается чувство исключительной удовлетворенности;
спортсмены называют это «нахождением в зоне».

Интересно, что в этой модели шлепперы будут несчастливы, поскольку
постоянно будут ниже канала потока, работая над задачами, которые кажутся
им скучными. Махеры, что очевидно, окажутся в тревоге, потому что
чаще всего будут находиться выше канала потока: для них типично
«превосходить задачи». А вот менши, я думаю, будут счастливы и плодотворны,
потому что часто попадают в канал потока. Если главное – поймать поток,
то менши, похоже, это поняли.

Любопытно, что меншу не обязательно быть старым, хотя многие из
черт, ассоциируемых с меншами, приходят с возрастом. На самом деле
менш – это состояние ума, которое доступно каждому при надлежащих
взглядах и позиции.

Менши – счастливые люди. Их окружают счастливые люди. Они могут
справиться с самыми неприятными неожиданностями в жизни и помочь
другим сделать это. Их жизнь очень целостна и уравновешена, и душа их
в мире.


Распределение людей по группам




На каждые 100 шлепперов приходится 10 махеров и один менш.
Почему шлепперы так многочисленны? Простой ответ можно взять
у Линкольна, который сказал бы: «Бог их любит, поэтому создал так много».
И все-таки кажется, что неудовлетворенность должна была бы рано или
поздно почти всех подтолкнуть к следующей фазе. Увы, это не так.
Во-первых, большую роль играет лень: многие просто не желают делать то, что
позволило бы им подняться. Во-вторых, требуется зрелость: для перехода
в следующую фазу надо изменить отношение к жизни и взять на себя
ответственность за свою судьбу. Проще жаловаться на систему и
невозможность продвижения в ней, чем взять дело в свои собственные руки и
добиться успеха, несмотря на препятствия. Наконец, чтобы продолжить свой
рост, требуется совершить усилие. Выход из зоны шлепперов –
фундаментальная перемена, которой многие боятся, потому что новый образ жизни,
оказывается, лишен простых радостей, доступных шлепперу. Поскольку
ничто не дается без труда, многие шлепперы так и не решаются
преодолеть эмоциональный барьер, что необходимо для перехода в следующую
фазу. Полагаю, что три эти фактора – необходимость жертвовать, зрелость
и фундаментальные перемены в жизни – объясняют, почему шлепперов
так много.

Все это помещено в контекст реального и иногда жестокого внешнего
мира. Мой опыт говорит, что интеллект и талант играют значительно
меньшую роль в продвижении, чем напряженный труд и решительная
позиция. В современной глобальной экономике, как мне кажется,
открываются большие возможности и нет непреодолимых культурных,
социальных или иных барьеров. Если вы уверите себя в том, что всем управляют
внешние факторы, то будете обречены на роль шлеппера. Можно осилить
тех, кто стоит на вашем пути, но никто не перенесет вас через препятствие,
которое вы воздвигли для себя сами. На каждые 10 махеров приходится
100 шлепперов, и это представляется мне невероятной растратой человеческого
капитала. Такое положение кажется мне все более неприемлемым
по мере нашего дальнейшего движения в сторону информационной
экономики. Рабочих мест для шлепперов становится все меньше, но то
отношение к жизни, которое позволило им существовать так долго, остается.

Те, кто переходит в следующую фазу, проводят в шлепперах
относительно небольшой период своей жизни. В категории махеров они
проведут большую часть жизни, поэтому стоит постараться быть хорошим
махером. Если бы махеры рассматривали этот период своей жизни как
ученичество перед вступлением в менши, всем нам было бы немного лучше. Я не
думаю, что они сильно уменьшили бы свою эффективность, а в конечном
итоге все мы стали бы жить дольше и счастливее. Но изменить поведение
махера трудно, потому что он считает, что его эффективность основана
на тех качествах, которые отличают его от менша. Проблема именно в этом.
Я оцениваю соотношение меншей к махерам как один к десяти, но
опасаюсь, что эта оценка завышена. Меншей должно быть больше, потому что
их нехватка ощущается постоянно. Слишком часто они живут в этом
качестве очень недолго, и их дух оказывается долговечнее тела,
которое его содержит.


Некоторые завершающие мысли по поводу модели



В модели сделаны определенные допущения. Вы начинаете как шлеппер,
вырастаете в махера и надеетесь стать меншем. Это обычный
путь, исключения из которого отмечались на протяжении всей главы. Эта
модель проста, но она несовершенна: когда имеешь дело с людьми и делаешь
обобщения, встречаешься с «неприятными» исключениями.

Я знаю, что надо делать, чтобы стать махером, но дать рецепт, как стать
меншем, я не могу. Меншем нельзя стать путем напряженного труда, как
можно стать махером. Возможно, меншами рождаются, а не становятся.
Спрашивать, как стать меншем, – это все равно что спрашивать, как стать
мудрым, или как стать просвещенным.

Помочь может влияние, оказанное одним или двумя меншами,
особенно в ранний период жизни, когда они могут служить образцом. Расти в
детстве с отцом-махером и дедом-меншем может быть очень поучительно,
если ребенок-шлеппер достаточно восприимчив.

Еще очень важно понимать, что всем меншам ничего не надо в обмен
на их доброту, кроме того, чтобы вы передали ее следующему поколению.
Но разве я что-то знаю?

суббота, 20 ноября 2010 г.

Покупать будут покупки, а не клики

Покупать будут покупки, а не клики - О том, в какую сторону будет развиваться контекстная реклама и сколько времени инвестору стоит оставаться в соучредителях интернет-проекта, рассказывает Алексей Басов, основатель и генеральный директор сервиса контекстной рекламы «Бегун» и портфельный управляющий фонда «Финам — информационные технологии. Интересное интервью, которое обозначает некоторые тренды в развитии рекламной индустрии.

суббота, 16 октября 2010 г.

Создание поискового плагина для Mozilla FireFox - на примере CrunchBase

Так как часто смотрю проекты на сайте CrunchBase, то мне удобно вводить свой запрос в поисковый плагин для FireFox. Я хотел было установить себе поисковый плагин для CrunchBase, но с удивлением обнаружил, что такого плагина нет.

Что ж, раз его нет, то что мешает написать его самим? Тем более, что "написание поискового плагина" - это всего лишь создание XML-файла из нескольких строчек.

Итак, создаем файл crunchbase.xml со следующим содержанием:
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/">
<os:ShortName>CrunchBase</os:ShortName>
<os:Description>CrunchBase - free directory of technology companies, people, and investors.</os:Description>
<os:InputEncoding>UTF-8</os:InputEncoding>
<os:Url type="text/html" method="GET" template="http://crunchbase.com/search">
<os:Param name="query" value="{searchTerms}"/>
</os:Url>
</SearchPlugin>

Помещаем этот файл в каталог с остальными поисковыми плагинами. У меня на Ubuntu этот каталог находится по следующему пути: ~/.mozilla/firefox/ph10gejb.default/searchplugins, после чего перезапускаем FireFox. Вуаля - в списке поисковых систем появилась еще одна строчка с CrunchBase.

Эти ссылки могут быть полезны по теме "Разработка поискового плагина":
Build Your Own Firefox Search Engine
Learn to make a FireFox Search Plugin, and how to install it! Detailed Tutorial! - Publishing - Pixel2Life

суббота, 2 октября 2010 г.

Чтение всего файла в массив байтов

Нужно прочитать файл целиком в массив байтов. Например, для текстовых файлов такое нужно, чтобы затем из байтов сделать строку с нужной кодировкой: public String(byte[] bytes, String encoding).

Далее, код функции, которая позволяет считать файл целиком в массив байтов (взято отсюда: Reading a File into a Byte Array):

public static byte[] getBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
return null;
}
 
byte[] bytes = new byte[(int)length];
 
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
 
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file "+file.getName());
}
 
// Close the input stream and return bytes
is.close();
return bytes;
}

суббота, 31 июля 2010 г.

Настройка trac для отсылки email

Используем trac - нужно настроить отсылку сообщений по электронной почте при появлении изменений в каком-либо тикете. Подробные настройки даны на странице Email Notification of Ticket Changes в вики trac, здесь же я ограничусь описанием того, что нужно было сделать у нас в проекте.

1) Открываем файл /home/trac/project/conf/trac.ini
2) Вносим изменения:

[notification]
smtp_enabled = true
smtp_server = localhost
smtp_from = trac@example.com
smtp_replyto = project@projects.example.com
smtp_always_cc = ticketmaster@example.com, theboss+myproj@example.com


Остальные настройки закомментируем.

На этом все.

понедельник, 26 июля 2010 г.

Шпаргалка по MySQL

Небольшая шпаргалка по MySQL:

1) Просмотр имеющихся баз:

show databases;

2) Просмотр таблиц в БД:

show tables in dbname;

3) Просмотр информации о столбцах в таблице:

show [full] columns in tablename;

4) Просмотр информации о кодировках:

show character set;

5) Создание БД с кодировкой UTF-8:

create database mydb DEFAULT CHARACTER SET utf8 default COLLATE utf8_general_ci ;

воскресенье, 25 июля 2010 г.

Итерация по Enumeration

Что делать, если нужно пробежаться по java.util.Enumeration? Мне это понадобилось, когда я писал отладочный метод, выводящий все заголовки HTTP-запроса. Метод getHeaderNames() из класса javax.servlet.http.HttpServletRequest возвращает Enumeration.

Можно конечно сделать по старинке, используя hasMoreElements()/nextElement():

Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = (String)headerNames.nextElement();
// do smth...
}


но так делать не очень-то и хотелось. Вместо этого превратим Enumeration в java.util.ArrayList и уже
по нему будем совершать итерации:

List<String> headerNames = Collections.list((Enumeration<String>)request.getHeaderNames());
for (String headerName : headerNames) {
String headerValue = request.getHeader(headerName);
// do smth....
}


Ну, и напоследок, код метода, который выводит в строку все заголовки HTTP-запроса:

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Collections;
import java.util.Enumeraion;
 
public static String httpHeadersToString(HttpServletRequest request) {
List<String> headerNames = Collections.list((Enumeration<String>)request.getHeaderNames());
StringBuilder sb = new StringBuilder();
for (String headerName : headerNames) {
String headerValue = request.getHeader(headerName);
sb.append(headerName).append("='").append(headerValue).append("'\n");
}
return sb.toString();
}

воскресенье, 4 июля 2010 г.

Генератор паролей на Питоне

Нужно было написать генератор паролей, который бы генерировал случайные пароли заданной длины. Приведенный ниже код решает эту задачу:

import random
 
passwordSymbols = ";*()_+=-,.[]{}1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
 
def genRandomSymbols(len):
"""
:param len: length of random symbols sequence
:raise BadValueError: If len < 0
:return: The random sequence of len length.
"""

if len < 0:
raise ValueError("len should be greater or equal than 0")
elif len == 0:
return ""
else:
result = ""
for i in range(len):
result = result + random.choice(passwordSymbols)
return result
 
def main():
print genRandomSymbols(12)
 
if __name__ == "__main__":
main()

Постоянные читатели