|Life| 三年半工作見聞小筆記

做事一定要細心細心細心!!!

大公司最重要的優點就是:給你犯錯的機會。
就算有錯,因為規範完整,也很難會是大錯。
以及良好的學習資源!
大公司的缺點:由於可能需要趕案子,大家負責範圍很小,常常有人踢皮球。

代工廠優點:人力資源真的是資源,不會浪費呢~
代工廠缺點:什麼芝麻蒜皮小事都要問客戶,自主權少。能學的也少。
(因為主要產品設計不在你,你只要負責基本功能與工廠)

(消費性電子產品)
品牌廠優點:能夠真的感受到消費者的焦慮,哈哈。
品牌廠缺點:暫時想不到(我能想到的比較是特定公司的缺點,跟品牌無關)

我覺得我有進步的地方:
大膽發問!
了解整個產品的進度規劃!
不正確的東西就是要告知對方!

我待進步的地方:
對整個產品怎麼兜還沒很清楚。
有時候會因為人家想要工具就做,沒細問目的。

還要注意的地方?講電話的語氣吧。
遇到亂猜問題的人就火氣上來,請人幫忙就尊重我的看法,可以嗎?

做 Wireless 優點:有機會出差,我覺得網路行為很有趣。
做 Wireless 缺點:Debug 不容易,會跟當地行為有關!

其他:
好的 Log 可以幫助大家早下班。
幫助人家就要完善,以免最後的瑕疵害到人,反而留下不好印象。
當個好人!

結論:
遇到願意教的人是幸運。
我覺得還是有自己的產品的公司比較有榮譽感!
建議還是遠離代工廠。

|3GPP| 網路架構學習好用網站

以往只看 call flow,感覺很不足夠。
最近開始讀 LTE 跟 IMS 架構,發現幾個實用的網站。


如果不懂 LTE 可以先從這個網站開始看起
https://www.tutorialspoint.com/lte/lte_protocol_stack_layers.htm

一些名詞解釋,主要是要看懂:
UE、eNE、EMM、HSS、S-GW、P-GW 間的關係
https://zh.wikipedia.org/wiki/系统架构演进

這文章好新,感覺是同業的?
https://note-on-clouds.blogspot.com/

開機後 attach 的流程
https://note-on-clouds.blogspot.com/2015/12/lte-initial-access.html?m=1

IMS 架構
http://pollexpm.blogspot.com/2017/02/ims.html

新通訊 – 結合IMS與LTE MMTEL標準實現多元通訊服務
(哇 這篇我才剛大學畢業 到現在也 10年了 不知道手機還能吃多久)
https://www.2cm.com.tw/2cm/zh-tw/magazine/-Technology/3CE6FD1C7C62462D9E56B3F46B4A88C2

VoLTE IMS Network Architecture tutorial (YOUTUBE)
https://www.youtube.com/watch?v=JTJcJ5zc8Mg

IMS, IP Multimedia Subsystem Tutorial
https://www.radio-electronics.com/info/telecommunications_networks/ims-ip-multimedia-subsystem/tutorial-basics.php

中國的朋友介紹 5G
https://blog.csdn.net/jxwxg/article/details/79090480

|Job| Application No Response Analysis

ANR 的發生情形,通常是時間到了還沒有回應!所以掌握這個想法,就比較好找 Code。

比較常見有三種情形:

  1. Service Timeout
  2. BroadcastQueue Timeout
  3. ContentProvider Timeout

 

Case 1. Service Timeout

 a. Service 啟動後,會發送 SERVICE_TIMEOUT_MSG 消息
 b. Service 刪除後,就會刪除 SERVICE_TIMEOUT_MSG 消息
 c. 如果 SERVICE_TIMEOUT_MSG 未删除,時間到後就會 ANR

 呼叫 ActiveServices 的 serviceTimeout 方法進行處理,
 serviceTimeout方法邏輯:

 if (anrMessage != null) {
  mAm.appNotResponding(proc, null, null, false, anrMessage);
 }

 

