Архив метки: job

NullPointerException и null в Java 8

Есть объекты:

class Outer {
Nested nested;
Nested getNested() {
return nested;
}
}
class Nested {
Inner inner;
Inner getInner() {
return inner;
}
}
class Inner {
String foo;
String getFoo() {
return foo;
}
}

Есть примитивная проверка:

Outer outer = new Outer();
if (outer != null && outer.nested != null && outer.nested.inner != null) {
System.out.println(outer.nested.inner.foo);
}

Есть новые возможности Java 8:

Optional.of(new Outer())
.map(Outer::getNested)
.map(Nested::getInner)
.map(Inner::getFoo)
.ifPresent(System.out::println);

или (эксепшен будет заменен Optional.empty())

Outer obj = new Outer();
resolve(() -> obj.getNested().getInner().getFoo());
.ifPresent(System.out::println);

Жизненное

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

С некоторых пор в разработке у меня новый инструмент. Считайте, чистого опыта у меня на этом языке всего полгода. Да, есть многолетний бэкграунд с использованием другого стэка технологий, не лох в какой-то степень и в общей computer science, но вот чисто нового — всего полгода. А на собеседования приходят люди с 10 годам работы в банковских структурах или в компаниях интеграторах-разработчиках банковского ПО, что-нибудь в этом плане. И я вынужден их собеседовать, поняв, что им интересно, на что они способны, что мы друг другу можем дать. При этом я сам не интервью не должен выглядеть некомпетентным, как вы понимаете.

Все это часто выглядит забавно. Да, когда приходит неподходящий кандидат, все традиционно. Но когда появляется достойный, с существенном более солидным опытом, тут мне часто становится неловко. Не то, чтобы я не мог понять, что он говорит. Зачастую мне кажется, что я сам формулирую вопрос или ответ на его вопрос так, что это может показаться с позиции человека напротив глупым. Ну а как иначе? Я не гений, не всезнайка.

Преобразовать IP адрес в целое число на PHP

Рассмотрим IP адрес версии 4. Он состоит из 4х октетов, 4 чисел, каждое из которых может быть от 0 до 255. По сути, каждое число имеет тип byte, состоит из 8 битов.

В интернете множество вариантов, как сделать конвертацию (1, 2). Наиболее наглядно, на мой взгляд, рассмотрели проблему здесь.

Сюда же я приведу свой вариант, реализованный на уровне бинарной обработки чисел. Кажется, он как обычно быстрее, чем все это варианты с перемножением и возведением в степень. Стоит упомянуть, что и в PHP, и в СУБД есть средства для конвертации IP в числе и обратно, так что данный пост имеет чисто академический смысл.


$ip = '70.112.108.147';
$arr = explode('.', $ip);

// для наглядности, что получается после смещений
echo decbin($arr[0]<<24) . "\n"; // 24 - это 3 блока по 8 нулей echo decbin($arr[1]<<16) . "\n"; // 16 - это 2 блока по 8 нулей echo decbin($arr[2]<<8) . "\n"; // 8 - это 1 блок по 8 нулей echo decbin($arr[3]) . "\n"; // оставляем как есть // теперь просто склеим все значения. Не просоммируем, а именно применим операцию OR, что-то вроде конкатенации $ipInt = $arr[0]<<24 | $arr[1]<<16 | $arr[2]<<8 | $arr[3]; var_dump($ipInt);

Округление числа в меньшую сторону на PHP

Есть задача округлять дробные положительные числа в меньшую сторону. 2 знака после запятой. В результате:
2.03000 -> 2.03
2.267777 -> 2.26

Используя стандартные средства и из-за особенностей обработки чисел с плавающей точкой в компьютере и PHP в частности получаем такие странные результаты:
php > echo floor(2.26 * 100) / 100;
2.25
php > echo round(2.03600, 2, PHP_ROUND_HALF_DOWN);
2.04

Без использования сторонних библиотек кажется, что единственный и самый простой способ выполнить такую задачу — через преобразования в строку:
// результат = взять целую часть от умножения, удалить последний символ, поделить на 100
$valueArray = explode('.', $value * 1000);
$value = substr(array_shift($valueArray), 0, -1) / 100;

Когда что-то не получается

Очень не люблю, когда что-то не получается. Еще больше, когда не получается сделать что-то самому. Как сегодня пытался на основе форм в Symfony2 фреймворке создать необходимую по структуре форму редактирования всего одной таблички в БД, но которая в свою очередь еще слинкована напрямую или через посредников еще с 4-ми, а сама форма редактирования выглядит как сводная таблица в Экселе (это, кажется, и есть самая большая проблема).

И я не смог этого сделать. Перекопал документацию, перегуглил (хотя на такую тему материалов почти нет), но так и не понял, как это сделать без "костылей".

Подобную форму простым способом нарисовать в HTML, запостить и сохранить в БД сделал бы за пару часов, но тут нужно было "по-красивому", в концепции всей системы.

Это очень расстроило. Не часто у меня бывают такие обломы. Но, может, сделать скидку на то, что на Symfony2 я всего пару форм "правильных" сделал за карьеру.

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

В любом случае, появился повод опубликовать свой первый, кажется, вопрос на StackOverflow. Надеюсь, не заминусуют, может я прост упустил какую-то прописную истину и копаю где-то совсем в другом месте.