понедельник, 13 июля 2009 г.

Настройка домашнего интернета (2)

Ubuntu установилась и перезагрузилась, видим черный экран с мигающим курсором... это хардкорно :)

Немного ликбеза - не считаю себя великим знатоком линукса, несмотря на то, что уже 3-й год им пользуюсь.. знаю только то, что надо знать для моих задач, не больше (но и не меньше), когда не знаю - спрашиваю или ищу (на forum.ubuntu.ru например)

Так что вот что имхо надо знать для начала: консоль; это черное окно с мигающим курсором - это консоль, сюда крутые хацкеры вводят сложные команды, чтобы удаленно заходить на сервера пентагона в поисках военного порно :) В системе ничего сделать нельзя, пока не войдешь в нее - для этого надо имя и пароль. Ввели, если все нормально - можно что-то делать

Например посмотреть - сеть/инет у нас как, есть? Самый простой способ - "попинговать": пишем в консоль
ping google.com ( понятное дело означает "нажали на большую кнопку Enter"):

Прервать вывод этой (и многих других) команд можно нажав сочетание Ctrl+C

Если непонятно, что это за фигня написана, какой-то ping - можно спросить у системы помощь по команде, например введя
man ping


Чтобы выйти из просмотра мануала, нажимаем "q"

Чтобы посмотреть состояние сети, пишем
ifconfig
(ну вообще я запарился добавлять , и так понятно думаю):

Видим странное (если не сказать большего) буквосочетание eth0; не знаю, как это расшифровывается, но обозначает сетевую карту (ethernet наверное, а цифра - номер по порядку, нумерация с нуля)
Хорошо, eth0 есть, а где вторая карта? Видимо отключена (есть еще варианты "не работает", "сгорела от удара молнии" и т.д., но будем надеятся на лучшее); пора "править конфиги" :)

Для правок конфигов я использую текстовый редактор pico; он не самый лучший, я его просто использую и другие не пробовал. Для того, чтобы отредактировать файл, достаточно ввести

pico имя_файла

Это в теории; на практике надо еще знать 2 вещи: про файловую систему и про суперпользователя.

Про файловую систему надо читать отдельно, я только скажу, что она отличается от принятой в виндовс системы именования дисков буквами - тут есть корень файловой системы "/", к которому подключается.. чего только не подключается: жесткие диски, компакт-диски, флешки, образы дисков, удаленные файловые системы.. "Выше" корня (т.е. выше "/") ничего нет - точно так же, как нет ничего выше My Computer в виндовс (хотя сравнение не совсем и правильное)

При загрузке к корню примонтируется раздел /home, где лежат файлы пользователей; для практики можно посмотреть, чего там творится:

cd ~ - cd (от Change Directory) - команда изменения каталога, ~ - ссылка на домашний каталог текущего пользователя
cd .. - перейти на один уровень вверх по дереву каталогов
ls - показать (list) список файлов в каталоге; пока файлов немного

pico new_file - создали новый файл, попишем чего-нибудь в него, чтобы закончить - Ctrl-X, соглашаемся, что хотим сохранить изменения - Yes - не сохраняет? Permission denied?


Это вторая вещь - права; сейчас мы находимся в папке /home и писать просто так сюда текущему пользователю нельзя - не его это папка :)

В свою - пожалуйста, а сюда - нельзя; а как быть, если надо (ну ладно, в /home вряд ли надо кому-то что-то писать, но в папку с системными настройками например)? Для случаев, когда пользователю нужны права "выше среднего", в линухе есть команда sudo - выполнить команду от имени администратора (в виндовс UAC - это что-то типа этого); так что если написать
sudo pico new_file,
в поредактировать что-то и попытаться сохранить - система послушно согласится, что да, имеешь право. Только перед выполнением она спросит пароль текущего пользователя, и если ввести его правильно - все, следующая команда выполнится от имени администратора

Зная это можно покопаться в конфигах наконец.. много конфигов хранится в каталоге /etc:
cd /etc
ls

Что, вылетело много букв и не успели прочитать? Нажимаем одновременно Shift+PgUp/PgDown и просматриваем длинный листинг; можно по другому, с использованием команд less/more:
ls | less - значек "|" перенаправляет вывод одной команды на вход другой; less показывает вывод постранично, по пробелу перелистывает страницу, по q прекращает работу
Вот среди этого разнотравья в папке network лежат настройки сети, посмотрим, чего там написано:
sudo (потому что папка системная, кому попало в нее писать нельзя) /etc/network/interfaces

Чтобы не надрываться вводом длинных имен файлов/папок в командной строке есть фишка для ускоренного ввода - набираем неск. начальных букв, потом нажимаем - система сама попробует подставить нужное имя; если есть конфликты (например в папке лежат file1 и file2), то система подставит только общую часть и покажет варианты, а пользователь решит, что ему надо; так что предыдущую команду можно вводить так:
sudo pico /etc/network/interfaces
Видим, что система настроила только одну сетевую карту.. настроила - громко сказано, все настройки получать от dhcp-сервера; но если сетевая карта подключена к adsl модему, у которого включен dhcp - то зачем все усложнять?..
Настройки второй сетевой карты надо ввести руками; допустим, что внутренняя сеть имеет адреса 192.168.5.*, а именно наш конкретный компьютер как самый главный традиционно получит первый адрес; дописываем (для того и sudo нужно было) в /etc/network/interfaces след. строки:

auto eth1
iface eth1 inet static
address 192.168.5.1
netmask 255.255.255.0

и сохраняем файл; чтобы изменения вступили в силу, надо перезагрузить сетевую подсистему; программы и скрипты часто (может и всегда, не знаю) лежат в /etc/init.d, надо запустить службу networking, для запуска надо иметь права администратора, так что пишем
sudo /etc/init.d networking restart

Проверим (ifconfig) - в выводе должны присутствовать оба сетевых адаптера, второй (eth1) - c заданным нами статическим ip-адресом

Самое время отвернуться от убунту и настроить остальные компьютеры локальной сети; собственно настройка сводится к тому, что в свойствах сетевых карт надо указать:

IP адрес - любой из диапазона 192.168.5.2 - 192.168.5.254
маска подсети - 255.255.255.0
шлюз по умолчанию - 192.168.5.1
адрес dns сервера - 192.168.5.1

Если компьютеров 1-2, то проще один раз дать им статические адреса; а если их больше и не хочется помнить - тогда можно и свой dhcp-сервер поднимать - но не все же сразу
Итак, настроили сетевую карту windows-компьютера, нажали Старт-Выполнить-cmd, ввели

ping 192.168.5.1

и если все нормально - наш интернет-шлюз должен пинговаться! пол-дела уже практически сделано :)

Настройка домашнего интернета (1)

Как только я начинаю гуглить что-то про настройку убунты, я тут же вижу, что это очень модно, писать рецепты для нее; я тоже хочу быть модным, поэтому тоже буду писать рецепты для убунту :)
На самом деле я просто собираюсь как-нибудь проапгрейдить свое домашнее хозяйство, а тут оказия потренироваться - так я и модно продвинусь, и руку набью
В общем - как установить Ubuntu и научить ее раздавать интернет в локальную сеть

