Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

воскресенье, 27 февраля 2011 г.

Подборка #46

О какой роллер


Ошибка 404 - время передохнуть.

Курю Test Driven Database Development With DbFit

"Так что мотивация – это то, что вы думаете, что должны делать, а вдохновение – это то, что вы делаете, потому что вам это очень нравится."
Читаем дальше...

Очень хочу сюда вот...

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


Вот так попал на мастеркласс по велоделу.
А попал сюда.

"Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе! " Говнокод.РУ

"«Почему»? Говорят, что если ребенок задает его в 2 года, то из него вырастает гений. Если заветное слово произнесено в пять лет, то перед нами обыкновенный индивидуум. Становится мучительно больно, когда задумываешься, в каком возрасте мы задаемся этим вопросом."


Сделать все хорошо!

Спасибо Валерка! Стало лучше...

Плазменное радио...


За что люблю подобные статьи - это за список использованной литературы:
1 [Мартин] Роберт К. Мартин, Чистый код. Создание, анализ, рефакторинг. СПб.: Питер, 2010.
2 [Бек] Кент Бек, Экстремальное программирование: Разработка через тестирование. СПб.:Питер 2003
3 [Гамма] Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Валиссидес, Приемы объектно-ориентированного проектирования. Паттерны проектирования., СПб.: Питер, 2010.
4 [Месарош] Джерард Месарош, Шаблоны тестирования., М.:Вильямс, 2009.
5 [Фаулер] Мартин Фаулер, Рефакторинг. Улучшение существующего кода., СПб.: Символ-плюс, 2009.
6 [Физерс] Майкл Физерс, Эффективная работа с унаследованным кодом., М.: Вильямс, 2009.
7 [Дюваль] Поль Дюваль, Непрерывная интеграция., М.: Вильямс, 2008.
8 [Guice] Кевин Бурильон, Боб Ли, Java on Guice: Dependency Injection the Java Way. 2007. URL:
Есть пару новых книг. Теперь я точно знаю, что буду читать в ближайшее время. Кстати про книги, каждая вдумчиво прочитанная (с применением в работе новых идей) IT специалистом книга повышает размер компенсации его времени компанией на 0,3k$. Иль я не прав?..

Ха, гугл провтыкал. Иногда я пользовался кнопкой "мне повезет", а теперь при вводе чего-то в строку поиска гугл сразу выводит список найденных результатов. А как же "Мне повезет"?

среда, 23 февраля 2011 г.

Включаем мозг: Как делать выбор?

Кажется, начинаю понимать, что такое сделать выбор. Как-то давно смотрел Секрет и там было сказано - выбирайте наполнение в своей жизни так же, как вы выбираете товар в супермаркете. Каждый день мимо нас проносится множество таких вот "конфирмейшенов".
Задуматься можно:
- Какая кнопка стоит "по умолчанию"?
- Что чаще предлагают?
- Как сделать так, чтобы предлагали другое?

Личный дневник создан для того чтобы писать там о том, что было. Но а что, если вести дневник будущего, и писать там о том, что со мной будет?

Из личного опыта. Техника проста - описать один день из своей жизни в будущем, там, где будет хорошо и счастливо. Написать и забыть. Потом, месяца через два случайно заглянуть в запись и офигеть от того, что большая часть (пускай не точно так же, как и в описании) случилась. Написать еще раз, но что-то по-круче. И тихонечко жить обычной жизнью. Тут офигеваем уже с другого - с тех "конфирмейшенов" которые стали появляться каждый день. Далее учимся жмакать "Да"! Снова офигеваем, но уже от последствий новой стратегии выбора. Снова в тот же дневник и пишем, пишем, пишем...

Итак, сделать выбор это:
1) уединиться и написать запрос
2) наблюдать за ежедневными "конфирмейшенами"
3) научиться говорить чаще Да
4) сказать спасибо (достаточно просто порадоваться)
5) goto 1)

Кстати, всему этому есть научно-популярное объяснение. Мозги так работают.

Вероятно, об этом уже писал, но всякий раз, когда со мной случается такое маленькое "Офигение" хочется написать об этом еще и еще! Вспомнилось (теми самыми мозгами) "По вере вашей да будет вам". Это жжжж неспроста.

