Pull to refresh

Энтузиаст запустил Linux на Arduino Uno

Reading time3 min
Views18K


Энтузиаст запустил ядро Linux на плате Arduino Uno. Чтобы адаптировать полновесный Linux 6.1 к чипу ATmega328p, он портировал эмулятор RISC-V на эту платформу. Установлен новый антирекорд: более 15 часов для загрузки.
Читать дальше →
Total votes 39: ↑39 and ↓0+39
Comments27

Как выглядит zip-архив и что мы с этим можем сделать. Часть 3 — Практическое применение

Reading time8 min
Views2.8K
Продолжение статьи Как выглядит zip-архив и что мы с этим можем сделать. Часть 2 — Data Descriptor и сжатие.

Дорогие читатели, я снова приветствую вас на передаче Нетрадиционное программирование на PHP. Для понимания происходящего рекомендую ознакомиться с предыдущими двумя статьями о zip-архивах: Как выглядит zip-архив и что мы с этим можем сделать и Как выглядит zip-архив и что мы с этим можем сделать. Часть 2 — Data Descriptor и сжатие

Ранее я рассказывал как создавать архивы используя только лишь код на PHP и не применяя никакие библиотеки и расширения (в том числе и стандартное zip), а так же упоминал некоторые сценарии использования. Сегодня я постараюсь привести пример одного из таких сценариев.

Мы будем хранить картинки в архиве на удаленном сервере, а при необходимости показывать определенную картинку пользователю, не скачивая и не распаковывая архив, а получая с сервера лишь данные самой, конкретно взятой картинки и ничего более (ну ладно, оверхед на заголовки еще никто не отменял, но все же).
Читать дальше →
Total votes 16: ↑16 and ↓0+16
Comments3

Как выглядит zip-архив и что мы с этим можем сделать. Часть 4 — Чтение архива

Reading time8 min
Views3.8K
Продолжение цикла о Zip-архивах и PHP. Предыдущие статьи: Часть 1, Часть 2, Часть 3

Доброго времени суток, дорогие читатели.
На этот раз я хотел бы представить, наверное, заключительную часть цикла о Zip-архивах и PHP.

В этой статье я покажу как прочесть уже существующий архив и для примера мы возьмем photos.zip из прошлой статьи. Чтоб не повторять все процедуры воспользуемся готовым — https://github.com/userqq/images/raw/master/photos.zip.

А теперь давайте на минутку отвлечемся и вспомним, из чего состоит наш архив: сначала идет набор данных упакованных файлов, где каждый упакованный файл предварён структурой Local File Header (LFH), после всех данных у нас идет набор структур Central Directory File Header (CDFH) — это такое оглавление по нашему архиву, в котором перечислены все элементы и позиции их смещения относительно начала файла. А завершает архив End Of Central Directory Record (EOCD) — тут указана позиция начала структур CDFH, их количество и общая длина в байтах. Поэтому архив следует читать с конца, чтоб сначала найти EOCD, потом прочесть структуры CDFH и таким образом получить список файлов в архиве.

FYI: А некоторые форматы, например JPEG, читаются с начала. Поэтому мы можем склеить картинку с архивом, даже банально через cat image.jpeg archive.zip > imagearchive.jpeg, не потеряв функционала. Браузеры и приложения для просмотра картинок будут без каких-либо проблем показывать нам картинку. В то время как любое приложение для чтения zip-архивов, будь то 7z или unzip, сможет преспокойно работать с файлом как с архивом. Например, вот — https://github.com/userqq/images/blob/master/jpegarchive.jpg (Осторожно, эта штука весит около 20мб, поэтому не советую открывать с телефонов или если вам дорог трафик). Таким образом, если вы знаете хостинг картинок, на котором изображения не перекодируются и не обрезаются, вы можете заливать туда не только картинки:) Хотя, мне кажется, сейчас таких уже не найти.
Читать дальше →
Total votes 12: ↑12 and ↓0+12
Comments4

