You are viewing [info]polymorphm's journal

Andrej / Андрей
29 January 2011 @ 12:01
lost  
официально -- логин/пароль/email самоутерян :-)
 
 
Andrej / Андрей
29 January 2011 @ 11:56
 
что касается javascript и ";" -- то лично для себя я (примерно как уже полгода) сделал определённые выводы...

но вот наконец я воодушевился передать эту банальнейшую тему -- и на всеобщее обозрение.... потомучто интернеты кипят новыми www-технологиями :-)

...и Javascript конешно же развивается тоже -- стремительными темпами :-) :-)

но так или иначе..


# нужно ли ставить точку с запятой после каждой Javascript-инструкции?

считаете ли Вы что в Javascript -- знак ";" разделяет инструкции между собой (по аналогии с C/C++)?

ответить на этот вопрос -- поможет простой отрывок от скрипта:
// этот скрипт написан в стиле C/C++ .
// то есть -- после каждой операции поставлен знак ";"
//
// ......но есть ли в этом хоть какой-то смысл?
// ...считаете ли Вы что знак ";" разделяет инструкции между собой?
// сейчас и проверим...

function test_semicolon_core() {
    // ядро проверки смысла указания ";"
    //
    // если знаки ";" действительно разделяют инструкции между собой
    // то -- функция вернёт значение <true>.
    // иначе -- функция вернёт значение <undefined>
    
    return
        true;
};

function on_test_button_click(event) {
    var test_results = test_semicolon_core();
    var result_msg;
    
    if(test_results) {
        result_msg =
            'Да!\n' +
            '\n' +
            'Действительно знак ";" разделяет инструкции друг от друга\n' +
            '\n' +
            'То есть в Javascript -- знак ";" (после каждой инструкции) ИМЕЕТ тот же СМЫСЛ что и для языка C/C++';
    } else {
        result_msg =
            'Нет!\n' +
            '\n' +
            'На огорчение любителям языков C/C++ (зато на РАДОСТЬ любителей языка Python =^____^=) -- ' +
            'в Javascript указание знака ";" -- СЛАБО влияет на разделение инструкций друг от друга\n' +
            '\n' +
            'То есть в Javascript -- инструкции разделяются через знак новой строки "\\n" (как в и Python), ' +
            'а излишний знак ";" попросту игнорируется ' +
            '(кроме конечно случаев когда хочется указать сразу две инструкции в одной строчке)';
    }
    
    alert(result_msg);
};


вот так вот!! :-) :-)

готовый опытный образец скрипта -- здесь -- http://test-semicolon.narod.ru/
 
 
Andrej / Андрей
 
видимо -- в человеческом социуме -- есть противоположные друг другу вещщи/сущности , но противоположные таким образом , что в то время как на <одной-стороне> противоположность <другой-стороны> кажется очевидной, то на <другой-стороре> противоположность <первой-стороны> вообще незамечается :-)


вот например:


сущность -- подярок :

не существует людей которые любят беспорядок... однако существуют люди которые:
  1. любят подярок
  2. игнорируют понятие порядка/беспорядка

cущность -- здоровый образ жизни (ЗОЖ) :

не существует людей которые любят вредный образ жизни... однако существуют люди которые:
  1. любят полезный образ жизни
  2. игнорируют понятие о полезности/вредности образа жизни

сущность -- свобода :

не существует людей которые любят когда их держут в рабстве :-) ... однако существуют люди которые:
  1. предпочитают свободу и быть свободными
  2. игнорируют понятие свободы и рабства

сущность -- Свободное Программное Обеспечение (СПО [*] ) :

не существует людей которые любят проприетарщину (Собственническое ПО [*] )... однако существуют люди которые:
  1. предпочитают СПО
  2. игнорируют весомость (или вообще понятие) различия между СПО и ППО

<...вобщем..примеров..может..быть..много...>


...но суть всего этого в том что если вдруг разгорается тематичный спорный диолог между людьми <первой> категории и <второй> категории... то спор часто переходит в неконструктивность и глупость :-D :-D...

