Instantiate and Present a viewController in Swift

Question

How to instantiate and then presenting a viewController from a specific storyboard?

Answer

Swift 3

1
2
3
let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "someViewController")
self.present(controller, animated: true, completion: nil)

Issue

For people using this answer to instantiate UIViewController and are having the exception:

fatal error: use of unimplemented initializer ‘init(coder:)’ for class

Solution

Manually implement init(coder: NSCoder!) at your destination UIViewController that you are trying to instantiate.

1
2
3
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}

If you need more description please refer to this answer here

Reference


This is the end of post

iOS App生命周期初识

面对每次打开 iOS 应用时。都是否想到过其 App 运行过程:从启动到按 Home 键回到主屏幕,从运行中到按两下 Home 键进入任务管理界面,甚至 iOS9 后支持多任务的 iPad 当两个 App 出现在同一屏幕上,这几个情况 App 所处于什么状态,其过渡中又在进行怎样的状态切换呢?

App状态变化的历史

在 iOS4 之前的 App 时代,整个界面只允许一个 App 处于运行状态,而当某个 App 处于运行状态时意味着其他所有的App的活动都被终止并退出,无法接受任何事件。一个应用的状态转换只有运行、退出之间的变换。在 iOS4 之后的 iPhone 进入了多任务处理时代,也意味了当从一个应用切换到另一个应用时,系统不会马上将原来的应用终止退出,将其状态变成了 suspend,而另一个应用的状态变成了 running。

AppDelegate

运行一个 App,应用程序会自动创建 UIApplication 单例对象,并用于引用着,其 UIApplicaiton 实例的 delegate 被赋值为 AppDelegate 实例对象,其也是一个单例,也永远不会被释放直到该 App 退出。而 AppDelegate 对象有着一系列在程序启动时的跟踪状态变化,处理从其他应用跳转、启动到此应用,或者后台运行代码的方法。以下是 AppDelegate 做为 App 的根对象的主要功能:

  1. 运行在启动时自己用来初始化应用的特点代码。
  2. 响应App从启动,到后台,到前台,到退出时各个状态时的指定方法。
  3. 负责处理接收推送通知或本地通知启动App的情况,处理手机低内存警告时的情况。
  4. 负责处理应用程序的状态保存和恢复。
  5. 响应由App处理的事件,而是指定控制器或视图。
  6. 处理数据的存储。

App状态的代理事件

新建一个 Signle View Application 后,系统会自动创建 AppDelegate 文件,系统默认提供的方法表示了 App 不同的运行状态。

application:willFinishLaunchingWithOptions

在 App 启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复

application:didFinishLaunchingWithOptions

表示 App 将从未运行状态进入运行状态,用于对 App 的初始化操作。

applicationDidBecomeActive

application:didFinishLaunchingWithOptions: 之后调用,表示应用进入 active 状态,在 applicationWillResignActive 调用后 App 又回到 active 状态时也会调用。

applicationWillResignActive

当某一操作阻塞 App 界面时会调用,如按 Home 键回到键入主界面,划出通知栏或者设置,临时的电话和通知,支持多任务的 iPad 进行侧边栏滑动时等情况下都会调用,使得 App 进入 inactive 状态,往往操作结束后会调用 applicationDidBecomeActive,使得 App 回到 active 状态。

applicationDidEnterBackground

在 App 进入后台后调用,之前肯定会调用 applicationWillResignActive 方法,允许执行短时间的任务代码如清理内存。

applicationWillEnterForeground

当 App 将从后台回到前台时调用,之后肯定调用 applicationDidBecomeActive 方法表示程序进入 active 状态,但 App 第一次启动时不是从后台启动,所以首次加载时不会调用此方法。

applicationWillTerminate

当 App 将要被系统杀死时调用,通常用来对 App 进行清理工作,释放资源,保存数据等等,所执行的操作官方推荐最多耗时5s左右的事件来完成和返回,若时间过长系统杀死应用时会将使操作失败。其调用时机比较特殊,如果运行的 App 直接退出(非进入后台),会调用;若应用是从中断状态(此状态期间 App 无法接收任何事件)被系统退出,则不会被调用。