Как мы создавали кластер из Raspberry Pi

Reading time4 min
Views109K

12-14 февраля прошла известная конференция WSO2Con 2013. И её ведущим был Эбен Аптон (Eben Upton) — основатель и попечитель фонда Raspberry Pi Foundation.

Как все однажды началось...


Raspberry Pi будоражит умы гиков с тех самых пор, как была первый раз анонсирована. Мы были взволнованы услышать о том, что Эбен будет представлять конференцию и ещё больше удивлены, когда Sanjiva (прим. пер.: CEO WSO2, главный организатор конференции) предложил нам разместить бэкенд официального приложения WSO2Con на кластере из Raspberry Pi. Предложил что? Да, он всегда полон безумных идей. Первое совещание прошло 23 декабря 2012, за день перед уходом команды на рождественские каникулы. В то время мы даже не были уверены, возможно ли вообще запустить enterprise middleware на Raspberry Pi. Но исследование неизведанного — это обычное дело для WSO2, и достижение недостижимого — то, что мы делаем здесь на регулярной основе. Таким образом, группа отважных гиков бросила вызов созданию такой системы. Проект официально сдвинулся с мёртвой точки 2 января этого года.
Осторожно, трафик!
Total votes 92: ↑74 and ↓18+56
Comments68

Использование словарей в tcl

Reading time6 min
Views5.6K
Приветствую, Хабра! %username, ты наверняка слышал про такой язык как tcl и его графический тулкит tk. Язык отличается особой гибкостью (на мой скромный взгляд). Пока нет много времени написать об «облачной» разработке, решил написать мини-статью/мини-урок про одну из возможностей замечательного языка tcl — словарях ( причем, их я не могу вспомнить по книге «Практическое программирование на Tcl/TK», быть может просто читал старую версию). Наиболее полное описание данного типа данных, %username, ты можешь найти по ссылкe.
Читать дальше →
Total votes 10: ↑8 and ↓2+6
Comments10

Дрессируем box-shadow

Reading time6 min
Views97K
Простой пример box-shadow Разработчики W3C сделали box-shadow очень гибким свойством. Благодаря этому можно получать весьма интересные результаты, если использовать это свойство нетривиальным образом. В этой статье я напишу о некоторых эффектах, которые мне удалось получить при помощи «теневых технологий».

Пока я составлял примеры, я неожиданно обнаружил, что браузеры отображают их совсем неодинаково. В итоге, помимо простой демонстрации возможностей box-shadow, получился еще и маленький браузерный тест на поддержку CSS 3. Все примеры снабжены CSS-кодом и картинкой (общий объем всех PNG: 161 КБ). В статье я не стал прописывать свойства с вендорными префиксами -moz- и -webkit-, чтобы не ухудшать читабельность. В суммарной странице со всеми примерами эти префиксы есть (предупреждаю, что у Оперы есть баг с прорисовкой внешних box-shadow при прокрутке).
Читать дальше →
Total votes 132: ↑128 and ↓4+124
Comments56

Занимательный C++: Счетчик времени компиляции

Reading time5 min
Views19K
Предлагается разработать безопасную альтернативу встроенного макроса __COUNTER__. Первое вхождение макроса заменяется на 0, второе на 1, и так далее. Значение __COUNTER__ подставляется на этапе препроцессирования, следовательно его можно использовать в контексте constant expression.

К сожалению, макрос __COUNTER__ опасно использовать в заголовочных файлах — при другом порядке включения заголовочных файлов подставленные значения счетчика поменяются. Это может привести к ситуации, когда например в foo.cpp значение константы AWESOME равно 42, в то время как в bar.cpp AWESOME≡33. Это нарушение принципа one definition rule, что есть страшный криминал во вселенной C++.

Нужна возможность использовать локальные счетчики вместо единого глобального (как минимум, для каждого заголовочного файла свой). При этом возможность использовать значение счетчика в constant expression должна сохраниться.

