2014年4月9日 星期三

[Linux] Proftp Quota 筆記 @ Ubuntu 12.04

由於採用 Virtual FTP User 的關係,試用一下 Proftp Quota 的服務:

$ cd /etc/proftpd/
$ sudo ftpquota --create-table --type limit
$ sudo ftpquota --create-table --type tally
$ ls -la
ftpquota.limittab
ftpquota.tallytab


$ sudo vim /etc/proftpd/proftpdc.conf
#<IfModule mod_quotatab.c>
#QuotaEngine off
#</IfModule>
$ sudo vim /etc/proftpd/conf.d/QuotaUsage.conf
<IfModule mod_quotatab.c>
QuotaEngine on
QuotaLimitTable file:/etc/proftpd/ftpquota.limittab
QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab
QuotaShowQuotas on
QuotaDisplayUnits Mb
QuotaOptions ScanOnLogin
</IfModule>

$ sudo service proftpd restart


測試:

$ ftp localhost 21
ftp> quote site quota
202 No quotas in effect


試看看限定所有人只能上傳 20GB:

$ sudo ftpquota --table-path /etc/proftpd/ftpquota.limittab --add-record --type limit --quota-type all --units Gb --bytes-upload 20
$ sudo service proftpd restart


$ ftp localhost 21
ftp> quote site quota
200-The current quota for this session are [current/limit]:
200-Name: username
200-Quota Type: User
200-Per Session: False
200-Limit Type: Hard
200-  Uploaded Mb:              0.00/20480.00
200-  Downloaded Mb:    unlimited
200-  Transferred Mb:   unlimited
200-  Uploaded files:   unlimited
200-  Downloaded files: unlimited
200-  Transferred files:        unlimited
200 Please contact root@server if these entries are inaccurate

Linode Resize 筆記



上回在研究 Linode Resize 時,發現他的過程是將機器關機、資料移轉、開機,因此最後沒有採用。這次有台偏 testing 的機器,服務性質上恰好可以承受 donwtime 時間,就來試試了!

過程如之前所料的,先關機再移機,以官方公佈的資訊為例,從 Linode 1G 移機 resize 需要耗時 36 分鐘,此時間會跟 Linode 上選的方案有關,因為每個方案的 Storage 大小不一樣。

整體上,所耗的時間主要就是在搬移資料,至於搬移的速度嘛,據觀察一開始每秒 18MB/s,但之後可飆到 66MB/s,所以原先 Linode 1G 方案有 48 GB 儲存空間,以 50MB/s 算一下就是 15~20 分鐘,而實際移轉過程也可以線上觀看 Host Job Queue,項目名稱:Migrate Filesystem。



別忘了,做完 Resize 後要自己重開機!此次從 Linode 1G 升到 Linode 4G 耗時約 15 分鐘。




註:Linode Resize 完,Disk 也要自己 Resize 才行 Orz 所以又關機了一次

2014年4月5日 星期六

iOS 開發筆記 - ALAssetsLibrary assetForURL defaultRepresentation fullResolutionImage - Terminated due to Memory Pressure

最近設計 app 時,開始把圖片存進內建得相本裡,而不使用 app sandbox 空間,然而要取出圖片時,就會碰到 Terminated due to Memory Pressure 的問題,追一下,大概是瞬間取太多張照片 :P 此為 ARC 模式。

解法:
  1. 降低瞬間取照片的數量
  2. 使用 @autoreleasepool{ } 處理記憶體管理
例如:

[self.library assetForURL:[NSURL URLWithString:@"assets-library://..."] resultBlock:^(ALAsset *asset) {
                                //NSLog(@"asset:%@",asset);
                                UIImage *image = nil;
                                @autoreleasepool {
                                    image = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
                                }
                            } failureBlock:^(NSError *error) {
                            }];


只是,這樣也沒有真的避免大量記憶體的使用 Orz 因為 [asset defaultRepresentation] fullResolutionImage] 真的吃滿大的記憶體,例如 5MB 大小的照片,處理一張照片時,記憶體會瞬間加了 30~50MB,所以瞬間處理 3~5 張時,記憶體還可能衝到 2xxMB ,直到 Terminated due to Memory Pressure。暫時想到的解法就只能透過降低處理照片的張數了。

實際例子是 app 初始化完大概 20MB 記憶體,跑上述 code 處理 3 張照片可以吃到 90MB,不曉得是不是 CGImage 的關係?改天有空再追一下。

2014年3月31日 星期一

[Linux] 架設 Proftp 與 FTP over TLS 供網頁工讀生上傳資料 @ Ubuntu 12.04

突然收到個命令,要架一檯機器給工讀生用 Orz 雖然幾乎都用 sftp 了,為了讓不熟 Unix 的網頁開發者可以輕鬆上傳資料,最後就是架一台機器,開個 ftp 讓他連進去使用。

流程:

$ sudo apt-get install nginx proftpd
$ sudo vim /etc/proftpd/proftpd.conf
Include /etc/proftpd/tls.conf

$ sudo vim /etc/proftpd/tls.conf
TLSEngine                               on
TLSLog                                  /var/log/proftpd/tls.log
TLSProtocol                             SSLv23
TLSRSACertificateFile                   /etc/ssl/certs/proftpd.crt
TLSRSACertificateKeyFile                /etc/ssl/private/proftpd.key

$ sudo openssl req -x509 -newkey rsa:1024 -keyout /etc/ssl/private/proftpd.key -out /etc/ssl/certs/proftpd.crt -nodes -days 3650

$ sudo vim /etc/proftpd/conf.d/AuthUserFile.conf
DefaultRoot ~
AuthUserFile /etc/proftpd/ftpd.passwd
RequireValidShell off

$ id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ sudo ftpasswd --file /etc/proftpd/ftpd.passwd --passwd --name webadmin --home /usr/share/nginx/www --shell=/bin/false --uid 33

$ sudo chown -R www-data:www-data /usr/share/nginx/www

$ sudo service proftpd restart

2014年3月28日 星期五

[PHP] foreach $key => $value Passing by Reference Problem

最近開發時,碰到了一個 passing by reference 的問題,追了一陣子才發現 Orz

程式碼:

<?php

$a = array( 'A', 'B', 'C' , 'D' );
print_r($a);
foreach( $a as &$v )
        $v = strtolower($v);
$v = 123123123;
print_r($a);


結果:

Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => D
)
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => 123123123
)


可以看到上述的最後一個 element 變成 123123123,而解法就是透過 unset 來處理:

<?php
$a = array( 'A', 'B', 'C' , 'D' );
print_r($a);
foreach( $a as &$v )
        $v = strtolower($v);
unset($v);
$v = 123123123;
print_r($a);


結果:

Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => D
)
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
)