LE Blog

Инженер с поэтической душой

09.04.2010 firtree_right Злободневно

Только ленивый не высказался сегодня про свинью, которую Apple подложил Adobe'у, внеся в лицензионное соглашение пункт, делающий бесполезной новую разработку Adobe во Flash CS5. Я никогда не разрабатывал под iPhone и, к счастью iРазработчиков, вряд ли буду. :) Фанаты Apple возрадуются, что толпы флэшеров не ринутся на их телефончики. Мой же взгляд давно направлен в сторону Android, и, наконец, я знаю, какой аппарат я куплю, когда он выйдет.

Самое интересное во всём этом — находится в будущем. Учитывая нынешнюю скорость развития технологий, это будущее не так далеко. Речь идёт о стратегических последствиях принятых решений. Стоит, к примеру, упомянуть историю конкуренции VHS и Betacam. Как открытие спецификаций сделало популярным VHS, вытеснив Betacam в сферу профессиональной видеозаписи. Меж тем, VHS уже почил, а Betacam ещё жив в своей нише. Хотя есть мнение, что наибольшее распространение получает тот формат, который выбирают производители порнографии. Возможно именно так разрешилась битва между Blu-ray и HD DVD.

Не смотря на все крики сторонников и противников, немедленных последствий для компании Apple, конечно же, не последует.

07.04.2010 firtree_right Немного о $SAFE

secure code

Введение

Совершенно не по работе заинтересовался переменной $SAFE и её ролью в жизни современного разработчика. Оказалось, что всё нужно проверять самому.

Нежная безопасность

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

print "child: "
child = gets.chomp
puts "child tainted: #{child.tainted?}"
(0..4).to_a.each do |i|
  puts "SAFE: #{i}"
  $a = "safe"
  th = Thread.new do
    $SAFE = i
    child_copy = child.dup
    Thread.current[:out] = ""

    begin
      load child_copy
      Thread.current[:out] += "1. Child loaded\n"
    rescue SecurityError => e
      Thread.current[:out] += "1. Security error: #{e.to_s}\n"
      begin
        child_copy.untaint
        load child_copy
        Thread.current[:out] += "2. Child untainted and loaded\n"
      rescue SecurityError => e
        Thread.current[:out] += "2. Security error: #{e.to_s}\n"
        begin
         Thread.current[:out] += "3. Read from file '#{child_copy}': '#{File.read(child_copy)}'\n"
        rescue SecurityError => e
          Thread.current[:out] += "3. Security error: #{e.to_s}\n"
          begin
           Thread.current[:out] += "4. Read from untainted file: '#{File.read("child.rb")}'\n"
          rescue SecurityError => e
            Thread.current[:out] += "4. Security error: #{e.to_s}\n"
          end
        end
      end
    end

    begin
      $a = "modified"
      Thread.current[:out] +=  "5. Global variable modified: $a = '#{$a}'\n"
    rescue SecurityError => e
      Thread.current[:out] += "5. Security error: #{e.to_s}\n"
    end

    begin
      Dir.mkdir "test"
      Thread.current[:out] += "6. Created directory 'test': #{File.exist?("test")}\n"
      Dir.rmdir "test"
    rescue SecurityError => e
      Thread.current[:out] += "6. Security error: #{e.to_s}\n"
    end

    begin
      Thread.current[:out] +=  "7. Dir glob: #{Dir.glob(File.join("..", "*")).inspect}\n"
    rescue SecurityError => e
      Thread.current[:out] += "7. Security error: #{e.to_s}\n"
    end

    begin
      Thread.current[:out] +=  "8. System ls output: '#{`ls`.chomp}'"
    rescue SecurityError => e
      Thread.current[:out] += "8. Security error: #{e.to_s}\n"
    end
  end
  th.join
  puts "Global variable: $a = '#{$a}'"
  puts th[:out] if th[:out]
end

Конструкция со Thread.current[:out] используется потому, что для $SAFE >= 4 нельзя ничего писать ни в какие устройства вывода.

Вроде бы всё логично. Первый уровень годится для умеренного карантина внешних данных. При желании их можно и расколдовать. Второй уровень запрещает изменения в файловой системе. Третий уровень похож на осаду с постоянным подозрением на шпионаж. Все созданные объекты считаются небезопасными. А четвёртый уровень — это самое близкое к песочнице (sandbox) в руби, что что есть.

Кстати, когда ещё github работал как репозиторий библиотек, спецификация gemspec выполнялась там под $SAFE = 3. Для разработчиков это выливалось в то, что нужно было перечислять все файлы своей библиотеки вручную вместо использования какого-нибудь листинга.

Суровый гайдлайн

Конечно же, только использование $SAFE не убережёт от действительно настойчивой атаки или блокирующего кода. Например:

Thread.new do
  $SAFE = 2
  class String
    def ==(other_string)
      true
    end
  end
end.join
puts "string modified: #{'a' == 'b'}"

И это на втором уровне! А на третьем открыть класс тоже можно, но вызов перегруженного оператора будет вызывать SecurityError.

