Tuesday, August 04, 2015

8/1~2(六日)~砂卡礑步道>七星潭>花蓮賞鯨>白楊步道健走


砂卡礑步道>七星潭>花蓮賞鯨>白楊步道健走

CVE-2015-5477 Named DoS

最近這個代誌很大條. 負責 DNS 伺服器的管理員們趕快更新吧! 

這是 100% 可以擊倒的, 只要權威主機被多掛幾台, 就會有一堆網站受影響. 


手邊也拿到攻擊的程式, 接下來研究看看.


 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-5477

Sunday, October 05, 2014

用台灣的本土文化交流就是這麼歡樂 - 台灣三太子

誰說文化交流一定要用那些繼承過來文謅謅的中國文化, 用台灣的本土文化交流就是這麼歡樂.



以下內容轉錄自 YouTube, 版權為創作者所有.



Friday, September 26, 2014

Bash CVE-2014-6271 和 CVE-2014-7169 漏洞暫時解法

今天收到長官指示要看這一篇

Bash Shell 漏洞威脅不小於 Heartbleed!Unix-Like 作業系統請儘速更新


才剛升級完成, 也做出第一版的升級原始碼給抓不到 RPM 的機器. 就又收到同事的晴天霹靂.

  Bash Shellshock Command Injection Vulnerability (CVE-2014-6271 and CVE-2014-7169)


真是雙重打擊效(笑)果好?!

目前現況: EL6 可以直接升級, 但是只解決 6271. FreeBSD 9 及 10 使用 ports 升級也是一樣. 只有 Ubuntu 的更新版本可以直接修掉 6271 及 7169. 小弟自己從 GNU 下載並且已經上好 patch . 接著再從 Ubuntu 中挖出 patch 檔. 成果就放在雲端硬碟中, 歡迎大家取用.

目前測試過的平台 EL6 x86_64, EL5 x86_64. FreeBSD 尚未測試. (要不是剛好要去當工作人員, 應該可以更早做出來)

檔案在此 https://drive.google.com/folderview?id=0B1TOrKgNeD45N0VxQWZ1c1JrU0U&usp=sharing

PS: 由於這是應急沒有經過官方完整測試的版本, 請勿上到重要的環境. 後果請自負.
PS2: 解法是由高手找出來的, 不要問我喔!甘溫.

服用方法很簡單
1. 解開壓縮檔
2. 到目錄下 ./configure
3. make
4. make install
5. 程式會將 bash 安裝到 /usr/local/bin
6. 測試沒問題請想辦法蓋掉 /bin/bash
收工

祝 大家有個忙碌的週末. ^^;;;

Sunday, August 03, 2014

掃描子網路下的主機是否有開啟服務埠口

這個計畫的目的是找出子網路下有哪些主機提供服務, 目前只有簡單的偵測 Ping(ICMP), Web(80), DNS(open resolver), SSH(22), SMTP(25). 未來將陸續增加偵測服務的項目. 雖然已經有 nmap 等優秀軟體, 不過仍舊希望能發展出簡易的程式, 更希望能匯聚更多偵測點讓資料搜集時間縮短. 接下來將開始設計資料庫結構及提供查詢的API.

目前尚有資料來源的問題, 就是各國網段清單. 目前是從 ip2nation 計算出網段. 但是這個資料並不是即時資料, 所以如果有哪位大德知道去哪找免費的清單, 請不吝告訴在下.

專案網址: https://github.com/jengyic/IP_Research

Thursday, June 26, 2014

嘗試將大量的 IPv4 位址放在記憶體且快速找到

首先, 這是個緊急的需求, 所以沒時間慢慢磨演算法. 第一時間想到的是變成無符號整數放到陣列, 初始化時使用 quick sort 排序, 搜尋使用 binary search. 果真是太嫩了, 實作出來之後, 效能非常普通.

陣列搜尋

好吧! 只好拿出記憶用起雜湊表, 雜湊函數十分簡單. 第一版: 取高低 16 bits 進行 XOR 取得 bucket 位置, 再建立單向鍊結串列. 第二版為了有效縮短串列, 使用 24 bits 進行 XOR.

第二版

測試數據為從某台 TLD NS 的某一段時間所有來訪的 IPv4 (524,860筆), 搜尋測試為 100,000 次(命中與不命中次數為 1:1, 唯一缺點就是沒有每次跑雜湊函式, 有空再來重作一次測試). 測試結果如下.

