2023年7月2日 星期日

interview 資源連結整理

C/C++
C programming Interview questions and answers C++ Interview Questions 
https://www.cquestions.com/2010/10/c-interview-questions-and-answers.html


ptt - 軟韌體工程師面試常考之考古題
https://www.ptt.cc/bbs/NTUE-CS100/M.1300374249.A.C8F.html


Python
https://github.com/taizilongxu/interview_python

  
OOP相關
wiki - 物件導向程式設計 https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1 

軟體開發的天空 - 系統設計的起點:如何將需求轉為物件導向的設計 https://www.dotblogs.com.tw/jameswu/2008/06/26/4388 

Hank to hanker - [OO] OO物件導向速記 
http://whhnote.blogspot.tw/2010/07/oo-oo.html 
 
物件導向系統分析與設計 吳仁和 著 
http://www.bestwise.com.tw/_trial_files/b2170a/ch03.pdf Ruby Programming/Syntax/Classes 
https://zh.wikibooks.org/zh-tw/Ruby_Programming/Syntax/Classes#.E9.A1.9E.E5.88.A5.E6.96.B9.E6.B3.95.28Class_Method.29

資料識別(Data Identity) 
http://openhome.cc/Gossip/HibernateGossip/DataIdentity.html 
 
Java 快速導覽 - 物件導向概念 static 成員
 http://pydoing.blogspot.tw/2010/11/java-static.html
[OO概念]封裝,繼承,多型 
http://handsome-bridge.blogspot.tw/2013/02/oo.html


網路原理

http://linux.vbird.org/linux_server/0110network_basic.php

專業知識複習:

http://eeepage.info/interview-c/

軟韌體工程師面試- C語言與OS作業系統 常見題目(筆試考題) 內容很豐富,因為資工的東西真的很多,裡面的內容可以幫你快速複習OS以及C語言相 關。

http://eeepage.info/interview-c/2/


process跟thread的差別、multithread的概念、同步問題、deadlock.... pass by value、pass by reference、pass by address...(Java跟C的不同處) 物件導向三大特性、三種封裝的差異、overriding跟overloading解釋... 抽象類別跟介面的不同、constructor建構順序、static相關... C的指標、函數指標、const跟指標的各種組合... SQL語法(大學有修過)...

immutable class觀念

同步問題、semaphore 使用、context switch

verriding vs overloading、記憶體區間 stack 和 heap、保留字 virtual 和 static

GeeksforGeeks

http://geeksquiz.com/quiz-corner/

作業系統 Operating System Concepts

https://mropengate.blogspot.tw/2017/09/operating-system-concepts.html

物件導向設計

https://mropengate.blogspot.tw/2015/11/software-engineering-oop.html

http://teddysoft.tw/courses/agile-skill-ooad/

演算法與資料結構

http://alrightchiu.github.io/SecondRound/mu-lu-yan-suan-fa-yu-zi-liao-jie-gou.html

C/C++ - 常見 C 語言觀念題目總整理

https://mropengate.blogspot.tw/2017/08/cc-c.html

Mr. Opengate 詳細整理面試所需的領域 OS、演算法文章

http://mropengate.blogspot.tw/2017/09/htc.html?m=1

2022年3月13日 星期日

深入淺出設計模式重點整理

設計模式-建構可擴展/易維護的物件導向軟體

OO概念-抽象/封裝/多型/繼承


物件導向原則 1.把會變的東西封裝起來

                       2.多用組合,少用繼承

                       3.針對介面撰寫程式,而不是針對實作

                       4.努力為彼此互動的物件做出鬆耦合設計

                       5.類別應該歡迎擴展,但拒絕修改

                       6.要依賴抽象,不要依賴具體類別


Page 596

模式

敘述

裝飾器

包裝成物件來提供新行為

狀態

封裝成狀態行為

,並使用委託來切換不同行為

迭代器

提供一種方式來遍歷物件集合

,而且部會公開集合實作

門面

簡化一組類別的介面

策略

封裝可互換行為

,並使用委託來決定該使用哪一個

代理

包裝一個物件在某個狀態改變時收到通知

工廠方法

用子類別來決定要建立哪個具體類別

轉接器

包裝一個物件

並未他提供不同的介面

觀察者

讓一群物件在某個狀態改變收到通知

樣板方法

用子類別來決定如何實作演算法步驟

組合