注意点

iOS8 中,App 会在根控制器初始化后调用 viewDidAppear 方法之后才会调用 applicationDidBecomeActive,对于 App 启动的事件顺序为

  1. application:didFinishLaunchingWithOptions:
  2. viewDidLoad
  3. viewWillAppear
  4. viewDidAppear
  5. applicationDidBecomeActive

而在iOS7和9中,App在调用 applicationDidBecomeActive 方法后才会调用根控制器的 viewDidAppear,其调用顺序为

  1. application:didFinishLaunchingWithOptions:
  2. viewDidLoad
  3. viewWillAppear
  4. applicationDidBecomeActive
  5. viewDidAppear

在这两情况下如果要对 UIApplicationDidBecomeActiveNotification 进行通知注册时就需要考虑其 iOS 的兼容性,否则就会出现问题了。

参考


本文完

中美间汇款方式总结

中国人民币汇美元到美国

支付宝 - 上银汇款

打开支付宝的 App 或者网页版,使用上银汇款的国际转账功能,选择你在美国的银行名称和 Account Number,同时系统会自动选择 Swift 国际转账代码,输入金额后就能直接转账了,手续费是50人民币。优点是方便迅速,缺点是每次汇款有3万人民币的限制,不适合大额转账。

虚拟货币 - CoinCola

在 CoinCola 用人民币购买虚拟货币,然后体现到电子货币的钱包,在转移到 GDAX 的钱包,即时卖掉后得到美元,可以体现到美国的银行账户上。虚拟货币价格变化较快,需要即时交易,不要等太久,不然就亏了,也许赚了。

美国美元汇人民币到中国

光票托收

光票托收是中国银行推出的一款金融服务。简单地来说,你带上你美国的支票,存入到你中国银行的账户上去,经过40天左右的处理时间,支票上的美元金额就会存入到你中国银行的账户,手续费50人民币左右。优点是手续费比较低廉,缺点是等待时间较长。

这个业务叫光票托收,中国银行一直都有。中国银行会收几十元人民币的手续费。需要三四十天才能到账,到账时是美元。

国内银行不需要确定支票上的人就是来存的人。支票要等美国这边开支票的人确认之后,划款给中国的银行,中国那边才能取钱出来。所以中国的银行没有任何风险。他们自然也不在乎是谁去存的。这就是为啥支票兑现需要1个月的原因。

我只在国内的中国银行办过这个业务。并且确实在三线城市的中国银行里碰到工作人员居然不知道要怎么处理这个业务。是的,你只需要带着支票,身份证,银行卡。我的经验是银行不管你叫李白还是白李,都行,不是李黑就行。正常情况下去银行一次,除非比如你证件没带。然后过三四十天网上银行或者电话银行查查是不是美元进入你账户了。此时的美元是汇不是钞,如果你选择把它换成人民币可以比钞多换点钱。

西联汇款

西联汇款提供直接从美国汇款到中国的业务。简单看了一下,汇率有点差,其他情况不清楚。

最近使用了西联汇款回中国,他们不收取手续费,使用 App 或者网页版可以直接汇款。如果是第一次汇款,中国的西联汇款会验证收款人,验证通过后,以后汇款就不需要验证了,直接到账。我是美国晚上汇回中国的,第二天早上起床就收到人民币了,非常方便。

汇率还行,加上没有手续费,是一个不错的选择,比起 Paypal 旗下的 Xoom 真的是好太多了!

虚拟货币 - CoinCola

在 GDAX 上使用美元购买虚拟货币,然后将虚拟货币发送到 CoinCola 的钱包,在 CoinCola 卖出得到人民币,上面支持银行转账和支付宝交易。因为虚拟货币价格变化浮动较大,需要注意及时处理,否则抑或是赚了,抑或是亏了,正常情况下汇率会比支付宝提供的汇率高 0.1 ~ 0.2 左右。

