iВкусняшко

копипаста того что мне было интересно

Парадокс неожиданной казни — Википедия

Парадокс неожиданной казни

Источник: Парадокс неожиданной казни — Википедия.

Подключение клавиатуры к МК по трем проводам на сдвиговых регистрах : Электроника для всех

Подключение клавиатуры к МК по трем проводам на сдвиговых регистрах : Электроника для всех.

USB программатор AVR – USBAsp : Электроника для всех

USB программатор AVR – USBAspPrint This Post

Автор DI HALT
Опубликовано 15 Авг 2008
Рубрики: Готовые устройства
Метки: ,

Вид сверху
Вид сверху

!!! ЭТЕНШН !!!
Появилась схема USB программатора которая НЕ требует предварительной прошивки управляющего микроконтроллера.

Так как у многих уже давным давно нет ни COM ни LPT порта, то я решил выложить схему USB программатора для AVR. Это будет широко известный в узких кругах USBASP. Схема простая как три копейки, но COM или LPT порт все же потребуется – для того, чтобы прошить управляющий контроллер. Так что можешь сходить к другану. Программатор строится на контроллере ATMega48 или ATMega8. Нужна именно 8 или 48, без всяких индексов L. Так как у нас требуется частота выше чем 8 Мгц.

Сборка

Схема USBASP
Схема USBASP
Печатная плата
Печатная плата
Вид снизу
Вид снизу
Упаковал все в готичный корпус
Упаковал все в готичный корпус
Конфигурирование Fuse
Конфигурирование Fuse для Mega48
Fuses для Mega8
Fuses для Mega8
Программатор должен появится в диспетчере устрйств
Программатор должен появится в диспетчере устрйств
GUI Оболочка на AVRDUDE
GUI Оболочка на AVRDUDE

Так как я стараюсь не выкладывать непроверенные решения, то я повторил этот программатор. Чисто для себя, поприколу. Подобрал наиболее компактную схему и перевел ее в формат Sprint Layout. Изготовил печатную плату, стравил. Засверловал и напаял компоненты. Микросхему рекомендую ставить на панельку.

Прошивка программатора
Далее замыкаем перемычку J1 и J2 и подключаем к разьему стандартный последовательный программатор, да хоть тот же программатор Громова. Программатор должен иметь свое питание, иначе нужно подать его на схему.

И заливаем в проц прошивку. Для ATMega8 одна прошивка, для ATmega48 другая. Дальше нужно выставить биты конфигурации.

Для ATMega48:
Старший байт FUSE выставляется как 0хDD, младший 0xFF. На картинке я привел скриншот из UniProf с правильно расставлеными битами конфигурации для контроллера ATMega48.

Если применяется контроллер ATmega8, то байты FUSE таковы:
Старший 0xC9, младший 0xEF

Настройка в работу
После прошивки нужно снять перемычку J1 и все, можно втыкать в комп. Сразу же должно обнаружитсья USB устройство. Скармливаем ему дрова и у нас в системе появляется новый девайс – USBAsp. Если система ругается на драйвера, говорит, что это не драйвер, а фуфел какой то. Значит контроллер либо криво прошился, либо ты забыл снять перемычку J1.

Перемычка J3 используется для прошивки контроллеров у которых частота не превышает 1.5 МГц. Я ее поставил, без нее у меня мега 8 не хотела определяться. Потом подправил меге Fuse биты, чтобы она заработала на 8 Мгц, перемычку не снял, но работает. Слышал, что подправили и теперь перемычку можно не дергать туда сюда.

Красный светодиод показывает, что программатор подключен к USB и запитан. Зеленый, что идет обращение к прошиваемому контроллеру.

Прошивающий софт
Все, теперь можно подключать к программатору провод и тыкать им в прошиваемые контроллеры.
Единственная софтина которая поддерживает этот программатор это AVR-чувак, она же дудка, она же AVRDUDE. Мощнейший консольный программатор. Не стоит пугаться его консольности, во первых батники никто не отменял, а во вторых не него существует несколько оболочек.

ВНИМАНИЕ! В той GUI оболочке что находится в архиве ИНВЕРСНЫЕ FUSE!!! То есть если в даташите написано, что дефолтные SCKEL3..0 = 0100 то тут будет показан 1011!!! Короче, как в PoniProg. Чего эти утырки так вертят эти несчастные FUSE я понять не могу, хоть бы предупреждали, а то бы залочил кристалл нахрен.

Вот, пример командной строки для прошивки через USBAsp — Записываем main.hex во флеш ATmega8:

   avrdude -c usbasp -p atmega8 -U flash:w:main.hex

В архив usbasp.rar я сложил все файлы необходимые для этого программатора:

  • Прошивка для ATMega 48 и ATMega 8
  • Драйвер для винды
  • Схема
  • Печатная плата в формате Sprint Layout
  • Фотки
  • AVRDUDE
  • GUI к AVRDUDE

UPD:
Для тех у кого вдруг пишет, что архив битый, я выложил то же самое в ZIP -USBASP.ZIP

Проверено – работает! Пользуйтесь :)

Страничка автора USBASP – там обновления прошивок, драйверов и варианты разводок плат.

Страничка разработчика GUI оболочки для AVRDude

