Перейти к основному содержимому

SMS gateway

· 2 мин. чтения

SMS или short message system разрабатывалась еще в восьмидесятых, но реально пришла на смену пейджерам с появлением мобильных телефонов.

Microsoft Word 2003 XML

· 1 мин. чтения

Продукт Microsoft, Word 2007 проработан основательно - изменён не только дизайн но и введена поддержка XML экспорта. Увы структура его неизвестна, а ресурс, указанный в качестве документации, schemas.microsoft.com пуст. 

Сама по себе схема также известна как WordProcessingML и её простейший вид:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
<?mso-application progid="Word.Document"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
<w:body>
<w:p>
<w:r>
<w:t>WordML -- XML in Microsoft Word 2003</w:t>
</w:r>
</w:p>
</w:body>
</w:wordDocument>

Что это предоставляет? Теперь возможно экспортировать информацию в xml, а затем при помощи парсера распознавать нужные блоки и использовать в своём приложении, т.е. фактически возможен Data Mining. Другое дело что порою легче сделать copy-paste, но я не рассматриваю этот вариант пока что.

Список документации: 

Некоторые готовые продукты..

  •  WordMLToFO XSLT конвертор платный

Диагностика дигитальных систем

· 13 мин. чтения

О предмете

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

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

В Таллиннском Техническом Университете лектор по этому предмету (IAF0050) - Раймонд Убар, подошедший хорошо с теоретической и материальной частью к образованию, поскольку всё доступно из сети:


Лабораторные работы

Первая называется Test generation и состоит в практике генерировать вручную и программно векторы (сигналы на входах) так, чтобы те покрывали все возможные ошибки в схеме. Лабораторная разделяется на три части, по схемам - достаточно простая (вариант которой вы получаете в задании), где необходимо ввести вручную 14 векторов взяв их с потолка и добиться 100% покрытия ошибок, потом алгоритмически смотря на схему, добиться значительно лучшего результата (см. ниже).

Работа может происходить как на Sun-ах с Open Windows оболочкой, так и с Common Desktop Enviroment, так и на простой Windows 98/XP/...
Для Windows тогда необходимо скачать пакет программ Turbo Tester чтобы практиковаться дома. На лабораторных же все программы уже встроены и можно сразу вводить комманды.

Для работы с первым заданием достаточно сохранить source-файл с расширением agm к себе в папку и открыть его коммандой vecmanager. Далее вводим векторы и проводим fault simulation. Смотрим сколько покрыто ошибок и т.д.

Второе задание посложней, схема представляет собой "full 8-bit ripple-carry adder" и состоит в том что-бы сопоставить техники автоматического выбора векторов а также алгоритмически выбрать некоторые вектора (см. ниже).. Автоматический подбор осуществляется коммандами generate, random, genetic. Время генерации и число векторов и надо сопоставить.

Третья схема ещё сложней, но по сути - самая лёгкая. Для неё надо выпонить те же три комманды, получить статистику и посчитать "цену" для каждой процедуры.. Genetic всегда получается самой дешёвой например. Альфа =1 , Beta=0.1 Gamma=10 кажись.

Теперь об алгоритмическом решении первой схемы.. Как говорят лекции и англоязычная документация лабораторной, у нас есть простая комбинационная схема из AND, OR, NAND, NOR, NOT элементов. Нам необходимо проверить схему на наличие неисправностей. Предполагаем что неисправности ограничиваются поломками соединений так, что возможные ошибки это константа ноль ( =0 ) и константа единица ( =1 ). Теперь чтобы проверить все соединения, будем проверять соединения не по одиночке, а соединения при логических элементах. Легко видеть, что элементы с двумя входами AND, NAND, OR, NOR полностью проверяются на наличие неисправностей тремя векторами во всех соединениях. Элементы с тремя входами нуждаются в четырёх векторах.

Проверка всей схемы начинается с проверки самого правого элемента (или одного из них). Ставим на него нужные три проверочных вектора и логически следим, какие сигналы нужны для этого на входе. Так получаем предполагаемые нужные вектора. По мере слежения, может возникнуть ситуация конфликта где на одном разветвлении соединения должна идти единица, а на другом - ноль.. Также по мере слежения, вектора на входе получаются в несовсем определённом виде.. скажем некоторые входы могут иметь любое значение, некоторые можно выбрать в зависимости от других и тп. С такими ситуациями надо разбираться глядя уже на левые элементы схемы.

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