总结

方式 优点 缺点
中国 -> 美国 支付宝 方便,快速 额度低
中国 -> 美国 虚拟货币 方便,快速,额度无限 价格浮动快
美国 -> 中国 光票托收 手续费低廉 速度慢
美国 -> 中国 西联汇款 速度快,无手续费 汇率一般,但不差
美国 -> 中国 虚拟货币 方便,快进,无手续费 价格浮动快

本文完

Setapp -- A Collection Of Applications Like Netflix

What is Setapp?

As a Macbook user,especially as a developer, we probably need lots of productive applications and tools to work with Macbook. However, there are many applications you need to buy before using them, or you can start a free trial and buy it later. Also, there are also many excellent applications you may not know and download.

It’s really unreasonable to buy many applications which you only use them for several times. Is there any way like Netflix that I can subscribe it and use all applications.

Setapp is just like its name, which is a set of applications. By downloading in your Macbook, you can easily reach whenever you need it.

Setapp will charge you monthly subscription fee with $9.99 just like Netflix, and you will have unlimited access to all the applications it has. Of course, Ads free. Below is the screenshot that Setapp has.
app

At this moment as January 10, 2017, Setapp is still a beta version, and you have free access until March 2017. So, it is a good time to try it without paying any fee.

How it works?

After installing Setapp, it has its own folder. All you need to do is to download the applications you need inside.
install

Above is the glance of iStat Menus, it has screenshots and a brief introduction. Click Open and downloaded, you can easily access to this application. The applications also support Spotlight Search like below.
spotlight

Want to give Setapp a try?

If you feel like to give Setapp a try, you can use my invitation link to download the app. All Beta users get free Setapp access until March 1st.

Please note I won’t get any benefit from you if you use my link, and you can get instant approval of using Setapp.

The invitation link is only available for first five friends.


This is the end of post

Setapp -- 像 Netflix 一样的应用程序合集

什么是 Setapp ?

作为一个 Macbook 的用户,特别是一个程序员,我们也许需要安装很多生产力工具的应用程序。然后,很多应用程序在使用前你是需要先买后用,或者会有个很短的试用期,然后再购买。同样,还有很多非常优秀的应用程序你并不知道,也没有下载使用。

如果你买很多个应用程序,但只使用几次,这显然非常不合理。那有没有像 Netflix 一样的东西,你需要每月付订阅费用,然后可以用所有的应用程序呢?

Setapp 就如同它的名字,它就是一篮筐的应用程序。你只需要下载到你的 Macbook 上,然后就可以使用它所包含的所有应用程序了。

Setapp 会像 Netflix 一样,每月收取 $9.99 刀的服务费,然后你就获取所有应用程序的全部权限,当然是也没有广告。下图就是 Setapp 的截图。

app

就今天 2017 年 1 月 10 日来说,Setapp 仍然是测试版本,所以你可以免费使用它直到 2017年3月。如果想尝试一下,又不想马上付费的话,现在应该是一个不错的时候。

Setapp 怎么用的?

在下载安装 Setapp 后,它有它单独的文件夹。里面的软件并没有下载,如果你需要用的话,只需要下载单独的软件就行。

install

上图是 iStat Menus 的截图,每个软件都有自己的截图和简单的介绍。点击 Open 后就会下载,你就可以使用这个应用程序了。Setapp 同样也支持 Spotlight Search 的功能,下面是截图。

spotlight

想要试试 Setapp 吗?

如果你想试试 Setapp 的话,你可以点击我邀请链接马上获得下载权限。所有的测试用户都可以免费使用 Setapp 到 2017年3月1日。

需要说明的是,即使你使用我的邀请链接,我不会获得任何收益,但你可以立即获得 Setapp 的权限。

邀请链接仅限于前名用户。


本文完

How To Run Static Server In AWS EC2

Set up AWS account

