Около года назад, в подкасте радио-т я впервые услышал о инициативе JetBrains, новом языке программирования kotlin. С тех пор внимательно слежу за его развитием.
Они позиционируют котлин как "better java" и, надо сказать, у это получается. Это статический типизированный, язык со вшитой nullable-проверкой Так же он поддерживает функции высшего порядка(замыкания), extension functions и trait. Может немного напоминать scala - но, достаточно далеко от неё.
Coding
Programming and everything around
Разработка: разница обучения на курсах и самостоятельно
Решили начать карьеру программиста?
С чего начать?
На какие курсы пойти?
Пришлось задуматься, чем отличаются люди, которые посещали обычные оффлайн курсы и те, которые учились самостоятельно
nodejs: Отправка файла REST-запросом
Отправка файла и полей с данными как REST запрос из nodejs сервера на coffeescript
По началу кажется простой задачей - на stackoverflow активно рекомендуют модуль request, он правда классный. Гнётся во все стороны.. но..
- На сайте есть пример как отправить файл, но не бинарный, а текстовый. И почему то если натравить запрос с таким "файлом" опять же ноде(другому серверу) он не видится как файл
- Гуглить любые проблемы связанные с модулем крайне затруднительно - автор решил не задумываться и дал незамысловатое название, благодаря чему гуглится все, что угодно, только не то нужно.
Play Framework: локализация Date.since()
Play framework позволяет в шаблонах groovy использовать extension functions - т.е прицеплять методы на ходу к объектам.
В частности в play имеет расширение экземпляров класса Date - since(), который возвращает сколько времени прошло от указанной даты. Например "13 minutes ago"
С since() все хорошо, пока не требуется интернационализация. Если переопределить соответствующие ключи в файлах перевода, то для русского он возвращает нечто вроде 3 дняs назад. Другими словами этот метод не может отображать количество пройденного времени на любом языке, кроме английского.
HTC Desire: съел всё место
Внезапно, у меня опять кончилось место в телефоне.
Пошёл по известной дорожке:
- Удалить старые приложения
- Почистить кэш (твиттера, например)
- Recorvery -> Wipe dalvik cache
Но в этот раз не помогло. Снёс кучу нечасто используемых приложений: через 30 минут снова стало свободно 0.5Mb.
Место кончилось на столько, что даже телефон не открывался, как и многие приложения.
Стандартная утилита не показывала каких-либо сверх-тяжелого софта (я рассчитывал где-то на 40+мб)
Напомню, что у меня HTC Desire с Runnymede AIO V6.0.4.3, прошивка стоит около 14 месяцев
Android: не используйте String.isEmpty
Ни eclipse ни intellj Idea ни android lint не предупреждают, что String.isEmpty() появился в Java 6, и после Android 2.3.
java.lang.NoSuchMethodError: java.lang.String.isEmpty
at pro.ezway.carmonitor.entity.TroubleCode.hasTitle(TroubleCode.java:142)
at pro.ezway.carmonitor.ui.fragments.TroubleCodesFragment$TroubleCodesAdapter.getView(TroubleCodesFragment.java:242)
at android.widget.AbsListView.obtainView(AbsListView.java:1315)
at android.widget.ListView.makeAndAddView(ListView.java:1727)
Android: запуск дефолтного ланчера
Есть неочевидная ситуация: вы пишете лаунчер лончер или что-то его заменяющее, отдебажили, всё работало. Конечно же, вы поставили его как програму по умолчанию и теперь он стартует вместо дефолтого. И вдруг, вылезает некая бага, которая начинает крушить, бомбить ронять телефон, перезапуская приложение. Перезапустится, конечно же, то, что упало, а упал лончер. И он снова падает. Development mode в продакшене отключён. Ну вы поняли.
На самом деле бывают ситуации ещё хуже, например, для vendor lock-in приложений, которые вообще скрывают, что они работают под андроид.
Предвкушая первую мысль как вернуть дефолтный лончер: вызвать в приложении finish(). Чёрт, это же домашний экран %)
Groovy: java слишком проста
Возьмём довольно частую задачку: есть несколько значений первой переменной, нужно сделать присвоить второй переменной какое-то значение, в зависимости от первой переменной, т.е. value mapping.
В джаве это делается примерно так:
String alertClass = "";
switch(code.toUpperCase().charAt(0)) {
case 'U':
alertClass = "alert";
break;
case 'P':
alertClass = "alert-error";
break;
case 'B':
alertClass = "alert-warning";
break;
case 'C':
alertClass = "alert-info";
break;
}
// now alertClass has value
Android: отложенное действие
Бывает необходиость выполнить что-то не сразу, а чуть позже в главном(main) потоке для GUI
Этот код поможет(на время разработки)
public class AwesomeActivity extends WorkspaceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
. . .
new Handler() {{
postDelayed(new Runnable() {
@Override
public void run() {
// do something here
hideShutter();
}
}, 1500);
}};
}
}
Play framework: SELECT .. IN
Наткнулся на очередную невозможность сделать казалось бы простые вещи: выполнить запрос SELECT .. WHERE something In list
т.е. выбрать все записи, в которых поле something равно чему то из списка list.
Обойти можно через JPA:
@Entity
@Table(name="ezTroubleCode")
public class TroubleCode extends Model {
@Index(name = "IDXcode")
@Column(nullable=false, length=5)
public String code;
. . .
/**
* Search for codes by codeId
*/
public static List<troublecode> findByCode(List<string> codes) {
Query q = JPA.em().createQuery("SELECT tc FROM TroubleCode tc WHERE code IN (:codes)");
q.setParameter("codes", codes);
return q.getResultList();
}
}
</string></troublecode>