專業筆譯社

[FTP] 在 AWS EC2 ubuntu 上安裝 vsftpd

vsftpd

Info

  • https://security.appspot.com/vsftpd.html
  • Probably the most secure and fastest FTP server for UNIX-like systems.

Install on AWS EC2

  • 更新套件並安裝 vsftpd
sudo apt-get update
sudo apt-get install vsftpd -y
  • vsftpd 設定
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
  • 建立使用者 test
sudo useradd -m -s /usr/sbin/nologin test
sudo passwd test
# 之後輸入二次密碼
  • nologin 加入 shells 最後
sudo vi /etc/shells
/usr/sbin/nologin
  • 如果使用者要可以看到所有目錄,新增帳號到這個檔案;如果不需要也要建立一個沒有內容的檔案
sudo vi /etc/vsftpd.chroot_list
  • 重啟 vsftpd
sudo service vsftpd restart

使用 TSL 連線(SSL)

如果沒有憑證可以自簽

  • 利用 openssl 產生憑證檔案
# 產生一個期限為 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
  • 如果 EC2 上已有憑證
#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
  • 重啟 vsftpd
sudo service vsftpd restart

使用被動模式

  • 有興趣可以詳讀 FTP 主/被動模式
  • 天成翻譯公司自己的理解是:當 Client 端在 NAT 架構下,使用被動模式比較不容易有問題(如果有錯請再告知)
  • 修改 vsftpd 設定檔
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
  • 重啟 vsftpd
sudo service vsftpd restart
  • AWS EC2 Security Group 要開啟被動模式的 port range

Reference

  • Ubuntu Server 建構 vsftpd 實體帳戶
  • 潮潮的Ghost + AWS EC2 部署
  • [翻译]在 Ubuntu 中使用 SSL/TLS 加密 FTP 连接

taikobo0發表於 樂多 │10:15 │回應(0) │引用(0) │FTP │標籤:FTP,aws,EC2

February 8,2018

[Service] UltraHook

UltraHook

Info

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 ]  , API key 之前如果有設定可省略
ultrahook stripe http://dev.test.com/webhook
如果是 virtual host 要記得在 /etc/hosts 先設定好 IP
  • 如果成功就會開始轉發
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

taikobo0發表於 樂多 │16:45 │回應(0) │引用(0) │Service │標籤:UltraHook

February 6,2018

[Laravel] queue 管理程式 Supervisor 無法正確被執行

Service Supervisor execution error

Problem

  • Laravel 5.5 文件 隊列 Supervisor 配置詳細解釋 Supervisor 的安裝與設定,不過實際在本機安裝時卻一直無法成功執行 php artisan queue:work
  • live EC2 安裝 Supervisor 使用相同設定卻沒有問題
  • 輸出 log 資訊有 php error:
PHP Parse error:  syntax error翻譯社 unexpected '?' in /var/www/app/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php on line 233

Solution

  • 試著修改 Supervisor 設定檔卻一直沒有解決
  • 後來決定從 php error 訊息下手,google 後發現這個錯誤是因為使用 PHP 7.0 以才支援的 ?? 導致舊版本 PHP 無法判讀,不過從 cli 或是 web 看 PHP 的版本都是 7.1.8
  • 突然想到本機有裝phpbrew,因為系統內存在多版本,所以在 crontab 需要特別指定版本;推測 Supervisor 也是相同道理
  • 修改設定檔 command 參數,後來果然成功執行了!
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=/root/.phpbrew/php/php-7.1.8/bin/php /var/www/app/artisan queue:work --daemon --delay=3 --sleep=3 --tries=3
autostart=true
autorestart=true
user=root
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/app/storage/logs/worker.log

taikobo0發表於 樂多 │10:27 │回應(0) │引用(0) │Laravel │標籤:laravel翻譯社queue,supervisor

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();
要留意的是基本搜尋只會找 Type 是 text, text-array 的欄位,如果需要尋找其他 Type 的欄位必須自建 searchBuilder
  • 新增額外設定,其他參數請參考文件
