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

Автор DI HALT
Опубликовано 15 Авг 2008
Рубрики: Готовые устройства
Метки: AVR, Программатор
|
| Вид сверху |
!!! ЭТЕНШН !!!
Появилась схема USB программатора которая НЕ требует предварительной прошивки управляющего микроконтроллера.
Так как у многих уже давным давно нет ни COM ни LPT порта, то я решил выложить схему USB программатора для AVR. Это будет широко известный в узких кругах USBASP. Схема простая как три копейки, но COM или LPT порт все же потребуется – для того, чтобы прошить управляющий контроллер. Так что можешь сходить к другану. Программатор строится на контроллере ATMega48 или ATMega8. Нужна именно 8 или 48, без всяких индексов L. Так как у нас требуется частота выше чем 8 Мгц.
Сборка
|
| Схема USBASP |
|
| Печатная плата |
|
| Вид снизу |
|
| Упаковал все в готичный корпус |
|
| Конфигурирование Fuse для Mega48 |
|
| Fuses для Mega8 |
|
| Программатор должен появится в диспетчере устрйств |
|
| 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 я сложил все файлы необходимые для этого программатора:
UPD:
Для тех у кого вдруг пишет, что архив битый, я выложил то же самое в ZIP -USBASP.ZIP
Проверено – работает! Пользуйтесь
Страничка автора USBASP – там обновления прошивок, драйверов и варианты разводок плат.
Страничка разработчика GUI оболочки для AVRDude
!!!WARNING!!!
Тут появилась подтвержденная инфа, что новая прошивка (с оригинального сайта автора) может не работать на некоторых компах. У меня в архивах лежит старая прошивка, от 2007 или даже 2006 года. Она может не работать на самых новых компах. Короче, не работает — попробуй другую версию прошивки. С сайта автора или из моего архива.
З.Ы.
Также существует программатор AVR910, работающий также через USB и имеющий практически идентичную конструкцию. Чем он лучше/хуже я не знаю. Но можете попробовать сделать его. А я в скором времени выложу описание изготовления и использования JTAG адаптера для внутрисхемной отладки AVR.
Источник: USB программатор AVR – USBAsp : Электроника для всех.
SMD
Источник: Arduino, MK-90 и другие: Февраль 2010.
In order to really map a drive remotely you need to do some setup work first. Here is a simple description.
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):
|
![]() |
| Select File and printer Sharing …, and click uninstallConfirm removal. | ![]() |
| The properties window should now not show that software at all. | ![]() |
| 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. | ![]() |
| 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. |
![]() |
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. |
![]() |
| It should show the new tunnel information in the Forwarded ports section.Select Session at the top of the left hand frame. | ![]() |
| 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. |
![]() |
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. |
![]() |
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 |
![]() |
Enter the User name as: DAMTP\user-nameenter your password, click Ok. |
![]() |
| 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:
|
![]() |
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. |
![]() |
If you have problems with these instructions please contact…
Источник: Mapping files over an ssh tunnel.
Уже второй год я участвую в 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 / Хабрахабр.
Начнем с того, что у нас есть список отдельных файлов:
$ 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 автоматически не генерируется. Но это также довольно просто. Возьмем вертикальный спрайт:

Все картинки будут иметь свойство 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-разработка / Хабрахабр.
Начнем с того, что у нас есть список отдельных файлов:
$ 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 автоматически не генерируется. Но это также довольно просто. Возьмем вертикальный спрайт:

Все картинки будут иметь свойство 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 спрайты из командной строки / Клиентская оптимизация / Хабрахабр.
|
Автор: Azazela
|
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 были добавлены новые команды для управления распределенной сетью; приведем некоторые из них:
Как выглядит настройка 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 и пароль для доступа. Они загружаются вместе с системой и сразу обеспечивают включение распределенной сети, кроме того они умеют отображают все текущие и прошлые подключения к нашей распределенной сети.
Прикрепленные файлы
wifi.bmp ( 1.41 мегабайт ) Кол-во скачиваний: 2261
wifi.bmp ( 1.41 мегабайт ) Кол-во скачиваний: 3523
Источник: Intel IT Galaxy -> Virtual Wi-Fi в Windows 7.
В этой статье раскрыто, как можно сделать очень простой аплоадер, с кодом только на клиенте, используя 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 / Хабрахабр.