#導覽列 #文章列表 #許洛豪
在光之翼的守護下訴說著一段段的英雄傳說。 [ 首頁 | 網誌 | 相簿 | 留言 | 訂閱 ]

懷念 Ruby 隨便給你放的陣列嗎?咱家的 Scala 也有!

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

好吧,雖然是很簡單的一件事,但我不知道為什麼我看的 Scala 的書和文件裡都沒有提到這些事,或許這可能不是很重要,又或者是明顯到根本不需要特別提?

不過,我還是寫一下好了……

話說像 Ruby 這類動態型別程式語言,大部份都有一個有趣的特性,那就是陣列裡面隨便你放任何東西。

舉例來說,下面的陣列在 Ruby 裡是合法的:

arr = [1, 3.14159, "我是字串", Time.now]

然而,像在 C / C++ / Java 這類靜態型別程式語言當中,陣列通常會與型別掛勾,陣列裡只能放相同型別的東西,例如下面的陣列,就只能放整數了。

int x [] = new int[10]  // 我只能放整數

這造成了不小的限制,但幸好在 Java 中,由於所有物件都是 Object 的子類別,所以你還是可以像這樣繞道而行,只是程式碼會變很醜而已,而且還得自己想辦法轉型。

// 我能放任何東西,可是請你自己轉型,順道一提,出了錯我不賠錢的
Object x [] = new Object[10]

而在 Scala 之中,一切都變得很簡單了,你有兩個選擇--Structural Type 與 Pattern Matching。

Structural Type 的想法其實就是 Duck Type 的另一種說法罷了--如果他叫起來像鴨子,走起路來也像鴨子,那麼他就是鴨子。

簡單來講,就是我只關心他有沒有實作某個方法或屬性,管他這個方法是哪裡來的,管他是繼承哪個類別或介面,只要他有這個方法或屬性就可以囉!

這麼一來,我就可以宣告一個陣列,裡面放的都是具有 myPrint() 這個方法的物件,但彼此並不互相繼承,也沒有共同的父類別或介面。

這麼一來,我就擁有一個比 C/C++/Java 彈性一點,又比 Ruby 安全一點的陣列(Ruby 可不可以有這樣的限制我不知道,煩請熟悉 Ruby 的朋友幫忙補完),因為我確定我在呼叫陣列裡的每個元素的 myPrint() 方法的時候,絕對不會出錯,一定找得到這個方法。

至於 Pattern Matching 的部份,其實和 Object [] 的概念是一樣的,只是語法簡潔很多,而且在進行型別比對時就幫你轉型,所以你可以很放心不會不小心寫錯。另外,程式碼會漂亮很多,從此脫離 if/else 的魔掌了(大誤)!

以下就是一些實際的程式碼啦,基本上應該有點 Java + Ruby 的基礎就看得懂了,主要的重點大概就是:

  • Any 相當於 Java 與 Ruby 中的 Object,是一切物件的父類別。
  • [T] 是 Generic Type,把他想成 Java 裡的 <> 就好了,例如 List[T] 就是 List<T>。
  • list1.foreach () 就等於 Ruby 的 list.each {|x| ….},只是 x 的部份直接省略為 _ 。
  • match 相當於 Java 的 switch,只是他可以連型別一起比對,並且直接幫你轉型,所以當 case x: ForInt 為真時,x 會轉型成 ForInt 。
/***************************************************************/
/* 簡單定義一些沒有共同父類別的東西                            */
/***************************************************************/

case class ForInt (x: Int) {
    def myPrint () = println ("MyPrint:" + x)
}

case class ForDouble (x: Double) {
    def myPrint () = println ("MyPrint:" + x)
}

case class ForString (x: String) {
    def myPrint () = println ("MyPrint:" + x)
}

/***************************************************************/
/* 利用 Strucural Type 來宣告 List                             */
/***************************************************************/

// 注意以下三個並沒有共通的父類別
val forInt:    ForInt    = new ForInt (3)
val forString: ForString = new ForString ("Hello World")
val forDouble: ForDouble = new ForDouble (3.14159)

