2012年9月6日 星期四

Manufacturing ISM Report On Business® PMI at 49.6%

Link: http://www.ism.ws/ismreport/mfgrob.cfm


Summary:
  • WHAT RESPONDENTS ARE SAYING ...
    • slow 說了五次
    • holding onto their money 現金為王
  • OVERALL ECONOMY 
    • Direction: growing (49.6 > 42.6)(O)
    • Rate of change: slower
    • Trend: 39 months
  • But manufacturing sector
    • Direction: contracting (49.6 < 50)(X)
    • Rate of change: faster
    • Trend: 3 months
  • PMI 
    • A reading above 50 percent indicates that the manufacturing economy is generally expanding; below 50 percent indicates that it is generally contracting.
    • A PMI™ in excess of 42.6 percent, over a period of time, generally indicates an expansion of the overall economy.
  • New orders
    • A New Orders Index above 52.3 percent, over time, is generally consistent with an increase in the Census Bureau's series on manufacturing orders. 
  • Production
    • An index above 51.2 percent, over time, is generally consistent with an increase in the Federal Reserve Board's Industrial Production figures.
  • Employment
    • An Employment Index above 50.5 percent, over time, is generally consistent with an increase in the Bureau of Labor Statistics (BLS) data on manufacturing employment.
  • Supplier Deliveries
    • A reading above 50 percent indicates slower deliveries.
  • Inventories
    • An Inventories Index greater than 42.8 percent, over time, is generally consistent with expansion in the Bureau of Economic Analysis' (BEA) figures on overall manufacturing inventories.
  • Customers' Inventories
    • A reading below 50 percent indicates customers' inventories are considered too low.
  • Price
    • A Prices Index above 49.4 percent, over time, is generally consistent with an increase in the Bureau of Labor Statistics (BLS) Index of Manufacturers Prices.
    • 變化頗快
  • The next Manufacturing ISM Report On Business® featuring the September 2012 data will be released at 10:00 a.m. (ET) on Monday, October 1, 2012.
    • 已經寫入 Python script,下個月只剩 Conference Board Consumer Confidence Index 還不知道 next released date。

2012年9月5日 星期三

《1Q84》BOOK3

《1Q84》BOOK1~2 大張旗鼓鋪陳,BOOK3 瞬間軟掉。

村上春樹需要平反,把話交代清楚,《1Q85》勢在必行,小根並不期待最後結局,但過程至少有趣一點。感謝小君慷慨相借《1Q84》BOOK3,還好沒花錢買。

小蜜桃記事之四


晚上八點,味味狗早已出門上班,醫院晚班六點開始,得提早出門才行,做滿六小時才能下班,也就是半夜十二點。理論上如此,實際上護理師人力長期不足,經常超時上班、休假也不正常,醫院越蓋越大,病患越來越多,護士卻越來越少。醫院高層頗為困擾,加薪仍無法阻止人力流失。

小蜜桃回家之後,整間公寓只剩她和小佳宜,睡到爛醉的小佳宜,半夜醒來,說不定小佳宜能跟味味狗打到照面。小蜜桃希望味味狗別再接到黑道急診病人,失控的醫院、失控的關係,醫生不再高高在上,護士也非白衣天使,很現實,醫好天經地義,醫不好準備被告到死。許多醫生蠟燭兩頭燒,醫院法院兩邊跑,如此醫療品質,我們都推了一把。小蜜桃祈禱剛才看手的是好醫生,不是壞醫生。

奈奈呢?

可能在忙吧!這未免也太忙了。對了,奈奈早上好貼心,小蜜桃好喜歡奈奈,這是蕾絲邊的展開嗎?當然不是,只是單純朋友喜歡,或許吧。想到這,再來回味奈奈寫的字。怪了?「那頁」怎麼不見了,「這頁」卻出現了。

「米克思巷」回來了。

也許工作太累,但處女座女孩特別龜毛,不追根究抵是不行的。老娘我小蜜桃一頁頁慢慢翻,不信揪不出奈奈貼心小提醒。外表就如奈奈所說,ONE NOTE,小七集點活動贈品,中間膠裝廉價的有點脆弱,頁數也才幾百頁,不算太多,小蜜桃一頁一頁看,這是「米克思巷」,接下來就是奈奈的字吧,並沒看見,快翻完也沒看見,絕對不可能寫在最後一頁吧,記得早上翻在中間沒錯呀。

小蜜桃傻了,最後一頁真有寫字。石化了,不是奈奈的字。或許真的漏看最後一頁也說不定,但奈奈那頁的確「消失了」,絕對不是什麼幻想,奈奈用鉛筆寫下這些字,就算某人惡作劇用橡皮擦擦掉,鉛筆壓過的筆痕,肯定會留下痕跡。小蜜桃再次確認,利用檯燈反射紙面,企圖找出毫不起眼的證據,找不到。

真的。

小學考試小蜜桃常用這招作弊,預先準備隨堂測驗紙,上面擺張白紙,用力壓寫明天默寫的課文,留下隱形壓痕就夠了。國文老師特別喜歡考默寫,小蜜桃起初很討厭她,但自從同學教她這招作弊方式,她非常喜歡默寫,只要照描壓痕就夠了。與其說默寫,不如說素描。小蜜桃瞬間湧起許多小學回憶,但就找不到奈奈愛心提醒。

這加深小蜜桃不安的情緒。最後一頁寫著:

「請好好保存 CAT NOTE,不要被 NIGHT 亂寫字。米克思巷」

如果只是單純漏看最後一頁,這留言未免太「預言」,就算是預言,說的也太乾脆,至少藏個謎在裡頭,說的模模糊糊不清不楚,無論將來如何變化,總有「歪理」能夠解釋。不太像預言,倒像孔子的論語,柏拉圖的對話錄,你一句我一句彼此對話。真是如此嗎?那與我對話的是誰?小蜜桃想到的唯一可能,就是那位送我 CAT NOTE 的失主。男生,線索僅止於此。

「米克思巷」會是他名字?「米克思巷」怎樣寫 CAT NOTE?某種量子理論實驗?小蜜桃有許多問號,或許只是神智不清,工作壓力太大,得了文明病幻想症吧,還是左手脫臼引起的歇斯底里,怎麼想都太不對。世界有太多無法理解的事,CAT NOTE 就是其中之一。

小蜜桃闔上 CAT NOTE,閉眼沉澱休息,可能工作壓力太大。睜眼再翻到最後一頁。喵的,告訴我這不是幻覺,嚇不倒我的。沒錯,又多一行字:

「不信?那把我丟掉,我會自己走回來。米克思巷」

CAT NOTE 可以看穿我的心思,沒可能的。小蜜桃看著天花板發呆,自言自語說剛滿三十歲,人生還很長,小蜜桃不要住精神病院住到老死。沒錯,千萬不能張揚這件事,以免無端惹禍上身,台灣對精神病患者很不友善,眼光滿是敵意,恨不得把這些瘋子關起來,如果放出來不小心殺了人,那可不得了。或許明天可以請假看心理醫師。

以上是理性自我分析。那不是真的,小蜜桃不是瘋子。為了擺脫這一切幻想,小蜜桃特意下樓等資源回收的老伯伯,樓下附近就是你家便利商店,老伯伯晚上都會去便利商店收紙箱,恰巧 CAT NOTE 也是紙類,一起回收算了,小蜜桃拜託瘋鬼別來找她,樓上裝潢很吵,乖,去找他們玩,我是好人。

CAT NOTE 外表真不起眼,老伯伯順手丟進黑色塑膠袋,天呀,如果 CAT NOTE 是什麼東西變成的,可別怪小蜜桃太狠心,是老伯伯丟了,冤有頭債有主,別找我,找他算帳吧。小蜜桃以喵的姿態說,貓,別來找我。

小蜜桃記事之三


奈奈五點躺下,六點起床,準備出門工作。好拼命,這是有原因的。

六年前奈奈剛從私立學校設計系畢業,正巧碰到金融海嘯,工作特別難找,四處碰壁。因緣際會得知小姑賣檳榔,與友人一起合資開檳榔攤。小姑兼做直銷,原本以為從此可以大富大貴,其實直銷跟其他行業並無二致,只有金字塔頂端藍鑽高層才能吃香喝辣,大約百分之一的人有此才能,百分之一說不定還高估太多呢。

小姑直銷事業並不順利。還好家附近是台省道,貨車來來往往,倒可從事小本生意,於是跟朋友合作,一起擺檳榔攤。雖是小生意,但眉角頗多,撇開繁瑣細節不談,招攬客人就是大學問。為了吸引客人目光,年輕小妹妹仗著年紀優勢,穿著性感,某些思想邪惡的駕駛朋友,衣冠楚楚一生從沒吃過檳榔,也慕名而來前來「朝聖」,有奶便是娘,可悲可悲。奈奈小姑年過四十,但風韻猶存,或許只要稍做打扮,便能吸引客人上門消費。老哥小孩好像念設計出身,或許可以找她幫忙喔。

她就是奈奈。

奈奈正巧失業,多少賺一些外快,於是答應小姑誠懇拜託,雖然知道小姑生活困苦,可能拿不到報酬,不過親人一場,就當做善事吧。奈奈並非一股腦隨意發想亂設計,改良前輩作品也是設計。設計與抄襲,界線往往很模糊。但奈奈知道她在做什麼,絕對不是抄襲,若只是單純抄襲,那就少了個人特色,特色就是我的靈魂。

不過是檳榔西施般的衣服,有什麼好設計的?但奈奈不這麼看,這是她的直覺,一定有什麼可以再改進的。總之,萬丈高樓平步起,先來參考前輩設計的衣服吧。其實沒啥好研究的,就賣肉賣性感。為了更了解衣服,奈奈假裝檳榔妹,想穿暴露一點吸引客人,問店家這些衣服在哪裡買的到。檳榔妹好心告訴奈奈,並且好心提醒碰到變態客人該怎麼辦,裡面可以穿什麼安全褲之類事項,全部交代給她。「說不定我能賣檳榔喔?」奈奈想到哪裡去了,真糟糕。

買到衣服後,奈奈仔細研究剪裁,普通,單一尺寸。用手搓揉布料,糟透了,越南進口的布料也沒那麼粗糙,可能是中國進口的吧,不曉得,希望不是假布,聽說中國全部都是假的。總之布料成本非常低,居然敢賣我那麼貴,真是太誇張了,如果換台灣布料來做,質感肯定不錯,縫線也不易脫落。改良之後的衣服,一樣賣肉賣性感,但賣得更有質感,布料採台灣製造,沒多餘染劑,皮膚也不易過敏。這非「高尚」設計,難登大雅之堂,但至少是「台式」設計。