You can create a student account with $100 credit for free if you have an .edu email.

Create EC2 instance

  1. Launch Instance, choose ubuntu, follow the default settings.
  2. In Security Groups, add the following rule below.
  3. Create a key pair, and save to your computer.
1
2
3
4
HTTP                         Anywhere
HTTPS Anywhere
Custom TCP Rule 8000 Anywhere
Custom TCP Rule 9000 Anywhere

Log in to AWS EC2

  1. Go to your key directory.
  2. Enter ssh -i node.pem ubuntu@ec2-11-111-111-111.compute-1.amazonaws.com to log in
  3. Maybe you will see it is a public key, and can’t login. Change the property of key file by using chmod 600 key.pem, check file’s property by using ls -l

Use fileZilla to upload files to AWS

  1. Preferences > Settings > Connection > SFTP, Click “Add key file”
  2. Browse to the location of your .pem file and select it.
  3. File > Site Manager, Add a new site with the following parameters:
    • Host: Your public dns name of ec2 instance, or the public ip address of the server
    • Protocol: SFTP
    • Logon Type: Normal
    • User: Please see blow
    • Press Connect Button

User type:

  1. For Amazon Linux, the default user name is ec2-user.
  2. For RHEL5, the user name is often root but might be ec2-user.
  3. For Ubuntu, the user name is ubuntu.
  4. For SUSE Linux, the user name is root.
  5. For Debian, the user name is admin. Otherwise, check with your AMI provider.”

Setup Ubuntu environment

  1. Enter sudo apt-get update
  2. Enter sudo apt-get install libssl-dev g++ make
  3. Install npm by going to nodejs.org
  4. Test if success by creating a vim test.js file
  5. Run node test.js, and go to 11.11.11.11:9000 to see if works

test.js source code for Node.js

1
2
3
4
5
6
7
var http = require('http');
var port = 9000
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type' : 'text/plain'});
res.end('Hello World!\n');
}).listen(port);
console.log('Listening on port: ', port);

Use Express to server static folder

  1. Install Express by using npm install express
  2. Modify test.js file by using the code below
  3. Run node test.js, and go to 11.11.11.11:9000 to see if works

test.js source code for Express:

1
2
3
4
5
6
7
8
9
10
var express = require('express');
var app = express();

app.get('/', function (req, res) {
res.send('Hello World!\n');
});

var port = 9000;
app.listen(port);
console.log('Listening on port: ', port);

Server static folder by using Express

  1. Folder directory as below
  2. Create test.js as it below
  3. Run node test.js, and go to http://localhost:8080/ to check if success
1
2
3
4
5
.tv
-public
-js
-templates
-test.js

test.js:

1
2
3
4
5
6
7
8
9
10
var express = require('express'),
app = express();

app.use(express.static(__dirname + '/public'));

app.get('/', (req, res) => {
return res.status(200).send('This is the root of my express application');
});

app.listen(8080);

Run Server Backend Forever

  1. Using sudo nohup node test.js &
  2. delete nohup.log file
  3. Stop the task? Check the task ID by using ps -ef, find test.js ID, and using kill ID to stop

Additional Information

  1. Express wouldn’t let you visit the folder directly. If you need to visit a file, try http://localhost:8080/js/application.js, otherwise you may get Cannot GET/

Reference


This is the end of post

如何在 AWS EC2 上搭载静态服务器

设置AWS账号

如果你有 .edu 邮箱的话,你可以申请学生账号,AWS会给你 $100 刀,有效期是一年。

Create EC2 instance 创建 EC2 实例

  1. 创建一个实例,选择 ubuntu,然后选择默认的设置。
  2. 在 Security Groups 一栏,添加以下的规则。
  3. 创建一个钥匙串,然后保存到你的电脑上。
1
2
3
4
HTTP                         Anywhere
HTTPS Anywhere
Custom TCP Rule 8000 Anywhere
Custom TCP Rule 9000 Anywhere

