вторник, 19 ноября 2013 г.

Релиз OpenSUSE 13.1

Сегодня вышел новый релиз популярного дистрибутива OpenSUSE 13.1.

Интересные нововведения:



  • Linux 3.11
  • GCC 4.8
  • обновлен systemd
  • X Server 1.14.0
  • GStreamer 1.0
  • KDE 4.11
  • GNOME 3.10

Более подробно о новшествах релиза под катом.


понедельник, 12 августа 2013 г.

Установка Quake 3 Arena в Linux

Скорее всего это я тормоз, но вдруг кто не знает. Всеми горячо любимую Quake 3 Arena можно установить в Linux без всякого wine.

Для этого с сайта http://ioquake3.org/get-it/ качаем Engine и Data installer. Запускаем их по очереди с рутовыми правами:

sh ioquake3-1.36-7.1.x86_64.run
sh ioquake3-q3a-1.32-9.run


После этого копируем из виндовой версии игры (можно взять, например, тут: http://oldgames.ru/game/731.html) файл pak0.pk3, который лежит в папке baseq3, в /usr/local/games/quake3/baseq3.

Теперь запускаем /usr/local/bin/ioquake3 и наслаждаемся.

P.S.: С размерами окна все не очень радужно, на фулскрин у меня запустилось только в первый раз, но если поиграть с настройками разрешения, то можно подогнать почти в фулскрин)

10 причин почему ваш проект должен использовать Dojo Toolkit

Dojo Toolkit это одновременно самый мощный и наименее используемый JavaScript фреймворк. В то время, как почти каждый JavaScript фреймворк или тулкит обещает сделать все на свете и даже больше, Dojo Toolkit предоставляет наиболее убедительные аргументы в доказательство своей функциональности. В этом посте будут описаны многие важные возможности Dojo Toolkit, а также будет рассказано, почему вы должны использовать его в своем следующем проекте.

четверг, 20 июня 2013 г.

Быстрое переключение на любой рабочий стол

Одним из новшеств GNOME Shell стало динамическое создание рабочих столов. Теперь их количество ограничено только вашими потребностями, а в силу принципа "одно приложение - один рабочий стол" при активной работе воркспейсов становится много (например, сейчас на рабочем компе у меня их 7) и переключатся между ними с помощью комбинации Ctrl+Alt+Arrow становится сложно. По умолчанию, мы можем задать хоткеи для 4 рабочих столов. Под катом я расскажу как задать хоткеи для произвольного числа рабочих столов.

понедельник, 3 июня 2013 г.

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

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

У меня три основных электронных способа связи с внешним миром:
  • Skype
  • ICQ
  • VK
В данной статье я хочу рассказать как связать все контакты и переписку из этих трех способом связи в одном приложении. Таким приложением выступит замечательный клиент Pidgin.


четверг, 16 мая 2013 г.

Головоломный JavaScript


Головоломный JavaScript

Время от времени в сети мне попадаются различные WTF примеры на JavaScript. Часто на первый взгляд они выглядят безумно, но на самом деле просты и логичны, поэтому я решил попробовать их собирать и разбирать. Кроме очевидного профита в виде более глубого понимаю языка это еще и отличные вопросы для собеседований)

Чтобы было интереснее я буду прятать ответ и решение под спойлер.

1. Так что помните, дети, всегда подставляем системы счисления!

Для начала простой, но прикольной пример. Что вернут такие вызовы parseInt?

parseInt('fuck');
parseInt('fuck', 16);
Узнать ответ
parseInt('fuck');     // NaN
parseInt('fuck', 16); // 15

Как работает parseInt: он посимвольно проверяет переданную строку на соответствие указанной вторым аргументом системе счисления и если находит некорректный символ, то завершает работу. По умолчанию, система счисления считается десятичной, при условии, что переданная строка не начинается с 0. В десятичной системе счисления символ ‘f’ недопустим и функция заканчивается свою работу не найдя ни одной цифры. А вот в шестнадцатиричной системе символ ‘f’ допустим и соответствует десятичному числу 15. Символ ‘u’ не допустим и функция завершает свою работу.


2. Может кто подскажет?

Чему равно такое выражение?

"Why am I a " + typeof + "";
Узнать ответ

“Who am I a number”

Оператор “+” обладает большим приоритетом чем “typeof”, поэтому указанная запись эквивалентна следующей:

“Why am I a ” + (typeof (+ “”)).

