Заключване на колело (верига) – направи си сам за под 10 лв

Качествените вериги за колела често са над 100 лв. Има и по-бюджетни решения от порядъка на 25-35лв, които обаче служат само да плашат гаргите. Истината е, че реши ли някой да ви гепи колелото, то каквото и заключване да сложите, почти е невъзможно да спрете крадеца. Все пак има идеи, които могат да забавят крадеца, особено, ако велосипеда на обществено място и не е оставен за дълго време без надзор. След кражбата на едното ми колело, за което силно страдах, реших вече да не разчитам на купешки заключвания, а да си изработя сам такова. Ще споделя две прости и евтини идеи, които съм пробвал.

1. Верига + катинар

Сериозна верига може да се закупи от почти всеки строителен хипермарет. Аз си харесах верига от Маркита в Пловдив на цена от 4.5лв/м. Може да се избере и някоя с по-малък диаметър на звената.
Верига
Към веригата си купих и един катинар на същата цена. Катинара го купих от магазин Ziko. Ето как изглежда цялата комплектовка за 9лв общо:
Верига и катинар

Верига и катинар
Допълнително веригата може да се облече в някакъв подходящ плат или мек маркуч. Може да се използва и стара вътрешна гума. Защо не и парче плат от стари дънки.

2. Стоманено въже

Избора на стоманени въжета също е голям – ръждавейка, поцикновано, облечено в ПВЦ. Диаметъра на въжетата за конкретната цел трябва да е от порядъка на 4-8mm. Цените на такива въжета са от порядъка на 1-5 лв/м. Аз си харесах 6мм стоманено въже с ПВЦ на цена от 1.7лв/м. Купих точно 3 метра за 5.1лв. Проблем представлява изработването на уши за катинар (или друг тип заключване). Може да се използват скоби за въже, но трябва да се фиксират болтовете, за да не се развъртят лесно. Може да се фиксират със специално лепило.
Друг вариант е да си сплетем краищата на въжето, точно това направих и аз. В YouTube има доста видео-уроци, които показват как се прави ухо на стоманено въже. Аз си харесах това:
https://www.youtube.com/watch?v=hGgpleP0pCk
Разплитането на подобно въже ще озори достатъчно крадецът, освен ако не реши да го среже със специален инструмент.
Ето и моят работен процес:
сплитане на стоманено въже
сплитане на стоманено въже
Изрязват се стърчащите телове на въжето, за да придобие по-приличен вид:
сплитане на стоманено въже
Малко тунинг, за да не драска боята на колелото. В случая рециклирах една найлонка, като изрязах тънки лентички, с които увих ушите на въжето:
сплитане на стоманено въже
Остава да се добави някакъв читав катинар и готово.
Подобно въже лесно може да се среже с преносима гилотина, ъглошлайф или друг подобен инструмент. Но на публично място да режеш въже на колело с ъглошлайф иска да си бая чапрашък и на това разчитаме.

Има някои прости правила, които имат шанс да откажат поне временно крадеца:

  • Не оставяйте колелото за дълго без надзор или на място, което е безлюдно
  • Избирайте места за заключване, които се наблюдават от видео-камера
  • При заключването се постарайте да използвате поне 2 различни вида заключващи механизми. Например U-образно + верига, верига + стоманено въже
  • Старайте се по възможност да обхванете повече детайли на колелото – рамката, гумите, седалката
  • Когато купувате стоманено въже или верига, гледайте да е поне 1.8m

Искрено ви пожелавам никога да не ви се случва да ви гепят колелото. Няма 100% сигурност, но повишеното внимание може да помогне.

Share and Enjoy !

Shares

Пловдив – панорамни снимки

Gallery

This gallery contains 6 photos.

Мисля да направя една хубава галерия с панорамни снимки на Пловдив. Вече се чувствам подготвен и от към софтуер, и от към техника. Няколко пъти съм пробвал, но опитите ми са били предимно с учебна цел. Изпробвах няколко софтуера, които … Continue reading

Moto G – ъпгрейд до Android Lollipop 5.0.2

