10 Ekim 2016 Pazartesi

Github Dropbox Erişimi

Ülkemizde ne yazıkki github, google drive ve dropbox için BTK tarafından erişim engeli konuldu. Özellikle yazılım camiası için github erişim engeli ciddi büyük bir sorun. Bu engel DNS adresi değiştirerek aşılamıyor. Bu engelleri açmak için 2 ayrı yöntem anlatacağım.

1- Tor Browser
Tor browser firefoxa benzeyen (hatta yanlış bilmiyorsam firefox kodlarından türetilen) bir web tarayıcı. Bu tarayıcının önemli özelliği açılışta dünya üzerindeki ücretsiz VPNlere bağlanıyor ve hangi ülkenin VPN sunucusunda iseniz o ülkeden çıkış yapmış oluyorsunuz. VPN (Virtual Private Network - Sanal Özel Ağ) sizinle sunucu arasında şifreli bir ağ kuruyor ve bu ağ ülkedeki kısıtlamalardan etkilenmemiş oluyor.
Tor browserı bu linkten indirebilirsiniz. Aşağıda erişim engeli olan githuba girişim görünüyor.

2- Chrome Zenmate Uzantısı
Tor browser kolay bir şekilde erişim olmayan sitelere ulaşmanızı sağlıyor ancak tüm favori linkleriniz vb chromeda ise her seferinde chromea gidip linki kopyalamak ve tor browserda açmak can sıkıcı olabilir. Chromeda bu işi çözmenin yolu yokmu derseniz var. Uzantılarda ücretli ücretsiz bir çok VPN uzantısı yükleyebilirsiniz. Ben zenmate kullandım. Başkalarıda var.
Öncelikle chrome marketten zenmate uzantısı sayfasını açmalısınız. Bu linkten çabuk açabilirsiniz.
Ekranın sağ üstteki Chrome'a ekle düğmesi ile zenmate vpn uzantısını eklemiş olursunuz.
Uzantının chrome eklenen ikonuna basarak açılan sayfada kullanıcı oluşturmamız ve mailimize gönderilen onayı tıklayarak kullanıcıyı aktif etmeniz gerekiyor.


Daha sonra tekrar zenmate düğmesine tıkladığınızda kullanıcı bilgilerinizi girdiğinizde VPNe bağlanarak chrome tarayıcısından github ve diğer erişim engeli olan sitelere rahatlıkla girebiliyorsunuz.



7 Ekim 2016 Cuma

Elasticsearch Kurulum

Elasticseach Nedir

Elasticsearch lucene tabanlı döküman indexleyen metin arama motorudur. Kısaca uygulamalarınız arkasında google search benzeri bir yapı kurarak dökümanları elasticsearch ile indexleyip arama işlevini bu altyapı üzerinden yapabilirsiniz.

Bu dökümanda sadece windows sunucular için kurulum işlemine deyineceğim.

Elasticsearch

Öncelikle elasticsearch ve kibana yüklemesini yapın. Ben c:\elactic dizini kullandığımdan indirilen zip dosyaları c:\elastic dizinine elasticsearch ve kibana dizinleri olarak açın.

Java sürümü kontrol edilmelidir (sürüm 1.7 yada yüksek olmalı). Bunun için
JAVA -version 
kullanılır. Ayrıca JAVA_HOME çevrel değişkeni kontrol edilmeli. Bu değişken JDK dizinini göstermelidir.
SET JAVA_HOME
komutu ile kontrol ediyoruz ve yok ise JDK yüklüyoruz yada dizini ayarlıyoruz.

Bu işlemden sonra konfigürasyonlara başlayalım. Konfigürasyonda editör kullanmamız gerekecek. Notepad++ tavsiye edilir.

Önce elasticsearch/config/elasticsearch.yml dosyasını editör ile açın.
   cluster.name, node.name, bootstrap.mlockall
alanlarını ayarlayın. Örnek değerler:
cluster.name "scorpio_dev_1"
node.name  node-1
bootstrap.mlockall true

İleride index dynamic mapper sorun çıkmasın diye dosya içine alttaki satırı ekliyoruz
index.mapper.dynamic: false

elasticsearch/bin klasöründen
elasticsearch.bat 
çalıştırıyoruz ve elasticsearch'ün sorunsuz çalıştığını kontrol ediyoruz.

Kontrol için önce herhangibir tarayıcıda
http://localhost:9200/ 
adresine gidelim aşağıdaki gibi json response almalıyız
{
"name": "node-1",
"cluster_name": "scorpio_dev_1",
"version": {
"number": "2.3.2",
"build_hash": "b9e4a6acad4008027e4038f6abed7f7dba346f94",
"build_timestamp": "2016-04-21T16:03:47Z",
"build_snapshot": false,
"lucene_version": "5.5.0"
},
"tagline": "You Know, for Search"
}

Sonra _cluster API kullanarak tarayıcıya
http://localhost:9200/_cluster/health 
adresini girelim. Aşağıdaki sonucu almalıyız.
{
"cluster_name": "scorpio_dev_1",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100
}

KIBANA Kurulum

Siteden indirdiğimiz kibana dosyalarını C:\elastic\kibana dizinine açalım.
kibana\bin içinden
kibana.bat 
çalıştıralım. Bu aşamada 5601 portu için erişim izni ister erişim izni verelim.
Tarayıcıda
http://localhost:5601/status 
sayfasını açtığımızda Green yazısını göreceğiz. Bu aşamada en az bir index açmamız gerekiyor. Indexleri elasticsearch veritabanı olarak düşünebilirsiniz. Bu işlemler için önce chrome tarayıcımıza sense plugin yükleyeceğiz. Bu plugini linkten açılan sayfadan add to chrome düğmesi ile yüklersiniz. Chrome üzerine gelecek icona tıklayara sense plugini açabiliriz.

Elasticsearchten rest api çalıştırmamız gerekiyor. Basitçe bunu sense plugin ile yapabiliriz
Aşağıdaki kodu sense'in sol tarafına ekliyoruz. Index adımız testindex olsun.
PUT testindex
{
    "settings" : {
        "index" : {
            "number_of_shards" : 3,
            "number_of_replicas" : 2
        }
    }
}
RestApinin sonucu
"acknowledged": true 
gelmesi lazım.
Indexi tarayıcımızdan
http://localhost:9200/testindex 
adresi ile kontrol edebiliriz. Dönen JSON sonucunda indeks bilgileri yeralır.
Sonrasında tarayıcıdan
http://localhost:5601/
adresini açtığımızda kibana ekrana gelir. Bu aşamada indeks desenini tanımlamamız lazım testindex yada test* (ileride açacağımız diğer veritabanları varsa).
Ayrıca Index contains time-based events kapatıyoruz (örneğimizde zaman temelli event yok kabul ettik)
Create düğmesine bastığımızda kibana kurulumu tamamlamış olduk

Marvel Kurulum

Marvel linkinden uygulamayı indirelim.
Öncelikle Elasticsearch açık ise kapatalım.
cmd
ile komut istemine geçerek
 cd C:\elastic\elasticsearch\bin
elasticsearch bin dizinine geçelim.

Burada license plugin yüklememiz gerekiyor ve akabinde marvel-agent yüklememiz gerekiyor.
Install sırasında izin istiyor y(yes) olarak geçmemiz lazım.
plugin install license
plugin install marvel-agent

Bu işlemlerle elasticsearch, kibana ve marvel agent kurulumu tamamlamış olduk. Uygulamamızdan servis olarak bağlanarak arama motoru olarak kullanabiliriz. Oda başka bir makaleye kalsın.

3 Ekim 2016 Pazartesi

Apartman ve Site Yönetim Yazılımı apyon.net

Geçen gün yeni bir apartman site yönetim sistemini inceleme fırsatı buldum. apyon.net. Site üzerinde dökümanlarda çok detaylı açıklamaları bulunuyor. Aynı zamanda üye olmadan verilen demo şifreleri ile yazılımı inceleme fırsatına sahip oluyorsunuz. Hiçbir email kaydı yapmadan inceleyebilmek iyi bir şey.

Sitenin ısı ölçer/pay ölçer girişinden tutunda, kapıcı bordrosuna kadar her imkan var. Ayrıca mobil web site ve mobil uygulama ile apartmandakilerin aidat borçlarını istedikleri zaman görebilmesi, site yöneticisinin aylık borç ve duyuru smsleri gönderebilmesi gibi özellikler şahane olmuş.
 apyon profesyonel site yönetim yazılımı

Jquery UI Templates

Jquery Mobile ile Mobile Site Oluşturma


Tanımlama

Hazırlayacağımız site/web app dizin yapısı aşağıdaki gibi olmasını istiyorum.|- index.html|- js|- css
  |- images
