2017年3月23日 星期四

沒人要看的個人網站

由於一些原因,
緊急做了這個網頁,
做到早上五點根本沒甚麼睡就要去上班了。

拿了網路上免費的範本,
還找個免空丟網頁,
沒想到做完根本沒人看...
為了發洩只好貼來這裡!
http://peggy-lin.host22.com/


背景照片全都是自己拍的,
丟給新海城app轉圖,
畫素是有點差但整體來說還可以看!
但在其他平台背景就是無法縮放,
在電腦就可以!
查了很久說是跟fixed有關,
好像也不是一時半刻可以解決的事,
只好先放棄!

然後作品集讓我搞超久,
想要拿之前簡報裡面放的gif,
沒想到存檔下來竟然不能動,
查了一下說是要存成html,
但我2010版的不能存啊!
只好上網找可以轉檔的網頁,
千辛萬苦才存好gif,
結果放到網頁上排版很醜,
因為作品集那塊整個呈現都是用bootstrap的套件來用,
然後一時之間竟然找不到可以調的樣式,
只好放棄!

果然太久沒碰網頁,
css3一堆都看不懂,
要一直查一直查,
原本竟然妄想從頭做一個網頁!
真是想不開

2016年9月29日 星期四

四週年卡片-可達鴨爆炸盒

四周年,花了中秋連假四天在做,我以為一天就可以做完,但我完全忽略它機關有點多,雖然不難但有點費時,而且只要有可達鴨圖案的地方都要手繪然後剪下貼上,煩都煩死了!弄出來沒有比網友們的還好玩還精緻,但手殘的我可以弄成這樣我已滿足!


45度角很重要,因為正面太蠢了看不出來是可達鴨


另外一側也很完美

打開蓋子散開後的樣子,很不想把照片放第一層,但是設計錯誤...


上方有口袋可以抽出可達鴨圖案卡片 






右方可以抽拉可達鴨的圖片,可達鴨憨憨三連拍表情


左方可以拉他的三根毛,就會看到變態的表情和腳璞,這個機關可是有夠難做的... 

左方第二層,是拍立得造型 

可以抽拉出可達鴨照片,其實應該是要放本人合照,但是設計錯誤... 


右方第二層,也有小口袋可以抽出卡片 

下方第二層,設計成像相框一樣,可以抽出來換一片放 

最後做完發現是無意義的東西,而且重要寫字的地方好少...雖說我寫完第一行之後就發呆了半小時,完全不知道要寫甚麼,最後就以廢文結束了。

2015年1月31日 星期六

LOCO FOOD 超好吃蛋餅

這不是甚麼網誌文,
單純我想記錄而已。


只點了漢堡蛋餅和奶茶而已,
奶茶很普通竟然要30塊!
漢堡好吃但也普普,
唯一心動的就是蛋餅,
加了點它們的辣椒更好吃。
好想再吃可是桃園怎麼沒有!

2015年1月22日 星期四

Vector 類別與 Array 類別的比較


如果可能,請盡量使用 Vector 類別,而非 Array 類別。(跟c++差好多)

Vector 類別比 Array 類別能更快速地讀取與寫入存取。
簡單的基準測試可顯示 Vector 類別優於 Array 類別的益處。下列程式碼顯示 Array 類別的基準測試:
var coordinates:Array = new Array(); 
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 300000; i++) 
{ 
    coordinates[i] = Math.random()*1024; 
} 
  
trace(getTimer() - started); 
// output: 107 
下列程式碼顯示 Vector 類別的基準測試:
var coordinates:Vector.<Number> = new Vector.<Number>(); 
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 300000; i++) 
{ 
    coordinates[i] = Math.random()*1024; 
} 
 
trace(getTimer() - started); 
// output: 72 
此範例可進一步最佳化,方法是將特定的長度指定給向量並將其長度設定為固定:
// Specify a fixed length and initialize its length 
var coordinates:Vector.<Number> = new Vector.<Number>(300000, true); 
  
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 300000; i++) 
{ 
    coordinates[i] = Math.random()*1024; 
} 
 