например в то время пока <первые> люди начинают говорить о том как хорошо когда человек ведёт здоровый обзаз жизни... -- то <вторые> люди начинают говорить о том что они совсем не против здорового образа жизни (но им якобы некогда, у них якобы работа жена дети и т п и т д)

тоесть <вторая> категория людей просто непонимают о чём им хотят сказать <первая> категория людей :-) ... (<вторые> видят <первых> просто как каких-то психов ненормальных :-) :-))

но зачастую и <первая> категория может не адекватно понять людей из <второй> категории.. <первым> может случайно показатсья что ктото является именно любителем вредного обаза жизни :-) [хотя как выше уже было сказано -- любителей вредного образа жизни -- не бывает]


а вот корпорации и маркетологи пользуются тем что люди могут запутаться -- и пытаются внести ещё побольше смуты (чтобы пропихнуть свои говнотовары)

разумеется что преднамеренное запутывание происходит в "пофигистическую" сторону. то есть корпорациям важнее чтобы люди относились -- ко <второй> категории -- по как можно большему числу действительно-важных сущностей...


например призедент компании Майкрософт_Рус -- когда хотел высказать своё отвращение к СПО -- то сказал о том что "правительство должно не обращать внимания на модель распространения" (ну то есть он имел ввиду что правительство должно положить хрен на понятия СПО и Проприетарщина :-))

таким образом -- любая критика в адресс Говнопрянишникова -- по отношению к тому что он мешает развитию СПО в России -- отвечается им фразой "на самом деле я не против СПО"

:-D :-D

вот такие дела :-)
 
 
Andrej / Андрей
17 October 2010 @ 13:31
 
на самом деле -- это до бесконечности элементарно... ...

...но вот меня осенило достаточно недавно :-)

суть такая: предположим есть какая-то система.. в которой постоянно появляются новые динамические элементы, ну а старые (неактивные) элементы подлежат удалению

..предположим срок не-активности элемента -- 2 недели ( обозначим это как: lifetime_const = 60 * 60 * 24 * 7 * 2 =  1209600 # секунд :))

в этом случае как(?) нам удалить элементы из системы (из базы данных, например) которые долгое время не модифицировались ?

в терминах MySQL можно _попробовать_ вот так :-) :-) [как советуют в некоторых книжках.. и исходных когдах некоторых продуктов] :

DELETE FROM `my_dynamic_elements` WHERE last_modified + lifetime_const <= current_time; # <-- ОШИБОЧНЫЙ ПРИМЕР

с точки зрения логики -- это пример неверен, так как он не учитывает что в один прекрасный момент разрядная сетка времени может переполнится и current_time -- уже никогда не станет больше чем last_modified + lifetime_const :-) :-D :-D ..

я щитаю что для всяких динамических элементов -- намного правильнее учитывать не текущее _СОСТОЯНИЕ_ времени --  а _РАЗНОСТЬ_ (тобишь _разниццу_ ) между состояниями времён!

ведь именно _разницца_ является _критерием_ , когда мы думаем мысли наподобие "оООО!! да это изменение было целых 15 дней назад" !

тоесть в терминах MySQL это значит:

DELETE FROM `my_dynamic_elements` WHERE ABS(current_time - last_modified) >= lifetime_const; # вполне ЛОГИЧНО !

в качестве побочного негатичного эффекта который может быть нежелательным -- это ситуация когда изза плохой батарейки системного блока -- время биоса обнулится и -- удалятся все данные :-)