Алгоритмическое решение второго задания.
Каждый сумматор состоит из двоичных элементарных сумматоров, где на входе a0 , b0 - двочные разряды которые надо сложить и c0 - значение переноса с предыдущего сумматора. Имея 8 подобных сумматоров и выстроив их один за другим, нарисуем табличку

c0a0b0c1a1b1c2
0000000
0010010
0100100
0111000
1000111
1011011
1101101
1111111

в каждом блоке сумматор проверяется на все 8 возможных значений со входа, которые дальше передаются в следующий сумматор.. так мы проверяем весь сумматор сохраняя число нужных векторов для проверки элементарного сумматора. Достигается это чередованием 4 и 5го векторов.. Заметьте что значение c1 зависит от значений предыдущих c0, a0, b0.

Получив в результате таблицу для 8ми сумматоров, открываем vecmanager, и видим что он хочет вектор в виде
Cin b7 a7 ...
Поэтому все эти значения (Cin - в нашем случае c0) получаем из таблички. Таким образом 8 векторов (длинной в 17 бит) покрывают 100% ошибок, о чём и должен со счастьем сообщить vecmanager после ввода и симуляции.

Вторая лабораторная.
Получив и сохранив схему (в моём случае, d4), написав комманды

xtimport -paths -tool cadence d4.edi ams.lib xtimport -spec -tool cadence d4.edi ams.lib generate d4 prediag d4

мы задали в результирующей схеме некую ошибку в одном элементе, т.е. считается что один из элементов схемы ведёт себя по-другому, причём он может быть один из NOR, NAND, OR или AND.
Задача тестирования в первой лабе сводилась к получения ответа на вопрос "есть ли ошибка?", теперь же вопрос стоит "где находится ошибка?". После введения последней комманды prediag, мы получаем элементы подозрительные на наличие этой ошибки.
Вопрос - как обнаружить какой из них ошибочный и какой ошибочный в действительности в данном случае самый главный. Легко заметить, что все подозрительные элементы группируются на ветке одного из выходов. Легко заметить что последний элемент в этой ветке как правило тоже подозрителен.
По тому как я разбирался в алгоритме, я примерно понял, что алгоритмов несколько, или хотябы каждый понимает его по-своему и объяснить в обобществлённой форме этого неможет. К примеру есть вариант где идёт разбиение элементов на группы по принципу "что влияет на OK на выходе и что невлияет", после чего идёт выявление подозреваемой группы.
Мой вариант, возможно неправильный, возможно идентичный тому что выше, но сводится примерно к 3-5 векторам или более.. Основан на таблицах истинности элементов.
Берём самый последний элемент в ветке, который у самого Y стоит.. Тестируем его на три-четыре вектора 00, 01, 11, 10. Последний не очень обязателен, но всё же.. То как вы эти векторы получите в самом начале, уже другая история, но главное это проползти так чтобы конфликтов не получилось. Протестировав эти векторы, мы обязательно получим ошибку.. Скажем ошибка будет на 00, а элемент этот последний - OR, это значит..
Последний OR элемент:
A B Q
0 0 0 <-тут выдалось ERR 0 1 1
1 0 1
1 1 1

Поскольку Error на первой комбинации, то на выходе схемы вместо нуля мы получили единицу из-за ошибки какого-то элемента. Это значит что либо этот самый последний OR элемент ведёт себя так что на выходе всегда даёт единицу, что мы исключаем по условию, либо ошибка затаилась где-то раньше.
Таким образом мы вычёркиваем последний элемент.

Во время создания этого условия чтобы на этот OR поступили именно такие векторы, мы в некоторых случаях вольны выбирать любые значения на некоторых элементах. Имеет смысл выбирать их как можно разнообразней.
Когда у вас имеется 4 вектора, то может легко получиться что остальные элементы тоже прошли все возможные комбинации 00,01,10,11 как вышеназванный OR.