trace(getTimer() - started); 
// output: 48 
如果沒有事先指定向量的大小,則會在向量用盡空間時增加向量的大小。每次增加向量的大小時,就會配置新的記憶體區塊。而向量目前的內容會複製到新的記憶體區塊中。但這些額外的配置和資料複製作業將妨礙效能。上述程式碼藉由指定向量的起始大小來最佳化效能。不過,此程式碼並無法最佳化可維護性。若同時要改進可維護性,請在常數中儲存重複使用值:
// Store the reused value to maintain code easily 
const MAX_NUM:int = 300000; 
  
var coordinates:Vector.<Number> = new Vector.<Number>(MAX_NUM, true); 
var started:Number = getTimer(); 
  
for (var i:int = 0; i< MAX_NUM; i++) 
{ 
    coordinates[i] = Math.random()*1024; 
} 
  
trace(getTimer() - started); 
// output: 47 
請盡可能嘗試使用 Vector 物件 API,因為其執行速度較快。

2014年11月26日 星期三

連接池(Connection Pool)介紹

對於資料庫的概念實在很不熟,還在想pool是甚麼,游泳池嗎.....
轉貼下 寫的介紹

Connection Pool Introduction

Connection Pool(連線池) 是一種資料庫連線管理的機制,它介於應用程式與資料庫之間;
集中管理資料庫的連線,能有效提升應用程式存取資料庫的效能及減少連線的錯誤。
為什麼要有Connection Pool呢?
如圖一,一般沒有使用Connection Pool的程式,當需要存取資料庫時,
便要建立一個直接與DB相連的連線(Physical Connection)。
圖一 Application_without_ConnectionPool
此做法比較不好的地方在於:
1.資料庫連線的建立成本是昂貴的,故當有許多Thread都需要建立connection時,
其資源的耗費是龐大的。
2. 一個成本昂貴的connection在程式使用完後,馬上就被Close掉,在使用上並沒有達到效益極大化。
3. 程式中請求建立的總連線數可能超過DB允許的連線數而發生Exception。
4. 程式中關於connection的使用若有不恰當的地方,如Statement或Connection沒有close,
並沒有額外的機制提供保護。
當然目標若只是建立小型的AP,可預期的連線數也不多時;其實是不需要Connection Pool的。
而若目標是建立能處理同時間大量連線請求的AP時,Connection Pool就是不可或缺的機制了。
AP中加入Connection Pool後,其運行機制如圖二所示。程式啟動時,
Connection Pool會先跟DB建立好連線(連線數可設定),並且keep住這些連線;
當程式需要使用Connection時,pool便會將手上可用的Connection借給程式,
程式使用完後再歸還給Pool即可。
圖二 Application_with_ConnectionPool

使用Connection Pool的好處有:
1. Pool會keep住與DB的連線。程式需要使用時跟pool要即可。
不用再重複地跟DB建立連線然後又釋放掉。
2. 可設定與DB最大的連線數,避免超過DB所能負擔的連線數。
3. Pool可幫忙驗證Connectin是否還正常,若不正常時,便再與DB建立好的正常連線,

確保程式取得的Connection都是正常可使用的。
4. 額外功能的提供。如幫忙檢查Connection State或幫忙關閉Statement等。
不同的Connection Pool其額外提供的功能當然也會有所不同。

在node.js裡使用node-mysql middleware 的基本query用法

node-mysql 下載及使用。 初始設定
var mysql      = require('mysql');
var DATABASE = 'xpec';
var TABLE ='member';

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'aaa',
  password : 'xpec',
  database : 'xpec'
});
基本查詢表格印出表格內容
//connection.query()已經建立連建,不用再寫connection.connect()
connection.query('SELECT * FROM ' + TABLE, function(err, results){
      if(err) throw err;
      console.log(results);
});
connection.end(); //結束連線
table插入資料
connection.query('INSERT INTO ' + TABLE +' SET ? ',{User: 'jjjj', Psd:'123'},function(err, result){
  console.log(result.insertId);
});
connection.end();
修改update table資料
connection.query('UPDATE ' + TABLE + ' SET ' + 
'Psd=? WHERE id=?',['45645646',1],function (err,result){
  if(err){
    console.log(err);
  }else{
    console.log(result.affectedRows);
  }
});
刪除table資料
connection.query('DELETE FROM ' + TABLE +
 ' WHERE id = ? ',[3] ,function(err, result){
  if(err){
    console.log(err);
  }else{
  console.log(result.affectedRows);
  }
});