測試結果

結論是適合的演算法比較重要, 繼續尋找更快的演算法.

題外話: printf 真是超級耗時的, 可以從不輸出資料的測試結果看出.

Saturday, October 19, 2013

目錄下大量檔案 piconv 轉碼的簡易 shell script

之前為了將一些 Big-5 資料庫檔案轉成 UTF-8 用過 iconv 但是遇到某些字元就會出錯無法完成翻譯。後來找到 piconv 可以完整將所有資料庫匯出檔案轉碼。今天為了看 SGU Season 1 找到簡體字幕,沒想到用 piconv 一樣沒出錯完成轉碼。

Google雲端硬碟公開分享 檔名 piconvTrans.sh

Friday, April 12, 2013

個人的網路架構

個人的網路架構, 大致上都是用廉價的產品兜出來. 總算有時間整理一下資料.


Sunday, December 30, 2012

使用 shell script 透過 SSH 在遠端伺服器執行程式

這隻程式只是個簡單的實做連線前偵測遠端伺服器是否可以 ping 到及服務埠是否有開啟. 程式碼如下

FreeBSD下用 shell script 建立ZFS snapshot 更新版

此次更新的目的是讓 ZFS 不使用 ls /PATH/.zfs/snapshot 目錄判斷快照數量(為了避開 Bad file descriptor 問題). 中間版本曾經使用 /usr/local/bin/snapshot list 進行, 但是速度較慢. 好在這個檔案是 shell script. 看了一下 op_list 函式的內容看到取得目前已有的快照方法, 也了解到這隻程式慢在還要查詢及計算使用空間等數據. 所以將查詢改用 zfs list -H -t snapshot -o name | grep "ZPOOL_NAME/ZVOL_NAME@". (ZPOOL_NAME/ZVOL_NAME 可以使用 zfs list -H -o name ${volpath} 查詢得到)

使用 SSHFS 掛載遠端目錄

1. 安裝 SSHFS
FreeBSD 下請安裝 /usr/ports/sysutils/fusefs-sshfs
Ubuntu/Debian 下請 apt-get install sshfs

Mount :
sshfs RemoteServerAccountName@SSHServerName:/Remote/path /Mount/path -o follow_symlinks

Umount :
FreeBSD : umount /Mount/path
Ubuntu/Debian : fusermount -u /Mount/path

2. 使用掛載 shell script
目前暫時不做作業系統版本判斷. 所以有以下的兩組 shell script:

Friday, December 14, 2012

讓 cron 可以每隔幾秒執行 shell script

之前使用每五分鐘檢查是否有嘗試入侵的機器, 發現有些機器會一下送來一堆連線. 所以只好將執行時間降到以秒為單位. 由於檢查用的 shell script 約在幾秒內完成, 所以就用下列的 shell script 來達成.

C++範例程式 : 四則運算計算機


這隻程式主要測試程式設計師對以鍊結串列形成的堆疊進行操作的能力(事實上檢查輸入字串的部份有佇列的概念-先進先出 FIFO). 另外也對四則運算的基本原理進行了解, 並使用堆疊完成正確的計算. 實際上寫這隻程式之前應該有另一個版本的程式 : 先將計算式轉成後序式, 再使用後序式進行計算(只需要一個堆疊即可). 不過我們並不需要輸出後序式, 所以搭配兩個堆疊直接算出結果.

程式困難的地方在:
1. 檢查輸入的計算式產生已完成檢查的鍊結串列 : 哪些運算符號(運算子 operator)是可以使用的? 運算元(數字 operand)的規格?

2. 操作運算元及運算子的堆疊 : 根據不同符號及優先權決定是否放入堆疊或是先計算再放入堆疊. 最後還要記得清空堆疊, 再輸出結果.

程式碼如下:

C++範例程式 : 約瑟夫問題

這個題目是用來測試程式設計師對環狀單向鍊結串列操作是否熟悉. 建立環狀鍊結串列是本程式中簡單的任務, 重點放在如何將環狀鍊結串列成員正確的刪除並保持串列完整性.
程式碼如下 :

Tuesday, November 27, 2012

開放式課程網站