Кайфуйте, когда пишите свое будущее.

Иду-ка закажу себе что-то приятненькое...

четверг, 17 февраля 2011 г.

Java for fun: "Почему java?"

Не так давно провел первый в своей жизни вебинар. В качестве презентации использовал mind map. Вот она.

вторник, 15 февраля 2011 г.

Подборка #45

Привет!!! Этой подборкой внесу еще немного иррационального в вашу жизнь.

...Я, кажется, знаю почему GoogleWave такой непопулярный. Он висючий! Около 50 маленьких "твитов" и джаваскрипт зависает. И это при том, что FireBug отключен. С другой стороны очень приятно что GoogleWave зависает от моих заслуг - веду Журнал успеха уже 2,5 недели и могу поделиться опытом - это мега инструмент в моменты:
- когда, кажется, что не уверен в себе;
- когда одиноко и не с кем поговорить;
- когда хочешь, чтобы похвалили :)
- просто сутра для зарядки ума позитивом.
Чувствую, что-то в жизни меняется. Не уверен, что все из за Журнала Успеха, но он в этом всем выполняет не последнюю роль...

...Возможно все, но прикол жизни в другом - в вопросе как я могу это сделать?..

...Пошел менять статус в скайпе и наткнулся на http://kiev.quest.ua/. А почему бы и да?..

...Из жизни. Рассказывает моя Мама. Приходят недавно двое дядек проверять газовые трубы, краны, печки, плитку. Находят на балконе старый газовый баллон, и тут же выписывают много тексту о взрывоопасности, пожароопасности и вообще. Потом проверяют все газовые краны один за другим и уходят. Минут через 15 Мама замечает, что кран одной из газовых печек остался открыт полностью, а огонь не горит.

Один из докладчиков в точку сказал на ABC конференции, что "человеческий фактор - это когда очень приперло в туалет по большому, а все остальное - халатность."

А ведь все могло закончиться совсем по другому. Будьте внимательны с посторонними людьми, которых впускаете в свою квартиру. На то они и посторонние...

...Пришло сегодня в соц сети пару раз.
"Привіт!

Надсилаю це тобі не у якості спаму. Просто якщо й справді можна допомогти дитині вижити лише переславши листа – це дійсно варта справа. Я прошу вас прочитати, хоча б половину цього листа і відправити його, по можливості всім своїм знайомим. Після перших трьох речень Ви зрозумієте, про що йдеться. Читайте уважно!..."
Подробнее тут...
Я бы использование кнопок Copy-Past облагал налогами - от тогда можно было бы заработать на спамерах и даже помочь кому-то. "C'copy'past'те это сообщение своим друзьям и поможете ребенку. Стоимость одного copy'past - 50 грн. Функция доступна для всех провайдеров сети Интернет."

...Сегодня делал контрастный душ с градусником. То ли лыжи не едут, то ли я что-то не так делаю?.. В общем я узнал, что самая горячая вода, которую я могу еще терпеть - 44 градуса дедушки Цельсия (а я чет думал 50+). А та самая холодная вода, от которой руки сводит если их под ней мыть - 7 градусов дедушки Цельсия. Итого контраст получается в 37 градусов. Не много ли?

Как это происходит на практике. Вначале лезу под воду температуры моего тела +/-37 градусов и просыпаюсь минуту. После постепенно повышаю температуру до того максимума, который могу терпеть. Обливаюсь весь так долго, чтобы кожа начала краснеть (минуты 2). После выключаю горячую воду полностью, а холодную кручу по максимуму. Начиная с ног а потом грудь, спину и руки. Воды лью столько, чтобы перестать чувствовать изменения - вначале чувствуешь холод, а потом кожа как бы немеет и уже не различаешь какой температуры вода - пару секунд на одном участке, постоянно меняя положения лейки душа. В целом обливание всего тела занимает от 15 до 30 секунд, чего, говорят достаточно. Когда обливаю грудь и спину - пою, иначе не получается. После резко включаю горячую и обливаюсь ею. Кожа, по ощущениям, уже не различает температуры. Так же обливаюсь секунд 30-40, чтобы все тело задействовать. Потом снова холодная. Путь уже не обязательно - холода не чувствуешь, только легкое жжение. Так же 15-30 секунд. Потом снова горячая - 30-40 секунд, и снова холодная - 15-30 секунд. На этом я быстро и решительно заканчиваю и растираюсь полотенцем.

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

