30
Oca

Git’in hastasıyız; vcs, deployment vb. her işimize yarıyor sağolsun. Ancak hala svn’e bağlı kaldığımız yerler oluyor. Benim örneğimde takip ettiğim upstream vcs olarak svn kullanıyor ve çatallayamıyorum, yansılamak için bir çözüm ararken bir başka git magic ile karşılaştım.

Git depomuzu tutacağımız dizine girdikten sonra aşağıdaki adımları uyguluyoruz:

1
2
3
4
5
6
$ git init
$ git svn init -T  <svn_depo_adresi>
$ git svn fetch
$ git gc
$ git remote add origin <git_push_adresi>
$ git push origin master

Bu adımları tamamladığınızda o an için svn deposunun yansısını almış oluyorsunuz. Daha sonrasında senkronizasyonu sağlamak için ise aşağıdaki adımları tekrarlıyorsunuz:

1
2
$ git svn rebase
$ git push origin master

Senkronizasyon işini takip etmek istemiyorsanız siz de benim gibi bu işi cron ile çözebilirsiniz.

30
Ara

Objective-C ile yazdığınız projelerde dikkat edilmesi gereken hususlardan birisiyle alakalı detaylı bir blog yazısına denk geldim. Birinin işine yarar düşüncesiyle not alayım.

Yazının özeti şöyle:

Always initailize your object variables to nil, no matter what, because some day they may be captured by a block and if they contain junk when the block is copied you’re going to crash.

Bu güzel yazı için Ryan Perry‘e teşekkür ettik.

26
Ara

Django ile web uygulamaları geliştirmeye başlayanların eski alışkanlıkları sebebiyle yaptıkları bazı hatalar var. Birkaçını zamanında ben de yapmıştım ve ceremesini de çekmiştim. Rama Vadakattu’nun yazdıklarına küçük birkaç ek ile aşağıda bulabilirsiniz. StackOverflow‘da sürekli güncellenen bir liste de mevcut.

Proje adını import satırına yazmayın

Varsayalım ki proje3 içinde xyz isimli bir uygulamanız var, bu durumda aşağıdaki gibi import etmekten sakının:

1
from proje3.xyz.models import Author

Böyle yazdığınızda import ettiğiniz modül isimleri proje adına bağımlı kalır ve uygulamanız tekrar kullanılabiliir olmaz, ayrıca ileride proje adını değiştirmek istediğinizde tekrar adlandırmayı zorlaştırır.

Doğru kullanım:

1
from xyz.models import Author

Bu yazım şeklini projeniz python path’inde olduğu sürece kullanabilirsiniz.

MEDIA_ROOT ve TEMPLATE_DIRS değişkenlerini hardcode etmeyin

settings.py dosyanızda MEDIA_ROOT ve TEMPLATE_DIRS gibi değişkenlerinizi hardcode etmeyin.

settings.py
1
2
TEMPLATE_DIRS = ( "/home/html/project/templates",)
MEDIA_ROOT = "/home/html/project/appmedia/"

Bu kullanım projenizi sunucular arasında taşırken ya da geliştirme ortamından üretim ortamına taşırken sorun oluşturabilir, bunun yanında farklı platformlarla çalışırken de sorun çıkaracaktır.

Aşağıdaki şekilde kullanırsanız bu sorunların önüne geçebilirsiniz:

settings.py
1
2
3
DOCUMENT_ROOT = os.path.realpath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(DOCUMENT_ROOT, 'appmedia')
TEMPLATE_DIRS = ( os.path.join(DOCUMENT_ROOT, 'templates'),)

Template içinde statik dosyaları hardcode etmeyin

Template içinde kullandığınız statik dosyaları (javascript, css, resim vb.) aşağıdaki gibi kullanmayın:

(MEDIA_URL’in “/appmedia/” olduğunu varsayalım)

template.html
1
2
<link rel="stylesheet" type="text/css" href="/appmedia/custom.css" />
<script type="text/javascript" src="/appmedia/custom.js"></script>

Bu kullanımın sorun teşkil ettiği durumlardan biri de statik dosyaları farklı bir sunucuda ya da serviste barındırmak istediğinizde ortaya çıkıyor. Örneğin statik dosyaları sunarken Amazon S3 kullanmak istediniz ve sunucunuzun adresi cdn.xyz.com, bu durumda websiteniz.com/appmedia altında aranacak olan statik dosyaların her biri için bu tanımlamaları değiştirmeniz gerekecek.

Bu sorunun önüne geçmek için ise {{ MEDIA_URL }} etiketini aşağıdaki şekilde kullanabilirsiniz:

template.html
1
2
<link rel="stylesheet" type="text/css" href="{{ MEDIA_URL }}custom.css" />
<script type="text/javascript" src="{{ MEDIA_URL }}custom.js"></script>

Tek yapmanız gereken MEDIA_URL değişkeninizi “/appmedia/” yerine “http://cdn.xyz.com/” şeklinde yazmak olacaktır.

Temel işlemleri views içinde yapmayın

Modelleriniz ile ilgili temel işlemleri (model instance’a özgü işlemler) views içinde yapmak pek de güzel bir fikir değildir. Çünkü kodu tekrar kullanamadığınız gibi unit testlerini de yazamazsınız.

