How to monitor failed ssh login attempts on CentOS

If you are a web hosting administrator or a Linux security technician, you probably need to closely monitor ssh login activities, especially failed login attempts. Linux hasPluggable Authentication Modules (PAM) built-in, offering configurable authorization for Linux applications and services. You can use PAM to monitor failed ssh login attempts, and act on them (e.g., blocking user).

In this tutorial, I will show how to configure PAM to monitor failed ssh login attempts on CentOS. Depending on the CentOS version you are using, PAM configuration is slightly different.

Configure PAM on CentOS 5

To keep track of failed ssh logins on CentOS 5.*, you need to use a PAM module called pam_tally.so. For that, modify /etc/pam.d/system-auth as follows.

$ sudo vi /etc/pam.d/system-auth
auth required pam_tally.so no_magic_root
account required pam_tally.so deny=3 no_magic_root lock_time=300

The above PAM configuration denies ssh access for a user if the user has failed to log in three times. The user becomes unblocked after 300 seconds.

Once PAM is configured, use a command called faillog to monitor the ssh login activity of a specific user (e.g., xmodulo):

$ sudo faillog -u xmodulo
Login       Failures Maximum Latest             On
xmodulo         2        0   04/23/13 14:12:53  192.168.1.5

To reset the counter of failures for a particular user (e.g., xmodulo):

$ sudo faillog -r -u xmodulo

 

Configure PAM on CentOS 6

To check failed ssh login attempts on CentOS 6.*, you need to use a PAM module called pam_tally2.so. To configure pam_tally2.so, modify /etc/pam.d/password-auth as below.

$ sudo vi /etc/pam.d/password-auth
auth required pam_tally2.so deny=3 onerr=fail unlock_time=300
account required pam_tally2.so

This PAM configuration blocks ssh login for a particular user after three failed login attempts from the user. The user remains blocked for 300 seconds.

Once PAM is configured like above, use a command called pam_tally2 to monitor the ssh login activity of a particular user (e.g., xmodulo).

$ sudo pam_tally2 -u xmodulo
Login           Failures Latest failure     From
xmodulo             2    04/23/13 22:44:45  192.168.1.5

To unblock a particular user (e.g., xmodulo):

$ sudo pam_tally2 -u xmodulo -r

migasun 發表在 痞客邦 留言(0) 人氣()

參考資料:


http://middlewaremagic.com/weblogic/?p=4751

 

指令如下


 

cd /opt/Oracle/Middleware/wlserver_12.1/server/bin

source ./setWLSEnv.sh

java weblogic.WLST create-data-source.py

 

設定檔如下


 

01 domain.name=7001_Domain
02 admin.url=t3://localhost:7001
03 admin.userName=weblogic
04 admin.password=weblogic
05  
06 datasource.name=DS_One
07 datasource.database.name=demo
08 datasource.target=AdminServer
09 datasource.filename=DS_One.xml
10 datasource.jndiname=DS_One_JNDI
11 datasource.driver.class=com.pointbase.jdbc.jdbcUniversalDriver
12 datasource.url=jdbc:pointbase:server://localhost:9092/demo
13 datasource.username=PBPUBLIC
14 datasource.password=PBPUBLIC
15  
16 datasource.test.query=SQL SELECT * FROM DUAL

 

 

create-data-source.py檔案如下


connect(adminUserName,adminPassword,adminURL)
edit()
startEdit()

cd('/')
cmo.createJDBCSystemResource(dsName)

cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName )
cmo.setName(dsName)

cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDataSourceParams/' + dsName )
set('JNDINames',jarray.array([String('jdbc/' + dsName)], String))

cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName )
cmo.setUrl(dsURL)
cmo.setDriverName(dsDriverName)
cmo.setPassword(dsPassword)

cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCConnectionPoolParams/' + dsName )
cmo.setTestTableName(dsTestQuery)

cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName + '/Properties/' + dsName )
cmo.createProperty('user')
cd('/JDBCSystemResources/' + dsName + '/JDBCResource/' + dsName + '/JDBCDriverParams/' + dsName + '/Properties/' + dsName + '/Properties/user')
cmo.setValue(dsUserName)

