vault backup: 2022-09-26 18:29:43
Affected files: .obsidian/workspace 01. 個人/02. 專注Study/20150803 - Android/Android programming.md 01. 個人/02. 專注Study/20220601 - C++/C++17 1.md 03. 資料收集/01. 架站/01. Nginx Layer4 Reverse Proxy.md 03. 資料收集/Android operating.md 03. 資料收集/DB/MySQL.md 03. 資料收集/DB/sqlite.md 03. 資料收集/NextDNS.md 03. 資料收集/SLAM.md 03. 資料收集/V2Ray.md 03. 資料收集/__templates/blogHeader.md 03. 資料收集/__templates/date.md 03. 資料收集/__templates/front matter.md 03. 資料收集/__templates/note.md 03. 資料收集/__templates/table.md 03. 資料收集/__templates/thisWeek.md 03. 資料收集/__templates/日記.md 03. 資料收集/__templates/讀書筆記.md 03. 資料收集/frp.md 03. 資料收集/youtube-dl.md 03. 資料收集/架站/02. SWAG Reverse proxy.md 03. 資料收集/架站/03. Trojan.md 03. 資料收集/架站/04. Gitea.md 03. 資料收集/架站/Nginx/Reverse Proxy(Layer4).md 03. 資料收集/模型/Traxxas Sledge.md 03. 資料收集/模型/舊化作例.md 03. 資料收集/財經.md 03. 資料收集/軍武/虎式.md 03. 資料收集/面試準備/技术面试最后反问面试官的话.md
This commit is contained in:
@@ -1,190 +0,0 @@
|
||||
## docker-compose.yml
|
||||
```yaml
|
||||
version: '3'
|
||||
services:
|
||||
nginx_reverseproxy_l4:
|
||||
container_name: nginx
|
||||
restart: always
|
||||
image: nginx
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./data:/etc/nginx
|
||||
```
|
||||
|
||||
## 準備
|
||||
目錄架構如下:
|
||||
```
|
||||
.
|
||||
├── data
|
||||
│ ├── mime.types
|
||||
│ └── nginx.conf
|
||||
└── docker-compose.yaml
|
||||
```
|
||||
|
||||
### nginx.conf
|
||||
其中`nginx.conf`的內容如下:
|
||||
```
|
||||
|
||||
user nginx;
|
||||
worker_processes 1;
|
||||
|
||||
error_log /var/log/nginx/error.log warn;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
stream {
|
||||
map $ssl_preread_server_name $backend_name {
|
||||
tjn.awin.one trojan;
|
||||
storj.awin.one swag;
|
||||
blog.awin.one swag;
|
||||
gitea.awin.one swag;
|
||||
}
|
||||
|
||||
# trojan
|
||||
upstream trojan {
|
||||
server 192.168.1.31:443;
|
||||
}
|
||||
|
||||
# swag
|
||||
upstream swag {
|
||||
server 192.168.1.20:44320;
|
||||
}
|
||||
|
||||
|
||||
# 监听 443 并开启 ssl_preread
|
||||
server {
|
||||
listen 80 reuseport;
|
||||
listen 443 reuseport;
|
||||
listen [::]:443 reuseport;
|
||||
proxy_pass $backend_name;
|
||||
ssl_preread on;
|
||||
}
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
#tcp_nopush on;
|
||||
|
||||
keepalive_timeout 65;
|
||||
|
||||
#gzip on;
|
||||
|
||||
include /etc/nginx/conf.d/*.conf;
|
||||
}
|
||||
```
|
||||
|
||||
### mime.types
|
||||
其中`mime.types`的內容如下:
|
||||
```
|
||||
types {
|
||||
text/html html htm shtml;
|
||||
text/css css;
|
||||
text/xml xml;
|
||||
image/gif gif;
|
||||
image/jpeg jpeg jpg;
|
||||
application/javascript js;
|
||||
application/atom+xml atom;
|
||||
application/rss+xml rss;
|
||||
|
||||
text/mathml mml;
|
||||
text/plain txt;
|
||||
text/vnd.sun.j2me.app-descriptor jad;
|
||||
text/vnd.wap.wml wml;
|
||||
text/x-component htc;
|
||||
|
||||
image/png png;
|
||||
image/svg+xml svg svgz;
|
||||
image/tiff tif tiff;
|
||||
image/vnd.wap.wbmp wbmp;
|
||||
image/webp webp;
|
||||
image/x-icon ico;
|
||||
image/x-jng jng;
|
||||
image/x-ms-bmp bmp;
|
||||
|
||||
font/woff woff;
|
||||
font/woff2 woff2;
|
||||
|
||||
application/java-archive jar war ear;
|
||||
application/json json;
|
||||
application/mac-binhex40 hqx;
|
||||
application/msword doc;
|
||||
application/pdf pdf;
|
||||
application/postscript ps eps ai;
|
||||
application/rtf rtf;
|
||||
application/vnd.apple.mpegurl m3u8;
|
||||
application/vnd.google-earth.kml+xml kml;
|
||||
application/vnd.google-earth.kmz kmz;
|
||||
application/vnd.ms-excel xls;
|
||||
application/vnd.ms-fontobject eot;
|
||||
application/vnd.ms-powerpoint ppt;
|
||||
application/vnd.oasis.opendocument.graphics odg;
|
||||
application/vnd.oasis.opendocument.presentation odp;
|
||||
application/vnd.oasis.opendocument.spreadsheet ods;
|
||||
application/vnd.oasis.opendocument.text odt;
|
||||
application/vnd.openxmlformats-officedocument.presentationml.presentation
|
||||
pptx;
|
||||
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
|
||||
xlsx;
|
||||
application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
||||
docx;
|
||||
application/vnd.wap.wmlc wmlc;
|
||||
application/x-7z-compressed 7z;
|
||||
application/x-cocoa cco;
|
||||
application/x-java-archive-diff jardiff;
|
||||
application/x-java-jnlp-file jnlp;
|
||||
application/x-makeself run;
|
||||
application/x-perl pl pm;
|
||||
application/x-pilot prc pdb;
|
||||
application/x-rar-compressed rar;
|
||||
application/x-redhat-package-manager rpm;
|
||||
application/x-sea sea;
|
||||
application/x-shockwave-flash swf;
|
||||
application/x-stuffit sit;
|
||||
application/x-tcl tcl tk;
|
||||
application/x-x509-ca-cert der pem crt;
|
||||
application/x-xpinstall xpi;
|
||||
application/xhtml+xml xhtml;
|
||||
application/xspf+xml xspf;
|
||||
application/zip zip;
|
||||
|
||||
application/octet-stream bin exe dll;
|
||||
application/octet-stream deb;
|
||||
application/octet-stream dmg;
|
||||
application/octet-stream iso img;
|
||||
application/octet-stream msi msp msm;
|
||||
|
||||
audio/midi mid midi kar;
|
||||
audio/mpeg mp3;
|
||||
audio/ogg ogg;
|
||||
audio/x-m4a m4a;
|
||||
audio/x-realaudio ra;
|
||||
|
||||
video/3gpp 3gpp 3gp;
|
||||
video/mp2t ts;
|
||||
video/mp4 mp4;
|
||||
video/mpeg mpeg mpg;
|
||||
video/quicktime mov;
|
||||
video/webm webm;
|
||||
video/x-flv flv;
|
||||
video/x-m4v m4v;
|
||||
video/x-mng mng;
|
||||
video/x-ms-asf asx asf;
|
||||
video/x-ms-wmv wmv;
|
||||
video/x-msvideo avi;
|
||||
}
|
||||
```
|
||||
@@ -1 +0,0 @@
|
||||
- [如何透過 adb command line 指令啟動 Android App](https://kkboxsqa.wordpress.com/2014/08/20/%E5%A6%82%E4%BD%95%E9%80%8F%E9%81%8E-adb-command-line-%E6%8C%87%E4%BB%A4%E5%95%9F%E5%8B%95-android-app/)
|
||||
@@ -1,164 +0,0 @@
|
||||
## Build AOSP
|
||||
### Build compile environment
|
||||
1. Install Ubuntu 18.04
|
||||
2. Install packages: `sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig`
|
||||
- https://source.android.com/setup/build/initializing
|
||||
3. Install Repo
|
||||
```
|
||||
mkdir ~/bin
|
||||
PATH=~/bin:$PATH
|
||||
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo ;\
|
||||
chmod a+x ~/bin/repo ;\
|
||||
gpg --recv-key 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65 ;\
|
||||
curl https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ~/bin/repo
|
||||
```
|
||||
- https://source.android.com/setup/develop#installing-repo
|
||||
4. Download AOSP source
|
||||
1. Create folder for AOSP
|
||||
```
|
||||
mkdir -p ~/codes/aosp ; cd ~/codes/aosp
|
||||
```
|
||||
2. Setup git
|
||||
```
|
||||
git config --global user.name AwinHuang ;\
|
||||
git config --global user.email awinhuang@gmail.com
|
||||
```
|
||||
3. Download source code
|
||||
```
|
||||
repo init -u https://android.googlesource.com/platform/manifest ;\
|
||||
repo sync -j8
|
||||
```
|
||||
- 如果要切換某一個特定版本可以使用`-b`,例如:`repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r47`。
|
||||
- 要知道版本tag可以查看:https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds
|
||||
5. Build code
|
||||
```
|
||||
source build/envsetup.sh ;\
|
||||
lunch aosp_arm-eng ;\
|
||||
make clobber ;\
|
||||
make -j16
|
||||
```
|
||||
- `make clobber`用來刪除build資料夾
|
||||
|
||||
### Reference
|
||||
- [GitHub - henrymorgen/android-knowledge-system: Android应用开发最强原创知识体系](https://github.com/henrymorgen/android-knowledge-system)
|
||||
- [Android AOSP基础(二)AOSP源码和内核源码下载 | BATcoder - 刘望舒](http://liuwangshu.cn/framework/aosp/2-download-aosp.html)
|
||||
- [Android AOSP基础(三)Android系统源码的整编和单编 | BATcoder - 刘望舒](http://liuwangshu.cn/framework/aosp/3-compiling-aosp.html)
|
||||
|
||||
## Build kernel
|
||||
1. Download the code
|
||||
```
|
||||
mkdir -p ~/codes/kernel ;\
|
||||
cd ~/codes/kernel ;\
|
||||
repo init -u https://android.googlesource.com/kernel/manifest ;\
|
||||
repo sync -j16
|
||||
```
|
||||
|
||||
2. Compile
|
||||
```
|
||||
build/build.sh
|
||||
```
|
||||
- 如果遇到`Command 'java' not found, but can be installed with:`
|
||||
- 依序安裝
|
||||
- `sudo apt install default-jre`
|
||||
- `sudo apt install openjdk-11-jre-headless`
|
||||
- `sudo apt install openjdk-8-jre-headless`
|
||||
- 執行 `sudo update-alternatives --config java`
|
||||
- 選擇 `/usr/lib/jvm/java-11-openjdk-amd64/bin/java`
|
||||
- 再次compile
|
||||
- `source build/envsetup.sh`
|
||||
- `mm idegen`
|
||||
|
||||
3. 產生android.iml和android.ipr
|
||||
在source code跟目錄下執行:`development/tools/idegen/idegen.sh`
|
||||
|
||||
### Reference
|
||||
- [Android kernel源码下载与编译](https://blog.csdn.net/u010164190/article/details/106561022)
|
||||
|
||||
|
||||
## Android App programming
|
||||
- R的全名:`<PACKAGE_NAME> + .R`,例如package name是`com.awin.testapp`,那全名是`com.awin.testapp.R`。
|
||||
- AndroidX = Android eXtension
|
||||
- Layout
|
||||
- layout_margin: 物件與其他物件的距離
|
||||
- layout_gravity: 物件在容器內的位置(靠左、靠右、置中...)
|
||||
- textApperance: 字型大小
|
||||
- Extensions
|
||||
- Android 4.1 沒有自動加入的extension
|
||||
- 打開build.gradle,在`plugins`區塊中加入:
|
||||
```
|
||||
id 'kotlin-kapt'
|
||||
id 'kotlin-android-extensions'
|
||||
```
|
||||
|
||||
- 使用ViewModel & LiveData
|
||||
- 確認有 `kotlin-kapt` 這個plugin。
|
||||
![[Pasted image 20210330102148.png]]
|
||||
- [Android jetpack所有library](https://developer.android.com/jetpack/androidx/explorer)
|
||||
- [Android jetpack - Lifecycle](https://developer.android.com/jetpack/androidx/releases/lifecycle)
|
||||
- 從`Declaring dependencies`這區塊複製必要的module
|
||||
![[Pasted image 20210330110411.png]]
|
||||
```
|
||||
def lifecycle_version = "2.3.1"
|
||||
|
||||
// ViewModel
|
||||
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
|
||||
// LiveData
|
||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
|
||||
// Annotation processor
|
||||
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
|
||||
```
|
||||
|
||||
- Create a ViewModel
|
||||
```kotlin
|
||||
viewModel = ViewModelProvider(this).get(GuessViewModel::class.java)
|
||||
```
|
||||
|
||||
- Observe a live data in ViewModel
|
||||
```kotlin
|
||||
viewModel.counter.observe(this, Observer {
|
||||
counter.setText(it.toString())
|
||||
})
|
||||
```
|
||||
counter這個變數是包含在ViewModel裡面的live data,我們的資料則是放在counter裡面的「value」。
|
||||
所以如果要取用我們的data,則是:`viewModel.counter.value`。
|
||||
|
||||
- 使用LiveData
|
||||
- `val counter = MutableLiveData<Int>()`
|
||||
|
||||
### Use ViewBinding
|
||||
ViewBinding is used to replace Kotlin Synthetics.
|
||||
1. 在`app/build.gradle`中加入:
|
||||
```
|
||||
plugins {
|
||||
...
|
||||
id 'kotlin-parcelize' <-- Add this
|
||||
}
|
||||
|
||||
android {
|
||||
...
|
||||
buildFeatures { <-- Add this
|
||||
viewBinding true
|
||||
}
|
||||
...
|
||||
}
|
||||
```
|
||||
2. 在你的activity裡面
|
||||
1. `import <APP_DOMAIN_NAME>.databinding.<ACTIVITY_NAME>Binding`
|
||||
假如:APP_DOMAIN_NAME是`com.example.testmultisectioncyclerview`,ACTIVITY_NAME是`ActivityMain`,那就是:
|
||||
`import com.example.testmultisectioncyclerview.databinding.ActivityMainBinding`
|
||||
2. 用`lateinit`宣告一個變數,變數名稱是activity的名字加上binding,例如`ActivityMain`就是:
|
||||
`private lateinit var activityBinding: ActivityMainBinding`
|
||||
3. 在`onCreate()`中,就可以用`activityBinding`來取得view與其他元件了:
|
||||
```
|
||||
activityBinding = ActivityMainBinding.inflate(layoutInflater)
|
||||
setContentView(activityBinding.root) <-- root就是view
|
||||
```
|
||||
|
||||
## ADB usage
|
||||
- [如何透過 adb command line 指令啟動 Android App](https://kkboxsqa.wordpress.com/2014/08/20/%E5%A6%82%E4%BD%95%E9%80%8F%E9%81%8E-adb-command-line-%E6%8C%87%E4%BB%A4%E5%95%9F%E5%8B%95-android-app/)
|
||||
|
||||
# MISC
|
||||
## 教學文
|
||||
- [Android Template 小技巧 及 寫程式常見的問題](https://www.eeaseries.com/2021/01/android-template.html?m=1)
|
||||
- [Jetpack Compose 基础知识](https://developers.google.com/codelabs/jetpack-compose-basics?hl=zh-cn#0)
|
||||
- [一文带你了解适配Android 11分区存储](https://zhuanlan.zhihu.com/p/354632087)
|
||||
@@ -1,2 +0,0 @@
|
||||
DNS服務公司,用途如下:
|
||||
- [量身打造、100% 客製化抗廣告的 NextDNS - jkgtw's blog](https://www.jkg.tw/p3382/)
|
||||
@@ -1 +0,0 @@
|
||||
* [gaoxiang12/slambook](https://github.com/gaoxiang12/slambook)
|
||||
@@ -1 +0,0 @@
|
||||
- [自建最強科學上網5+:V2Ray + Caddy + Tls + HTTP/2 - 美博園](https://allinfa.com/v2ray-caddy-tls-http2-plus.html)
|
||||
@@ -1,4 +0,0 @@
|
||||
frp是一個可用於內網穿透的高性能的反向代理應用,可以作為兩個內網機器通過公網IP進行橋接的橋樑。通過其支持各種服務和傳輸協議,我們就可以實現一系列遠程控制操作。(frp的 Github 主頁上也用結構圖解釋了具體的工作原理,感興趣的話可以前往了解。)
|
||||
|
||||
- [用开源免费的内网穿透工具 frp,实现远程桌面和文件传输 - 少数派](https://sspai.com/post/60852)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
## Reverse Proxy(Layer4)
|
||||
[[03. 資料收集/Nginx#Reverse Proxy]]所用的方法雖然可以反向代理多個網站,但是對於像是Trojan這種TLS不行被中斷的服務來說,會導致handshake失敗,所以需要用Nginx的stream來做Layer 4的轉發。
|
||||
[[Reverse Proxy(Layer4)#Reverse Proxy]]所用的方法雖然可以反向代理多個網站,但是對於像是Trojan這種TLS不行被中斷的服務來說,會導致handshake失敗,所以需要用Nginx的stream來做Layer 4的轉發。
|
||||
|
||||
### docker-compose.yaml
|
||||
需要先把`nginx.conf`與`mime.types`給copy到data目錄下。
|
||||
@@ -1,3 +0,0 @@
|
||||
- [學財報有用嗎?](https://statementdog.com/blog/archives/85)
|
||||
- [買雞排懂財務報表](https://statementdog.com/blog/archives/164?utm_source=user_mailer&utm_medium=email&utm_campaign=send_edm)
|
||||
- [買雞排懂毛利率](https://statementdog.com/blog/archives/268?utm_source=user_mailer&utm_medium=email&utm_campaign=send_edm)
|
||||
Reference in New Issue
Block a user