Вычеркнув последний элемент из списка подозреваемых, движемся глубже в схему..
Можем набрести на
NOT
A Q
1 0
0 1 ->ERR
0 1 ->OK
Легко понять, что этот элемент впорядке, поскольку если бы он работал ненормально, то место OK была бы тоже ERR.

Ещё пример OR:
A B Q
0 0 0 ->OK
0 1 1 ->OK
1 0 1 ->ERR
1 1 1 ->OK
Очевидно, что OR не может вести себя как сложная смесь XOR и AND, впрочем я уверен что для него имеется своё название, но суть в том, что в множестве допустимых вариантов AND,NAND и NOR, он ни к чему не подходит, поэтому он в порядке.

Ну и что-бы не вводить в заблуждение что все элементы так уж вычёркиваются, привожу свой ошибочный элемент.. AND
A B Q
1 1 1
1 0 0 ->ERR
0 0 0
Так уж получилось, что два раза вектора совпали, что не дало всех вариантов, но видно, что AND очень уж стремится стать OR-ом.
Задав ещё один, пятый вектор, получил подтверждение, что
0 1 ->ERR
что и дало подтвердило мои подозрения. Удачи.

Домашняя работа

В качестве объекта выбирается микросхема, реализующая простую комбинационную схему, т.е. схема имеющая множество входов X, логические элементы AND, OR, NOT и выход Y.  Функция для каждого учащегося своя, очевидно что-бы никто не списал.

  1. Необходимо составить функцию с которой будет вся работа идти.

  2. Нарисовать функцию в схематическом редакторе Cadence, на Solaris-платформе (установлены в IT-корпусе). Использовать надо элементы из HRDLIB библиотеки, причём при создании схемы каждое отрицание над элементом в функции означает обязательный элемент отрицания в схеме. Открываем файл .cshrc и раскомментирываем там строчки
    setenv DFW_97a setenv AMS setenv DFWII
    создаём каталог под домашнюю работу, и там вводим комманду

    ams_cds -tech csx -mode ds
    она видимо подготавливает и вываливает в каталог кучу файлов.
    Дальше прогу можно запускать просто ams_cds коммандой. Cadence запустилась, открываем из меню New Lib. Называем, выбираем don't need...
    Потом создаём новую схему из меню New Cell View.
    Далее разбираемся, ставим входы (красненькие) x1, x2.. x6 , инверторы и прочие логические элементы можно поставить из HARDLIB (называются они соотв. OR22, NA22..). Схему составляем по заданным формулам, в итоге в конце получаем выходы y1, y6 (это для моего случая), их надо объединить элементом OR и сделать один выход Y.

  3. Решить дифференциальное уравнение ?Y/?xk, где xk - некий фиксированный номер/элемент. Зачем? Показать насколько сложно и непрактично создавать тест-вектор таким методом.

    Мысль заключается в том что если в математике дифференциал означает скорость изменения функции на участке бесконечно малом и близком к x, то на дискретном пространстве дифференциал означает изменение функции при изменении входа, а функцию изменения входа можно представить как XOR той же функции но с разным значением дифференцируемого входа (XOR=1 если функции различны) :
    ?Y/?xk = Y(xk=0)?Y(xk=1)

    Теперь используя теорию, принимаем что функция Y зависит от xk и любое изменение xk отобразится на значении Y, т.е. ?Y/?xk = 1. Решаем это уравнение и находим все остальные X, которые могут быть и неопределёнными, в итоге получаем тест-вектор, или же возможно что тест вектор получить неполучится, что в свою очередь значит что ?Y/?xk = 0, т.е. этот элемент нетестируем.

  4. Создать Structurally Synthesized Binary Decision Diagramm по главной функции Y, который представляет из себя граф, в котором

    • Вершины это входы в конкретный элемент и нумеруются в зависимости от входа в схему, т.е. если в формуле был блок x1(x3+x1)x2x3 ,то для структурного графа это представляет из себя x11(x31+x12)x21x32
    • Движение по вершинам слева направо означает AND-логику и ведёт к 1
    • Движение вниз по вершинам означает OR-логику и ведёт к 0

    Смотрите слайды что-бы понять логику как они создаются. Это основной граф для работы в дальнейшем над тестированием неисправностей на конкретных элементах

  5. Binary Decision Diagramm не учитывает структуры схемы и она используется только для тестирования входов. Создаётся BDD по достаточно простому принципу разложения Шеннона, например:
    Y=x1+x2x3=x2(x1+x3)+!x2(x1+x3)

  6. Сгенерировать тест-вектора для всех элементов из Y. Используется SSBDD, полученная в задании 4. См. слайды что-бы понять как конкретно происходит path-activation и fault propagation для SSBDD. Для тестирования элемента на constant 0 выбирается конкретный элемент и по графу выбирается такой путь вправо (к y=1), что-бы он проходил через выбранный элемент. Выбранный путь и есть вектор, однако что-бы элемент был тестируем, надо сделать доступным и альтернативный путь вниз (к y=0). Для того что-бы протестировать все элементы таким образом надо проделать достаточно большую работу по созданию графов с активацией обоих путей (как в обычной ситуации, так и для ошибочной версии) для всех элементов.
    В итоге задания получается таблица вида

    элементы (x11 x12 x13 x21..)
    векторыпроверяемые неисправности ( =0 =1 X X X )
  7. Сгенерировать тесты, обнаруживающие неисправность, вызванную замыканиями парой входов. Принцип - при замыкании входов где 0 и 1 в итоге на обоих будет сигнал 0.

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

  9. Протестировать заданные вектора и указать какие ошибки они тестируют

  10. Вбить полученную в 6м пункте табличку с векторами в vecmanager и получить на сколько тестируется схема согласно cadence. До этого надо из cadence экспортировать схему в EDIF 2.0.0 из основного меню.
    Помимо правильных полей дизайна, ещё должны быть

    external libraries: HRDLIB design name: название дизайна, любое, хоть свой матриклинумбер output file: imjafaila.edi output format: Netlist Netlist format: FLAT
    затем, лезем в консоль и пишем:
    xtimport -paths -tool cadence imjafaila.edi ams.lib
    xtimport -spec -tool cadence imjafaila.edi ams.lib

    в принципе, можно попробовать указать оба ключа - и paths и spec одновременно, но у некоторых личностей такой способ не сработал - требовалось отдельно две строчки.

    эти две команды создадут 3 файла:
    imjafaila.agm, imjafaila.pat, imjafaila.spec

  11. задача в том что.. допустим вектор 1 и 2 говорят что y ошибочен, а все остальные векторы говорят что всё в порядке. смотрим на таблицу открываемых ошибок этими векторами..
    например таблица неисправностей выглядит так..
    10XXXX11100011
    X1XXX10XXX1XX
    111XX1XXXXXXX

    объединяем первый и второй вектора и получаем
    1&XXX1&110&011
    (поскольку неисправности 1 и 0 одновременно не могут быть на одном и том же элементе)
    теперь сравниваем полученную строку с остальными векторами, получаем
    &&XXX&&110&011
    где & значит что на этом элементе ошибки быть не может
    X значит что элемент не тестируется
    1 или 0 значит что на этом элементе есть подозрение.

    В итоге цель задания - обнаружение элемента на котором ошибка имеется, т.е. получение диагноза. Могут быть как несколько элементов, так и вообще не иметься.

