:::

編碼者間一致性信度:Cohen Kappa係數計算器 / Intercoder Reliability: Cohen's Kappa Coefficient Counter

布丁布丁吃布丁

編碼者間一致性信度:Cohen Kappa係數計算器 / Intercoder Reliability: Cohen's Kappa Coefficient Counter

intrater

我寫了一個線上計算Cohen Kappa係數的工具。本文簡單介紹編碼者間一致性信度與操作教學。


為什麼要算編碼者間的一致性信度? What’s Intercoder Relicability?

William M.K. Trochim這張圖傳神地描繪出編碼者間一致性的問題。兩位編碼者(coder),或著說是觀察者(observer) (註1),在分析與觀察同一件物品或現象時,兩個人的觀點可能會不太一樣。

註1:因為現在觀察大多是交給機器錄影或錄音,較無觀察偏見的問題。主要會受到人為影響的部分則是分析這些錄影與訪談的資料,而分析質性資料將之給與概念化標籤的方法稱之為「編碼」,進行編碼的研究者也就是「編碼者」。

如果兩人編碼結果相差很大,那表示研究者的分析方式不夠客觀、帶有嚴重偏頗。如果兩人編碼結果相同,那表示這是一個很穩定、具有足夠信度、可以重複使用的編碼方法。

因此現在的研究方法中會要求質性編碼要以兩位以上研究者來進行編碼,並利用統計來計算編碼者之間的一致性信度。

Cohen Kappa係數 / Cohen's Kappa Coefficient

image

依據資料類型的不同,一致性信度有很多種計算方式。在此介紹的是適用於名義尺度資料類型的Cohen Kappa係數計算方法。名義尺度的意思是資料編碼本身只是一個「代號」,代號與代號之間並沒有順序、間隔、比例的關係。Cohen Kappa係數只看有多少個編碼,兩個人之間的編碼相符的比例為何。由於Cohen Kappa排除了編碼者亂填的隨機性,因此比單純的相符百分比還來得可信。

Kappa係數介於-1 ~ 1之間。一般來說,能達到0.8以上是很棒的結果,但通常達到0.6~0.8就可以發表了。至於0.6以下,則是建議你們兩位編碼者再討論一下編碼方法,有更多共識之後再來重編一次吧。

Kappa係數

一致性程度

< 0.4

0.4 ~ 0.6

一般

0.6 ~ 0.8

> 0.8

極佳


計算器操作說明 / Counter Usage Guide

  1. 首先,在Google試算表或是Excel中,複製兩位編碼者的編碼結果。
    image
  2. 貼在「coding result」的表單欄位中。
    image
  3. 按下「Count Cohen’s Kappa Coefficient」之後,結果表格就會呈現在下方。紅字的部分就是Cohen Kappa係數了。 
    image
(more...)

Ubuntu中如何用腳本檔新增/etc/hosts設定 / How to write a script for adding hostname to /etc/hosts in Ubuntu

Ubuntu中如何用腳本檔新增/etc/hosts設定 / How to write a script for adding hostname to /etc/hosts in Ubuntu



由於權限限制的緣故,我們不能單純用echo與「>>」來新增/etc/hosts設定,而應該用sh -c。例如:

sudo -- sh -c "echo '10.0.0.254      mfsmaster' >> /etc/hosts"



/etc/hosts是做什麼用的? / What is /etc/hosts?


/etc/hosts 是電腦裡面設定 hostname 跟 IP配對的設定檔,跟DNS的角色很像,可是 /etc/hosts 這個可由使用者自行控制。

根據維基百科的定義:

hosts檔案是一個用於儲存電腦網路中各節點資訊的電腦檔案。這個檔案負責將主機名對映到相應的IP位址。hosts檔案通常用於補充或取代網路中DNS的功能。和DNS不同的是,電腦的使用者可以直接對hosts檔案進行控制。

在Windows裡面,hosts的位置會在 C:\Windows\System32\drivers\etc\hosts 。在Linux裡面,hosts則是在 /etc/hosts 裡面。以Linux來說,/etc/hosts的內容大致上如下:

127.0.0.1       localhost.localdomain localhost
127.0.1.1       zentyal.zentyal.dlll.nccu.edu.tw zentyal

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

系統安全性的關鍵 / Security Issues


必須注意的是,/etc/hosts 是系統安全性一個非常關鍵的系統檔案。因為修改 /etc/hosts 可以將網路連線偷天換日、讓使用者連線到錯誤的網站。舉例來說, 我們可以在 /etc/hosts 裡面加入以下 設定:

192.168.11.50    www.google.com.tw