!!!WARNING!!!
Тут появилась подтвержденная инфа, что новая прошивка (с оригинального сайта автора) может не работать на некоторых компах. У меня в архивах лежит старая прошивка, от 2007 или даже 2006 года. Она может не работать на самых новых компах. Короче, не работает — попробуй другую версию прошивки. С сайта автора или из моего архива.

З.Ы.
Также существует программатор AVR910, работающий также через USB и имеющий практически идентичную конструкцию. Чем он лучше/хуже я не знаю. Но можете попробовать сделать его. А я в скором времени выложу описание изготовления и использования JTAG адаптера для внутрисхемной отладки AVR.

Источник: USB программатор AVR – USBAsp : Электроника для всех.

Arduino, MK-90 и другие: Февраль 2010

SMD

Источник: Arduino, MK-90 и другие: Февраль 2010.

Mapping files over an ssh tunnel

 

Setting up Windows XP to map files with an ssh tunnel

In order to really map a drive remotely you need to do some setup work first. Here is a simple description.

Network Setup

These instructions assume Windows XP, other versions of Windows may look or behave differently. You will almost certainly need to be logged in as an Administrator or a user with Administrator privelage to perform the early setup steps.

Go to Start-menu/Setting/Network connectionsOpen network properties (ideally of the network connection in use):

 

get properties
Select File and printer Sharing …, and click uninstallConfirm removal. network properties
The properties window should now not show that software at all. network properties2
If you are using dial-up networking then the properties windows look a little different and you want the Networking pane not the General one. dialup properties
Ensure that NetBIOS over tcp/ip is enabled, select Internet Protocol (TCP/IP), click Properties, then click on Advanced.Select the Wins pane and ensure that Enable NetBIOS over TCP/IP is checked.

Without this things may still work, but might not!

The (common) default value of this setting of this sets NetBIOS over TCP/IP to be on or off depending on information provided by your ISP servers (their DHCP server for in particular).

So it might work one day and not the next.

enable netbt

 

Putty Setup

Now we need to set up and configure Putty

Select to the Tunnels section on the left hand frame. In the right hand frame enter parameters for adding a new forwarded port

    ensure that Local is checked
    Source port: 139
    Destination: cortex.damtp.cam.ac.uk:139

then hit the Add button.

putty tunnel
It should show the new tunnel information in the Forwarded ports section.Select Session at the top of the left hand frame. putty tunnel2
Enter the Host name, ensure that SSH is checked.Enter a session name into the Saved Sessions box and click on Save. It should now show up in the list of sessions below.

To launch the session hit Open.

putty session
After creating a suitable session as above you can later just select the session, hit Load and Open to avoid having to enter the parameters each time.Or you can run putty/plink on the command line with options like:

  plink -ssh -2 -L \
      139:cortex.damtp.cam.ac.uk:139 \
      login-name@host.damtp.cam.ac.uk

or just load up a saved session by specifying it on the command-line.

load session

 

Map the drive etc

To graphically map the drive, go to the explorer menu: and find Tools/Map Network Drive…

Enter in the folder box: \\127.0.0.1\user-nameEnsure that Reconnect at login is unchecked, click on the connect using a different user name map drive
Enter the User name as: DAMTP\user-nameenter your password, click Ok. connect as
You should see a message about Attempting to connect… while it makes the connection to the file-server.Assuming it all works you should see an explorer window something like:

 

exploring
or of course you could map the drive by running:

  net use z: \\127.0.0.1\login-name /USER:DAMTP\login-name *

from a command line/batch script (if z: is the drive letter to map).

To disconnect graphically go to the explorer menu: Tools/Disconnect Network Drive… select the drive to disconnect and clock on Ok.or you can right click on the drive in the explorer window and select Disconnect.

or from a command line:

  net use z: /delete

if z: was the drive mapped above.

unmap

If you have problems with these instructions please contact…

Источник: Mapping files over an ssh tunnel.

JS1k — пишем отличное веб приложение в 1024 байт / JavaScript / Хабрахабр

JS1k — пишем отличное веб приложение в 1024 байт

Уже второй год я участвую в JS1k, в прошлом году был пробный скрипт, сейчас я решил подойти основательно. Приложения я уже написал и отправил. В статье я хочу поделиться своим опытом: как стоит писать приложение для JS1k, чем сжимать, как сократить код в 4 раза и вообще как впихнуть что-то интересное в 1 Кб.

Тема текущего JS1k «Oregon Trail» — классическая игра для Apple II (что это можно нагуглить). Поэтому рекомендуется написать что-то в этом духе, но это не обязательно.

Начало

Вам необходимо придумать небольшое приложение или демку, которое по вашему мнению может влезть в 1кб (продумать детали и управление). Если вы сомневаетесь в своих прикидках, то можно посмотреть, что впихнули в прошлом году: Legend Of The Bouncing Beholder, Tiny chess. Прочитайте правила и используйте html шаблон — тогда ваше приложение будет 100% работать в демо среде.
Начните писать скрипт, без каких-либо оптимизаций, но следите за его размером. Если он стал больше 4-5Кб — вам стоит придумать другую тему или в будущем придется попотеть (у меня было 4393 байт).