登陆到 AWS EC2

  1. 使用 Terminal 进入你钥匙串所在的文件夹。
  2. 输入 ssh -i node.pem ubuntu@ec2-11-111-111-111.compute-1.amazonaws.com 来登陆。
  3. 也许你会得到提示,这不是一个公共的钥匙串,无法登陆。这时候需要改变钥匙串文件的属性,输入 chmod 600 key.pem 来修改文件的属性, 输入 ls -l 来查看文件的属性。

使用 fileZilla 来上传文件到 AWS

  1. 选择 Preferences > Settings > Connection > SFTP,然后选择 "Add key file”
  2. 选择你从 AWS 上下载的 .pem 的文件,然后选中它。
  3. 选中 File > Site Manager,用以下参数新建一个 site:
  • 你 EC2 实例的公共 DNS 名称,或者是服务器的 IP 地址
  • Protocol: SFTP
  • Logon Type: Normal
  • User Type: 见如下
  • 按下 Connect 按钮

User type:

  1. 对于 Amazon Linux, 默认的用户名是 ec2-user.
  2. 对于 RHEL5, 默认的用户名是 ec2-user.
  3. 对于 Ubuntu, 默认的用户名是 ubuntu.
  4. 对于 SUSE Linux, 默认的用户名是 root.
  5. 对于 Debian, 默认的用户名是 admin,如果不是的话,查询你的 AMI 提供商。

设置 Ubuntu 的环境

  1. 输入 sudo apt-get update
  2. 输入 sudo apt-get install libssl-dev g++ make
  3. 打开 nodejs.org 来安装你的 Node.js。
  4. 通过 vim test.js 来创建一个 test.js 的文件。
  5. 运行 node test.js,然后打开 11.11.11.11:9000 来查看是否成功

test.js 的 Node.js 代码示例:

1
2
3
4
5
6
7
var http = require('http');
var port = 9000
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type' : 'text/plain'});
res.end('Hello World!\n');
}).listen(port);
console.log('Listening on port: ', port);

使用 Express 来搭载静态服务器

  1. 通过 npm install express 来安装 Express
  2. 修改 test.js 这个文件,使用如下的代码示例
  3. 运行 node test.js,然后打开 11.11.11.11:9000 来查看是否成功

test.js 的 Express 代码示例:

1
2
3
4
5
6
7
8
9
10
var express = require('express');
var app = express();

app.get('/', function (req, res) {
res.send('Hello World!\n');
});

var port = 9000;
app.listen(port);
console.log('Listening on port: ', port);

使用 Express 静态服务器来访问文件夹

  1. 如下是文件夹的目录,供参考。
  2. 创建如下的 test.js 文件。
  3. 运行 node test.js,然后打开 http://localhost:8080/ to check if success
1
2
3
4
5
.tv
-public
-js
-templates
-test.js

test.js 的代码示例:

1
2
3
4
5
6
7
8
9
10
var express = require('express'),
app = express();

app.use(express.static(__dirname + '/public'));

app.get('/', (req, res) => {
return res.status(200).send('This is the root of my express application');
});

app.listen(8080);

让服务器在后台一直运行

  1. 输入 sudo nohup node test.js &
  2. 删除 nohup.log 的文件。
  3. 想要终止任务?你需要通过输入 ps -ef 来查询到任务的 ID,然后输入 kill ID 来终止程序。

额外信息

  1. Express 并不会让你直接访问文件夹,如果你需要访问一个文件,输入 http://localhost:8080/js/application.js,否则的话你会得到 Cannot GET/ 的回复。

参考


本文完

Use Travis CI To Deploy Jekyll To AWS S3

Beginning

Travis CI is a very good tool to help you auto-test and auto-deploy.

You can log in Travis CI with your Github account. https://travis-ci.org/ is for public repository, https://travis-ci.com/ is for private repository. Private repository may cost you a little fee.

Setup repository

Log in with Github account, and enable the repository that has your Jekyll site inside.
setup

Script Settings

Travis