cd('/SystemResources/' + dsName )
set('Targets',jarray.array([ObjectName('com.bea:Name=' + datasourceTarget + ',Type=Server')], ObjectName))

save()
activate()

 

 

進階版


參考資料:http://middlewaremagic.com/weblogic/?p=6248

 

 

migasun 發表在 痞客邦 留言(0) 人氣()

參考資料來源 http://blog.abeliu.tw/?p=210

參考來源2 : http://huangsb.blogspot.tw/2010/03/windows-grep-findstr.html

例如要unlock整個Repositories 下特定的建構項目

可以使用lslocks + findstr 過濾找出被lock的檔案

C:\Program Files (x86)\VisualSVN Server\bin>svnadmin lslocks F:\SVNRepositories\
21201000 | findstr "學生線上請假系統"

用notepad ++ 使用一次選多行的方式將 alt + shift

Path: /trunk/學生線上請假系統/系統開發/xxx

轉換成以下指令

 

然後用rmlock解lock

svnadmin rmlocks F:\SVNRepositories\21201000 /trunk/學生線上請假系統/系統開發/xxx

migasun 發表在 痞客邦 留言(0) 人氣()

http://enrui-zhang.blogspot.tw/2011/01/vmware-converter-lampp.html

 

這次轉換的目標是一台CentOS,利用VM Converter進行轉換後,啟動LAMPP出現
/opt/lampp/bin/php: error while loading shared libraries: /opt/lampp/lib/libsybdb.so.5: cannot restore segment prot after reloc: Permission denied


照理來說用converter轉移,應該是所有環境都轉移過來,但是此問題卻是SELINUX引起的,先不討討產生的原因,以解決眼前問題為主,稍微google了一下,將所有*.so的檔案都變更過,指令如下...

find . -name '*.so' | xargs chcon -t texrel_shlib_t

再重新 lampp start

DONE!

xargs 指令參考  http://blog.yam.com/ddy1280/article/13941218

migasun 發表在 痞客邦 留言(0) 人氣()

  • Dec 14 Fri 2012 16:59

原文:http://blog.xuite.net/tolarku/blog/58439089-Postfix+Mail+Queue+-+%E4%B8%80%E4%BA%9B%E7%B0%A1%E5%96%AE%E7%9A%84%E7%AE%A1%E7%90%86%E6%8C%87%E4%BB%A4

 

在 UNIX 的寄信程式不論是  Sendmail 或是 Postfix 都有處理「當信件無法即時寄出」的方法,簡單的來說就是 Mail Queue (郵件佇列),底下就簡單的來說說一些指令,怎麼來觀看並處理 Mail Queue.

※ 查看卡在 mail queue 的信件 
mailq
postqueue -p

※ Mail Queue 所在的目錄 
/var/spool/mqueue
/var/spool/postfix -- 底下列出 postfix 的子目錄

》active
目前正在準備發送的信件。(在 message id 後會多加一個 * 號)
Messages  that  the  queue  manager  has opened for delivery. Only a  limited  number  of  messages  is allowed  to  enter  the  active queue (leaky bucket strategy, for a fixed delivery rate).

》bounce
每一位收件者的傳送狀態,並記載為何會被退信
Per-recipient status information about why mail  is bounced.    These   files  are  maintained  by  the bounce(8) daemon.

》corrupt
信件損毀導致無法傳送的信件
Unreadable  or  damaged  queue files are moved here for inspection.

》defer
暫時無法被傳送的信件,並記載為何會被延遲傳送。這種情形最常發生在你的 Mail Server 被列入灰名單(GrayList)的時候,你會看到訊息為「 Your access to this mail system has been rejected due to the sending MTA's poor reputation. If you believe that this failure is in error, please contact the intended recipient via alternate means.」
Per-recipient status information about why mail  is delayed. These files are maintained by the defer(8) daemon.

》deferred
無法被傳送的信件會放置在此目錄,但 Mail Server 還是會嘗試幫你繼續送,只是必須等 Backoff time。
Mail that could not be  delivered  upon  the  first attempt.  The  queue manager implements exponential backoff  by  doubling  the  time  between  delivery attempts.