為了避免抄襲,奈奈略改設計,把腰線裁修更貼順,以及其他不為人足道的小細節,總算完成紙上草稿。

從紙上跳成實際設計作品,佔去奈奈不少時間,除了找布料,偶爾也有老闆邀請奈奈來面試,但與專業相距甚遠,越南紡織廠技術班長,簽約三年,沒有簽約金,與當地越南勞工住在一塊,每三個月返台一次,月薪五萬。越南是什麼地方,奈奈並不清楚。該不該去越南拼一下呢,奈奈思考很久,也不能說思考,當人碰到難以決定的事情,往往處於發呆狀態,既不橫心答應,也不輕易拒絕。之後便不了了之。

奈奈剛出社會,算是吧,就算做義工也是工。她不曉得哪裡可以買到台灣製造的布料,隨著台灣經濟起飛,勞工成本增加,許多紡織廠不堪長期勞動成本增加,紛紛遷廠到大陸或是越南繼續經營。很難買到真正的台灣製造。奈奈大學同學大鐵,紡織廠第二代,他爸很愛台灣,但實在撐不下去,決定等他畢業之後,舉家搬到大陸,繼續從事紡織製造生意。政府「產業升級」喊得震天欲響,也很願意補助,營業稅減半,聽起來頗誘人,實際上生意越來越難做,根本快沒營業額可談。這些老闆從小拼到大,經營模式早已深植在心,創新升級談何容易。偶有成功案例,賺不多,還不如到海外拼第二春比較保險,錢也能繼續流入口袋。

設計系畢業展大鐵盡出風頭,自幼接觸不少名牌精品,對設計有套自己的見解。原本在台灣已有設計公司找他入技術股,可惜老爸要他繼承家業,那也是無可奈何的事。奈奈跟大鐵感情不錯,畢業後私底下還會連絡,一個快當大老闆,一個找不到工作,這對比還真諷刺,奈奈偶而酸酸大鐵,不過奈奈設計的確不怎麼樣。

這天奈奈很苦惱找不到布料。真巧,大鐵工廠有批庫存沒處理,原本已經找到買主,沒想到買主支票跳票,沒拿到尾款,自然沒必要出最後那批貨。大鐵跟老爸知會一聲,選一天讓奈奈到工廠挑想要的貨,順水推舟做人情,反正要離開台灣,那些台灣製造又有什麼意義呢,人都不在了。

奈奈仔細選擇布料,入寶山自然不能空手而歸,回想大鐵以前作品,很多材料都是他老爸紡織廠生產出來的,這感覺一定很棒。就這樣糊里糊塗一個月過去了,小姑的檳榔西施「戰袍」總算完成了,自己頗為滿意。小姑倒是頗意外的,當初只是隨口說說,沒想到奈奈真的做出來,真不起眼,老實說還有點醜,小姑有點尷尬,又不好拒絕奈奈好意,只好勉強收下這件衣服。既然麻煩人家,那也不該糟蹋他人好意,小姑決定明天穿穿看,之後再也不穿這件衣服。

隔天一早,檳榔攤一如往常的沉默,沒客人,來的也是老主顧,他們也沒發現今天的她,跟昨天的她有何差別。女生偶爾換髮型改變心情,無趣的男生總是看不出哪裡不一樣,額頭多顆青春痘嗎,別再折磨我了。小姑昨天想的沒錯,「戰袍」很醜,吸引不到客人,還好胸口剪裁合情合理,如果太低胸,客人還以為我是暴露狂呢。

就當成普通一件衣服吧。期待帶來傷害,不期不待沒有傷害。

中午一樣沒啥客人,一如往常的沉默。好討厭這樣的台詞。唉,晚上早點收攤早點回家吧。晚上宵小猖狂,香菸絕對不能留在攤子上,整攤就是香菸最值錢,背來背去重量不算輕,比起被偷,這點苦痛並不算什麼。神奇的事發生了,當然不是香菸自燃這種不合情理的事。天色越來越晚,客人怎麼越來越多?或許老天可憐我,白天賣檳榔,晚上還要帶兩個小孩,丈夫又不爭氣,整天開計程車亂晃,也不曉得能載幾個客人,油電雙漲,計程車生意是越來越難做了。

這攤是收不起來了,客人紛紛稱讚小姑穿得很漂亮,難不成晚上視線不好,看不出美醜嗎?

不是的。那是因為「戰袍」,它發揮效果了,一種晚上才看的見的效果。

《記憶的堅持》,那是超現實主義畫家達利得意作品,客人不懂畫的含意,一點也不知。他們只知道眼前這位賣檳榔兩個小孩的媽,衣服是如此炫麗奪目,時間的洪流彷彿留過整個身體。小姑自己也嚇一跳,以奇特的眼神看著自己。

那是特別的顏料,COLOR#3,只有在昏暗的角落,才能看見那燦爛的光彩。奈奈從沒想過將 COLOR#3 染在衣服上,不如嘗試看看,失敗也沒差。圖案抄襲達利作品,為了凸顯創作元素,特意把軟鐘畫大些,這樣可不算抄襲喔,奈奈頗為得意。一般來說,冷光顏料無法表現如此複雜畫作,但 COLOR#3 卻辦的到,那是很特別的顏料。

