Wednesday, September 30, 2020

Program/Process/Thread 差異



依 Linux 為例,利用 task struct 是 linux kernel 用來描述 process thread 結構 schedule.h 裡面


Process ( 程序、進程 )

Process 意旨已經執行並且 load 到記憶體中的 Program ,程序中的每一行程式碼隨時都有可能被CPU執行。

每一個 Process 是互相獨立的

Process 是 Thread 的容器

在多功作業系統(Multitasking Operating System)中,可以同時執行數個Process ,然而一個 CPU 一次只能執行一個 Process (因此才有現在的多核處理器),而 Process 的運行量總量不會少於 CPU 的總量,又Process 會佔用記憶體,因此如何排程(Scheduling,恐龍本第五章) 、如何有效管理記憶體(恐龍本第八章)則是 OS 所關注的事


Thread (執行緒、線程 )

同一個 Process 中會有很多個 Thread ,每一個 Thread 負責某一項功能。

同一個 Process 底下的 Thread 共享資源,如 記憶體、變數等,不同的Process 則否。

在多執行緒中(Multithreading),兩個執行緒若同時存取或改變全域變數(Global Variable),則可能發生同步(Synchronization,恐龍本第六章)問題。若執行緒之間互搶資源,則可能產生死結(Deadlock,恐龍本第七章),同樣的,如何避免或預防上述兩種情況的發生,依然是 OS 所關注並改善的。

Tuesday, September 29, 2020

Vim

刪除每行前 3 個字元

:%s/^.\{3\}//

刪除每行後 3 個字元

:%s/.\{3\}$//

刪除偶數行

:%s/\(^.*$\)\n^.*$/\1/g

刪除奇數行

:%s/^.*$\n\(^.*$\)/\1/g

Singly Linked list

鏈結串列的抽象資料結構 (ADT)

Linked list (連結串列) 是一種常見的資料結構,其使用 node (節點)來記錄、表示、儲存資料(data),並利用每個 node 中的 pointer 指向下一個 node,藉此將多個 node 串連起來,形成 Linked list,並以 NULL 來代表 Linked list 的終點,見圖一(a)。


圖一(a)


圖一(b)

Node2 = Node1->Next 


刪除節點在 middle

刪除節點在 tail




範例

Reference:

https://alrightchiu.github.io/SecondRound/linked-list-introjian-jie.html

OS Index

應用層的運算加速 - 並行運算

OS作業系統學習

Linux Kernel 排程機制介紹

Android筆記-Linux Kernel Ftrace (Function Trace)解析

Android 筆記-Linux Kernel SMP (Symmetric Multi-Processors) 開機流程解析 Part(4) Linux 多核心啟動流程-kthreadd 與相關的核心模組

Program/Process/Thread 差異

虛擬記憶體 Virtual Memory

同步 (Synchronization) 筆記

Process Synchronization(同步)--上 (race condition, critical section)

Process Synchronization(同步)--中 (critical section problem的解決方法)

Process Synchronization(同步)--下 (常看到的經典問題)

死結 (Deadlock) 筆記

Deadlocks(死結)--上 (形成deadlock,必須同時滿足4個條件)

Deadlocks(死結)--中

Deadlocks(死結)--下


C 語言程式記憶體配置概念

 記憶體的使用主要可分為 text、data、bss、stack、heap 與 system 這幾個部分


https://blog.gtwang.org/programming/memory-layout-of-c-program/

堆(heap)與棧(stack)的區別 一

堆(heap)與棧(stack)的區別二


Android 中使用 addr2line 来分析 native 信息

 prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin


aarch64-linux-android-addr2line 用法
aarch64-linux-android-addr2line -e [file_to_check] [program_count (pc)]

ex.
Error Log:  AEE/AED: #00 pc 0000abcd /system/bin/testcrashd
Check Code Error: aarch64-linux-android-addr2line -e testcrashd abcd


Android 中使用addr2line来分析crash log的native信息

Monday, September 28, 2020

Kubernetes

 介紹

Deploy a Production-Ready Kubernetes Cluster Using kubespray

Kubernetes 基礎教學(一)原理介紹

Kubernetes 基礎教學(二)實作範例:Pod、Service、Deployment、Ingress

Kubernetes 基礎教學(三)Helm 介紹與建立 Chart

Protocol Index

 MQTT

事件匯流排的 RabbitMQ

RabbitMQ 起手式 (一) 安裝

RabbitMQ (二) 概念

RabbitMQ (三) Fanout 交換器

WebRTC

Avahi

D-Bus

AirPlay 原理

