SlideShare une entreprise Scribd logo
1  sur  99
Télécharger pour lire hors ligne
手把手教你如何串接 log 到
各種網路服務
Kewang
Who I am
●
王慕羣
● Java / Node.js / AngularJS
● HBase / SQL-like
● Git / DevOps
kewang @ GitHub
kewang.information @ Facebook
kewangtw @ Linkedin
kewang @ SlideShare
cpckewang @ Gmail
HadoopCon '14, '15
MOPCON '14
What Mitake is
三竹資訊
● Qmi:企業內部即時通訊軟體
●
全國最大的企業簡訊平台
● 市佔近 100% 的行動下單
● 市佔近 70% 的行動銀行
●
企業內部應用、產壽險、金融相關政府機關
● 其他:兌彩券、台灣匯率、三竹小股王、行動股市 ... 等
4
Agenda
5
Agenda
● 各 logger framework 簡單介紹
6
Agenda
● 各 logger framework 簡單介紹
● logback 內部架構
7
Agenda
● 各 logger framework 簡單介紹
● logback 內部架構
● 如何用 logback 串接網路服務
8
各 logger framework 簡單介紹
interface & implementation
9
logger framework
10
logger framework
● slf4j
11
logger framework
● slf4j
● jcl
12
logger framework
● slf4j
● jcl
● jul
13
logger framework
● slf4j
● jcl
● jul
● Log4j 1
14
logger framework
● slf4j
● jcl
● jul
● Log4j 1
● Log4j 2
15
logger framework
● slf4j
● jcl
● jul
● Log4j 1
● Log4j 2
● Logback
16
17
logger 分類 - Interface
18
logger 分類 - Interface
● slf4j - Simple Logging Facade for Java
– 利用 Facade Pattern 提供一些 logging API ,可以轉換
各種不同的 logger implementation
19
logger 分類 - Interface
● slf4j - Simple Logging Facade for Java
– 利用 Facade Pattern 提供一些 logging API ,可以轉換
各種不同的 logger implementation
● jcl - Jakarta Commons Logging
– Apache 開發出與 slf4j 類似功用的 library
20
logger 分類 - Implementation
21
logger 分類 - Implementation
● Logback - 今日主角
22
logger 分類 - Implementation
● Logback - 今日主角
● jul - java.util.logging
– Java 1.4 之後的內建 logger API
23
logger 分類 - Implementation
● Logback - 今日主角
● jul - java.util.logging
– Java 1.4 之後的內建 logger API
● Log4j 1 - logging library for Java
– EOL @ 2015/8/5
24
logger 分類 - Implementation
● Logback - 今日主角
● jul - java.util.logging
– Java 1.4 之後的內建 logger API
● Log4j 1 - logging library for Java
– EOL @ 2015/8/5
● Log4j 2 - Interface + Implementation
25
26
logback 內部架構
27
Architecture
28
Architecture
● Logger
– effective level
– basic selection rule
29
Architecture
● Logger
– effective level
– basic selection rule
● Appender
– output destination
– i.e. console, files, remote socket servers, DB, JMS, and
remote UNIX Syslog daemons
30
Architecture
● Logger
– effective level
– basic selection rule
● Appender
– output destination
– i.e. console, files, remote socket servers, DB, JMS, and remote
UNIX Syslog daemons
● Layout
– formatting the event to string
31
Architecture - flow
● Get the filter chain decision
● Apply the basic selection rule
● Create a LoggingEvent object
● Invoking appenders
● Formatting the output
● Sending out the LoggingEvent
32
Architecture - sequence diagram
33
Architecture - sequence diagram
34
如何用 logback 串接網路服務
35
logback.xml - 給使用者看的
36
logback.xml - 給使用者看的
<appender name="REDMINE" class="example.MyOwnAppender">
<url>http://example.com</url>
<apiKey>abcdef1234567890</apiKey>
<projectId>5566</projectId>
<title>Logback Redmine Appender</title>
<onlyError>true</onlyError>
<encoder class="c.q.l.c.e.PatternLayoutEncoder">
<pattern>${PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender>
37
logback.xml - 注意事項
38
logback.xml - 注意事項
● camelCase
39
logback.xml - 注意事項
● camelCase
● follow the setter/getter JavaBeans conventions
40
logback.xml - 注意事項
● camelCase
● follow the setter/getter JavaBeans conventions
● only tag, no attribute
41
logback.xml - 注意事項
● camelCase
● follow the setter/getter JavaBeans conventions
● only tag, no attribute
● Joran
42
Template - 給開發者看的
MyOwnAppender extends AppenderBase<ILoggingEvent> {
@Override
protected void append(ILoggingEvent event) {
}
}
write log
43
Template - 給開發者看的
MyOwnAppender extends AppenderBase<ILoggingEvent> {
@Override
public void start() {
super.start();
}
@Override
protected void append(ILoggingEvent event) {
}
}
initialization
44
start() - initialization
45
start() - initialization
super.start();
46
start() - initialization
if (!checkProperties()) {
addError("Some message");
return;
}
super.start();
47
start() - initialization
if (!checkProperties()) {
addError("Some message");
return;
}
encoder.init(System.out);
super.start();
48
start() - initialization
if (!checkProperties()) {
addError("Some message");
return;
}
encoder.init(System.out);
layout = encoder.getLayout();
super.start();
49
start() - initialization
if (!checkProperties()) {
addError("Some message");
return;
}
encoder.init(System.out);
layout = encoder.getLayout();
initialProperties();
super.start();
50
append(ILoggingEvent) - write log
51
append(ILoggingEvent) - write log
String log = decorateLog(event);
52
append(ILoggingEvent) - write log
String log = decorateLog(event);
writeLogToSomewhere(log);
53
StackTraces
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
at com.hello.AppTest.testSms(AppTest.java:13)
54
ILoggingEvent
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
55
ILoggingEvent
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
event.getTimestamp()
56
ILoggingEvent
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
event.getTimestamp()
event.getThreadName()
57
ILoggingEvent
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
event.getTimestamp()
event.getThreadName()
event.getLevel()
58
ILoggingEvent
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
event.getTimestamp()
event.getThreadName()
event.getLevel()
event.getLoggerName()
59
ILoggingEvent
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
event.getTimestamp()
event.getThreadName()
event.getLevel()
event.getLoggerName()
event.getMessage()
60
ILoggingEvent
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
event.getTimestamp()
event.getThreadName()
event.getLevel()
event.getLoggerName()
event.getMessage()
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg
61
IThrowableProxy
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
event.getThrowableProxy()
62
IThrowableProxy
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
proxy.getClassName()
event.getThrowableProxy()
63
IThrowableProxy
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
proxy.getClassName()
proxy.getMessage()
event.getThrowableProxy()
64
StackTraceElement
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
at com.hello.AppTest.testSms(AppTest.java:13)
proxy
.getStackTraceElementProxyArray()[n]
.getStackTraceElement()
65
StackTraceElement
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
at com.hello.AppTest.testSms(AppTest.java:13)
elem.getClassName()
proxy
.getStackTraceElementProxyArray()[n]
.getStackTraceElement()
66
StackTraceElement
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
at com.hello.AppTest.testSms(AppTest.java:13)
elem.getClassName()
elem.getMethodName()
proxy
.getStackTraceElementProxyArray()[n]
.getStackTraceElement()
67
StackTraceElement
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
at com.hello.AppTest.testSms(AppTest.java:13)
elem.getClassName()
elem.getMethodName()
elem.getFileName()
proxy
.getStackTraceElementProxyArray()[n]
.getStackTraceElement()
68
StackTraceElement
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
at com.hello.AppTest.testSms(AppTest.java:13)
elem.getClassName()
elem.getMethodName()
elem.getFileName()
elem.getLineNumber()
proxy
.getStackTraceElementProxyArray()[n]
.getStackTraceElement()
69
StackTraceElement
2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:
java.lang.RuntimeException: Oops
at com.hello.AppTest.testSms(AppTest.java:13)
elem.toString()
proxy
.getStackTraceElementProxyArray()[n]
.getStackTraceElement()
70
Appenders @ kewang
71
Appenders @ kewang
● logback-redmine-appender
● logback-sms-appender
72
Appenders @ kewang
● logback-redmine-appender
– merge the same StackTraces @ one issue
● logback-sms-appender
73
Appenders @ kewang
● logback-redmine-appender
– merge the same StackTraces @ one issue
– link StackTraces with git repo
● logback-sms-appender
74
Appenders @ kewang
● logback-redmine-appender
– merge the same StackTraces @ one issue
– link StackTraces with git repo
– nested tag
● logback-sms-appender
75
Appenders @ kewang
● logback-redmine-appender
– merge the same StackTraces @ one issue
– link StackTraces with git repo
– nested tag
● logback-sms-appender
– custom output
76
Appenders @ kewang
● logback-redmine-appender
– merge the same StackTraces @ one issue
– link StackTraces with git repo
– nested tag
● logback-sms-appender
– custom output
– only append ERROR level
77
Live DEMO
78
One more thing
79
Logpushhttp://logpush.io
80
Live DEMO
81
Features
82
Features
● one AP,multiple environments
83
Features
● one AP,multiple environments
● one environment, multiple subscriptions
84
Features
● one AP,multiple environments
● one environment, multiple subscriptions
● RESTful API
85
Features
● one AP,multiple environments
● one environment, multiple subscriptions
● RESTful API
● ...... etc.
86
logback-logpush-appender
<dependency>
<groupId>io.logpush</groupId>
<artifactId>logback-logpush-appender</artifactId>
<version>0.1.0</version>
</dependency>
pom.xml
87
logback-logpush-appender
<appender name="LOGPUSH" class="i.l.l.a.LogpushAppender">
<token>THIS_IS_LOGPUSH_TOKEN</token>
<onlyError>true</onlyError>
<encoder class="c.q.l.c.e.PatternLayoutEncoder">
<pattern>${PATTERN}</pattern>
<charset>${CHARSET}</charset>
</encoder>
</appender>
logback.xml
88
Definition
● AP
● Logpush Server
● Firebase Cloud Messaging
● Mobile device
89
Log flow
Firebase Cloud MessagingLogpush Server
Mobile deviceAP
90
Log flow - send log to Logpush
Firebase Cloud MessagingLogpush Server
Mobile deviceAP
send log via appender
91
Log flow - send msg to FCM
Firebase Cloud MessagingLogpush Server
Mobile deviceAP
send
send log via appender
92
Log flow - send log to subscription
Firebase Cloud MessagingLogpush Server
Mobile deviceAP
send
receivesend log via appender
93
Log flow - other features
Firebase Cloud MessagingLogpush Server
Mobile deviceAP
send
receivesend log via appender RESTful API
94
95
早期版本,請小力鞭
96
早期版本,請小力鞭
97
References
● http://logpush.io
● Logback
● jdk-logging log4j logback、 、 日志介绍及原理
● slf4j jcl jul log4j1 log4j2 logback、 、 、 、 、 大总结
● Log4j Log4j 2 Logback SFL4J JUL JCL、 、 、 、 、 的比
较
98
99

Contenu connexe

Tendances

How to integrate front end tool via gruntjs
How to integrate front end tool via gruntjsHow to integrate front end tool via gruntjs
How to integrate front end tool via gruntjs
Bo-Yi Wu
 
Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud
Shekhar Gulati
 

Tendances (20)

How to integrate front end tool via gruntjs
How to integrate front end tool via gruntjsHow to integrate front end tool via gruntjs
How to integrate front end tool via gruntjs
 
Introduction to Grunt.js on Taiwan JavaScript Conference
Introduction to Grunt.js on Taiwan JavaScript ConferenceIntroduction to Grunt.js on Taiwan JavaScript Conference
Introduction to Grunt.js on Taiwan JavaScript Conference
 
Heroku 101 py con 2015 - David Gouldin
Heroku 101   py con 2015 - David GouldinHeroku 101   py con 2015 - David Gouldin
Heroku 101 py con 2015 - David Gouldin
 
Why PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring BootWhy PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring Boot
 
Java REST API Framework Comparison - UberConf 2021
Java REST API Framework Comparison - UberConf 2021Java REST API Framework Comparison - UberConf 2021
Java REST API Framework Comparison - UberConf 2021
 
When Web meet Native App
When Web meet Native AppWhen Web meet Native App
When Web meet Native App
 
Basic Rails Training
Basic Rails TrainingBasic Rails Training
Basic Rails Training
 
What is Git | What is GitHub | Git Tutorial | GitHub Tutorial | Devops Tutori...
What is Git | What is GitHub | Git Tutorial | GitHub Tutorial | Devops Tutori...What is Git | What is GitHub | Git Tutorial | GitHub Tutorial | Devops Tutori...
What is Git | What is GitHub | Git Tutorial | GitHub Tutorial | Devops Tutori...
 
The JavaFX Ecosystem
The JavaFX EcosystemThe JavaFX Ecosystem
The JavaFX Ecosystem
 
Clojure Web Development
Clojure Web DevelopmentClojure Web Development
Clojure Web Development
 
Making the Most of Your Gradle Build
Making the Most of Your Gradle BuildMaking the Most of Your Gradle Build
Making the Most of Your Gradle Build
 
Angular beans
Angular beansAngular beans
Angular beans
 
Apache Lucene for Java EE Developers
Apache Lucene for Java EE DevelopersApache Lucene for Java EE Developers
Apache Lucene for Java EE Developers
 
Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud
 
Dropwizard and Friends
Dropwizard and FriendsDropwizard and Friends
Dropwizard and Friends
 
Design & Performance - Steve Souders at Fastly Altitude 2015
Design & Performance - Steve Souders at Fastly Altitude 2015Design & Performance - Steve Souders at Fastly Altitude 2015
Design & Performance - Steve Souders at Fastly Altitude 2015
 
Regex Considered Harmful: Use Rosie Pattern Language Instead
Regex Considered Harmful: Use Rosie Pattern Language InsteadRegex Considered Harmful: Use Rosie Pattern Language Instead
Regex Considered Harmful: Use Rosie Pattern Language Instead
 
Apache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolboxApache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolbox
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Spring Boot and REST API
Spring Boot and REST APISpring Boot and REST API
Spring Boot and REST API
 

En vedette

基礎造就-詩歌賞析
基礎造就-詩歌賞析基礎造就-詩歌賞析
基礎造就-詩歌賞析
Isaac Kao
 

En vedette (11)

From Java Stream to Java DataFrame
From Java Stream to Java DataFrameFrom Java Stream to Java DataFrame
From Java Stream to Java DataFrame
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
 
基礎造就-詩歌賞析
基礎造就-詩歌賞析基礎造就-詩歌賞析
基礎造就-詩歌賞析
 
Xml And JSON Java
Xml And JSON JavaXml And JSON Java
Xml And JSON Java
 
Parsing XML & JSON in Apex
Parsing XML & JSON in ApexParsing XML & JSON in Apex
Parsing XML & JSON in Apex
 
Dino's DEV Project
Dino's DEV ProjectDino's DEV Project
Dino's DEV Project
 
Xml parsing
Xml parsingXml parsing
Xml parsing
 
Parsing XML Data
Parsing XML DataParsing XML Data
Parsing XML Data
 
6 xml parsing
6   xml parsing6   xml parsing
6 xml parsing
 
無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享無瑕的程式碼 Clean Code 心得分享
無瑕的程式碼 Clean Code 心得分享
 
第一次用 Vue.js 就愛上 [改]
第一次用 Vue.js 就愛上 [改]第一次用 Vue.js 就愛上 [改]
第一次用 Vue.js 就愛上 [改]
 

Similaire à 手把手教你如何串接 Log 到各種網路服務

Session 3 - CloudStack Test Automation and CI
Session 3 - CloudStack Test Automation and CISession 3 - CloudStack Test Automation and CI
Session 3 - CloudStack Test Automation and CI
tcloudcomputing-tw
 

Similaire à 手把手教你如何串接 Log 到各種網路服務 (20)

OWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA TestersOWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA Testers
 
Securing your Oracle Fusion Middleware Environment, On-Prem and in the Cloud
Securing your Oracle Fusion Middleware Environment, On-Prem and in the CloudSecuring your Oracle Fusion Middleware Environment, On-Prem and in the Cloud
Securing your Oracle Fusion Middleware Environment, On-Prem and in the Cloud
 
Django Architecture Introduction
Django Architecture IntroductionDjango Architecture Introduction
Django Architecture Introduction
 
Session 3 - CloudStack Test Automation and CI
Session 3 - CloudStack Test Automation and CISession 3 - CloudStack Test Automation and CI
Session 3 - CloudStack Test Automation and CI
 
Spring Performance Gains
Spring Performance GainsSpring Performance Gains
Spring Performance Gains
 
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(下)
JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(下)JCConf 2015  - 輕鬆學google的雲端開發 - Google App Engine入門(下)
JCConf 2015 - 輕鬆學google的雲端開發 - Google App Engine入門(下)
 
Analyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAnalyzing the Performance of Mobile Web
Analyzing the Performance of Mobile Web
 
Audit your reactive applications
Audit your reactive applicationsAudit your reactive applications
Audit your reactive applications
 
PyCon AU 2012 - Debugging Live Python Web Applications
PyCon AU 2012 - Debugging Live Python Web ApplicationsPyCon AU 2012 - Debugging Live Python Web Applications
PyCon AU 2012 - Debugging Live Python Web Applications
 
How we realized SOA by Python at PyCon JP 2015
How we realized SOA by Python at PyCon JP 2015How we realized SOA by Python at PyCon JP 2015
How we realized SOA by Python at PyCon JP 2015
 
Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2
 
Massaging the Pony: Message Queues and You
Massaging the Pony: Message Queues and YouMassaging the Pony: Message Queues and You
Massaging the Pony: Message Queues and You
 
점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정
 
jRecruiter - The AJUG Job Posting Service
jRecruiter - The AJUG Job Posting ServicejRecruiter - The AJUG Job Posting Service
jRecruiter - The AJUG Job Posting Service
 
How's relevant JMeter to me - DevConf (Letterkenny)
How's relevant JMeter to me - DevConf (Letterkenny)How's relevant JMeter to me - DevConf (Letterkenny)
How's relevant JMeter to me - DevConf (Letterkenny)
 
Creando microservicios con Java, Microprofile y TomEE - Baranquilla JUG
Creando microservicios con Java, Microprofile y TomEE - Baranquilla JUGCreando microservicios con Java, Microprofile y TomEE - Baranquilla JUG
Creando microservicios con Java, Microprofile y TomEE - Baranquilla JUG
 
Oracle_Patching_Untold_Story_Final_Part2.pdf
Oracle_Patching_Untold_Story_Final_Part2.pdfOracle_Patching_Untold_Story_Final_Part2.pdf
Oracle_Patching_Untold_Story_Final_Part2.pdf
 
Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVM
 
Using Groovy to empower WebRTC Network Systems
Using Groovy to empower WebRTC Network SystemsUsing Groovy to empower WebRTC Network Systems
Using Groovy to empower WebRTC Network Systems
 
The Hacking Games - A Road to Post Exploitation Meetup - 20240222.pptx
The Hacking Games - A Road to Post Exploitation Meetup - 20240222.pptxThe Hacking Games - A Road to Post Exploitation Meetup - 20240222.pptx
The Hacking Games - A Road to Post Exploitation Meetup - 20240222.pptx
 

Plus de Mu Chun Wang

Plus de Mu Chun Wang (20)

如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進
 
深入淺出 autocomplete
深入淺出 autocomplete深入淺出 autocomplete
深入淺出 autocomplete
 
你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事
 
網路服務就是一連串搜尋的集合體
網路服務就是一連串搜尋的集合體網路服務就是一連串搜尋的集合體
網路服務就是一連串搜尋的集合體
 
老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統
 
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
 
Funliday 新創生活甘苦談
Funliday 新創生活甘苦談Funliday 新創生活甘苦談
Funliday 新創生活甘苦談
 
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
 
如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件
 
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
 
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
 
Google Maps 開始收費了該怎麼辦?
Google Maps 開始收費了該怎麼辦?Google Maps 開始收費了該怎麼辦?
Google Maps 開始收費了該怎麼辦?
 
Git 可以做到的事
Git 可以做到的事Git 可以做到的事
Git 可以做到的事
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
 
如何與全世界分享你的 Library
如何與全世界分享你的 Library如何與全世界分享你的 Library
如何與全世界分享你的 Library
 
如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌
 
API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一
 
團體共同協作與版本管理 - 01認識共同協作
團體共同協作與版本管理 - 01認識共同協作團體共同協作與版本管理 - 01認識共同協作
團體共同協作與版本管理 - 01認識共同協作
 
你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?
 

Dernier

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Dernier (20)

Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 

手把手教你如何串接 Log 到各種網路服務