Я уже хвалился, что у меня для интернета выделен и исправно трудится старенький компьютер, детали на который в свое время мне (или добрым людям, отдавших их мне) просто жалко было выкинуть: сначала это был Celeron-700, с 384 мб памяти и 80 Гб винтом, потом процессор немного улучшился с оказией на Athlon 2000.

Для слабого компьютера и выбиралась в свое время операционка, не помню уже по какой причине, но ею стала Ubuntu.. наверное потому, что когда-то в офисе болтались бесплатные диски с десктопной версией, 7.04 кажется, и один из этих дисков у меня нашелся в нужный момент, так что изначально у меня была десктопная версия 7.04, у которой позже я отключил gui - он мне был не нужен, и тормозной сильно уж был (видео в материнке было встроенное - читай "фуфловое") - и которая как-то со временем (я даже не помню как) проапгрейдилась до 8.04

Когда недавно в одном "дружественном" мне офисе (который платит деньги за то, что у них все работает) обострились проблемы с интернетом, я решил, что им тоже надо поставить убунту - заодно и потренировался в установке серверного варианта последней на сегодня версии - 9.04

Итак, Т.З.: есть компьютер не особой свежести, звезд с неба не хватает, но работает; есть "хороший" интернет ("хороший" = не диалап), т.е. есть смысл его раздавать в сеть из нескольких компьютеров); надо, чтобы
  • пользователи сети (секретарша в офисе или жена дома) не задумывались о том, откуда берется интернет, а просто им пользовались
  • злые хацкеры не знали, что у нас есть интернет и не делали нам разные гадости
  • если у компьютера большой жесткий диск, то пусть на этом компьютере хранятся файлы - видео, семейные фото - да мало ли
  • видео в наше время может качатся из инета из пиринговых сетей - пусть этот компьютер и качает его, раз он все время (теоретически) включен - для рейтинга на торрент-трекерах хорошо
  • ну додумается по ходу дела..
(!) При раздаче интернета в локальную сеть мы имеем фактически огромную сеть ТАМ, где-то во внешнем мире, и небольшую (возможно всего 2 компьютера) сеть ЗДЕСЬ, у нас в офисе или квартире; поэтому в компьютере, который будет рулить обменом между этими сетями, должно быть 2 (две) сетевые карты - одна будет подключена во внешний мир, другая - в нашу домашнюю/офисную сеть.. Учитывая, что сейчас практич. любая материнская плата имеет встроенную сетевую карту, докупить еще одну, самую простую - не очень разорительно.. А лучше всего - купить две одинаковые сетевые карты на проверенном чипе (Realtek 8139 кажется работает везде и всюду.. я ее специально покупал в свое время, чтобы заработала сеть в Хакинтоше)

Начинается все с загрузки с сайта ubuntu.com образа подходящего дистрибутива, для моих целей нужен сервер; качаем, прожигаем на болванку и в зависимости от типа материнской платы как-то загружаемся с этой болванки; если образ не битый и записан без проблем, то начнется установка

Начнется она с выбора языка; при всей любви к великому и могучему я обычно стараюсь обходится английским, исключается ряд проблем, связанных с локализацией и недопониманием в связи с этим:

После выбора языка видим стартовое меню, интересует самый первый пункт - Install Ubuntu Server

Выбрали, начинается установка с вопросов про язык установки, страну пребывания, раскладку клавиатуры - все это я обычно оставляю по умолчанию.
Дальше начинается автоматическое определение сетевых карт; хорошо бы, чтобы при этом сетевая, которая смотрит в интернет, могла его увидеть - т.е. adsl-модем был включен или шнурок от провайдера был воткнут.. хотя все можно настроить и вручную позже:

Скриншот сделан в виртуалке, поэтому и такие названия сетевых карт..
После того, как сетевые карты настроены, надо сказать - как будет называться наша машина и указать временную зону (не знаю, правильно ли - я просто выбираю Central)


Дальше надо разбить жесткий диск; систему можно поставить на пустой жесткий диск, а можно поставить и параллельно существующей операционке (хотя смысл не вижу); в любом случае на жестком диске должно быть немного свободного места: немного - ну например у меня для системы отведено 5 гигабайт и его хватает:

Здесь опять же виден диск, созданный виртуальной машиной; в "реальной жизни" его тип и буквы будут другими

Если диск пустой - выбираем его "целиком" и создаем новые разделы, иначе выбираем свободное место и начинаем его делить: сам не придумал, а прочитал где-то, что есть смысл в 3-х разделах: в "/" живет собственно система, мне хватает для него 5 гигабайт; еще один раздел, размером от 1 до 2 размеров оперативной памяти, нужен для "файла подкачки" наверное?.. для /swap в общем.
Ну и данные пользователей хорошо бы хранить на отдельном разделе (размер которого конечно ограничивает только запросы этих самых пользователей и размер дисков) - тогда систему можно переустановить, не потеряв эти самые данные пользователей..
В любом случае - выбираем нераспределенное место, указываем размер, выбираем тип:







Точно так же добавить swap и /home  разделы, только тип раздела стоит указывать не primary, а logical (иначе у кого-то там могут возникнуть проблемы с загрузкой - сам не придумал, где-то прочитал):

Для создания swap в Use as: выбрать "swap area"


Остаток места выделить под /user (инсталлятор уже все предугадал и настроил, надо только с ним согласится):

Когда все место "поделено" - применяем изменения

Идет инсталляция, даже на виртуальной машине это занимает совсем немного времени...


Затем создается новый пользователь, надо ввести полное имя пользователя, логин, 2 раза пароль (установка предупредит, если пароль "слабый"), дальше можно включить шифрование каталога с пользовательскими данными.

Перед подключением к инету инсталлятор запрашивает адрес прокси-сервера, после чего настраивает apt-get, затем предлагает настроить автоматическое обновление системы

Дальше можно сразу установить разные сервисы, хотя я ничего пока не устанавливал (потому что тогда - может быть - будут не очень понятны различные рецепты из интернета по установке/настройке различных служб)

В самом конце устанавливается и настраивается grub, если есть другие операционки, то они будут доступны в меню загрузки.

Все, инсталлятор предлагает вынуть диск из лотка и первый раз перезагрузится

Очередной ремонт закончен..

Закончил ремонт в спальне. Особо хвалится нечем, так что даже ничего не фотографировал в процессе.. прошлогодний ремонт был круче.. Наконец в освещении - только экономичные лампы, теперь наша спальня - новое самое яркое место в квартире.. ну а что - экономия должна быть

Наконец спал по людски - не на полу :)

Хотя на полу спать оказалось очень неплохо, да и для спины говорят полезно

Долго возился - раскладывал по плинтусу кабели (2 для сети, 2 для звука тыльного, сетевой, антенный.. еле запихал), зато перенес наконец компьютер "служебный" в кладовку, из остатков крепежа для гипсокартона сделал "корзину", в которой подвесил внутри корпуса в широкой его части 2 ж/диска, напротив поставил 12 см вентилятор для обдува - все таки жара, а работают 24/7 - жалко их..