Первичная упаковка кода

Ваш код должен быть в замыкании, иначе ничего не получится. Из всех существующих упаковщиков лучший — UglifyJS на все остальные можно не смотреть. Если вам лень ставить UglifyJS, то используйте веб-интерфейс.
Упакуйте ваш код, если он получился в пределах 1024 байт — отлично — можно дальше не читать, а сразу отправить приложение. То, что ваш код сразу влез в 1024 байт говорит о том, что ваше приложение не достаточно интересное или не детализированное. Если ваш ужатый код стал в пределах 2Кб — все нормально не стоит делать таких глаз «о_О», уверяю вас его можно сократить ещё в 2 раза (у меня было около 1600 байт).

Ручное сжатие или сжимаем несжимаемое

Эта часть об ручном сжатии тех моментов, которые не умеет UglifyJS. Сейчас важен каждый байт!
Каждый раз когда вы что-то исправили упаковывайте код UglifyJS и смотрите размер. Проверяйте, чтобы все работало.

0. Не стоит делать работу за минификатор — срочно дайте понятные названия всем свойствам/функциям! Пишите читаемый код, минификатор удалит лишние скобки и точки с запятой за вас.
1. Если вы точили под IE — удалите все хаки — он не участвует (ch9+, o11+, fx3.6+, sa5+).
2. Удалите все хаки (дописанные функции bind, forEach), да прямо сейчас.
3. Вам надо избавиться от зарезервированных слов — удаляйте лишние var, typeof. Сократите число функций до минимума (объедините если возможно).
4. Весь HTML, созданный через DOM, перепишите на ручное создание(строки).
5. Найдите часто употребляемые имена методов свойств (2 и более раза) и строковые и числовые константы — составьте словарь и замените точечный вызов на скобочный.

// Было:
var canvas, div1, div2;
canvas.moveTo(150, 150);
canvas.moveTo(153, 151);
canvas.moveTo(11, 151);
canvas.moveTo(153, 120);
canvas.moveTo(153, 1);
div1 = '<div style="width:150px;height:200px;color:red"></div>';
div2 = '<div style="width:150px;height:200px;color:blue"></div>';

// Стало:
var canvas, div1, div2,
      __moveTo__ = 'moveTo';
      __width_height__ = 'width:150px;height:200px;';
canvas[__moveTo__](150, 150);
canvas[__moveTo__](153, 151);
canvas[__moveTo__](11, 151);
canvas[__moveTo__](153, 120);
canvas[__moveTo__](153, 1);
div1 = '<div style="' + __width_height__ + 'color:red"></div>';
div2 = '<div style="' + __width_height__ + 'color:blue"></div>';

Формула показывающая на сколько сократится код
Для методов: (N * (L+1)) - (N * (2 + V) + V + 4 + L)
L — длина метода без точки
N — число вызовов
V — длина переменной после уменьшения минификатором (обычно 1)
В нашем случае мы получим 9 байт

Для строк (в худшем случае): N * L - (N * (4 + V) + V + 4 + L)
L — длина строки
N — число замен
V — длина переменной после уменьшения минификатором (обычно 1)
В нашем случае мы получим 13 байт

6. Вынесите часто используемые глобалы в переменную var __document__ = document;
7. Не используйте with
8. Используйте только глобальные переменные вашего замыкания
9. Замените циклы for на while, избавьтесь от оптимизаций счетчиков c = smth.length

// Было:
for (i = 0;i<smth.length; i++)do(i);

// Стало:
i=smth.length;while(i--)do(i);

Ещё минус 6*N байт
10. Если вы создаете функции через Function Expression var blabla= function (){}; переделайте их в Function Defination function blabla(){} Ещё минус пара байт.
11. Вместо getElementById, getElementsByTagName используйте querySelector, querySelectorAll
12. Вместо Math.round(num) используйте ~~num
13. Удалите двойные и одинарные кавычки из атрибутов вашего HTML кода <div id="aaa"> - <div a=aaa>
14. Замените строки в id элементов на числа <div id=aaa> - <div a=1>
15. Сократите цвета до 3-4 символов. Не стоит использовать точные цвета их можно всегда заменить идентичными для восприятия. '#ff0000' -> 'red', '#fedc52' -> '#fd5'
16. js1k предоставляет нам 3 переменные for free, используйте их и внесите их в своё замыкание в порядке a, b, c

var b = document.body;
var c = document.getElementsByTagName('canvas')[0];
var a = c.getContext('2d');
(function (ctx, __document__body__, canvas) {
// Ваш код
}(a,b,c))

Порядок a,b,c важен потому, что минифиикатор переделает ваш код в такой вид:

(function(a,b,c){
// Ваш код
}(a,b,c))

И вам не нужно будет парься об сопоставлении имен внутренних переменных с внешними и можно будет убрать глобальное замыкание. Минус целых 26 байт!
17. Используйте короткое сравнение e.keyCode^27||e.preventDefault() вместо e.keyCode==27&&e.preventDefault()
18. Если ваш код все ещё больше 1024 — начинайте удалять не важные блоки (детали), если это возможно.
19. Если у вас не демка и не игра, то вам нужно намекнуть пользователю как ей пользоваться не читая описание.