// 這個 List 可以放入任何具有 myPrint(): Unit 方法的物件,不論他
// 們是否有共同的父類別,或實作相同的介面。
//
// 第二個 List[T] 是必要的,不然 Type Inference 機制會分析錯誤,
// 造成型別不符的錯誤。
type T = {def myPrint(): Unit}
val list1: List[T] = List[T] (forInt, forString, forDouble)

// 依序呼叫 List 裡每個元素的 myPrint() 方法
list1.foreach (_.myPrint()) 

/***************************************************************/
/* 以 Pattern Matching 實作隨便你放任何東西的 List             */
/* 於執行期再依物件類別決定要做啥                              */
/***************************************************************/

val list2: List[Any] = List (1, "我是字串", 3.45, new ForInt(3))
list2.foreach ( _ match {
    case x: Int    => println ("我是 Int:" + x)
    case x: String => println ("我是字串:" + x)
    case x: ForInt => println ("我是 ForInt:" + x)
    case x         => println ("我是其他東西:" + x)
})
將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-12-16 (週三) 11:59:48

CWT23 與 APH 的 Scala DSL。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...
灣娘卡灣娘卡

警告:本文內含 APH  同人與技術混合內容,APH 為一國家擬人化創作,內容不代表真實國家情形及立場。

話說今天去了 CWT23  的攤位,結果都沒看到我原本萌的東西啊,然後在會場被萌到的大概就是灣娘吧,滿滿的灣娘在路上走來走去,真是萌煞人也。

於是,兩天的購物內容就都變成和灣娘有關的東西是也!而今天入手的就是這套 APH  紙牌遊戲,購買的原因……有阿呆毛的灣娘好萌(大誤)!

好吧……回到正題,其實買的時候很掙扎的,僅管我承認我是個阿宅,可是要在會場上像斑目那樣子的買法,我還是沒辦法的啊,更何況我還是個米蟲,還在等上工呢。

所以,在會場的時候,一直在和另一攤的萌獸DNA與戀星這兩套自製遊戲的合輯考慮,而最後還是選了灣娘卡。

理由嘛,其實是因為我覺得這種卡片遊戲好像還滿適合做成手機連線對戰遊戲的,所以打算買回來研究一下!

然後呢……回家後就不小心搞出這個 DSL  了,花費時間,好像十分鐘不到吧!結論就是 Scala  好強好厲害,最後一段設定遊戲的部份,根本就不像程式語言,可讀性莫名其妙的強,搞不好一般人都看得懂。XD

/**
 *  人物卡片擁有三個屬性:名稱、生命值、描述
 */
case class PersonCard (name: String, description: String, hp: Int) 
{
    def hasHP      (hp: Int) = PersonCard (name, description, hp)
    def describeAs (description: String) = 
        PersonCard (name, description, hp)
}

/**
 *  每個遊戲裡有複數張人物卡片
 */
case class GameBoard (title: String, 
                      personCards: List[PersonCard]) 
{
    def hasPersonCards (cards: PersonCard*) = 
        GameBoard (title, cards.toList)
}

/**
 *  神奇的轉型函式,DSL 的秘密就在這裡
 */
implicit def str2PersonCard (name: String) = 
    PersonCard (name, "", 0)

implicit def str2GameBoard (title: String) = 
    GameBoard (title, Nil)

/**
 *  今天在 CWT23 買的 APH 同人遊戲裡的一些國家卡片
 */
"APH 紙上遊戲" hasPersonCards (

    "台灣" hasHP 60  describeAs "一般來說,中國、香港、日本、韓國、台灣" +
                                "裡,台灣最好相處(因為太弱啦),雖然自" +
                                "己不覺得,但是大家都覺得她家的夜市很好" +
                                "玩。",

    "香港" hasHP 70  describeAs "被英國領養了一段時間,最近回大哥家住," +
                                "有點適應不良,對金錢很精明,但人際關係" +
                                "則有點無力,看不大出來他在想什麼。",

    "美國" hasHP 100 describeAs "熱血青年,自認是世界的警察,對於做家務" +
                                "有點懶洋洋,不過墨西哥會從後院的洞偷溜" +
                                "進來工作所以沒關係,是最近一次大流行感" +
                                "冒的病源。"
)
將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-12-13 (週日) 19:19:41