》hold
被暫時停止發送的信件,如要發送出去,需要由手動(在 message id 後會多加一個 ! 號)
Messages that are kept  "on  hold"  are  kept  here until someone sets them free.

》incoming
從外部或本地寄送到本機的信件。
Inbound mail from the network, or mail picked up by the local pickup(8) daemon from the maildrop directory.

※ 刪除所有在 Mail Queue 中所有的信件 ※※※

rm /var/spool/mqueue
postsuper -d ALL
不建議這麼做,除非你真的清楚知道你不要所有的信件!

※ 刪除所有在 deferred 狀態的信件 ※※※

因為 /var/spool/postfix/deferred 目錄下尚有 0~F 的子目錄,所以不好用 rm 一次將他清空,故系統有提供指令方式幫助你清理 deferred 下的信件

1. postsuper -d ALL deferred
後面帶的 deferred 是 queue_id ,所以你也可以用這個方法來清除其他的 queue
2. find /var/spool/postfix/deferred -type f -exec rm -vf \{\} \;
這個方法是用 find 找出該目錄下所有的檔案,找到後丟給後面的 rm 去做刪除的動作。

3. find /var/spool/postfix/deferred/  -type f -exec mv -vf \{\} /backup/mqueue/deferred/ \;
小弟建議用這個方法!這方法同第二種,只不過他不直接殺,而是將 deferred 的信件搬移到你指定的目錄去,例如例子中的 /backup/mqueue/deferred/,萬一有啥問題還可以救回來。(註:最後的 \; 不能省略唷!)

※ 刪除過了 5天仍被放在 deferred 還是寄不出去的信件 ※※
1.  find /var/spool/postfix/deferred -type f -mtime +5 -exec rm -f \{\} \;
2.  find /var/spool/postfix/deferred -type f -mtime +5 -exec mv -vf \{\} /backup/mqueue/deferred/ \;

※ 刪除來自於 xxx@123.com 的信件 ※※
通常我們都會開放「認證」的使用者在單位以外的地方,透過 mail server 發送信件,但萬一某個使用者帳號被盜用後,這個方便將是非常大的傷害,你會發現你的 mail queue 裡怎麼會有那麼多,不是自己 domain e-mail 所發出的信件。

刪除特定 e-mail 寄送的信件
mailq | grep "xxx@123.com" | cut -d " " -f1 | cut -d’*’ -f1 | postsuper -d -
--------------------------------------------------------------------------------------
mailq 列出 queue
grep 找特定人事
cut -d" " -f1 取出第一個欄位 message_id
cut -d"*" -f1 去掉星號 * (因為若該訊息是在 active queue 會多個 *)
postsuper -d - 刪除前面所取出來的  message_id

刪除特定文字的訊息

/usr/sbin/postqueue -p | grep "MAILER-DAEMON" | cut -d " " -f1 | cut -d"*" -f1 | /usr/sbin/postsuper -d -
-------------------------------------------------------------------------------------

※ qmgr 是postfix 處理 mail queue 的 daemon ※※
說明請看 http://www.postfix.org/qmgr.8.html

migasun 發表在 痞客邦 留言(0) 人氣()

http://www.linuxforum.net/books/UTF-8-Unicode.html

UTF-8 有一下特性:


  • UCS 字元 U+0000 到 U+007F (ASCII) 被編碼為位元組 0x00 到 0x7F (ASCII 相容). 這意味著只包含 7 位元 ASCII 字元的檔在 ASCII 和 UTF-8 兩種編碼方式下是一樣的.

  • 所有 >U+007F 的 UCS 字元被編碼為一個多個位元組的串, 每個位元組都有標記位元集. 因此, ASCII 位元組 (0x00-0x7F) 不可能作為任何其他字元的一部分.

  • 表示非 ASCII 字元的多位元組串的第一個位元組總是在 0xC0 到 0xFD 的範圍裡, 並指出這個字元包含多少個位元組. 多位元組串的其餘位元組都在 0x80 到 0xBF 範圍裡. 這使得重新同步非常容易, 並使編碼無國界, 且很少受丟失位元組的影響.

  • 可以編入所有可能的 231個 UCS 代碼

  • UTF-8 編碼字元理論上可以最多到 6 個位元組長, 然而 16 位元 BMP 字元最多只用到 3 位元組長.

  • Bigendian UCS-4 位元組串的排列順序是預定的.

  • 位元組 0xFE 和 0xFF 在 UTF-8 編碼中從未用到.


