?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Entries by category: компьютеры

perspective correction UX: GIMP vs Photoshop.
nyaload
_winnie
GIMP (самый последний): (perspective tool) надо медитативно таскать четыре точки несколько минут, которые неочевидным образом влияют на стороны прямоугольника, который надо выпрямить. И дико тормозит при этом. Перед этим надо добавить хелперы над рисунком, которые помогают понять, где вертикаль, а где горизонталь (drag-n-drop с линеек над/сбоку). Выправив одну сторону - мы портим другую. При этом точки часто надо вытащить за пределы экрана, поэтому по ходу дела надо делать zoom out. Натурально, правда, я в текстовом и видео-туториале видел, что люди реально так делают. Сильно удивился, что разработчики не видят, как люди зря тратят своё время.

Photoshop (4-летней давности, CS6) : (perspective crop tool, там же где и обычный crop) указываем четыре точки исходного прямоугольника на фото, нажимаем "применить".

Такого в GIMP я не вижу, хотя именно это нужно для выправления фото документов или зданий. Даже если такая функциональность есть, то увы она недоступна для простых людей. Итого, на фотошоп я потратил 5 минут на просмотр видео-туториала (из которого мне нужно было 5 секунд, "где кнопка", а остальная часть видео - еще два способа коррекции 1, 2), на ГИМП - потратил полчаса, и не нашёл того что надо. Снова закрываю GIMP с планом "посмотреть через два года".

update: max630 нашёл нужную кнопку "corrective (backward)" для GIMP, но почему-то она у меня работает только на маленьких рисунках, а на больших - через минуту работы стирает слой, делая его прозрачным. update2: помог такой трюк, чтобы избежать стирания слоя - сначала выделить трансформируемую область прямоугольным выделением. Оно тогда и времени тратит меньше, не минуту, а полминуты.

binary search
nyaload
_winnie
В книге "жемчужины программирования" сообщается, что невозможно написать binary search с первого раза.

На самом деле его невозможно написать с первого раза, если не осознаешь что такое инвариант цикла. Если осознаёшь - то скорее всего запросто напишешь (я вот уже в третий раз за год написал).

Если не осознаёшь инвариант цикла, то с большой вероятностью будет одна из ошибок:

* mid = (lo+hi)/2 или hi/2+lo/2 ? (и нет, дело не в overflow, эти формулы просто разные (1+3)/2 != 1/2 + 3/2 ).Read more...Collapse )

Как писать двоичный поиск чтобы он не бажил:
* Выбрать инвариант "если искомый элемент существует, то он в [lo, hi)", изначально выбрать lo,hi = 0, N.
* mid = lo+(hi-lo)/2 (при этом для кода верно утверждение "промежуток длиннее 1 всегда укоротится").
* Если ищем первый среди равных - то сравнение выглядит как key<=array[mid-1], если последний - key<array[mid]
* в зависимости от сравнения присваиваем mid в lo или hi (в любом случае, не mid-1).



Двоичный поиск для равномерно распределённых ключей (хешей) ускоряется простым хаком "для каждого из 65536 двубайтовых префиксов запомнить, где он начинается", это убирает 16 начальных итераций.Read more...Collapse )
Tags:

смотреть в hd 4k 60hz в хорошем качестве
nyaload
_winnie
Можно ли подключить монитор с большим разрешением к видеокарте у которой один HDMI порт и один display port? Конкретно, ASUS PB287Q (возможно возьму этот монитор) к Radeon HD7750 PowerColor Green (моя видеокарта)?

Если нет, то какие есть middle end (в игры не играю) видеокарты с пассивным охлаждением (или эквивалентно тихие), которые потянут монитор с большим разрешением? Или наоборот, какой монитор с большим разрешением можно воткнуть в мою видеокарту с одним dvi/hdmi/DP портом?

update, 30 Dec 2014, 16h: монитор приехал. Подключил через Display Port (не знаю, 1.2 или нет), 30hz. Поскроллил, помышкал, вроде 30hz для меня хоть и недостаток, но небольшой. Возможно 30hz это софтварная проблема, а не железная, буду ещё разбираться. Буквы в программах очень мелкие (у меня Win7).
update, 1 Jan 2015 2h: спасибо realsupport, оказалось для включения 60hz режима на максимальном разрешении достаточно в меню монитора переключить версию Display Port с 1.1 на 1.2.

