2011年3月31日 星期四

SSH連線 FreeBSD 工作站 教學

下載 Pietty
http://ntu.csie.org/~piaip/pietty/

===================================================
Pietty 可直接將檔案拉到視窗中,直接上傳檔案。

我另外再找 SSH FTP Client 端的軟體 WinSCP

傳檔方面 WinSCP 比 Pietty 好用太多

你的目錄在哪裡,拖曳過去就是傳到那裡

也可以輕鬆的管理檔案 ( 複製, 移動, 刪除, 更改權限...  )

用起來就像 Windows 一樣

不用去背關於管理檔案的指令

WinSCP 有附簡單的文字編輯器

===================================================
WinSCP SSH
http://winscp.net/eng/docs/lang:cht

WinSCP 是在Windows中使用SSH的開放原始碼的圖形化SFTP用戶端。WinSCP同時也支援SCP通訊協定。它主要的功能是安全的在電腦間傳輸檔案。

選擇 Portable executables 也是可以用中文語言包

===================================================

https://sites.google.com/site/code10111/winscp-pietty
本壓縮檔內含WinSCP(Traditional Chinese)
且已將WinSCP的PuTTY的path指向檔案內的PieTTY

Re: [閒聊] Java的CheckStyle...

http://disp.cc/b/27-1u06
節錄部份


 ptt.cc
=============================================================
作者  hegemon (hegemon)      看板  Soft_Job

Java Code都要符合CheckStyle Plugin的標準.

tab跟四個space,括號前後space,或是變數大小寫

一個method不能超過一百五十行,一個method不能代入超過七個變數.

========================================================================
作者: newjoy (職業格鬥家) 看板: Soft_Job



<軟體建構之道>(code complete)裡面就有提到
"人腦所能掌握的物件個數大約在七個左右, 所以變數跟參數最好不要超過7"

掌握設計時真正的想法, 才能循線把整個設計實作出來
設計師把衣服的設計圖畫好, 材質選好, ......然後送給中國大陸去製造
然後成品就整個毀了...
由於製作的工人完全不能體會設計者的用心, 作出來的成品自然參差不齊.

========================================================================

根據統計, 只要一個method超過這個行數, 可能就要思考一下另行的作法了
另一方面也是為了code可讀性的關係.

所以, 當參數個數太多的時候, 你可能要考慮一下是不是要把這些參數包成一個
private的class, 然後user看class name就大概能知道這裡面的參數是什麼用途.
ex :

菜刀
覘板
牛肉


的參數可以包在一個叫做"晚餐材料"的class裡面傳遞給method.

==========================================================================

一個method 不能超過 150行, 也是為了怕沒經驗的coder把一堆有的沒的全部寫在
同一個method裡面, 造成可讀性&複用性差(而且會這樣通常是copy & paste造成的).
通常如果幾行code描述一件事, 那最好就用一個method把這件事包起來.
比如說 :

脫外褲;
脫內褲;
大便;
沖水;
穿內褲;
穿外褲;

看的人可能要一直讀到一個段落才能了解你的意思, 那乾脆就直接包成一個叫
"去上大號"的method, 清楚多了

=========================================================================

因為就你所說的情況, 很明顯是因為整個程式整體架構的問題,
現行有ORM比如引入Hibernate可以減少SQL行數的問題,
反正絕對不是幾個小coder敲敲鍵盤全手工打造 + check style
就能在一兩個月內解決的, (這是架構問題, 應該是project leader要解決的)
在沒整體修改架構前, 反而會為了要遵守這個check style而產生更多問題.

另外, 一支優秀的API, 註解比code多很多才能讓user用得很安心
這個150行的限制竟然包含註解絕對是錯的
這豈不是鼓勵大家為了就範而產生大量無註解的爛code嗎?

=========================================================================

如果不清楚原因跟相對應的OO寫作技巧
而硬是要去遵守150行限制, 會產生一大堆沒有內聚力的
classA-1
classA-2
classA-3
這是OO典型的anti-pattern阿! 它本來是想解決code難以閱讀維護的問題,
但是方法沒用對, 反而造成更大的問題. (比全部寫在同一隻code還難trace)

程式碼排版的好工具 Artistic Style

http://jarsing.blogspot.com/2007/10/artistic-style.html

可以通吃C、C++、C#和Java

astyle -rn --style=ansi --indent=tab --indent-switches --indent-cases *.c *.h

因為Artistic Style會將舊的程式檔案備份起來,但是我覺得這樣浪費空間,所以使用參數「n」選擇不留存這些原始內容的備份檔案(這當然是有風險的,但是我選擇相信這套工具),另外參數「r」則會以遞迴的方式處理所有子目錄。換言之,這段指令會一次處理專案內的所有程式檔案,而且不會進行備份。