這樣子連線到www.google.com.tw的網站時,就會被引導到192.168.11.50這個伺服器去。當然,這個IP不是Google真的伺服器,而可能是惡意人士的釣魚網站,你可能就會在未查覺的情況下將帳號密碼輸入到別人的電腦裡面了。

正因為如此, /etc/hosts 是系統安全性的一大關鍵,所以一般人是無法修改這個檔案。在Linux當中,我們必須要以root的身份才能做修改,但是如果要用bash script腳本檔的形式來自動新增 /etc/hosts 的設定,那就得用特殊的方式來設定了。

如何用腳本檔新增設定? / How to add configuration to /etc/hosts by script?


一般網路上在教的方法,都是用echo搭配 >> 來運作,例如:

sudo echo "10.0.0.254    mfsmaster" >> /etc/hosts

但是會導致權限問題,而無法輸入:



-bash: /etc/hosts: Permission denied

那正式的做法應該是用sudo -- sh -c,指令是:

sudo -- sh -c "echo '10.0.0.254      mfsmaster' >> /etc/hosts"


sh的-c參數的意思是:「執行一個字串類型的指令,可以用特殊參數0來替換$1, $2等參數」,總之就是這樣子就能夠用較高權限來設定 /etc/hosts 了。

好,那我繼續來整合MooseFS跟Zentyal。 (more...)

Windows Live Writer上傳到Blogger發生密碼錯誤的問題 / How to solve Windows Live Writer Permission Error

布丁布丁吃布丁

Windows Live Writer上傳到Blogger發生密碼錯誤的問題 / How to solve Windows Live Writer Permission Error

image

如果你發生了「Windows Live Writer無法使用此使用者名稱及密碼登入遠端伺服器。請確認您輸入正確資訊後再試一次。」的問題,這是因為Google賬戶設定中不允許安全性較低的應用程式存取你的賬戶。只要暫時開啟允許安全性較低的應用程式存取權限,再回到Windows Live Writer來更新即可。


如何啟用安全性較低的應用程式存取權限? / How to enable less secure apps access permission?

image

這個問題rtpHarry也講過,最簡單的做法,就是暫時打開安全性較低的應用程式存取權。

設成「開啟」之後,再來回到Windows Live Wirterr進行上傳的動作即可。用完之後可以再關閉存取權,以提高賬戶的安全性。

25 - 1

這個問題除了讓Windows Live Writer無法登入Blogger之外,我手機上使用IMAP的郵件APP也發生了同步錯誤的問題。這設定真是擾民啊。

有軟體可以取代WLW嗎? / Anyone could replace WLW?

我因為這個莫名其妙的緣故,導致很長一段時間都沒辦法使用Windows Live Writer (WLW)來寫。最近終於快受不了了,於是開始找看看有沒有可以替代WLW的程式。雖然這篇2014年的「13 Best Alternatives To Window live Writer For Windows, Mac & Linux」已經介紹了很多類似的工具,但很遺憾的是,大部分都是很久以前就存在、需要付費,甚至我還測試過的工具(Zoundary Raven)。

BlogJet3

抱著半放棄的心態,剛剛安裝了BlogJet來試試看能不能用。雖然是個付費的軟體,但如果可以用的話,倒也不是不可以買。只是試著新增Blogger帳號時,又發生了低安全性應用程式禁止登入的問題。好吧,如果這個問題都不能解決,那就跟用WLW還是一樣的程度,不如回頭繼續使用WLW。

WLW無可取代的功能有那些? / Important Features of WLW

image

這不禁讓我思考起,究竟我需要WLW的什麼功能?而這是其他Blog工具都無可取代的呢?

目前想到得有:

  • 圖片上傳整合Picasa:這真的是至今沒有看到任何Blog工具有這樣功能,太重要了。大部分的Blog工具都可以上傳到FTP,但是這個年頭還有人在FTP的嗎?
  • 簡易的圖片編輯功能:我喜歡WLW會為圖片加上陰影與的效果,這會讓人在看圖片時覺得跟內文有所區別,而且比較美觀。
    image
  • 整合Blogger範本的功能:我可以用我喜歡的背景顏色與字體顏色來寫作,這讓很容易進入專注的狀態。
  • 外掛Dynamic Template跟Code Snippet:WLW的外掛功能擴展了Blog寫作的無限可能,其中我認為最重要的兩個外掛,一個是可以標亮程式碼的Code Snippet,另一個是可以插入自訂程式碼的Dynamic Template。這兩個太重要了少了他們,叫我怎麼寫Blog?
    image

以前我也有很多次興起想要換掉WLW的念頭,結果時至今日,我還是繼續用著WLW。現在無法登入的問題也解決了,了那就繼續來寫吧。