找尋設備的方法

    1. WS-Discovery (Web Services Dynamic Discovery)

         透過 multicast 傳送 SOAP/XML

    2. SSDP

         屬於UPNP服務的一部分。作法是透過multicast送出http封包 (M-Search),支援SSDP的設備會回復設備資訊

    3. MDNS (Multicast Domain Name Service)

        屬於 Zero configuration 的一部分,當區域網路內不存在 DNS 伺服器時,可以透過此種方式找尋想要的服務。 其技術原理是透過 IP multicast over User Datagram Protocol (UDP),進行 Host Discovery 或是 Service Discovery

    4. ADwin Config

        用來偵測或設定ADwin公司的設備。

    5. Bonjour

        Apple公司用來找尋設備的協議,只能夠在一個子網內運行。主要支援三種運作。

        1. Publication (advertising a service)

           1.1 設備配置給自己一個 link-local IP address,例如:169.254.150.84,接著在網路上廣播尋找此位置(透過ARP),若沒有收到回應,表示此IP尚未有人使用,設備便可以將此IP當成自己的IP位置。

            1.2 接著透過同樣的方式,設定設備的Domain name,例如:eds-musicbox.local.  ,同時設定Domain name時,可以設定 service record,註明將會提供的無誤,例如:Ed’s Party Mix._music._tcp.local.

        2. Discovery (browsing for available services)

            2.1 要找尋某個特別設備時,可使用 MDNS 定義的 standard query,詢問網路上是否在區域網路上存在一個使用TCP的音樂設備,例如:詢問  ._music._tcp.local.,如此便可以找到步驟 publication 中的設備

        3. Resolution (translating service names to addresses and port numbers for use)

            3.1 將查詢到的  name " Ed’s Party Mix._music._tcp.local." 轉換為 IP address + port number

File or Memory Format Index

PE Format

  PEiD

ELF Format

C 語言程式記憶體配置概念

Anatomy of a Program in Memory (Windows or Linux)

Comparison of 32-bit and 64-bit memory architecture for 64-bit editions of Windows XP and Windows Server 2003

Linux可执行文件与进程的虚拟地址空间

Android/Linux Kernel 記憶體管理-入門筆記

linux command

  sudo cat /proc/1261/maps

https://www.slideshare.net/AngelBoy1/execution-50215114

Friday, September 25, 2020

size

 johnnysu@xxxx: ~ $  size  /bin/ls

   text    data     bss     dec     hex filename

 105182    2044    3424  110650   1b03a /bin/ls

===============================================================

johnnysu@xxxx: ~ $  size -A /bin/ls

/bin/ls  :

section                size      addr

.interp                  28   4194872

.note.ABI-tag            32   4194900

.note.gnu.build-id       36   4194932

.gnu.hash               104   4194968

.dynsym                3096   4195072

.dynstr                1427   4198168

.gnu.version            258   4199596

.gnu.version_r          144   4199856

.rela.dyn               168   4200000

.rela.plt              2688   4200168

.init                    26   4202856

.plt                   1808   4202896

.text                 63066   4204704

.fini                     9   4267772

.rodata               20732   4267808

.eh_frame_hdr          1836   4288540

.eh_frame              9724   4290376

.init_array               8   6397424

.fini_array               8   6397432

.jcr                      8   6397440

.dynamic                496   6397448

.got                      8   6397944

.got.plt                920   6397952

.data                   596   6398880

.bss                   3424   6399488

.gnu_debuglink            8         0

Total                110658




Readelf

 johnnysu@xxxx: ~ $  readelf -h /bin/ls

ELF Header:

  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00

  Class:                             ELF64

  Data:                              2's complement, little endian

  Version:                           1 (current)

  OS/ABI:                            UNIX - System V

  ABI Version:                       0

  Type:                              EXEC (Executable file)

  Machine:                           Advanced Micro Devices X86-64

  Version:                           0x1

  Entry point address:               0x404890

  Start of program headers:          64 (bytes into file)

  Start of section headers:          108288 (bytes into file)

  Flags:                             0x0

  Size of this header:               64 (bytes)

  Size of program headers:           56 (bytes)

  Number of program headers:         9

  Size of section headers:           64 (bytes)

  Number of section headers:         28

  Section header string table index: 27


C Polymorphism

 多形表示在同一個介面上、根據不同的資料型態會有不同的方式處理

C Inheritance

labeledPoint.h

======================================================================== 

struct LabeledPoint;

struct LabeledPoint* makeLabeledPoint(double x, double y, char* label);


void setLabel(struct LabeledPoint *lp, char *label);

char* getLabel(struct LabeledPoint *lp);