В кладовке сразу стало намного теплее :( вентиляции там никакой в принципе.. оставляю приоткрытой дверь; зато в комнате (где этот компьютер жил уже года 3 под столом) стало намного тише


четверг, 25 июня 2009 г.

Обновил ffmpeg...

Ну не ffmpeg, а хедеры паскалевские для него, ну и пересобрал dll-ки есессно

Основательно не тестил, но пока тьфу-тьфу-тьфу старые проекты вроде работают.. "Портировалось" практически безболезнено, в основном менял в uses avutil на pixfmt

Брать тут (тут и хедеры, и dll готовые.. все из svn ~ 18-19 июня), если чего не работает - пробуйте жаловаться..

А я между прочим был на море...

И там между прочим просто отлично... Несмотря на июнь, казалось бы еще ж не жара - но вода теплая, зато ничего в ней не развелось еще, не плавает зелень разная да жуки всяческие морские Может оно где-то всегда так, но в Кириловке (это Азовское море) вот повезло.. Зато с чего кириловчане взяли, что их село - пуп земли, непонятно; но цены на все такие, как будто-бы как минимум все там на золотых блюдцах подается :) Но зато если все нужное привезти с собой ;)

вторник, 16 июня 2009 г.

Это анекдот..

Между прочим разжигающий межрассовую ненависть, но пофиг, ибо прикольный:

Дзвінок. Путін знімає слухавку.
- Гальо, пане президенте, ту Місько зі Станіслава! Телефоную, жеби вам вповісти, же ми ту вам офіційно війну декляруємо.
- Харашо Міша, ето действительно важная новость. А большая у вас армия?
- Ну, зара... (щитає)... Я, Влодко, сусід Стефко і всі, шо ту в преферанс грали. То нас разом вісім.
- Должен сказать тебе, Міша, что у меня в армії 100 тисяч людей, каториє только ждут маєво пріказа.
- Холєра, я зара вам віддзвоню. ..
(за якийсь час)... - Гальо, прошу пана президента, стан війни не скасовано! До нас приєдналося ше штири хлопаки з сусідньої кнайпи.
- Должен сказать тебе, Міша, что со времені нашева последнєва разгавора я увеличил армию до 200 тисяч человек!
- Най го холєра вхопе! Я ще зателефоную.
(за якийсь час)...
- Слава Йсу, пане Путін! Я сі тєжко вибачєю, але мусимо ся вицофати з тої войни.
- Неужели? Очень жаль. А почему ето ви вдруг передумалі?
- Ну, ми ту посиділи за пару гальбами пива, так си між собов порадили, і вздріли, же аж ніяк не зможемо нагодувати 200 тисяч плєнних москалів.

Было испытание №3..

Я сегодня спал на нижнем месте.. ну оно уже может испытанием и не считаться, дети два дня успели уже переночевать перед поездкой на море.. А я "на хозяйстве" остался, ремонт развернул в другой комнате, так что бардак, кругом завалы вещей - фоток финальных пока нету

Но очевидцы говорят, что получилось неплохо :)

пятница, 12 июня 2009 г.

Испытание №2..

Матрацы все еще не привезли, но кровать испытана по настоящему - на сложенном вдвое зимнем одеяле старший спал на 2-м этаже.. Ничего, без происшествий :)

Вообще это уже смахивает на "что вижу то пишу" :) но зато можно будет "хронологию" если что вспомнить (я в прошл. году когда ремонт делал - кажется что все лето на него потратил):

- 18 мая мы сделали первый набросок, который собственно не очень и поменялся по ходу дела;
- 25 мая был готов чертеж и список для распила
- 26 мая отнесли чертежи
- 1 июня привезли доски
- 3 июня начал сборку
- 9 июня уже сам испытал 2-й этаж
- 11 июня заказчик обжил новое спальное место

И времени кажется много потрачено.. с другой стороны не замечал, чтобы я с утра до вечера над сборкой корпел.. так, работал в свое удовольствие :)



Наконец (хоть и всего на пару дней) спала жара, +35 - это жесть просто..


четверг, 11 июня 2009 г.

Про школу..

Само приплыло - Отмечая день учителя

Особенно в тему, потому что сегодня жену классная попросила в школу прити и директору дифирамб на каком-то собрании попеть..

среда, 10 июня 2009 г.

Про ремонт..

У меня в доме снова как после стихийного бедствия.. готовимся к ремонту

Надо что-то сделать с комнатой 3*3.5 м, в которой живем с женой; собственно размахиваться особо не на что - у нового окна (с установки которого начался бардак, который дал старт ремонту) стоят мои башни-близнецы,  они там "навечно" на ближайшее время (сейчас вижу, можно было бы делать не такими глубокими - до сих пор полупустые.. правда размер столешницы между ними определяется как раз глубиной шкафа). Напротив окна - двери в комнату (которые сняли, потому что открываясь в комнату занимают много места, открываясь в коридор - то же самое.. хотели дверь-гармошку, но чтото они сейчас такие убогие), слева в углу стоит огромезный диван, на котором очень удобно спать или валяться перед телевизором - который на тумбочке у стены справа (а в плане перевесится чуть выше на стену)

Так что из того, что можно сделать:
- потолок; в этой (как и в остальных) комнате между потолком и стеной какие-то несуразные выступы, которые в прошлом году в большой комнате я закрыл коробом, что-то похожее сделаю и тут, только без подсветок: короб спрячет выступы, а в коробе точечные светильники вниз для фонового освещения, когда телевизор смотрим
- стены; просто подготовить и оклеить, стены будут однотонно-зелеными (с вертикальной текстурой), только по стене за телеящиком будет полоса вертикальная с зелеными цветами
- компьютер для интернета переносится в кладовку, но коммуникации будут проходить через нашу комнату, надо все попрятать в плинтус

Так что когда нормальные люди едут на море, я еду за шпаклевкой и прочим :)

вторник, 9 июня 2009 г.

Про "Терминатора-4"..

На что потратились 3 выходные - в т.ч. на поход в кино на последнего Терминатора; в кино сто лет не ходил уже.. и ходить наверное не буду - смотришь кино в большом зале, на большом экране, а видишь тусклую экранку, которую можно было посмотреть за бесплатно еще позавчера.. я понимаю, что $$ вырос последние годы и лампочки для проекторов дОроги - но давайте не экономить на заварке!?

Как выйдет на dvd или в hdtv - пересмотрю с удовольствием дома; задумался, идти ли на Трансформеров-2..

Чего я зацепился.. а вот с этого: упрощенный сценарий Терминатора-4 :)

Кровать ну уже совсем почти..

С 3-я выходными время как вода в песок куда-то ушло :( так что кровать моя все еще не сделана полностью.. но прогресс налице: поставили ее на ее место, сделал верхнее "корыто", собрал несколько ящиков, собрал частично ступеньки, испытал :) :



Теперь точно не страшно никого туда запустить, раз тест с двойной нагрузкой прошел ;)

После установки и соединения с "ступенечным" ящиком устойчивость конструкции в направлении "влево-вправо" значительно усилилась - я даже думаю, что сверху в стену ее крепить не надо.. по крайней мере пока я на нее залезал и "умащивался" ничего не шаталось (а я все таки туша 100+ кг)

Как всегда накосячили немного и я, и программа (из-за меня скорее всего конечно), так что надо подрезать 3 детальки, чтобы было совсем все красиво - чем и попросил заняться жену сегодня, вечером буду заканчивать ступеньки..

