Search Google

Showing posts with label dev. Show all posts
Showing posts with label dev. Show all posts

Monday, August 17, 2015

object xxx corrupted on Git server...

下午完成今天預定的SIT測項回到專案室後不久就聽到有人在召喚我 -- "James, 連不上Git啦"

心想該不會是server重開之後IP又跑走了吧, 接著putty借由顯示出login提示字元馬上打槍了, 我的第一個猜測, 嘴巴不禁嘀咕著 -- "那我們就來fetch all看看吧", 話才剛說完就立刻看到下面的錯誤訊息:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
"C:\Program Files (x86)\Git\bin\git.exe" fetch --progress "--all"
Fetching origin
fatal: object 43670bde54a8e639e3ad06e0ca9b95f3e8d790e8 is corrupted
fatal: Could not read from remote repository.


Please make sure you have the correct access rights
and the repository exists.
error: Could not fetch origin
Done
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
反正出來跑遲早要還, 怎麼還? 通常問Google就好了
沒想這個錯誤居然是如此的generic, 可能造成的原因一籮筐, 找了半天看到一堆git指令
git fsck --full
git cat-file xxx
git repack
git ...
等做法, 但是沒一個管用的, 不過倒是對一個關鍵字印象深刻 -- "empty file"
好吧, 那就試試看把這些empty file先備份再移除看看會發生什麼事情, 但是找了半天卻找不到傳說中名稱為"43670bde54a8e639e3ad06e0ca9b95f3e8d790e8"的檔案, 說時遲那時快, 看到objects目錄下有一堆二位數hex編碼的目錄, 想說好吧那就來找找"./43/670bde54a8e639e3ad06e0ca9b95f3e8d790e8", 果然一猜就中(樂透運都這樣被用掉了吧), 仔細一看檔案大小果然是0 byte, 移除之後很開心地執行git fsck想說這樣就結束了...
事情果然沒有"拱廊"所想的那麼"甘丹", 又看到下一個object xxx is corrupted!
就這麼輪迴幾次後終於受不了, 最後大開殺戒以find . -size 0K -exec rm -f {} \;做了結.
把empty file清乾淨之後馬上又做一次git fetch --all, 立即看到不同的錯誤(表示有進展了, 值得開心 ~~), 這次的錯誤是reference的hash不存在, 好在這個提示就夠清楚明白, 把refs目錄下面meta data file裡的hash換成第二新(僅次於43670bde54a8e639e3ad06e0ca9b95f3e8d790e8)的hash後再執行git fetch --all果然可以用.
接著找出最後commit + push的人並把該更新的檔案重新commit + push一次, 終於替拯救Git server行動劃下完美句點.

Thursday, July 30, 2015

淺談Context based Java batch自動測試與JMX

今天要跟大家分享目前自動測試Context based Java batch的做法與使用的工具.  這裡說的Context based Java batch指的是所有batch job都是從Spring context將MBean export後透過JMX呼叫執行.  說到JMX第一個想到的通常就是JConsole.


我們的案例中export出三個MBean, JmxJobListMBean是用來檢視job清單, JmxJobRunner是用來執行job.

透過JmxJobListMBean的listJob可以得到一份job名稱的清單.

知道要執行的job名稱後再呼叫JmxJobRunner的runJob來執行job名稱對應的service.

將job名稱與參數分別填入p1, p2欄位後執行runJob即可取得執行結果

到目前為止我們已經透過JConsole呼叫MBean export出來的功能成功地執行batch job, 但是使用JConsole代表著需要人工執行, 如果不想自己寫code但又想要透過script自動執行驗證時又該怎麼做呢?  這時候我們可以用Jmxterm來達成, 下面是透過Jmxterm執行上述batch job的做法

首先使用下列指令建立與JMX server的連線
java -jar jmxterm-1.0-alpha-4-uber.jar -n -u ${user} -p ${password} -l ${jmx_server_ip}:${jmx_server_port}

接著執行下列指令取得job名稱清單
 run -b bean:name=JmxJobListMBean -d bean listJob

最後執行下列指令將參入帶入job名稱對應的service並執行
 run -b bean:name=JmxJobRunner -d bean runJob ${job名稱} ${參數}

下圖中有上述指令與執行結果


OK, 現在我們可以不用人工的方式透過JMX執行batch job了, 接下來我們要再結合JMeter達成自動執行+驗正執行結果.  我們會用到JMeter的OS process sampler執行上述指令, 待OS process sampler執行結束後再搭配其他sampler (eg. JDBC)或是單純使用post process assertion檢查執行結果是否如預期.