Что касается ограничений - говорят, что некоторого рода болячки (сердечно сосудистая и еще что-то) несовместимы с контрастным душем. Хорошо бы проконсультироваться с врачом. Так же начинал я с 1 итерации холодная-горячая, но с той же разницей температур и с продолжительностью холодной фазы - 15 секунд. Мальчикам рекомендовал бы прикрывать причинное место как от горячей воды, так и от холодной. Баловаться контрастным душем не стоит - раз начал, то делай ежедневно (сутра) и не более раза в день, дело в том, что вероятность заболеть велика. Так же слышал, что если начинать с не холодной воды, постепенно снижая температуру день за днем на пару градусов, то есть большой шанс простудиться. От Мама моя говорит, что в молодости воспаление легких заработала. Жесть. Случается это потому, что прохладная (а не холодная) вода не закрывает поры и тепло интенсивно покидает тело - случается переохлаждение. А вот после какой-то температуры Х - поры закрываются и теплопотери резко сокращаются.

Такую технику использую уже месяц и пока здоров, бодр и в хорошем настроении.

Берегите себя и помните, что эффективность теплоотдачи при контакте с водой в 20—27 раз выше чем при контакте с воздухом той же температуры...

...Пока искал информацию про поры, нашел вот что:
Железы, придающие телу запах, называются апокринными. Они расположены главным образом в подмышечной, генитальной и лобковой областях. Эти железы выделяют молочкообразный пот, который, смешиваясь с бактериями на коже, придает ей специфический запах. Апокринные железы часто стимулируются стрессом, вот почему мы хотя и можем обильно потеть в жаркую погоду или во время выполнения интенсивных физических упражнений, однако, если нет стресса, запаха почти не бывает. И вот почему пот, появляющийся во время важной презентации, часто имеет запах.

Любопытно.

А вот Еще один новый факт - "золотой мальчик"...

...Хороший пост про про Groovy XML Slurper...

...Правильная оценка основана на опыте, большая часть из которого основана на ошибках...

Шаблоны: Object configurator

Как-то раз мне захотелось сделать так
package com.apofig.FilesCollector;

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class SomeObjectConfigurationTest {

    @Test
    public void testCheckSimpleConfisuration() {
        SomeObject object = SomeObjectFactory.forSettings("/qwe/", "asd1", "asd2").build();
        
        assertEquals("[Some object has settings: [/qwe/asd1, /qwe/asd2]]", 
                object.toString());
    }
    
    @Test
    public void testCheckComplexConfisuration() {
        SomeObject object = SomeObjectFactory.forSettings("/qwe/", "asd1", "asd2").
                andSettings("/wer/", "sdf1", "sdf2", "sdf3").
                andSettings("/ert/", "dfg").build();
        
        assertEquals("[Some object has settings: [/wer/sdf1, /wer/sdf2, /wer/sdf3, " +
                "/ert/dfg, /qwe/asd1, /qwe/asd2]]", 
                object.toString());
    }    
}
Ну, чтобы был отдельно объект и логика по сбору дополнительной конфигурации для него. В данном случае объект конфигурировался списком путей к xml файлам, из которых потом читал нечто. Файлы могли находится в разных папках, а чтобы не писать как-то так
SomeObject object = 
         new SomeObject(Arrays.asList(new String[] {"/wer/sdf1", 
          "/wer/sdf2", "/wer/sdf3", "/ert/dfg", 
                    "/qwe/asd1", "/qwe/asd2"})); 
пришлось придумать другой, более удобный интерфейс.

Вот как это было реализовано:
package com.apofig.FilesCollector;

import java.util.List;

public class SomeObjectFactory {