Пример, того, что может у вас получиться после ручной оптимизации

В этом году я решил создать sticky notes приложение с сохранением данных в localStorage. Вот такой код получился у меня после оптимизации:

// Creating closure to compile with UglifyJS
// After compile remove global closure manually
(function (ctx, __document__body__, canvas) {

    // Dictionary for some frequently used method names and strings
    var __fillStyle__ = 'fillStyle',
        __addEventListener__ = 'addEventListener',
        __dblclick__ = 'dblclick',
        __setAttribute__ = 'setAttribute',
        __background_and_left__ = 'position:absolute;left:',
        __fillRect__ = 'fillRect',
        __addColorStop__ = 'addColorStop',
        __innerHTML__ = 'innerHTML',
        __textarea__ = 'textarea',
        __ffe__ = '#ffe',

    // Other shorthands
        __document__ = document,
        __localStorage__ = localStorage,
        i,j,c,imageData,
        width = 200,
        height = 250,
        paperGradient = ctx.createLinearGradient(width, height/2, width, 0);

    // Making fixed canvas size
    canvas[__setAttribute__]('width', 202);
    canvas[__setAttribute__]('height', 275);

    // Binds keydown event - "remove note by Esc button" to all divs
    function bindEvents() {
        c = __document__.querySelectorAll('div');
        i=c.length;while(i--)c[i][__addEventListener__]('keydown', function(e){e.keyCode^27||__document__body__.removeChild(this),save()},0);
    }

    // Creates note at e.clientX e.clientY
    function createPaper(e) {
        __document__body__[__innerHTML__] += '<div style=' + __background_and_left__ + e.clientX + 'px;top:' + e.clientY + 'px;><img src=' + imageData + '><' + __textarea__ + ' onkeyup=this.'+__innerHTML__+'=this.value style=' + __background_and_left__ + '28px;top:33px;background:transparent;width:170px;height:200px;border:0;line-height:20px;overflow:hidden>Esc</' + __textarea__ + '></div>';
        bindEvents();
        save();
    }

    // Saves document.body to localStorage
    function save() {
        __localStorage__[__dblclick__] = __document__body__[__innerHTML__];
    }

    // Making sexy paper
    // Gradient
    paperGradient[__addColorStop__](0, '#ff9');
    paperGradient[__addColorStop__](1, __ffe__);

    ctx[__fillStyle__] = paperGradient;
    ctx.strokeStyle = '#aa7';

    // Draw paper body
    ctx.strokeRect(1,1, width,height);
    ctx[__fillRect__](1,1, width,height);

    // Creating paper texture
    i = width;
    ctx[__fillStyle__] = __ffe__;
    while(--i) {
        while(--j) {
            Math.random()>.7&&ctx[__fillRect__](i,j,1,1);
        }
        j = height;
    }

    // 2 Vertical red lines
    ctx[__fillStyle__] = '#a51';
    ctx[__fillRect__](20, 1, 1, height);
    ctx[__fillRect__](22, 1, 1, height);

    // Some horizontal gray lines
    ctx[__fillStyle__] = '#aaa';
    for (i = 50; i < height; i += 20) ctx[__fillRect__](0, i, width, 1);

    // Grabbing image source
    imageData = canvas.toDataURL();

    // Print "Hello message" or load localStorage content
    __document__body__[__innerHTML__]=__localStorage__[__dblclick__] || __dblclick__+', uses ' + __localStorage__;
    bindEvents();
    // Some action events
    __document__[__addEventListener__](__dblclick__, createPaper, 0);
    // Opera haven't onbeforeuload event
    // I must save document.body content on each keyup and each keyCode=27 keydown
    // Sorry... :3
    __document__body__[__addEventListener__]('keyup', save, 0);

}(a,b,c)) // Vars must be in a, b, c order

Этот код сжимается Углифаером до 1048 байт, потом удаляется глобальное замыкание и он сокращается ещё до 1022 байт. При оптимизации мне пришлось сократить некоторые детали.

Ссылки на мою демку

Оригинал — то, что было в начале (двойной клик создает заметку, Esc по заметке — удаляет, данные красиво лежат в localStorage) JS — 4393 байт: azproduction.ru/labs/1kjs-ios-javascript-notes/index.original.html
Демка на JS1k (управление аналогично оригиналу) JS — 1022 байт: js.gd/1hn

Если сравнить эти 2 приложения, то фактически они ничем не отличаются. Из второго убран скотч и нет числа создания.

То, что не вошло в советы, но пригодится в будущем

-1. Используя bind можно значительно сократить длину вызова метода. FF 3.6 не умеет bind поэтому такой способ нам пока не подходит.

// Без изменений
c.lineTo(150,150);c.lineTo(150,200);c.lineTo(150,250);c.lineTo(250,350);c.lineTo(450,350);
// Оптимизация со словарем
var a='lineTo';c[a](150,150);c[a](150,200);c[a](150,250);c[a](250,350);c[a](450,350);
// Оптимизация с контекстом
var a=z.lineTo.bind(z);a(150,150);a(150,200);a(150,250);a(250,350);a(450,350);

Если вы захотели участвовать, то не стоит откладывать все на последний момент — придумывайте демки, уменьшайте код. До дедлайна JS1k ещё очень далеко — 24 апреля 2011. Удачи!