Нет направляющих длинных :( , макс. 500 (а надо 600.. когда-то для шкафов каких-то я тоже 450 искал очень-очень долго.. бред какой-то, тоже мне дефицит) мм.. думаю - может и фиг с ним, ну будет ящик выезжать меньше, зато будет выезжать уже завтра, а не через сколько-там-дней-я-потрачу-пока-буду-искать-эти-направляющие..


пятница, 5 июня 2009 г.

Про drag-n-drop

"А я все чаще замечаю, что..." в тестовых проектиках для выбора файла нажимать на какую-нибудь кнопку "Browse" и выбирать файл - слишком долго.. Намного быстрее получается перетащить нужный файл (особенно когда надо перепробовать десятки файлов) из окна проводника в свой тестовый проект

Вдруг кому-то пригодится - модуль, облегчающий это действие -несколько шагов, чтобы все заработало:

  • добавить .pas файл в проект или путь к файлу в настройки окружения - кому как нравится
  • добавить в uses формы, которая будет принимать дропы, ссылку на модуль
  • создать 2 обработчика, для реакции на "мышка с обьектом над нами" и "юзер бросил нам обьект"
  • ну и создать собственно экземпляр класса в подходящем месте

Где-то вот так:

...
type
  TfrmMain = class(TForm)
  ...
  private
  ...
    procedure FileDropEvent (Sender: TObject; const Filenames: TWideStrings);
    procedure FileEnterEvent (Sender: TObject; const Filenames: TWideStrings; var Accept: boolean);
  public
    { Public declarations }
  end;
var
  frmMain: TfrmMain;

implementation

uses
  DragDropSupportUnit, ActiveX;

var
  FileDrop: TFileDrop;

{$R *.dfm}

...

procedure TfrmMain.FileEnterEvent(Sender: TObject; const Filenames: TWideStrings; var Accept: boolean);
begin
   // разрешим дропать только файлы по какому-то правилу - скажем только файлы .mp3
  Accept := AnsiLowerCase ( ExtractFileExt ( Filenames [0] ) ) = '.flv';
end;

procedure TfrmMain.FileDropEvent(Sender: TObject; const Filenames: TWideStrings);
begin
  // прореагируем на бросание файлов на контрол (файлов может быть и несколько)
  if Filenames.Count > 1 then
  begin
    MessageBox(Handle, 'Many files - will be used only first', 'Warning', MB_OK + MB_ICONINFORMATION);
  end;
  edSource.Text := Filenames [0];
end;

...

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  ...
  FileDrop := TFileDrop.Create ( FileDropEvent, FileEnterEvent );
  RegisterDragDrop (Handle, FileDrop as IDropTarget);
  ...
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  ...
  RevokeDragDrop(handle);
  ...
end;

Это все: вызов RegisterDragDrop назначает контрол, handle которого передали параметром, приемником драг-дропа (так что это может быть как вся форма, так и к примеру только поле ввода.. дропаем файл на поле ввода и там тут же появляется имя файла), закрывая программу вертаем все взад.

Код собственно полезного модуля (мне лениво в пятницу вечером делать архив, ложить куда-то на рапиду.. скопипастить в ide да сохранить):

// использование: создать обьект, передав ему указатели на обработчики
// OnEnter и OnDrop и зарегистрировать приемник drag-drop-а:
//     RegisterDragDrop (Handle, FFileDrop as IDropTarget);
unit DragDropSupportUnit;

interface

uses
  windows, sysutils, widestrings, ActiveX, shellAPI;

type
  TFileDropEvent = procedure (Sender: TObject; const Filenames: TWideStrings) of object;
  TFileEnterEvent = procedure (Sender: TObject; const Filenames: TWideStrings; var Accept: boolean) of object;

  TFileDrop = class (TInterfacedObject, IDropTarget)
  private
    FDropEvent: TFileDropEvent;
    FEnterEvent: TFileEnterEvent;
    FFilenames: TWideStrings;
    FCanDrop: boolean;
  public
    constructor Create (AOnDrop: TFileDropEvent; AOnEnter: TFileEnterEvent);
    destructor Destroy; override;

    function DragEnter(const dataObj: IDataObject; grfKeyState: Longint;
      pt: TPoint; var dwEffect: Longint): HResult; stdcall;
    function DragOver(grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;
    function DragLeave: HResult; stdcall;
    function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult; stdcall;
  end;


implementation

{ TFileDrop }

constructor TFileDrop.Create(AOnDrop: TFileDropEvent;
  AOnEnter: TFileEnterEvent);
begin
  inherited Create;
  FDropEvent := AOnDrop;
  FEnterEvent := AOnEnter;
  FCanDrop := false;

  FFilenames := TWideStringList.Create;
end;

destructor TFileDrop.Destroy;
begin
  FFilenames.Free;
  inherited;
end;

function TFileDrop.DragEnter(const dataObj: IDataObject;
  grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult;
var
  medium: TStgMedium;
  format: TFormatEtc;
  fn: array [0..MAX_PATH] of char;
  fcount, i: integer;
begin
  dataObj._AddRef;

  format.cfFormat := CF_HDROP;
  format.ptd := nil;
  format.dwAspect := DVASPECT_CONTENT;
  format.lindex := -1;
  format.tymed := TYMED_HGLOBAL;

  if dataObj.GetData (format, medium) = S_OK then
  begin
    fcount := DragQueryFile (medium.hGlobal, $FFFFFFFF, nil, 0);
    if fcount > 0 then
    begin
      for i := 0 to fcount - 1 do
      begin
        DragQueryFile (medium.hGlobal, i, fn, sizeof (fn));
        FFilenames.Add ( string ( fn ) );
      end;
      FCanDrop := true;
    end else
      FFilenames.Clear;
  end;

  if medium.unkForRelease = nil then
    ReleaseStgMedium (medium);
  dataObj._Release;

  if Assigned (FEnterEvent) then
    FEnterEvent (self, FFilenames, FCanDrop);

  if FCanDrop then
    dwEffect := DROPEFFECT_COPY
  else
    dwEffect := DROPEFFECT_NONE;
  Result := S_OK;
end;

function TFileDrop.DragLeave: HResult;
begin
  FFilenames.Clear;
  Result := S_OK;
end;

function TFileDrop.DragOver(grfKeyState: Integer; pt: TPoint;
  var dwEffect: Integer): HResult;
begin
  if FCanDrop then
    dwEffect := DROPEFFECT_COPY
  else
    dwEffect := DROPEFFECT_NONE;
  Result := S_OK;
end;

function TFileDrop.Drop(const dataObj: IDataObject; grfKeyState: Integer;
  pt: TPoint; var dwEffect: Integer): HResult;
begin
  if Assigned (FDropEvent) and FCanDrop then
  begin
    FDropEvent (self, FFilenames);
    dwEffect := DROPEFFECT_COPY;
  end else
    dwEffect := DROPEFFECT_NONE;

  FFilenames.Clear;
  Result := S_OK;
end;

initialization
  OleInitialize(nil);

finalization
  OleUninitialize;

end.

Про халяву и свистелки..

Я жутко падок до свистелок и перделок, поделать с чем ничего не могу :) поэтому в этом супер-блоге есть свои свистелки и остальное - в "бесполезностях".. ну а как, пользы нет особой - зато прикольненько :)

Хотя про пользу - ваучер на 30 минут прислали.. скайп я как-то использую редко и только между компами, а так поиграюсь, раз "холява"..


Вчера вечер прошел в праздном безделье ("Как я встретил вашу маму", 3/8, "Менталист" 1/22 и "Звездный путь") - жена забыла зарядить аккумуляторы днем, вот и бездельничал..

четверг, 4 июня 2009 г.

Про видео-декодирование..

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

А всего-то оказалось, что этот (...) декодер не желает декодировать промежуточные кадры просто так, без "предистории" (т.е. без декодирования ключевого кадра).. из "обычного" flv декодируется любой кадр (при этом для не-ключевого кадра картинка будет серая, а кусочки, которые поменялись с предыдущего кадра, собственно будут содержать это изменение), а этот не желает..

Но я его не виню ;) - он же не с AV падал, а честно говорил на своем непонятном языке машинном - "не получилось декодировать"..