но уж лучше такая ситуация (тоесть с полным удалением всех элементов).. чем ситуация с вечным оставлением некоторых "мусорных" элементов... (так как восстановить базу из backup`а , найти корень проблемы и поменять батарейку на материнской плате -- проще чем обнаружить что какие-то из элементов базы данных бессрочно существуют и хрен когда удалятся :))

а если в качестве динамических_элементов -- выступают: какой-нить Кэш или Данные_Сессий -- то и подавно надо сравнивать разность времён! :-)

впрочем, для защщиты от явных сбоев переменной_времени (current_time) -- достаточно в эту формулу ввести маленькую поправку [совершенно не уменьшая её эпической логичности] :

DELETE FROM `my_dynamic_elements`
                WHERE ABS(current_time - last_modified) >= lifetime_const
                AND
ABS(current_time - last_modified) < error_lifetime_const;

где error_lifetime_const например равняется 5 годам :-) ..

вот такая фигня!
 
 
Andrej / Андрей
19 September 2010 @ 01:25
 
нада же! Django делали явно умудрёные опытом люди!

                                                            ***


защита от CRSF-атак -- там включена ПОУМОЛЧАНИЮ(!!!)! .. ыыыЫЫ :-) :-) :-) :-)!!

хотя, как известно любой сайт в котором НЕТ средств защиты от CRSF -- уязвим для этой атаки поумолчанию (изначально!). :-) :-)

...то-есть это НЕ тот вид атаки, который основан на ОПЛОЩНОСТИ допущенной СЛУЧАЙНО разработчиком.. а тот вид который который основан на ЛЕНИ разработчика (или незнании :)... но вероятнее всего конешно лени :-D )

ну к примеру сайты -- www.liveinternet.ru и vk.com (vkontakte.ru) -- довольно долгое время (а может и до сих пор?) -- этим атакам были подвержаны! [...и куча других сайтов... не менее половины x_X ]

                                                            ***


а ещё в Django -- в шаблонизаторе включена экранизация символов -- и тоже ПОУМОЛЧАНИЮ(!) [но можно конешно же использовать конструкции отключающщие экранизацию в "индивидуальном" порядке]... :-)

...и как после такого -- можно случайно допустить XSS-дыру(?)..

да практически никак! :-)

хотя... -- даже в thepiratebay.org -- потенциально есть XSS-дыры, что можно заметить, зайдя на страничку thepiratebay.org/torrent/3649668/GTA_San_Andreas_full_game_pc__lt__lt_with_crack_gt__gt_ и внимательно поглядев HTML-код: , .. :O

                                                            ***


а взаимодействия с SQL-кодом -- в Django вообще ИСКЛЮЧАЮТСЯ (..и вся работа ведётся только с объектами :)) , так как используется механизм Object-relational mapping (Объектно-реляционное отображение) ...

если нет SQL-кода, то SQL-Injections отпадают автоматически :-) :-)

                                                            ***


впрочем -- только самый безграмотный-школьник -- сможет допустить оплошность вида SQL-Инъекция или XSS-дыра -- независимо от того какой он использует программный каркас для своего WWW-сайта.. WWW-дыр такого типа -- в реальных Интернетах -- почти наверно и не встречаются нигде....

(неговоря уже о том что в Python-DB-API-2.0 [PEP 249] -- вообще трудно допустить возможность SQL-Инъекции, так как параметры-SQL-запроса передаются отдельным списком :))

....но суть этого журнального файла -- в том что всё это включено в Django -- ПОУМОЛЧАНИЮ! :-) ...и это радует ^__^ , ведь безопасность она и должна быть поумолчанию! :-)


# p.s. а почему так радуюсь -- я(?).. всё очень просто! -- я ведь тоже являюсь пользователь Интернетов.. и тоже пользуюсь различными сайтами.... а было бы неприятно если на каком-то из этих сайтов меня скомпрометируют (отправят сообщение от моего имени.. или ещё чего плохое сделают :):))... вот так-то :-)
 
 
Andrej / Андрей
01 September 2010 @ 00:32
 
Google-переводчик теперь более новый и более няшный ^__^

он может перевести всё что угодно!! [ j.mp/bTUBYm ]




# p.s.: зато вчерашней ночью Google не работал всю ночь :-D
 
 
Andrej / Андрей
 
если приходится много пробовать разных Instant-Messenger-программ -- то всегда приходится делать ОДИН И ТОТ ЖЕ ряд настроек чтобы эти программы работали ДЕЙСТВИТЕЛЬНО как Instant Messenger, а не как <сверх-активный-неугомонный-комбайнер-пытающщийся-НАСИЛЬНО-проникнуть-в-твой-мозг:-)>:


1. отключить смайлики.

если использование смайликов НЕ предпологает АВТОЗАМЕНУ, то так и быть, можно смайлики НЕ убирать :-D...

....но если я (или мой собеседник) напечатал ":-)" а вместо этого у меня на экране "" то простите ЭТО ХАМСТВО когда коверкают сообщения :-/


2. отключить звук.

кто первый догадался делать звук в Instant-Messenger`ах (?), это для слепых чтоле(?).. %) %)