Критика, пожелания, советы по уменьшению кода приветствуются!

Источник: JS1k — пишем отличное веб приложение в 1024 байт / JavaScript / Хабрахабр.

Что почитать на выходных? Рекомендуем / Web-разработка / Хабрахабр

CSS спрайты из командной строки из песочницы

Да, инструменты для создания CSS спрайтов существуют. Я даже сделал один такой сервис. Но они время от времени ломаются (как сейчас, мой). Но и командная многого стоит, и imagemagick. Давайте посмотрим, как мы можем создавать CSS спрайты только из командной строки.

Создание картинки

Начнем с того, что у нас есть список отдельных файлов:

$ ls
1.png  2.gif  dot.png  phoney.gif  tw.gif
  • — 1.png
  • — 2.gif
  • — dot.png
  • — phoney.gif
  • — tw.gif

Сделаем из них спрайт:

$ convert *png *gif -append result/result-sprite.png

Да, это все. Смотрим результат.

Подробнее

Команда imagemagick обычно выглядит так:

$ convert image1.png image2.png image3.png -append result/result-sprite.png

Мы можем заменить список картинок звездочкой:

$ convert * -append result-sprite.png

Или как в предыдущем случае маской *.gif и *.png.
А как насчет горизонтального спрайта? Все что нужно — заменить -append на +append:

$ convert *png *gif +append result/result-sprite-horizon.png

Результат:

Также заметьте, что исходные картинки могут быть любого формата — GIF, PNG, JPEG, на выходе получаем PNG. Я бы рекомендовал начинать с PNG8:

$ convert *png *gif -append PNG8:result/result-sprite-horizon.png

CSS

Так как это все ручные операции, CSS автоматически не генерируется. Но это также довольно просто. Возьмем вертикальный спрайт:

Все картинки будут иметь свойство background-position-x равным 0px.
У первой картинки 16×16 координата background-position-y также 0px. Тогда:

.first {
  width: 16px;
  height: 16px;
  background: url(result/result-sprite.png) 0 0;
}

… где координаты 0 0 необязательны и их можно опустить.
Вторая картинки также 16×16, так удобнее. Ее X координата равна 0, а Y — высота предыдущей картинки с противоположным знаком:

.second {
  width: 16px;
  height: 16px;
  background: url(result/result-sprite.png) 0 -16px;
}

И так далее. Y координата = Y предыдущего элемента — высота предыдущего.
Но… но… каждый раз выяснять размеры и отслеживать высоту? Вы шутите?
Imagemagick приходит на помощь. ‘identify’ позволяет получить основную информацию о картинке:

$ identify 1.png
1.png PNG 16x16 16x16+0+0 DirectClass 8-bit 260b

‘identify’ также имеет опцию ‘-format’ и поддерживает маску *. Поэтому получить всю информацию в приятной форме легко:

$ identify -format "%g - %f\n" *
16x16+0+0 - 1.png
16x16+0+0 - 2.gif
6x6+0+0 - dot.png
10x16+0+0 - phoney.gif
16x16+0+0 - tw.gif

%f — имя файла, %g — геометрия.
\n — перенос строки для удобства вывода на экран.
Поэтому если вы хотите получить Y координату 5 элемента, просуммируйте высоты предыдущих: 16+16+6+16

.last {
  width: 16px;
  height: 16px;
  background: url(result-sprite.png) 0 -54px
}

Немного оптимизаций

Imagemagick не генерирует оптимизированные PNG, поэтому немного оптимизаций необходимы. Вы можете использовать pngout, optipng и др. Или web инструменты, как smush.it или punypng.com.
Или как насчет… smush.it в командной строке:

$ curl http://www.smushit.com/ysmush.it/ws.php?img=http://www.phpied.com/files/sprt/result/result-sprite.png

Резульат — JSON объект:

{"src":"http:\/\/www.phpied.com\/files\/sprt\/result\/result-sprite.png",
 "src_size":1759,
 "dest":"http:\/\/smushit.zenfs.com\/results\/5a737623\/smush\/%2Ffiles%2Fsprt%2Fresult%2Fresult-sprite.png",
 "dest_size":1052,
 "percent":"40.19",
 "id":""}

Экономия почти вдвое. Скопируйте поле «dest»

$ curl http:\/\/smushit.zenfs.com\/results\/5a737623\/smush\/%2Ffiles%2Fsprt%2Fresult%2Fresult-sprite.png > result/smushed-sprite.png

Вот и все.

Подведем итог

1. Создаем спрайт:

$ convert *png *gif -append PNG8:result/result-sprite.png

2. Получаем размеры:

$ identify -format "%g - %f\n" *png *gif

3. И оптимизируем:

$ curl http://www.smushit.com/ysmush.it/ws.php?img=http://url... 

Перевод статьи Стояна Стефанова Command-line CSS spriting.

P. S. Тема ImageMagick уже упоминалась на хабре, но вторая часть этой статьи мне показалась полезной и я решил перевести ее целиком.

Источник: Что почитать на выходных? Рекомендуем / Web-разработка / Хабрахабр.

CSS спрайты из командной строки / Клиентская оптимизация / Хабрахабр