(more...)

分號轉星號工具 / Convert Semicolon to Star

分號轉星號工具 / Convert Semicolon to Star

image

這一個幫學弟寫的簡易分析小程式。

功能:將「--」符號前最近的一個「;」替換成「*」。

(more...)

用OpenVZ安裝Zentyal失敗記錄

用OpenVZ安裝Zentyal失敗記錄

openvz

為了繼續之前提出的DLLL-CIAS第四版架構,我開始試著在Proxmox VE 3.2上用OpenVZ來安裝Zentyal (附帶一提,Proxmox VE本身是以VirtualBox架設的,因此是全部都在虛擬機器下運作)。我以ubuntu-14.04-x86_64.tar.gz為基礎,用apt-get來安裝Zentyal。過程很順利,但問題卻卡在最後的網路上:無法建立具有內網與外網的NAT。我嘗試了很多方法來解決這個問題,但總歸來說,無法建立的原因可歸納為兩個門檻:1. OpenVZ的veth網卡只能連到未公開的虛擬網路;2. OpenVZ的veth與venet之間無法轉遞封包。以下來說明我遇到的這兩個問題。


1. OpenVZ的veth網卡只能連到未公開的虛擬網路

image

在討論這個問題之前,我們必須先釐清OpenVZ的兩種網路模式:venet跟veth。下表是veth跟venet的差異比較:

veth跟venet的差異
Feature
特徵
veth venet
可使用的虛擬機器類型 OpenVZ
KVM
OpenVZ
可透過網頁管理
直接配置網路IP
No Yes
MAC address
網卡位置
Yes No
Broadcasts inside CT
封包會在虛擬機器間廣播
Yes No
Traffic sniffing
封包攔截
Yes No
Network security
網路安全
Low High
Can be used in bridges
可否用於橋接器
Yes No
IPv6 ready
可否使用IPv6
Yes Yes
Performance
效能
Fast Fastest

OpenVZ預設使用的是venet (Virtual NETwork),可以直接給定IP,速度非常快。但是venet沒有MAC位址,使用上較為受限,可能不適合作為Zentyal的網路。因此這次我選擇使用veth (Virtual ETHernet)來架設,veth是用模擬真實的網卡的方式,可給虛擬機器安裝如「eth0」的虛擬網卡,因此配置上會比較貼近我們真實使用情境下安裝Zentyal的模式。

我原本是這樣想,但很遺憾的是,veth並沒有照我想的去運作。建立的veth網卡只能在虛擬機器之前彼此連線,但是卻無法連上網際網路。

用KVM的方式新增veth:失敗

我是以Ubuntu 14.04來建立虛擬機器(又稱為container),一開始是用類似KVM的方式來新增網卡,但沒有成功。大致上步驟如下:

  1. 將虛擬機器關機。
  2. 新增veth網卡,Bridge設為vmbr0 (預設),其他參數、包括MAC位址,全由Proxmox VE自動指定。
  3. 虛擬機器開機。
  4. 在console端進入虛擬機器的指令列,設定網路。 (因為網路尚未設定好,所以沒辦法用SSH連入)
    以下都是虛擬機器 (container) 中的操作。
  5. /etc/network/interfaces中設定eth0:
    auto eth0
    iface eth0 inet static
            address 192.168.11.118
            netmask 255.255.255.0
            gateway 192.168.11.99
  6. 重新啟動網路:
    [container]# /etc/init.d/networking restart
  7. 使用ifconfig,確認eth0有正常啟動
  8. 使用ping,無法連到網際網路。
參考OpenVZ的veth說明來設定:失敗

由於用KVM設定veth的方法失敗了,所以我改找OpenVZ官方網站的veth說明來操作。該網頁介紹了很多方法,從簡單的設定使用IPv4的直接路由使用IPv6的直接路由、或是建立橋接器(brdige)等等。我按照上面的指示操作,但大部分都失敗了。

在OpenVZ的介紹中有幾個動作是之前沒有做過的:

  • 確保vzethdev載入:
    modprobe vzethdev
  • 開啟網路卡的forwarding跟proxy_arp

    [host-node]# ifconfig veth101.0 0
    [host-node]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/forwarding
    [host-node]# echo 1 > /proc/sys/net/ipv4/conf/veth101.0/proxy_arp
    [host-node]# echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding
    [host-node]# echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp

其他設定網卡的方法大致上類似。但是很遺憾的是,這些設定依然是無法讓veth網卡連線到網際網路。