以下是個人花不少時間蒐集的數位學習網站. 上面有非常大量的數位學習內容, 相信未來還會有能互動的數位學習網站/內容興起.
 
]
### WorldWide
MYOOPS
 
Berkeley
 
MIT
 
Standford 
 
Harvard
 
Utah
 
Washington
 
JHSPH
 
Coursera
 
CodeSchool
 
OCWConsortium
 
### Taiwan
TOCWC
 
NTU
 
NTHU
 
NCTU
 
NCKU
 
NCU
 
KMU

Saturday, November 17, 2012

透過 VPN 買 Android apps FX Plus

本來想要用免費軟體玩 Android, 沒想到還是刷了第一筆 USD 2.99 買個免費軟體(File Explorer)的 sshfs 模組(FX Plus). 這個軟體不只是可以 sshfs 還可以掛雲端硬碟(Google Drive, Dropbox, Box, SkyDrive, SugarSync 前三個測試過). 其實之前用 NFS 掛伺服器的目錄就很好用了, 但是遇到伺服器(Ubuntu)的硬碟是 NTFS|FAT|FAT16 目錄權限會限縮到只有 Owner 可以看, 從 NFS client (Android)看到的就是 Permission denied. 有了 sshfs 就可以遨遊自己的個人目錄(連 symbolic link 也可以進去).

使用 VPN 繞過官商打架.

FX Plus

在 Windows (2003 不可用, XP以上) 上可以使用 win-sshfs.(symbolic link : OK)
http://code.google.com/p/win-sshfs/
接下來就是找windows server 2003 的 sshfs 解法, 對於使用者就可以不一定要用 SAMBA 了. 讓 SAMBA 變成公用目錄或暫存用目錄, 就可以不用 ACL 在那邊傷腦筋.