// 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

  1. Developer Guide
  2. 初探 Amazon CloudSearch (使用當 PHP 範例)

taikobo0發表於 樂多 │14:06 │回應(0) │引用(0) │AWS │標籤:PHP,AWS,Laravel,CloudSearch

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

  1. MongoDB Docs
  2. MongoDB 完全新手教學 -5 對外開放問題[allow remote access]
  3. Mongodb 3.2 - 安裝與設定權限

taikobo0發表於 樂多 │09:52 │回應(0) │引用(0) │MongoDB │標籤:PHP,MongoDB,Laravel

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
  • 複製並調整環境變數(其他變數請參考 run.sh
  • sudo cp vpn.env.example vpn.env
    sudo vi ~/docker-ipsec-vpn-server/vpn.env
  • ~/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
  • 網段計算方式可以參考這裡
  • volume 使用者設定檔目錄,在 volumes 區塊新增
  • ~/docker-ipsec-vpn-server/docker-compose.yml
  •     - ./users/ppp:/etc/ppp
        - ./users/ipsec.d:/etc/ipsec.d
  • 建立 docker container
  • # 建議先不要背景執行,有錯誤可以比較容易發現
    docker-compose up
  • 如果沒有問題,應該會看到下面的畫面;包含 IP、公鑰、預設的使用者帳號與密碼

Setting

管理使用者

  • 修改 L2TP/IPsec 設定檔(明碼),新增使用者 test2
  • sudo vi ~/docker-ipsec-vpn-server/users/ppp/chap-secrets
  • ~/docker-ipsec-vpn-server/users/ppp/chap-secrets
  • # Secrets for authentication using CHAP
    # client  server  secret  IP addresses
    "tester" l2tpd "aaaaaa" *
    "test2" l2tpd "aaaaaa" *
  • 修改 Cisco IPsec 設定檔(password),新增使用者 test2
  • Password
  • # $1$x2I2244y$mWuO1pmeYNwpdOqow5xbo.
    openssl passwd -1 "aaaaaa"
    sudo vi ~/docker-ipsec-vpn-server/users/ipsec.d/passwd
  • ~/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
  • 不需要重新啟動 IPSec,儲存後新帳號即可使用

管理使用者 in container

  • 進入 docker container
  • docker exec -it ipsec-vpn-server env TERM=xterm bash -l
  • 安裝編輯器 vim
  • apt-get update && apt-get -y install vim
  • 修改設定檔
  • 不需要重新啟動 IPSec,儲存後新帳號即可使用

修改 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

taikobo0發表於 樂多 │11:19 │回應(0) │引用(0) │VPN │標籤:VPN,L2TP,IPSec

[系統分析] ELK 實作,以 BIND9 log 分析為例

Logstash

Kibana

  • 一開始會先選擇 Elasticsearch 資料來源,因為沒有特別修改設定,直接使用預設的 logstash-* 即可
  • 因為時區預設使用瀏覽器設定,所以要先到 Management > Advanced Settings > dateFormat:tz 強制設定為資料的時區
  • 建立一個 IP COUNT/DATE 的圖表
    1. 建立新圖表 Visualize > Create a visualization
    2. 選擇長條圖 Basic Charts > Vertical Bar
    3. 選擇資料來源 From a New Search翻譯社 Select Index > logstash-*
    4. Y 軸選擇欄位 clientip 的數量 Y-Axis > Aggregation[Unique Count] > Field[clientip.keyword]
    5. X 軸選擇日期 X-Axis > Aggregation[Date Histogram] > Field[@timestamp] > Interval[Daily]
    6. 點選右上角的箭頭 Apply changes
    7. 右上角時間範圍選擇 This week 就可以看到一周內 IP COUNT/DATE 的長條圖

taikobo0發表於 樂多 │10:48 │回應(0) │引用(0) │系統分析 │標籤:Elasticsearch,Logstash,Kibana翻譯社ELK,BIND9

September 18,2017

[系統分析] ELK 簡介

Info
  • 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 並建立 docker container
  • git clone https://github.com/deviantony/docker-elk.git
    cd docker-elk
    # 建議先不要背景執行,有錯誤可以比較容易發現
    docker-compose up
    
  • 如果沒有錯誤,這個時候 http://domain:5601 應該已經可以看到 Kibana 的畫面(EC2 請開啟 port 5601)
  • http://domain:9200 也會看到 Elasticsearch 的 JSON 回應(EC2 請開啟 port 9200)
  • 另外建議可以安裝 Chrome extension ElasticSearch Head,只要連接 http://domain:9200/ 就可以直接連到 Elasticsearch 並看到原始數據

taikobo0發表於 樂多 │11:50 │回應(0) │引用(0) │系統分析 │標籤:Elasticsearch,Logstash,Kibana,ELK

August 22翻譯社2012

[AJAX] jQuery 的繼承函式:$.extend()、JavaScript 執行函式:eval()

其實這篇文章內容跟 AJAX 沒有關係...(囧)不過之前似乎沒有編輯 JavaScript 的分類,所以就沿用下去吧!(完全題外話)

最近遇到需要結合二個設定的情況,在,在 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 真的提供很多好用的函式,可惜在別的語言中就不一定有;不過還是會有相類似的解決方法的,畢竟基本思考的邏輯是相同的嘛!^^

taikobo0發表於 樂多 │22:08 │回應(0) │引用(0) │AJAX │標籤:JavaScript,jQuery,eval,AJAX翻譯社extend

July 3,2012

[PHP] Yii 的 CDbCommand where() 的使用方法

Yii Framework 本身對資料庫的操作除了提供 Active Record 以外,也有提供類似 ZendFramework Zend_Db_Table 以物件透過函式組合 SQL 語法的方法:CDbCommand。

基本的使用方式是:
<?php
// 取得 tbl_user 資料表中,id = 1 的資料列
$row = Yii::app()->db->createCommand()
    ->select('username, password')
    ->from('tbl_user')
    ->where('id = :id', array(':id' => 1))
    ->queryRow();
?>
其中 where 的用法是需要特別說明的地方,因為 Yii 在底層也是使用 PDO 實作,為了防止 SQL Injection 的發生,提供非常類似的使用方法;where() 函式可以引用二個參數:$conditions、$params。$conditions 是 array 型態時,包含連結方式、欄位、值;也可以使用單純 string 型態的字串
翻譯$params 非必填,是 array 型態,對應 $conditions 設定的值做 quote 的處理。範例如下:
<?php
$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();
?>
其他關於 where 更詳細的用法,請參考 casahama 熱心的翻譯文章(簡體)。

其實相比較之下,個人覺得 Zend_Db_Table 比較好用一點,因為他的 where() 函式可以一直串接下去,但 CDbCommand 的 where() 必須先自己依造規則組好,而且只能下一次...(後面下的參數會蓋過前面下的參數)不過在這些 Framework 提供的 Query Builder 的幫助下,能確實減少我們在撰寫 SQL 語法時可能發生的錯誤,同時過濾有可能造成 SQL Injection 的參數。感謝 Framework 製作者的貼心,提供這麼方便的工具^^

taikobo0發表於 樂多 │11:21 │回應(0) │引用(0) │PHP

December 2翻譯社2011

January 20翻譯社2010

[PHP] PDO 的使用方法

PHP 從 PHP5 開始,在資料庫操作方面新增了 PDO(PHP Data Objects)的 extension,利用物件導向的方式與資料庫進行溝通翻譯捨棄以往透過單一函式的方式,而是透過物件導向程式設計的抽象化概念,操作時使用統一的方法,如果需要更換資料庫時,只要在建立物件時給予資料庫的形式,而不用更動到原來的程式碼。這也是物件導向程式設計擁有優良靈活性的最佳表現!

連線的方式:
<?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 的確提供良好的資料庫操作模式~推薦使用!^^

taikobo0發表於 樂多 │15:17 │回應(2) │引用(0) │PHP │標籤:PDO

December 29,2009

[新知] Augmented Reality 擴增實境

今天發現了一個天成翻譯公司以前就知道的東西(天成翻譯公司在說什麼啊...?):Augmented Reality 擴增實境翻譯最早看到應用類似技術的商品是在日本的遊戲 AR-FIGURE 中:利用 Web Cam 與遊戲廠商提供的實體方塊,建立一個存在電腦螢幕中真實環境裡的虛擬人偶(好繞口...)。第一次看到這玩意兒的時候真是嚇死我了,原來遊戲也可以這樣玩!擴增實境其實也是 Virtual Reality 虛擬實境的一種;但不同於 VR 中所有東西都是虛擬的,AR 是一種與現實環境結合的虛擬。隨著現代科技的進步,攝影機技術已經被廣泛運用生活中;也因為如此,以往印象中虛擬實境所需的厚重眼鏡與手套,已經可以藉由我們生活中常見的手機:攝影鏡頭與觸控螢幕來實現!

Google 前陣子提出的 Google Goggles,似乎就有結合類似的技術;透過即時的影像擷取與分析,立即透過網路取得相關資訊。當然這只是非常小部分的應用,更多的應用可以參考「iGarden – NSS ICT Education Blog 擴增實境Augmented Reality(AR)教學」的相關介紹文章,有非常令人驚艷的展示效果!

今天跟 Jace 提到這個技術,他提到 MIT 有個印度的學生已經結合此技術,實作出更接近未來世界的裝置;後來我 google 了一下,發現了 sixthsense 這個專案。這個專案利用成本大約 320 美金的材料,改裝成一個結合攝影與顯示於一身的特殊裝置,透過這個裝置就能夠即時擷取眼前的影像,並直接投影在物體上,利用手指上的顏色標籤作手勢操作,完全就像電影《關鍵報告》的操作方式!超屌!

以往覺得離天成翻譯公司們好遠好遠的未來科技,突然有一種近在咫呎的感覺!Google Goggles 已經實現了動畫《東之伊甸》所描繪的技術,或許不久的將來就能體驗,動畫《電腦線圈》中透過「電腦眼鏡」看世界的科技未來!

P.S 這個影片整個很有《魔鬼終結者》的 fu...墨鏡才是本體啊!(噗)

taikobo0發表於 樂多 │17:07 │回應(0) │引用(0) │新知 │標籤:Augmented Reality,AR

May 22,2009

[新知] OpenSource 與授權方式

從出社會工作以來,經常接觸到的幾乎所有的程式,都是開放原始碼翻譯不過對於它的定義與其衍生的自由軟體所採用的授權方式,一直以來都是一知半解翻譯前幾天在 PTT Soft_Job 版看到一篇討論【[請益] 請問要如何規避GPL?】,引起我想要弄清楚的興趣;這些不同的授權方式各自到底代表著什麼意義呢?

詳細看了 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 的原因就在這裡。

自由軟體的原始概念立意良善,是為了不讓程式撰寫人員閉門造車;如果已經有人發明了輪子,就沒有必要自己再重新設計!拜網際網路發達之賜,讓來自世界各地的程式設計師集思廣益,能更自由的運用前人的智慧,發展更好的功能、更穩定的程式,這不是很棒的一件事嗎!^^

taikobo0發表於 樂多 │10:57 │回應(0) │引用(0) │新知

April 9翻譯社2009

[AJAX] jQuery的多重下拉式選單應用:Select box manipulation

從本網誌回應數最高的文章得知,大家似乎對多重下拉式選單的功能情有獨鍾啊!Ajax 能夠在不換頁的情況下,達到資料庫連結,是許多人夢寐以求的功能;而 jQuery 易上手與輕鬆操作的特性,讓我們能更簡單的運用 Ajax 達成目的翻譯然而隨著時間的推移,過去介紹的 cascade 已經有很長一段時間沒有更新,而且在使用上其實存在不少綁手綁腳的地方;距離 jQuery 的宗旨「Write Less翻譯社 Do More」似乎是還差那麼一小段距離...

經由公司的 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

arrow
arrow
    文章標籤
    翻譯社
    全站熱搜

    lopezd85a23 發表在 痞客邦 留言(0) 人氣()