20140803

Как резать круговые и не только отверстия в листовом металле? Ответов несколько - для тонких листов и труб применять прокатку роликом (роликовый труборез), для толстых - плазморез, электролобзик, балеринку, болгарку (всё это на циркуле), альтернатива - по аналогии с router'ом по дереву - на циркуле или обкатывая шаблон на низкооборотистой дрели зажатой фрезой 4..8 по металлу потихоньку выстрагивать... Принципиальная альтернатива - изолировать всю поверхность лаком или краской, продрать нужную линию и подать ток в солёной водичке от сварочного аппарата - можно любую форму сразу же прорезать! варианты вроде лазерной/ГАР резки понятно не рассматриваются всерьёз в данном контексте

20140727

Diving logbook - freeware download PDF here and SVG maket, отдельно инструкция.

20140630

CNC

blender 2.70 model to z-depth map

  1. Delete all from scene: A→A→[del]→[enter]
  2. Add monkey: [spacebar]→type 'mon'→select Add monkey from dropdown list
  3. Click on 'photo camera' image→Resolution X:500, Y:500
  4. Add camera: [spacebar]→type 'cam'→select Add camera from dropdown list and adjust camera position using colored arrows for moving and 'r' for rotation
  5. Switch to camera view: [Numpad 0]. Check if camera is selected, use RMB (right mouse button) to click on camera to select it. Click on 'camera picture'
    Orthographic + adjust Scale.
    select Display→Limits
    adjust Clipping, shift, size
  6. Press second double arrow in left bottom corner of the screen and choose 'Node editor'
    click on middle image (double sheets) than select 'Use Nodes'
    delete all objects in node editor
    click on Add→Input→Render Layers
    click on Add→Vector→Normalize
    click on Add→Vector→Map Value
    click on Add→Output→Composite
    click on Add→Output→File Output
    edit File Output.Base Path (folder picture). Press 'BW' button on extended 'File Output' configuration menu
  7. Connection: Render Layers.Z→Normalize→Map Value→Composite.Image and File output (double link from Map Value.Value)
  8. Press 'photo camera' button than 'Render' button
  9. Everything is done!

20140619

Жаль, но что-то мешает писать в прежнем темпе.

Случилась занятная ситуация - на DVD диске сохранил файл дважды. Через какое-то время обнаружилось, что поверхность диска местами прозрачная(!), т.е. отлетели куски слоя-носителя. Оба экземпляра файла не читались, но один около 150-ого мегабайта, другой около 40-го. Идея очень проста - взять часть файла из одной копии, часть из другой, результат склеить. Реализация:

dd if=/media/Disc/test.wav       of=test-a.wav bs=1M count=148
dd if=/media/Disc/копия/test.wav of=test-b.wav bs=1M  skip=148
cat test-a.wav test-b.wav > test.wav
ls -la /media/Disc/test.wav test.wav

Расшифровка: первый файл test.wav копировать в файл test-a.wav кусками в мегабайт (bs=1M) с начала и взять только первые 148 кусков, второй наоборот - только после 148 куска и до конца. Далее склеить их в нужном порядке, результат записать в файл test.wav, проверить размер - такой же как и у исходных файлов.

20140529

Нужно сделать DIY Rower, т.е. по-нашему самодельный гребной тренажёр. Фото чужих идей - смотрим тут

20140513

Продолжаю изучать ньюансы Python... И чем дальше, тем становится более странным то, что вижу. Вроде поверил, что честных локальных переменных нет. Но НАСТОЛЬКО странное поведение вызывает смешанные чувства.

Каждый может оценить и сделать выводы для себя. Переменная 'b' одновременно существует и не существует.

def testd():
 a = 1
 lo = locals()
 lo['b'] = 2
 print(eval('b')) # prints out 2, so new variable 'b=2' EXISTS
 print(b)         # gives an exception!
if __name__ == '__main__':
 testd()

Ещё занятней - поведение интерпретатора при поиске значения переменной x

def testx():
 x = 1
 def testA():
  x = 2
 def testB():
  y = x + 1
 def testC():
  y = x + 1
  x = 3
 testA()
 testB()
 testC()
if __name__ == '__main__':
 testx()

Указанный выше пример отвалится на вызове testC() с ошибкой UnboundLocalError: local variable 'x' referenced before assignment. Предполагаю, что поведение в случае testC() меняется с "переменная x определена за пределами функции" на "о! в следующей строчке это будет новая переменная x, а мы её уже используем! караул!". Вообщем неясно, какие средства изменения мировосприятия используются во время разработки языка...

20140508

Сложнопонимаемый (для меня) ньюанс в декораторах

>>> def func():
...  print "inside func"
>>> def f1(arg):
...  print "got %r"%(arg,)
...  def wrapper(f):
...   print "inside wrapper arg=%r"%(arg,)
...   f()
...  return wrapper