更多有關參數的詳細用法,可以透過執行astyle --help取得。

2011年3月30日 星期三

const string in class

 常數字串須在類別外初始化

http://bbs.chinaunix.net/archiver/?tid-953427.html

fiowrf 发表于 2007-06-25 11:38
class Operator:public BaseStructure{
private:
        OperatorType mType;
        static int ar[6];
        static const string OperatorSymbol[7]={"+","-","*","/","^","??"};
public:
}
结果提示错误:
Operator.hxx:13: error: invalid in-class initialization of static data member
of non-integral type `const std::string[7]'

_Erics 发表于 2007-06-25 12:53
在类外初始化
class Operator:public BaseStructure{
private:
        OperatorType mType;
        static int ar[6];
        static const string OperatorSymbol[7];
public:
}
const string Operator:OperatorSymbol[]={"+","-","*","/","^","??"};

gooderfeng 发表于 2007-06-25 13:00
静态数据在c++中只有 static const int t = 0;
可以初始化。
其他都要在类的外面。

2011年3月19日 星期六

[新聞] 你還在捐款給中華民國紅十字嗎? 請複習新聞

作者: JupIte (調色盤) 看板: Gossiping
標題: [新聞] 你還在捐款給中華民國紅十字嗎? 請複習新聞
時間: Fri Mar 18 11:20:34 2011


TVBS 〈獨家〉離職員工爆料:紅十字會A錢

http://www.tvbs.com.tw/news/news_list.asp?no=lili20050823175717

TVBS〈短訊〉綠委:紅十字會補助 挪用薪資浮報

http://www.tvbs.com.tw/news/news_list.asp?no=sunkiss20070615101734

TVBS 綠委爆:紅十字會濫用補助款20年

http://www.tvbs.com.tw/news/news_list.asp?no=yu20070615125545

蘋果日報 紅十字會 8高幹年合領千萬薪

http://tw.nextmedia.com/applenews/article/art_id/1809137/IssueID/20050529

GOOGLE 搜尋 紅十字 921 善款 挪用

http://lmgtfy.com/?q=%E7%B4%85%E5%8D%81%E5%AD%97+921+%E5%96%84%E6%AC%BE+%E6%8C%AA%E7%94%A8

原來陳長文的中華民國紅十字總會是冒牌山寨的?
http://blog.kaishao.idv.tw/?p=2899


你跟你的親人朋友還在捐款給中華民國紅十字會??????

『 大家的愛心直接送到日本紅十字會,應該是比較能放心的途徑。』

1.
以下是透過日本gogole捐款給日本紅十字會的連結(捐款單位是日圓)
請先登入您的google帳號,便可進行捐款
http://ppt.cc/e~K1

2.
以下是透過paypal捐款,有組織可以捐款(捐款單位是美金)
http://ppt.cc/vKjZ
最右邊是日本紅十字會,可用paypal點數捐款


3.
以下是透過美國紅十字會捐款給日本(單位為美金)
http://ppt.cc/EmJt
會損失匯差,不建議台灣人使用


推文被誤刪的抱歉了

--
※ 發信站: 批踢踢實業坊(ptt.cc)

推 kaga3:幫lae陳貼連結http://0rz.tw/Zza5Q 我腿了十幾年 要哭了QwQ   03/18 11:41

九二一善款竟然郝龍斌轉捐中國!災民不敵官僚
http://www.youtube.com/watch?v=B90Dgmy49RQ&feature=related

2011年3月11日 星期五

2011年3月5日 星期六

Makefile 教學

建議第一次學先看第一個網址
第二個較詳細

第一章 如何寫一個簡單的Makefile
http://www.cmlab.csie.ntu.edu.tw/~chenhsiu/docs/makefile-ch1.html


Makefile 語法簡介
http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=185

===========================================================
個人想到一個比喻

化學式:

反應物----------->生成物
        催化劑

test.c---------------->test.o
       gcc -c test.c


Makefile:

生成物:反應物
<tab>催化劑

test.o:test.c
<tab>gcc -c test.c

java String深入constant pool

聲明 來源於:http://hi.baidu.com/boywell/blog/item/a069bccbc45e7c4cf31fe758.html

Constant Pool常量池的概念:

在講到String的一些特殊情況時,總會提到String Pool或者Constant Pool,但是我想很多人都不太
明白Constant Pool到底是個怎麼樣的東西,運行的時候存儲在哪裡,所以在這裡先說一下Constant Pool的內容.
String Pool是對應於在Constant Pool中存儲String常量的區域.習慣稱為String Pool,也有人稱為
String Constant Pool.好像沒有正式的命名??

在java編譯好的class文件中,有個區域稱為Constant Pool,他是一個由數組組成的表,類型
為cp_info constant_pool[],用來存儲程序中使用的各種常量,包括Class/String/Integer等各
種基本Java數據類型,詳情參見The Java Virtual Machine Specification 4.4章節.


關於String類的說明
1.String使用private final char value[]來實現字符串的存儲,也就是說String對象創建之後,就不能
再修改此對象中存儲的字符串內容,就是因為如此,才說String類型是不可變的(immutable).

2.String類有一個特殊的創建方法,就是使用""雙引號來創建.例如new String("i am")實際創建了2個
String對象,一個是"i am"通過""雙引號創建的,另一個是通過new創建的.只不過他們創建的時期不同,
一個是編譯期,一個是運行期!

3.java對String類型重載了+操作符,可以直接使用+對兩個字符串進行連接.

4.運行期調用String類的intern()方法可以向String Pool中動態添加對象.

String的創建方法一般有如下幾種
1.直接使用""引號創建.
2.使用new String()創建.
3.使用new String("someString")創建以及其他的一些重載構造函數創建.
4.使用重載的字符串連接操作符+創建.

例1
    /*
    * "sss111"是編譯期常量,編譯時已經能確定它的值,在編譯
    * 好的class文件中它已經在String Pool中了,此語句會在
    * String Pool中查找等於"sss111"的字符串(用equals(Object)方法確定),
    * 如果存在就把引用返回,付值給s1.不存在就會創建一個"sss111"放在
    * String Pool中,然後把引用返回,付值給s1.
    *
    */
    String s1 = "sss111";

    //此語句同上
    String s2 = "sss111";

    /*
    * 由於String Pool只會維護一個值相同的String對象
    * 上面2句得到的引用是String Pool中同一個對象,所以
    * 他們引用相等
    */
    System.out.println(s1 == s2); //結果為true


例2
    /*
    * 在java中,使用new關鍵字會創建一個新對象,在本例中,不管在
    * String Pool中是否已經有值相同的對象,都會創建了一個新的
    * String對象存儲在heap中,然後把引用返回賦給s1.
    * 本例中使用了String的public String(String original)構造函數.
    */
    String s1 = new String("sss111");
 
    /*
     * 此句會按照例1中所述在String Pool中查找
     */
    String s2 = "sss111";
 
    /*
     * 由於s1是new出的新對象,存儲在heap中,s2指向的對象
     * 存儲在String Pool中,他們肯定不是同一個對象,只是
     * 存儲的字符串值相同,所以返回false.
     */
    System.out.println(s1 == s2); //結果為false


例3
    String s1 = new String("sss111");
    /*
    * 當調用intern方法時,如果String Pool中已經包含一個等於此String對象
    * 的字符串(用 equals(Object)方法確定),則返回池中的字符串.否則,將此
    * String對象添加到池中,並返回此String對象在String Pool中的引用.
    */
    s1 = s1.intern();
 
    String s2 = "sss111";
 
    /*
     * 由於執行了s1 = s1.intern(),會使s1指向String Pool中值為"sss111"
     * 的字符串對象,s2也指向了同樣的對象,所以結果為true
     */
    System.out.println(s1 == s2);


例4
    String s1 = new String("111");
    String s2 = "sss111";
 
/*
    * 由於進行連接的2個字符串都是常量,編譯期就能確定連接後的值了,
    * 編譯器會進行優化直接把他們表示成"sss111"存儲到String Pool中,
    * 由於上邊的s2="sss111"已經在String Pool中加入了"sss111",
    * 此句會把s3指向和s2相同的對象,所以他們引用相同.此時"sss"和"111"
    * 兩個常量不會再創建.
    */

    String s3 = "sss" + "111";
 
    /*
     * 由於s1是個變量,在編譯期不能確定它的值是多少,所以
     * 會在執行的時候創建一個新的String對象存儲到heap中,
     * 然後賦值給s4.
     */
    String s4 = "sss" + s1;
 
    System.out.println(s2 == s3); //true
    System.out.println(s2 == s4); //false
    System.out.println(s2 == s4.intern()); //true


例5
這個是The Java Language Specification中3.10.5節的例子,有了上面的說明,這個應該不難理解了
    package testPackage;
    class Test {
            public static void main(String[] args) {
                    String hello = "Hello", lo = "lo";
                    System.out.print((hello == "Hello") + " ");
                    System.out.print((Other.hello == hello) + " ");
                    System.out.print((other.Other.hello == hello) + " ");
                    System.out.print((hello == ("Hel"+"lo")) + " ");
                    System.out.print((hello == ("Hel"+lo)) + " "); //lo在runtime會創建一個新的對象
                    System.out.println(hello == ("Hel"+lo).intern());
            }
    }
    class Other { static String hello = "Hello"; }

    package other;
    public class Other { static String hello = "Hello"; }

輸出結果為true true true true false true,請自行分析!


結果上面分析,總結如下:
1.單獨使用""引號創建的字符串都是常量,編譯期就已經確定存儲到String Pool中.
2.使用new String("")創建的對象會存儲到heap中,是運行期新創建的.
3.使用只包含常量的字符串連接符如"aa" + "aa"創建的也是常量,編譯期就能確定,已經確定存儲到String Pool中.(編譯時會直接優化成"aaaa",如果String Pool 中沒有"aaaa",就用""號創建一個String,直接放到Pool中,比如:String t = "a"+ "b" +"c"; 會優化成"abc",然後放入Pool中;又比如String s = "x"+"y"+ref;在編譯時有部分的優化:"xy",而ref + "x" +"y"就不會有部分的優化,"+"從左到右執行,ref是變量,編譯時期無法確定)

4.使用包含變量的字符串連接符如"aa" + s1創建的對象是運行期才創建的,存儲在heap中.

(根據java api文檔中String類所講,會在內部使用stringbuffer及其append方法來實現連接,然後執行toString(),這樣就會在運行時又創建一個新對象)

還有幾個經常考的面試題:

1.
String s1 = new String("s1") ;
String s2 = new String("s1") ;
上面創建了幾個String對象?
答案:3個 ,編譯期Constant Pool中創建1個,運行期heap中創建2個.

發現有空還要看看基礎了.+.jvm

2011年3月2日 星期三

About cygwin

下載與安裝
連至 www.cygwin.com 下載 setup.exe
選取所需套件 // 建議全選devel, lib等分類的所有套件

===============================================

某些載點不太穩,東西會沒載到
若是某些操作有問題 ,建議換個載點再載沒載到的部份

===========================================================
Package: quilt
quilt.sh exit code 1

/var/log/setup.log.full
=========================================================================
Copying skeleton files.
These files are for the user to personalise their cygwin experience.

They will never be overwritten nor automatically updated.

`./.bashrc' -> `/home/Owner//.bashrc'
`./.bash_profile' -> `/home/Owner//.bash_profile'
`./.inputrc' -> `/home/Owner//.inputrc'