Унарный “+”” выполняет привидение к числу, поэтому “typeof” от результата его выполнения - это number.


3. Кто больше?

Ну и кто больше?

[1, 2, 4]         <  [1, 2, 5]
[1, 2, 'd']       <  [1, 2, 5]
[1, 2, ['d', 5]]  <  [1, 2, [20, 5]]
[1, 2, 5]         == [1, 2, 5]
[1, 2, 5]         <= [1, 2, 5]
[1, 2, 5]         >= [1, 2, 5]
Узнать ответ
[1, 2, 4]         <  [1, 2, 5]        //true
[1, 2, 'd']       <  [1, 2, 5]        //false
[1, 2, ['d', 5]]  <  [1, 2, [20, 5]]  //false
[1, 2, 5]         == [1, 2, 5]        //true
[1, 2, 5]         <= [1, 2, 5]        //true
[1, 2, 5]         >= [1, 2, 5]        //true

Согласно спецификации ECMAScript 5 для выполнения операции сравнения аргументы, которые не являются примитивами, должны быть привидены к примитивам (если кому интересно, то пункт 11.8.5 “Алгоритм сравнения абстрактного отношения”). Сначала JavaScript пробует преобразовать аргумент к числу с помощью метода valueOf и только когда это не удается приводит к строковому типу (изначально я хотел написать здесь про естественность сравнения чисел, и что когда мы говорим, что слово А больше слова Б, то имеем в виду длину. Но из беседы с коллегой выяснилось, что это не правда. Когда мы сравнимаем два слова мы инстанцируем связанные с ними образы и сравнимаем их. И только если образов не нашлось, то сравниваем слова не как метки образов, а именно как набор букв). Для массивов метод valueOf не определен и поэтому они сравниваются как строки:

"1,2,4" < "1,2,5" //true
"1,2,d" < "1,2,5" //false

Но все вышесказаное верно только для операций сравнения. В случае оператора “==”” привидение к примтивам осуществляется только если один из аргументов примитив, а во всех остальных случаях оператор “==” возвращает true только если оба аргумента ссылаются на один объект (пункт 11.9.3 “Алгоритм сравнения абстрактного равенства”), что в нашем случае не так.

Следует заметить, что для объектов сравнение работать не будет, т.к. их дефолтный toString возвращает [object Object].

Ладно, объекты сравнивать нельзя, но почему бы не проверять массивы на равенство с помощью сравнения? Все пишут циклы, а ведь можно обойтись одной строкой:

!(arr1 < arr2)&&!(arr1 > arr2)

Что-то подсказывает, что постоянные игры с привидением типов должны очень сильно отъедать время и ресурсы. Сделаем небольшой наколеночный тест:

var arr1 = [],
    arr2 = [],
    res,
    start,
    end,
    len = 600000;

for(var i=0; i<len; i++){
    arr1[i] = i;
    arr2[i] = i;
   // if(i == len-100) arr2[i] = i+1; //чтобы делать не равные массивы
}

//проверим, что массивы создались
console.log(arr1.length, arr2.length);

//наш метода
start = new Date();

res = !(arr1 < arr2)&&!(arr1 > arr2);

end = new Date();

console.log(end.getTime() - start.getTime(), res);

//классический циклический
start = new Date();

for(var i=0; i<len; i++)
    res &= (arr1[i] === arr2[i]);

end = new Date();

console.log(end.getTime() - start.getTime());

Разница поражает: 123мс на 2015мс в пользу привидения типов!

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


понедельник, 22 апреля 2013 г.

IE10 и input

 Из серии "Заметки на полях", вдруг кому пригодится.

Верстка не моя сильная сторона, но на меня свалилась бага в IE10, решения которой в рунете не нашлось. Спешу поделится очередными хаками для очередного IE.

Компания из Редмонда опять пошла своим путем и вместо улучшения рендеринга добавила новые прибамбасы в input. Теперь они сами дорисовывают input-ам кнопки очистки поля (Clearing Text):


и кнопку показа пароля (Verifying Password):



К счастью MSDN сам же рассказывает как это выключить:

sel::-ms-clear {
    display: none;
}

и

sel::-ms-reveal {
    display: none;
}

где sel - это селектор нужного элемента, т.е. по хорошему это просто input.

P.S.: в добавок ко всему данная "фича" воспроизводится не во всех IE10 и прямой зависимости от точной версии и номера билда не обнаружено.