CSS спрайты из командной строки из песочницы

Да, инструменты для создания CSS спрайтов существуют. Я даже сделал один такой сервис. Но они время от времени ломаются (как сейчас, мой). Но и командная многого стоит, и imagemagick. Давайте посмотрим, как мы можем создавать CSS спрайты только из командной строки.

Создание картинки

Начнем с того, что у нас есть список отдельных файлов:

$ ls
1.png  2.gif  dot.png  phoney.gif  tw.gif
  • — 1.png
  • — 2.gif
  • — dot.png
  • — phoney.gif
  • — tw.gif

Сделаем из них спрайт:

$ convert *png *gif -append result/result-sprite.png

Да, это все. Смотрим результат.

Подробнее

Команда imagemagick обычно выглядит так:

$ convert image1.png image2.png image3.png -append result/result-sprite.png

Мы можем заменить список картинок звездочкой:

$ convert * -append result-sprite.png

Или как в предыдущем случае маской *.gif и *.png.
А как насчет горизонтального спрайта? Все что нужно — заменить -append на +append:

$ convert *png *gif +append result/result-sprite-horizon.png

Результат:

Также заметьте, что исходные картинки могут быть любого формата — GIF, PNG, JPEG, на выходе получаем PNG. Я бы рекомендовал начинать с PNG8:

$ convert *png *gif -append PNG8:result/result-sprite-horizon.png

CSS

Так как это все ручные операции, CSS автоматически не генерируется. Но это также довольно просто. Возьмем вертикальный спрайт:

Все картинки будут иметь свойство background-position-x равным 0px.
У первой картинки 16×16 координата background-position-y также 0px. Тогда:

.first {
  width: 16px;
  height: 16px;
  background: url(result/result-sprite.png) 0 0;
}

… где координаты 0 0 необязательны и их можно опустить.
Вторая картинки также 16×16, так удобнее. Ее X координата равна 0, а Y — высота предыдущей картинки с противоположным знаком:

.second {
  width: 16px;
  height: 16px;
  background: url(result/result-sprite.png) 0 -16px;
}

И так далее. Y координата = Y предыдущего элемента — высота предыдущего.
Но… но… каждый раз выяснять размеры и отслеживать высоту? Вы шутите?
Imagemagick приходит на помощь. ‘identify’ позволяет получить основную информацию о картинке:

$ identify 1.png
1.png PNG 16x16 16x16+0+0 DirectClass 8-bit 260b

‘identify’ также имеет опцию ‘-format’ и поддерживает маску *. Поэтому получить всю информацию в приятной форме легко:

$ identify -format "%g - %f\n" *
16x16+0+0 - 1.png
16x16+0+0 - 2.gif
6x6+0+0 - dot.png
10x16+0+0 - phoney.gif
16x16+0+0 - tw.gif

%f — имя файла, %g — геометрия.
\n — перенос строки для удобства вывода на экран.
Поэтому если вы хотите получить Y координату 5 элемента, просуммируйте высоты предыдущих: 16+16+6+16

.last {
  width: 16px;
  height: 16px;
  background: url(result-sprite.png) 0 -54px
}

Немного оптимизаций

Imagemagick не генерирует оптимизированные PNG, поэтому немного оптимизаций необходимы. Вы можете использовать pngout, optipng и др. Или web инструменты, как smush.it или punypng.com.
Или как насчет… smush.it в командной строке:

$ curl http://www.smushit.com/ysmush.it/ws.php?img=http://www.phpied.com/files/sprt/result/result-sprite.png

Резульат — JSON объект:

{"src":"http:\/\/www.phpied.com\/files\/sprt\/result\/result-sprite.png",
 "src_size":1759,
 "dest":"http:\/\/smushit.zenfs.com\/results\/5a737623\/smush\/%2Ffiles%2Fsprt%2Fresult%2Fresult-sprite.png",
 "dest_size":1052,
 "percent":"40.19",
 "id":""}

Экономия почти вдвое. Скопируйте поле «dest»

$ curl http:\/\/smushit.zenfs.com\/results\/5a737623\/smush\/%2Ffiles%2Fsprt%2Fresult%2Fresult-sprite.png > result/smushed-sprite.png

Вот и все.

Подведем итог

1. Создаем спрайт:

$ convert *png *gif -append PNG8:result/result-sprite.png

2. Получаем размеры:

$ identify -format "%g - %f\n" *png *gif

3. И оптимизируем:

$ curl http://www.smushit.com/ysmush.it/ws.php?img=http://url... 

Перевод статьи Стояна Стефанова Command-line CSS spriting.

P. S. Тема ImageMagick уже упоминалась на хабре, но вторая часть этой статьи мне показалась полезной и я решил перевести ее целиком.

Источник: CSS спрайты из командной строки / Клиентская оптимизация / Хабрахабр.

Intel IT Galaxy -> Virtual Wi-Fi в Windows 7

Автор: Azazela
entry 25.12.2009, 13:18

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

За время своего существования беспроводные сети (Wireless Local Area Network – WLAN), пережили много изменений, которые затронули безопасность, дальность и скорость; но основной принципы работы так и остались неизменным.