Moto G - update to Android Lollipop 5.0.2
Притежавам Moto G, рутнат с CWM 6.0.47. До вчера беше с Android 4.4.4 и постоянно излизаше едно досадно съобщение, че трябва да ъпдейтна версията на Android. Пробвах по стандартния системен начин през телефона. И влязох във филм – постоянни рестартирания, викат им bootloop. При едно от рестартиранията се появи съобщение, че ъпдейта не може да бъде осъществен и така си останах с Android 4.4.4.
Естествено, като те хване крастата нямаш много опции, освен да се опиташ да си прецакаш телефона. И така мъките ми започнаха. Първо разбрах, че няма да мога да ъпдейтна по нормален начин рутнат Moto G, след това разбрах, че мога да пробвам да мина по тънката лайсна, като изтегля някой Cyanogenmod 12 за Moto G. Пробвах с cm-12-20150327-NIGHTLY-falcon.zip и направих голяма грешка. Проблема беше, че при проба за инсталиране на CM 12 ми изписа тази грешка: “this package support bootloader(s): 0x4118: this device has bootloader 0x4113.“. Това ме накара да потърся bootloader 4118. Намерих такъв и го инсталира, но не знаех нещо много важно: Motoboot не може да се даунгрейдва!. Ако някой реши да пробва, нека го има предвид. Няма значение за коя версия на андроид става въпрос. Няма даунгрейд, не съществува.
След което успях успешно да инсталирам CM 12, който въобще не пожела да се зареди. Не само това, ами и телефона започна да се държи като брикнат. Влизаше в bootloop, дори да го оставех на зарядно в контакта. Трагедия!

След това ми дойде акъла в главата и започнах да търся оригинален firmware за Moto G. Намерих такъв в този списък – Moto G – firmwares for international retail and carrier devices. В този списък имаше точно каквото ми трябваше BRASIL_XT1032_5.0.2_LXB22.46-28_cid12_CFC.xml.zip – стоков firmware за Moto G, правен за Бразилския пазар с Android Lollipop 5.0.2. Изтеглих файла, разархивирах го. След което изтеглих инструментите за рефлашване на телефона – Moto G fastboot and ADB. Разархивирах fastboot и mfastboot в директорията с бразилския Lollipop и отворих команден промпт в тази директория.
Изключих телефона (стана от 3-тия път, защото си беше почти брикнат), след което веднага задържах “Volume -” + “Power” бутоните, за да ребоотна до bootloader-а. След което свързах телефона с USB-кабел с компютъра и изпълних следните команди в същата последователност:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mfastboot flash partition gpt.bin
mfastboot flash motoboot motoboot.img
mfastboot flash logo logo.bin
mfastboot flash boot boot.img
mfastboot flash recovery recovery.img
mfastboot flash system system.img_sparsechunk.0
mfastboot flash system system.img_sparsechunk.1
mfastboot flash system system.img_sparsechunk.2
mfastboot flash system system.img_sparsechunk.3
mfastboot flash modem NON-HLOS.bin
mfastboot erase modemst1
mfastboot erase modemst2
mfastboot flash fsg fsg.mbn
mfastboot erase cache
mfastboot erase userdata

След това рестартирах телефона и зачаках може би около 5-6 минути. И о, чудо! Появи се клавиатурата за въвеждане на PIN код. Проста да падладьейш! 🙂 След 2 дни борба отново имах работещ Moto G.
Moto G - Android Lollipop 5.0.2

Share and Enjoy !

Shares

Продуктова фотография с подръчни средства

Налагало ли ви се е да искате да снимате малък продукт, който трябва да представите в интернет, но да не разполагате с подходящо оборудване. И на мен ми се е налагало няколко пъти. Използвам много проста, аматьорска техника, изискваща оборудване, което лесно може да се намери наоколо:
– 2 бр. листове хартия A4
– ножица
– Фенерче, може и 2 фенерчета или настолна лампа
– фотоапарат или телефон с добра камера