下列位元組串用來表示一個字元. 用到哪個串取決於該字元在 Unicode 中的序號.

U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
10xxxxxx

xxx 的位置由字元編碼數的二進位表示的位元填入. 越靠右的 x 具有越少的特殊意義.
只用最短的那個足夠表達一個字元編碼數的多位元組串. 注意在多位元組串中, 第一個位
元組的開頭"1"的數目就是整個串中位元組的數目.
例如: Unicode 字元 U+00A9 = 1010 1001 (版權符號) 在 UTF-8 裡的編碼為:
11000010 10101001 = 0xC2 0xA9
而字元 U+2260 = 0010 0010 0110 0000 (不等於) 編碼為:
11100010 10001001 10100000 = 0xE2 0x89 0xA0
這種編碼的官方名字拼寫為 UTF-8, 其中 UTF 代表 UCS Transformation Format. 請勿
在任何文檔中用其他名字 (比如 utf8 或 UTF_8) 來表示 UTF-8, 當然除非你指的是一個
變數名而不是這種編碼本身.

migasun 發表在 痞客邦 留言(0) 人氣()

http://pro-programmers.blogspot.tw/2008/07/spring-datasource-jndi-lookup-from.html

 



Monday, July 28, 2008





Spring Datasource JNDI Lookup from Tomcat




Figure: Tomcat 5.5 directory structure

DB_Driver.jar


Download an appropriate JDBC driver and place it under LIB folder. In my case, I'm using JTDS.

server.xml


This is manually setting up the JDBC resource in Tomcat. This can be configured with GUI from Tomcat Admin module.
<Server>
....
<GlobalNamingResources>
<Resource
name="jdbc/myjdb"
type="javax.sql.DataSource"
maxActive="4"
maxIdle="2"
username="sa"
maxWait="5000"
validationQuery="select 1"
driverClassName="net.sourceforge.jtds.jdbc.Driver"
password="password"
url="jdbc:jtds:sqlserver://localhost:1433;DatabaseName=MyDB"/>
</GlobalNamingResources>
...
</Server>

applicationContext.xml


In the applicationContext.xml or in an appropriate Spring config xml file create dataSource bean.
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"
value="java:comp/env/jdbc/myjdb"/>
<property name="resourceRef"
value="true" />
</bean>

context.xml


In the context.xml link the JNDI from Spring bean to JNDI from container.
<Context path="/MyApp">
<ResourceLink name="jdbc/myjdb"
type="javax.sql.DataSource"
global="jdbc/myjdb"/>
</Context>



Posted byAndy Myintat7:26 PM










Reactions:





6 comments:




Ganesh Prasadsaid...
Hi,

In the context.xml file, did you mean "/MyApp" when you wrote "/HelloJNDI"?

Regards,
Ganesh Prasad

September 30, 2009 8:12 PM


Andy Myintsaid...
Yes, that should be "/MyApp". Thanks :)

September 30, 2009 8:54 PM


Anonymous said...
Neither "/HelloJNDI" nor "/MyApp" are correct. The <Context> element in META-INF/context.xml should not have the path attribute at all.

February 17, 2011 2:48 PM


Anonymous said...
Thanks! Saved me a bunch of time.

June 15, 2011 9:27 AM


Rajkumar Singhsaid...
please vist http://www.rajkrrsingh.blogspot.in/2012/06/spring-working-with-datasource-and.html

June 8, 2012 12:50 PM


Rajkumar Singhsaid...
Please visit fallowing link
http://www.rajkrrsingh.blogspot.in/2012/06/spring-working-with-datasource-and.html

June 8, 2012 12:51 PM

Post a Comment










 

migasun 發表在 痞客邦 留言(0) 人氣()