На сегодняшний момент эту концепцию безопасности можно считать сырой. Актуальное поведение руби 1.8 слегка отклоняется от описаний, что я нашёл. Поведение в 1.9 изменилось, но подробно нигде не описано (я не нашёл).

Это не значит, что этой переменной нет применения в жизни прогрессивного человечества. Адекватное текущему состоянию применение — это гайдлайн при разработке. Руководство для программистов, которое само следит за своим исполнением. Жестковато, но зато действенно. :)

Материалы для самостоятельного изучения

  1. Код примеров в статье на github
  2. Старая, но самая подробная документация по $SAFE
  3. Просто дополнительно: шпаргалка по руби

01.04.2010 firtree_right Соха

Посидел я сегодня пол дня в пустом офисе (понятно, что все по служебным надобностям отсутствовали) и подумал. Всё-таки программирование, даже в команде, обрекает на одиночество. Интеллект при этом напрочь отвязывается от тела, а тело от земли. Решил, что пора заняться чем-то другим, более тёплым, душевным и земным.

Альтернатива не заставила себя долго ждать. То тут, то там встречаю знаки и намёки. То один, то другой человек заговорит со мной на эту тему. Вот из последнего. Френдлента пишет про свой дом. Бывший партнёр продвигает продукты из деревни и периодически собирает заказы. Сельское хозяйство! Вот, где, не только много новых возможностей (и бизнес, и социальные инициативы), но и возвращение к истокам, к более естественному образу жизни. То, чего не получишь в городе, в этих панельных коробочках. То, чего как раз не хватает. Поэтому в ближайшее время я буду искать работу именно в этом направлении.

А на моё место в компанию нек4 нужен толковый на все руки программист. Знание ruby и ActionScript 3 необходимо. Умение самостоятельно удерживать часть проекта без дополнительного контроля тоже необходимо. Зарплата на уровне. Заинтересованным — падать в каменты.

30.03.2010 firtree_right Рационально

Вот интересно, сколько людей умерло в последние 10 лет от инфаркта, рака, передозировки наркотиков и алкоголя, укуса змей, колёс автомобиля, рук хулиганов и бандитов, взрывов бытового газа и, наконец, голода и холода? Совершенно точно больше по каждому пункту, чем от кое-чего на букву «т», вопрос лишь во сколько десятков-сотен раз.

Где новости по первому каналу, почему не приняты меры? Почему мне не звонят проверить, не умер ли я от удара током или подавившись блинчиком?

28.03.2010 firtree_right Блоггерские будни

В этом году вот уже вторая статья в моём программерском блоге проиллюстрирована Ириной Вадимовной. Пусть повседневная деятельность не оскудеет интересными темами, а дальнейшее сотрудничество будет плодотворным!

24.03.2010 firtree_right Процесс приёма правок в проекте с открытыми исходниками

opensource

Введение

Для работы в проекте с открытыми исходниками весьма удобна распределённая система контроля версий. Я использую git. Понятно, что есть процесс с использованием патча, высылаемого по почте, но этот процесс не является эксклюзивным для распределённой системы контроля версий. Поэтому я опишу процесс с так называемым pull request.

Постановка задачи

Пишет мне некто Tallak Tveide, сообщая, что он сделал копию моего проекта у себя на github и внёс несколько правок, которые ему были необходимы, и от которых другие ребята, пользующиеся этой библиотекой только выиграют. Ветка, в которой находятся нужные мне правки, называется eos_40D_bugs. Это довольно кстати, что нашёлся человек с Кэноном, потому что я испытываю всё на Никонах :)

Каковы же мои действия?

Решение

Заходим в наш локальный рабочий репозиторий и добавляем новый источник правок:

git remote add tallakt git://github.com/tallakt/gphoto4ruby

Теперь рассмотрим правки:

git fetch tallakt eos_40D_bugs:develop

Эта команда заберёт из репозитория tallakt с ветки eos_40D_bugs исправления и создаст локальную версию в локальной ветке develop. Чтобы увидеть исправления:

git diff develop

Что выдаст нам исправления относительно текущей ветки.

git checkout develop

Чтобы работать с правками и тестировать то, что получилось.

Если я пока не готов сливать исправления с основной веткой master, но хочу ещё поработать с этим из разных мест, то мне нужно создать ветку develop в моём центральном репозитории на github, который относительно локальной копии у меня обычно называется origin.

git push origin develop

Это создаст ветку develop на удалённом репозитории, с которой я потом смогу работать из другого локального репозитория, выполнив:

git pull origin develop

После того, как я доволен изменениями и хочу сделать официальный релиз:

git merge master
git branch -d develop
git push origin master
git push origin :develop

Первая команда, предполагая, что текущая ветка — develop, сливает её в master. Вторая команда удаляет локальную ветку develop. Третья команда отправляет изменения в ветку master на центральном репозитории. Четвёртая команда удаляет ветку develop на центральном репозитории.

Материалы для самостоятельного изучения

  1. Несколько шпаргалок от github
  2. Дельная документация по git

Послесловие