Туториал по консольному svn на русском
nyaload
_winnie
Если вам вдруг понадобится работать с клиентом svn, причем с консольным, то вот краткий туториал:

Read more...Collapse )
Tags:

Трояны в мышках
nyaload
_winnie
Купил только что беспроводную клавиатуру a4tech. К ней еще прилагалась мышка. У мышки рядом с колесиком - кнопка "активировать трояна", которая нажимает Win+R, печатает ссылку на сайт ( www.win2.cn/g9/ ), и нажимает Enter. С сайта предлагается скачать какой-то софт весом 30 мегабайт со скростью 20кб/сек, который позволит выключить эту чудо-кнопку или настроить.

Пока что настроил кнопку на print screen, вроде вменяемо сделано, можно сразу стрелку нарисовать и обвести.

vim: подсветка при поиске (hlsearch), убрать подсветку по esc
nyaload
_winnie
Удивляют меня вим и bash, что у них есть миллион дурацких флажков "не теряй данные", "не забывай команды при нажатии на крестик закрытия терминала", "раскрашивай вывод" ( 95% представителей homo sapiens умеет различать цвета ), "используй адекватную лаконичную информацию в доступных статус-барах", "следи сам за размером окошка терминала", "запоминай историю", "расставляй скобки самостоятельно", "подсвечивай не-вырви-глазно найденное", "не используй дефолтный динамик компьютера", "конкретно для make-файлов используй табы", "включи анду", "сделай так что бы русские буквы работали", ..., ...

И про эти флажки узнаёшь случайно. От товарищей, из блогов, из сборников "1001 совет для vim"

В vim можно сделать подсветку для поиска ( set hlsearch ), и инкрементальный поиск ( set incsearch ).

После включения подсветки поиска начинает дико раздражать то, что её невозможно убрать. Нужно или набрать команду :nohlsearch, или поискать несуществующую ерунду ( /asdfasdf ). После многих лет исследований люди придумали, как при помощи конфига убрать эту разражающую особеность:

:nnoremap <esc> :noh<return><esc>

Оригинальный пост который про это рассказывает: http://www.viemu.com/blog/2009/06/16/a-vim-and-viemu-mapping-you-really-cant-miss-never-type-noh-again/
Tags:

Точка против запятой
nyaload
_winnie
Вечная проблема с запятыми и точками как разделитель десятичной дроби.

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

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

В результате европейские программисты, когда хотят сделать дружелюбный интефрейс, им приходится делать что-то вроде ParseFloat(string.Replace(",", "."), СтандартнаяPOSIXЛокаль). Американские программисты, даже добросовестные - делают неработающий софт, до первого баг-репорта из Европы.

В C# это делается
if (!Double.TryParse(
   text.Trim().Replace(",", "."), 
   Globalization.NumberStyles.Any,   
   Globalization.CultureInfo.InvariantCulture, result))


Как делается в C - не знаю, слава богу редко кому приходит в голову использовать местную локаль для чисел вместо стандартной. Те кто про локали не знают, оставляют её сишной. Те кто знаю хорошо - не лезут на грабли, или лезут обмотавшись подушками. Тщательно выбирая из LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME только то, что действительно актуально для пользователя. Зная, что от замены LC_CTYPE начинает тормозить невинный isspace в парсинге гигабайтов стат-данных, что от LC_NUMERIC начинается пипец описанный выше, что от LC_TIME могут испортиться регекспы для парсинга timespamp логов (нарываясь на logs/2010_Декабрь_12.log или logs/2010_Äåêàáðü_12.log ), или опять таки программа не сможет прочитать свой кофиг с датами.
Есть правда еще узкая прослойка умных студентов которые делают setlocale(LC_ALL, "") не думая о последствиях, "потому что это правильно".

А в C# местную локаль включили по умолчанию. В результате программы американских программистов нихрена не работают в европе при переносе файлов данных между компьютерами. Интересно, какие могут сюрпризы от Replace(",", ".") при работе вне Европы и Америки.