    public static FilesCollector<SomeObject> forSettings(String baseDir, String ... files) {
        return new FilesCollectorImpl<SomeObject>(new GetInstance<SomeObject>() {        
            public SomeObject getInstance(List<String> settings) {            
                return new SomeObject(settings);
            }
        }).andSettings(baseDir, files);
        
    }            
}

package com.apofig.FilesCollector;

import java.util.List;

public class SomeObject {
    
    private List<String> pathesList;
    
    public SomeObject(List<String> pathesList) {
        this.pathesList = pathesList;
    }
    
    public String toString() {        
        return "[Some object has settings: " + pathesList.toString() + "]";
    }
}

package com.apofig.FilesCollector;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FilesCollectorImpl<T> implements FilesCollector<T> {

    private Map<String, List<String>> settingsFiles = new HashMap<String, List<String>>();
    private GetInstance<T> factory;
            
    public FilesCollectorImpl(GetInstance<T> factory) {
        this.factory = factory;
    }
    
    public FilesCollector<T> andSettings(String baseDir, String ... files) {
        if (settingsFiles.containsKey(baseDir)) {            
            List<String> list = settingsFiles.get(baseDir);
            list.addAll(asModifiableList(files));            
        } else {
            settingsFiles.put(baseDir, asModifiableList(files));
        }
        return this;
    }
    
    public T build() {
        return factory.getInstance(getPathesList());
    }
    
    private static <E> List<E> asModifiableList(E ... array) {
        return new ArrayList<E>( Arrays.asList(array) );
    }
    
    private List<String> getPathesList () {
        List<String> result = new ArrayList<String>(); 
        for (Map.Entry<String, List<String>> entry : settingsFiles.entrySet()) {
            String baseDir = entry.getKey();            
            for (String fileName : entry.getValue()) {
                result.add(baseDir + fileName);
            }
        }
        
        return result;
    }    
}

package com.apofig.FilesCollector;

public interface FilesCollector<T> {

    public FilesCollector<T> andSettings(String baseDir, String... files);

    public T build();

}

package com.apofig.FilesCollector;

import java.util.List;

interface GetInstance<T> {
    
    T getInstance(List<String> settings);

}

Большее развитие этот метод получил, когда и другие классы так же захотели конфигурироваться подобным образом. И чтобы избежать дублирования factory метода в SomeObjectFactory для каждого нового объекта я сделал так.

package com.apofig.FilesCollector;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

public class ObjectFactory {

    public static <T> FilesCollector<T> forClass(final Class<T> objectToConfigure) {
        return new FilesCollectorImpl<T>(new GetInstance<T>() {        
            public T getInstance(List<String> settings) {            
                Exception exception;
                try {
                    return objectToConfigure.getConstructor(List.class).newInstance(settings);
                } catch (IllegalArgumentException e) {
                    exception = e;
                } catch (SecurityException e) {
                    exception = e;
                } catch (InvocationTargetException e) {
                    exception = e;
                } catch (NoSuchMethodException e) {
                    exception = e;
                } catch (InstantiationException e) {
                    exception = e;
                } catch (IllegalAccessException e) {
                    exception = e;
                } 
                throw new RuntimeException("Please add conctructor with 'List<String> settings' for " + objectToConfigure, exception);
            }
        });                 
    }            
}

Извините за мой французский с Exception. Но теперь тесты можно было запускать так

package com.apofig.FilesCollector;

import static org.junit.Assert.*;

import org.junit.Test;

public class SomeObjectConfigurationTest {

 @Test
 public void testCheckSimpleConfisuration() {
  SomeObject object = ObjectFactory.forClass(SomeObject.class).
    andSettings("/qwe/", "asd1", "asd2").build();
  
  assertEquals("[Some object has settings: [/qwe/asd1, /qwe/asd2]]", 
    object.toString());
 }
 
 @Test
 public void testCheckComplexConfisuration() {
  SomeObject object = ObjectFactory.forClass(SomeObject.class).
    andSettings("/qwe/", "asd1", "asd2").
    andSettings("/wer/", "sdf1", "sdf2", "sdf3").
    andSettings("/ert/", "dfg").build();
  
  assertEquals("[Some object has settings: [/wer/sdf1, /wer/sdf2, /wer/sdf3, /ert/dfg, /qwe/asd1, /qwe/asd2]]", 
    object.toString());
 }
 