還好昨天沒有拒絕奈奈的好意。原本打算帶回家的香菸,沒想到全部賣光,真美的戰袍,可惜相機照不起來,更別說功能陽春的照相手機,冷光光線太弱,除非曝光一小時以上,否則無法收納《記憶的堅持》。戰袍究竟有沒有露胸露大腿,根本一點也不重要。小姑沒想到事情如此發展,但小姑容易滿足,沒想太多,只希望明天客人一樣賞臉。

奈奈也很意外事情如此發展。不用說,COLOR#3 是關鍵。

大鐵臨走前給她一罐 COLOR#3,請她試試顏料,至於顏料怎麼來,大鐵口風很緊,小奈自然問不出所以然,總之,先試再說。果然不同凡響,許多檳榔攤慕名而來,想要買「冷光戰袍」,甚至有人出價三千,想買小姑身上那件戰袍,小姑當然沒有答應,三千也太廉價了吧。

說也奇怪,奈奈理應高興,但 COLOR#3 不明不白的身世,讓她高興不起來,反而徹夜輾轉難眠。大鐵再三保證顏料來源合法,更令奈奈起疑,但也說不出哪裡不對,或許是商業機密,跟可口可樂祕方一樣道理,說穿就不值錢。

時光荏苒,奈奈從不起眼的地方發跡,六年過去,沒有大成就,但也是一間公司的老闆。沒有實體店面,租不起店面只能租倉庫。經營網拍角色扮演衣服生意,偶爾接廠商小量訂單,營業額不大,但也夠他媽忙的。奈奈六年之間如何發展,俱無可觀,改天再說。

早上出門,特意收拾小蜜桃的包包,昨晚喝醉小蜜桃打翻自己包包。ONE NOTE,這是小七集點活動贈品,集二十五張才能換到的 ONE NOTE,沒想到小蜜桃也集點,真有趣。今天她八成要遲到了,偷偷留言給她,請她上班小心點,別太匆忙。

算是一點小驚喜吧。

奈奈撐著頭痛,緩緩走向戶外停車場,準備開車到桃園接洽客戶,下半年一連串的電玩、旅遊、電腦展,工作早已排到明年中,好不容易努力到現在,得加把勁才行。

2012年9月4日 星期二

小蜜桃記事之二


星期天,與星期六並無二致。小蜜桃一如往常往咖啡店移動。這天又乾燥些,她鄙視「冰」咖啡,咖啡怎麼可以是冰的?不過今天例外,除了熱,還需要冷靜,樓上該死的裝潢,給我記住。店員一邊泡冰咖啡,一邊告訴她,失主昨天晚上匆忙跑到店門口,眼睛冒火,劈頭就問筆記本,很沒禮貌。心裡不美麗,但服務業以客為尊,再怎麼不美麗,也得堆起美麗的臉,把筆記本還給失主。失主一見筆記本,心情如釋重負的開心,對失主來說,筆記本一定很重要,為什麼重要?倒也沒那麼重要,失主開心就好。店員心不甘情不願做好事,昇華過的快樂才是快樂。

對了,失主為了答謝小蜜桃,特別送她小禮物,我交給你,你自己拆開來看。是什麼呢?小蜜桃很好奇,左手脫臼不能動,仍能乾脆俐落扒光禮物包裝,如此輕鬆俐落,不禁讓人心頭一酸,這女孩那麼美麗,手卻斷了十多年,心理肯定很不好受。事實上,上星期小蜜桃騎著小綿羊,從台北殺去新竹,幫客戶調整電腦系統,再殺回台北!向公司高報高鐵來回交通費,扣掉機車油錢成本,出差還能賺錢,還不賴,沒有不景氣,只有不爭氣,大伙可要爭氣點。左手脫臼不能騎車,小蜜桃不禁惋惜少一條賺錢管道。

禮物打開一看,差點沒昏倒。失主拿回筆記本,包一包變禮物再送給我,怎麼一回事?還是說店員懶得失物招領,直接拿包裝紙隨便包包再還給我?對於別人的惡作劇,小蜜桃不禁皺眉。既然送給我,我也演個戲,好好瞧仔細,啥?沒寫啥東西。翻著翻著,中間一頁寫「米克思巷」四個大字,那是我夾的。但仔細看又有點怪。我記得昨天筆記本「似乎」脫線了,這頁十分完整,絕對不可能脫線,最不可思議的是,米克思巷字跡「似乎」一樣。同個人寫兩次「米克思巷」,字跡類似但肯定不同,除非另有他人刻意模仿他。無論是同個人,還是有人模仿他,這本筆記本,NOTE,肯定有什麼特別的事,說不定是 DEATH NOTE。小蜜桃胡思亂想,但眼前的 NOTE 很不一樣,不是普通的禮物。

小蜜桃繼續翻 NOTE,看能不能找到一些蛛絲馬跡,可惜除了「米克思巷」,什麼也沒寫。如果昨天手賤幫昨天的筆計本拍照,說不定有驚人發現喔!小蜜桃把 NOTE 仔細收在背包,好想在本子內頁寫上萬惡不赦的人,看壞人會不會死掉。如果死了,這本就是 DEATH NOTE,之後我會被抓起來,真不好。說不定這只是很普通的 NOTE,怎可能超乎現實?用理性仔細想想,太扯了,小蜜桃腦沒脫臼,這一切都是自己的胡思亂想,睡醒就沒事了。或許可以問問店員失主長怎樣。因為失主快關店前才來,自己也累,所以沒看仔細。看起來是男人。店員說的模糊,但不像在騙人,服務業從早忙到晚,除非長相特殊,否則客人都長一樣,小蜜桃自然問不出所以然。