3. отключить все-возможные всплывающщие сообщения (и агрессивные уведомления).

достаточно ведь всего-лишь нотификации на панеле задач (или в области нотификации) ...

но для кого делается лишнее привлечение внимания(?)... опять для слепых(?) %) :-D :-D .

неужеле [см.. картинку ниже] -- так плохо видно что появились новые сообщения? %) %) %)



нотификация на панеле задач [см.. прошлую картинку] -- по моему скромному мнению -- это ЛУЧШЕЕ что может быть для скромного (не агрессивного) уведомления! ^__^


4. отключить проверку орфографии

я и так знаю про то что не так написал всякие там "тсья", и не нада мне постоянно это напоминать :-D .. как хочу так и пишу :-/

(по крайней мере из нас двоих [я и Instant-Messenger] -- именно Я носитель языка.. такчто мне лучше знать как что пишется!! :-D :-D )


5. отключить авто-смену статусов

статусы существуют чтобы я сам указывал какой у меня статус...

...зачем эти программы постоянны пытаются -- уплавоять мною[?].. (виртуальным сетевым мною, в данном случае, автоматически меняя статус виртуального меня :)) ..


6. <что-то-ещё-автоматическое>

у каждой навороченной Instant Messenger-программы -- могут быть дополнительные сверх-активные функции "Искусственного Автоматического Интеллнета"...

....которые как и прошлые другие -- ЛЕЗУТ КУДА НЕ ПРОСЯТ :-D , и мешают спокойно работать и общаться :-/


~~~

вот такая вот борьба .. человека и "Автоматического Интеллекта"..

..я хочу "программу" а мне подсовывают "искусственный интеллект".. и зачем %) %) %)...

.....лучше бы вместо этого AI -- разработчики потратили бы время на прикручивание безглючного Audio/Video в свой Instant-Messenger ! :)
 
 
Andrej / Андрей
 
так как Пайсон (CPython) это интепретатор... то много говорить о компиляции не приходится :-)

однако делается это так:


# компиляция:
$ python -m compileall ДИРЕКТОРИЯ # просто компиляция "по-обычному" :)
$ python -O -m compileall ДИРЕКТОРИ # "-O" для применениея оптимизации
$ python -m compileall -b ДИРЕКТОРИЯ # "-b" для "традиционного" компилирования, начиная с версии Python-3.2

вот так вот всё просто!! :-) :-) :-)

а что качается Python-3.2 -- то тут появилось нововведение PEP-3147 . и если ЦЕЛЬ компиляции заключается не в ускорении будущей программы, а для КОПИРАСТИЧЕСКИХ целей сокрития исходника -- то "традициднный режим" как раз будет кстате :-D


# декомпиляция:

чуть сложнее чем компиляция :-) :
>>> import marshal, dis
>>> fd = open('ПУТЬ/К/ФАЙЛУ.pyc', 'rb')
>>> magic = fd.read(8)
>>> code = marshal.load(fd)
>>> dis.dis(code)
(на экран выводитсья результат в АССЕМБЛЕРО-виде... наподобие следущего текста...)
  2           0 LOAD_CONST               1 (3)
              3 STORE_FAST               0 (a)

  3           6 LOAD_CONST               2 (4)
              9 STORE_FAST               1 (b)

  4          12 LOAD_FAST                0 (a)
             15 LOAD_FAST                1 (b)
             18 BINARY_ADD
             19 STORE_FAST               2 (c)
             22 LOAD_CONST               0 (None)
             25 RETURN_VALUE

не очень прям супер ясно, но при желании понять суть можно :-)


# декомпиляция по человечески