Как вы заметили, в этом году мои статьи сопровождаются прекраснейшими тематическими картинками авторства Ирины Троицкой — моей прекрасной супруги. Её перу также принадлежит дизайн сайта и логотипа.

21.03.2010 firtree_right За игры

Сегодня приходил Ксан и рассказывал, как один профессор по игровому дизайну сделал на своих занятиях для студентов систему уровней и опыта. Студенты зарабатывали XP, приходя на лекции и делая доклады и получали уровни, позволяющие в конце легче получить оценку. Нетрудно предсказать результат.

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

Так как я тоже трачу на игры часть своего времени, то решил составить свой рейтинг. Критерием оценки является то, прошёл ли я игру или бросил. :) Ссылок давать не буду, кому интересно — можно забить в гугл: не одному мне они нравятся.

  1. На третьем месте игры, в которых я дошёл до последнего уровня или босса, но сам последний уровень бросил.
  2. Psychonauts, аркада, гениальная задумка, очень красиво, но очень аркадный последний уровень.
  3. Star Wars K.O.T.O.R., рпг, можно стать джедаем и махать световым мечом, но умения моего персонажа и его компаньонов, которые я развивал и подбирал, оказались абсолютно непригодны для финального босса.

  4. На втором месте игры, которые я прошёл один раз.

  5. Квесты: Goblins (очень старая игрушка, очень хорошая), Siberia (красиво) , ГЭГ (отечественный продукт с эротическим уклоном и острым юмором), Samorost (и вторая часть тоже), Machinarium (клёвые роботы, трогательный стим-панк), etc.
  6. Mass Effect, рпг, космическая одиссея, немного трудная боевая система.
  7. Portal, единственная в своём роде головоломка от первого лица, гениальное изобретение. Обязательно пройду ещё раз и перенесу в другой список.
  8. Fable, рпг от Микрософта, красочно.
  9. FarCry, приятный шутер, вмеру кинематографично, много свободы (но не слишком), динамично.
  10. Crimson Land, аркада на отвести душу.
  11. Rayman Raving Rabbids, выдающиеся персонажи-кролики, приятные мини-игры.

  12. Игры, пройденные более одного раза.

  13. Half Life 2, очень кинематографичный шутер, гениальное изобретение — гравипушка.
  14. Loco Roco, я купил PSP ради другой игры (которую, кстати, забросил), а играю только в эту.
  15. Plants vs. Zombies, это казуальная игра (tower of defense, по сути), как и предыдущая, но что-то заставляет к ней возвращаться и проходить основной сюжет не один раз.
  16. Hitman: Blood Money, стэлс, очень стильная игра, очень необычная роль персонажа (наёмный убийца), возможность выбрать подход к выполнению задания исходя из личных предпочтений.
  17. Full Throttle — это единственный квест, который приятно пройти более одного раза, очень старый, очень эпический.
  18. Might and Magic VII, рпг, старое и лучшее в серии, можно выбрать путь добра и зла, за зло играть легче.
  19. Beyond Good and Evil, от третьего лица, шедевральное совмещение аркад, головоломок, квестов и рпг.
  20. Mass Effect 2, вторая часть трилогии, учтены все недоработки первой части, это просто конфета, не могу оторваться, можно перенести персонажа из первой части и тогда тебе припомнят все выборы, что ты сделал в ней.

Вот, кстати, отличная демонстрация того, что заставляет возвращаться к игре более одного раза. Это относится, скорее, к казуальным играм, но принцип передан очень правильно.

А во что играете вы?

18.03.2010 firtree_right Вот и в Киеве

Пока я тут вечерами занимался достижением No One Left Behind и Long Service Medal в Mass Effect 2, Яндекс выпустил панорамы Киева. Про игры я отдельно напишу чуть попозже. А на панорамах в Киеве запрятаны восемь лосей. Примерно вот таких. Объявлены поиски восьми таких лосей в украинском Яндекс-блоге. Приятно, когда люди разбираются в лосях.

05.03.2010 firtree_right Аватар

Волна отзывов уже давно прошла. Но по поводу этого фильма я заметил, что мне довольно сложно высказать однозначную оценку. И вот как раз сегодня с помощью кино-блога «Афиши» нашёл рецензию, которая затрагивает те моменты, которые фоном не давали мне покоя с того момента, как главный герой открывает глаза под финальные титры. Что касается графики и красоты — безусловно прекрасный фильм. Что касается философии — прекрасно даёт направление мысли Славой Жижек.

26.02.2010 firtree_right Вернулся

back from holidays

Давненько я не обновлял этот блог :)

Всё дело в том, что где-то там был Новый Год, в который я торжественно посетил родителей. До и после Нового Года была сдача панорам Санкт-Петербурга и ещё одного пока не скажу какого города.

Когда съёмки 2009 года были сданы, выяснилось, что полным ходом идёт зима. А у нас не так много городов, которые можно красиво снимать зимой. Тогда мы отправились всем составом в тёплые края, в месячный отпуск.

Теперь, когда я снова в Москве, этот блог вернётся к своему обычному режиму. Спасибо всем, кто был со мной в прошлом году. Этот год обещает быть очень интересным.