晚上四姐妹聚會,小佳宜下個月生日,大家提早幫她慶生,最近軍紀事件頻傳,常常無法放假,一方面主官不放行,另一方面加班衝業績,爭取好表現。例如底下阿兵哥休假前,她必定親自做足三小時的離營宣教,填完數不清無聊的保證書,保證營外開車不喝酒之類的老梗。阿兵哥苦不堪言,但一兵對少尉,當然沒有商量空間。雖然文字功夫沒有意義,但升官就是意義,有錢就是意義,可以幫助家庭。她總說家裡沒錢需要她來照顧,卻又不說遭遇何種困難,更別說接受別人資助,她不需要別人可憐。或許真有難言之隱吧!

聚會聊什麼並不重要,開心最重要,今晚不醉不歸,我們在公寓客廳醉,不管醉不醉,早已歸回家。

還好樓下老人耳朵重聽,樓上裝潢無人居住,今晚歌聲響徹雲霄。自己把自己灌醉,自己讓自己流淚,自己讓自己心碎,十個男人七個呆、八個傻、九個壞,還有一個在軍中當 GAY。桌下七八支紅酒空瓶,正常女生一支就差不多了,今晚並非什麼大日子,只是大家都瘋了。小蜜桃刻意節制酒量,保持獨特清醒的姿態。小佳宜在軍中果然有練,約末吞了三支。味味狗是笨蛋,但喝酒並不含糊,莫名其妙也喝兩支。奈姐年紀最大,兩支,臉完全不紅,意志最清醒。小蜜桃明天要上班,先拖她回房間睡覺。味味狗晚上要值班,雖然吐很醜但不礙事,先拖到浴室幫她擦身體洗澡,唔,好柔軟的胸部,男友在國外念書一定很寂寞。小佳宜趴在地板昏昏大睡,晚上可會著涼的,不如房間讓給她好好休息。奈奈大略檢查桌底有沒有玻璃碎片,沒有。

晚上五點,或者說早上五點,奈奈躺在客廳沙發,累的睡,不是醉的睡。

隔天早上九點,星期一,小蜜桃驚醒!今天十點要跟 LION TEAM 開會,不能遲到。LION TEAM 是公司的督察隊,負責監督「流浪在外」的系統,凡舉資料遺失,當機,或是使用等等疑難雜症,都在 LION TEAM 監督範圍,長久以來,公司欠缺事後追蹤機制,事情往往不了了之,客戶不滿意,老闆也不滿意。LION TEAM 於是成立,該說疊床架屋嗎?小蜜桃頗有怨言,畢竟 LION TEAM 不夠了解系統,改進方向也流於理想,不過既然要往「好的方向」走,那就做做看吧,反正 LION TEAM 最終也會「不了了之」,興頭過了,誰還在乎當初的想法?只要有新的就夠了,總之有藉口就夠了。

小蜜桃拖著包包,早上隨便買買吃吃,開會少發言,多讓大頭盡情說話,才是開會真正的目的。開會企圖模糊領導與被領導的界線,事實上那在增加鴻溝,讓你更無力。不管怎麼說,領錢作事,倒也不用想那麼多,公司老了,翻倍成長的美夢只能騙騙剛退伍加入職場的菜鳥。

這世界本來就沒什麼好期待的。選擇領薪水,就不是冒險的企業家,就不可能翻身。

不能翻身,總能翻翻筆記本吧!這天還好沒遲到,開會坐到後面位子,運氣不算差。小蜜桃右手翻著昨天的 NOTE,原本那頁「米克思巷」怎麼翻也翻不到,或許太多空白頁,一定躲在某地方。哈!在這裡!

不對!字怎麼變成「下來小心」?會不會昨天漏看這頁,這也不是不可能的。或是奈奈偷寫的。還是奈奈最貼心,昨晚不僅拖我回房間睡覺,幫我蓋上棉被,雖然很熱,重點是寫下幾個小字,提醒我上班路上小心。小蜜桃今天趕時間搭小黃上班,付完錢正準備開門下車,門邊突然衝出一台機車,明明在右側下車,幹麻擠小縫搶快?還好昨天沒喝很多,否則車門一開,可會惹上不少禍端,「下來小心」四個大字,還可真受用呀!奈姐可以在台北車站天橋擺算命攤了,不愧是四姐妹帶頭老大,設想周到,又有小驚喜。

至於那頁「米克思巷」,她忘記了,有時間再找,今天可是忙碌的一天,好好工作吧!晚上醫院回診換藥,一般來說,休息一個月脫臼就會好,平常只要留意受傷部位,別讓手再受二次傷害就夠了。廢話,難不成二次傷害會讓手變好?當然不可能,只要再忍一個月,加油,小蜜桃要加油呦。

小蜜桃記事之一


今年太平洋高壓持續增強,各地都是炎熱天氣,雖然偶有颱風降溫,仍不敵全球暖化。為了降溫,躲在冷氣空間,盡情逛街吃東西,似乎是當前流行趨勢,更別說四處林立的吃到飽麻辣鍋,明明就是大熱天,吃什麼火鍋?吃飽太閒,生活中不缺吃飽太閒無所事事的高等智慧生物。當然,有人說黑,就有人說白,少部分頑強人士反向操作走入大自然,不論游泳衝浪,或是爬山健行,痛快流汗才是最舒服的,雖然這個國家不鼓勵冒險,也不允許浪費社會資源,但冒險錯了嗎?上帝給我們生命,時間給我們死亡,這是再自然不過的事,無論有多麼不想死,最終仍是徒勞無功。

