?

Log in

No account? Create an account

Заповедник репрессивной психиатрии

О строительстве
metaclass
По поводу этого: http://auto.onliner.by/2012/06/01/perekrytie-54
У меня такое ощущение, что ВЕСЬ минск превратили в одну большую стройку, особенно что касается дорог. В серебрянке рокоссовского уже 3-4 года ломают, трамваи как ходили до разворота на Рокоссовского, так и ходят. В центр города выхожу редко, но и там то положат, то снимут асфальт. Сейчас еще и выезд с чижовки по кабушкина перестраивать начали.
При этом, во-первых, не наблюдается никакого внятного планирования работ, во-вторых, из строителей работники, как из выпускников РТИ - программисты. "Один работает - пятеро стоят смотрят".
Предполагаю, что причиной этому бардаку - объективные планы развития города + интересы попильщиков бабла, практически непобедимое сочетание, думаю.

А расскажите мне за кодировки в Java?
metaclass
В дотнете я понимаю - внутри сплошной юникод, кодировка - аспект возникающий только при преобразовании "строка<->массив байт(или файл)". А вот в Java как?
Вот есть документация на соответствующий класс:
http://docs.oracle.com/javase/1.5.0/docs/api/java/io/InputStreamReader.html
Там есть конструктора, принимающие Charset или charsetName но унаследованный класс таких конструкторов не содержит, т.е. я так понимаю - нужно руками открывать FileInputStream, передавать его в конструктор InputStreamReader с соответствующей кодировкой, а его потом еще завернуть заодно в BufferedReader?

Анти-критерии для софта и апи
metaclass
В процессе срачей с айседом пришел к выводу, что искать идеальные софты/либы/платформы бесполезно, практически все, что хоть как-то используется - достаточно пригодно для использования. Лучше выделить критерии для того, что использовать нежелательно:

С точки зрения пользователя:
1) Отличие от общепринятых UI гайдлайнов. Например, розовый фон, красные кнопки, шрифт Comic Sans и выход из программы по кнопке F1.
2) Неадекватное поведение по отношению к другим программам и ОС. Например, встраивание хуков на системные действия или расширений в Explorer.
3) Издевательства над обычными средствами пользовательской интеграции - например, невозможность без вуду скопировать текст из программы в клипбоард, стандартным сочетанием кнопок или меню.
4) Наличие тупиков в Workflow, т.е. возможность обычными действиями зайти в программе туда, откуда обычными действиями уже не выйдешь (только снимать программу из диспетчера задач, kill и прочая)
5) Отсутствие прогресс-баров и прочей индикации выполнения при длительных операциях, отсутствие возможности их корректно прервать.

С точки зрения админства-деплоймента:
1) Неумение работать в многопользовательской среде/на терминальном сервере.
2) Неумение переживать xcopy-деплоймент и запускаться на чистой машине. В крайнем случае - должно быть документировано, что из окружения требуется (.net, жаба, переменные окружения)
3) Хардкодед пути в бинарниках - убивать нещадно.
4) Размещение своих либ/данных в общих папках, типа system32. Под линуксом - не считается, там за это пакетный менеджер, в идеале, отвечает и там принято всему софту гадить единообразно.