По мотивам этого вопроса на Stack Overflow.
Читать дальше →
Total votes 27: ↑24 and ↓3+21
Comments5

Побеждаем ELMS Delivery Client

Reading time3 min
Views2K
Сначала объясню, о чем речь.
Что такое ELMS? ELMS (e-academy License Management System) — это веб-сайт для распространения ПО, который каждый администратор программы может настроить в соответствии с потребностями своего подразделения. Факультеты-подписчики MSDN Academic Alliance всего мира могут пользоваться ELMS бесплатно, так что ее использование не приведет к дополнительным затратам.

Зачем нужна ELMS? ELMS — это основанная на веб-технологиях система управления, упрощающая распространение ПО среди студентов в соответствии с политикой лицензирования программы MSDN AA.
Ссылка

Основная идея этой системы заключается о том, что пользователь скачивает специальное приложение, которое скачивает установщик лицензионного ПО и разархивирует его. Идея не так чтобы очень хорошая, но на первый взгляд терпимая. Но, как это часто бывает с продуктами Microsoft, всё пошло не так, как надо.
Читать дальше →
Total votes 19: ↑15 and ↓4+11
Comments4

Полная кастомизация select без использования JS

Reading time4 min
Views83K
imageСколько я не мучил поисковик, а решения этого вопроса так и не нашлось. Конечно, всегда можно использовать JS и это нормально, но иногда заказчик душа просит изысков.
Читать дальше →
Total votes 47: ↑40 and ↓7+33
Comments90

PHPUnit: Электронная таблица (spreadsheet) в качестве источника данных (data provider)

Reading time3 min
Views8.1K
В документации PHPUnit есть небольшой раздел посвященный источникам данных (data provider), которые позволяют скормить тесту большой объем данных, а чуть ниже есть даже пример источника данных для CSV файла.
но что делать если хочется отдельную страницу для каждого теста?
Total votes 15: ↑12 and ↓3+9
Comments2

Блокировка ранобэ на сайте «Бака-Цуки»

Reading time7 min
Views48K
[логотип]По адресу https://antizapret.info/?search=baka нетрудно убедиться в том, что сайт «Бака-Цуки» (логотип которого я привожу справа; это одно из крупнейших в мире хранилищ неофициальных переводов японских ранобэ) с 1 августа 2014 года в России был заблокирован по указанию Роскомнадзора. Официально блокировка касается четырёх URLов, на сáмом же деле многие крупные провайдеры («Ростелеком», например) блокируют сайт целиком.

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

Вот и блокировка сайта «Бака-Цуки» связана не с тем, например, что сочинение перевода ранобэ без согласия авторов может восприниматься óрганами как «пиратство» — а только с тем, что рисование в стиле манги в некоторых случаях может восприниматься óрганами как «педофилия». (Оба слóва эти приходится поставить в кавычки: под хабракатом я попробую перечислить признаки того, что к сексу с детьми эти рисунки имеют настолько же отдалённое отношение, насколько перевод иллюстрированной ими книги далеко отстоит от нападения на морские суда.)

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

Два предыдущих оборота этого маховика мы обсудили на Хабрахабре в прошлом году: это были блокировки какого-то аниме (14 июня 2013 г., «Роскомнадзор признаёт хентай детским порно, призывает к подаче жалоб, обещает пополнение реестра запрещённых ресурсов в Интернете») и затем какой-то манги (24 сентября 2013 г., «Роскомнадзор запрещает двадцать девять японских комиксов "манга", приравнивает к сексу с детьми»). Что это было за аниме, что за манга? Да кто ж их знает! — и в том, и в другом случае, к сожалению, читатели «Хабрахабра» (среди которых ≈37% анимешников) не располагали списком названий конкретных заблокированных произведений и поэтому никак не могли самостоятельно оценить справедливость принятых Роскомнадзором решений; нам оставалось только вздрагивать от явно чрезмерных оценок, публикуемых на всю страну со слов того или иного эксперта («потребители такого рода контента — психопаты», «их можно назвать эстетами от извращенцев», «"манга" мы рассматриваем как вид творческой деятельности, давший начало развитию "хентая"», вот это всё в одних только «Известиях»).