Что-бы работать удалённо - из дома делается ssh соединение и дальше (согласно Юре Богданову) из линукса консоль выглядит примерно так

westvleteren:/home/tXXXXXX>mkdir testcad10 westvleteren:/home/tXXXXXX>cd testcad10/ Directory: /home/tXXXXXX/testcad10 /home/tXXXXXX/testcad10 westvleteren:/home/tXXXXXX/testcad10>cad Select your CAD tools: 1) MENTOR 2010 version 2) MENTOR 2004 version 3) SYNOPSYS 2010 version 4) CADENCE 2002 & SYNOPSYS 5) XILINX ISE 12.2 6) XILINX ISE 10.1.3 7) MENTOR 2007 version 8) CADENCE 2005 version 9) CADENCE 08/09 version 0) CADENCE 2009/2010 IC/SYS combined with AMS designkit v3.70 q) no selection ----> 0 Environment ready for Cadence 2009/2010. westvleteren:/home/tXXXXXX/testcad10>ams_cds -mode fb -tech cxq [1] 7998 icfb : HIT-Kit=3.70 tech=cxq

Что-бы распечатать нарисованную схему надо экспортировать схему в PS формат. Для этого надо

  1. открыть Design->Plot->Submit.
  2. убрать header->Plot
  3. установить Options landscape
  4. center plot
  5. fit to page
  6. send plot only to file: imjafaila.ps
  7. убрать mail log to