Owner@your-1d3dfaa9ab ~
$
==================================================================
#後為註解

ls #列出目錄,檔案
cp  #拷貝檔案

mkdir dddd #建立目錄 建立名稱為dddd的資料夾
rmdir #刪除資料夾   例: rmdirdddd

cd ???? #進入該目錄
要回到一開始的目錄 cd ~/
whoami #顯示名稱

cat >bbbb.txt #建立檔案
wtestwwww #輸入內容
wwtestwww #輸入內容 ctrl+d 編輯結束

cat bbbb.txt #開啟檔案

g77 goooo.f #編譯檔案(限副檔名.f使用)

g77 xxxx -o yyyy #用 g77 編譯 xxxx ,輸出 檔名yyyy的檔案

mv ????.??? ????.??? #變更檔名 搬移/改名目錄

./gooo.exe #執行檔案 ./表示該目錄下的某檔案

man    說明        例: man mkdir
=======================================================
想知道一開始的根目錄在哪嗎?

先用cygwin在根目錄建一個名稱奇怪的檔案
cat > 123456789.123 #建立檔案
 # ctrl+d 編輯結束
用Windows的檔案搜尋123456789.123
找到根目錄後
以後就可以用Windows來管理檔案(建立 刪除 複製 編輯...)
要編譯時再開cygwin就好

==================================================================
不透過Shell來,直接在Windows上執行,會遇到下面的問題:

cygwin1.dll找不到元件


1.請至C:\cygwin\bin 資料夾內 找到cygwin.dll 檔案並複製 (不可剪下)

2.請至C:\WINDOWS\system32 資料夾內,貼上cygwin.dll 檔案

3.OK!

NOTE:
沒看到cygwin.dll的話就找cygwin1.dll

====================================================================
目前看來 cygwin的指令與FreeBSD一樣

下面網址的指令說明比較完整

FreeBSD command
http://code10111.blogspot.com/2011/04/freebsd-command-reference.html