======================================================================== 

labeledPoint.c

======================================================================== 

/* labeledPoint.c */

#include "labeledPoint.h"

#include <stdlib.h>


struct LabeledPoint {

    double x, y;

    char* name;

};


struct LabeledPoint* makeLabeledPoint(double x, double y, char* label) {

    struct LabeledPoint* p = malloc(sizeof(struct LabeledPoint));

    p->x = x;

    p->y = y;

    p->name = name;

    return p;

}

void setLabel(struct LabeledPoint* lp) {

    lp->name = name;

}

char* getLabel(struct LabeledPoint* lp) {

    return lp->name;

}

========================================================================

main.c

========================================================================

/* main.c */

#include "point.h"

#include "labeledPoint.h"

#include <stdio.h>


int main(int argc, char** argv) {

    struct LabeledPoint* origin = makeLabeledPoint(0.0, 0.0, "origin");

    struct LabeledPoint* lowerLeft = makeLabeledPoint(-1.0, -1.0, "lowerLeft");

    printf("distance = %f\n", getDistance(

        (struct Point*) origin, (struct Point*) lowerLeft));

}

C Encapsulation

point.h 

=======================================================================

struct Point;

struct Point* makePoint(double x, double y);

double getDistance(struct Point *p1, struct Point *p2);

=======================================================================

point.c

=======================================================================

/* point.c */

#include "point.h"

#include <stdlib.h>

#include <math.h>

struct Point {

    double x, y;

}

struct Point* makePoint(double x, double y) {

    struct Point* p = malloc(sizeof(struct Point));

    p->x = x;

    p->y = y;

    return p;

}