перевести ps в pdf можно коммандой в консоли
ps2pdf imjafaila.ps

Экзамен

Вариант Антона.. 

  1. genereerida diagnostikapuu antud rikketabelile
    Таблица представлена действительно в виде таблицы, мне же лень вырисовывать, поэтому напишу так:
    всего 9 нарушений и 4 вектора. единицы расположены так:
    T1: 1, 4, 5, 9
    T2: 2, 4, 7, 8
    T3: 5, 6, 7, 9
    T4: 1, 3, 4, 6, 7
  2. дана схема (см рисунок). задание: genereerida kaks testvektorit kahe boole'i v?rrandis?steemi dy1/dz1 = 1 ja dy1/dz2 = 1 lahendamise teel, kasutades ahelv?rrandis?steemi lahendamise meetodit.
  3. teoreetiline kysimus: testide genereerimine mikroprotsessoritele.

Вариант Дана.. 

  1. Транизсторная схема + вероятность закорачивания в двух местах (ЭФ). Найти тествектор который выявляет ЭФ.
  2. генерация теста по методу DNF
  3. Sequuential Fault Diagnosis

Вариант Вадима

  1. поставить диагноз маленькому уравнениею используя Булев полный дифференциал.
  2. по данному уравнению составить бинарную диаграмму и найти на входе х3 константные ошибки
  3. представление операционного автомата с помощью отсустус диаграмм 

Мой вариант..

  1. Нарисовать SSBDD по формуле и протестировать с её помощью один из элементов.

  2. Дана схема и два вектора. Написать на что они тестируют элементы.. т.е. нарисовать табличку.

  3. Теоретический вопрос (там было порядка 15ти), мне попался первый - полное дифференциальное уравнение, обнаружение ошибки.

Потом посмотрел домашку, я чуток порассказывал. Поспрашивал что значат hhlhlhH в таблице, которую vecmanager выдаёт и почему некоторые буквы большие (я про фронты начал говорить, а это просто ноль и единица на входах и на выходе). Потом на задании 2 показал два провода - допустим тут замыкание, как это протестировать. Я то помнил что надо разные значения кидать, но думал что единица будет ноль перезаписывать, но когда high(1) и земля(0), то всё в землю уходит и на обоих будут нули.

OpenID

· 3 мин. чтения

OpenID это логика разделения аутентификации (authentication), которая в свою очередь отвечает за то, что-бы пользователь был в действительности тем за кого он себя выдаёт. В качестве методов authentication можно выделить пароль, сертификат, биометрические данные.

После распознавания с кем идёт дело, вступает в игру процесс правообладания (authorization), который даёт всем знать какие права у пользователя имеются.

Прозрачность с PNG

· 1 мин. чтения

PNG - специально созданный графический формат для WEB, однако его использование затруднено багами в IE. PNG позволяет использовать альфа-канал, попросту - многоуровневую прозрачность. Используем IE 5.5 фильтр AlphaImageLoader (обратите внимание на передаваемые параметры и sizingMethod)

Также обратите внимание на то что в image src стоит прозрачный GIF. Для элементарных структур этот медо и сгодился бы, но что делать с прописанными в css background-ах, динамичными картинками в JS?

CSS background ещё можно исправить, заменив например

background-image: url('image.png');

на

filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale, src='image.png');

Из готовых пакетов

  • PNG behaviour , странным образом использующий htc файл внутри css.
  • Justin Koivisto пробует заменить все тэги с png на лету
  • Bob Osola грамотно заменяет png на фильтр javascript-ом
  • DaltonLP популяризирует png в качестве background, но без background-repeat