Bunun yerine models altında yer vermek ya da yardımcı fonksiyonlar tanımlamak daha iyi bir fikirdir. Hatta her model instance üzerinde yapılacak işlemler için o model’e kendine özgü bir manager yazmak daha da iyidir.

Peki views içinde ne olacak diyorsanız onu da açıklayayım. ORM ile bir nesneyi ya da nesne listesini elde etmek için ya da template içinde kullanılan bir listeyi oluşturmak için kullandığınız işlemleri yazacaksınız.

Geliştirme ve üretim ortamları için farklı ayar dosyası

İki ortam arasında uygulama taşırken DEBUG değişkeni gibi ortama özgü değişkenleri değiştirmekten yorulmuş olabilirsiniz. Genel kanı ortama özgü ayar dosyaları oluşturup mantıksal bir sorguya göre ortama uygun dosyayı import etmektir.

settings.py
1
2
3
4
5
import socket
if socket.gethostname() == 'benimsitem.com':
    DEBUG = False
else:
    DEBUG = True

Bunun birkaç farklı yöntemi olmasına karşın benim kullandığım aşağıdaki yöntemi yazacağım. Ortam bağımlı değişkenleri her ortam için farklı bir settings dosyası (settings_production.py ve settings_development.py) oluşturup içine yazıyoruz. Daha sonra aşağıdaki şekilde import ediyoruz:

settings.py
1
2
3
4
5
import socket
if socket.gethostname() == 'benimsitem.com':
    import settings_production.py
else:
    import settings_development.py

3. parti uygulamaların template etiketlerini tek seferde yükleyin

Başka geliştiriciler tarafından yazılan uygulamaların template etiketlerini aşağıdaki şekilde kullanıyoruz:

template.html
1
{% load template_tags %}

Bu satırı etiketleri kullandığımız her template’e yazmak hem DRY prensibini bozuyor hem de fazla efor gerektiriyor. Bunun yerine aşağıdaki şekilde kullanıldığında tek yerden yönetilebiliyor ve bizi fazla efor sarf etmekten kurtarıyor. Bu kodu uygulama çalışırken yüklenen herhangi bir dosyaya (settings.py, urls.py vb.) yazabilirsiniz.

settings.py
1
2
from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')

Böylece her template’de {% load %} etiketini kullanmaksızın işlevlerinden faydalanabilirsiniz.

Bütün URL’leri urls.py içine yazmayın

Aşağıdaki urls.py istemediğimiz bir örnek:

urls.py
1
2
3
4
5
6
7
urlpatterns = patterns('',
    url(r'^askalumni/question/$','.....registerInstitution',name='iregister'),
    url(r'^askalumni/answer/$','someview.....',name='newmemberurl'),
    url(r'^member/editprofile/$','editProfile',name="editprofileurl"),
    url(r'^member/changepassword/$','changePassword',name="changepasswordurl"),
    url(r'^member/logout/$','memeberlogout',name="logouturl"),
)

Bunun yerine her uygulamanın url’lerini o uygulamaya ait urls.py dosyasına (uygulama/urls.py) yazın ve projenin urls.py’sinde import edin.

urls.py
1
2
3
4
urlpatterns = patterns('',
    (r'^askalumni/', include('askalumni.urls')),
    (r'^member/', include('member.urls')),
)
member/urls.py
1
2
3
4
5
urlpatterns = patterns('member.views',
    url(r'^editprofile/$','editProfile',name="editprofileurl"),
    url(r'^changepassword/$','changePassword',name="changepasswordurl"),
    url(r'^logout/$','logout',name="logouturl"),
)

URL’leri tanımlamak için isim verin

Fark ettiğiniz üzere her bir url için name=… gibi bir isim belirledik. Bu isimlendirme template, view ve modellerde URL’leri hardcode etmeden kullanmamızı sağlıyor. Bu sayede URL yapısını değiştirmek istediğiniz zaman template, view ve modelleri tekrar düzenlemek zorunda değilsiniz.

İsimlendirmede dikkat edilecek bir husus bu isimlerin tekil (unique) olması gerektiği. Bunu sağlamak için gibi bir şablon kullanabilirsiniz.

Kullanımına göz atmak isterseniz:

views.py
1
2
3
# HttpResponseRedirect("/askalumni/questions/54")
from django.core.urlresolvers import reverse
HttpResponseRedirect(reverse('askquestiondisplay',kwargs={'questionno':q.id}))
models.py
1
2
3
@models.permalink
def get_absolute_url(self):
    return ('profileurl2',(),{'userid': self.user.id})
template.html
1
{% url askquestiondisplay 345 %}

Hata ayıklama

En basit yöntemlerden bir tanesi diğer bir çok djangonaut gibi django debug toolbar kullanmaktır. Bu araç sayesinde kaç sql sorgusu ne kadar sürede çalıştırıldı, template adı, logging, cookie ve session bilgisi gibi bilgilere erişebilirsiniz.

Bir diğer yöntem de pdb kullanmak olabilir. Eric Holscher tarafından hazırlanan screencast‘e göz atmak isteyebilirsiniz.

Projenizi zenginleştirin

