2013年12月10日 星期二

[翻譯] 七個可以幫助你的生存技巧


  1. 在緊要關頭時需要光源又怕蠟燭被吹熄 ? 拿一個汽水罐割開側邊,向外折開然後將蠟燭放置其中。這可以反射光源並且對蠟燭提供一些保護。
  2. 如果你在一個沒有乾淨水源的地方,拿一塊布跟兩個容器,將髒水放在一個容器中,然後用布連接髒水容器與空容器,過陣子候你就可以有經過過濾後乾淨的水了,但記得要煮沸。(髒水容器放高點效率會比較好)
  3. 想花最少的力氣做出烹飪的火源嗎 ? 拿一個空蛋盒,把木炭放進去,闔上他,點燃一個角落,然後開始使用。
  4. 如果蚊子越咬越兇,可以用常見的家用植物來輕鬆擊退它們。既然你已經生火起來了,將羅勒或迷迭香灑進炭裡,蚊蟲會受不了而遠離這裡。
  5. 用太陽來微波如何 ?拿一個盒子切出一個框,將其內裡與頂蓋包上錫箔,然後把食物放置其中,面向陽光,給他一些時間。你現在可以享用太陽能炙烤的起司三明治。
  6. 需要找到正確的方向回家 ? 拿一個小金屬條,像是針,然後跟你的衣服摩擦數次,將它放上漂浮於水上的葉子,針將會指向北方。
  7. 最後,緊急油燈。拿一塊布揉成一條,拿一個汽水罐倒入約半滿的橄欖油,將布條放入罐中然後點火,你就有一個可以持續數小時的臨時油燈。

2013年11月15日 星期五

[node.js] express.js add ip / path filter middleware

前陣子因為有一個不同目錄限制不同IP可以連線的需求,所以研究了一下寫出這個小功能來,在這邊分享一下,因為沒啥空就懶得寫英文版了,希望老外看得懂。

基本上就是做到可以指定多個目錄分別對多個IP做到限制連線的功能,如何設定多目錄可以看config.js那段
寫得不複雜,也還沒加上sub mask 或是 192.168.1.* 之類的功能,等有需要再加吧

middleware\ipFilter.js

var config = require('../config');
var enabled = true;

module.exports = function(onoff) {
    enabled = (onoff == 'on') ? true : false;
    var IParr = config.IPFilter;
    return function(req, res, next) {
        if(enabled && IParr.length>0){
            for(var index in IParr){
                var inArea = false;
                for(var pa in IParr[index].path){
                    inArea = (req.path.indexOf(IParr[index].path[pa])>-1)?true:inArea;
                }
                if(inArea) {
                    if (IParr[index].ip.indexOf(req.connection.remoteAddress) == -1) {
                        console.log('Banned IP from '+req.connection.remoteAddress);
                        res.end('Banned');
                    }
                }
            }
            next();
        }else{
            next();
        }
    };
};

where you setting Express.js

var express = require('express');
var ipfilter = require('./middleware/ipFilter.js');
var app = express();
app.use(ipfilter('on'));


config.js

exports.IPFilter =[
    {
        path:['/static/admin/','home/statistic/'],
        ip:['127.0.0.1','192.168.1.110','123.123.123.123']
    },
    {
        path:['/job/'],
        ip:['1.1.1.1','127.0.0.1','192.168.11.1']
    }
];

懶得打字,收工。

忘記寫了,我是參考這篇"How to Write Middleware for Connect / Express.js"的

2013年11月10日 星期日

柯文哲影片蒐集,更新至2013/12/21

KP

update to 2013/12/21


最近開始對柯文哲醫生有興趣,看了不少他的言論之後,發現柯文哲真的聰慧、獨特、真誠、充滿熱情,台灣真的需要有這種有能力的人來為台灣做點好事,就如他在新聞看透透內說的"改變台灣,從首都開始",我相當希望這個人可以上到可以做事的位子,改變台灣的社會,所以我想蒐集一些我找到的影片,讓大家更認識柯文哲醫生。

影片順序,我覺得在TED的演講很有意思,可以先看,剩下的按照時間順序排列放。

2013/09/28
[TEDxTaipei 2013] 生死的智慧




2013年11月4日 星期一

[MongoDB] 用aggregate做到大部分Select功能