Т.е. решение для декодирования произвольного кадра: катится назад, пока не найдется ключевой кадр, и декодировать с него до нужного..

з.ы. западло кажется в том, что я когда-то на это уже наступал и должен был бы сообразить быстрее, в чем дело..

Кровать в процессе..

Вчера шуруповертил до 11 ночи, пока аккумулятор не сел.. Нашуруповертил:



Заказали 2 матраса (16 см толщиной), обещают привезти на след. неделе.. Я не думал, что даже матрацы у нас и то редкость - дня за 2 думаю я все доделаю уже. Проблема - диван, его заберут, только когда - неясно

среда, 3 июня 2009 г.

Все про кровать и про кровать..

Вчера НАЧАЛОСЬ! :)

Сделал правда совсем мало (6 дырок если быть совсем точным), сидел долго прикидывал - что за чем делать (схему сборки короче); детали большие, места мало, рук всего 2

А, еще - бОльшую часть времени потратил на выпилы небольшие.. в мастерской сказали, что не делают (или делают, но очень уж задорого, не знаю деталей - я заказывать жену посылаю O:-) - я то на работе), так что делал 4 прямоугольных выреза 16х130 мм.. чепуха, а попотел (решил, что 4 выреза пока что не причина покупать электролобзик)

Потом собрал боковины и нижние "направляющие", по месту дотюнил размеры этих вырезов - теперь надо угадать точно с разметкой, поставить стенки ящика под нижним матрацом, сверху можно корыто нижнее строить.. стремно - неправильно размечу или просверлю неровно - ящики будут заедать..

Хотя с другой стороны, мой прошлогоднеремонтный девиз остается в силе - "пугаться проблем по мере их появления".. вот перекосятся ящики - тогда и буду переживать

Как положено вроде и на чертеж смотрел по разному, а косяки и тут есть - в одной детали зачем-то программа (ну я конечно, но не нарошно) поставила толстую кромку с 3-х сторон (там где надо с 2-х), заказывали поклейку конечно с 2-х сторон (в мастерскую чертежи не берут, у них своя система, так что жена со мной сидит и список составляет, с пильными размерами и схемой поклейки) - так что эта деталь на 2 мм короче чем надо.. Конструктивно не страшно, функции там другие, больше декоративные, у этой детали - но именно поэтому и неприятно :(

Капля нытья - уснул в пол-третьего ночи :'-(

Борюсь со своим новым интернетом; интернет сам по себе неплохой, со скоростями более-менее вроде все хорошо - не могу настроить все, чтобы локальная сеть видела интернет (пока видит только компьютер, собственно к шнурку подключенный)

Но я его победю, тут без вариантов.. спать только очень уж по утрам хочется :)

вторник, 2 июня 2009 г.

Квас, кровать..

Прислали ссылку, теперь хожу облизываюсь - Mangiare e Bere - Окрошка в ледяной вазе.

Собственно не на окрошку (не понимаю я пока, огурцы в воде плавающие есть :) ), а на квас.. обязательно с-агитирую жену попробовать квас сделать!
 
Может даже сегодня - начну кровать собирать, а она пусть мне за это квас готовит. Забрали вчера из распила дрова - а 2 детали (1902*802 между прочим) как-то не заметили и оставили - причем я не участвовал в процессе забирания, так что не виноват ни в чем ;)

Но бешеной собаке ж 3 километра - не круг, так что я "сбегал принес" (мастерская совсем недалеко).. думал помру чесговоря, когда вторую нес, еще и ветер сильный поднялся - норовил перевернуть меня с этим парусом :))

И финал дня - на улице +30С, а я чихаю и сопли ручьем.. это какой-то вселенский заговор, из-за которого я заболел летом :(

понедельник, 1 июня 2009 г.

Новый месяц; новая кровать; новый интернет...

Прям все-все новое навалилось :) :

- лето началось - это раз; причем по температуре - еще позавчера-вчера.. можно "официально" ходить на работу в обрезанных штанах :-]

- мне провели новый интернет домой: Beeline Home Internet, 5 неограниченных трафиком мегобит.. использовать его впрочем как настоящий интернет посмотрю как получится - сайты грузятся так себе (потестил только тытюбик, простые сайты понятно что грузятся хорошо), но фишка интернета дома ж не в этом ;) - а торренты качаются/раздаются на 620/670 кбайт/сек, что есть намнОГО быстрее, чем мой нынешний интернет (ОГО-1, которым я впрочем тоже очень доволен все 3 года пользования)

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

пятница, 29 мая 2009 г.

Thumbnails для флеш-файлов..

До этой темы у меня руки не дойдут все никак уже с год точно :(

Как вот люди есть, которые все успевают и еще время свободное остается?..

По отдельности я все могу - сделать эскиз для swf или flv файла, сделать провайдер эскизов для типа файлов; а слепить все в кучу - как подумаю, что надо что-то сочинять несколькоступенчатое: эскизы мгновенно не делаются, значит надо обрабатывать запрос на эскиз, создавать этот эскиз и хранить в какой-нибудь БД локальной, чтоб к следующему разу оттуда его достать.. а запросы могут из разных потоков приходить, так что прямо читать базу наверное не выход, надо какая-то очередь

Как начнешь все это придумывать - так сразу и накатывает сонливость и апатия и все откладывается "до лучших времен" :) ..

Или просто надоело программировать?.. когда-то "для души" программки по ночам писал, тестил, сапортил.. а теперь - "да нафига оно мне надо?.."

Это видимо старость :)

з.ы. а еще в зачаточном состоянии лежит проект для индексирования fb2-файлов (книжки в электронном виде); учитывая, что у меня их 70000+ штук - вроде и очень нужная вещь.. а лень..

з.з.ы. последнее недорожденное - это тулза для получения инфы для видеофайлов: привык уже к хорошему, когда использую XBMC для просмотра видео (и в основном сериалов) и для каждого сериала/сезона свой фанарт, описания серий, скриншоты и прочие свистелки.. А почему-то что сам xbmc, что программы-помощники так тупят, когда обновляют данные, сил нет - так что начал своего "помощника" писать.. ну что, инфу с tvdb научился брать - дальше сразу резко неинтересно стало..

Кровать..

.. обещают допилить в понедельник (синие дрова им только сегодня подвезли, радиусы долго клеили - в общем, не успевают..)

А раз нет воды горячей в доме (профилактика), то и с ремонтом решили не заводится (стены обдирать от обоев и т.д. - мыться то надо, а моржи мы плохие)

Так что делать на выходные нечего, прогуляемся в строймагазин, поглазеем на лампы/светильники/обои, составим список покупок..

Последний звонок..