Bir uygulamaya ihtiyacınız varsa önce internette arama yapmayı deneyin, büyük ihtimalle sizden önce bir başkasına da lazım olmuştur. Dolayısıyla aynı işi yapan uygulamayı hazır bir şekilde bulmanız mümkündür. Aşağıda en çok kullanılan uygulamalardan oluşan küçük bir liste var.

  • Pinax - Bir çok temel uygulamayı içinde bulunduran bir proje.
  • South - Model değişikliklerini kolayca yönetmenizi sağlayan bir proje.
  • django-command-extensions - manage.py komutlarını genişletmeyi amaçlayan bir proje.
  • django-compressor - JS ve CSS dosyalarınızı sıkıştırarak tek dosya olarak sunmayı sağlayan bir uygulama.
  • django-tastypie - Kolayca RESTful API oluşturmanızı sağlayan bir uygulama.
  • django-reversion - Modelleriniz üzerinde sürüm kontrol yetenekleri sağlayan bir uygulama.
  • django-social-auth - Sosyal ağlarla kullanıcı yetkilendirmesini sağlayan bir uygulama.

virtualenv kullanın

Projenizi geliştirirken bağımlılıkları yönetmek için sisteminizden izole bir ortam oluşturun. Deployment ve geliştirme aşamasında size bir çok kolaylık sağlayacağı gibi uygulamanızı dağıtmaya karar verirseniz diğer geliştiricilerin de işini kolaylaştıracaktır. Başlangıç için küçük bir yazıyı daha önce yazmıştım, göz atabilirsiniz.

23
Ara

Gerek yerel sisteminizde gerekse sunucularınızda birden fazla uygulama bulunduruyorsunuzdur. Çoğunun kendine has bağımlılıkları ya da bazı uygulamaların belirli sürümlerine bağımlılıkları olabilir. Bu gibi durumlarda virtualenv yardımınıza yetişiyor ve sisteminizden izole Python ortamları oluşturmanızı sağlıyor.

Bu sayede Python 2.5 ile 2.7 veya 3 kullanan uygulamalarınızı birbirinden farklı ortamlarda çalıştırabilir ve bir takım sorunların önüne geçebilirsiniz. Veya uygulama bağımlılıklarını doğrudan sisteme kurmak yerine sadece çalışılacak ortama kurabilirsiniz.

kurulum

virtualenv’i easy_install ya da pip ile kolayca kurabilirsiniz.

1
2
$ sudo easy_install -U virtualenv
$ sudo pip install -U virtualenv

ortam oluşturma

Basitçe sanal ortam oluşturmak için:

1
$ virtualenv ortam_adi

Bu komutu çalıştırdığınızda ortam taslağını (gerekli betikler, python ve setuptools) ortam_adi dizini altına kopyalar. Bu ortamı kullanırken kurduğunuz python paketlerini ortam_adi/lib/pythonX.X/site-packages dizini altında bulabilirsiniz.

Eğer setuptools yerine distribute kullanmak isterseniz ortamı oluştururken --distribute parametresini kullanabilirsiniz.

1
$ virtualenv --distribute ortam_adi

Farklı python sürümü kullanarak ortam oluşturmak için:

1
$ virtualenv -p python2.5 ortam_adi

kullanım

Yeni ortamımızı başarıyla oluşturduk, biraz da etkin kullanım adımlarına bakalım isterseniz.

Ortamımızı etkinleştirmek için:

1
2
$ source ortam_adi/bin/activate
(ortam_adi)~$

Ortamı etkinleştirdiğinizde komut istemi satırındaki değişikliği fark edeceksiniz. Bu andan itibaren yaptığınız her kurulum o ortama özel olacak ve sisteminizi etkilemeyecek.

Ortamı pasifleştirip sistem öntanımlı ortamına dönmek için:

1
(ortam_adi)~$ deactivate

Paket kurulumu için doğrudan pip’i ya da easy_install’u kullanabiliriz.

1
(ortam_adi)~$ pip install yolk

Burada örnek olarak yolk paketini verdim, hem küçük bir paket olduğu için hem de işinize yarayabileceği için fark etmenizi istedim. Yolk ortamınızda kurulu python paketlerini görüntülemenizi sağlayan bir araç.

1
(ortam_adi)~$ yolk -l

Bu listede bazı paketlerin sistemden inherit edildiğini göreceksiniz, eğer ortamı tamamıyla sistemden izole etmek isterseniz ortamı oluşturma esnasında --no-site-packages parametresini kullanabilirsiniz.

Sanal ortamımıza kurduğumuz paketlerin sistemi etkilemediğini denemek isterseniz de:

1
2
3
(ortam_adi)~$ deactivate
$ yolk -l
yolk: command not found

pip kullanacaksanız uygulamanız için bir bağımlılık dosyası oluşturup onu da kullanabilirsiniz. Bu özelliği denemek için de requirements.txt isimli bir dosya oluşturup içine birkaç paket yazın ve ardından pip ile yükleyin:

Requirements dosyası
1
2
3
4
Django
http://www.crummy.com/software/BeautifulSoup/download/3.x/BeautifulSoup-3.0.8.1.tar.gz
-e svn+http://django-tagging.googlecode.com/svn/trunk/@154#egg=django-tagging
-e git://github.com/ahmet/django-cart.git#egg=django-cart
1
$ pip install -r requirements.txt

ayarlar

Eğer ortam oluştururken kullandığınız ayarları her seferinde yazmaktan yorulduysanız bir ayar dosyası ile bu işi çözebilirsiniz.