在MongoDB中,要做到像之前SQL中一樣的查詢,簡單的還可以,複雜的可能就比較要花時間了,研究了一下後,找到MongoDB內有Aggregation Framework可以做到很多想用的操作,SQL to Aggregation Mapping Chart這篇文章中有很多範例了,基本上SQL中的WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, SUM, COUNT等操作,用aggregate都有方法代替,文章中已經有很多範例了,我再多寫幾個有用到的例子,這樣大部分別太複雜的查詢應該都足夠涵蓋了。

SQL
Mongo
SELECT MAX(price) AS 'max', 
       AVG(price) AS 'avg', 
       MIN(price) AS 'min' 
FROM dbo.orders
WHERE ord_date>='2013/10/1' 
      AND ord_date<'2013/11/1'
db.orders.aggregate([
  {$match: { ord_date:{  
    $gte:new Date('2013/10/1'),  
    $lt:new Date('2013/11/1')}}},
  {$group: { _id:null,
    max:{$max:'$price'},
    avg:{$avg:'$price'},
    min:{$min:'$price'}}}
])
SELECT TOP 20 
       cust_id, 
       status, 
       count(1) AS 'count' 
FROM dbo.orders
WHERE ord_date>='2013/10/1' 
      AND ord_date<'2013/11/1'
GROUP BY cust_id, status
ORDER BY 'count' DESC
db.orders.aggregate([
  {$match:{act:act,
    ord_date:{$gte:new Date('2013/10/1'),
      $lt:new Date('2013/11/1')}}},
  {$group:{
    _id:{cust_id:'$cust_id',
      status:'$status'},
    count:{$sum:1}}},
  {$sort:{count:-1}},
  {$limit:20}
])

SELECT status AS '_id', 
       sum(price) AS 'total' 
FROM dbo.orders
WHERE ord_date>='2013/10/1' 
      AND ord_date<'2013/11/1'
GROUP BY status
db.orders.aggregate([
  {$match: {
    ord_date:{$gte:new Date('2013/10/1'),
    $lt:new Date('2013/11/1')}}},
  {$group: {_id: '$status', 
    total: {$sum: '$price'}}}
])


其他範例在MongoDB的官方文件範例上都差不多有,我就不重複了,至於要用Join的方式我還沒試過,而更複雜的查詢就要用MapReduce了。

2013年11月1日 星期五

Mongoose ERROR : connection closed due to parseError

老實說我不太喜歡使用很多packages/plugins,有時候方便是方便,但是常常會帶來莫名的限制與找不出來原因的錯誤,或是要花不少時間去debug,通常一定會遇到的就是不敢升級....有些東西還是自己開發來的穩當,公司的技術還是要掌握在自己手中比較穩。

不過anyway,入境隨俗,既然我也不能決定,就只好用了,這次遇到是node.js的MongoDB套件"Mongoose"出的錯誤,就不提為何要用Mongoose來把原本schema-free的mongoDB搞回要schema了 -_-

錯誤是長這樣的
connection closed due to parseError

老實說,這錯誤訊息是很難看懂的,瞎試也很花時間,所以研究了一下,找到了下面這個地方。

mongoose error

在node_modules資料夾中搜尋"mongoReply.parseBody"。
Search "mongoReply.parseBody" in node_modules folder.


mongoose error help

將錯誤印出來幫助除錯。
console.log the err to help debug.

收工,終於有比較清楚的錯誤訊息了。

2013年10月16日 星期三

[Facebook] Tracking social plugin like button callback

>
system start up....
↑ Here is the Status Bar ↑

If you using Facebook Social Plugin , you can like and comment on each page , but you can't calculate how many like, comment, unlike, comment-delete happed on the webpage if you only using Social Plugin , so we need to add something to tracking those events.

如果你有再用Facebook Social Plugin , 你可以在每個頁面上按讚、留言,但是只用Socail Plugin並沒辦法計算有多少讚、留言產生或是取消,所以我們需要加點東西來追蹤這些事件。

Facebook Javascript SDK has a feature called FB.Event.subscribe https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/ , it can "Attaches an handler to an event and invokes your callback when the event fires." , then we can get that we need.

Facebook Javascript SDK 有個功能叫做 FB.Event.subscribe ,它可以在事件上掛上handler,然後在事件觸發時 callback ,然後我們就可以取得我們要想的東西了。