double getDistance(struct Point* p1, struct Point *p2) {

    double dx = p1->x - p2->x;

    double dy = p1->y - p2->y;

    return sqrt(dx*dx + dy*dy);

=======================================================================

Compare C++

=======================================================================

point.h

=======================================================================

class Point {

public:

    Point(double x, double y);

    double getDistance(const Point& p) const;

private:

    double x;

    double y;

}

=======================================================================

point.cc

=======================================================================

#include "point.h"

#include <math.h>


Point::Point(double x, double y): x(x), y(y) {}


double Point::getDistance(const Point& p) const {

    double dx = x - p.x;

    double dy = y - p.y;

    return sqrt(dx*dx + dy*dy);

}

=======================================================================

C 物件導向

封裝 Encapsulation

繼承 Inheritance

多形 Polymorphism

Monday, September 14, 2020

Android MVVM

适用场景:适用于界面展示的数据较多的项目。 
 
MVVM(Model-View-ViewModel)将Presenter改为ViewModel,其和MVP类似,不同的是ViewModel跟Model和View进行双向绑定:当View发生改变时,ViewModel通知Model进行更新数据;同理Model数据更新后,ViewModel通知View更新。 

优点: 

低耦合 
View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 

可重用性 
可以把一些View逻辑放在一个ViewModel里面,让很多view重用这段View逻辑。 

独立开发 
开发人员可以专注于业务逻辑和数据的开发(ViewModel),另一个开发人员可以专注于UI开发。 

可测试 
界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。 

提高可维护性 提供双向绑定机制,解决了MVP大量的手动View和Model同步的问题。从而提高了代码的可维护性。 

缺点:
  • 过于简单的图形界面不适用。 
  • 对于大型的图形应用程序,视图状态较多,ViewModel的构建和维护的成本都会比较高。
  • 数据绑定的声明是指令式地写在View的模版当中的,这些内容是没办法去打断点debug的。 
  • 目前这种架构方式的实现方式比较不完善规范,常见的就是DataBinding框架

Android MVP

用场景:视图界面不是很多的项目中。

MVP(Model-View-Presenter)是MVC的演化版本,MVP的角色定义如下

  • Model:主要提供数据的存取功能。Presenter需要通过Model层来存储、获取数据。
  • View:负责处理用户事件和视图部分的展示。在Android中,它可能是Activity、Fragment类或者是某个View控件。
  • Presenter:作为View和Model之间沟通的桥梁,它从Model层检索数据后返回给View层,使得View和Model之间没有耦合。

在MVP里,Presenter完全将Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过 定义好的接口进行交互 ,从而使得在变更View时可以保持Presenter的不变,这点符合面向接口编程的特点。View只应该有简单的setter/getter方法,以及用户输入和设置界面显示的内容,除此之外就不应该有更多的内容。绝不允许View直接访问Model,这就是其与MVC的很大不同之处。

MVP优点:

  • Model与View完全分离,可以修改View而不影响Model
  • 可以更高效的使用Model,因为Model与外界的交互都在Presenter内部
  • 可以将一个Presenter用于多个View,而不需要改变Presenter的逻辑。这个特性很有用,因为View的变化总是比Model的变化频繁
  • 把逻辑放在Presenter中,就可以脱离UI来测试这些逻辑(单元测试)

MVP缺点:

  • Presenter作为桥梁协调View和Model,会导致Presenter变得很臃肿,维护比较困难

MVC ->  MVP 的最大差異在於 Activity的商業邏輯移到Presenter,Activity 專心於View

Reference:



Android MVC

适用场景:适用于较小,功能较少,业务逻辑较少的项目。

MVC模式是最经典开发模式之一,它分为三个部分Model,View,Controller。

  • 模型层(Model):是应用程序中独立于用户界面的动态数据结构;它直接管理应用程序的数据,逻辑和规则。
  • 视图层(View):用户界面,用来展示信息。
  • 控制层(Controller):接收输入事件,操控model或view。
除了将应用程序划分为这些组件之外,MVC还定义了它们之间的交互

  • model负责管理应用程序的数据,它从controller接收用户输入。
  • view以特定格式呈现model。
  • controller响应用户输入并对数据model对象执行交互。controller接收输入,可选地验证它,然后将输入传递给model。
Android 中的 MVC 也有它的缺点:
  • Activity 并不是一个标准的 MVC 模式中的 Controller,它的首要职责是加载应用的布局和初始化用户界面,接受并处理来自用户的操作请求,进而做出响应。随着界面及其逻辑的复杂度不断提升,Activity 类的职责不断增加,以致变得庞大臃肿。
  • View 层和 Model 层直接进行交互,就必然会导致Model和View之间的耦合,不易开发和维护。
在MVC的架構,通常會把layout(xml)當成View,Activity當成Controller, 事實上,Activity 卻是Controller 與View 的混合,於是Activity既要做處理View,也負責商業邏輯。使得Activity越來越肥。

Reference:

https://windsuzu.github.io/learn-android-architecture-pattern/
https://blog.yorek.xyz/android/paid/zsxq/week21-mvc&mvp&mvvm/

Sunday, September 13, 2020

MVC - three pattern

 




架构, 框架, 设计模式

MVC 是 Observer pattern, Strategy pattern 和 Composite pattern 三个设计模式的演变.

Design Pattern 的核心是 Pattern

MVC这个级别的东西怎么都不可能归类到Pattern(小花样)这一类的东西上。当然更不可以是框架,因为框架不是抽象的,而 MVC 是抽象的。

MVC是一种模式。在Martin Fowler的《企业应用架构模式》中,它属于表现层的架构模式。 (Mode)

MVC 在架构模式中的实现不同可能还会用到工厂模式 (Factory) 和装饰器 (Decorator) 模式。

框架通常是代码重用

设计模式是设计重用

架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。

在软件生产中有 3 种级别的重用

1. 内部重用,即在同一应用中能公共使用的抽象块;

2. 代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用

3. 应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。



设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;

框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示

设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识。

简而言之:框架是大智慧,用来对软件设计进行分工;

设计模式是小技巧,对具体问题提出解决方案,以提高代码复用率,降低耦合度。

Thursday, September 3, 2020

Encryption String

Decoder/Encoder Tool 

ASCII (Tool)

Base64 原理 (Tool)

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字元作為編碼後的輸出,直到全部輸入資料轉換完成。


用 objdump 指令觀察 ELF 檔案

 



 編譯 gcc -o test test.c

查看區段

objdump -h test

objdump -s test

s 這個參數表示要使用 16 進位表示法顯示出 object code 中的各個區段,可以看到一些 read only的資料室蠻明顯的,但是 .txt 基本上不是人看得,最後可以觀察到 .comment 這個 section 是可以省略掉的資訊

d 這個參數讓object code 可以反組譯成 assemble code,方便我們觀察程式,有些時候只能拿到library 的時候,就只能從這裡挖到一些資料了,雖然可讀性沒有 C 好,但是至少比 binary code強

objdump -x test

最後x參數可以所是列出了所有資訊,不只包含了 h 這個參數,還列出了許多 symbol table 跟一些需要重新定位 label 資訊 這裡觀察到兩個有趣的地方,兩個變數被寫進了不同的區段,有初始化的m被寫入了.data內,沒有的則被寫入了.bss,printf 不見了,其實被取代成了puts,這是compiler 優化的結果,puts 在處理只有字串的資訊比 printf 有效率,UND 表示尚未定義在這個object code 中

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能