С блокировкою «Бака-Цуки» положение дел куда лучше: сделалися известными точные адреса заблокированных материалов — следовательно, есть у нас и возможность делать самостоятельные выводы о них. Приступим же к этому занятию.

Читать дальше →
Total votes 109: ↑72 and ↓37+35
Comments70

Как выглядит zip-архив и что мы с этим можем сделать

Reading time6 min
Views22K
Доброго времени суток, уважаемый Хабр!

За последние пол года кривая дорожка моих пет-проектов завела меня в такие дебри, откуда до сих пор выбраться не представляется возможным. И начиналось-то все безобидно — сайт с картинками, но чувство перфекционизма, погоня за халявой, а также некоторые особенности моего склада ума превратили эту, как изначально планировалось, маленькую прогулку, в настоящее длинное путешествие. Ну и ладно, как говорил один довольно картавый революционер: «Учиться, учиться и еще раз учиться», а мне, волей-неволей, приходится этому напутствию следовать.

Ой, что-то мы отвлеклись от основной темы. Не буду больше вас утомлять пространными речами, а перейду к делу.
Читать дальше →
Total votes 39: ↑33 and ↓6+27
Comments23

Как выглядит zip-архив и что мы с этим можем сделать. Часть 2 — Data Descriptor и сжатие

Reading time12 min
Views5.2K

Продолжение статьи Как выглядит zip-архив и что мы с этим можем сделать.


Предисловие


Доброго времени суток.
И снова в эфире у нас нетрадиционное программирование на PHP.


В прошлой статье уважаемых читателей заинтересовала тема сжатия в ZIP и сохранение потоков в zip. Попробуем сегодня хоть немного раскрыть эту тему.

Читать дальше →
Total votes 12: ↑12 and ↓0+12
Comments4

Еще более секретные Telegramмы

Reading time7 min
Views36K

Все привыкли считать телеграм надежной и безопасной средой для передачи сообщений любого сорта. Однако, под капотом у него крутится совершенно обычная комбинация а- и симметричного шифрований, а это ведь совсем не интересно. Да и в конце концов, зачем вообще явно доверять свои сообщения третьей стороне?
КДПВ за авторством Antonio Prohías
TL;DR — изобретаем приватный скрытый канал через блокирования пользователями друг друга.

Читать дальше →
Total votes 56: ↑52 and ↓4+48
Comments35

Пятничный JS: как вдохновиться Smalltalk'ом и попасть в ад

Reading time5 min
Views20K
Когда я читал книгу «Паттерны разработки игр», написанную замечательным человеком по имени Bob Nystrom (я не пишу его имя по-русски, поскольку не имею ни малейшего понятия, как это произносится), в одной из глав мне на глаза попалась небольшая ода языку Smalltalk как праотцу всех современных объектно-ориентированных языков, намного опередившему своё время. Поскольку я по жизни испытываю необоримую приязнь ко всяким винтажным языкам, естественно, я полез про него гуглить. И разумеется, вместо того, чтобы вынести из этого опыта что-то полезное, я научился плохому.


Доктор, откуда у вас такие картинки?
Total votes 77: ↑74 and ↓3+71
Comments39

Брутально-элегантная верстка

Reading time2 min
Views913
Никогда я так раньше не делал, однако, все по порядку.

Случилось мне сверстать красиво оформленную поисковую форму со всякими PNG-фенечками и кнопкой картинкой. Все бы ничего, пару дней все работало как часы, отправлялось, искало и т.д. А тут мне менеджер проекта и говорит: «Форма не работает». Как так? Глянул в ФФ — работает, в Опере — Ок, в ИЕ7 — работает, на шестерке завал. Блин. Как будто disabled на <input type=«image» src=«картинка»> выставлен, ан нет — ничего подобного.