小蜜桃非常愛冒險,愛死了,原本計劃到宜蘭三大名山,赫赫有名的阿玉山走走,兩天一夜在山頂過夜看星星曬月亮,無奈脫臼的左手尚未復原。她把生命交給醫生,聽醫生話好好在家休養。說到脫臼那可真冤枉。小蜜桃有三個好朋友如膠似漆,連住也住在一塊,她們相約租在國慶宅,一層,租金三萬五並不便宜,但四個人分倒也還好,有大客廳,廚房,前後兩個陽台,雖說四個女生合租一層,但小佳宜高中那年簽賣身契給國軍,放假才會回來住,聽說再兩年就能升官,就有機會調到後勤指揮部。指揮部跟公家機關並無二致,早上八點上班,六點下班,不用二十四小時待在軍中,這點與實戰單位差很大。用自由換金錢。說實話,倒也沒那麼悲慘,女生在軍中頗吃香,只要灑點荷爾蒙,便能迷倒一連臭男生,癩蛤蟆也想吃天鵝肉,也不想想我是少尉輔導長,每月少說四萬,比上不足,比下可是綽綽有餘,你們這些窮菜兵,等到退伍就知道出社會有多難混,哪個工作不是22K,現金在手心底才踏實,雖然少了自由。

扯遠了。

國慶宅位於大台北精華地段,國宅外觀俱無可觀,別瞧不起這棟國宅,裡面可大有來頭,之後再說。隨著台灣經濟起飛,小廟已住不下富大爺。不眷戀台灣,就舉家移民美國、加拿大或是紐西蘭;已深根台灣,就在附近再買新房子,讓老人家繼續住國宅跟隔壁聊天,不是腳麻走不動,而是心麻走不了。子女有心讓父母住好地方、過好生活,但老人家就是不走,除非自己走。本月四樓剛走一個。小蜜桃住在三樓。

剛走一個,倒也相安無事,沒有靈異事件,半夜老先生抓著她的手,感謝近年來的噓寒問暖,不過是在電梯裡打招呼,應該不會感念在心吧!哪知樓上來了新鄰居,大手筆翻修裝潢,重新佈線拉管,這一動可不得了,小蜜桃窗邊裂了點縫,不知從哪來的水從裂縫滲出,趕緊打電話叫房東處理。今天整天上班,房東徵得小蜜桃同意進門補修裂縫。小蜜桃回家細察窗邊,中指無名指摸摸,乾燥,漏水解決了,但工人只管修不管清,地上滿是灰塵,費了不少工才擦乾淨,只剩較難擦的窗戶,礙於身高,只好拿椅子墊高,沒想到沒站上椅子,溼腳底板滑了一下,整個人重重摔在地上。這一摔,可把左手摔脫臼了。有點蠢,但也無可奈何,故事總是這麼展開,原本阿玉山行程只好取消。

不怎麼順利就是了,都是樓上裝潢惹的禍,馬的,小蜜桃心中暗幹一句髒話,以她優美從容的外表,噴髒話實在違和。星期六什麼地方也不能去,但就是不能在家,裝潢工人星期六加什麼班?沒有在家休息的權利,此外,太陽放肆加溫,屋子太熱也待不住,不如去熟悉的咖啡店。

今天心情很糟,想到逃離惡鄰居,心情又十分不錯。換上露肩一件式素面洋裝,沒有花俏裝飾,也沒蕾絲荷葉邊,很平淡的衣服,畢竟脫臼什麼動作都很多餘,就連呼吸也是多餘,總之簡單就好。雖然穿的簡單,但每個路過的陌生人,都會多看一眼。一如往常,小蜜桃往熟悉的咖啡店移動,推開玻璃門立刻搜尋自己的角落,可恨呀!被小情侶佔去了,只好坐旁邊的小圓桌。隨意點了咖啡和沙拉當早餐。仔細打量新位子,桌面小了點,燈光差了點,但視野還不錯,無聊時還能正大光明觀察其他客人,今天那對偷情男女還沒有來呦。正覺無趣時,腳好像踩到什麼東西,側身彎腰一看,怎麼是一本筆記本?是之前客人留下來的嗎?不曉得。拾起後準備交給店員,筆記本突然滑出一張內頁,筆記本脫線了?趕緊再揀起來,失主一定很擔心本子不見吧,如果裡頭有重要資訊,那可令失主腸子捲絞不能呼吸呢!一個失神,一個起身,頭敲到桌子邊緣,疼呀!

這內頁害人不淺,小蜜桃可要瞧仔細內頁寫什麼。沒寫什麼,只有寫「米克思巷」。米克思有很多含意,最直接讓人想到mix,也就是野貓或是野狗。巷自然就是巷弄之類的事。說到野貓,不禁讓她想起最近殘忍的虐貓事件,上個月蘋果有報,某愛貓志工在涉嫌虐貓男子住處發現貓屍,赫然發現他曾在BBS站認養許多貓,但原飼主試圖詢問貓咪近況,卻又答不上來,好像憑空消失似的。還好警方發揮大愛,將「歹徒」繩之於法,以免更多貓咪受害。小蜜桃胡思亂想,歹徒後續如何?蘋果會繼續追嗎?如此渺小的新聞,蘋果最好那麼無聊。

