艾布納基文翻譯
[FTP] 在 AWS EC2 ubuntu 上安裝 vsftpd
vsftpd
Info
Install on AWS EC2
sudo apt-get update
sudo apt-get install vsftpd -y
sudo vi /etc/vsftpd.conf
# 關閉 ipv6,這個問題卡很久,找很久才發現解決方式;不確定是不是 vsftpd 版本的問題
# https://www.centos.org/forums/viewtopic.php?t=52408
listen=YES
listen_ipv6=NO
# 允許本地用戶登錄
local_enable=YES
# 允許上傳
write_enable=YES
# 讀寫執行權限
local_umask=022
# 允許家目錄變為根目錄
chroot_local_user=YES
chroot_list_enable=YES
# 允許家目錄變為根目錄後擁有寫入權限
chroot_list_file=/etc/vsftpd.chroot_list
allow_writeable_chroot=YES
sudo useradd -m -s /usr/sbin/nologin test
sudo passwd test
# 之後輸入二次密碼
sudo vi /etc/shells
/usr/sbin/nologin
sudo vi /etc/vsftpd.chroot_list
sudo service vsftpd restart
使用 TSL 連線(SSL)
如果沒有憑證可以自簽
# 產生一個期限為 3650 天的自簽憑證
sudo openssl req -x509 -nodes -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem -days 3650 -newkey rsa:2048
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:California
Locality Name (eg翻譯社 city) []:Los Angeles
Organization Name (eg翻譯社 company) [Internet Widgits Pty Ltd]:example.com
Organizational Unit Name (eg, section) []:Linux and Open Source
Common Name (e.g. server FQDN or YOUR name) []:example
Email Address []:info@example.com
修改 vsftpd 設定檔
sudo vi /etc/vsftpd.conf
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
ssl_ciphers=HIGH
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
rsa_cert_file=/etc/letsencrypt/live/example.com/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/example.com/privkey.pem
ssl_enable=YES
ssl_ciphers=HIGH
sudo service vsftpd restart
使用被動模式
sudo vi /etc/vsftpd.conf
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
port_enable=YES
pasv_address=[Public IP]
# 使用 domain name 時
#pasv_address=[Domain Name]
#pasv_addr_resolve=YES
sudo service vsftpd restart
Reference
February 8,2018
[Service] UltraHook
UltraHook
Info
- http://www.ultrahook.com/
- UltraHook makes it super easy to connect public webhook endpoints with development environments
- support GitHub, Stripe翻譯社 ActiveCampaign, Papertrail
Usage
- 以串接 Stripe 為例,先註冊取得一組 API key
- Webhook Namespace 的名稱會成為之後 Stripe 的 Endpoint,e.g. http://stripe.taikobotest123.ultrahook.com/
- 在本機安裝 UltraHook
gem install ultrahook
- 寫入 UltraHook API key 到使用者家目錄
echo "api_key: xxxxxx" > ~/.ultrahook
- 啟動 UltraHook 服務
# ultrahook [-k] ultrahook stripe http://dev.test.com/webhook翻譯社 API key 之前如果有設定可省略
- 如果成功就會開始轉發
Authenticated as taikobotest123 Forwarding activated... http://stripe.taikobotest123.ultrahook.com -> http://dev.test.com/webhook
- 到 Stripe 後台,API/Webhooks 新增 Endpoint:http://stripe.taikobotest123.ultrahook.com
- Send test webhook 檢查本機程式是否有接收到訊息
Reference
- UltraHook Frequently Asked Questions
February 6,2018
January 19翻譯社2018
[AWS] Amazon CloudSearch
Amazon CloudSearch
Info
- AWS 的雲端搜尋服務
- 官網:https://aws.amazon.com/tw/cloudsearch/
- 定價:https://aws.amazon.com/tw/cloudsearch/pricing/
Installation
- 建立 Amazon CloudSearch Domain 教學
- Create a New Domain
- NAME YOUR DOMAIN
- Search Domain Name, 設定名稱
- Desired Instance Type翻譯社 設定機器等級,預設 small
- Desired Replication Count, 設定 Replication 數量,預設 1
- CONFIGURE INDEX
- Manual configuration翻譯社 手動設定
- REVIEW INDEX CONFIGURATION
- 這邊可以設定 index,除了 Name 以外,必須決定欄位的 Type
- 一般文字設定 text 即可,如果有多個單詞時(ex. 分類名稱)可以設定 text-array
- 另外 literal 也是一種文字類型,但是大小寫敏感,而且之後可以 group
- 其他類型請參考文件
- 之後可以透過程式建立,所以也可以略過不建立
- SETUP ACCESS POLICIES
- 設定權限,建議選擇 “Allow access to all services from specific IP(s)“,設定允許對外的 IP,多個 IP 時以逗號分隔
- CONFIRM
- 最後確認並完成建立,建立大概會需要 10 分鐘
Usage
- 實際操作需要透過 AWS SDK,PHP 請參考「初探 Amazon CloudSearch (使用當 PHP 範例)」
Laravel Package
Info
- torann/laravel-cloudsearch
- 整合 Laravel 與 Amazon CloudSearch,安裝流程請參考 GitHub 說明
Settings
- .env 設定參數
- /project/.env
AWS_KEY=xxx AWS_SECRET=xxx # 之前建立的 Domain Name CLOUDSEARCH_DOMAIN=xxx # Dashboard 顯示的 Document Endpoint,必須包含 http CLOUDSEARCH_ENDPOINT=http://doc-xxx-xxx-xxx.us-west-2.cloudsearch.amazonaws.com # 不太清楚這個設定是什麼,我是填 AWS 區域 CLOUDSEARCH_REGION=us-west-2
- config/cloud-search.php 設定
- /project/config/cloud-search.php
// 修改從 .env 取得 'domain_name' => env('CLOUDSEARCH_DOMAIN'), // 設定 index 欄位 Name 與 Type 'fields' => [ 'title' => 'text'翻譯社 'author' => 'text-array', 'type' => 'literal', ]翻譯社 // 設定 Eloquent 所在位置,ex. App/Models/Book.php 'model_namespace' => '\\App\\Models',
- 透過 Command 建立 index
php artisan search:fields
- 設定 Eloquent
- /project/app/Models/Book.php
<?php namespace App\Models; use LaravelCloudSearch\Eloquent\Searchable; class Book extends Model { // 使用 Searchable use Searchable; // 必須實作這個方法,回傳 index 的值 public function getSearchDocument() { return [ 'title' => $this->title, 'author' => $this->authors->pluck('name')->toArray(), 'type' => $this->type, ]; } }
- 建立 index
php artisan search:index Book
Searching
- 最基本的搜尋
// search "Kitten fluff" $books = App\Models\Book::search('Kitten fluff')->get();
- 新增額外設定,其他參數請參考文件
// search "Kitten fluff", default operator "or", add fields and weight $books = App\Models\Book::searchBuilder() ->options('defaultOperator', 'or') ->options('fields', [ 'type^10'翻譯社 'title^5', 'author', ])->term('Kitten fluff')->get();
Reference
- Developer Guide
- 初探 Amazon CloudSearch (使用當 PHP 範例)
November 10,2017
September 29翻譯社2017
[MongoDB] 安裝建立環境與 Laravel Package jenssegers/laravel-mongodb
Info
- 一種文件導向的資料庫管理系統
Installation
- Install MongoDB Community Edition on Ubuntu
Setting
設定可連入的 ip 與 port
- MongoDB 預設只開放給 localhost,必須修改設定檔
sudo vi /etc/mongod.conf
net:
port: 27017
# 0.0.0.0 對所有 ip 開放
bindIp: 0.0.0.0
# 重新啟動
sudo service mongod restart
建立權限
- MongoDB 預設沒有權限,不需要登入帳號密碼即可操作資料
- 如果需要建立權限,必須先建立管理者(admin DB 的 Users)
# 進入 mongo
mongo
# 進入 admin DB
use admin
# 建立管理者,回覆 Successfully added user: 表示成功
db.createUser(
{
user: "帳號",
pwd: "密碼",
roles: [ { role: "root"翻譯社 db: "admin" } ]
}
)
# 使用管理者權限,回覆 1 表示成功
db.auth("帳號"翻譯社 "密碼");
- 或是在進入 mongo 前登入
mongo -u "帳號" -p "密碼" --authenticationDatabase "admin"
預設開啟帳號驗證
sudo vi /etc/mongod.conf
#security:
security.authorization: enabled
# 重新啟動
sudo service mongod restart
Management Tool
- Robo 3T
PHP Driver
- MongoDB 與 PHP 的版本關係
- PHP 7.0 以上只能使用 mongodb
phpbrew
- 直接安裝 ext 即可
# PHP 7.0 以上
phpbrew ext install mongodb
原生 php
- Installing the MongoDB PHP Driver with PECL
# 根據主機使用的 PHP 版本選擇安裝 dev 版本
sudo apt install php-pear php7.1-dev
# 更新 pecl
sudo pecl channel-update pecl.php
# 安裝 mongodb
sudo pecl install mongodb
- 安裝成功後會顯示 so 檔位置
Build process completed successfully
Installing '/usr/lib/php/20160303/mongodb.so'
install ok: channel://pecl.php.net/mongodb-1.3.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongodb.so" to php.ini
- 新增至 php.ini(apache & cli)
sudo vi /etc/php/7.1/apache2/php.ini
sudo vi /etc/php/7.1/cli/php.ini
;extension=php_xsl.dll
extension=mongodb.so
Laravel Package
- jenssegers/laravel-mongodb
- /project/config/database.php
// mongodb
'mongodb' => [
'driver' => 'mongodb'翻譯社
'host' => env('MONGODB_HOST'),
'port' => env('MONGODB_PORT'),
'database' => env('MONGODB_DATABASE'),
'username' => env('MONGODB_USERNAME'),
'password' => env('MONGODB_PASSWORD')翻譯社
'options' => [
'database' => env('MONGODB_DATABASE'),
]
],
- Query Builder
// 需要指定連線與集合
$r = DB::connection('mongodb')->collection(MONGODB_COLLECTION_NAME)->get();
dd($r);
- Model
- /project/App/Models/Mongo/Test.php
<?php
namespace App\Models\Mongo;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
class Test extends Eloquent
{
/**
* guarded attributes
*
* @var array
*/
protected $guarded = [];
/**
* collection name
*
* @var string
*/
// protected $collection = 'tests';
/**
* connection name
*
* @var string
*/
protected $connection = 'mongodb';
}
// 跟一般 model 使用沒有差別
$r = $this->model->where('time', '=', '2017-09-14 19:21')->take(3)->get();
dd($r);
Reference
- MongoDB Docs
- MongoDB 完全新手教學 -5 對外開放問題[allow remote access]
- Mongodb 3.2 - 安裝與設定權限
September 19,2017
[VPN] L2TP over IPSec
Info
- L2TP 協定自身不提供加密與可靠性驗證的功能,可以和安全協定搭配使用,從而實現資料的加密傳輸。經常與 L2TP 協定搭配的加密協定是IPsec,當這兩個協定搭配使用時,通常合稱L2TP/IPsec
Installation
- 網路上常見的安裝方式:
- 二種方法我都試過,但是安裝的程式與設定也很多;不意外的又卡關了。這時候我又想起了 docker,果然網路上又有大大提供整合好的 docker images,測試使用 hwdsl2/docker-ipsec-vpn-server
- docker 相關安裝請參考之前的說明
- AWS 新增 Security groups,開啟 port UDP 1701翻譯社 UDP 4500, UDP 500
- git clone project
git clone https://github.com/hwdsl2/docker-ipsec-vpn-server.git
cd docker-ipsec-vpn-server
sudo cp vpn.env.example vpn.env
sudo vi ~/docker-ipsec-vpn-server/vpn.env
# IPSec 的公鑰,建議字串長度長一點
VPN_IPSEC_PSK=PASS
# 預設使用者名稱
VPN_USER=tester
# 預設使用者密碼(明碼)
VPN_PASSWORD=aaaaaa
# 分配 L2TP 私人 IP 網段範圍
VPN_L2TP_NET=172.16.0.013
VPN_L2TP_LOCAL=172.16.0.1
VPN_L2TP_POOL=172.16.0.10-172.23.255.250
# 分配 XAUTH 私人 IP 網段範圍
VPN_XAUTH_NET=172.24.0.013
VPN_XAUTH_POOL=172.24.0.10-172.31.255.250
# 指定 DNS 位置
VPN_DNS_SRV1=XXX.XXX.XXX.XXX
VPN_DNS_SRV2=XXX.XXX.XXX.XXX
DNS_SRV1=XXX.XXX.XXX.XXX
DNS_SRV2=XXX.XXX.XXX.XXX
- ./users/ppp:/etc/ppp
- ./users/ipsec.d:/etc/ipsec.d
# 建議先不要背景執行,有錯誤可以比較容易發現
docker-compose up
Setting
管理使用者
- 修改 L2TP/IPsec 設定檔(明碼),新增使用者 test2
sudo vi ~/docker-ipsec-vpn-server/users/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
"tester" l2tpd "aaaaaa" *
"test2" l2tpd "aaaaaa" *
# $1$x2I2244y$mWuO1pmeYNwpdOqow5xbo.
openssl passwd -1 "aaaaaa"
sudo vi ~/docker-ipsec-vpn-server/users/ipsec.d/passwd
# Secrets for authentication using CHAP
# client server secret IP addresses
tester:$1$x2I2244y$mWuO1pmeYNwpdOqow5xbo.:xauth-psk
test2:$1$x2I2244y$mWuO1pmeYNwpdOqow5xbo.:xauth-psk
管理使用者 in container
- 進入 docker container
docker exec -it ipsec-vpn-server env TERM=xterm bash -l
apt-get update && apt-get -y install vim
修改 PSK 設定
- /etc/ipsec.secrets
%any %any : PSK "PASS"
修改 Private IP 設定
- /etc/xl2tpd/xl2tpd.conf
ip range = 172.16.0.10-172.31.255.250
local ip = 172.16.0.1
修改 DNS 設定
- /etc/ppp/options.xl2tpd
ms-dns XXX.XXX.XXX.XXX # 同一台主機可以設定為 local ip
重啟服務
sudo ipsec restart
sudo service xl2tpd restart
Other
Windows 10 連線發生錯誤
- Q: 如果連線發生錯誤,要特別修改登錄檔,似乎跟路由器有關係
- A: 以系統管理員身分執行命令提示字元 cmd,輸入以下指令並執行
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f
無法使用 VPN 指定 DNS
- Q: Windows 10 VPN 連線成功,但「自動取得 DNS 伺服器位址」時卻沒有透過 VPN 指定的 DNS 解析網址,只有在指定 DNS 伺服器位址後才會有效
- A: 網路連線 > VPN > 右鍵「內容」 > 分頁「網路功能」 > 網際網路通訊協定第 4 版 (TCP/IPv4) > 內容 > 進階 > 自動計量不勾選 > 輸入框設定值: 15
Reference
- wikipedia: 第二層隧道協定
- Ubuntu 架設 L2TP IPSec VPN Server (Mac 相容)
- Ubuntu 16.04 配置L2TP VPN Server
- IPsec VPN Server on Docker
[系統分析] ELK 實作,以 BIND9 log 分析為例
Logstash
- 這次的目的是要分析 BIND9 的 query.log 檔,主要需要修改的地方是 Logstash 結構化 log 的設定
- 先將 log 檔案所在的目錄 volume 到 docker container,在 volumes 區塊新增
- ~/docker-elk/docker-compose.yml
/var/log/named:/var/log/named
sudo vi ~/docker-elk/logstash/pipeline/bind.conf
input {
file {
type => "BIND_DNS"
path => [ "/var/log/named/query.log" ]
start_position => "beginning"
}
}
filter {
if [type] == "BIND_DNS" {
grok {
match => ["message", "(?%{MONTHDAY}[-]%{MONTH}[-]%{YEAR} %{TIME}) client %{IPV4:clientip}#%{POSINT:clientport} \(%{GREEDYDATA:query1}\): query: %{GREEDYDATA:query2} IN %{GREEDYDATA:querytype} \(%{IPV4:dns}\)"]
}
date {
match => ["logdate", "dd-MMM-yyyy HH:mm:ss.SSS"]
timezone => "America/Los_Angeles"
}
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
}
}
03-Aug-2017 00:55:29.005 client XXX.XXX.XXX.XXX#54501(www.google.com): query: www.google.com IN A + (XXX.XXX.XXX.XXX)
into{
"_index": "logstash-2017.08.03",
"_type": "BIND_DNS",
"_id": "AV2nF6AFU4gS5SfvUHc1",
"_version": 1,
"_score": null翻譯社
"_source": {
"path": "/var/log/named/query.log",
"@timestamp": "2017-08-03T00:55:29.005Z",
"logdate": "03-Aug-2017 00:55:29.005"翻譯社
"clientip": "203.75.167.229"翻譯社
"query1": "www.google.com"翻譯社
"query2": "www.google.com",
"@version": "1",
"host": "690ab8796350",
"dns": "172.31.10.132",
"message": "03-Aug-2017 00:55:29.005 client 203.75.167.229#54501 (www.google.com): query: www.google.com IN A + (172.31.10.132)"翻譯社
"type": "BIND_DNS",
"clientport": "54501",
"querytype": "A +"
}
}
Kibana
- 一開始會先選擇 Elasticsearch 資料來源,因為沒有特別修改設定,直接使用預設的 logstash-* 即可
- 因為時區預設使用瀏覽器設定,所以要先到 Management > Advanced Settings > dateFormat:tz 強制設定為資料的時區
- 建立一個 IP COUNT/DATE 的圖表
- 建立新圖表 Visualize > Create a visualization
- 選擇長條圖 Basic Charts > Vertical Bar
- 選擇資料來源 From a New Search, Select Index > logstash-*
- Y 軸選擇欄位 clientip 的數量 Y-Axis > Aggregation[Unique Count] > Field[clientip.keyword]
- X 軸選擇日期 X-Axis > Aggregation[Date Histogram] > Field[@timestamp] > Interval[Daily]
- 點選右上角的箭頭 Apply changes
- 右上角時間範圍選擇 This week 就可以看到一周內 IP COUNT/DATE 的長條圖
September 18,2017
[系統分析] ELK 簡介
- ELK 並不是單一程式,而是分別由 Elasticsearch, Logstash翻譯社 Kibana 所組成
- Elasticsearch 擔任資料儲存,可以把它看成是資料庫的一種,同時他也可以實現全文檢索
- Logstash 收集並處理資料,可以透過正規式將 log 的字串結構化
- Kibana 則是提供網頁的呈現,串接 Elasticsearch 之後可以表現出簡潔美觀的視覺化報表
Installation
- 傳統安裝方式是一個一個來,不過要串連三個程式並調整環境設定,非常容易卡關;一開始裝到一半天成翻譯公司就遇到各種困難…後來突然想到這種需要安裝不同程式的環境,一定已經有人提供整合後的 docker images,後來一找果然有!網路上推薦使用:docker-elk
- 基本環境需求:
- 硬體需求較高,原本我使用 AWS EC2 t2.micro 一直當機,後來升級到 t2.medium 後才成功啟動
- Docker version 1.10.0+
- Docker Compose version 1.6.0+
- git
- ubuntu 16.04 Docker & Docker Compose 安裝(1.15.0 是寫文章時 Docker Compose 的最新版本,請依安裝時釋出的最新版本號自行更換)
sudo apt-get update
sudo apt-get install docker.io
sudo usermod -aG docker $USER
sudo curl -L "https://github.com/docker/compose/releases/download/1.15.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
sudo sysctl -w vm.max_map_count=262144
git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
# 建議先不要背景執行,有錯誤可以比較容易發現
docker-compose up
August 22,2012
[AJAX] jQuery 的繼承函式:$.extend()、JavaScript 執行函式:eval()
最近遇到需要結合二個設定的情況,在,在 PHP 時 array 是 key-value 的形式,所以可以使用 array_merge() 結合二個 array;不過在 JavaScript 中 key-value 算是物件。要怎樣結合二個物件呢?後來在網路上蒐尋到 jQuery 就有提供很好用的函式 $.extend()。簡單的使用方式如下:
var foo = {
set1: {
name: 'test1'翻譯社
color: ['red', 'blue']
},
set2: {
name: 'test2'
}
};
var bar = {
set2: {
name: 'testSub2'
},
set3: {
name: 'test3',
color: ['green']
}
};
alert($.extend(foo, bar).toSource());
要注意的一點是,如果二個物件有相同屬性時,後面的物件屬性會蓋過前面的物件屬性翻譯
另外在 PHP 實作上常常會用到「變數的變數」這種寫法,後來發現 JavaScript 好像也有類似的函式可以達到這個目的:eval()。簡單的使用方式如下:
var foo = 'bar';
var bar = 'test';
alert(eval(foo));
很多東西真的沒有用到過就不會知道啊~(遠目)PHP 真的提供很多好用的函式,可惜在別的語言中就不一定有;不過還是會有相類似的解決方法的,畢竟基本思考的邏輯是相同的嘛!^^
July 3,2012
[PHP] Yii 的 CDbCommand where() 的使用方法
基本的使用方式是:
<?php其中 where 的用法是需要特別說明的地方,因為 Yii 在底層也是使用 PDO 實作,為了防止 SQL Injection 的發生,提供非常類似的使用方法;where() 函式可以引用二個參數:$conditions、$params。$conditions 是 array 型態時,包含連結方式、欄位、值;也可以使用單純 string 型態的字串翻譯$params 非必填,是 array 型態,對應 $conditions 設定的值做 quote 的處理翻譯範例如下:
// 取得 tbl_user 資料表中,id = 1 的資料列
$row = Yii::app()->db->createCommand()
->select('username, password')
->from('tbl_user')
->where('id = :id', array(':id' => 1))
->queryRow();
?>
<?php其他關於 where 更詳細的用法,請參考 casahama 熱心的翻譯文章(簡體)。
$id = (int) $id;
$typeId = (int) $typeId;
$conditions = array(
'and',
'id = :id',
'type_id = :typeId'
);
$params = array(
':id' => $id翻譯社
':typeId' => $typeId
);
// 取得 tbl_table 資料表中,id = $id AND type_id = $typeId 的資料列
$row = Yii::app()->db->createCommand()
->from('tbl_table')
->where($conditions翻譯社 $params)
->queryRow();
?>
其實相比較之下,個人覺得 Zend_Db_Table 比較好用一點,因為他的 where() 函式可以一直串接下去,但 CDbCommand 的 where() 必須先自己依造規則組好,而且只能下一次...(後面下的參數會蓋過前面下的參數)不過在這些 Framework 提供的 Query Builder 的幫助下,能確實減少我們在撰寫 SQL 語法時可能發生的錯誤,同時過濾有可能造成 SQL Injection 的參數翻譯感謝 Framework 製作者的貼心,提供這麼方便的工具^^
[PHP] 幾個讓效能更好小技巧
1. 用 (int) $var 取代 intval($var):
PHP 是一種弱型別的語言,所以在面對外部傳進來的變數時,天成翻譯公司們通常會在作一次型別的轉換處理;PHP 內建提供型別的強制轉換,如:(int)、(string)、(array),強制型別轉換比函式如:intval()、strval() 來的有效率。
2. 用 isset($var[0]) 取代 0 < strlen($var):
當變數是字串型態時,我經常會用 strlen() 這個判斷字串長度的函式檢查他是否為空字串;不過其實 isset() 再檢查字串變數時的效率更高翻譯其他像是在判斷字串長度時,也可以用它來代替。
3. 用 strpos($var翻譯社 'str') !== FALSE 取代 preg_match('/str/', $var翻譯社 $matches):
在字串查找時,第一個想到的函式通常是 preg_match(),但是如果尋找的字串很單純時,使用 strpos() 的效能會更好。
其他還有許多撰寫 PHP 程式時增進效能的小技巧,請參考 Tsung's Blog 有更詳盡的說明。
December 2,2011
[PHP] AJAX 與 cookie
1. 設定 setcookie() $path 參數:
以 AJAX 設定 cookie 時,如果沒有指定 $path 參數程式會自動指定一個虛擬目錄給它,但依照 cookie 的特性:「僅有它的目錄以及以下的子目錄能夠存取」;所以未指定 $path 參數的 cookie 可能會造成在其他目錄下的程式無法存取。一勞永逸的方式就是直接指定 $path 參數為根目錄「/」:
<?php2. PHP 伺服端回傳變數,由 JavaScript 寫入 cookie:
// 第三個參數是 cookie 的存活時間,0 表示存活至瀏覽器關閉為止
setcookie('variable', $value, 0, '/');
?>
做法有很多種,不過大概就是由 JavaScript 寫入 cookie 的概念。
最後我是使用第一種方式,有些問題還真是沒有碰到就不會知道呢~google 大神真是大家的好朋友!(拇指)
January 20翻譯社2010
[PHP] PDO 的使用方法
連線的方式:
<?php
// 給定資料庫變數
$dbtype_sql = 'mysql';
$host_sql = 'localhost';
$dbname_sql = 'dbname';
$username_sql = 'username';
$password_sql = 'password';
// 資料庫連線
try {
$dbh = new PDO($dbtype_sql . ':host=' . $host_sql . ';dbname=' . $dbname_sql, $username_sql翻譯社 $password_sql);
// 資料庫使用 UTF8 編碼
$dbh->query('SET NAMES UTF8');
} catch (PDOException $e) {
echo 'Error!: ' . $e->getMessage() . '<br />';
}
?>
一般的 SELECT 查詢方式:
<?php
// 使用 quote 避免 SQL Injection;相當於 mysql_real_escape_string()
$id = $dbh->quote(2);
$name = $dbh->quote('John');
// 組合 SQL 語法,取得符合 id = 2、name = 'John' 的資料
$query = sprintf("SELECT * FROM table WHERE id = %s AND name = %s", $id翻譯社 $name);
foreach ($dbh->query($query) as $row) {
print_r($row);
}
?>
利用預載的方式:(推薦使用)
<?php
// 組合 SQL 語法,取得符合 id = 2、name = 'John' 的資料
$sth = $dbh->prepare('SELECT * FROM table WHERE id = :id AND name = :name');
$where = array(':id' => 2, ':name' => 'John');
// 使用 execute(),會自動 quote $where 的參數
$sth->execute($where);
foreach ($sth->fetchAll(PDO::FETCH_ASSOC) as $row) {
print_r($row);
}
?>
統一採用物件的方式來操作資料庫,不僅增加系統的彈性,透過相同的 quote() 方法,即可針對不同的資料庫形式進行 SQL Injection 的預防;真的非常方便!雖然於其他專業的 ORM(如:Doctrine)比較,仍有不足;但是在比較簡單的功能的實作上,PHP5 內建的 PDO 的確提供良好的資料庫操作模式~推薦使用!^^
December 29,2009
[新知] Augmented Reality 擴增實境
Google 前陣子提出的 Google Goggles,似乎就有結合類似的技術;透過即時的影像擷取與分析,立即透過網路取得相關資訊。當然這只是非常小部分的應用,更多的應用可以參考「iGarden – NSS ICT Education Blog 擴增實境Augmented Reality(AR)教學」的相關介紹文章,有非常令人驚艷的展示效果!
今天跟 Jace 提到這個技術,他提到 MIT 有個印度的學生已經結合此技術,實作出更接近未來世界的裝置;後來天成翻譯公司 google 了一下,發現了 sixthsense 這個專案。這個專案利用成本大約 320 美金的材料,改裝成一個結合攝影與顯示於一身的特殊裝置,透過這個裝置就能夠即時擷取眼前的影像,並直接投影在物體上,利用手指上的顏色標籤作手勢操作,完全就像電影《關鍵報告》的操作方式!超屌!
以往覺得離我們好遠好遠的未來科技,突然有一種近在咫呎的感覺!Google Goggles 已經實現了動畫《東之伊甸》所描繪的技術,或許不久的將來就能體驗,動畫《電腦線圈》中透過「電腦眼鏡」看世界的科技未來!
P.S 這個影片整個很有《魔鬼終結者》的 fu...墨鏡才是本體啊!(噗)
May 22,2009
[新知] OpenSource 與授權方式
詳細看了 Wiki 以及網路上一些前輩們的介紹,發現這些不同的軟體授權方式其實還蠻複雜的...就天成翻譯公司理解的部分,稍微介紹一些常用的授權許可證;不一定正確,只是簡單紀錄一下(整個想要逃避責任的口氣):
1. GPL:
(1)其出發點在於開放程式碼、免費使用和引用、修改或衍生程式碼的開放與免費使用。
(2)符合 Copyleft 機制的授權條款翻譯所以修改或衍生的程式碼,也必須強制繼承 GPL 的規範;確保所有使用 GPL 的自由軟體,能一直保持自由開放的原則翻譯
(3)因為強迫繼承的關係,GPL 也引來一些批評,所以在 PTT 才會引起想要規避的討論。畢竟公司發售軟體,目的當然是為了賺錢;在遇到這種有「傳染性」的授權方式時,難免會感到困擾...
2. BSD:
(1)在使用此授權方式的軟體或程式碼時,必須保留版權宣告、三條件表列以及免責聲明翻譯
(2)可以自由的使用,修改原始碼,也可以將修改後的原始碼作為開放原始碼或者專有軟體再發佈。
(3)是使用時限制很少,寬鬆的授權方式翻譯
3. Apache License:
(1)在使用此授權方式的軟體或程式碼時,必須保留版權宣告、三條件表列以及免責聲明。
(2)可以自由的使用,修改原始碼,也可以將修改後的原始碼作為開放原始碼或者專有軟體再發佈。
(3)與 BSD 非常類似,不過在修改原始碼後,必須在版權宣告後加注翻譯
4. MIT:
(1)可根據程式的需要修改授權條款為適當的內容;但在軟體和軟體的所有副本中仍必須包含版權聲明和許可聲明。
(2)可以自由的使用,修改原始碼,也可以將修改後的原始碼作為開放原始碼或者專有軟體再發佈翻譯
(3)與 BSD 同屬限制少又寬鬆的授權方式;唯一的不同點在於 MIT 的內容可依照程式著作權者的需求而更改。
以 jQuery 這個 JavaScript Library 為例,它使用的授權協議為 GPL 和 MIT 雙協議,故在使用上符合自由軟體的精神,而且限制也很寬鬆;在去年微軟也曾經發布要將 jQuery 加入 Visual Studio的相關新聞翻譯
參考資料:
(1)開放原始碼促進會(英文)
(2)OSSF::自由軟體鑄造場(中文)
(3)五種開源協議的比較(BSD翻譯社Apache翻譯社GPL,LGPL,MIT) - 整理(中文)
P.S 後來拜讀 OSSF::自由軟體鑄造場【軟體的授權觀念與自由軟體授權類別】投影片(by 自由軟體鑄造場 2008 林誠夏)後,又得到更明確的一些觀念:
自由軟體,擁有六大特性、四大自由
六大特性:開放程式原始碼、不特定授權對象、不限制使用地域、不收取授權金、不隨附擔保、釋放四大自由予後手。
四大自由:執行、研究、改良、重製散佈
另外之前我以為使用或繼承 GPL 條款的自由軟體,就不能收取費用;但其實只要收取費用的名目並不是「授權金」(其他名目如:軟體服務費),作為商業軟體販售是完全合法的!但是因為大部分軟體公司在開發專案時,會將原始碼也當作專案明細的一部分販售;如此一來就與 GPL 必須開放原始碼的宗旨相違背,所以一般軟體公司會想要規避 GPL 的原因就在這裡。
自由軟體的原始概念立意良善,是為了不讓程式撰寫人員閉門造車;如果已經有人發明了輪子,就沒有必要自己再重新設計!拜網際網路發達之賜,讓來自世界各地的程式設計師集思廣益,能更自由的運用前人的智慧,發展更好的功能、更穩定的程式,這不是很棒的一件事嗎!^^
April 9,2009
[AJAX] jQuery的多重下拉式選單應用:Select box manipulation
經由公司的 jQuery 教育訓練,Jace 介紹了一個超讚的 jQuery Plugin:Select box manipulation。透過這個外掛的幫助,可以更輕鬆的實現多重下拉式選單的功能唷,甚至連 cascade 不容易做到的「預設值」也完全沒問題,所需要撰寫的程式碼也少於 cascade,整個就是夢幻的 Plugin!這麼神奇的外掛要怎麼用呢?以下簡單的範例,給有需要的人參考吧:範例是三階層的關聯式多重下拉式選單,分為index.php(呈現頁)、action.php(Ajax 後端資料處理頁)、index.js(JavaScript 處理)、以及 selectboxes ...繼續閱讀
本文出自: http://blog.roodo.com/taikobo0有關各國語文翻譯公證的問題歡迎諮詢天成翻譯公司02-77260931
留言列表