$HOME/.virtualenv/virtualenv.ini
1
2
3
4
5
6
[virtualenv]
distribute = true
no-site-packages = true
extra-search-dir =
    /path/to/dists
    /path/to/other/dists

Şimdilik benden bu kadar, ayarlarınızı detaylandırmak isterseniz virtualenv belgelerine bir göz atın derim.

iPhone’unuzun Home düğmesi zamanla geç tepki vermeye ya da hissizleşmeye başlayabiliyor. Telefon fiziksel bir zarar görmemişse çoğunlukla bunun sebebi yazılım kaynaklı oluyormuş, ben de yeni öğreniyorum.

Bu gibi durumlarda tekrar kalibre etmek oldukça kolay, aşağıdaki adımları uyguladığınızda farkı göreceksiniz.

  1. Öntanımlı gelen Apple uygulamalarından birini açın. (Hava durumu, Borsa, Rehber vb.)
  2. Power düğmesine ”kapatmak için sürükleyin” ibaresini görene kadar basın ve görününce bırakın.
  3. Kapatma ekranı kaybolana kadar Home düğmesine basın. Böylece uygulama kapanmaya için zorlanacak.

Bu işlemleri tamamladığınızda Home düğmesini kalibre etmiş olacaksınız ve tepkileri normale dönecek.

11
Kas

MacBook Pro kendisinden hiç beklenmeyecek bir başarı gösterip bir süredir sorun çıkartıyor bana. Bunlardan bir tanesi adeta insanı çileden çıkarıyor. Durduk yerde (hiçbir işlem ile bağlantısı olmaksızın, evet) ekran kararıyor ve cihaz çalışmaya devam etmesine karşın hiçbir şekilde görüntü alamıyorsunuz. Geriye tek çare bilgisayarı kapatıp tekrar açmak kalıyor ve yeniden başlattığınızda şöyle bir hata raporu sizi karşılıyor.

Bazen tekrar başlatmanıza rağmen siyah bir mesaj kutucuğunda ‘lütfen beni yeniden başlat’ mesajı gösteriyor.

Bir şeyler yazarken, ‘kodu yazdım bir çalıştırması kaldı’ derken ya da bir dosya indirirken başınıza gelebilecek bu hadisenin yaklaşık bir ay öncesine kadar bir çözümü yoktu. Bir çok insan Apple forumlarında tartıştı durdu. Hatta bu sorun için Facebook sayfası dahi oluşturuldu.

Önceleri gfxCardStatus ile sadece Intel ekran kartını kullanarak çözdüğümüz bu soruna Apple bir çözüm getirdi ve güncelleme olarak yayınladı. Bu sorundan muzdarip iseniz ve hala güncellemeyi kurmadıysanız sizi şöyle alalım. Basitçe Software Update aracını çalıştırarak aşağıda gördüğünüz güncellemeyi de kurabilirsiniz.

Ayrıca belirtelim ki bu sorun (görünen o ki) sadece 2010 ortası üretim tarihli 15” cihazlarda mevcut.

MacBook Pro kendisinden hiç beklenmeyecek bir başarı gösterip bir süredir sorun çıkartıyor bana. Bunlardan bir tanesi adeta insanı çileden çıkarıyor. Durduk yerde (hiçbir işlem ile bağlantısı olmaksızın, evet) ekran kararıyor ve cihaz çalışmaya devam etmesine karşın hiçbir şekilde görüntü alamıyorsunuz. Geriye tek çare bilgisayarı kapatıp tekrar açmak kalıyor ve yeniden başlattığınızda şöyle bir hata raporu sizi karşılıyor.

Bazen tekrar başlatmanıza rağmen siyah bir mesaj kutucuğunda ‘lütfen beni yeniden başlat’ mesajı gösteriyor.

Bir şeyler yazarken, ‘kodu yazdım bir çalıştırması kaldı’ derken ya da bir dosya indirirken başınıza gelebilecek bu hadisenin yaklaşık bir ay öncesine kadar bir çözümü yoktu. Bir çok insan Apple forumlarında tartıştı durdu. Hatta bu sorun için Facebook sayfası dahi oluşturuldu.

Önceleri gfxCardStatus ile sadece Intel ekran kartını kullanarak çözdüğümüz bu soruna Apple bir çözüm getirdi ve güncelleme olarak yayınladı. Bu sorundan muzdarip iseniz ve hala güncellemeyi kurmadıysanız sizi şöyle alalım. Basitçe Software Update aracını çalıştırarak aşağıda gördüğünüz güncellemeyi de kurabilirsiniz.

Ayrıca belirtelim ki bu sorun (görünen o ki) sadece 2010 ortası üretim tarihli 15″ cihazlarda mevcut.

8
Eyl

Bugünkü eğlencemiz bir öncekine çok benziyor. Ancak bu sefer label ya da button gibi sık kullanılan öğelerle değil hep gözümüzün önünde olsa da pek dikkatimizi çekmeyen navigasyon çubuğuyla (UINavigationBar) oynayacağız.

