Web 系統

Web 程式語言導覽:http://asukademy.logdown.com/posts/252496-web-programming-language-for-the-beginner

前端與後端

網頁開發通常分成前端工程與後端工程,各自有不同的語言,但又必須在網站之中交互作用才能夠提供給訪客流暢的體驗。

前端工程

前端泛指所有訪客能夠直接交流互動的介面,舉凡網站設計、切版、功能特效、下拉選單、橫幅、確認按鈕與表單等等,皆屬於前端的範圍。一名前端工程師通常需要具備稍微的美感(但不是必備,如果能與設計師流暢配合的話),才能夠將視覺設計師想傳達的概念與 UI 設計師設計的操作流程完美的呈現。當然,許多資深的前端工程師可能自己本身也是優秀的設計師。

前端工程師關注的是用戶體驗,而他們最大的痛苦在於跨瀏覽器相容問題。由於目前的網頁標準並非在所有瀏覽器中完美實現,有時相同的程式碼在 Chrome 與 Firefox 中顯示出來會不一樣,因此一個合格的前端工程師需要能夠掌握各種不同瀏覽器的特性與 hack 技巧,才能打造跨平台的泛用網站。另外,前端領域是個求新求變的世界,作為前端工程師最好要能逼迫自己時時刻刻了解最新的程式框架、技術以及每年流行的設計風格,以免跟不上前端領域可怕的進步速度。

代表語言:HTML, CSS, Javascript

常用工具與技術: jQuery, mootools, AngularJS, ReactJS, Gulp 等

後端工程師

後端則牽涉到伺服器上的運算,例如網站的基底程式語言、資料庫管理與規劃、或者伺服器架設與架構規劃,多屬後端工程的範圍。由於後端牽涉的知識與應用層面甚廣,通常不會有單一工程師能夠一人掌握所有面向,而是由一個團隊在一定的架構與規範下完成後端應用,我們稱此架構與規範為「框架 (framework)」。當然,資深的後端工程師也是有能力掌握整個後端知識,而小型應用也可能一個人就能應付後端需求。

後端工程關注的是程式應用的邏輯、效能與穩定性,需要對程式語言基本功有更高的掌握力,資料庫規劃、HTTP 連線原理等也都必須有所涉獵,才能寫出健壯的應用。相較於前端的快速發展,後端更要求長期穩定性,因為這些程式的應用邏輯可能是一間公司的命脈,轉換架構的風險通常都很高。

一般來說,網站的後端會由三劍客組合而成,分別是伺服器軟體 + 程式語言 + 資料庫,以下是這三者之中常見的項目:

代表語言: PHP, Ruby, Python, ASP .NET, JAVA, Node.js

常用伺服器軟體: Apache, NginX, Node.js, LightHttpd

常用資料庫: MySQL, MariaDB, PostgreSQL, MSSQL, Oracle, Sqlite

2009 年 11 月正式宣布推出的 Go 語言則是本身就具備了 伺服器軟體 + 程式語言 的能力,因此網站的後端也可以簡化為 程式語言 + 資料庫。




初學 Web 開發,HTML 與 CSS 絕對是最基本的,無論是前端語言還是後端語言,最終都是借由操作這兩個語法,來控制瀏覽器顯示畫面。

接下來,在認真決定邁向前端還是後端之前,學習 Javascript 都是有幫助的,它是目前前端唯一的程式語言,無論如何都會需要用上它。當然也可以先學完後端語言再來學 Javascript,因為它的語法相較之下較為簡單,有程式語言基礎的人能夠更容易掌握,沒有程式基礎的人也能夠當做第一個語言來入門。

另外,如果選擇的後端語言是 Node.js,則兩者幾乎是一樣的東西,可以一道程式碼前後端皆通用。

雖然前端只有 Javascript 一個語言可以用,但其所衍生出來的框架與技術則是琳琅滿目。比較推薦前端初學者先從 jQuery 這個 DOM 操作框架開始學起,可以輕鬆接軌世界半數以上的前端函式庫,也不怕找不到工作。(雖然很多人根本就只學 jQuery 而從來沒有認真學過 Javascript,但也還是可以正常地開發網站)

若比喻 HTML 為網頁的骨幹,CSS 就是網頁的外觀,而 JavaScript 則提供了網頁用戶端的程式設計,三者結合可以設計出多采多姿的網頁。


維基百科:
https://en.wikipedia.org/wiki/HTML
https://en.wikipedia.org/wiki/Cascading_Style_Sheets
https://en.wikipedia.org/wiki/JavaScript


線上教學:
http://www.runoob.com/html/html-tutorial.html
http://www.runoob.com/css/css-tutorial.html
http://www.kaiching.org/2012/10/html-css-tutorial.html
http://21st.each1.net/2017/04/javascript.html


web 開發工具和資源:https://kknews.cc/tech/35e3y.html



安全性議題:

● 驗證表單的輸入
● 跨站腳本攻擊(Cross Site Scripting, 安全專家們通常將其縮寫成 XSS)
● 多次遞交表單
● 上傳惡意檔案
● 分散式阻斷服務攻擊(DDoS)
● session 劫持
● CSRF 攻擊
● 輸入過濾
● SQL 注入攻擊(SQL Injection)
● 用戶密碼的儲存方式
● 加密與解密

https://astaxie.gitbooks.io/build-web-application-with-golang/content/zh/09.0.html


怎麼防止 SQL 注入攻擊(SQL Injection):http://21st.each1.net/2017/03/php.html


R 語言

R 語言,一種自由軟體程式語言與操作環境,主要用於統計分析、繪圖、資料探勘。R 是基於 S 語言的一個 GNU 計劃專案,所以也可以當作 S 語言的一種實現,通常用 S 語言編寫的代碼都可以不作修改的在 R 環境下執行。R 的語法是來自 Scheme。

R 的原始碼可自由下載使用,亦有已編譯的執行檔版本可以下載,R 可以在各種平台上運作,包含 Windows、Macintosh、Linux 等數十種平台。R 主要是以命令列操作,同時也有人開發了幾種圖形用戶介面。

由於 R 語言(S 語言)從 70 年代持續演變至今,經過了好幾個世代,並不像近代的新興程式語言(如微軟的 .Net)是全新設計的,所以 R 的語法在某些時候會讓人感覺很奇怪,或是同時允許好幾種不同的寫法,這個現象是一個語言經過長期自由發展之後所難以避免的。當然語言很自由也是有優點的,如果不喜歡 R 原本的功能,可以自己動手直接改寫功能,而且通常人們需要的功能都已經有人寫好了,人們的問題通常不是「R 可以處理這個問題嗎?」,反而是「這裡有三種實作版本,應該用哪一個?」。

R 語言本身是屬於高階的直譯式語言(interpreted language),所以在程式執行之前,使用者不需要自己編譯程式,使用者可以把心力全部投入在資料的分析上,不用去管太低階的電腦問題,就跟使用 Matlab 這類的程式語言類似。

R 本身支援混合式的程式設計模式,其內部核心中是以指令式程式設計(imperative programming)來撰寫的(就像一般的指令稿,一行接著一行執行),但它也支援物件導向程式設計(object-oriented programming)與函數式程式設計(functional programming),混合式的程式設計風格會讓一個問題有好幾種解決方式,程式設計師可以依自己的喜好來選擇。


R 語言的官方網站:https://www.r-project.org/
維基百科:https://en.wikipedia.org/wiki/R_(programming_language)

初學 R 語言的60分鐘,引導 R 語言初學者的投影片:https://www.slideshare.net/chenpanliao/slide-44171070
R 語言的入門教學、進階使用技巧與範例等相關文件:https://blog.gtwang.org/programming/r/


使用 R 語言直接取用 Yahoo Finance 裡各公司股價的歷史資料:http://www.bituzi.com/2014/12/Rbacktest6mins.html

在命令列執行以下指令:
> library(quantmod)
> getSymbols("AAPL")
> AAPL

說明:
1. "library(quantmod)" 是將 quantmod套件 引進函式庫。
2. "getSymbols("AAPL")" 是擷取 Yahoo Finance 裡蘋果 ( AAPL ) 股價的歷史資料。
3. 將資料擷取回來以後,再輸入 "AAPL",可得到 蘋果股價資料,包含每天開盤價 ( AAPL.Open )、最高價 ( AAPL.High )、最低價 ( AAPL.Low )、收盤價 ( AAPL.Close )、成交量 ( AAPL.Volume )、還原權值 ( AAPL.Adjusted ) 。

在命令列執行以下指令:
> chartSeries(AAPL)

說明:
使用 quantmod套件 的繪圖功能,繪製出股價走勢圖。


R 語言已內建 IBM Watson 人工智慧:https://read01.com/nj6y2N.html

MySQL

MySQL 在過去由於高效能、低成本、可靠,已經成為最流行的開源資料庫,因此被廣泛地應用在 Internet 上的中小型網站中。非常流行的開源軟體組合 LAMP 中的「M」指的就是 MySQL。

MariaDB 資料庫管理系統是 MySQL 的一個分支,主要由開源社群在維護,採用 GPL 授權許可。開發這個分支的原因是因為甲骨文公司收購了 MySQL 後,有將 MySQL 閉源的潛在風險,因此社群採用分支的方式來避開這個風險。MariaDB 的目的是完全相容 MySQL,包括 API 和命令列,使之能輕鬆成為 MySQL 的代替品。

MariaDB 和 MySQL 全面对比:
https://www.infoq.cn/article/mariadb-vs-mysql

MariaDB 的文档中列出了 MySQL 和 MariaDB 之间的数百个不兼容问题。因此,我们无法通过简单的方案在这两个数据库之间进行迁移。

大多数数据库管理员都希望 MariaDB 只是作为 MySQL 的一个 branch,这样就可以轻松地在两者之间进行迁移。但从最新发布的几个版本来看,这种想法是不现实的。MariaDB 实际上是 MySQL 的一个 fork,这意味着在它们之间进行迁移需要考虑很多东西。