我還是覺得這是基礎中的基礎。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

算是 BBS 上的舊文重 PO 吧,畢竟這是自己的一些想法,留在部落格上好像比較好一點。

原先這篇文章是回應 aMaa 網友的這一篇『類別的方法中為什麼可以建立本身類別的物件』的問題,看起來好像沒啥關聯,但我覺得這還是很重要的,至於後續還有一些發展以及想法,我會另外用專文來寫。

簡單的講,我還是覺得這些看似不相干的基礎是很重要的。

當然,如果你寫程式的目的只是為了好玩,只是想做玩具,只想當成手邊解決問題的工具,那麼這些確實可以不用去弄懂它。

但如果你想靠這行吃飯,我覺得還是認命一點,把基礎搞好吧……

就像,你可以拿起鎚子、釘子、木板自己蓋出一間狗屋,但你應該不會想要去住沒有建築基礎專業知識的設計師、建築師蓋出來的房子吧?


【離題】

說實話,這個討論串讓我想到之前在自己的部落格上寫到的這一篇雜記裡關於程式語言學習的部份,有問到到底在學習程式式語言的時候,要從何處入手。

這一串討論看下來,看來看去,只有一個想法:會有這種疑問,根本就是因為不了解整個 von Neumann架構/程式語言/編譯器/機器語言/虛擬機器之間的關連所造成的嘛……

以下,可能很長,可能很多看似無關緊要的東西(就算你不懂,你的程式還是可以動),可是我自己認為這是值得去了解的基礎,如果你真的用心了解下面所講的東西,基本上就不會再出現類似的疑惑了。

【回題】

其實原 PO 的問題本質上和另一個問題一樣:為什麼像是下面的遞迴程式裡,第 6 行的時候,明明 sum 還明有定義完,卻可以呼叫自己呢?

// 用遞迴計算 1 + 2 + ... + n
int sum (int n) {
   if (n == 1) {
       return 1;
   }

   return n + sum(n-1);
}

為什麼下面的程式裡,Node 明明還沒定義完,裡頭卻又出現另一個 Node 呢?

class Node {
   private Node next;
}

我真的很想大叫:不要鬧了!大家到底知不知道 Java 程式語言 / Bytecode / Virtual Machine / von Neumann 電腦架構 / 原生可執行檔 / 機器語語之間的關係,到底知不知道一個 Java 程式是怎麼執行的啊?!

請問你自己一個問題:Java 程式執行的時候,是執行你寫的原始碼嗎?

(答:不是,實際上執行的是 bytecode,也就是 javac 翻譯出來的 .class 檔)

請問你自己第二個問題:你在執行你的 Java 程式 (Bytecode) 的時候,你知道 Bytecode 到底是什麼東西,做什麼用的嗎?

(答:可以將 Bytecode 視為一套虛擬的『類機器語言』,將其交由 Virtual Machine 解譯後,可以產生電腦 CPU 真正能夠理解的機器語言指令)

請問你自己第三個問題:你知道什麼叫 von Neumann 架構嗎?你知道一個『原生電腦程式』是如何在 von Neumann 架構上執行的嗎?

(答:如果不知道,請參閱『小人電腦』,裡面是簡化版的說明,但基本上目前的所有電腦都不脫離這個架構。)

如果你看完了上面的小人電腦,請你問你自己第四個問題:你在小人電腦裡,有看到『資料結構』、『函數』、『物件』、『類別』這種東西嗎?

(答:沒有,只有記憶體/指令/暫存器/Program Counter ,而且記憶體位置好像也都知能存數字【註】)

(謎之音:那我的函數、物件、資料夾構在哪裡?提示:我們還有可執行檔以及 Bytecode 這兩個東西沒講到。)