Беспроводные сети могут работать в двух режимах:

  • когда два и более устройства соединены непосредственно между собой, точка-точка.
  • когда они подключены через точку доступа (Access Point-AP).

В первом случае говорят о простой сети (ad-hoc mode). Использование данного режима работы встречается достаточно редко и используется, в основном, для обмена данными, когда нет возможности использовать точку доступа.

Второй режим, с использованием точки доступа, называется инфраструктурным (infrastructure mode) и, в большинстве случаев, применяется совместно c беспроводным маршрутизатором, подключенным к интернету. Но использование одновременно двух режимов работы на одном физическом беспроводном адаптере не предусмотрено самой концепцией Wi-Fi.

В поисках новых способов использования беспроводных сетей была предложена концепция виртуализации, которая снимает определенные ограничения с использования таких сетей и тем самым расширяет их возможности. Данный подход к использованию беспроводных адаптеров был реализован несколькими компаниями со своими названиями технологий. В Intel это Intel My WiFi, а в Microsoft это Virtual WiFi.

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

Для чего может пригодиться, эта технология? Например, для создания персональной сети (Wireless Personal Area Network – Wireless PAN- WPAN), к которой можно быстро подключить КПК, телефон, принтер, фотоаппарат, ноутбук и другое устройство с беспроводным адаптером для простого обмена информацией; использовать ноутбук как хот-спот (Hotspot) для предоставления доступа к интернету беспроводным устройствам, разделяя имеющееся на ноутбуке подключение к интернету, неважно – Еthernet, Wi-Fi, 3G или WiMax. Другим примером может быть, когда радиосигнал недостаточно стабилен или не покрывает нужного расстояния между точкой доступа и беспроводными устройствами. В этом случае компьютер или ноутбук с технологией Virtual Wi-Fi может выступать в качестве репитера, тем самым расширяя зону покрытия беспроводной сети.

В Windows 7 и Windows 2008 R2 технология Virtual WiFi была включена в состав операционной системы и реализована на уровне ядра; кроме того, была проделана работа для простой реализации программной точки доступа (Software Access Point – SoftAP). При этом от производителей беспроводных устройств теперь требуется только реализовать поддержку SoftAP в своих драйверах. В связи с этим, в текущей реализации Virtual WiFi в Windows 7 и Windows 2008 R2 возможно создать только один виртуальный адаптер, который будет работать только в режиме точки доступа, при этом обеспечивая шифрование только по WPA2-PSK/AES (то есть, если устройство не поддерживает данный режим работы, то оно не сможет подключиться к программной точке доступа).

Кстати говоря, поддержка Virtual WiFi в драйверах, является обязательным требованием для сертификации беспроводных адаптеров на совместимость с Windows 7.

Сеть, созданная с помощью технологии Virtual WiFi, обозначается как Wireless Hosted Network, в русском переводе от Microsoft это Размещенная Сеть. В связи с ведением технологии Virtual WiFi в новых операционных системах от Microsoft, в network shell были добавлены новые команды для управления распределенной сетью; приведем некоторые из них:

  • netsh wlan set hostednetwork [mode=]allowed|disallowed – Разрешить или запретить использование сети.
  • netsh wlan set hostednetwork [ssid=]<идентификатор_SSID> [key=]<парольная_фраза> [keyUsage=]persistent|temporary – Настройка параметров сети размещение, где SSID – идентификатор SSID сети; Key- Ключ безопасности пользователя, используемый сетью; keyUsage указывается является ключ безопасности постоянным или временным
  • netsh wlan show settings – Показывает свойство сети и ее состояние.
  • netsh wlan show hostednetwork settings=security – Отображает параметры безопасности размещенной сети. (Показывает, в том числе пароль заданный в key при настройке netsh wlan set hostednetwork)
  • netsh wlan start hostednetwork – Запустить размещение сети.
  • netsh wlan stop hostednetwork – Остановить размещение сети.

Как выглядит настройка Virtual Wi-Fi на практике: нам потребуется ноутбук или обычный персональный компьютер с беспроводным устройствам, Windows 7 и драйвер, поддерживающий Virtual WiFi. (Существует большая вероятность того, что загруженный драйвер беспроводного адаптера с Windows Update уже имеет поддержку Virtual WiFi)

Если выше описанные критерии выполняются, то вызываем командную строку, с правами администратора и выполнить в ней следующую команду:

netsh wlan set hostednetwork mode=allow ssid=»MS Virtual Wi-Fi» key=»Pass for virtual wifi» keyUsage=persistent

В данном примере «MS Virtual Wi-Fi» – имя беспроводной сети, «Pass for virtual wifi«-пароль для доступа к этой сети. (но вы можете задать данные значения по своему усмотрению).

После выполнения данной команды, система найдет новое оборудование и в диспетчере устройств появится новый виртуальный сетевой адаптер – Адаптер мини-порта виртуального WiFi Microsoft (Microsoft Virtual WiFi miniport adapter). Но, опять же, данный виртуальный адаптер появиться только в том случаи, если у нас драйвер беспроводного адаптера имеет поддержку Virtual WiFi.

Перейдя в Панель управленияЦентр управления сетями и общим доступомИзменение параметров адаптера, увидим новое соединение Wireless Network Connection 2, которое будет показывать статус – нет подключения.

