tag:blogger.com,1999:blog-61433856537243307172024-03-13T01:50:23.740+00:00bdgnLinux AdminAnonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-6143385653724330717.post-38091432072673175002015-08-05T23:29:00.006+01:002015-08-05T23:29:53.113+01:00Moved to new blogI started a new blog on <a href="http://bergerx.silvrback.com/">http://bergerx.silvrback.com/</a> and directed <a href="http://blog.bdgn.net/">http://blog.bdgn.net</a> to that one.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com0tag:blogger.com,1999:blog-6143385653724330717.post-82653942367283781772015-08-04T03:35:00.001+01:002015-08-04T04:03:50.991+01:00A reference Mesos cluster setup - 1After <a href="http://blog.bdgn.net/2015/08/home-cluster-setup.html">having my own bare-metal cluster at home</a>, I will try to build a sample system just for fun with overall goals:<br />
<ul>
<li>minimum dependency on any existing *aaS, and make the system self contained for each piece,</li>
<li>prevent any kind of vendor-lock-in,</li>
<li>make any part of system HA (dc-wide only),</li>
<li>zero touch ops, allow system to detect and auto-heal probles, </li>
<li>ready to use infra services to cover most usual scenarios like ELK, CI/CD, Monitoring/Alarming</li>
<li>(scope is intra-dc, so there will be no inter-dc solutions) </li>
</ul>
To achieve these goals, I'm thinking about using following components for my own reference implementation.<br />
<br />
Before , I played with
mesos/docker on CoreOS/Ubuntu on some cloud providers, also tried some DCOS. And I ended
up with a Mesos installation on Ubuntu just because I still feel myself
more comfortable on Ubuntu while playing around.<br />
<br />
<b>Cluster Level Service Management</b><br />
This was already my starting point for the whole idea. <a href="http://mesos.apache.org/">Mesos</a> + <a href="https://mesosphere.github.io/marathon/">Marathon</a> + <a href="http://mesos.github.io/chronos/">Chronos</a> will likely do the job.<br />
<br />
<b>Service Discovery</b><br />
Thanks to guys from <a href="https://mesosphere.com/">Mesosphere</a>, we could get some <a href="https://open.mesosphere.com/getting-started/service-discovery/">well defined service discovery solutions</a> without a lot of effort. We have <a href="http://mesosphere.github.io/mesos-dns/">mesos-dns</a> (gives us also SRV records) and haproxy-marathon-bridge (will likely replaced by servicerouter.py) nearly for free.<br />
<a href="https://www.consul.io/">Consul</a> could also help but it needs some not-ready-yet dependencies like an <a href="https://github.com/coreos/etcd">etcd</a> cluster setup.<br />
<br />
<b>VPN</b><br />
Creating an OpenVPN service seems fairly simple with marathon+docker, <a href="https://www.digitalocean.com/community/tutorials/how-to-run-openvpn-in-a-docker-container-on-ubuntu-14-04?utm_source=githubreadme">thanks to Kyle Manna</a>.<br />
<br />
<b>Code repository </b><br />
I will likely use some kind of git repository just for not to depend on github, most likely <a href="https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/README.md">GitLab</a>, but GitLab is depending on many other components that each should be carefully architectured HA with auto-heal in mind, I did not look into this yet.<br />
<br />
<b>CI/CD</b><br />
Seems like using <a href="https://www.docker.com/">docker</a> with a self-hosted <a href="https://docs.docker.com/registry/">docker-registry</a> could help a lot with deployment problems. And for building and testing, there is a <a href="https://github.com/jenkinsci/mesos-plugin">Jenkins integration with mesos</a> but we need to overcome <a href="http://stackoverflow.com/questions/25436742/deleting-images-from-a-private-docker-registry">some</a> <a href="https://github.com/chadoe/docker-cleanup-volumes">set</a> <a href="https://github.com/docker/docker/issues/9054">of</a> <a href="https://github.com/docker/docker/issues/15151">problems</a> <a href="https://github.com/docker/docker/issues/13885">cleaning</a><span id="goog_1179627821"></span> <a href="https://github.com/docker/docker/issues/11139">docker</a> <a href="https://github.com/docker/docker/issues/12265">leftovers</a> <a href="https://github.com/docker/docker/issues/11053">around</a>. I will try to write about this later, but with the current state of docker problems it could not be suitable running docker builds on random nodes.<br />
<br />
<b>ELK stack</b><br />
We need a kind of central log system, <a href="https://www.elastic.co/products">ELK stack</a> for identifying production problems easier. There seems like infinite number of log related tools to use with docker. But for me, this hits the lack of persistent-storage problem in current mesos releases for now, <a href="https://github.com/mesos/elasticsearch">elasticsearch framework</a> could help but I'm just not there yet.<br />
<br />
<b>Monitoring</b><br />
Monitoring in general is an already solved problem. but there are no best practices around about how and what to monitor for Mesos/Marathon/Chronos itself since most of the parts of the system will be HA with auto-heal support, hopefully no extensive alarming/notification systems will be needed for most of the components.<br />
Some monitoring/alarming tools like <a href="http://prometheus.io/">Prometheus</a> (since it also has <a href="https://github.com/prometheus/mesos_exporter">mesos-exporter</a>), and <a href="https://github.com/twosigma/satellite">Satellite</a> seems promising. But both does not seem like mature enough yet. Seems like most Mesos users have their own customized systems for their monitoring infrastructure.<br />
<br />
For now I will leave any kind of persistent-storage dependent components to a later phase (Mesos will likely have <a href="http://mesos.apache.org/blog/mesos-0-23-0-released/">persistent-storage support soon</a>), I will focus on these components as a first step:<br />
<ul>
<li>mesos</li>
<li>marathon - service scheduler for ephemeral and/or idempotent tasks</li>
<li>chronos - cluster-wide chron jobs</li>
<li>haproxy-marathon-bridge - for HA and service discovery</li>
<li>mesos-dns - service discovery using DNS, also generated SRV records</li>
<li>openvpn - so that i can reach my cluster from everywhere</li>
<li>docker-registry - my own docker registry, I'll use S3 to store images for now to avoid persistent-storage needs</li>
</ul>
What I'll be missing in my setup is for now:<br />
<ul>
<li>any kind of persistence, big lack in the whole stack, there is no best practices around yet to run services need some kind of persistence</li>
<li>disaster recovery on inter-dc/inter-region level</li>
<li>DCOS - which have its own package support for easy installing frameworks, seems like mostly helping with frameworks for persistency related framework installations, I'm not able to use <a href="https://mesosphere.com/product/">DCOS</a> since it seems like they only support AWS for now</li>
<li>any kind of security between different components, will do the mistake of assuming local-network safe </li>
</ul>
Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com0tag:blogger.com,1999:blog-6143385653724330717.post-51331884955855297012015-08-03T17:26:00.003+01:002015-08-03T19:00:50.445+01:00Home cluster setupRecently as a hobby project I was looking for playing with some recently popular tools like <a href="http://mesos.apache.org/">mesos</a>, <a href="http://kubernetes.io/">kubernetes</a>, <a href="https://docs.docker.com/swarm/">docker-swarm</a> and many other related. After playing around some tests clusters on Digital Ocean and AWS and spending dozens of dollars each month, I realized that I need some constantly running boxes to see how do these brand new tools behave in long term.<br />
<br />
<a data-flickr-embed="true" href="https://www.flickr.com/photos/bergerx/20234648076/in/dateposted/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" title="IMAG1480"><img alt="IMAG1480" height="200" src="https://farm1.staticflickr.com/411/20234648076_5a3bb05fb8_z.jpg" width="148" /></a>After doing some research to find the cheapest available cloud provider, I found the cheapest cloud option is AWS Spot Instances which could be shut down at any time or I should buy my own bare boxes. I wrote a <a href="https://gist.github.com/bergerx/d3f2a76c910eb03f4be3">small script to find the cheapest possible AWS Spot instance</a>. As of today US-WEST-2 c3.large spot instances have reasonable prices (less than 12$/month) to play with and have pretty clean records in last months. So if I'd chose a little higher price than the current bid, I'll possibly be happy for months. But somehow I'm excited with the idea of having my own cluster running on metal.<br />
<br />
And I started searching for cheap second hand desktop computers. Thanks to some friends with spare computers, old laptops at home and <a href="http://adverts.ie/">adverts.ie</a>, I got 6 boxes only spending 45Eur in total.<br />
<br />
I also had a chance to cycle around Dublin to collect parts :) And guys from adverts were generous to me, they gave me a spare disk and desktop for free, this was really surprising to me. And overall this adventure ended up being cheaper even than the cheapest cloud option I have. I enjoyed playing with some hardware as I do in my college days. I gather up different parts to build computers and it was really fun :)<br />
<br />
But I'm still curious if this is really cheaper than cloud options in long term, I'll buy a <a href="http://www.google.com/images?q=watt-o-meter">watt-o-meter</a> to measure the monthly electricity bill I pay for running these boxes.<br />
<br />
There is a down side in this setup that I have to maintain all those nodes and keep them running, as much as you can and as a result of having nodes running without a stable wireless network and power cords my setup gives me implicit <a href="https://github.com/Netflix/SimianArmy/wiki/Chaos-Monkey">chaos-monkey</a> for free. But for real, that helped me a lot with fixing things properly.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com0tag:blogger.com,1999:blog-6143385653724330717.post-34676426711427831872012-10-08T02:00:00.001+01:002012-10-08T02:24:12.389+01:00Sonunda Arduino siparis ettim, PIC Linux'cu amatorler icin dandikEvlendiğimden beri evdeki lambaları yattığım yerden telefonla falan kontrol etmek gibi gereksiz bir isteğim vardı. Yattığım yerden kalkmadan evdeki aletleri ve ışıkları kapatsam saçma bir şekilde mutlu olacakmışım gibi geliyor.<br />
<br />
Bu uğurda önce <b>transformatör + rf alıcı + role</b> yi birleştirerek bir şeyler yapabileceğimi sanmıştım. Ama devre mevre yapmak hak getire her ne kadar elektrik-elektronik mühendisliği mezunu da olsam anlamıyorum ki bunlardan hiç bir şey, üzerine de mezun olalı 8 yıl olmuş, zaten bilmediğim bilgileri de tamamen unutmuşum.<br />
<br />
<br />
<a href="http://4.bp.blogspot.com/-FKUXSQTjxak/UHHRTq_hObI/AAAAAAAABKM/glQoCMGrWUA/s1600/IMG_20121007_214749.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="http://4.bp.blogspot.com/-FKUXSQTjxak/UHHRTq_hObI/AAAAAAAABKM/glQoCMGrWUA/s200/IMG_20121007_214749.jpg" width="200" /></a>Derken bir gün DNR'da 50TL'ye satılan bir pakette bir uzaktan kumanda ve onunla yönetilen 3 adet priz gördüm (resmi yanda), aldım içini açıp devre elemanlarına baktım 433Mhz alıcı verici ve onları sürmek için de iki adet entegre (2262 ve 2272) ile karşılaştım, hatta internette de bir amcanın da aynı yoldan geçtiğini ve üzerine sağlam bir analiz de yaptığını <a href="http://www.yggenyk.dk/wiki/Remote_controlled_switch_with_HX2262_and_HX2272">buldum</a>.<br />
<br />
Bu işlerden anlayan bir akadaşıma (<a href="http://iyiuykular.net/">Samet</a>) danıştım "ne yapalım protheus'ta falan çizsek olur mu?" diye, ama genel devre elemanları dışındaki elemanlar için simülasyonun çok mantıklı olmadığını söyledi ve kendiniz deneyip görün dedi.<br />
<br />
<a href="http://4.bp.blogspot.com/-tB5V30eYn10/UHGVhajVZgI/AAAAAAAABJ8/fbnHd3Wh9HY/s1600/5993619439_4630f62049_b.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/-tB5V30eYn10/UHGVhajVZgI/AAAAAAAABJ8/fbnHd3Wh9HY/s320/5993619439_4630f62049_b.jpg" width="320" /></a>Kuzenle biraz uğraşıp 433Mhz rf alıcı'dan gelen sinyalle bir şekilde role'yi süreriz diye başladık ise ama yaptığımız denemeler hep hüsranla sonuçlandı. Bakın karaköyden 10TL'ye aldığımız <b>433mhz alıcı-verici çifti ile olan ilk girişimimiz yanda</b>, aynı zamanda son da oldu bu. Sanırım aralara bir grup transistör ya da benzer bir şeyler falan da gerekiyordu (ne kadar anladığımı buradan anlayabilirsiniz).<br />
<br />
Bu tür şeyleri salt analog devreler ile yapabilmek için çok yetersiz olduğum aşikardı, protheus ile bir kaç deneme yapıp görerek anlayabilirim belki dedim üstelik de basit devre yapılarını anlamak için de faydalı olurdu bir simülatör. Önce protheusu wine ile çalıştırmaya çalıştım, sürekli patlayınca <b>sanal Windows makina içerisine kurduğum protheus/isis</b> kurdum ama gene bitmeyen dertleri ile uğraşmaya başlayıp üstüne de windows üzerinde çalışmaya karşı aşamadığım bir direncim ve linux'ta yapabildiğim bir çok şeyi Windows'ta yapamayıp kendimi çok rahatsız hissetmem eklenince durdum gene. Biraz da VMWare ve VirtualBox yerine açık kaynak olan KVM kullanmaya çalışmamın da etkisi var, gene amaçtan sapıp saçma notlarda takılmışım. Ama <b>hobi için yaptığım bir şeyi yapma sürecinde eğlenme beklentim oluyor ve Windows bunu elimden alıyor.</b><br />
<br />
Çevremde bu konular hakkında fikri olan bir kaç kişi de durmadan "<b>PIC ile yapabilirsin</b>" diyordu. Bu sayede bir çok karmaşık devre tasarımından kurtulabilecektim, ben de artık sadece basit devre elemanları ile başaramayacağımı kabul edip mikrodenetleyicilere kayayım yavaştan dedim. Yazılımdan anlıyor ve yeni dillere ve ortamlara hızlı uyum sağlayabiliyordum ne de olsa. Biraz PIC falan bakındım, kuzende bir <b>PIC yazıcı</b> ve bir kaç PIC vardı ama gene widows gerekmesi (sadece win sürücüsü vardı nanenin) ve PIC'in genellikle windows üzerinde yürüyen yapısı nedeniyle gene kaçtım yandan yandan. <b>Çevremde Linux üzerinde PIC ile uğraşan birileri olsa durum farklı olurdu belki.</b><br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://littlewire.cc/little-wire.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="240" src="http://littlewire.cc/little-wire.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Little Wire</td></tr>
</tbody></table>
Bir yıl kadar bir süredir unutmuştum bu konuyu ancak bir süre önce <b><b><a href="https://istanbulhs.org/">istanbul hakcerspace</a></b></b>'de <a href="https://istanbulhs.org/turkiye-oshw/">İhsan Kehribar'in anlatimi</a>na gittim, <a href="http://littlewire.cc/">little wire</a> diye bir şeyler anlatıyordu, aralarda "AVR programlayıcı değil" falan gibi şeyler diyordu. O günün karı benim için şunlar oldu ve aslında oldukça da karlı bir gündü,<b> sağol hackerspace</b>:<br />
<br />
<ol>
<li><b>PIC dışında da mikrodenetleyiciler var</b> (AVR) ve bunların da etkin kullanıcı grupları var,</li>
<li><b>Arduino</b> AVR programlamak için uygun ve çok kolay,</li>
<li><b>yurtdışından (özellikle çinden) parça getirtmek</b> karaköyden getirtmekten daha ucuz olabilir (ama çok uzun sürede gelir),</li>
<li>gerekirse az sayıda <b>PCB çinde uygun fiyata</b> bastırılabilir</li>
<li>Açık kaynak gibi bir de <b>açık donanım</b> akımı var ve günden güne güç kazanıyor</li>
<li>Elektronik hobicisi kimselerin kendi aralarında oturmuş bir alt-kültürü oluşmuş (<b>makers</b>)</li>
</ol>
Eve gelip bir kaç gün bakındım PIC gibi diğer mikrodenetleyicilere ve şunlarla karşılaştım:<br />
<ul>
<li>Microchip <a href="http://www.microchip.com/pic/">PIC</a></li>
<li>Atmel <a href="http://www.atmel.com/products/microcontrollers/avr/default.aspx">AVR</a></li>
<li>Texas Instruments <a href="http://www.ti.com/msp430">MSP430 </a></li>
</ul>
PIC, nedenini anlamadığım şekilde ülkemde standart olmuş, Karaköy'de PIC satışı yaygın ama AVR veya MSP430 için gördüğüm kadarıyla aynı şey geçerli değil. Ya da ben öyle biliyorum.<br />
<br />
<a href="http://iyiuykular.net/">Samet</a> de bir süredir MSP430 ve onun geliştirme kartı Launchpad'den bahsediyordu ama o bunlardan bahsederken neyin ne olduğunu anlamadığım için aslında benim de yapmaya çalıştığım şeye paralel olabilecek şeyler yaptığını anlamamıştım.<br />
<br />
Benim gibi hobicilerin (daha hiç bir şey yapmadan nasıl hobici oldum tartışılır) kullanması için <b>bir çok farklı geliştirme kartı mevcutmuş</b>. MSP430 için launchpad; pic için <a href="http://en.wikipedia.org/wiki/PICAXE">PICAXE</a>, oopic, <a href="http://en.wikipedia.org/wiki/PICKit">PICKit</a> gibileri varmış; AVR için olanları bilmiyorum çünkü işin aslı Arduino ile karşılaştıktan sonra AVR için olanları pek araştırmadım.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-PXEo7J1JhWw/UHHqsc6NU6I/AAAAAAAABKs/3KyJgmda8fY/s1600/512px-Arduino_Closeup.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img alt="By messi (Own work) [CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons (http://commons.wikimedia.org/wiki/File%3AArduino_Closeup.jpg)" border="0" height="240" src="http://4.bp.blogspot.com/-PXEo7J1JhWw/UHHqsc6NU6I/AAAAAAAABKs/3KyJgmda8fY/s320/512px-Arduino_Closeup.jpg" title="" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Arduino Uno</td></tr>
</tbody></table>
Arduino içinde de bir AVR var ve kendisi bir AVR programlayıcı olarak da kullanılabiliyor ve wiring diliyle (amaca özel üretilmiş C türevi dillerden güzel bir tanesi) çok rahat programlanabiliyor.<br />
<br />
Benim açımdan Arduino'nın görünen büyük faydalarından birisi <b>Linux kullandığım halde kendimi dışlanmış hissetmemek</b>. Oysa PIC kullanmaya çabaladığım dönemde MPLab ve proteus benim için yöklardı ama bulabildiğim her belge bir şekilde MPLab ile nasıl programlanabileceğini ve proteus'ta nasıl simüle edilebileceğini anlatıyordu. Ben bir çok şeyi ancak kendim yapınca kavrayabilen bir insanım.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-fruQqDFyw9U/UHHZ249y2HI/AAAAAAAABKc/QXikQfV8vjw/s1600/capture.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="198" src="http://1.bp.blogspot.com/-fruQqDFyw9U/UHHZ249y2HI/AAAAAAAABKc/QXikQfV8vjw/s200/capture.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Arduino IDE</td></tr>
</tbody></table>
Arduino'nun geliştirme ortamı linux windows ve maç'de aynı şekilde çalışıyor, <b>kurulumu vakit almıyor</b> (benim için sadece "apt-get ınstall arduino"). Bu da nette bulduğum örnek projelerden kimin nerede yaptığından bağımsız olarak faydalanabileceğim anlamına geliyor.<br />
<br />
Prototip geliştirmek için çok sayıda algılayıcı ve hazır bileşenleri <b>Arduino uyumlu eklenti</b> (<b><a href="http://shieldlist.org/">shield</a></b>) halinde bulmak mümkün. Hem de bir çoğu örnek kodlarla ve hatta özgür donanım olarak (yani isterseniz kendiniz de yapabilmeniz için gereken her şeyi açık).<br />
<br />
Üstüne üstlük yarın bir gün kurduğum devreyi basitleştirmek istediğimde yazdığım kodu basitçe daha uygun bir AVR'ye uyarlayıp yükleyebilecek ve tüm Arduino kartına gerek kalmadan sadece gereken elemanlar ile kurduğum daha basit devre ile kullanabileceğim (başarabilirsem tabii ki). Bütün bunlar biraz daha ucuz olsun diye tabii ki, evin orasına burasına bir dolu sensor bağlamak istersem her birine bir arduino kat harcamak çok pahalı olur.<br />
<br />
Arduino almaya karar verdikten sonra başlangıç yapabilmemi sağlayacak kit ararken bir çok kit bakındım ama sonuçta gene <b>dealextreme'den şunları sipariş verdim:</b><br />
<ul>
<li>92TL (51.60$) <b>Arduino Compatible UNO 2011 Component Basic Element Pack Starter Kit</b>-<a href="http://dx.com/p/142572">142572</a></li>
<li>99TL (55.10$) ARDUINO Compatible <b>37-in-1 Sensor Module Kit</b> - Black-<a href="http://dx.com/p/142834">142834</a> </li>
<li>7TL (3.9$) <b>Ultrasonic Sensor</b> Distance Measuring Module-<a href="http://dx.com/p/138563">138563</a></li>
<li>6.3TL (3.5$) IR Infrared <b>Motion Detection Sensor</b> Module (DC 5V~20V)-<a href="http://dx.com/p/139624">139624</a></li>
<li>3.5TL (2$) 38KHz <b>IR Infrared Transmitter</b> Module for Arduino-<a href="http://dx.com/p/135040">135040</a> </li>
</ul>
<b>Toplam ~ 210TL (116.1$)</b><br />
<br />
Dealextreme'den bu tür şeyleri almak iyi güzel ancak verdiğiniz siparişlerin ülkeme teslim süresi 1 ay kadar sürüyor. Bu yazıyı yazarken siparişimi vereli 28 gün olmuş (paketler de siparişten 9 gün sonra yola çıktılar) ve paketler hala Türkiye'ye girmiş görünmüyor veya bir yerlerde takıldı. Çinden almanın riski bu işte.<br />
<br />
Siparişimdeki ilk iki öğenin içindekiler de şunlar:<br />
<br />
<div>
<div>
<a href="http://img.dxcdn.com/productimages/sku_142572_1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="http://img.dxcdn.com/productimages/sku_142572_1.jpg" width="320" /></a><b>92 TL (51.60$) <a href="http://dx.com/p/142572">dealextreme'de Arduino Compatible UNO 2011 Component Basic Element Pack Starter Kit</a></b> </div>
<div>
- 1 x Arduino UNO board</div>
<div>
- 1 x Development expansion board</div>
<div>
- 1 x Breadboard</div>
<div>
- 1 x LED emitter kit (red / blue / yellow; each 5pcs)</div>
<div>
- 5 x 10K resistors</div>
<div>
- 5 x 1K resistors</div>
<div>
- 8 x 220R resistors</div>
<div>
- 1 x 74hc595</div>
<div>
- 2 x Buzzers</div>
<div>
- 1 x Seven-segment display (1-digit)</div>
<div>
- 1 x Seven-segment display (4-digit)</div>
<div>
- 10 x Push button switches</div>
<div>
- 3 x Light dependent resistors</div>
<div>
- 1 x Adjustable resistor</div>
<div>
- 1 x LM35 temperature sensor</div>
<div>
- 1 x 1602 LCD display</div>
<div>
- 1 x PS2 joystick</div>
<div>
- 1 x Stepping motor</div>
<div>
- 1 x Stepping motor driver board</div>
<div>
- 1 x Steering engine</div>
<div>
- 1 x RGB module</div>
<div>
- 30 x Breadboard cables</div>
<div>
- 10 x Dupont lines</div>
<div>
- 1 x 2.54mm pin header</div>
<div>
- 2 x Mercury switches</div>
<div>
- 1 x Flame sensor</div>
<div>
- 1 x Infrared receiver</div>
<div>
- 1 x USB cable (80cm)</div>
<div>
- 1 x Remote control (1 x CR2025 included)</div>
<div>
- 1 x Battery case</div>
</div>
<div>
<br /></div>
<div>
<a href="http://img.dxcdn.com/productimages/sku_142834_1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="http://img.dxcdn.com/productimages/sku_142834_1.jpg" width="320" /></a><br />
<div>
<b>99TL (55.10$) <a href="http://dx.com/p/35354">dealextreme'de ARDUINO Compatible 37-in-1 Sensor Module Kit - Black</a> </b></div>
<div>
- 1 x Small passive buzzer module KY-006</div>
<div>
- 1 x 2-color LED module KY-011</div>
<div>
- 1 x Hit sensor module KY-031</div>
<div>
- 1 x Vibration switch module KY-002</div>
<div>
- 1 x Photo resistor module KY-018</div>
<div>
- 1 x Key switch module KY-004</div>
<div>
- 1 x Tilt switch module KY-020 </div>
<div>
- 1 x 3-color full-color LED SMD modules KY-009</div>
<div>
- 1 x Infrared emission sensor module KY-005 </div>
<div>
- 1 x 3-color LED module KY-016</div>
<div>
- 1 x Mercury open optical module KY-017</div>
<div>
- 1 x Yin Yi 2-color LED module 3MM KY-029</div>
<div>
- 1 x Active buzzer module KY-012 </div>
<div>
- 1 x Temperature sensor module KY-013</div>
<div>
- 1 x Automatic flashing colorful LED module KY-034</div>
<div>
- 1 x Mini magnetic reed modules KY-021</div>
<div>
- 1 x Hall magnetic sensor module KY-003</div>
<div>
- 1 x Infrared sensor receiver module KY-022</div>
<div>
- 1 x Class Bihor magnetic sensor KY-035</div>
<div>
- 1 x Magic light cup module KY-027</div>
<div>
- 1 x Rotary encoder module KY-040</div>
<div>
- 1 x Optical broken module KY-010</div>
<div>
- 1 x Detect the heartbeat module KY-039</div>
<div>
- 1 x Reed module KY-025</div>
<div>
- 1 x Obstacle avoidance sensor module KY-032</div>
<div>
- 1 x Hunt sensor module KY-033</div>
<div>
- 1 x Microphone sound sensor module KY-038</div>
<div>
- 1 x Laser sensor module KY-008</div>
<div>
- 1 x 5V relay module KY-019</div>
<div>
- 1 x Temperature sensor module KY-001</div>
<div>
- 1 x Temperature sensor module KY-028</div>
<div>
- 1 x Linear magnetic Hall sensors KY-024</div>
<div>
- 1 x Flame sensor module KY-026</div>
<div>
- 1 x Sensitive microphone sensor module KY-037</div>
<div>
- 1 x Temperature and humidity sensor module KY-015</div>
<div>
- 1 x XY-axis joystick module KY-023</div>
<div>
- 1 x Metal touch sensor module KY-036</div>
<div>
- 1 x Box</div>
</div>
<br />
<br />
Geliştirmeye başlamak için dikkatimi çeken ülkemdeki alınabilir kitleri not almıştım. Aşağıda, özellikle robitshop inanılmaz yüksek fiyat çekmiş sanki ama gördüğüm kadarıyla fiyat konusunda dealextreme ile yarışabilecek durumda değiller.<br />
<div>
<div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-rl8ZBaV72-Q/UHImctJ6a6I/AAAAAAAABK8/Ehtu7nDFULM/s1600/SIK_Update_no_Overlays.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="from https://www.sparkfun.com/products/11227 [CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0)]" border="0" height="320" src="http://2.bp.blogspot.com/-rl8ZBaV72-Q/UHImctJ6a6I/AAAAAAAABK8/Ehtu7nDFULM/s320/SIK_Update_no_Overlays.jpg" title="" width="320" /></a></div>
<b>178.78 TL ($94.95)<a href="https://www.sparkfun.com/products/11227">SparkFun Inventor's Kit for Arduino</a></b></div>
<div>
<b>243,08 TL (%36 daha pahali) <a href="http://www.robitshop.com/Arduino-Uno-SMD-Gelistirme-Kiti-SparkFun-Inventors-Kit-for-Arduino,PR-2034.html">robitshop'ta sanirim aynisi</a></b></div>
<div>
* Arduino Uno R3</div>
<div>
* Arduino and Breadboard Holder</div>
<div>
* New and Improved SIK Manual</div>
<div>
* Translucent Red Bread Board</div>
<div>
* 74HC595 Shift Register</div>
<div>
* 2N2222 Transistors</div>
<div>
* 1N4148 Diodes</div>
<div>
* DC Motor with wires</div>
<div>
* Small Servo</div>
<div>
* 5V Relay</div>
<div>
* TMP36 Temp Sensor</div>
<div>
* Flex sensor</div>
<div>
* Softpot</div>
<div>
* 6' USB Cable</div>
<div>
* Jumper Wires</div>
<div>
* Photocell</div>
<div>
* Tri-color LED</div>
<div>
* Red and Yellow LEDs</div>
<div>
* 10K Trimpot</div>
<div>
* Piezo Buzzer</div>
<div>
* Big 12mm Buttons</div>
<div>
* 330 and 10K Resistors</div>
<div>
* Male Headers</div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.robotistan.com/modules/catalog/products/pr_01_955_max.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="213" src="http://www.robotistan.com/modules/catalog/products/pr_01_955_max.jpg" width="320" /></a></div>
<b>118,00 TL <a href="http://www.robotistan.com/Arduino-Super-Baslangic-Seti-Kitapsiz,PR-955.html">Robotistan'da Arduino Super Baslangic Seti (Kitapsiz)</a></b></div>
<div>
Yukardaki kite benziyor farkları gördüğüm kadarıyla şunlar (olmayanlar için başa "-", fazladan olanlar için "+" koydum), aslında ucuz ve alınabilir gibi:</div>
<div>
- 74HC595 Shift Register</div>
<div>
- Small Servo</div>
<div>
- 5V Relay</div>
<div>
- Softpot</div>
<div>
- Piezo Buzzer</div>
<div>
- Male Headers</div>
<div>
- Flex sensor</div>
<div>
- New and Improved SIK Manual</div>
<div>
- Arduino and Breadboard Holder</div>
<div>
+ 16x2 LCD ekran (yeşil)</div>
<div>
+ 7 Segment Display</div>
<div>
+ AT24C02 EEPROM</div>
<div>
+ 9V Pil Başlığı</div>
<div>
+ 7" Mano Malzeme Kutusu</div>
</div>
<div>
<br /></div>
<div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-iBa3yOklx7I/UHInJM66UzI/AAAAAAAABLE/y182ceksPsY/s1600/11226-03c.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="from https://www.sparkfun.com/products/11226 [CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0)]" border="0" height="320" src="http://2.bp.blogspot.com/-iBa3yOklx7I/UHInJM66UzI/AAAAAAAABLE/y182ceksPsY/s320/11226-03c.jpg" title="" width="320" /></a></div>
<b>107 TL ($59.95) <a href="https://www.sparkfun.com/products/11226">Sparkfun'da Starter Kit for Arduino - Flex</a></b></div>
<div>
<b>169,45 TL (%57 daha pahali) <a href="http://www.robitshop.com/Arduino-Starter-Kit-UNO-R3,PR-12.html">robitshop'ta sanirim eski modeli</a> </b></div>
<div>
* Arduino UNO: En yeni Arduino USB kartı, eksiksiz olarak montajlı ve test edilmiş.</div>
<div>
* 15 cm USB A’dan B’ye kablo</div>
<div>
* Mini Breadboard</div>
<div>
*
Jumper Wires Premium 3'' M/M Pack of 10: Bunlar, dişi bağlantıları
Arduino üzerinden bileşenlere ve breadboard’a bağlantı kurmanıza izin
veren yüksek kalitedeki kablolardır.</div>
<div>
* Fotosel: Çevredeki ışığı algılamaya yarayan sensör. Bir
çekmecenin açılmasını ya da gece vaktinin geldiğini algılama işleri için
uygun.</div>
<div>
* Isıl Direnç: Çevre sıcaklığını ve sıcaklık değişimlerinin algılamaya yarayan sensör.</div>
<div>
* Üç Renkli LED: Bu LED’i ihtiyaç duyduğunuz herhangi bir rengi PWM ile karıştırmak için kullanın.</div>
<div>
* Temel LED'ler</div>
<div>
*
Linear Trimpot: Aynı zamanda değişken direnç olarak bilinmektedir, bu
cihaz genel olarak ses kontrolü, kontrast için kullanılmaktadır ve genel
kontrol girişi için iyi bir cihazdır.</div>
<div>
* Buzzer: Harika, kafa patlatan sesler, alarmlar ve belki de müzik yapabilirsiniz!</div>
<div>
* 12mm buton</div>
<div>
* 330 Ohm Dirençler</div>
<div>
* 10K Direnç</div>
<div>
* Titreşim sensörü: Titreşimleri algılamanıza yarayan sensör.</div>
</div>
</div>
<br />Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com3tag:blogger.com,1999:blog-6143385653724330717.post-82779967489312997412012-09-28T11:54:00.002+01:002012-10-08T02:14:07.952+01:00Raspberry Pi ile ortam yürütücüBir süredir evde salondaki projector (720p) ile kullanmak için bir ortam yürütücü cihaz uydurasım vardı ama 1) çok para yatırmak istmiyordum 2) üzerinde linux koşan bir cihaz alayım da farklı işleri de üzerine yıkabileyim diye düşünüyordum.<br />
<br />
Salonda film izlemek istediğimizde sürekli olarak içerden laptop'u getir, harici disk'i getir gibi uğraşlara girmek sıkıntı verici oluyor. Biraz da lüks ve böyle linuxlu minukslu oyuncak peşindeyim açıkçası. <br />
<br />
<a href="http://4.bp.blogspot.com/-A-03fAESzF8/UGWv7XjvMXI/AAAAAAAABJs/G0gNDdwlMoU/s1600/dg_dream800hd.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="146" src="http://4.bp.blogspot.com/-A-03fAESzF8/UGWv7XjvMXI/AAAAAAAABJs/G0gNDdwlMoU/s200/dg_dream800hd.jpg" width="200" /></a>Bir süre Dreambox alayım diye düşündüm, biraz araştırdım. Evde kablonet vardı ve DVB-C modülü olan bir Dreambox almam gerekiyordu ve türkiyede bulamadım ya da bulduklarım hep pahalıydı, yurtdışından da bu tür bir cihaz getirtme riskine girmedim.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-YDfEGIt5W2A/UGWuq5q_wOI/AAAAAAAABJU/SoZ0xBvXR9E/s1600/Raspi_Iso_Blue.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="234" src="http://1.bp.blogspot.com/-YDfEGIt5W2A/UGWuq5q_wOI/AAAAAAAABJU/SoZ0xBvXR9E/s320/Raspi_Iso_Blue.png" width="320" /></a></div>
<a href="http://4.bp.blogspot.com/-DHiojhDvc-A/UGWvC5NlBhI/AAAAAAAABJk/UJZ_BDWTycE/s1600/800px-RaspberryPi.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="133" src="http://4.bp.blogspot.com/-DHiojhDvc-A/UGWvC5NlBhI/AAAAAAAABJk/UJZ_BDWTycE/s200/800px-RaspberryPi.jpg" width="200" /></a>Aylar sonra geçenlerde gaza gelip Raspberry PI sipariş ettim. Üzerine bir <a href="http://xbmc.org/">XBMC </a>kurup HDMI çıkışından projectore de sabitleyebileceğim, raspberry'i de projector'ün masasının altına sabitleyip ortalıktan gizleyebileceğim. Üstelik üzerine torrent client ve benzeri uygulamalar da kurabilmek de güzel oalcak gibi.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
Bir de evde arka odadaki bilgisayardaki disklerdeki filmeleri izlemek için o diski bir şekilde zeroconf, upnp ya da nfs gibi bir şeylerle wireless üzerinden raspberry'e taşımayı düşünüyorum.<br />
<br />
Ama raspberry alınca bir grup daha malzemeye ihtiyacınız oluyor: <br />
<ul>
<li>işletim sisteminin duracağı bir SD card</li>
<li>bir microusb kablo</li>
<li>ikiden fazla USB cihaz istiyorsanız, (fare, klavye, wireless kart) bir USB hub</li>
<li>harici disk gibi USB'den güç çeken bir cihaz bağlayacaksanız güç beslemesi dışardan olan (prize takılan) bir USB hub (raspberry USB'den sınırlı miktarda güç verebiliyor)</li>
<li>eğer klavye ve fare taşımak istemiyorsanız birer tane de kalvye ve fare gerek </li>
<li>ekrana bağlayabilmek için hdmi kablo ya da svideo kablosu</li>
</ul>
SD card alırken biraz araştırdım bu nanelerin <a href="http://en.wikipedia.org/wiki/Secure_Digital#Speed_Class_Rating">farklı hızlarda olanları var</a> ve hızlı olanlar daha pahalı, class 10 en hızlısı.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://img.dxcdn.com/productimages/sku_35354_2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" border="0" height="200" src="http://img.dxcdn.com/productimages/sku_35354_2.jpg" title="" width="200" /></a></div>
<a href="http://2.bp.blogspot.com/-cnCOJYn6HhU/UGWusia59oI/AAAAAAAABJc/t3bo2kFLQK0/s1600/sku_35354_2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a>Bir de klavye ve fare için de bir uzaktan kumanda boyutunda ve üzerinde laptop dokunmatiği gibi fare alanı olan ikisi bir arada bir cihaz aldım, nasıl bir şey olduğunu <a href="http://dx.com/p/35354">sayfasının</a> alt tarafındaki video'dan izleyebilirsiniz, bu nane eğlenceli bir şeye benziyor. Buyrun resmi de yanda.<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Bunları sağlamak için para harcadığım parça listesi:<br />
<ol>
<li>43$ (77.3TL) <b><a href="http://www.raspberrypi.org/">Raspberry Pi</a></b> </li>
<li>31.99$ (57.54TL) <a href="http://dx.com/p/35354"><b>Wireless Keyboard with TrackPad</b></a></li>
<li>11.90$ (21TL) <a href="http://dx.com/p/10679">8GB SDHC <b>SD Card (Class 10)</b></a></li>
<li>10.40$ (18.7TL) <a href="http://dx.com/p/33299">7-Port <b>USB 2.0 Hub with External Power Source</b> </a></li>
<li>7.50$ (13.5TL) <a href="http://dx.com/p/35897">USB 2.0 802.11n/g/b <b>Wireless Network Adapter</b></a> </li>
<li>3.40$ (7TL) <a href="http://dx.com/p/27449">Gold Plated 1080i <b>HDMI</b> V1.3 M-M Connection Cable </a> </li>
</ol>
<b>Toplam: 108$ (193TL)</b><br />
<br />
<b>Üzerinde linux çalışan (debian), hdmi çıkışı olan, klavye ve fareli uzakdan kumandalı, dışardan istediğim cihazı bağlayabileceğim, kablosuz baplantıya izin veren bir cihaz için oldukça iyi bir ücret bence.</b><br />
<br />
Raspberry Pi dışındaki parçaları <a href="http://dx.com/">DealExtreme</a>'den aldım (bizim 1 milyoncuların Çin versiyonu bu), siparişler 30 gün içerisinde üstelik kargo ücreti olmadan geliyor. Siparişinizin gümrüğe takılma ihtimali var ama siparişinizi 100$ altında tutarsanız muhtemelen takılmıyorlar (burada durum biraz Allah'lık). Daha önce deal extreme'den iki kez sipariş verdim ve ikisinde de aldığım ürünler bana ulaştı. Ama 30 gün çok üzün bir süre haberiniz olsun, aldığınız ürünler onları aldığınızı unuttuğunuz zman elinize ulaşıyor.<br />
<br />
Raspberry Pi'ı da alabileceğiniz iki satıcı var zaten hangisinden aldığınız çok farketmiyor sanırım ama ben alırken teslim süresi için 13 hafta diyordu. Umarım çok beklemem.<br />
<br />
Ben sipariş vereli daha sadece 2 hafta oldu, sanrım 1 ay içinde elimde olurlar. Aletleri alıp kurcaladıktan sonra sonuçları buraya yazarım.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com2tag:blogger.com,1999:blog-6143385653724330717.post-74507768962258180012012-08-01T04:26:00.001+01:002012-08-01T04:44:42.457+01:00REST API yazarken nelere dikkat etmeli<br />
Bir süre önce şirkette kullandığımız bir uygulama için API yazmamız gerekince REST ile yapayım diyerekten bu konuda biraz araştırma yapıp notlar almıştım, paylaşsam birilerinin işine yarayabilir belki diyerek buraya da koyuyorum.<br />
<br />
REST in maalesef yaygin kabul görmüş bir standartı yok. Ancak REST yapısı genellikle HTTP metodlarına dayandığı için ideal bir REST servisi dendiğinde HTTP protokolünü adam gibi uygulamış olması ve genel URL ilkelerine uyulması gibi genel bir beklenti var.<br />
<br />
HTTP: <a class="reference external" href="http://www.ietf.org/rfc/rfc2616">http://www.ietf.org/rfc/rfc2616</a> (Hypertext Transfer Protocol -- HTTP/1.1)<br />
URI in WWW: <a class="reference external" href="http://www.ietf.org/rfc/rfc1630">http://www.ietf.org/rfc/rfc1630</a> (A Unifying Syntax for the Expression of Names and Addresses of Objects on the Network as used in the World-Wide Web)<br />
<br />
<div class="section" id="api-versiyonu">
<h2>
API Versiyonu</h2>
Versiyon bilgisine sunduğunuz API'de bir şekilde yer vermeniz özellikle önemli çünkü yazdığınız API kullanılmaya başlandığında artık onu değiştiremeyeceğinizi farkedeceksiniz.<br />
<br />
API'nizin versiyonu Path'in içinde, "Query String" olarak ya da HTTP header olarak olabilir.<br />
<br />
Path:<br />
<blockquote class="tr_bq">
GET /v1/users/bekir HTTP/1.1</blockquote>
Query String:<br />
<blockquote class="tr_bq">
GET /users/bekir?version=1 HTTP/1.1</blockquote>
Version Header:<br />
<blockquote class="tr_bq">
GET /user/123 HTTP/1.1<br />
Host: api.example.com<br />
X-API-Version: 1<br />
Accept: application/json</blockquote>
Accept Header:<br />
<blockquote class="tr_bq">
GET /user/123 HTTP/1.1<br />
Host: api.example.com<br />
Accept: application/json-v1</blockquote>
İşin aslı URL'in tanımına bakınca bir kaynağın tek bir URL'i olması gerekli ve bu bağlamda path'e "/v1/" eklenmesi ilgili kaynağın bir kaç farklı URL'i olması gibi geçersiz görünen yöntem oluyor ancak burada teknik anlamda ideal olan yerine daha çok pratik yöntemi seçmek bana daha akıllıca geliyor.<br />
<br />
Versiyon bilgisini Path'in bir parçası haline getirmek şu dertleri çözüyor:<br />
<ul class="simple">
<li>Birden fazla versiyonu aynı anda yükleyebiliyor ve bir diğerini etkilemeden güncelleme/hata düzeltmeleri yapabiliyorsunuz,</li>
<li>Bir versiyon için yaptığınız yükleme işlemi diğer versiyonları etkilemiyor,</li>
<li>Sunucu'da farklı yapılandırmalar ile yönetebiliyorsunuz, hatta farklı sunucuya koymanız da kolay oluyor,</li>
<li>Farklı dizinlerde kurulu ve kendi path'lerinde çalışan farklı veriyonları aynı anda kullanırken hata ayıklamak çok daha kolay oluyor, genellikle loglarını da ayırmış oluyorsunuz zaten bu yöntemle.</li>
</ul>
<div>
<br /></div>
</div>
<div class="section" id="kimlik-dogrulama">
<h2>
Kimlik doğrulama</h2>
Her istekte kullanıcı adı ve parola göndermek çok mantıklı değil, bu yöntemi tercih etmeyin:<br />
<blockquote class="tr_bq">
GET http://api.example.com/v1/songs?artist=michael&username=[apiuser]&pass=[apipass]</blockquote>
Eğer kodunuzu bu şekilde yazarsanız şu durumlar oluşabilir:<br />
<ul class="simple">
<li>Özellikle GET metodu kullandığınızda URL icinde giden bu gibi istekler sunucularda öntanımlı olarak loglanırlar ve loglarda kullanıcı adı ve parolaları görmek çok takdir alan bir davranış değildir.</li>
<li>her istekte yetkilendirme bilgileri tekrar ve açık olarak gönderilir</li>
</ul>
Yukarıdaki yontem yerine en azından HTTP Basic Auth kullanabilirsiniz ama bu senaryoda da her istekle login bilgisini göndermeniz gerekiyor. Gene de bu yöntemi tercih edebilirsiniz.<br />
<br />
Yukarıdaki yöntemleri kullanmak yerine en azından kullaniciniza bir token dönen ayrı bir istek olusturup, login bilgisinin POST ile buraya gönderilmesini sağlayın (genellikle <tt class="docutils literal">/auth</tt> path'i kullanılıyor.)<br />
<blockquote class="tr_bq">
POST https://api.example.com/v1/auth<br />
Host: api.example.com<br />
...<br />
username=[apiuser]&pass=[apipass]</blockquote>
Geriye geçici bir süre geçerli olacak bir <tt class="docutils literal">token</tt> dönebilirsiniz, istemci sonraki isteklerinde bu token'i kullanarak gelebilir (Query String ya da HTTP header ile alabilirsiniz Token'i), bu sayede loglara erisimi birisi kullanıcıya ait kritik bilgileri göremez ve oturumunu ontanımlı ayarları değiştirilmemiş bir sunucu üzerinden çalamaz. Ancak bu yöntem sizi bir çok kötü durumdan koruyamaz.<br />
<br />
Halka açık bir API geliştiriyorsanız en uygun yöntem OpenID+OAuth gibi yöntemler kullanın. Kendizinkini keşfetmeye çalışmayın, çok zaman alır ve büyük hatalar yapabilirsiniz. Konu güvenlik olunca uzman değilseniz kendize güvenmemek daha güvenilir oluyor.<br />
<br />
Kimlik doğrulama adımları için her zaman "https" kullanın, http isteklerini izlemek fazla kolay.<br />
Daha çok çeşitli yöntemler de mevcut ancak şimdilik bu kadarı yeterli sanirim.<br />
<br /></div>
<div class="section" id="belgeleme">
<h2>
Belgeleme</h2>
<dl class="docutils">
<dt><strong>Yardım sayfası</strong></dt>
<dd>Belgeleriniz için dev.example.com, developer.example.com adreslerini tercih edebilirsiniz.</dd>
<dt><strong>Yönlendirme</strong></dt>
<dd>API'nizin kök adresine bir tarayıcıdan ile gelen GET istelerini API'nin belgelerinin olduğu yere yönlendirmeniz kullanacak insanlara çok yardım eder.</dd>
<dt><strong>Test sayfası</strong></dt>
<dd>İnsanlara servisinizi tarayıcıdan test edebilecekleri bir arayüz sunarsanız çok mutlu olurlar. (Ama bu durum servisinizde sadece GET ve POST yazarsanız mümkün olabilir, aşağıda PUT, DELETE ve PATCH gibi işlevleri de kullanmanız durumunda size yardımcı olabilecek bir çakallıktan ayrıca bahsettim.)</dd> </dl>
API'nizin yardım sayfalarında şunlara yer vermeniz gerek:<br />
<ul class="simple">
<li>hangi kaynaklar (Path) bulunuyor</li>
<li>farklı kaynakların hangi özellikleri mevcut,</li>
<li><strong>en önemlisi</strong> her olası istek için (Header'ları da içeren) örnek istek ve cevap</li>
<li>eğer API'nizin versiyonları varsa (ki bence her türlü olmalı) belgelerinizi de versiyonlarsanız güzel olur</li>
<li>farklı programlama dillerinde nasıl kullanılabileceğini anlatan örnekler koyarsanız daha güzel olur</li>
</ul>
<div>
<br /></div>
<ul class="simple">
</ul>
</div>
<div class="section" id="cevap-donus-bicimleri">
<h2>
Cevap(Dönüş) biçimleri</h2>
Servisinizin cevaplarını XML, HTML, JSON gibi formatlarda dönebilirsiniz. Bunları aynı anda desteklemeniz de mümkün ancak hangi durumda hangi tip cevap göndereceğinize karar vermeniz için bir kaç yöntem mevcut.<br />
Uzantı kullanımı: İsteğinizi gönderirken şu formatta gönderebilirsiniz:<br />
<blockquote class="tr_bq">
GET /v1/users.json?username=bekir<br />
<br />
GET /v1/users/bekir.json</blockquote>
Query String Kullanımı:<tt class="docutils literal">format</tt> gibi bir anahtar kelime ile:<br />
<blockquote class="tr_bq">
GET /v1/users?format=json</blockquote>
<br />
"Accept" HTTP Header: İsteği yaparken istediğimiz cevap formatını isteğin başlığında iletebilirsiniz:<br />
<blockquote class="tr_bq">
GET /v1/users?username=bekir<br />
Host: api.example.com<br />
Accept: application/json<br />
...<br />
<br />
HTTP/1.1 200 OK<br />
Content-Type: application/json</blockquote>
Her üç durumda da döndüğünüz cevabın HTTP Header'ında "Content-Type" değerini göndermek gerekli. Bir yöntemin diğerlerine üstün olup olmadığı hakkında bir yorumum yok, ucunu birlikte kullanmanızda da bir sakınca yok.<br />
<br />
Uzantı olarak yazmak insan olarak basta daha sıcak geliyor ancak bir içeriğin tek bir URL'i olması ilkesini çiğnediği için servisinizi REST olmaktan uzaklaştırıyor.<br />
<br /></div>
<div class="section" id="crud-islemleri">
<h2>
CRUD işlemleri</h2>
REST API'lerde genellikle bir liste ifade eden koleksiyonlar ve onların içinde yer alan ögeler bulunurlar. Bu öğeler üzerinde uygulanan işlemler genellikle CRUD olarak ifade edilir ve bunları gerçeklemek için uygun HTTP metodları tercih edilir.<br />
<ul class="simple">
<li>create (yarat, POST)</li>
<li>read (oku/getir, GET)</li>
<li>update (güncelle, PUT/PATCH)</li>
<li>delete (sil, DELETE)</li>
</ul>
API'nizde PUT/PATH/DELETE gibi çağrılar kullanmak istemeyebilirsiniz, bunun nedenleri genellikle şunlardır:<br />
<ul class="simple">
<li>API'nizin kullanıcıları GET ve POST dışındaki HTTP metodlarından haberdar olmayabilir</li>
<li>API'nizin tarayıcılar üzerinden de kolaylıkla çalışmasını ver test edilebilmesini isteyebilirsiniz</li>
</ul>
Eğer siz de benim gibi tarayıcılardan test edilebilen bir API istiyorsanız HTTP "method override" yönteminden faydalanabilir ya da REST uyumluluğunuzu biraz daha kırarak URL'lerinize eylemler ekleyebilirsiniz.<br />
<br />
<div class="section" id="method-override">
<h3>
Method Override</h3>
PUT/POST/DELETE yerine POST kullanabilir ve Query string ile isteğinizin bu 3 tarayıcı dışı çağrı gibi yorumlanmasını sağlayabilirsiniz.<br />
<br />
Bu yöntem normal çalışma yapınızı kırmaya zorlamadan tarayıcılar üzerinde de çalışan test sayfaları oluşturacaksanız işinize yarar ve istekleri ele alan katmanın önüne ekleyeceğiniz basit bir kod ile<br />
<blockquote class="tr_bq">
POST /users/bekir?method=put<br />
<br />
POST /users/bekir?method=delete</blockquote>
Ya da benzer şekilde HTTP header'larından faydalanabilirsiniz:<br />
<blockquote class="tr_bq">
POST /users/bekir HTTP/1.1<br />
Host: api.example.com<br />
X-HTTP-Method-Override: DELETE<br />
...</blockquote>
</div>
<div class="section" id="eylemin-path-uzerinde-verilmesi">
<h3>
Eylemin path uzerinde verilmesi</h3>
CRUD işlemlerini path'e gömebilirsiniz, ancak REST uyumlu bir API geliştiriyorsanız bu yöntem hatalı kullanım olarak yorumlanır. GEnel pratik olarak URL'lerde eylemlere yer verilmemelidir.<br />
create:<br />
<blockquote class="tr_bq">
POST /users/bekir/create</blockquote>
update:<br />
<blockquote class="tr_bq">
POST /users/bekir/update</blockquote>
delete:<br />
<blockquote class="tr_bq">
POST /users/bekir/delete</blockquote>
Bu yöntemin en büyük olumsuz yönü yapıya hakim olmayan insanların yeni eylemler eklemeye çalışması. Yeni gelen bir kişi farkında bile olmadan yeni bir eylem ekleyiverir ve mevcut CRUD yapınız daha siz farkına biel varmadan kırılır:<br />
<blockquote class="tr_bq">
POST /users/bekir/move</blockquote>
</div>
</div>
<div class="section" id="koleksiyonlar-ve-ogeler">
<h2>
Koleksiyonlar ve Öğeler</h2>
Koleksiyonlar için çoğul isim tercih edin, bu sayede tek bir kayıt dönen bir URL olmadığı daha anlaşılır oluyor ve kullanan kişiye yardımcı oluyor.<br />
<div class="section" id="create">
<h3>
create</h3>
Yeni öğe yaratmak için:<br />
<blockquote class="tr_bq">
POST /v1/users/bekir<br />
<br />
HTTP/1.1 201 Created</blockquote>
Yeni kolksiyon oluşturmak genellikle sık karşılaşılmayan bir durum ancak gene de gerekli ise öğe yaratıeken kullandiginiz yöntemleri izleyebilirsiniz.</div>
<div class="section" id="read">
<h3>
read</h3>
Bir koleksiyon içindeki ögeleri sorgulamak için:<br />
<blockquote class="tr_bq">
GET /v1/users</blockquote>
Ya da bir öğeyi edinmek için:<br />
<blockquote class="tr_bq">
GET /v1/users/bekir</blockquote>
<strong>koleksiyon hakkında</strong><br />
Eger kullandığınız koleksiyona dair bilgileralmak isterseniz <tt class="docutils literal">/info</tt> gibi bir path eklentisi kullanabilirsiniz:<br />
<blockquote class="tr_bq">
GET /v1/users/info</blockquote>
<strong>koleksiyonlarda sayfalama</strong><br />
Çok fazla ya da sınırsız sayıda öğenin bulunduğu durumlar için sayfalama yapmak gerekebilir, bu durumda şöyle yapılar kullanabilirsiniz:<br />
<blockquote class="tr_bq">
GET /v1/users?offset=200&count=100<br />
<br />
GET /v1/users?page=2&count=100</blockquote>
<strong>koleksiyon içerisinde filtreleme/arama</strong><br />
koleksiyonlarda filtreleme/sorgulama yapmak isterseniz "Query String"lerden faydalanabilirsiniz:<br />
<blockquote class="tr_bq">
GET /v1/users?uid=1053<br />
<br />
GET /v1/users?lastname=doğan</blockquote>
<strong>sonuç içinde istenen alanlar</strong><br />
Eğer sorgu sonucunda bütün alanları değil de sadece belli alanları istiyorsanız <tt class="docutils literal">fields</tt> gibi bir anahtar kelime ile bunu yapabilirsiniz:<br />
<blockquote class="tr_bq">
GET /v1/users?fields=displayname,team,department</blockquote>
</div>
<div class="section" id="update">
<h3>
update</h3>
Koleksiyonlar üzerinde güncelleme konusuna girmiyorum. Ancak öğeler üzerinde güncelleme yapmak için:<br />
<blockquote class="tr_bq">
PUT /v1/users/bekir</blockquote>
<strong>Kısmi güncellemeler</strong>: PUT metodu genellikle tüm öğeyi güncellemek için kullanılır ancak tüm öğeyi değil de sadece belirli alanlarını güncelleyeceksek PATCH metodunu kullanabiliriz:<br />
<blockquote class="tr_bq">
PATCH /v1/users/bekir</blockquote>
</div>
<div class="section" id="delete">
<h3>
delete</h3>
Koleksiyon silmek de pek sık karşılaşılmayan bir durum ancak gerekirse bir koleksiyonu silmek için:<br />
<blockquote class="tr_bq">
DELETE /v1/user/bekir/playlists/benden+size</blockquote>
silme işlemi genellikle koleksiyon dahilindeki öğeler için uygulanıyor:<br />
<blockquote class="tr_bq">
DELETE /v1/users/bekir</blockquote>
</div>
</div>
<div class="section" id="hata-durumlari">
<h2>
Hata Durumları</h2>
HTTP durum kodlarını doğru kullanın ( <a class="reference external" href="http://tr.wikipedia.org/wiki">http://tr.wikipedia.org/wiki</a>/HTTP_durum_kodlar%Ç4%B1 ), hata kodları bilgisayarlar içindir ve hata durumları için uygun durum kodları kullanmazsanız API kullanıcılarınızı metin ayrıştırmaya zorlarsınız.<br />
<br />
Hata cevabınızda genel bir şablon belirleyin ve insanların anlayabileceği de bir mesaj alanınız daima olsun. Gelen istek ne olursa olsun hata durumunda belirlediğiniz şablona uyun.<br />
<br />
HTTP durum kodunu hata şablonunuzun içine de fazladan eklemek genellikle mantıklı bir yöntem oluyor, API kulanıcılarınız hatayı ayrıştırırken daha rahat ederler.<br />
<blockquote class="tr_bq">
GET /companies/acme/customers?token=1234 HTTP/1.1<br />
Host: api.exampla.com<br />
...<br />
<br />
HTTP/1.1 403 Forbidden<br />
Content-Length: ...<br />
...<br />
<br />
{"status": 403, "message": "You are not auhtorized to access this content."}</blockquote>
Not: Yazımda sıkça kullandığımız terimleri Türkçe'ye çevirmedim. Bu şekilde yarı türkçe yarı ingilizce bir yazı okumak rahatsız edici olabiliyor ancak bu şekilde yapmasaydım anlaşılırlıktan fazlaca taviz vermem gerekecekti.</div>Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com3tag:blogger.com,1999:blog-6143385653724330717.post-2274897092010561822012-05-11T08:06:00.001+01:002012-05-11T10:10:37.255+01:00IETT'nin sagladigi otobus konum bilgisiMobil cihazlar için 2 gencin geliştirdiği gayet güzel çalışan <a href="http://nerdebuotobus.com/">Nerde bu Otobüs</a> adlı bir uygulama var, istanbulda otobüs bekleyen bir çok insanın en büyük yardımcısı, harita üzerinde otobüslerin konumlarını gösteriyor ve bu sayede beklediğim otobüsün bulunduğum durağa ne zaman otobüs geleceğini tahmin edebiliyorum. Aşağıdaki testleri ve denemeleri yapana kadar otobüs konum bilgilerinin sık sık güncellendiğini düşünüyordum, Nerde bu Otobüs uyglamasının internet'teki <a href="http://nerdebuotobus.com/faq.aspx">sss sayfasında</a> da hat bilgilerinin 4 dakikada bir güncellendiği'ne dair bir ibare var. Uygulamanın sağladığı otobüs konumlarının güncellenip güncellenmediğini heniz tam test etmedim ama bu güncelleme sadece İETT'nin sağladığı verileri sorgulama sıklığı olabilir ki İETT zaten en sık yarım saatte bir kez güncelleme yapıyor gibi.<br />
<div>
<br /></div>
<div>
Verileri nereden alıyor bu amcalar, bunun daha düzgünü de yapılabilir diyerek kayınçoyla oturup biraz (2 saatten uzun sürdü hepsi) inceledik. önce <a href="http://mobil.iett.gov.tr/">http://mobil.iett.gov.tr/</a> sayfasındaki <a href="http://3n.iett.gov.tr/">otobüsüm nerede</a> bağlantısını farkettik, herhalde buralardan alıyorlar verileri diye düşündük. Ama ayrıştırması çok zor bir veri gibi görünüyordu.<br />
<div>
<br /></div>
<div>
Sonra asıl uygulamanın veriyi nasıl çektiğine bakalım dedik ve nasıl yapsak, nasıl yapsak diye düşünürken şöyle bir yöntem bulduk: Benim android telefonumu <a href="https://play.google.com/store/apps/details?id=org.sshtunnel&hl=en">SSHTunnel</a> ile bilgisayarım üzerinden proxy'ledik ve bilgisayarda <a href="http://www.wireshark.org/">wireshark</a> ile trafiği izlerken "nerde bu otobüs"ü açtık hat listesi aldık, otobüs konumlarını aldık, şöyle bir gezindik. Uygulamanın arka tarafındaki servis düz HTTP olduğu için güzelce eriştiği bütün URL'leri alabildik.<br />
<br /></div>
<div>
Nerde bu Otobüs uygulamasının arka tarafı ASP ile yazılmış, zaten <a href="http://arda.develioglu.com/#/about-me">gelistiren</a> <a href="http://www.kemalkocabiyik.com/">cocuklar</a> da Microsoft Student Partner'lar falan, benim tabirimle microsoft'çu çocuklar (maalesef M$ bu yetenekli gençleri daha okulları bitmeden kazanmış bile). Baktık uygulama verileri kendi sitelerinden <a href="http://nerdebuotobus.com/getLineBusses.aspx?line=19Z&points=1">http://nerdebuotobus.com/getLineBusses.aspx?line=19Z&points=1</a>, <a href="http://nerdebuotobus.com/getLineStopSchedules.aspx?line=19B&stop=A1871&output=json">http://nerdebuotobus.com/getLineStopSchedules.aspx?line=19B&stop=A1871&output=json</a> gibi URL'ler ile çekiyor.</div>
<div>
<br /></div>
<div>
<div>
Sonra bu verilerin iett'nin mobil sitesinde bulduğumuzdan çok daha düzgün yapıya sahip olduğu sonucuna varıp başladık fikir yürütmeye. Kendi çapında uygulama geliştiren iki gencin İETT ile anlaşması olamaz, demek ki bu verileri İETT açıktan bir yerlerden sağlıyor dedik. Nedense çok sonra İETT'nin sitesinden de otobüs konumlarının sorgulanabildiğini hatırlayıp bir baktık ki İETT harita sayfalarını gezerken bir yandan <a href="http://getfirebug.com/">firebug</a> açıp izleyince <a href="http://harita.iett.gov.tr/?hat=34">İETT'nin harita arayüzünde</a> gösterdiği verileri zaten javascript/ajax ile xml olarak çektiğini ve Nerde bu Otobüs'çü gençlerin de dolaylı olarak bu XML'i döndüğünü anladık. Hat kodları, duraklar, otobüs konumları falan İETT baştan beri bize sunmuş zaten XML olarak. Nerde bu Otobüs için bunu json'a dönüştüren bir şey yazmışlar anlaşılan, çünkü gelen veri yapısı aynı idi.<br />
<br /></div>
<div>
</div>
</div>
<div>
İETT'nin XML'leri ortadaydı ve kolayca erişilebilirdi: <a href="http://harita.iett.gov.tr/XML/34otog.xml">http://harita.iett.gov.tr/XML/34otog.xml</a></div>
<div>
<br /></div>
<div>
Benzer şekilde hat kodları, otobüs saatleri ve diğer veriler de başından beri elimizde varmış, boşuna kasmışız Nerde bu Otobüs ile uğraşarak.<br />
<br />
İstediğimiz verilere erişebildiğimizi anladıktan sonra bu verilerin ne kadar güvenilir olduğuna geldi sıra, önce iki otobüs hattı için (metrobüs olan 34 ve karşıya sık giden 112'yi seçtim) cron'a bir şey yazayım bir gün sonra bakayım ne sıklıkta güncelleniyor diye biraz izleyeyim diyordum ama dün farkettim ki iki haftadır o cron'ları unutmuşum. Bu sayede sık seferi olan iki otobüs hattı için iki haftalık güncelleme verisi toplamış oldum.</div>
<div>
<br /></div>
<div>
Geçtiğimiz 13 günde 112 ve 34 hatları için 10 dakikaya bir ilgili xml'leri şöyle topladım:</div>
<div>
<div>
<br /></div>
<div>
<pre class="brush: java">bekir@hede:~$ crontab -e
*/10 * * * * cd /free/iett; wget --header='Referer: http://harita.iett.gov.tr/' http://harita.iett.gov.tr/XML/112otog.xml
5,15,25,35,45,55 * * * * cd /free/iett; wget --header='Referer: http://harita.iett.gov.tr/' http://harita.iett.gov.tr/XML/34otog.xml
</pre>
</div>
</div>
<div>
<br />
Toplanan dosyalar şu şekilde biriktiler:</div>
<div>
<br /></div>
<pre class="brush: java">bekir@hede:/free/iett$ ls -lrt
toplam 54328
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.9
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.8
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.7
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.6
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.5
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.4
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.3
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.2
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.15
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.14
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.13
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.12
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.11
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.10
-rw-r--r-- 1 bekir bekir 886 Nis 29 02:15 112otog.xml.1
...
-rw-r--r-- 1 bekir bekir 673 May 11 02:19 112otog.xml.1662
-rw-r--r-- 1 bekir bekir 673 May 11 02:19 112otog.xml.1661
-rw-r--r-- 1 bekir bekir 673 May 11 02:19 112otog.xml.1660
-rw-r--r-- 1 bekir bekir 673 May 11 02:19 112otog.xml.1659
-rw-r--r-- 1 bekir bekir 673 May 11 02:19 112otog.xml.1658
-rw-r--r-- 1 bekir bekir 673 May 11 02:19 112otog.xml.1657
-rw-r--r-- 1 bekir bekir 673 May 11 02:19 112otog.xml.1656
-rw-r--r-- 1 bekir bekir 673 May 11 02:19 112otog.xml.1655
-rw-r--r-- 1 bekir bekir 673 May 11 02:19 112otog.xml.1654
-rw-r--r-- 1 bekir bekir 1303 May 11 05:41 112otog.xml.1681
-rw-r--r-- 1 bekir bekir 1303 May 11 05:41 112otog.xml.1680
-rw-r--r-- 1 bekir bekir 1303 May 11 05:41 112otog.xml.1679
-rw-r--r-- 1 bekir bekir 1303 May 11 05:41 112otog.xml.1678
-rw-r--r-- 1 bekir bekir 1303 May 11 05:41 112otog.xml.1677
-rw-r--r-- 1 bekir bekir 1303 May 11 05:41 112otog.xml.1676
-rw-r--r-- 1 bekir bekir 1303 May 11 05:41 112otog.xml.1675
-rw-r--r-- 1 bekir bekir 16710 May 11 06:36 34otog.xml.1673
-rw-r--r-- 1 bekir bekir 16710 May 11 06:36 34otog.xml.1672
-rw-r--r-- 1 bekir bekir 16710 May 11 06:36 34otog.xml.1671
bekir@hede:/free/iett$
</pre>
<div>
Sonra bu verileri inceleme faslına gelince farkettim ki 10 dakikaya bir durmadan aynı dosyaları almışım, örneğin yukarıda ilk 15 kadar istek sürekli aynı veriyi almış. Bunun anlamı o dosyanın 15*10=150 dakikadır güncellenmediği. Sonra ben de otobüs konumlarını içeren bu XML'lerin ne sıklıkta güncellendiğine bakmak için şunları yaptım, aşağıdaki çıktılar 34 ve 112 hatları için hangi saatte kaç GPS güncellemesi geldiğini gösteriyor.</div>
<div>
<br /></div>
<div>
<pre class="brush: java">bekir@hede:/free/iett$ ls 112* | wc -l
1682
bekir@hede:/free/iett$ ls -lrt 112* | cut -d. -f1,2 | sort -u | awk '{print $8" "$9}' | cut -d: -f1 | sort |uniq -c | sort -n | awk '{print $2, $1/13}' | sort
00 1.53846
01 1.46154
02 0.230769
05 0.384615
06 0.230769
07 1.07692
08 0.769231
09 1.38462
10 1.84615
11 2.07692
12 1.69231
13 1.23077
14 1.92308
15 2.15385
16 1.84615
17 2.07692
18 1.61538
19 2
2011 0.0769231
20 2
21 1.69231
22 2.23077
23 2
bekir@hede:/free/iett$ ls 34* | wc -l
1674
bekir@hede:/free/iett$ ls -lrt 34* | cut -d. -f1,2 | sort -u | awk '{print $8" "$9}' | cut -d: -f1 | sort |uniq -c | sort -n | awk '{print $2, $1/13}' | sort
00 3.92308
01 2.69231
02 1.07692
05 0.692308
06 0.615385
07 1.15385
08 2.23077
09 3.69231
10 3.53846
11 3.53846
12 3.30769
13 3.84615
14 3.53846
15 2.84615
16 3.69231
17 3.46154
18 2.92308
19 3.61538
20 3.23077
21 3.15385
22 3.92308
23 4.30769
bekir@hede:/free/iett$
</pre>
</div>
</div>
<div>
Otobüs konum verileri en yoğun saatlerde ancak 2-3 kez güncelleniyor, gece de 02:00-05:00 arasında servisi de kapatıyorlar gibi, yani her şey yalanmış. İnanmadım bir de IETT'nin harita sayfasında da denedim, maalesef sonuçlar doğru çıktı. Öyle otobüs beklerken falan otobüs konumlarına bakmak çok anlamsızmış.</div>
<div>
<br />
Bu arada yukarıda bahsettiğim "otobüsüm nerede" bağlantısı sık sık güncelleniyor gibi, doğruluğunu test etmedim ama belki oradaki veri gerçekten daha sık güncelleniyordur.</div>Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com2Istanbul, Türkiye41.00527 28.9769640.621829500000004 28.345246 41.3887105 29.608673999999997tag:blogger.com,1999:blog-6143385653724330717.post-91178329699553599212012-03-17T09:29:00.000+00:002012-03-17T09:29:14.242+00:00bilgisayar bolumlerindekiler, okul bitmeden bir seyler yapinGecen ay icinde sirkette bir toplanti yapip kariyer gunlerine katilalim ama gittigimiz kariyer gunlerinde neler sunacagiz diye konusuytorduk. toplantida genellikle proje gelistirme sureclerimize, belli araclarin nasil etkili kullanilabilecegine ya da kod yazma teknik/metodolojilerine dair fikirler ortaya cikti. Bende kariyer gunlerindeki ogrencilerin zaten daha bu konularda fikirleri bile olmadigini daha ogrencilerin islerine yarayacak seyler bulmamiz gerektigini soylemistim.<div><br />
</div><div>Toplantida ornek olarak insanlarin bu gunlere nasil geldiklerini anlatalim demistim, cevremde genellikle basarili ve yaptigi is konusunda hevesli insanlarin baslangic noktalari merak ve kollari sivayip bir ucundan kendileri baslamis olmalari idi, ilk kayda deger bir seyler ogrenmeye/yapmaya basladiklarinda onlara yol gosteren okul ya da is degildi. Ogrencileri de bu sekilde okullari bitmeden bir seyler yapmaya tesvik etmek gerektigini soylemeye calismistim. sonra ne oldu bilmiyorum birden kendimi <a href="http://www.yeditepe.edu.tr/home/haberler.dot?storyId=168722">Yeditepe Univ. Kariyer Gunlerinde</a> "Mahalle bakkalindan e-ticaret portalina" adli bir sunum yapacakken <a href="http://www.yeditepe.edu.tr/dotAsset/168678.pdf">buldum</a>.</div><div><br />
</div><div>Sunum icerigi hakkinda bir kac arkadasimla ve ozellikle de <a href="http://www.iyiuykular.net/">samet</a> ve nesli ile konustuktan sonra </div><div>sunum biraz basligi ile alakasiz olsa da icerigini <a href="http://bdgn.net/bakkal.zip">hazirladim</a>. Sunumu <a href="http://freemind.sourceforge.net/">Freemind</a> uzerinde hazirladim ve sundum. Internet uzerinde de <a href="http://bdgn.net/bakkal.mm.html">suradan</a> freemind indirmeden de bakabilirsiniz.</div><div><br />
</div><div>Sunuma gelen ogrenciler genellikle 2,3,4. sinif bilgisayar muh. ve yonetim bilisim sistemleri ogrencileri idi, donem ortasinda oldugumuzdan 4. siniflar da dahil bir cogunun kafasinda mezun olunca neler yapacagina dair sorular henuz belirlemisti.</div><div><br />
</div><div>Sunuma once kendi hikayemi anlatarak basladim, ben ve arkadaslarim okul bitince neler yasadik, nasil islere girdik, bosluga dusme surecini anlattim. Sunum boyunca da cocuklarin kafalarina "<b>okulunuz bitirmeden kayda deger bir seyler yapin, sirket kuracaksaniz simdi kurun, fikriniz varsa harekete gecin, okul icin gerekmese de staj yapin</b>" diye vurdum durdum. ilginc bir sekilde "kendi sirketini kurmak isteyen var mi?" soruma koca salondan sadece 2 parmak kalkti, bana ilginc gelmisti ama simdi anlayabiliyorum ki kendi isini kurmak isteyenlerin is kurma fikri genellikle bir yerlere girip bir sure calistiktan sonra olusuyor. Buyuk cogunluk da o saatten sonra harekete gecemiyor bir turlu.</div>Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com2tag:blogger.com,1999:blog-6143385653724330717.post-14064169998880045972012-03-08T19:03:00.003+00:002012-03-08T19:07:52.435+00:00cloud yapiya neden gecmedikGecen gun <a href="http://roysimkes.net/">Roy</a> ile birlikte <a href="http://www.ituieee.com/etkinlikler/clocodile-itu-ieee-eestec-lc-istanbul.html">CLOCODILE calistayi</a>nda bir konusma yaptik, konusmada neden cloud'a gecmemek gerekebilir diye aldigim bir kisim not asagida (notlar ingilizce oldugu icin kusura bakmayin sunum ingilizceydi e turkceye cevireyim dersem bloga asla koymayacagimi farkettim, ingilizce de olsa koyuyorum)<br />
<br />
haa bu arada asla gecmeyecegiz diye bir planimiz da yok, openstack gibi projeleri denemek icin laboratuar kurma girisimindeyiz.<br />
<br />
Why not to migrate to cloud:<br />
<br />
pay less:<br />
* cloud is expensive if you dont use its cloud features:<br />
** no purchase needed for machines and side-products and less expense for buyers or other needed stuff<br />
** less sysadmin<br />
** scales automatically if needed<br />
** automatic deployment<br />
** less idle machines of our own (special days)<br />
<br />
migration:<br />
* migration of existing systems could need extensive effort.<br />
* every saas should comes with many advanced features and takes some from<br />
you, (user auth. mechanism)<br />
<br />
procedure/experience changes:<br />
* if you already have your own system high optimised, why do you need to change it, it is expensive to migrate<br />
* if you have mature policies about your system management and you have sufficient personnel it could be preferred to stay out of cloud<br />
* if you already have extensive experiencesolutions about existing problems, cloud comes with everything new to resolve<br />
<br />
Others<br />
* every problem in your provider, affects you (google ip addresses blocked)<br />
* If you are doing boutique bussiness, every customer have different needs so they want their special cloud like thing, cloud is not that small<br />
* contracts with old customers prevent you to swith to cloudAnonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com3tag:blogger.com,1999:blog-6143385653724330717.post-49759631040974733992010-06-07T17:08:00.004+01:002010-06-07T17:12:40.823+01:00Turkseniz ve rooted android'iniz varsa<blockquote><span style="font-weight:bold;">bekir@hede:/tmp$</span> adb remount<br />remount succeeded<br /><span style="font-weight:bold;">bekir@hede:/tmp$</span> adb shell<br /><span style="font-weight:bold;">#</span> vi /etc/hosts<br /><span style="font-weight:bold;">#</span> cat /etc/hosts<br />127.0.0.1 localhost<br />66.102.13.101 android.clients.google.com<br />66.102.13.104 www.google.com<br />66.102.13.103 google.com<br /><span style="font-weight:bold;">#</span> exit<br /><span style="font-weight:bold;">bekir@hede:/tmp$</span> <br /></blockquote><br /><br /><a href="http://android.modaco.com/content/google-nexus-one-nexusone-modaco-com/310378/google-services-being-banned-any-solutions/">Suradan</a> aldim.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com0tag:blogger.com,1999:blog-6143385653724330717.post-83231116482743058072010-05-22T13:29:00.030+01:002010-09-06T17:05:36.754+01:00Laptopta sanal sunucu, KVM içerisinde linux-vserverÇalıştığım şiskette sistem yöneticiliği yapıyorum, ofis içerisinde küçük bir sunucu odamız var ve burada çeşitli teslerimiz için laboratuvar ortamımız mevcut. Ama kişisel olarak yapmak istediğim testleri kendi laptopumda yapmak evde de çalışabilmemi sağladığım için işime geliyor. Gün boyunca bir çok uygulama görüp iş yerindeki laboratuvar ortamına ya da internete bağlı kalmadan test etmek istiyorum ama bütün bu uygulamaları kurarak bilgisayarımı çöplük haline getirmek de istemiyordum.<br /><br />Ben de bilgisayarımda yapacağım testler için KVM ile oluşturduğum sanal sunucuları kullanıyordum, ancak:<ul><li>bir kaç sanal cunusu çalıştırmam gerekince toplamda sahip olduğum 1GB ram'in hatırı sayılır kısmını sanal sunuculara ayırıyordum</li><li>sunucular'a kaynaklar istesemde istemesem de atanmış oluyordu,</li><li>toplam 10GB kadar olan boş alanıma çok sunucu kuramıyordum, her sunucu için ne kadar diske ihtiyacım olacağını da bilemiyordum, sonradan diski büyütebilsem de bu çok kolay değildi</li></ul>Bir süre sonra KVM gibi tam sanllaştırma yapan araçlardan vazgeçip işletim sistemi seviyesinde sanallaştırma yapmak için bilgisayarıma linux-vserver çekirdeği (linux-image-vserver-686) kurdum. Böyle yaptığımda da şu sorunlar ile karşılaştım:<br /><ul><li>çekirdeğim değiştiği için nvidia ve madwifi gibi sürücular için tekrar modül derlemem gerekti, hoş hani zaten bunu modüle-assistant benim adıma yapıyor ama gene de rahatsız edici bir durum</li><li>gittiğim her yerde ağ yapılandırmam değişiyordu ve linux-vserver sunucularına dinamik ip vermek çok kolay olmuyordu</li></ul>Sonunda yeni gelen bir güncelleme sırasında kendimi vserver çekirdeğini kaldırırken bulunca farklı bir yöntem kullanmak gerektiğini düşündüm ve şöyle bir çözüm buldum:<ul><li>Bir adet KVM kurup içerisine linux-vserver çekirdeği kurdum</li><li>KVM'in ağ yapılandırmasını ayarlayarak KVM ve içerisindeki sanal sunucuları ayrı bir ağa koydum, böylece sabit ip verebildim ve nat ile nete çıkardım: http://www.linuxquestions.org/questions/linux-networking-3/kvm-qemu-and-nat-on-the-host-machine-mini-tutorial-697980/</li><li>Tüm sanal sunucuların içinde bulunduğu disk alanına toplamda 10GB ayırdım, tümü bunu paylaşıyorlar, her yeni sunucunun disk maliyeti yalnızca 200MB ölüyor (benim imajımın sıfır boyutu bu kadar)</li><li>Tüm sanal sunuculara ayrı ayrı ram ayırmaktansa toplamda 300MB ram ayırdım ve tümü bunu paylaşıyorlar, 10 kadar sanal cunucu ile daha pek yavaşlama olmadı.</li></ul>Nasıl yaptığıma gelince:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~$</span> <span style="font-style:italic;font-weight:bold;">sudo aptitude install kvm</span><br /></pre></blockquote>KVM'in ağ yapılandırmasını düzenleyelim:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~$</span> <span style="font-style:italic;font-weight:bold;">for i in /etc/kvm/*; do echo ===== $i =====; cat $i; done</span><br />===== /etc/kvm/kvm-if.conf =====<br />#see /home/bekir/bin/testing<br />BRIDGE=kvmnat<br />NETWORK=192.168.172.0<br />HOST=192.168.172.1<br />MASK=255.255.255.0<br />===== /etc/kvm/kvm-ifdown =====<br />#!/bin/sh<br />#see /home/bekir/bin/testing<br /><br />. /etc/kvm/kvm-if.conf<br /><br />echo "$0:"<br /><br />echo "Tearing down network bridge for $1"<br />ip link set $1 down<br />brctl delif "$BRIDGE" $1<br /><br />ifconfig kvmnat 0.0.0.0<br />ip link set "$BRIDGE" down<br />brctl delbr "$BRIDGE"<br /><br />exit 0<br />===== /etc/kvm/kvm-ifup =====<br />#!/bin/sh<br />#see /home/bekir/bin/testing<br /><br />. /etc/kvm/kvm-if.conf<br /><br />echo "$0:"<br />echo "Setting up the network bridge for $1"<br />brctl addbr "$BRIDGE"<br />brctl addif "$BRIDGE" "$1"<br />ifconfig "$BRIDGE" "$HOST" netmask "$MASK"<br />ip link set "$1" up<br />ip link set "$BRIDGE" up<br /><br />if iptables -t nat -L POSTROUTING -n | grep ^MASQUERADE | awk '{print $4}' | cut -d/ -f1 | grep "$NETWORK" >/dev/null<br />then<br /> echo "IP masquerading already set up"<br />else<br /> echo "Setting up IP masquerading"<br /> iptables -t nat -A POSTROUTING -s "$NETWORK"/"$MASK" -d ! "$NETWORK"/"$MASK" -j MASQUERADE<br />fi<br /><br />echo "Setting up IP forwarding"<br />sysctl net.ipv4.ip_forward=1<br /><br />exit 0<br /><br />===== /etc/kvm/kvm-ifup-bak =====<br />#! /bin/sh<br /># Script to bring a network (tap) device for qemu-kvm up<br /># The idea is to add the tap device to the same bridge<br /># as we have default routing to.<br /><br />switch=$(ip route ls | \<br /> awk '/^default / {<br /> for( i = 0; i < NF ; i++ ) { if ($i == "dev") { print $(i+1); exit; } }<br /> }'<br /> )<br />/sbin/ifconfig $1 0.0.0.0 up<br /><br /># only add the interface to default-route bridge if we<br /># have such interface (with default route) and if that<br /># interface is actually a bridge.<br />if [ -n "$switch" -a -d /sys/class/net/$switch/bridge/. ]; then<br /> /usr/sbin/brctl addif $switch $1 || :<br />fi<br /><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~$</span><br /></pre></blockquote>KVM içerisine kurulum için debian kurulum CD'sini indirelim:<br />Ben debian'ın sitesinden indirdim, şuradan bulabilirsiniz: http://www.debian.org/CD/<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@laptop:/media/free$</span> <span style="font-style:italic;font-weight:bold;">wget http://cdimage.debian.org/debian-cd/5.0.4/i386/iso-cd/debian-504-i386-CD-1.iso</span><br /></pre></blockquote><br />Sanal sunucuları koyacağımız disk alanını ayıralım (ben 10GB ayırdım)<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~/media/free$</span> <span style="font-style:italic;font-weight:bold;">dd if=/dev/zero of=kvm_vserver_kernel bs=100M count=100</span><br /></pre></blockquote>KVM icerisine ilk kurulumu yapalim linux-vserver cekirdegi koyalim:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~/media/free$</span> <span style="font-style:italic;font-weight:bold;">sudo kvm -hda kvm_vserver_kernel -cdrom debian-504-i386-CD-1.iso -m 300 -net nic,vlan=0 -net tap,vlan=0</span><br /></pre></blockquote>Sistem CD'den açılıyor ve şu ayarları yapıyorum:<ul><li>Tüm diski kendisi bölümlendirsin (tek parça)</li><li>Ağ ayarları için elle yapılandırma seçip şunları kullandım:</li><li>* address 192.168.172.2/255.255.255.0</li><li>* gateway 192.168.172.1</li><li>* dns-nameservers 192.168.172.1</li><li> Sisteme neler kurayım diye sorduğunda hiç bir şey seçmedim</li></ul>Kurulum bittikten sonra KVM'i kurduğumuz sistemden açalım:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~$</span> <span style="font-style:italic;font-weight:bold;">sudo kvm -hda /media/free/kvm_vserver_kernel -m 300 -net nic,vlan=0 -net tap,vlan=0</span></pre></blockquote>Ben bu komutu her seferinde hatırlamak zorunda kalmamak için su betiği yazdım:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~$</span> <span style="font-style:italic;font-weight:bold;">cat bin/start-kvm-host</span><br />#!/bin/bash<br /># /etc/kvm/ altındaki dosyaları elledim: http://www.linuxquestions.org/questions/linux-networking-3/kvm-qemu-and-nat-on-the-host-machine-mini-tutorial-697980/<br />#IP address: 192.168.172.12<br />#Netmask: 255.255.255.0<br />#Gateway: 192.168.172.1<br />#DNS: 192.168.0.1<br /># -cdrom /media/free/debian-504-i386-CD-1.iso<br />exec sudo kvm -vnc :0 -hda /media/free/kvm_vserver_kernel -m 300 -net nic,vlan=0 -net tap,vlan=0<br /><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~$</span><br /></pre></blockquote>Şimdi makinanın arayüzüne bağlanmak için sunu kullanabilirsiniz (Eğer bir şeyler doğru gitmezse açılan kvm'in ekranını buradan görebilirsiniz)<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~$</span> <span style="font-style:italic;font-weight:bold;">sudo aptitude install vncviewer</span><br />bekir@laptop:~$ vncviewer localhost<br /></pre></blockquote>Şimdi KVM içerisine kurduğumuz debian'a yerleşmeye başlayabiliriz:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">sudo aptitude install linux-image-vserver-686 util-vserver ssh</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">sudo reboot</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">sudo vserver vserver_template build -m debootstrap --hostname vserver_template.laptop.bdgn.net --interface eth0:192.168.172.3/24 -- -d lenny -m http://ftp.de.debian.org/debian # biraz uzun sürüyor</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">sudo vserver vserver_template start</span><br />Starting enhanced syslogd: rsyslogd.<br />Starting OpenBSD Secure Shell server: sshd.<br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">sudo vserver vserver_template enter</span><br /><span style="font-weight:bold;color:lightgreen;">root@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;"># artık yeni sunucu içindesinizistediğiniz paketeri kurun ve template'de olması gerektiğini düşündüğünüz yapılandırmaları yapın</span> <br /><span style="font-weight:bold;color:lightgreen;">root@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;">aptitude install ssh</span><br /><span style="font-weight:bold;color:lightgreen;">root@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;">adduser bekir</span><br /><span style="font-weight:bold;color:lightgreen;">root@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;">visudo # bekir ALL=(ALL) ALL</span><br /><span style="font-weight:bold;color:lightgreen;">root@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;"># key'lerinizi koyabilir ve daha istediğiniz değişiklikleri de burada yapabilirsiniz</span><br /><span style="font-weight:bold;color:lightgreen;">root@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;">logout</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span><br /></pre></blockquote>Hemen yeni makinamiza ssh ile girmeyi deneyelim:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">ssh 192.168.172.3</span><br />The authenticity of host '192.168.172.3 (192.168.172.3)' can't be established.<br />RSA key fingerprint is 3c:fd:16:d0:04:43:39:32:c5:14:5b:49:7a:cd:f9:5b.<br />Are you sure you want to continue connecting (yes/no)? yes<br />Warning: Permanently added '192.168.172.3' (RSA) to the list of known hosts.<br />Last login: Wed May 19 03:51:19 2010 from 192.168.172.3<br /><span style="font-weight:bold;color:lightgreen;">bekir@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;">sudo aptitude install vim emacs bash-completion</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;">sudo aptitude install locales</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@vserver_template:~$</span> <span style="font-style:italic;font-weight:bold;">sudo dpkg-reconfigure locales</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;"># ev dizinime gereken dosyalari tasidim ve ssh key'imi de koydum</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@vserver_template:~#</span> <span style="font-style:italic;font-weight:bold;">sudo update-alternatives --config editor # vim.basic</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@vserver_template:~$</span> <span style="font-style:italic;font-weight:bold;">sudo apt-get clean # çok büyük boyutlu olabilir, her makina için kopyalanacağından temizlemekte fayda var</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@vserver_template:~$</span> <span style="font-style:italic;font-weight:bold;">logout</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span><br /></pre></blockquote>Artık template'imiz hazır, template makinamızı açık tutmayalım:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">sudo vserver vserver_template stop</span><br /></pre></blockquote>Yeni makinalar yaratmak için de alttaki gibi bir betik yazdım. Bu betik şu işleri de yapıyor:<ul><li>sıradan bir ip bulup makineye veriyor, ismiyle ulaşabilmemiz için /etc/hosts'a makina adını ekliyor</li><li>bütün sanal makinalarının /home ve /var/cache/apt/archives dizinleri kvm makinasındaki ile ortak oluyor.</li><li>sanal makinaların kvm makinası açılışında kendiliğinden başlamalarını sağlıyor.</li></ul><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">cat /usr/local/bin/create_vserver</span><br />#!/bin/bash<br />V_NAME=$1<br /><br />[ "$USER" == "root" ] || { echo "You must bee root"; exit 1; }<br />[ -z "$V_NAME" ] && { echo "Give a vserver name"; exit 1; }<br /><br />MAX_IP=$(cat /etc/vservers/*/interfaces/0/ip | cut -d. -f4 | sort -n | tail -1 )<br />V_IP=192.168.172.$[MAX_IP + 1]<br /><br />echo "Creating new vserver $V_NAME with ip $V_IP ..."<br /><br />vserver $V_NAME build -m clone --hostname $V_NAME.laptop.bdgn.net --interface eth0:$V_IP/24 -- --source /var/lib/vservers/debian<br />echo -e '/home\t/home\tbind\tbind\t0\t0' >> /etc/vservers/$V_NAME/fstab<br />echo -e '/var/cache/apt/archives/\t/var/cache/apt/archives/\tbind\tbind\t0\t0' >> /etc/vservers/$V_NAME/fstab<br />echo "default" > /etc/vservers/$V_NAME/apps/init/mark<br />vserver $V_NAME start<br />vserver $V_NAME exec bash -c 'rm /etc/ssh/ssh_host_*'<br />vserver $V_NAME exec bash -c 'dpkg-reconfigure openssh-server'<br /><br />echo $V_IP $V_NAME >> /etc/hosts<br /><br />echo "Created new vserver $V_NAME with ip $V_IP"<br /><br />exit 0<br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span><br /></pre></blockquote>Artık sanal makina yaratmak ve silmek su kadar basit:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">sudo create_vserver test_makinasi</span><br />Creating new vserver test_makinasi with ip 192.168.172.4 ...<br />Starting enhanced syslogd: rsyslogd.<br />Starting OpenBSD Secure Shell server: sshd.<br />Creating SSH2 RSA key; this may take some time ...<br />Creating SSH2 DSA key; this may take some time ...<br />Restarting OpenBSD Secure Shell server: sshd.<br />Created new vserver test_makinasi with ip 192.168.172.4<br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">ssh test_makinasi</span><br />The authenticity of host 'test_makinasi (192.168.172.4)' can't be established.<br />RSA key fingerprint is 1a:50:a9:51:8e:5b:c3:a9:96:d6:85:51:8c:00:ea:0b.<br />Are you sure you want to continue connecting (yes/no)? yes<br />Warning: Permanently added 'test_makinasi,192.168.172.4' (RSA) to the list of known hosts.<br />Last login: Tue May 18 01:05:32 2010 from 192.168.172.1<br /><span style="font-weight:bold;color:lightgreen;">bekir@test_makinasi:~$</span> <span style="font-style:italic;font-weight:bold;">logout</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">sudo vserver-stat</span><br />CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME<br />40006 21 214.3M 93.9M 3m32s63 2m22s18 17h40m26 veli<br />40008 6 43.5M 8M 0m02s10 0m00s64 17h40m26 pyldap<br />40009 3 23.5M 2.2M 0m02s52 0m01s25 28m22s75 test_makinasi<br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">sudo vserver test_makinasi delete</span><br />Are you sure you want to delete the vserver test_makinasi (y/N) <span style="font-style:italic;font-weight:bold;">y</span><br />Stopping enhanced syslogd: rsyslogd.<br />Asking all remaining processes to terminate...done.<br />All processes ended within 1 seconds....done.<br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span><br /></pre></blockquote>Şimdi kendi makinamizdan sanal sunuculara da ip adresleri ile erişebiliriz:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@laptop:~$</span> <span style="font-style:italic;font-weight:bold;">ssh 192.168.172.4</span><br />The authenticity of host '192.168.172.4 (192.168.172.4)' can't be established.<br />RSA key fingerprint is 1a:50:a9:51:8e:5b:c3:a9:96:d6:85:51:8c:00:ea:0b.<br />Are you sure you want to continue connecting (yes/no)? <span style="font-style:italic;font-weight:bold;">yes</span><br />Warning: Permanently added '192.168.172.4' (RSA) to the list of known hosts.<br />Last login: Wed May 19 21:23:00 2010 from 192.168.172.4<br /><span style="font-weight:bold;color:lightgreen;">bekir@test_makinasi:~$</span><br /></pre></blockquote>SSH ile sanal sunuculara laptoptan erişebilmek için de laptop'umda şu ayarı yaptım:<br /><blockquote><pre><span style="font-weight:bold;color:lightgreen;">bekir@hede:~$</span> <span style="font-style:italic;font-weight:bold;">sudo sh -c 'echo 192.168.172.2 kvm >> /etc/hosts'</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@hede:~$</span> <span style="font-style:italic;font-weight:bold;">cat >><eof> ~/.ssh/config</span><br />> <span style="font-style:italic;font-weight:bold;">Host t-*</span><br />> <span style="font-style:italic;font-weight:bold;"> ProxyCommand ssh $DEBUG -t kvm nc -w 1 -q 1 $(echo %h|sed 's/^t-//') %p</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@hede:~$</span> <span style="font-style:italic;font-weight:bold;">ssh kvm</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@kvm:~$</span> <span style="font-style:italic;font-weight:bold;">logout</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@hede:~$</span> <span style="font-style:italic;font-weight:bold;">ssh t-test_makinasi</span><br />The authenticity of host 't-test_makinasi ( < no hostip for proxy command>)' can't be established.<br />RSA key fingerprint is 86:a2:55:22:20:5c:57:43:e2:b5:dc:9a:2c:0d:87:90.<br />Are you sure you wat to continue connecting (yes/no)? <span style="font-style:italic;font-weight:bold;">yes</span><br />Warning: Permanently added 't-test_makinasi' (RSA) to the list of known hosts.<br />Last login: Wed May 19 21:36:21 2010 from 192.168.172.4<br /><span style="font-weight:bold;color:lightgreen;">bekir@test_makinasi:~$</span> <span style="font-style:italic;font-weight:bold;">logout</span><br /><span style="font-weight:bold;color:lightgreen;">bekir@hede:~$</span><br /></no></eof></pre></blockquote>Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com1tag:blogger.com,1999:blog-6143385653724330717.post-75231235878925875572009-07-27T00:43:00.007+01:002010-01-27T09:06:43.187+00:00Üreticilerin İş Takvimi ve Yöneticilerin İş TakvimiPaul Graham'ın Temmuz 2009 tarihli bir <a href="http://www.paulgraham.com/makersschedule.html">makalesinin</a> Türkçe çevirisi.<br /><br />Uzun zamandır acısını çektiğim bir konu. Ana dilinde okumak isteyenler için Türkçe'ye çevirdim. Buyrun, afiyet olsun:<br /><br /><blockquote><br /><span style="font-weight:bold;">Üreticilerin İş Takvimi ve Yöneticilerin İş Takvimi</span><br />Temmuz 2009<br /><br />Programcıların toplantıları sevmemesinin bir nedeni de onların diğer insanlardan farkli bir iş takviminde çalışmasıdır. Toplantıların onlara maliyeti daha yüksektir.<br /><br />Benim "üreticilerin iş takvimi" ve "yöneticilerin iş takvimi" olarak adlandirdigim iki tür çalışma saati düzeni var. Yöneticilerin iş takvimleri patronlar içindir. Bir günün saatlik parçalara bölündüğü geleneksel bir randevu sistemi içerir. İsterseniz bir kaç saati tek iş için gruplayabilirsiniz fakat çalıştığınız işi ontanimli olarak her saat değiştirirsiniz.<br /><br />Bu yöntemi kullandığınız zaman, birileriyle görüşmek sadece pratik bir problemdir. Takvimde boş bir saat bulur, orayı dolu olarak işaretler ve bitirirsiniz.<br /><br />En güçlü insanlar yönetici iş takviminde çalışırlar. Bu, emir verme iş takvimidir. Fakat programcılar ve yazarlar gibi iş yapan insanlar arasında zamanı kullanmanın başka bir yöntemi daha vardır. Onlar zamanlarını, genellikle yarım günlük birimlere ayırarak kullanmayı tercih ederler. Saatlik birimlerle program yazamazsınız. Bu, ancak başlamak için gereken süredir.<br /><br />Üretici iş takviminde çalışıyorsanız toplantılar tam bir faciadır. Tek bir toplantı tüm öğleden sonrayı iş yapılamayacak iki parçaya bölerek uçurabilir. Üstüne toplantıya gitmeyi hatırmalanız da gerekir. Bu, yönetici iş takviminde çalışanlar için sorun değildir. Her zaman bir sonraki saat için sırada olan yani bir iş vardır, tek soru ne olduğudur. Fakat üretici iş takviminde, bir toplantı olduğu zaman, bir de onu hatırlamak zorundadırlar.<br /><br />Üretici iş takviminde çalışanlar için toplantılar istisna fırlatmak gibidir. Bu sadece bir işten diğerine geçmenize neden olmaz, çalıştığınız kipi de değiştirir.<br /><br />Bir toplantının bazen bütün bir günü etkilediğini farkettim. Bir toplantı, sabahı ya da öğleden sonrayı bölerek genellikle en az yarım günü yer. Fakat ek olarak bazen kademeli bir etkisi olur. Eğer öğleden sonranın bölüneceğini biliyorsam sabahları da işe istekle başlayacak hevesim olmaz. Bunun aşırı duygusal gibi göründüğünü biliyorum ama bir üretici iseniz kendi durumunuzu düşünün. Tüm günün, hiç toplantı olmadan çalışmak için serbest olması sizi heyecanlandırmaz mı? Böyle olmadığında içinizde bir sıkıntı olur. İddalı projeler tanım olarak sizin kapasitenizin sınırlarındadır. Hevesinizdeki küçük bir azalma onları öldürmek için yeterlidir.<br /><br />Her takvim sistemi kendi başına gayet güzel çalışır. Sorunlar bu iki takvim sistemi birbirleri ile karşılaştıklarında ortaya çıkar. En güçlü insanlar yöneticilerin iş takviminde çalıştıkları için isterlerse diğerlerini kendi düzenlerine uymaya zorlayabilirler. Fakat daha zekice olanları, eğer kendileri için çalışan insanaların calışabilmek için uzun aralıklara ihtiyaçları olduğunu biliyorlarsa kendilerini frenlerler.<br /><br />Bizim durumumuz alışılmadık bir durumdur. Neredeyse tüm yatırımcılar (bildiğim tüm risk sermayedarları dahil) yönetici iş takviminde çalışırlar. Fakat "Y Combinator" üretici iş takviminde çalışır. Rtm, Trevor ve ben de zaten öyle çalışıyorduk. Genellikle Jessica da öyle çünkü o da bizimle uyumlu olmalıydı.<br /><br />Bizimki gibi şirketler artarsa şaşırmayacağım. Kurucuların artan şekilde yöneticiye dönüşmeye direneceği ya da en azından geciktireceğini düşünüyorum. Sadece bir kaç onyıl önce kot pantolondan kumaş pantolona dönmek için direnmeye başladılar.<br /><br />Biz üretici iş takvimi kullanarak bir çok yeni kurulan şirkete danışmanlık yapmayı nasıl başarıyoruz? Yönetici is takvimini taklit eden alışılmış yöntemi kullanarak: ofis saatleri. Haftada bir kaç kez ödenek sağladığımız kurucular ile görüşmek için zaman aralıkları ayarlıyorum. Bu zaman aralıklarını benim iş günümün sonunda, belirli ofis saatlerine yerleştiren bir kayıt uygulaması yazdım. Toplantılar günümün sonunda olduğu için asla günümü bölmüyorlar. (Görüşecegim insanların iş günleri benimkinden farklı zamanlarda bitiyorsa onların takvimi bölünüyor, ama görüşme isteğini onlar yaptığından dolayı, onlar için buna değse gerek.) Yoğun dönemlerde ofis saatleri bazen günü sıkıştıracak kadar uzayabiliyor ama günü sıkıştırsalar da asla bölmüyorlar.<br /><br />Biz 90'larda kendi şirketimizi kurduğumuz dönemlerde günümü bölmek için başka bir numara geliştirmiştim. Akşam yemeğinden gece 3'e kadar program yazıyordum çünkü gece çalışmamı kimse bölemiyordu. Sonra sabah 11'e kadar uyuyordum ve işe gelip akşama kadar çalışıyordum, bunu "iş şeyleri" diye adlandırıyordum. O zamanlar bunu hiç bu şekilde düşünmemiştim, fakat aslında her gün iki işgünüm vardı, birisi yönetici iş takviminde ve diğeri üretici iş takviminde.<br /><br />Yönetici iş takviminde çalışıyorsanız üretici iş takviminde asla yapmayı istemeyeceginiz kimi şeyleri yapabilirsiniz: kuramsal toplantılar yapabilirsiniz. Birileriyle sadece birbirinizin ne yaptığını öğrenmek için toplanabilirsiniz. Eğer takviminizde bir boşluk varsa neden olmasın? Belki de işler birilerine hiç beklemediğiniz şekilde yardım etmenizle sonuçlanabilir.<br /><br />Silikon Vadisi'ndeki (ve dünyanın kalanındakı) işadamları sürekli kuramsal toplantılar yaparlar. Eğer yönetici iş takviminde çalışıyorsanız sürekli uygun şekilde boşturlar. Aralarında kullandıkları "bir kahve içelim" gibi bir belirgin bir dilleri vardır ve görüşmek için bunu sıkça kullanırlar.<br /><br />Eğer üretici iş takviminde çalışıyorsanız kuramsal toplantılar son derece masraflıdır. Bizi usandırır. Herkes, diğer yatırımcılar gibi bizim yönetici iş takviminde çalıştığımızı varsayar. Bizi gerekli gördükleri insanlar ile görüştürürler ya da eposta ile bir kahve içme önerisinde bulunurlar. Bu noktada iki seçeneğimiz vardır, iki seçenek de pek iyi değildir: onlarla görüşebilir ve yarım günlük işimizden olabiliriz ya da onlarla görüşmemeye çalışır ve muhtemelen onları gocundururuz.<br /><br />Bu güne kadar sorunun kaynağı hakkında kafamız net değildi. Bunu, ya takvimimizi fırlatıp atmak zorundaymışız ya da insanları kırmamız gerekiyor gibi ele almıştık. Fakat artık ne olup bittiğini biliyorum, belki de bir üçüncü seçenek vardır: iki farklı iş takvimini anlatan bir şeyler yazmak. Belki sonunda, yönetici iş takvimi ile üretici iş takvimi arasındaki çakısma daha çok anlaşılır ve zamanla daha az sorun olmaya başlar.<br /><br />Üretici iş takviminde olan bizler uzlaşmaya istekliyiz. Belirli miktarda toplantılara girmemiz gerektiğini biliyoruz. Yönetici iş takviminde çalışanlardan tüm istediğimiz bu bedeli anlamaları.<br /><br /><br />Sam Altman, Trevor Blackwell, Paul Buchheit, Jessica Livingston ve Robert Morris'e bunun taslaklarını okudukları için teşekkürler.<br /><br />Paul Graham<br /></blockquote>Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com1tag:blogger.com,1999:blog-6143385653724330717.post-82981231424812076672009-06-07T23:20:00.008+01:002010-01-27T09:06:54.331+00:00The Other Half of "Artists Ship"Paul Graham'in bir <a href="http://www.paulgraham.com/artistsship.html">makalesinden</a> alinti:<br /><blockquote><br />Buyuk sirketler ile sifirdan baslayan sirketler arasindaki farklardan birisi buyuk sirketlerin kendilerini hatalardan korumak icin surec gelistirmesidir. Sifirdan baslayan sirketler yeni yurumeye baslayan cocuklar gibi surekli oraya buraya carpip duserler. Buyuk sirketler daha tedbirlidir.<br /><br />Bir kurulusta zamanla biriken denetimler kaynagini gecmis felaketlerden alan bir ogrenme seklidir. Ornegin batmakta olan bir bayi ile anlasma imzalayan bir sirket, musterilerine mallari teslim edemezse tum bayileri icin odeme gucu olduguna dair bir belge saglamayi zorunlu tutabilir.<br /><br />Sirketler buyudukce gerek felaketlerden edindikleri deneyimler ile gerekse daha buyuk sirketlerden aldiklari yeni calisanlarin getirdigi deneyimler ile denetimlerinin sayisi surekli artar.<br /><br />Hatalardan ogrenmek kuruluslarin dogasinda vardir. Asil sorun yeni denetimler oneren insanlarin neredeyse hic bir zaman denetimin kendi maliyetini dusunmemeleridir.<br /><br />Her denetimin bir maliyeti vardir. Ornegin bayilerin odeme guclerini dogrulamalari durumunu ele alalim. Bu saf ongoru degil mi? Fakat aslinda bunun azimsanmayacak bir maliyeti olabilir. Her iki tarafta da odeme gucu icin kanitlari hazirlayan ve inceleyenler insanlarin zaman masrafi oldukca net. Fakat asil maliyet gormediginiz yerlerdedir: en iyi bayi olabilecek sirket teklif vermeyebilir, onaylanmak icin bosa caba harcamak istemiyorlardir. Ya da odeme gucu belirlenen esik degerin altinda kalan en iyi muhtemel bayi, ne de olsa belirlenen esik degerini yukseltmenin gorunen bir maliyeti yok.<br /><br />Kurumlarda ne zaman birisi yeni bir denetim onerse faydalarinin yaninda zararlarini aciklamali. Bu ust-denetim, analizinin ne kadar iyi yapildigindan bagimsiz olarak, denetimin ayni zamanda bir maliyeti oldugunu da hatirlatacak ve bunu arastirmaya itecektir.<br /><br />...<br /></blockquote><br />Yillardir kendi calistigim sirkette destekledigim yontemler nedeniyle cevremdekiler tarafindan duzen karsiti birisi, bir anarsist olarak anildim. Yazdigimiz her kural ve yonerge maddesinin zararlarini farkli sekillerde dile getirmeye calistim. Bunca zamandir sanirim hic bir cabam anlatmak istediklerim konusunda bu yazi kadar net olamadi. Dile getirdiklerimin bir kismini Paul Graham bu yazida cok net bir dille ele almis. Uzgunum ve mutluyum.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com0tag:blogger.com,1999:blog-6143385653724330717.post-20428929688707620342009-06-02T23:19:00.026+01:002010-01-27T09:21:45.003+00:00PHP Oturumlari Uzerine Kisa(!) Bir HikayeSon zamanlarda Zeitin'de gelistirdigimiz bir goruntu yayin aracinin arayuzunu PHP ile yazmayi tercih ettik. Bir canli yayin uygulamasi. Herhangi bir internet kamerasindan (webcam) aldigimiz goruntuyu canli olarak yayinlayabiliyoruz. Ornegi icin bizim <a href="http://www.zeitin.com/">sirketin sitesine</a> bakabilirsiniz, <a href="http://www.zeitin.com/about">ofisimiz 24 saat hizmetinizde</a>.<br /><br /><center><iframe src="http://kaplan.zeitin.com/zeitin_ofis/embed" style="border: 3px solid white;" frameborder="0" height="240" scrolling="no" width="320"></iframe></center><br /><br /><iframe src="http://www.elsewhere.org/mbedr/?p=3590272188&v" align="left" frameborder="0" height="333" scrolling="no" width="500">&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;a href="http://www.flickr.com/photos/bergerx/3590272188/" title="IMG_5149.JPG by bergerx, on Flickr" target="_blank"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;img src="http://farm3.static.flickr.com/2444/3590272188_797b1a84cd.jpg" width="500" height="333" alt="IMG_5149.JPG"/&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/a&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;</iframe><br /><br />Yayin yapacak olan kisi <span style="font-weight: bold;">kamera takili bir bilgisayar</span> ile yayin arayuzune giriyor ve bir flash uygulamasi araciligiyla <span style="font-weight: bold;">yayin hemen </span><span style="font-weight: bold;">basliyor</span>. Biz bu is icin sirketteki eski dizustu bilgisayarlardan birisine bir kamera <a href="http://www.flickr.com/photos/bergerx/3589468551/">bagladik</a>, yayin sayfasini actik, giris yaptik ve <span style="font-weight: bold;">dizustu bilgisayari ofiste uygun dolabin uzerine tozlanmaya terkettik</span>.<br /><br /><br />Kameranin surucusu daha sorunsuz calistigi icin dizustune Windows kurup oldugu yerden tekrar indirmemek icin de <span style="font-weight: bold;">uzerine bir vnc sunucu kurduk</span>. Oldu, calisti. Ne de olsa tum isi bir internet sayfasini acik tutmak, gunlerdir basariyla yapiyor bunu.<br /><br />Ancak yayincida cok uzun sure (bir kac gun/hafta) acik kalan flash uygulamasi bir sure sonra tarayiciyi yoruyor. Bunun icin <span style="font-weight: bold;">yayin sayfasi saatte bir kendisini yeniliyor</span> (bildiginiz <a href="http://www.w3schools.com/html/html_meta.asp">META tag'i</a> ile). Yayincinin oturumunu unutmamasi ve her yenilenmesinde giris ekranina geri donmemesi icin de <span style="font-weight: bold;">PHP oturumuna yayincinin bilgisi</span>ni kaydettik.<br /><br />Sistemi kurduk, her sey <span style="font-weight: bold;">bir kac hafta gayet guzel calisti</span>, gun gelip de uygulamaya yeni ozellikler eklememiz gerektiginde giris mekanizmasini da biraz degistirdik. Ancak bu degisiklikten sonra <span style="font-weight: bold;">yayincinin oturumu her 4-5 saatte bir zaman asimina ugramaya basladi</span>.<br /><br />Hatanin nedenini anlamayinca <a href="http://git-scm.com/">git</a> teslimleri uzerinden <span style="font-weight: bold;">tum yamalari satir satir inceledik</span>. Hatanin nedenini gene bulamadik. Haftalarca calisan kod durduk yerde calismaz olmustu ve ortada hataya neden olacak tek satir yoktu.<br /><br /><iframe src="http://www.elsewhere.org/mbedr/?p=3589468551&v" align="right" frameborder="0" height="333" scrolling="no" width="500">&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;a href="http://www.flickr.com/photos/bergerx/3589468551/" title="IMG_5152.JPG by bergerx, on Flickr" target="_blank"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;img src="http://farm3.static.flickr.com/2421/3589468551_5654a32d20.jpg" width="500" height="333" alt="IMG_5152.JPG"/&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/a&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;</iframe><br /><br />Artik <span style="font-weight: bold;">kodda hata olmadigindan emindik</span> (oysa onca zaman hatanin kodda oldugundan emin gibiydik), kod disinda bizi etkileyebilecek bilesenleri incelemeye basladik. Apache ayarlari, php.ini, yayincidaki cerezlerle (Cookie'ler) ilgili ayarlar...<br /><br />Sorun uzerinde 2-3 kisi dusundugumuz halde <span style="font-weight: bold;">gunlerce nedenini bulamadik</span>. Sonunda PHP'nin oturumlari nasil yonettigini anlamak icin php.net'teki ilgili sayfalari okurken uc adet calisma zamani yapilandirmasi dikkatimi cekti.<br /><br />Birisi <a href="http://tr.php.net/manual/en/session.configuration.php#ini.session.cache-expire">session.cache_expire</a> degiskeni idi. Bir <span style="font-weight: bold;">oturumun ne kadar hayatta kalacagini</span> belirtiyordu. Ontanimli degeri 3 saat idi ama bizim 30 dakikada bir kendini yenileyen sayfa oturumunu <span style="font-weight: bold;">duzenli olarak 3 saat'te bir unutmuyordu</span>, bazen 4-5 saati bile geciyordu. Hem yarim satte bir yeniden baslayan oturum neden zaman asimina ugrasindi ki.<br /><br />Diger iki degiskeni pek anlamlandiramadim: <a href="http://tr.php.net/manual/en/session.configuration.php#ini.session.gc-divisor">session.gc_divisor</a> ve <a href="http://tr.php.net/manual/en/session.configuration.php#ini.session.gc-probability">session.gc_probability</a>. Bu degiskenler <span style="font-weight: bold;">oturumlari temizleme islemi</span>nin kac oturum baslatma (<a href="http://tr.php.net/manual/en/function.session-start.php">session_start()</a>) basina yapilacagini belirtiyordu. Bu pek makul gelmedi.<br /><br />PHP arka planda calisan ve surekli ayakta duran bir hizmete (daemon) sahip degil. Sonucta PHP, istekler geldikce (sayfalar acildikca) <span style="font-weight: bold;">Apache tarafindan cagrilan bir uygulamadan ibaretti</span>. Dolayisiyla zaman asimi gibi belli surelerde bir yerine getirmesi gereken gorevlerin zamanlamasi icin ince cozumler gerektiriyor.<br /><br /><span style="font-weight: bold;">PHP gelistiricileri oturumlarin zaman asimina ugratmak icin her session_start() isleminde %1 ihtimalle temizlik yapmayi uygun bulmuslar</span>. Aslinda cok cakma bir cozum ama anlasilan pratikte ihtiyaci karsiliyor ki yillardir farkina bile varmamisim.<br /><br />Bizim sistemimizde ise calisan tek site bahsettigim yayinci sayfasi ve oturum kullanmayan izleyici sayfalarindan ibaret diyebilirim. Bu durumda <span style="font-weight: bold;">session_start() cagri sayimiz da her yarim saatte sadece "bir"</span>. Dolayisiyla 3 saat gectikten sonra oturumun kapanma olasiligi her yarim saatte %1.<br /><br />Bunlari anlayinca aralarda gordugumuz 4-5 saat boyunca zaman asimina ugramama durumunu aciklayabildim. Kucuk bir hesapla oturumun 3 saatlik zaman asimi sonrasinda her yarim saat icin sadece 1/100 ihtimal ile temizlenecegini dusunursek, diyelim ki %1 ihtimal 50. denemede denk geldi. Bu durumda <span style="font-weight: bold;">sistemin 30dk*50 = 25saat kadar dayanabilmesi gerekirdi</span>. Ancak sistemin en cok 5-6 saat kadar dayandigini biliyordum.<br /><br />PHP'nin oturum degiskenlerini /tmp altinda bir dosyada tuttugunu bilyordum, biraz inceleyince buldum ki benim kullandigim Debian Lenny sistemde aslinda <span style="font-weight: bold;">/var/lib/php5 dizininde duruyordu</span>. (PHP'yi hic elle derlemedigim icin kullandigi dizinlerin yerine pek asina degilim.)<br /><br />Uzun bir sure /var/lib/php5'i nereden hatirladigimi cikartamadim. Sonra surekli olarak <span style="font-weight: bold;">/var/log/messages'da bununla ilgili kayitlar</span>i gordugumu hatirlayabildim:<br /><blockquote style="font-style: italic;">Jun 2 21:39:01 farmer /USR/SBIN/CRON[25973]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm)</blockquote>Cron'dan yarim saatte bir calisan bu betik /var/lib/php5/ altinda son degisiklik tarihi belli sureden daha <span style="font-weight: bold;">eski olan dosyalari temizliyordu</span>.<br /><br />/usr/lib/php5/maxlifetime da bir bash betigiydi ve yaptigi is de /etc/php5/*/php.ini dosyalarini okuyarak aralarinda en uzun zaman asimi suresini donmekti. <span style="font-weight: bold;">PHP'den boyle cakma bir cozum beklemiyordum dogrusu</span>. Gerci bu cozumu belki de Debian paketcileri yapmistir, pesine dusup incelemedim.<br /><br />/usr/lib/php5/maxlifetime betigi de benim sistemimde 24 degeri donuyordu. Crondan da 30 dakikada bir calistigina gore <span style="font-weight: bold;">en kotu durumda 24+30=54dk kadar gecikme ile tum oturumlari temizleyecekti</span>.<br /><br />Bu durum galiba bizim gibi session_start()'i seyrek araliklar ile cagiranlar icin dusunulmustu ve aslinda daha onceki hesabimin sonucunda bulabildigim gibi benim oturumunun asla bir gunu bulmamasini acikliyordu.<br /><br /><span style="font-weight: bold;">Oturumum zaman asimi suresi geldikten sonra en kotu ihtimal ile 54 dakika sonra silinecekti.</span><br /><br />Geriye cozemedigim tek soru kaldi: yarim saatte bir session_start() cagiriyorsam zaman asimi suresi de <span style="font-weight: bold;">devamli olarak yarim saat otelenecek ve asla zaman asimina ugramayacakti.</span> Ancak kodlarda hata olmadigi halde 3 saat sonra sonra oturum kapaniyordu.<br /><br />Neyse ki eldeki verilerle cozumu bulmam zor olmadi. PHP oturumlarini /var/lib/php5 dizininde sakliyordu ve syslog'daki saitirdan anladigim kadariyla <span style="font-weight: bold;">oturumlari silmek icin de dosya sisteminin tuttugu degisiklik zamani bilgisinden faydalaniyordu</span>. Bu durumda kurdugum oturumun degisiklik zamanini izleyerek sorunun nedenini bulabilirdim.<br /><br />Oncelikle oturumu baslattim ve oturumumun oldugu dosyayi buldum. Allah'tan PHP oturumlari karmasik sekillerde saklamiyordu:<br /><blockquote><span style="font-weight: bold;">bekir@farmer:/var/lib/php5$</span> <span style="font-style: italic;">sudo cat /sess_76995dd9473835f06e03d0da59275eef</span><br />publisher|s:6:"kaplan";token|s:9:sts18683140";</blockquote>Sonra stat komutu ile benim oturum dosyamin bilgilerine baktim, asagida gordugunuz "Change:" yazan kisim <span style="font-weight: bold;">dosyada en son ne zaman degisiklik yapildigini</span> gosteriyor.<br /><br /><blockquote><span style="font-weight: bold;">bekir@farmer:/var/lib/php5$</span> <span style="font-style: italic;">sudo stat ./sess_76995dd9473835f06e03d0da59275eef</span><br />File: `./sess_76995dd9473835f06e03d0da59275eef'<br />Size: 45 Blocks: 8 IO Block: 4096 regular file<br />Device: 904h/2308d Inode: 15705843 Links: 1<br />Access: (0600/-rw-------) Uid: ( 33/www-data) Gid: ( 33/www-data)<br />Access: 2009-06-03 00:37:44.000000000 +0300<br />Modify: 2009-06-03 00:37:26.000000000 +0300<br />Change: 2009-06-03 00:37:26.000000000 +0300</blockquote>PHP <span style="font-weight: bold;">oturumlari temizlerken sadece degisiklik zamanina baktigi</span> icin artik tum is sadece bu dosyanin son degistigi zaman ("Change:") degerinin ne zaman kuruldugunu kesfetmeye kalmisti.<br /><br />Bir kac deneme yaptim. Oturum olustugunda dogal olarak yukaridaki gibi bir kayit olusuyordu ancak yarim saatte bir gelen <span style="font-weight: bold;">sayfa guncellemelerinde bu ozellik guncellenmiyordu</span>. Oysa ki her seferinde session_start()'i cagiriyordu ancak dosyayi takip ettigimde sadece erisim ("Access:") zamaninin degistigini farkettim.<br /><br />Yazdigimiz kodlara dondum oturumla ilgili kisimlarini tekrar okudum. Eger kurulu bir oturum varsa sayfayi kullaniciya gosteriyor ve <span style="font-weight: bold;">oturum uzerinde uzerinde hic islem yapmiyorduk</span>. Cok guzel.<br /><br />Ancak <span style="font-weight: bold;">oturum uzerinde islem yapmadigimiz icin</span> PHP oturum dosyasini asla guncellemiyor ve dolayisi ile dosya sisteminedeki degisiklik zamani ("Change Time") bilgisinin guncellenmesini tetiklemiyordu.<br /><br />Belkedigimin aksine <span style="font-weight: bold;">session_start() oturum dosyasinin degisiklik zamanini guncellemiyordu</span>. Aslinda yapiyi anladiktan sonra cok normal bir davranis oldugunu anlayabiliyorum.<br /><br />Tum bu incelemelerden sonra <span style="font-weight: bold;">koda tek satir ekleyerek</span> uyguladigim cozum her sayfa acilisinda oturum olsa da <span style="font-weight: bold;">sadece bir oturum degiskenine atama yapmak</span> oldu.<br /><br /><span style="font-weight: bold;">Gunlerdir aradigimiz sorunun cozumu soyle tek satir imis:</span><br /><blockquote style="font-weight: bold;">$_SESSION["reset_session_timeout_hack"] = 1;</blockquote><br />Sistem su anda iki gundur sorunsuz calisiyor. Tum yazdiklarimi buldugum gece php.net sitesini gezip <span style="font-weight: bold;">hatayi ayiklamak 2 saat</span> kadar vaktimi almisti ama bu <span style="font-weight: bold;">yaziyi hazirlamak icin 6 saat</span> kadar caba harcadim, hala bir yerlerde ciddi yanlislik yapiyorum sanirim.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com1tag:blogger.com,1999:blog-6143385653724330717.post-80217957985792587292008-09-17T05:51:00.008+01:002010-01-27T09:07:06.642+00:00Kod gozden gecirme sureci ve GvR amcanin katkilariGecen gun <a href="http://code.google.com/appengine/">Google App Engine</a> ile bir seyler denerken farkettim ki sundugu <a href="http://code.google.com/appengine/downloads.html">SDK</a>'de bulunan appcfg.py ile elimizdeki kodu teslim etmeden once yaptigimiz <strong>degisikliklere gozatma imkanimiz yok</strong>. Kodlarimizi svn gibi bir surum denetim dizgesi kullanmamiz gerekiyormus. oysa app engine'deki surum numaralarini gorunce sonuncu ve simdiki araasindaki degisikliklere bakabileceimi sanmistim.<br /><br />google'da "google app engine pre commit diff" gibi bir arama yapinca karsima http://code.google.com/p/rietveld/ geldi. parkyeri'nde zamanla ve acilar cekerek kesfettigimiz kod gozden gecirme surecinin cok benzerini google'da da kullaniyorlarmis ve <a href="http://www.python.org/~guido/">Guido van Rossum</a>(GvR - python'un yaraticisi ve hala yon vericisi, etkin kod gozden gecirici) amcamiz google'a girdikten sonra ilk proje olarak bu sureci iyilestirmek icin kollari sivamis, <a title="Mondrian" href="http://www.niallkennedy.com/blog/2006/11/google-mondrian.html">mondrian</a> diye bir arac yazmis.<br /><br />bizim mevcut yapimiz asagidaki gibi ve google'daki ile fazlasiyla benzerlik gosteriyor, meraklilari icin parantez icerisine kendi kullandigim araclari yazdim:<br /><ol><br /> <li>bir kisigereken <strong>kodu yazar</strong> (emacs ... | vim ...)</li><br /> <li><strong>yama uretir</strong> (svn diff > ticket_no.patch)</li><br /> <li>ilgili gelistirme grubuna gozden gecirme icin <strong>eposta atar</strong> (mutt -a ticket_no.patch hede@parkyeri.com)</li><br /> <li>gruptan bir kisi kendi deposuna <strong>yamayi uygular</strong> (patch -p0 < ticket_no.patch)</li><br /> <li><strong>kodu inceler</strong> (emacs ... | vim ...)</li><br /> <li>kodu inceleyen kisi epostadaki yama icerisine <strong>notlarini yazar ve kodun yazarina gonderir</strong>, (mutt)<br />(ya da benim genelde yaptigim gibi yazan adam ile dogrudan konusarak sosyal yollarla da cozebilir (finch, konusma))</li><br /> <li>kodu ilk yazan kisi <strong>kodu tekrar duzenler</strong> ve <strong>tekrar yama uretip gonderir</strong> (svn diff ... , mutt -a ...)</li><br /> <li>bu surec, kodu gozden geciren kisi "<strong>eline saglik teslim edebilirsin</strong>"(este) (<a href="http://enveraltin.com/">Enver</a>'den bize miras olarak kaldi) diyene kadar tekrarlar (bazen yamalarimiza changelog eklemedigimiz icin "este" yerine "<strong>changelog ekleyip teslim edebilirsin</strong>[cete]" cevabi da gelebilir)</li><br /> <li>son olarak da "este" alan kodlarimizi <strong>teslim ederiz</strong> (svn commit)</li><br /></ol><br />Kullandigim araclar basit gozukebilir, ama genel olarak islerini guzel yapan araclar ve cok da fazla dis yardima ihtiyac kalmiyor. Genellikle kodlarimizi <strong>ssh ile eristigimiz uzaktaki makinalar</strong> uzerinde gelistirdigimiz icin diger gelistiricilerin ev dizinlerinden onlarin neler yaptigini izleyebiliyoruz ve yama alisverisi eposta uzerinden olmak zorunda kalmiyor hatta bir cok durumda yama alisverisi bile olmuyor, girip diger bir gelistiricinin proje dizininde "svn diff | vim -" diyerek kodlari okuyabiliyorum, ancak bunlar gorece kucuk olmamizin getirileri.<br /><br /><strong>Kucuk projelerde</strong> artik gozden gecirme surecimiz dahi olmuyor, degisikliklerin takibi ve teslim sonrasi gozden gecirme icin <strong>svn teslim epostalari, Trac ve eklentileri</strong> yeterli.<br /><br />Gozden gecirmenin onemini anlatip duran ve bunu python gibi buyuk bir projeyi yonettigi icin yapmak da zorunda olan GvR amcamiz zamaninda ortaya koydugu <a title="Mondrian" href="http://www.niallkennedy.com/blog/2006/11/google-mondrian.html">mondrian</a>'i fazla google bagimli oldugu icin (perforce ve bigtable gibi bagimliliklar yuzunden) acik kaynak haline getirememis, ancak daha sonra <a href="http://code.google.com/p/rietveld/">Rietveld</a> adiyla acik kaynak olarak da yayinlamis ve diger acik kaynak projelerin kullanimina <a href="http://codereview.appspot.com/">CodeReview</a> adiyla google app engine uzerinden acmis.<br /><br />Aracin (rietveld) ornek kullanimi <a href="http://codereview.appspot.com/3270/diff/601/802">burada</a>.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com3tag:blogger.com,1999:blog-6143385653724330717.post-53892657029419813262008-07-22T11:16:00.006+01:002008-07-22T11:34:14.215+01:00Yeni bisiklet, SariyerUzun zamandir bisiklet alma hevesiyle ortalarda dolanip duruyordum. <a href="http://sametatdag.blogspot.com/">Samet</a> ve <br /><a href="http://www.yiit.org/">Yigit</a> ile Hasim-Iscan Gecidine gidip oradaki vahim durumu gordukten sonra<br />sonunda cuma gunu Samet ile <a href="http://www.velespit.com/">Velespit</a>'ten <a href="http://www.velespit.com/asp/show_stock.asp?product=t4400d">son model bisikletimi</a> gonul rahatligi <br />ile aldim.<br /><br />Ayni gece geziye cikayim bogaz sahillerinde gezineyim dedim. Saat 02:00'de<br />evden ciktim, Sisli'den Taksim'e ve oradan Besiktas uzerinden sahilden devam<br />ettim. Eglence mekanlarinin onu oldukca kalabalikti. Sahilden devam ettim.<br />Sahil seridinde gece fareler ve kopekler cirit atiyormus. Evet evet, bir suru <br />boyut ve cesitte fare gordum, hatta bir kismiyla sahilde birlikte yol aldik.<br /><br />Ortakoy, Bebek, Istinye derken Tarabyaya geldim, gecenin 3'unde hala balik <br />tutan bir suru insan vardi. Oralardaki bir tekel bayine ugradim ama param<br />olmadigi icin neredeyse su alamiyordum. Neyseki tekelci sadece 1.5 litre suyu<br />bankamatikten cekti de susuz kalmadim, Sariyer'e cok fazla kalmadigini<br />ogrendim, yola devam ettim.<br /><br />Dolunay sayesinde sahilin isiklandirilmamis kisimlari da karanlik degildi ama<br />kopekler zaman zaman tehlike arzedebiliyordu.<br /><br />Saat 3:40'da Sariyer'e vardim ve oradaki bankadan para cekip gerisin geri<br />tekelciye dondum; Cokonat, Hobby ve yarim litrelik bir su daha aldim, bu kez<br />para ile odedim.<br /><br />Donuste kopekler ve fareler disinda sahildeki bos bira siselerine de dikket <br />etmek gerekti. Ozellikle Rumeli Hisari'ni gectikten sonraki park baya demlenme<br />mekani haline gelmis.<br /><br />Bebek'e geligimde bufe gordum dayanamadim bir sosisli yemek icin durdum, bu<br />sirada sabah ezani okunmaya basladi.<br /><br />Bebek'ten cikip ortakoye gelirken gunun aydinlanmaya baslamasiyla sahilde balik <br />tutmaya gelmis oldukca yogun (en azindan o saatler icin) bir kalabalik vardi.<br /><br />Ortakoye gelmeden ictigim sular etkisini gosterinde bir benzincide mola vermek<br />zorunda kaldim, mola vermisken iki de King Top alip icinden cikan alti<br />cikolatayi mideye indirdim.<br /><br />Ortakoyde hayatimin en tezat goruntulerinden biriyle karsilastim, eglence <br />mekanlarindan cikip, arabalarini getiren valeye bahsis veren insanlarin tam<br />yanindaki copu kurcalayan bir amca vardi, cok fotograflik bir andi.<br /><br />Goruntuye cok da takilamadim cunku eglence sonrasi kafayi bulan insanlarin <br />kirdigini sandigim siselerin cam parcalarindan kacinmaya calisiyordum.<br /><br />Ortakoye geldigimdehenuz gunes'in dogmasina vakit olsa da artik hava <br />aydinlanmaya baslamisti. Gunes dogmadan Besiktas Stadi'nin yanindaki yokusu<br />tirmanmayi tamamlayabildim<br /><br />Mecidiyekoye geldigimde saat 06:00 olmustu, hava iyiden iyiye aydinlanmisti ama <br />gunes hala ortalarda gozukmuyordu.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com2tag:blogger.com,1999:blog-6143385653724330717.post-15903344572664026712007-10-31T11:32:00.002+00:002010-02-28T11:45:15.135+00:00Tercih ettigimiz araclarAz önce <a href="http://www.last.fm/user/sebenich/">Serdar</a> ile konuşurken birlikte çalıştığımız şirketlerdeki çalışanların bize göre ne kadar farklı araçlar kullandığından bahsediyorduk. "Abi HTTP başlıklarını gezginden değiştirebileceklerini bile bilmiyorlar" diye söze girmişti Serdar, sonrasında da bizim <span style="font-weight: bold;">IE özürlü olduğumuzdan</span> devam ettik. Şirkette pek windows makinalarla uğraşmayı tercih etmediğimiz için ürünlerimizi bazen IE ile test etmekte zorlanıyoruz.<br /><br /><span style="font-weight: bold;">Yazdığımız uygulamalar UNIX türevi sunucularda koştuğu</span> için arkauçlarda genellikle pek sorunumuz olmuyor. Ama web üzerinden erişilen kısımlar için <span style="font-weight: bold;">IE ve Safari testleri</span> yapmak zorunda kalıyoruz. Bu tür testeri genellikle şirket içerisinden bağlandığımız Windows ve Maç sunucular üzerinden yapıyoruz, sağolsunlar.<br /><br /><a href="http://www.parkyeri.com/">Parkyeri</a>'nde çalışan profilimizden dolayı genellikle <a href="http://www.fsf.org/about/what-is-free-software">özgür</a> olan araçlar kullanmayı tercih ediyoruz. Bu aslında pek de bilinçli bir tercih değil; ama para verip uygulama satın alıp, üzerinde geliştirme yapmaya alışmış insanlardan oluşan bir <a href="http://www.flickr.com/search/?q=parkyeri+toplu&w=82193916%40N00&s=int&z=e">kadro</a>ya sahip değiliz.<br /><br />Şu anda ilk geldiğimden <a href="http://www.flickr.com/photos/bergerx/sets/72157602804780559/">oldukça farklı</a> ve <a href="http://www.parkyeri.com/basinda-biz/">daha iyi</a> bir konumdayız, biraz kalabalıklaştık, ve kendi adıma birlikte çalışmaktan daha çok zevk alacağım insanlar geliyor <a href="http://www.parkyeri.com/">Parkyeri</a>'ne. Zamanla değişimimizin kullandığımız araçlara yansıyan bir kısmını aşağıda görebilirsiniz.<br /><br />Parkyeri'ne ilk geldiğimde benim için çok yeni olan ama hayatımı değiştiren bir çok aracı tanımak zorunda kalmıştım, hayatımı etkileyenlerden aklıma gelenler sırası ile şunlar:<br /><br />- <a href="http://www.debian.org/%C4%B1ndex.tr.html">debian</a> ve <a href="http://www.gnome.org/">gnome</a>: Şirketteki tüm masaüslerinde debian çalışıyordu ve herkes gnome kullanıyordu ve ben o güne kadar hep KDE kullanagelmiştim. İnsanların neden Gnome tercih ettiğini Gürkan Aslan'dan <span style="font-weight: bold;">"masaüstü eğitimi"</span> alıncaya kadar pek de anlamamıştım. Gürkan daha sonra Debbie ve Ian'ı, RMS'ın kim olduğunu, <a href="http://www.gnu.org/">GNU</a>'nun ne demek olduğunu başka bir eğitimde anlatmıştı. Güzel günlerdi.<br /><br />- <a href="http://www.openssh.com/">ssh</a>: Ürünlerin yönetimi ile ilgilendiğim ve müşterilere destek verdiğim günlerde benim için sadece sunuculara açılan kapıydı. Yerelimde nasıl çalışabiliyorsam uzakta da aynen çalışmamı sağlayabiliyordu, ama gene de telnet'ten sonra tüm dünyam aydınlanmış gibiydi. Kimi sunuculara bir kaç makina üzerinden hoplayarak gitmem gerektiğinde de sorun çıkmıyordu, bir süre sonra <span style="font-weight: bold;">uzaktaki makinaların portlarını yakınlara <a href="http://www.securityfocus.com/infocus/1816">taşımayı</a></span> da öğrendiğimde henüz bu bilginin, katı erişim kısıtlama politikaları olan müşteriler için kod geliştirirken ne kadar işe yarayabileceğine dair fikrim dahi yoktu.<br /><br />- <a href="http://getfirefox.com/">firefox</a>: zaten kullanageldiğim süper araç, neresini anlatayım ki!<br /><br />- <a href="http://getfirebug.com/">firebug</a>: 20$ bağış yaptığım firefox eklentisi. IE de debug yapabilmek için koskoca script debugger kurduğum ve her çalıştırmamda IE'yi donduran hımbıl programlar ile uğraştıktan sonra dünyayı yeniden keşfetmemi sağlayan nane.<br /><br />- <a href="http://livehttpheaders.mozdev.org/">livehttpheaders</a>: <a href="http://www.w3.org/Proto%C3%A7ols/rfc2616/rfc2616.html">HTTP</a> başlıklarında gelen giden verilere erişip üzerinde oynama yapabildiğiniz süper eklenti. Özellikle bizim gibi cep telefonu modeline göre farklı wap sayfaları getirecek sistemler gibi bin bir farklı başlık bilgisinin olduğu sistemler ile sık uğraşmanız gerekiyorsa <span style="font-weight: bold;">HTTP başlığında telefonu ya da başka bir uygulamayı taklit edebilmenin gücü</span>nu bilyorsunuz demektir.<br /><br />- <a href="http://tamperdata.mozdev.org/">tamperdata</a>: bir sitenin açılışında hangi dosyaların yüklendiğini görebildiğiniz bir grafik de sunabiliyor. Ürettiği grafiği biraz daha derin şekilde incelerseniz hangi <span style="font-weight: bold;">JS dosyalarının firefox tarafından ne kadar sürede ayrıştırıldığını</span> (parse edildiğini) da çıkartabiliyorsunuz. Bizim gibi <span style="font-weight: bold;">masaüstü uygulaması tadında <a href="http://mesajlar%c4%b1m.turkcell.com.tr/">web uygulaması</a></span> (JS kodu) geliştirmeniz gerekiyorsa eklentinin çıktısı olan grafiklerin derinlemesine incelemesi sizi güzel çözümlere götürebilir.<br /><br />- <a href="http://www.gnu.org/software/emacs/">emacs</a>: Parkyeri'ne geldikten sonra <a href="http://hb.gen.tr/">Haldun</a>'un (Parkyeri mezunudur kendisi) ve <a href="http://erhan.kesken.org/">Erhan</a>'in gazı ile öğrendiğim, genellikle içinde yaşadığım, bu blog girdisini yazdığım şey! Bilgisayarımda sırasıyla <a href="http://www.xf%c3%a7e.org/">XFÇE</a>, firefox ve sonra emacs açılır her ne hikmetse :) <a href="http://www.xsteve.at/pr%C4%9F/vc_svn/">psvn</a> gibi uzantıları (<a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/Introduction-to-VC.html">vc</a>) ve içerisinde <a href="http://www.delorie.com/gnu/docs/emacs-lisp-intro/emacs-lisp-intro_toc.html">lisp</a> kodlayarak özelleştirilebilir olması vim'den emacs'e geçmemin nedenidir. <span style="font-weight: bold;">bir kez açarsınız, </span><a href="http://www.informatimago.com/linux/emacs-on-user-mode-linux.html"><span style="font-weight: bold;">içinde yaşarsınız</span></a>.<br /><br />- <a href="http://www.vim.org/">vim</a>: programcı dostu, emacs'e göre çok <span style="font-weight: bold;">hızlı yüklenen</span> geliştirme ortamı. (Gerçe Emacs'ı sadece bir kez açıyoruz.)<br /><br />- <a href="http://www.delorie.com/gnu/docs/emacs/etags.1.html">etags</a>: vim ve emacs kullanıyorsanız projenizdeki dosyalarda yer alan işlevleri (fonksiyonları) tag'ledikten:<br /><br /><span style="font-family:Courier;"> "fınd . -print | etags -"</span><br /><br />sonra, kod içerisinde gezinirken vim'de C-], emacs'de M-. tus bileşenleri ile o fonksiyonların tanımlandığı dosya ve satıra erişebilirsiniz. "E, eclipse bunu zaten yapıyor" deyebilirsiniz ama bellekte kapladığı yeri de düşünüyorsunuz değil mi? Bu yöntemde hangi dili kullandığınızın pek önemi yok.<br /><br />- <a href="https://savannah.gnu.org/projects/screen/">screen</a>: tüm geliştirme ortamlarınız bizim gibi tamamen uzakta ise ve arkadaşlarınızın tümü uygulama geliştirme sunucularına erişmek için ssh üzerinden uzaktaki vim, emacs gibi araçları kullanıyorlarsa türkiyenin altyapısına olan güvenden haberdarsınızdır. <span style="font-weight: bold;">Uzaktaki bir bilgisayarda kod yazarken bağlantı her gittiğinde küfretmek istemiyorsanız</span> screen kullanın. Uzaktaki makinelerde ~/.bashrc içerisine koyduğum aşağıdaki satırlar kişisel olarak çok işime yarıyor doğrusu. Konsol için <span style="font-weight: bold;">windows'daki "duraklat" (hibernate) özelliğini çağrıştırıyor</span>.<br /><br /><span style="font-family:Courier;">if [ "x${TERM/-w/}" == "xscreen" ]; then #sometimes it sould have screen-w</span><br /><span style="font-family:Courier;"> echo You are inside a screen.;</span><br /><span style="font-family:Courier;">else</span><br /><span style="font-family:Courier;"> screen -Rd;</span><br /><span style="font-family:Courier;">fi</span><br /><br />- <a href="http://www.cs.hmc.edu/qref/rcs.html">rcs</a>, <a href="http://www.nongnu.org/cvs/">cvs</a>: eskiden versiyon takibi için bu meretleri kullanırdık. Parkyeri içerisinde cvs'imiz pek kısa ömürlü oldu, rcs zamanından gelen değişiklik bilgilerini kaybetmeden cvs geçişi yaptıktan kısa bir süre sonra da <span style="font-weight: bold;">svn'e geçtik</span>. ama sistem yönetimi için kimi yapılandırma dosyalarının takibinde hala RCS kullandığımız yerler de var.<br /><br />- <a href="http://subversion.tigris.org/">svn</a>: <a href="http://enveraltin.com/">Enver</a>'in çabaları ile eski sistemleri bırakıp svn'e ilk geçtiğimizde biraz garip gelmişti, her yeni teslimde tüm projenin revizyon numarasının yükselmesi gibi gariplikler vardı. SVN'in inceliklerini öğrenmek biraz vakit aldı. Ama ne olursa olsun şirkete ait bir <span style="font-weight: bold;">projede kendi dalınızı açmak</span> gibi bir lükse sahip olmanın anlamını ancak yaşayan bilir sanırım. <span style="font-weight: bold;">svn teslim epostaları</span> ile geliştiriciler kod deposuna yaptıklarını teslim ettiğinde projedeki ilgili herkes değişiklikleri anında görebiliyor.<br /><br />- <a href="http://dcl.sourceforge.net/">dcl</a>: Bilet takip sistemimiz. Zamanında üzerinde değişiklik yaptığımız bir sürümünü kullanıyoruz. Müşterilerin ilettiği her sorun için bilet (<span style="font-weight: bold;">iş havalesi</span>) açıyoruz... Bir çok firmada bir şekilde vücut bulan bildiğiniz <span style="font-weight: bold;">iş takip sistemi</span>.<br /><br />- <a href="http://www.k5n.us/webcalendar.php">webcalendar</a>: Şirket içerisinde <span style="font-weight: bold;">toplantı yönetimini ve kimin ne zaman hangi ofisimizde</span> olacağını bu uygulama ile takip ediyoruz.<br /><br />- <a href="http://trac.edgewall.org/">trac</a>: Kimi projelerin işlerini takip ederken dcl yerine trac kullanamyi tercih ediyoruz. <span style="font-weight: bold;">svn depolarımızla birlikte çalışabilmesi</span> "proje maddeleri" (biletler) ve "geliştirilen kod" arasındaki ilişkiyi çok net kurabilmemizi sağlıyor.<br /><br />- <a href="http://jakarta.apache.org/jmeter/">jmeter</a>: <span style="font-weight: bold;">Uygulamanızı çok çeşitli şekillerde test edebilmenizi sağlayan</span> pek eşi olmayan nane. Birim testlerimizi web üzerinden tetikleyen ve <span style="font-weight: bold;">servislerinize ait istatistiki bilgi</span> üretebilmenizi sağlayan bir araç. Yaptığı isteklerin sonuçlarını sizin belirlediğiniz kriterlere göre denetleyebilen, yeri gelince <span style="font-weight: bold;">çıktıdaki xml'i ayrıştırabilen, yeri gelince aldığı cevabın doğruluğunu veritabanından deneteyebilen</span> ölçen süper araç. Türkiye'nin hatırı sayılır kesiminin kullandığı uygulamalar gelişiriyorsanız <span style="font-weight: bold;">yük testleri</span> yaparken bir çok makina üzerinden paralel (dağıtık) çalışabilmesi de çok işe yarıyor.<br /><br />- <a href="http://httpd.apache.org/docs/2.2/programs/ab.html">apaçhebench</a>: HTTP üzerinden çalışan servisleriniz için oldukça ağır yük testlerini yapabileceğiniz araç. jmeter gibi çıktı üzerinde doğrulama yapamasa da basit bir kaç betik ile birlikte kullandığınızda sisteminizde <span style="font-weight: bold;">aşırı yük yaratmak ve etkilerini ölçmek</span> açısıdan oldukça faydalı.<br /><br />- <a href="http://www.postgresql.org/">postgresql</a>: Yalan atmama gerek yok sanırım, oracle gördüğümüz yere postgresql koymak için çaba harcıyoruz. Oracle kullanmaya mecbur kalmadıkça kullanmıyoruz. Postgresql zaten <span style="font-weight: bold;">yük dengeleme, yedekli çalışabilme</span> gibi kritik uygulamalarda şart olan özelliklere sahip. Oracle'da protokollerin, işletim sisteminin ya da sitemin kendisinden kaynaklanan sınırlara dayandığınızda işin içinden çıkmak için bir oracle uzmanı bulmadan edemiyorsunuz.<br /><br />- <a href="http://www.mysql.com/">mysql</a>: mysql üzerinde çok zamandır koşan servislerimizin milyonlarca kayda rağmen tökezlemediğini bilmek iç ferahlatıyor.<br /><br />- <a href="http://www.danga.com/memcached">memcached</a>: uyulamanız yükleri paylaştırmak için n tane makina üzerinde koşuyorsa size gelen her isteğin farklı bir fiziksel makinaya iletilmesi session kullanımınızı etkileyebilir veya <span style="font-weight: bold;">ağır yük altında veritabanı işlemlerinizi cache'lemeniz</span> gerekebilir, bir sürü makinada paralel çalışabilen bu küçük programcık hayat kurtarabiliyor.<br /><br />Kullandığımız araçlardan ilk çırpıda aklıma gelenler şimdilik bu kadar. Bir çok kişi için bunlar pek bir şey ifade etmese de belki bir gün birilerinin işine yarayabilir.<p style="font-size: 8px;">Blögged with <a href="http://www.flock.com/bl%C3%B6gged-with-flock" title="Flock" target="_new">Flock</a></p>Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com0tag:blogger.com,1999:blog-6143385653724330717.post-37386093967606704452007-10-26T21:10:00.002+01:002010-01-27T09:14:00.578+00:00Turkiye Bilisim Etkinlikleri Takvimi<div xmlns="http://www.w3.org/1999/xhtml">Turkiyedeki bilisim etkinliklerinden herkesin haberdar olabilmesi icin bir google takvimi olusturdum.<br />Sagda solda gordugum bilisim etkinliklerini bir suredir elimden geldigince bu takvime ekliyorum.<br /><br />Takvimi gormek icin suna tiklayin: <a href="http://www.google.com/calendar/render?cid=1hh6a1rie1h6qg9137rfqp4ja4%40group.calendar.google.com" target="_blank"><img src="http://www.google.com/calendar/images/ext/gc_button1_tr.gif" border="0" /></a><br /><br />Ozellikle TBD'den Dilek Kilic'in her ay attigi etkinlik epostasi ve Mustafa Akgul'un gonderdigi epostalardan ve<br />http://www.btetkinlik.com/,<br />http://www.turkbilmed.com/,<br />http://www.bilisimmerkezi.org/,<br />http://www.btetkinlik.com/<br />adreslerinde gordugum etkinlikleri eklemeye calsiiyorum.<br /><br /><p class="poweredbyperformancing">Powered by <a href="http://scribefire.com/">ScribeFire</a>.</p></div>Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com1tag:blogger.com,1999:blog-6143385653724330717.post-40431618410603165832007-10-24T01:01:00.002+01:002010-01-27T09:15:45.382+00:00Parkyeri'nde yasadiklarimdan ogrendiklerim<div xmlns='http://www.w3.org/1999/xhtml'>1 Ekim 2004'ten beri Parkyeri'nde calisiyorum, 3 senelik Parkyeri<br/>tarihimde gorduklerim gecirdiklerimden sunlari ogrendim diyebilrim.<br/><br/><br/><br/>gelistirme, test ve gercek ortam'in ne oldugunu,<br/><br/>bir sirketin aldigi yazilimi isletemeyip nasil baska bir sirkete<br/>islettigini ogrendim, urunu ben islettim ve uzerindeki yeteneklerde<br/>gore gelistirme talep etmeknin nasil bir sey oldugunu, ne kadar<br/>zamanda cevap alabildigimizi,<br/><br/>programcinin zamaninin degerli oldugunu, isleri destek tarfina nasil<br/>aktarmak gerektigini,<br/><br/>rcs ile gelistirme yapmanin olumsuz yanlarini, baskasindan nasil dosya<br/>calacagimi, baskasinin adina nasil dosya teslim edecegimi,<br/><br/>rcs'in sistem yonetiminde ne kadar faydali bir arac oldugunu,<br/><br/>sistemlerin uptime'larinin gercekten ne demek oldugunu,<br/><br/>veritabanindaki 4 milyon kaydin nasil bas agritabildigini,<br/><br/>dosya sisteminin 2gb dosya sinirinin log dosyalarini nasil<br/>etkileyebildigini,<br/><br/>bir sirketin projelerine ait kod tabanlarinin rcs'den cvs'e ve svn'e<br/>gecmesinin ne kadar surebilecegini,<br/><br/>uygun indexler yaratilmamis veritabaninin tum sistemi ne kadar<br/>aksatabildigini,<br/><br/>sirketler icerisinde isleri takip icin kullanilabilen sistemlerin<br/>hantalligini ve ne kadar hareketli olabildiklerini,<br/><br/>trac'in sirket ici kullanimda da ne kdar guzel olabildigini,<br/><br/>kod yazma, gozden gecirme ve test adimlarinin projelerde ne kadar ise<br/>yaradigini, birisinin yazdigi kodu illa ki bir digerinin okumasi<br/>gerektigini,<br/><br/>onsite calisma'nin ne demek oldugunu buyuk bir musteride 1 ay<br/>calistiktan sonra ancak,<br/><br/>onsite calismanin bir projedeki isleri ne kadar hizlandirabildigini,<br/><br/>musterinin belirledigi sartlarda calismanin ne demek oldugunu,<br/><br/>proje plani yapmanin, gannt chart cikarmanin, paralel isleri<br/>planlamanin ne oldugunu,<br/><br/>kodlari musteriye teslim edilen ve kodun teslim edilmeyip servisin<br/>sunuldugu projelerin hafifligini ve agilirini,<br/><br/>servisini kendin isletmenin maliyetini,<br/><br/>bir sirketin kendi servislerini islettigi kac sunucusu olabilecegini,<br/><br/>yedeklenmeyen loglarin yeri geldiginde ne kadar olumcul<br/>olabildiklerini,<br/><br/>kritik uygulamalarin loglarinin anlik takibinin nasil yapidigini,<br/><br/>operasyonun ne demek oldugunu,<br/><br/>bir operasyon icin kac kisi ayrilabildigini,<br/><br/>arka arkaya kac gece operasyon yapilabildigini,<br/><br/>surum deposu yedeginin ne kadar faydali olabildigini,<br/><br/>ve ydeeklenmeyen gelistirme ortamlarinin ne kadar calismaya mal<br/>oldugunu,<br/><br/>gelistirme araci olarak vim ve emacs'in yeterli oldugunu,<br/><br/>uzak makinalarda vim ya da emacs olmamasinin ne demek oldugunu,<br/><br/>sadece vi (vim degil) operasyon yapmanin yerel atarlari bozuk sistemde<br/>nelere yolacabilecegini,<br/><br/>emacs'in elisp'le ne kadar guclu olabildigini,<br/><br/>eclips'in ne kadar bellek tukettigini,<br/><br/>vim'in bir editor olarak hizli yuklenmesinin degerini,<br/><br/>emacs'in neden kapatmamak gerektigini,<br/><br/>emacs ve mount'un bir bilgisayar icin yeterli olabildigini,<br/><br/>mutt ile epostalara bakmanin rahatligini,<br/><br/>ssh ile tunel kazmanin gucunu,<br/><br/>ssh'in telnet'e gore ne kadar tehlikeli olabilecegini,<br/><br/>bazen kac makina uzerinden ilerlemek gerekebildigini,<br/><br/>bash betiklerinin ne kadar cok isi tek basina halledebildigini,<br/><br/>python ile ne kadar ne kadar hizli kod yazilabildigini,<br/><br/>bir suru framework'u bilmek yerine, bir framework'u cok iyi bilmenin<br/>neler kazandirabildigini,<br/><br/>perl ile ne kadar cok regexin hatiri sayilir bir basarim ile<br/>islenebildigini,<br/><br/>php ile kodlarin saklanamamasinin yol actigi kafa karisikligini,<br/><br/>ajax'a fazla bagimli kalip uygulamanin desktop application'a donustugu<br/>anda cikabilecek sorunlari,<br/><br/>java classpath'inin ne demek oldugunu,<br/><br/>goc (migration) sirasinda unutulup kaldirilmayan indexlerin tum<br/>sistemi nasil etkileyebilecegini,<br/><br/>bir kac milyon kayitlik bir migration'in ne kadar zamanda<br/>sonlanabilecegini,<br/><br/>ciktigimiz surumleri dogru duzgun takip edebilecegimiz bir yapiyi<br/>kurmanin zorlugunu,<br/><br/>dunyanin buyuk sirketlerinin nasil calistiklarini,<br/><br/>yurtdisinda yapilan projelere turkiyeden nasil destek verilebildigini,<br/><br/>bir musteri icin kac proje yapilabildigini,<br/><br/>25 kisilik bir sirketin kac aktif projesi olabildigini,<br/><br/>projeyi fazla takip eden ve hic ilgi gostermeyen musterilerin<br/>acabilecegi sorunlari,<br/><br/>bir sirkette kac farkli dil kullanilabilecegini,<br/><br/>paket halindeki urunlerin kac kez satilabilecegini,<br/><br/>yapilandirma dosyasina koyulmayan verilerin gercek ortamda nelere mal<br/>olabilecegini,<br/><br/>icerik sistemi yerine kati kodlanan verilerin acil durumlarda ne kadar<br/>soruna yol acabilecegini,<br/><br/>yorumlanan ve derlenmeyen dillerin ne kadar hayat kurtarablecegini,<br/><br/>deploy'un ne demek oldugunu,<br/><br/>kullandigim dilin kutuphanelerinin olgunlugunun ne kadar onem<br/>tasidigini,<br/><br/>pear'a cok da guvenmemek gerektigini,<br/><br/>php5 ile php4 arasindaki guzel farklari,<br/><br/>php4'ten php5'e gecmenin ne demek oldugunu,<br/><br/>kaynak koddan program derleyebilenin ne kaar buyuk yetenek oldugunu,<br/><br/>apache gibi programlarin sun makinalarda ne kadar derlenemez isletim<br/>sistemleri oldugunu,<br/><br/>rfc'lerde hic dikkat etmedigin bir kac parametrenin agir yuk altinda<br/>ne kadar oneli olduklarinin anlasilabilecegini,<br/><br/>proxy'nin ne oldugunu, reverse proxy'nin ne oldugunu,<br/><br/>apache kurulusunun yazilimlarini yelpazesinin ne kadar genis oldugunu,<br/><br/>yuk testi yapmanin ne demek oldugunu,<br/><br/>yuk testi yaparken kullanilan aletlerin ne kadar yetersiz<br/>olabildigini,<br/><br/>basit aracarin buyuk kurumsal cozumlerden ne kadar daha etkin oldugunu,<br/><br/>kod yazarken birim test yazmanin onemini,<br/><br/>birim testlerde hata veren surumun durumunu,<br/><br/>birim testleri yasatmanin guclugunu,<br/><br/>test frameworklerinin bazin en kadar yetersiz kaldigini,<br/><br/>nigthly built'lerin onemini,<br/><br/>kullanici testlerinin onemini,<br/><br/>vip kullanicilarinin ne kadar etkin insanlar oldukarini,<br/><br/>araba verilen bir yarismanin sonucunun ne kadar onemli oldugunu,<br/><br/>anlik baslatilan ve sonlanan yarismalarin nasil baslatilip<br/>bitirildigini,<br/><br/>bir araba azanmak icin kac kisinin bir yarismaya katilabilecegini,<br/><br/>bir gazete bulmacasini kac kisinin cozebildigini,<br/><br/>jmeter'in testlerde ne kadar ise yaradigini, ne faydali sonuclar<br/>uretebildigini,<br/><br/>python ve perl kutuphanelerinin ne kadar zengin oldugunu,<br/><br/>programlarin arka arkaya gelen surumleri arasindaki hayati<br/>degisiklileri,<br/><br/>woody'den sarge'a ve sarge'dan etch'e gecmenin ne demek oldugunu,<br/><br/>debian depolarindan bir paketin kalkmasinin nelere yol acabildigini,<br/><br/>bir projende veritabani olarak sadece belirli bir veritabanini (mysql,<br/>oracle, postgresql) kullanmanin yaratabilecegi sorunlari,<br/><br/>tasarim yapmanin ne demek oldugunu,<br/><br/>tasarimin kac kisi tarafindan yapilabildigini,<br/><br/>bir projenin en cok kac api'ye baglanabilecegini,<br/><br/>bin tane api'nin ne kadar zamanda okunabilecegini,<br/><br/>bir projede kac partinin birbirinden basgimsiz ama birbiri ile ilgili<br/>dokuman uretebilecegini,<br/><br/>bir projede kac sayfa dokuman uretilebilcegini,<br/><br/>entegrasyon projesi'nin ne demek oldugunu,<br/><br/>elde olan basit wsdl'larin ne kadar bas agritabildiklerini ve tcpdump<br/>ciktisinin ne kadar degerli olabildigini,<br/><br/>bea'nn ne demek oldugunu,<br/><br/>kullandigimiz dilin kutuphanelerinin acik kaynak olmasinin onemini,<br/><br/>dogru takim ile sabahlamalarin ne adar eglenceli oldugunu,<br/><br/>kac gun boyunca sikilmadan sirkette kalinabildigini,<br/><br/>rfc'leri okuyabilmenin ne kadar degerli bir yetenek oldugunu,<br/><br/>xml'in ne oldugunu,<br/><br/>xsl'in nerelerde kullanilabildigini,<br/><br/>xslt'nin ne oldugunu,<br/><br/>dunyanin html'den ibaret olmadigini; wml, xhtml gibi seylerin de<br/>oldugunu,<br/><br/>javascript biliyorum demenin ne demek oldugunu,<br/><br/>maymun istahli insanlarla calismanin zevkini,<br/><br/>amerikalilara degil turklere gore encoding'in ne demek oldugunu,<br/><br/>bir projenin ongorulenden ne kadar daha uzun surebilecegini,<br/><br/>projedeki cok acil islerin musteri yuzunden ne kadar uzun surede<br/>cozulebilecegini,<br/><br/>acil diye bir seyin olmadigini,<br/><br/>her seyin acil oldugunu,<br/><br/>urun yonetmenin ne demek oldugunu,<br/><br/>musteri sorumlulgunun anlamini,<br/><br/>gunluk yazarken bile emacs kullanamnin ne kadar rahat oldugunu,<br/><br/>isyerinde windows degil linux kullanilabildigini,<br/><br/>isyerinde her gun istedigin masaya oturabilmenin rahatligini,<br/><br/>calis(ma)mak istedigin insanlari secme ozgurlugunun ne demek oldugunu,<br/><br/>yazlari cesme ofisinde calismanin, denize girip gelmenin ne demek<br/>oldugunu,<br/><br/>creaworld icinde calismanin neye benzedigini,<br/><br/>tasarim desenlerinin (desing pattern) ne oldugunu, nasil hayat<br/>kurtardiklarini,<br/><br/>bir sirkette kutuphane kurmanin nasil olabilecegini,<br/><br/>sirkette kimsenin okumadigi kitaplarin kattigi degeri,<br/><br/>kraldan cok kralc olan insanlarin ne kadar zararli olabildikleri,<br/><br/>prosedurlerin islerin onunu nasil tikayabildikleri,<br/><br/>proje yonetirken calsanlarin nasil da cil yavrusu gibi dagildiklarini,<br/><br/>arttirmandirmanin ne oldugunu,<br/><br/>bir calisana mevki ver(me)menin onemini,<br/><br/>ozgur yazilimlarin icinde yasayip hicbirisine katkida bulunmamanin<br/>agirligini,<br/><br/>arkadaslarinla tekne takimi cikarmak icin birlikte hareket edebilmenin<br/>hafifligini,<br/><br/>bir takimin sorumlulugunun ne demek oldugunu,<br/><br/>yorgun oldugun zaman bir arkadasin yardima kosmasinin degerini,<br/><br/>icinde yer aldigin sirketin geleceginde gorunur bir etki sahibi<br/>olmanin mutlulugunu,<br/><br/>birlikte olmaktan mutlu oldugun insanlarlar mutlu mesut yasamanin<br/>hayati ne kadar cekilir kildigini,<br/><br/>ideallerinden vazgecmeyen insanlarin bir arada neler yapabilecegini,<br/><br/>dusunen cok kafa olmasinin ne kadar gurultuye yok acabilecegini,<br/><br/>yeri geldiginde arkadaslarinda evden calismanin ne kadar guzelbir sey<br/>oldugunu,<br/><br/>xp tarzinda calismanin nasil bir sey oldugunu, musterinin kartlari<br/>doldururken sana guvenini hissetmenin hazzini,<br/><br/>kimin proje sorumlusu olmak istediginin ortaya sorulmasinin ve bunun<br/>kultur olmasinin nasil bir rahatlik oldugunu,<br/><br/>projelerin bitmemesinin bazen neden daha iyi oldugunu,<br/><br/>cevrendeki insanlarin zamanla degismesinin onemini,<br/><br/>cevrenden her konuda senden daha iyi insanlarin bulunmasinin nasil bir<br/>nimet oldugunu,<br/><br/>cevrendeki insanlarinin meraklarinin ne kadar bulasici olabildigini,<br/><br/><br/>iste bulari parkyerinde ogrendim.<br/><br/></div>Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com1tag:blogger.com,1999:blog-6143385653724330717.post-65786917585700969162007-10-08T10:27:00.002+01:002010-01-27T09:17:07.020+00:00emre sokullu ve silikon vadisigenc grisimciler kulubunun bu tur etkinlikelr duzenlemesi cok faydali oluyor. ayni kulturun parcasi oldugum insanlar ile bir araya gelebildigim otamlar cok ender olusuyor. balki de programcilarin asosyal olmasindan kaynaklaniyor sanirim bu durum, emre sokullunun bahsettigi barcamp fikri turkiyede olsa muthis olurdu ama turkiyede boyle bir toplulugu olusturacak kadar insan var mi bilemiyorum. gene de gittigime fazlasiyla degdi dogrusu.<br /><br /><br />soylesi sirasinda aldigim notlar da sunlar<br /><br /><br /><br />Firmalar calisanlarina pay vermeden bir sey yapmak zor. yazilim<br />konusunda sizin yatiriminiz insan. amerikada yeni sirketlerin yuzde<br />0.33 pay vermesi dogal bir sey. basari bir kac kisinin olamaz, sirket<br />yeterince buyudugunde bu kucuk paylar cok falza sey ifade<br />ediyorlar. bu insanlarda motivasyon yaratiyor.<br /><br /><br />turkiyede ttgv e kosgep var. kosgep'in sitesinde sadece bir doc var ve<br />bu yeni girisimiciye degil daha cok avukata para verip bu hukuki metni<br />okutabilecek firmalara yonelik.<br /><br />silikon vadisinin oralarda iletisim var, bir cok etkinlik, seminerler<br />partiler oluyor. ornegin bir parti oluyor; phpci, javaci, yatirimcisi<br />herkes geliyor.<br /><br />turkiyede de organizasyonlar gerek. bar-camp - kendisi ggk ile bir<br />tane yapacak sanirim 25 ekimde, belki biz de yardim edebiliriz<br /><br />cozum: medici modeli, kazandigini yeni yatirimlara hacayan<br />kisilik. melek yatirimci. turkiyede girisimciler paraya degil daha cok<br />snei satin almaya calsiiyorlar<br /><br />cozum: israil modeli<br /><br />bizim yurtdisinda diyasporalara ihtiyacimiz var. birlik olamiyoruz. gidip geri<br />gelememek degil bizim sorunumuz, orada varlik gosteren kisi baska yerlere<br />kayiyor. gene ayni sektoree yatirim yapmayi tercih etmiyor. orneklerimiz koc ve<br />sabanci ailesi gibi olunca isimiz biraz zor. onlar bir konuda degil her konuda<br />varlar. artik konuda yogunlasmak zamani.<br /><br /><br />emresokullu hakia'da calsiiyor ama grou.ps adli kendine ait bir<br />girisimi de var. erhan bizim sozlesmemizin bu tur girisimleri<br />yasakladigini dile getirdi. kimi sirketlerde calisanlarin kendi<br />sirketlerini de kurmalarina yonelik bir caba varmis. Calisanlarin<br />kendi girisimlerini yapabilmesinin onune set cekilmesi sirketleri<br />yavaslatiyor.<br /><br />emre sokullu grou.ps'daki gercek olmayan epostalari yakalamak icin bir<br />sistem yazmaya baslamis. bunun sadece kendisi ile kisitli kalmamasi,<br />dunyanin da bundan faydalanabilmesi icin dunyaya acmayi daha mantikli<br />bulmus.<br /><br />readwriteweb sayesinde bir cok avantaj elde etmis, girisi bin dolarlar<br />civarinda olan egitim ve seminerlere gidebilmis bu sayede.<br /><br />turkiyede programcilar genellikle urunu cikarttim tamamdir gibi<br />dusunuyorlar ama bundan cok farkli. satis ve pazarlamacilar bir urunun<br />gelismesinde cok fazla paya sahip. asil is urunun yayilmasini<br />saglamak. ama programcilari, teknolojiyi uretenleri de hor gormemek<br />gerek, yazarlarken ozveride bulunuyorlar, islerini tutkuyla yaptiklari<br />icin dusunuyorlar. bunlar asilamayacak seyler degil, anlayisla<br />yakalasmak gerek.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com1tag:blogger.com,1999:blog-6143385653724330717.post-80641227320978666402007-10-08T09:43:00.001+01:002010-01-27T09:16:19.496+00:00trsec konferansi notlarimgittigim, trsec konferansinda ldigim notlar asagida.<br /><br />seminer daha cok satir odakli idi ama gene de dunyada guvenlik sektoru ne alemde ve insanlar nasil calisiyorlar ufuk aciyor. oturumlar ve aklimda kalanlari oylece dusenlemeden yazdim.<br /><br /><br /><br />aviram jenik - Breaking virtual keyboards<br /><br />virtual keyboard uygulamasinin nasil bi koruma sagladigini anlatti,<br />bir bakanin uygulamasinin incelemesini ve daha guvenilir olmasi icin<br />nelerin eksik oldugunu anlatti. garanti banlasinin uygulamasini ornek<br />olarak gosterdi.<br /><br />sirketlerinde "fish or not" adli bir oyun oynuyorlarmis, birbirlerine<br />banka gibi kuruluslardan gelen epsotalari gonderereek bunun bir<br />fishing mi yoksa gercekten kurumun epostasi mi oldugunu anlamaya<br />calisiyorlarmis.<br /><br />guvenlik konusunda yapilan genel hatalari soyle siraladi: relying<br />client side, obfuscation, complexity<br /><br /><br /><br /><br /><br />2. Christoph Fischer - Online crime and phishing<br /><br />gelecege bakis<br /><br />pachlenmemis windowslar buyuk tehdit ve hala cok sayida varlar. bunlar<br />bir cok konuda acik kapi olarak hala varlar.<br /><br />organized crime- cinli bir grup buyuk bir aga sahip (yuzbinlerce<br />bilgisayar) ve bu bilgidayarlardan elde etitkleri bantgenisligini ve<br />islemci gucunu satiyorlar.<br /><br />asus ve windrive siteleri hacklenmis, dogrudan kullanicilarin surucu<br />indirdikleri siteler. insanlarin buradan aldiklari exe leri<br />calistiracaklari asikar<br /><br />dunyada cok yaygin kullanimi olan sitelerde degisiklik yaparak cok<br />kucuk js kodu eklemisler, XSS icin birebir.<br /><br />zert, avds, beSTORM, WebHoneyNet --> bunlar hizli yama cikmayi(0-day),<br />kotulerin calisma yontemlerini anlamaya ve zayiflik testleri yapmayi<br />hedefleyen girisimler.<br /><br /><br /><br /><br /><br /><br />Ziya Gokalp, servus - Access Control & Authentication Systems<br /><br />amca daha cok kurumunun hizmetlerini tanitmaya yonelik bir sunum ile<br />gelmisti, sso ve otp icin slaytlar ile bir kac uygulama anlatti, biraz<br />monton idi, katilimcilardan bunalri bilmeyen oldugunu fazla<br />sanmiyorum. sunumun tumu su noktalara deginiyordu:<br /><br />erisim yetkilendirme - sso<br />kimlik yonetimi (im) - tek kullanimlik sifre(OTP), pki, sso, im<br /><br />bunlarin yonetimini nasil merkezilestirip cok makinadaki hesaplari<br />yonetmenin maiyetini azaltabiliriz.<br /><br /><br /><br /><br /><br /><br />netsmart - endpoint security - ozgur midik<br /><br />sadece pc ve sunuculara yuklenmek yanlis olur, cep telefonlari,<br />laptoplar, smartdiskler d birere uc nokta.<br /><br />icerideki pc'leri ve sunuculari cok guzel koruyoruz ama insnlarin<br />evinden getirip taktiklari tek bir flash disk butun agimizi<br />cokertiyor.<br /><br />bazen koruma sadece agin onunde duran firewall'lar ile oluyor, ama<br />iceriye giren bir laptop her seyi dagitabiliyor. iceride olup<br />bitenleri denetlemiyorlar. usb diskler, laptolar, cdler buyuk<br />tehdit. bunlari yasaklayan sirketler biraz daha guvenlik<br />saglayabiliyorlar. ama ornegin otp token'i icin acik birakilan bir usb<br />portu her seyi mahvedebilir.<br /><br />csi/fbi 2006 computer crime and security survey - computer security<br />institute'den istatistikler goruntuledi ve uzerinde bir cok yorum<br />yapti<br /><br /><br />birisi cikip insnlari engellemeye calismak yerine bilinclendirmeye<br />yatirim yapmanin daha mantikli olup olmadigini, herkesin potansyel<br />guvenlik uzmani olabilecegini sordu, millet bir tarafiyla guldu. bizim<br />sirketi dusundum ben de guldum. bizde calsiiyor gibi geldi, tabii daha<br />30 kisiyiz, ve getirdigi sorunlari tartismak da can sikar.<br /><br /><br /><br /><br /><br /><br />aviram jenik - Estonia: Information Warfare and Lessons Learned<br /><br />bu oturumda daha cok siber savaslari anlatti.<br /><br />tum estonya aginin kilitlenmesinin sorumlularinin hala tam olarak<br />bilinemiyormus. sirketleri (beyond security) estonya agi cokunce<br />yardim icin cert-ee ye yardim icin bir "rescue team" gondermis.(bcp38<br />kullanmislar ve cok yardimi olmus.)<br /><br />israil-arap siber savaslarini anlatti, o sralarda odagimiz dagilmisti.<br /><br /><br /><br /><br /><br /><br />beyond security'den baglanan amca<br /><br />skype ile beyond security'den (almanyadaydi sanirim sanirim) bir amca<br />baglandi ve bir sunum yapti, onceleri kendilerinin gectikleri yollari<br />ve basarilarini anlatirken tam bir sirket sunumu yapiyordu ve<br />fazlasiyla baydi.<br /><br />biraz daha ilerleyince hackererin kullandiklari araclari ve nasil<br />calistiklarini, ve hatta ucret tarifeleri ve araclarini ekran<br />goruntulerini gostererek anlamaya baslayinca nutkum tutuldu. tek<br />kisinin altindan kalkalmayacagi buyuk oranize isler ve urettikleri<br />inanilmaz seyler, yaptiklari projeler'in cogunu sanirim siret olarak<br />gelistirmemiz yillari gecerdi. donen paralarin, islemci gucunun, spam<br />kapasitesinin, bantgenisligi miktarinin haddi hesabi yok.<br /><br />bu kotu amcalarin kullandiklari su uygulamalarin neler<br />yapabildiklerini ekran goruntuleri ile anlatti: goldun ,haxdoor,<br />metafisher(cz), webattacker.<br /><br />undergroun olarak adlandirabilecegimiz gruplarin kredi karti<br />bilgilerini, farkli profillerde eposta adreslerini, islemci gucunu<br />satarkenki fiyat listeleri, bu isleri yapan grupar sanirim son derece<br />belirli. konusmasi sirasinda kredi karti bilgileirni 5$ a alip 7$a<br />piyasada satanlardan falan bahsetti amca.Anonymoushttp://www.blogger.com/profile/08751751080842282001noreply@blogger.com0