搭配JMeter OS process sampler後比較特別的地方是在原本與JMX server建立連線的指令後面多加了"-i jmxterm.txt", 這個新加的參數表示會把jmxterm.txt檔案內容餵進與JMX server建立的連線中執行.  所以jmxterm.txt的內容就是執行runJob的指令, eg.
run -b bean:name=JmxJobRunner -d bean runJob ${job名稱} ${參數}



Saturday, July 18, 2015

Bluemix業配文+入門教學

身為I社的一份子, 當公司全力在推CAMSS的時候一定也要來盡點心力, 我想大家對於中規中舉的介紹早已麻木, 所以就讓擅長打野武士戰法的我來跟大家介紹如何開開心心地以非正規的方式使用Bluemix提供的免費功能~

今天要介紹的功能是大部分webapp所環繞著的三大要素
1. Runtime server
2. Git server
3. DB server

1. Runtime server目前涵蓋了以下幾種大家常見的環境:
雖然我個人偏好在local跑Runtime server, 畢竟要設定或debug時還是比較方便, 但是如果可以在Bluemix上面跟客戶做完最後一哩路測試等於可以省去系統轉移+後續測試所需的工, 因為測試完之後只需要將帳號轉移給業主管理就結束了, 光是這點我想對許多SOHO族是相當有利, 而業主每個月付的費用就是原本需要花費的web hosting service費用.


想知道更多關於如何開始使用Runtime server請點這

2. 為什麼要特別提到Git server呢? 不就是做版本控管嗎?
是的, 在開發的過程中大家多多少少會需要做source code的版本控管, 也因為近年來許多opensource project陸續放到GitHub上讓越來越多人使用Git做版本控管.
要使用Git做版本控管一定要有個Git server, 如果用免費版的GitHub就表示所有放上去的source code自動成為opensource, 如果不想讓自己的source code變成opensource通常有兩種方式: (a) 付錢成為GitHub的付費使用者就可以把repository/project轉成私人模式, (b) 自己架Git server.
對於不想付費又不想自己架Git server的使用者而言, Bluemix提供的DevOps服務就顯得格外有用. 透過Bluemix的DevOps服務可以建立private Git server做版本控管同時保有source code的ownership.
想知道如何從local git client使用Bluemix提供的Git server請點這

3. webapp絕大部分應該都會需要用到DB, 以往我們難免需要自己在local電腦上架個DB server或付費租用線上DB才能開始開發測試. 今天Bluemix真正實現了"只要有心人人都可以有100MB的免費DB空間可用"!
這個部份比較tricky, 正規文件裡面並沒有特別說明(匆匆帶過倒是有), 所以在這裡特別說明如何從local端存取Bluemix提供的DB instance.
首先我們需要先有一個Runtime server instance (可以參照第1點結尾的連結), 這樣申請下來的DB server才有地方可掛 --> 才有地方可以看設定.
接著點擊上圖紅色框框申請DB server instance, 要注意的是下圖中的兩個紅色框框. 上面的紅色框框指定新申請的DB server instance要掛到哪一個Runtimer server instance, 下面的紅色框框指名要使用免費方案 --> 100MB空間 + 10 concurrent connections
到目前為止我們知道我們有了一個Runtime server + 一個DB server, 接下來我們要透過Runtime server的設定取得DB server的連線資訊. 從Bluemix的儀表板中看到一個Runtime server instance:

點進上圖下方紅色框框代表的Runtime server instance之後可以看到該instance的配置
到這裡我們就已經快要完成取經任務, 只要再點進上圖中左方panel中的"環境變數"就可以看到DB的設定參數!

有了上圖中右邊兩個紅色框框的資訊我們就可以從local直接透過Internet存取這100MB的free DB.

當然, 不把DB掛進Runtime server也可以透過DB service提供的web UI進行"簡單"的操作
如果想要透過這個web UI匯入格式稍微複雜一點的資料就會碰壁, web UI畢竟無法提供command line指令的細顆粒度微調, 所以我還是偏好直接透過Data Server Runtime Client直接建立remote connection操作的野武士戰法.

相信沒有直接按"End"鍵一路看到這裡的捧友們此時對於如何使用Bluemix提供的service已經有更深一層的了解, 雖然不是太正規的用法, 但是我相信對於中小企業的企業主與SOHO族們應該相當有幫助.

我們下回見~

Thursday, April 23, 2015

距離上次分享Linux container相關文章已經五年多了, 沒想到五年後居然有人用Linux container搞出了大名堂, 是的, 就是Docker!  最近越來越常聽到大家在討論Docker, 但是也很常聽到有人在問Docker跟VM到底哪裡不同.


