Eki 13

One-Way Ticket – Jennifer BASSETT

 

 

 

 

 

 

First time, I rode an english book. This book about three stories. These three stories was on the train. Every strory was 4-5 pages. Three story was very beautiful… I most liked the third story. End of the book there was a lot of question about the stories. You can answer this questions. This book is stage 1. I will read stage 2,3,4,5. So i want to improve my english. When i rode, i will share it here. Last if you are beginner for English, you must read english books. This is very usefull for learn. Follow me… 🙂

ovt

Eki 07

Android ‘duplicate files during packaging of apk…’ Hatası ve Çözümü

‘duplicate files during packaging of apk’ hatasını twitter4j core jar dosyasını android projeme eklediğimde aldım. commons.ftp jar dosyasının licences.txt dosyasıyla uyumsuz olduğundan bahsetmekteydi. Çözümü araştırdığım ve çözümü buldum. build.gradle dosyasına gelip android{} içerisine

packagingOptions {
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
}

ekleyiniz.

build.gradle son hali;

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "app.id"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/volley.jar')
    compile files('libs/ftp4j-1.7.2.jar')
    compile files('libs/commons-net-3.3-ftp.jar')
    compile files('libs/twitter4j-core-4.0.4.jar')
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.android.support:design:22.2.1'
}

Eki 06

Android Textview Link Tıklanabilir Özelliği

Android TextView içerisindeki bir yazıda link var ve bu link varsayılan olarak link olarak algılanmamaktadır. Textview içerisindeki bu yazıyı tıklanabilir yapmak için çok kküçük bir işlem yapmalısınız. Textview’ıtanımladığınız xml dosyasını açın ve Textview nesnesine

android:autoLink="web"

ekleyin. Artık yazı içerisindeki linkler tıklanabilir yapıdadır. Dokunduğunuzda tarayıcı dialog penceresi açılacaktır. Bunun yanında autoLink farklı değerler almaktadır.

android:autoLink="email" //E-posta adresi
android:autoLink="none"  //Hiçbiri(varsayılan)
android:autoLink="phone" //Telefon numarası
android:autoLink="map"   //Harita adresi
android:autoLink="all"   //Tümü...

Eki 06

Tiyatro – Kamyon

Van Devlet Tiyatrosu tarafından hazırlanan ‘Kamyon’ adlı oyun 03.10.2015 tarihinde Altındağ Devlet Tiyatro’su sahnesinde oynandı. Oyunda dağda kalan bir kamyondaki 2 hamal 1 şoför ve 1 şoför yardımcısının yaşadıkları anlatılmaktadır. Oyunun durgun başladı. İlerleyen zamanda oyunda dahil olan 2 karakter oyunun canlanmasını hareketlenmesini sağladı. Oyunun sonu ise çok boşta kaldı. Daha sonra öğrendiğime göre oyun 2 perdeden oluşmaktaymış. Oyunu tek perde olarak izledik. Kırpılmış versiyonunu da izlediğimiz için bazı boşluklar olduğu sezilebiliyordu. Genel kanım kötü bir oyundu. Oyuna sonradan dahil olan 2 tipin oyunculukları harikaydı. Onlar biraz oyunu ayakta tutmaktaydı. Oyunun anlatmak istediği güzel şeyler var. Özellikle ‘hamal olduğumu anladım’ kısmı ayrıca bir güzeldi. İnsanlara mesaj verme yönünden başarılıydı. Oyunla ilgili sonunu sadece ben mi anlamadım acaba diye düşündüm. Oyun sonunda iletişime geçtiğim bir kaç kişiden de oyununun sonunu anlamadıklarını duyunca sonunun biraz havada kaldığı düşüncem sabitleşti.

timthumb.php

14214100401850488008-b

1421410041439440034-b

Eki 01

Android Döviz Kurları Widget Uygulaması