UINavigationItem’ın ayarları native uygulama görünümü istemediğimiz bir çok uygulama için yetersiz kalıyor. Bu noktada NavigationItem’ın title property’sini bir kenara bırakıp ilgimizi titleView property’si üzerine yoğunlaştırıyoruz. titleView property’sine değer olarak herhangi bir UIView nesnesi verebiliyorsunuz, bu örnekte UILabel kullanacağım ancak biraz egzersizle farklı fontlar kullanarak yazı yazabilirsiniz ;)

Değişik renkli başlıkları farklı view controller’larda kullanabileceğimizi düşünerek verdiğimiz metni bir label’ın içine yazıp bize o label’ı döndüren bir fonksiyon yazarak başlıyoruz.

+ (UILabel *) labelForNavigationItem:(NSString*) text
{
UILabel *titleView = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 120, 30)] autorelease];
[titleView setFont:[UIFont boldSystemFontOfSize:16.0]];
titleView.backgroundColor = [UIColor clearColor];
titleView.textAlignment = UITextAlignmentCenter;
titleView.textColor  = [UIColor colorWithRed:.80784314 green:.77647079 blue:.50980392 alpha:1.0];
titleView.textColor = [UIColor whiteColor];
titleView.text = text;

return titleView;
}

İlgili view controller’ın viewDidLoad methodu içinde navigationItem’ın titleView property’sine değer atayarak işimizi bitiriyoruz.

self.navigationItem.titleView = labelForNavigationItem:@"Menu";

labelForNavigationItem fonksiyonunu zenginleştirmek ve yazınıza görsellik katmak size kalmış.

UILabel kullandığım bir örnek:

Custom NavigationItem title

Başka bir uygulamada UILabel yerine UIImageView kullandım, demem o ki diğer UIView nesnelerine ihtiyacınız olduğunda hiç çekinmeyin bu kodlarda birkaç değişiklik yaparak sorunsuzca kullanılabiliyor.

Bu yazının puanları da Sergio Morales‘e gidiyor.

Bugünkü eğlencemiz bir öncekine çok benziyor. Ancak bu sefer label ya da button gibi sık kullanılan öğelerle değil hep gözümüzün önünde olsa da pek dikkatimizi çekmeyen navigasyon çubuğuyla (UINavigationBar) oynayacağız.

UINavigationItem’ın ayarları native uygulama görünümü istemediğimiz bir çok uygulama için yetersiz kalıyor. Bu noktada NavigationItem’ın title property’sini bir kenara bırakıp ilgimizi titleView property’si üzerine yoğunlaştırıyoruz. titleView property’sine değer olarak herhangi bir UIView nesnesi verebiliyorsunuz, bu örnekte UILabel kullanacağım ancak biraz egzersizle farklı fontlar kullanarak yazı yazabilirsiniz ;)

Değişik renkli başlıkları farklı view controller’larda kullanabileceğimizi düşünerek verdiğimiz metni bir label’ın içine yazıp bize o label’ı döndüren bir fonksiyon yazarak başlıyoruz.

1
2
3
4
5
6
7
8
9
+ (UILabel *) labelForNavigationItem:(NSString*) text {
  UILabel *titleView = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 120, 30)] autorelease];
  [titleView setFont:[UIFont boldSystemFontOfSize:16.0]];
  titleView.backgroundColor = [UIColor clearColor]; titleView.textAlignment = UITextAlignmentCenter;
  titleView.textColor  = [UIColor colorWithRed:.80784314 green:.77647079 blue:.50980392 alpha:1.0];
  titleView.textColor = [UIColor whiteColor];
  titleView.text = text;
  return titleView;
}

İlgili view controller’ın viewDidLoad methodu içinde navigationItem’ın titleView property’sine değer atayarak işimizi bitiriyoruz.

1
self.navigationItem.titleView = labelForNavigationItem:@"Menu";

labelForNavigationItem fonksiyonunu zenginleştirmek ve yazınıza görsellik katmak size kalmış.

UILabel kullandığım bir örnek:

Başka bir uygulamada UILabel yerine UIImageView kullandım, demem o ki diğer UIView nesnelerine ihtiyacınız olduğunda hiç çekinmeyin bu kodlarda birkaç değişiklik yaparak sorunsuzca kullanılabiliyor.

Bu yazının puanları da Sergio Morales‘e gidiyor.

4
Eyl

iOS platformu için uygulama geliştiriyorsunuz diyelim, tasarımınız gereği sistemdeki fontlardan başka bir font kullanmanız gerekiyor ya da sadece değişiklik olsun diye bunu yapmak istiyorsunuz belki de. Benim gibi platformun teknik detaylarını bilmeyen bir tasarımcı başınıza iş açmış bile olabilir :)

Öncelikle bu çözümün sadece iOS SDK 4 ve üzeri sürümlerde çalışacağını belirtelim. Eğer bu bir sorun değilse aşağıdaki adımları takip ederek sonuca ulaşabilirsiniz.

  1. Kullanmak istediğiniz font dosyasını (TTF/OTF) XCode’da projenize ekleyin.
  2. Projenizin info.plist (projeadı-info.plist de olabilir) dosyasına ”Fonts provided by application” isimli bir anahtar ekleyin.
    • Eğer birden fazla font kullanacaksanız bu anahtarın tipini Array yapmayı unutmayın.
    • Anahtarın değeri olarak eklediğiniz font dosyasının adını (uzantısıyla birlikte) yazın ve dosyayı kaydedin.
  3. Kodun içinde [UIFont fontWithName:@"YeniFontunAdı" size:16] şeklinde kullanabilirsiniz.
  4. Buradaki “YeniFontunAdı” eklediğiniz dosyanın adı değil bilgisayarınızdaki görünen adıdır. Örnek vermek gerekirse ”bauhaus_med.ttf” dosyasını kullanmak istediğinizde ”YeniFontunAdı” yerine ”Bauhaus Medium” yazmalısınız. Dikkat edilecek bir husus da bazı fontların birden fazla ismi olmasıdır. Hata yapmamak için fontu bilgisayarınızda açıp kontrol edin.

