Очередь на js
Нужно было сделать простенькую очередь, чтобы добавить много колбэков, а потом выполнить последний из очереди по таймауту, отсчитываемому от времени последнего добавления. Очередь получилась простенькая (за полчаса много и не сделаешь). Использование:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//опциональное время в милисекундах - таймаут от последнего события var queue = queueFactory( 5000 ); // у меня дёргается скрипт по определённому событию, в нём написано $( window ).bind( 'event1', function( Event, Data ) { if ( ! queue.length() ) { showLoader(); } queue.add( function() { console.log( 'event1' ); } ); } ); $( window ).bind( 'event2', function( Event, Data ) { if ( ! queue.length() ) { showLoader(); } queue.add( function() { console.log( 'event2' ); } ); } ); |
В итоге через 5 секунд после наступления последнего из событий в консоль выведется соответствующее сообщение.
Перемещение большого количества файлов в linux shell
Сбойнул один старый скрипт и написал он много маленьких (2-3 кб) файлов в одну директорию. Посмотрел я, сколько файлов оказалось, командой для подсчёта количества файлов в директории
1 |
ls -1 | wc -l |
Оказалось файлов таких за миллион. На эти файлы смотрел скрипт демонский, который по ним рассылал почты много. Решил я эти файлы из директории той убрать (чтоб пользователей …
Как настроить Smarty для удобной работы (+наследование)
Smarty — странноватый и глючноватый шаблонизатор, если сравнивать с Django. Но под php ничего под руку не попалось, чтобы работало из коробки, было просто в настройке, и, к тому же, когда-то давно я его уже ковырял. В общем, нужно было срочно прикрутить шаблонизатор — сделал следующее. В классе, ответственном за вывод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
private static function getSmarty( array $Params ) { require_once( SMARTY . 'Smarty.class.php' ); $smarty = new Smarty(); $smarty->error_reporting = E_ALL & ~E_NOTICE; $smarty->force_compile = true; $smarty->left_delimiter = '{{'; $smarty->right_delimiter = '}}'; $smarty->template_dir = TEMPLATE; foreach ( $Params as $key => $value ) { $smarty->assign( $key, $value ); } return $smarty; } public function renderToView( rController $Controller, $Debug = false ) { $contentType = $Controller->getContentType(); self::setHeaders( $contentType ); switch ( $contentType ) { case self::CONTENT_TYPE_JSON : echo json_encode( $Controller->getTemplateData() ); break; case self::CONTENT_TYPE_HTML : default : $templatePath = $Controller->getTemplatePath(); if ( ! $templatePath ) { $templatePath = $this->generateTemplatePath( $Controller ); } if ( ! file_exists( TEMPLATE . $templatePath ) ) { if ( $Debug ) { echo 'tried ' . TEMPLATE . $templatePath; } $templatePath = $this->defaultTemplatePath; } self::getSmarty( $Controller->getTemplateData() )->display( $templatePath ); } } |
Во вьюхе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// layout.tpl <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <head> <title>{{if isset( $title )}}{{$title}}{{else}}{{$defaultTitle}}{{/if}}</title> <script type="text/javascript" src="/js/main.js"></script> {{block name="head"}}{{/block}} </head> <body> {{block name="content"}}{{/block}} </body> // index.tpl {{extends 'layout.tpl'}} {{block name="content"}} {{assign 'myparamm' 'Bob'}} myparamm {{$myparamm}} {{/block}} |
…
Css-x-fire — плагин для PhpStorm
Удобный плагин, позволяющий принимать изменения стилей из firefox в PhpStorm и применять их одним кликом. http://plugins.intellij.net/plugin/?webide&id=5348
jQuery.deferred
В jQuery 1.5 была полностью переработана модель асинхронных запросов. Теперь они возвращают deferred-объект, содержащий promise-объект, который содержит методы, позволяющие узнать состояние запроса или навесить дополнительные обработчики. promise-Объект содержит методы then, done, fail, isResolved и isRejected. Суть нового подхода состоит в следующем:
1 2 3 4 5 6 7 |
$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1, a2){ // a1 и a2 - аргументы, отвечающие соответственно за запросы к страницам page1 и page2 var jqXHR = a1[2]; /* массив состоит из [ "success", statusText, jqXHR ] */ if ( /Оппа!/.test(jqXHR.responseText) ) { alert("Где-то на первой странице есть 'Оппа!'."); } }); |
$.when принимает deferred-объект или объекты и возвращает promise-объект. Можно делать и так:
1 2 3 4 5 6 7 8 9 10 11 12 |
var $promise; if ( tt == 1 ) { $promise = $.when( $.getJSON( ... ) ); } else if ( tt == 2 ) { $promise = $.when( $.getJSON( ... ), $.getJSON( ... ), $.post( ... ) ); } else { $promise = $.when( console.log( 'else' ) ); } $promise. then( function() { console.log( 'done', data ) } ); |
…
jQuery.delegate
jQuery.delegate и jQuery.undelegate появились в jQuery 1.4.2. Это аналоги .live и .die(). У .live и .die() есть проблемы с, к примеру, вложенными объектами, с встраиванием в цепочки и много ещё. Синтаксис .delegate отличается от .live и, соответственно, .click и т.п. Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Using .live() $("table").each(function(){ $("td", this).live("hover", function(){ $(this).toggleClass("hover"); }); }); // Using .die() $("table").each(function(){ $("td", this).die("hover"); }); // Using .delegate() $("table").delegate("td", "hover", function(){ $(this).toggleClass("hover"); }); // Using .undelegate() $("table").undelegate("td", "hover"); |
http://api.jquery.com/delegate/ Работа с событиями в jQuery 1.7+
Работа с событиями в jQuery-ui
Если нужно из виджета стриггерить событие, это сделать это можно двумя способами:
1 |
this.element.trigger( 'my_event_element', { option1: true } ); |
1 |
this._trigger( '_my_event_widget', null, { option1: true } ); |
Допустим, что наш виджет называется MyCoolWidget. Тогда поймать наши события можно так:
1 2 3 4 |
$( '#div' ).MyCoolWidget(); $( '#div' ). bind( 'my_event_element', function( Event, Ui ) { console.dir( Ui ) } ). bind( 'mycoolwidget_my_event_widget', function( Event, Ui ) { console.dir( Ui ) } ); |
Обратите внимание на второй bind — префиксом к событию в этом случае явлется название виджета в нижнем регистре. Кстати, есть ещё один способ обработать событие от this._trigger — …
Способ узнать, какие события забиндены на элементе в jQuery
1 |
console.log( $( selector ).data('events') ); |
Выдаст все события, которые слушаются обработчиками на элементе.
MySQL. Восстановление из бэкапа
Понадобилось восстановить бэкап mysql размером примерно в гигабайт. Всякие phpMyAdmin даже сжатый файл кушать отакзываются — ограничение по размеру, а доступа к настройкам нет. Нашёл хороший способ — в командной строке
1 2 3 4 |
mysql mysql>use database <>; mysql>source path/to/backup_file.sql; |
Очень быстро и хорошо) http://forums.mysql.com/read.php?104,145923,148081#msg-148081
Автозапуск shell-скрипта при входе — Mac OS
Мне нужно было монтировать директорию по самбе. Всё достаточно просто: Создать файл automount в AppleScript с текстом
1 |
do shell script "mount -w -t smbfs \"//name:pass@ip/www\" /mnt/folder/" |
и сохранить как программу Системные настройки → Учётные записи → Объекты входа → Добавить плюсиком сохранённый скрипт http://www.withoutink.com/technology/howto-autostart-xampp-mac-osx/ http://jm.marino.free.fr/index.php?switch=sw_&title=AutomountMaker — визуальная тулза