2013年10月14日 星期一

[node.js] mongodb $inc update using mongoose example

最近在mongoose上卡了不少時間,所以解決之後來寫篇文章記錄一下。

卡的這個指令是$inc , 我是要拿來做counter使用的,看了MongoDB>的說明感覺應該是很簡單的,但是搬到mongoose上就感覺鬼打牆一樣,試了好久才知道怎麼弄,下面就是我的sample code.
'use strict';

var mongoose = require('mongoose');
var conn = mongoose.createConnection('mongodb://127.0.0.1:27017/CounterTest');
var CounterSchema = new mongoose.Schema({
  itemId : String,
  like : Number,
  share : Number,
  comment : Number
});

var Counter = conn.model('Counter', CounterSchema);
Counter.update({ itemId : 'test'}, { $inc: { like : 1 }},{ upsert: true }, function(err){
 if(err){
  console.log('update failed');
  process.exit(1);
 }
 else{
  console.log('update success');
  process.exit(0);
 }
});

要注意的地方有兩個,一個是MODEL.update,一個是options要有{ upsert: true },這樣才能在沒有那筆資料時自動insert進去。

大概就是這樣,對node.js還有這些鬼套件都還很不熟,習慣中。


參考資料:
MongoDB $inc
Mongoose Model.update

2013年10月10日 星期四

[十月十日,天下為公] 會前場地紀錄

01

公民 1985 行動聯盟於國慶日要舉行的"十月十日,天下為「公」"活動,申請的路權在立法院前,濟南路一段這邊,因為我有報名參加這次活動的志工,所以在前一天晚上(其實是當天凌晨)就先去看看場地。

下面其實沒多少內容,就是簡單的紀錄而已。

2013年10月2日 星期三

HTML5 Geolocation 試用



簡單的網頁取得地理位置試用,因為真的很簡單所以就先不貼code了,反正js自己看就有




參考網頁
HTML5 Geolocation
Google Maps JavaScript API v3

2013年9月30日 星期一

Node.js 初試

最近工作上開始要用到Node.js,開始研究之後,就想測測看Node.js跟我熟悉的C#差別在哪,於是隨便找了個Fibonacci數列來測試,程式大概是長的類似這樣。
var fib = function (n) {
 if(n==0) return 0;
 if(n==1) return 1;
 return fib(n-1)+fib(n-2);
}

於是各用C#與Node.js寫了測試程式,長得像下面這樣。
node_02

2013年9月24日 星期二

[LOL] lolesports.com 疑似遭hack ? (已正常)

hacked_01

今天回家,正想看LOL S3 八強賽的VOD,結果發現ESET跳出警告,看了看好像是lolesports的icon被掛了script injection ?

hacked_02

我把這個favicon.ico丟上virustotal掃完之後,結果只有ESET-NOD32掃出的結果是HTML/ScrInject.B.Gen,不曉得是不是誤判,但是我翻出八月的na.lolesport.com的favicon.ico,確實是長得跟ESET說有毒的不一樣,所以也不是沒有可能有問題,只好跟大家說小心了。

btw看了一下lol論壇,也有人發現了同樣的問題(Virus on LoLesports.com?),加上之前NA/EU的db被hack,還是請大家自求多福吧XDDDD

PS:早上我還沒有看到有問題,晚上ESET才發現有掛馬的,所以感覺可能性不低。

Update:2013/09/25 凌晨ESET更新病毒碼後,重新上去看,已經沒事了,看起很有可能是假警報。

2013年9月16日 星期一

Swiss Tech Utili-Key 6-In-1 六用工具鑰匙

CYMERA_20130906_174414
前陣子在網路上看到這個Swiss Tech出的Utili-Key 6-In-1工具鑰匙,感覺是個相當方便的東西,看看價錢也不貴又是終生保固,就買了回來,試了一下,算蠻實用的東西,而且大小就跟鑰匙一樣而已,重量才0.5盎司(14克),多帶一隻完全沒有感覺,所以雖然我的鑰匙圈上本來就有Keyring Size Leatherman工具鉗,我還是把這個Utili-Key掛了上去。

2013年7月9日 星期二

[js] Table add / delete column 表格新增刪除欄位

這項功能是之前在做產品比較的時候弄的,原本我想把比較做的人性化一點,後來因為有人要求要照抄,所以就做成這樣了XD

