內科值班雜記 —- 脖子痛

周日半夜十二點急診送來一位3X歲男性,診斷是「頭痛+發燒+慢性肝炎」。

但病人主訴脖子後面與後腦疼痛兩周(?!),表示一個月前因呼吸中止症開刀,出院後開始疼痛。因工作在大陸治療,當地醫生無法處理只有打止痛針,但疼痛越來越嚴重。表示除疼痛以外無畏光與其他神經症狀。來急診後開始發燒至39.6度,病人表示三天前亦有發燒過,但吃藥後退燒。急診抽血白血球升高、肝指數約正常值兩倍,故收消化內科病房(?!)。

PE發現病人頸部僵硬無法轉動,但meningeal sign與focal neural sign都 negative。疼痛指數滿分若10分目前有15分,急診打過多次tramadol與keto效果不到一小時,病人在病房不斷哀號,希望找開刀醫師來處理…

看完後總覺得怪怪的,應該是神經方問題但卻沒有meningeal sign,找學長來看過後表示急作CT,r/o deep neck infection or SAH。證實是deep neck infection….

Firstrade debit card 美國使用經驗

申請Firstrade debit card最大的用處就是能在美國使用帳戶內的美金
這次(2018/6)我到夏威夷旅遊使用這張卡在美國刷卡共10次都沒有問題!

為了測試這張卡是否能網路使用 6/4我在夏威夷古蘭尼牧場購買約300usd門票
6/6客服寄Gmail表示有外國刷卡記錄故詢問是否人在國外以及簽證種類 信中強調必須回信或是回電否則可能會停卡 故當日即回覆客服

這次刷卡大多為餐廳與商店 其中包括三家加油站以及一台投幣洗衣機
美國的刷卡機相當多 路邊停車收費以及自助販賣機都能刷卡
但有些機器很挑硬幣 像是洗衣機要3.5$卻只能投quarter
一般人根本不會有那麼多quarter 根本是非刷卡不可 繼續閱讀 “Firstrade debit card 美國使用經驗”

Firstrade 申請debit card

5/11 提出現金管理帳戶申請

5/12 回信告知已收到申請

5/15 來信要求回答一些問題:

–          請您回覆此電郵並回答以下信息:

o   您申請Debit Card使用權的原因

o   您每個月將使用Debit Card的次數(大概)

5/15 回信(1)美國旅行使用(剛好6月要去夏威夷旅遊)(2)一年10-20次

5/16 來信告知已收到回覆

接下來是漫長等待,之後並沒有收到申請核可或是拒絕的通知。

5/28 收到UPS送來的Debit Card (UPS顯示5/25寄出)

繼續閱讀 “Firstrade 申請debit card”

Firstrade開戶流程

因為我從推薦email打開(2018/4)的申請表格似乎為英文,與綠角還有HC的網頁不一樣,故另外寫一篇文章。

我是在4/25申請新帳號4/27上傳wen 8與護照。5/2 Firstrade來信告知成功,從上傳檔案到申請完成總共5個日歷天/3工作天。

firstrade的開戶回饋是以第一次注資為準,如果有打算同時要資產轉移與國際匯款,建議先匯款到舊的券商再一口氣使用資產轉移全部的資產,以免沒拿到開戶回饋。
繼續閱讀 “Firstrade開戶流程”

[Python] 讓Jupyter notebook可以從遠端連線

請參考jupyter官網說明

為了安全第一步請設定jupyter密碼

$ jupyter notebook password
Enter password:  ****
Verify password: ****
[NotebookPasswordApp] Wrote hashed password to /Users/you/.jupyter/jupyter_notebook_config.json

有可能會回說jupyter_notebook_config不存在之類的錯誤
代表你需要config檔 使用以下指令即可

$ jupyter notebook --generate-config

接下來修改config檔

$ vi ~/.jupyter/jupyter_notebook_config.py

