/**
* Editor.js
*
* Adding this file to your Active Libraries will give you code assist for the
* Aptana Studio scripting engine.
*
* @author Kevin Lindsey
* @version 1.0
*/
/**
* Editor
*
* @constructor
* @extends {EventTarget}
*/
function Editor() {}
/*
* Properties
*/
/**
* Get/set the position of the cursor in this editor
*
* @type {Number} The current cursor offset position
*/
Editor.prototype.currentOffset = 0;
/**
* Get the File object that this editor is editing
*
* @type {File} Returns a File object or undefined
*/
Editor.prototype.file = {};
/**
* Get the language MIME type for this editor
*
* @type {String} Returns this editors language type
*/
Editor.prototype.language = "";
/**
* Get the lexemes associated with this editor
*
* @type {Array} Returns an array of Lexemes
*/
Editor.prototype.lexemes = [];
/**
* Get the line delimiter for this editor
*
* @type {String} Returns the editor's line terminator
*/
Editor.prototype.lineDelimiter = "";
/**
* Get the source associated with this editor
*
* @type {String} Returns the source text in this editor
*/
Editor.prototype.source = "";
/**
* Get the length of the source in this editor
*
* @type {Number} Returns the number of characters in this editor's document
*/
Editor.prototype.sourceLength = 0;
/**
* Get the number of columns in a tab
*
* @type {Number} Returns the number of spaces that equal one tab
*/
Editor.prototype.tabWidth = 0;
/**
* Get the zero-based line number of the line at the top of the editor
*
* @type {Number} The top-most line's index
*/
Editor.prototype.topIndex = 0;
/**
* Get/set the editor's word wrap setting. Setting this to true turns on word
* wrapping.
*
* @type {Boolean} The word wrap setting.
*/
Editor.prototype.wordWrap = false;
/*
* Methods
*/
/**
* Apply an edit to the current document. This function allows you to delete
* and insert text in one operation, if desired.
*
* @param {Number} offset
* The offset within the source where this edit is to take place
* @param {Number} deleteLength
* The number of characters to remove before inserting the new text
* @param {String} insertText
* The new text to insert at the given offset
*/
Editor.prototype.applyEdit = function(offset, deleteLength, insertText) {};
/**
* Get the zero-based line number at the specified character offset
*
* @param {Number} offset
* The character offset within the editor's document
*/
Editor.prototype.getLineAtOffset = function(offset) {};
/**
* Scroll the editor to bring the current selection or caret position into
* view.
*/
Editor.prototype.showSelection = function() {};
//eof
2011-12-21 15:04
[轉載] Aptana Scripting Editor.js Class Document
轉載自:Koders Code Search: Editor.js - JavaScript
分類:
轉載,
Aptana,
Aptana Scripting,
Eclipse,
Eclipse Monkey,
JavaScript
0
回應
2011-12-21 15:04
[轉載] Aptana Scripting Global.js Document
轉載自:Koders Code Search: Global.js - JavaScript
/**
* Global.js
*
* Adding this file to your Active Libraries will give you code assist for the
* Aptana Studio scripting engine.
*
* @author Kevin Lindsey
* @version 1.0
*/
/*
* Properties
*/
/**
* Retrieve the Editors object to access editors and editor events
*
* @type {Editors} Returns the global Editors object
*/
var editors = {};
/**
* Retrieve the error print stream.
*
* @type {PrintStream} Returns the output stream used to display errors
*/
var err = {};
/**
* This is a reference to the only instance of this object. All scripts run in
* their own protected scope. However, this Global is accessible from all
* scripts. Properties placed on "global" will be accessible to all scripts
*
* @type {Global} Returns a reference to the global scope
*/
var global = {};
/**
* Retrieve the Menus object to access menus and menu events
*
* @type {Menus} Returns the global Menus object
*/
var menus = {};
/**
* Retrieve the standard output print stream.
*
* @type {PrintStream} Returns the standard output stream
*/
var out = {};
/**
* Retrieve the View object to access views and view events
*
* @type {Views} Returns the global Views object
*/
var views = {};
/*
* Methods
*/
/**
* Display an alert dialog with the given message
*
* @param {String} message
* The message to display in the dialog
*/
var alert = function(message) {};
/**
* Execute a string in the current shell. This is experimental and may be
* removed in a future version of the scripting environment
*
* @param {String} command
* The command to execute in the shell
* @return {Object} Returns an object with the following properties: code,
* stdout, stderr. Code is the return code from the command. Stdout
* contains any text that was emitted to standard out while it was
* executing. Likewise, stderr contains any errors that were emitted.
*/
var execute = function(command) {};
/**
* Call Java's System.getProperty.
*
* @param {String} property
* The name of the property to retrieve
* @return {String} Returns the specified property value or the string
* "undefined" if the property does not exist
*/
var getProperty = function(property) {};
/**
* Include a JavaScript file into the current script's scope. this is used to
* load dependent libraries into the script that invokes this function.
*
* @param {String} filename
* The name of the file to include in the script
*/
var include = function(filename) {};
/**
* Load a library into the scripting environment. Each script loaded with this
* function will be assigned a unique ID and, if it exists, the init() function
* will be invoked. This gives each script the ability to initialize itself and
* to setup any event listeners it wishes to subscribe to.
*
* Each script will exist in its own scope; however, this Global is also
* included in the scope chain. All variables and functions defined in the
* script will not collide with any other scripts.
*
* Shared properties can be placed on the "global" property. All scripts loaded
* via this function will then be able to see those properties. This can be
* used to share data between scripts.
*
* @param {String} filename
* The file system path to the script to load
* @return {String} Returns a unique string identifier for the loaded script.
* This identifier can be used later to invoke functions within the
* script; however, this is more for internal use at this point. If the
* script fails to load, this will return undefined.
*/
var loadBundle = function(filename) {};
//eof
分類:
轉載,
Aptana,
Aptana Scripting,
Eclipse,
Eclipse Monkey,
JavaScript
0
回應
2011-12-21 15:04
[轉載] Aptana Scripting Editors.js Class Document
轉載自:Koders Code Search: Editors.js - JavaScript
/**
* Editors.js
*
* Adding this file to your Active Libraries will give you code assist for the
* Aptana Studio scripting engine.
*
* @author Kevin Lindsey
* @version 1.0
*/
/**
* Editors
*
* @constructor
*/
function Editors(){}
/*
* Properties
*/
/**
* Get all editors currently being displayed
*
* @type {Array} Returns an array of Editor instances, one for each open editor
*/
Editors.prototype.all = [];
/**
* Get the currently active editor
*
* @type {Editor} Returns the currently active editor or undefined if no editor is open
*/
Editors.prototype.activeEditor = {};
/*
* Methods
*/
/**
* Get the object that represents all editors of a given type. This is
* typically used to register event handlers for a given event type for
* all editors of a specified language.
*
* @param {String} type
* The editor type to retrieve. Currently, this is the MIME type for the
* language the editor supports.
* @return {EditorType} Returns the editor type for the given MIME type or
* undefined if no editor type exists for the given MIME type
*/
Editors.prototype.getEditorType = function(type) {};
/**
* Open the specified filename in a new editor
*
* @param {String} filename
* The name of the file to open in the file system
* @return {Editor} Returns a new Editor object for the newly opened editor
*/
Editors.prototype.open = function(filename) {};
//eof
分類:
轉載,
Aptana,
Aptana Scripting,
Eclipse,
Eclipse Monkey,
JavaScript
0
回應
2011-12-21 14:32
[PHP] 兩種 while 的應用
滿足其中一個條件,就再來一次
滿足其中一個條件,就跳過之後的判斷,同樣的程式流,也可以在 function 中用 return 做到。
<?php
$a = 'OK';
while(true){
if($a == "OK"){
var_dump('OK');
$a = "NO";
continue;
}elseif($a == "NO"){
var_dump('NO');
$a = "XXX";
continue;
}else{
var_dump('default');
}
break;
}
滿足其中一個條件,就跳過之後的判斷,同樣的程式流,也可以在 function 中用 return 做到。
<?php
$a = 'OK';
do{
if($a == "OK"){
echo 'OK'; break;
}
if($a == "NO"){
echo 'NO'; break;
}
if($a == "Off"){
echo 'NO'; break;
}
}while(false);
2011-12-16 15:04
Sphinx 增量索引的方法
之前有寫過一篇 MySQL 全文檢索引擎 - Sphinx 的文章,最近又把它拿出來用了,不過當時即時更新索引的問題,如今則找到解決的方法了,透過更新增量索引的方式達到即時更新。
簡單的說就是利用兩個索引表的合併查詢來做到,一個是完整的索引表,一個是針對當日資料變動的增量索引。
部分的設定檔如下:
建立 SphinxSE 表
特別注意在 CONNECTION 中所指定索引表為 people。
SQL 的查詢測試
這裡使用 INNER JOIN 方式作查詢,這樣對於刪除資料的變動,就不會出現在查詢結果中。
透過 PHP 更新增量索引
在資料 INSERT 或 UPDATE 時,去呼叫索引更新,這樣在第一時間就可以更新索引。
如果 Server 是 Ubuntu,請記得在 vim /etc/sudoers 中賦予 apache 使用 indexer 的權限。
在 crontab 中加上排程
利用離峰時間來更新完整的索引表,由於刪除資料的變動需要更新完整索引表才有辦法移除。
簡單的說就是利用兩個索引表的合併查詢來做到,一個是完整的索引表,一個是針對當日資料變動的增量索引。
部分的設定檔如下:
# ...
source _source_base
{
# 來源-共用的設定
}
source people_full : _source_base
{
sql_query = \
SELECT \
people_profile.id, \
people_profile.main_name \
FROM people_profile
sql_query_killlist = \
SELECT id FROM people_profile \
WHERE update_date >= CURDATE()
}
# 增量索引來源,這邊只會抓出當日變動的資料
# 建議在 update_date 欄位加上 MySQL INDEX
source people_delta : people_full
{
sql_query = \
SELECT \
people_profile.id, \
people_profile.main_name \
FROM people_profile \
WHERE people_profile.update_date >= CURDATE()
}
index _index_base
{
# 索引-共用的設定
}
index people_full : _index_base
{
source = people_full
path = /var/lib/sphinxsearch/data/people_full
}
# 增量索引
index people_delta : _index_base
{
source = people_delta
path = /var/lib/sphinxsearch/data/people_delta
}
# 透過 distributed 類型來合併索引
index people
{
type = distributed
local = people_full
local = people_delta
}
# ...
建立 SphinxSE 表
特別注意在 CONNECTION 中所指定索引表為 people。
CREATE TABLE people_sphinx(
id BIGINT UNSIGNED NOT NULL COMMENT '搜尋結果的 Id',
weight INT NOT NULL COMMENT '搜尋結果的權重',
query VARCHAR(3072) NOT NULL COMMENT '搜尋的查詢條件',
INDEX(query)
)ENGINE=SPHINX
CONNECTION="sphinx://localhost:9312/people"
COMMENT='People Sphinx搜尋連接介面';
SQL 的查詢測試
這裡使用 INNER JOIN 方式作查詢,這樣對於刪除資料的變動,就不會出現在查詢結果中。
SELECT A.id, A.main_name, B.weight FROM people_sphinx B INNER JOIN people_profile A USING(id) WHERE B.query='馬丁尼茲;mode=any;limit=1000'
透過 PHP 更新增量索引
在資料 INSERT 或 UPDATE 時,去呼叫索引更新,這樣在第一時間就可以更新索引。
shell_exec('sudo indexer --quiet --rotate people_delta 2>&1');
如果 Server 是 Ubuntu,請記得在 vim /etc/sudoers 中賦予 apache 使用 indexer 的權限。
www-data ALL=(root) NOPASSWD: /usr/bin/indexer在 crontab 中加上排程
利用離峰時間來更新完整的索引表,由於刪除資料的變動需要更新完整索引表才有辦法移除。
00 00 * * * indexer --quiet --rotate --all > /dev/null 2>&1
2011-12-16 13:01
[轉載][MySQL] Replication option binlog_format
轉載自:MYSQL5.1复制参数binlog_format
MySQL 5.1 中,在復制方面的改進就是引進了新的複制技術:基於行的複制。 簡言之,這種新技術就是關注表中發生變化的記錄,而非以前的照抄binlog 模式。 從MySQL 5.1.12 開始,可以用以下三種模式來實現:基於SQL語句的複制(statement-based replication, SBR),基於行的複制(row-based replication, RBR),混合模式複制(mixed-based replication, MBR)。 相應地,binlog的格式也有三種:STATEMENT,ROW,MIXED。 MBR 模式中,SBR 模式是默認的。
在運行時可以動態低改變binlog的格式,除了以下幾種情況:
如果binlog採用了MIXED 模式,那麼在以下幾種情況下會自動將binlog的模式由SBR 模式改成RBR 模式。
設定主從復制模式的方法非常簡單,只要在以前設定複製配置的基礎上,再加一個參數:
當然了,也可以在運行時動態修改binlog的格式。 例如
現在來比較以下SBR 和RBR 2中模式各自的優缺點
SBR 的優點:
SBR 的缺點:
RBR 的優點:
RBR 的缺點:
另外,針對系統庫 mysql 裡面的表發生變化時的處理規則如下:
注:採用RBR 模式後,能解決很多原先出現的主鍵重複問題
MySQL 5.1 中,在復制方面的改進就是引進了新的複制技術:基於行的複制。 簡言之,這種新技術就是關注表中發生變化的記錄,而非以前的照抄binlog 模式。 從MySQL 5.1.12 開始,可以用以下三種模式來實現:基於SQL語句的複制(statement-based replication, SBR),基於行的複制(row-based replication, RBR),混合模式複制(mixed-based replication, MBR)。 相應地,binlog的格式也有三種:STATEMENT,ROW,MIXED。 MBR 模式中,SBR 模式是默認的。
在運行時可以動態低改變binlog的格式,除了以下幾種情況:
- 存儲過程或者觸發器中間
- 啟用了NDB
- 當前會話試用RBR 模式,並且已打開了臨時表
如果binlog採用了MIXED 模式,那麼在以下幾種情況下會自動將binlog的模式由SBR 模式改成RBR 模式。
- 當DML語句更新一個NDB表時
- 當函數中包含UUID() 時
- 2個及以上包含AUTO_INCREMENT 字段的表被更新時
- 行任何INSERT DELAYED 語句時
- 用UDF 時
- 視圖中必須要求使用RBR 時,例如創建視圖是使用了UUID() 函數
設定主從復制模式的方法非常簡單,只要在以前設定複製配置的基礎上,再加一個參數:
binlog_format="STATEMENT" #binlog_format="ROW" #binlog_format="MIXED"
當然了,也可以在運行時動態修改binlog的格式。 例如
mysql> SET SESSION binlog_format = 'STATEMENT'; mysql> SET SESSION binlog_format = 'ROW'; mysql> SET SESSION binlog_format = 'MIXED'; mysql> SET GLOBAL binlog_format = 'STATEMENT'; mysql> SET GLOBAL binlog_format = 'ROW'; mysql> SET GLOBAL binlog_format = 'MIXED';
現在來比較以下SBR 和RBR 2中模式各自的優缺點
SBR 的優點:
- 歷史悠久,技術成熟
- binlog文件較小
- binlog中包含了所有數據庫更改信息,可以據此來審核數據庫的安全等情況
- binlog可以用於實時的還原,而不僅僅用於復制
- 主從版本可以不一樣,從服務器版本可以比主服務器版本高
SBR 的缺點:
- 不是所有的UPDATE語句都能被複製,尤其是包含不確定操作的時候。
- 調用具有不確定因素的UDF 時復制也可能出問題
- 使用以下函數的語句也無法被複製:
- LOAD_FILE()
- UUID()
- USER()
- FOUND_ROWS()
- SYSDATE() (除非啟動時啟用了--sysdate-is-now 選項)
- INSERT ... SELECT 會產生比RBR 更多的行級鎖
- 複製需要進行全表掃描(WHERE 語句中沒有使用到索引)的UPDATE 時,需要比RBR 請求更多的行級鎖
- 對於有AUTO_INCREMENT 字段的InnoDB表而言,INSERT 語句會阻塞其他INSERT 語句
- 對於一些複雜的語句,在從服務器上的耗資源情況會更嚴重,而RBR 模式下,只會對那個發生變化的記錄產生影響
- 存儲函數(不是存儲過程)在被調用的同時也會執行一次NOW() 函數,這個可以說是壞事也可能是好事
- 確定了的UDF 也需要在從服務器上執行
- 數據表必須幾乎和主服務器保持一致才行,否則可能會導致複製出錯
- 執行複雜語句如果出錯的話,會消耗更多資源
RBR 的優點:
- 任何情況都可以被複製,這對複制來說是最安全可靠的
- 和其他大多數數據庫系統的複制技術一樣
- 多數情況下,從服務器上的表如果有主鍵的話,複製就會快了很多
- 複製以下幾種語句時的行鎖更少:
- INSERT ... SELECT
- 包含AUTO_INCREMENT 字段的INSERT
- 沒有附帶條件或者並沒有修改很多記錄的UPDATE 或DELETE 語句
- 執行INSERT,UPDATE,DELETE 語句時鎖更少
- 從服務器上採用多線程來執行複製成為可能
RBR 的缺點:
- binlog 大了很多
- 複雜的回滾時binlog 中會包含大量的數據
- 主服務器上執行UPDATE 語句時,所有發生變化的記錄都會寫到binlog 中,而SBR 只會寫一次,這會導致頻繁發生binlog 的並發寫問題
- UDF 產生的大BLOB 值會導致複製變慢
- 無法從binlog 中看到都複製了寫什麼語句
- 當在非事務表上執行一段堆積的SQL語句時,最好採用SBR 模式,否則很容易導致主從服務器的數據不一致情況發生
另外,針對系統庫 mysql 裡面的表發生變化時的處理規則如下:
- 如果是採用INSERT,UPDATE,DELETE 直接操作表的情況,則日誌格式根據binlog_format 的設定而記錄
- 如果是採用GRANT,REVOKE,SET PASSWORD 等管理語句來做的話,那麼無論如何都採用SBR 模式記錄
注:採用RBR 模式後,能解決很多原先出現的主鍵重複問題
2011-12-16 12:41
[MySQL] Replication Master to Slave
Master上的設定
my.cnf
進入Master mysql
建立同步連接帳號 db_sync,密碼12345,給 slave_host,
鎖定資料庫寫入
取得 MASTER 上的 Log File 名稱與 Position 編號,這個編號代表當前的 Log 戳記
離開 mysql
匯出 MASTER 上的資料
解除鎖定
Slave上的設定
my.cnf
匯入資料
進入 Slave mysql
停止跟清除之前的 SLAVE 連接
設定Slave 與 Master 的連接
啟動 SLAVE 的連接
察看連接狀態
接著到 Master 上新增一筆資料測試看看吧!
參考文章:
MYSQL 主从服务器配置
mysql主从同步快速设置
MySQL 設定 Replication (Master – Slave)
多主一从mysql replication同步表的大胆尝试
MySQL复制的数据库过滤若干问题
MYSQL5.1复制参数binlog_format
my.cnf
# 主機ID,不可以重複,範圍 0~4294967295
server-id = 1
# Log 的名稱或路徑,只有名稱會將檔案放在 datadir 下
log_bin = mysql-bin
# Log 的格式{ROW,STATEMENT,MIXED},最低支援版本 5.1.8
binlog_format = MIXED
# 需要同步的資料庫,多個寫多行
binlog_do_db = test
binlog_do_db = mydb
# 針對 InnoDB 且有用 transaction 的設定
innodb_flush_log_at_trx_commit=1
sync_binlog=1
進入Master mysql
mysql -u root -p建立同步連接帳號 db_sync,密碼12345,給 slave_host,
mysql> GRANT REPLICATION SLAVE ON *.* TO 'db_sync''slave_host' IDENTIFIED BY '12345';鎖定資料庫寫入
mysql> FLUSH TABLES WITH READ LOCK;取得 MASTER 上的 Log File 名稱與 Position 編號,這個編號代表當前的 Log 戳記
mysql> SHOW MASTER STATUS\G;| File: | mysql-bin.000010 |
|---|---|
| Position: | 106 |
| Binlog_Do_DB: | test,mydb |
| Binlog_Ignore_DB: |
離開 mysql
mysql> quit匯出 MASTER 上的資料
mysqldump -uroot -p --flush-logs --opt --master-data test > test.sql解除鎖定
mysql -u root -p -e UNLOCK TABLES;Slave上的設定
my.cnf
# 主機ID,不可以重複,範圍 0~4294967295 server-id = 2 # 需要同步的資料庫,或指定的資料表 replicate_wild_do_table = test.% replicate_wild_do_table = mydb.category replicate_wild_do_table = mydb.blog # 與 Master 斷線後,重新嘗試連接的時間(sec) master-connect-retry = 60
匯入資料
mysql -uroot -p test < test.sql進入 Slave mysql
mysql -uroot -p停止跟清除之前的 SLAVE 連接
mysql> STOP SLAVE; RESET SLAVE;設定Slave 與 Master 的連接
mysql> CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='db_sync',
MASTER_PASSWORD='12345',
MASTER_LOG_FILE='mysql-bin.000011',
MASTER_LOG_POS=106;
啟動 SLAVE 的連接
mysql> START SLAVE;察看連接狀態
mysql> SHOW SLAVE STATUS\G;| Slave_IO_State: | Connecting to master |
| Master_Host: | master_host |
| Master_User: | db_sync |
| Master_Port: | 3306 |
| Connect_Retry: | 60 |
| Master_Log_File: | mysql-bin.000011 |
| Read_Master_Log_Pos: | 106 |
| Relay_Log_File: | master_host-relay-bin.000011 |
| Relay_Log_Pos: | 4 |
| Relay_Master_Log_File: | mysql-bin.000011 |
| Slave_IO_Running: | Yes |
|---|---|
| Slave_SQL_Running: | Yes |
| Replicate_Do_DB: | |
| Replicate_Ignore_DB: | |
| Replicate_Do_Table: | |
| Replicate_Ignore_Table: | |
| Replicate_Wild_Do_Table: | test.%,mydb.category,mydb.blog |
| Replicate_Wild_Ignore_Table: | |
| Last_Errno: | 0 |
| Last_Error: | |
| Skip_Counter: | 0 |
| Exec_Master_Log_Pos: | 106 |
| Relay_Log_Space: | 106 |
| Until_Condition: | None |
| Until_Log_File: | |
| Until_Log_Pos: | 0 |
| Master_SSL_Allowed: | No |
| Master_SSL_CA_File: | |
| Master_SSL_CA_Path: | |
| Master_SSL_Cert: | |
| Master_SSL_Cipher: | |
| Master_SSL_Key: | |
| Seconds_Behind_Master: | 0 |
接著到 Master 上新增一筆資料測試看看吧!
參考文章:
MYSQL 主从服务器配置
mysql主从同步快速设置
MySQL 設定 Replication (Master – Slave)
多主一从mysql replication同步表的大胆尝试
MySQL复制的数据库过滤若干问题
MYSQL5.1复制参数binlog_format
2011-12-16 06:49
[PHP] 縮圖方式的比較
- imageCopyResized 速度快,但縮圖的品質很粗糙
- imageCopyResampled 縮圖的品質好,但花費的時間有點多
優點是指需要安裝 GD 套件,這個套件不管是在 Windows 或 Linux 上很容易找到跟安裝,在處理圖片的類型明確跟尺寸不大的情況下,使用這兩個函數是不錯的。
為了改善 imageCopyResampled 效率,可以利用 imageCopyResized 做預先縮圖,例如要縮圖的大小為 100*100 時,可以先將圖片縮小成四倍或八倍,如 400*400 或 800*800,可改善超大圖造成的效率不好。
- ImageMagick + Imagick 使用外部的程式來處理圖片,使用指令的方式或透過 Imagick 套件來處理縮圖。
優點是支援下面多種格式,效率快且沒有記憶體錯誤的問題。
3FR, A, AI, ART, ARW, AVI, AVS, B, BGR, BGRA, BMP, BMP2, BMP3, BRF, BRG, C, CAL, CALS, CAPTION, CIN, CIP, CLIP, CMYK, CMYKA, CR2, CRW, CUR, CUT, DCM, DCR, DCX, DDS, DFONT, DJVU, DNG, DOT, DPX, EPDF, EPI, EPS, EPS2, EPS3, EPSF, EPSI, EPT, EPT2, EPT3, ERF, EXR, FAX, FITS, FRACTAL, FTS, G, G3, GBR, GIF, GIF87, GRADIENT, GRAY, GRB, GROUP4, HALD, HISTOGRAM, HRZ, HTM, HTML, ICB, ICO, ICON, INFO, INLINE, IPL, ISOBRL, J2C, JNG, JP2, JPC, JPEG, JPG, JPX, K, K25, KDC, LABEL, M, M2V, M4V, MAP, MAT, MATTE, MIFF, MNG, MONO, MOV, MP4, MPC, MPEG, MPG, MRW, MSL, MSVG, MTV, MVG, NEF, NULL, O, ORF, OTB, OTF, PAL, PALM, PAM, PATTERN, PBM, PCD, PCDS, PCL, PCT, PCX, PDB, PDF, PDFA, PEF, PES, PFA, PFB, PFM, PGM, PGX, PICON, PICT, PIX, PJPEG, PLASMA, PNG, PNG24, PNG32, PNG8, PNM, PPM, PREVIEW, PS, PS2, PS3, PSB, PSD, PTIF, PWP, R, RADIAL-GRADIENT, RAF, RAS, RBG, RGB, RGBA, RGBO, RLA, RLE, SCR, SCT, SFW, SGI, SHTML, SR2, SRF, STEGANO, SUN, SVG, SVGZ, TEXT, TGA, THUMBNAIL, TIFF, TIFF64, TILE, TIM, TTC, TTF, TXT, UBRL, UIL, UYVY, VDA, VICAR, VID, VIFF, VST, WBMP, WMF, WMV, WMZ, WPG, X, X3F, XBM, XC, XCF, XPM, XPS, XV, XWD, Y, YCbCr, YCbCrA, YUV
訂閱:
文章 (Atom)