這段程式目的是要將後端產出的json塞進前端固定格式的表格,然後若json長度超過table的row就不去理他,而且要做到不限制欄位增加的數量,還有要可以刪除欄位,最後的結果就是這樣了,主要是參考這篇來寫的,然後我在jsfiddle上寫了範例,就是Alienware 14與Alienware 17的比較。

詳細內容可以看放在 jsfiddle上的範例,下面是demo

2013年6月28日 星期五

Motorola Talkabout MS350 Series Radio channel frequencies

Motorola Talkabout MS350 Series Radio channel frequencies
ChannelFrequency‎TypeChannelFrequency‎Type
1462.5625GMRS/FRS12467.6625FRS
2462.5825GMRS/FRS13467.6825FRS
3462.6125GMRS/FRS14467.7125FRS
4462.6325GMRS/FRS15462.5500GMRS
5462.6625GMRS/FRS16462.5750GMRS
6462.6825GMRS/FRS17462.6000GMRS
7462.7125GMRS/FRS18462.6250GMRS
8467.5625FRS19462.6500GMRS
9467.5825FRS20462.6750GMRS
10467.6125FRS21462.7000GMRS
11467.6325FRS22462.7250GMRS

for Motorola Talkabout MS350, MS355, MS356 ...etc

2013年6月23日 星期日

Moon 2013/06/23

moon_20130623

聽說今天有超級月亮(怎麼最近一直超級月亮 ?),雖然台北下大雨,還是找了機會拍了一下

感覺也沒比較大就是....

2013年6月1日 星期六

[Facebook] FQL Demo - Facebook Query Language 測試區

Facebook Query Language (FQL) Reference



本篇文章純粹是為了報告還有測試所用,完全沒有充文章數的意圖

2013年5月27日 星期一

Moon 2013/05/26

moon_20130526

陰雨了好幾個星期,終於開始放晴,這幾天的空氣都很不錯,趁機拍了久違的月娘。

2013年5月22日 星期三

【不能戳的秘密2 國家機器】10分鐘摘要版 - 懶人包



2011年七月,李惠仁導演的紀錄片【不能戳的秘密】,踢爆政府匿禽流感疫情一事,讓大家關注起禽流感話題;七個月後,2012年三月,行政院農委會防檢局召開緊急記者會,首度承認台灣爆發高病原性H5N2禽流感;隔日,農委會防檢局長許天來請辭獲准。八月,農委會副主委王政騰、前防檢局長許天來涉隱匿禽流感疫情,遭監察院彈劾並移送公懲會,兩人各遭降二級改敘處分,而在2012年二月安然下莊的前農委會主委陳武雄則未遭監察院彈劾,他強硬表示,「在我任內到離職期間,都沒有要道歉的部分,至於離職後出現新的事證,那是另一回事。」

事件,持續發展;影片,持續拍攝,而病毒,持續蔓延…

時間到了2013年五月13日,李惠仁導演再戳農委會,隱匿禽流感疫情,他發布了禽流感疫情揭密紀錄片《不能戳的秘密》第2集:國家機器,暴露政府規避媒體監督的表現,並指控官方在2004年至2007年,至少隱匿了十多起疫情。

完整版影片可以在誠品買到實體DVD,公視也有撥出,接下來也會有巡迴撥出,可以實際面對面看影片並提問題,最後巡迴完李惠仁導演將會把完整影片放上網。

這邊先就這個10分鐘摘要版做重點懶人包

  1. 家畜衛生試驗所會議紀錄中發現隱藏19筆高病原禽流感病毒
  2. 政府(執政黨)強力為農委會護航


依影片時間序紀錄重點
  • 2012/3/4 農委會承認爆發高病原性禽流感隔天,李惠仁接到恐嚇電話,威脅生命安全
  • 防檢局接到家畜衛生試驗所檢驗出禽流感病毒後,未立即通報到世界衛生組織(OIE)
  • 行政院院長吳敦義、副院長陳冲、秘書長林益世皆不肯接受李惠仁導演訪談
  • 農委會主委陳武雄不肯出席會議,讓一個科長撐場面
  • 2012/2/1 防檢局長許天來表示疫情要等老闆下台再做決議
  • 2012/2/6 剛卸任的農委會主委陳武雄,面對李惠仁導演提問,表示「我不回答你任何問題」
  • 2012/10/18 國民黨立院黨團書記長吳育昇發出甲級動員令,全力為農委會護航
  • 2012/10/15 國民黨禽流感調查報告一小時即產出,並且與隔天防檢局的檢討報告幾乎一模一樣
  • 國民黨禽流感調查報告提出「李惠仁條款」,回頭檢討李惠仁
  • 最終在國民黨強力護航下,禽流感調查報告與爭議無疾而終
  • 2013/1/29 李惠仁導演二次申告農委會官員隱匿疫情
  • 2009/4/6 家畜衛生試驗所會議紀錄中發現隱匿的19筆H5N2病例編號
  • 高病原性禽流感病毒親緣性分析圖中:2006年宜蘭0103、2006年台中A474、2007年苗栗0207、2006年彰化A745、2006年台南A494、2006年屏東0102、2005年彰化1203、2007年台南0403、2007年彰化0104、2007年彰化0107、2007年彰化0205,皆與農委會副主委王政騰台南友人養雞場分離出來的2009台南0301禽流感病毒一樣,為高病原病毒




最後附上19筆藏在會議記錄中的H5N2高病原病毒病例編號,資料來源是公視新聞議題中心的【不能戳的秘密】李惠仁再戳農委會 隱匿禽流感疫情報導

2013年5月13日 星期一

Get Youtube / Vimeo 's video ID