Поэтому следующим этапом будет запуск сети. Для этого необходимо в командной строке, так же запущенной с правами администратора, выполнить команду:

netsh wlan start hostednetwork.

После этого сеть запустится и заработает программная точка доступа (SoftAP), в этом можно убедиться, перейдя в Панель управленияЦентр управления сетями и общим доступом. Так как у нас уже используется подключение к интернету по Wi-Fi, мы обнаружим, что Windows 7 подключена одновременно к нескольким беспроводным сетям. Теперь другие беспроводные устройства могут подключаться к нашей точке доступа.

Если мы хотим предоставить доступ к интренету другим беспроводным устройствам, которые подключены к нашей программной точке доступа (то есть организовать Хот-Спот – Hotspot), необходимо перейти в закладку Панель управленияЦентр управления сетями и общим доступом – Изменение параметров адаптера и в свойствах соединения, через которое ноутбук получает интернет (в нашем случае это подключение по Wi-Fi, но оно может быть любым: ethernet, 3G, WiMax и т.п.), в закладке доступ поставить галочку Разрешить другим пользователям сети использовать подключение к Интернету данного компьютера, а в Подключение домашней сети указать, на какой сетевой адаптер предоставить (расшарить) интернет, в нашем случае это будет Wireless Network Connection 2, который относится к виртуальному беспроводному адаптеру.

Со стороны клиента можно увидеть несколько беспроводных сетей и при подключении к организованной нами точке доступа, клиент автоматически получит IP адрес с внутреннего DHCP сервера и будет отделен от внешней сети NAT (Network address translation).

Посмотреть состояние размещенной сети – количество клиентов, параметры соединений, протокол работы, возможно через выполнение в командной строке команды:

netsh wlan show hostednetwork.

Одной из особенных возможностей MS Virtual WiFi, по сравнению с Intel My WiFi, является максимальное количество подключаемых клиентов, их – до 100. Конечно, с практической стороны, цифра почти не достижимая; но вполне возможно, что в ограничение всего в 8 клиентов можно «упереться» при использовании My WiFi.

Удобства использования Virtual Wi-Fi очевидны, но вот использование командной строки для конфигурации и запуска сети (а запускать размешенную сеть нужно каждый раз после перезагрузки компьютера, выхода из спящего и ждущегорежимов; причем с правами администратора), не совсем удобно, да и встроенной графической оболочки для настройки Virtual WiFi, к сожалению, нет. Поэтому не удивительно появление сторонних утилит, которые и выполняют функции этой самой оболочки. Сейчас таких утилит несколько, это Connectify и Virtual Router Manager, настройка их тоже сводиться к минимуму: нужно указать SSID и пароль для доступа. Они загружаются вместе с системой и сразу обеспечивают включение распределенной сети, кроме того они умеют отображают все текущие и прошлые подключения к нашей распределенной сети.

(ред. O_Smirnoff)

Прикрепленные файлы Прикрепленный файл wifi.bmp ( 1.41 мегабайт ) Кол-во скачиваний: 2261
Прикрепленный файл wifi.bmp ( 1.41 мегабайт ) Кол-во скачиваний: 3523

Источник: Intel IT Galaxy -> Virtual Wi-Fi в Windows 7.

Самый короткий аплоадер картинок! / JavaScript / Хабрахабр

Самый короткий аплоадер картинок!

В этой статье раскрыто, как можно сделать очень простой аплоадер, с кодом только на клиенте, используя API хостинга картинок. Если вас интересует более продвинутый аплоадер с такими штуками, как ресайз, кроп, рисование и т.п. — читайте статью How to develop a HTML5 Image Uploader. Содержимое статьи примечательно использованием FormData() и Cross-Domain XHR.

Представляю Вашему вниманию аплоадер картинок, работающий в Chrome и Firefox 4, состоящий из нескольких строчек Javascript! Базируется он на imgur.com API, используя Drag’n Drop support и Cross-Domain XMLHttpRequest. То есть, Вы можете использовать API создателя Imgur.com для загрузки изображений на сайт со своей html-странички, не используя код на сервере.

Вот пример того, что можно сделать с его помощью (полный код):

function upload(file) {

  // файл из тега <input> или из Drag'n Drop
  // Является ли файл изображением?

  if (!file || !file.type.match(/image.*/)) return;

  // Это оно!
  // Создаём объект FormData

  var fd = new FormData();
  fd.append("image", file); // Append the file
  fd.append("key", "6528448c258cff474ca9701c5bab6927");
  // Получите собственный ключ: http://api.imgur.com/

  // Сделайте XHR (Cross-Domain XH, чёрт побери!!!)
  var xhr = new XMLHttpRequest();
  xhr.open("POST", "http://api.imgur.com/2/upload.json"); // Boooom!
  xhr.onload = function() {
    // Победа!
    // URL изображения:
    JSON.parse(xhr.responseText).upload.links.imgur_page;
   }
   // Я не рассматривал ошибки, чтобы пример был короче.
   // А сейчас отправляем formdata
   xhr.send(fd);
 }

Вот и всё!

Источник: Самый короткий аплоадер картинок! / JavaScript / Хабрахабр.