 @Test
 public void testCheckWithoutConfisuration() {
  SomeObject object = ObjectFactory.forClass(SomeObject.class).build();
  assertEquals("[Some object has settings: []]", object.toString());
 }
}

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

package com.apofig.FilesCollector;

import static org.junit.Assert.*;

import org.junit.Test;

public class SomeObjectConfigurationTest {

    @Test
    public void testCheckSimpleConfisuration() {
        SomeObject object = ObjectFactory.byStrategy(FilesCollector.class).
                andSettings("/qwe/", "asd1", "asd2").build(SomeObject.class);
        
        assertEquals("[Some object has settings: [/qwe/asd1, /qwe/asd2]]", 
                object.toString());
    }
    
    @Test
    public void testCheckComplexConfisuration() {
        SomeObject object = ObjectFactory.byStrategy(FilesCollector.class).
                andSettings("/qwe/", "asd1", "asd2").
                andSettings("/wer/", "sdf1", "sdf2", "sdf3").
                andSettings("/ert/", "dfg").build(SomeObject.class);
        
        assertEquals("[Some object has settings: [/wer/sdf1, /wer/sdf2, /wer/sdf3, /ert/dfg, /qwe/asd1, /qwe/asd2]]", 
                object.toString());
    }
    
    @Test
    public void testCheckWithoutConfisuration() {
        SomeObject object = ObjectFactory.byStrategy(FilesCollector.class).build(SomeObject.class);
        assertEquals("[Some object has settings: []]", object.toString());
    }
}

Выглядит вроде как не очень плохо. В реализации немного кривоватее :)

package com.apofig.FilesCollector;

public interface GetInstance {

    <E> E getInstance(Class<E> clazz, Object data);
}

package com.apofig.FilesCollector;

import java.lang.reflect.InvocationTargetException;

public class ObjectFactory {

    public static <T> T byStrategy(Class<T> strategy) {
        GetInstance factory = new GetInstance() {

            public <E> E getInstance(Class<E> clazz, Object data) {
                Exception exception;
                try {
                    return (E) clazz.getDeclaredConstructors()[0].newInstance(data);
                } catch (IllegalArgumentException e) {
                    exception = e;
                } catch (SecurityException e) {
                    exception = e;
                } catch (InstantiationException e) {
                    exception = e;
                } catch (IllegalAccessException e) {
                    exception = e;
                } catch (InvocationTargetException e) {
                    exception = e;
                }
                throw new RuntimeException(exception);
            }
            
        };
        
        Exception exception;
        try {
            return strategy.getConstructor(GetInstance.class).newInstance(factory);
        } catch (InstantiationException e) {
            exception = e;
        } catch (IllegalAccessException e) {
            exception = e;
        } catch (IllegalArgumentException e) {
            exception = e;
        } catch (SecurityException e) {
            exception = e;
        } catch (InvocationTargetException e) {
            exception = e;
        } catch (NoSuchMethodException e) {
            exception = e;
        }
        throw new RuntimeException(exception);
    }
}

package com.apofig.FilesCollector;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FilesCollector {

    private Map<String, List<String>> files = new HashMap<String, List<String>>();
    private GetInstance factory;    
    
    public FilesCollector(GetInstance factory) {
        this.factory = factory;
    }
    
    public FilesCollector andSettings(String baseDir, String... filesNames) {
        ...
    }

    public <T> T build(Class<T> clazz) {
        return factory.getInstance(clazz, getPathesList());
    }

    private static <E> List<E> asModifiableList(E... array) {
        ...
    }

    private List<String> getPathesList() {
        ...
    }

        return result;
    }
}

Конечно следующим этапом будет более красивое информирование конечного пользователя о том, что ему надо:
1) в классе стратегии сбора настроек иметь конструктор SomeCollector(GetInstance factory), причем этот билдер использовать для построения объекта.
2) в классе настраиваемого объекта иметь один конструктор с единственным параметром, принимающий то что выдает класс сбора настроек.

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

