Docker

Docker簡單的來說就是應用程式的虛擬化,有別於VM是作業系統的虛擬化

要玩Docker有幾個重點需要注意的,我將它記錄如下:

1.Container : 就是Docker裡面封裝軟體的容器,也就是一個單位,其實他就是一個將很多其他不重要的元件拿掉之後,所剩下的最基本的Linux作業系統

2.Image : 就是一你的軟體的映像檔,當軟體要執行時,Docker會根據image的資料載入container然後才真正執行

3.Share : Docker讓個人或是公司可以分享他的製作好的image給其他使用者使用,利用Docker-Hub https://hub.docker.com/

4.Corss-Platform 使用Docker,你不必在意使用者使用什麼樣的平台(作業系統),他在每個作業系統(Mac,Linux,Window..)上建構了一個containser虛擬化技術,所以只要封裝成Docker的container,就可以在任何的作業系統上運作你的軟體

5.Run 要執行Docker很簡單只要執行以下指令

$docker run [container name]

6.Docker file : 就是Docker Image的描述檔,告訴Docker說這個軟體要運作在什麼樣的環境,還有要執行什麼指令,簡單的說就是一個軟體運作的食譜

7.Build Image: 當dockerfile裡面的敘述都完成後,就可以根據這個敘述檔產生一個Docker Image,很簡單只要打上以下指令:

$docker build -t docker-whale

8.Docker Image Local: 一般來說Docker在執行時會先在本地端Local尋找是否有要執行的映像檔(Docker Image),如果沒有才會去DockerHub上去下載 如果要知道本地端有什麼映像檔(Docker Image)可以使用,只要打上以下指令

$docker images

9.Push image to Docker Hub 如果要將自己製作好的Image Push到Docker Hub,

第一步. 先去Docker Hub申請帳號
第二步. 再來就是將製作好的Image和自己的Docker Hub關聯起來,指令如下:
$docker tag 7d9495d03763 maryatdocker/docker-whale:latest

7d9495d03763 > 就是利用Image的hash code

可以用 $docker images 指令去查看 maryatdocker/docker-whale:latest

就是Docker Hub上面的repository

第三步. push到Docker Hub
$docker push 

10.Remove form local 要移除local的image只要執行以下指令:

$docker rmi -f 7d9495d03763`

11.Pull from you repository 如果要從Docker Hub將指定的container image 抓取下來,只要執行指令:

$docker pull [yourusername/docker-whale]

iOS View 事件的傳遞 using Swift

一般來說 iOS 裡面最外層的就是 UIViewController這個元件 之後所以有的一個view不管是UILabelView,UIImageView,UITableView…..等 都是附加在這個容器上面

這裏就一個好玩的東西叫做Delegate, 他其實是一個protocol,就是要接收事情的物件實作這個protocol 就可以接收另外一個物件發送的事件

這個東西很好用就在於如果你將一個功能做一個一個物件,但是一這個物件接收到事件後, 必須傳遞到附加這個功能的主物件

這是時候就要用Delegate,在此說明一下使用方法:

例如說:

先宣告一個Delegate功能的protocol

protocol VideoListViewDelegate {
    func tableViewItemClick()
}

我有一個VideoListView的功能物件,當使用者按下TableView的row item時,我必須處理相關的事情 如此當事情發生時呼叫delegate?.tableViewItemClick()

import Foundation 
import UIKit

class VideoListView: UIView, UITableViewDelegate, UITableViewDataSource {

... 

var delegate: VideoListViewDelegate? 

... ...

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        delegate?.tableViewItemClick()


    }
}

之後在ViewController去實作這個protocol,然後再實作這個protocol的方法

import UIKit 

class VideoListHomePageViewController: UIViewController, VideoListViewDelegate { 

    override func viewDidLoad() { 
        super.viewDidLoad()
        var videoView = VideoListView()
        videoView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableViewItemClick()

      ....處理VideoListView的tableView Item按下時的事情


    }

}

如此就可以在兩個物件當中傳遞事件

Cross Domain AJAX Request And Rails

Because The Browser have the Same-origin policy

Same-origin policy it’s say:

A web browser permits scripts contained in a first web page to access data in a second web pageand only if both web pages have the same origin.

And it’s purpose is:

Prevents a malicious script on one page from obtaining access to sensitive data on another web page through that page’s Document Object Model.

So if We want to use a web ajax to get the data from the cross domain resource How can We do it?

Way1. JSONP

Frontend

$.ajax({ type: 'GET',  
    url: "http://localhost:3000/v1/questions/1/options", 
    dataType: 'jsonp', 
    success: get_options_data_success, 
    error: null 
});

var get_options_data_success = 
function(data) { ...do something you want }

Rails

render json: Question.all, :callback => params[:callback]

If use above, ajax will add ?callback=(Random function name)

such as: ?callback=jQuery21306889237540308386_1436178704662

and the Rails will get the callback params and will resoponse a porcess data /**/
jQuery213014021378150209785_1436178755583( …origin josn data rails will response…)

such as: /**/jQuery213014021378150209785_1436178755583( [{"question_id":1,"id":5,"description":"50+","votes_count":1}])

so Ajax can get the data Rails response and cross domain

Way2. CROSS-ORIGIN RESOURCE SHARING

Browser does not allow cross domain AJAX requests due to security issues.
Cross-domain requests are allowed only if the server specifies same origin security policy.
Read more about Cross-origin resource sharing (CORS)

If you want to enable CORS in Rails , you can add below code to ApplicationController

class ApplicationController < ActionController::Base 
  protect_from_forgery unless: -> { request.format.json? } 
  after_filter :set_cross_domain_access

  def set_cross_domain_access 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET' 
    headers['Access-Control-Allow-Headers'] = '*' 
  end 
end

Reference: http://hayageek.com/cross-domain-ajax-request-jquery/