前幾天為了一個功能,在研究如何取出youtube的ID,然後取得他的影片縮圖,取得影片縮圖的地方很簡單,youtube有固定格式,只要把id塞進去就好,而取得id的部分,找了一陣子,試了不少方式才整合出下面這個方式。
function parseVideoURL(url) {
    var retVal = {};
    if (url.match(/(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|[a-zA-Z0-9_\-]+\?v=)([^#\&\?\n<>\'\"]*)/)) {
        retVal.provider = "youtube";
        retVal.id = RegExp.$2;
    } else if (url.match(/vimeo.com\/(\d+)/)) {
        retVal.provider = "vimeo";
        retVal.id = RegExp.$1;
    }
    return (retVal);
}
主要是可以從影片的Url辨認這是 Youtube 或 Vimeo 的影片,然後回傳影片來源與ID,Demo可以看這,未來如果想加別的影片來源也很簡單。

2013年5月1日 星期三

使用列舉的描述功能 Using Enum with Description

眾所皆知,在程式中遇到魔術數字是很擾人的,不但降低可讀性,除錯時也增加困擾,所以通常是建議使用一些增加可讀性的方式去取代,例如使用列舉型別(Enumeration)去將這些魔術數字轉變成比較好讀的形式,但是列舉預設只能塞int,雖然可以直接把列舉名稱toString拿來用,但是如果要有特殊符號(如空白)就沒辦法了。
public enum Country
{
    Afghanistan,
    Albania,
    Algeria,
    Andorra,
    Angola,
    AntiguaAndBarbuda,//Antigua and Barbuda
    Argentina
}

在這時候,我們可以利用Description的屬性去把我們想要的資訊塞進去。

2013年4月29日 星期一

Twitch 公司的福利

twitch
photo from ShootMania

之前寫了 twitterdropbox 的公司福利,原本要繼續寫其他公司的,後來因為比較沒空所以還沒寫,結果有人點播要寫 Twitch 這家出名的網路直播服務公司,於是就來開工了。

2013年4月20日 星期六

華光殘影

2013-04-20 17.13.16

今日趁著華光社區尚未拆掉去給財團賺錢,與同學去吃廖家牛肉麵,走著走著,邊聊邊感嘆,看看這些老房子,看看金華街上滿街的老樹,在未來可能就會消逝無蹤。台灣只知道拆,只知道圖利財團,而不知道怎麼保存,未來的台灣還會是台灣嗎 ? 我不知道...

如同拷秋勤的《北城講古》這首歌所說的一樣,「(台語) 啥物時陣開始,開始尋無古早味;老城門換頭改面,失去了意義;舊車頭毀毀去,新起嘛無咖sui;進步兮城市,毋倘給過去放未記 」。因為華光社區這塊地的地價夠高,所以以前那些歷史因素也都不需要管了,以前答應的安置也都可以當作沒說過,反正先BOT給財團,之後再用各種手段弄掉土地上這些人跟房子,就可以賺大錢了,可賀可喜。

2013年4月16日 星期二

設定工作階段逾時 Configure Session Time-out (IIS 7)

timeout
今天友人 M 氏問我了一個關於IIS設定的問題,他要設定IIS上的session timeout,但是參考了technet上的教學"設定工作階段逾時 (IIS 7)"卻失敗,因為他主要對php比較熟,所以就來問我了...

2013年4月15日 星期一

twitter 公司的福利

jobs-benefits

之前寫了一篇DropBox 公司的福利,沒想到還蠻多人看的,所以這次就來翻譯一下twitter這間社群網站公司的福利吧。

Benefits & perks 福利與津貼


  • 完整的醫療與牙科保險
  • 靈活且慷慨的休假政策
  • 在舊金山辦公室提供每日的早餐與午餐
  • 401K 儲蓄計畫
  • 帶薪的產假與陪產假
  • 健身房會費報銷
  • 每周在公司有瑜珈與彼拉提斯(pilates)課程
  • 通勤方案
  • 洗衣與乾洗服務
  • Zipcar(洗車服務)折扣
  • 無線網路折扣


感覺上好像沒有 DropBox 寫的那麼活潑,不過還是相當不錯的!!


本篇圖片與資料來源都來自 twitter-Benefits & Perks

2013年4月12日 星期五

單位換算機 Unit Converter

unitconvert

前幾天晚上與同學聊天,在繳錢的時候提到這些錢可以換成幾個核四,用google計算機算了之後,發現因為小數點後面的0太多,所以就變成 2.00909091e-9 這樣的顯示方式,有點難以閱讀,於是產生了研究的動機,大概抽了兩天的閒暇時間後,做出來這個單位換算機 Unit Converter,因為剛弄好,所以可能還有點問題,可轉換單位也不多,若對這個單位換算功能有任何意見的話,請麻煩告知我,我會盡力去處理的。

2013年4月8日 星期一

[JS] 依 iframe 內容動態調整高度

Dynamically adjust iFrame height

在公司的網站上發現了一個 js 的小 bug,這個頁面內鑲了 iframe ,但是因為 iframe 內的資料來源不一,所以頁面長度也必須跟著調整,原本的寫法是每兩秒去檢查iframe高度然後調整,但是在某些瀏覽器上會有問題,我後來想了一下,決定改成去抓iframe load event來調整高度,試過之後,code更簡潔,效果看來也更好,跨瀏覽器測試目前也沒問題,所以就先改成這樣用了,如果未來有問題再來調整。

code大致如下
document.getElementById('myframe').onload = function() {
        var ih = document.getElementById('myframe').contentWindow.document.body.scrollHeight;
        $('#myframe').css('height', (ih+50) + "px");
    };

myframe就是那個 iframe 的名稱,我是多加了50px以求美觀,要怎麼運用可以再看個人需求去修改了。

____Update____

結果我很快又回來了,前面那份code因為只會在iframe第一次載入完成時才做動,所以若iframe裡面點連結然後高度改變,就沒辦法再次更新高度,於是我又研究了一下,找出這個改法,將resize事件註冊進每次iframe更新後做動,這樣應該就可以解掉大部分可預見的狀況了,然後也順便改成不需要jquery就可以跑。
var iframe = document.getElementById('myframe');
    function resize() {
        var ih = iframe.contentWindow.document.body.offsetHeight;
  iframe.style.height = (ih +30) +"px";
    }
    
    if (iframe.attachEvent) iframe.attachEvent('onload', resize);
    else iframe.addEventListener('load', resize, false);

因為偷懶我只在chrome , firefox , opera , ie10 上測過,我想大致應該是沒問題了。

2013年3月14日 星期四

DropBox 公司的福利

dropbox
picture from techfaster

最近雲端儲存市場,多出了Copy這家來跟DropBox搶生意,正在看的時候,發現DropBox的工作機會裡,福利與津貼那塊寫得相當有趣,於是想說翻一下供大家參考,反正很短XD

前面的介紹、願景啥的我就跳過了

Benefits & perks 福利與津貼

  • 可以自己設定自己DropBox的容量
  • 免費的早、午、晚餐,還有吃不完的點心與飲料
  • 辦公室對面就是舊金山巨人隊的球場
  • 真正的彈性工時
  • 18天的帶薪休假與11個帶薪節日
  • 如果你生病了,只管待在家讓病好起來
  • 健身房與通勤補助,在舊金山有DropBox專用交通車可搭
  • 401K(美國的退休福利計畫)
  • 視力、牙齒、生活與健康的保險
  • 參加樂團!!練團室有完整的設備,包含鼓、音控與放大器(AMP)等
  • 威士忌星期五
  • 遊戲!!星海爭霸、專用的遊戲室、DDR跳舞機(是的,真的機器)、乒乓球、競技場,還有更多

台灣的高科技公司,學學吧XD

2013年3月6日 星期三

[python] md5 與數字 hash

python新手上路,寫點東西記錄一下以免自己忘記。

這次剛好有個需求是需要給金流一個流水號,但是由於cassandra設計上沒辦法像mssql有@@IDENTITY這種方便的取識別值方式,所以只好自己想辦法了,原本想說要找zookeeper或是snowflake這些分散式系統取流水號的方式,但是因為時間因素沒辦法研究這些東西,只好先想個方法硬上。

由於spec上的規格是九位的數字,所以研究了一下,決定將key值拿來md5後的hash轉成int,再取九碼出來(原本會是大約38~40位的數字),原則上在短時間內是不會遇到重複的情況,然後只要每次產生數字hash後,先確認cassandra內有沒有這個number hash,沒有的話再使用,有的話就重生一個;由於理論上這個number hash會發生一次重複的時間應該遠比cassandra最終同步的時間來的長,所以會遇到丟出重複流水號的機會可說是微乎其微,在有更好的解法之前這個方式應該可以加減用。

語法很簡單,大概就是這樣
import hashlib
def md5(istr):
    return hashlib.md5(istr).hexdigest()

def randNum(istr):
    return str(int(md5(istr),16))[:9]
print md5('test')
//098f6bcd4621d373cade4e832627b4f6
print randNum('test')
//1270773689

跑起來結果就是這樣,不過下圖測試時我是取十位XD

Python_hash

小小記錄一下心得。

update一下,如果要取一個不到20位的數字,可以使用這個方式,str(uuid.uuid4().get_time())會回傳一個約19位的數字字串,我不曉得他會不會長到20,不過看來是可以用的,而且又不是亂數,剛好符合另一個需求,可賀可喜。

a=uuid.uuid4()
print(a)
//38015b71-d95a-4bd4-a1d2-f1d30bb165d2
print str(a.get_time())[:20]
//852545210989763441

2013年3月1日 星期五

Python on Visual Studio

Python for VS

最近換了新公司,主要需要用Python開發,所以需要將開發環境建起來,之前寫C#,IDE一直是用Visual Studio,但是Python要用什麼呢 ? 因為我記性不好,指令背不起來,所以蠻需要開發工具的intellisense協助,在網路上找了一下大家的推薦,Python IDE@wikipediaWhat IDE to use for Python? 這兩個連結內都介紹了不少,我同事分別是用 vim 與 PyCharm 來開發,原本我也打算用PyCharm,後來發現要錢,所以最後決定用這個 Python Tools for Visual Studio ,我安裝的時候是1.5版。

2013年2月27日 星期三

Nite-Ize Inka Pen

Untitled

在EDC包包內我有放一本小筆記本跟一枝筆,但是因為是隨便拿的一支筆,不怎麼耐操,在包包裡面放了一陣子後,就被壓得散掉了,後來看到國外網站有介紹這枝筆 Inka Pen (印加筆?),平時攜帶很小一隻,只有八公分,而且可以隨手抽出隨手寫,若要寫多的話,也可以展開到12.7公分的長度,方便寫作,算是還不錯的設計,所以就買來玩了。

2013年2月7日 星期四

Format C: 格式化C槽

format1

今天有同學聊到他電腦會跑出奇怪的廣告,問解決之道,我看已經有同學正經的回了,所以我就說「c:\format c:」,因為我記得一般來說這樣是沒辦法直接執行下去的(以前試過),但是許久沒試過了,不曉得是不是還是一樣,為了避免有人發生意外,所以我還是自己來試試看。

2013年2月5日 星期二

[東區] 樂樂咖啡 Cafe LakuLaku 大安店

樂樂咖啡 大安店

前陣子在Facebook上看到樂樂咖啡的粉絲團貼出了大安店的消息,那時候我還以為是搬家XD,後來查了一下才發現是開了分店,真是厲害!! 於是就找時間過來看看了。

樂樂咖啡 Cafe LakuLaku 大安店
地址 : 台北市大安區大安路一段19巷16號
電話 : (02)2771-5108
營業時間 : 1300~2200

2013年1月31日 星期四

[長知識] 瑞典鹽醃鯡魚 Surströmming - 世上最臭的食物

Surströmming
picture from Sampling Sweden’s Traditional Surströmming
晚上的時候我常常亂逛,偶而也會看到些神奇的知識,這次發現的是這個瑞典傳統美食-鹽醃鯡魚 Surströmming,會看到這個東西,是因為正在看有個論壇討論攜帶式口糧,討論到各國無法被接受的食物,後來有人舉出了日本的一個測試數據,舉出了各種奇臭無比的食物,還有數據表示臭度,相當有趣。


最臭食物排行
picture from 図録▽臭い食べ物ランキング
這就是日本所測量的臭度表,其中最威猛的就是這個Surströmming了,臭度高達8070Au!! 舉其他例子,臭鞋的味道大約是120Au,臭豆腐(很臭的那種)的味道是420Au,這樣應該可以想像一下Surströmming臭的程度了。

鹽醃鯡魚Surströmming是有其歷史、位置因素所在,早期中古世紀時,教徒在復活節前的大齋期(40天或更長)是禁止吃肉的(但是可以吃魚),所以附近的北海盛產的鯡魚就是當時重要的蛋白質來源,當時的保鮮技術與交通運輸尚不發達,所以才發展出鹽醃的技術,用以將鯡魚送至歐陸各地,而這個傳統食物至今還是有人不少人會去食用,目前的鹽醃鮭魚罐頭是直接將未處理過的生魚抹鹽折半放入罐頭中,由於未經過加熱消毒處理,所以鯡魚會在罐頭內發酵,由於發酵時會產生氣體,所以常常罐頭都會膨脹起來,在室溫打開時因為壓力的關係也很容易噴出液體,因此許多人在打開罐頭時,除了因為惡臭選擇在室外,也會選擇在水中開罐,避免被噴到汁液讓衣物報銷(據說是洗不掉哪種味道),至於食用方式,在不同地區會有不同的配合食物,下面貼段食用的影片。



這是有配上其他食物,而且除去內臟只剩魚肉配東西來吃,這時候就變成看起來還蠻正常的食物了。

但是下面這個Food For Louis的影片就不一樣了...


他是直接連內臟吃掉半隻魚.....看他吃下去整個臉色都白了,還強忍著不吐,就知道這應該相當痛苦XD

總之,又長了些知識,感謝資訊發達的網了。

2013年1月2日 星期三

如何無密碼移除OfficeScan

uninstall officescan

先前去客戶那邊被安裝了OfficeScan,最近沒需要過去想把他移除,卻因為移除OfficeScan需要輸入密碼而擋在哪邊,要請客戶再問他們mis可能又要花上兩三天時間,所以只好自救了。網路上看到的改register方式試了沒用,還好後來找到了一個很有趣的方式,直接修改移除密碼成我要的,然後就可以移除了,下面簡單分享一下。

步驟如下:
1.找到 OFCSCAN.INI 這個檔案,大約的位置會在 C:\Program Files\Trend Micro\OfficeScan Client\ 下面
2.打開 OFCSCAN.INI ,找到 Uninstall_Pwd= 這行,整行的資訊大概會長的像這樣(我亂打的)
Uninstall_Pwd=!CRYPT!F73A42AA7DE03AA2EE31291C86D856DE0BF96215B6EB9B7E5
3.找一個MD5產生的網站(google md5 generator就有),將你要用來移除的密碼打進去,取得MD5值
我輸入的是abc,得到的會是
md5("abc") = "900150983cd24fb0d6963f7d28e17f72"
4.將第二步找到的那行,改成 Uninstall_Pwd=!CRYPT!111 後面加上你剛剛拿到的MD5,像我就會變成
Uninstall_Pwd=!CRYPT!111900150983cd24fb0d6963f7d28e17f72
5.存檔,然後移除OfficeScan的時候輸入你剛剛打的password就可以通過了。

自救成功,可賀可喜。