【註】嚴格來說這並不正確

請再問你自己第五個問題:你知道我們剛剛『定義』出來的計算總合的函式,如果翻譯成小人電腦的機器語言,用上述網頁中的機器語言表示出來會長什麼樣子嗎?

(答:你會看到 sum(n-1) 被翻成一個 CALL 指令,其參數 XX 的部份會是此函數的開頭,而 return 會被翻成 RETURN ,如果你不知道這是什麼意思,請把小人電腦再認真看一次,並注意最後一個函數呼叫的例子)

以上,是回答為什麼函數可以呼叫自己。

接下來,請再問你自己:記憶體 / 指標 / 參考 / 物件之間,究竟是什麼關係,你知道第二個 Node 的 Java 程式碼,被載入到記憶體後,到底長什麼模樣嗎?

(答:指標和參考本質上都是相同的,都是『記憶體位置』)

這不就很明顯了嗎?private Node next,說的是『next 是一個記憶體位置,而且這個記憶體位置應該要指到一個長得像 Node 的物件』。

但 next 真的必需指到 Node 物件嗎?(提示:多型/強制轉型/執行期錯誤)他不過就是個數字,來表示記憶體位置,誰管他指到什麼地方啊!

所以說,這有什麼好訝異的?不過就是『在 Node 的這個物件裡,有一個欄位是一個數字,他指到某一個記憶體的位置,而這個記憶體位址上的內容,應該要是另一個Node 物件(但不必然是)。』

這很直覺,很正常啊!

最後,回到原 PO 的問題,如果再把原 PO 的問題更簡化,可以問另一個問題,那就是以下的 Java 程式碼是否合法,如果它合法的話,執行這段 Java 程式碼裡的 test() 到底會發生什麼事,記憶體裡產生了哪些變化?

class Hello
{
    public void test ()
    {
        Hello hello = new Hello();
    }
}

public class Test
{
    public static void main (String [] args)
    {
        Hello hello = new Hello ();
        hello.test ();
    }
}

接下來,你要問你自己,Java 裡 new 出來的物件,到底在是住在記憶體的哪裡?而指到各物件的參考又活在哪裡?是在 Stack 還是在 Heap ?指標裡存的又是什麼?

再來, hello.test() 這一行會翻譯成什麼小人電腦的組合語言?(提示:Method call 和 function call 本質上是一樣的東西)

如果,你能回答出以上的問題,基本上就不會有『為什麼函數沒有定義完還可以呼叫自己,為什麼物件可以 new 自己,為什麼明明就還沒定義完,Node 裡卻可以有 Node』 的這種疑問了。

謎之音:所以說,這篇『爪哇學校的危害』還是有他的道理在的啊!

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-12-05 (週六) 11:27:06

[Android] 實現 Functional 的 Cursor。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

退伍了,終於有比較多的時間可以東摸西搞了,想當然爾,現在的我想玩的,就是 Scala + Android 啦!

Android 確實是個很不錯的平台,可是也有他弱的地方,其中我最不喜歡的,就數 Content Provider 啦。

在 Content Provider 的架構下,的確可以達到不同應用程式間溝通的的做用,可是操作的階層實在是太低了,竟然直接動到資料庫的指標去了。

這對於已經漸漸習慣了 Functional 的我而言,真的是很痛苦啊,想到要在那邊 move 來 move 去,就一整個煩人。

幸好,這個時候,很強大的 trait 就登場啦,只要下面短短幾行的程式,馬上就可以把 Cursor 變成 Functional 啦!

class CursorSeq (cursor: Cursor) extends Seq[Cursor]
{
    require (cursor.moveToFirst)
 
    override val length = cursor.getCount
    override val elements = new Iterator[Cursor] {
        override def hasNext = !cursor.isLast &&
                               !cursor.isAfterLast &&
                               !cursor.isClosed
 
        override def next : Cursor = {
            cursor.moveToNext()
            cursor
        }
    }
 
    override def apply (n: Int) : Cursor = {
        cursor.moveToPosition (n)
        cursor
    }
}