Ако всичко това ви се намира под ръка, да започваме с експериментите.
За начало свийте единия лист на фуния и подрежете краищата му, така, че да стои вертикално. Ако е необходимо изрежете и по-голяма дупка в горната част на фунията, за се промуши обектива на фотоапарата. След това нагласете фенерчетата да осветяват фунията отстрани. Ето как изглежда моя подръчен стенд:
Продуктова фотография с подръчни средства
При свиването на фунията в единия и край се образува естествен отвор. Ако е малък може да се изреже и по-голям. През този отвор ще снимаме продуктите под ъгул, а през отвора горе ще снимаме продукта от горе:
Продуктова фотография - сниман обект през дупка
Продуктова фотография - снимане на продукта през дупка

След като направим няколко снимки е донбре да имаме софтуер, може и безплатен, като FastStone с който да изрежем излишната част от снимката и да направим леки корекции, ако се налагат:
SAM_0820
Ето и още няколко експеримента, които направих с по-горния стенд с подръчни средства:
SAM_0811

SAM_0807

SAM_0800

И както обикновено, пак си пийваме биричка, щото от фотографиране-мотографиране много се ожаднява.

Share and Enjoy !

Shares

Скоростно учене на думи на чужд език (английски) – метод за Android и компютър

aShan and Interlex - скоростно учене на думи на английски
Когато се учи чижд език, най-важното нещо е добрия запас думички в речника. Понякога ученето на думи е трудно и времеемко. Лично за себе си съм открил една техника, която работи много добре.
Необходими инструменти

  • aShan Trainer – Android приложение за създаване и трениране на чужди думи
  • MS Excel (или друг редактор на таблици)
  • Interlex – програма за създаване и трениране на списъци с чужди думи
  • Notepad2 (или друг редактор, поддържащ регулярни изрази)

Създаване на собствен списък с думи
За мен е най-удобно, да създавам списъци с думи в Excel. В един файл и различни шийтове мога да съхранявам различни по сферата на приложение думи. Например списък с думи свързани с: хранене, пътуване, инженеринг, програмиране и т.н.. Ето как изглежда примерен списък с думи в Excel:
Excel - списък с чужди думи
В случая ще кръстя моя файл “trudni_dumi.txt“. Списъка с трудните думи, които искам да науча, може да се редактира, допълва, експортира до други формати, за да се използва в речници. Точно това ми е и целта, да мога да експортирам този списък и да го използвам в програми за PC или мобилни устройства. В случая искам да експортирам моя списък в удобен за ползване формат за програмата Interlex и за приложението за Android устройства aShan.
Съхранявам списъка като текстов файл в който отделните клетки са разделени от табулация. За целта в Excel избирам Save As -> Text (Tab delimited):
Excel_save_as
След като вече сме създали текстовия файл, можем да го отворим с текстовия редактор Notepad2 и да го редактираме, според нуждите ни.
Notepad2 - отваряне на файла
Повечето програми за изучаване на чужди езици са с дефолтна поддръжка на юникод стандарта. Това означава, че трябва да конвертираме нашия експортнат файл в UTF8-стандарт. Правим го като кликнем 2 пъти на етикета ANSI в долната част на Notepad2, изберем UTF8 и потвърдим избора:
Notepad2 convert text to UTF8 - конвертиране до юникод
След тази операция вече можем да сме сугирни, че няма да се получат маймунски символи в програмите с които ще работим, просто натискаке Save, за да запазим файла.

Импортиране на собствен речник с думи в Interlex
Сега да видим, как можем да набутаме нашия речник с “трудни думи”, които трябва да научим в програмата Interlex. Отваряме програмата и избираме създаване на нов файл-речник File -> New…:
Interlex - Create New dictionary
Задаваме настройките на чуждия и родния език. В случая избираме английски и български:
Interlex - Select Language
Следва инпортирането на нашия текстов файл с трудни думи – File -> Import…:
Interlex - Import text file
Ще се отвори модален прозорец, който ни подканва, да изберем файла. В случая трябва да се избере формата на файла *.txt:
Intrl_004
Следват настройките, които да кажат на Interlex, как да използва този файл. Казваме му, че имаме само две колони – чужда дума и преведена дума:
Interlex - dictionary settings
Потвърждаваме и готово! Вече имаме речник с който да тренираме.
Interlex - custom dictionary
В този момент е добра идея да го запазим във формата на Interlex, за да можем бързо да го отворим и да потренираме, за това File -> Save As….
Тренировките се правят с тези бутони. Необходими е една минута, за да разберете какво прави всеки един бутон.
Interlex - трненинг панел

