iPhone’daki dosyalarınızı Sync belasına bulaşmadan almak istiyorsanız ücretsiz iPhone Explorer (yeni adıyla iExplorer) tam bu iş için biçilmiş kaftan. Voice Memo’daki 40 dakikalik ses dosyasını iPhone’u sync etmeden nasıl alabilirim diye araştırırken bu harika uygulamaya rastladım. Windows versiyonu da mevcut. iPhone’unuzdaki fotoğraflar, videolar, voice memo gibi medya öğelerinin yanısıra uygulamaların içindeki Documents klasörünü de gösterip oradan data almanızı sağlıyor. Sürükle bırak yöntemi ile iExplorer’daki dosyaları masaüstünüze kopyalayabiliyorsunuz.
iPhone Explorer
Perşembe, Mayıs 3rd, 2012Chrome’da file objesini tetiklemek
Pazar, Nisan 29th, 2012
Web sayfanızda File input öğresi yerine bir buton veya link ile dosya diyalog penceresini açmak istediğinizde ilk yaptığımız şey “display:none” diyerek mevcut file input nesnesini gizlemektir. İşte chrome da tam buna gıcık oluyormuş. O nesne görünmez olduğu için jquery ile $(“#file_input_nesnesi”).trigger(“click”) dediğinizde bir tepki vermiyor. Yapılacak iş file input nesnesini başka bir şekilde gizlemek. Mesela “position:absolute; top:-999px; left:-999px” şeklinde stil vererek gizlediğimizde sorun kalmıyor..
Jcrop ve Twitter Bootstrap çakışması
Cumartesi, Nisan 28th, 2012
Bir mikroproje için lazım olan Jcrop (görselleri kesmeye yaran güzel bir jQuery eklentisi) düzgün çalışmayınca mutlaka başka bir Javascript ile ya da CSS ile çakıştı diye düşündüm. Yanılmamışım, sayfadaki diğer Javascript ve css dosyaları sırayla kaldırdığımda sorunun projede kullandığım Twitter Bootstrap css dosyaları ile çakışmasından kaynaklandığını farkettim. Her ikisi de çok kullanılan kaynaklar olduğu için kesin bu problem başkalarının da karşısına çıkmıştır ve bir çözüm üretmişlerdir diyerek Googling yaptım ve bir iki çözümü denedikten sonra sorunumu şu adresteki düzelme ile hallettim.
Jquery.Jcrop.css dosyanıza şu düzeltiyi yaparsanız, ya da bunu en son yüklenecek şekilde ayrı bir css’e koyarsanız sorun düzeliyor:
/* Fix for using with Bootstrap, from Twitter */ div.jcrop-holder img, img#preview { max-width: none; }
SEO uyumlu link
Cuma, Mart 16th, 2012
SEO yani arama motoru optimizasyonu için haber.php?id=110 gibi manasız bir link yerine haber/bugun-teknoparka-kar-yagdi gibi semantik yani kelime bakımından anlamlı linkler çok mühimdir. Google’da “teknopark” aratıldığında bu haber sayfasının çıkması için bu şekilde link vermek, alınacak SEO önlemlerinden biridir. SEO uyumlu linkler genelde içeriğin (haber, ürün, sayfa vs) orijinal başlığındaki Türkçe özel karakterler İngilizce benzerleriyle (ö yerine o gibi) değiştirilerek ve noktalama işaretleri kaldırılıp kelime aralarındaki boşluk yerine “-” (orta tire) konarak oluşturulur ve bu şekilde kaydedilir. Gerçi bunun bir kaç taklası var. Mesela haber.php?id=110#bugun-teknoparka-kar-yagdi demek de SEO için aynı etkiyi verir. Bu örnekte yine id önplandadır, haberin içeriği id ile sorgulanarak getirilir. Sonrasında gelen #bugun-teknoparka-kar-yagdi ibaresi Google için gereken uyumu sağladığı gibi sayfadaki bu isimli bir çapaya gitmeye çalıştığından eğer öyle bir çapa yoksa zaten problem çıkarmaz. Belki SEO uzmanları iki yöntem arasında bir fark biliyorlardır ama eski tarihli bir çok siteye bu şekilde etliye sütlüye karışmayan güncellemeler yaptık ve hepsi de Google için olumlu gelişmelerle neticelendi, herhangi bir sorun yaşanmadı.
Normal bir cümleden SEO uyumlu link kodu üretmek için küçük bir fonksiyon işinizi görecektir.
function seoLink($kelime)
{
$kelime=strtolower($kelime);$sub=array(” “,”ğ”,”ı”,”ü”,”ş”,”ö”,”ç”);
$tar=array(“-”,”g”,”i”,”u”,”s”,”o”,”c”);
$kelime=str_replace($sub,$tar,$kelime);$kelime=preg_replace(“/[^a-z0-9\-]/i”,”",$kelime);
//a-z ve 0-9 arası hariç tüm karakterleri kaldırırreturn $kelime;
}
MySQL’de bozuk view’ların detayını görmek
Cuma, Aralık 9th, 2011
MySQL view’ları siz view’i oluşturduğunuz tabloda yapısal değişiklikler yaptığınızda bozulurlar. Kullandığınız veritabanı istemcisine bağlı olarak MySQL’deki bozuk viewlarınızı oluşturan sorguyu göremeyebilirsiniz. PhpMyAdmin gösterir mesela. Göremediğiniz view’ın içeriğini not almamışsanız düzeltmek için epey terlemeniz gerekir.
Eğer istemciniz bozuk view’ları göstermiyorsa şu query’i kullanarak view detayını bozuk da olsa alabilirsiniz.
select view_definition from information_schema.views where table_name = “buraya_view_adi_gelecek”;
Group Concat!
Pazar, Aralık 4th, 2011İyi kötü 11 yıldır PHP-MySQL-PostgreSQL ile uğraşıyorum. Binlerce kez tablo şeklinde listeler hazırlamışımdır; sipariş listesi, müşteri listesi gibi. Genel olarak benzese de aslında sipariş listesi ile müşteri listesi ayrı yapıdadır. Müşteri listesi tek tablodan ibaret olabilir. Müşterinin adı, soyadı, adresi, telefonu vs. Bunları alt alta listelemekte hiçbir beis yok. Ama sipariş listesi öyle değildir. Siparişin genel bilgilerinin (sipariş tarihi, siparişi veren müşterinin id’si, siparişin durumu vs) yanısıra bir de o siparişte geçen ürünlerin id, adet ve belki o anki satış fiyatlarının tutulduğu ayrı bir tablo vardır. İç içe query’ler olmasın, kullanıcının da kafası karışmasın diye sipariş listesini oluştururken sadece sipariş genel tablosundaki bilgileri ekrana basar, en çoğu bu siparişte şu kadar ürün vardır diye bir count() bilgisi koyarız.
Halbuki hemen her müşteri de şunu ister; yahu burda siparişler güzel görünüyor da, hangi ürünleri almış görmek için illa sipariş detaylarına tıklamam gerekiyor. Biz de ahkam keseriz “ee aksi halde burda her sipariş için n tane satır görmen gerekecek, daha karışık bir ekran olacak bıdı bıdı bıdı”..
Halbuki siparişlerin çoğunda ya bir ürün var ya iki. Ekranda basmak bile problem oluşturmayacak ama o iç içe querylerle sistemi yormamak ya da topluca çok satır getirecek şekilde çekip php ile tabloyu düzeltmek zahmetine girmeyecek bir şey olsa.. sum() gibi.. sum() madem bir sütundaki rakamları toplayabiliyor, yok mu concat()’ın sum() gibi olanı..
Olmaz mı.. Olur elbet. Sen bu soruyu 11 sene önce sorsaydın ya akıllım.
Efendim, çektiğim sancıları yukarıda anlatıp size de aynı sancıları çektirebildiysem ne ala :) Öyle peşin peşin aha burdan böyle yapılıyor diyecek değildim :)
Belki benim gibi tanımayanlar vardır diye çok geç tanıştığım group_concat() ile sizleri tanıştırayım. Kendisi mySQL komutudur ama eminim diğer SQL dillerinde de muadilleri vardır.
Gayet kolay kullanılıyor. Klasik group by ifadenizi yazıyorsunuz, select kısmına group_concat(yanyana_gelecek_sutun_adi) şeklinde ifadeyi ekliyorsunuz. Örnek:
select s.id, s.musteri_id,s.tarih,s.durum_kodu, group_concat(u.urun_adi)
from tbl_siparis s
left join tbl_siparis_urun u on u.id=s.urun_id
Daha detaylı yazmak isterseniz:
select s.id, s.musteri_id,s.tarih,s.durum_kodu, group_concat(u.urun_adi order by u.urun_adi separator ‘, ‘)
from tbl_siparis s
left join tbl_siparis_urun u on u.id=s.urun_id
Form’u sayfadakinden farklı bir charset ile göndermek
Salı, Eylül 27th, 2011Hiç iso-8859-9 charsetinde hazırlanmış bir sayfadan utf-8′e göre hazırlanmış başka bir sayfaya form datası göndermeniz gerekti mi? Bize gerekti. Kütüphane web sitemiz biraz eski kalmış ve iso-8859-9 formatında hazırlanmış. Yeni kurulan kütüphane yazılımı ise utf-8′e göre hazırlanmış. Web sitesindeki arama kutucuğuna “ağaç”,”şair”, “ırmak” gibi Türkçe özel karakter içeren kelimeler yazdığınızda karşı tarafa a?a?, ?air, ?rmak gibi abuk subuk karakterler gittiğinden aramalar sonuç vermiyordu haliyle.
Bu sorunu gidermek için önce utf8′e çeviren javascript fonksiyonlarını inceledim. Malesef bulduğum bir kaç tane fonksiyon sadece belli karakterleri düzeltiyordu.
Aramaları biraz daha derinleştirince formların accept-charset diye tam bu iş için hazırlanmış bir özelliği daha olduğunu öğrendim. Sayfanın charset’i ne olursa olsun form’a accept-charset=utf-8 yazabiliyormuşuz. Yazdım, fıstık gibi çalıştı. Fekaaat! Her zamanki gibi Internet Explorer bu özelliği desteklemiyor.
Neyse ki onun da çözümü varmış. Forma aşağıdaki öğeyi eklediğinizde sorun çözülüyor:
<input type=”hidden” name=”enc” value=”™”>
YouTube Videolarına Önizleme Resmi
Salı, Eylül 27th, 2011Web sitenizde video galeri yapmak ve bu hizmet için YouTube’dan yararlanmak istiyorsanız vidoların önizleme resimlerine ihtiyaç duyacaksınız. Aşağıdaki örnek url’leri kullanarak videoların önizleme imajlarına ulaşabilirsiniz. Videoyu verdiğiniz gibi imaj dosyasını da YouTube üzerinden verebilir ya da yazacağınız kodla sisteminize kopyalayabilirsiniz. O size kalmış:
Örnek YouTube videosu: http://www.youtube.com/embed/4rb8aOzy9t4
Önizleme imaj dosyası yolu:
http://img.youtube.com/vi/4rb8aOzy9t4/1.jpg
http://img.youtube.com/vi/4rb8aOzy9t4/2.jpg
http://img.youtube.com/vi/4rb8aOzy9t4/3.jpg