http://www.microsoft.com/zh-tw/download/details.aspx?id=7887

migasun 發表在 痞客邦 留言(0) 人氣()

http://www.netadmin.com.tw/article_content.aspx?sn=1109130004

解析資訊安全控制措施(十)




資安事故管理與營運持續



花俊傑


組織想要做好資訊安全的目的,就是不希望資安事故的發生,影響到日常的業務營運,所以A.14營運持續管理的目標就是希望組織能夠未雨綢繆,事先擬定各項的應對策略,以避免營運中斷的情況發生。

營運持續策略的擬定,主要是透過營運衝擊分析來找出組織重要的業務關鍵活動,再透過針對關鍵活動的風險評鑑,評估可能的潛藏風險,並擬定出對應的營運持續計畫,藉由計畫的實現來達成營運持續的目標。

因此,A.14.1「營運持續管理的資訊安全層面」的控制目標,就是希望透過營運持續管理的流程,配合實施各項預防和復原措施,來對抗可能的營運中斷,確保重要的核心營運系統和業務流程,不會受到災害事故的影響而能夠持續進行,在這個項目中一共有五項控制措施,分別說明如下:

A.14.1.1 將資訊安全納入營運持續管理流程

這項控制措施要求組織需要依照業務所需的資安要求,發展和維持整體的營運持續管理流程,也就是需要識別和業務有關的關鍵活動,以及支持這些關鍵活動所需的資產,包括了人員、場地、資訊、技術、供應商、利害關係人等,組織必須充分地了解這些資產所需的安全要求,以及這些資產可能引起營運中斷的風險,評估其可能造成的衝擊,然後再選擇適當的控制措施。

舉例來說,像是火災可能對於營運場地包括機房和辦公室,造成營運中斷的衝擊,所以組織就需要配置消防系統,作為對抗火災的控制措施,如果認為此災害對於營運的衝擊過大,甚至可預備另外的營運據點,或進一步購買適當的保險,來降低整體的營運風險。

A.14.1.2 營運持續與風險評鑑

組織若已將資安納入營運持續過程的考量,接下來就要展開實際行動來找出可能造成營運中斷的風險,這項控制措施就是要求組織必須識別可能導致營運中斷的事件,研判其可能發生的機率,評估可能造成損害的等級,以及對組織的衝擊和影響。

一般而言,由資安事件引發的系統錯誤、設備失效、天然災害等問題,多數能夠藉由風險評鑑加以識別,並且依其損壞程度和復原時程,判斷如何恢復至正常運作的水準。因此在進行規劃時,建議最好由業務活動和資源的擁有者來參與,才能完整的識別出正常營運所需的資源、可允許的中斷時間及復原的順序,如此也才能識別出各項風險,進而決定組織營運持續管理的整體作法,避免落入過度偏重在添購資訊設備的備援情境中。

A.14.1.3 發展與實作包括資訊安全的持續計畫

組織應依據營運衝擊分析和風險評鑑的結果,來建立所需的營運持續計畫,這項控制措施就是要求針對各項可能造成營運中斷的風險,應該建立對應之維持或恢復運作的計畫,以確保在一定時間內達到資訊可用的要求等級。對此,建議組織在規劃時,需要考量可以接受的服務中斷時間,以及可使用的人力、物力等各項資源。

A.14.1.4 營運持續計畫框架

這項控制措施是要求營運持續計畫需要確保一致性,也就是在實施上務必要依照組織的整體作法,例如在每一份計畫中都會涵蓋特定的計畫擁有人、聯絡清單、啟動條件、緊急程序等,這些就是所謂的框架,需要依照這些項目來建立各項營運持續計畫的內容,同時明訂測試與維護的優先順序。

A.14.1.5 營運持續計畫的測試、維護及重新評鑑

關於營運持續管理,實務方面需要注意的是,計畫本身的建立並不困難,重點在於如何維持計畫的有效性,因此這項控制措施要求所有的營運持續計畫,都需要定期的測試與更新,以確保計畫的內容與作法,符合當下真實的環境。