然後,再配上一些 Wrapper class……

case class ReminderItem private (id: Int, title: String,
                                 description: String, triggerTime: Int,
                                 maidID : String)
{
    def uri : Uri = Uri.parse (Reminder.ContentUri + "/" + id)
}

object ReminderItem
{
    private def get (cursor: Cursor) : Option[ReminderItem] =
    {
        if (cursor == null) {
            return None
        }
 
        val colID = cursor.getColumnIndex (Reminder.ID)
        val colTitle = cursor.getColumnIndex (Reminder.Title)
        val colDescription = cursor.getColumnIndex (Reminder.Description)
        val colTriggerTime = cursor.getColumnIndex (Reminder.TriggerTime)
        val colMaidID = cursor.getColumnIndex (Reminder.MaidID)
 
        val id = cursor.getInt (colID)
        val title = cursor.getString (colTitle)
        val description = cursor.getString (colDescription)
        val triggerTime = cursor.getInt (colTriggerTime)
        val maidID = cursor.getString (colMaidID)
 
        Some (ReminderItem (id, title, description, triggerTime, maidID))
    }
 
    def getAll (context: Context) : Seq[Option[ReminderItem]] =
    {
        var result : Seq[Option[ReminderItem]] = Nil
        val cursor = new CursorSeq (context.getContentResolver.
                                     query (Reminder.ContentUri,
                                            null, null, null, null))
 
 
        for (row <- cursor) yield get (row)
    }
}

就可以寫出 Functional,並且超簡潔的程式啦!例如:

val item = ReminderItem.getAll.filter (_ != None)

// 取出標題是 Hello 的 ReminderItem
item.filter (i => i.title == "Hello")

// 取出所有 ReminderItem 的 Title
item.map ( i => i.title)

這樣比起直接下 Query 來得清楚多囉。

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-11-26 (週四) 10:26:29

角度。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

看到咪遜喵的這一篇『第一次面試』的狀況,說實在,我也不知道在當下的話,我會選哪一個答案。

或許不是很適合,可是看到那篇文章的當下,我想到的是『明朝那些事』第七集裡的一句話--所謂歷史唯物主義的要點,就是所有的歷史事件,都要根據當時的歷史環境來考慮。

其實兩方面的想法我都能理解,咪遜把這次的面試當做考試,所以會做出這樣的選擇,或許我也會。

咪遜的理由他寫的很清楚了,我的理由也很簡單--不該是我的分數,我不會去拿。所以,我討厭做弊,我討厭抄襲,考試時間到了就停筆,拿我該拿的分數,當我該被當的科目,而不是去做弊,去求情。

咪遜想到的是主考官想要的是『如果你有一百分的實力,那你應該就要想辦法把一百分表現出來』。

不過當我看到後的第一個想法,是換個角度想想--如果這不是考試,而是客戶給你的案子呢?

你能夠對客戶說:『啊!時間到了,我東西就做到這裡,還有一些部份沒做好,不過我們還是來交貨吧!』

不行嘛!當然不行嘛!當然是要和客戶說抱歉,這東西只要再一點時間就可以完成,我會把他弄好的!

當然,這也只是我自己的猜測而已。

至於,如果當時的主角是我,我會做出什麼選擇呢?其實,我也不知道,真的不知道。XD

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-11-26 (週四) 10:09:37

退伍感言。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

經過了將近一年的軍旅生活,終於等到退伍啦!從今天零時起,也恢復成死老百姓的身份,回到可以胡言亂語的身份。

話說在退伍前幾個星期,大兵日記就沒什麼在寫了,反正裡面寫的也都是些言不由衷,應付長官的話語。

所以就應咪遜喵的要求,就來寫退伍感言吧!寫一點我心中真實的想法。

而所謂真實的退伍感想嘛……其實和大多數人一樣,對所謂的優質的國軍,所謂這隻有著三信心,重榮譽、守紀律的剛鐵勁旅,感到徹底的失望與死心。

【什麼都是假的,只有退伍是真的。】