其實本來是想用 BlueStacks (http://www.pigo.idv.tw/archives/1641) 突破的. 但是在Win XP VM搞半天 BlueStacks 就是看到黑畫面. 才放棄這個方法改用上述的方法(VPN連線不能使用加密還真是 OOXX). 

在 FreeBSD 建立樣版功能的 jail 環境


0. 準備步驟 :
0.0. 準備 Host 的網路環境
0.0.0. 綁 IP 到 Host : 編輯 /etc/rc.conf 加上 IP alias 設定
ifconfig_em0_alias1="192.168.66.66 netmask 255.255.255.255"

0.0.1. 設定 natd (如果是只有一片網卡的機器就可以不用, 此步驟適用機器有跨在兩個網路(一內一外)上)
Edit /etc/rc.conf

gateway_enable="YES"

firewall_enable="YES"
firewall_type="/etc/my.firewall"
firewall_script="/etc/my.firewall"
firewall_logging="YES"

natd_enable="YES"
natd_interface="re0"
natd_flags="-l -f /etc/natd.conf"


Edit /etc/my.firewall (請依照實際需求更改)

#!/bin/sh -

fwcmd="/sbin/ipfw"                                                                                               
INTIF="re0"
LANIF0="em0"


${fwcmd} -f flush                                                                                              
#For NATD                                                                                                      
${fwcmd} add 00030 divert natd all from any to any via ${INTIF}
...
${fwcmd} add 65000 pass all from any to any

Edit /etc/natd.conf

use_sockets yes
same_ports yes
dynamic yes

Edit /etc/services
natd            8668/divert # Network Address Translation


接著 Host 重新啟動.

0.1. 在 /usr/src 編譯整個環境.
# cd /usr/src; make buildworld

1. 設定樣板存放位置且安裝樣板

# zfs create storage/jail
# zfs set mountpoint=/storage/jail storage/jail
# zfs set dedup=on storage/jail
# zfs set quota=300G storage/jail
# zfs create storage/jails
# zfs set mountpoint=/storage/jails storage/jails
# zfs set dedup=on storage/jails
# zfs set quota=300G storage/jails
# mkdir -p /storage/jail/mroot

# cd /usr/src
# make installworld DESTDIR=/storage/jail/mroot

2. 複製 src 及 ports 
# cd /storage/jail/mroot
# mkdir usr/ports
# portsnap -p /storage/jail/mroot/usr/ports fetch extract
# cpdup /usr/src /storage/jail/mroot/usr/src

3. 建立樣板環境
# mkdir /storage/jail/skel /storage/jail/skel/home /storage/jail/skel/usr-X11R6 /storage/jail/skel/distfiles /storage/jail/skel/packages
# mv etc /storage/jail/skel
# mv usr/local /storage/jail/skel/usr-local
# mv tmp /storage/jail/skel
# mv var /storage/jail/skel
# mv root /storage/jail/skel

4. 產生設定檔
# mergemaster -t /storage/jail/skel/var/tmp/temproot -D /storage/jail/skel -i
# cd /storage/jail/skel
# rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev

5. 建立個別環境可寫入的目錄
#cd /storage/jail/mroot
#mkdir s
#ln -s s/etc etc
#ln -s s/home home
#ln -s s/root root
#ln -s ../s/usr-local usr/local
#ln -s ../s/usr-X11R6 usr/X11R6
#ln -s ../../s/distfiles usr/ports/distfiles
#ln -s ../../s/packages usr/ports/packages
#ln -s s/tmp tmp
#ln -s s/var var

6. 建立 jailed O.S. 的 make.conf
# Add /storage/jail/skel/etc/make.conf
# WRKDIRPREFIX?=  /s/portbuild

以下是每個 jailed O.S. 都要做一次

7. 設定 Host 每次開機為 jailed O.S. 掛上目錄
[FreeBSD 9 labdata2] (Why: 開機時因 ZFS 來不及掛載而無法在 /etc/fstab 處理)
Edit /etc/rc.local
### For jail
/sbin/mount -t nullfs -r /storage/jail/mroot /storage/jail/labdata2
/sbin/mount -t nullfs -rw /storage/jails/labdata2 /storage/jail/labdata2/s

[FreeBSD 8 localdata2]
Edit /etc/fstab

#/storage/jail/mroot   /storage/jail/localdata2     nullfs  ro  0   0
#/storage/jails/localdata2     /storage/jail/localdata2/s   nullfs  rw  0   0


8. 編輯 Host 的 /etc/rc.conf
###20121004
jail_enable="YES"
jail_set_hostname_allow="NO"
### 以下是清單, 有幾台 jailed O.S. 就登記幾台
jail_list="localdata2"
### 以下是每一台 jailed O.S. 的設定記得每一台都要有一組設定.(前四行是必要的)
jail_localdata2_hostname="localdata2.DOMAIN_NAME"
jail_localdata2_ip="192.168.66.66"
jail_localdata2_interface="em0"
jail_localdata2_rootdir="/storage/jail/localdata2"
jail_localdata2_devfs_enable="YES"
### 20121113 解決 netstat -rn 查詢問題
#jail_localdata2_devfs_ruleset="devfsrules_jail"
jail_localdata2_devfs_ruleset="devfsrules_jail2"
jail_localdata2_exec_start="/bin/sh /etc/rc"
jail_localdata2_exec_stop="/bin/sh /etc/rc.shutdown"
jail_localdata2_fdescfs_enable="YES"
jail_localdata2_procfs_enable="YES"

9. 建立系統目錄
mkdir /storage/jail/localdata2
mkdir /storage/jails/localdata2
cpdup /storage/jail/skel /storage/jails/localdata2
mkdir /storage/jail/localdata2/s

10. [Optional] 在 Host 編輯 /etc/sysctl.conf 開放 jailed O.S. 使用 ping.
Edit /etc/sysctl.conf
###20121113 For jail to fix ping icmp socket: Operation not permitted
security.jail.allow_raw_sockets=1

11. [Optional] 在 Host 編輯 /etc/default/devfs.rules 開放 jailed O.S. 使用 pts pty mem bpf
11.1. Edit /etc/default/devfs.rules
[devfsrules_unhide_login=3]
...
add path pts unhide
add path 'pts/*' unhide
add path pty unhide
add path 'pty/*' unhide

11.2. Edit /etc/devfs.rules
###
### http://forums.freebsd.org/archive/index.php/t-24581.html
### http://forums.freebsd.org/archive/index.php/t-5693.html
###
###

[devfsrules_unhide_mem=5]
add path mem unhide
add path kmem unhide

[devfsrules_unhide_bpf=6]
add path bpf unhide

# Devices usually found in a jail.
#
[devfsrules_jail2=7]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add include $devfsrules_unhide_mem
add include $devfsrules_unhide_bpf

12. 掛載目錄
[FreeBSD 9]

/sbin/mount -t nullfs -r /storage/jail/mroot /storage/jail/labdata2
/sbin/mount -t nullfs -rw /storage/jails/labdata2 /storage/jail/labdata2/s


[FreeBSD 8]
mount /storage/jail/localdata2
mount /storage/jail/localdata2/s

13. 啟動 jail
# /etc/rc.d/jail start
查詢啟動的 jailed O.S.
# jls
進入 jailed O.S.
# jexec #JID tcsh (或 jexec #JID /ur/bin/su -)

14. 編輯 jailed O.S. 的系統設定
Edit /etc/rc.conf
Edit /etc/resolv.conf
...


參考資料
1. FreeBSD 使用手冊  15.6 Jail 的應用
2. Forums.freebsd.org :  [Solved] jails with vnet in rc.conf
3. Forums.freebsd.org : jail nat route

Thursday, November 08, 2012

C範例程式 : 浮點數及雙精度浮點數轉換二進位字串

浮點數紀錄數字的格式如下 :
x = 1.yyyy * 2 ^ z

_ ________ _______________________
1     8              23
+  127+z    0.yyyy 用 *2 轉換為 binary 
-

_ ___________ ____________________________________________________
1      11                            52
+    1023+z    0.yyyy 用 *2 轉換為 binary
-


程式碼 : include stdio.h stdlib.h string.h limits.h

#define BTSIZE 256

void dec2bin(int);
void float2bin(float);
void double2bin(double);

int main()
{
	int i;
	float f;
	double d = 1.0;

	printf("%d\t",2);
	dec2bin(2);
	printf("\n%d\t",-2);
	dec2bin(-2);
	printf("\n%d\t",10);
	dec2bin(10);
	printf("\n%d\t",172);
	dec2bin(172);
	printf("\n%d\t",192);
	dec2bin(192);
	printf("\n%d\t",65535);
	dec2bin(65535);
	printf("\n%d\t",-65535);
	dec2bin(-65535);

	printf("\n");

	printf("\n%f\t",2.0);
	float2bin(2.0);
	printf("\n%f\t",-2.0);
	float2bin(-2.0);

	printf("\n%f\t",1.2);
	float2bin(1.2);
	printf("\n%f\t",-1.2);
	float2bin(-1.2);

	printf("\n%f\t",1.0);
	float2bin(1.0);
	printf("\n%f\t",-1.0);
	float2bin(-1.0);

	printf("\n%f\t",0.5);
	float2bin(0.5);
	printf("\n%f\t",-0.5);
	float2bin(-0.5);

	printf("\n%f\t",0.25);
	float2bin(0.25);
	printf("\n%f\t",0.75);
	float2bin(0.75);
	printf("\n%f\t",0.125);
	float2bin(0.125);
	printf("\n%f\t",0.1);
	float2bin(0.1);
	printf("\n%f\t",0.01);
	float2bin(0.01);

	printf("\n");

	printf("\n%lf\t",1.0);
	double2bin(1.0);
	printf("\n%lf\t",-1.0);
	double2bin(-1.0);

	printf("\n%lf\t",1.2);
        double2bin(1.2);
        printf("\n%lf\t",-1.2);
        double2bin(-1.2);

	printf("\n%lf\t",0.5);
	double2bin(0.5);
	printf("\n%lf\t",-0.5);
	double2bin(-0.5);

	printf("\n");

	return 0;
}

void dec2bin(int data)
{
	unsigned int t = (unsigned int)data;

	int b = sizeof(t) * CHAR_BIT;
	char bt[BTSIZE];

	for(int i = 0; i < b; i++)
	{
		bt[i] = (t & 0x01) ? '1' : '0';
		t>>=1;
	}

	for(int i = b-1; i >= 0; i--)
	{
		putchar(bt[i]);
		if(!(i%8) && i)
			printf(" ");
	}
}

void float2bin(float f)
{
	long l;
	int b;
	char bt[BTSIZE];

	memcpy(&l, &f, sizeof(f));

	b= sizeof(f) * CHAR_BIT;

	for(int i = 0; i < b; i++)
	{
		bt[i] = (l & 0x01) ? '1' : '0';
		l>>=1;
	}

	for(int i = b-1; i >= 0; i--)
	{
		putchar(bt[i]);
		if(!(i%8) && i)
			printf(" ");
	}
}

void double2bin(double d)
{
	int l;
	int *iptr;

	iptr = &d;

	memmove(&l, iptr+1, sizeof(l));
	dec2bin(l);
	printf(" ");
	memmove(&l, iptr, sizeof(l));
	dec2bin(l);
}


實際執行結果 :
$ ./show_data

2       00000000 00000000 00000000 00000010
-2      11111111 11111111 11111111 11111110
10      00000000 00000000 00000000 00001010
172     00000000 00000000 00000000 10101100
192     00000000 00000000 00000000 11000000
65535   00000000 00000000 11111111 11111111
-65535  11111111 11111111 00000000 00000001

2.000000        01000000 00000000 00000000 00000000
-2.000000       11000000 00000000 00000000 00000000
1.200000        00111111 10011001 10011001 10011010
-1.200000       10111111 10011001 10011001 10011010
1.000000        00111111 10000000 00000000 00000000
-1.000000       10111111 10000000 00000000 00000000
0.500000        00111111 00000000 00000000 00000000
-0.500000       10111111 00000000 00000000 00000000
0.250000        00111110 10000000 00000000 00000000
0.750000        00111111 01000000 00000000 00000000
0.125000        00111110 00000000 00000000 00000000
0.100000        00111101 11001100 11001100 11001101
0.010000        00111100 00100011 11010111 00001010

1.000000        00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
-1.000000       10111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
1.200000        00111111 11110011 00110011 00110011 00110011 00110011 00110011 00110011
-1.200000       10111111 11110011 00110011 00110011 00110011 00110011 00110011 00110011
0.500000        00111111 11100000 00000000 00000000 00000000 00000000 00000000 00000000
-0.500000       10111111 11100000 00000000 00000000 00000000 00000000 00000000 00000000

C++, Java運算子優先權列表

C++
::	範圍解析	-
::	全域範圍解析	-
------      ------      ------
()	呼叫函數	左
[]	陣列標註	左
.	成員選擇	左
->	成員選擇(指標)	左
++	後置遞增	左
--	後置遞減	左
------      ------      ------
!	邏輯 NOT	右
~	位元補數	右
+	正		右
-	負		右
sizeof	型別大小	右
++	前置遞增	右
--	前置遞減	右
&	位址		右
*	間接參照	右
new	建立新物件	右
delete	刪除物件	右
------      ------      ------
()	成員(cast)	右
------      ------      ------
%	取餘數		左
*	乘		左
/	除		左
------      ------      ------
+	加		左
-	減		左
------      ------      ------
<<	位元左移	左
>>	位元右移	左
>	大於		左
>=	大於等於	左
<	小於		左
<=	小於等於	左
------      ------      ------
==	相等		左
!=	不等於		左
------      ------      ------
&	AND位元運算	左
------      ------      ------
|	OR位元運算	左
------      ------      ------
^	XOR位元運算	左
------      ------      ------
&&	邏輯AND		左
------      ------      ------
||	邏輯OR		左
------      ------      ------
?:	條件式		右
------      ------      ------
=	指定		右
------      ------      ------
,	逗號		左
------      ------      ------

Java
()	引數		左
[]	陣列存取	左
.	成員存取	左
++	後置遞增	左
--	後置遞減	左
------      ------      ------
!	邏輯 NOT	右
~	位元補數	右
+	正		右
-	負		右
++	前置遞增	右
--	前置遞減	右
------      ------      ------
new	建立新物件	右
()	強制轉型(cast)	右
------      ------      ------
%	取餘數		左
*	乘		左
/	除		左
------      ------      ------
+	加		左
-	減		左
------      ------      ------
<<	位元左移	左
>>	位元右移	左
>>>	無符號位元右移	左
------      ------      ------
>	大於		左
>=	大於等於	左
<	小於		左
<=	小於等於	左
instanceof	資料型態比較	左
------      ------      ------
==	相等		左
!=	不等於		左
------      ------      ------
&	AND位元運算	左
------      ------      ------
^	XOR位元運算	左
------      ------      ------
|	OR位元運算	左
------      ------      ------
&&	邏輯AND		左
------      ------      ------
||	邏輯OR		左
------      ------      ------
?:	條件式		右
------      ------      ------
=	指定		右
複合指定運算子		右
+= -= *= /= %=
&= |= ^= <<= >>= >>>=
------      ------      ------