MacosX İkinci Monitörde Dock ve Menü Kullanmak
Pazar, Mart 27th, 2011
Henüz 6 aylık olan Mac Mini’miz bugün GG’de yeni sahibine kavuştu. İş böyle olunca Mac Book Air’i büyük monitöre bağlamak ve konfigüre etmek lazım oldu. Miniport-VGA adaptörü sayesinde ikinci monitör problemsiz çalıştı fakat menü ve dock küçük ekranda kaldı. Bu can sıkıcı durum çok şükür fazla uzun sürmedi. Meğer “System Preferences / Displays” ekranında orta tab’da yer alan “Arrangement” sadece monitörlerin hizasını değil, dock ve menünün nerede olacağını da ayarlamamıza yarıyormuş. İnternette yabancı bir sitede nasıl yapılacağını gösteren videoyu izlemeseydim hayatta aklıma gelmezdi. Yandaki ekran çıktısında da görebileceğiniz üzere sağ taraftaki küçük ekran üzerindeki temsili menü çubuğunu fare ile sol ekrana sürükleyebiliyoruz. Böylece ana ekran soldaki büyük ekran olmuş oluyor.
Birden fazla Table View ile çalışmak
Çarşamba, Aralık 29th, 2010
Eğer iPhone uygulamamızda birden fazla Table View kullanmak istiyorsanız ve kodlar da birbirine karışmasın diyorsanız aşağıdaki adımları takip ediniz:
- View Based Application taslağı ile yeni bir proje oluşturun. (Bu yazı için hazırladığımız örnek projemize “CokluTablo” adını verdik. Dosya isimlendirmeleri bu şekilde yapılacaktır.)
- Resurce klasöründeki CokluTabloViewController.xib dosyasını Interface Builder ile açıp içine Library’den 2 tane TableView nesnesi yerleştirin. (Resim 1)
- Xcode’a geri dönüp Classess klasörüne sağ tıklayın ve şu adımları seçin: Add -> New File -> UIViewController Subclass (seçeneklerden sadece UITableViewController subclass seçili olsun). (Resim 2)
- Dosya adı olarak Tablo1.m yazın (Tablo1.h da otomatikmen oluşacaktır).
- Aynı işlemi tekrar yapın ve dosya adı olarak Tablo2.m yazın. (daha fazla…)