小蜜桃把內頁插進筆記本,NOTE,把本子交給店員,失物招領。

2012年9月1日 星期六

SQLite Schema


成果,概列九月份重要指標發佈日:
('2012-09-04', 'Manufacturing ISM Report', 'US')
('2012-09-05', '消費者物價指數', 'TW')
('2012-09-07', 'Total Nonfarm Payroll Employment', 'US')
('2012-09-12', 'Wholesale Trade Report', 'US')
('2012-09-13', 'Producer Price Index', 'US')
('2012-09-14', 'Industrial Production and Capacity Utilization', 'US')
('2012-09-14', 'Consumer Price Index', 'US')
('2012-09-14', 'Advance Monthly Sales for Retail and Food Services', 'US')
('2012-09-25', 'Conference Board Consumer Confidence Index', 'US')
('2012-09-27', '景氣指標-景氣對策信號', 'TW')

細節:SQLite schema,單獨抽出來,不要綁在程式裡頭。

drop table if exists Schedule;
drop table if exists ReleaseInfo;
drop table if exists Code;

create table if not exists Code
(
    id integer primary key,
    creation_time datetime default current_timestamp,
    name text not null,
    nation text,
    unique (name, nation) on conflict ignore
);

create table if not exists ReleaseInfo
(
    id integer primary key,
    creation_time datetime default current_timestamp,
    code_id integer not null,
    period text,
    coverage integer,
    url text,
    description text,
    foreign key (code_id) references Code (id),
    unique (code_id, period, coverage, url) on conflict ignore
);

create table if not exists Schedule
(
    id integer primary key,
    creation_time datetime default current_timestamp,
    code_id integer not null,
    release_date datetime,          
    description text,
    foreign key (code_id) references Code (id),
    unique (code_id, release_date) on conflict ignore
);

使用 Sqliteman - SQLite database made easy 操作界面。


為了方面使用,自己用 Python 兜操作界面:

import logging
import os
import sqlite3

class IndicatorDao():
 
    def __init__(self):
        self._dbfile = './db/indicator.db'
        self._schedule = 'Schedule'
        self._release_info = 'ReleaseInfo'
        self._code = 'Code'
        self._logger = logging.getLogger()
     
    def InsertSchedule(self, indicator, nation, dates):
        conn = sqlite3.connect(self._dbfile)
        cursor = conn.cursor()
        cursor.execute('''insert or ignore into
            %s (name, nation) values ('%s', '%s')
            ''' % (self._code, indicator, nation))
        cursor.execute('''select id from %s where name="%s" and nation="%s"
            ''' % (self._code, indicator, nation))
        code = cursor.fetchone()[0]
        for date in dates:
            cursor.execute('''insert into
                %s (code_id, release_date) values ('%s', '%s')
                ''' % (self._schedule, code, date))
        conn.commit()
        cursor.close()
        conn.close()                          

    def UpdateSchedule(self, indicator, nation, old_date, new_date):
        conn = sqlite3.connect(self._dbfile)
        cursor = conn.cursor()
        cursor.execute('''select id from %s where name="%s" and nation="%s"
            ''' % (self._code, indicator, nation))
        code_id = cursor.fetchone()[0]
        cursor.execute('''update %s set release_date="%s"
            where code_id=%d and nation="%s" and release_date="%s"
            ''' % (self._schedule, new_date, code_id, nation, old_date))
        conn.commit()
        cursor.close()
        conn.close()

    def DeleteSchedule(self, indicator, date):
        conn = sqlite3.connect(self._dbfile)
        cursor = conn.cursor()
        cursor.execute('''select id from %s where name="%s" and nation="%s"
            ''' % (self._code, indicator, nation))
        code_id = cursor.fetchone()[0]
        cursor.execute('''delete from %s
            where code_id=%d and nation="%s" and release_date="%s"
            ''' % (self._schedule, code_id, nation, date))
        conn.commit()
        cursor.close()
        conn.close()  
 
    def GetSchedule(self, begin_date, end_date):
        sql_cmd = '''select %s.release_date, %s.name, %s.nation
            from %s inner join %s on %s.code_id = %s.id where 1=1
            ''' % (self._schedule, self._code, self._code,
                   self._schedule, self._code,
                   self._schedule, self._code)
        if begin_date:
            sql_cmd += ''' and release_date >= "%s"''' % begin_date
        if end_date:
            sql_cmd += ''' and release_date <= "%s"''' % end_date
        sql_cmd += ''' order by release_date'''
        self._logger.debug(sql_cmd)
     
        conn = sqlite3.connect(self._dbfile)
        cursor = conn.cursor()
        rv = [ _ for _ in cursor.execute(sql_cmd)]
        cursor.close()
        conn.close()

        return rv

    def InsertReleaseInfo(self,
                          indicator,
                          nation,
                          period,
                          coverage,
                          url,
                          description):
        conn = sqlite3.connect(self._dbfile)
        cursor = conn.cursor()
        cursor.execute('''insert or ignore into
            %s (name, nation) values ('%s', '%s')
            ''' % (self._code, indicator, nation))
        cursor.execute('''select id from %s where name="%s" and nation="%s"
            ''' % (self._code, indicator, nation))
        code = cursor.fetchone()[0]
        cursor.execute('''insert or replace into
                %s (code_id, period, coverage, url, description)
                values ('%s', '%s', '%s', '%s', '%s')
                ''' % (self._release_info,
                       code,
                       period,
                       coverage,
                       url,
                       description))
        conn.commit()
        cursor.close()
        conn.close()

    def GetReleaseInfo(self):
        sql_cmd = '''select %s.name, %s.nation, %s.url
            from %s inner join %s on %s.code_id = %s.id
            ''' % (self._code, self._code, self._release_info,
                   self._release_info, self._code,
                   self._release_info, self._code)
        self._logger.debug(sql_cmd)
     
        conn = sqlite3.connect(self._dbfile)
        cursor = conn.cursor()
        rv = [ _ for _ in cursor.execute(sql_cmd)]
        cursor.close()
        conn.close()

        return rv      