Merhaba arkadaşlar bugün bir kaç bileşeni bir arada kullanarak widget içerisinde döviz kurlarını görüntüleyeceğiz. Bunu nasıl yapacağımıza bakacağız hep birlikte. Öncelikle AsyncTask’lar hakkında önceki yazımı okumanızı tavsiye ederim. Zira api.doviz.com adresinden çekeceğimiz json verisini asynctask içerisinde parse edip kullanacağız. Bunun yanında widget yapmayı da ben de yeni öğrendim. Çeşitli kaynaklardan edindiğim bilgiler ışığında widget yaptım. Daha sonra da bunu asynctask ile bağlayıp döviz kurunu gösterdim. Bunları nasıl yaptığımı anlatacağım.

Widget için şuradaki web kaynağından faydalandım.

drawable klasörüm; (android simgesinden sonra yenile resmi bulunmaktadır. Arka plandan dolayı görünmemektedir.)

appwidget_dark_bg_focused.9 appwidget_dark_bg_pressed.9 appwidget_dark_bg.9 ic_launcher ic_sync_button

res klasörü altında xml klasörü oluşturup içerisine demo_widget_provider.xml dosyasını oluşturun. İçeriği aşağıdaki gibi olmalıdır.

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/activity_main"
    android:minHeight="160dp"
    android:minWidth="300dp"
    android:previewImage="@drawable/widget"
    android:updatePeriodMillis="1000000" >
</appwidget-provider>

activity_main.xml’de aşağıdaki gibi olmalıdır.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5sp"
    android:background="@drawable/appwidget_dark_bg"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/buttonContainer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >

        <Button
            android:id="@+id/sync_button"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_centerInParent="true"
            android:background="@drawable/ic_sync_button"
            android:text="" />
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/contentContainer"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/buttonContainer"
        android:layout_alignParentTop="true"
        android:orientation="vertical"
        android:padding="8dp" >

        <TextView
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:maxLines="2"
            android:paddingBottom="5dp"
            android:text=""
            android:textColor="#fcfcfc"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/desc"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:textColor="#fcfcfc"
            android:textSize="15sp"
            android:textStyle="normal" />
    </LinearLayout>

</RelativeLayout>

Mainactivity.java dosyasına bu uygulama sadece widget olacağından dolayı tek satır kod yazdım OnCreate fonksiyonu içerisine


import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        super.onBackPressed();
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
}

MyWidgetIntentReceiver.java dosyası

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.RemoteViews;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;

public class MyWidgetIntentReceiver extends BroadcastReceiver {
    public static int clickCount = 0;
    private String msg[] = null;
    String dolara,dolars,euroa,euros,gramaltina,gramaltins,bilezik22a,bilezik22s,ceyreka,ceyreks;
    Context ctx;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(WidgetUtils.WIDGET_UPDATE_ACTION)) {
            new TestAltin().execute();
            ctx=context;
        }
    }

    private void updateWidgetPictureAndButtonListener(Context context) {
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.activity_main);
        // view güncelleniyor.
        remoteViews.setTextViewText(R.id.title, getTitle());
        remoteViews.setTextViewText(R.id.desc, "\bDolar Alış : "+dolara+" Satış : "+dolars+"\n\bEuro Alış : "+euroa+" Satış : "+euros+"\n\bAltın Alış : "+gramaltina+
        " Satış : "+gramaltins+"\n\bÇeyrek Altın Alış : "+ceyreka+" Satış : "+ceyreks+"\n\b22 Bilezik Alış : "+bilezik22a+" Satış : "+bilezik22s);

        // click listener kaydediliyor.
        remoteViews.setOnClickPendingIntent(R.id.sync_button,
                MyWidgetProvider.buildButtonPendingIntent(context));

        MyWidgetProvider.pushWidgetUpdate(context.getApplicationContext(),
                remoteViews);
    }

    private String getDesc(Context context) {
        msg = context.getResources().getStringArray(R.array.news_headlines);
        if (clickCount >= msg.length) {
            clickCount = 0;
        }
        return msg[clickCount];
    }

    private String getTitle() {
        return "Piyasalar";
    }