這句話不是沒有道理的,當然,除了退伍之外,也有一些東西是真的,譬如,和弟兄一起渡過的時間,和同梯間相處的點點滴滴,那一些嘴炮,相互吐槽,一起挨罵,是真的。

但很抱歉,除此之外,一切都是假的。

中山室牆上掛著的海報標語--誠實?認真?負責?重榮譽?不欺瞞?

屁!一切都是個屁!

接過文書業務的都知道,自己做出來的那些資料有多假,如果這叫誠實,那這世界上沒有不誠實的人了。

連新訓筆試都可以洩題、體能測驗都可以找槍手,只為了要讓自己連上的成績好看一點,不要被長官噹。

你說這叫重榮譽?那我看這世界上沒有不榮譽的人了。

真的很好笑,一切都很好笑。

去你的新聞媒體管制規定和國軍上網需知,說什麼不能上網寫部落格,會洩密,會影響軍譽等等。

屁!一整個放屁。

根本就是做賊心虛嘛!如果真的行的正,做的端,沒有做任何對不起天地良心的事,如果軍旅生活真的像你宣傳的那麼吸引人,你會怕阿兵哥在網路上 PO 軍旅生涯的點點滴滴嗎?

高興別人幫你做免錢廣告給廣大有志於從軍的年經人都來不及吧?還怕什麼?

精實?對啦,體能是很精實啦,天天跑三千啦!剩下的呢?裝保人根本就不懂裝備,天天就只是在湊人數,還煞有其事地在前一天晚上就要點名,然後實際上是隨便啦個人去湊人頭,第二天也不是他去保養。

X!最好這樣是有用啦!

反正,轉了一圈,除了失望還是失望……

這就是我的退伍感言。

最後,我一定要說,從軍唯一的好處是穩定,真的很穩定。

可是如果是在基層部隊,實際上薪水並不像大家想的那麼高,因為只要換算成時薪就知道了。

你從早上五點半起來,到晚上九點半就寢,幾乎都是在工作的,休息時間沒有多少,如果你接到業務,還有可能得加班,得半夜被連長挖起來開會,值星班也一樣,常常不到十一點不能睡。

然後,你還得站哨,站安官,講好聽點是有補休,但實際上你站了兩小時,補休只有一小時,還得聽其他早點名的人在那邊『雄壯、威武』,最好是你還睡得著。

更重要的是,你還得犧牲和家人相處的時間。

怎麼算,我都不知道國軍的薪水到底是哪裡高了……

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-11-26 (週四) 09:41:05

【廣播電台】標誌著過往的墳墓電台

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

大家好,由於快要退伍了,除了找工作外,也開始想要實現自己的一些想法和夢想,並且和大家分享一些過往的美好的事物,所以這個電台就產生啦!

本電台將於今日(2009-11-14)晚間六點整準時 Live 開播。

內容為 ACG 以及懷舊事物的相關歌曲及閒聊,屆時歡迎收聽,同時亦請不吝指教。

收聽網址為:http://std1.ladio.net:8080/brianhsu

請使用 Winamp 或 Foobar,把上述的網址加到播放清單就可以囉。

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-11-14 (週六) 13:04:25

輕音少女學園際。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...
輕音少女。輕音少女。
輕音少女。(View at PicasaWeb)

本來想說這星期五放榮譽假,可以來認真找工作的,可是沒想到一不小心,又不務正業去了。orz

但不論如何,還是來記一下這幾天吧!

話說星期五幹了件蠢事,沒有打聽清楚,就興沖沖地跑去 HSBCDirect 的駐點銀行要去申辦 VISA 金融卡,但沒想到……

專員:『目前還沒開放申請,要到 11/07  才正式開辦,你要不要等下次有空再來?』

一整個囧啊!完全就是白跑一趟了啊~~~喂喂喂,我明明是看到你的客戶往來約定書上已經有 VISA 金融卡,我這才跑來的啊……

好,蠢事說完,來說正事吧。這幾天的兩個重頭戲:輕音少女學園祭和網路廣播。

