Web 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
Bir iş için lazım olunca emektar Xerox 3117′yi kutusundan çıkarıp kurmak istedim. Meğer Mac Os X sürücüsü yokmuş. Ama bu onu kullanmak için engel değil tabi. Google’da bulduğum kısa bir dökümanı burada paylaşarak hem kendime hem de aynı problemi yaşayanlara küçük bir not bırakmış olalım.
Yazıcıyı kullanabilmek için üç paket programı kurmak gerekiyor.
Mac kullanmaya başladığımdan beri bilgisayarda sadece program yazmak değil bilgisayarı kullanmak da büyük bir keyif haline gelmişti benim için. Mac’deki tek şikayetim doğru düzgün -daha doğrusu alıştığım şekilde olan- bir veritabanı istemcisi bulamamaktı. Veritabanı uygulaması olarak EMS’nin eline su dökebilecek bir yazılım bilmiyorum. Mac’de EMS yerine Navicat, SequelPro gibi muadillerini kullanarak idare ediyordum ya da EMS’yi parallel ile çalıştırıyordum. Mac’de o uyuz Windows başlangıç sesini duymak ve etrafımdan “oha! windows mu kurdun mac’e, naptın hacı ya?” nidalarıyla karşılaşmak canıma yetti ve dün keşke Wine’nın da Mac versiyonu olsaymış dedim. Meğer varmış! Şimdiye kadar hiç Wine aklıma gelmemişti. Ofiste Linux kullanan arkadaşlarım Wine kullanıyorlardı ve çok büyük problemler yaşamıyorlardı. Amcalar sağolsunlar MacPorts’a Wine’ı da eklemişler. Kaç saat sürdü bilemiyorum (çünkü bilgisayarı açık bıraktım ertesi gün ancak bitti kurulum) ama sorunsuz bir şekilde MacPorts’dan Wine’ı kurdum. MacPorts için şu yazıma bakabilirsiniz (Lion kullananlar için xCode’un kurulu olması gerektiğini hemen not düşeyim).
Komut satırından
#port install wine
deyip sabırla saatlerce bekledikten sonra Wine sorunsuzca kuruldu. Sıra EMS’yi kurmaya geldi. Yine komutsatırından EMS’nin setup dosyasının oldugu klasöre geçip
#wine MyManagerFullSetup.exe
komutunu çalıştırınca Windows’dan aşina olduğunuz kurulum ekranı geliyor, “Next”, “Next” diyerek programı kuruyorsunuz. Lazım olmaz ama yine de söyleyeyim, eğer Registry ile oynamanız gerekiyorsa(!) wine’ın registry ayarları ~/.wine/ klasörünün içinde. Wine’nın diğer klasörleri de burda (drive_c gibi).
Şimdi sıra geldi EMS’yi Dock’ta bir simgeye tıklayarak çalıştırmaya. Bunun için küçük bir AppleScript yazacağız. Endişeye mahal yok, ben de hayatımda ilk kez yazdım, ısırmıyor.
Spotlight’dan “AppleScript Editor” uygulamasını bulup çalıştıralım. Açılan ekranda aşağıdaki kodu yazalım (siz kurduğunuz uygulamaya göre yolu düzenlemelisiniz).
tell application “Terminal”
do script “/opt/local/bin/wine ~/.wine/drive_c/Program\\ Files/EMS/SQL\\ Manager\\ for\\ MySQL/MyManager.exe”
end tell
Bu kodu yazdıkdan sonra uygulamanın en üstünde yer alan “Compile” simgesine tıklayın. Compile işlemi başarılı olduysa yazdığımız kod renk değiştirecektir. Kodu denemek için yine yukarıda yer alan “Play” simgesini kullanabilirsiniz. Terminal ekran çalıştıktan sonra uygulamamız başarılı bir şekilde açılacaktır. Terminal ekranı göstermeden bu işi yapmanın bir yolu var mı bilmiyorum. Bilenler varsa ve paylaşırlarsa sevinirim.
Kodumuzun düzgün çalıştığını test ettikten sonra kaydedebiliriz. Kaydederken “Application” formatında kaydetmeyi unutmayın. Aksi halde çalışmayacaktır. Artık bu oluşturduğumuz basit uygulamayı Dock’a sürükleyebiliriz ve üzerine tıklayarak uygulamamızı başlatabiliriz. Keşke simgesini de değiştirebilsek, fakat onu da nasıl yapılır bilmiyorum. Bilenler paylaşsın lütfen.
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.
MySQL ile tanışalı 10 seneyi geçti; şu hayat kurtaran “ignore” ifadesine bir kere bile denk gelmedim. Bu gece mühim bir işlemi PHP’ye bırakmaksızın sadece veritabanı üzerinden halledeyim diye uğraşırken -kabaca ifadeyle belli bir kriterdeki verileri bir tablodan başka bir tabloya arşivliyordum- hedef tablodaki unique indexler yüzünden canım sorgum “duplicate error” alıyor ve canımı sıkıyordu. Geçen hafta daha da büyük bir datayı işlerken bu tip bir sorun çıktığında işlemi tek bir query ile yapmak yerine aynı vazifeyi görecek update yada insert satırlarınının sql ifadelerini bir txt dosyaya yazıyor ve MySQL client’i üzerinden biner ikişer çalıştırıyordum. Query’ler satır satır olduğundan dublicate hatası veren satırların dışındakiler çalıştığı için işimi görüyordu. Fakat bu gecekinde durum böyle rahat değildi. Olayın tek bir sql ifadesinde olup bitmesi gerekiyordu. Çünkü bu işlem bir fonksiyona bağlanacaktı ve kullanıcı o sayfaya her girdiğinde bu işlem otomatik olarak yapılacaktı. Hasılı bu query’lerle ordan al buraya koy işlemi sırasında oluşan dublicate hatalarını “ignore” edecek bir şey olsa ne iyi olurdu.
Google’a “mysql force insert, skip dublicate entry” yazdım ve geçen hafta çektiğim zahmet yüzünden saçımı başımı yoldum.
Efendim; şöyle basit bir “ignore” ifadesi ile query’niz hata vermeksizin “kalan sağlar bizimdir” mantığıyla çalışacaktır..
insert ignore into tbl_hedef_tablo (sutun1, sutun2, sutun3)
select sutun1, sutun2, sutun3 from tbl_kaynak_tablo
İki haftadır iPhone kursumuzla ilgili yazı yazamadık. Bunun en büyük nedeni kurs dışındaki işlerimizin aşırı yoğun olmasıydı. Kursdaki konular da giderek daha karmaşık hale geldiği için malesef yazacak vakit bulamadım. Bir ara screen-recording ile video şeklinde hazırlayayım dedim ama sessiz bir ortamda boşluğa konuşmayı beceremedim. Bir kaç popüler video blog inceledim, ama bana göre değilmiş. Hasılı, klasik usüle devam.
Bugün sanırım 10. dersi gördük. Sayısı mühim değil, mevzusu mühim. Artık dışardan data alabileceğimiz konulara geldik. Hocamız önce plist denen dosyalardan nasıl veri okuyabileceğimizi anlattılar. Kısa fakat çok yararlı bir konu olduğundan blogda paylaşmak istedim.
Plist dosyaları, anahtar=>değer (key=>val) formatında veri içeren basit xml dosyalarıdır. Aslında bütün iPhone/iPad uygulamalarında zaten bir tane plist dosyası (uygulama_adi.plist) bulunmaktadır ve uygulamanın icon dosyaları, uygulamanın görünecek adı, ana nib dosyasının ne olduğu gibi bazı ayarlar bu dosyada tutulur.
Biz de istediğimiz kadar plist dosyası oluşturup projemizin resource kısmına koyabilir ve uygulamamızda bu dosyalardan faydalanabiliriz.
Basit bir örnekle konunun detaylarına girelim: Amacımız yine yemek tarifleri uygulaması yazmak olsun. Ama bu kez datamızı kodun içerisine değil bu plist dosyalara yazalım. İnşallah ileriki konularda da veritabanına yazarız. Uygulamamız “navigation based” bir uygulama olsun ve ilk açıldığında listede yemek kategorileri olsun, tıklandığında ikinci listede de o kategorilerdeki yemekler görünsün. Sonraki aşamaların mantığını zaten daha önceki yazılarda uzun anlatmıştık. O kısımlara hiç girmeyelim. Sadece birbiri ardınca iki listeyi plistlerle doldurmayı görelim.
Bir önceki yazıda MySQL için split_str() fonksiyonunu oluşturmuştuk. Kelimeleri verdiğimiz karaktere göre bölüyordu. Amacımız; ad ve soyad değerleri tek bir sütunda isim olarak verildiğinde bu isim bilgisinden ad ve soyadı ayrıştırabilmek idi. split_str() fonksiyonu datayı istediğimiz karaktere göre (örneğin boşluk karakteri) bölebiliyor ve ortaya çıkan gruplardan hangisini görmek istiyorsak onu almamızı sağlıyor. Ama problemimiz için bu yeterli değil. Çünkü isimler her zaman “Fehim Tabak” gibi bir ad ve bir soyaddan oluşmuyor. İki ad ve bir soyad, hatta kulakları çınlasın sevgili arkadaşım “Yusuf Ziya Bektaş Köseoğlu” gibi üç ad ve bir soyad da olabiliyor. Böyle bir bilgiden soyadı ve adı ayrıştırabilmek için “en son kelime soyaddır” ve “en son kelime hariç diğerleri addır” diyebilmek gerek. Aşağıda yazacağımız count_str() fonksiyonu işte bu noktada devreye giriyor.
CREATE FUNCTION COUNT_STR(
x VARCHAR(255),
delim VARCHAR(12)
)
RETURNS INT
RETURN LENGTH(x)-LENGTH(REPLACE(x,delim,”));
Bu fonksiyon parametre olarak verdiğimiz karakterin yine parametre olarak verdiğimiz kelimenin içerisinde kaç kere geçtiğini döndürüyor. Boşluk ‘ ‘ karakteri ilgili alanda kaç kere var diye kullanırsak ‘Fehim Tabak’ için 1, ‘Yusuf Ziya Bektaş Köseoğlu’ için 3 döndürür. Bu sayının bir fazlası bize o alanda kaç kelimelik bir bilgi olduğunu yani ismin kaç kelimeden oluştuğunu döndürür.
Excel’den aldığım bir veriyi hazırladığım bir tabloya aktarmam gerekiyordu. Tablomda ad ve soyad sütunları ayrı ayrı olacak şekilde tasarlanmıştı ama aktarmak istediğim Excel dosyasında isim olarak tek sütun vardı.
İlk iş olarak Excel dosyasını phpmyadmin yardımıyla komple bir tablo olarak veritabanına yükledim. Aktarma için kaynak tablodan select yapıp hedef tabloya insert uygulayacaktım ama bu ad, soyad sütunlarının ayrı ayrı olması işi biraz bozdu. Kaynak tablodan select yaparken isim sütunundaki veriyi kelimeler arasındaki boşluklardan yakalayıp ad ve soyadını soyadını ordan ayrı ayrı yakalamak icab ediyordu.
PHP’de bu tarz bir parçalama işlemini explode() fonksiyonu ile yapmaya alışmış biri olarak keşke MySQL’de de olsa diye düşündüm. MySQL’de yokmuş ama basit bir formülle kazandırılabiliyormuş. İşte MySQL için split fonksiyonu:
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
CHAR_LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
Bu fonksiyonu şu şekilde kullanabiliyoruz:
select split_str(isim,’ ‘,1);
Yukarıdaki select ifadesinde isim hanesini boşluklarından ayırmasını ve ilk kelimeyi yazmasını sağlamış olduk.
Yarın kursumuzun beşinci dersi var, bense daha dördüncü dersi yeni yazıyorum. Bugün bütün günümü üçüncü dersin ikinci kısmı olan Navigation Controller yazısını yazmaya harcadığım için -ve tahminimden çok daha uzun sürdüğü için- Tab Bar Controller’a anca sıra geldi. Uzun uzun yazmak gerçekten yorucu oluyor, ileride Video Blog şekline geçmeyi düşünebilirim.
Bu kez kısa kısa gitmeye çalışacağım. Bir önceki uzuun yazıyı iyice sindirdiyseniz temelde ondan farklı hiç bir şey yapmadığımızı göreceksiniz.
Bu dersde sıfırdan Tab Bar Controller kullanmayı göstermişti hocamız. Fakat notlarımı şirkette unuttuğum için dersteki örnek yerine yine bir önceki yazıdaki gibi Yemek Tarifleri uygulamasının başka bir versiyonu ile yazıya devam edelim. Tab Bar kullanmak asıl amacımız olacağı için daha önceki yazıda “Etli Yemekler, Zeytinyağlılar ve Çorbalar” şeklinde olan kategorileri bu kez Tab Bar’ımızın sekmeleri olarak düşünelim. Sekmelere basıldıkça birer liste çıksın ve içinde yemekler sıralansın (Table View Controller). En son sekme olarak da “Hakkımızda” sekmesini ekleyelim. Buna basıldığında programımız hakkında küçük bir bilginin yer aldığı ekran görünsün (Custom View Controller).
Kursda üçüncü dersin son kısmında hızlıca Navigation Controller’ı görmüştük fakat yazmaya fırsat bulamamıştık. İyi de oldu, çünkü tek bir yazıda uzun uzadıya bütün dersi anlatmaktansa konulara göre bölerek anlatmak daha iyi olur kanaatindeyim.
iPhone uygulamalarında en çok kullanılan view controller’lardan biri de Navigation Controller’dır. Navigation Controller’da hiyerarşik bir düzen vardır. Genelde Table View’larla beraber kullanılır. Kullanıcı ilk Table View’dan bir satıra tıkladığında o satırla ilgili yeni bir view çağrılır. Eğer bu da bir Table View ise burdaki bir satıra tıklandığında bir sonraki ilgili view çağrılır. Her bir alt kademedeyken bir üst kademeye geri dönmek için Uygulamanın üst kısmındaki bar’da geri dönüş butonları otomatik olarak çıkar (Tabi o ekran için bir title -başlık- yazmışsak).
Şimdi basit bir uygulama ile Navigation Controller’in detaylarına inelim. Yemekler adında küçük bir uygulama hazırlayalım, ilk ekranda “Etli Yemekler, Zeytinyağlılar ve Çorbalar” şeklinde yemek kategorileri listelensin. Etli Yemekler’e tıklandığında “Orman Kebabı, Hünkar Beğendi, İskender” sıralansın. Zeytinyağlılar’a tıklandığında “Taze Fasülye, İmam Bayıldı, Barbunya” sıralansın. Çorbalar’a tıklandığında “Ezo Gelin, Tarhana, Yayla, Şehriye” sıralansın. Aslında kursda bu örneği işlemedik ama nasılsa blog’da zamanımız daha bol olduğu için sindire sindire anlayalım diye bu tarz bir örnek kullanmak istedim. (daha fazla…)