Блог:Виталий Филиппов
Вас приветствует YourcmcWiki!
2015-07-19 Турбина дула хорошо, но недолго
Пару недель назад заодно с ремонтом субарика (была немного продута прокладка ГБЦ) попросил Альпину вырезать катализаторы и прошить мозг, дабы дуло побольше и мощность была повыше. Сделали, Альпинский вроде как дунул туда 1.15 бара, машина поехала явно пободрее.
И ехала так две недели и где-то 1000 км, до сегодняшнего дня — а сегодня турбина перестала дуть вообще =) то есть машина едет тупо как атмосферная, никакого подхвата не наблюдается, и привычного свиста турбины тоже не слышно. Хотя я не понял, по форумам вроде пишут, что исправная турбина свистеть и не должна — а моя свистела всегда, сколько езжу)).
Варианты — либо сама турбина сдохла (заклинила), либо вестгейт, либо где-то дырка в тракте — во впуске, но тогда по идее движок нестабильно работать должен, либо может в аппайпе…
Абыдно, да, а я только датчик наддува купил, поставить хотел))
2015-07-11 WD Black2
Производитель зачем-то извратился и сделал так, что изначально видна только SSD-часть, а чтобы увидеть ещё 1 Тб HDD, его нужно сначала активировать путём запуска официальной Windows или MacOS утилиты. В комплекте идёт внешний USB 3.0 кабель — бонус приятный, но вот только активацию через него не сделаешь — она делается только через SATA интерфейс, не помогут даже более умные, поддерживающие SMART (в лице scsi-to-ata трансляции) USB кабели.
К счастью, после этой самой активации диск можно использовать в любой ОС, HDD уже никуда не «девается». Собственно, всё, что делает утилита — отправляет диску пару VSC (Vendor-Specific Command) и создаёт два раздела — один на SSD, второй на HDD. Теоретически VSC команды можно относительно легко подсмотреть, дизассемблировав консольную софтинку, идущую в составе MacOS версии официальной утилиты — она маленькая, написана на C++ и довольно легка к пониманию. Я даже немного попробовал туда взглянуть, но не добил.
SMART диском поддерживается хреново — работает лишь несколько общих показателей (температура, наработка часов и т.п). С TRIM, напротив, проблем нет.
Число 512-байтных секторов SSD: 234441648 (именно такого размера нужно делать раздел SSD). Общее число 512-байтных секторов SSD и HDD: 2187966778.
SSD’шка в составе довольно вшивая, последовательное чтение всего 133 Мб/с. Для сравнения, последовательное чтение с HDD в начале диска — 110 Мб/с, в конце (на внешнем краю блина) — 57 Мб/с. Вшивость SSD связана, видимо, с тем, что там всего 2 чипа флеш-памяти — непонятно, почему нельзя было поставить побольше: место над корпусом HDD на самом деле пустует, вся электроника SSD располагается с краю, там же, где и электроника HDD.
А вот скорость случайного чтения и записи. Тестировал утилитой fio, в 8 потоков блоками по 4-16 кб и по 1 мб:
- WD Black2 HDD:
- 4-16 кб: 0.46/1.57 Мб/с (чтение/запись)
- 1 мб: 37/32 Мб/с
- WD Black2 SSD:
- 4-16 кб: 13/43 Мб/с
- 1 мб: 64/51 Мб/с
- Для сравнения нормальный SSD Plextor PX-128M3:
- 4-16 кб: 23/78 Мб/с
- 1 мб: 128/114 Мб/с
То есть SSD WD Black2 примерно в 2 раза медленнее обычного SSD. Но, конечно, при случайном доступе всё равно гораздо быстрее HDD.
2015-07-09 Тупое клонирование интерфейсов
Вот никогда не понимал, зачем в некоторых программах настолько тупо клонировать некоторые интерфейсы?
Пример — Open/LibreOffice Document Recovery, абсолютно втупую склонированный с MS Office. Никогда не понимал, нафига для восстановления документа показывать отдельный модальный диалог при следующем запуске? Ну хочешь восстановить мой документ — просто открой закэшированную копию и покажи тонкой строчкой сверху «Документ восстановлен» или «Документ не восстановлен». На хрен для этого показывать отдельный диалог и заставлять меня ещё несколько раз кликнуть «Далее», «Finish» и «OK» в окне с ошибкой, если восстановить не удалось? Налицо же совершенно тупорылое копирование интерфейса MS Office, причём, очевидно, ещё старого, в котором был ровно такой же диалог.
И, наконец, самая дурь! Это самое «Recovery» происходит даже тогда, когда несохранённых изменений в документе вообще не было…
2015-06-21 Вкатил себе попи лоль 5.1 + нашёл нормальную тулу для MTP
Потратил чуть не день, но наконец-то выпилил штатную самсунговскую чудо-прошивку с кучей блотвари и залил какой-то левый билд CyanogenMod 12.1 (Android 5.1, попи лоль, SaberMod). Вообще можно было ещё взять JDC — там OTA есть.
Вроде стало побыстрее.
Так как, чтобы не прилетели какие-нибудь идиотские фантазии типа KNOX, официальные обновления отключены с первого дня, загрузчик остался XXUAMDE — это самый древний, а радиомодуль обновил до XXUBMH1 — это последняя версия модема, совместимая с не-KNOX’овым загрузчиком. Смысл буковок в том, что пока все нормальные люди нумеруют версии цифрами, самсунг это делает буквами: XXUA.., XXUB.., и т. п. Вот первая XXUD.. версия — уже KNOX, а KNOX нормальному человеку не друг.
И ещё наконец-то нашёл нормальную тулу для монтирования MTP в виде FUSE файловой системы: simple-mtpfs — она ЕДИНСТВЕННАЯ не тормозит (как, например, jmtpfs, go-mtpfs и android file transfer) и не глючит (как просто mtpfs).
2013-10-28 Каким бы мог быть Андроид
Этот пост я начал писать ещё 28 октября 2013 года :-)
А возвращаюсь я к нему каждый раз, когда думаю об обновлении прошивки на телефоне, задумываюсь об устройстве Андроида и испытываю по этому поводу сильный рвотный рефлекс. Ну почему там внутри такое уродство? Зачем лицемерный гугл, болтающий что-то об опенсорсе, делает его таким монолитным, неудобным для ковыряния и по факту закрытым?
Короче, вот каким бы, по-моему, мог быть ПРАВИЛЬНЫЙ андроид:
- Первое, что должно быть — модульность и пакетная организация системы, как в любом нормальном linux’е. Возможность обновления системной части по кускам или установки различных версий интерфейса: захотел — воткнул TouchWiz, захотел — воткнул гугловскую оболочку, захотел — MIUI, захотел — от Sony… без извращений со скачиванием идиотских «Zver Edition» сборок с бестолковых файлообменников. Без сбросов, без бэкапов. Опять-таки, как в любом нормальном linux’е!!!
- Вот эту фичу, кстати, в последнем андроиде почти реализовали: возможность выбора конкретных разрешений, предоставляемых приложениям, при установке, вместо безальтернативного «согласиться». «Почти» реализовали потому, что вроде-как возможности отрубить приложению доступ в интернет всё равно нет.
- Работать оно должно на стандартном ядре Linux, без костылей типа binder’а, «зиготы», эмуляции регистронезависимой ФС через fuse… Вместо первого — нужна тоненькая обёртка над банальными unix сокетами, вместо второго (с целью экономии памяти) — assembly, то есть «разделяемые библиотеки» на dalvik’е — насколько я понимаю, это есть в .NET, нужно было бы запилить аналогично.
- С учётом выпиленной зиготы запуск приложений тоже надо делать нормально — не через intent и вызов activity, а запуском обычного процесса. Тут конечно будут нюансы с обеспечением запуска под нужным юзером, но всё равно всё решаемо.
- GUI фреймворк делать надо так, чтобы его можно было использовать из любых языков, а не только из управляемого кода на яве! Самый очевидный способ сделать это — написать его на C/C++, а не на управляемой яве/далвике. Менее очевидный способ — как-то умудриться предоставить API с помощью Assembly, см. предыдущий пункт (тем более что AOT компиляция в андроиде уже есть). Также очень полезна была бы возможность замены UI фреймворка на другой (хоть Qt, хоть GTK, если захочется), без создания дополнительной прослойки.
- Естественно, обязательна поддержка usb mass storage (выпиленного в 4-ом андроиде каким-то идиотом), хоть даже напрямую в ext4, чтобы мелкософт своим убогим патентом на FAT32 LFN не потрясывал.
- Коли уж APK приложения не имеют зависимостей, вполне нормально было бы поддержать установку приложений вместе с данными в собственный каталог или раздел, не затрагиваемый при обновлении системы, а также поддержать произвольное разбиение диска. Чтобы на флешке при этом не копилась дикая свалка разнородного мусора, оставляемого приложениями — запись в другие директории разрешать только после подтверждения пользователем. При сносе приложений данные не удалять! Ибо они — собственность пользователя, а не приложения, и, соответственно, пользователь должен иметь к ним доступ. Бывает, конечно, всякий мусор типа кэша webview, но его просто нужно складывать отдельно, да и всё.
- Root права для пользователя должны быть доступны ВСЕГДА! Телефон и вообще софт должен защищать пользователя, а не ЗАЩИЩАТЬСЯ ОТ пользователя. То есть все selinux’ы и прочее фуфло должно быть либо отключаемым, либо реализовано так, чтобы пользователь всегда имел доступ ко ВСЕЙ системе.
- DRM, разумеется, быть не должно, в частности потому, что при наличии рута (который в итоге-то всё равно всем доступен) он всё равно БЕСПОЛЕЗЕН. На половые проблемы проприерастов, занимающихся продажей приложений (и фильмов, и прочего), мне в целом положить, но если уж им очень хочется, пусть делают свою защиту через привязку к серверу — способ вполне адекватный для смартфонов: уже сейчас нехилая часть приложений — тупо UI для чего-нибудь. Ну, калькуляторы продавать, конечно, уже не получится — НУ ТАК И НЕ ХРЕН. Ну не будет фильмов в маркете — тоже мне потеря. Всегда мечтал смотреть фильмы за деньги на 5" экране мобилы. Через мобильный интернет, ага. Всегда мечтал.
- Маркет должен быть более ориентирован на интеграцию с процессом разработки приложения: пусть там будет багтрекер, исходники в git, wiki, история версий, информация о лицензии, документация… Ну или просто интеграция с github’ом.
- НОРМАЛЬНАЯ опенсорсность самой системы. Сейчас андроид под лицензией Apache, в официальном репозитории поддерживается только для nexus’ов, и это создаёт огромные неудобства — каждый производитель городит свою закрытую оболочку со своими патчами, своим закрытым загрузчиком, своей системой обновления прошивки, да что там системой обновления… зачастую вообще без обновлений! Чтобы такого не было, нужно либо поменять лицензию на GPLv3 и вынудить производителей открывать все доработки, либо просто административным ресурсом загнать всех в ОДИН общий репозиторий, в котором и поддерживать. По сути, всё должно разрабатываться как CyanogenMod — система общая, а для разных девайсов различаются только специфичные части. Ещё лучше, если сделать и лицензию нормальную (GPLv3), и загнать всех в общий репозиторий. И поддерживать было бы проще, и обновлялись бы все охотно, и «фрагментации» бы пресловутой не было, и можно было бы изначально использовать нормальные компоненты, например, busybox и нормальный uclibc вместо bionic.
P.S: Ещё есть идея по поводу кроссплатформенных HTML/JS приложений — так как их очевидная проблема это непосредственно сам HTML, с его reflow’ами и отсутствием нативных контролов — нужно просто придумать другой нормальный скриптуемый язык описания интерфейсов (причём без особой специфики, чтобы можно было его сделать кроссплатформенным). Типа как стандартный андроидовский язык описания интерфейсов, только более приведённый к «вебовому» виду, со скриптами и даже, наверное, с возможностью грузить описания Activity с сервера аналогично HTML страницам сайтов (с кэшированием, конечно). Было бы, по-моему, очень круто — многие мобильные приложения сейчас представляют из себя просто нативные интерфейсы к сайтам, а так их даже не нужно было бы оборачивать в приложения — нативный интерфейс появлялся бы прямо в процессе просмотра интернетов.
2015-05-08 ХОССПАДИ НАКОНЕЦ-ТО!!! В PostgreSQL появился UPSERT!!!
ХОССПАДИ НАКОНЕЦ-ТО!!! В PostgreSQL появился UPSERT!!!
Фича, доступная в MySQL со хрен знает каких времён! REPLACE был уже в 3-ем (~2000 год), INSERT ON DUPLICATE KEY UPDATE — с 4.1, то есть с 2003 года :)))) добавлен как раз последний — INSERT ON CONFLICT (id) DO UPDATE.
Вот прям сегодня они это закоммитили в 9.5-devel… Прям реально ДЕНЬ ПОБЕДЫ!..
P.S: Нет, в обобщённом виде через CTE оно не эмулируется, потому что возникают проблемы с типами — как раз сегодня пробовал и обломался. Даже вот такой кейс обламывается, если a или b — INT: WITH v (a, b) AS (VALUES ('1', '2'), ('3', '4')) UPDATE t SET t.b=v.b FROM v WHERE t.a=v.a. Работает, только если явно указать '1'::int, но получается, что через функцию-обёртку ты UPSERT уже не сделаешь — нужно типы всех колонок в приложении (там, где запрос генеришь) знать. Обойти можно только совершенно дебильным способом — WITH v (a, b) AS ((SELECT a, b FROM t LIMIT 0) UNION ALL SELECT '1', '2' UNION ALL SELECT '3', '4') UPDATE... — только в этом случае постгрес осиливает '1' и '2' к нужному типу привести.
2015-03-15 Мне не нравится HTML5
Не нравится мне HTML5. Ну не то что весь, а та его часть, где именно про HTML, то есть про теги.
Вот нафига нужно столько новых тегов? article aside bdi details dialog figcaption figure footer header main mark menuitem nav rp rt ruby section summary time wbr.
По мне, правильнее было бы число тегов и атрибутов наоборот уменьшить! И пересадить всё на CSS-свойства. Например, сделать, чтобы colspan и rowspan можно было задавать в CSS…
2015-03-01 Удалённое изнасилование: миграция сервера с 32 на 64 бита
О, я крут. Вчера удалённо сменил систему (Debian Wheezy) на сервачке с 32-х на 64-х битную.
Применил для этого свою «аварийную систему», состоящую из dropbear и busybox в initramfs (очень рекомендую, удобная штука).
Общая схема действий у меня была такая — почистить систему от устаревших пакетов, перейти на 64-битное ядро, создать 64-битную копию системы из тех же пакетов и потом через аварийную систему (dropbear) заменить содержимое / и /usr на 64-битное, оставив старые /etc и /var.
В целом, за исключением некоторых нюансов, после такой операции система стартует без особых проблем. Какие конкретно есть нюансы:
- Чтобы поставить все те же пакеты в 64-битном виде, сначала нужно почистить систему от устаревших пакетов. Для этого удобно использовать Aptitude — оно умеет показывать «локальные/устаревшие» пакеты — то есть установленные, но которых при этом нет в репозиториях. Все такие пакеты надо прибить или на что-то заменить — собственно, это вообще полезно, система чище будет.
- Модули perl/python/ruby/php, установленные через cpan/pip/gem/pear, естественно, в 64-битной системе нужно установить заново.
- Данные MySQL (InnoDB) трогать не надо — они отлично переносятся, формат хранения архитектурно-независим.
- Базы данных dpkg и debconf (/var/lib/dpkg и /var/cache/debconf) нужно обязательно скопировать из chroot’а от новой 64-битной системы в свой /var, в целом остающийся от старой системы без изменений).
- Некоторые alternatives — конкретно, java’шные — могут поломаться, их нужно починить (update-alternatives --all).
- /etc/ld.so.conf.d/* нужно тоже взять от 64-битной системы.
- Базы данных rrdtool архитектурно-зависимы! Их нужно сделать dump/restore. Актуально для систем мониторинга — nagios, munin и подобные, как правило, именно RRD и используют.
UPD: А ведь действительно, о потреблении памяти-то я и не подумал. Оно в 64-битной версии возросло очень прилично — после echo 3 > /proc/sys/vm/drop_caches в 32-битной системе занято 1.85 гб, а в 64-битной — 2.9 гб при идентичном наборе запущенных сервисов. Налицо рост на 56 %… Ну ладно. Технология удалённого изнасилования уже отработана — вернул 32-битную систему взад ))
2015-03-02 Аварийная система для Debian - краткая инструкция
Уже давно сделал себе из dropbear и busybox в initramfs «аварийную систему», позволяющую войти на сервер, даже если в процессе загрузки что-то сдохло.
Очень рекомендую — при наличии такой штуки практически полностью отпадает необходимость иметь KVM или физический доступ к серверу. Вот краткая инструкция по конфигурированию её в Debian:
- Установить пакеты initramfs-tools (ну вдруг не установлен? :D), dropbear, busybox.
- В /etc/initramfs-tools/initramfs.conf прописать BUSYBOX=y, DROPBEAR=y, IP=<адрес>::<шлюз>:<маска_подсети>:<имя_хоста>::static (либо просто IP=dhcp, если у вас на сервере DHCP).
- Прописать свой SSH-ключ в /etc/initramfs-tools/root/.ssh/authorized_keys, не забыть сделать его chmod 600.
- Модифицировать несколько скриптов в /usr/share/initramfs-tools.conf вот таким патчиком, командой cd / && patch -p0 < patch-rescue_dropbear_udev_initramfs-tools.diff (патчик делает так, чтобы содержимое initramfs, а также /sys, /proc, /dev и /dev/pts не убирались из «старого» корня и чтобы dropbear запускался на 1022 порту и не останавливался при продолжении загрузки).
- Сделать hold пакетов initramfs-tools, udev, dropbear, чтобы не перезаписались случайно наши модифированные скрипты.
- Запустить update-initramfs -u -k all, перезагрузиться.
Вроде ничего не забыл… после этих операций у вас должна появиться «аварийная система», работающая целиком из initramfs и не требующая подмонтированных дисков, в которую вы сможете всегда (даже после старта основной системы) зайти через ssh с ключом на 1022-й порт. И если что-то сломается в процессе загрузки — вы сможете зайти и попытаться это исправить, хотя консоль, конечно, не увидите… (кстати, может способ увидеть её есть и надо просто его найти?)
И последняя фишка — как намеренно перезагрузиться в «аварийную систему» так, чтобы основная не стартовала? Оказывается, очень просто — нужно только прописать в параметры загрузки ядра опцию break=mount. Это штатная фича Debian’овской initramfs — она приостановит выполнение init’а как раз перед моментом монтирования «нормальной» корневой ФС.
2014-11-25 Ортокератология
Сделал себе недавно ортокератологическую («ночную») контактную линзу. Одну, потому что левый глаз всё равно не исправляется — амблиопия с детства (в чём причина оной, хз — никто не диагностировал никогда, хотя лет до 5 можно было и вообще исправить, по идее).
Ночная линза — это такая штука, которую каждую ночь надеваешь, каждое утро снимаешь, а день потом видишь хорошо, потому что она за ночь искривляет (точнее, распрямляет) роговицу, чтобы она стала менее выпуклой. Исправляется таким образом близорукость от −1 до −7, лично у меня где-то −2.5, из которых −0.8 — это минимальный астигматизм (горизонтальные линии двоятся, вертикальные чёткие). Ещё есть некие неподтверждённые данные о том, что эта фигня тормозит прогрессирование близорукости. В моём случае до 16 лет я видел идеально, так что прогрессирование составляло где-то 0.25 в год — посмотрим, затормозится ли.
Почему это круто? В моём случае это круто потому, что недеструктивно — достаточно перестать носить и через несколько дней (максимум через неделю) зрение вернётся к своему естественному состоянию. А глаз-то у меня фактически один (левый видит плохо и не исправляется), так что если допустим при операции что-то не то отрежут (выпарят) лазером — восстановить уже куда сложнее.
Ну ещё, понятное дело, круто, что её носить днём не надо, ничего в глазу не торчит, не сохнет (как мягкие линзы), не боится дыма (как жёсткие дневные), и не мешает дыханию и слезообмену глаза (а следовательно, меньше приводит к побочным эффектам).
Короче, всё круто, есть только один нюанс — в темноте картинка двоится. Связано это с формой линзы, она сама по себе внутри имеет неравномерную кривизну, чтобы краями как бы «держаться» за роговицу, а центром «давить». То есть, исправляет она только центр, и получается, что пока зрачок узкий — картинка фокусируется через область с «правильной» кривизной, а когда в темноте зрачок расширяется — получается, что через «линзу» неравномерной кривизны в глазу фокусируется два изображения — одно там где надо и поэтому чёткое, а второе, через края — размытое.
Ещё степень воздействия зависит от того, сколько спать — мне вот сделали линзу максимального диаметра (11 мм), с ней если спать меньше 8 часов — явно заметно, что двоится в темноте сильнее. Лучше всего спать часов 9, тогда почти не двоится.
Короче, прикольная штука. Делал в Доктор Линз.
2014-10-08 Обновил статью про Perl-платформы
Обновил статью Платформы для запуска Perl веб-приложений.
2014-09-20 Я HTML джедай)))
Ну я джедай)) для адаптивной вёрстки сделал на чистом HTML+CSS табличку размером 1x4 (1 строка, 4 столбца), которая при необходимости опять-таки посредством чистого CSS превращается в таблицу 2x2, при этом она остаётся именно таблицей, а не набором плавающих слоёв, и во второй строчке оказываются не 3 и 4 ячейки, как в решении с плавающими слоями, а 2 и 4, и решение легко меняется для выбора другой комбинации.
Хак основан на применении rowspan и скрытии ячеек через display: none, поэтому хорошо работает во всех браузерах. Идея:
2x2: все ячейки видны, но пустые незаметны, ибо схлопываются до нулевой ширины.
Ячейка 1, rowspan=2 | пустая ячейка | Ячейка 3, rowspan=2 | пустая ячейка |
пустая ячейка (строка 2) | пустая ячейка (строка 2) | ||
Ячейка 2 | пустая ячейка | Ячейка 4 | пустая ячейка |
1x4: путём display: none целиком скрывается 2-я строка (<tr>), состоящая из двух пустых ячеек, а также пустые ячейки (<td>) в 3-ей строке. Скрытие второй строки заставляет rowspan захватить третью, ячейки 2 и 4 позиционируются на свои места, а пустые схлопываются до нулевой высоты (они ж пустые!) и становятся не видны. Выглядит это как таблица 1x4.
Ячейка 1, rowspan=2 | пустая ячейка | Ячейка 3, rowspan=2 | пустая ячейка |
Ячейка 2 | Ячейка 4 |
Вуаля — вёрстка осталась неизменной, путём чистого CSS таблица превращена из 2x2 в 1x4! Стилевое преобразование легко вешается на Media Query и становится частичкой адаптивной вёрстки (responsive layout).
А я джедай :-P
2014-09-18 Blender, Radeon, Mesa, OpenCL
Пытался тут на новом ноуте заюзать OpenCL в блендере — потерпел неудачу… ещё конечно подебажить попробую… но хз, получится ли.
Теоретически там радеон 8770M, а это значит, что в Mesa есть OpenCL, реализованный посредством LLVM.
Практически:
Сначала блендер просто не видел OpenCL в системе… это решилось просто — он хотел библиотеку libOpenCL.so, а это симлинк на libOpenCL.so.1.0.0, который почему-то оказался не в том пакете (оказался в -dev).
Потом что blender, что clinfo не могли заюзать радеон из-за permission denied по какому-то ioctl — это я не решил, но обошёл тупо путём запуска из-под рута.
Потом оказалось, что blender’у нужно передать переменную окружения CYCLES_OPENCL_TEST, передал… С этого момента OpenCL он у меня увидел.
Следующая проблема была в том, что ядро (OpenCL kernel, программа, которую на GPU грузят) не компилилось мезой. Я было подумал что всё, пиши пропало — например, пишут, что вроде на закрытом AMD’шном драйвере там вообще всё совсем печально, типа не компилится потому что тупо ядро большое, и их компилятор давится.
Но тут-то вроде LLVM, не должно такого быть! И таки да — я нашёл просто ошибку в этом самом ядре. Она мелкая, там они просто . вместо -> в одном месте юзали (код по сути C-шный). Правда, чтобы это найти, я сначала нашёл ещё одну переменную окружения — CYCLES_OPENCL_DEBUG, чтобы готовый исходник ядра, собранный из кучи файлов, увидеть.
Итак, после исправления этой очипятки ядро собралось… но после этого, увы, блендер просто стал падать с segmentation fault’ом где-то в недрах LLVM уже при попытке трансляции видимо IR’а в radeon’овый шейдерный код. И тут я пока хз, получится ли это поправить. Есть ещё маленькая вероятность, что это баг oibaf’ской сборки, так как mesa у меня именно оттуда… В общем, буду искать баг дальше. Очень уж хочется Cycles на GPU запустить.
UPD: Залез в недра LLVM, попробовал поискать баг; обнаружил, что в SIAnnotateControlFlow.cpp в handleLoopCondition() в какой-то момент попадает PHINode, у которого первый аргумент равен ему самому. Теперь вся интрига в том, как это всё-таки происходит?
UPD2: Видимо, в LLVM PHINode, содержащий себя — это вполне нормальный продукт оптимизатора. Причём мало того, что он может содержать себя напрямую, в качестве одного из IncomingValue, так оказывается, что может и через другой PHINode (то есть phi->getIncomingValue(0)->getIncomingValue(0) == phi)… Поэтому просто пропускать значения, равные самому PHINode, не помогает, нужно проверять во всю глубину… И главное, не очень понятно, ЧТО вообще по логике означают такие PHINode. Написал по этому поводу в список рассылки LLVMdev — пока в ответ тишина…
2014-07-30 Пришла она
- Сегодня к нам пришла она,
- Бессовестная информационная война
- Готовы блогеры к труду и к обороне -
- В жж, в сети иль в стандалоне!
- Всегда мобилизованы в России
- войска диванной рефлексии...
2014-07-29 Wine
Докладываю: сегодня впервые у меня игра не заработала под виндой, но отлично завелась под Wine :) глядишь, скоро линукс будет большая винда, чем сама винда, и как следствие, винда вообще совсем не нужна станет… А уж если многопоточную трансляцию DirectX в OpenGL в состав wine примут… или нативную реализацию оного поверх Mesa/Gallium3D… :) а ещё наконец запилят тесселяцию в Mesa… Хе-хе :) круто, короче.
2014-07-06 Ремонт сифона SodaStream
Есть у меня доставшийся на халяву SodaStream’овский сифон для газирования воды, вот такой «Pure»:
Не то чтобы из него газировка лучше или дешевле… Ничего подобного. Концентраты у них двух видов, обычные и «Goodness» — первые с бензоатом натрия, стоят по 320р и баночки хватает на 12л, вторые типа получше, но баночка стоит уже 400р, и хватает её только на 6л. Перезаправка баллона с CO2 стоит 800р, хватает его примерно литров на 60. То есть, цена 1 литра получается либо 40р, либо 80р с дорогим сиропом. Бывают ещё всякие левые сиропы, но стоят всё равно примерно так же.
Зато прикольно — налил воды, нагазировал и пьёшь себе =) ну и сиропы довольно вкусные и разнообразные, аналогов многих видов в магазине нет.
Ну и если сравнивать с обычными баллончиковыми сифонами, то SodaStream круче в стопицот раз, так как удобный:
- Вода газируется не в самом сифоне, а в прикручиваемой к нему отдельной бутылке
- Баллон CO2 используется большой (425 грамм), а не эти мелочи по 5г… Соответственно давление в нём выше и газируется вода гораздо лучше.
- Конструкция довольно грамотная и вода из всех дыр в процессе не хлещет.
Но вот незадача, пару лет назад эта тварь отработала буквально пару баллонов и дала дуба — стала травить газ куда-то вбок вместо того, чтобы пускать его в воду. С тех пор оно валялось в надежде, что я его попробую разобрать и починить, и недавно меня что-то вштырило и надежда эта наконец сбылась.
В процессе ремонта сфотал и решил запостить устройство сифона. Оно простое, разборка тоже простая — сначала снимается крышка, потом железки с боков, потом откручивается кажется 6 винтов и перед нами весь механизм:
В общем, справа прикручивается баллон, рычаг, за который тянешь, когда газируешь вода, соединён «уздой» с клапаном у баллона, посередине — блок с резьбой под бутылку (не видна, ниже рисунка), к которому ведёт трубка от баллона. Самая хитрая часть — это два клапана по бокам центрального блока: клапан 2 для сброса избыточного давления в процессе газирования, клапан 1 — для полного сброса давления при наклоне бутылки — это там логика работы такая — вставляешь бутылку под углом, закручиваешь, опускаешь вниз, газируешь, наклоняешь обратно и выкручиваешь. Оба клапана подпружиненные, сделаны, судя по всему, из нейлона.
В общем, у меня оказалось всё просто — клапан 1 клинил и не закрывался, видимо я как-то раз пытался газировать воду прямо с концентратом, эта сладость туда попала и залепила клапан. Снял клапан, разобрал (там две трубки, одна вкручена в другую и потом вторая уже вкручена в корпус), помыл, закрутил обратно с лентой ФУМ и вуаля, сифон опять работает :)
2014-04-02 Опупенно Йота проблемы фиксит!
Опупенно Йота проблемы фиксит!
Где-то в январе я им писал в техподдержку — мол вы новую базовую станцию рядом поставили, сигнал стал супер, но скорость вообще никакая, видимо у самой БС канал очень узкий, сделайте что-нибудь, а то юзать невозможно стало — и дальнюю соту не поймаешь на усилитель, и в ближней нормально не поработаешь…
Как, по-вашему, они это пофиксили?
УБРАЛИ СОТУ ОБРАТНО)))))
Просто гениально. Хотя в общем да, я теперь обратно дальнюю ловлю, и там, как и было раньше, скорость и пинги вполне приличные, несмотря на довольно слабый сигнал.))
2014-03-26 OpenSCAD
Типа «CAD для программиста». Пишешь скриптик, тебе генерится какая-нибудь шестерёночка =) а потом ты её, скажем, экспортируешь в STL и печатаешь на 3D-принтере. Язык простой, состоит из примитивов и операций над ними, в основном булевых (объединение/пересечение/разность).
Правда, есть пара нюансов:
(1) Нежелательно оперировать объектами с совпадающими или очень близкими плоскостями/вершинами, то есть склеивать/резать детали «заподлицо». Из-за того, что все операции с плавающей точкой, иногда получается, что детали «недоклеиваются» и где-нибудь «проступают» лишние вырожденные грани (то есть грани с очень маленькой площадью)… Их обычно мало, но тем не менее, софт 3D принтера они могут расстраивать, и объект на печати может получаться не совсем качественный. Причём это может проявляться даже хитрее — например, при объединении шестерёнки и цилиндра нужно следить, чтобы края зубьев шестерёнки не совпадали к краями граней цилиндра. То есть, для цилиндра нужно ставить число граней = 2 * числу зубьев шестерёнки.
(2) Дефолтный OpenSCAD использует какой-то совершенно дебильный метод триангуляции — пытается тянуть треугольники из одной точки во все точки, в которые может дотянуть. Что, собственно, часто ведёт к тем же вырожденным граням — причём на совершенно нормальных деталях. И говорят, даже без вырожденных граней из-за длинных и узких треугольников при печати получается хреновое качество поверхности. Однако это не беда, есть простой фикс (я его в свой форк влил — https://github.com/vitalif/openscad), заставляющий OpenSCAD юзать триангуляцию Делоне, которая, естественно, вполне себе приличная. Сравнение на примере шестерёнки выглядит вот так:
Проверять модели на предмет подобных проблем, кстати, можно с помощью FreeCAD — там есть инструмент «Оценить и ремонтировать сетку».
А в остальном — очень удобная штука =) чем пытаться чего-то чертить, пишешь себе программку и наслаждаешься шестерёночками…
Кроме того, есть и готовые куски кода, в том числе — эвольвентный профиль зубьев шестерёнки — в библиотеке MCAD, входящей в комплект поставки. Ну, и ещё OpenSCAD скрипты можно брать (и выкладывать!!!) на http://thingiverse.com/.
2014-03-19 Глобальный программист
Откопал ржачное резюме 16-летнего «глобального программиста», которое нам в сентябре 2012 скидывали HR’ы. Орфография и пунктуация сохранены.
Жалко, что он не пришёл, когда мы его позвали )))))
Профессиональный web программист. Более 200 сайтов в портфолио. Дипломы и награды от компании microsoft. Я получил 2 сертификата microsoft pro 2010 и 2011. Для меня сайт должен быть сильный и мощный, чтобы выдерживал всю нагрузку как на сервера так и на работоспособность, я считаю что это и есть обязанность программиста сделать то, что сделать сложно. Мои функции заключаются в профессиональной работоспособности как и программ так и сайтов. Легко владею php, javascript, html, css, c++, c# и многими другими языками. Так же работаю в сфере CMS 1c:Битрикс, создаю сначала сайт, проверяю его, а после заношу на CMS, если оно требует.
Прошу учесть что мне 16 лет, если вас волнует возраст, то в этом случае я без силен, но если вас интересует и нужны глобальные программисты с резюме microsoft, то мой номер 89857890201. Мой e-mail: Daniltrane95@gmail.com
Блестяще владею в плане дизайнера. У меня 2 социальных сети написанные на java, можно сказать что и javascript мне подвластны.
Последние работы
- http://javagala.ru/ - социальная сеть в которой более 18 мл. человек.
- http://69.tehnosila.ru/ - техносила в нижнем тагиле
- http://tagilnext.ru/ - сайт торгового центра в нижнем тагиле
- http://rostov-na-donu.wikihelps.ru/ - мини портал ростова-на-дону
- http://www.krd.ru/ - мэрия города Краснодара. шаблон и дизайн сделал я. так же поставил туда админ. доступ, чтобы весь текс и все остальное они сами смогли добавлять и редактировать.
Рекомендации
- microsoft
- Deciy, программист