Pull to refresh
34
0
Гарбуз Иван @garbuzivan

PHP backend

Send message

Малоизвестные особенности Java

Reading time4 min
Views140K
Готовясь к собеседованию, я решил освежить память да и вообще поискать каверзные и малоизвестные нюансы языка 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("Хабрахабр - торт!");
				}
			});
		}});
	}});
}};


Остальные четыре пункта под катом.
Читать дальше →
Total votes 163: ↑150 and ↓13+137
Comments75

JavaScript паттерны… для чайников

Reading time8 min
Views181K
Однажды вечером, сразу после того, как я закончил разбираться с наследованием в JS, мне пришла в голову идея, что пора бы заняться чем-нибудь посложнее — например паттернами. На столе внезапно оказалась книжка Gof, а на экране ноутбука появился труд с названием «JavaScript patterns».

В общем, спустя пару вечеров, у меня появились описания и реализации на JavaScriptе самых основных паттернов — Decorator, Observer, Factory, Mediator, Memoization (не совсем паттерн, а скорее техника, но мне кажется что она прекрасно в этот ряд вписывается) и Singleton.

Читать дальше →
Total votes 118: ↑108 and ↓10+98
Comments46

Hifidiy A20. Собираем усилитель мощности

Reading time4 min
Views127K

*Местами используются стоковые фото, по причине отсутствия своих в надлежащем качестве. Осторожно! На фото присутствует ковер, коврофобам не смотреть :) Очень много больших фото, трафик!

Приветствую! Как и обещал, расскажу о том как я мощник для акустики собирал. Так как промышленные варианты меня не устраивали, я нацелил свой выбор на diy варианты. Усилитель будет использоваться с полочной высокочувствительной акустикой, я решил что буду собирать усилитель мощностью 15-30 ватт, обязательно в A классе ( Да, да, вместо обогревателя ). Перебрал очень много проектов, остановился на клоне Krell KSA 50 — HifiDIY A20. Он полностью меня устроил, мощностью, габаритами, комплектующими. И я принялся за сборку.

Читать дальше →
Total votes 98: ↑94 and ↓4+90
Comments72

Как работает yield

Reading time6 min
Views665K
На StackOverflow часто задают вопросы, подробно освещённые в документации. Ценность их в том, что на некоторые из них кто-нибудь даёт ответ, обладающий гораздо большей степенью ясности и наглядности, чем может себе позволить документация. Этот — один из них.

Вот исходный вопрос:
Как используется ключевое слово yield в Python? Что оно делает?

Например, я пытаюсь понять этот код (**):
def _get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild

Вызывается он так:
result, candidates = list(), [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
        candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
        return result


Что происходит при вызове метода _get_child_candidates? Возвращается список, какой-то элемент? Вызывается ли он снова? Когда последующие вызовы прекращаются?

** Код принадлежит Jochen Schulz (jrschulz), который написал отличную Python-библиотеку для метрических пространств. Вот ссылка на исходники: http://well-adjusted.de/~jrschulz/mspace/

Подробный и обстоятельный ответ
Total votes 141: ↑136 and ↓5+131
Comments41

Полупроводниковые приборы — диод

Reading time3 min
Views81K
полупроводниковые приборы

Введение

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

Читать дальше →
Total votes 135: ↑108 and ↓27+81
Comments47

Типичные случаи утечки памяти в Java

Reading time4 min
Views74K
Большинству разработчиков известно, что сборщик мусора в Java не является универсальным механизмом, позволяющим программисту полностью забыть о правилах использования памяти и о том, в каких случаях осуществляется его работа. Ниже описаны типичные случаи утечки памяти в java-приложениях, встречающиеся повсеместно.
Итак, о чём должен помнить каждый java-программист.
Читать дальше →
Total votes 113: ↑104 and ↓9+95
Comments80

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

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

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. И еще — считывайте данные порциями, а не по байтам, это тоже позволит прилично сэкономить.
Читать дальше →
Total votes 93: ↑84 and ↓9+75
Comments91

Дырка большого диаметра в Microsoft Windows

Reading time1 min
Views7.2K
Выполнение произвольного кода путём посылки специально сконструированного потока UDP-пакетов на закрытый порт.

Подвержены все 32 и 64 битные версии:
* Windows 7
* Windows Vista
* Server 2008 (в т.ч. R2)

Подробнее здесь: technet.microsoft.com/en-us/security/bulletin/ms11-083
Total votes 191: ↑175 and ↓16+159
Comments119

Стековые переменные — быстрые и иногда мертвые

Reading time4 min
Views26K
FAILПрограммы на C++ используют под локальные и временные переменные так называемую автоматическую память (automatic storage). Обычно автоматическая память реализована поверх стека программы, поэтому ее называют стековой. Ее большой плюс – выделение и освобождение памяти выполняется крайне быстро (обычно одна инструкция процессора). Ее большой минус – относительно небольшой объем, попытка выделить память сверх этого объема приводит к так называемому переполнению стека и тогда программа аварийно останавливается.

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

Читать дальше →
Total votes 43: ↑40 and ↓3+37
Comments15

Маленькие хитрости Java

Reading time4 min
Views270K
Я уже достаточно много лет занимаюсь разработкой на 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>.
Читать дальше →
Total votes 141: ↑126 and ↓15+111
Comments166

Почему ИТшнику стоит стать ИПшником и почему не стоит регистрировать ООО

Reading time7 min
Views86K
В этой статье даются ответы на нижеследующие вопросы, основываясь на личном опыте и опыте коллег.

1. Почему стоит начать работать «в белую»
2. Почему на начальном этапе ИП лучше ООО
3. Что делать, если партнёров несколько

Если вы – начинающий или уже опытный фрилансер и подумываете о работе «в белую», но ещё точно не определились с вопросами «Стоит ли оно того?» и «ИП или ООО?», вэлком
под кат
Total votes 370: ↑360 and ↓10+350
Comments183

Создаем анимированные кнопки при помощи CSS3

Reading time11 min
Views56K


В данной статье я хочу поделиться с вами некоторыми экспериментами по созданию анимированных кнопок при помощи CSS3. Идея заключается в создании анимированных ссылок с разными стилями, hover-эффектами и пр.

В данных примерах используются иконки с webiconset.com, а также шрифт от Just Be Nice.

Мы рассмотрим каждый пример и разберем как выглядит их HTML-структура и стили для разных состояний кнопок.

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

Чтобы не захламлять код в уроке я не буду использовать префиксы для различных браузеров. Их вы сможете увидеть в архиве с примерами.
Читать дальше →
Total votes 215: ↑207 and ↓8+199
Comments40

Картина и гвозди

Reading time1 min
Views5.9K
Имеется картина, к которой двумя концами привязана длинная веревка. Требуется повесить её на N вбитых в стену гвоздей так, чтобы при вытаскивании из стены одного любого гвоздя картина и веревка падали.

Веревка имеет пренебрежимо малую толщину, не рвётся и нерастяжима, гвозди не гнутся и перпендикулярны стене, трения нет. Одним словом, задача решается без всяких хитростей и уловок.
Читать дальше →
Total votes 52: ↑50 and ↓2+48
Comments151

Список ресурсов для изучения Ассемблера

Reading time4 min
Views434K
Доброго времени суток!
Некоторым программистам иногда приходит в голову мысль «а не изучить ли мне ассемблер?». Ведь на нем пишут самые (с некоторыми оговорками) маленькие и быстрые программы, да и охота ощутить вкус низкоуровневого программирования берет свое. Ну и для общего развития не повредит.
Мысль эта не обошла стороной и меня. Вдохновившись историей одного байта, я ринулся в бой…

… но оказалось, что найти материал по интересующей теме не так просто, как хотелось бы. Посему решено было создать на хабре пополняющийся пост-индекс статей/книг/мануалов/etc. об этом, несомненно, великом языке.
Под катом находится, собственно, список с краткими комментариями, разбитый по категориям.

UPD
В список начали добавляться ресурсы по программингу микроконтроллеров.
Читать дальше →
Total votes 135: ↑130 and ↓5+125
Comments46

Хочется взять и расстрелять, или ликбез о том, почему не стоит использовать make install

Reading time5 min
Views170K
К написанию сей заметки меня сподвигло то, что я устал делать развёрнутые замечания на эту тему в комментариях к статьям, где в качестве части инструкции по сборке и настройке чего-либо для конкретного дистра предлагают выполнить make install.
Суть сводится к тому, что эту команду в виде «make install» или «sudo make install» использовать в современных дистрибутивах нельзя.

Но ведь авторы программ в руководствах по установке пишут, что нужно использовать эту команду, возможно, скажете вы. Да, пишут. Но это лишь означает, что они не знают, какой у вас дистрибутив, и дистрибутив ли это вообще, может, вы вступили в секту и обкурилисьчитались LFS и теперь решили под свою хтоническую систему скомпилять их творение. А make install является универсальным, хоть и зачастую неправильным способом это сделать.

Читать дальше →
Total votes 385: ↑339 and ↓46+293
Comments185

Изучаем английский с Anki

Reading time1 min
Views214K
Anki — это программа для запоминания иностранных слов. Список её преимуществ перед аналогами впечатляет! Судите сами:
  • Широкие возможности по настройке вида карточек
  • Поддержка мультимедиа
  • Большое количество плагинов
  • Настройка алгоритма обучения
  • Подробная статистика
  • Поддержка большинства современных платформ (Linux, Windows, Mac, iPhone, Android, список можно продолжить!)
  • Синхронизация данных

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



Официальный сайт — ichi2.net/anki
Программу можно найти в Центре приложений Ubuntu.
Total votes 80: ↑74 and ↓6+68
Comments63

Английский для айтишника? Легко!

Reading time2 min
Views180K
Эта тема не относится к IT напрямую, но все знают, что без нее никуда. К сожалению, далеко не у всех есть возможность изучать английский с преподавателями. Ну что ж, попробуем заняться этим дома и с максимальной отдачей!
Читать дальше →
Total votes 165: ↑137 and ↓28+109
Comments187

Хабра-информер v.0.1

Reading time1 min
Views999
image Совсем недавно я начал работу над хабра-информерорм, для того, чтоб удобно следить за обновлениями на сайте и не отвлекаться лишний раз.
Был проведен ряд работ, в которых было реализовано:
— 3 потока (мониторинг за новыми статьями, за песочницей и за QA).
— Исправлен ряд ошибок.
— Теперь скрипт сразу выводит заголовок, количество комментариев и кто оставил топик.

Скачать

Скачать приложение для Windows (В архив запакованы библиотеки зависимости)
Скачать приложение для Linux (скомпилированный бинарник)
Скачать приложение для MAC OS X — (Компилировал AcidSlayer)
Build for OS X 10.6+ — (Компилировал Amka)
ARCH LINUX — (Организовал Alexandr Baev) или #yaourt -S habratray
Скачать исходники

Читать дальше →
Total votes 76: ↑61 and ↓15+46
Comments58

Получаем изображение с оптического сенсора комьютерной мыши с помощью Arduino

Reading time3 min
Views233K
КПДВ, 111.3 KB

Для решения одной из задач мне потребовалось программно получать и обрабатывать изображения небольшого участка поверхности бумаги с очень близкого расстояния. Не получив достойного качества при использовании обычной USB камеры и уже на пол пути в магазин за электронным микроскопом, я вспомнил одну из лекций, на которой нам рассказывали как устроены различные девайсы, в том числе и компьютерная мышка.
Читать дальше →
Total votes 379: ↑377 and ↓2+375
Comments116

Information

Rating
Does not participate
Location
Алушта, Республика Крым, Россия
Date of birth
Registered
Activity