Импортиране на собствен речник с думи в aShan
Сега ще направим същата операция но за aShan. Лично за мен е по-удобно да уча думите от телефона. По-бързо става, а и телефона винаги ми е под ръка.
За да можем да използваме речника с трудните думи в aShan, трябва отново да обработим текстовия файл с Notepad2. Използвам този редактор, защото е малък, но пък поддържа регулярни изрази – това са магически заклинания на древен език, които правят страшни магарии с текстовете.
Отваряме файла trudni_dumi.txt в Notepad2 и натискаме клавишната комбинация Ctrl+H. Ще ни се отвори по-долния прозорец за търсене и замяна на стрингове в текста. Трябва да попълним двете текстови полета и сложим тикче, че ще използваме Regular expression search (търсене с регулярни изрази):
Notepad2 - Regular expressions
Използвам следните параметри за регулярния израз:
Search String: ^(.*)\t(.*)$
Replace String: $en \1 $bg \2
След натискането на бутона Replace All всички редове ще бъдат променени в следния формат, който използва aShan:
$en английска_дума $bg български_превод
Следва малка но много важна подоробност. В началото на файла трябва да се добави един ред, който дава важна информация на aShan:
#@ $en $bg
np2_003
След това трябва да запишем файла с разширението sdc, което използва aShan:
np2_004
Файла е готов. Сега трябва да го качим на мобилното устройство (телефона). Това можем да направим с кабел или, ако използвате рутер, можете да си пуснете FTP-сървар на телефона. На мен лично ми е супер удобно да прехвърлям файлове от компютъра на телефона и обратно с ES File Explorer. Това приложение има много удобнен инструмент – Remote Manager – който създава FTP сървар на телефона.
Файла trudni_dumi.sdc трябва да се качи в директорията aShanData:
FTP ashandata
След като сме качили собствения речник, нека да го заредим в aShan. Стартираме приложението и избираме Start Multiple Choice Quiz:
aShan - Start Multiple Choice Quiz
Избираме файла trudni_dumi.sdc:
Screenshot_2015-03-15-11-58-03_tn
Избираме езика, който да тренираме:
Screenshot_2015-03-15-11-58-18_tn
И започваме тренировките:
Screenshot_2015-03-15-11-58-36_tn
Това е! Вече докато пътуваме или си чакаме биричката, можем да понаучим някоя друга дума.

Share and Enjoy !

Shares

Laravel – root dir post-request

Има един досаден бъг в Laravel 4.2. Не иска да обработва post-заявка, насочена към root-адреса. Говоря за това:

1
2
3
Route::post('/',function(){
 // ...
});

В такива случаи Laravel сеправи на чук и просто рефрешва страницата.
Открих 2 трики-метода за заобикаляне на бъг-а:
1. Поставя се шпация, ако формата е насочена към текущата страница:

1
{{Form::open(array('url'=>' ','method'=>'post'))}}

2. Пишем точно към кой адрес е насочена формата:

1
{{Form::open(array('url'=>'/index.php','method'=>'post'))}}

Share and Enjoy !

Shares

Извличане на цветове от картинка с php

Имам една идея за автоматична смяна на цветната схема на Bootstrap-базиран сайт. За целта ми трябва просто извличане на цветовете от картинка с php-скрипт.
За базови цветове създавам проста картинка с квадратчета, като тази:
php extract color from image
За да извлека цветовете от отделните квадратчета използвам php-функцията imagecolorat, която взима цвета на пиксел при зададени кооординати. Координатната система е нулирана в горния ляв ъгъл:
imagecolorat - coordinates
Примерен скрипт в който използвам извличане цвета на пиксел, който се намира горе-долу по средата на всеки правоъгълник:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
// $rgb е array
function rgb2hex($rgb) {
   $hex = "#";
   $hex .= str_pad(dechex($rgb[0]), 2, "0", STR_PAD_LEFT);
   $hex .= str_pad(dechex($rgb[1]), 2, "0", STR_PAD_LEFT);
   $hex .= str_pad(dechex($rgb[2]), 2, "0", STR_PAD_LEFT);
 
   return $hex;
}
 