В одной фирме где я раньше работал использовалась какая-то third-party тулза, для того что бы она работала - надо было в системных настройках указать "использовать точку для дробной части числа". К черту такую навязанную медвежью заботу о пользователях от проектировщиков фреймворка. Ошибка особенно опасна тем, что при разработке всё работает, даже у тестеров.

Перевод по горячей клавише в windows.
nyaload
_winnie
У Яндекса есть онлайновый словарь http://slovari.yandex.ru/, но перейти туда и вставить слово - не так удобно как хочется.

Захотелось написать мини-скрипт, который это дело автоматизирует.

Можно на горячую клавишу назначить запуск выполняемого файла.
Этот файл может взять скопированный текст из буфера обмена, и открыть браузер.

Приступаем:

1)
Сначала создаем файл translate_word.js, в него копируем следующий код:
Read more...Collapse )


2)
Создаём ярлык на рабочем столе, который ведёт на созданный translate_word.js

3) Назначим горячую клавишу. Правой кнопкой мыши кликаем на ярлык, на вкладке "Ярлык" в поле "Быстрый вызов" вводим горячие клавиши. Напр. Ctrl+Alt+C.

Теперь если надо перевести слово - можно его выделить (даблкликом), нажать Ctrl+C и Ctrl+Alt+C.

Та-да ! Будущее за онлайновым софтом!

(no subject)
nyaload
_winnie
А никто не знает, почему под WinXP svn update или svn stat на больших проектах (когда работает десятки секунд, несколько гб под svn) - блокирует работу в остальных программах? Тормозит даже cmd.exe, не даёт буквы вводить. Есть какой-нибудь способ вылечить?

PS. TSVNCache у меня отключен, у коллег включен. Отключение антивируса (с последующей перезагрузкой) не влияет. Галочка "индексировать диск" снята, "служба индексации"/"теневое копирование тома" отключены.

C++, zero initialization
nyaload
_winnie
С++: Безопасный для поддержки и дальнейшей жизни проекта способ инициализации структуры из ста полей нулями.

http://www.everfall.com/paste/id.php?6ug9lmemxk29

T x = {}; //рекомендуется для типов без конструкторов

если конструктора и наследования нет, будет вызов дефолтных конструкторов/обнуление членов ("each member of the aggregate shall be initialized with a value of the form T()").
Если есть, компилятор ругнётся, но покрайней мере не будет никаких сюрпризов, которые могли бы быть если сделать:

T x = T(); //перестанет обнулять int-float члены встроеных типов, если добавить в T non-pod член или конструктор по умолчанию.
или
memset(&x, 0, sizeof(x)); //будет вести себя странно как только в T появятся виртуальные функции или non-pod члены.

Более точная информация - С++ Стандарт, 8.5.1 Aggregates

К сожалению, такой способ инициализации доставляет некоторые неудобства, когда сложно завести временную переменную, и надо инициализировать базовый класс или член или параметр функции (см. пример с http://www.everfall.com/paste/id.php?6ug9lmemxk29).
Можно обойти с помощью template <class T> T InitAggregate() { T x = {}; return x; }

PS. Если внутри T - под-члены с конструктором который оставляет неинициализированый мусор, то добраться до них можно только при помощи memset. Типичный пример:
Read more...Collapse )

PPS. не люблю C++ за то, что вокруг каждой мелочи столько граблей и тайных знаний.

PPPS. В VC2005 появился __is_pod(type), __is_polymorphic(type)
. Можно ещё ставить ассерты перед memset.

PPPPS.
Справедливо напомнили, что если создаём не автоматические объекты на стеке, то можно занулить память перед созданием в ней объекта. Подумалось о ZeroBefore<T>, который обнуляет память _перед_ созданием объекта T в своём чреве. Но "как-то всё это через хитро закрученую жопу".

PPPPPS.
Справедливо напомнили, что в эльфийских рассылках usenet существуют странные компьютеры, где нулевой float и нулевой указатель не обязательно состоят из нулевых байтов, как ещё одна рекомендация не использовать memset.
Tags: