2014年10月29日 星期三

Amazon RDS backup snapshot using python

看很多Amazon auto backup都是直接下指令排序在建立snapshot

由於對ubuntu指令不是很熟,所以就用python來撰寫一個自動建立snapshot的程式,超過15天的snapshot就刪除

系統: ubuntu 14.04

事先安裝:
1. sudo apt-get install awscli
2. sudo apt-get install rdscli 
(這個應該是可以不用安裝,沒試過解除安裝後是否可以運行,有興趣的可以自行嘗試看看)
3. sudo pip install boto
(Python package that provides interfaces to Amazon Web Services)


code example:
# -*- coding: utf-8 -*-
import boto.rds, datetime, time

def day_process(date):
        # process rds iso datetime return format => '%Y-%m-%d' for calculate
        d = datetime.datetime.strptime(str(date), '%Y-%m-%dT%H:%M:%S.%fZ')
        d = datetime.datetime.strptime(str(d).split(" ")[0], '%Y-%m-%d')
        return d


# connect rds
conn = boto.rds.connect_to_region('your rds region'\
        , aws_access_key_id = 'your aws_access_key_id'\
        , aws_secret_access_key = 'your aws_secret_access_key')

# today date
NToday = datetime.datetime.today().strftime('%Y-%m-%d')

# db instance list
db_instance = [put your instance list here, so we can use it for loop to process all db instance]

for db in db_instance:

    # get all db instance snapshot
    snap = conn.get_all_dbsnapshots(None, db, None, None)

    # snapshot list for snapshot id, snapshot_create_time
    snapshot_list = []
    for v in snap:
        temp_dict = {}
        temp_dict['snap_id'] = v.id
        temp_dict['snap_time'] = v.snapshot_create_time
        snapshot_list.append(temp_dict)

    # sort snapshot list
    sort_list = sorted(snapshot_list, key = lambda x:x['snap_time'])

    try:
        # create daily snapshot
        conn.create_dbsnapshot("{0}-{1}".format(db, NToday), db)

        # latest_day & oldest_day & se_lat_day
        latest_day = datetime.datetime.strptime(NToday, '%Y-%m-%d')
        se_lat_day = day_process(sort_list[len(sort_list)-1]['snap_time'])
        oldest_day = day_process(sort_list[0]['snap_time'])

        # snapshot keep days
        keep_day = 15

        if (latest_day-oldest_day).days and (se_lat_day-oldest_day).days >= keep_day:
            # for the situation over 2 snapshot > keep_day
            for li in sort_list:
                com_day_old = day_process(li['snap_time'])
                if (latest_day-com_day_old).days > keep_day:
                    conn.delete_dbsnapshot(li['snap_id'])

        if (latest_day-oldest_day).days >= keep_day:
            # for the situation only 1 snapshot > keep_day
            # delete snapshot
            conn.delete_dbsnapshot(sort_list[0]['snap_id'])

    except Exception as e:
        print e

2014年6月8日 星期日

android hash key 紀錄

這篇是將之前做過的FB相關應用前置動作紀錄一下

首先要產生hash key這篇就講得蠻清楚的了
http://blog.kenyang.net/2012/01/androidfacebook-login-api.html

再來是要怎樣將產生的key包進要生成的application裡(如下圖)






2013年12月19日 星期四

android.os.NetworkOnMainThreadException的問題

自從將 Android 升級成 4.2 之後,httpRequest 就出現了 android.os.NetworkOnMainThreadException 這個問題

在網路上查過之後才發現原來 Android 為了怕開發者將 HTTP 傳送請求放在主程式中,如果 HTTP 這個要求一直持續的話很有可能會卡死整個程式,造成應用程式的 crash 因此 Android 非常貼心的幫助開發者判斷 httpRequest 這個方法是否是在主程式中運行,如果是的話便會拋出錯誤

而如果想要解決這問題就是要將 httpRequest 寫在多執行緒中,以下是其中一種解法

public class MainActivity extends Activity{
 
 private EditText txtMessage;
    private Button sendBtn;
    private String uriAPI = "你要傳送要求的網址";
    String msg = null;
    @Override

    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        txtMessage = (EditText) findViewById(R.id.txt_message);
        sendBtn = (Button) findViewById(R.id.send_btn);
        sendBtn.setOnClickListener(sendlistener);
        
    }
    private Runnable mutiThread = new Runnable(){
      public void run(){
      // 運行網路連線的程式
      msg = txtMessage.getEditableText().toString();
      String r = sendPostDataToInternet(msg);
      if (r != null)
      Log.d("first0.0", r);

    }
  };
  public OnClickListener sendlistener = new OnClickListener(){
    public void onClick(View v){
      if (v == sendBtn){
        if (txtMessage != null){
              /* 
               * 這邊要用 Thread 是因為 Android 改版之後
               * 會對在主程式裡跑網路連接的程式碼做 Exception 的意外排除動作
               * 因此要把網路連線使用多執行緒的方式去運行,才不會被當成例外錯誤拋出
               */
               Thread thread = new Thread(mutiThread);
               thread.start();
         }
       }
     }
   };
    
    
    private String sendPostDataToInternet(String strTxt){

        /* HTTP Post */
        HttpPost httpRequest = new HttpPost(uriAPI);

        /* 將 Post 值存為一個 NameValuePair[],在這邊去添加自己想要的值 */
        List params = new ArrayList();

        params.add(new BasicNameValuePair("APIMethod", "phoneTest"));
        /* 這邊 PHP 端的接法就是用 $_POST['data']就接的到這邊的 strTxt 這個變數值了 */
        try{
         
            /* 設定 HTTP request */
            httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

            /* 傳送 HTTP response */
            HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
            
            /* 如果回傳值為 200 即為傳送 ok */
            if (httpResponse.getStatusLine().getStatusCode() == 200){

             /* 接收回傳字串,這邊接的值就是在 PHP 那邊 echo 的值 */ 
             /* hellow.php 這隻程式碼的寫法:
              * if($_POST['data']!=null) echo $_POST['data']; */
              
                String strResult = EntityUtils.toString(httpResponse.getEntity());
            
                return strResult;
            }
            else{
                Log.d("sss", "no message");
            }
        } catch (ClientProtocolException e){
         Log.d("@@", e.toString());
        } catch (IOException e){
         Log.d("@@", e.toString());
        } catch (Exception e){
         Log.d("@@", e.toString());
        }
        return null;
    }
}

2013年8月13日 星期二

Facebook API Heroku

登入: heroku login

金鑰重新加入的解法: heroku keys:add





https://devcenter.heroku.com/articles/facebook

因為每次都會忘記,所以稍微記錄一下

2013年4月21日 星期日

android facebook api

此處將我使用過的 facebook android api 記錄下來,持續增加中

1. 取得 facebook 朋友清單
//取得朋友清單需要的權限 read_friendlists


public void GetFriendsList(){
//取得朋友清單方法
try {
//facebook.request("me/Friends") 取回來的資料是 json 格式,直接轉 json 比較方便
//要用字串也行,使用方式為 String data = facebook.request("me/Friends");
//只是直接用字串的話就是一整堆資料,要切
JSONObject json = new JSONObject(facebook.request("me/Friends"));
//取回來的資料是包在 data 裡,所以將 data 裡的資料放進 array 裡面
JSONArray array = json.getJSONArray("data");

if(array != null){
for(int i=0;i<array.length();i++){
String id = array.getJSONObject(i).getString("id");
String name = array.getJSONObject(i).getString("name");
Toast.makeText(this, name, Toast.LENGTH_LONG).show();
}
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


2. 將訊息自動發佈到塗鴉牆上


//發佈到塗鴉牆上需要的權限 publish_stream



public void postToWall() {
    //此處是會自動發佈至塗鴉牆的寫法
    //另外還有一種寫法是會跳出一訊息框讓使用者自行填寫要發布的消息
   Bundle params = new Bundle();

   params.putString("message", "此處為發佈至塗鴉牆上的訊息" );
   try {
facebook.request("/me/feed", params, "POST");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}




2012年12月25日 星期二

Android WebView 使用紀錄

之前在玩 PhoneGap 的時候,就有想過能不能在 javascript 裡面就直接調用 Android Java 的 class,答案是可以的,Android 的官方文件的 WebView 教學,就有教怎麼去使用,下面稍微做個範例


1. 在要執行的頁面 (XXX.XML) 檔裡放入一個 WebView 如下

<WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />


2. 進入 AndroidManifest.xml 檔裡開啟權限

<uses-permission android:name="android.permission.INTERNET"/>


3. 在執行的 java 檔裡 (src/your_package/你要執行的 java 檔案 ex. MainActivity.java) 寫入下列程式碼

//先把在頁面中呈現的 WebView 註冊,接著就能用 webview 執行底下的方法
WebView webview= (WebView) findViewById(R.id.webView);

//設定一個 Javascript 的 Interface,前面是指這邊這個物件,後面是要註冊的名稱,這邊先將它取名為 test
webview.addJavascriptInterface(this, "test");

//接著將 JavaScript 的設定開起來
webview.getSettings().setJavaScriptEnabled(true);

//指向設定預定呈現的頁面,此處我是將檔案放在 assets/www/ 底下,www 資料夾為自行創建
webview.loadUrl("file:///android_asset/www/index.html");

//在 onCreate() 外面創建一個 function,也是在同一支程式檔裡,上面 addJavascriptInterface this 就代表指向的檔案

public void javascripCall(){
log.d("javascrip_call","test");
}



4. 在 index.html 裡,可直接執行 javascript 程式碼,也可使用 <script type="text/javascript" src="js/xxx.js"></script> 檔案引入的方式,都是可行的

而在 index,html 裡的 javascript 碼,只要照著剛剛設定的名稱進行呼叫,就可以直接調用 Java 的 function

<script type="text/javascript">

callAndroidJava = function(){
test.javascripCall();
}

</script>




2012年11月27日 星期二

Java ArrayList<Object>的用法,Android 寫法

ArrayList<Object>是一種還蠻方便的定義存放資料的方法,可支援存放不同屬性的物件在裡面

首先先設定一個類別存放資料


class Object_list{
// TODO 設定 List Object
String first_string;
String second_string;
int first_number;
}

設定好了之後,可撰寫一個呼叫此類別的方法,之後會比較方便


class Object_list_example {

public List<Object_list> call_list_example(){
// TODO 存值入 List<Object_list_example>

List<Object_list> li = new ArrayList<Object_list>();

Object_list ob;  //如果class Object_list不是在同一個頁面的話記得要new Object_list 出來                              

for(int i = 0; i< 5 ; i++){
ob = new Object_list();          //NEW 一個物件,如果不寫在迴圈裡便會重複寫入
ob.first_string = " "+i;             //將資料存入 Object_list 裡的 first_string
ob.first_number = i;                //將資料存入 Object_list 裡的 first_number
li.add(ob);                              //將資料塞進 List<Object> 裡
}
return li;
}
}

設定好資料內部屬性以及呼叫方法之後,接下來便是實作


public class Call_list_object{

public void call_list_object(){
// TODO 呼叫 List<Object_list_example>
Object_list_example li_example = new Object_list_example();
List<Object_list> li = li_example.call_list_example();

for(int i =0; i<li.size(); i++){
// 印出 li 裡的 first_string 字串,這會出現在Logcat裡,如果是Java可直接print出來
Log.d("List print first_string value", li.get(i).first_string);
}
}
}


印出結果為
     List print first_string value 0
     List print first_string value 1
     List print first_string value 2
     List print first_string value 3
     List print first_string value 4

PS.前面有提過的,如果不把這段 ob = new Object_list(); 加在程式碼裡,便會重複寫入最後一個數字印出結果為
     List print first_string value 4
     List print first_string value 4

     List print first_string value 4
     List print first_string value 4
     List print first_string value 4

與資料庫的搭配用法之後會再繼續寫