對組織而言,或許無法同時完整測試所有計畫,但應該要規劃其測試時程和方法,視情況選擇採取紙本演練、狀況模擬、技術測試及完整演練等,請務必明白計畫的目的只有一個,就是要確保在災難發生時,能夠依照預先設想的步驟來執行,以達到營運持續的目標。

 

migasun 發表在 痞客邦 留言(0) 人氣()

文章

http://talk818.blogspot.com/2009/07/java-vector-vs-arraylist.html

Vector ArrayList的不同

有的時候 Vector更好一些;有的時候ArrayList 更好一些;有的時候你一個也不想用。但願,你不是在期望一個簡單明瞭的答案,因為答案因你在用他們做什麼而定。下面是要考慮的四個方面:

API

同步-Synchronization

資料增長-Data growth

使用方法-Usage patterns

讓我一個一個來解釋吧。

API

The Java Programming Language (Addison-Wesley, June 2000) Ken Arnold, James Gosling, David Holmes 是這樣描述Vector的,它是更ArrayList類似的一個東西,所以從API的觀點來看,它們倆是很相似的。但是,它們之間還是有些微的差別的。

Synchronization

Vectors是可同步化的,意思就是說,任何操作Vector的內容的方法都是線程安全的,相反的,另一方面,ArrayList是不可同步化的,所以也不是線程安全的。如果你知道了這些的話,你就會發現,Vector的同步會讓它在性能發方面有一些小問題。所以,如果你不需要線程安全的話,那麼就使用ArrayList吧。為什麼要為沒有必要的同步付出代價呢?

Data growth

實際上,不管是ArrayList還是Vector,在它們內部都是使用一個Array來保存資料的。編程過程中,在使用它們任何一個的時候,你都需要 記住這一點。你在往一個ArrayList或者Vector�插入一個元素的時候,如果內部陣列空間不夠了,這個物件(譯者按:指的是你使用的 ArrayList或者Vector)就要擴展它的大小。Vector在默認情況下是產生一個雙倍大小,而ArrayList增加50%的大小。只要你合 理的使用這些類,你就可以結束你在增加新的元素的時候所付出的性能代價。把對象(譯者按:指的是你使用的ArrayList或者Vector)的初始化容 量指定為你編程過程中所能用到的最大的容量總是最好的辦法。仔細的指定容量,你可以避免以後改變內部Array容量,所要付出的代價。如果你並不知道到底 有多少個資料,當是你知道資料的增長率,Vector確實有一點點優勢,因為你可以指定增加值(譯者按,如果沒有猜錯的話,作者說的方法應該是 setSize(int newSize) Sets the size of this vector.)

Usage patterns

ArrayListVector在從指定位置取得元素,從容器的末尾增加和刪除元素都非常的有效,所有的這些操作都能在一個常數級的時間(O(1)) 內完成。但是從一個其他的位置增加和刪除一個元素就顯得頗為費時,差不多需要的時間為O(n-i),這�的n代表元素個數,i代表要增加和刪除的元素所在 的位置。這些操作需花費更多的時間,因為你需要挨個移動i和更高位置的元素。那麼,以上這些到底說明了什麼呢?

這意味著,如果你 取得一個元素,或者從陣列末尾增加或刪除一個元素的話,隨便你使用VectorArrayList。如果你想要對陣列內容做其他操作的話,那麼就為自己 好另一個容器吧。比喻說,LinkedList可以在常數級時間(O(1))內為任意一個位置的元素增加和刪除。但是,取得一個元素,會稍微慢一點,時間 要用O(i) ,這個i是元素的位置。通過ArrayList也是很簡單的,因為你可以簡單使用一個索引,而不是構造一個iterator LinkedList也為每個插入的元素建立一個內部物件。所以,你也必須知道,同時產生了垃圾物件。

最後,Practical Java (Addison-Wesley, Feb. 2000) Peter Haggar �的"實踐41"建議你使用一個普通的原始的陣列來代替VectorArrayListe,特別是對效率優先的代碼來說。通過使用陣列(array) 你可以避免同步,額外的方法調用,非理想化的大小改變。你付出的只是額外的開發時間。

migasun 發表在 痞客邦 留言(0) 人氣()