奇妙的是,網路上許多人在OpenVZ中使用veth看起來都很順利,可是我自己使用OpenVZ從以前到現在就沒有veth順利連線的印象,這究竟是怎麼會是呢?如果有高手看到我這篇的話,希望能夠在下面留言欄為我解惑解惑。


2. OpenVZ的veth與venet之間無法轉遞封包

由於veth未能照預期的形式運作,所以我改轉用venet來設定網卡。

Zentyal只能抓到venet一張網卡

image

儘管虛擬機器可以設定兩個venet的IP,各別配置對外網路用的IP: 192.168.11.117跟對內網路用的IP: 10.0.0.254,但結果會如上圖所示,Zentyal只能抓到一個venet網卡。

這是因為venet網卡只有venet0,兩個IP是用虛擬網路卡的方式模擬出來的。我們可以用ifconfig來觀察虛擬機器的設定:

image

[container]# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:200 errors:0 dropped:0 overruns:0 frame:0
          TX packets:200 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:10000 (10.0 KB)  TX bytes:10000 (10.0 KB)

venet0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:127.0.0.2  P-t-P:127.0.0.2  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
          RX packets:35 errors:0 dropped:0 overruns:0 frame:0
          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4480 (4.4 KB)  TX bytes:6905 (6.9 KB)

venet0:0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:192.168.11.117  P-t-P:192.168.11.117  Bcast:192.168.11.117  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:1  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.0.0.254  P-t-P:10.0.0.254  Bcast:10.0.0.254  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

 

Zentyal設定邏輯中對外網路與對內網路有相當大的差異,若使用venet會導致Zentyal無法判斷那一張網卡是對外網路(External, WAN)還是對內網路,因此並不是一個可行的方案。

venet可連上網際網路,但無法架設NAT

即使如此,若使用venet的兩個IP來設定,對內網路依然連得到對內網路的虛擬機器、對外網路則可以讓網際網路的電腦來連線。不過光是這樣依然無法做成NAT的網路架構。

一般使用情境下,只要在Zentyal當中設定好對外網路與對內網路的網卡,Zentyal就會自動設定成NAT。若是不仰賴套裝軟體,也可以用iptables來實作NAT。我參考Ubuntu Server 12.04 LTS 設定 iptables 實現 NAT Server這篇的做法來做,關鍵的設定是在設定 IP Forwarding and Masquerading:
iptables --table nat --append POSTROUTING --out-interface venet0:0 -j MASQUERADE
iptables --append FORWARD --in-interface venet0:1 -j ACCEPT

但是很遺憾的是,依然無法成功。然後我試著用veth來作為內部網路的網卡,結果反而連venet都無法連線。我猜是因為Zentyal會蓋掉Proxmox對虛擬機器的網路設定,兩者導致了衝突。


結論:應該使用KVM來架設Zentyal

直到剛剛我都還在嘗試各種設定,但是總是該設一個期限。當我把這篇失敗的記錄寫完之後,我想也差不多該終止以OpenVZ架設Zentyal的研究,而回歸到原本使用KVM架設的規劃

想來還是有點不甘心,以OpenVZ架設的Zentyal壓縮後的備份檔案大小只有800MB不到,而且啟動速度又快。回去使用KVM的話,虛擬網卡會有網路轉換的額外負荷,只能說是「可以用」但稱不上是「很有效率」。只是因為伺服器虛擬化之後管理起來比較方便而已。

好吧,雖然不是一篇成功的研究,不過總是該打起精神,這條路就先到此為止吧。

(more...)

壞掉的伸縮筆電電源線 / Broken Extendable Power Supply Adapter Cord

布丁布丁吃布丁

壞掉的伸縮筆電電源線 / Broken Extendable Power Supply Adapter Cord

DSC_2256

我之前買了筆電用的三孔伸縮式電源線,但是用沒多久它就快斷掉了。因為覺得很擔心,所以在此提醒大家不要購買。

I bought a extendable notebook power cord, but it was broken after 3 months. I have to warn you that don’t buy this extendable cord.


粗大的電源線 / Heavy Power Cord

現代的筆電雖然做得很輕薄,可是變壓器卻是一直瘦不下來。雖然最近的筆電變壓器是有逐漸變小,至少已經不再像是一個磚頭,但是電源線卻還是非常粗大。

65a90f44a5d6388718c68efc8bc304ba

T客邦的無敵小恩恩也寫過一篇「貼紙、充電器,那些筆電還需要進步的事」中,也剛好拿了我現在在用的Acer Aspire S7作為例子。他這樣敘述S7的電源線:

「Acer Aspire S7 雖然充電器機身變小,但還是有兩條線材,收納頗佔空間。」

Free-shipping-Power-Supply-60W-font-b-Charger-b-font-Cord-for-font-b-Apple-b