Для простой прозрачности фона можно использовать

filter:alpha(opacity=25);-moz-opacity:.25;opacity:.25;

Как альтернативу CSS, можно использовать PNGPong, который через javascript создаёт flash-объект и загружает в него png, который в свою очередь отображается с прозрачностью.

Клавиатуры на выбор

· 1 мин. чтения

Rob Manuel выражает недовольство по поводу неправильно продуманных клавиатур. Попытаюсь перевести и несколько укоротить его список.

  1. Атрофированные клавиши со времён печатных машинок надо давно было вырезать (Numlock, Capslock, Scrolllock)
  2. Мультимедийные клавиши надо привести к какому-то стандарту и не вставлять свои малоиспользуемые в рекламных целях.
  3. Все клавиатуры должны быть чёрные по умолчанию. Даже Apple-маки продаются в чёрных тонах, но за чуть большую цену. Потому что чёрный цвет измазать труднее.
  4. Ножки у клавиатуры должны быть большие и толстые, обидно выбрасывать клавиатуру из-за кусочка сломавшегося пластика.
  5. Безпроводные клавиатуры должны продаваться с надписями "для понтов", потому что в действительности никому не нравится вдруг менять батарейки на половине вбитого текста. Да и вообще заботится о наличии батареек.

От себя.

Раз уж стоит выбросить малоиспользуемые CapsLock, то почему бы не внести клавишу по изменению языковой раскладки. Постоянно нажимать Shift+Alt  или Ctrl+Shift для переключения на русский утомляет.
Я использую проводную Logitech Internet 350

Теоретические основы CMS

· 6 мин. чтения

CMS matrix и отечественный CMSlist предлагают огромные списки доступных opensource систем управления сайтами. Многие из них имеют множество недостатков, такие как

  • Монстроидальность и неверное useability. 80% функций для неискушённого пользователя наврядли будут использоваться. А из оставшихся 20% сразу он поймёт как работает 1%.
  • Устаревший код и архитектура со времён PHP4, необходимость версионной поддержки
  • Медленная скорость загрузки из-за подгрузки неиспользуемых объектов и модулей
  • Чёткая полоса возможностей системы, ограничивающая как что должно работать, либо наоборот - её отсутсвие служит и дорогой и препятствием, особенно для новичков

Всё это заставляет программистов писать свою систему с нуля. Я постараюсь тут описать некоторые теоретические основы для этих начинаний и как итог - к чему они все приходят.

Типография в Web

· 2 мин. чтения

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

Согласно CSS2, шрифты можно подгружать в качестве ресурса, впрочем большинство браузеров это игнорирует.