UILabel, UITextView ve UIButton gibi setFont metodu olan her türden nesne için kullanabilirsiniz.
UIButton ile yapılmışı:

Custom Font in UIButton

İlk üç madde için puanlar BeefyApps‘e giderken son madde için birkaç puan da Shang Liang‘a gidiyor.

iOS platformu için uygulama geliştiriyorsunuz diyelim, tasarımınız gereği sistemdeki fontlardan başka bir font kullanmanız gerekiyor ya da sadece değişiklik olsun diye bunu yapmak istiyorsunuz belki de. Benim gibi platformun teknik detaylarını bilmeyen bir tasarımcı başınıza iş açmış bile olabilir :)

Öncelikle bu çözümün sadece iOS SDK 4 ve üzeri sürümlerde çalışacağını belirtelim. Eğer bu bir sorun değilse aşağıdaki adımları takip ederek sonuca ulaşabilirsiniz.

  1. Kullanmak istediğiniz font dosyasını (TTF/OTF) XCode’da projenize ekleyin.
  2. Projenizin info.plist (projeadı-info.plist de olabilir) dosyasına ”Fonts provided by application” isimli bir anahtar ekleyin.
    • Eğer birden fazla font kullanacaksanız bu anahtarın tipini Array yapmayı unutmayın.
    • Anahtarın değeri olarak eklediğiniz font dosyasının adını (uzantısıyla birlikte) yazın ve dosyayı kaydedin.
  3. Kodun içinde [UIFont fontWithName:@”YeniFontunAdı” size:16] şeklinde kullanabilirsiniz.
  4. Buradaki “YeniFontunAdı” eklediğiniz dosyanın adı değil bilgisayarınızdaki görünen adıdır. Örnek vermek gerekirse ”bauhaus_med.ttf” dosyasını kullanmak istediğinizde ”YeniFontunAdı” yerine ”Bauhaus Medium” yazmalısınız. Dikkat edilecek bir husus da bazı fontların birden fazla ismi olmasıdır. Hata yapmamak için fontu bilgisayarınızda açıp kontrol edin. UILabel, UITextView ve UIButton gibi setFont metodu olan her türden nesne için kullanabilirsiniz. UIButton ile yapılmışı:

İlk üç madde için puanlar BeefyApps‘e giderken son madde için birkaç puan da Shang Liang‘a gidiyor.

28
Ağu


Xerox Phaser 3117′niz var ve Mac OS için sürücüsü olmadığını mı fark ettiniz?
Zaten Xerox’un uyumluluk belgesi de Mac OS X 10.6 ile desteklenmediğini söylüyor.

“Ee şimdi ne yapacağız?” diye düşünürken biraz araştırma ile bir çözüm buldum. Yazıcısına uygun sürücüleri ilk bakışta bulamayan herkesin yolu muhakkak Linux Foundation’ın Open Printing çalışma grubunun sitesine düşmüştür, nitekim Mac kullanmama rağmen benimki hala düşüyor :)

Bu sayfadaki şu paketleri sırasıyla indiriyoruz ve kuruyoruz: samsung-gdi foomatic-rip ghostscript

Kurulum işlemleri bittikten sonra Sistem Seçenekleri > Yazıcı & Fax > Yazıcı Ekle yolunu takip ederek karşımıza gelen pencerede arama kutusuna GDI yazıyoruz ve listenin en üstündeki Generic GDI Printer Foomatic/gdi sürücüsünü seçiyoruz.

Voila! Yazıcınız kullanıma hazır.

Kaynak: Vadim Khukhryansky

Xerox Phaser 3117’niz var ve Mac OS için sürücüsü olmadığını mı fark ettiniz? Zaten Xerox’un uyumluluk belgesi de Mac OS X 10.6 ile desteklenmediğini söylüyor.

“Ee şimdi ne yapacağız?” diye düşünürken biraz araştırma ile bir çözüm buldum. Yazıcısına uygun sürücüleri ilk bakışta bulamayan herkesin yolu muhakkak Linux Foundation’ın Open Printing çalışma grubunun sitesine düşmüştür, nitekim Mac kullanmama rağmen benimki hala düşüyor :)

Bu sayfadaki şu paketleri sırasıyla indiriyoruz ve kuruyoruz: samsung-gdi foomatic- rip ghostscript

Kurulum işlemleri bittikten sonra Sistem Seçenekleri > Yazıcı & Fax > Yazıcı Ekle yolunu takip ederek karşımıza gelen pencerede arama kutusuna GDI yazıyoruz ve listenin en üstündeki Generic GDI Printer Foomatic/gdi sürücüsünü seçiyoruz.

Voila! Yazıcınız kullanıma hazır.

Kaynak: Vadim Khukhryansky