Case 2. BroadcastQueue Timeout

 BroadcastQueue 中的 mHandler 收到 BROADCAST_TIMEOUT_MSG 消息時會觸發

 // 正常要發送消息前
 broadcastTimeoutLocked(false);

 // 發送消息,鎖住
 case BROADCAST_TIMEOUT_MSG: {
  synchronized (mService) {
   broadcastTimeoutLocked(true);

 // ANR
 在 broadcastTimeoutLocked 方法中,首先取得 anrMessage 字串

 anrMessage = “Broadcast of ” + r.intent.toString();

 mHandler.post(new AppNotResponding(app, anrMessage));
 mService.appNotResponding(mApp, null, null, false, mAnnotation);

 

Case 3. ContentProvider Timeout

 MainHandler 的 handleMessage CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG

 private final void processContentProviderPublishTimedOutLocked(ProcessRecord app) {
cleanupAppInLaunchingProvidersLocked(app, true);
 removeProcessLocked(app, false, true, “timeout publishing content providers”);
 }

 app.kill(reason, true);

 

ref.

https://blog.csdn.net/u012439416/article/category/7261623

 

|RIL| Data Connection Flow

觀念:

  1. 啟動數據服務前,要先設定 APN。APN 在上層有一份,在 modem 也有一份
  2. 是可以只用 modem 裡的那份 APN (嵌入式平台)
  3. Android 是由上層帶 APN 給 modem 的
  4. 上層主要是看 bringUp & RIL 的 setupDataCall

 

以下只講部分關鍵點。

 

# load 上層的 db:TelephonyProvider.java

  loadApns()

# TelephonyManager:使用者點開數據上網的 Icon
  public void setDataEnabled(boolean enable) {
   setDataEnabled(getDefaultDataSubscriptionId(), enable);

# DcAsyncChannel:填入 APN, 準備往下帶
    public void bringUp(ApnContext apnContext, int profileId, int rilRadioTechnology,
                        boolean unmeteredUseOnly, Message onCompletedMsg,
                        int connectionGeneration) {
        mLastConnectionParams = new ConnectionParams(apnContext, profileId, rilRadioTechnology,
                unmeteredUseOnly, onCompletedMsg, connectionGeneration);
        sendMessage(DataConnection.EVENT_CONNECT, mLastConnectionParams);

# DataConnection:StateMachine 收到要建立連線啦!
 public boolean processMessage(Message msg) {
  …
   case EVENT_CONNECT:
    if (DBG) log(“DcInactiveState: mag.what=EVENT_CONNECT”);
     ConnectionParams cp = (ConnectionParams) msg.obj;
     if (initConnection(cp)) {
      onConnect(mConnectionParams);

# RIL:終於送到 RIL了,要往 Modem 前進啦!

 mPhone.mCi.setupDataCall(cp.mRilRat, dp, isModemRoaming, allowRoaming, msg);

 

Ref. https://blog.csdn.net/u012439416/article/details/75263645

|Jobs| How to write your own daemon?

要怎樣寫一個服務:他能夠

在一開機啟動、

不易死掉(你可以寫 script 一直啟動他)、

fork() 後終止父行程並和呼叫的終端機(TTY)脫離關係?

 

首先,我們可以寫個服務(執行檔或是一個 script),處理我們要做的事。

接著,我們再準備一個script,放到正確的位置。而這份草稿他的目的最主要就是: 告訴系統,在一開機啟動我們的服務!

以下最主要就是介紹這個 script 該如何寫:



.Method 1: traditional

1. WRITE: /etc/init.d/triggerd
    to run script or daemon: $TRIGGERD_HOME/bin/triggerMyService.sh

 #!/bin/bash
 start_triggerd=$TRIGGERD_HOME/bin/triggerMyService.sh
 stop_triggerd=$TRIGGERD_HOME/bin/triggerMyService.sh

 start() {
  echo -n “Starting MyService”
 }

 stop() {
  echo -n “Shutdown MyService”
 }

 #how we were called
 case “$1” in
  start)
     start
   ;;
  stop)
   stop
   ;;
  restart)
   stop
   sleep 10
   start
   ;;
  *)
   echo “Usage: $0 {start|stop|restart}”
 esac
 exit 0


2. chmod 777 /etc/init.d/triggerd



.Method 2: systemctl

1. 建立一個名為 triggerd.service 的系統服務指令碼
 vim /usr/lib/systemd/system/triggerd.service

 [Unit]
 Description=triggerMyService.sh

 [Service]
 Type=forking
 PIDFile=…
 Environment=CATALINA_HOME=/usr/local/triggerMyService.sh

 ExecStart=/usr/local/triggerMyService.sh start
 ExecStop=/usr/local/triggerMyService.sh stop
 User=…
 Group=…
 PrivateTmp=true

 [Install]
 WantedBy=multi-user.target

2. 重新載入一下配置
 systemctl daemon-reload

3. 設定允許開機自啟動
 systemctl enable triggerd

 #啟動服務
 systemctl start triggerd

 

ref.

創建 Daemon 程式

start-stop-daemon 啟動停止系統守護進程

[開機啟動]Linux開機自啟和運行級別

centos7下配置Tomcat開機啟動(service方式和daemon方式)

Linux systemd 寫 可自動啟動的 Daemon Service

 

|Jobs| Why should we do unit tests?

In my opinions, I think it is a good way to understand the job scope for a rookie of software engineer.

On the other hand, our products are consumer electronics. Unit tests will help us understand what functions are end users used and whether functions are really useful or not.

Finally, it is an important way to think about why do you develop the features.

下禮拜打算請新人幫忙測試 Unit Tests, 希望他心裡不要太多 murmur.
雖然代工廠不重視這個, 但我認為這是一個認識自己工作的方式. 而且趁機多問一些, 還能夠學到一些設計的方法與考量.

嗯 …… 老實說, 代工廠跟自己做品牌其實思維真的很不同.

 

 

|Life| Manage Everything in Your Life

生活中每件事都要管理的:

管理家裡擺設

管理你的體重

管理你的財務

工作上也是,不能因為是工程師就認為不需要管理。平常養成習慣,管理好你的東西與心思,做事事半功倍。

管理你的文件

管理你的心得

管理你的程式碼

管理你能參考的 Log


祝大家都能管理好自己的人生

|Jobs| How do I teach a Trainee?

哇 工作才剛三年,竟然有機會要帶新人。(因為大家太忙了,我相對離新人不久 XD)

我想我能做的就是:

帶他使用工具(系統廠的 debugger)

克服環境設定的任何問題(這個沒弄好很容易讓人放棄寫程式)

學會看 Code(執行檔要從 main 開始看哦 ^.<)

哪裡找文件

軟體架構上下層輸出輸入的關係

請他找一個自己喜歡的看 Code 軟體

其實在這過程,就會想起之前學長怎麼帶的及前老闆精闢的指點。

大家對我真的是蠻有耐心的,十分感謝。

希望我也能在新人心中留下好印象。

|Tools| Useful Linux Commands

.在特定類型的文件裡找字串
grep -ir “ooxx“ –include=”*.java”

.掛載外接硬碟
sudo fdisk -l
mkdir /media/usb
sudo mount -v -t auto /dev/sdb1 /media/usb

.找特定類型的檔案

find -iname *.git

.確認編譯出來檔案的 ELF

readelf

.列出所有執行的東西

ps -Al

WordPress.com.

Up ↑