ru_dmitriid


О королях и капусте


Programming Erlang
happy
dmitriid
Я ее наконец-то получил:

Programming Erlang Programming Erlang Programming Erlang

В Молдову она пришла 21-го июля. Из таможни вышла 25-го. И только сегодня я заметил приглашение забрать посылку из местного почтового отделения :)

Ура, товарищи!

Теперь осталось найти время на ее изучение...
Tags:

Побольше языков, хороших и разных!
happy
dmitriid
В пятницу взялся за Python.

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

У меня руки дошли по одной простой причине. У меня есть куча фотографий различного (большого) размера, которые надо представить в трех-четырех различных размерах (как это делается, например, на Flickr'е или на Яндекс.Фотках), да еще составить уменьшенные изображения (thumbnails), да еще залить все это дело на хостинг (Amazon S3) и залить информацию о загруженных файлах в базу данных.

Желательно автоматически.

Началось все с того, что я где-то увидел, что Python Imaging Library - это лучшая библиотека для работы с изображениями. И действительно:

  1. import Image
  2.  
  3. im = Image.open('путь/к/изображению')
  4. im.thumbnail((800, 800), Image.ANTIALIAS)
  5. im.save('путь/к/изображению')


Особо гениальна строчка im.thumbnail((800, 800), Image.ANTIALIAS). Если у нас изображение 1024х768, то на выходе мы получим не искореженный 800х800, а пропорционально уменьшенный 800x600.

В комбинации с MySQLDb и Boto требуемое мне решение просто до безобразия. Но не в этом дело.

Как оказалось, знакомство, пусть даже шапочное, с большим количеством языков программирования дает не просто выигрыш, а гигантскую фору в изучении нового языка. Напомню, что галопом по европам я "знаком" с такими языками как Lisp, Haskell, Erlang... И что же мне это дало применительно к Питону? А дает это мне моментальное усваивание и понимание следующего:

Примечание: В примерах за код на хаскеле ответственности не несу :)


Кортежи (tuples) и destructuring assignment

Кортеж - это список фиксированной длины, состоящий из разнородных объектов:
  1. # Python tuple
  2. (1, 2, 'hello')
  1. -- Haskell tuple
  2. (1, 2, "hello")
  1. %% Erlang tuple
  2. {1, 2, "hello"}


Похоже, не так ли :)

А теперь поразбиваем кортежи на переменные:
  1. # Python
  2. # А станет равно 1
  3. # В станет равно 2
  4. # С станет равно 'hello'
  5. A, B, C = (1, 2, 'hello')
  1. -- Haskell
  2. -- a станет равно 1
  3. -- b станет равно 2
  4. -- c станет равно 'hello'
  5. (a, b, c) = (1, 2, "hello")
  1. %% Erlang
  2. %% А станет равно 1
  3. %% В станет равно 2
  4. %% С станет равно 'hello'
  5. {A, B, C} = {1, 2, 'hello'}


Конечно, принцип работы совершенно разный. В Хаскеле и Эрланге - это сопоставление с образцом (patern matching), которого нет в Питоне, но так как выглядит это почти одинаково, то и принимается и понимается моментально. Кстати, в РНР есть похожая вещь:
  1. // А станет равно 1
  2. // В станет равно 2
  3. // С станет равно 'hello'
  4. list($A, $B, $C) = array(1, 2, 'hello')


Что, конечно, опять совсем не то и принцип работы совсем другой :) Но вот, что интересно. Привыкнув к такого рода присвоениям в Эрлнге или Хаскеле, начинаешь чаще использовать list в РНР и моментально схватываешь суть присвоений в Питоне. Потому что удобно.

Именованные параметры

Об именованных параметрах я как-то уже растекался мыслью по древу. Как оказалось, в Питоне они тоже есть, что не может не радовать.
  1. # определяем функцию
  2. def myfunc(param='', another_param=1)
  3.     print param, another_param
  4.  
  5.  
  6. # вызываем функцию
  7.  
  8. # напечатает hello 5
  9. myfunc(another_param=5, param='hello')
  10.  
  11. # напечатает hello 1
  12. myfunc(param='hello')
  13.  
  14. # напечатает 1
  15. myfunc()


Анонимные функции (лямбды)

  1. # Python
  2. # определяем список
  3. li = [1, 2, 3, 5, 9, 10, 256, -3]
  4.  
  5. # выведем из него только четные
  6. li_even = filter(lambda item: item % 2 == 0, li)


Весьма похоже на аналоги:

  1. -- Haskell
  2. -- определяем список
  3. li = [1, 2, 3, 5, 9, 10, 256, -3]
  4.  
  5. -- выведем из него только четные
  6. li_even = filter (\item -> (mod item 2) == 0) li
  1. %% Erlang
  2. %% определяем список
  3. Li = [1, 2, 3, 5, 9, 10, 256, -3]
  4.  
  5. %% выведем из него только четные
  6. Li_even = lists:filter(fun(Item) -> Item rem 2 == 0 end, Li)


List comprehensions

Помните, как списки в математике составляются? Ну, например:
  1. S = [1, 2, 3, 4]
  2. M = {x | x in S, x even}