舉個例子來說明:

在以前如果想要在同一台電腦上面同時虛擬化AP server + APP, DB, Mail server applications, 我們需要在Hosting OS上面跑三個VM instances (如下圖左邊的VMs), 每一個VM instance雖然只執行各自被指派的任務 (如下圖左邊填滿橘色, 綠色, 灰色的部分), 但是從OS層來說卻是在同一台實體機器上執行了四份OS, 相同的libraries被重覆載入四次 (如下圖左邊藍色的部分), 所以記憶體, CPU等資源等於浪費了.

有了Container (如下圖右邊的Containers)我們就不需要浪費資源在各application共用的部分, 下圖右邊的Containers所要表現的就是我們不再需要為了執行虛擬化的application而重複地在各個虛擬環境中執行OS, 各虛擬環境透過使用Hosting OS已經載入過的libraries替我們節省實體機器上的資源, 當然, 這只是眾多優點中的一個而已.


另外一個優點就是透過maintain Dockerfile (點我看sample)能幫助我們更清楚地知道每個application的環境是如何建立出來的, 包含需要安裝哪些套件, 需要先設定什麼樣的參數與執行什麼樣的指令.  
Dockerfile中可以reference既有的docker image讓我們動態且快速的調整出不同情況下所需的虛擬環境, 而且Dockerfile很小的文字檔, 需要的人很快就可以取得並在自己的環境把image build出來, 而不需要隨便就傳個幾GB的流量.

概念上的說明進行到這裡就好, 關於Docker的基本設定+使用google已經提供很多資訊了, 下面是我實際設定+使用過程中預到的問題以及小筆記:


// unable to run firefox from docker

// configure docker to use devicemapper rather than aufs (某些application需要在devicemapper模式下才能在docker中執行, eg. DB2)
https://gist.github.com/pcolazurdo/e61cfb84812a70b93e74
umount -l $(grep 'aufs' /proc/mounts | awk '{print $2}' | sort -r)
rm -rf /var/lib/docker
vi /etc/init.d/docker
touch /var/lib/boot2docker/profile
在profile中加入
#!/bin/sh
EXTRA_ARGS="--storage-opt dm.basesize=20G --storage-driver=devicemapper"

// create local docker registry (for local push/pull, 如果想讓開發測試團隊在內網就能夠分享docker images, 自己建個docker registry是個不錯的選擇)
http://cloudcounselor.com/2014/01/07/docker-private-registry-on-centos-rhel-6-5/

// private docker-registry
yum install -y docker-registry
default port: 5000
default repository location: /var/lib/docker-registry
編輯/var/lib/boot2docker/profile:
EXTRA_ARGS="--storage-opt dm.basesize=40G --storage-driver=devicemapper --insecure-registry localdocker:5000"
編輯/etc/hosts:
{intranet IP} localdocker
編輯/etc/hosts後要重啓docker:
/etc/init.d/docker stop
/etc/init.d/docker start
push to private docker-registry: docker push localdocker:5000/{repository}:{tag}
pull from private docker-registry: docker pull localdocker:5000/{repository}:{tag}

// docker-registry rest api (用來管理local docker registry裡的docker images+版本)
https://docs.docker.com/reference/api/registry_api/#delete-a-repository-tag
eg. get tags of mydb2:
GET http://localdocker:5000/v1/repositories/library/mydb2/tags
eg. remove ssosdpbase tag from db2-trinity:
DELETE http://localdocker:5000/v1/repositories/library/mydb2/tags/base
remove repository:
DELETE http://localdocker:5000/v1/repositories/mydb2

Wednesday, December 15, 2010

修改CodeIgniter (aka. CI)使其能正確執行oci_bind_by_name所需步驟

修改CodeIgniter (aka. CI)使其能正確執行oci_bind_by_name所需步驟:
Step 1.
/system/database/DB_driver.php -->
line 293:
--
if (FALSE === ($this->result_id = $this->simple_query($sql)))
++
if (FALSE === ($this->result_id = $this->simple_query($sql, $binds)))
line 440:
--
function simple_query($sql)
++
function simple_query($sql, $binds=FALSE)
line 447:
--
return $this->_execute($sql);
++
return $this->_execute($sql, $binds);

Step 2.
/system/database/drivers/oci8/oci8_driver.php -->
line 165:
--
function _execute($sql)
++
function _execute($sql, $binds=FALSE)
line 172-172:
--
++
if($binds != FALSE) {
foreach($binds as $k => $bind) {
oci_bind_by_name($this->stmt_id, $bind['name'], $bind['value']);
}
}