23
Nis

Bir MacBook’unuz var ve fark ettiniz ki USB portlarından biri veya birkaçı çalışmayı bırakmış. iPad’inizi iPhone’unuzu ya da başka bir cihazınızı taksanız da hiçbir eylem gerçekleşmiyorsa, cihazınızı şarj edemiyorsanız hemen bozulduğunu düşünmeyin :)

Zira çok kolay bir çözümü var. EFI ve SMC’yi sıfırlamanız gerekiyor. Bunun için bütün açık uygulamaları kapatın çünkü bilgisayarımızı kapatacağız.

Shift+Control+Option+Power düğmelerine eşzamanlı basın ve MacBook’unuzun prize takılı olduğundan emin olun.

Bilgisayarınız kapandıktan sonra Power düğmesine tekrar basın ve gri ekran görüntülenmeden önce MacBook reboot edene kadar Command+Option+R+P düğmelerine basın.

Voila!

Bir MacBook’unuz var ve fark ettiniz ki USB portlarından biri veya birkaçı çalışmayı bırakmış. iPad’inizi iPhone’unuzu ya da başka bir cihazınızı taksanız da hiçbir eylem gerçekleşmiyorsa, cihazınızı şarj edemiyorsanız hemen bozulduğunu düşünmeyin :)

Zira çok kolay bir çözümü var. EFI ve SMC’yi sıfırlamanız gerekiyor. Bunun için bütün açık uygulamaları kapatın çünkü bilgisayarımızı kapatacağız.

Shift+Control+Option+Power düğmelerine eşzamanlı basın ve MacBook’unuzun prize takılı olduğundan emin olun.
Bilgisayarınız kapandıktan sonra Power düğmesine tekrar basın ve gri ekran görüntülenmeden önce MacBook reboot edene kadar Command+Option+R+P düğmelerine basın.

Voila!

25
Eki

Okuldaki son seneme biraz hızlı başladım, 8 ders alıyorum. Bunlardan “Olasılık ve İstatistik Teorilerine Giriş” ve “Çokluortam Sıkıştırma ve İşleme” isimli iki derse birbirleriyle iç içe olmaları sebebiyle diğerlerinden fazla ilgi gösteriyorum.

Çokluortam Sıkıştırma ve İşleme dersini Sıla Ekmekçi Flierl isimli hocamız veriyor. Kendisi bu konudaki çalışmalarıyla tanınan oldukça donanımlı ve tecrübeli biri. Bazen anlattıklarını algılamakta sorunlar yaşasak da araştırıp altyapımızı geliştirdikçe daha rahat anlaşabildiğimizi görüyorum.

Gelelim konumuza; haftaya sınav var ve çalışmak için kaynağa ihtiyacım var. Hocamızın ders materyali olarak kullandığı Bernd Girod’un sunum dosyalarını bulmam gerekiyordu ve hepimizin yapacağı gibi Google’a sorayım dedim, pek ümitli değildim aslında. Google’da bulamazsam p2p ağlara bakacaktım ancak birkaç sayfa taradıktan sonra fark ettim ki Stanford’da Bernd amcanın verdiği aynı isimli dersin bütün sunum dosyaları erişime açıkmış. Tabii ki hemen sömürdüm :)

Okulda 5. yılıma girdim ve henüz ders notlarını kolayca paylaşan bir hoca ile karşılaşmadım. Kimisinin çok ahlaki sebepleri varken (korsan materyal paylaşımı yapmak istememek gibi) kimisinin sadece “benim emeğim var, kendi araştırmam ve notlarım, neden sizinle paylaşayım” demesi sonucu eski öğrencilerin birikimlerine yöneldik hep.

Bir eğitmen, bir akademisyen, bir bilimadamı neden üretimini saklar, neden paylaşıma açık olmaz. Kaybedecek neleri olabilir ki? Ya da kazanacaklarının yanında daha değerli ne kaybedebilirler? Neden “özgür” kılmıyoruz bilgiyi? Akademisyen ne iş yapar?

Daha bir sürü soru sorulabilir ancak cevaplarını verebileceğimiz günün gelip gelmeyeceğini merak ediyorum ben. Ya da cevapları da boşverin, bütün akademisyenlerin ürettiği bir ülke istiyorum. Belki Murat Eren gibi Necdet Yücel gibi ya da adını bilmediğim, yazmayı unuttuğum diğer idealist akademisyenlerin artması lazım, kesinlikle bunu istiyorum.

Birileri “özgür” olmayı, “özgür” bırakmayı öğretsin. Bunu bazen zorunluluklar koyarak, bazen kendisi örnek olarak yapsın.

Okuldaki son seneme biraz hızlı başladım, 8 ders alıyorum. Bunlardan “Olasılık ve İstatistik Teorilerine Giriş” ve “Çokluortam Sıkıştırma ve İşleme” isimli iki derse birbirleriyle iç içe olmaları sebebiyle diğerlerinden fazla ilgi gösteriyorum.

Çokluortam Sıkıştırma ve İşleme dersini Sıla Ekmekçi Flierl isimli hocamız veriyor. Kendisi bu konudaki çalışmalarıyla tanınan oldukça donanımlı ve tecrübeli biri. Bazen anlattıklarını algılamakta sorunlar yaşasak da araştırıp altyapımızı geliştirdikçe daha rahat anlaşabildiğimizi görüyorum.