function get_color_from_pixel($img, $x, $y){
    $im = imagecreatefrompng($img);
    $rgb = imagecolorat($im, $x, $y);
    $r = ($rgb >> 16) & 0xFF;
    $g = ($rgb >> 8) & 0xFF;
    $b = $rgb & 0xFF;
 
    return rgb2hex(array($r, $g, $b));
}
 
// ===================================================
// EXAMPLE
 
$image = "image.png";
$y = 24;
$x_ar = array(33, 103, 177, 244, 315, 385, 454, 526, 593);
 
foreach ($x_ar as $x) {
    $colors[] = get_color_from_pixel($image, $x, $y);
}
print_r($colors);
?>

Резултат:

1
2
3
4
5
6
7
8
9
10
11
12
Array
(
    [0] => #36261c
    [1] => #d5c187
    [2] => #6ecddf
    [3] => #827b3a
    [4] => #2a7d94
    [5] => #9db079
    [6] => #82796d
    [7] => #a7c6da
    [8] => #d54c06
)

Изтегляне на скрипта и картинката: PHP-get_colors_from_image.zip

Share and Enjoy !

Shares

Проектиране на мебели в Blender 3D – ръководство и видео урок

RENDERED етажерка
Ще се опитам да напиша един урок за просто проектиране, моделиране и програмиране на мебели в Blender. Програмата поддържа езика за програмиране Python, който разполага с безкрайни възможност за създаване и управление на обекти. Ще се постарая да се изразявам максимално простичко и ясно.

Необходими инструменти:
1. Молив
2. Лист хартия
3. Blender 3D – по възможност версия 2.67 или по-нова

Първо да скицираме някакъв по-простичък обект (мебел), който искаме да проектираме. Аз ще създам проста етажерка за окачване на стена. За да улесня максимално процеса, моята етажерка ще е от 4 детайла – 2 еднакви по размер страници + 2 една по размер елемента, които ще са гръб и под. Ето как изглежда моята етажерка:
Схема на етажерка
Сега е време да се сблъскаме с назъбения интерфейс на моделера Blender. Програмата е малко плашеща за нови потребители. Но има голямо комюнити и много уроци, които помагат за овладяването и. Лично аз много харесвам тази програма и използвам предимно базовите и фукнции, които често ми олесняват живота. Нека да започнем със забавата.
Стартираме програмата и натискаме Delete бутона от клавиатурата, за да изтрием куба, който се зарежда под дефолт.
Blender 3D interface
Старайте се да не кликате никъде с мишката, докато не разберете каква е логиката на програмата. Кликовете с мишока са:
– Левия клик поставя 3Д-курсора в точката на кликане
– десния клик върху обект го селектира
– Скролирането в 3D фрейма зумва
– Натиснат среден бутон върти 3Д-фрейма
– среден бутон + задържан Shift мести 3Д-фрейма

Има и доста допълнителни команди, но за тях по-късно.

Сега, докато не сме почнали с експериментите, нека разгледаме координатната система. Намира се долу в ляво:
Blender координатна система
Сега да помислим как да си разположим елементите от нашата етажерка:
Проектиране на етажерка
Важно е да се отбележи, че ще използваме метричната система. Това трябва да му го кажем на Blender, иначе ще прави глупости. За целта правим следните настройки:
Елементите, които трябва да създадем в 3Д са:
– 2 броя страници: 18x240x222mm
– 2 броя плоскости за гръб и под: 850x222x18mm
Тези елементи по-късно ще ги добавим в нашия програмен код. Размерите на всеки елемент могат да се групират в масив. Примерно такъв:
stranici=[0.018, 0.240, 0.222]
gryb=[0.850, 0.222, 0.018]
dyno=[0.850, 0.018, 0.222]