大多数 MariaDB 版本允许你从 MySQL 复制数据,这意味着你可以轻松地将 MySQL 迁移到 MariaDB。但反过来却没有那么容易,因为大多数 MySQL 版本都不允许从 MariaDB 复制数据。

此外,值得注意的是,MySQL GTID 不同于 MariaDB GTID,所以将数据从 MySQL 复制到 MariaDB 后,GTID 数据将相应地做出调整。

GTID 原理介绍
https://blog.51cto.com/sumongodb/2090307

GTID又叫全局事务ID(Global Transaction ID),是一个已提交事务的编号,并且是一个全局唯一的编号。MySQL5.6版本之后在主从复制类型上新增了GTID复制。

GTID是由server_uuid和事务id组成的,即GTID = server_uuid:transaction_id。 server_uuid是在数据库启动过程中自动生成的,每台机器的server-uuid不一样。uuid存放在数据目录的auto.cnf文件下。而transaction_id就是事务提交时由系统顺序分配的一个不会重复的序列号。

(1)GTID使用master_auto_position=1代替了基于binlog和position号的主从复制搭建方式,更便于主从复制的搭建。

(2)GTID可以知道事务在最开始是在哪个实例上提交的。

(3)GTID方便实现主从之间的failover,再也不用不断地去找position和binlog 了。




MySQL 儲存引擎

MySQL 8 以後,加強了 InnoDB ,不再需要 MyISAM 這種儲存引擎。

InnoDB 這種儲存引擎所提供的功能如同商用資料庫軟體,像是交易 (transaction)、紀錄鎖定 (row-level locking) 與自動回復 (auto-recovery)。

而 MEMORY 這一個儲存引擎,雖然它把資料儲存在紀憶體中,所以運作效率是 MySQL 中最快的,但當人們之所以會考慮到快取功能,不僅僅是為了快,往往也為了減輕 MySQL 負擔,MEMORY 引擎仍然無法避免調用時需要驗證 MySQL 權限;因此,當需要使用快取方案時,直接使用 Redis 等方案更恰當。
而需要 SQL 聯表查詢這個優點時,MySQL 統一使用 InnoDB 即可。



http://www.qttc.net/201208175.html

MySQL默認操作模式是 autocommit 模式。這就表示除非顯式地開始一個事務,否則每個查詢都被當做一個單獨的事務自動執行。我們可以通過設置 autocommit 的值改變是否是autocommit 模式。

通過以下命令可以查看當前 autocommit 模式

show variables like 'autocommit';

從查詢結果中,我們發現Value的值是ON,表示 autocommit 開啟。我們可以通過以下SQL語句改變這個模式:

set autocommit = 0;

值0和OFF都是一樣的,當然,1也就表示ON。通過以上設置 autocommit=0,則用戶將一直處於某個事務中,直到執行一條 commit 提交 或 rollback語句才會結束當前事務重新開始一個新的事務。

舉個例子:

張三給李四轉賬500元。那麼在數據庫中應該是以下操作:

1,先查詢張三的賬戶餘額是否足夠

2,張三的賬戶上減去500元

3,李四的賬戶上加上500元

以上三個步驟就可以放在一個事務中執行提交,要么全部執行要么全部不執行,如果一切都OK就commit提交永久性更改數據;如果出錯則rollback回滾到更改前的狀態。利用事務處理就不會出現張三的錢少了李四的賬戶卻沒有增加500元或者張三的錢沒有減去李四的賬戶卻加了500元。

MyISAM 存儲引擎不支持事務處理,所以改變 autocommit 沒有什麼作用,但不會報錯,所以要使用事務處理一定要確定 存儲引擎 是支持事務處理的,如 InnoDB。



● 如何啟動服務、停止服務、更改密碼、登入 MySQL

$ sudo service mysqld status
$ sudo service mysqld stop
$ sudo service mysqld start
$ sudo service mysqld restart
$ sudo mysqladmin -u root -p password (更改密碼)
$ mysql -u root -p (登入)
$ mysql -h 123.123.123.123 -u root -p



从mysql 8.0开始,mysql默认的CHARSET已经不再是Latin1了,改为了utf8mb4(参考链接),并且默认的COLLATE也改为了utf8mb4_0900_ai_ci。

utf8mb4_0900_ai_ci大体上就是unicode的进一步细分,0900指代unicode比较算法的编号( Unicode Collation Algorithm version),ai表示accent insensitive(发音无关),例如e, è, é, ê 和 ë是一视同仁的。

https://bschen.tw/posts/mysql-utf8mb4/ https://juejin.im/post/5bfe5cc36fb9a04a082161c2

https://juejin.im/post/5bfe5cc36fb9a04a082161c2