А еще хорошая задачка, которую мне не удалось решить - как сделать так:
@Test
 public void testCheckSimpleConfisuration() {
  SomeObject object = ObjectFactory.byStrategy(FilesCollector.class).
    fillClass(SomeObject.class).
    withSettings("/qwe/", "asd1", "asd2").build();
  
  assertEquals("[Some object has settings: [/qwe/asd1, /qwe/asd2]]", 
    object.toString());
 }
 
 @Test
 public void testCheckComplexConfisuration() {
  SomeObject object = ObjectFactory.byStrategy(FilesCollector.class).
    fillClass(SomeObject.class).
    withSettings("/qwe/", "asd1", "asd2").
    withSettings("/wer/", "sdf1", "sdf2", "sdf3").
    withSettings("/ert/", "dfg").build();
  
  assertEquals("[Some object has settings: [/wer/sdf1, /wer/sdf2, /wer/sdf3, /ert/dfg, /qwe/asd1, /qwe/asd2]]", 
    object.toString());
 } 
Ах да! Самое главное, чтобы дивелопер который руководствуется принципом "а поставлю ка я точку и погляжу что там в списке методов объекта есть" мог выбирать только среди методов заданной стратегии (в примере это FilesCollector), а когда решится собрать объект, то последний в цепочке метод build вернул бы объект заданного в методе fillClass класса (в примере это SomeObject). Причем без всяких ClassCast на стороне клиента, типа
SomeObject object = (SomeObject)ObjectFactory.byStrategy(FilesCollector.class).
    fillClass(SomeObject.class).
    withSettings("/qwe/", "asd1", "asd2").build();

Мало ли кому-то пригодится...

среда, 9 февраля 2011 г.

Подборка #44

Заменил XMind на Mindjet MindManager 9. Джава джавой, но си быстрее :) Привыкаю к новому UI...

...Интересно про импланты в мозгу. В будущем будет много киборгов. Надеюсь застану это...

...Конференция Agile Base Camp во Львое позади, но я привез с собой около 20 разнообразных тасков. Вот оно проявление моей иррациональной натуры. Написать пост в блоге, зарегить гугл группу, выложить фотки, видео и аудио, склеить панорамки, дать обещанные линки, почитать чтиво, о котором разузнал, написать ребятам, контакты которых взял. Ухх!..

...Сколько не планируй, все равно придется выкручиваться
Be agile...

...Блин, непорядок - пол часа гуглил и не нашел возможности выложить mind map карту у себя в блоге. Что никто до сих пор не написал?
Неее написали:
http://eric-blue.com/projects/mindmapviewer/share.html
http://freemind.sourceforge.net/wiki/index.php/Flash_browser#Download
Вторая мне больше нравится, а потому покажу как это выглядит в результате:
Flash plugin or Javascript are turned off.
Activate both and reload to view the mindmap




Круть. Спасибо Автору...

..А вот и критика электронных версий mindmap
"Как было отмечено ранее, Mind Map позволяет окинуть единым взором всю проблему в целом, более того — это постоянно необходимое действие в процессе построения карты. Может ли решить эту проблему компьютерная программа? Да, если у вас монитор 21 дюйм и нет в 99% остальных случаев. Разрешение современных мониторов далеко от бумаги, т.е. либо мы видим кусок карты, либо всю, но не можем читать и писать надписи.

Отдельной проблемой является негоризонтальное написание текста — на бумажных картах это естественно, но редактировать такой текст на мониторе — сплошное мучение, требуется постоянно переключать масштаб (это связано с тем, что шрифты адаптированы к нормальному, горизонтальному отображению на экране).
Разрешение распечатки значитольно больше 600 dpi против 96 dpi монитора, но у многих ли есть цветные принтеры? Да и в любом случае, распечатка — результат, а не процесс."
Согласен! Завтра же куплю ватман, простой карандаш, фломастеры и создам реальную карту. Посмотрим что получится...

...Сегодня создал группу "Где брать людей?". Эту таску получил на OpenSpace конференции ABC, недавно проходившей во Львове. Мне приглянулась тема поиска новых специалистов. Пока общение в группе не происходит, но кто знает.