С точки зрения программизма:
0) ad-hoc программирование, без проектирования. Практически сразу заметно по структуре api.
1) Хардкодед значения, не являющиеся математическими константами. Пытать на дыбе авторов. Сюда же - хардкодед пути типа C:/Program Files или C:/openssl/etc (портированный софт
2) Тот же контекст, но в пределах ВСЕЙ ОС, а не только запущенного бинарника (Dragon Naturally Speaking и его апи - сука, ненавижу).
3) Не реентерабельные функции.
4) Отсутствие в АПИ для работы с внешними ресурсами явных пар типа Open/Close, Enter/Exit.
5) Невидимый/недокументированный/мутабельный глобальный контекст. Сюда же - использование такого контекста для работы с внешними ресурсами. Т.е. Open не возвращает "хендл для работы с ресурсом", а просто открывает где-то внутри его и все последующие функции его используют, неявно. Например, коннект к БД - один на всю программу. Или транзакция - одна на весь коннект к БД.
6) Отсутствие для значений getter там где присутствует setter. Забивать гвозди в голову за такое. Т.е. мы можем установить некий параметр, но не можем узнать его значение.
7) Случайное поведение API, не объяснимое переданными параметрами и документированным окружением. Обычно - следствие пункта 5 и общего рукожопия.
8) Использование GUI в явно не-гуишных либах. Последний пример - библиотека для работы с одной железякой, кидающая диалоговое окно при ошибке драйвера. Если ее использовать в фоновом сервисе - капец от входа.
9) Отсутствие в API возможности показать прогресс и прервать длительно выполняющиеся операции.
10) Отсутствие обработки ошибок вообще. УБИВАТЬ! УБИВАТЬ! УБИВАТЬ!
11) Обработка ошибок нормального workflow исключениями. Т.е. "попытка подключится к отсутствующему серверу" кидает исключение, хотя должна быть операция TryConnect
Хуже этого - только парсинг строк в простые значения без функции TryParse
12) Отсутствие логгинга. Сажать на кол, конечно же.
13) Отсутствие исходников - когда вышеописанное вылезет в полной мере, а автор окажется живущим половой жизнью с ежихой в ашраме Гуру Бхактиведанты Свами Прабхувады Ребе Короля Мошиаха - вам придется чинить либу самому.
За вас никто ничего чинить не будет - инфа 100%, еще ни одной либы не видел, где автор бы починил самоочевидную ошибку ранее чем через месяц после баг-репорта.

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

PS от denisioru:
- невозможность запустить несколько инстансов софтины одновременно. Да, год 2012й. Лом в жопу.
- изобретение собственных IP-протоколов. Прикладной софт должен работать по UDP или TCP. В редких очевидных случаях - RTMP и иже с ними. Люто, бешено лоботомировать.
- использоать API ОС для ресолвинга имён. За формирование руками DNS запросов и отправку их в неизвестном направлении - насылать нещадный кровавый понос.
- использование нестандартных диалогов открытия и сохранения файлов. Как наказание - выдать блок питания к ноуту юзера, несовместимый с розетками в офисе и дома.
- глюки на мультимониторных конфигурациях. За появление главного окна софтины, напополам распиленное между десктопами - выкалывать глаза.
- создание и использование временных файлов ВНЕ системного каталога TEMP - отправлять сортировать мусорные баки.

PS от vp:
- невозможность запустить софтину под уровнем пользователя , отличного от админа
- невозможность работы с UNC путями
- гадить во временную папку, которую пидор создал в корне системного диска (NVidia, Intel - привет)

Диагностика дебиана по фотографии
metaclass
http://fas-tm.livejournal.com/29287.html

1) Скачал образ дебиана для raspberry pi: http://johnrhodes.co.uk/RPi/images/debian/6/debian6-19-04-2012/debian6-19-04-2012.zip
Внутри файл img - образ sd карты.
2) узнал у айседа, как узнать где живут разделы в этом образе: file debian6-19-04-2012.img
debian6-19-04-2012.img: x86 boot sector;
partition 1: ID=0xc, starthead 0, startsector 2048, 153600 sectors;
partition 2: ID=0x83, starthead 3, startsector 157696, 3256320 sectors;
partition 3: ID=0x82, starthead 3, startsector 3416064, 391168 sectors, code offset 0xb8
3) losetup -f -o 80740352 debian6-19-04-2012.img
4) mount /dev/loop0 /mnt/rpi
5) нашел файло с данными пакетов /mnt/rpi/var/lib/apt/lists/ftp.uk.debian.org_debian_dists_squeeze_main_binary-armel_Packages

В нем версия libcurl3-gnutls старая, в репе такой версии уже нет, а apt-get update почему-то не отработал (возможно, из-за дубликата main в /etc/apt/sources.list?)
Соответственно, зависимость для git-core находится старой версии, apt пытается ее качать и получает 404.