Сабж сегодня у нас на Украине; будут ходить деффки в школьных формах, пить пиво и водку..

С утра просто офонаренная погода: гремит гром, светит солнце и сыпется мелкий, но очень частый дождик.. феерично :)

четверг, 28 мая 2009 г.

среда, 27 мая 2009 г.

Русский языковой пакет для Win7

Вышел сегодня, Windows Update сообщила.. хоть меня абсолютно не парит кнопка "Start", поставил для интереса, пусть называется "Старт" (хотя какие start/старт, на кнопке ничего ж не написано)

вторник, 26 мая 2009 г.

Кровать - пути назад нет..

Заказали распил для кровати - обошлось в 2 тысячи с небольшой копеечкой гривен (скажем $260), добавим сюда 2 матраца по ~ 900 грн (2 * $120) и денег на шурупы/направляющие/стяжки и прочее - уложимся где-то в $500+ денег

Единственный готовый вариант, который мы видели и который нам понравился, стоил что-то под 6000 грн - причем там спальное место только вверху (т.е. отдельно кровать вниз надо было бы покупать), и без матрацев конечно..

Так что будем считать, что кровать нам обойдется незадорого.. :)

"Ольховые" детали обещали попилить на неделе, синие - как повезет

Хочу стать пишущей обезьянкой :)

Что там сто тыщ обезьян напишут за сто тыщ лет непрерывно нажимая на клавиши печатной машинки? "Войну и мир"?

Регулярные записи в блогах про то, как писать в тех же блогах побольше, как из пальца высосать тему для заметки и т.д. мне так же регулярно напоминают призыв "стань обезьянкой" :)

От моего блога (да, я не такой, как _читай выше_ :P ) есть даже практическая польза: 1) я иногда сам пользуюсь своими советами (инструкция по сборке ffmpeg-а - кстати подозреваю, что она снова может оказаться не очень актуальной, ffmpeg уже обновился до 0.5 кажется), 2) из "Бесполезности" внизу узнал для себя полезную ссылку на форум, на котором уже зарегистрировался (форум про мебель и мебельные программы, и все что про мебель в общем), 3) есть люди, которые узнали что-то полезное для себя (в основном конечно про тот же ffmpeg)

А писать надо когда хочется и когда есть о чем.. а не для выполнения плана.. имхо (это которое "хрен оспоришь")

з.ы. Навеяло ссылкой, которую прочитал из твиттера.. Не очень полезная штука, этот твиттер, точнее совсем бесполезная, но в виде гаджета на рабочем столе не напрягает, зато прикольно щебечет, когда новая запись..

понедельник, 25 мая 2009 г.

И откосы..

Да, я таки их сделал :)

Ничего особо сложного в этом деле не оказалось совсем - сделал лучше, чем мне (за деньги) сделали в свое время на кухне.. аккуратнее снаружи..

Начал процесс даже фотографировать телефоном, да с грязными руками забил..

Окно ~ 1,5 * 1,5 размером обошлось в 190 грн ($25) - пластиковая доска (разводиться с гипсокартонным не хотелось совсем, это по времени намного дольше ведь), стартовый и F-профили, 3 рейки и шпаклевка для внешних работ..

Кровать..

Да, так про Woody: дорисовал кровать, сегодня (если принтер запечатает) распечатаю список для распила и заказывать.. если ничего не замечу, что переделать придется

Вот что получилось:


Если все нормально - выложу чертеж, вдруг кому-то пригодится

воскресенье, 24 мая 2009 г.

Woody & Vista - оказывается они могут жить вместе..

С WinXP я распрощался давным-давно (дома по крайней мере), но приходилось ее держать в виде виртуальной машины - под вистой Woody работал глюкаво, а шкафов я себе нарисовал в нем уже ого-го скоко..

А оказалось, что всего-то надо было в свойствах ярлыка поставить галочку на закладке Compability - Disable Desktop Composition: теперь при запуске виста переключается из аеро в простой режим и Woody нормально работает.

Но ХР в виртуалке все равно придется оставить - есть супер-пупер древняя программа, написанная на FoxPro 2.6 для Dos-а, которую я периодически сапортю.. жду - не дождусь, когда ее (программу) решат похоронить с почестями (на которые она не заслуживает впрочем.. наверное потому что не я ее писал ;) )

пятница, 22 мая 2009 г.

Ремонт: окно..

Вчера установили в спальню окно - как и в случае в кухней в свое время это дало старт ремонту в комнате :)

Начну завтра с откосов (как настоящий джедай я откосы не заказывал, а решил делать сам - сэкономленные деньги потрачу на 5 бутылок портвейна к примеру ;) или на очередную "очень нужную" приблуду для компа)

Не хочется разводить пылищу/грязищу с гипсокартоном, поэтому буду делать пластиковые.. Надеюсь скоро похвалится красивым окошком, пока же оно выглядит задрыпаненько:


четверг, 21 мая 2009 г.

WinXP vs Win7

Не претендуя на абсолют мои наблюдения - WinXP против Win7 - на примере моего последнего компьютера в дом на роль htpc:

  • Свежесть операционки определяет количество поддерживаемого оборудования: если я поставил ХР, у меня в "неопознаных" висело 5 устройств, для которых пришлось искать/качать драйверы (иногда очень и очень немаленькие размером, что меня просто убивает.. чего там в звуковой карте такого военного, что драйвер для нее весит метров 30?)

    После установки Win7 я ничего не делал - все определилось само
  • Из-за чего я перепробовал на этом компьютере все варианты windows - скорость загрузки; что бы там не говорили о тормознутости, но Win7 грузится быстрее всех (пусть какие-то службы запускаются уже после появления рабочего стола - мне как пользователю глубоко фиолетово, главное что появление рабочего стола и возможность запустить программу быстрее, чем в XP
  • Поскольку купить откровенно отстойный компьютер сейчас сложно (из новых я имею в виду), то все финтифлюшки типа аеро автоматически будут на нем работать; не жизненно-необходимо, но глаз радует
  • 2 гига памяти сейчас в общем-то не роскошь, а стандарт (имхо); после 7 часов работы с десятком программ у меня сейчас (если верить таскменеджеру) свободно 46% памяти; не знаю сколько там %%, но затыков со сбросом в свап я пока не замечал (abhtajrc потратил на себя 165 метров, фотошоп 120, делфи 60 - но я ее недавно перезагружал.. coolpro 30, сайдбар 10, мелочь разная по 10)
  • Виртуальная XP для программ прошлого века :) - правда пока не убедился, что она удобнее чем VMWare, плюс требует аппаратной поддержки от процессора (дома заработала, на работе отказалась)