А вот и фотки из этого OpenSpace

...

понедельник, 7 февраля 2011 г.

Подборка #43

Получил сегодня в скайп.
Представьте себе, что жизнь - это игра, построенная на жонглировании пятью шариками.
Эти шарики - Работа, Семья, Здоровье, Друзья и Душа, и вам необходимо, чтобы все они постоянно находились в воздухе.
Вскоре вы поймёте, что шарик Работа сделан из резины - если вы его невзначай уроните, он подпрыгнет и вернётся обратно.

Но остальные четыре шарика - Семья, Здоровье, Друзья и Душа - стеклянные. И если вы уроните один из них, он будет непоправимо испорчен, надколот, поцарапан, серьёзно поврежден или даже полностью разбит. Он никогда не будет таким, как раньше. Вы должны осознавать это и стараться, чтобы этого не случилось.
Работайте максимально эффективно в рабочее время и уходите домой вовремя. Посвящайте необходимое время своей семье, друзьям и полноценному отдыху. 

Ценность ценна только если её ценят.
Спасибо Андрюха!

...А потом к маме в черновцы


...Хочу такую камеру :)


Хрюша-волосатик
Больше хрюш тут...

АО МММ


"Если вдуматься, то мы одиноки в своих целях. Мы совершенно одиноки в своих целях. Мы строим свою жизнь сами, мы строим свой бизнес сами. Нет ни одной книжки, которую ты бы открыл и там прямо написано: как я могу построить свою жизнь; как я могу построить, именно, свой бизнес; как я могу встретить любимого человека. Нет ни одной книги, которая была бы написана про меня, как я лично могу это сделать. И, по сути, получается, что каждый из нас в наших целях одинок. Мы одни в наших целях - мы движемся и там нет ни одного попутчика. По сути Коуч - это уникальный специалист, которого можно нанять, чтобы он был вместе с нами, вот, в, именно, наших личных целях."
Смотрим видео...


А знаете ли вы, что есть 9 видов черточек? Я сегодня пол дня дебажил проект и в результате пришел к этой статье... Будь-те внимательны - проверяйте свои проекты на наличие похожих, но разных знаков. Не копипастьте!

Кстати, если когда-нибудь захотите отдебажить тесты, которые запускает maven - эта статья и эта статья помогут в этом. Дело в том, что maven запускает тесты в фазе тестирования в отдельных процессах.

Целый день ушел на это, но зато как сейчас приятно...

mp3DirectCut - отличная фришная программа для нарезки mp3. Основной плюс в том, что она не перекодирует аудиофрагмент, а копирует его. Как результат нет потери качества + быстродействие. Сам тащусь...

Иррациональное планирование дел. Спасибо Андрюха, еще одна головоломка решена!

1908 год. Никола Тесла придумал интернет
"Когда проект будет завершён, бизнесмен в Нью-Йорке сможет диктовать указания, и они будут немедленно появляться в его офисе в Лондоне или любом другом месте. Он сможет со своего рабочего места позвонить любому абоненту на планете, не меняя существующего оборудования. Дешёвое устройство, по размерам не больше чем часы, позволит его обладателю слушать на воде и суше музыку, песни, речи политиков, учёных, проповеди священников, доставляемые на большие расстояния. Таким же образом любое изображение, символ, рисунок, текст могут быть переданы из одного места в другое. Миллионы таких устройств могут контролироваться единственной станцией. И самое главное, что все это будет передаваться без проводов…"
Читаем про интернет на википедии...
"А вот еще прикол оттуда же
"В начале 21 века эскимосы познакомились с интернетом, и этот термин понадобилось перевести на их язык. Эксперты выбрали слово ‘ikiaqqivik’ — «путешествие сквозь слои». Раньше это слово употреблялось для описания действий шамана, который для поиска ответа на какой-либо вопрос «путешествовал» сквозь время и пространство."
А вот как выглядит наш интернет
Рисунок так же взят с викиедии.

А еще я провел первый в жизни вебинар. Волновался, но получилось очень даже хорошо!
Через месяц запишусь на тренинг по тренингам