昨天是輕音少女學園祭,所以我就跑去了,以上。

結論:Mio 和梓喵都好萌!這是犯規!

剩下的時間,就都在解決廣播電台的技術問題了,試過了許多種方式,最後還是決定用 Linux + Jack + Audacious + edcast-jack 這種東拼西湊卻硬是比 Windows + Foobar2000 + edcast  來得穩定的方案了。

如果沒有意外的話,應該會在下星期正式開播,至於內容的話……敬請期待吧!總之我想應該會變成一種很詭異的風格。

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-11-08 (週日) 10:33:05

心葉絕對是『受』喔!

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...

對不起,和本文沒什麼關係,但因為遠子學姐的這句話實在太經典了,我覺得不拿來當標題實在對不起自己啊!而且為了這句經典台詞早日出現,我一放假回家就開始寫日記了!

文學少女果然也是 BL 愛好者吶!畢竟大野都說了嘛,這世界上討厭 BL 的女性是不存在的!(笑)

言歸正傳,破月的第一個禮拜,退伍倒數的第四個星期,一整個就是混亂加疲勞,雖然事情都交接了,但還是得一直盯著,而且大包小包不斷……就連放假前一刻也出包。>_<

另一方面,星期二去了就業博覽會,也投了一些履歷,目前看來是有一些些效果,接下來就看自己能不能把握這個機會,好好表現囉。

這兩天一定要加緊趕工,再把自己的履歷和自傳修一修,做好萬全的準備,畢竟這個工作機會看起來實在是很棒啊!

最後,看見咪遜喵也開始寫小說,我只能說加油啊!

不過『如果不寫的話,就沒人會知道這個故事』的心情我懂,就像每次做了精彩的夢,我也會覺得要是有小叮噹的夢境電視再加上一個錄影機就好了啊!

另外,我也想要小叮噹那台漫畫創作機(正確的名字是啥我忘記了)~~

BTW,三個月八萬字是因為到圖書館閉關,加上半家裡蹲的狀態才能達成的啊,而且到最後還是一事無成……囧,真正厲害的其實另有其人啊!

最後的最後,我拿到遠子學姐的海報了,上次槓龜,這次終於抽到囉,慶幸的是抽兩次就抽到了,運氣似乎還算不錯吶!

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-10-30 (週五) 20:05:05

純廣告:元氣豆花。

此文評價一顆星二顆星三顆星四顆星五顆星
Loading ... Loading ...
元氣豆花,歡迎訂購。元氣豆花,歡迎訂購。
元氣豆花,歡迎訂購。(View at PicasaWeb)

為了這一天的來到,老媽之前就有在想要做什麼生意了,本來是想做手工餅乾的網購(畢竟也是她自己的興趣),但後來在一翻因緣際會下,我們家改行賣豆花囉,店名叫『元氣豆花』!

總而言之,這就是現在的狀況啦,不過喵家的請放心吧,如果哪一天有做餅乾,還是會想辦法分給大家的啦!

好啦,既然是自家的東西,好像也總得稍微提一下,廣告一下唄,也好對家人有個交待啊~~

豆花實物。豆花實物。
豆花實物。(View at PicasaWeb)

基本上,咱家的豆花是純手工現做的,每天早上起來從磨豆漿一步一步來,堅持當天賣的當天做,所以數量其實不多。

同時咱家的豆花是使用非基因改造黃豆,也不加消泡濟與防腐濟,所以雖然外觀看起來會有些坑洞,保存期限也不像超市賣的盒裝豆花那麼久,但是絕對健康喲(畢竟也是自家要吃的嘛)!

另外,最特別的就是秘製糖水,吃起來有桂圓的味道喲,和市售豆花單調的甜味完全不同,是經過許久的嚐試這才研發出來的。

總之,就是如此啦,由於目前沒有固定店面,所以哪天在路上或市場看到了,不妨捧場一下吧!另外,也歡迎團購或宅配喲。

將本文加入 Hemidemi 書籤
Brian Hsu (墳墓)
2009-10-11 (週日) 12:34:10