• Заказчик и фрилансер. Взаимодействие. Ч. 2

      В первой части я постарался дать понимание относительно того, как выбрать заказчика/исполнителя для проекта. Естественно, в одной статье нет возможности перечислить все, с чем приходится сталкиваться, но основы я постарался описать.

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

      Ну, от слов к делу

      Читать дальше →
    • XMPP-SMS шлюз на Android



      Введение

      Причиной написания данной статьи послужила необходимость создания программы для системы Android, с помощью которой можно отправлять данные заказа в виде SMS сообщений владельцам интернет магазинов о том, что был совершен заказ товаров или услуг. Ранее мною использовалась система включающая GSM-модем и программу написанную на языке С++, использовавшая AT-команды для общения с модемом и библиотеку gloox для получения сообщений по протоколу XMPP, на стороне web-сайта использовалась библиотека xmpphp, для отправки данных заказа. При такой схеме приходилось держать включенным компьютер постоянно, так как система приема заказов работала круглосуточно, соответственно отсюда дополнительный расход электроэнергии, шум от вентиляторов ночью и постоянный контроль интернет соединения.
      Читать дальше →
    • Фрилансер и заказчик. Взаимодействие

        Каждый, кто имеет дело с IT в той или иной форме, так или иначе сталкивался/слышал о том, что существует такое явление, как фриланс. Как может показаться на первый взгляд, фриланс несет в себе одни плюсы. Ни тебе работника в офисе, для которого надо организовать рабочее место, ни проблем с оформлением его по ТК и последующим увольнением (если нанимать на четко заданный объем работ). Так же стоимость фрилансера, как правило, оказывается от 2 до 20 раз меньше, чем у фирмы, предлагающей те же самые услуги.

        Тем не менее, существует огромное количество негативного опыта работы с фрилансом. О его приинах и возможных способах устранения — под катом

        Читать дальше →
      • Хабраигра «Стартап»

          На прошлой неделе «Мосигра» отгрузила Хабру первые 20 коробок игры «Стартап», которую мы совместно пилили больше трёх месяцев. Это игра про малый бизнес, IT-проекты, умение договариваться, планировать время, оценивать свои силы и вместе разруливать разные проблемы.

          Вот что мы хотели от настольной игры:
          • Сделать наконец-то что-то про IT.
          • И про свой бизнес.
          • Игра должна быть тренирующей навыки переговоров и иллюстрирующая проект-менеджмент.
          • Начать играть можно за 2 минуты, но нюансы искать ещё долго.
          • Без 100% выигрышной стратегии, каждый раз — по ситуации.
          • Без кубиков и адского рандома.
          • С небольшой долей чёрного юмора и локальных мемов.
          И вот что у нас получилось. Вот так выглядит игра «Стартап», которая с прошлой недели продаётся в Мосигре:

          Читать дальше →
        • Оптимизация расхода батареи

            image

            Введение


            В этой статье приводится несколько советов по оптимизации расхода батареи приложениями.
            Отключая фоновые сервисы обновлений при потере соединения или уменьшая частоту обновлений при низком уровне заряда батареи можно существенно минимизировать влияние работы приложения на батарею.
            Некоторые фоновые сервисы (загрузка из сети обновлений или контента приложения, сложные расчеты и т.д.) целесообразно отключать или снижать частоту их запуска при низком уровне заряда батареи. Для подобных действий важно принимать во внимание несколько факторов, как, например, текущее состояние зарядки устройства, наличие подключенной док-станции или наличие соединения с сетью. Ниже представлены способы получения этих значений и мониторинга их изменений.
            Читать дальше →
          • Новый курс по разработке под Windows Phone, обновление центра Windows Phone и все-все-все …



              Каждый раз, когда я собираюсь писать статью, особенно если она часть курса, я пытаюсь понять, кому она будет нужна и как её будут использовать. И когда коллеги предложили мне взяться за написание небольшого вводного курса по разработке под Windows Phone, первое, что я сделал, я просмотрел все доступные материалы претендующие на роль обучающего курса или книги. Несмотря на то, что платформа Windows Phone достаточно молодая, материалов по ней, как русскоязычных так и англоязычных великое множество.
              Читать дальше →
            • Малоизвестные особенности Java. Вторая часть

                Как и обещал, предлагаю вашему вниманию следующие пять пунктов.

                Малоизвестные особенности Java. Первая часть

                6. Конфликт имён.

                Если импортированы несколько классов с одним и тем же именем из разных пакетов, возникает конфликт имён. В таком случае при обращении к классу следует указывать его квалифицированное имя, то есть полное имя, включая и имя пакета, например java.lang.String.

                Неужели ничего нельзя с этим поделать? Оказывается можно. Следующий код скомпилируется без проблем, несмотря на то, что класс List присутствует и в пакете java.awt, и в пакете java.util:

                import java.awt.*;
                import java.util.*;
                import java.util.List;
                
                public class Класс {
                	public static void main(String... аргументы) {
                		List простоСписок = Collections.emptyList();
                		System.out.println(простоСписок);
                	}
                }


                Достаточно дополнительно импортировать необходимый класс, java.util.List в данном примере.

                Тут, как вы заметили, используются кириллические идентификаторы. Да! Для кого-то это станет откровением, но Java… такая Java. Идентификатор может состоять из совершенно любых букв, помимо цифр, знаков подчёркивания и валюты США (однако последний знак ($) использовать не рекомендуется, он предназначен для системных нужд). Но оно нам надо? Разве только в целях обфускации. Только представьте себе, сколько разных идентификаторов можно сгенерировать всего-то из символов «А» английского, русского и греческого алфавитов…

                Читать дальше →
              • Малоизвестные особенности Java

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

                Вот уже подоспела и вторая часть статьи.


                1. Нестатические блоки инициализации.

                Всем, я думаю, известно, что в Java существуют статические блоки инициализации (class initializers), код которых выполняется при первой загрузке класса.

                class Foo {
                	static List<Character> abc;
                	static {
                		abc = new LinkedList<Character>();
                		for (char c = 'A'; c <= 'Z'; ++c) {
                			abc.add( c );
                		}
                	}
                }


                Но существуют также и нестатические блоки инициализации (instance initializers). Они позволяют проводить инициализацию объектов вне зависимости от того, какой конструктор был вызван или, например, вести журналирование:

                class Bar {
                	{
                		System.out.println("Bar: новый экземпляр");
                	}
                }


                Такой метод инициализации весьма полезен для анонимных внутренних классов, которые конструкторов иметь не могут. Кроме того, вопреки ограничению синтаксиса Java, используя их, мы можем элегантно инициализировать коллекцию:

                Map<String, String> map = new HashMap<String, String>() {{
                	put("паук",  "арахнид");
                	put("птица", "архозавр");
                	put("кит",   "зверь");
                }};


                Очень даже мощное средство, не находите?

                JFrame frame = new JFrame() {{
                	add(new JPanel() {{
                		add(new JLabel("Хабрахабр?") {{
                			setBackground(Color.BLACK);
                			setForeground(Color.WHITE);
                		}});
                
                		add(new JButton("Торт!") {{
                			addActionListener(new ActionListener() {
                				public void actionPerformed(ActionEvent event) {
                					System.out.println("Хабрахабр - торт!");
                				}
                			});
                		}});
                	}});
                }};


                Остальные четыре пункта под катом.
                Читать дальше →
              • 31 метод эффективного программирования под Android

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

                Читать дальше →
              • Маленькие хитрости Java. Часть 2

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

                  Buffered Streams

                  //медленно
                  InputStream is = new FileInputStream(file);
                  int val;
                  while ((val = is.read()) != -1) {
                  }
                  //быстро
                  InputStream is = new BufferedInputStream(new FileInputStream(file));
                  int val;
                  while ((val = is.read()) != -1) {
                  }
                  

                  Казалось бы — очевидная истина, неправда ли? Но как показал чужой код и опыт собеседования кандидатов, часть разработчиков определенно не понимает в чем преимущество буферизованных стримов. Кто до сих пор не разобрался — метод read() класса FileInputStream:
                  public native int read() throws IOException;
                  

                  Согласитесь, каждый раз делать системный вызов, чтобы считать один байт несколько расточительно. Собственно для того, чтобы избежать этой проблемы и были созданы оболочки-буферы. Все что они делают — при первом вызове системного read() считывают несколько больше (в зависимости от указанного размера буфера, котрый по умолчанию равен 8 кб) и при следующем вызове read() считывают данные уже из буфера. Прирост производительности — на порядок. Системные вызовы, на самом деле, это не всегда плохо, например:
                  System.arraycopy(src, srcPos, dest, destPos, length);

                  В случае копированния массива — системный метод будет гораздо быстрей реализованного на java. И еще — считывайте данные порциями, а не по байтам, это тоже позволит прилично сэкономить.
                  Читать дальше →
                • Маленькие хитрости Java

                  Я уже достаточно много лет занимаюсь разработкой на java и повидал довольно много чужого кода. Как это не странно, но постоянно от одного проекта к другому я вижу одни и те же проблемы. Этот топик — попытка ликбеза в наиболее часто используемых конструкциях языка. Часть описанного — это довольно банальные вещи, тем не менее, как показывает мой опыт, все эти банальности до сих пор актуальны. Надеюсь, статья пригодится многим java программистам. Итак, поехали:

                  new vs valueOf

                  //медленно
                  Integer i = new Integer(100);
                  Long l = new Long(100);
                  String s = new String("A");
                  
                  //быстро
                  Integer i = Integer.valueOf(100);
                  Long l = 100L;//это тоже самое что Long.valueOf(100L);
                  String s = "A";


                  Старайтесь всегда использовать метод valueOf вместо конструктора в стандартных классах оболочках примитивных типов, кроме случаев, когда вам нужно конкретно выделить память под новое значение. Это связано с тем, что все они, кроме чисел с плавающей точкой, от Byte до Long имеют кеш. По умолчанию этот кеш содержит значения от -128 до 127. Следовательно, если ваше значение попадает в этот диапазон, то значение вернется из кеша. Значение из кеша достается в 3.5 раза быстрее чем при использовании конструктора + экономия памяти. Помимо этого, наиболее часто используемые значения могут также быть закэшированы компилятором и виртуальной машиной. В случае, если ваше приложение очень часто использует целые типы, можно увеличить кеш для Integer через системное свойство «java.lang.Integer.IntegerCache.high», а так же через параметр виртуальной машины -XX:AutoBoxCacheMax=<size>.
                  Читать дальше →
                • Установка приложений Google в эмулятор Android



                    В этой статье описано как установить дополнительные программы (в частности, Google Apps) в эмулятор Android. Это может понадобиться если вы хотите на эмуляторе:
                    1. Настроить синхронизацию с аккаунтом Google.
                    2. Установить календарь и календарь провайдер.
                    3. Установить Android Market.
                    4. И прочее…

                    Читать дальше →
                  • Хабраиндекс для статей по программированию под Android

                      С чего начать?


                      Пишем своё первое приложение на Android
                      Пишем первое приложение для Android
                      Создаем файловый менеджер
                      Основы программирования под Android на примере игры Судоку
                      Создание приложения в стиле Android
                      Спокойной ночи!

                      Читать дальше →
                      • +188
                      • 92.9k
                      • 43