M - это все x, где x - из набора S и x - четное. В хороших языках есть возможность составлять списки практически по-математически. Называется это list comprehensions. Единственный минус в питоне - это синтаксис. Далее примеры из анонимных функций, только с list comprehensions:

  1. # Python
  2. # определяем список
  3. li = [1, 2, 3, 5, 9, 10, 256, -3]
  4.  
  5. # выведем из него только четные
  6. li_even = [x for x in li if x % 2 == 0]
  1. -- Haskell
  2. -- определяем список
  3. li = [1, 2, 3, 5, 9, 10, 256, -3]
  4.  
  5. -- выведем из него только четные
  6. li_even = [x | x <- li, (mod x 2) == 0]
  1. %% Erlang
  2. %% определяем список
  3. Li = [1, 2, 3, 5, 9, 10, 256, -3]
  4.  
  5. %% выведем из него только четные
  6. Li_even = [X || X <- Li, X rem 2 == 0]




В общем, благодаря знакомству с разными языками программирования новый язык программирования (из более-менее мейнстримных, не K :)) ) оказывается не просто легким, а очень легким и осваивается... ну, за 15 минут.



Update: Поправлен код на Хаскеле. Спасибо deni_ok

Pragmatic Erlang
happy
dmitriid
Почти 60 долларов и книженция моя. Joe Armstrong. "Programming Erlang. Software for a Concurrent World" моя. Пока только в PDF-варианте. Потихоньку буду читать...

Уря! :)
Tags:

PHP и Unicode. Апдейт
happy
dmitriid
Все забываю это написать. Ткнули в это и на работе и здесь

Решение к предыдущей проблеме с версии 4.4.0 выглядит так:
$input = "Это текст /// This is a text";
$pattern = '/(\pL+)/u';
preg_match_all($pattern, $input, $arr);
print_r($arr);

Array
(
    [0] => Array
        (
            [0] => Это
            [1] => текст
            [2] => This
            [3] => is
            [4] => a
            [5] => text
        )

    [1] => Array
        (
            [0] => Это
            [1] => текст
            [2] => This
            [3] => is
            [4] => a
            [5] => text
        )

)


Читайте доки, господа. Они рулят :)
Pattern Syntax (Unicode character properties)
Pattern Modifiers (/u)
Tags: ,

PHP и Unicode
happy
dmitriid
РНР и Юникод - это песнь, что стону подобна. Потому что эти два понятия несовместимы...

Задача

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

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

Данные

Это текст /// This is a text

Решение
Текста/кода ну очень много, поэтому под катCollapse )
Tags: ,

ТЗ
happy
dmitriid
http://kitya.livejournal.com/204801.html?thread=22178049#t22178049

Если пользователи в ТЗ написали "геморрой", то программисты должны его им качественно обеспечить... :)

jQuery
happy
dmitriid
jQuery - хорошая вещь. Маленькая да удаленькая.

Например, у нас есть некоторое количество, скажем, статей с заголовками. Нам хочется, чтобы изначально тела статей были скрыты, а по клику на заголовок они раскрывались. А, ну да, и чтобы все это индексировалось... И чтобы четные и нечетные заголовки разными цветами были...

Предположим, у нас такая структура документа:

  
<div id="wrapper">
    <div>
        <div id="title">Title 1</div>
       <div id="body">Body 1</div>
    </div>
    <br /><br />
    <div>
        <div id="title">Title 2</div>
        <div id="body">Body 2</div>
    </div>
    <br /><br />
    <div>
        <div id="title">Title 2</div>
        <div id="body">Body 2</div>
    </div>
</div>


Чтобы такое извратить в Яваскрипте, чтобы все работало по описанному выше сценарию? Не знаю, например, вот это:

  
<script>
    $(document).ready(
        function(){
            $("#wrapper > div").each(
                function(index){
                    var obj = $(this);
                    obj
                        .find("#title")
                        .css(
                            {
                                backgroundColor: index % 2 == 0 ? "#ef0000" : "#0000ef",
                                cursor: "hand",
                                cursor: "pointer",
                                color: "#FFF"
                            }
                        )
                        .click(
                            function(){
                                obj.find("#body").toggle();
                            }									
                        )
                        .end()
                        .find("#body").hide();
                }						
            )
        }
    );
</script>


:)

Результат можно увидеть здесь: http://dmitriid.com/jquery. Как это все работает, можно будет увидеть в статье на РСДН, которую, я надеюсь, я скоро закончу :)

Ах, да. Пример посмотртите и при выключенном Яваскрипте тоже.

Мне jQuery нравится все больше и больше
Tags:

НГ
happy
dmitriid
ВСЕХ ДРУГОВ И НЕДРУГОВ С НАСТУПАЮЩИМ НОВЫМ ГОДОМ!

Why's Poignant Guide по-русски
happy
dmitriid
У себя в вики я начал перевод Why's Poignant Guide to Ruby. К сожалению, время у меня последнее время отсутствует, как класс (особенно для длительных сторонних проектов), а "Трогательный Путеводитель" перевести хочется.

Поэтому присоединяйтесь!

Перевод ведется в вики, доступно некоторое количество шаблонов для форматирования. В течение недели я, возможно, подкручу еще и syntax highlighting для Ruby

Кросспост в ruby_ry, на RSDN и в RubyOnRails to russian

Erlang по-русски
happy
dmitriid
Совсем забыл.

На http://erlang.dmitriid.com ведется перевод документации по Эрлангу на русский язык. На данный момент переведены "Принципы дизайна OTP".

Принимаются критика и предложения. Но не мне :) Я переводом не занимаюсь. Все вопросы напрямую в вики.

Ура, товарищи! :)

?

Log in