Kurulum için önce Jquery sitesinden JQuery sürümlerinden JQuery mobile ile uyumlu olanı indiriyoruz. İndirilen jquery dosyasını js klasörüne kopyalıyoruz. Bu örnekte 1.11.0 kullanıldı.
Ayrıca JQuery Mobile sitesinden download ettiğimiz jquery mobile dosyaları dizine eklenmelidir. Ben custom download seçtim. Gelen sıkıştırılmış dosyayı css ler css klasörüne ve js ler js klasörüne olacak şekilde ayırıyoruz. Bu zip içinde images çıkmayacaktır. Aynı download sayfasından images zip dosyasını indirip css içine açıyoruz.

Ayrıca jquery mobile kodu çalıştığında hata almaması için mobileinit eventını tanımlıyoruz.

Sayfamızda Jquery UI için gerekli style ve kodları eklemek için <head> tag içine aşağıdaki kod eklenmelidir. 

    <title> Web Site Başlık</title>
        <link href="css/jquery.mobile.custom.structure.css" rel="stylesheet" type="text/css" />
    <link href="css/jquery.mobile.custom.theme.css" rel="stylesheet" type="text/css" />
    <script src="js/jquery-1.11.0.min.js"></script>
    <script>
        $(document).bind('mobileinit',function(){
            $.mobile.changePage.defaults.changeHash = false;
            $.mobile.hashListeningEnabled = false;
            $.mobile.pushStateEnabled = false;
        });
    </script>
    <script src="js/jquery.mobile.custom.js" type="text/javascript"></script>

    

İlk Sayfamızı Ekleyelim

JQuery mobile içinde bir html içine bir çok sayfa ekleyebiliyoruz. data-role attribute page değerini alması div elementinin sayfa olarak kullanılacağını gösteriyor. İkinci satırdaki div elementinin data-role değeri header. Bu div içindekilerinin sayfanın başındaki header bölümüne yerleştirileceği anlamını taşıyor. Örnekte için h1 elementi ve içinde Başlık Metni metni var.
Altıncı satırdaki div elementi data-role 
<div data-role="page" id="one">
 <div data-role="header">
  <h1>Başlık Metni</h1>
 </div><!-- /header -->

 <div data-role="content"> 
İçerik
 </div>
        <!-- /content -->

 <div data-role="footer">
  <h4>Alt Metin</h4>
 </div>
        <!-- /footer -->
</div>
<!-- /page -->
  • Button
<a href="#" data-role="button" data-icon="star" data-theme="b">btncaption</a>
  • listview
<ul data-role="listview" data-inset="true" data-filter="true">
 <li><a href="#">Acura</a></li>
 <li><a href="#">Audi</a></li>
 <li><a href="#">BMW</a></li>
 <li><a href="#">Cadillac</a></li>
 <li><a href="#">Ferrari</a></li>
</ul>
  • slider
   <label for="slider-0">Input slider:</label>
   <input type="range" name="slider" id="slider-0" value="25" min="0" max="100"  />
  • button
<a href="#link" data-role="button" data-icon="star" data-theme="b">ButtonCaption</a>
  • textinput
    <label for="basic">Text Input:</label>
    <input type="text" name="name" id="basic" value=""  />
  • field container
<div data-role="fieldcontain">
    <label for="name">Text Input:</label>
    <input type="text" name="name" id="name" value=""  />
</div> 
  • diğer input tipleri
   <div data-role="fieldcontain">
          <label for="password">Password:</label>
          <input type="password" name="password" id="password" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="number">Number:</label>
          <input type="number" name="number" id="number" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="number-pattern">Number + pattern:</label>
          <input type="number" name="number" pattern="[0-9]*" id="number-pattern" value="" placeholder="Pattern attribute [0-9]* for a numeric keypad" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="email">Email:</label>
          <input type="email" name="email" id="email" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="url">Url:</label>
          <input type="url" name="url" id="url" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="tel">Tel:</label>
          <input type="tel" name="tel" id="tel" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="time">Time:</label>
          <input type="time" name="time" id="time" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="date">Date:</label>
          <input type="date" name="date" id="date" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="month">Month:</label>
          <input type="month" name="month" id="month" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="week">Week:</label>
          <input type="week" name="week" id="week" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="datetime">Datetime:</label>
          <input type="datetime" name="datetime" id="datetime" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="datetime-l">Datetime local:</label>
          <input type="datetime-local" name="datetime-l" id="datetime-l" value="" />
   </div>
   
   <div data-role="fieldcontain">
          <label for="color">Color:</label>
          <input type="color" name="color" id="color" value="" />
   </div>
   
  • textarea
<label for="textarea-a">Textarea:</label>
<textarea name="textarea" id="textarea-a">
I'm a basic textarea. If this is pre-populated with content, the height will be automatically adjusted to fit without needing to scroll. That is a pretty handy usability feature.
</textarea>
  • search input