//Altın verilerini almak için gerekli kodlar
    public class TestAltin extends AsyncTask<String, Void, Void> {
        @Override
        protected Void doInBackground(String... params) {
            try {
                HttpClient client = new DefaultHttpClient();
                String getURL = "http://api.doviz.com/list/G";
                HttpGet get = new HttpGet(getURL);
                get.setHeader("content-type", "application/json");
                HttpResponse responseGet = client.execute(get);
                HttpEntity resEntityGet = responseGet.getEntity();
                String jsonResult="{}";
                if (resEntityGet != null) {
                    jsonResult= EntityUtils.toString(resEntityGet);
                }
                JSONObject newJsonObj=new JSONObject(jsonResult);
                JSONArray jsonDizi=newJsonObj.getJSONArray("value");
                for(int i=0; i<jsonDizi.length();i++){
                    JSONObject jsonobj=jsonDizi.getJSONObject(i);
                    if(jsonobj.getString("key2").equals("gram-altin")){
                        gramaltina=jsonobj.getString("alis");
                        gramaltins=jsonobj.getString("satis");
                    }
                    else if (jsonobj.getString("key2").equals("ceyrek-altin")){
                        ceyreka=jsonobj.getString("alis");
                        ceyreks=jsonobj.getString("satis");
                    }
                    else if(jsonobj.getString("key2").equals("22-ayar-bilezik")){
                        bilezik22a=jsonobj.getString("alis");
                        bilezik22s=jsonobj.getString("satis");
                    }

                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;

        }
        @Override
        protected void onPostExecute(Void result) {

            new TestDoviz().execute();
        }
        @Override
        protected void onPreExecute() {

        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }

    }
//Euro Dolar verilerini almak için gerekli kodlar
public class TestDoviz extends AsyncTask<String, Void, Void> {
 @Override
 protected Void doInBackground(String... params) {
 try {
 HttpClient client = new DefaultHttpClient();
 String getURL = "http://api.doviz.com/list/C";
 HttpGet get = new HttpGet(getURL);
 get.setHeader("content-type", "application/json");
 HttpResponse responseGet = client.execute(get);
 HttpEntity resEntityGet = responseGet.getEntity();
 String jsonResult="{}";
 if (resEntityGet != null) {
 jsonResult= EntityUtils.toString(resEntityGet);
 }
 JSONObject newJsonObj=new JSONObject(jsonResult);
 JSONArray jsonDizi=newJsonObj.getJSONArray("value");
 JSONObject dolar=new JSONObject();
 JSONObject euro=new JSONObject();
 dolar=jsonDizi.getJSONObject(0);
 euro=jsonDizi.getJSONObject(1);
 dolara=dolar.getString("alis");
 dolars=dolar.getString("satis");
 euroa=euro.getString("alis");
 euros=euro.getString("satis");

 } catch (Exception e) {
 e.printStackTrace();
 }
 return null;

 }
 @Override
 protected void onPostExecute(Void result) {
 updateWidgetPictureAndButtonListener(ctx);
 }
 @Override
 protected void onPreExecute() {

 }

 @Override
 protected void onProgressUpdate(Void... values) {
 }
 }
}

MyWidgetProvider.java dosyası;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

public class MyWidgetProvider extends AppWidgetProvider {
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                         int[] appWidgetIds) {

        // widget yukleniyor.
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.activity_main);

        // butona event ekle
        remoteViews.setOnClickPendingIntent(R.id.sync_button,
                buildButtonPendingIntent(context));

        // ilk veri güncelleniyor.
        remoteViews.setTextViewText(R.id.title, getTitle());
        remoteViews.setTextViewText(R.id.desc, getDesc());

        // widget guncelleme yanıtı
        pushWidgetUpdate(context, remoteViews);
    }

    public static PendingIntent buildButtonPendingIntent(Context context) {
        ++MyWidgetIntentReceiver.clickCount;

        // widget yanıtını ilklendir.
        Intent intent = new Intent();
        intent.setAction(WidgetUtils.WIDGET_UPDATE_ACTION);
        return PendingIntent.getBroadcast(context, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
    }

    private static CharSequence getDesc() {
        return "Piyasa bilgilerini al";
    }

    private static CharSequence getTitle() {
        return "Piyasalar";
    }

    public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
        ComponentName myWidget = new ComponentName(context,
                MyWidgetProvider.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(myWidget, remoteViews);
    }
}

WidgetUtils.java dosyası;

