2018年8月30日

安裝Parity筆記

安裝rust

curl https://sh.rustup.rs -sSf | sh

安裝parity

  
git clone https://github.com/paritytech/parity-ethereum
cd parity-ethereum
git checkout stable //只安裝stable版本
cargo build --release --features final

或直接下載 binary :
https://github.com/paritytech/parity-ethereum/releases

缺少套件

  • libudev.h
yum install systemd-devel
  • cmake3:
下載cmak3 source (https://cmake.org/)
./bootstrap --prefix=/usr/local
make
make install

執行

./parity --jsonrpc-interface=w.x.y.z --jsonrpc-apis=eth,web3,personal,net,traces --jsonrpc-cors=all --chain=ropsten --jsonrpc-threads=1 --tracing=on
interface 表示要綁在哪一張網卡上

參數說明

  • --jsonrpc-interface 綁定rpc service的IP
  • --jsonrpc-apis 5 RPC支援的API
  • --jsonrpc-cors 允許CORS的網域
  • --chain 使用的ether網路名稱
  • --jsonrpc-threads RPC服務耗用CPU的資源
  • --tracing=on 開啟trace模式
  • --geth geth相容模式,讓RCP的指令可以跟geth相容一點點
  • --warp 使用snapshot方式同步最近的資料,之後有空的時候會慢慢同步前面的資料

config

  • parity也可以使用設定檔,設定檔位址在~/.local/share/io.parity.ethereum/config.toml
[parity]
mode = "active"
mode_timeout = 300
mode_alarm = 3600
auto_update = "critical"
release_track = "current"
public_node = false
no_download = false
no_consensus = false
no_persistent_txqueue = false

chain = "kovan"
base_path = "$HOME/.local/share/io.parity.ethereum"
db_path = "$HOME/.local/share/io.parity.ethereum/chains"
keys_path = "$HOME/.local/share/io.parity.ethereum/keys"
identity = ""
light = false

[rpc]
disable = false
port = 8545
interface = "w.x.y.z"
cors = ["all"]
apis = ["web3", "eth", "net", "personal", "traces"]
hosts = ["none"]
server_threads = 1

[websockets]
disable = true

[ipc]
disable = true

[footprint]
tracing = "on"

[misc]
logging = "own_tx=trace"
log_file = "/var/log/parity.log"
color = true

問題排除

  • 錯誤訊息 : TraceDB resync required
    修改~/.local/share/io.parity.ethereum/chains/test/user_defaults,把tracing改為true
  • 當啟動tracing模式的時候將無法使用warp sync

RPC 執行範例

  • Command
curl --data '{"method":"trace_filter","params":[{"fromBlock":"0x1","toBlock":"latest","fromAddress":["0x..............."]"]}],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST w.x.y.z:8545
curl -X POST --data '{"jsonrpc": "2.0", "id":"curltest", "method": "eth_getTransactionByHash", "params": ["0x..............."] }' -H 'content-type: application/json' http://w.x.y.z:8545
  • Result
{"jsonrpc":"2.0","result":[{....}],"id":1}

2018年6月13日

重設Mysql密碼(5.7 以上)

關閉mysql 服務:
sudo mysqld_safe --skip-grant-tables &
sudo /etc/init.d/mysqld stop
mysql -uroot 
登入後指令:
use mysql;          
update user set authentication_string=PASSWORD("") where User='root';
update user set plugin="mysql_native_password" where User='root';
flush privileges;
quit;
重設密碼:
mysqladmin -u root password

2018年4月17日

乙太坊筆記 – 建立虛擬鏈

  • 初始化私有ETH網路,可以用puppeth指令產生創世區塊的json內容
geth --datadir “./privatechain” init custom_genesis.json
  • 建立兩個節點,這樣之後一個節點可以提供rpc服務,一個可以用來挖礦
  • 如果是要在同一台機器上建立不同的節點,所有的節點都必須在獨立的目錄底下運作

        {
          "config": {
            "chainId": 657,
            "homesteadBlock": 1,
            "eip150Block": 2,
            "eip150Hash": "0x000000000000000000000000000000000...",
            "eip155Block": 3,
            "eip158Block": 3,
            "byzantiumBlock": 4,
            "ethash": {}
          },
          "nonce": "0x0",
          "timestamp": "0x5ad4459f",
          "extraData": "0x000000000000000000000000000000000...",
          "gasLimit": "0x47b760",
          "difficulty": "0x80000",
          "mixHash": "0x000000000000000000000000000000000...",
          "coinbase": "0x000000000000000000000000000000000...",
          "alloc": {
            "xxxx": {
              "balance": "0x2000000000000000000000000000000000..."
            }
          },
          "number": "0x0",
          "gasUsed": "0x0",
          "parentHash": "0x000000000000000000000000000000000..."
        }
        
  • custom_genesis.json 裡面可以放一些錢給測試用的帳號:
    "alloc": {
               "0xxxxxx":
                   {"balance": "10000"}
            }
        
  • 在console啟動節點
    • 常用參數
      • --networkid 為啟動在哪個網路id,避免衝突
      • --datadir 為指定區塊鏈資料位置
      • --ipcdisable 不加這個參數的話在本地啟動多個服務會出現access deny(CentOS沒這個問題,windows才會)
      • --config 後面可以加上自定義的TOML檔案來設定參數
      • 在<datadir>/geth/底下的static-nodes.json可以定義要和這個node同步的peers
      • 指令後面加上 dumpconfig 可以把設定值匯出成toml檔案
    • node1(監聽2000 port) :
    geth --datadir ./privatechain --networkid 1510 
    --port 2000 --ipcdisable console
            
    • node2(監聽2001 port) :
    geth --datadir ./privatechain --networkid 1510 
    --port 2001 --ipcdisable console
            
  • 讓兩個節點可以互相溝通
    • 在node1執行 admin.nodeInfo
      在輸出的結果中找到enode 資訊,會有類似底下的格式 :
      enode://xxxxx@[::]:2000,把enode的xxxx抄下來
    • 回到node2,執行
      admin.addPeer("enode://xxxxx@127.0.0.1:2000")
      127.0.0.1:2000 是node1監聽的位置
      照相同的步驟在node1把node2的端點加進去
      執行 admin.peers 檢查一下是否兩個node都互相連結了
    • 每次重啟node都需要重新做一次,可以直接toml設定檔來寫入設定,避免每次都要重新加
  • 在console模式底下的指令:
    • 查看帳戶
      eth.accounts

    • 建立帳號,設定密碼 123456
      personal.newAccount("123456")

      產生的私鑰會放在keystore目錄裡面
    • 解鎖帳號,這樣就不需要輸入密鑰也能交易
      personal.unlockAccount('0xxxxxx','pass')

  • 啟動RPC服務
    geth --datadir ./privatechain --networkid 1510 --rpc

會開始監聽 8545 port



  • 挖礦
    geth --datadir ./privatechain --networkid 1510 
            --port 2001 --ipcdisable --mine --minerthreads=1 
    --etherbase=0xxxxx 

    • etherbase 用來指定挖礦的coin要歸戶給哪個帳戶
    • minerthreads 表示要用幾個thread來挖礦



  • 交易
    Ethereum EVM的單位是Wei
    1 Ether = 1,000,000,000,000,000,000 Wei
    交易費用 = 實際用到的Gas * Gas Price
    如果Gas Limit不夠,交易將會無法完成,但是手續費會被扣掉
    如果Gas足夠,剩下的Gas會釋出所以不會多收手續費
  • 注意事項
    • 不管是要在哪一個node對虛擬鏈下交易指令,都必須在那一台node上啟動挖礦,否則交易都會卡在pending裡面(有時候在各個node可以查到交易成功,但是用了第三方套件例如metamask則會無法顯示正確交易結果)
    • 有時候挖礦指令會當掉,必須先
      miner.stop()
      miner.start(1)
      重新開啟
  • 每個node最後執行的指令
    • node 1 :
      geth --datadir ./privatechain --networkid 1510 
              --port 2000 --config config.toml --rpc 
      --rpcaddr x.x.x.x --rpccorsdomain "*" console
    • node 2:
      geth --datadir ./privatechain --networkid 1510 
              --port 2001 --config config.toml --mine 
      --minerthreads=1 --etherbase=0xxxxx console
  • 2018年3月15日

    Let's encrypt 支援Wildcard SSL

    也許是太多奧客客訴了,現在acme.sh 指令後面要加上 --yes-I-know-dns-manual-mode-enough-go-ahead-please

    Let's encrypt已經在3/13號開始支援wildcard ssl了,不過Wildcard SSL只能用dns-01做驗證,並且必須使用ACME 2.0。以下就記錄一下設定過程:

    1.安裝acme.sh

    專案網址為 https://github.com/Neilpang/acme.sh,可以在linux主機上安裝支援Bash, dash和sh的shell script
    目前certbot還不支援wildcard ssl,所以先用這個吧
    
    curl https://get.acme.sh | sh
    
    
    等他跑完就完成了,他會安裝在/.acme.sh/ 目錄底下,並協助設定環境變數。
    重新登出後或使用source .bashrc 指令更新一下環境變數就可以直接使用了

    2.取得驗證用的dns紀錄和生成需求(以*.example.com為例):

    
    acme.sh  --issue -d *.example.com --dns  \
      --yes-I-know-dns-manual-mode-enough-go-ahead-please
    
    
    接下來let's encrypt會請你設定一個名為 _acme-challenge.example.com 的DNS TXT Record,確定設定好之後再執行下面的指令。
    PS. 記住要確定設定好了再做(先用nslookup或dig 好好確認一下),不然他會再生出一組新的需求,並重新產生一個新的TXT內容,然後你就要再設定一次DNS。 

    3.再來就是要產生cert和key了

    如果成功會告訴你他把key和cert都放在/root/.acme.sh/*.example.com 底下。
    
    acme.sh  --renew -d *.example.com \ 
     --yes-I-know-dns-manual-mode-enough-go-ahead-please
    
     

    4.重新把你需要的cert和key發布到其他目錄:

    其實要自己搬過去也是可以啦
    
    acme.sh  --installcert  -d  *.example.com   \
            --cert-file /etc/nginx/ssl/example.com.cert \
            --key-file   /etc/nginx/ssl/example.com.private.key
     

    5.設定nginx 來支援ssl:

        
    ssl_certificate /etc/nginx/ssl/example.com.cert;
    ssl_certificate_key /etc/nginx/ssl/example.com.private.key;
    
    

    6.重啟nginx:

        
    service nginx restart
    
    

    2017年12月14日

    利用docker-compose建立tomcat和apache整合的服務

    本文為記錄公司專案中整合 apache和tomcat在docker上執行的實例,Apache套件是另外安裝,tomcat則是拿搭配JRE 1.7的版本 

    Dockerfile - Apache
    FROM ubuntu
    ENV TZ=Asia/Taipei
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    RUN apt-get update && apt-get install -y --no-install-recommends apache2 libapache2-mod-jk
    RUN a2enmod proxy
    RUN a2enmod proxy_http
    RUN a2enmod proxy_balancer
    RUN a2enmod proxy_wstunnel
    
    ADD ./conf/apache2.conf /etc/apache2/apache2.conf
    ADD ./conf/000-default.conf /etc/apache2/sites-enabled/000-default.conf
    ADD ./conf/worker.properties /etc/libapache2-mod-jk/workers.properties
    ADD ./conf/jk.conf /etc/apache2/mods-available/jk.conf
    VOLUME ["/var/log/apache2"]
    EXPOSE 80 443
    
    CMD ["apachectl", "-k", "start", "-DFOREGROUND"]

    conf/jk.conf
    JKMount /htdocs/* web_1

    conf/apache2.conf
    LoadModule jk_module modules/mod_jk.so
    JkWorkersFile /etc/libapache2-mod-jk/workers.properties
    JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
    Dockerfile - Tomcat

    FROM tomcat:7-jre7
    ENV TZ=Asia/Taipei
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    #把編譯好的war檔包進去
    COPY ./webapps/wales-test.war /usr/local/tomcat/webapps/
    # 一些tomcat的context 設定 
    COPY ./wales-test.xml /usr/local/tomcat/conf/Catalina/localhost/ 
    COPY ./lib/mysql-connector-java-5.1.28-bin.jar /usr/local/tomcat/lib/ 
    COPY ./lib/proxool-0.9.1.jar /usr/local/tomcat/lib/ 
    COPY ./lib/proxool-cglib.jar /usr/local/tomcat/lib/ 
    COPY ./lib/commons-logging-1.2.jar /usr/local/tomcat/lib/ 
    EXPOSE 8009

    docker-compose.yml
    
    version: "2" 
      services:
        tomcat:
          volumes:
          - ./tomcat/logs:/usr/local/tomcat/logs 
          expose:
          - 8009
          Image: wales /tomcat
          container_name: "tomcat"
          build: ./tomcat
          environment:
          - JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom
          networks:
            wales_net:
                ipv4_address: 192.168.1.2
    
        http:
          volumes:
          - ./httpd/logs:/var/log/apache2
          ports:
          - "80:80"
          - "443:443"
          image: wales/httpd
          container_name: "httpd"
          build: ./httpd
          networks:
            wales_net:
                ipv4_address: 192.168.1.3
      
      #另外指定docker要用的網路區段
      networks:
        wales_net:
            driver: bridge
            ipam:
                driver: default 
                config:
                    subnet: 192.168.1.0/24
        
    啟動服務

    docker build -t devmaster/httpd httpd/
    docker build -t devmaster/tomcat tomcat/
    docker-compose up -d

    2017年3月25日

    Virtualbox - Host Only Adapter問題解決方案

           自從使用Windows 10之後使用VirtualBox就一直遇到困難,由於我會在Virtual Box的guest裡面安裝Centos,再利用 host來存取guest的服務,所以我會設定兩張網卡:一張是NAT,另一張則是僅限主機,但是在改用Windows 10之後就一直踢到鐵板,甚至連vagrant 和docker toolbar也不能使用。



           本來還想說難道是我自己的問題?為什麼台灣沒有半個人遇到?現在想想應該是大部分的工程師為了要讓自己潮一點都改用mac了吧

           在國外一些論壇已經有很多人發現這個問題,大部分都是指向HostOnly Adapter裡面的VirtualBox NDIS6 Bridged Networking Driver這個服務,只要將他disable就可以,但是見鬼的是我根本沒有這個服務,倒是多了一個Kaspersky Anti-virus NDIS Filter,所以這個方法對我來說也沒用。

           最後找到有另外一個和我同病相憐的網友,則是提供了在安裝Virtual Box就要先根除NDIS6的方法,安裝Virtual Box的時候順便加上以下的指令:
    VirtualBox-5.1.18-114002-Win  -msiparams NETWORKTYPE=NDIS5
     然後他就 Works like a charm了~

    2016年11月26日

    不需要利用ntpdate就可以校時

           網路上看到有人的Server需透過proxy才能上網,但是ntpdate不支援proxy設定;竟然想到用wget連到google去取得http response heade來作時間同步,真是有夠神。
    http_proxy=http://youruser:yourpassword@proxyip:proxyport;export http_proxy
    date -s "$(wget --no-cache -S -O /dev/null google.com 2>&1 | sed -n -e '/ *Date: */ {' -e s///p -e q -e '}')"
           來源網址 :

    2016年2月26日

    覆寫jQuery UI Dialog plugin


           最近有一個需求是要自訂jQuery UI Dialog plugin的行為,像是增加新的option和額外處理dialog出現時的 UI配置。研究一下知道要用Jquery UI的Widget Factory,讓jQuery UI Dialog覆寫他自己的function。

    $.widget("ui.dialog", $.extend({}, $.ui.dialog.prototype, {}):
    再把要覆寫的function寫到最後的{}底下:
    $.widget("ui.dialog", $.extend({}, $.ui.dialog.prototype, {
    //覆寫open事件,先呼叫super再執行自訂的函式。把醜醜的jquery ui 叉叉圖案改成fontawesome
      open: function() {
        $.ui.dialog.prototype.open.apply(this, arguments);
        var titlBar = $(this.uiDialogTitlebar).find(".ui-dialog-titlebar-close");
        titlBar.empty().append("");
      },
      //覆寫建立title事件,改為自行定義的函式。增加title前的圖案
      _title: function(title) {
        if (!this.options.type || this.options.type == "info") {
          this.uiDialog.removeClass("error").addClass("info");
          if (!this.options.title) {
            title.html(" 提示");
          } else {
            title.html(" " + this.options.title);
          }
        } else {
          switch (this.options.type) { //可新增其他的類型
            case "error":
              this.uiDialog.removeClass("info").addClass("error");
              if (!this.options.title) {
                title.html(" 錯誤");
              } else {
                title.html(" " + this.options.title);
              }
              break;
          }
        }
      }
    }));
    其中在呼叫jQuery UI Dialog原來的父類別open函數撞牆了,按照網路上的討論是:
    $.ui.dialog.prototype.open.apply(this, arguments);
    但是這樣會進入一個無限的循環,然後就甚麼都動不了。必須在一開始先將這個父類別函數取出來,再進行呼叫 :
    var _dialogOpen = $.ui.dialog.prototype.open;
    $.widget("ui.dialog", $.extend({}, $.ui.dialog.prototype, {
      open: function() {
        _dialogOpen.apply(this, arguments);
        var titlBar = $(this.uiDialogTitlebar).find(".ui-dialog-titlebar-close");
        titlBar.empty().append("");
      }
    ========略========
    }
    fiddle完成範例:

    2015年12月22日

    免電池車燈使用心得

            騎腳踏車到捷運站轉乘上班已經有好長一段時間了,之前為了安全都會買車尾燈跟前燈以確保安全。但是目前買到需要裝電池的車燈,不是下雨天進水就是常常短路,時亮時不亮,平均兩三個月就要換一組。 後來改用塑膠型的快拆車燈,防水是防水了,但是常常被偷,塑膠一扯就帶走了。因為要常常趕車搭捷運不會每次都記得要拆下來放到背包裡,而且用久之後都會髒髒的,其實也不想特別收起來啊!偏偏就是有人愛偷這種的。光是這種類型的車燈就被偷了三個,一個可是要三百元啊!

            前陣子在FB上看到有一種是免電池的車燈,這個在我小時候用過,他會有一個長長的裝置連接到車輪,用車輪帶動他發電,也就是以馬達發電。但是這種接觸式的缺點就是騎起來車會變得比較重。因為需要拿腳的動力去帶動發電機發電。  不過看到的這款是免接觸的,所以不會碰到車輪也不會有多餘的功耗費;主要就是由磁力產生電力,看起來好像挺有意思的。於是就跟老闆買了一組來試用看看。


            目前用的這款是淑女車和小折專用的,另一款就是給碟煞車輪用的,看原理是用強力磁鐵來帶動發電機發電;用了一個月之後感覺還滿滿意的,因為他裝上去之後就不用再去碰他了,而且他是鎖在煞車皮的部位,要偷走他還得準備工具才行。

            目前好像還有白光版,之後再來下單買一組用用看。感覺這組車燈還滿適合在都市通勤的人使用的。老闆也可以考慮研發一下可以儲電的,這樣在郊區使用的時候也不怕車停下來就沒電囉。

    官方粉絲團
    https://www.facebook.com/xbatlightch/

    2015年4月23日

    好用,但是問題多多的Chart.js

    Chart.js是一個很好用的javascript畫圖表工具,但是他卻有一些奇怪的問題。這麼久了似乎也沒有被解掉。
    在這邊紀錄一下目前使用Chart.js遇到的問題:

    • 變換圖表資料導致錯亂
    當你有一個有使用ToolTip的圖表,而這個圖表的內容需要動態替換時這個問題就會產生,範例如下



    當切換圖表的時候,之前的第一個圖表會時不時的出現,擾亂使用者的思緒(只有當滑鼠在圖表上移動的時候會發生這個問題)
    解決問題的方式很簡單,我被這個問題困住好久啊! 解法為 -- 在更換新的資料前,要先執行destroy(),如果不這麼做的話,當使用者在圖表上下了click事件的時候,圖表上的值也會取不到,或是會取到最早那個圖表的資料。看來就是兩個圖表完全重疊在一起了,而且事件還共用。

    • 不要使用barValueSpacing
    這個問題只會發生在bar chart,因為只有bar chart有這個參數(喂~),加了這個參數之後在每個bar之間會出現一個間隙,但是這個東西會導致click也會完全出錯,到目前為止1.0.2還是沒有解決

    2014年8月4日

    利用Selenium IDE進行UI測試

    • 安裝與執行
      • Selenium IDE是Firefox的一個plugin,用來做UI的自動測試:下載網址為http://docs.seleniumhq.org/download/
      • 安裝後,點一下firefox 的工具 -> Selenium IDE ,就會出現底下畫面
    螢幕快照 2014-08-01 下午1.40.15.png
      • 建立test Case可以使用畫面右方的Screenshot at 8月 01 13-41-31.png來進行錄製,錄製完後的畫面如下所示:
    Screenshot at 8月 01 13-48-13.png
      • 錄製完後的case可以使用播放的按鈕Screenshot at 8月 01 13-49-49.png來執行。
      • Screenshot at 8月 04 16-37-34.png這個功能可以設定你要跑的test case是要快一點還是慢一點,通常慢一點比較好,跑太快常常會出問題。
      • 底下的Log視窗可以顯示目前執行發生了多少個問題或是正常完成。
      • 如果有設定WaitFor的Command的話,最長的等待時間是三十秒(預設,可以在option裡面設定)
    • 編寫測試語法
      • 除了自動錄製外,使用者也可以自行撰寫測試語法:點選右邊Table區塊的任一個工作項目後,視窗下方會出現Command、Target與Value三個欄位。
        • Command : 使用Seleium IDE提供的命令,有Click、Verify、Waitfor、Assert等數十種命令可以使用 http://docs.seleniumhq.org/docs/02_selenium_ide.jsp#script-syntax,官網的文件寫的很爛,可以參考http://software-testing-tutorials-automation.blogspot.in/search/label/selenium%20ide
        • Targert : 用來指定Command所要處理的目的,可以是CSS selector、Xpath、link、id或數值(例如pause這個command需要停留的毫秒數),點取target旁邊的Select可以在firefox的視窗裡面選擇你想要套用的元件,但是這個功能常常失效。
        • Value : 指定Command需要用到的數值,例如type時需要輸入什麼字串(pause的秒數需要設定在target)
      • 所有的測試語法都是html的table格式,每列共有三欄,分別是command,target與value。
      • 可以利用store這個Command將javascript運算結果儲存到selenium IDE裏面方便其他command叫用。
        • 例如底下的範例:
    commandstore
    targetjavascript{ var a = Math.random() * 5; Math.ceil(a+1);}
    value:j

    將會產生一個變數j,且其值為亂數取得2~6之間的整數,調用方式如下:

    command:click
    targetcss=#modifyLocalTree > ul.jqueryFileTree:nth-child(${j}) > li.directory.collapsed > a

    利用${}將變數括起來就可以直接使用。

      • 利用waitForxxx系列Command可以讓程式等待某個元件顯示或隱藏時再進行下一個動作,例如:
        • waitForElementNotPresent : 當DOM被移除時才會繼續進行下一步。
        • waitForElementPresent: 當DOM產生時才會繼續進行下一步。
        • waitForVisible : 只有當css的display屬性被設定可顯示時才會繼續進行。
        • waitFoNotrVisible : 只有當css的display屬性被設定none時才會繼續進行。
      • 利用type指令可以在指定的input裡面輸入自定的文字。
      • 利用click指令可以點選指定的DOM,同時也可以用來模擬點選radio或是checkbox,如果沒有指定radio的index,預設會點選第一個。

    後面等我繼續使用,有心得再來補好了

    2014年5月28日

    jQuery 1.9之後的attr

    今天在寫一個table中tr的click事件,本來想要在某一列上click之後就自動選取前方的checkbox;經過許久的測試後發現事情並不單純,利用以前舊有的attr方法來做竟然發生問題

    原來的版本

    在這個解法中是利用.attr('checked')來檢查目前checkbox的選取狀態,在第一次run的時候,功能完全正常;但是如果點了第二次他就失靈了,如果利用Chrome developer tool來查看元件,會發現checkbox的後面會忠實地加上checked="checked"這樣的屬性,妙的是checkbox的顯示完全是未選取狀態。

    查了jQuery的文件後發現,在jQuery 1.9之後要改用prop,雖然這個在1.6版就有了,但現在看來1.9不用這個會出大問題

    http://jquery.com/upgrade-guide/1.9/#attr-versus-prop-

    修改後的版本

    改用prop來檢測目前的checkbox狀態,並且用prop來變更checkbox狀態。這樣就可以正常呈現想要的功能,不過如果再用Chrome developer tool來看的話,會發現checkbox之後的checked ="checked"根本不會改變...
    這真是太詭異了

    2014年2月14日

    PL/SQL迴圈及暫存資料表

    莫名其妙被扯入Oracle EBS系統,被迫學習PL/SQL語法;
    以下為建立暫存資料表及利用迴圈取得相對應子項目資料再一起寫入暫存的筆記:

    //建立暫存資料表

    create GLOBAL TEMPORARY TABLE temp_wales (
      DESCRIPTION VARCHAR2(80 BYTE),
      ASSET_NUMBER VARCHAR2(15 BYTE),
      DATE_PLACED_IN_SERVICE DATE,
      LIFE_IN_MONTHS NUMBER(4,0)
    )
    ON COMMIT PRESERVE ROWS;

    //A取得ID後再去比對B資料表中的Parent_ID

    BEGIN

        FOR rec IN (SELECT ID,DESCRIPTION,ASSET_NUMBER,DATE_PLACED_IN_SERVICE,LIFE_IN_MONTHS FROM A )

    //開始迴圈
        LOOP

    //先寫入父資料的記錄到暫存裡

          INSERT INTO temp_wales( ASSET_NUMBER,DESCRIPTION,DATE_PLACED_IN_SERVICE, LIFE_IN_MONTHS) values( rec.ASSET_NUMBER,rec.DESCRIPTION,rec.DATE_PLACED_IN_SERVICE,rec.LIFE_IN_MONTHS);

    //再寫入子資料的記錄到暫存裡

          INSERT INTO temp_wales( ASSET_NUMBER,DESCRIPTION,DATE_PLACED_IN_SERVICE, LIFE_IN_MONTHS)  SELECT ASSET_NUMBER,'改良',rec.DATE_PLACED_IN_SERVICE,rec.LIFE_IN_MONTHS FROM B WHERE Parent_ID=   rec.ID;

    //結束迴圈

        END LOOP;

    END;

    //撈撈看是否有資料了

    select * from temp_wales;


    2012年11月30日

    好濕!好濕啊~


    蚤起,沐浴更衣。排腹中穢物,良久!
    出浴門,驚覺八點過廿,疾著衣靴。天雨之,披雨簑,名之雙濕;跨鐵輪疾驅。過半,果蓑衣汁水淋漓,衣衫褲襪竟皆濕透,雙濕之稱果不負其名!
    忽鐵輪沉重難以駕馭,下車觀之,鐵輪竟開口而笑!本應肥腴身型竟如路邊瘦丐奄奄一息。
    攙鐵輪尋巷道中鐵輪工匠,不果,萬念俱灰!
    撚袋中銅幣一枚,卜卦之;曰:今天不宜仕事,大喜!乃歸。

    2012年7月26日

    jQuery的droppable問題

    最近在改同事寫的網頁,其中有個動態產生droppable div的功能,程式如下
    function createDiv(id){
        item =  '<div id="div_' + id + '">';
        $('#div_map').prepend( item).droppable({
            drop : function(event, ui) {
                    $("#div_' + id).hide(); 
                    do something ....
            }
        });
    }

    畫面上還有幾個其他的droppable div,見鬼的是明明動態產生的div是隱藏的,但是當我把dragable的物件拉過去時,他永遠都會觸發我動態新增的最後一個div事件;假如這個func我跑五次,他就會跑到div_5去;這實在是不合理,已經hidden的東西為什麼可以droppable?

    測試了好久,感覺應該是物件剛建立就被賦予這個事件出錯,於是改成:


    function createDiv(id){
       item =  '<div id="div_' + id + '">';
        $('# div_map ').prepend( item);
        $('#chat_' + id).droppable({
            drop : function(event, ui) {
            $("#div_' + id).hide(); 
                do something ....
            }
        });
    }

    問題解決!

    2012年7月16日

    Virtualbox - 變更VirtualBox硬碟大小

    當VirtualBox硬碟設定為固定大小時,之後如果發現硬碟太小;這時無法用網路上說的方式增加空間,這世界並沒有想像中美好。

    必須先將硬碟檔複製一份:

    VBoxManage clonehd old.vdi  new.vdi --variant Standard

    如果複製完出現uuid重複的話,再下:

    VBoxManage internalcommands sethduuid new.vdi
    來重新產生uuid

    最後再用:
    VBoxManage modifyhd new.vdi --resize 改變之後的大小(MB)

    ex: VBoxManage modifyhd new.vdi --resize 200000

    別再相信網路上抄來抄去的方法了....那真的不能用...

    2010年6月25日

    Facebook 加入粉絲按鈕

    Facebook以前的加入粉絲按鈕改成讚了,網路上google一下只會發現都是講這件事的文章,但是根本沒人告訴你如何在自己的頁面上產生這個功能,不然就是用Facebook social plugin中的Like Box或是Fan Box;又大又肥,如果我只想要一個讚的按鈕呢?
    請改用like button吧!

    iframe src="http://www.facebook.com/plugins/like.php?href=這邊 改成你的粉絲專頁的網址就好了&amp;layout=button_count&amp;show_faces=true& amp;width=200&amp;action=like&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:200px; height:21px;" allowTransparency="true"

    讚跟加入粉絲現在是一模一樣的東西了,也難怪網路上一堆人要求粉絲頁的"讚"要改回"加入粉絲團"一直沒人理了,因為這樣做Facebook才省事啊!

    Facebook iframe 變更長寬

    Facebook的API正在新舊交替中,所以很多該死的功能都會相衝;為了在facebook的iframe模式中可以自訂iframe長寬,以前必須使用
    FB.CanvasClient.setCanvasHeight 
    可是他會和新版的Javascript SDK(connect-js)相衝 ,所以要改用
    FB.init({appId: 'app ID', status: true, cookie: true, xfbml: true});
        window.fbAsyncInit = function() {
            FB.Canvas.setSize({width:760,height: 1200 });
        }
    如果頁面中有使用動態產生資料而影響某個DIV的寬高的話,一定要先呼叫這個函數,再去呼叫你要變動DIV的script,不然天才的Internet Explorer會瘋掉! ----一個快被facebook搞死的人的衷心建議

    2009年2月1日

    被入侵的居住環境

    我現在住的地方是住宅區,這邊的里長可能是為了要幫居民增加一些收入,硬是把這邊弄成黃昏市場,窄窄的一條巷子轉眼間變成了顧客往來的要道,一到了下午人聲鼎沸好不熱鬧。也許其他人知道我們住黃昏市場之後總會說這樣買東西會很方便,但是在方便底下的不便卻是說也說不完。

    首先樓下住的是一間賣麵條的住戶,這間賣麵的工廠往往在八點就開始揉製麵團,揉麵的機器一開,我們大概也不用睡覺了,機器的聲音震耳欲聾,而且全年無休。例假日想要好好睡個覺往往無法如願。而其他的店家往往在十一點就開始準備他們要賣的東西,這邊有一堆賣豬肉、雞肉的攤販,說實在的那種味道並不好聞,而且這些攤販往往都不注重環境的整潔,血水、雞毛弄得滿地都是;一到了下午六點,這些攤販為了趕快把東西賣掉便會開始吆喝,此起彼落的叫賣聲讓人聽的很不舒服,更常常有攤販在家門口擺攤,連進家門都要和來購物的顧客推擠一番才能進門。

    由於這樣的環境不是太好,環境髒亂又不得安寧;所以很多在這邊置產的人大多把房子租出去,讓自己遠離這個是非之地,更有將頂樓加蓋,一次租給五六戶房客的例子發生。或許是不把這邊當自己的家了,所以這裡的房東也不挑房客,往往來這邊住的房客也大多不是善類,例如會在我們家門口抽煙,把煙蒂丟在樓梯口、或是把垃圾塞在我們的鐵門上,到了深夜還常常有一堆牛鬼蛇神在樓下打架叫囂。而且我還懷疑有職業賭場在這邊營業,因為這邊天天都聽的到搓麻將的聲音。

    這次的大年初五更是誇張,一堆店家選在六點開工,也不管這邊是不是住宅區,開工完竟然開始放鞭炮,此起彼落的鞭炮聲,根本沒辦法再睡下去了,所以我在六點多就沒辦法在睡下去。被吵醒的我不禁在想,大部分提議要將某個地區做轉型計畫的人,在轉型前後你們到底有沒有在當地待過?這邊本來是安靜的住宅區,被里長這樣一搞,安寧的環境不再;取而代之的是髒亂、吵雜以及治安的問題,而被迫要去接受這種改變的人卻是必須天天住在這邊的人。就好像前鎮子通過的博奕條款,說要在離島蓋賭場,說好聽的是促進地方發展,但是在這個政策執行之後,到底有多少人是受益的?有多少人必須被迫接受因為賭場帶來的惡果?治安問題、環境保護的問題,到底有多少人替離島居民想過?我在這樣的一個環境裡我已深受其害,如果大家一開始知道這邊會被改成黃昏市場,相信沒有人會敢買這邊的房子,我不知道里長有沒有調查過大家的意願;而離島蓋賭場這種大事為什麼是六十幾個不在當地的人就可以輕易決定呢?不知道有多少人是跟我一樣無奈。而我更希望這些做決策的人,在做決定之前,請先聽聽居民的心聲。

    2008年7月31日

    文化?

    前陣子台北捷運公司放出消息說不希望大家搭乘電扶梯的時候靠右讓左側的人通行這個行為主要是善意的,因為幾年前就有人因為沒有握緊扶手而跌落;這個新聞一放出來之後真的是舉城嘩然。開始有人大罵捷運公司在走回頭路,將辛辛苦苦建立的捷運文化棄若敝屣,過幾天後捷運公司馬上說他們沒有這樣的意思,他們只是建議不是強制;果真是眾怒難犯,但捷運真的有文化嗎?這真是令我懷疑的一件事情。之前馬市長在位的時候老是將捷運文化當成一個政績來宣傳,但是台北市捷運哪來的文化?有什麼可以拿出來讓大家看的呢?

    走進捷運站的大門,大門兩旁總會有幾位工讀生忙著拿水果日報、磁鐵報跟一堆奇奇怪怪的報紙給你,看起來好像是捷運的人士可以在乘坐捷運的這段時間吸收新聞和一些資訊,當大多數的人每天都被重播到爛的新聞疲勞轟炸時,連在捷運這短短幾分鐘的時間也要拿來讀這些垃圾新聞嗎?況且搭乘的時間很短,根本也不需要拿這麼多份報紙,但大多數的人都是多多益善,一次就拿好幾份。雖然捷運站內有報紙回收箱,但不製造就不需要回收!這才是真正文明人的作法,只要有人拿就會有人繼續發;現在連捷運公司都自己出報紙了,這樣的舉動真的沒有什麼意義,不是說要節能減碳嗎?努力作回收就可以減碳了嗎?為何不從不製造無用物品開始呢?

    搭上電扶梯,看到大家都靠著右站立;靠右站立禮讓左側通行,這是捷運開始營運後沒多久就在喊的口號,讓左側通行主要是希望趕時間的旅客可以通過電扶梯,讓他們早點到達目的地。這是讓睡過頭趕不及上班的人一點點小方便,本來應該是靠右站立旅客的美意,但是如果你現在佔住電扶梯左側可是會被罵的,真的無法理解,如果要趕時間大可以走旁邊的樓梯,那比電扶梯安全幾十倍而且寬敞的樓梯寬度可以讓你走地比在電扶梯上還快,但這些睡過頭的人可不這麼想,又要趕時間又要輕鬆;天底下竟然有這麼享受的事情,其他的乘客沒有必要為你的貪睡而被迫擠在電扶梯右側的小空間裡,這不是文化,這是一種積非成是的病態。

    下了電扶梯,開始排隊等電車了,這時可以看到大家井然有序的排在地上畫好的線裡,沒有人會隨意插隊,多麼有秩序的捷運文化!不久車來了,這時突然發現旁邊本來沒有站人的,這時卻突然擠滿了人,原來排隊只是在車還沒來的時候才需要排的,車來了就可以隨便亂插隊,更糟的是一群人突然擠在一塊,車上的人根本不能下車;往往要等外面的人先擠上五六位到車廂之後車上的人才有空間可以擠下車,上下車秩序亂成一團。這是什麼樣的文化?

    好不容易擠上車了,如果有位子當然是一件好事,沒位子站著也是無妨。一進入車廂內總會先看到博愛座,但博愛座上坐著的永遠都不會是那些該坐的人,前陣子郝市長大發雷霆,說怎麼學生都不讓座,要公布學校之類的;先不要那麼大火氣,快看看坐在博愛坐上的是不是只有學生?連成年人都不會讓座了,你覺得他們教出來的小孩有可能讓座嗎?最詭異的是最近竟然還在推廣一個活動,就是當有需要坐博愛座的人可以去服務台拿一張貼紙貼在衣服上,讓看到貼紙的人讓座給你。這真的是相當本末倒置的一件事,本來博愛座就該給有需要的人坐,現在反而要亮出貼紙請那些佔用的人讓開;不過事實上貼了貼紙也是沒用的,看倌沒發現那些在博愛座上的人都是閉著眼睛的嗎?

    到站了,我很勉強地擠出電車門,當然又得跟那堆擠在門口要上車的人展開一場閃避戰,氣喘噓噓出了閘道走出捷運大門,我剛剛經歷一個大都市最醜陋的浮世繪,然而卻有人為這樣醜陋、不文明行為冠上文化一詞,除了無奈,我沒有別的話可說。

    精選文章

    利用Selenium IDE進行UI測試

    安裝與執行 Selenium IDE是Firefox的一個plugin,用來做UI的自動測試:下載網址為http://docs.seleniumhq.org/download/ 安裝後,點一下firefox 的工具 -> Selenium IDE ,就會...