<label for="search-basic">Search Input:</label>
<input type="search" name="search" id="search-basic" value="" />
  • search input field containers
<div data-role="fieldcontain">
    <label for="search-2">Search Input:</label>
    <input type="search" name="search-2" id="search-2" value="" />
</div>
  • slider
<label for="slider-fill">Input slider:</label>
<input type="range" name="slider-fill" id="slider-fill" value="60" min="0" max="100" data-highlight="true" />
  • switch
<label for="flip-1">Flip switch:</label>
<select name="flip-1" id="flip-1" data-role="slider">
 <option value="off">Hay&#305;r</option>
 <option value="on">Evet</option>
</select> 
  • dikey radyo düğmeleri (radio buttons)
<fieldset data-role="controlgroup">
 <legend>Choose a pet:</legend>
      <input type="radio" name="radio-choice" id="radio-choice-1" value="choice-1" checked="checked" />
      <label for="radio-choice-1">Cat</label>

      <input type="radio" name="radio-choice" id="radio-choice-2" value="choice-2"  />
      <label for="radio-choice-2">Dog</label>

      <input type="radio" name="radio-choice" id="radio-choice-3" value="choice-3"  />
      <label for="radio-choice-3">Hamster</label>

      <input type="radio" name="radio-choice" id="radio-choice-4" value="choice-4"  />
      <label for="radio-choice-4">Lizard</label>
</fieldset>
  • yatay yapmak için
<fieldset data-role="controlgroup" data-type="horizontal" >
  • checkbox
<label><input type="checkbox" name="checkbox-0" /> I agree </label>
   
<input type="checkbox" name="checkbox-1" id="checkbox-1" class="custom" />
<label for="checkbox-1">I agree</label>
  • yatay için
<fieldset data-role="controlgroup" data-type="horizontal">
  • select
<label for="select-choice-0" class="select">Shipping method:</label>
<select name="select-choice-0" id="select-choice-0">
   <option value="standard">Standard: 7 day</option>
   <option value="rush">Rush: 3 days</option>
   <option value="express">Express: next day</option>
   <option value="overnight">Overnight</option>
</select>
  • form body set
<div class="ui-body ui-body-b">
  • ajax form
   <form action="forms-sample-response.php" method="get" class="ui-body ui-body-a ui-corner-all">
    <fieldset>
     <div data-role="fieldcontain">
      <label for="shipping" class="select">Shipping method:</label>
      <select name="shipping" id="shipping">
       <option value="Standard shipping">Standard: 7 day</option>
       <option value="Rush shipping">Rush: 3 days</option>
       <option value="Express shipping">Express: next day</option>
       <option value="Overnight shipping">Overnight</option>
      </select>
     </div>
     <button type="submit" data-theme="b" name="submit" value="submit-value">Submit</button>
    </fieldset>
   </form>
  • button lu footer
<div data-role="footer" class="ui-footer ui-bar-a" role="contentinfo">
  <div data-role="navbar" class="ui-navbar ui-mini" role="navigation">
   <ul class="ui-grid-b">
    <li class="ui-block-a"><a href="#" data-icon="grid" data-corners="false" data-shadow="false" data-iconshadow="true" data-wrapperels="span" data-iconpos="top" data-theme="a" data-inline="true" class="ui-btn ui-btn-inline ui-btn-icon-top ui-btn-up-a"><span class="ui-btn-inner"><span class="ui-btn-text">Summary</span><span class="ui-icon ui-icon-grid ui-icon-shadow">&nbsp;</span></span></a></li>
    <li class="ui-block-b"><a href="#" data-icon="star" class="ui-btn-active ui-btn ui-btn-inline ui-btn-icon-top ui-btn-up-a" data-corners="false" data-shadow="false" data-iconshadow="true" data-wrapperels="span" data-iconpos="top" data-theme="a" data-inline="true"><span class="ui-btn-inner"><span class="ui-btn-text">Favs</span><span class="ui-icon ui-icon-star ui-icon-shadow">&nbsp;</span></span></a></li>
    <li class="ui-block-c"><a href="#" data-icon="gear" data-corners="false" data-shadow="false" data-iconshadow="true" data-wrapperels="span" data-iconpos="top" data-theme="a" data-inline="true" class="ui-btn ui-btn-inline ui-btn-icon-top ui-btn-up-a"><span class="ui-btn-inner"><span class="ui-btn-text">Setup</span><span class="ui-icon ui-icon-gear ui-icon-shadow">&nbsp;</span></span></a></li>
   </ul>
  </div><!-- /navbar -->
 </div>