讓用戶端用一致的方式來對待物件集合與個別物件

單例

確保只有一個物件被做出來

抽象工廠

可讓用戶端建立一系列的物件

,而且不需要指令它們的具體類別

命令

將請求封裝成物件

2021年3月19日 星期五

[TDD]3A原則

  在撰寫單元測試的程式碼時,有個3A原則,來輔助設計測試程式,可以讓測試程式更好懂。

3A原則如下:

  1. Arrange: 初始化目標物件、相依物件、方法參數、預期結果,或是預期與相依物件的互動方式
  2. Act: 呼叫目標物件的方法
  3. Assert: 驗證是否符合預期
 public void UnitTest3ARule() {
     //Arrange

     //Act

     //Assert
 
}

[物件導向]SOLID

SOLID所包含的原則是通過引發編程者進行軟體原始碼代碼重構進行軟體的代碼異味清掃,從而使得軟體清晰可讀以及可延伸時可以應用的指南。SOLID被典型的應用在測試驅動開發上,並且是敏捷開發以及自適應軟體開發的基本原則的重要組成部分。 

SOLID 是5大原則的簡稱,分別為:

                  S = Single-responsibility principle (SRP) = 單一職責原則

                       -認為「物件應該僅具有一種單一功能」的概念

                  O = Open–closed principle (OCP) = 開放封閉原則

                       -軟體體應該是對於擴充開放的,但是對於修改封閉的

                  L =Liskov substitution principle (LSP) = 里氏替換原則

                       -程式中的物件應該是可以在不改變程式正確性的前提下被它的子類所替換的

                  I = Interface segregation principle (ISP) = 介面隔離原則

                       -多個特定客戶端介面要好於一個寬泛用途的介面

                  D = Dependency inversion principle (DIP) = 依賴反向原則

                      -依賴於抽象而不是一個實例

2020年1月21日 星期二

[ubuntu18.04] 關機過慢問題 (需要倒數90 sec)

修改/etc/systemd/system.conf:
$ sudo vi /etc/systemd/system.conf
找到這行:#DefaultTimeoutStopSec=90s
可直接修改或在其下新增一行 DefaultTimeoutStopSec=10s
存檔後開機之後生效

2020年1月10日 星期五

[ubuntu18.04]輸入法安裝


 1.進入系統設定值/語言支援, 依照系統的建議的更新下載 
 2.在軟體中心安裝fcitx、fcitx設定、fcitx-qimpanel-configtool 
 3.terminal之下安裝新酷音輸入法:$sudo apt-get install fcitx-chewing
    或是 Synaptic之下安裝新酷音輸入法 fcitx-  chewing
4.預設輸入法框架: fcitx
5.(重新開機)小鍵盤(或小企鵝或任何顯示中、英、酷字樣的按鈕)就會出現在右上方選單列
  參考 http://wenxintaichi.blogspot.com/2018/06/blog-post_29.html

2019年11月4日 星期一

顯示git branch 方法

