Monday, December 22, 2014

Python'da Doğrusal bir kestirim çizgisi çizmek

Problem: Elimizde bazı sayılar var ve bu sayılara doğrusal bir trend/kestirim çizgisi çekmek istiyoruz?

Çözüm:
Önce Kaynaklar:

Farklı çizimler için: http://stackoverflow.com/questions/8409095/matplotlib-set-markers-for-individual-points-on-a-line
Doğrusal kestirim / lineer regresyon için : http://stackoverflow.com/questions/10048571/python-finding-a-trend-in-a-set-of-numbers

Önce yukarıdaki ikinci kaynaktan bir regresyon kodu aldık, sonra bir çizgi hesaplattık. Dikkat edilmesi gereken nokta, x ekseni hep 1,2,3.... vs diye başlıyor. Bu da range(##) komutu ile sağlanıyor.
import matplotlib.pyplot as plt

def linreg(X, Y):
"""
return a,b in solution to y = ax + b such that root mean square distance between trend line and original points is minimized
"""
N = len(X)
Sx = Sy = Sxx = Syy = Sxy = 0.0
for x, y in zip(X, Y):
Sx = Sx + x
Sy = Sy + y
Sxx = Sxx + x*x
Syy = Syy + y*y
Sxy = Sxy + x*y
det = Sxx * N - Sx * Sx
return (Sxy * N - Sy * Sx)/det, (Sxx * Sy - Sx * Sxy)/det

x = [12, 34, 29, 38, 34, 51, 29, 34, 47, 34, 55, 94, 68, 81]
a,b = linreg(range(len(x)),x) #your x,y are switched from standard notation
print a,b
extrapolatedtrendline=[a*index + b for index in range(20)] #replace 20 with desired trend leng

#combine two arrays
total=x+extrapolatedtrendline
plt.plot(range(len(x)),x,'ro--')
plt.plot(range(len(extrapolatedtrendline)),extrapolatedtrendline)

plt.ylabel("sayılar")
plt.show()




Saturday, April 12, 2014

Linux'de Tek Bir Programın, İstenildiği Zaman İnternet Bağlantısını Engellemek

Bazen bir uygulamanın internet erişimini engellemek isteriz, bunun için tüm interneti kaldırmak yerine o uygulamanın internet erişimini sınırlamakta fayda vardır. Dahası, o uygulamayı sadece istediğimiz zaman “internet erişimi engelli” olarak çalıştırmak isteyebiliriz. Konuyla ilgili bir çok forumda değişik anlatımlar var. Ben biraz daha basitleştirmeye çalışacağım.

Kısaca yapacağımız:
- “no-internet” diye bir grup oluşturup, programları sg komutu ile bu “no-internet” grubu ayarlarına göre çalıştıracağız. 
- ama “no-internet” grubunun da internet bağlantısını iptables ile koparacağız 
- ayrıca kendi kullanıcı adımızı da “no-internet” grubuna ekleyeceğiz ki, programları “no-internet” grubu ile çalıştırdığımızda bize şifre sormasın


Adım 1 – Bir “no-internet” grubu oluşturup kendi kullanıcı adımızı (Benim durumumda “baris”'i) bu gruba ekliyoruz.

sudo groupadd no-internet
sudo usermod -a -G no-internet baris

Şimdi logout olup çıkmanız gerekiyor ki, değişiklikler etkili olsun, ya da Adım 5'i bekleyin.


Adım 2 – Önce “Ana Kodu”muzu (“script”) yazacağız. Kodun ismi “ni” olacak. Komut satırında:

sudo nano /usr/bin/ni

yazıyoruz. Nano bir text editörü, açılan text editöründe

#!/bin/bash
sg no-internet “$1”

yazıyoruz. Ctrl-X ile save edip çıkıyoruz. Yukarıdaki komut ile ni 'den sonra gelecek ilk komutu ($1) no-internet grubu kimlik bilgileri ile çalıştıracağımızı belirtiyoruz.

Adım 3 - Şimdi de “ni” programını çalıştırılabilir (executable) bir hale getirelim:

sudo chmod +x /usr/bin/ni


Dikkat aşağıdakilerden bir tanesini uygulayın, ikisini de uygulamanız zarar vermez ama sonra ne yaptığınızı bir yere yazın. Ben (4.2)'yi tavsiye ediyorum.

Adım 4.1- Şimdi de “no-internet” grubumuz için kuralları oluşturalım:

sudo nano /etc/network/if-pre-up.d/iptables_no-internet_rule

Bu dosyanın içine :

#!/bin/bash
iptables -A OUTPUT -m owner –gid-owner no-internet -j DROP

yazıp save edip çıkıyoruz. Ardından bu dosyayı da çalıştırılabilir-executable yapıyoruz.

sudo chmod +x /etc/network/if-pre-up.d/iptables_no-internet_rule

Adım 4.2- ben yukarıdaki işlemin işlemediğini gördüm. Kullandığım distrodan dolayı herhalde

sudo nano /etc/network/if-up.d/iptables_no-internet_rule

Bu dosyanın için de

#!/bin/bash
iptables -I OUTPUT 1 -m owner –gid-owner no-internet -j DROP

yazıp save edip çıkıyoruz. Ardından bu dosyayı da çalıştırılabilir-executable yapıyoruz.

sudo chmod +x /etc/network/if-up.d/iptables_no-internet_rule


Adım 5 – Komutu çalıştırın

ni firefox
ni “komut 1 komut2”
ni komut


Referanslar: http://ubuntuforums.org/showthread.php?t=1188099



Sunday, March 16, 2014

Linux'de alt dizindeki tüm dosyaları kopyalamak/move

Komutu ile alt dizinlerdeki tüm jpg'leri, mevcut dizine kopyalamak mümkün, çok çok DİKKATLİ olun. Sadece kopyalamak için mv 'yi cp ile değiştirin

find ./ -name '*.jpg' -exec mv '{}' ./ \;

Monday, February 10, 2014

LEGO EV3 - Yürüyen daha doğrusu emekleyen robot

LEGO EV3'te uzun zamandır yürüyen bir robot yapıp yapmama kısmını düşünürken, bir iki denememi de paylaşayım...
Önce iki motorlu yürüyen bir robot yapmaya niyetlendim, hareketleri ev halkını çok güldürdü. İki motorlu yürüyen robotta temel problemler:
- Senkronizasyon sorunu çok önemli
- ikincisi de kablolardan dolayı EV3 kontrol ünitesini yukarı koymanız gerek

İki tane yürüyen robot denemesini burada paylaşıyorum... Birincisi çift motorlu, diğeri tek motorlu.

Çift Motorlu Robot

Tabii adaptörden dolayı, gücü düşük tutmak zorundaydım. O yüzden robot yavaş hareket ediyor gözükebilir. Bunları bir de pil ile deneyeceğim daha sonra... Senkronizasyon sorunlarına dikkat


Tek Motorlu Yürüyen Robot

Bir yandan da en basit yürüyen robotu yapmaya çalışma fikri uyandı. Masa kaygan olduğundan yürümekte zorluklar olduğu için ayaklara pabuç vari bazı dişliler taktım. Tabii ki tek motorlu olduğundan EV3 ünitesini üstüne yerleştiremedim.

Tek motorlu yürüyen robotun videosu da aşağıdadır. Çift motorludan daha iyi çalışıyormuş gibi gözüküyor.

LEGO EV3 - Giriş

LEGO EV3 daha çok oyuncak diye bilinse de, robot prototipleme konusunda piyasadaki "bant-makas-vida-çelik aksam" çıkmazından çok daha fazla opsiyon tanıyor.

EV3'ün iki modeli var, biri ev (HOME) biri de eğitim (EDUCATION)
Eğitim modelini tavsiye ederim ama bende ev tipi modeli var.

EV3'ün en önemli bir kaç sorunu:
- Kabloların kalın ve çok da esnek olmaması
- 6 kalem pil ile çalışması
- Labview kullanmanın kolay ama illa windows veya Virtualbox istemesi (Lejos'da var gerçi)

Önce 6 kalem pil alma fikri canımı çok sıktı. Bir de daha sonra öğrendiğim kadarı ile, 2-3 motoru eş zamanlı kullanmak çok fazla güç çekiyor, yani 500 mAh-9V'luk bir adaptör ancak motor gücünün %8'ini felen verebiliyor. Zorlanınca da EV3 kendini kapatıyor.

Adaptör :

Önce adaptör'den başlayalım - 6 pil alana kadar bir adaptör ile başlamak en iyisi geldi. Adaptörü nasıl bağlayacağınızı bilmiyorsanız, hiç bulaşmayın EV3'e zarar verebilirsiniz. Sakın ama sakın voltmetresiz bu işi yapmayın. Bu konuda hiçbir sorumluluk kabul etmiyorum.
















Ardından ilk robotu yapmak için uğraşmak 1 saat civarında tamam oldu. Fakat aşağıdaki şekilden görüldüğü üzere
http://www.legomindstormsev3.com/robotarm/
Adresindeki robotu yapmak yerine kendim doğaçlama birşeyler deneyeyim dedim. Doğaçlama biraz daha EV3 sistemi ile ilgili fikir veriyor. En önemlisi, büyük servoların ağırlığından dolayı dengeli bir robot kol yapmanız gerek.

Robot kol:

Robot kol için büyük ve ağır servoları daha aşağı tarafta, mümkünse dirsek altı noktalarda, orta servoyu da el hareketi için kullanmak gerekiyor. Aşağıdaki yaptığım yanlışlardan biri görülmekte, ağır servoları üst tarafa yerleştirince, denge problemleri ortaya çıkıyor.



















bir iki gün için 3-4 robot denemesi yapmak mantıklı.
Bir de unutmamak gereken bir nokta var
Motorlar A-B-C-D, sensörler 1-2-3-4'e bağlanmalı






Friday, February 07, 2014

Network appleti gidince

Mate Desktop'ta en sağ üstte network bağlantılarını gösteren icon kaybolursa
nm-applet
yazmak yeterli.

Thursday, February 06, 2014

LEGO EV3'ü Linux'te kullanma

Linux'te LEGO EV3 kullanmak gerçekten zormuş.
lsusb
veya 
dmesg | grep LEGO
dememe rağmen bir türlü device'i mount edemedim.
En sonunda virtualbox ile windows'dan labview'a mahkum oldum.
Fakat virtualbox'da önce Extension'ı yüklemeniz lazım o da
www.virtualbox.org 'da Downloads da var
VirtualBox 4.x.x Oracle VM VirtualBox Extension Pack
tüm sistemler için aynı.
Fakat extension kurmama rağmen LEGOyu veya USB'yi görmedi. Bir forumda gördüğüm aşağıdaki komutu yazdım. Virtualbox'da mevcut kullanıcının bir diski eklemesi için kendi kullanıcı ismini vboxusers grubuna eklemesi gerekiyormuş.
      sudo usermod -a -G vboxusers $USER
ardından bir çıkıp gireceksiniz (log-off ardından log in)
artık virtualbox USB'leri görecektir. 

Ses gidince

Linuxte ses gidince önce
pulseaudio -k && sudo alsa force-reload
deneyip de bir türlü sesi açamayınca en sonunda
pulseaudio --start
yaparak sesi tekrar almayı başardım