2011年12月31日 星期六

[心得] 電子發票的碎碎念: 紙本發票x電子發票x載具

楔子:
公司附近的萊爾富開始試辦電子發票
以下純屬個人關於電子發票的碎碎念...


上圖為本期入手的三種發票
(A) 傳統二聯式發票:
直接附上發票號碼+消費明細

(B) 現金消費/載具未註冊:
熱感應紙的電子發票+消費明細

(C) 已註冊的載具消費:
只附消費明細, 消費紀錄需自機台查詢

對終端消費者來說,
比較(A)領一張普通紙 與(B)領一張普通紙+一張熱感應紙
可能會覺得推行電子發票有違環保的初衷

但考量非終端的情況...
1. 傳統二聯式發票, 另一聯亦為紙本, 電子化後可減去此存聯的使用
2. 傳統發票若該期的發票沒用完, 剩下空白發票基本上與廢紙無異
3. 傳統空白發票亦須藉由貨運傳遞, 往返上亦有運輸成本

在綜合考量之下, 電子發票的確有其降低成本以及環保的優勢.

但不可否認, 對消費者而言,
除了熱感應紙保存上的疑慮外, 小的目前認為最大問題在於載具/消費紀錄資料電子化

1. 載具:
目前最常見的載具為台北捷運的悠遊卡.

悠遊卡自從提供小額消費的服務後即脫離"交通卡"的侷限, 在便利商店上蔚為風行.

但悠遊卡的發行單位-台北智慧卡公司-, 實為具官股色彩的民營公司, 任何消費金額皆須被智慧卡公司抽成後才繳給商家(大至7-11超商, 小至計程車司機). 換言之, 金流系統利益近乎壟斷 (據96年股東結構, 台北捷運公司+台北市政府占40%, 其餘為公車/銀行/電腦系統商), 似有反托拉斯之疑慮?

ps. 若哪天台北智慧卡公開發行股票, 想必是個值得長抱的定存股 囧...

2. 消費紀錄資料電子化:
在無歸戶的情況下使用已註冊的載具消費, 消費紀錄需消費者自商家機台查詢, 是7-11請至i-Bon, 全家請至Famiport, 萊爾富請至Life-ET查詢消費/中獎紀錄, 且目前中獎紀錄無主動告知功能.

至於財政部的歸戶整合系統, 原則上在載具規戶後能免去上述的麻煩, 但...
1)介面友善度暫且不論, 使用仍承襲了咱們政府機關的一慣風格- 請認明使用Windows....

2)需備自然人憑證才能執行註冊, 在問此憑證的使用者是否普及前可能要問此憑證的被認識度?
另憑證申請時間為政府機構上班時間, 更加深了其普及的難度....
(個人報稅都靠它, 不否認有其方便之處)

3)記名消費紀錄全數建檔, 資料安全把關?

======= 同場加映: 全聯版電子發票 =====
由全聯福利卡作為載具, 也承襲了全聯社的一貫傳統"只收現金"
網站上具完整的消費紀錄以及中獎通知設定(簡訊+電子郵件),
可說是目前電子發票的極致,連消費明細都省掉了 XD



2011年12月19日 星期一

[C/C++] 檢查資料夾是否存在?

Purpose:
檢查指定是否存在, 若不存在則建立資料夾並新增一個檔案於該目錄中.

使用API名稱: stat, mkdir
Reference:
1. stat wiki
2. stat的作用



#include <stdio.h>
#include <sys/stat.h> //include for stat
#include <string.h>
#include <errno.h>

int main(int argc, char **argv)
{
struct stat buf;
do
{
if(stat("data/",&buf) == 0)
{
printf("data/ folder found \n");
}
else
{
printf("can not find data/ folder \n");

if(mkdir("data/", S_IRWXU) == 0)
{
printf("create data/ folder sucess \n");
}
else
{
printf("create data/ folder fail \n");
}

break;
}
}while(0);
FILE *fd = fopen("data/data.txt", "w");
if(fd > 0)
{
fprintf(fd, "%s \n", "Data in files");
fclose(fd);
}
else
{
printf("data/data.txt open fail \n");
}

return 0;
}

2011年12月10日 星期六

[Linux] route & /proc/net/route

Linux環境下, 通常可用 route 指令查詢目前的routing資訊.

jason@jason-laptop:~$ route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

192.168.2.0 * 255.255.255.0 U 2 0 0 wlan0

10.110.215.0 * 255.255.255.0 U 1 0 0 eth0

link-local * 255.255.0.0 U 1000 0 0 eth0

default 10.110.215.254 0.0.0.0 UG 0 0 0 eth0

jason@jason-laptop:~$

假若route程式未被編入"bin"目錄, 亦可直接自/proc/net/route取得相關資訊

jason@jason-laptop:~$ cat /proc/net/route

Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT

wlan0 0002A8C0 00000000 0001 0 0 2 00FFFFFF 00 0

eth0 00D76E0A 00000000 0001 0 0 1 00FFFFFF 00 0

eth0 0000FEA9 00000000 0001 0 0 1000 0000FFFF 00 0

eth0 00000000 FED76E0A 0003 0 0 0 00000000 00 0

此欄位中

1) IP address16進制表示.

0002A8C0 換算為十進制為C0.A8.02.00 = 192.168.2.0

2) Flag使用數字表示, 其含義可參照 net-tools-1.60中的檔案 "net-support.h" "inet_gr.c"

範例中,

1 = 1 = U

3 = 2*1 +1 = UG


(Ref.0)

Exploring the /proc/net/ Directory


(Ref.1) route --help 摘錄

route flag:

U (route is up)

H (target is a host)

G (use gateway)

R (reinstate route for dynamic routing)

D (dynamically installed by daemon or redirect)

M (modified from routing daemon or redirect)

A (installed by addrconf)

C (cache entry)

! (reject route)


(Ref.2) net-support.h 摘錄

/* Keep this in sync with /usr/src/linux/include/linux/route.h */
#define RTF_UP 0x0001 /* route usable "U" */
#define RTF_GATEWAY 0x0002 /* destination is a gateway "G" */
#define RTF_HOST 0x0004 /* host entry (net otherwise) "H" */
#define RTF_REINSTATE 0x0008 /* reinstate route after tmout */
#define RTF_DYNAMIC 0x0010 /* created dyn. (by redirect) */
#define RTF_MODIFIED 0x0020 /* modified dyn. (by redirect) */
#define RTF_MTU 0x0040 /* specific MTU for this route */
#ifndef RTF_MSS
#define RTF_MSS RTF_MTU /* Compatibility :-( */
#endif
#define RTF_WINDOW 0x0080 /* per route window clamping */
#define RTF_IRTT 0x0100 /* Initial round trip time */
#define RTF_REJECT 0x0200 /* Reject route */