Travis CI needs .travis.yml in your repository root to build and deploy the websites.

Below is what I use.

1
2
3
4
5
6
language: ruby
rvm:
- 2.1
install: gem install jekyll -v 2.4.0 && gem install s3_website
script: jekyll build
after_success: s3_website push
  • install: gem install jekyll -v 2.4.0 && gem install s3_website is to install jekyll and s3_website.
  • s3_website can help you push files into AWS S3.
  • script: jekyll build is to build the site with Jekyll.
  • after_success: s3_website push is to copy everything you have to AWS S3.

AWS S3

s3_website needs a configuration to access your Amazon Web Service account. Simply create a s3_website.yml in repository root, and copy the code below into that file. Remember to change variables.

s3_id: fdsahfkjhaskjfhdas
s3_secret: fjsdafjashfkjdas
s3_bucket: weixia.info
cloudfront_distribution_id: fdsahjfkadhs

Environment Variables

This is the final step to set up environment variables in Travis CI.

Go to your repository setting page, under Environment Variables section, add s3_id, s3_secret, s3_bucket and cloudfront_distribution_id into name along with their values.

variables

Let it run

Every time you make any changes and commit them to Github repository, Travis CI will rebuild the sites and deploy it.


This is the end of post

使用 Travis CI 来部署 Jekyll 到 AWS S3 上

开始

Travis CI 是一个非常好的工具来帮助你自动检测和自动部署。

你可以使用你的 Github 账号来登录 Travis CI。 https://travis-ci.org/ 是适合于公开的库, https://travis-ci.com/ 是适用于私有的库。如果你想部署私有的库,Travis CI 会向你额外收取一定的费用。

设置库

登录你的 Github 账号,然后选择包含 Jekyll 网站的库。如下图所示: setup

脚本设置

Travis

Travis CI 需要 .travis.yml 文件来支持和部署网站,你需要将此文件建立下文件夹的根目录。

如下所示就是我使用的代码:

1
2
3
4
5
6
language: ruby
rvm:
- 2.1
install: gem install jekyll -v 2.4.0 && gem install s3_website
script: jekyll build
after_success: s3_website push
  • install: gem install jekyll -v 2.4.0 && gem install s3_website 是用来安装 jekylls3_website
  • s3_website 能帮助你将文件上传到 AWS S3 上。
  • script: jekyll build 是用 Jekyll 来建立这个网站。
  • after_success: s3_website push 将建立网站的所有文件上传到 AQS S3 上。

AWS S3

s3_website 需要一个配置来获取你 Amazon Web Service 的账户权限。 在文件夹的根目录,简单地创建一个 s3_website.yml 的文件,然后把如下的代码复制进去,别忘记修改相关变量。

s3_id: fdsahfkjhaskjfhdas
s3_secret: fjsdafjashfkjdas
s3_bucket: weixia.info
cloudfront_distribution_id: fdsahjfkadhs

Environment Variables (环境变量)

这是设置 Travis CI 的最后一步,稍微修改下环境变量。

在 Travis CI 上打开所选库的页面, 选择 Environment Variables 部分, 添加 s3_ids3_secrets3_bucketcloudfront_distribution_id 的名称,同时添加上它们的值。

variables

让它运行

每当你的这个库有任何修改时,在你提交到 Github 之后, Travis CI 就会自动运行,自动部署你的网站,不需要你的任何手动操作。


本文完

Best Way To Merge A Git Branch Into Master

Question:

There are two branches, master and develop.
What is the best and safest way merge develop branch into master branch?

Answer:

Here is the solution. After you commit everything in develop branch.

Do as following steps:

1
2
3
4
git checkout master
git pull origin master
git merge develop
git push origin master

As other answers mentioned, this solution is only acceptable for a small project, like only few branches, and other people won’t make changes in master branch. From my personal perspective, if there are some conflicts between master and develop branch, this might not be a good way to solve this problem.

Reference

Best (and safest) way to merge a git branch into master


This is the end of post