新增下面資料或是將原本的註解(#)刪除即可

c.NotebookApp.ip = '*'

ip改成星號讓遠端電腦可以透過本機ip連上jupyter_note
若本機的ip為固定ip直接填上對應ip也行
現在啟動jupyter notebook應該就可以從遠端連線了

另外建議要用https加密連線 以免密碼被偷取

c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/fullchain.pem'
c.NotebookApp.keyfile = u'/absolute/path/to/your/certificate/privkey.pem'

把路徑改成金鑰的位置即可 至於金鑰如何取得請自己google

[Python] 單底線與雙底線

#single_double.py
class Parent(object):
    def _single(self):
        print("Parent single underscore")
    def __double(self):
        print("Parent double underscore")

class Child(Parent):
    pass

c = Child()
c._single() #Parent single underscore
#Python並沒有類似C的protected member
#單底線的member在執行行並沒有實際差異
#但單底線的member表示此member不應該被其他人或是Child使用

print(dir(c))
#['_Parent__double', '__class__', ... '__weakref__', '_single']

#c.__double() AttributeError: 'Child' object has no attribute '__double'
c._Parent__double()
#雙底線的member在child是沒辦法被直接存取
#Python並沒有所謂的private function,但可以用雙底線達到類似的效果

def _single():
    pass

def foo():
    pass
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
>>> from single_double import *
...
>>> dir() #foo被import 但_single_double沒有
['Child', 'Parent', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'c', 'foo']
>>> from single_double import _single
>>> dir()
['Child', 'Parent', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_single', 'c', 'foo']
>>> 

若是用from xx import *的方式import
單底線的member不會被import
但還是可以用from xx import _single的方式強制import

底線開頭加結尾的member
例如上例執行dir()跑出來的’__annotations__’, ‘__builtins__’, ‘__doc__’, ‘__loader__’ …
這種member代表有特殊意思
除非了解他的用途 否則不應該隨意取這種名稱

#single_double.py

""" need module docstring"""


class Parent(object):
    """ need class docstring"""
    def _single(self):
        print("Parent single underscore")

    def __double(self):
        print("Parent double underscore")

    def open(self):
        """ method docstring"""
        pass


def _single():
    pass


def foo():
    """ function docstring"""
    pass

執行pep8或是pylink
會發現他們要求所有的公開method都需要docstring
但單底線及雙底線開頭的method都不會要求docstring

[Python] multiple import

#a.py
print("in a.py berfore import b")
import b
print("in a.py after import b")
#b.py
print ("in b.py")
#c.py
print("in c.py berfore import b")
import b
print("in c.py after import b")
#d.py
print("in d.py berfore import a")
import a
print("in d.py after import a")

print("in d.py berfore import c")
import c
print("in d.py after import c")
in d.py berfore import a
in a.py berfore import b
in b.py
in a.py after import b
in d.py after import a
in d.py berfore import c
in c.py berfore import b
in c.py after import b
in d.py after import c
>>> a.b.x = 1
>>> c.b.x
1
>>> a.b

>>> c.b

>>> 

重複import會被視為同一個物件

[Python] mixin與ABC(Abstract Base Classes)的比較

主要用途

  • mixin: code reuse,將一個或多個method的實作封裝,讓多個類別使用(這些類別不一定有繼承關係) (ref: Python cookbook 3rd, 8.17)
  • ABC: 定義介面(interface),或說是協定(protocal)及型別(type)的實作。(ref: Python cookbook 3rd, 8.13, Fluent Python ch10&11)

共同點

  • 都不能被實體化,故都不應該有__init()__

差異

  • 實作method
    • 因為要re use code故mixin一定會實作method;ABC大多不需要實作method,不過ABC可以實作method,但僅限用於ABC本身或是其supercall,也就是說ABC不應該為了instance實作method。
  • Instance variable
    • mixin不應該有instance variable,Effective Python建議讓mixin的__slots__ = (),阻止使用者建立新的attribute。

註:任何Class都只能繼承一個實體Class,其他只能繼承ABC或是mixin

Fluent Python有提到「An ABC may also be a mixin; The reverse is not true」,作者認為ABC可能為mix-in。但我認為這兩個概念不同,是否會有一個class同時符合這兩個概念的機會,我持懷疑態度。

另外Fluent Python ch12建議我們少用繼承,若是使用了很多繼承必須檢查我們是否有幾點問題

  • 是否正在重新發明輪子
  • 正在使用一個不好的Framwork
  • 是否有過度設計
  • 你是否正在設計一個新Framwork(除非你在設計新Framwork,否則不應使用太多的繼承)

[C11] 能否使用move()回傳一個新的物件但不copy物件

最近花了很多時間研究是否能以rvalue reference在不複製物件的狀態下回傳新物件
但仍然找不到方法

一般講到這個問題 大家一定是會回答RVO(return value optimization)
雖然目前的compiler大部份都會做到RVO 但我們還是不能說RVO一定會進行

我天真的以為rvalue reference跟move可以讓function回傳物件的scope在return之後續繼維持
但其實是我誤會這個功能
move constructor/assignment的設計上還是要先construct物件
不論如何 move constructor還是會消耗新的空間與時間用在construct
move assignment也一定要先construct物件才能再assign
我們能處理的是member variable要怎麼複製

#include <iostream>
#include <memory> //shared_ptr
using namespace std;
class Foo {
public:
    int* i;
    Foo() {
        i = new int[1];
        i[1] = 1;
        cout << "default constructor" << endl;
    }
    ~Foo() {
        if (i != nullptr) {
            cout << "destructor, i[0]=" << i[0] << endl;
            delete[] i;
        } else {
            cout << "destructor, i is nullptr" << endl;
        }
    }
    Foo(Foo&& f) {
        cout << "move constructor, f.i[0]=" << f.i[0] <<  endl;
        i = f.i;
	//假設i是一個很大的array我們可以省掉copy array的時間
	//但若i是一個物件 而且我們有很多個member variable如i, j ,k ,l ,m, n
	//move constructor還是要先construct每個member varialbe
        f.i = nullptr;
    }
    Foo& operator=(Foo&& f) {
        cout << "move assigment, f.i[0]=" << f.i[0] <<  endl;
        i = f.i;
        f.i = nullptr;
        return *this;
    }
};
Foo factory() {
    Foo f;
    f.i[0] = 9;
    //do something for Foo
    return std::move(f); //will call move contrcutor
}

Foo RVO_factory() {
    Foo f;
    f.i[0] = 8;
    return f;
}

Foo fail_RVO_factory(bool b) {
    if (b) {
        Foo f;
        f.i[0] = 2;
        return f;
    } else {
        Foo f;
        f.i[0] = 3;
        return f;
    }
}

shared_ptr<Foo> factory_shared_ptr() {
    shared_ptr<Foo> shared_f = make_shared<Foo>();
    shared_f->i[0] = 99;
    //do something for Foo
    return shared_f;
}
int main() {
    {
        Foo foo = move(Foo());//will call move constructor
        foo = move(Foo());//will call move assigment
    }
    cout << "===========================" << endl;
    {
        cout << "call factory" << endl;
        Foo f = factory();
        cout << "after factor, f.i[0]: " << f.i[0] << endl;
    }
    cout << "===========================" << endl;
    {
        cout << "call RVO factory" << endl;
        Foo f = RVO_factory();
        cout << "after RVO factor, f.i[0]: " << f.i[0] << endl;
    }
    cout << "===========================" << endl;
    {
        cout << "call fail RVO factory" << endl;
        Foo f = fail_RVO_factory(true);
        cout << "after fail RVO factor, f.i[0]: " << f.i[0] << endl;
    }
    cout << "===========================" << endl;
    {
        shared_ptr<Foo> shared_f = factory_shared_ptr();
        cout << "get shared_f.i[0]: " << shared_f->i[0] << endl;
    }
    cout << "exit shared_f scope" << endl;

    return 0;

在我的機器上的執行結果:

default constructor
move constructor, f.i[0]=1
destructor, i is nullptr
default constructor
move assigment, f.i[0]=1
destructor, i is nullptr
destructor, i[0]=1
===========================
call factory
default constructor
move constructor, f.i[0]=9
destructor, i is nullptr
after factor, f.i[0]: 9
destructor, i[0]=9
===========================
call RVO factory
default constructor
after RVO factor, f.i[0]: 8
destructor, i[0]=8
===========================
call fail RVO factory
default constructor
move constructor, f.i[0]=2
destructor, i is nullptr
after fail RVO factor, f.i[0]: 2
destructor, i[0]=2
===========================
default constructor
get shared_f.i[0]: 99
destructor, i[0]=99
exit shared_f scope

現在大部份的編譯器都應該有RVO
所以在call RVO factory時應該都只會construct一次

但RVO目前還是有限制
若是return的物件被包在if之類的條件中
編譯器沒辦法的編譯期確認回傳的物件是哪個
這樣就沒辦法做到RVO

總結來說
除非對自己處理記憶體空間很有自信
目前應該還是要優先考慮使用shared pointer
讓編譯器幫我們處理空間問題

而move就算了 若Foo不是我們寫的物件 我們能做的事情更少
假如寫Foo的人沒有寫move或是沒寫好 反而會造成更大的問題…

會計丙級 – 會計事務職類資丙級術科測試 重點整理

  • 費用認列
    • 雜誌書報應為「其他費用」
    • 電話費為「郵電費」
    • 題目沒列的項目不可以自行增加,需改用「其他費用」
  • 賒銷
    • 借貸方向與進貨和認列費用時相反,需注意不可弄反
    • 注意運費是由買家出還是賣家出,若由賣家出運費或是起運點交貨請認列費用
    • 運費若是現收請注意不可以把運費加到「應收帳款」裡,必須另列「現金」
  • 專利權攤銷應使用「各項攤堤」項目
  • 權責基礎=先實後虛;聯合基礎=先虛後實
  • 銷貨成本=期初存貨+進貨+進貨費用-進貨折讓-進貨退出-期末存貨
    • 借     |貸
    • 存貨(期末)|
    • 進貨折讓  |
    • 進貨退出  |
    • 銷貨成本  |
    •       |存貨(期初)
    •       |進貨
    •       |進貨運費
  • 進貨運費要算「進貨運費」而銷貨運費是算「運費」
  • 需留意的題目
    1. 103306:需調整期初試算表
    2. 103308:題目要求列印12/31「調整前」試算表,故必須在開帳後就列印,注意不可跟後面調整傳票弄混
    3. 103314:列印調整分錄之傳票
    4. 103315:需調整期初試算表
    5. 103318:期末調整需由調整後試算表逆推
    6. 103327、103328:需考慮營業稅