public class WidgetUtils {
   final static String WIDGET_UPDATE_ACTION ="com.javatechig.intent.action.UPDATE_WIDGET";
}

Uygulamanın ekran görüntüleri resimlerde görüldüğü gibidir. Anlamadığınız veya yapamadığınız bir yer varsa yazıya yorum yaparak bana ulaşabilirsiniz. Yardımcı olmaya çalışırım.
Screenshot_2015-10-01-09-46-39 Screenshot_2015-10-01-09-46-43

Eyl 30

Ustam ve Ben – Elif ŞAFAK

iu

 

Okuduğum ilk Elif Şafak kitabıydı. Yazarın hayal dünyasıyla gerçekler harmanlanmış. Ancak kitabı okurken neresi gerçek? Acaba burası da yazarın kurgusu, hayal dünyası mı yoksa gerçekten bu da böyle mi olmuş dediğim çok yer var. Bu açıdan çok da beğenmedim. Gerçekle hayal dünyasının karışımından oluşan bir kitap. Yazar kitabın sonunda ekleme yaptığı değiştirme yaptığı yerleri de belirtmiş. Kitapta Mimar Sinan’ın hayatına farklı bir açıdan yaklaşılmış. Mimar Sinan’ın kalfası ve aynı zamanda filbaz olan Cihan karakterinin ağzından anlatılmış. Bu kitabı okuduktan sonra Mimar Sinan’ın hayatıyla ilgili bir kaç kaynak daha bulup okumayı planlıyorum. Kitap genel itibariyle güzel. Okumanızı tavsiye ederim.

Eyl 29

Android Uygulamasına Harici Font Eklemek

Android uygulamasında kullanabileceğiniz fontlar sınırlıdır. Uygulamanıza tasarım açısından farklılık kazandırmak istiyorsanız farklı fontlar kullanabilirsiniz. Farklı fontlar ile uygulamanızı zenginleştirebilirsiniz. Ben test amaçlı Google fontlardan Open-Sans tercih ettim. Siz kullanacağınız fontu belirleyip .ttf uzantılı dosyasını bulmanız gerekmektedir.

Android Studio kullanarak işlemi gerçekleştirmekteyim. Aşağıdaki adımları klasörler içerisinde gerçekleştirin. Daha sonra Android Studio’da projeyi açın veya proje açıksa da işlemler bittiğinde her ihtimale karşı build etmeyi unutmayın.

res diziniyle aynı dizinde bir assets dizini oluşturun.

res dizini içerisine bir fonts dizini oluşturun.

fonts dizini içerisine istediğiniz .ttf uzantılı dosyayı kopyalayın.

Test amaçlı fontu textview nesnesinde kullanacağım.

tv = (TextView)findViewById(R.id.textView);
tv.setTypeface(Typeface.createFromAsset(this.getAssets(), "fonts/OpenSans-Semibold.ttf"));

‘native typeface cannot be made’ hatası alırsanız endişelenmeyin. Muhtemelen dosya yolunu görmüyordur. Öncelikle dosya yolunun res ile aynı dizinde olduğundan emin olun. Dosya yoluyla ilgili bir problem yoksa fontu desteklemiyordur. Başka bir font ile denemenizde fayda var.

 

Eyl 28

Android TextView Yazıyı Underline Stil Eklemek

Merhaba arkadaşlar çok basit bir işlemden bahsedeceğim. Nerede lazım olacağı belli olmaz ancak gerekebilir. Android’de textview içindeki yazıyı nasıl altı çizgili (underline) yapabileceğinizi anlatacağım. Bir satır kod ile halledebiliyorsunuz. XML tarafında bir karşılığı yok. Java tarafından bir kod ile halledeceğiz. XML kısmında yazı tipi ve boyutuyla ilgili değişiklikleri yapabilirlen underline yapamadığımızı fark ettim. Aşağıdaki kod ile TextView içeriğini altı çizgili yapabilirsiniz. TextView’ı tanımlayıp xml tarafındaki nesneyle bağladıktan sonra aşağıdaki kodu kullanabilirsiniz.

 

textView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);

Eyl 15

