|
Подпишитесь на новости сайта по RSS
|
|
Главная страница
Здравствуйте!
Вы находитесь на сайте WebHamster.ru. Наш хомячок бегает по интернету в поисках интересной информации. Он собирает её по крупицам и аккуратно складывает здесь. А еще хомячок знает буквы, садится за свою маленькую пишущую машинку и сам пишет всякую ерунду. Он такой непоседа...
Новости
|
|
|
Сегодня залил на GitHub исходники очень нужной, полезной и, не побоюсь этого слова, эксклюзивной программы, написанной за один день.
ClipFixer - пример Qt-проекта, в котором демонстрируется работа с буфером обмена
Данная программа написана в рамках говноавтоматизации сметно-договорного отдела промышленной организации, в которой я сейчас работаю.
Задача:
Оператору передаются Excel-файлы смет, каждый экземпляр которых создан со всей сопутствующей фантазией. Единой формы нет, единых принципов составления нет. Единственное, что объединяет эти файлы - шапка сметы, которая содержит почти единообразное кол-во столбцов и почти похожие наименования столбцов. Проблема в том, что один и тот же столбец сметы в разных файлах может занимать разное количество ячеек по ширине (от 1 до 80). И одна запись в смете по высоте может занимать от 1 до 10 ячеек. Кто как захотел, тот так и сделал.
Учитывая, что в организации 8 отделов и 2 сторонних организации, а в каждом отделе (организации) пара человек занимается сметами, и каждый человек составляет сметы примерно в двух-трех различающихся форматах, имеем около 50 различных форматов смет. Всего смет около 3000.
Сметно-договорной отдел должен ежемесячно формировать из этого зоопарка итоговую смету, в один лист которой попадают работы из других файлов смет. А так как все сметы разные, то после копи-паста приходится много править вручную.
Внедрять автоматизированную систему для работы со сметами никто не собирается, требовать от всех единого формата никто не решается, поэтому задача была сформулированна так: сделайте что-нибудь, чтобы мы могли быстрее обрабатывать сметы.
Решение:
Ну что же, вот вам программа с волшебной кнопкой "Сделать хорошо".
Окно программы имеет два элемента управления: выбор формата сметы и волшебная кнопка. В формате сметы указывается, сколько ячеек по ширине занимает каждый столбец. Пользователь копирует в буфер обмена строку (строки) из исходной сметы, нажимает волшебную кнопку, и в буфере обмена размещаются преобразованные ячейки, объединенные согласно формату.
Пользователь имеет возможность самостоятельно создавать форматы смет. Так же в программе предусмотрен отладочный режим, который позволяет просматривать исходное и преобразованное содержимое буфера обмена.
Код:
Код сделан в лучших традициях говнокодинга. Работает, и ладно.
Скриншоты:
Стандартный вид:
Расширенный вид:
Желаю всем программистам никогда не писать подобные программы.
|
|
|
|
Сегодня в ветку experimental были залиты изменения, отвечающие за новый механизм движения по истории посещаемых записей в программе накопления информации MyTetra. В предыдущем релизе MyTetra уже были реализованы кнопки движения по истории и начальный механизм отслеживания перемещения пользователя. Однако старый механизм сбивался, когда пользователь в момент нахождения в "середине" истории переключался на совершенно другую запись не находящуюся в исторической последовательности.
Новый механизм движения по истории, который будет включен в новый релиз MyTetra, полностью переделан, и теперь правильно реагирует на последовательность перемещения пользоватля.
Казалось бы, ну что такого сложного в том, чтобы реализовать историю и перемещение по ней? А сложность в том, что пользователь далжен иметь возможность двигаться как назад, так и вперед по истории. Если бы пользователю была дана возможность двигаться только назад, то сложности никакой нет - знай уничтожай идентификаторы последней посещенной записи, да переключайся на предыдущую посещенную. Но когда нужно двигаться вперед по истории, то все становится гораздо интереснее.
Допустим, пользователь посетил записи с идентификаторами:
a, b, c, d, e
Затем он стал нажимать кнопку "назад по истории". Так как при движении назад удалять историю нельзя (потому что мы должны иметь возможность двигаться вперед), можно ввести понятие "Указатель в истории". При обычной работе он всегда указывает на самую актуальную (последнюю) ячейку в истории. А при движении по истории "Назад", смещается назад. Таким образом, перед началом движения по истории имеем:
a, b, c, d, e
^
А после того, как пользователь отъехал на 4 шага назад имеем:
a, b, c, d, e ^
Тут возникает вопрос. А надо ли при движении назад записывать посещаемые при движении назад записи в конец истории? Правильный ответ - надо (в старой версии MyTetra ответа на этот вопрос я не знал). Потому что если не записывать записи при движении по истории, то произойдет следующее. Предположим, что врнувшись к записи a, пользователь самостоятельно нажмет на запись h. А куда надо записать информацию о посещении h? Самое естественное - в конец истории. А так как пользователь начал "писать свою историю", то и указатель в истории надо переместить на новую запись. И тогда получим следующее:
a, b, c, d, e, h
^
А теперь попробуем снова нажать кнопку движения назад. Куда мы попадем? На запись e. А были то мы до этого на записи a. Хорошо, а если поступить по-другому, и поместить запись h после записи a? В середину истории запись h не засунешь, потому что получится черти что. Единственная возможность - это удалить все записи в истории справа от a, и добавить на их место h:
a, h ^
Но тогда теряется практически вся истори! Вот поэтому и надо записывать в историю все посещаемые записи, даже при движении по истории. Если мы записываем все движение назад, от e до a, то к моменту достижения записи a получим:
a, b, c, d, e, d, c, b, a ^
И если в этот момент пользователь самостоятельно кликнет на запись h, то история станет выглядеть так:
a, b, c, d, e, d, c, b, a, h ^
И если пользователь пожелает снова нажать кнопку "Назад", то он попадет на запись a, где он и был до этого. И так далее для других записей в глубину истории, причем последовательность именно та, в которой он видел записи. Для перехода с записи h на запись a история станет выглядеть так:
a, b, c, d, e, d, c, b, a, h, a ^
Здесь так же учитывается, что запись a еще и добавится как самая актуальная запись в истории.
Казалось бы, проблема решена? Нет! Что, если пользователь отъедет назад по истории, и начнет двигаться вперед? Из-за того, что посещенные записи добавляются даже, если происходит движение по истории, то история дополняется новыми записями с той же скоростью, что и движение указателя истории вперед. То есть, указатель никогда не достигнет самой актуальной записи:
a, b, c, d, e, d, c, b, a, h, a, h ^
a, b, c, d, e, d, c, b, a, h, a, h, a
^
Я долго думал, как же решить эту проблему. Пытался сделать маркеры на посещенных записях, для которых было движение назад по истории, чтобы при движении вперед "проскальзывать" эти записи. Но это не помогло - вновь появляющиеся в истории записи не маркировалсь (и непонятно, нужно ли их маркировать), в результате чего снова получалась путанница.
Решение было найдено в еще одном указателе, который активируется при начале движения назад по истории. Очевидно, что необходимо отслеживать момент, когда началось движение назад, чтобы при движении вперед, при достижении данного маркера перепрыгнуть к самой актуальной записи. Ну а если пользователь снова захочет проехать назад, он будет двигаться по "копиям" идентификаторов записей, которые появились в истории, когда он первый раз путешествовал назад-вперед. Причем последовательность этих "копий" правильная.
Именно такой механизм сейчас и реализован в MyTetra, и, если он покажет свою состоятельность, он будет в релизе.
Следите за новостями.
|
|
|
|
В современных фреймверках, и в Qt в частности, работа с буфером обмена реализована на зачаточном уровне. Если в буфере обмена находится текст - то текст будет передан. Если в буфере обмена находится картинка - то картинка тоже будет передана. А что произойдет, если в буфере будет находиться и текст и изображение? Ничего хорошего! Не существует кроссплатформенных методов одномоментного получения из буфера обмена различных типов объектов. Поэтому, если выделить текст с картинками в браузере Firefox, и вставить текст в Microsoft Word, то Microsoft Word не сможет получить картинки из буфера обмена. Он пропарсит текст, найдет интернет-ссылки, и молча примется их закачивать. Создается впечатление, что Microsoft Word умеет копировать текст с картинками через буфер обмена, заполненный другой программой, но на деле это не так.
Моя программа для накопления информации MyTetra тоже не могла похвастаться копированием текста, содержащего картинки. Можно было скопировать и вставить отдельную картинку. Можно скопировать и вставить текст с картинками в пределах самой программы MyTetra. Но вставить текст с картинками из браузера небыло никакой возможности.
Недавно у меня состоялся такой разговор с пользователем PIM-менеджера CherryTree:
Пользователь:
Не могу сказать, когда это было реализовано. Но год назад, когда я начал пользоваться cheerytree, эта возможность уже была, что и определило мой выбор.
Я:
Посмотрел. Я-то думал, что, действительно, решена задача вставки из буфера текста + картинок. А на самом деле задача не решена. Они просто парсят вставляемый текст, и выкачивают картинки.
Соответственно, такое решение не работает:
- Если используется прокси. Картинки не копируются, так как прямого соединения с интернет нет; - Если пропал интернет. То есть, в буфере картинки есть, но CherryTree не умеет доставать из буфера. Поэтому картинки будут потеряны; - Если скопировать текст с картинками не из браузера, а из Libre/Open Office, то картинки тоже не будут вставлены. А все из-за того, что из буфера CherryTree доставать не умеет.
В общем, сделана полумера, от реализации которой я в свое время отказался, так как посчитал костылем. Но если народу нравится, и альтернатив нет, то наверно реализую вот так так же как у Cherry.
Я предпринял последнюю попытку разобраться с буфером обмена. Я думал, что может быть все-таки существует метод вычленения и текста и картинок из одного буфера. Я проштудировал все методы, которые дает Qt для работы с буфером обмена. Но оказалось, что такого функционала просто не предусмотрено. Я проделывал разные манипуляции с буфером обмена между разными программами и понял, что даже Microsoft не умеет работать с комбинированным буфером.
В соответствии с вышесказанным, мне пришлось отказаться от честной работы с буфером обмена, на которую я так расчитывал. И для решения вопроса о копировании текста с картинками из браузера, я сделал такой же механизм, как и в других программах. А именно: вычленение тегов картинок во вставляемом тексте, и подкачка их из сети. Вчера реализация этого механизма была завершена в ветке editorModification в коммите 71e6d9d.
Теперь, если выделить в браузере текст с картинками, то они будут подгружены в текст. Происходит это с помощью встроенного довнлоадера:
Вот, например, как выглядит запись, вставленная с Хабрахабра:
Довнлоадер умеет скачивать по HTTP, HTTPS, понимает редиректы (которые, например, используются на Хабрасторадже для хранения картинок).
Очередной шаг в развитии MyTetra сделан, и теперь я приступаю к исправлению косметических недочетов. Некоторые решаются просто, а некоторые могут потребовать больших усилий. Сейчас мне начал помогать фиксить баги один добрый человек из Питера, и я надеюсь, что работа пойдет быстрее, и релиз выйдет в ближайшее время.
Всем удачи.
|
|
|
|
Подготовка нового релиза программы для накопления информации MyTetra идет полным ходом. И сейчас я завершил очередной крупный этап доработки этого PIM-менеджера.
Исторически так сложилось, что в Qt-виджете QTextEdit, который лежит в основе текстового редактора MyTetra, плохо сделана поддержка работы со ссылками (грубо говоря - с URL-ами). Есть пара неочевидных багов, которые не исправляются годами, есть системные ограничения, которые не дают сделать правильный (с моей точки зрения) интерфейс. К тому же я не мог реализовать несколько важных для меня нюансов, например правильное изменение курсора мышки при наведении на ссылку в разных состояних виджета (активный/неактивный). Поэтому в редакторе MyTetra до недавнего времени небыло средств по работе со ссылками. Ссылку можно было прикрепить к записи, или, если очень хотелось, ссылки можно было редактировать в HTML-коде. Но GUI-средств по работе со ссылками небыло.
Наконец-то я нашел в себе силы а так же собрал все свои знания в кучу, чтобы сделать удобные для работы инструменты. Сегодня в ветке editorModification появился GUI-инструментарий для создания, просмотра, редактирования, удаления URL и перехода по URL. Теперь навигация по URL в режиме редактирования возможна почти как в обычном браузере. Появилась кнопка редактирования ссылки, в строке статуса отображается URL ссылки, на которую наведен курсор, а для перехода по ссылке используется Ctrl+клик мышкой (иначе в режиме редактирования никак нельзя) или контекстное меню. Для маководов и любителей OsX, у которых Ctrl+ЛКМ забинден, будут отдельные настройки.
В общем, я завершил очередною доработку интерфейса и скоро перейду к допиливанию оставшихся запланированных изменений.
|
|
|
|
Дорогие друзья!
Сегодня первое января нового, 2016 года! Поздравляю всех с наступившим праздником, желаю чтобы вы хорошо отдохнули и накопили сил для новых дел! Пусть удача и радость способствуют всем вашим начинаниям. Не отчаивайтесь, если у вас что-то не получается. Будьте настойчивы, и доводите свои дела до конца. Тогда у вас все получится, и новый год будет плодотворным. С новым годом!
По традиции, я подвожу итоги уходящего года и строю планы на новый год. Что произошло в 2015 году? Учитывая, что в планах у меня небыло никаких айтишных дел, эти дела все равно находились и делались. Вот чем пришлось позаниматься в 2015 году:
- Я очистил и подготовил к печати документацию на Toyota Corolla 2006 HB. В этом мне помогли традиционные консольные утилиты Linux и прекрасная программа ScanTailor, написанная нашим соотечественником.
- Я завел аккаунт на файлообменнике MEGA, и узнал, что не все так радужно в шифровании на лету через JavaScript. Не все браузеры способны работать с объемными файлами на несколько сот мегабайт. Браузеры зависают, крешатся, молча сохраняют неполные файлы. В общем, пока технология сырая, а работа с файлами в MEGA больше похожа на игру в рулетку. К тому выяснилось, что провайдер Megafon почему-то блокирует данный файлообменник.
- Я покрутил в руках китайский тестер сетей NF8208. С его помощью я нашел два разрыва компьютерного кабеля, любовно замазанных строителями в толщине стен.
- По долгу службы мне пришлось поковыряться с Windows Power Shell. Должен сказать, что концепция объектов, передаваемых через потоки разным обрабатывающим программам - это более продвинутая и удобная технология, чем традиционная работа с текстовым выводом команд, используемая в Unix и Linux. Надеюсь, нечто подобно рано или поздно появится в открытых операционных системах.
- Я заколхозил систему мониторинга серверного оборудования на Python, и приделал оповещение по SMS через старый мобильный телефон Siemens M50. Телефон подключен к мониторящему серверу по COM-порту.
- Весной 2015 года сдал на права. Дело не айтишное, но я готовился к экзамену с помощью симулятора движения автомобиля в городских условиях, запущенный через WINE. У меня была проблема, что я забывал включать поворотники. И тренировался на симуляторе включать заранее поворотники с помощью клавиш Shift и Ctrl.
- Я настроил на работе систему видеомониторинга с пятью разнородными видеокамерами на основе свободного ПО ZoneMinder.
- Осенью мой сайт webhamster.ru попал в бан Яндекса именуемый АГС, но через три месяца вышел из АГС, почему-то с увеличенным ТИЦ.
- Разрабатваемая мною программа для накопления информацией MyTetra обзавелась функцией прикрепления файлов к записям. Она еще много чем обзавелась, но релиза пока нет. Я еще правлю мелкие баги и добавляю обещанный функционал в редакторе.
- Соответственно, сервис MyTetra Share теперь может отображать записи с прикрепленными файлами.
- Моя личная база знаний в MyTetra разраслась до ~4500 записей.
- Я наконец-то разобрался с криптовалютами Bitcoin и Litecoin. Я попробовал пройти все этапы работы с криптовалютой - установка клиента, создание локального кошелька, майнинг, покупка/продажа криптовалюты. По результатам изысканий сделал небольшие подборки статай по Bitcoin, Litecoin, и состоянию законодательства на конец 2015 года.
- Я опубликовал небольшую инфографику по поводу того, какими должны быть отступы в программном коде.
Как видно, в ИТ-сфере мною сделано немногое. Никакого хардкора нет, просто потребительское использование современных технологий. Это удручает.
На 2016 год я намечаю всего две вещи:
- Выпустить очередной десктоп-релиз программы накопления информации MyTetra.
- Выпустить Android версию MyTetra.
На этом все. Успехов в новом году!
PS: И на последок: новогодняя открытка к этой новости в большом разрешении.
|
|
|
|
Немало копий сломано в спорах о том, какими должны быть отступы в коде. Адепты разных религий в священных войнах супротив инакомыслия изничтожали в атомный пепел аудиторию не одного сайта. И конца и края этому не не видно. Найдется ли герой, который положит конец бесчинству человеческих заблуждений? Таки да!
Получите и распишитесь: инфографика о том, каким должен быть отступ в коде, и почему он должен быть таким.
Хотите похоливарить на эту тему? А не получится. У меня отсутствуют комментарии на сайте.
|
|
|
|
Вчера я первый раз сыграл в игру "Что? Где? Когда?" в составе команды своего трудового коллектива. Да и команда наша тоже играла в первый раз. Игра проходила в рамках городских соревнований г. Волгодонска. Мы уделали всех, включая несколько команд завода "Атоммаш" и Ростовской атомной станции. Первое место и кубок у нас, и мы сразу попали в городскую высшую лигу!
В игре принимали участие 14 команд. Игра проходила по системе одновременной игры: ведущим задается вопрос одновременно всем командам, далее минута на обсуждение, и 10 секунд на то, чтобы добежать до секретаря с бумажечкой, на которой написан ответ. Игра состояла из 3-х туров по 12 вопросов каждый. По правилам, в высшую лигу попадают только две команды, занявшие первые места.
Результаты игры:
1 место: команда "Рататуй" - Ростовский филиал "Атомтехэнерго" (РАТЭ)
2 место: команда "Разные люди" (СЮТ)
Страница городского клуба "Что? Где? Когда?" во Вконтакте:
http://vk.com/topic-58244837_30450088
Фото победителей:
Резюмирую. Играть в "Что? Где? Когда?" конечно, интересно, но лично мне не хватает знаний по истории, изобразительному искуству, философии, эзотерике, литературе и поэзии, спорту. Поэтому мне трудно отвечать на вопросы из этих областей. А чтобы было легко - надо постоянно образовываться в этих направлениях, и помнить все, о чем прочитал, услышал, увидел. Я же обнаружил, что уже много чего позабывал из того что знал, и вталкивать в себя новую информацию по вышеприведенным дисциплинам уже не могу. Мне бы с лямда-исчислением разобраться, да декларативное программирование поковырять на досуге.
Поэтому, пока есть возможность, я поиграю. А дальше - посмотрим.
|
|
|
|
Помнится мне, что году в 2010 я попытался было разобраться с биткоином. Русскоязычной информации на тот момент было очень мало, ПО было весьма странным и лишено всякой докуметации даже на английком языке. Я попытался скомпилировать и установить программы для работы с битком, и даже смог создать кошелек. Но дальше дело не пошло - времени разбираться не было, надо было работать, и я эту тему забросил.
Периодически я следил за криптовалютами, и вот недавно решил для себя: надо, надо таки разобраться, чем это люди занимаются таким, чего мне в силу скудости моего ума заниматься не дано. Как финансовый инструмент, криптовалюты - очень интересная вещь. И я рискую оказаться на обочине прогресса, в то время как народ свободно разбирается с хешами, блокчейнами, майнерами, фермами, пулами, асиками и бог знает чем еще.
Поэтому я заставил себя пройти основной путь криптоанархиста, и хотя бы в символичном виде попытался выполнить основные действия с криптовалютой. Мне нужно было прочувствовать работу с ней на личном опыте. И после этого уже сложить более полное мнение об этой технологии.
Но мы не ищем легких путей. Зачем нам криптовалюта на забагованной Windows, на покупку которой мне всегда было жалко денег? Мы будем хардкорить на Linux, причем в голой консоли. GUI? Это не про нас. Только консоль, только tmux! Да и видеокарточки на тестовом сервере просто нетути. Поэтому займемся самым бесперспективным в 2015 году делом: майнингом на CPU.
В качестве критовалюты попробуем работать не с биткоинами (BTC), а с лайткоинами (LTC). Говорят, что на момент создания Litecoin авторы расчитывали, что их алгоритм scrypt невозможно будет пускать на видяшках и ASIC-контроллерах, как это практически мгновенно было сделано с Bitcoin. Но такое положение вещей было недолгим, и в настоящее время уже и лайткоины народ считает на ASIC-фермах.
В общем, поковырявшись с криптовалютой, я решил записать на будущее, как с ней работать. В результате появилось три статьи о том, как настраивать ПО лайткоина, и что оно вообще из себя представляет:
В настоящий момент статус биткоина и прочих криптовалют в России неясен. Сейчас запрещен обмен рублей на биткоины (причем, обмен биткоинов на рубли забыли запретить). Неясно, зачем это сделано, ведь народу приходится обменивать сначала рубли на доллары, а потом уже доллары на крипту. Таким образом, мы в России за каким-то лешим поддерживаем доллар в его традиционном качестве свободно-конвертируемой валюты, хотя при этом грозимся начать прямые расчеты с другими странами, минуя доллар и евро. Минфин в 2015 году грозится проектами законов, жестоко карающими любые действия с криптовалютами, но на сегодняшный день это только проекты. Так что пока можно, будем разбираться и самостоятельно образовываться. А дальше - посмотрим.
|
|
|
|
На правах жежешечки.
Прибежал сейчас сотрудник с круглыми глазами, и говорит: срочно дайте мне доступ в Fasebook! Мы говорим: извините, у нас доступ в социальные сети на рабочем месте закрыт. А с какой целью вам вдруг понадобился доступ в американскую социальную сеть Фейсбук? А у меня, гворит, жена - финалист конкурса учителей "Школа Росатома". Им сейчас контрольное задание дали - создать группу в Фейсбуке, и подключить туда аккаунты детей, которые у нее в классе учатся. Так она же в этом не разбирается, а методисты Росатома считают, что современный учитель должен знать как работать в Фесбуке. Хочу ей помочь.
Мы, конечно, доступ не открыли. Но очень удивились таким "заданиям" для учителей. Это же какая гнида сидит в конкурсной комиссии, которая вместо улучшения профессиональных навыков педагога навязывает учителям бредятину в виде социальных сетей? А потом эта гнида еще и контролирует, насколько качественно учитель освоился в цифровой клоаке, и сколько детей еще туда притащил. И это все происходит в рамках Госкорпорации, занимающейся атомной энергетикой.
Такое впечатление, что эти люди сами рубят сук, на котором сидят. Ведь если детей будут учить вот такие современные учителя, ориентированные на соцсети, а детей туда еще и будут затаскивать в рамках внеклассных занятий, то достойной смены у атомщиков не будет. Некому будет работать в наукоемкой отрасли.
Я даже не поверил, что такое возможно, может быть, товарищ что-то перепутал? Ковырнул поисковик, и вот вам: творческое задание! Это, мать, творческое задание, оказывается, такое:
Предварительное задание для финалистов конкурсов в рамках проекта «Школа Росатома»
07 Ноября 2015
Конкурсная комиссия проекта «Школа Росатома» предлагает финалистам конкурсов в рамках проекта «Школа Росатома» выполнить небольшое предварительное задание еще до приезда на финальные мероприятия. Предлагается выполнить задание творческого характера. Результаты выполнения этого задания пригодятся финалистам на очном этапе конкурсной программы.
Желаем всем удачи и до встречи в Заречном ЗАТО!
Задание для финалистов конкурса учителей и конкурса школ
Конкурсантам необходимо создать собственную группу ВКонтакте или на Facebook, пригласить в свою группу всех желающих и провести в ней опрос по проблеме школьного образования, которая на ваш взгляд будет актуальной в 2030 году.
Конкурсанту необходимо иметь личный аккаунт в сети ВКонтакте или на Facebook. Во время финальных мероприятий конкурсной программы конкурсант должен иметь возможность самостоятельно зайти в свой аккаунт и работать в нем
http://rosatomschool.ru/ra/promo/3355.html
На этом все.
|
|
|
|
В предыдущей новости я сообщил, что менеджер накопления информации MyTetra обзавелся возможностью прикреплять файлы к записям. Появление такой возможности повлияло и на сервис MyTetra Share (обновленная версия v.0.34). Теперь на страницах базы знаний, транслируемых в Internet, появился раздел "Прикрепленные файлы". Таким образом, теперь есть возможность скачивать приаттаченные к записям файлы прямо через браузер.
Проверить скачивание прикрепляемых файлов можно на следующей записи:
Книга "Введение в язык Си++", третье издание
Всем удачи.
|
|
|