使用範例:
$sql = "insert
into related_firm
(
TYPE,
NAME,
CONTACT_ADDR,
CONTACT_NUMBER,
CONTACT_FAX,
SN
)
values
(
:TYPE,
:NAME,
:CONTACT_ADDR,
:CONTACT_NUMBER,
:CONTACT_FAX,
:SN
)";
$params[] = array('name'=>':TYPE', 'value'=>$this->type);
$params[] = array('name'=>':NAME', 'value'=>$this->name);
$params[] = array('name'=>':CONTACT_ADDR', 'value'=>$this->contactAddress);
$params[] = array('name'=>':CONTACT_NUMBER', 'value'=>$this->contactNumber);
$params[] = array('name'=>':CONTACT_FAX', 'value'=>$this->contactFax);
$params[] = array('name'=>':SN', 'value'=>$this->serialNumber);
$db = $this->load->database('TESTDB', TRUE);
$db->query($sql, $values, TRUE);

Thursday, December 09, 2010

Generate setter/getter for PHP in Eclipse

很久沒發文了,慶祝今天找到個快速產生setter/getter的套件,特別上來分享一下!

話說使用Eclipse開發Java class時在變數上點右鍵後選source即可看到自動產生setter/getter的選項,但開發PHP class時卻沒有這項貼心的功能~
詢問Google老師之後看到了很多做法,其中不乏自行編輯Eclipse的template for auto code completion,但是最讚的莫過於PHP source plugin這個套件,裝完之後Eclipse的toolbar上會出現"PHP Source",點下去即可選擇要產生特定變數的Getter/Setter :-)

下面的URL是該套件的官方網站:
http://pdt.plugins.e-surf.pl/features.php
裡面有screenshot供人瞻仰。。。

Saturday, March 13, 2010

指定Eclipse使用JDK執行

Symdrome:

The Maven Integration requires that Eclipse be running in a JDK, beacuase a number of Maven core plugins are using jars from the JDK.

Please make sure the -vm options in eclipse.ini is pointing to a JDK and verify that Installed JREs are also using JDK installs.

Solution:
在eclipse.ini的最開頭(一定要在最開頭,而且-vm之後要換行!)加上jdk裡面javaw.exe的完整路徑,如下:
-vm
C:\Program Files\Java\jdk1.6.0_16\bin\javaw.exe

Sunday, March 07, 2010

Servicemix 3.3.1最常見的build error & solution

先給sulution:
http://cwiki.apache.org/SM/discussion-forums.html#nabble-tt25602583|a25603368

再給syndrome:

error: error reading
[Home_Dir]\.m2\repository\org\springframework\spring-dao\2.0.6\spring-dao-2.0.6.jar;
error in opening zip file
重點是error in opening zip file
根據官方說法,是被3rd party的東西影響到的,所以我們只需要將solution提供的repository加入pom.xml的repositories裡,再將zip file的目錄刪除,以上面的syndrome為例 --> [Home_Dir]\.m2\repository\org\springframework\spring-dao
然後重新執行mvn install皆可。

據說在3.3.2版本中會解決這個問題,至於他什麼時候要release,誰知道呢?
所以先將就一下temp solution,頂著先~

Thursday, March 04, 2010

不喜歡照著manual還做不出來的感覺!

Open source的東西這就是這樣。。。照著manual做還不一定能得到相同的結果!
http://servicemix.apache.org/building.html
已經是從SVN checkout src出來,還是在build的過程中得到這樣的錯誤訊息:

[INFO] Error building POM (may not be this project's POM).
Project ID: null:servicemix-utils:bundle:1.1.0
Reason: Cannot find parent: org.apache.servicemix:servicemix-pom for project: null:servicemix-utils:bundle:1.1.0 for project null:servicemix-utils:bundle:1.1.0

Google也不一定神準,花了點時間把垃圾過濾掉後終於找到解答
http://mail-archives.apache.org/mod_mbox/servicemix-users/201002.mbox/%3CA57F3D97-AB5E-4E7E-A84D-46B8771B9E5C@gmail.com%3E
原來是檔案根本就有問題!
刪掉讓maven在build的過程中自動再下載一次就解了,之後在build xerces也出現相同的錯誤,解法同樣是將對應的.pom檔移除。

Wednesday, February 24, 2010

眉眉角角~

今天終於解決了一個延宕多時的問題 --> 在我的機器上始終無法執行ANT!

C:\Documents and Settings\Administrator>ant
這個時候不應有 Files\Apache。

上Google找了很多次也找了很久始終找不到答案(居然有Google找不到的東西!),
在百般無奈下只好再度把manual翻出來看,終於在仔細研讀後看到了這麼一段話
Windows Note:

The ant.bat script makes use of three environment variables - ANT_HOME, CLASSPATH and JAVA_HOME. Ensure that ANT_HOME and JAVA_HOME variables are set, and that they do not have quotes (either ' or ") and they do not end with \ or with /. CLASSPATH should be unset or empty.

原來是我先前設定的CLASSPATH造成ANT無法執行,於是趕緊在ant.bat的開頭加上
set CLASSPATH=

經測試後終於解決了擱置超過半年的疑案!
C:\Documents and Settings\Administrator>ant
Buildfile: build.xml does not exist!
Build failed
這個故事告訴我們人要在走投無路而且有只能靠自己的覺悟時才會認真看manual。。。

Tuesday, August 11, 2009

tar + exclude

長久以來都是整個目錄tar起來,還沒有真的用過exclude功能,嘗試了一下之後發現exclude除了要帶路徑之外還要再加上個*,不然想exclude的路徑一樣會被tar起來。

這樣子是不會work2的:
tar czf auto_import.tar.gz --exclude="auto_import/csv_files/" --exclude="auto_import/tmp_csv/" auto_import

這樣子才對:
tar czf auto_import.tar.gz --exclude="auto_import/csv_files/*" --exclude="auto_import/tmp_csv/*" auto_import

Monday, August 10, 2009

擴充sqlldr的容錯值

使用sqlldr將資料倒進DB的時候Oracle預設只要遇到50比錯誤的資料就會停止import,若想將容錯值擴充為大於50,可以使用errors這個參數,範例如下:

/u01/app/oracle/product/10.2.0/db_1/bin/sqlldr control=./ctl_files/vp_tb_vasmd_cdrinfo.ctl errors=10000000 log=./log_files/vp_tb_vasmd_cdrinfo.log userid=foak/qazwsx direct=true

Tuesday, June 30, 2009

山不轉路轉

上一篇寫到要如何用Network Namespaces + Vconfig來做到只用一台電腦與一張PCI網卡就可以監控使用相同IP網段的多個VLAN,結果發現從獨立namespace發出帶有VLAN ID的封包始終無法成功的送到網路上,經過整整一個星期的思考,在iptables & ip route之間穿梭,卻找不到一個可以把封包丟出去的方法。。。
在我勤奮不懈的努力之下,洗澡的時候忽然有個"Multiple routing table"的想法閃過腦中,於是踏出浴室之後馬上google Linux是否有這種東西&要怎麼用,話說天救自救者,就這樣給我試出來了,哇哈哈哈!

有興趣的人可以用下面的script試一下:

+--NS2:------------------------------------------------



./ns_exec -nm -- /bin/bash
echo $$


+------------------------------------------------------

+--NS3:------------------------------------------------


./ns_exec -nm -- /bin/bash
echo $$


+------------------------------------------------------

+--NS1:------------------------------------------------


ip link add type veth
ip link add type veth

ip link set veth1 netns 1691
ip link set veth3 netns 1704

ifconfig veth0 192.168.0.1/24 up
ifconfig veth2 192.168.2.1/24 up

vconfig add eth0 11
vconfig add eth0 33

ifconfig eth0.11 10.0.0.11/24 up
ifconfig eth0.33 10.0.0.33/24 up

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp

ip rule add from 192.168.0.2 lookup 102
ip rule add from 192.168.2.2 lookup 122

ip route add default via 10.0.0.11 dev eth0.11 table 102
ip route add default via 10.0.0.33 dev eth0.33 table 122


+------------------------------------------------------

+--NS2:------------------------------------------------


ifconfig veth1 192.168.0.2/24 up
ip route add default via 192.168.0.1 dev veth1


+------------------------------------------------------

+--NS3:------------------------------------------------


ifconfig veth3 192.168.2.2/24 up
ip route add default via 192.168.2.1 dev veth3


+------------------------------------------------------

+--NS1:------------------------------------------------


tcpdump -ne -i eth0 not port 22


+------------------------------------------------------

tcpdump擷取到的封包資訊:


[root@vmf11 ~]# tcpdump -ne -i eth0 not port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:51:41.882589 00:0c:29:56:fb:d3 > Broadcast, ethertype 802.1Q (0x8100), length 46: vlan 11, p 0, ethertype ARP, arp who-has 10.0.0.10 tell 10.0.0.11
10:51:42.326170 00:0c:29:56:fb:d3 > Broadcast, ethertype 802.1Q (0x8100), length 46: vlan 33, p 0, ethertype ARP, arp who-has 10.0.0.10 tell 10.0.0.33




看到了嗎?
問相同IP地址的封包被加上不同的VLAN ID了!

Tuesday, June 23, 2009

Linux Container (Network Namespaces) + 802.1q (vconfig) + screen

今天要作筆記的對象是Virtual VLAN interface,虛擬化已經從最早的虛擬電腦(Vmware/Virtual PC/Qemu/Virtual box/Xen/KVM...etc)演進到虛擬switch(Virtual route forwarding enabled switch),虛擬的的Network interface其實也存在好一陣子(eg. IP alias),不過虛擬的VLAN interface倒是很少見。
雖然在2004年有人寫了個linux-vrf的patch,讓我們在Linux下可以透過chvrf這個工具指定某個process要透過哪張虛擬的VLAN interface對外丟封包,只不過該patch只支援到2.6.8版的Linux kernel(等同於Fedora Core2時代),那麼新版的Linux用戶該怎麼辦呢?沒關係,待我細細道來。
首先要先介紹Linux Container&802.1q support in Linux kernel。
簡單來說Linux Container是用來讓每個process有獨立的作業空間,這裡我們只用到獨立network interface的功能,802.1q support in Linux kernel則是讓使用者有能力創建支援VLAN tag的network interface,因此把這兩個功能相加之後便可以達到虛擬VLAN interface的功能,下面兩個連結有更詳盡的說明與tutorial:
Linux Container
Linux Container configuration guide中所提到的ns_exec工具可以用下面指令取得:
git clone git://git.sr71.net/~hallyn/cr_tests.git
802.1q support in Linux kernel


看完上面兩個連結之後,我們知道怎麼為各作業空間建立獨立的virtual network interface,也知道怎麼建立能夠發出帶有VLAN tag封包的virtual network interface,但是,如果我們想要用一台主機跟多個VLAN裡面的設備溝通時該怎麼辦呢?
答案就是在建立完veth之後再用vconfig在veth上面另外長個VLAN tag enabled network interface!
設定可以參考下面的script,這個例子用到screen來達到完全自動化(while-loop裡面可以再改進),在一般bash shell下執行script,而script中使用screen -X下達指令的對象為另一個bash shell中的screen,而兩個bash shell都必須使用root登入:



echo 1 > /proc/sys/net/ipv4/ip_forward

echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp

ip link add type veth

ifconfig veth0 192.168.0.101/24 up

route add -host 192.168.0.102 dev veth0

echo 1 > /proc/sys/net/ipv4/conf/veth0/proxy_arp



screen -X stuff './ns_exec -nm -- /bin/bash'

screen -X eval 'stuff "\015"'

sleep 1

screen -X stuff 'echo $$ >> pid'

screen -X eval 'stuff "\015"'



val=1;

while read line

do

echo $val $line;

veth=veth$val;

ip link set $veth netns $line;

#cmd='ifconfig veth1 192.168.0.102/24 up';

#echo $cmd;

#screen -X stuff $cmd;

screen -X stuff 'ifconfig veth1 192.168.0.102/24 up';

screen -X eval 'stuff "\015"'

screen -X stuff 'vconfig add veth1 11';

screen -X eval 'stuff "\015"'

screen -X stuff 'ifconfig veth1.11 10.0.0.1/24 up';

screen -X eval 'stuff "\015"'

screen -X stuff 'ip route add default via 192.168.0.102 dev veth1';

screen -X eval 'stuff "\015"'

val=`expr $val + 2`;

done < "pid"



echo finish startup




Wednesday, April 01, 2009

檔名過長怎麼辦?

今天遇到個很機車的問題,因為檔案名稱/路徑過長而無法刪除,試著rename但是連rename都失敗,如下:

C:\Program
Files\IBM\WebSphere\AST\updater\workspace\proxies\eclipse\features\up
dater.ast.fixpack.constellation.1005_1.0.0\backup\files\eclipse\plugins\com.ibm.
datatools.db2.luw.serverdiscovery_1.0.0.v200610132104\com\ibm\datatools\db2\luw\serverdiscovery>move model* a
檔名或副檔名太長。

還好找到這篇blog解救了我,始用到的是方法三:

方法3
首先先挑一個沒在用的磁碟機編號,例如 T
subst T: .
T:rename "thisisafuckinglongfile andyoucantopenit.jpg" new.jpg
C:
subst T: /d

注意第一行最後一個字元是 .
代表現在的資料夾這樣一來路徑就縮到最短了再執行rename最後一行是關掉虛擬磁碟

Tuesday, February 03, 2009

Oracle 10g and SQuirrel SQL

是的,今天要討論的是題目就是建立Oracle 10g database然後用免費的SQuirrel SQL連線進行檢視或修改。
安裝Oracle 10g十分容易因此不在這裡贅述,唯一要說明的是只要安裝Oracle 10g即可,不要勾選"建立起始資料庫",這樣可以節省不少空間。


安裝完之後點選
[開始] -> [所有程式] -> [Oracle - OraDb10g_home1] -> [組態設定核轉移工具] -> [資料庫組態輔助程式] (aka. DBCA)
有了這個幫手讓建立資料庫不再是難事,google上有很多介紹如何使用command line建立資料庫的連結,實際上跟著做過之後就會發現其實手續十分繁雜~
花點腦筋依序按下"下一步"之後資料庫就建立好了,這裡要注意的是請記得SID,之後的很多地方都會用到。
資料庫建立好了不代表我們現在就可以連到資料庫,接著我們需要建立並設定Network Listener(網路監聽器)。


請點選
[開始] -> [所有程式] -> [Oracle - OraDb10g_home1] -> [組態設定核轉移工具] -> [網路組態輔助程式] (aka. NETCA)
我們需要執行"網路組態輔助程式"兩次,第一次設定網路監聽器,第二次是設定區域網路服務名稱,在兩次的組態過程中請在"網路監聽器"與"服務名稱"中填入SID。


接著follow下面的link設定SQuirrel SQL。
http://www.norgesinternettforum.no/archive/index.php?t-1935.html
quote:

1. add the oracle driver
drivers > new driver
click on the Extra Class Path tab and press the button Add
browse to find the file on your hard drive called ojdbc14.jar
on my machine i had it in the weblogic installation directory, here:
/usr/bea/weblogic81/server/lib

Name: oracle 9 driver
Example URL: jdbc:oracle:thin:@10.0.0.150:1521:myoracledb
Website URL: http://oracle.com
Class Name: oracle.jdbc.driver.OracleDriver

the italicized texts are up to you what you write there. i got our information from this file on our bea server:
/usr/bea/user_projects/domains/myapp/config.xml

2. make the connection
aliases > new alias

Name: oracle 9 driver connection
Driver: (choose oracle 9 driver from the dropdown list)
User name: scott
Password: tiger
OK

highlight oracle 9 driver connection in the alias window and push the connection button or do the keyboard combination control+o
push the connect button
其中有幾個地方可以修改一下:

  1. "Oracle Thin Driver"即可,不需要新增一個新的driver名稱。
  2. 連線的時候把User Name從連結中的scott改成system,密碼就是建立資料庫時輸入的密碼。

連上資料庫之後到SQL tab使用create user與grant user的SQL指令新增資料庫的使用者,
或者如下面link的第一項。
http://life.iiietc.ncu.edu.tw/xms/forum/show.php?id=3337
quote:

1.login user: system
(1) --建立一個user名稱test01(CREATE USER test01)密碼預設為test01(語法:IDENTIFIED BY test01)
CREATE USER TEST01 IDENTIFIED BY test01 ;
(2) --賦予test01可以連接資料庫的權限
GRANT CREATE SESSION TO test01;
(3) --建立一個user test02,且賦予連線權限
CREATE USER TEST02 IDENTIFIED BY test02 ;
GRANT CREATE SESSION TO test02;

但是重點是以下這一行:
grant connect, resource to username;

[20090224]再更新一下:
ORACLE用ORACLE_SID來指定要連接到哪個DB,所以在下connect之令之前要記得先設定ORACLE_SID,在Linux的bash中用export,在Windows的"cmd"中用set。


做完這一系列的設定之後深深地發覺。。。Apache Derby在設定與使用上真是太簡單了!

Saturday, January 31, 2009

vmware-vdiskmanager -- final

避免昨天參考的連結哪天突然變成broken link,今天還是決定上來做個筆記:

[vmware-vdiskmanager的完整路徑] -x [擴充後的容量]GB [VMDK的完整路徑]
// [擴充後的容量]並不是所有的數字都可被接受,例如昨天我放20失敗,改用21嘗試後便成功

檢查/dev/下面是不是有新的sda#,sdb#,或是類似的裝置出現,接著將新增的裝置帶入下面的指令中
fdisk /dev/sda
在console的互動環境中建立新的partition(n)並將filesystem type改成LVM適用的8e,完成後
先將改變存回partition table中(w)再離開
// #為數字
// 如果直接輸入fdisk得到查無指令的訊息,請在前面加上/sbin/再試試看,以下的指令都適用

重新開機 or 執行partporbe(就不需要重開機)

pvcreate /dev/sda#

vgextend VolGroup00 /dev/sda#
// VolGroup00可能是其他名字,請執行vgdisplay然後檢視VG Name欄位

lvextend -L +XXG /dev/VolGroup/LogVol00
// 這裡的XX就藏在執行vgdisplay後得到資訊中的Free PE / Size欄位中
// 另外LogVol00請執行lvdisplay然後哪個VG Name所對應到的LV Size與原來的磁碟空間相符合

resize2fs /dev/VolGroup00/LogVol00
// 結束之後請執行df -h確認空間擴充完畢


最後做個總整理,順序是很重要的!

  1. vmware-vdiskmanager -->
    先增加實體的檔案空間,可能是pre-allocate可能不是,但是先讓vmware知道image的limit(可以說是存取範圍)在哪裡,這個步驟跟在電腦上加個新硬碟是一樣的意思
  2. fdisk -->
    加上新硬碟之後就要先幫新硬碟規劃partition(磁區)
  3. pvcreate -->
    告訴linux現在系統中多了新的磁區(physical volume)
  4. vgextend -->
    用新的磁區擴充現有的volume group
  5. lvextend -->
    擴充邏輯空間,單純設定新的存取範圍(logical volume)
  6. resize2fs -->
    在filesystem中將新的磁區真正納入logical volume所涵蓋的範圍

Friday, January 30, 2009

vmware-vdiskmanager -- continued

昨天使用vmware-vdiskmanager增加vmware image的容量之後其實事情還沒有結束,因為對於Linux來說有用的磁碟空間仍舊沒有改變,因為我採用LVM的方式規劃硬碟,所以參考了下面兩個連結完成增加vmware disk space的後續動作:

  1. http://www.global-domination.org/forum/viewtopic.php?t=750&sid=4b727581d6dbb199087becdd4c9fb31c
  2. http://www.swizzling.org/2008/04/01/expand-lvm-disk-on-linux-in-vmware/
其實上面的兩個連結內容大同小異,要說明的地方只有:
  • 第一個連結中寫到"Add *n*ew partition 3 as primary, change to LVM *t*ype (8e) ",這裡將新增的partition編號設定為"3",原因是fedora已經把1 & 2都用掉了~,其實如果四個ID都用完了也可以新增為extended,primary與extended的差別只在於extended不能開機。
  • 第一個連結與第二個連結的最後一個步驟分別使用了"ext2online"與"resize2fs"指令,經過實驗之後只有"resize2fs"才能適用於fedora。
以下是增大vmware image size前後使用"df -h"查看磁碟空間的結果:
增加vmware image size前
[root@localhost test]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 6.2G 3.0G 2.9G 51% /
/dev/sda1 190M 14M 167M 8% /boot
tmpfs 378M 0 378M 0% /dev/shm

增加vmware image size後
[root@localhost test]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 19G 3.0G 16G 17% /
/dev/sda1 190M 14M 167M 8% /boot
tmpfs 378M 0 378M 0% /dev/shm


PS. 原來fedora 9之後就可以直接寫NTFS格式的硬碟了!

Thursday, January 29, 2009

vmware-vdiskmanager

之前在vmware中裝了個測試平台專門用來處理資料庫相關的嘗試與測試作業,隨著raw data與日俱增,原先設定為20G的vmware disk也不太夠用,google之後發現了增大已存在的vmware disk空間的指令與用法,現在趕快寫下來備忘一下:

"c:\Program Files\VMware\VMware Server\vmware-vdiskmanager.exe" -x 42.0Gb "c:\Virtual Machines\Red Hat Linux\Red Hat Linux.vmdk"
其中的-x 42.0Gb指的是希望將原先的vmware disk增加到42Gb

PS. 要注意的是這個指令只能用在增加vmware disk上,想減少?抱歉,辦不到!儼然就像要變胖的人瘦回原先的樣子一樣 @@

Thursday, January 15, 2009

Tomcat & /etc/hosts

今天終於解決了一千古懸案 --> 啟動Tomcat之後就無法關閉。
之前一直以為是客戶IT的機車firewall規則造成的,後來在以色列同仁詢問我無法啟動Tomcat的原因時一並附上的error log中找到了關鍵字"Cannot assign requested address",上google搜尋之後發現原來是/etc/hosts沒有設定好(因為之前主機換地方所以IP也換了,但是忘了改/etc/hosts)。
至於完整解得請參考這裡