Android Galeri’den Seçilen Fotoğrafı ImageView’da Gösterme

Merhaba arkadaşlar bu yazımda Android’de galeriden seçtiğimiz fotoğrafı imageview içerisinde nasıl göstereceğiz ondan bahsedeceğim. Daha önceki yazılarımda kamera ile çekip imageview’da nasıl göstereceğimizi anlatmıştım. Bugünse aynı işlemi galeriden seçerek yapacağız. ‘Galeriden Seç’ isimli bir butonumuz olsun ve onClickListener Fonksiyonunu varsayıp kodumuzu ekleyelim.

Intent galleryIntent = new Intent(Intent.ACTION_PICK,
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, RESULT_LOAD_IMG);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
    if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK
            && null != data) {
        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        imgDecodableString = cursor.getString(columnIndex);
        cursor.close();
        ImageView imgView = (ImageView) findViewById(R.id.fotograf);
        imgView.setImageBitmap(BitmapFactory
                .decodeFile(imgDecodableString));
        String s = getRealPathFromURI(selectedImage);
        File newFile=new File(s);
        path=newFile.getAbsolutePath();
    } else {
        Toast.makeText(this, "Resim seçmediniz.",
                Toast.LENGTH_LONG).show();
    }
} catch (Exception e) {
    Toast.makeText(this, "Resim seçilirken hata oluştu.", Toast.LENGTH_LONG)
            .show();
}
}

Buna ek olarak resmin yolunu da öğrenmek için aşağıdaki fonksiyonu kullandım.

public String getRealPathFromURI(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    @SuppressWarnings("deprecation")
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

Takipte kalın 😉

Eyl 04

IOS (Swift) Denemeler – Asal Sayı Örneği

IOS öğrenmeye henüz yeni başlıyorum. IOS’a da el atmaya karar verdim. IOS öğrenip kendimi bu konuda da geliştirmek istiyorum. Swift diliyle başladım. Çalışmalarımı Mac OS X üzerinde gerçekleştirmekteyim. Swift ile yaklaşık bir kaç gündür içli dışlı oldum. Sevdiğimi söyleyebilirim. Sempatik gelmeye başladı. İnternet üzerinden Udemy’den Rob Percival’ın Swift eğitimini satın alıp çalışmalara başladım. Swift ve IOS programlamaya sıfırdan başlamamdan dolayı eğitim alıp çalışmamın beni daha hızlı bir yerlere götüreceğini tahmin etmekteyim. Şu ana kadar öyle de oldu. Tavsiye ederim. Yanlız eğitim dili ingilizce. Anlatılanların hepsi ve örnekler ingilizce. Bu yazımda da yaptığım ilk örneği Swift içerisinde Asal Sayı bulma örneğini paylaşıyorum. Öğrendikçe uğraştıkça örnekleri buradan paylaşacağım… Aşağıda paylaşacağım örnek Playground üzerinde yazılmış ve test edilmiştir.

Asal sayı neydi? Asal sayı birden ve kendinden başka hiçbir sayıya bölünmeyen sayıydı. Bir sayının asal olup olmadığını nasıl buluruz? Algoritma ve Programlama derslerinden hatırlarsam; Asal sayıyı bulmak için sayının bir eksiğinden 1’e kadar döngü kurup bölme işlemi yapıp bölündüğünde kalanın 0 olması durumunda bu sayı asal değildir. Ancak bu yöntemde sayı N ise döngü N-1 kez dönecektir. Ufak bir bilgi : N’in yarısından daha küçük bir sayıya bölünebilme ihtimali vardır. N = 10 olsun. N sadece 5 ve daha küçük sayılara bölünebilecektir. 6-7-8-9 bölünemez. Buradan yola çıkarak döngünün başlangıç değerini N / 2 olarak belirledim ve döngünün N / 2 kez çalışmasını sağladım. Sonrasındaysa Java ve C#’da olduğu gibi % ifadesiyle bölümünden kalanın 0 olup olmadığına baktım.

 

//: Playground - noun: a place where people can play
import UIKit
var number = 37
var asal = true
for var i = number/2; i > 1; i-- {
    if number % i == 0{
        asal = false
        break;
    }
}