программа Decompyle [ decompyle.sourceforge.net/ ] -- восстанавливает исходный код -- почти в том же виде в котором он изначально писался :-) :-D ..

.... ....однако кажется проект "слегка" устарел :-[ :-[ :-[ (что впринцепе не стоит воспринимать прям уж фатально :), так как есть/разрабатываются и другие проекты... :-) например UnPyc [ unpyc.sourceforge.net/ ] )


###

так-то!

 
 
Andrej / Андрей
 
чем больше в стране ПГМ-инфицированных , тем больше эта инфекция влияет на здоровых людей с иммунитетом :-)

...я всмысле про то что -- теперь здоровх людей -- щитают незаконными.. :-D . дожили :-) :-)

рашка -- такая рашка :-/


тема -- "Запретное Искусство ЖЖ" раскрыта тут: teh-nomad.livejournal.com/364313.html

:-)
 
 
Andrej / Андрей
 
GStreamer неплохая вешь.... :-)

многие жалуются на GStreamer, говоря что он не так быстро проигрывает видио-фильмы как mplayer .. или ещё какие-то там причины (показ DVD-меню и прочее)...

...но это всё фигня! :-D

главное что GStreamer модульный! и... мммм..э..эээ........ стандартный! :)

если нужно запортить какойнитбудь FLAC-файл [например для записи в глупый MP3-плеер] -- то GStreamer приходит на помошь вот так:
$ gst-launch \
filesrc location=ВХОДНОЙ.flac ! \
decodebin ! audioconvert ! lamemp3enc quality=0 ! id3v2mux ! \
filesink location=
ВЫХОДНОЙ.mp3
(gst-launch -- из пакета "gstreamer-tools" . а для таго чтобы работал кодировщик MP3 (Lame) -- нужен GStreamer-плугин "...-ugly-multiverse" )


....
........
..............ну и к слову сказать, если уж затронули тему GStreamer -- то думаю стоит отметить что существует и команда которая проигрывает аудио-файл :-)
$ gst-launch filesrc location=ВХОДНОЙ-АУДИО-ФАЙЛ ! decodebin ! autoaudiosink

конешно основная главная фигня +ещё в том что данный мультимедия-фрэймворк можно довольно не сложно подключать к своим программам... но об этом в две строчки не написать.... зато прочитать можно тут:

вобщем.... ДАЁШЬ ИНТЕГРАЦИЮ GSTREAMER ВО ВСЁ! :-) :-D


# Update 2010-08-12 10:54

простой bash-скрипт для массовой порчи FLAC-файлов:
#!/bin/bash

if [ "$1" == "-mass" ]; then
if [ "$#" != 3 ]; then
echo "Invalid arguments"

false
exit
fi
self="$0"
flac_dirname="$2"
export_dir="$3"

exec find "$flac_dirname" -type f -name "*.flac" \
-exec "$self" \{\} "$export_dir" \;

false
exit
fi

if [ "$#" != 2 ]; then
echo "Usage: "
echo -e "\tНадо чтобы был первый агрумент указывал путь какой брать flac-файл,"
echo -e "\tи чтобы второй агрумент указывал директорию для экспорта"
echo -e "\t\t(А если перед первым агрументом указать ключ -mass, "
echo -e "\t\tто можно конвертировать целые директории)"

true
exit
fi

flac="$1"
export_dir="$2"

flac_dirname="$(dirname "$flac")"
flac_basename="$(basename "$flac")"
mp3_dirname="$export_dir/$flac_dirname"
mp3_basename="$flac_basename-downgraded.mp3"
mp3="$mp3_dirname/$mp3_basename"

mkdir -p "$mp3_dirname"

echo "\`$flac' -> \`$mp3'"

exec gst-launch \
filesrc location="$flac" ! \
decodebin ! audioconvert ! lamemp3enc quality=0 ! id3v2mux ! \
filesink location="$mp3"

false

...так-что теперь можно сделать чтото типа этого:
$ $ ./flac-downgrade -mass МОЯ/ДИРЕКТОРИЯ/CО/ВСЕЙ/МУЗЫКОЙ export-mp3
:-)

###