@font-face { font-family: Broken15; font-style: normal; font-weight: normal; src: url('/fonts/BROKEN0.eot'); @font-face { font-family: "Kimberley"; src: url(http://www.princexml.com/fonts/larabie/kimberle.ttf) format("truetype");} h1 { font-family: "Kimberley", sans-serif }

Браузерная поддержка

Решение Microsoft & IE

Использовать шрифты уже предустановленные в C:WidnowsFonts . Обычные посетители остаются обычными, система у всех только от Microsoft, больше никого не волнует.
Для advanced-вебмастеров специально выпускается WEFT3 конвертор True Type шрифтов (.ttf) в Embedded Open Type (.eot). Впрочем сама программа 1997 года, поэтому прийдётся потрудиться закачивать через ftp созданный eot файл, который к тому же привязан к домену сайта.

Решение от Mozilla ещё в buglist-е.

Впрочем некогда в далёком 1998, делалась поддержка Portable Font Resource (pfr) от Bitstream который можно было бы использовать так же как и .eot, вот только создать pfr можно лишь купив TrueDoc, увы найти истину - есть поддержка или нет я не смог.

Замена на Flash

В народе это называется SIFR (Scalable Inman Flash Replacement). Принцип немного закручен - Javascript ищет элементы по тэгам и выставляет поверх flash-слой. Есть упрощённые версии для jquery, sifr lite и тп.

В минусы

  • пропадают свойства элемента типа href, title;
  • Также невозможно отобразить картинку попавшую в такой элемент,
  • Нельзя вызвать javascript event на таком элементе
  • Проблемы со всплывающими adblock опциями в Firefox+plugins

Также как и в предыдуших решениях надо каким-то образом шрифт впихнуть во flash и при необходимости защитить.

Замена на VML/SVG

Есть несколько библиотек - cufon (поддерживаются .otf-шрифты тоже), typeface (только .ttf)

Серверные решения

Почему бы не сделать картинку с нужным текстом шрифтом? Берём php с GD-библиотечкой и кидаем динамично в этот скрипт нужную нам строчку, он сам будет читать нужный файл шрифтов и рисовать что нам нужно. Но зачем изобретать велосипед

В минусы

  • неизвестный фон заголовков
  • wrapping-проблемы
  • проблемы с отключенными в браузере картинками
  • простая замена картинками означает отсутсвие аналогов h1 тэго, снижение SEO

PS. Интересные шрифты можно найти на fuelfonts, вот только кириллица редкая.

Читайте также:

Crontab

· 5 мин. чтения

понедельник, 19 января 2015 г. в 16:37:51

Vagrant это программка управляющая виртуальными машинами, бегающих на VirtualBox. В веб-разработке виртуалки очень полезны тем что среду разработки и весь стэк необходимых системных сервисов можно изолировать для каждого проекта.

Это позволяет избегать проблем с конфликтом версий какой-нибудь OpenSSL библиотеки между разными приложениями. Разработчикам психологически становиться понятней, что именно проект требует. Записывать процесс установки становиться обязательным, зато запуск проекта автоматизируется и сделав раз, новому человеку настроить работу проекта становиться очень легко. Если в среде что-то добавляется или обновляется, то devopsы могут отследить это, ведь файл настроек (Vagrantfile) и файл установки (т.н. provisioning ) хранятся вместе с проектом в системе версионирования

Комманды

vagrant box add MyCentOS http://puppet-vagrant-boxes.puppetlabs.com/centos-65-x64-virtualbox-puppet.box — скачивает основу виртуальной машинки, кеширует и обзывает её как вы скажете
vagrant init MyCentOS — генерит файл настроек для проекта, где указываются порты, путь к скрипту установки, общие папки…
vagrant up — стартует виртуальную машину и применяет настройки
vagrant ssh — логинится в работающую ОСь
vagrant halt — останавливает, полезно если хочется сберечь ресурсы и надо проектом не работаете
vagrant destroy — удаляет ОСь, но скачанная основа остаётся. Полезно когда вы пишете пишете скрипт для установки и что-то сделали не так, а откатиться не получается

Vagrantfile

Для поднятия LAMP-проекта я использовал CentOS как вы видите выше

В конфиге самое главное это

  • путь к скрипту установки
  • перенаправление портов для nginx и mysql
  • шаринг папок из самого проекта для nginx с предоставлением возможности записи
config.vm.provision "shell", path: "scripts/vagrant_provision.sh" 
config.vm.synced_folder ".", "/var/www/html/", :mount_options => ["dmode=777","fmode=666"]

config.vm.network :forwarded_port, guest: 80, host: 8080
config.vm.network :forwarded_port, guest: 443, host: 8443
config.vm.network :forwarded_port, guest: 3306, host: 3306

config.vm.provider "virtualbox" do |v|
v.memory = 1024
v.cpus = 2
end

Provisioning

Shell-скрипт установки использует специальный репозиторий для php-билдов под centos - webtactic. Mysql приходится заменять на более новую версию. Кроме того я перезаписываю конфиг для nginx. Заметьте флаг yum -y, который позволяет избежать интерактивного режима в установке. Мне также пришлось вручную генерировать SSL сертификаты и их устанавливать (но это я опустил тут), т.к. там интерактивного режима избежать не удалось.

Заметьте также что host-ОСь не любит перезаписывать порты меньше 1024, поэтому форвардинг приходится делать через 8k порты + ipfw правила.

Также, скрипт установки имеет смысл группировать по сервисам. Точечную настройку конфиг-файлов имеет смысл заменять с помощью sed'а, либо заготавливать целиком и заменять.

sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm

#php, extensions
sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
yum install -y php55w php55w-cli php55w-opcache php55w-fpm php55w-gd php55w-mbstring php55w-mysql php-memcached php55w-pdo php55w-pecl-xdebug php55w-pecl-memcache php55w-xml php55w-pecl-imagick
sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 8M/g' /etc/php.ini
sudo service php-fpm start

#php - mongo extension
sudo yum install -y php55w-devel
sudo pecl channel-update pecl.php.net
printf "\n" | pecl install mongo
sudo touch /etc/php.d/mongo.ini
sudo chown vagrant /etc/php.d/mongo.ini
echo "extension=mongo.so" > /etc/php.d/mongo.ini

#php - composer
curl -sS https://getcomposer.org/installer | php
sudo ln -s /home/vagrant/composer.phar /usr/bin/composer

#php - phpunit
wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
sudo mv phpunit.phar /usr/bin/phpunit

#Nginx
sudo cp /var/www/html/scripts/vagrant/nginx.conf /etc/nginx/nginx.conf
sudo service nginx start

#MySQL
yum install -y yum-plugin-replace
yum replace -y mysql-libs --replace-with mysql55w-libs
yum install -y nginx mysql55w-server
sudo service mysqld start
mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;"
sudo service mysqld restart

#MongoDB
sudo yum-config-manager --add-repo=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
yum install --nogpgcheck -y mongo-10gen mongo-10gen-server mongo-10gen-shell
echo 'db.createCollection("myCustomCollection");' > mongoInit.js
mongo MyMongoDB mongoInit.js
sudo mkdir /data
sudo mkdir /data/db
sudo mongod --profile=1 --slowms=1 --smallfiles & & sleep 3 && mongo MyMongoDB mongoInit.js


#Nodejs, java required for some packages
sudo yum install -y java-1.7.0-openjdk
curl https://raw.githubusercontent.com/creationix/nvm/v0.23.3/install.sh | bash
export NVM_DIR="$HOME/.nvm"
source $HOME/.nvm/nvm.sh
nvm install 0.10
echo ". ~/.nvm/nvm.sh" >> .bash_profile
echo "nvm use 0.10" >> ~/.bash_profile
npm install forever -g
npm install phantomjs -g
npm install grunt-cli -g

#ffmpeg 0.6.5
rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms
sudo rpm -ivh http://dl.atrpms.net/all/atrpms-repo-6-7.el6.x86_64.rpm
sudo yum install -y epel-release ffmpeg ffmpeg-devel
sudo chown vagrant /etc/ld.so.conf
sudo echo "/usr/lib" >> /etc/ld.so.conf
sudo echo "/usr/local/lib" >> /etc/ld.so.conf
sudo ldconfig

php -f /var/www/html/install.php
grunt build
phpunit -c phpunit.xml

#ON HOST MACHINE - CONNECT PORTS (optional)
#sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to me 80
#sudo ipfw add 101 fwd 127.0.0.1,8443 tcp from any to me 443

Установку с bash можно заменить на puppet или chef.

Снапшоты

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

vagrant plugin install vagrant-vbox-snapshot
vagrant snapshot take MyCentOS freshInstallation
vagrant snapshot go MyCentOS freshInstallation

Если вы часто обновляете виртуалку, тогда имеет смысл файл установки структурировать так, что-бы часто меняющиеся области были внизу, а снапшоты соответсвовали бы глубине изменения этого файла. Например если nginx/mysql/mongo вы не меняете, а расширения для php и его версии меняете часто, то у вас будут снапшоты без пхп и с ним, потому что установка некоторых пакетов может достигать 15 минут и выше.

Второй вариант - первыми ставить наиболее критичные сервисы и запускать проект как можно быстрее, а потом доустанавливать остальное. В моём случае например, приложение может работать без mongodb куда складируются логи и без ffmpeg, который используется в редких случаях

Если вам понравился Vagrant, гляньте на Docker — он изолирует сервисы ещё лучше.

PuPHPet — интересный сервис по упрощению настройки вашей виртуалки

См. также