筆電的電源線就不能做得像是Mac一樣纖細好帶嗎?

於是我就花了點時間,找找看有沒有其他電源線可以取代那條厚重的電線。

露天的伸縮電源線 / Extendable Power Cord from Ruten

image

在露天搜尋一下,居然發現了有伸縮式的筆電電源線。這種電源線是用捲軸伸縮,需要時拉長、收納時縮短,線的尺寸也比原來筆電的電源線細了許多,讓我看了心動不已。價格含運費不到200元,我很快就下單買回來,取代了原本的筆電電源線。

雖然黑色的伸縮電源線跟白色的變壓器色調不搭,但是無所謂,這條線真的讓我覺得筆電好帶許多。不僅重量比較輕,線材收納也很容易。當時我真的很高興我買了一個實用的產品,只是沒想到,這段高興的日子也不過三個月而已。

壞掉的電源線 / Broken Power Cord

買來三個月左右,我在一般情況下接著電源線使用筆電時,赫然發現筆電居然是使用電池,不是用供電器的電源。

DSC_2259

我檢查看看到底是什麼問題的時候,竟然發現伸縮電源線的線居然裂開,裡面的銅線不僅斷掉,還都跑出來了。我大驚失色,這未免也太危險了。碰到的話可真的是會被電到啊。之前電源線大多都是擺在桌下或是筆電後面,沒有仔細觀察電源線的狀況,沒想到它居然在不知不覺間都壞成這樣了。

因為覺得很恐怖,所以我馬上把伸縮電源線拿掉,換回原本的粗重電源線。雖然粗重了一點,但也是令人安心許多。

這次的經驗告訴我們,電源的東西真的不要亂買,還是乖乖配合原廠的產品吧。(不想要粗厚電源線的話,那就考慮原廠的Mac……?)

(more...)

解決Android上Google日曆同步錯誤問題:安裝Google的Googlde日曆 / How to solve Google Calendar sync error in Android: Install Google Calender APP

布丁布丁吃布丁

解決Android上Google日曆同步錯誤問題:安裝Google的Googlde日曆 / How to solve Google Calendar sync error in Android: Install Google Calender APP

image

我最近發現我的Android裝置都發生了Google日曆同步錯誤的問題,讓我無法把電腦上新增的時間同步到手機與平板上。但是安裝了Google自己推出的Google日曆之後,日曆同步就恢復正常了。

Recently my Android devices got calendar sync error. But after I installed Google Calendar APP, calendar sync is going working.


4 - 1

我習慣用電腦或平板電腦編輯行事曆,然後手機負責當鬧鐘。平時使用的行事曆管理工具是Digical,因為它介面簡單好操作,也可以設定通知或電子郵件提醒,一直很深得我心。

Screenshot_2015-01-04-16-21-51

可是最近在電腦上跟平板上設定的事件,卻奇怪地沒能同步到手機上。檢查了「設定 」→「帳號」→「Google」→我的帳號→「同步化行事曆」的時候,卻發現行事曆同步出現了異常的符號。同步的時間也跟其他服務有明顯的落差,我的平板最後同步時間甚至是到一個月以前。即使我手動啟動同步,行事曆也無法順利更新,非常奇怪。

Screenshot_2015-01-07-09-01-20

後來看網路上的建議是說需要安裝Google自己推出「Google日曆」,這樣行事曆才能正常同步。

4 - 2

我抱著半信半疑的心態安裝了Google日曆,並跳過簡單的使用操作,進入到了Google日曆操作畫面。由於行事曆尚未順利同步,所以這時候Google日曆上也沒有我完整的行事曆。

Screenshot_2015-01-07-08-57-12

接著再回到設定同步化行事曆畫面,手動進行同步。這次同步時不會馬上就發生異常而停止,而是會持續連線好長一段時間。過了許久之後,行事曆就正常同步了

不能移除Google日曆 / If Uninstall Google Calendar

4 - 3

後來我想說我平時不習慣Google日曆太過花俏的介面,還是主要使用Digical,索性乾脆把Google日曆移除掉好了。

結果移除掉之後,行事曆又無法同步了!真的是非得要安裝Google日曆不行。Google現在的同步服務做的真的很奇怪啊。

還是不能同步? / Still Sync Error?

用了幾天之後,即使安裝著Google日曆,赫然發現還是有同步失敗的問題。最後我參考「簡單解決 Android 裝置無法與 Google 帳戶同步」這篇文章,到 Android的 設定 > 應用程式 > 全部 > 儲存行事曆,清除行事曆的快取即可。

最近這件事情真讓我感到頭大啊……

(more...)