Много очень удобных фишек именно в Win7:
  • обновленный проводник, строка адреса мне всегда нравилась, иногда только случалось, что в строке кроме текущей папки не помещалось больше ничего - но в 7-ке пофиксили;
  • панель с быстрым доступом слева к дереву с папками компьютера и ссылками на полезные папки;
  • идея "библиотек", когда я добавляю в библиотеку папки с видео, которые разбросаны по всему компьютеру, а открывая библиотеку вижу их все в одном месте;
  • стартовое меню, когда для запуска программы я просто набираю несколько букв имени и через мгновение система мне предложит имя для запуска;
  • строка поиска практ. везде в окне проводника - когда я хочу удалить программу, я открываю панель управления и начинаю набирать "Uni.." - через мгновение остаются только ссылки, связанные с удалением программ, гаджетов, шрифтов и прочего
  • механизм переключения между задачами (по Win-Tab у меня как-то так и не прижился) - если перебирать запущенные программы по Alt-Tab и задержаться на какой-то программе, все окна, кроме окна этой программы, прячуться за прозрачными рамками - на 2-х мониторах с запущенной кучей задач очень помогает
  • как и фишка группировки в таск-баре - если запущено несколько проводников скажем, то просто наведя мышку на иконку появятся окошки-эскизы, наведя мышку на такое окошко ошо найдется и покажется, остальные окна в это время временно попрячутся
  • да, встроенная лупа - если нажать Win-Num+, то запустится "магнифиер" - которым я раньше никогда не пользовался, а теперь он стал полезной утилиткой (при программировании интерфейсов помогает попиксельно посмотреть, как там все отрисовалось).. по Win-Num- все уменьшается
  • прикольная и полезная иногда фича - если ухватить окно за заголовок и "потрясти", то все окна свернуться :)
Есть и глюки, надеюсь глюки RC:
  • после слипа как-то все глючило (но комп на работе проклинаю с момента покупки, что слип что гибернейт у него всегда глючили)..
  • с сетью (с расшариванием ресурсов) разобрался не до конца пока (однажды по какой-то причине расшарилась вся папка Users - с документами всех пользователей в компе.. ничего там военного не было, но сам факт..
  • на htpc глюки с телевизором.. поставил драйвер от висты от ноября 2008, все отлично было, но Windows Update предложила обновление, а я не сообразив согласился - с новым драйвером стало хуже..
Плюсов и минусов еще тыщи, только я их специально не запоминаю.. что вспомнил вот с ходу, то и перечислил...

Кровать..

Потихоньку рисуем кровать, дорисовались до такой пока картинки:




Элементы украшательства придумываются, вот например вариант верха:

вторник, 19 мая 2009 г.

Про ролики..

У старшего дитя есть заначка - картонная коробка с надписью "На телефон" (его телефон 2 раза сдавался на гарантийный ремонт, в длинные недели ожидания видимо захотел новый, чтоб ява-игры шпилил, с блютузом был и все такое)

Назначение содержимого коробки впрочем меняется примерно как погода у нас сейчас; в субботу пришел он с твердым намерением выгрести все деньги и купить роликовые коньки. Денег наскребалось гривен 150 с копейками ($20 где-то другими словами), но на рынке его уже ждала "до пол-четвертого" тетка-продавец, которая уже подобрала отличные ролики.. (удавил бы)

Начал гуглить/выяснять для него (еле уговорив не нести 150 гривен тут же) про ролики - что/какие/почем, узнал много нового; понятно, что за $20 ролики - хлам, который надо выбросить не распаковывая; выяснил, что у нас в городе всего один магазин есть, "узкоспециализирующийся" на подобных вещах; порядок цен на самые простые модели от $120 (а скорее всего дальше, самые простые наверное на самых маленьких любителей спорта)

И в раздумиях: дитю ролики хочется, купить хлам не хочется - так что вроде есть смысл купить нормальне, пусть и дорогие; но увлечение роликами может (с вероятностью процентов 80-85) и пройти за 2 дня - кататься все равно негде, синяков да шишек набьет да и забросит их в кладовку.. Да и за лето нога вырастет и осенью в любом случае их в кладовку..

И что делать с его роликами..

Про удаленный доступ и ssh..

Удаленный не в смысле "его стерли", а в смысле "он далеко" :)

Дома стоит компьютер, специально обученный всего нескольким вещам: 1) быть подключенным к интернету по адсл, 2) разбираться со всех сторон - кому можно чего, а кому нельзя делать с интернетом, 3) качать/раздавать файлы.. Стоит он под столом, без монитора, без клавиатуры, голый и босый практически

На нем установлена Ubuntu, в которую я хожу удаленно для управления всем этим хозяйством; хожу по ssh, пользовался для этого putty и все меня устраивало, пока в поисках этой самой putty зашел на сайт и скачал Tunnelier (сайт тут, выдается гуглом первой строчкой, но почему-то раньше не видел)

С тех пор использую именно его; при подключении в одном окне обычный терминал, где можно также как и в putty поуправлять чем-нибудь, а супер-фича (ну для меня по крайней мере) еще в одном окне, которое реализует гуй для "ftp over ssh" (раньше я пользовалься консольной программкой для передачи файлов в свой удаленный компьютер)

Обычный сценарий таков: читая rss (в google reader-е конечно, конечно в firefox-е) вижу запись, что появилась скажем свежая серия House MD; иду на torrents.ru, скачиваю торрент-файл, соединяюсь с домом, смотрю, что там и как, переписываю торрент-файл в специально обученную папочку, торрент-клиент видит новый торрент-файл в специальной папочку и начинает качать файлы.. по приходу домой садимся с женой и смотрим свежую серию..

Да, подумал вот - до осени можно комп выключать получается - сезон то закончился ;) качать/смотреть нечего..

Затевашки с новой мебелью..

Вчера натырив картинок из интернета вооружились карандашом и набросали эскизик будущей кровати для детей.. 2 этажа, место надо экономить, комната не резиновая

Вот што-то типа такого:


Матрацы до этого уже сходили перещупали, практически выбрали 200*90 ("ну чтоб до армии ж на них спали, а если в папу пойдут ростом - то надо двухметровые"), но с рулеткой походили по комнате, померяли, решили попустится, матрацы будут 190 см * 80 см - на ближайшие годы хватить должно, а там может кровать раньше развалится :) чем они до 2-х метров дорастут.. зато сьэкономили по 10 см, вроде мелочь, а место выиграли

Жене всегда хотелось лесенку совместить с ящиками, так что вовремя попалась на глаза картинка из инета и вспомнили.. внутри каждой ступеньки будет выдвижной ящик для игрушек и/или прочего хлама; снизу тоже будут большие ящики выдвижные для постельного и прочего. Сзади будет "спинка", по которой будет идти труба, на которой будут висеть подушки

Может быть (а может и нет) внутри сделаем угловых полочек, подсветку - если будет место и целесообразность.. на картинках вроде красиво все, но с рулеткой все опускается на землю с небес - или снизу комфортно и просторно, зато сверху в потолок головой стучаться будут, либо наоборот.. ну или "ни вашим, ни нашим", что правильнее

Осталось теперь все перенести в чертежи.. вчера из-за финалов сезонов "Хауса" и "Теории большого взрыва" глазели телевизор допоздна, сил хватило только вот на такое карандашное рукотворство.. главное не откладывать его в длинный ящик теперь..

понедельник, 18 мая 2009 г.

Про фондю..

А мы замечательно провели выходные - решили не травмировать мою психику покупкой сыра, попыткой сделать фондю и отвратительным результатом, поэтому делали мясное фондю..

Для этого купили грудку, пива и соусов, душевно посидели на кухне, проводя испытания в субботу, позвали на воскресенье друзей, с которыми с тем же удовольствием повторили результат

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

На очереди экспериментирование с инградиентами для "мясного" фондю (жена уже предложила рыбу) и все таки поиск правильного сыра :)

пятница, 15 мая 2009 г.

Хочу фондю (опять)..

На фоне уныния и затыков с работой организм требует отвлечь его (организм) чем-то приятным.. например пожрать :)