CREATE TABLE (

……

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

优先级顺序是 SQL语句 > 列级别设置 > 表级别设置 > 库级别设置 > 实例级别设置。

https://bschen.tw/posts/mysql-utf8mb4/

由於 MySQL 8.0 預設的 collation 是 utf8mb4_0900_ai_ci 而不是我們原先以為「最精準」的 utf8mb4_unicode_ci,查了一下,發現:

0900 代表 Unicode Collation Algorithm (UCA) 的 9.0.0 版本,包含在 2016 年發佈的 Unicode 9.0.0 之中3。目前最新的版本是 11.0.04
ai 代表 accent insensitivity,即同一字母的不同標音不影響排序
ci 就是 case insensitivity 了,同一字母的大小寫不影響排序

所以,不管是從其他方面,或是我們所認為的「精準」來說,utf8mb4_0900_ai_ci (UCA 9.0.0) 都比 utf8mb4_unicode_ci (UCA 4.0.0) 要來得好。甚至是在 MySQL 5.7.7 裡,也都有 utf8mb4_unicode_520_ci (UCA 5.2.0) 這個更好的選擇

結論就是,在 MySQL 中,設定 UTF-8 編碼的最佳組合是:

5.5.3+: charset=utf8mb4, collation=utf8mb4_unicode_ci
5.7.7+: charset=utf8mb4, collation=utf8mb4_unicode_520_ci
8.0.0+: charset=utf8mb4, collation=utf8mb4_0900_ai_ci

順便一提,utf8mb4 這個 charset 是在 MySQL 5.5.3 加入的。在此之前,只有 utf8(5.5.3 之後等義於 utf8mb3)可用


● 如何將 MySQL 調整成全 UTF-8 語系

mysql使用utf8mb4经验吐血总结
http://seanlook.com/2016/10/23/mysql-utf8mb4/

 C/C++ 内存空间分配问题

这是我们这边的开发遇到的一个棘手的问题。C或C++连接MySQL使用的是linux系统上的 libmysqlclient 动态库,程序获取到数据之后根据自定义的一个网络协议,按照mysql字段定义的固定字节数来传输数据。从utf8转utf8mb4之后,c++里面针对character单字符内存空间分配,从3个增加到4个,引起异常。

这个问题其实是想说明,使用utf8mb4之后,官方建议尽量用 varchar 代替 char,这样可以减少固定存储空间浪费(关于char与varchar的选择,可参考 这里)。但开发设计表时 varchar 的大小不能随意加大,它虽然是变长的,但客户端在定义变量来获取数据时,是以定义的为准,而非实际长度。按需分配,避免程序使用过多的内存。

MySQL字符数据类型char与varchar的区别
http://seanlook.com/2016/04/28/mysql-char-varchar-set/

varchar善于存储值的长短不一的列,也是用的最多的一种类型,节省磁盘空间。update时varchar列时,如果新数据比原数据大,数据库需要重新开辟空间,这一点会有性能略有损耗,但innodb引擎下查询效率比char高一点。这也是innodb官方推荐的类型。

如果存储时真实长度超过了char或者varchar定义的最大长度呢?

在SQL严格模式下,无论char还是varchar,如果尾部要被截断的是非空格,会提示错误,即插入失败
在SQL非严格模式下,无论char还是varchar,如果尾部要被截断的是非空格,会提示warning,但可以成功
如果尾部要被截断的是空格,无论SQL所处模式,varchar都可以插入成功但提示warning;char也可以插入成功,并且无任何提示
这里特意提到SQL的严格模式,是因为在工作中也遇到过一些坑,参考MySQL的sql_mode严格模式注意点。


[ec2-user ~]$ sudo mysql -u root -p

Enter password:(打上 mysql 的密碼)

Welcome to the MySQL monitor. ...

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> \s

--------------

Connection id:
Current database:
Current user:
SSL:
Current pager:
Using outfile:
Using delimiter:
Server version:
Protocol version:
Connection:
(重點在底下幾行,預設為 Latin1,但是調整好以後就會變成如下的 utf8:)
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock

--------------

由上可知,要將 MySQL 調整成全 UTF8 有幾項參數需要調整。如果上述四項是 Latin1 (為何預設為 Latin1?因為 MySQL 是瑞典人開發的,他們使用的語系為 Latin1,所以 MySQL 預設語系就是 Latin1),該如何調整成 utf8?必須進入 MySQL 的設定檔作修正。

步驟一:修改 MySQL 設定檔。

[ec2-user ~]$ sudo vim /etc/my.cnf

步驟二:將底下內容增加到設定檔內,寫在內容的最後即可。

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8


步驟三:重啟 MySQL。
[ec2-user ~]$ sudo service mysqld restart


這時 MySQL 已全部修改成 utf8 了,但日後開發比如說 php 程式時,必須在連結 MySQL 時加入以下幾行程式碼,保證程式中用 utf8 傳送:

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET_CLIENT='utf8'");
mysql_query("SET CHARACTER_SET_RESULTS='utf8'");

mysql_connect, mysql_query 等方法在 PHP 5.5.0 以後已經停用,取而代之的是 MySQLi 或 PDO_MySQL 等方法。


日後製作新的資料庫時,可以利用以下的 MySQL 指令,設定以及確認資料庫的預設文字碼,例如 "MyDB" 的資料庫的預設文字碼設定為「UTF-8」:

mysql> create database MyDB default character set utf8;
mysql> show create database MyDB;


觀念 ( Character Set 與 Collation ):http://www.codedata.com.tw/database/mysql-tutorial-7-charset-database/


utf8_general_ci  (Unicode) (多語言) (大小寫不相符) (轉換時速度比較快)
utf8_unicode_ci  (Unicode) (多語言) (大小寫不相符) (轉換時比較精準)

何謂轉換?簡單說就是當資料要從一個編碼換成另外一個編碼時,
MySQL 需要在兩個 codepage 裡面找出相對應的字元位置在哪裡。

對 utf8_general_ci 來說,來源 codepage 裡面的一個字元只能對應到目標 codepage 裡面的一個字元,
而 utf8_unicode_ci 則可以把來源 codepage 裡的一個字元對應到目標 codepage 裡的多個字元(或反過來)。

例如德文裡的 ß 要轉換成英文的時候如果是用 utf8_unicode_ci 轉換會變成正確的 ss ,
但是如果用 utf8_general_ci 的話則會變成單一的 s 而已。
所以如果設成 utf8_unicode_ci 就不需要擔心資料會在轉換間遺失了。




utf8mb4 vs utf8

utf8 跟 utf8mb4 具有相同的儲存特性:相同的代碼值,相同的編碼,相同的長度。不過 utf8mb4 擴展到一個字符最多可有 4 位元,所以能支持更多的位元集。 utf8mb4 兼容 utf8,且比 utf8 能表示更多的字串,將編碼改為 utf8mb4 不需要做其他轉換。

為了要跟國際接軌,原本的 utf8 編碼在儲存某些國家的文字 (或是罕見字) 已經不敷使用,
因此在 MySQL 5.5.3 版以上,可以使用 4-Byte UTF-8 Unicode 的編碼方式。

MySQL 支持的 utf8 編碼最大長度為 3 位元 (Unicode 字符是0xffff) 稱之為 Unicode 的基本多文本平面 (BMP),但如果遇到 4 位元的寬字串就會插入異常,也就是任何不在基本多文本平面的 Unicode 字串都無法使用 Mysql 的 utf8 字串集儲存。

如果要開發討論區或是大型跨國網頁程式,為了擁有更佳的文字兼容性,就可以考慮使用 utf8mb4。

然而,在 CHAR 類型數據,utf8mb4 會比 utf8 多消耗一些空間,故 MySQL 官方指出,使用 VARCHAR 替代 CHAR。



● 如何創建新資料庫、賦予使用者權限

mysql> CREATE DATABASE 資料庫名稱;
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON 資料庫名稱.* TO 使用者 IDENTIFIED BY '使用者密碼';



● 如何備份與復原資料庫

匯出 $ mysqldump -u root -p密碼 資料庫名稱 > /home/ec2-user/sqlbackup/資料庫名稱.sql
壓縮 $ bzip2 /home/ec2-user/sqlbackup/資料庫名稱.sql

只匯出 table
mysqldump -u... -p... mydb t1 t2 t3 > mydb_tables.sql


解壓縮 $ bzip2 -d /home/ec2-user/sqlbackup/名稱.sql.bz2
匯入 $ mysql -u root -p密碼 資料庫名稱 < /home/ec2-user/sqlbackup/名稱.sql

不同版本的 匯入有時候會發生一些狀況,視情況可以用 -f “force” 來忽略導入過程中的錯誤。
$ mysql -u root -p密碼 -f 資料庫名稱 < /home/ec2-user/sqlbackup/資料庫名稱.sql

在 MYSQL 5.6.6 之後,使用上述指令會出現
Warning: Using a password on the command line interface can be insecure.

在 MySQL 5.6.6 之後加入了 mysql_config_editor 這個工具,這個工具將登入資訊存入 /root/.mylogin.cnf,而 .mylogin.cnf 是被加密的。

這裡有一個坑:密碼內不可以有『#』符號,這是一個已知的 bug
https://stackoverflow.com/questions/19372095/mysql-config-editor-login-path-local-not-working

如果真的遇到了,打算要改密碼,在 MySQL 8 以後禁用了許多種改密碼的方法,可以使用

ALTER USER'root'@'localhost'IDENTIFIED BY'新密碼';

https://stackoverflow.com/questions/50691977/how-to-reset-the-root-password-in-mysql-8-0-11



mysql_config_editor 使用方式:
$ mysql_config_editor set --login-path=dbname --host=127.0.0.1 --user=root --password
$ mysql_config_editor print --all
$ mysql --login-path=dbname
更詳細的說明可參考:https://shazi.info/mysql-執行-bash-script-出現-warning-using-a-password-on-the-command-line-interface-can-be-insecure/

所以上述語法配合 mysql_config_editor 這個工具做修正後如下:
$ mysql --login-path=資料庫名稱 資料庫名稱 < /home/ec2-user/sqlbackup/資料庫名稱.sql


如果 MySQL Server 不止一個資料庫,希望可以一次就將所有資料庫備份起來,可以寫一個簡單的 shell script 來執行,又或者使用以下指令:

mysqldump -u root -p密碼 --all-databases > mysql.sql

這個 –all-databases 代表所有資料庫,這樣子 mysqldump 便會將所有資料庫備份到 mysql.sql。


mysqldump 另外加上 --default-character-set=utf8mb4 ,可避免罕見字匯出錯誤。


使用 mysqldump + shell script + rsync + cron 等等可以達到自動備份與異地備份的功能,但備份的時間差依然會有資料損失的風險。

進一步參考文獻:
排程自動備份與異地備份
http://klearmay.pixnet.net/blog/post/22868088
https://www.phpini.com/mysql/mysql-backup-shell-script
http://eugg.blogspot.tw/2013/05/how-to-crontab-mysql-aws-s3.html

鳥哥的 Linux 私房菜:Linux 備份策略
http://linux.vbird.org/linux_basic/0580backup.php

以 rsync 進行同步鏡像備份
http://linux.vbird.org/linux_server/0310telnetssh.php#rsync



備註:

MySQL 原本是一個開放原始碼的關聯式資料庫管理系統,原開發者為瑞典的 MySQL AB 公司,該公司於2008年被昇陽微系統(Sun Microsystems)收購。2009年,甲骨文公司(Oracle)收購昇陽微系統公司,MySQL 成為 Oracle 旗下產品。

隨著 MySQL 的不斷成熟,它也逐漸用於更多大規模網站和應用,比如維基百科、Google 和 Facebook 等網站。

但被甲骨文公司收購後,Oracle 大幅調漲 MySQL 商業版的售價,且甲骨文公司不再支援另一個自由軟體專案 OpenSolaris 的發展,因此導致自由軟體社群對於 Oracle 是否還會持續支援 MySQL 社群版(MySQL 之中唯一的免費版本)有所擔憂,因此原先一些使用 MySQL 的開源軟體逐漸轉向其它的資料庫。例如 MySQL 的創始人麥克爾·維德紐斯以 MySQL 為基礎,成立分支計劃 MariaDB。維基百科已於 2013 年正式宣布將從 MySQL 遷移到 MariaDB 資料庫。

維基百科:https://en.wikipedia.org/wiki/MySQL

SQL 語法的運用透過閱讀書本範例、實際開發實作、上網搜尋等等,熟能生巧。
SQL 語法教學:http://www.1keydata.com/tw/sql/sql.html

MySQL show 的 整理:http://database.51cto.com/art/201005/202213.htm
更多操作 MySQL 常用指令上網搜尋即可輕鬆找到當下需要用到的指令了。



資料庫的長連接與短連接:http://www.cnblogs.com/endige/archive/2012/04/11/2442534.html

長連接主要用於在少數客戶端與服務端的頻繁通信,因為這時候如果用短連接頻繁通信常會發生 Socket 出錯,並且頻繁創建 Socket 連接也是對資源的浪費。

但是對於服務端來說,長連接也會耗費一定的資源,需要專門的線程來負責維護連接狀態。

總之,長連接和短連接的選擇要視情況而定。



各版本的重要異動:

varchar 類型在 5.0.3 以下的版本中的最大長度限制為 255,而在 5.0.3 及以上的版本中,varchar 類型的長度支持達到 65535。

也就是說,在 5.0.3 以下版本中需要使用固定的 TEXT 或 BLOB 格式存放的數據可以在高版本中使用可變長的 varchar 來存放,這樣就能有效的減少資料庫文件的大小。

text 與 char 和 varchar 不同的是,text不可以有默認值,其最大長度是2的16次方-1

1. 經常變化的欄位用 varchar
2. 知道固定長度的用 char
3. 儘量用 varchar
4. 超過 255 字符的只能用 varchar 或者 text
5. 能用 varchar 的地方不用 text

在 CHAR 類型數據,utf8mb4 會比 utf8 多消耗一些空間,故 MySQL 官方指出,使用 utf8mb4 的模式下,用 VARCHAR 替代 CHAR。




愛因斯坦的冰箱為廿一世紀綠色能源發展所帶來的啟發

愛因斯坦和他的學生列奧·西拉德在1926年共同發明了一種吸收式製冷系統,既不用電,也沒有活動部件,後來被稱為愛因斯坦-西拉德冰箱。

愛因斯坦他們在很多國家申請到專利。一家瑞典製冷設備公司伊萊克斯為了防止這種新技術帶來的競爭,買斷了他們的專利。

德國的AEG也和他們簽約,並且發展出愛因斯坦-西拉德電磁汞與愛因斯坦冰箱原型,但由於不具毒性的製冷劑氟利昂於1930年代開始大量生產,發展愛因斯坦冰箱的需要不再成立。愛因斯坦-西拉德電磁汞後來被用在核子增殖反應爐的製冷系統。

當愛因斯坦與西拉德見面時,愛因斯坦由於相對論的研究已舉世聞名,而西拉德才剛在起步階段,是柏林大學的研究生助理。據說,他們倆人合作研發冰箱的動力是因1926年報載,柏林有一家人在睡眠時,由於冰箱密封處壞損,有毒氣體外漏滿溢屋子,導致全家死亡的悲劇。當時這樣的外漏現象發生頻率驚人,因為越來越多人以新式的,使用如氯甲烷、氨、二氧化硫等有毒氣體當作冷媒的機械冰箱,來取代傳統的冰桶。

此悲劇讓愛因斯坦感觸很深,他告訴西拉德說,一定有比使用機械壓縮機和有毒氣體的新式冰箱更好的設計。他們於是開始去尋找新方法,後來專心研究吸收性冰箱,即利用熱源來驅動吸收過程,經由化學溶液釋放出冷卻劑,當時常用的熱源是天然氣焰。相同的技術於1922年便已由瑞士的發明家採用,而西拉德則利用他在熱力學的專業知識找出了改良的方法,所使用的熱源是經由三組互聯電路以驅動氣體和液體的混合體。

雖然愛因斯坦和西拉德在6個國家申請了超過45個專利,卻沒有任何一個冰箱設計曾經商品化,只有拿到幾個許可,一方面適逢經濟大蕭條重挫了許多有潛力的製造商,另一方面最主要仍是因為在1930年代採用新的無毒氟氯烷冷媒後,愛因斯坦-西拉德冰箱的發展才整個宣告結束。

近年來人們由於對氣候變遷的關切,開始對他們的設計重燃起興趣。2008年,牛津大學的研究團隊在發展更適用裝置計劃中建造了他們設計的一個原型;喬治亞理工學院一位前研究生德蘭諾(Andy Delano)也建造了愛因斯坦和西拉德其中一種設計的原型;還有在劍橋的研究團隊也正試驗經由磁場來冷卻的方法。

Malcolm McCulloch,牛津大學一位電機工程師,其團隊打造了愛因斯坦-西拉德冰箱原型。

簡單來說,當週遭的氣壓變低時,液體在低溫下就會沸騰。比如說如果爬上聖母峰,水沸騰的溫度就會比在海平面時低了許多,這是因為大氣壓力變低。在這款冰箱原型中,科學家將長頸瓶裝滿液態丁烷,接著引入一道新蒸汽來減少氣壓,那能使液體沸騰溫度降低,導致丁烷沸騰。當丁烷沸騰時,它會從周圍吸取能量,並使冰箱內部降溫。

這款冰箱只需要用一種方式加熱液體,而 McCulloch 正在開發一款太陽能系統,以符合這項需求,所以這款冰箱不需要插電。

這種冰箱沒有可活動的部件可能也會是個優勢,它堅固耐用,只需要最少量的維護,因此特別適合農村地區。

舉一反三,我們應當可以聯想到更多發明,
比如說除了減壓降低沸點外,位在佛羅里達的 Matteran Energy 研發出如何不使用昂貴的太陽能電池來直接將太陽輻射轉換成電流,Matteran 的解決方案改為使用便宜很多的熱量收集技術來將一種合成的液體加熱,該液體具有很低的沸點(14.4℃),建立足夠的蒸汽來驅動一個特製的渦輪機。雖然液態循環系統將熱轉換成電並非新技術,Matteran 的創新解決方案卻能增加該系統的效能,讓小規模應用更具經濟效益。

又比如說瑞典「Climate Well」公司研發成功高效能太陽能冷氣機,無需冷媒,也不會排放二氧化碳。其儲熱原理是把水和鹽封在真空儲存槽,利用水在固態、液態、氣態間轉換,使熱能做有效利用。在產生冷氣的同時,並可供應熱水。該公司因為這項產品獲「世界經濟論壇」評選為2007年科技先鋒企業。



維基百科:https://en.wikipedia.org/wiki/Albert_Einstein
物理雙月刊:http://psroc.org.tw/Bimonth/article_detail_acc.php?classify=2&cid=172

Java



!! FTC指出,甲骨文早在2011年的內部文件中便顯示其知悉「Java產品更新機制不夠積極或根本無效」,導致大量針對舊版Java SE的攻擊發生。

Java威脅主要來自惡意網站的惡意Java程式。如果你是因為應用程式需要而安裝Java,那你可以在瀏覽器禁用Java而不會受到影響。

過去你如果需要這樣做的話,需要一個一個瀏覽器分別設定,但現在不同了。目前的Java版本可以透過Java控制面板來做到這一點。可以在這裡找到如何進行的說明。網頁上的Java程式將無法執行,但Java應用程式可以繼續使用,沒有問題。

基於這個問題,使用者必須考慮自己是否真的需要Java。如果不的話,就應該將其移除。對於無法避免使用Java的使用者而言,還有其他的方法來降低風險:
https://blog.trendmicro.com.tw/?p=3910

Java 是一種廣泛使用的電腦程式設計語言,擁有跨平台、物件導向、泛型程式設計的特性,廣泛應用於企業級 Web 應用開發和行動應用開發。

泛型程式設計是程式設計語言的一種風格或範式。泛型允許程式設計師在強型別程式設計語言中編寫代碼時使用一些以後才指定的類型。
(Generic programming is a style of computer programming in which algorithms are written in terms of types to-be-specified-later that are then instantiated when needed for specific types provided as parameters.)
(通用編程是一種計算機編程的風格,其中根據要指定的類型編寫算法,然後在需要時為特定類型提供參數進行實例化。)

各種程式設計語言和其編譯器、執行環境對泛型的支援均不一樣。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Visual Basic .NET 稱之為泛型(generics);ML、Scala 和 Haskell 稱之為參數多型(parametric polymorphism);C++ 和 D 稱之為模板。具有廣泛影響的1994年版的《Design Patterns》一書稱之為參數化類型(parameterized type)。

泛型的定義主要有以下兩種:
 1. 在程式編碼中一些包含類型參數的類型,也就是說泛型的參數只可以代表類别,不能代表個別物件。(這是當今較常見的定義)
 2. 在程式編碼中一些包含參數的類別。其參數可以代表類別或物件等等。(現在人們大多把這稱作模板)
不論使用那個定義,泛型的參數在真正使用泛型時都必須作出指明。

在電腦科學以及程式設計中,經常把程式語言的型別系統分為強型別(英語:strongly typed)和弱型別(英語:weakly typed (loosely typed))兩種。這兩個術語並沒有非常明確的定義,但主要用以描述程式語言對於混入不同資料型別的值進行運算時的處理方式。強型別的語言遇到函式引數型別和實際叫用型別不符合的情況經常會直接出錯或者編譯失敗;而弱型別的語言常常會實行隱式轉換,或者產生難以意料的結果。這對術語在短短的電腦歷史中,早已含括了更多的意義,而且時常很難知道寫的人究竟要表達哪個意思。

程式語言專家 Benjamin C. Pierce,《Types and Programming Languages》和《Advanced Topics in Types and Programming Languages》的作者,曾說:
「我花了幾個星期…試著弄清楚「強型別」、「靜態型別」、「安全」等術語,但我發現這異常的困難…這些術語的用法不盡相同,所以也就近乎無用。」

Java 程式語言的風格十分接近 C++ 語言。繼承了 C++ 語言物件導向技術的核心,Java 捨棄了 C++ 語言中容易引起錯誤的指標,改以參照取代,同時移除原 C++ 與原來運算子多載,也移除多重繼承特性,改用介面取代,增加垃圾回收器功能。在 Java SE 1.5 版本中引入了泛型程式設計、類型安全的列舉、不定長參數和自動裝/拆箱特性。昇陽電腦對 Java語言 的解釋是:「Java 程式語言是個簡單、物件導向、分散式、解釋性、健壯、安全與系統無關、可移植、高效能、多執行緒和動態的語言。」

Java 不同於一般的編譯語言或直譯語言。它首先將原始碼編譯成 Bytecode,然後依賴各種不同平台上的虛擬機器來解釋執行 Bytecode,從而實現了「一次編寫,到處執行」的跨平台特性。在早期 JVM 中,這在一定程度上降低了 Java 程式的執行效率。但在 J2SE1.4.2 釋出後,Java 的執行速度有了大幅提升。

目前在全球資訊網的伺服器端和手持裝置上,Java相當流行,很多網站在後端使用 JSP 和其他 Java 技術,Android 大部分的程式碼採用 Java 語言編程。

為什麼大型網站前端使用 PHP,後台邏輯用 Java:https://read01.com/Le66BM.html

Java 的體系分為 Java SE、Java EE 和 Java ME(JDK 5.0以前分別稱為 J2SE、J2EE 和 J2ME),Java 的敲門磚是 Java SE,也就是入門學習的內容,不論日後是選擇哪個體系領域作為發展方向,都得從 Java SE 起步。

Java 入門指引:https://read01.com/e5OEyP.html


編寫Java程式應注意以下幾點:

● 大小寫敏感:Java 是大小寫敏感的,這就意味著識別元 Hello 與 hello 是不同的。
● 類名:對於所有的類來說,類名的首字母應該大寫。如果類名由若干單詞組成,那麼每個單詞的首字母應該大寫,例如 MyFirstJavaClass。
● 方法名:所有的方法名都應該以小寫字母開頭。如果方法名含有若干單詞,則後面的每個單詞首字母大寫,例如 myFirstJavaMethod。
● 原始檔名:原始檔名必須和類名相同。當儲存檔案的時候,你應該使用類名作為檔案名儲存(切記 Java 是大小寫敏感的),檔案名的字尾為 .java。(如果檔案名和類名不相同則會導致編譯錯誤)。
● 主方法入口:所有的 Java 程式由 public static void main(String[] args)方法開始執行。


Java 的設計目的主要是安全性和可攜性,所以對於一些特性,比如對硬體架構和記憶體位址存取的直接存取都被去除了。如果需要間接調用這些底層功能的話,就需要使用 JNI(Java本地介面)來調用本地程式,而間接存取意味著頻繁調用這些特性時效能損失會很大,微軟的 .NET 平臺也有這樣的問題。

重視效能的程式,例如驅動程式和 3D遊戲,常使用本地編譯 (在當前平台編譯,編譯得到的程式也是在本地執行),甚至直接以不直接支援物件導向的 C語言 或 機器碼 編寫。但也有用純 Java 編寫的 3D遊戲,其效果與用 C語言 編寫的不相上下,例如「合金戰士」(英文名:Chrome)。這主要是因為新版的 Java 3D 技術已經能像 C++ 一樣調用硬體加速,也就是使用顯卡來加速,無論是 C++ 還是 Java語言 寫的 3D遊戲 都是使用顯卡及 GPU 來處理,從而使得 CPU 可以專注於其他方面的工作。

由於 Java 編譯器和虛擬機的不同對 Java 程式碼的性能影響比語言本身的影響大的多,所以討論 Java 程式的性能經常是有誤導性的。據 IBM 的數據,在同樣的硬體上,2001年時的 IBM JDK 版本的性能是 1996年的 JDK 版本的十倍左右。參見 IBM 東京研究院的數據: http://www.is.titech.ac.jp/ppl2004/proceedings/ishizaki_slides.pdf ,即使是在同一時期,不同公司的 JDK 和 JRE 的性能也不一樣,比如 SUN、IBM、BEA 等公司過去都有開發自家的 JDK 和JRE。


維基百科:https://en.wikipedia.org/wiki/Java_(programming_language)

線上教學:http://www.kaiching.org/2014/11/java-guide.html

正規表示法 ( Regular Expression )

正規表示式,又稱正則表達式、正規表示法、正規運算式、規則運算式、常規表示法等等(英語:Regular Expression,在代碼中常簡寫為 regex、regexp 或 RE),是電腦科學的一個概念。正規表示式使用單個字串來描述、符合某個句法規則的一系列字串。

許多程式設計語言都支援利用正則運算式進行字串操作。正則運算式這個概念最初是由 Unix 中的工具軟體(例如 sed 和 grep)普及開的。正規表示式通常縮寫成「regex」,單數有 regexp、regex,複數有 regexps、regexes、regexen。

基本語法 與 運算式全集 可以詳閱維基百科:http://en.wikipedia.org/wiki/Regular_expression
或是大家整理好的資料:
http://matthou666.blogspot.tw/2013/01/php_25.html
https://atedev.wordpress.com/2007/11/23/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F-regular-expression/
http://reader.roodo.com/linpapa/archives/8398099.html


常見應用上,以 PHP 製作表單資料後的格式驗證來舉例說明,PHP 使用正規表示法進行驗證時,若搭配 preg_match() 函式來使用,preg_match("/正規表示法的條件字串/","欲驗證的字串"):

<?php
$str = 'a1234';
if (preg_match("/^[a-zA-Z0-9]{4,16}$/", $str)) {
    echo "驗證成功";
} else {
    echo "驗證失敗";
}
?>

驗證字串是否只含數字與英文,且字串長度在 4~16 個字元之間。

^[a-zA-Z0-9]{4,16}$ 就是 正規表示法的條件字串:
^ 符合輸入字串的開始位置
$ 符合輸入字串的結束位置
{4,16} 比對至少 4 次,至多 16 次

在 PHP 應用中,preg_match() 與 preg_replace() 這兩個函數都是常常被使用到的。
這邊有一篇文章深入淺出地講解了『如何在 PHP 中使用正規表示式』,文章內容包含了 PHP 所支持的兩種正規表示式的實現:POSIX 和 PCRE,與其相關的函數說明:http://inspiregate.com/programming/php/377-how-to-use-php-regular-expression.html


在使用 Linux 作業系統方面,為了主機管理的便利性,使用者至少要能看的懂正規表示法的意義:http://linux.vbird.org/linux_basic/0330regularex.php

C 語言



C 語言 是 1972 年由 Dennis Ritchie 在貝爾實驗室,為了精善開發 UNIX 作業系統,改良當時的程式語言 B ,而發展出的程式語言。如今,許多新的程式語言也都直接或間接地受到 C 語言的影響,例如直接由 C 語言 衍生出的有 C++ 、 Objective-C 、 Java 、 C# 等。

伴隨 The C Programming Language 的發表以及 C 程式的高度可移植性, C 語言 受到廣大的歡迎。由於 C 語言 廣泛使用在各種機器上,各式各樣的編譯器也越來越多,美國國家標準局 (ANSI) 為了避免各家編譯器對 C 語言 的差異,組成一個專責規範 C 語言 標準的委員會,並於 1989 年先通過 C89 ,隨著電腦科技的發展以及各方對 C 語言 的需求與建議, 1999 年又通過了 C99 。因此以一個標準規格寫出的 C 語言 程式不論使用哪家編譯器皆能編譯。但是不同的編譯器之間仍然是存在著編譯演算法優劣的差異,導致其最終結果程式碼執行效率產生差別。

C 語言 設計目標是提供一種能以簡易的方式編譯、處理低階記憶體、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。C 語言 也很適合搭配 組合語言 來使用。儘管 C 語言 提供許多低階處理的功能,但仍保持良好跨平台的特性,以一個標準規格寫出的 C 語言 程式可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(微控制器或稱 MCU)以及超級電腦等作業平台。

組合語言(英語:assembly language)是一種用於電腦、微處理器、微控制器,或其他可編程器件的低階語言。在不同的裝置中,組合語言 對應著不同的 機器語言指令集。一種 組合語言 專用於某種電腦系統結構,而不像許多高階語言,可以在不同系統平台之間移植。
使用 組合語言 編寫的原始碼,然後通過相應的組譯程式將它們轉換成可執行的機器碼。這一過程被稱為組譯過程。


C 語言 與 組合語言 的比較:

組合語言是一種表示機器指令的符號語言,是最接近機器碼的一種語言。其主要優點是佔用資源少、程序執行效率可能相對於 C語言 高 (執行效率一說見人見智)。

C語言 是一種結構化的中高階語言。其優點是可讀性相對較低階語言來得高,移植容易,是普遍使用的一種計算機語言。缺點是佔用資源比組合語言多,執行效率可能沒有 組合語言高 (執行效率一說見人見智)。

通常人們會認為低階語言的速度快,但可攜性低;
而中高階語言速度雖然比低階語言慢,但可攜性高。
以市面上的『單晶片』為例,
每種不同廠牌的單晶片都有屬於自己的 組合語言,並且大多不能共用,
但是若使用 C 語言 來開發,則大部分的程式碼幾乎都可以共用。

C 語言 在編譯的過程中會經過組語階段,也就是說 C 語法會先被轉譯成組語語法,再被轉成機器語言;而 組合語言 則是直接轉成 機器語言。
人們使用 C 語言 再透過編譯器轉換出來的組合語言,與人們直接使用 組合語言,其差異為何其實還能進一步思考,其中差異涉及了不同版本 C 語言編譯器的演算法差異、人們編寫組合語言所使用的演算法差異、人們對於機器語言指令集的熟悉程度等等。


組合語言 使用 助憶碼(Mnemonics)來代替和表示特定低階機器語言的操作。特定的組譯目標指令集可能會包括特定的運算元。許多組譯程式可以識別代表位址和常量的標籤(Label)和符號(Symbols),這樣就可以用字元來代表運算元而無需採取寫死的方式。普遍地說,每一種特定的組合語言和其特定的機器語言指令集是一一對應的。

許多組譯程式為程式開發、組譯控制、輔助偵錯提供了額外的支援機制。有的 組合語言 編寫工具經常會提供巨集,它們也被稱為巨組譯器。

組合語言目前通常被應用在底層硬體操作和高度要求程式優化的場合。驅動程式、嵌入式操作系統和實時運行程式都會需要組合語言。


維基百科的 C 語言 條目:https://en.wikipedia.org/wiki/C_(programming_language)
維基百科的 組合語言 條目:https://en.wikipedia.org/wiki/Assembly_language


C 語言 的線上教學:http://www.kaiching.org/2012/10/c-tutorial.html


在 C 語言 當中內嵌組合語言:http://ccckmit.wikidot.com/as:inlinec


C 語言的指標觀念:http://edisonshih.pixnet.net/blog/post/27961535-01

Swift vs Objective-C

蘋果官方自己怎麼看待 Swift vs Objective-C

本文值得一讀,節錄一段如下:

實際上蘋果的團隊也很猶豫, 到底要繼續優化 Objective-C, 還是應該發明一門新的語言. 最後兩種方式都嘗試一下, 然後 Objective-C 就有了 ARC, 點語法等等新功能.

但最後, 蘋果的團隊發現 Objective-C 這門語言不安全最關鍵的原因還是因為它是基於 C 語言的, 它有指標, 它有不完全初始化的變數, 它會陣列越界. 即使蘋果的團隊對於工具鏈和編譯器有完整的控制權, 也沒辦法很好地解決這個問題.

蘋果的團隊想了又想, 反覆思慮之後, 還是決定打斷整個開發社群, 去建立一門 Safe的程式語言, 不只是那種沒有 bug的 Safe, 而是保持安全的同時還能提供高效能的, 推動整個程式設計正規化前進的那種 Safe.

Swift 與 Objective-C 並非是對立的, “Objective-C is Great”, Swift 只是蘋果提供的一個 “better option”.




https://www.itread01.com/content/1545532045.html

如果從工程角度

1. 生態環境比語言成熟慢:Swift非常適合思考,但是目前還不是工程化 ready 的語言,主要是上下游生態環境還不成熟,需要時間。

2. 路徑依賴效應:人的路徑依賴無解;未來使用 Swift 並獲得巨大市場成功的公司,不是今天這些市場上的巨無霸;就像諾基亞比蘋果更早理解觸屏的價值,但仍然只能眼睜睜看著蘋果後來居上;普朗克曾經說過一句關於科學真理的真理,敘述為「一個新的科學真理取得勝利並不是通過讓它的反對者們信服並看到真理的光明,而是通過這些反對者們最終死去,熟悉它的新一代成長起來。」對於技術來說也是如此。

如果從語言技術角度


oc java c# c++ swift python
值物件 有 沒有 沒有 有 有 有
指標(缺陷) 有 沒有 沒有 有 沒有 沒有
記憶體管理 引用計數 垃圾回收 垃圾回收 智慧指標(缺陷) 引用計數 垃圾回收
多返回值 沒有 沒有 沒有 沒有 有 有
指令碼語言特性 沒有 沒有 沒有 沒有 有 有
移動端支援 ios android 遊戲 遊戲 ios 較少(缺陷)


D 與 Rust 適合於那些長期使用 C++ 並且已經適應了要去掌握超多語法與概念的人,但是想要使用些更加清晰明瞭與安全的語言。這型別的開發者往往從事著類似於遊戲引擎、編譯器、加解密庫、HTML渲染引擎等等類似的工作。

Swift 呢,更多意義上是一門面向於應用程式設計的語言,它很容易上手,在某些方面它應該與 Go、Java、Python 以及 C# 相提並論。不過 Swift 會比這些更容易開始學習,它的helloworld 只需要一行程式碼就好了,並且它是支援函式的(不像 Java 那樣完全的 OO)。你不需要學習任何的類與物件的知識就可以開始撰寫簡易的 Swift 的程式碼。基於此,Swift 是更合適用作一種教學語言的,它還有像指令碼語言一樣的互動環境,也就是 REPL 以及 Xcode 本身提供的 PlayGround。

綜上所述,Swift 擁有著被廣泛使用以及當做第一學習語言的潛質。並且,Swift 並不是像 PHP 那樣的語法特性較少的語言,它擁有足夠的深度來滿足 Rust 或者 D 這樣的使用者的需求。與 Go 相比的話,Go 背靠 Google,也是個非常容易上手的語言,並且號稱自帶併發。Swift 在語法層次上會更加高階,並且 Swift 並沒有使用 GC 機制,因此可以與 C 更好地相容。也就是說,你可以用 Swift 編寫任何的庫來供任何語言使用,只要這些語言可以使用 C 的庫。這些特質保證了 Swift 擁有著比 Java、C#、Python、Ruby 以及 Go 更廣闊的適用範圍。後面這幾個傢伙,因為有 GC 的存在,不適合為其他語言提供基本庫。我也很喜歡 Go,但是毫無疑問,Swift 會是個更加嚴謹與安全的語言。型別檢測系統會幫助處理很多的錯誤,Go 目前是很合適於 Web 開發但是不適合科學計算與遊戲引擎這些你必須要大量自定義操作符來處理向量啊、矩陣運算這樣的。

因此,Swift 可以被定義為一個安全並且使用者友好的語言,並且可以像指令碼語言那樣方便實驗與使用。

Swift 具有良好的記憶體使用的策略和結構。Swift 標準庫中絕大部分型別都是 struct,對值型別使用範圍之廣,在近期的程式語言中可謂首屈一指。原本值型別不可變性的特點,往往導致對於值的使用和修改意味著建立新的物件,但是 Swift 巧妙地規避了不必要的值型別複製,而僅只在必要時進行記憶體分配。這使得 Swift 在享受不可變性帶來的便利以及避免不必要的共享狀態的同時,還能夠保持效能上的優秀。

Swift 編譯器十分智慧,它能在編譯期間幫助我們移除不需要的程式碼,或者將某些方法進行內聯 (inline) 處理。編譯器優化的強度可以在編譯時通過引數進行控制,Xcode 工程預設情況下有 Debug 和 Release 兩種編譯配置,在 Debug 模式下,LLVM Code Generation 和 Swift Code Generation 都不開啟優化,這能保證編譯速度。而在 Release 模式下,LLVM 預設使用 "Fastest, Smallest [-Os]",Swift Compiler 預設使用 "Fast [-O]",作為優化級別。我們另外還有幾個額外的優化級別可以選擇,優化級別越高,編譯器對於原始碼的改動幅度和開啟的優化力度也就越大,同時編譯期間消 耗的時間也就越多。雖然絕大部分情況下沒有問題,但是仍然需要當心的是,一些優化等級採用的是激進的優化策略,而禁用了一些檢查。這可能在原始碼很複雜的情 況下導致潛在的錯誤。如果你使用了很高的優化級別,請再三測試 Release 和 Debug 條件下程式執行的邏輯,以防止編譯器優化所帶來的問題。

值得一提的是,Swift 編譯器有一個很有用的優化等級:"Fast, Whole Module Optimization",也即 -O -whole-module-optimization。在這個優化等級下,Swift 編譯器將會同時考慮整個 module 中所有原始碼的情況,並將那些沒有被繼承和過載的型別和方法標記為 final,這將盡可能地避免動態派發的呼叫,或者甚至將方法進行內聯處理以加速執行。開啟這個額外的優化將會大幅增加編譯時間,所以應該只在應用要釋出的時候開啟這個選項。

雖然現在編譯器在進行優化的時候已經足夠智慧了,但是在面對編寫得非常複雜的情況時,很多本應實施的優化可能失效。因此保持程式碼的整潔、乾淨和簡單,可以讓編譯器優化良好工作,以得到高效的機器碼。

另外,Swift 的多行註釋可以巢狀在其它的多行註釋之中。你可以先生成一個多行註釋塊,然後在這個註釋塊之中再巢狀成第二個多行註釋。

在 Swift 中經常會看到 ! 與 ? 兩個操作符,譬如在型別轉換、可選型別構造中都用到,用 Apple 官方的話說:

It may be easiest to remember the pattern for these operators in Swift as: ! implies “this might trap,” while ?indicates “this might be nil.”

就是 ! 操作符表示我不管你編譯器,我肯定要這麼做,那麼有可能導致執行時崩潰。
而 ? 操作符表示這個可能是 nil,你幫我查查有沒有進行完備的空檢查。



《Swift 編程語言》是蘋果官方對 Swift 語言所做的權威指南,很遺憾蘋果公司並沒有進行多語言支持。所以某位用戶獨立發起了這個手冊的翻譯工作——與其他現存翻譯不同的是:它同步更新蘋果官方的 Swift 開發者預覽版 !

也就是說:一旦官方文檔更新,會立即進行同步:

https://www.cnswift.org/



手機 App 開發與接案 - 總覽:http://21st.each1.net/2018/04/app.html

Swift 是蘋果在 WWDC2014 發表的一門程式設計語言,用來撰寫 OS X 和 iOS 應用程式。

對於已經掌握一兩門程式設計語言的程式師來說,他的選擇要取決於「已有的一兩種語言」是什麼。如果這兩種語言是 Objective-C 和 Swift,或者 C 和 C++,或者其中任何組合,為了挑戰思惟,他可以去學習一種完全不同的語言,比如一種函數式語言(舉例:Scheme)。

C、C++、Objective-C 以及 Swift 這樣的命令式語言都遵循著相同的模型,學習同類語言很簡單,因此就需要讓自己多接觸不同的語言泛型。雖然他可能並不會用這種語言來寫應用,但這會有利於全面開啟他對於電腦語言的理解。

長達600多頁的 The Swift Programming Language 可以在 iBooks 免費下載。

維基百科關於 Swift 的資料:
https://en.wikipedia.org/wiki/Swift_(programming_language)

所有電腦語言都會從其他語言身上借鑒一些東西。對於 Swift 來說也是如此。從語法和儲存模型的角度上說,Swift 就有很多 Rust 的影子。此外,Swift 對於安全的強調使其與 C 和 C++ 保持了一定距離,所以它們之間的共同點比較少。

Swift 取消了 Objective-C 的指標及其他不安全存取的使用,並捨棄 Objective-C 早期套用 Smalltalk 之語法,全面改為句點表示法(dot-notation)。同許多手稿語言一樣,Swift 可以推斷變數型別(var, variant)。同時,它提供了類似 C++、C# 的命名空間(namespace)、泛型(generic)、運算元重載(operator overloading)。Swift 被簡單形容為 「沒有 C 的 Objective-C」(Objective-C without the C)。

蘋果在新網站 swift.org 和託管網站 Github 上開源了 Swift,並支援 Linux,但蘋果的 app store 並不支援開源的 Swift,只支援蘋果官方的 Swift 版本,官方版本會在新網站 swift.org 上定期與開源版本同步。

蘋果開源 Swift 的目標顯然是想讓 Swift 在幾年後成為 iOS 的主流程式語言甚至慢慢地成為軟體開發界的主流語言,跨越到『非蘋果』的平台。

有必要掌握所有 API 嗎?

關於何時接觸大量的庫和 API,以及是否需要學習所有 API ,結論當然是否,好比一個木匠的工具腰帶中只會裝上那些經常使用的工具。當他需要特殊工具的時候,他會來到庫房,打開裡面的大工具箱,把需要的特殊工具找出來使用,然後再把它放回去。而這種使用頻率往往在很長一段時間裡也只有一次到兩次。雖然知道的 API 越多,就越能更好地解決問題,但是有多少人能完整地瞭解所有 API 呢?先比較完整地學習一門語言,然後再繼續研究這種語言的細微之處,也就是開始接觸這門語言中可以用來創建有用應用的框架和 API。然後可以按照一定頻率(比如每週一次,每次 3-5 小時)去選擇一個新的 API 來學習它的功能。可能並不會經常使用這個 API,但是瞭解它,當需要用到時,就會知道「從哪裡把它取出來使用」。

一個全面的 iOS 專家必須掌握這四樣東西:

1. 用來寫應用的語言:Swift。
2. 熟悉創建軟體的工具:Xcode。
3. 儲備大量關於 iOS 應用基礎框架和 API (函式庫)。
4. 鑒別好的 UI 設計的能力。

可能要經歷很多應用程式和上百小時的程式設計才能達到這個水準,每個應用都有自身的要求和需要的 API。只要寫的應用程式越多,就能越廣地接觸到各式蘋果框架,UI 設計技巧也會越來越好。

初學者的十個 iOS App 開發 Q & A:
https://blog.alphacamp.co/2016/05/11/10-questions-you-need-to-know-before-ios-app-development/

Swift 是 Apple 精心培育的新世代程式語言,有許多精巧的設計蘊含其中。這些設計一方面讓 Swift 成為更優秀的語言,一方面卻也讓 Swift 自學者困惑不已。

最人盡皆知的大概就是 optional variable 了。雖然掌握 optional 的精神後會覺得 optional 是超精心的巧思,但第一次接觸 Swift 的人,大概會被程式碼中滿滿的問號與驚嘆號嚇傻。

所幸,關於這個人盡皆知的議題,AppCoda 已經寫了一篇《初學Swift:愛恨交織的 Optional》在《邂逅Swift你需要知道的 n 件事》一書中充分討論。

邂逅Swift你需要知道的 n 件事:https://legacy.gitbook.com/book/gradyzhuo/meetswifttutorial/details

如何理解 if let 與 guard: https://21st.each1.net/2018/08/swift-if-let-guard.html

線上教學:
https://www.hackingwithswift.com
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID309
https://itisjoe.gitbooks.io/swiftgo/
http://www.runoob.com/swift/swift-tutorial.html
https://www.appcoda.com.tw

從專案範例來學習使用 Xcode:
https://www.appcoda.com.tw/hello-world-app-swift/
https://www.hackingwithswift.com/read
電子書:https://medium.com/彼得潘的-swift-ios-app-開發教室/xcode-嘗試做一個實用的app吧-d5103ee1ae5d

How to create live playgrounds in Xcode:
https://www.hackingwithswift.com/example-code/uikit/how-to-create-live-playgrounds-in-xcode

Struct or Class?
https://tw.alphacamp.co/2016/07/20/swift-struct-or-class/

Apple 早期的 Swift 文件推薦開發者優先使用 class;一些近期的文件則推薦優先使用 struct。

在其他有 struct 的語言中, struct 一般只能拿來組織邏輯相關的 data,使用上沒什麼疑義。但在 Swift 中,struct 除了可以整理相關的資料,還擁有 initializer、擁有 method ,除了無法被繼承以外,和 class 的使用方式幾乎完全一樣。這就衍生了另一個問題:在不需要繼承的情況下,到底該用 struct 還是 class?

在討論這個議題前,我們需要知道一些底層的知識。

記憶體分成 heap 和 stack 兩塊。class 物件是 reference type,會被儲存在 heap ; struct 物件是 value type,會被存在 stack。一般而言, stack 的執行效率會比 heap 好,所以一模一樣的事情,交給 struct 做,理論上會比 class 有效率(根據國外網友實測,越新版的 Swift,struct 效能較強這件事越顯著)。

不過「寫出好讀、好維護的程式碼」大部分的時候比「寫出高效能的程式碼」重要。 struct 執行效率較高絕對不是 Apple 在新文件中推廣 struct 的原因。

Object-Oriented Programming (OOP) 是近年軟體開發的主流設計模式,但在 2015 WWDC,Apple 對這個稱霸數十載的設計模式提出挑戰。

Apple 認為,在 OOP 的架構中,假如 super class 定義過於狹窄,能繼承於此 super class 的 sub class 就會較少;為了讓 super class 較「通用」、能被較多 sub classes 繼承,開發者往往需要在 super class 中加入許多 properties,但這些 properties 卻未必是每個 sub class 都需要的。於是,OOP 為主的專案容易龐雜、且程式碼容易缺乏彈性。

於是,Apple 提出 Protocol Oriented Programming(POP),主張應該用 protocol 當作設計程式架構的基礎,以解決 OOP 容易龐雜、缺乏彈性的缺點。

對 POP 細節有興趣的讀者可以自行觀看 WWDC 影片。總之,class 能夠被繼承的特性是 OOP 的核心,但 class 有效率較差、資料容易被誤改(因為 reference type 的特性)的問題。假如改用 OOP 以外的設計模式(例如POP),我們就不必常常依賴 class 的繼承特性,自然就可以優先使用效率較佳、資料較「安全」(因為 value type 的特性)的 struct。

class 和 struct 在 Swift 中非常相似,傳統上,我們習慣使用 OOP,所以會優先(且「必須」)使用 class。但自從 Apple 開始推廣 POP,在這個新的設計模式下,我們對 class 能夠繼承的特性不再那麼倚賴,所以在大部分的情境下,使用優點較多的 struct 就變比較合理的選擇。

不過 OOP 畢竟還是當前主流,Apple 自己也說 OOP 還是有優點和必要, POP 無法完全取代 OOP。

到底要用 class 還 struct ,仍需要根據個別情況斟酌。

可以確定的是,在 swift 中,稱霸數十載的 class 不再是需要使用物件時的唯一選擇了。






Python



Python 是一種物件導向、直譯式的電腦程式語言。它包含了一組功能完備的標準庫,能夠輕鬆完成很多常見的任務。它的語法簡單,與其它大多數程式設計語言使用大括弧不一樣,它使用縮排來定義語句塊。

Python 具備垃圾回收功能,能夠自動管理記憶體使用。它經常被當作腳本語言用於處理系統管理任務和網路程式編寫,然而它也非常適合完成各種高階任務。Python 虛擬機本身幾乎可以在所有的作業系統中運行。使用一些諸如 py2exe、PyPy、PyInstaller 之類的工具可以將Python 原始碼轉換成可以脫離 Python 解釋器執行的程式。

Python 的創始人為 Guido van Rossum。Guido 決心開發一個新的腳本解釋程式,作為 ABC 語言的一種繼承。ABC 是由 Guido 參加設計的一種教學語言。就 Guido 本人看來,ABC 這種語言非常優美和強大,是專門為非專業程式設計師設計的。但是 ABC 語言並沒有成功,究其原因,Guido 認為是非開放造成的。Guido 決心在 Python 中避免這一錯誤,並取得了非常好的效果,完美結合了 C 和其他一些語言。

ABC,一種程式語言與編程環境,目標是在教導非專業的程式設計師學習如何開始寫程式。

Python 是完全物件導向的語言。函式、模組、數字、字串都是物件。並且完全支援繼承、重載、衍生、多重繼承,有益於增強原始碼的複用性。Python 支援重載運算符,因此 Python 也支援泛型設計。相對於 Lisp 這種傳統的函數式程式語言,Python 對函數式設計只提供了有限的支援。( LISP 是具有悠久歷史的計算機編程語言家族,有獨特和完全括號的前綴符號表示法。起源於西元 1958 年,是現今第二悠久而仍廣泛使用的高階編程語言。只有 FORTRAN 編程語言比它更早一年。)

Python 本身被設計為可擴充的。並非所有的特性和功能都整合到語言核心。Python 提供了豐富的 API 和工具,以便程式設計師能夠輕鬆地使用 C、C++、Cython 來編寫擴充模組。Python 編譯器本身也可以被整合到其它需要腳本語言的程式內。因此,有很多人把 Python 作為一種「膠水語言(glue language)」使用。使用 Python 將其他語言編寫的程式進行整合和封裝。在 Google 內部的很多專案,例如 Google App Engine 使用 C++ 編寫效能要求極高的部分,然後用 Python 或 Java/Go 調用相應的模組。

《 Python 技術手冊》的作者 Martelli 說:「這很難講,不過,2004年,Python 已在 Google 內部使用,Google 召募許多 Python 高手,但在這之前就已決定使用 Python。他們的目的是儘量使用 Python,在不得已時改用 C++;在操控硬體的場合使用 C++,在快速開發時候使用 Python。」

Python 的設計哲學是「優雅」、「明確」、「簡單」。Python 開發者的哲學是「用一種方法,最好是只有一種方法來做一件事」。在設計 Python 語言時,如果面臨多種選擇,Python開發者一般會拒絕花俏的語法,而選擇 明確沒有 或者 很少有歧義 的語法。這些準則被稱為「Python格言」。在 Python 解釋器內運行 import this 可以獲得完整的列表。

Python 開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁通常不會被合併到 Python 內。再加上因為 Python 屬於動態型別語言,動態型別語言是在執行期間檢查資料的類型,不得不保持描述變數值的實際類型標記,程式在每次操作變數時,需要執行資料依賴分支,而靜態型別語言相對於動態型別語言,在聲明變數時已經指定了資料類型和表示方法,根據這一原理導致 Python 相對於 C、Visual Basic 等靜態型別語言來說執行速度較慢。不過,根據二八定律,大多數程式對速度要求不高。在某些對運行速度要求很高的情況,Python 設計師傾向於使用 JIT ( 即時編譯,Just-in-time compilation ) 技術,或者用使用 C/C++ 語言改寫這部分程式。目前可用的 JIT 技術是 PyPy ,是用 Python 實現的 Python 直譯器,目標是讓 PyPy 比 C 實現的 Python 更為容易的適應各個專案和方便裁剪。

CPython 是用 C語言 實作的 Python直譯器。作為官方實作,它是最廣泛使用的 Python直譯器。除了 CPython 以外,還有用 Java 實作的 Jython,用 .NET 實作的 IronPython,使 Python 方便地和 Java程式、.NET程式 整合。

更多持續變動中的細節、動態、相關超連結可詳閱維基百科:https://en.wikipedia.org/wiki/Python_(programming_language)


Python 的設計哲學是「優雅」、「明確」、「簡單」。其哲學是「用一種方法,最好是只有一種方法來做一件事」。在使用 Python 語言開發時,如果面臨多種選擇,Python 風格一般會拒絕花俏的語法,而選擇明確沒有或者很少有歧義的語法。也因此影響在其語言設計中,能用文字代表的操作就盡量不用符號,例如很多語言會用 && 代表 AND,但 Python 就會直接用 and。

同樣的 Python 也不是為了 Web 而設計的語言,它可以用在許多種特別的場合例如科學運算等(其實各大語言皆可),若用在網站開發,則通常搭配 Django 框架來使用。Django 是非常完整的框架,還自帶後台介面,在各方面評比中並不輸給 Ruby on Rails。另外,若是學習視覺技術,如 3D 動畫、建模等相關領域,則幾乎都是被 Python 佔領的,例如 MAYA 與 Blender 等軟體都是用 Python 作為腳本語言開發工具。

由於 Google 的許多核心功能採用 Python,替這個語言在世界打出巨大的知名度。雖然其職缺數與使用企業不若 PHP 或 Ruby 那麼多,不過其廣泛的使用情境讓學這門語言的人不會受到產業或工作類型的限制。

知名使用者: Google, Dropbox



線上教學:
https://pydoing.blogspot.tw/2012/10/python-tutorial.html
http://dokelung-blog.logdown.com/posts/280520-python-quickstart


Java VS Python: https://kknews.cc/other/r8ezgvo.html

Open Source 為什麼很重要

唐鳳:開源吃掉全世界
https://read01.com/7D33G4.html

在這一篇訪談形式的文章中,唐鳳談了一些關於 Open Source 的看法,我重新整理成方便自己閱讀重點並增加了相關參考資料連結的文章。

維基百科中關於被稱為「台灣電腦十大高手」之一的唐鳳生平簡介:


主流的開發平台(包括 Oracle Java 及 Microsoft .NET Core)全部開源化之後,軟體開發社區與開源模式之間已經高度重疊,幾乎沒有差別了。作業系統更是以 Linux 與 BSD 為大宗,多年前的專屬式授權系統也較為少見。

加上 GitHub 等社區網站的興起,以開源方式做系統,已經為大部份IT工作者所接受。


GitHub在開源社區中扮演什麼樣的角色,有哪些因素使GitHub成為開源的匯集地?

GitHub 首先是藉由易用的 Web 介面,普及了 Git 的分散治理模式,幾乎完全取代了以 Subversion 為代表的集中模式。

此外,GitHub 將源碼、修訂、瑕疵回報等開發過程的產物定址成鍵連資料,進而將它們轉化成社會物件,因此取得了類似新興社區媒體的網絡效應,使 Google Go 和 Microsoft .NET 團隊都放棄了自家的源碼平台,移轉到 GitHub 上開發,以爭取社區支持。

GitHub 和 OpenStack 都是現代開源治理模式的好例子,前者是基礎建設,後者則體現了具體的模式運作。

OpenStack 使運算平台的提供者與使用者,能有效合作出開源的各式基礎建設。

Docker 生態系,以及同樣基於 Linux Container 架構的 Sandstorm 社區這類的「容器」技術,大幅簡化了開源系統的部署:無論架設開發環境、串接網路服務、甚至整套系統的升級(如 Ubuntu Snappy)等,都較以往方便許多。

這讓社區開發者可以花更多心思在「應用接口優先(API First)」的架構設計上,在節省技術支持時間的同時,也使「參與者」成為「貢獻者」變得更加容易。


在整體IT層面與商業模式運作上會產生什麼影響?

降低參與社區的門檻,並且持續簡化維運後,程式教學和服務業,將會變得非常分散。

在 20 年前,我們有所謂「結蛹期」的概念。這是黑客詞典 Jargon Files 裡的一個詞。它說,基本上要成為一個專業的程式員或黑客,你必須花三、四年的時間沉迷於電腦當中,你會完全打亂你的睡眠模式,一次寫 20 個小時的程式。然後,到了某個點,你就會頓悟。這其實很像禪宗的想法。

一旦你到了那個點,所謂「零的轉移、巫術的權勢」,基本上你就成為一個巫師。一旦你成為巫師,正如松本行弘所說,所有關於性別、種族、年齡、國籍的差別都會消失。這就像《駭客任務》中 Neo 把一切都看成是綠色數字的一幕。到了那個階段,沒有東西能夠影響你的客觀判斷。這也是一個非常禪宗的概念。

可是這算是一個神話,主要是因為那個時候如果沒有網路社區,要學習程式是非常困難的事。

現在有 RailsGirls 和類似的社區,我們就有了一個緩坡。你可以非常舒適地留在斜坡上的任何一點,還有很多人會在同一級階梯上互相支持,不一定需要兩三年的密集時間。用這種方式,你可以學上五、六年 —— 你甚至可以一天睡 8 個小時也不會退步。這會大幅改變市場,因為除了業餘愛好者和專業人士之外,階梯上的每一點還會有細分的市場,這樣市場和社區都會變大很多。


台灣 Open Source 之前主要由軟體工作者參與,但隨著創用 CC、自造文化的開展,現在文字、硬體、音樂、影像、設計、教育、政治工作者,也都開始參與開放文化,Source 的範圍愈來愈廣闊了。

文字如Wikimedia,硬體如Arduino/Thingiverse,音樂如Blend/SoundCloud,影像如YouTube/Flickr,設計如Behance,教育如Khan Academy/OCW,科學如arXiv,政治如g0v等。


目前這個充分IT化的世界,已經進入匱乏/分配/科層等交換模式難以為繼的時代。此時開源社區提供了一個示範,由「向不特定人分享」開始,經過「集合眾人貢獻」的過程,使能夠永續、接力與共享的創造得以發生。

有了網際網路,人們可以直接聯繫到任何一個人,而發行給十萬人跟一百萬人時,成本並不會增加。但 WWW 的特性除了發布之外,更重要的是交互連結:「每個人做出的超連結,都是慷慨無私的展現,邀請讀者離開作者的頁面,去看看其他人是怎樣看世界的。」

舊有的文化交換模式,例如「製作大英百科全書很耗時,所以要賣很貴」(匱乏)、「學校沒有那麼多經費,大家要輪流到圖書館借百科全書」(分配)、「借閱規則要由校方制定」(科層)等等,與上述交互連結的文化相比,顯然是蒼白而緩慢的。


Open Source 早期主要是與工業時代的「軟體製造」模式相互對抗,但隨著「軟體即服務」概念被廣泛接受,現在在軟體界推行開源模式已經沒有特別困難之處。延伸到其他社區時,可能也會經過類似的過程。

在「軟體製造」模式下,販賣套裝軟體後的維護成本較低,而初次開發成本較高,所以會把軟體視為資產。

反之,在訂閱式的「軟體即服務」模式下,幾乎所有成本都花在回應訂閱者和新環境帶來的需求,也就是維護和支持工作上。此時任何未充份元件化的軟體都是持續的技術負債,並非資產。

而若要促進軟體元件化,並找人分攤維護、支持的工作,開源社區是目前所知最有效的模式。


Open Source人應該具備什麼能力?

語文溝通、邏輯思維的能力是必要的,其他只要保持好奇心即可。


給想進入開源社區的新手建議?

想做到什麼,就動手去做。真心想做一件事時,全宇宙的「沒有人」都會來幫你的。


新手的第一步應該從哪裡開始?

把自己的想法放到某個空間,讓其他人可以看到,並且歡迎大家提出改進。
不用怕想法不完整,也不用覺得有瑕疵很丟臉。
誠如 Leonard Cohen 所說:「萬事萬物都有缺口,缺口就是光的入口。」


傳統上,有三種為人熟悉的交換或市場營銷行為。其中一種是內團體(In-group),就像我們同在一個家庭,或者是處於同一個「社區」里,當中有分內團體(In-group)和外團體(Out-group)。家庭或是這些內團體的成員,他們會共享一切、交換一切,可是他們不會跟外人,比如說非我族類(「外來人」)分享。這是其中一種交換模式。

第二種交換,就是我們在政府或者是其他層次結構中看到的,我們只會跟梯子上方或下方的人進行交換。比如說,我只會向我的經理報告,然後我的經理會跟他們的經理報告,再往下分配資源。這種交換是完全科層式的。

第三種就是我們跟任何有錢的人交換。我們向有錢的人提供服務或貨品,然後我們用這筆錢再與別人交換,與其他向我們賣東西的營銷者交換。基本上就是使用貨幣交換。以上是世界上三個主要的交換模式。

可是,以行銷者的身份參與開放源碼(像 Ruby 社區),就能學會世界上第四種交換模式,也就是說,可以自由地跟世界上任何人,為了任何目的而交換。這是一個非常革命性的想法:我不在乎你是否跟我來 自同一個族群;我不在乎你是不是台灣人。我不在乎你是不是老闆或經理;我不在乎你有沒有錢。我想向你提供我的服務,我就慷慨給你。

我們已經證明了,這種行銷方式(像 Linda Liukas 的 Kickstarter 活動)比起前三種傳統交換模型,能夠更有效地在更短的時間內接觸到更多的人。這將會是 21 世紀的潮流。參與開源社區,你會親眼看到它如何運作,以及掌握它的運作方式。


未來開源發展的趨勢?

可能主要會靠「更多元化的參與者」、和「更跨領域的項目」,來觸及生活的更多層面。


「更多元化的參與者」、和「更跨領域的項目」運作模式和現在有什麼不一樣的地方?

在參與者方面,隨著紀錄、發布、版本追蹤成為表現活動的一部份(例如這份訪談),只要有溝通或創作意願,即使只有零星的時間也能進入社區協作,不再只是少數嫻熟工具、時間充裕的創作者才能參與。

在跨領域方面,輸入工具的普及(觸控、聲音、手勢、情感訊號等)讓愈來愈多的類比表意訊息進入數位世界,與之相應的協作空間操作門檻也持續下降,再沿著新的輸出方式(立體印製、擴增實境、可程式化物質)進入生活。這樣一來,開源項目的內容也將不受平面影音文字媒材的局限。


在開源世界裡逼自己成長:https://read01.com/enRdOe.html


軟體版本控制

版本控制(Revision control)是維護工程藍圖的標準作法,能追蹤工程藍圖從誕生一直到定案的過程。此外,版本控制也是一種軟體工程技巧,藉此能在軟體開發的過程中,確保由不同人所編輯的同一程式檔案都得到同步。
詳閱維基百科:https://en.wikipedia.org/wiki/Version_control


Git 簡介:https://en.wikipedia.org/wiki/Git
Git 備忘:
https://teddysun.com/333.html
http://blog.jobbole.com/79417/
http://blog.csdn.net/yavobo/article/details/40887689
Git Community Book 中文版:http://gitbook.liuhui998.com/book.pdf

GitHub 簡介:https://en.wikipedia.org/wiki/GitHub

Git 教學:
https://backlogtool.com/git-guide/tw/
https://kingofamani.gitbooks.io/git-teach/content/index.html
http://www.ithome.com.tw/news/95283
http://gogojimmy.net/2012/01/17/how-to-use-git-1-git-basic/


專案整理與發佈 - 從 Github 到 PyPI:
http://dokelung-blog.logdown.com/posts/238050-collation-and-publishing-of-the-project-from-github-to-pypi
1. 簡單的單人git技術
2. 如何使用Github管理你的專案
3. 發佈一個可供人下載的專案包
4. Python package的打包
5. 上傳到PyPI與使用pip下載

程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...