Интересная тема - проверка "стиля кода PEP8 для python". Особенно удачные фразы "нет пробела после запятой" и строка имеет 91 символ вместо 90 максимум рекомендованных... Прочее на python-guide.org

sudo apt-get install pip
sudo pip install pep8
pep8 file.py

20140507

Генераторы белого шума под Ubuntu: jnoise и sox (=hw:1,0 - выбрать другую аудиокарту)

sudo apt-get install sox
export AUDIODEV=hw:1,0  
play -V -b 16 -v 80 -n synth 160:00 whitenoise

Уточнение про пространства имён Python:
без слова global внутри функции переменные из вызывающего контекста доступны в режиме read-only

a=5
def foo():
 print a
 a = 6 # Exception, read-only!
def bar():
 global a
 print a
 a = 6 # OK

Попытка же квалифицировать переменную именем функции терпит неудачу при присваивании самой функции другого имени:

def foo():
 foo.a=5
bar=foo
del foo
bar() # Exception! foo.a is not defined  

Интересно, есть ли какой-нибудь путь для локальных переменных, кроме экземпляра класса-пустышки?

20140430

Объяснение полной формы try-except-else-finally в Python: else отрабатывает если не было перехвачено прерывание (а если были неперехваченные?), но до finally, которое отработает всегда. Блоков перехвата может быть много. Смысл else - в том, чтобы как можно меньше кода было в секции try.

20140421

Вышла новая версия merger (теперь полноценно поддерживается работа с файлами, настройки -delete, -admin в переменной dir в начале соответствующих файлов. Скачать тут

20140420

Попытка провести гальваническое цинкование. Для этого необходимо вначале очистить (обезжирить и "обезржавить" поверхность), после этого гальванически нанести цинк. Найдены 2 фирмы: Цинкор ZZZ и Цинкор-Авто (350руб + 100руб курьер по Москве).

Так же, возможно, стоит попробовать купить классический грунт Washprimer 1K CF от Sikkens и в лучше случае сравнить все 3 результата - гальваническое цинкование, классический грунт и Химгранд ЦПС.

20140404

Linux Ubuntu HDR photography

sudo add-apt-repository ppa:dhor/myway
sudo apt-get update
sudo apt-get install luminance-hdr 
sudo aptitude install qtpfsgui hugin-tools 

20140403

Итак, начнём в прежнем темпе.

Всвязи с переходом на Ubuntu 12.04 x64 LTS пришлось настраивать всё заново. В том числе рецепт просмотра превью Nikon RAW формата (.nef файлы), удобный редактор растровых изображений (pinta) и быстрый просмотрщик .nef (geeqie):

sudo apt-get install geeqie libopenraw1 libopenrawgnome1 gnome-raw-thumbnailer gconf-editor

Используя Vim или любой другой удобный редактор:

sudo vim /usr/share/thumbnailers/ufraw.thumbnailer 

Вставляем туда строки:

[Thumbnailer Entry]
Exec=/usr/bin/ufraw-batch --embedded-image --out-type=png --size=%s %u --overwrite --silent --output=%o
MimeType=image/x-3fr;image/x-adobe-dng;image/x-arw;image/x-bay;image/x-canon-cr2;image/x-canon-crw;image/x-cap;image/x-cr2;image/x-crw;image/x-dcr;image/x-dcraw;image/x-dcs;image/x-dng;image/x-drf;image/x-eip;image/x-erf;image/x-fff;image/x-fuji-raf;image/x-iiq;image/x-k25;image/x-kdc;image/x-mef;image/x-minolta-mrw;image/x-mos;image/x-mrw;image/x-nef;image/x-nikon-nef;image/x-nrw;image/x-olympus-orf;image/x-orf;image/x-panasonic-raw;image/x-pef;image/x-pentax-pef;image/x-ptx;image/x-pxn;image/x-r3d;image/x-raf;image/x-raw;image/x-rw2;image/x-rwl;image/x-rwz;image/x-sigma-x3f;image/x-sony-arw;image/x-sony-sr2;image/x-sony-srf;image/x-sr2;image/x-srf;image/x-x3f;

Если сразу не сработало - проверить галочки "Enable" в NEF, запустив gconf-editor, категория desktop/thumbnailers/

Установка Gimp 2.8 и краткая памятка об одном из способов вырезания заднего плана.

add-apt-repository ppa:otto-kesselgulasch/gimp
apt-get update
apt-get install gimp

Одна из незначительных, но очень раздражающих мелочей - запрет на кисть множителя более 10 в gimp2.6 теперь преодолён!. Но не отвлекаюсь, приступаем:

  1. "add alpha channel", Дублируем слой
  2. при помощи контраста, desaturation, кисточек, инвертирования и т.п. добиваемся того, чтобы то что нужно стало белым, подлежащее удалению - чёрным.
  3. копируем весь этот слой и вставляем его в "Layer mask" (который надо добавить правой мышкой)

*Альтернатива - пробовать кликать волшебной палочкой. Тоже срабатывает!

20140226

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