Хочется попробовать сделать фондю, снова.. чугунок я жене на НГ еще подарил, а с тех пор всего 2 раза сподобились попрактиковаться, и оба раза что-то не получилось.. видимо в сыр наш уже ничего кроме резины не кладут при "изготовлении", иначе не обьяснишь, почему получается резиноподобная масса, которая никак не желает себя вести так, как должна согласно рецепту

И не думаю, что дело в каком-то очень специальном сыре - учитывая, что фондю было придумано пастухами, которые сидя в своих альпийских горах черти по скоку таким образом доедали высохший хлеб и сыр семьсот лет назад - скорее дело в составе современного сыра (как в общем и бОльшей части продуктов в наших маркетах), который уже доудешевляли непонятно чем дальше некуда

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


четверг, 14 мая 2009 г.

Про альфа-контролы, игры и вообще нытье..

Никак не добью проект текущий, красивость интерфейса достигается с помощью альфа-контролов (это реклама: сайт тут; очень неплохая подборка компонентов для создания нестандартного интерфейса приложения, для exUSSR бесплатная)

Все замечательно, только на който хрен мне надо менять размер формы ("окно фьють - и плавненько увеличилось, потом назад фьють - и уменьшилось"); никак у меня "фьють" не получается :'-(

Чтобы еще больше почувствовать себя дураком хожу смотрю, как делается игра для айфона; никакой многопоточности - и при этом все мигает, сверкает, музыка пиликает..

Ненавижу все..

вторник, 12 мая 2009 г.

Пример реализации расширения для показа эскиза файла

В ответ на этот коммент сделал пример - работающий

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

Но совсем немного.. Вот работающий пример - скачать пример

пятница, 8 мая 2009 г.

Win7 - красивости

Благополучно переехал на Win7 RC - мне нравится еще больше

Одна из фишек, которую захотелось сразу сделать - показ прогресса чего-нибудь прямо на кнопке в таскбаре; вроде получилось, ничего военного в общем нету; код:

uses
  windows;

type
  TBPF = (TBPF_NOPROGRESS = 0,
          TBPF_INDETERMINATE = 1,
          TBPF_NORMAL = 2,
          TBPF_ERROR = 4,
          TBPF_PAUSED = 8);
  TBATF = (TBATF_USEMDITHUMBNAIL = 1,
           TBATF_USEMDILIVEPREVIEW = 2);

function InitTaskBar: HResult;
function SetTaskBarState ( hWnd: HWND; State: TBPF ): HResult;
function SetTaskBarValue ( hWnd: HWND; Value: integer ): HResult;

implementation

uses
  ActiveX;

const
  CLSID_TaskbarList: TGUID = '{56fdf344-fd6d-11d0-958a-006097c9a090}';
  IID_ITaskbarList:  TGUID = '{56FDF342-FD6D-11d0-958A-006097C9A090}';
  IID_ITaskbarList2: TGUID = '{602D4995-B13A-429b-A66E-1935E44F4317}';
  IID_ITaskbarList3: TGUID = '{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}';

type
   ITaskbarList = interface(IUnknown)
      ['{56FDF342-FD6D-11d0-958A-006097C9A090}']
      function HrInit : HResult; stdcall;
      function AddTab(hWndOwner : HWND) : HResult; stdcall;
      function DeleteTab(hWndOwner : HWND) : HResult; stdcall;
      function ActivateTab(hWndOwner : HWND) : HResult; stdcall;
      function SetActiveAlt(hWndOwner : HWND) : HResult; stdcall;
   end; { ITaskbarList }

  ITaskbarList2 = interface(ITaskbarList)
    ['{602D4995-B13A-429b-A66E-1935E44F4317}']
    function MarkFullscreenWindow(wnd : HWND; fFullscreen : bool) : HResult; stdcall;
  end;

  ITaskbarList3 = interface (ITaskbarList2)
  ['{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}']
    function SetProgressValue (hWnd: HWND; ullCompleted: int64; ullTotal: int64): HResult; stdcall;
    function SetProgressState (hWnd: HWND; tbpFlags: TBPF): HResult; stdcall;
    function RegisterTab (hwndTab: HWND; hwndMDI: HWND): HResult; stdcall;
    function UnregisterTab (hwndTab: HWND): HResult; stdcall;
    function SetTabOrder (hwndTab: HWND; hwndInsertBefore: HWND): HResult; stdcall;
    function SetTabActive (hwndTab: HWND; hwndMDI: HWND; tbatFlags: TBATF): HResult; stdcall;
    function ThumbBarAddButtons (hWnd: HWND; cButtons: integer; pButtons: pointer): HResult; stdcall;
    function ThumbBarUpdateButtons (hWnd: HWND; cButtons: cardinal; pButtons: pointer): HResult; stdcall;
    function ThumbBarSetImageList (hWnd: HWND; himl: pointer): HResult; stdcall;
    function SetOverlayIcon (hWnd: HWND; hIcon: HICON; pszDescription: PWideChar): HResult; stdcall;
    function SetThumbnailTooltip (hWnd: HWND; pszTip: PWideChar): HResult; stdcall;
    function SetThumbnailClip (hWnd: HWND; prcClip: PRect): HResult; stdcall;
  end;

var
  pTaskBarList: ITaskbarList3;

function InitTaskBar: HResult;
begin
  Result := CoCreateInstance (CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, pTaskbarList);
  if Failed ( Result ) then
    pTaskBarList := nil;
end;

function SetTaskBarState ( hWnd: HWND; State: TBPF ): HResult;
begin
  if pTaskBarList = nil then
    Result := S_FALSE else
    Result := pTaskBarList.SetProgressState ( hWnd, State );
end;

function SetTaskBarValue ( hWnd: HWND; Value: integer ): HResult;
begin
  // assume Value = 0-100
  if pTaskBarList = nil then
    Result := S_FALSE else
    Result := pTaskBarList.SetProgressValue ( hWnd, Value, 100 );
end;

Использование - проще некуда: код можно выделить в отдельный юнит и подключать его при необходимости; перед использованием надо вызвать InitTaskBar - если получится создать нужный интерфейс (читай - если он есть, т.е. если мы в Win7), то вернется S_OK и значит можно вызывать функции прогресса.. хотя их можно вызывать и так, ничего не случится, но для красоты..

Ну и дальше - вызываем SetTaskBarState c:
  • TBPF_NORMAL, если будет показываться "обычный" прогресс
  • TBPF_INDETERMINATE, если надо отобразить процесс неопределенной длительности
  • TBPF_ERROR, если надо показать, что в процессе произошла ошибка (прогресс-бар окрасится в красный цвет)
  • TBPF_PAUSED, если процесс запаузили (прогресс-бар окрасится в желтый)
А для обновления прогресс-бара вызываем SetTaskBarValue, передавая значение в %% для отображения

Вот пример, как все должно работать: http://rapidshare.com/files/230523628/TaskBarDemo.zip.html

Вот как все работает (сначала надо нажать btn1 - это собственно инициализация, потом пощелкать по радиокнопкам и подвигать ползунок):
-> ->



Май в этом году мокрый-мокрющий получается.. снова дождь, снова грозу обещают, снова все выходные поливать будет..

Погоду смотрю в гаджете виндовом - он в RC "из коробки" наконец заработал..