Gelelim konumuza; haftaya sınav var ve çalışmak için kaynağa ihtiyacım var. Hocamızın ders materyali olarak kullandığı Bernd Girod’un sunum dosyalarını bulmam gerekiyordu ve hepimizin yapacağı gibi Google’a sorayım dedim, pek ümitli değildim aslında. Google’da bulamazsam p2p ağlara bakacaktım ancak birkaç sayfa taradıktan sonra fark ettim ki Stanford’da Bernd amcanın verdiği aynı isimli dersin bütün sunum dosyaları erişime açıkmış. Tabii ki hemen sömürdüm :)

Okulda 5. yılıma girdim ve henüz ders notlarını kolayca paylaşan bir hoca ile karşılaşmadım. Kimisinin çok ahlaki sebepleri varken (korsan materyal paylaşımı yapmak istememek gibi) kimisinin sadece “benim emeğim var, kendi araştırmam ve notlarım, neden sizinle paylaşayım” demesi sonucu eski öğrencilerin birikimlerine yöneldik hep.

Bir eğitmen, bir akademisyen, bir bilimadamı neden üretimini saklar, neden paylaşıma açık olmaz. Kaybedecek neleri olabilir ki? Ya da kazanacaklarının yanında daha değerli ne kaybedebilirler? Neden “özgür” kılmıyoruz bilgiyi? Akademisyen ne iş yapar?

Daha bir sürü soru sorulabilir ancak cevaplarını verebileceğimiz günün gelip gelmeyeceğini merak ediyorum ben. Ya da cevapları da boşverin, bütün akademisyenlerin ürettiği bir ülke istiyorum. Belki Murat Eren gibi Necdet Yücel gibi ya da adını bilmediğim, yazmayı unuttuğum diğer idealist akademisyenlerin artması lazım, kesinlikle bunu istiyorum.

Birileri “özgür” olmayı, “özgür” bırakmayı öğretsin. Bunu bazen zorunluluklar koyarak, bazen kendisi örnek olarak yapsın.

2
Eki

Birbirimizi mükemmelleştirmenin ya da buna çabalamanın kolay olacağını zaten düşünmüyordum. Zor olacağını ve bir çok şeyin kırılıp dökülebileceğini biliyordum. Beklemediğim ise bu kadar genel kabul noktalarda anlaşamamış olmamız idi.

Giden kim olursa olsun aklı diğerinde kalmayacak mı sanıyorsun? Öyleyse yanılıyorsun.

Gerçekten de Serdar Ortaç’ı yoran hayat bize acı koydu..

23
Ağu

Artistanbul’da tekrar çalışmaya başladığım dönemlerde bir müşterimizin sitesi hazırlanıyordu. Süre olarak çalışmanın ortalarına denk geldiğim için pek müdahale şansım olmadı ve altyapıda Symfony kullanıldı. O gün bugündür, sunucu tarafında herhangi bir yerine müdahale etmek istediğimizde karşımıza her seferinde birbirinden farklı ve izlenemez hatalar çıkıyor.

Neyse ki bugünkü izlenebilir bir hataydı ve benden önce birileri çözmüştü :) Birazcık aramayla öğrendim ki Fatal error: Class ‘sfInflector’ not found – Symfony $VER diye ağlamasının sebebi strtolower işlevinin Türkçe yerelinde doğru çalışmaması.

Çözüm olarak symfonylibfolder/autoload/sfCoreAutoload.class.php dosyasının 440. satırındaki
'sfinflector' => 'util/sfInflector.class.php',
satırını şununla değiştirin:
'sfInflector' => 'util/sfInflector.class.php',

strtolower’ın nasıl çalışmadığını görmek isteyenler şunu çalıştırabilirler:
<?php echo strtolower('sfInflector'); // sonuç: sfInflector ?>

Evet, yıl 2010 oldu hala Türkçe için yerel sorunlarından bahsediyoruz…

Artistanbul’da tekrar çalışmaya başladığım dönemlerde bir müşterimizin sitesi hazırlanıyordu. Süre olarak çalışmanın ortalarına denk geldiğim için pek müdahale şansım olmadı ve altyapıda Symfony kullanıldı. O gün bugündür, sunucu tarafında herhangi bir yerine müdahale etmek istediğimizde karşımıza her seferinde birbirinden farklı ve izlenemez hatalar çıkıyor.

Neyse ki bugünkü izlenebilir bir hataydı ve benden önce birileri çözmüştü :) Birazcık aramayla öğrendim ki Fatal error: Class ‘sfInflector’ not found – Symfony $VER diye ağlamasının sebebi strtolower işlevinin Türkçe yerelinde doğru çalışmaması.

Çözüm olarak symfonylibfolder/autoload/sfCoreAutoload.class.php dosyasının 440. satırındaki 'sfinflector' => 'util/sfInflector.class.php', satırını şununla değiştirin: 'sfInflector' => 'util/sfInflector.class.php',

strtolower’ın nasıl çalışmadığını görmek isteyenler şunu çalıştırabilirler: <?php echo strtolower('sfInflector'); // sonuç: sfInflector ?>

Evet, yıl 2010 oldu hala Türkçe için yerel sorunlarından bahsediyoruz…