15 Ağustos 2017

Today I’m going to show how to obtain data from the Firebase database by substring search in Objective-c programming language.

Firebase database is a NoSql database as you know. So it supplies high performance for key-value data. But you may need “LIKE” query sometimes. Firebase database doesn't have  any query such as “LIKE” yet but it provides two other queries for substring searches from the beginning and the end of the string.

We will use these 2 queries:
queryStartingAtValue
queryEndingAtValue

Let’s assume we have a database like :
// -root
//  -users
//   -user1
//     name
//     age
//     ...
//   -user2
//     name
//     age
//     ...
// ....

// Let's try to get users whos name starts with 'ja'
NSString *searchString = @"ja";
NSString *endingString = [NSString stringWithFormat:@"%@\uf8ff", searchString];

// Create the query
FIRDatabaseQuery *query = [[[[[[FIRDatabase database] reference] child:@"users"]
                             queryOrderedByChild:@"name"]
                            queryStartingAtValue:searchString]
                           queryEndingAtValue:endingString];

// Run the query
[query observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
    
    if(snapshot.hasChildren) {
        for (FIRDataSnapshot *child in snapshot.children) {
            NSLog(@"User Id: %@", child.key);
            NSLog(@"User : %@", child.value);
        }
    }
}];

NOTE: We need to add  "\uf8ff" character into search string for the queryEndingAtValue. 

"The character \uf8ff used in the query is a very high code point in the Unicode range (it is a Private Usage Area [PUA] code). Because it is after most regular characters in Unicode, the query matches all values that start with the queryText." https://stackoverflow.com/a/40633692/2186887

Have a nice day.

23 Temmuz 2017

Hi,


Jailbroken iOS devices can innitiate fake in-app purchases in your application. This is a bit annoying situation, both for users as well as for an application owner. Maybe you can not stop fake in-app purchases but you can stop wrong analytic data based on fake purchases.



Today I'm going to explain in-app purchase validation with php in your server. For this aim, Apple provides a special service. To obtain the response data, you should first send your receipt data to Apple.


Apple link to obtain response data:
https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html

21000
The App Store could not read the JSON object you provided.
21002
The data in the receipt-data property was malformed or missing.
21003
The receipt could not be authenticated.
21004
The shared secret you provided does not match the shared secret on file for your account.
21005
The receipt server is not currently available.
21006
This receipt is valid but the subscription has expired. When this status code is returned to your server, the receipt data is also decoded and returned as part of the response.
Only returned for iOS 6 style transaction receipts for auto-renewable subscriptions.
21007
This receipt is from the test environment, but it was sent to the production environment for verification. Send it to the test environment instead.
21008
This receipt is from the production environment, but it was sent to the test environment for verification. Send it to the production environment instead.
21010
This receipt could not be authorized. Treat this the same as if a purchase was never made.
21100-21199
Internal data access error.
There are some status codes in the bottom of the page. If your response status code is one of them, there is a problem with your receipt data or your request. If the status code is 0 (zero), your receipt-data is valid.