在 ~/.bashrc新增底下內容
# show git branch
function git_branch { ref=$(git symbolic-ref HEAD 2> /dev/null) || return; echo "("${ref#refs/heads/}")"; } PS1="${HOSTNAME}:\w\[\033[1;32m\]\$(git_branch)\[\033[0m\]$";

2017年8月27日 星期日

[android]系統架構及開機流程圖


一個大陸網站整理不錯系統架構流程
http://blog.csdn.net/CCJHDOPC/article/details/54316154

[android]boot.art and boot.oat 解釋

1. boot.art是一個header + class object的映射內存。
   主要包含的是在framework/preload-classes.txt裡面列出的類的對象。
2. boot.art裡面使用的都是絕對地址,因此boot.art必須被加載到固定位置
3. boot.oat裡面如果要使用某個類、field、method,只要它在boot.art中被
    定義,那麼就可以直接使用決定地址來訪問
4. boot.art在ART中放在imagespace中,GC除外
5. boot.art和boot.oat的加載地址都是32位的,即便是在64位設備上,高32位都是0.
6.不要以為把boot.art映射到內存,裡面的class就可以直接用了。
   那些初始化內部代碼native方法或者有loadlibrary的代碼,還必須在加載後做最
   後的初始化,否則類的初始化不能有效完成

參考出處:https://www.zhihu.com/question/37786499/answer/92280385

2017年7月6日 星期四

[轉]Android智能指針sp 和 wp 用法


Android手機操作系統既然是開源的操作系統。那麼在具體的文件夾中就會存放著各種相關功能的開源代碼。我們在使用的時候可以根據這些源代碼進行相應的修改就能輕鬆的完成我們所需的功能。在這里大家就一起來看看Android 智能指針的相關源碼解讀以及應用方法。
android的源代碼中,經常會看到形如:sp< xxx>、wp< xxx>這樣的類型定義,這其實是Android中的智能指針。智能指針是C++中的一個概念,通過基於引用計數的方法,解決對象的自動釋放的問題。在C++編程中,有兩個很讓人頭痛的問題:一是忘記釋放動態申請的對像從而造成內存洩露;二是對像在一個地方釋放後,又在別的地方被使用,從而引起內存訪問錯誤。
程序員往往需要花費很大精力進行精心設計,以避免這些問題的出現。在使用智能指針後,動態申請的內存將會被自動釋放(有點類似Java的垃圾回收),不需要再使用delete來釋放對象,也不需要考慮一個對像是否已經在其它地方被釋放了,從而使程序編寫工作減輕不少,而程序的穩定性大大提高。
Android智能指針相關的源代碼在下面兩個文件中:

frameworks\base\include\utils\RefBase.h
frameworks\base\libs\utils\RefBase.cpp
Android中定義了兩種智能指針類型,一種是強指針sp(strong pointer),一種是弱指針(weak pointer)。其實成為強引用和弱引用更合適一些。強指針與一般意義的智能指針概念相同,通過引用計數來記錄有多少使用者在使用一個對象,如果所有使用者都放棄了對該對象的引用,則該對象將被自動銷毀。
弱指針也指向一個對象,但是弱指針僅僅記錄該對象的地址,不能通過弱指針來訪問該對象,也就是說不能通過弱智真來調用對象的成員函數或訪問對象的成員變量。要想訪問弱指針所指向的對象,需首先將弱指針升級為強指針(通過wp類所提供的promote()方法)。弱指針所指向的對像是有可能在其它地方被銷毀的,如果對像已經被銷毀,wp的promote()方法將返回空指針,這樣就能避免出現地址訪問錯的情況。
是不是很神奇?弱指針是怎麼做到這一點的呢?其實說穿了一點也不復雜,原因就在於每一個可以被智能指針引用的對像都同時被附加了另外一個weakref_impl類型的對象,這個對像中負責記錄對象的強指針引用計數和弱指針引用計數。這個對像是Android智能指針的實現內部使用的,智能指針的使用者看不到這個對象。弱指針操作的就是這個對象,只有當強引用計數和弱引用計數都為0時,這個對象才會被銷毀。
說了這麼多原理,下面該看看到底智能指針該怎麼使用了。假設現在有一個類MyClass,如果要使用智能指針來引用這個類的對象,那麼這個類需滿足下列兩個前提條件:
(1) 這個類是基類RefBase的子類或間接子類;
(2) 這個類必須定義虛構造函數,即它的構造函數需要這樣定義:
  1. virtual ~MyClass(); 
滿足了上述條件的類就可以定義Android智能指針了,定義方法和普通指針類似。比如普通指針是這樣定義:
  1. MyClass* p_obj; 
Android智能指針是這樣定義:
  1. sp < MyClass >  p_obj; 
注意不要定義成sp< MyClass>* p_obj。初學者容易犯這種錯誤,這樣實際上相當於定義了一個指針的指針。儘管在語法上沒有問題,但是最好永遠不要使用這樣的定義。
定義了一個智能指針的變量,就可以像普通指針那樣使用它,包括賦值、訪問對象成員、作為函數的返回值、作為函數的參數等。比如:
  1. p_obj  =  new  MyClass();   
  2. //注意不要寫成  p_obj  =  new  sp < MyClass > 
  3. sp < MyClass > p_obj p_obj2  = p_obj;   
  4. p_obj- > func();  
  5. p_obj  =  create_obj ();  
  6. some_func(p_obj); 
注意不要試圖delete一個Android智能指針,即delete p_obj。不要擔心對象的銷毀問題,智能指針的最大作用就是自動銷毀不再使用的對象。不需要再使用一個對像後,直接將指針賦值為NULL即可:
  1. p_obj  =  NULL
上面說的都是強指針,弱指針的定義方法和強指針類似,但是不能通過弱指針來訪問對象的成員。下面是弱指針的示例:
  1. wp < MyClass > wp_obj  =  new  MyClass();   
  2. p_obj  =  wp_obj .promote();   
  3. //升級為強指針。不過這裡要用.而不是- > ,真是有負其指針之名啊  
  4. wp_obj  =  NULL
Android智能指針用起來是很方便,在一般情況下最好使用智能指針來代替普通指針。但是需要知道一個智能指針其實是一個對象,而不是一個真正的指針,因此其運行效率是遠遠比不上普通指針的。所以在對運行效率敏感的地方,最好還是不要使用智能指針為好

2016年6月27日 星期一

Android中padding與layout_margin的區別與用法

   林炳文Evankaka原創作品。轉載請注明出處http://blog.csdn.net/evankaka

 一、定義   

        android:layout_margin就是設置view的上下左右邊框的額外空間
        android:padding是設置內容相對view的邊框的距離
        padding,含義為“填充”,像墊肩壓類似的填充物,一個控制項的padding及此控制項內部的填充,由此可見padding是以所被定義的控制項Aparent控制項,而內部的內容物與控制項A的間距。而layout_marginA控制項所在的控制項為parent控制項,是A與其的間距。
        其實概念很簡單,padding是站在父view的角度描述問題,它規定它裡面的內容必須與這個父view邊界的距離。margin則是站在自己的角度描述問題,規定自己和其他(上下左右)的view之間的距離,如果同一級只有一個view,那麼它的效果基本上就和padding一樣了
http://img.blog.csdn.net/20150303131301841?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRXZhbmtha2E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
1.  當按鈕分別設置以上兩個屬性時,得到的效果是不一樣的。  
2.  android:paddingLeft="30px"  
3.  按鈕上設置的內容(例如圖片)離按鈕左邊邊界30個圖元  
4.  android:layout_marginLeft="30px"  
5.  整個按鈕離左邊設置的內容30個圖元  



二、使用示例

1、兩個都不加
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
1.  xml version="1.0" encoding="utf-8"?>  
2.  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3.      android:layout_width="match_parent"  
4.      android:layout_height="match_parent"  
5.      android:background="#ffffff" >  
6.    
7.      <TextView  
8.          android:layout_width="100dip"  
9.          android:layout_height="100dip"  
10.          android:background="#000000"  
11.         android:text="Hello" />  
12.   
13. </RelativeLayout>  
效果:
http://img.blog.csdn.net/20150303132257741?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRXZhbmtha2E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

2、只加padding
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
1.  xml version="1.0" encoding="utf-8"?>  
2.  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3.      android:layout_width="match_parent"  
4.      android:layout_height="match_parent"  
5.       android:padding ="100dip"  
6.      android:background="#ffffff" >  
7.    
8.      <TextView  
9.          android:layout_width="100dip"  
10.         android:layout_height="100dip"  
11.          android:background="#000000"  
12.         android:text="Hello" />  
13.   
14. </RelativeLayout>  
效果:
http://img.blog.csdn.net/20150303132407088?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRXZhbmtha2E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
3、只加margin
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
1.  xml version="1.0" encoding="utf-8"?>  
2.  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3.      android:layout_width="match_parent"  
4.      android:layout_height="match_parent"  
5.      android:background="#ffffff" >  
6.    
7.      <TextView  
8.          android:layout_width="100dip"  
9.          android:layout_height="100dip"  
10.          android:background="#000000"  
11.          android:layout_margin="30dip"  
12.         android:text="Hello" />  
13.   
14. </RelativeLayout>  
效果:
http://img.blog.csdn.net/20150303132606979?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRXZhbmtha2E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

三、注意說明

        LinearLayoutRelativeLayoutTableLayout中,這2個屬性都是設置都是有效的
        FrameLayout中,android:layout_margin是無效的,因為FrameLayout裡面的元素都是從左上角開始繪製的
        AbsoluteLayout中,沒有android:layout_margin屬性
        在此提醒,xml參數中含有layout的參數專案為定義的控制項相對于parent的關聯,沒有的一般為本身的定義,以上內容與此相符。又類似於gravitylayout_gravity,layout的是相對於parent的大體位置,而不帶的是自身內部內容的大體位置。

   林炳文Evankaka原創作品。轉載請注明出處http://blog.csdn.net/evankaka