初始化:

import logging
import sys

import indicator_dao
import base.logger

def main():
    base.logger.config_root(level=logging.DEBUG)

    InsertKnownSchedule()
    for date in GetSchedule(None, None): print(date)

    InsertKnownReleaseInfo()

def InsertKnownSchedule():
    d = indicator_dao.IndicatorDao()
    d.InsertSchedule(
        'Industrial Production and Capacity Utilization',
        'US',
        ['2012-09-14', '2012-10-16', '2012-11-15', '2012-12-14']
    )
    d.InsertSchedule(
        'Producer Price Index',
        'US',
        ['2012-09-13', '2012-10-12', '2012-11-14', '2012-12-13']
    )
    d.InsertSchedule(
        'Consumer Price Index',
        'US',
        ['2012-09-14', '2012-10-16', '2012-11-15', '2012-12-14']
    )
    d.InsertSchedule(
        'Total Nonfarm Payroll Employment',
        'US',
        ['2012-09-07', '2012-10-05', '2012-11-02', '2012-12-07']
    )
    d.InsertSchedule(
        'Wholesale Trade Report',
        'US',
        ['2012-09-12', '2012-10-10', '2012-11-09', '2012-12-11']
    )
    d.InsertSchedule(
        'Manufacturing ISM Report',
        'US',
        ['2012-09-04']
    )
    d.InsertSchedule(
        'Conference Board Consumer Confidence Index',
        'US',
        ['2012-08-28', '2012-09-25']
    )
    d.InsertSchedule(
        '消費者物價指數',
        'TW',
        ['2012-09-05', '2012-10-05', '2012-11-05', '2012-12-05']
    )
    d.InsertSchedule(
        '景氣指標-景氣對策信號',
        'TW',
        ['2012-08-27', '2012-09-27', '2012-10-26', '2012-11-27', '2012-12-27',
         '2013-01-28', '2013-02-27', '2013-03-27', '2013-04-26', '2013-05-27',
         '2013-06-27']
    )
    d.InsertSchedule(
        'Advance Monthly Sales for Retail and Food Services',
        'US',
        ['2012-08-14', '2012-09-14', '2012-10-15', '2012-11-14', '2012-12-13']
    )

def InsertKnownReleaseInfo():
    d = indicator_dao.IndicatorDao()
    d.InsertReleaseInfo(
        'Industrial Production and Capacity Utilization',
        'US', 'monthly', '1',
        'http://www.federalreserve.gov/releases/g17/default.htm', None
    )
    d.InsertReleaseInfo(
        'Producer Price Index',
        'US', 'monthly', '1',
        'http://www.bls.gov/schedule/news_release/2012_sched.htm', None
    )
    d.InsertReleaseInfo(
        'Consumer Price Index',
        'US', 'monthly', '1',
        'http://www.bls.gov/schedule/news_release/2012_sched.htm', None
    )
    d.InsertReleaseInfo(
        'Total Nonfarm Payroll Employment',
        'US', 'monthly', '1',
        'http://www.bls.gov/schedule/news_release/2012_sched.htm', None
    )
    d.InsertReleaseInfo(
        'Wholesale Trade Report',
        'US', 'monthly', '2',
        'http://www2.census.gov/wholesale/pdf/MWTS_Release_Schedule.pdf', None
    )
    d.InsertReleaseInfo(
        'Manufacturing ISM Report',
        'US', 'monthly', '1',
        'http://www.ism.ws/ISMReport/MfgROB.cfm?navItemNumber=12942', None
    )
    d.InsertReleaseInfo(
        'Conference Board Consumer Confidence Index',
        'US', 'monthly', '1',
        'http://www.conference-board.org/data/consumerconfidence.cfm', None
    )
    d.InsertReleaseInfo(
        '消費者物價指數',
        'TW', 'monthly', '1',
        'http://win.dgbas.gov.tw/dgbas03/bs7/calendar/calendar.asp?SelOrg=1', None
    )
    d.InsertReleaseInfo(
        '景氣指標-景氣對策信號',
        'TW', 'monthly', '1',
        'http://win.dgbas.gov.tw/dgbas03/bs7/calendar/calendar.asp', None
    )
    d.InsertReleaseInfo(
        'Advance Monthly Sales for Retail and Food Services',
        'US', 'monthly', '1',
        'http://www.esa.doc.gov/sites/default/files/ei/documents/2012/2012_economic_release_calendar.pdf', None
    )
    
def GetSchedule(begin_date, end_date):
    d = indicator_dao.IndicatorDao()
    return d.GetSchedule(begin_date, end_date)


if __name__ == '__main__':
    sys.exit(main())