2022/04/08

Git學習筆記(1):安裝Git

  在同一個公司待久了,後期都是學些非技術的知識,感覺IT的技術相比網路上的大師那是算不上淳熟的,但也沒什麼學習筆記需要紀錄。2019年夏天換到新公司,想著Codeing太多年要換個跑道,就做起了純SA,本來還想著要閒時向SD學習C#和VS這些從來沒學過的技能,結果忙到天翻地覆,每天都是寫文件和設計雛型,下班洗澡在想設計,晚上做夢也在設計,接著一晃兩年多,什麼技術都沒有學到就把專案拉拔到驗收階段然後離開(倒是學到了很多客戶內部作業知識,還有發現新注音根本永遠學不會正確用詞)。

  在家休息多個月,決定還是走回帶有Codeing性質的工作,至少可以動動腦,也對系統分析會比較容易。多年未更新網誌,首先就來個Git技術筆記吧...這個東西在我念書時還沒有,最近一次的工作才有用到,進專案後只學會簡單的小烏龜(TortoiseGit),提拉推三字訣解決一切,根本連原理都不懂,趁著待業時間,先把這個學好。

  104上好多公司要求要學會Git,不曉得這東西現在學校有沒有教?


  安裝版本:Git-2.35.1.2-64-bit.exe(Windows)

  很多相關安裝的教學,不論是網站或影片,通常都會告訴大家安裝到底就對了,可能因為通常會使用Git的人都是專業人士,英文都不錯,或是都很孰悉選項內容,但我不太專業而且健忘,雖然網路上也能找到類似的文章,但為了認真研究一下所以還是寫下記錄。

  Step 1:點選安裝檔確認賦予權限安裝後,第一個跳出的是授權說明


  Step 2:然後就是選擇安裝目錄


  Step 3:安裝選項

    1.Additional icons(on the Desktop) 在桌面上建立捷徑
    2.Windows Explorer integration 在右鍵選單建立捷徑
     (1)Git Bash Here 用指令(視窗)開啟
     (2)Git GUI Here 用GUI(圖形介面)開啟
    3.Git LFS(Large File Support) 支援大型檔案
    4.Associate .git configuration files with the default text editor
     將.git的檔案與預設的文字編輯器關聯,例如我的預設是Notepad(記事本),直接點擊.git檔就會用記事本開啟,如果改成Notepad++那就會用Notepad++開啟。
    5.Associate .sh files to be run with bash 將.sh的檔案與Bash關聯
    6.Check daily for Windows updates 自動檢查Git更新
    7.Add a Git Bash Profile to Windows Terminal 在Windows Terminal設定Git Bash
     (還看不太懂這一段,先標記網路大神MagicJackTing的說明--Windows Terminal's 設定 Git Bash 和 SSH)
  Step 4:設定「開始」選單名稱


  Step 5:選擇預設的編輯器

    1.Vim (The ubiquitous text editor)
    2.Notepad++
    3.Visual Studio Code
    4.Visual Studio Code Insiders
    5.Sublime Test
    6.Atom
    7.VSCodium
    8.Notepad
    9.Wordpad
    10.Select other editor:預設很多工具但都沒有你需要的時候就自己選擇

  Step 6:設定預設分支名稱

    1.Let Git decide 讓Git決定(預設選這個就好,有需要分支後期可再設定)
    2.Override the default branch name for new repositories 設定預設的分支名稱
    ※This setting does not affect existing repositories
    這個設定不會影響現有已存在的儲存庫

  Step 7:設定PATH環境

    選項下面英文就不翻譯了,Google可以看到,這邊只記錄概要
    1.Use Git from Git Bash only (僅從Git Bash使用Git)
    最安全,PATH不能被修改,但選擇這個就不能用第三方軟體使用Git(例如小烏龜?)。
    2.Git from the command line and also from 3rd-party software (從指令和第三方軟體使用Git)
    安全,只向PATH增加一些小封包,可以從Git Bash、command(cmd)、PowerShell等等第三方軟體使用Git,預設和推薦的選項。
    3.Use Git and optional Unix tools from the Command Prompt (從command使用UNIX工具)
    不安全,此選項會把UNIX工具和Git都加入PATH,目前還不太懂意思,但看網路上的說明,猜想就是使用者可能會為了有某些功能,下指令在PATH被添加一些Unix的工具路徑來用,但如果對Git或OS不熟悉,大概很有可能加錯導致很多問題,所以是不被建議使用的。

  Step 8:選擇SSH執行檔

    1.Use bundled openSSH 使用Git自帶的
    2.Use(Tortoise)Plink 使用Tortoise Plink
    3.Use external OpenSSH 使用外部的
    這個選項意義我還不懂,看了別人寫的還是不懂,就先預設吧

  Step 9:選擇HTTPS後端傳輸

    1.Use the OpenSSL library (使用OpenSSL library)
    伺服器會使用ca-bundle.crt驗證
    2.Use the native Windows Secure Channel library (使用Windows Secure Channel library)
    伺服器會使用Windows安全驗證
    這裡似懂非懂,改天有確認時若有記得再來補充。

  Step 10:設定行尾符號

    1.Checkout Windows-style,commit Unix-style line endings
    讀取和存檔時自動轉換LF和CRLF,跨平台專案時在Windows上作業推薦這個
    2.Checkout as-is , commit Unix-style line endings
    讀取檔案時不會轉換,存檔時則自動將CRLF轉換為LF,跨平台專案時在Unix上作業推薦這個
    3.Checkout as-is,commit as-is
    讀取和存檔時都不會轉換,跨平台專案不推薦使用

  Step 11:設定模擬器

    1.Use MinTTY (the default terminal of MSYS2)
    Git Bash將使用MinTTY作為終端模擬器
    2.Use Windows' default console window
    Git將使用Windows的cmd.exe

  Step 12:設定Git Pull預設方式(取回分支)

    這個扯到Git Pull指令的觀念,初學者剛安裝到這一關根本問號,翻閱一些舊版本的說明發現安裝過程並沒有這一個,所以決定先跳過說明,反正後面真正使用時,還會有各種原因導致Pull時選擇不同的方法,所以在設定預設值時給予預設就可以了,改天有整理相關知識時再詳述。
    1.Default (fast-forward or merge) 快進或合併
    2.Rebase 變基
    3.Only ever fast-forward 只有快進

  Step 13:選擇憑證管理

    1.Git Credential Manager 選擇Git憑證管理
    2.None 不使用憑證管理

  Step 14:設定其他選項

    1.Enable file system caching 使用檔案快取
    2.Enable symbolic link 使用符號連結

  Step 15:設定實驗選項

    1.Enable experimental support for pseudo consoles 使用測試虛擬控制台
    2.Enable experimental built-in file system monitor 使用系統監視器

  Step 16:開始安裝


  Step 17:懵懵懂懂地安裝完成


  心得:很多設定是對Git有基礎瞭解的人才會知道要特別改變設定,也算是幫忙快速設定用,後期應該也能有修改的機會。身為初學者研究安裝過程,有很多完全不懂的東西,只能靠後期繼續深究才會明白過來吧!

2014/08/07

行列轉置SQL語法(Only Oracle Tested)

好久沒有更新網誌,結果是來更新一篇筆記,我好認真(誤)。





  參考資料:asktom.oracle.com

  一般轉置的SQL寫法都支援數字,不外乎使用MAX、MIN、SUM、COUNT等,而其中最常用的就是SUM,但當欄位內容不是數字而是文字時,使用SUM就會出現問題,上網GOOGLE了之後,大致上整理出一種寫法,特別筆記下來。


SELECT Field1,
       MAX(DECODE(R,1,Field2,NULL)) A1,
       MAX(DECODE(R,1,Field3,NULL)) A2,
       MAX(DECODE(R,2,Field2,NULL)) A3,
       MAX(DECODE(R,2,Field3,NULL)) A4
  FROM (SELECT ROW_NUMBER() OVER(PARTITION BY Field1 ORDER BY Field2 DESC NULLS LAST) R,
               Field1, Field2, Field3
          FROM TABLE_A
         WHERE 1 = 1
           AND Field1 = '241101')
GROUP BY Field1


2011/12/01

Delphi:使用record讓Function傳回兩個以上的值

記錄一下使用record的基本方法





步驟1:在uses下加入type end
 type
 TFunc = record  //TFunc自取名字,用T開頭就行了
  a :String;   //回傳的變數,需要回傳幾組就設定幾組,可以是各種型態
  b :Integer;
 end;

在uses下有一個TForm1 = class(TForm),加入的TFunc位置相當重要,如果TFunc在TForm1之後,那麼步驟2建立的Function可能無法使用TForm1裡的元件,所以建議TFunc要在TForm1之前。

步驟2:建立Function
type
 TForm1 = class(TForm)
  Button1: TButton;
  function GetRec(): TFunc;//建立function,回傳值設定為TFunc
  procedure Button1Click(Sender: TObject);
 private
  { Private declarations }
 public
  { Public declarations }
 end;
var
 Form1: TForm1;
 ...(中略)...

function TForm1.GetRec(): TFunc;
begin
 Result.a := '回傳值';     //.a與.b是對應TFunc下的變數
 Result.b := 1234567;
end;


步驟3:使用Function
procedure TForm1.Button1Click(Sender: TObject);
var tmp :TFunc; //建立一個變數,型態為TFunc
begin
 tmp := GetRec(); //將GetRec的值傳入tmp變數
 showmessage( tmp.a + ':' + inttostr(tmp.b) );
end;


最後輸出結果:
 回傳值:1234567


註:使用record不需要釋放,把它視為和String、Integer這種東西就可以,就像var x:String後不用釋放x一樣。

整個範例檔:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;
type
 TFunc = record
 a :String;
 b :Integer;
end;
type
 TForm1 = class(TForm)
  Button1: TButton;
  function GetRec(): TFunc;
  procedure Button1Click(Sender: TObject);
 private
  { Private declarations }
 public
  { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.GetRec(): TFunc;
begin
 Result.a := '回傳值';
 Result.b := 1234567;
end;

procedure TForm1.Button1Click(Sender: TObject);
var tmp :TFunc;
begin
 tmp := GetRec();
 showmessage(tmp.a+':'+inttostr(tmp.b));
end;

end.


2011/11/22

Oracle的Cursor寫法

  在Oracle下使用Update有諸多限制,之前有研究過使用兩個Table進行Update的語法。但是在真正資料量極大及SQL條件極複雜的情況下,常常有做到當機而未完成。後來真正遇到了要使用Update更新約一年份的交易資料時,這種寫法完全是擾人的作法,Update SQL一下去,全公司幾乎不用工作了,系統資源都被我佔用掉了(笑)。

  在學會Cursor語法後,覺得是方便又快速多了,加上有網友詢問使用兩個Table進行Update的語法,所以我就趕緊記錄下來,希望能幫助到有需要的人。





  Cursor的基本語法相當簡單,只要從基本架構去加入條件即可:

declare
 cursor c_rec is //建立一個指標
  [Select SQL]; //將需要Update的資料先篩選出來
 r_rec c_rec%rowtype; //在記憶體中建立一個臨時表來記錄Select出來的資料,使用指標來存取這個表
begin
 for r_rec in c_rec loop //開始把臨時表中的資料讀出來
  [Update SQL]; //對資料進行更新
 end loop;
 commit;
end;


  我用使用兩個Table進行Update的語法來作比較,但先將語法再複雜化一點。

  這一段語法的目的是找出在B表中B2欄位=2時的A表資料,並將A表中的A2欄位更新為B表中的B3內容,A3欄位更新為B表中的B4內容。
Update ( Select A.A2, A.A3
       From A
      Where A.A1 in (Select B.B1
                From A,B
                Where A.A1=B.B1
                 And B.B2='2'))
  Set (A2,A3) = (Select B.B3, B.B4
            From B
           Where A.A1=B.B1
            And B.B2='2')


  使用這種寫法時,如果AB表各有十萬筆,則在Update語法中就會執行十萬筆的比對(如果一對一而已),在Set語法中還會再進行十萬筆資料比對一次,所以相當費時耗資源。如果你還要加上Max、Min、Sum等函數,其效能之差足以讓資料跑上一般Update的十倍以上(我沒實際算過,但依邏輯來講應該就是會非常差)。

  因為效能極差,所以將它改成Cursor來作,這樣的寫法效能較佳,AB表第一次關聯後如果只剩下一千筆資料,那麼從單一表中找出一千筆資料來作事,絕對會比跑上十萬次或更多次來得好。
declare
 cursor c_rec is
  Select A.A1, B.B3, B.B4
   From A,B
   Where A.A1=B.B1
    And B.B2='2';
 r_rec c_rec%rowtype;
begin
 for r_rec in c_rec loop //這邊的迴圈只會跑有寫進臨時表中的資料,也就是Select後的筆數,在這個地方不會再進行一次Select去咬住系統資源作篩選
  update A
    set A2 = r_rec.B3,
      A3 = r_rec.B4
   where 1 = 1
    and A1 = r_rec.A1;
 end loop;
 commit;
end;


  如果你要寫的Update語法相當複雜,那麼可以考慮使用Cursor來簡化。
總結步驟就是兩個:
(1)下Select找出需要被更新、條件值、更新值之類的資料
(2)將Update語法中的Where條件與(1)中的條件作關聯,然後更新過去。


  以上是一點簡單的Cursor寫法,太艱深的我還沒學到(笑)。

2011/11/18

MYSQL:UPDATE語法-使用SELECT

紀錄一下工作中使用到的程式寫法。





以下寫法是GOOGLE來的:來源Jax 的工作紀錄

整理了一下大概就是
如果要將表B001中的F1欄位的值寫到表A001中F1欄位值
在MYSQL中的寫法相當簡單
UPDATE A001 AS A, B001 B
SET A.F1 = B.F1
WHERE A.F2 = B.F2
AND A.F3 = B.F3


根據MYSQL官方裡說明,還有另一種寫法則是
SELECT F1 FROM B001 FOR UPDATE;
UPDATE A001 SET F1 = F1;

但這種作法比較不建議,而且我也覺得不太方便
相關說明可以參考這兩篇↓↓↓
Neo 's Blog - 使用 SELECT FOR UPDATE 做交易寫入前的確認
Neo 's Blog - SELECT FOR UPDATE 的 Row Lock 與 Table Lock



2011/06/06

浪花



『浪花』/施達樂 著


  不擅寫讀後心得的我又來了,這一次是『浪花』。而對這本書的心得,其實內心有點複雜。





  這本書是施老師終於在多次落榜後得獎的作品,依然以台客武俠為主打,以臺灣歷史人物為要角。能獲得大獎,在這邊說聲恭喜。

  首先拋去金獎和施老師作品這兩個光環(笑),我對書名頗有微辭。本來的書名在比賽時應該是『浪花群英傳』,我覺得這個名字取得較符合故事內容,因為事實上整本看過後就會發現,浪花雖然是女主角,但故事卻不是圍著她轉的。和『小貓』不同,小貓的故事就真的是圍著林少貓轉。我一直都覺得書名如果直接使用角色名字或稱號是一件相當有氣魄的事,至少唸起來就很威風。但是如果搭配上內文劇情,卻發現不是那麼一回事時,就有種作文寫得文不對題的感覺了。本來的『浪花群英傳』就很符合內容,因為主角是浪花和她身邊的英雄們啊!

  另外,總感覺這次減少了台語的內容,雖然鄭芝龍、郭懷一都是閩南人,但講起話來還是鮮少用家鄉話。當然我也不是特別期待要一整本都台語啦,只是覺得這樣就不台了(笑)。

  而在角色方面,這就是我內心有點複雜的地方。就像前面說的,因為書名的關係,我認為浪花是主角,世界是圍著她轉的。我在看書之前,如果書的封面和書背有介紹文,我都會相當認真的看過,大約知道一點頭緒,然後才開始看內文。而這本書不只書名,連介紹文和封面都讓我認為會看見一位超級辣的俠女,不斷穿梭在歷史之上。事實上,一開始我就覺得我錯了,原來主角是鄭芝龍,是那個玩世不恭的大海賊。但後來,我又發現我錯了。劇情走到一半,我才驚覺主角是那個據說不怎麼帥、武藝比一官差、但是頭腦很好的郭懷一。那...浪花呢?浪花不是主角嗎?結果還是男主角重於女主角嗎?我怎麼感覺不到浪花主導一切?她守護過頭,變成背後靈了嗎?!所以說,我被書名和那美到殺死人的封面騙了(掀桌)。



郭懷一/蕭壠文化-西拉雅館



  至於這本書真正的重點,也就是劇情部分,其實和『本色』一樣,感覺上是人物與時間連貫的無主軸故事。基於這個理由,我依然沒什麼心得(笑)。『浪花』在整個劇情上來說,是相當趨近於歷史。再外加像同人誌般那樣,出現許多歷史人物,日中台均有。而其中又以日本人物最多,台灣人物頗少,看完整本書,比較像在看日本歷史人物同人誌(大笑)。



大明招討大將軍/蕭壠文化-南瀛開拓史館-大航海時代




風調雨順/蕭壠文化-南瀛藝陣館


  在讀完『浪花』之後,恰巧是中國的端午假日,因此趁著難得聚在一起的時間,和家人去了外婆家附近的蕭壠文化園區,裡面正好展出『南瀛開拓史-大航海時代』。裡面講得正是從鄭芝龍開始之後的台灣,以及荷蘭人、熱蘭遮城這些歷史故事。看完『浪花』,或許可以也去看看,對那一段台灣歷史,會更加的深刻有印象。





2011/05/23

又是筆記(DELPHI 5 - CheckListBox)

公司舊有的程式裡有很多使用CheckBox來勾選店別的地方,都是那些可勾選多店別執行的程式。然而隨著分店越開越多,程式也老是增加店別選項。為了一勞永逸,我決定來改寫那些程式,把它們的店別選項用CheckListBox去抓取系統中的店別資料來解決。





  其實本來只是一件很簡單的事,就是把店別和店名都寫進CheckListBox去給User勾選就好,但是我還是很龜毛的打算讓它變得像原本舊有的程式畫面--只有店名。但是Delphi的CheckListBox並不支援一個選項有雙欄位記錄資料,也就是這樣顯示:
    口A1|B1
    口A2|B2
    口A3|B3

它只能這樣顯示:
    口A1
    口A2
    口A3

  有時候在B欄位我們會想要放置一些隱藏的值,只給使用者看到選項,而選中後我們再去依這些隱藏的值去做事。例如在A欄位是歌名,而B欄位則隱藏著那首歌的路徑檔名,當使用者選擇好歌曲後,我們就可以直接取得路徑和檔名來播放。

  上網搜尋了許久,找到了在DELPHI中解決的方法,那就是使用AddObject,參考這兩篇:第一篇delphi中AddObject的使用方法,第二篇listbox怎麼保存兩個字段值,且後一個字段隱藏。這兩篇都是使用AddObject方法,但是作法稍有不同,然而在實值上都是一樣。那就是向記憶體買一個小盒子,將選項其對應的隱藏值存放到裡面,當使用者選擇該選項時,指標就會去這個小盒子找到對應的隱藏值出來。

  經過實驗,rec的方法是可行的,不過我還沒研究出來要怎麼多選項。所以這個筆記只記錄了使用StringList的方法(第一篇)。

  第一步:建立全域StringList變數。實際上這個設定依程式而異,但是我認為通常使用CheckListBox的時機絕對不是在同一個動作(procedure或Function)中就會結束,所以StringList的壽命也必須要和CheckListBox一樣。如果撰寫程式的人員也較喜歡或習慣寫成模組化,使用CheckListBox值的機會也不局限在一個動作中,那麼使用全域應該是必然的。
var SL: TStringList;//宣告SL變數

  第二步:建立/增加CheckListBox選項。模式就是AddObject(選項, TObject(儲存位置))這樣而已,所以如果不使用StringList,要使用其他方式也是可以。
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
CheckListBox1.Items.Clear;//先清空
SL:= TStringList.Create;//宣告建立StringList

//不使用迴圈時建立
{SL.Add('B1');//隱藏值
CheckListBox1.Items.AddObject('A1', TObject(SL[0]));//建立
SL.Add('B2');
CheckListBox1.Items.AddObject('A2', TObject(SL[1]));
SL.Add('B3');
CheckListBox1.Items.AddObject('A3', TObject(SL[2])); }

//使用迴圈建立,適合搭配其他程式
for i := 0 to 9 do begin
SL.Add('B'+inttostr(i));//隱藏值
CheckListBox1.Items.AddObject('A'+inttostr(i), TObject(SL[i]));
Next ;
end;

end;


  第三步,有借有還,所以建立就要有刪除,否則這個程式會一直佔用記憶體,尤其是量相當龐大的時候。至於該在何時釋放,就要看程式使用CheckListBox的程度。如果取得隱藏值之後就不需再使用,那麼取得值後就可以釋放,如果在關閉程式時都還有可能使用,那麼最好就是在FromClose時執行。
FreeAndNil(SL);//釋放記譯體

  第四步,取得隱藏值。在原本參考的網站中,有提到儲存文字內容,在取值的時後變成亂碼的情況,所以在AddObject時是先將隱藏值放到SL[]再AddObject進去。但是後來經過實驗,發現還是會有偶爾出現亂碼的時候,尤其是第二次取得值的時候。
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
Memo1.Lines.Text:='';
Memo1.Lines.Add('你選擇了:');
for i := 0 to CheckListBox1.Items.Count - 1 do begin
if CheckListBox1.Checked[i] then begin //找出被選擇的選項
//Memo1.Lines.Add(string(CheckListBox1.Items.Objects[i]));//原本的程式
Memo1.Lines.Add(PChar(CheckListBox1.Items.Objects[i])); //取出Objects中的值
end;
end;
end;


  原本第一篇中是使用string的格式來取出,但再經過搜尋網路上的文章,發現string也會造成亂碼問題,所以將string改成使用PChar,問題就不再發生了。這一篇文章是從大富翁論壇來的(參考),雖然有點和我要問的不太一樣,不過其中PChar的論調卻派上用場了。以下就是最關鍵的一段回應:
將s:string;改為S: PChar就一切OK了, String是由Delphi自動管理的, 它不是簡單的指針, PChar才是指針


  以上四步大約就完成了一整個CheckListBox的程式,而以下是附加說明的,關於刪除選項的方法。
SL.Delete(5) ; //SL也要一併刪除,否則指標會指錯,而CheckListBox也會發生溢位問題
CheckListBox1.Items.Delete(5) ; //將第5項刪除




2011/05/20

殘羹

  一碗殘羹,一天的份量,沉甸甸地。





  他捧著那碗殘羹,小心翼翼地走到牆邊坐下,輕啜了一口。不燙,已經冷了。他又喝了幾口,然後用紙板蓋上。剩下的是明天早餐和午餐。
  他一直在流浪。帶著一件蠶絲大衣,一雙黑皮鞋,一套白色西裝,現在它們全部都在當舖裡。身上唯一值錢的,剩下這只從回收廠偷來的綠色塑膠碗。
  ──他叫街友,外號是乞丐,名字沒有了意義。
  從前的財富都消失了,現在他縮在紙箱裡,那印著他從前公司名字的紙箱裡。上面沒有他的名字,只有那個從世界上消失的公司名字,從經濟部登記簿上被劃掉的名字,以及畫著甜美鳳梨的圖樣。
  他曾經擁有一大片的果園,在那個以農為業的年代裡,從父親手中接過的土地權狀,被他珍貴地放在錦盒中,放在銀行的保險箱裡。
  果園裡種滿了鳳梨,那是他的寶貝。果園裡還有近百位婦女與少年郎,那是與他一起打拼的兄弟。果園旁有兩棟農舍,小的是他的家,一幢簡單的三合院,左右護龍住的是兄嫂和兩個弟弟,繼承了父親的他和妻子則住在大房裡,二房住的是他那三個孩子。另一個大農舍是後來蓋的鐵皮屋,那是放置工具與鳳梨收成後集中擺放的地方,也是讓工人們休憩乘涼用的地方。
  豐收的日子,他和所有人一起將鳳梨分批包裝、送上車,然後送鳳梨去坐船或各個果菜市場。也將品相不好的鳳梨送去工廠,做成蜜餞和糖果,然後再貼上公司的名字,送去雜貨店販賣。
  那是他最甜美的寶物,但現在只是殘破的一張畫。
  他發著抖,今天比昨天更冷。為了忘記寒冷,他認為要快點睡著比較好。
  「喂!大哥!這邊不能睡覺!」一個身穿警察制服的男人搖醒了才剛睡著的他,甚至掀開了他的紙箱。
  「啊──」他無意義地發出聲音,然後坐了起來,第一件事是轉頭看那碗殘羹,確定它還在。
  「今天這麼冷,你不能睡在這裡。我帶你去收容中心。」警察的語調並沒有任何溫情可言,或許因為他也只是收到報案才過來而已。
  他端起殘羹,將紙箱挾在掖下,然後才站起身。
  「紙箱不要拿了!那邊有棉被的。」經過垃圾筒的時候警察抽去了他的紙箱,隨手往垃圾筒邊放。
  他征征地望著紙箱上的鳳梨,他甜美的寶物。
  默默地,他伸手將紙箱拿回,這次變成抱在懷裡。
  警察並沒有理會他,也不再搶去他的紙箱,繼續帶著他往警車走。
  「收容中心隔幾條街就到了,你帶他走過去就好啦!」在警車駕駛座上的警察對著帶著他走過來的警察這樣說著。
  「大哥我們再走一下就到了。」那個警察沒有向車內的警察抗議,而是繼續帶著他走在人行道上。
  其實他們走了快二十分鐘。因為天氣冷讓他的腳步頗慢,瑟瑟發抖的身體讓腳不聽使喚。
  「大哥你等一下。」警察突然這樣說完後就往超商走進去。
  他在超商外蹲了下來,心想究竟還要走多久,難道不能讓他就在這裡睡覺嗎?再不快點睡著,他會一直感覺到冷。
  路過的人朝他丟了一枚十元硬幣,他反射性地前後搖著身體表達感謝,然後伸手從地上撿起,看著那枚硬幣,他想到了從前。每次果園豐收,他就帶著鳳梨和工人們一起去義民廟大拜拜,那時候總是會有不少聽到風聲的乞丐和小朋友來,而他就會將拜拜的食物分送出去。他會給乞丐一些錢,給小朋友一些鳳梨糖果。那時候那些乞丐也會像這樣搖動著身體說謝謝。
  「大哥,走了。」警察從超商出來,將手裡的關東煮交給他,然後拿走了那碗殘羹。
  「啊……那是我明天的早餐……」他伸手想要拿回,如果警察把它丟掉或倒掉,那他明天又要餓著一整天了。
  警察低頭看手上的破碗一眼,然後說:「我先幫你拿著,你先吃熱的。這個到收容中心我會還你。」
  「……謝謝……」他連忙點頭道謝,抱在手心的關東煮熱得燙手。
  「你快吃啊!那個就不要放到隔天了。」警察邊走邊催促著他,他再一次道謝後才將關東煮拿近嘴邊喝了一口。
  兩隻黑輪和滿滿的一碗湯,比殘羹還熱。
  身體熱了,走起路來也輕快多了。他們又走了十幾分鐘。
  在收容中心門口,那警察手插在腰間,一臉無奈的和他們說了幾分鐘。他隱約聽見了天冷、客滿這些詞兒。手裡曾經裝著熱湯的紙碗都涼了,警察還是和他們在說話。
  他在收容中心前蹲下,抱著紙箱,邊摸著上面的鳳梨邊等待。
  後來警察又帶著他繼續走,警察說那間收容中心因為天氣冷所以客滿了,連走道和大廳都睡滿了人。
  寒流來襲的夜晚,要找到溫暖的地方睡本來就不容易。
  他想起以前,他讓幾個乞丐到大農舍裡去睡,還拿了乾稻草給他們蓋,結果有個乞丐隔天被發現還是凍死了,他只好替那乞丐作了法事,也供在義民廟裡。
  「真是!」警察罵了一聲,然後停下了腳步。
  大概是累了。在這麼冷的天氣裡,一整個晚上帶著他四處走,應該也快受不了了。
  「今天先睡我們警局好了。」警察說著,然後帶著他轉方向。
  雖然又走了十幾分鐘,但那警察真的帶他進了警局。
  「收容中心都滿了?天啊!」他聽見幾個警察不可思議地喊著,然後說要打電話問遠一點的收容中心,如果問到了就開車載他過去。
  「讓他睡局裡啦!明天早上再去找啦!」帶他回來的警察這樣說著,但似乎無法得到所有人的同意。他們都認為要早點安置比較妥當,日後也比較好解決三餐問題。
  「我帶他去洗澡,小豪和阿強拿我的被子去第二偵訊室。」那個警察不顧其他人七嘴八舌的意見便這樣說了。
  警察領他穿過警局的中廊,經過了擁擠的小廚房,後面是警察的休息室。他被帶到了裡面的盥洗室。
  「隨便洗一洗也好。你把衣服換下來我拿去洗,明天再還你。」
  「那……我今晚要穿什麼?」
  「反正你先洗就對了。」那警察將他推進去,順手將門給關上。
  他聽見警察離去的聲音後,望著蓮蓬頭許久。
  很久沒有洗過澡,全身上下發散出的臭味就和以前廟口的乞丐一樣。那個警察是好人,收留了他,但他身上實在很臭,所以警局裡的人不甚願意。他將紙箱放在門邊,脫下衣服,拿起香皂,躲在蓮蓬頭下洗,從頭到腳,他不能弄臭了那個警察好心拿來的棉被。
  洗著,他哭了。
  『好心不值錢啊!』他的兄嫂這樣說,然後拿出從銀行領出來的地契,告訴他,他們打算把地賣給政府。
  『你看!現在進口的東西多,出口的東西少,老天爺又不挺咱們作農的,三不五時作災害,讓咱們家的鳳梨一年比一年收得少、賣得少。再看看那些工人,他們賺了錢,一個一個搬去都市裡發展,誰還留在這裡收鳳梨?老弟啊!你要看開點、看遠點,現在政府要收地,咱們就快點賣了,我們家不可能永遠靠鳳梨的啦!把地賣了,拿了錢去投資房地產不是挺好?還是你要去作點小生意也行,總之這種從土裡種黃金的事該放棄了啦!』兄嫂一人一句說著,然後兩個弟弟也附和著,連他的妻子也參與其中。
  『爸!我們大家一起去市區裡找間透天厝住吧!市區裡很好,交通方便、你孫子也快有了,將來還要在鄉下過活嗎?你要他們也跟著你在大熱天種鳳梨嗎?我們去都市吧?』三個孩子和媳婦望著他,沒有人站在他那一邊。
  都市很好、都市很好,大家都這樣講著,但就是沒有人說他的鳳梨很好。
  搬到都市裡後,兄嫂和兩個弟弟他們拿錢去作生意,從此過年過節也見不到面。三個孩子的孩子出生後,開始想要各自擁有空間,於是留下了他和妻子,他們也各自發展,最小的孩子甚至出國去留學,在那裡拿到了新的身份。
  都市很好、都市很好,結果這裡只有孤獨。
  妻子的喪禮只有三個孩子出現,媳婦和孫子忙碌的無法參與。
  『爸,你輪流住在我和弟弟家吧!』最大的孩子這樣說,第二個孩子露出了為難的表情,支支吾吾地說『我老婆她有點不太適應外人』。於是三個孩子大吵了一架,最後他選擇了老人院。
  老人院的董事長捲款潛逃,老人院因此倒閉,那是在一覺醒來後的事。他每天都一邊洗澡,一邊聽著外面討債的聲音,直到老人院被查封,仍沒有人來接他轉院或回家。
  從那時候起他就在流浪。
  『好心不值錢啊!』兄嫂說得話像詛咒一樣地纏繞著他,讓他無法忘記。
  警察拿來了他的毛衣和休閒服,說要送給他。他穿著乾淨溫暖的厚衣服,抱起紙箱,跟著警察到偵訊室。椅子被收到一旁,桌上鋪著一條棉被,上面還放著另一條厚棉被。
  「今天晚上你將就一下睡這裡。」警察拖了張椅子,將那碗殘羹放在上面。
  年輕人,好心不值錢啊……
  一邊這樣想著,他爬到了桌上的棉被裡,縮在其中。
  警察留了盞小夜燈給他,然後走了出去。
  「……謝謝。」他在棉被中低聲啜泣地說著,但那警察似乎並沒有聽見。
  隔天一早清晨醒來,他拿起那碗殘羹,已經發酸發臭,但他還是把它吃掉了一半,剩下的是午餐。
  他走出偵訊室,外面就是警局的辦公廳,所以每個人都能看見他走出來。
  「阿伯!你等一下,昨天帶你來的人出去巡邏了,等他回來再帶你去收容中心。」一個年輕警察面無表情地說著,然後指著一旁的椅子:「你先坐一下。」
  他看了牆上的時鐘,現在是早上五點半,外面的天還是黑的。
  坐在警局裡,他再度想起了那個死在大農舍裡的乞丐。
  『好心不值錢啊!』
  端著殘羹,夾著紙箱,他蹣跚地走出警局。


--------------------------------------------------

入圍第四屆林語堂文學獎,獎品是一本紀念書(笑)

2011/04/02

三連發完成

  最近很憂鬱,可能是超級月亮的關係(誤)。






  『三塊10元』的橡皮擦系列第三彈終於完成,再看看桌邊的『一包十二塊49元』,下一次要來個一系列了,但是我的技術還是很差,目前也想不出來要刻什麼,十二生肖?天干地支?十二星座?十二朵花?十二個月?總之,希望有完成它的一天。


這一次畫的圖也是半自創,因為長型的圖太少了,只好自己改變,而且這次懶得定稿,隨便畫一畫就開始刻了。



刻完後的模樣,一樣刻得亂七八糟



刻完後試印,這次改用藍色,但感覺起來不怎樣,所以弄了一次混色,感覺有好一點



刻完後的成品



三連發大合照



三連發印出來的結果大合照



本次參考圖樣:從某本書上照下來的照片來的



好吧,其實我後來兩次都忘了先把圖案反過來,結果變成印出來的東西都是和圖稿相反的,而且我都是在印出圖案的那一刻才發現,真的有夠蠢。

2011/03/13

它是一朵花

  近日天災連連,讓我們為日本祈禱。





  上次為了刻印章而在十元商店買了三顆只賣十塊錢的橡皮擦,既然是三顆一組,那麼我的雕刻之路也該將目標訂定在雕完三顆才對,但事實上我卻沒有打算將它們變成一系列,因為太複雜的圖我不會,「新手」這個事實並不會因為刻過一顆就改變。人永遠都是新手。我始終相信,即使同一件事做了十年,它還是會有出錯的時候。就像吃飯吃了六十年還是可能會嗆到,夾蛋還是可能會掉,世界上還是有沒吃過的米。

  日本歷經阪神大地震後花了很長的時間重建,地震防災系統也更加的完備,但還是會有死傷的時候。世界在近日的這一場災難中,看見了日本冷靜處理的態度。首相再怎麼換來換去、民調再低,還是一樣可以不慌不忙地帶領整個國家進入災後處理,糧食、飲水、民生物品,甚至是電信通訊,也很快地啟動災難救助機制。

  雖然不少財經學者說日本將要再進入十年的低潮期,但我卻覺得日本或許將會再開出美麗的花朵。日本從很久以前開始,就一直在繁榮與毀滅之間交替,但每一次的毀滅性破壞,卻又像繼承著明治維新般的靈魂般,不斷地重生出更美麗的世界來。希望這顆種子能早日再度萌芽,再一次驕傲地綻放,告訴所有的人:嗨!我們又見面了。


  今日的印章-底稿


  今日的印章-確定線稿:打算採陽刻方式,所以一開始就把留白部分塗黑,避免發生上次的慘案


  今日的印章-刻完!!這個圖看似簡單,卻比上次的複雜,大概花了快一個小時


  今日的印章-印出合照,這個印章沒有留可以寫字的地方,也沒有簽名,花的樣子長得有點怪,而且因為某些地方刻太深,在清草稿痕的時候,花梗從中間就斷掉了,但其實不仔細看是不會發現的(才對)


  今日的印章-印章,陽刻真的不好刻,不過刻完後很有成就感


  原稿是個短圖,但是我的橡皮擦太長了,所以其實畫草稿時就已經變成了差不多自創,但我覺得至少那種感覺有出來了。


  一邊刻著這個印章,一邊偷看日本的消息,雖然知道一直注意消息無濟於事,但還是會想知道他們是否開始平穩下來了。我有一個在日本的朋友,她告訴我在日本的感覺其實是很平靜的,人們相當冷靜地面對著目前發生的事,秩序也都還是有的。我告訴她我看見日本的情況感覺很難過,她問我是不是想到了什麼傷心事。其實事實上並沒有,那種難過就和看到921和911時一樣,要說是為什麼,我也不知道。想當初921看新聞時,看到倒塌的房子我很難過,911時看見飛機撞下去的瞬間覺得「怎麼可以這樣?!」,這次日本,則是一種「不要這樣!拜託」的念頭。不過這些新聞畫面我不能看太多,因為我腦子不正常。昨天我也因為看了不少NHK畫面,結果晚上夢見我從堤岸邊跳下海裡,甚至重覆了好幾次,直到被門鈴聲叫醒,那一瞬間,我是正好又要往下跳的。

  

2011/03/05

它不是雞,只是姿勢奇怪了一點的鳳凰

  在我們公司有一種說法,叫做三窮四絕。意思是三月的時候客人都很窮(因為二月過年花了很多錢),四月的時候該買的也都買了,也就差不多絕跡了--簡單說就是淡季兩個字。但今年的三月份對資訊來說卻是個忙碌的月份,因為我們正在變革。變革中的公司看起來很亂、很糟糕,但我很希望未來是美好的,即使合作的公司很機車。





  因為變革,帶來了許多問題,這個問題使得資訊部門相當忙碌,最近甚至讓我遇見了相當有壓力的問題。我很想逃避這件事,但是事實上是絕對不可能,一切該來得還是來了。我想大概接下來的整個三月,我會是滿頭包的渡過。其實或許大家都認為這件事並沒有什麼好害怕,但我卻是恐懼到了胃痛連連、想要永遠睡著。這大概和以前的我已經算是差上十萬八千里了吧?

  三更半夜,想要轉換點心情,所以動手做了很久以前就打算要嘗試的橡皮印章。

  預計使用到的工具:裝有2B筆芯的自動鉛筆、雕刻刀、美工刀(結果沒用到)、三顆只賣十塊錢的橡皮擦



  先在橡皮擦上畫底稿。原本參考的圖線條太細膩,所以打底的時候畫成粗略一點。

  確定線稿。到這個階段應該還不難看出它是一隻優雅的鳳凰。

  雕刻。這一段有個很大的問題,那就是應該要陽刻,結果我第一刀就下錯,也就變成了陰刻,而且一開始還忘記人家說得刻法,所以尾巴部分刻得有夠醜。後來刻到腳時突然刀就拿正確了,才想起來人家說過的刻法,但是這個時候的它已經差不多變成一隻雞了。

  印章、結果、原稿。原本如果是陽刻,在名字上面那個位置是蓋完印章後還能寫字的,但變成陰刻就會沒辦法,只好多刻了一塊空白。後來看這隻鳳凰,我覺得我如果刻得是龍應該就會很像了。

  正面大合照。一時不知道在空白處要寫什麼,只好用醜到爆的毛筆字寫年份。

  好吧,其實原稿本來真的是隻美麗的鳳凰。


  我一直都是個很容易衝動地去嘗試某些事物的人。去圖書館不小心翻到了自製印章的書,隔天就在十元商店買了橡皮擦想要雕刻。在網路上偶然看到簡單的食譜,放假就買了食材開始試。看別人拍出漂亮的HDR相片,我就拿著我的小DC去拍EV-3到EV+3的一大堆照片回家玩HDR軟體。如果有人問了我問題,我馬上打開Google開始搜尋相關知識,然後告訴對方。某人注意到了一首好聽的歌,或是說出了一個歌手的名字,我也是馬上找出相關的歌或影片,甚至是歌手的維基百科來看。看電視或看書時,如果看到了什麼歷史人物或典故之類,回到房間也是馬上開始查。

  林林總總一大堆,有時候我覺得我這樣根本就是一種病態,花了很多時間在看、嘗試這些東西,也就什麼都會一點皮毛,知道一點,但這些其實在工作上沒有半點是有用上的。我覺得真正必須要做的應該是去找我的萊諾醫師才對,不然我三月過完,可能也住進醫院了。



2010/11/21

本色


『本色』/施達樂 著

  施老師的書還沒上市就開始一連串的活動,我也跟著搶了一本,拿到了華麗的名片盒(蔡志忠先生設計),雖然我沒有名片。





  久違的讀書心得。

  這本書從施老師敲鑼打鼓的宣傳那天開始,看到故事簡介,我就知道這又是一本寫台灣歷史人物的小說。這是施老師的堅持,也是特色。或許會有人覺得將歷史真實人物拿出來寫成小說很奇怪,但是事實上,我相信如果這些書可以流傳到一百年後,那就會變得相當經典。

  就如同『七俠五義』,它本來也是石玉崑將說書人口述的故事整理寫下『三俠五義』,再演變成為今日連續劇、歌仔戲的歷史故事。至於『水滸傳』,人是真有其人,但他們是否真有書中所寫的境遇或結局,其實那也要有得考證才能得知。然而不論如何,如果沒有經過一個完整的故事呈現出來,不論是否存有虛構,他們或許永遠都是鄉野傳奇,甚至人們會遺忘這樣的一個人曾經存在。這些讓我們視為中國文學經典的書,說不定在推出時,也曾被不少古代讀書人斥之為荒謬不一定()。

  說回來『本色』這本書。我以每天一小時的時間(看書看得很混)來計算,大概是加起來是看了三個小時。比起前作『小貓』,看得相當快。因為它的故事是相當輕鬆的,不如『小貓』的沉重,但也可能是因為我台語有進步(大笑)。不過我卻對這本書反而沒什麼心得想要寫,所以這篇心得就簡單寫好了。

  『本色』的故事節構比較偏向短篇故事,雖然人物和時間是連貫下來的,但並不像『小貓』那樣將重點放在同一個主題上跑,而是將主角的各種事蹟逐一拖出(這也是我沒什麼心得的主因,我看慣了長篇故事)。要說對『本色』的心得,那大概就是對於寫法上的感想。『本色』比起『小貓』,在隱喻現實的事件上處理得更好了,節奏也輕快許多。在角色的個性上,似乎著墨主角較多,大概是比起『小貓』來,章幅長度不足以將其他角色的個性強烈的表現出來的關係吧!



11/20我去參加了施老師的讀書會,忘了帶相機,回家補拍一張簽名。

  我一直在將『本色』和『小貓』作比較,也承認,我是比較喜歡『小貓』的。或許因為它是長篇,而且有故事主軸,而不是講述『一個人』。但並不代表『本色』寫得不好,我覺得各有其優缺點存在,單憑個人喜好而已。所以如果說要推薦這本書,我會這樣說:

要看林少貓這個人,看『本色』;要看林少貓的故事,看『小貓』。如果你都想看,那先看『本色』,瞭解這個人,然後再去看『小貓』。這樣你就會認識這個流氓了。如果你先看了『小貓』怎麼辦?沒關係,把『本色』當作是『小貓』的前傳就行了。 



反正不管怎樣,兩本都要看就對了。

2010/09/08

徬徨之刃

  毫不猶豫更加可怕。






『誰も守ってくれない』/君塚良一   最近看了東野圭吾的「徬徨之刃」和電影「誰も守ってくれない(台譯:誰來守護我,其實我覺得對案翻作「無人守護」比較好)」,兩個故事的主要角色都有警察,而且都是處於相當矛盾的一方。
『徬徨之刃』/東野圭吾 著   「徬徨之刃」主要描述的是喪妻多年的長峰,他疼愛多年的獨生女兒遭到殺害,因為法律並不會幫助被害者家屬,所以長峰展開追殺兇手的生活。整個過程活像我在看浦物直樹的怪物Monster,雖然少年A很白目,也沒有約翰帥不是多偉大的劇情發展故事,不過長峰追殺他的過程真的有像,一樣有中途跑去當聖人的情結(話說日本很愛這種橋段,好人一定要中途跑去做好事迷倒眾生)。   對照最近的七歲事件,加上眾大網民的口水,以及法官們說的「輿論辦案」,其實有很多地方是讓人心寒的。
『疑惑』/松本清張 著   一樣常常寫到人性與討論社會的推理小說家松本清張,有部作品叫做「疑惑」。主要描述的正是「輿論辦案」,故事內容大約是一對夫妻乘車落海,最後只有妻子被救上來,丈夫死了,一位記者挖掘到這位妻子過去有過四段婚姻,丈夫都是意外死亡,所以這位記者擅自將這位妻子定義為保險金殺人犯,經過大肆報導後,這起落海事件也變成了殺人事件,於是社會和法律全部偏向了判她死刑。其實故事的結局是反過來的,是丈夫太愛妻子而迷昏她後開車衝進海裡自殺。   法官有法官的立場,當法官也成為「輿論辦案」的人,那和「自由心證」其實並無兩樣,因為輿論本來就會影響一個人的心。於是,可以在台灣這塊寶島聽見:「殺人!死刑!」、「強暴!死刑!」、「打人!死刑!」、「不肖!死刑!」、「打小孩!死刑!」....不誇張,多走幾個論壇就會看到了。更甚者,出現了「總統瀆職要判死刑!」、「貪污要判死刑!」、「路沒鋪好要判死刑!」、「台電中油六輕要死刑!」....死刑變得像是唯一手段,當人當不好就該死了。   於是,四處充滿了暴戾之氣。最誇張的,我還看過未讓博愛座應該要死刑的。   小野不由美的落照之獄裡有一段這樣寫到:「如果有了先例,那麼今後對於死刑的猶豫和躊躇都會消失。時間荒廢,如果狩獺那樣的罪犯增加了,對於使用死刑的度也消失。一旦緊箍咒鬆開了,今後一些瑣碎的罪也會動用死刑,而相對的死刑的威懾力也就小了。如果這時使用死刑,那麼更加重大的罪就要使用更加嚴厲的刑罰。」   國家給錯了方向。   「七歲」到底是什麼樣的定義?以農為本的領導人將國家以農業富庶起來,接下來以法為本的領導人卻無法給百姓心安的法。於是惡性循環下去,出現了「輿論辦案」,出現了「七歲」這樣的結果。人民內心渴望的並不是歲數問題,但是偏偏有笨蛋把這件事和「要將棒球變為國家運動」這件事畫上了等號,於是就出現了很可笑的結論。就如同因「輿論壓力」而下台的人,因「輿論壓力」而死的四個死刑犯,沒有一件事被賦予了正確的定義,沒有一件事將脫軌的秩序拉回到正常的道路上。   輿論壓力導致了某些事的不正義,不正義又導致了更龐大的輿論壓力。法官重新審判案件後,就真的不是「自由心證」了嗎?這樣惡性循環下的自由心證,就一定會是正確的嗎?   小野不由美的書裡有個國家,任何違反法律的人都是死刑,於是因國家太過貧窮而饑餓到偷貪官家裡的小孩被殺了,因生病無法工作而繳不出稅金的人被殺了。他們都是違反了法律,也都被判了最高的懲罰。訂定了嚴刑峻罰的人,正是推翻了軟弱無法度前任國王的人,至死,他都不明白自己哪一點做錯,明明是人民希望能有嚴苛法度管理的。   美麗的島國如今被暴戾之氣籠罩,不論善惡之人,心中都存有著黑色的死亡刑罰,吶喊著:死吧!死吧!   好吧!其實寫到最後我也不知道我在寫什麼,語無倫次了。

2010/07/23

畫了美景的牆--姑獲鳥之夏

『姑獲鳥之夏』/京極夏彥 著
  那是一幅畫了美景的牆,牆上的景是世界上最美的--因為它會按照他心中所想的模樣改變,永遠都是他想要的。





  和妖魔鬼怪擦上邊的偵探小說其實不止京極夏彥先生,不過他的名字卻是最響亮的。因為很響亮,所以我趕流行也跑去借來看。我抱著『很大』的期待,在闔上書的那一刻忍不住笑了:正如同我說寫這類小說的不止京極先生,其實如果不考慮作者,這本書和其他這類書放在一起並沒有什麼特別;如果把作者全部蓋住,把主角名字全部用代號代表,我大概也分不出來哪一本是京極先生的書。   當然這是只看了第一本京極先生的書就寫出來的心得,所以還是就不要討論作品和作者了,談談『姑獲鳥之夏』就好,因為或許以後我可以在書堆中一眼就認出京極先生也不一定。   『姑獲鳥之夏』主角群個性和京極堂花了快1/4本內容在講得姑獲鳥就不討論,我想說的只有『畫了美景的牆』。   京極堂一開始就來個超長頁對關口訓話,很多讀者都會在這個關卡想要丟書,我也覺得他超級囉嗦,但是經過小野不由美的『屍鬼』洗禮,京極堂其實已經把重點濃縮不少。他一開始就提到了記憶和存在的問題--為什麼你相信德川家康是真有其人?為什麼你就不相信妖怪是真有其怪?差別在哪裡?一樣都沒有親眼見過,一樣都是聽人描述,一樣都在書上記載,到底德川家康和妖怪差別在哪裡?   理由很簡單,就是人會選擇自己想要相信的、記住的、想看的、想聽的。   這一點從頭貫穿整部作品,雖然有人覺得很扯,但是,京極夏彥一開始就已經告訴讀者,他想要表達的就是關於『選擇性記憶』的問題,所以關口才會出現送情書的記憶片斷,而且又不時地回想起來。   關口是個看見牆的人,從很久以前就只看見牆,或許那就是他走出憂鬱症的一種方法,他把所有不想接受的回憶都關在牆後面,讓自己形成了一個『密室』,密室的牆上畫著他所想要的風景,所以他遺忘了送情書以後的事、看不見牧朗。書的一開始關口走在暈眩坡的時候就只看到牆,直到中段他才發現牆後面是墓區,也難怪木場會驚訝,因為木場本來就不是會看見那道牆的人。   和關口一樣的人不是梗子,而是涼子。涼子是最終極的工匠,造牆技術堪稱一流,可以造出好幾間密室來,最後甚至是逼梗子也造一道牆出來。   這道牆就像玻璃一樣的存在,它將主人眼前的畫面重新描繪於其上,但是不包括主人所厭惡的東西,所以景還是景,但絕對沒有主人不想要看到的東西。然而將牆推倒後,存在的還是存在,擋路的還是擋路,其實什麼都沒有改變。

2010/07/15

JQuery:RoundCorners與Dialog的衝突解決

JQuery圓角元件之一的RoundCorners對眾多瀏覽器的支援度很高,但和Dialog放在一起就會有問題。所以我記錄一下JQuery圓角元件RoundCorners與Dialog發生程式衝突的解決方法。





  RoundCorners:http://roundcorners.avinoam.info/

  單獨使用RoundCorners或Dialog時並不會有問題,但是當兩個放在一起就會出現錯誤,導致Dialog無法使用,並且錯誤將會指向jquery-ui.custom.min.js,但是這個是官方檔案,因此絕對不可能去修改它,於是我轉向查看RoundCorners的兩個js檔案:excanvas.js和roundCorners.jQuery.js。



  經過交叉測試,發現問題在roundCorners.jQuery.js,只要不加入這個檔案就不會有這個問題,要解決這個問題,就是修改roundCorners.jQuery.js中三行程式:

1、修改$.fn.canvas = function()的canvas名稱,例如修改為$.fn.canvas_t = function()

2、修改$.fn.getCanvas = function()中的$(el).canvas();為$(el).canvas_t();

3、修改$.fn.bg = function(radius, gradient, specialStyle)中的$el.canvas();為$el.canvas_t();

2010/05/26

JAVA for Google App Engine(三)Java專用GAE SDK與DEMO簡單測試

  Google App Engine除了提供Eclipse這項工具的SDK給開發人員外,也有直接提供專用SDK,它的安裝就相當簡單,根本談不上安裝,只要下載→解壓縮,就完成了。開發人員只要擇一選用即可,不過因為我和JAVA非常不熟,所以打算還是選用Eclipse來開發,它或許會比較簡單一點。





  下載並安裝Java 專用的 Google 應用服務引擎 SDK,並在你高興的位置解壓縮,解壓縮後可以隨意變更資料夾名稱。   接著來測試環境,Google SDK中已提供DEMO檔供測試,所以我們直接開始從命令提示字元來做測試,在命令提示字元下輸入「「SDK路徑\bin\dev_appserver.cmd SDK路徑\demos\guestbook\war」」,例如假設我們將SDK解壓縮後放置在c:\testGAE下,那麼我們就在命令提示字元下輸入「c:\testGAE\bin\dev_appserver.cmd c:\testGAE\demos\guestbook\war」程式就會開始跑。(Eclipse的檔案路徑請參考Eclipse   這時候我們再開個瀏覽器連結到http://localhost:8080/,馬上就能看到結果,如果一開始安裝完JAVA SDK後沒有進行環境變數的設定,那麼就會出現HTTP ERROR 500且Error running javac.exe compiler的錯誤,如果設定完成,那麼就會成功出現以下畫面。