Можем да ги създадем по поне 10 начина, но аз ще ви покажа един много нестандартен подход, който често се оказва най-оптимален и бърз вариант. Ще използвам много просто програмиране на Python. За целта трябва да отворим редактора за въвеждане на Python скриптове. Това също може да стане по много начини, но аз ще използвам предефинираните полета на Blender:
Кликнете бутона Choose Screen layout и изберете Scripting
Blender scripting
Кликнете на бутона +New
Blender new script
!!! Супер важно: Старайте се курсора на мишката винаги да е във фрейма в който работите. Примерно, ако искате да въвеждате текст в текстовия редактор, курсора ви трябва да е в този прозорец (фрейм).
В текстовия редактор пейстнете следния код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import bpy
 
strani=[0.018, 0.240, 0.222]
gryb=[0.850, 0.222, 0.018]
dyno=[0.850, 0.018, 0.222]
 
# създаваме 2-те страници. Те лежат в едно направление
# и можем да използваме цикъл
for x in range(2): # изпълни 2 пъти
    bpy.ops.mesh.primitive_cube_add(radius=1)
    bpy.context.object.dimensions=strani
 
# създаваме гръб
bpy.ops.mesh.primitive_cube_add(radius=1)
bpy.context.object.dimensions=gryb
 
# създаваме пода
bpy.ops.mesh.primitive_cube_add(radius=1)
bpy.context.object.dimensions=dyno

Прозореца със скрипта трябва да изглежда така:
Blender Python script
Командите:

1
2
bpy.ops.mesh.primitive_cube_add
bpy.context.object.dimensions

са въведени в API-интерфейса на Blender. Всяка версия на програмата има документация в която са описани всички команди, които могат да се изпълняват от програмата. Как лесно да разберем коя команда как се ползва ще опиша някой друг път.

Сега трябва да изпълним кода. Натискаме Text->Run Script:
Blender run script
От тук насетне следва местене и рендване в Blender. Действията, които съм извършил в програмата, могат да се видят в по-долното видео:
[flv:https://blog.nediko.info/examples/blender/Etajerka_tutorial.flv https://blog.nediko.info/examples/blender/Etajerka_tutorial.jpg 584 316]

Share and Enjoy !

Shares

Vim Editor – Видео урок

Преди доста време бях правил видео за редактора Vim. Направих го за мен, а и заради едни приятели от форум, който посещавах.
Скоро ми се наложи пак да ползвам Vim editor на едно Linux дистро и бях малко като пате в кълчища. За това качвам урока, та другият път да изкарам един бърз курс, ако ми се наложи.

[flv:https://blog.nediko.info/examples/vim_editor/Vim_Tutorial.flv https://blog.nediko.info/examples/vim_editor/Vim_Tutorial.jpg 584 403]

Share and Enjoy !

Shares

PHP рекурсивно обхождане на дървовидна база данни

Много често се налага да се работи с дървовидни бази данни. С тях могат да се изграждат структури с дъщерни елементи, като например дървовидни менюта за сайт с категория, подкатегория, секция.
Ето едно примерно обхождане на подобна база данни с рекурсия:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
$arr = array(
    // $id, $parent_id, $name
    array(1, 0, "edno"),
    array(2, 0, "dve"),
    array(3, 1, "edno-edno"),
    array(4, 3, "edno-edno-edno"),
    array(5, 1, "edno-dve"),
    array(6, 2, "dve-edno"),
    array(6, 1, "edno-tri")
);
 
function recurse($arr, $pid, $space = '') {
    $output = '<ul>';
 
    foreach ($arr as $key => $ar) {
 
        if ($ar[1] == $pid) {
 
            $output .= "<li>" . $ar[2] . "\n";
            // iztrivane na obhodenite elementi
            $pid_temp = $ar[0];
            unset($arr[$key]);
 
            if ($children = recurse($arr, $pid_temp, $space . '_')) {
                if ($children != '<ul></ul>')
                    $output .= $children;
            }
            $output .= "</li>";
        }
    }
 
    return $output . "</ul>";
}
 
echo recurse($arr, 0, '');

В резултат се получи една чудесна списъчна структура:
Дървовидно обхождане с рекурсия

Share and Enjoy !

Shares