Пробую onclick=«this.form.submit()» — Фиг вам.
Пробую onclick=«document.forms['form_name'].submit()» — Фиг.

Думаю, а что, если дело не в кнопке, ставлю обычный Сабмит — срабатывает только при попадании в два крайних правых пиксела — Блин.

И тут уже пришлось извращаться:
<form method="get" action="/search/" name="form_name">
<table cellpadding="0" cellspacing="0">
<tr>
<td><img src="/img/inner/spacer.gif" width="15" height="22"></td>
<td height="22"><input type="text" name="q" value="Поиск"></td>
<td width="27" height="22" onclick="document.forms['form_name'].submit()">
<input type="submit" value="" style="border-width: 0;
    background-color: transparent;
    background: url('/img/pretty_button.gif') 0px 3px no-repeat;
    width: 27px; height: 22px;">
</td>
</tr>
</table>
</form>


Что характерно, работает везде… :)

UPD: Хотя можно было и просто картинку вставить…
Total votes 9: ↑5 and ↓4+1
Comments25

5 cпособов осуществить агрегацию строк в MS SQL

Reading time3 min
Views14K
Иногда возникает необходимость осуществить агрегацию строк в SQL запросе, то есть, по такому набору данных:
GroupId Item
1 AAA
2 IS
5 OMG
2 WHAT
2 THE
1 This
получить примерно такой:
GroupId ItemList
1 AAA,This
2 IS,WHAT,THE
5 OMG
MySQL, например, для таких целей обладает встроенной функцией GROUP_CONCAT():
SELECT GroupId, GROUP_CONCAT(Item SEPARATOR ",") AS ItemList
FROM Items

В MS SQL Server'e такой функции нету, поэтому приходится извращаться. Перед тем, как приступить, сделаем скрипт для создания тестовой таблицы:
CREATE TABLE Items(GroupId INT, Item NVARCHAR(10))

INSERT INTO Items(GroupId, Item)
SELECT 1 AS GroupId, 'AAA' AS Item
  UNION ALL
SELECT 2, 'IS'
  UNION ALL
SELECT 5, 'OMG'
  UNION ALL
SELECT 2, 'WHAT'
  UNION ALL
SELECT 2, 'THE'
  UNION ALL
SELECT 1, 'This'

Итак, начнем.
Читать дальше →
Total votes 15: ↑9 and ↓6+3
Comments9

Как отправить форму по нажатию на ссылку?

Reading time4 min
Views66K
Этот вопрос входит, наверное, в ТОП10 вопросов на форумах :) Скорей всего это требование дизайнера или заказчика.

Итак, решение, на первый взгляд, простое:

<a href="#" onclick="document.getElementById('myform').submit(); return false;">Отправить</a>


Но тут же возникает (как ни странно :) следующий вопрос это, а если JS будет у посетителя отключен?
Читать дальше →
Total votes 114: ↑65 and ↓49+16
Comments141

Загрузка динамической библиотеки из памяти в Linux

Reading time6 min
Views6.5K
В одном моем кроссплатформенном проекте мне понадобилась возможность проверять цифровые подписи плагинов перед загрузкой. Ни один из вариантов с созданием файла не является безопасным, так как можно подменить файл между проверкой подписи и его загрузкой, так же нельзя проверить подпись после загрузки, так как уже выполнились статические конструкторы. Поэтому необходимо загружать плагин, не создавая файла.

Перехватить функции open, mmap и прочие невозможно, так как ld.so слинкован с библиотекой си статически, исполняемые файлы, загруженные же своим загрузчиком, «неполноценны» (даже с перехватом функций в libdl): они не регистрируются в списке загруженных библиотек и/или их символы не видны через dlsym. Следовательно, остается только перехват системных вызовов.
Here be dragons
Total votes 45: ↑41 and ↓4+37
Comments26
1