You can get the receipt-data from your in-app purchase by following the steps bellow:

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; if (receipt) { NSString *receiptEncoded = [receipt base64EncodedStringWithOptions:0]; // In addition we need to replace +(plus) sign for encoding receiptEncoded = [receiptEncoded stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; NSString *post = [NSString stringWithFormat:@"receipt-data=%@", receiptEncoded]; NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO]; NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:@"your_server.com/verify_inapp_ios.php"]]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; if (!error) { int statusCode = [[json objectForKey:@"status"] intValue]; if (statusCode == 0) { // Receipt-data is valid } } }]; [dataTask resume]; }

You can send the receipt data to your server with the above code block. You only change the your_server.com.  

NOTE: Plus sign (+) needs to be converted by utf encoding. Becuase it is a valid code in POST requests. 

We need a php page for processing this request. Apple provides 2 different URL for this aim. One for sandbox purchases and the other one for real purchases.

Sandbox: https://sandbox.itunes.apple.com/verifyReceipt
Real: https://buy.itunes.apple.com/verifyReceipt

<?php $json['receipt-data'] = $_POST['receipt-data']; $post = json_encode($json); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://buy.itunes.apple.com/verifyReceipt"); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $result=curl_exec ($ch); curl_close ($ch); ?>


Those php codes prints the response data in json format. You can deserialize the data in your objective-c or swift code.


Sample sandbox receipt-data can be found here : https://gist.github.com/sauloarruda/2559455

You can send the sandbox receipt-data to citynom.com/verify_inapp_ios.php for testing. Your json response should resemble this lines below.

object
{2}
receipt
{13}
original_purchase_date_pst
:
2012-04-30 08:05:55 America/Los_Angeles
original_transaction_id
:
1000000046178817
original_purchase_date_ms
:
1335798355868
transaction_id
:
1000000046178817
quantity
:
1
product_id
:
com.mindmobapp.download
bvrs
:
20120427
purchase_date_ms
:
1335798355868
purchase_date
:
2012-04-30 15:05:55 Etc/GMT
original_purchase_date
:
2012-04-30 15:05:55 Etc/GMT
purchase_date_pst
:
2012-04-30 08:05:55 America/Los_Angeles
bid
:
com.mindmobapp.MindMob
item_id
:
521129812
status
:
0

5 Aralık 2016

Merhabalar,

Daha önce yazıya döktüğüm makalemde "fpdf" kütüphanesini kullanarak php ile nasıl pdf dosyaları oluşturabileceğimizi anlatmıştım.
http://www.kodyazma.com/2013/05/php-pdf-olusturma.html

Bir arkadaşımızdan gelen Türkçe karakter sorunu üzerine problemi araştırdım ve çözümünü anlatmak istedim.

Farklı dil sistemlerini fdpf'de kullanabilmek font dosyası için ayar yapmamız gerekiyor. Bunun için "makefont" klasörü içerisindeki "makefont.php" dosyasını kullanacağız. Ana klasör içerisine oluşturduğumuz dosyaya aşağıdaki kodları ekleyerek, php dosyamızı çalıştıralım. Font seçimini kendi bilgisayarınızdaki font dosyalarına göre değiştirebilirsiniz.

<?php

include("makefont/makefont.php");

MakeFont("C:\Windows\Fonts\arial.ttf",  "ISO-8859-9") ;

?>

Php komutlarını çalıştırdıktan sonra 2 adet dosya oluşacaktır. "arial.php" ve "arial.z" isimli 2 adet dosyayı "FPDF" kütüphanesi içerisindeki "font" klasörü içerisine yerleştiriyoruz.

 $pdf->AddFont('arial','','arial.php'); 
 $pdf->SetFont('Arial','',14);
 $turkce_icerik = iconv('utf-8', 'ISO-8859-9', 'ŞüİĞ gibi harfleri artık kullanabiliriz');

Böylece Türkçe karakterleri pdf dosyamızda sorunsuzca kullanabiliriz. Farklı dillerin karakterleri için aşağıdaki tabloyu da paylaşalım.
  • cp1250 (Central Europe)
  • cp1251 (Cyrillic)
  • cp1252 (Western Europe)
  • cp1253 (Greek)
  • cp1254 (Turkish)
  • cp1255 (Hebrew)
  • cp1257 (Baltic)
  • cp1258 (Vietnamese)
  • cp874 (Thai)
  • ISO-8859-1 (Western Europe)
  • ISO-8859-2 (Central Europe)
  • ISO-8859-4 (Baltic)
  • ISO-8859-5 (Cyrillic)
  • ISO-8859-7 (Greek)
  • ISO-8859-9 (Turkish)
  • ISO-8859-11 (Thai)
  • ISO-8859-15 (Western Europe)
  • ISO-8859-16 (Central Europe)
  • KOI8-R (Russian)
  • KOI8-U (Ukrainian)
Son olarak daha önceki makalemde paylaşmış olduğum kodlarımızın güncel halini (oluşturulan font dosyasının ekli olduğu) paylaşayım. 

https://yadi.sk/d/dAq6QGz532FE4z

Umarım yardımcı olabilmişimdir, kolay gelsin.

6 Kasım 2016

Merhabalar,

Gönderdiğimiz e-postalarda "imza" bölümü vardır ve bu imza sayesinde kendimizi tanıtabilir ve yönlendirmeler yapabiliriz. İmza bölümünün daha güzel görünmesi için "html" kodlarından oluşmuş bir içeriği entegre edebiliriz.

MacOS'larda yer alan "Mail" uygulamasını kullanıyorsanız, html kodlarını entegre etmek normalden biraz daha zaman alıyor. Bu yazımda adım adım html kodlarını nasıl entegre edeceğimizi anlatacağım.

Not: Kullandığım işletim sistemi İngilizce olduğu için çevirilerimde yanlışlıklar olabilir...

Mail uygulamasını açtıktan sonra Preferences->Signatures sekmesini açıyoruz.









Açılan ekranda yeni bir imza ekliyoruz.

Bu işlemden sonra Mail uygulamasını tamamen kapatıyoruz. (Tamamen kapatmamız önemli!)
"Users->kullanici_isminiz->Library->Mail->V4->MailData->Signatures" dizinine gelerek oluşturduğumuz imza dosyasını görebiliriz. Birden fazla imza dosyanız varsa, tarih sıralaması yaparak en son oluşturduğunuzu bulabilirsiniz ya da "AllSignatures.plist" dosyasını açarak imzanıza verdiğiniz isimle eşleşen dosya adını bulabilirsiniz.




Değiştirmek istediğimiz imza dosyasını TextEdit veya benzeri programlarla açıp düzenleyeceğiz. Entegre etmek istediğiniz html kodlarının sizde olduğunu varsayıyorum. Eğer yoksa internette "online html editor" yazarak kolayca editör bulabilirsiniz.
Benim kullandığım site : http://www.html.am/html-editors/online-html-editor.cfm

Html kodlarımızı aldık ve imza dosyasını düzenlemek için açtık.
<body> tagından sonraki bölüme kendi kodlarımızı yerleştiriyoruz.  Aşağıdaki resimlerde değiştirilecek bölümleri göstermeye çalıştım.

Kendi oluşturduğumuz kod















İmza dosyasının içi




















İmza dosyasının içeriğini değiştirdikten sonra dosyayı kilitliyoruz. Kilitledikten sonra dosyayı kapatabiliriz.


















Bütün işlemlerimiz bitti. Şimdi Mail uygulamasını açıp, imzanın değiştiğini görebilirsiniz. İmza sekmesinde resimlerin yüklenmemesi normal, çünkü resimler herhangi bir erişilebilir sunucu üzerinde. (Ben flaticon sitesindeki resimleri kaynak olarak gösterdim)

Mail atacağınız zaman resimler otomatik olarak yüklenecektir ve e-postayı alan kişide de sorunsuz olarak görüntülenecektir.




























Umarım faydalı olmuşumdur, teşekkürler...

19 Ocak 2015

Uzun zamandır üzerinde çalıştığım CityNom sosyal platformu için IOS uygulaması yayında.

Itunes İndir

www.citynom.com


11 Aralık 2014

Bu makalede propertygrid üzerinde otomatik enum tipi için lokalizasyon yapmanıza yardımcı olacak kodu paylaşacağım.


public class GlobalEnumConverter : EnumConverter
    {
        Dictionary> _lookupTables;

        /// 
        /// Instantiate a new Enum Converter
        /// 
        /// Type of the enum to convert
        public GlobalEnumConverter(Type type)
            : base(type)
        {
            _lookupTables = new Dictionary>();
        }

18 Haziran 2014

Yapay zekadaki makine öğrenmesi(machine learning) algoritmalarından önemli biri olan Perceptron öğrenme algoritmasından ve C# diliyle yazılmış kodlardan bahsedeğim

Öncelikle kodumuzu verelim :

https://github.com/muhammedtanriverdi/Perceptron_Learning_C_Sharp


Perceptron algoritması gözlenmiş verileri kullanarak yeni gelecek verilerin sonuçlarını tahmin etmede kullanılır. Algoritmanın temel prensibini 2 boyutlu düzlemde anlatmaya çalışayım.

X ve Y koordinatları giriş verilerimizi ifade etsin. Sonuç verimiz ise + ya da - olsun.

X = 1 ve Y = 2 olduğunda sonucumuz - olur gibi değerler vererek devam edelim.
Burada şöyle düşünülebilir;
X değeri kandaki X maddesinin değeri
Y değeri kandaki Y maddesinin değeri
+ ya da - değerleri ise;
+ Hasta
- Hasta değil

30 Nisan 2014


Bu algoritma yapay zekada kümeleme algoritmalarının en bilinen ve en basit yöntemlerinden biridir.

Hemen proje kodlarımızı paylaşalım sonra algoritmanın basit anlatımına geçelim.

https://github.com/muhammedtanriverdi/K_mean_Clustering

"K" harfi küme sayısını işaret eder. Yani bu algoritma verilen küme sayısına göre bir yol izler. Küme sayısının belli olduğu durumlarda kullanılır.

İşletim süresi (time complexity) -> O(ndkt)

n -> Veri sayısı
d -> Uzay sayısı (Yani verilerin sahip olduğu özellik sayısı)
                        (2 boyutlu koordinat düzleminde, x-y özellikleri varsa 2;
                         ya da yaş-boy-günlük tüketilen su miktarı özellikleri varsa(3 boyutlu) 3 )
k -> Küme sayısı
t -> İterasyon sayısı

Yukarıdan anlaşıldığı gibi bu algoritma;
her veri için
her özellik için
her küme için
içiçe döngü oluşturuyor.

Algoritması hakkında bahsedelim (2 boyutlu koordinat sistemi üzerinden anlatacağım)


2 boyutlu düzlemde (x,y) koordinatları belli 1000 tane veri yerleştirdik. Gözle görüldüğü üzere 4 farklı küme var.

Peki neye göre 4 farklı küme var deriz?
Koordinat düzlemindeki (öklit) uzaklığa göre diyebiliriz.

1. ADIM : İlk adımda 4 küme olduğunu bildiğimiz için koordinat düzleminde 4 kümeyi rastgele noktalara atarız ve her veriyi herhangi bir kümeye sokarız.

3 Mart 2014

Xcode 5'de boş proje hariç diğer projelerde, özellikle alışık olduğumuz 'Single View Application' da otomatik gelen storyboard'u kaldırma ve projeye yeni viewcontroller ekleme videosunu paylaşmak istedim.

Storyboard küçük projelerde çok kullanışlı olsa da, proje büyüdükçe ve projede 1'den fazla kişi çalıştığında yönetmek zorlaşabiliyor. Bu yüzden küçük ölçekli projeler hariç storyboard kullanımını pek sevmiyorum :)

28 Şubat 2014

Vakit bulduğum zamanlarda başlangıç seviyesinde ya da belirli bir detay üzerinde video eğitim çekmenin iyi fikir olacağını düşündüm. Muhtemelen videolar daha çok iPhone-iPad programlama üzerine olacaktır.

Resim yakınlaştırma işlemi.


Bu Blogda Ara

İletişim

Ad

E-posta *

Mesaj *