-:ET
\ No newline at end of file
diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0e/a06c1a63bef4f67f10f12e509739b28b31c03079197fe1b2c79a69a7374f5a b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0e/a06c1a63bef4f67f10f12e509739b28b31c03079197fe1b2c79a69a7374f5a
deleted file mode 100644
index f7d7d3b..0000000
--- a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/0e/a06c1a63bef4f67f10f12e509739b28b31c03079197fe1b2c79a69a7374f5a
+++ /dev/null
@@ -1,2 +0,0 @@
-I"
This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.
-:ET
\ No newline at end of file
diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/61/2cc00e9190ed44be6967cefcdb15b35e1dfc51666b9ae9c2d7448177f50863 b/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/61/2cc00e9190ed44be6967cefcdb15b35e1dfc51666b9ae9c2d7448177f50863
deleted file mode 100644
index 2b44381..0000000
--- a/.jekyll-cache/Jekyll/Cache/Jekyll--Converters--Markdown/61/2cc00e9190ed44be6967cefcdb15b35e1dfc51666b9ae9c2d7448177f50863
+++ /dev/null
@@ -1,3 +0,0 @@
-I"
In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.
-My current solution is using AP to forward all SSL traffic to a proxy, charles proxy is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.
-:ET
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
index 227bfad..7a68f5a 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,10 +1,4 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
-gem 'jekyll'
-
-group :jekyll_plugins do
- gem 'jekyll-paginate'
- gem 'jekyll-gist'
- gem 'jemoji'
- gem 'jekyll-sitemap'
-end
+# gem "github-pages", group: :jekyll_plugins
+gemspec
diff --git a/Gemfile.lock b/Gemfile.lock
index df7faf2..51d2b5a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,48 +1,56 @@
+PATH
+ remote: .
+ specs:
+ jekyll-text-theme (2.2.6)
+ jekyll (>= 3.6, < 5.0)
+ jekyll-feed (~> 0.1)
+ jekyll-paginate (~> 1.1)
+ jekyll-sitemap (~> 1.0)
+ jemoji (~> 0.8)
+
GEM
remote: https://rubygems.org/
specs:
- activesupport (6.0.3.3)
+ activesupport (6.1.4.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
- i18n (>= 0.7, < 2)
- minitest (~> 5.1)
- tzinfo (~> 1.1)
- zeitwerk (~> 2.2, >= 2.2.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ zeitwerk (~> 2.3)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
colorator (1.1.0)
- concurrent-ruby (1.1.7)
- em-websocket (0.5.1)
+ concurrent-ruby (1.1.9)
+ em-websocket (0.5.2)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
eventmachine (1.2.7)
- faraday (1.0.1)
- multipart-post (>= 1.2, < 3)
- ffi (1.13.1)
+ ffi (1.15.4)
forwardable-extended (2.6.0)
gemoji (3.0.1)
html-pipeline (2.14.0)
activesupport (>= 2)
nokogiri (>= 1.4)
http_parser.rb (0.6.0)
- i18n (1.8.5)
+ i18n (1.8.10)
concurrent-ruby (~> 1.0)
- jekyll (4.1.1)
+ jekyll (4.2.1)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (~> 2.0)
jekyll-watch (~> 2.0)
- kramdown (~> 2.1)
+ kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (~> 0.4.0)
pathutil (~> 0.9)
rouge (~> 3.0)
safe_yaml (~> 1.0)
- terminal-table (~> 1.8)
- jekyll-gist (1.5.0)
- octokit (~> 4.2)
+ terminal-table (~> 2.0)
+ jekyll-feed (0.15.1)
+ jekyll (>= 3.7, < 5.0)
jekyll-paginate (1.1.0)
jekyll-sass-converter (2.1.0)
sassc (> 2.0.1, < 3.0)
@@ -59,51 +67,42 @@ GEM
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
- listen (3.2.1)
+ listen (3.7.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.4.0)
mini_portile2 (2.6.1)
- minitest (5.14.2)
- multipart-post (2.1.1)
+ minitest (5.14.4)
nokogiri (1.12.5)
mini_portile2 (~> 2.6.1)
racc (~> 1.4)
- octokit (4.18.0)
- faraday (>= 0.9)
- sawyer (~> 0.8.0, >= 0.5.3)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (4.0.6)
- racc (1.5.2)
- rb-fsevent (0.10.4)
+ racc (1.6.0)
+ rake (10.5.0)
+ rb-fsevent (0.11.0)
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.5)
- rouge (3.23.0)
+ rouge (3.26.1)
safe_yaml (1.0.5)
sassc (2.4.0)
ffi (~> 1.9)
- sawyer (0.8.2)
- addressable (>= 2.3.5)
- faraday (> 0.8, < 2.0)
- terminal-table (1.8.0)
+ terminal-table (2.0.0)
unicode-display_width (~> 1.1, >= 1.1.1)
- thread_safe (0.3.6)
- tzinfo (1.2.7)
- thread_safe (~> 0.1)
- unicode-display_width (1.7.0)
- zeitwerk (2.4.0)
+ tzinfo (2.0.4)
+ concurrent-ruby (~> 1.0)
+ unicode-display_width (1.8.0)
+ zeitwerk (2.5.1)
PLATFORMS
ruby
DEPENDENCIES
- jekyll
- jekyll-gist
- jekyll-paginate
- jekyll-sitemap
- jemoji
+ bundler
+ jekyll-text-theme!
+ rake (~> 10.0)
BUNDLED WITH
2.1.4
diff --git a/_config.yml b/_config.yml
index 550d490..1f26924 100644
--- a/_config.yml
+++ b/_config.yml
@@ -4,35 +4,224 @@
# which you are expected to set up once and rarely need to edit after that.
# For technical reasons, this file is *NOT* reloaded automatically when you use
# 'jekyll serve'. If you change this file, please restart the server process.
+#
+# ,--------. ,--. ,--. ,--.
+# '--. .--',---. \ `.' /,-' '-.
+# | | | .-. : .' \ '-. .-'
+# | | \ --. / .'. \ | |
+# `--' `----''--' '--' `--'
-# Site settings
-title: Stop Talking, Start Doing
-author: Pengzhan Hao
-avatar: "/static/avatar.jpg"
-email: haopengzhan@gmail.com
-description: > # this means to ignore newlines until "baseurl:"
+
+
+
+## => Site Settings
+##############################
+text_skin: default # "default" (default), "dark", "forest", "ocean", "chocolate", "orange"
+highlight_theme: default # "default" (default), "tomorrow", "tomorrow-night", "tomorrow-night-eighties", "tomorrow-night-blue", "tomorrow-night-bright"
+url : "https://codersherlock.github.com/"
+baseurl : ""
+title : Stop Talking, Start Doing
+description: > # this means to ignore newlines until "Language & timezone"
My personal blog, with some boring research staff and some tricks I was fancy to.
I'll try my best to make this blog fun and useful. Not just a place I complain about
all happens in my Lab.
-baseurl: "" # the subpath of your site, e.g. /blog
-url: "https://codersherlock.github.com/" # the base hostname & protocol for your site
-# twitter_username: haopengzhan
-github_username: codersherlock
-disqus_shortname: codersherlockblog
-permalink: /archivers/:title
-gems:
- - jekyll-paginate
- - jekyll-gist
- - jemoji
- - jekyll-sitemap
-# Build settings
-paginate: 5
-paginate_path: "page:num"
-highlighter: rouge
-markdown: kramdown
+## => Language and Timezone
+##############################
+lang: en
+timezone: America/New_York
-kramdown:
- input: GFM
- syntax_highlighter: rouge
+
+## => Author and Social
+##############################
+author:
+ type : # "person" (default), "organization"
+ name : Pengzhan Hao
+ url :
+ avatar : "/static/avatar.jpg"
+ bio :
+ email : haopengzhan@gmail.com
+ facebook : # "user_name" the last part of your profile url, e.g. https://www.facebook.com/user_name
+ twitter : # "user_name" the last part of your profile url, e.g. https://twitter.com/user_name
+ weibo : # "user_id" the last part of your profile url, e.g. https://www.weibo.com/user_id/profile?...
+ googleplus: # "user_id" the last part of your profile url, e.g. https://plus.google.com/u/0/user_id
+ telegram : # "user_name" the last part of your profile url, e.g. https://t.me/user_name
+ medium : # "user_name" the last part of your profile url, e.g. https://medium.com/user_name
+ zhihu : # "user_name" the last part of your profile url, e.g. https://www.zhihu.com/people/user_name
+ douban : # "user_name" the last part of your profile url, e.g. https://www.douban.com/people/user_name
+ linkedin : # "user_name" the last part of your profile url, e.g. https://www.linkedin.com/in/user_name
+ github : codersherlock
+ npm : # "user_name" the last part of your profile url, e.g. https://www.npmjs.com/~user_name
+
+
+## => GitHub Repository (if the site is hosted by GitHub)
+##############################
+repository: CoderSherlock/CoderSherlock.github.io
+repository_tree: master
+
+
+## => Paths
+##############################
+paths:
+ root : # title link url, "/" (default)
+ home : # home layout url, "/" (default)
+ archive : # "/archive.html" (default)
+ rss : # "/feed.xml" (default)
+
+
+## => Post
+##############################
+## excerpt
+excerpt_separator:
+
+## license
+license: # CC-BY-NC-4.0 # "CC-BY-4.0", "CC-BY-SA-4.0", "CC-BY-NC-4.0", "CC-BY-ND-4.0"
+
+## TOC
+toc:
+ selectors: # "h1,h2,h3" (default)
+
+
+## => Markdown Enhancements
+##############################
+## Mathjax
+mathjax: # false (default), true
+mathjax_autoNumber: # false (default), true
+
+## Mermaid
+mermaid: # false (default), true
+
+## Chart
+chart: # false (default), true
+
+
+## => Paginate
+##############################
+paginate: 8
+paginate_path: /page:num # don't change this unless for special need
+
+
+## => Sources
+##############################
+sources: # bootcdn (default), unpkg
+
+
+## => Sharing
+##############################
+sharing:
+ provider: false # false (default), "addtoany", "addthis", "custom"
+
+ ## AddThis
+ addthis:
+ id: # AddThis pubid, e.g. ra-5xxxxxxxxxxx
+
+
+## => Comments
+##############################
+comments:
+ provider: disqus # false (default), "disqus", "gitalk", "valine", "custom"
+
+ ## Disqus
+ disqus:
+ shortname: codersherlockblog # the Disqus shortname for the site
+
+ ## Gitalk
+ # please refer to https://github.com/gitalk/gitalk for more info.
+ gitalk:
+ clientID : # GitHub Application Client ID
+ clientSecret: # GitHub Application Client Secret
+ repository : # GitHub repo
+ owner : # GitHub repo owner
+ admin: # GitHub repo owner and collaborators, only these guys can initialize GitHub issues, IT IS A LIST.
+ # - your GitHub Id
+
+ ## Valine
+ # please refer to https://valine.js.org/en/ for more info.
+ valine:
+ app_id : # LeanCloud App id
+ app_key : # LeanCloud App key
+ placeholder : # Prompt information
+ visitor : # false (default)
+ meta : # "[nick, mail, link]" (default) nickname, E-mail, Personal-site
+
+
+## => Pageview
+##############################
+pageview:
+ provider: false # false (default), "leancloud", "custom"
+
+ ## Leancloud
+ leancloud:
+ app_id : # LeanCloud App id
+ app_key : # LeanCloud App key
+ app_class : # LeanCloud App class
+
+
+## => Search
+##############################
+search:
+ provider: default # "default" (default), false, "google", "custom"
+
+ ## Google Custom Search Engine
+ google:
+ custom_search_engine_id: # Google Custom Search Engine ID
+
+
+## => Analytics
+##############################
+analytics:
+ provider: google # false (default), "google", "custom"
+
+ ## Google Analytics
+ google:
+ tracking_id : UA-82637164-1 # Google Analytics id for the site
+ anonymize_ip: false # Anonymize IP tracking for Analytics
+
+
+## => Build
+##############################
+markdown : kramdown
+highlighter : rouge
+permalink : /posts/:title
+
+exclude:
+ - CHANGELOG.md
+ - HOW_TO_RELEASE.md
+ - Gemfile
+ - Gemfile.lock
+ - LICENSE
+ - README-*.md
+ - README.md
+ - gulpfile.js
+ - jekyll-text-theme.gemspec
+ - package-lock.json
+ - package.json
+ - /docs
+ - /node_modules
+ - /screenshots
+ - /test
+ - /vendor
+
+defaults:
+ - scope:
+ path: ""
+ type: posts
+ values:
+ layout: article
+ sharing: true
+ license: true
+ aside:
+ toc: true
+ show_edit_on_github: true
+ show_subscribe: true
+ pageview: true
+
+
+## => Plugins
+##############################
+plugins:
+ - jekyll-feed
+ - jekyll-paginate
+ - jekyll-sitemap
+ - jemoji
diff --git a/_config.yml.old b/_config.yml.old
new file mode 100644
index 0000000..74ddd4e
--- /dev/null
+++ b/_config.yml.old
@@ -0,0 +1,38 @@
+# Welcome to Jekyll!
+#
+# This config file is meant for settings that affect your whole blog, values
+# which you are expected to set up once and rarely need to edit after that.
+# For technical reasons, this file is *NOT* reloaded automatically when you use
+# 'jekyll serve'. If you change this file, please restart the server process.
+
+# Site settings
+title: Stop Talking, Start Doing
+author: Pengzhan Hao
+avatar: "/static/avatar.jpg"
+email: haopengzhan@gmail.com
+description: > # this means to ignore newlines until "baseurl:"
+ My personal blog, with some boring research staff and some tricks I was fancy to.
+ I'll try my best to make this blog fun and useful. Not just a place I complain about
+ all happens in my Lab.
+baseurl: "" # the subpath of your site, e.g. /blog
+url: "https://codersherlock.github.com/" # the base hostname & protocol for your site
+github_username: codersherlock
+disqus_shortname: codersherlockblog
+
+permalink: /archivers/:title
+gems:
+ - jekyll-paginate
+ - jekyll-gist
+ - jemoji
+ - jekyll-sitemap
+# Build settings
+paginate: 5
+paginate_path: "page:num"
+
+highlighter: rouge
+markdown: kramdown
+
+kramdown:
+ input: GFM
+ syntax_highlighter: rouge
+
diff --git a/_data/authors.yml b/_data/authors.yml
new file mode 100644
index 0000000..e69de29
diff --git a/_data/licenses.yml b/_data/licenses.yml
new file mode 100644
index 0000000..6729af5
--- /dev/null
+++ b/_data/licenses.yml
@@ -0,0 +1,16 @@
+CC-BY-4.0:
+ name: Attribution 4.0 International
+ url: https://creativecommons.org/licenses/by/4.0/
+ image: https://i.creativecommons.org/l/by/4.0/88x31.png
+CC-BY-SA-4.0:
+ name: Attribution-ShareAlike 4.0 International
+ url: https://creativecommons.org/licenses/by-sa/4.0/
+ image: https://i.creativecommons.org/l/by-sa/4.0/88x31.png
+CC-BY-NC-4.0:
+ name: Attribution-NonCommercial 4.0 International
+ url: https://creativecommons.org/licenses/by-nc/4.0/
+ image: https://i.creativecommons.org/l/by-nc/4.0/88x31.png
+CC-BY-ND-4.0:
+ name: Attribution-NoDerivatives 4.0 International
+ url: https://creativecommons.org/licenses/by-nd/4.0/
+ image: https://i.creativecommons.org/l/by-nd/4.0/88x31.png
diff --git a/_data/locale.yml b/_data/locale.yml
new file mode 100644
index 0000000..558fbfd
--- /dev/null
+++ b/_data/locale.yml
@@ -0,0 +1,147 @@
+# @start locale config
+## => English
+########################
+en: &EN
+ SUBSCRIBE : "Subscribe"
+ READMORE : "Read more"
+ SEARCH : "Search"
+ CANCEL : "Cancel"
+ VIEWS : "views"
+ LAST_UPDATED : "Last updated"
+ PREVIOUS : "PREVIOUS"
+ NEXT : "NEXT"
+ ARTICLE_DATE_FORMAT : "%b %d, %Y"
+ ARTICLE_LIST_DATE_FORMAT: "%b %d"
+ STATISTICS : "[POST_COUNT] post articles, [PAGE_COUNT] pages."
+ LICENSE_ANNOUNCE : "This work is licensed under a [LICENSE] license."
+ POST_ON_GITHUB : "Edit on Github"
+ FOLLOW_ME : "Follow me on [NAME]."
+ FOLLOW_US : "Follow us on [NAME]."
+ EMAIL_ME : "Send me an Email."
+ EMAIL_US : "Send us an Email."
+ COPYRIGHT_DATES : "2021"
+
+en-GB:
+ <<: *EN
+en-US:
+ <<: *EN
+en-CA:
+ <<: *EN
+en-AU:
+ <<: *EN
+
+## => Simplified Chinese
+########################
+zh-Hans: &ZH_HANS
+ SUBSCRIBE : "订阅"
+ READMORE : "阅读更多"
+ SEARCH : "搜索"
+ CANCEL : "取消"
+ VIEWS : "阅读"
+ LAST_UPDATED : "更新于"
+ PREVIOUS : "上篇"
+ NEXT : "下篇"
+ ARTICLE_DATE_FORMAT : "%Y年 %m月%d日"
+ ARTICLE_LIST_DATE_FORMAT: "%m月%d日"
+ STATISTICS : "共计 [POST_COUNT] 篇文章,[PAGE_COUNT] 页。"
+ LICENSE_ANNOUNCE : "本文遵守 [LICENSE] 许可协议。"
+ POST_ON_GITHUB : "在 Github 上修改"
+ FOLLOW_ME : "在 [NAME] 上关注我。"
+ FOLLOW_US : "在 [NAME] 上关注我们。"
+ EMAIL_ME : "给我发邮件。"
+ EMAIL_US : "给我们发邮件。"
+ COPYRIGHT_DATES : "2021"
+
+zh:
+ <<: *ZH_HANS
+zh-CN:
+ <<: *ZH_HANS
+zh-SG:
+ <<: *ZH_HANS
+
+## => Traditional Chinese
+########################
+zh-Hant: &ZH_HANT
+ SUBSCRIBE : "訂閱"
+ READMORE : "閱讀更多"
+ SEARCH : "搜索"
+ CANCEL : "取消"
+ VIEWS : "閱讀"
+ LAST_UPDATED : "更新於"
+ PREVIOUS : "上篇"
+ NEXT : "下篇"
+ ARTICLE_DATE_FORMAT : "%Y年 %m月%d日"
+ ARTICLE_LIST_DATE_FORMAT: "%m月%d日"
+ STATISTICS : "共計 [POST_COUNT] 篇文章,[PAGE_COUNT] 頁。"
+ LICENSE_ANNOUNCE : "本文遵守 [LICENSE] 許可協議。"
+ POST_ON_GITHUB : "在 Github 上修改"
+ FOLLOW_ME : "在 [NAME] 上關注我。"
+ FOLLOW_US : "在 [NAME] 上關注我們。"
+ EMAIL_ME : "給我發郵件。"
+ EMAIL_US : "給我們發郵件。"
+ COPYRIGHT_DATES : "2021"
+
+zh-TW:
+ <<: *ZH_HANT
+zh-HK:
+ <<: *ZH_HANT
+
+## => Korean
+########################
+ko: &KO
+ SUBSCRIBE : "구독하기"
+ READMORE : "더보기"
+ SEARCH : "검색"
+ CANCEL : "취소"
+ VIEWS : "조회"
+ LAST_UPDATED : "마지막 수정"
+ PREVIOUS : "이전"
+ NEXT : "다음"
+ ARTICLE_DATE_FORMAT : "%Y년 %m월 %d일"
+ ARTICLE_LIST_DATE_FORMAT: "%m월 %d일"
+ STATISTICS : "전체 글 [POST_COUNT]개, [PAGE_COUNT] 페이지"
+ LICENSE_ANNOUNCE : "이 글의 저작권은 [LICENSE] 라이센스를 따릅니다."
+ POST_ON_GITHUB : "Github에서 확인하기"
+ FOLLOW_ME : "[NAME]에서 팔로우하기"
+ FOLLOW_US : "[NAME]에서 팔로우하기"
+ EMAIL_ME : "이메일 보내기"
+ EMAIL_US : "이메일 보내기"
+ COPYRIGHT_DATES : "2021"
+
+ko-KR:
+ <<: *KO
+
+## => French
+########################
+fr: &FR
+ SUBSCRIBE : "S'abonner"
+ READMORE : "Plus"
+ SEARCH : "Recherche"
+ CANCEL : "Annuler"
+ VIEWS : "vues"
+ LAST_UPDATED : "Dernière modification"
+ PREVIOUS : "PRÉCÉDENT"
+ NEXT : "SUIVANT"
+ ARTICLE_DATE_FORMAT : "%d %b, %Y"
+ ARTICLE_LIST_DATE_FORMAT: "%d %b"
+ STATISTICS : "[POST_COUNT] articles, [PAGE_COUNT] pages."
+ LICENSE_ANNOUNCE : "Ce travail est sous licence [LICENSE]."
+ POST_ON_GITHUB : "Modifier sur Github"
+ FOLLOW_ME : "Suivez-moi sur [NAME]."
+ FOLLOW_US : "Suivez-nous sur [NAME]."
+ EMAIL_ME : "Envoyez-moi un courriel."
+ EMAIL_US : "Envoyez-nous un courriel"
+ COPYRIGHT_DATES : "2021"
+ DONATE : "Faites un don de [NAME]."
+
+fr-BE:
+ <<: *FR
+fr-CA:
+ <<: *FR
+fr-CH:
+ <<: *FR
+fr-FR:
+ <<: *FR
+fr-LU:
+ <<: *FR
+# @end locale config
diff --git a/_data/navigation.yml b/_data/navigation.yml
new file mode 100644
index 0000000..9a2b8a9
--- /dev/null
+++ b/_data/navigation.yml
@@ -0,0 +1,50 @@
+header:
+ - titles:
+ # @start locale config
+ en : &EN Archive
+ en-GB : *EN
+ en-US : *EN
+ en-CA : *EN
+ en-AU : *EN
+ zh-Hans : &ZH_HANS 归档
+ zh : *ZH_HANS
+ zh-CN : *ZH_HANS
+ zh-SG : *ZH_HANS
+ zh-Hant : &ZH_HANT 歸檔
+ zh-TW : *ZH_HANT
+ zh-HK : *ZH_HANT
+ ko : &KO 아카이브
+ ko-KR : *KO
+ fr : &FR Archives
+ fr-BE : *FR
+ fr-CA : *FR
+ fr-CH : *FR
+ fr-FR : *FR
+ fr-LU : *FR
+ # @end locale config
+ url: /archive.html
+
+ - titles:
+ # @start locale config
+ en : &EN About
+ en-GB : *EN
+ en-US : *EN
+ en-CA : *EN
+ en-AU : *EN
+ zh-Hans : &ZH_HANS 关于
+ zh : *ZH_HANS
+ zh-CN : *ZH_HANS
+ zh-SG : *ZH_HANS
+ zh-Hant : &ZH_HANT 關於
+ zh-TW : *ZH_HANT
+ zh-HK : *ZH_HANT
+ ko : &KO 소개
+ ko-KR : *KO
+ fr : &FR À propos
+ fr-BE : *FR
+ fr-CA : *FR
+ fr-CH : *FR
+ fr-FR : *FR
+ fr-LU : *FR
+ # @end locale config
+ url: /about.html
diff --git a/_data/variables.yml b/_data/variables.yml
new file mode 100644
index 0000000..43aa3aa
--- /dev/null
+++ b/_data/variables.yml
@@ -0,0 +1,64 @@
+default:
+ text_skin: default
+ highlight_theme: default
+ lang: en
+ paths:
+ root: /
+ home: /
+ archive: /archive.html
+ rss: /feed.xml
+ mathjax: false
+ mathjax_autoNumber: false
+ mermaid: false
+ chart: false
+ toc:
+ selectors: 'h1,h2,h3'
+ sources: bootcdn
+
+ page:
+ mode: normal
+ type: webpage
+ article_header:
+ align: left
+ theme: light
+ articles:
+ show_cover: true
+ show_excerpt: false
+ show_readmore: false
+ show_info: false
+ show_title: true
+ show_edit_on_github: false
+ show_date: true
+ show_tags: true
+ show_author_profile: false
+ show_subscribe: false
+ full_width: false
+ sharing: false
+ comment: true
+ license: false
+ pageview: false
+ search: default
+
+sources:
+ bootcdn:
+ font_awesome: 'https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.1/css/all.css'
+ jquery: 'https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js'
+ leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js'
+ chart: 'https://cdn.bootcss.com/Chart.js/2.7.2/Chart.bundle.min.js'
+ gitalk:
+ js: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.js'
+ css: 'https://cdn.bootcss.com/gitalk/1.2.2/gitalk.min.css'
+ valine: 'https://unpkg.com/valine/dist/Valine.min.js' # bootcdn not available
+ mathjax: 'https://cdn.bootcss.com/mathjax/2.7.4/MathJax.js?config=TeX-MML-AM_CHTML'
+ mermaid: 'https://cdn.bootcss.com/mermaid/8.0.0-rc.8/mermaid.min.js'
+ unpkg:
+ font_awesome: 'https://use.fontawesome.com/releases/v5.15.1/css/all.css'
+ jquery: 'https://unpkg.com/jquery@3.3.1/dist/jquery.min.js'
+ leancloud_js_sdk: '//cdn.jsdelivr.net/npm/leancloud-storage@3.13.2/dist/av-min.js'
+ chart: 'https://unpkg.com/chart.js@2.7.2/dist/Chart.min.js'
+ gitalk:
+ js: 'https://unpkg.com/gitalk@1.2.2/dist/gitalk.min.js'
+ css: 'https://unpkg.com/gitalk@1.2.2/dist/gitalk.css'
+ valine: 'https//unpkg.com/valine/dist/Valine.min.js'
+ mathjax: 'https://unpkg.com/mathjax@2.7.4/unpacked/MathJax.js?config=TeX-MML-AM_CHTML'
+ mermaid: 'https://unpkg.com/mermaid@8.0.0-rc.8/dist/mermaid.min.js'
diff --git a/_includes/_site/comment.html b/_includes/_site/comment.html
deleted file mode 100644
index 8536de7..0000000
--- a/_includes/_site/comment.html
+++ /dev/null
@@ -1,36 +0,0 @@
-{% if page.nocomments %}
-{% else %}
-{% if site.disqus_shortname %}
-
-
-
-
-{% endif %}
-{% if site.duoshuo_shortname %}
-
-
-
-
-
-
-
-
-{% endif %}
-{% endif %}
\ No newline at end of file
diff --git a/_includes/_site/footer.html b/_includes/_site/footer.html
deleted file mode 100644
index c400e8f..0000000
--- a/_includes/_site/footer.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/_includes/_site/head.html b/_includes/_site/head.html
deleted file mode 100644
index ca89ea8..0000000
--- a/_includes/_site/head.html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
- {% if page.title %}{{ page.title }} « {{ site.title }}{% else %}{{ site.title }}{% endif %}
-
-
-
-
-
-
-
-
-
diff --git a/_includes/_site/header.html b/_includes/_site/header.html
deleted file mode 100644
index 78de311..0000000
--- a/_includes/_site/header.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
\ No newline at end of file
diff --git a/_includes/sidebar/toc.html b/_includes/sidebar/toc.html
new file mode 100644
index 0000000..4e3469e
--- /dev/null
+++ b/_includes/sidebar/toc.html
@@ -0,0 +1,25 @@
+{%- if page.sidebar.nav -%}
+
+
-
+
diff --git a/_site/LICENSE b/_site/LICENSE
deleted file mode 100644
index bfcc8aa..0000000
--- a/_site/LICENSE
+++ /dev/null
@@ -1,8 +0,0 @@
-The MIT License (MIT)
-Copyright (c) 2016 laobubu
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/_site/README.md b/_site/README.md
deleted file mode 100644
index f9fed30..0000000
--- a/_site/README.md
+++ /dev/null
@@ -1,46 +0,0 @@
-My Personal Blog
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-写点啥呢?感觉自己真是开坑狂魔。
-准备开三个新坑吧,除去现在还在更新的科研进度,接下来我要开两个新坑介绍自己的两个项目,以及一个摄影的图坑。
diff --git a/_site/about.html b/_site/about.html
new file mode 100644
index 0000000..b05ee7c
--- /dev/null
+++ b/_site/about.html
@@ -0,0 +1,990 @@
+
+
+
+About - Stop Talking, Start Doing
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Position: Research Assistant in MOSLab
+Education: Doctoral Student of SUNY at Binghamton
+Email: phao3 at binghamton dot edu
+Address:
+ MOSLab, H-6 Engineering Building
+ Binghamton University
+ 4400 Vestal Parkway East
+ Binghamton, NY 13902
+
+
Education
+
+
+
2017.08 - Ph.D. in Computer Science, Binghamton University, NY, USA
+
2015.08 - 2017.05 M.E in Computer Science, Binghamton University, NY, USA
+
2011.08 - 2015.06 B.E in Software Engineering, Beihang University, Beijing, China
+
+
+
Experience
+
+
+
2016.10 - Research Assistant @ Mobile and Operating System Lab, Binghamton University
+
EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.
+Pengzhan Hao, and Yifan Zhang
+The Sixth ACM/IEEE Symposium on Edge Computing (ACM/IEEE SEC)
+San Jose, CA, USA, 2021.
Position: Research Assistant in MOSLab
-Education: Doctoral Student of SUNY at Binghamton
-Email: phao3 at binghamton dot edu
-Address:
- MOSLab, H-6 Engineering Building
- Binghamton University
- 4400 Vestal Parkway East
- Binghamton, NY 13902
-
-
Education
-
-
-
2017.08 - Ph.D. in Computer Science, Binghamton University, NY, USA
-
2015.08 - 2017.05 M.E in Computer Science, Binghamton University, NY, USA
-
2011.08 - 2015.06 B.E in Software Engineering, Beihang University, Beijing, China
-
-
-
Experience
-
-
-
2016.10 - Research Assistant @ Mobile and Operating System Lab, Binghamton University
-
EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.
-Pengzhan Hao, and Yifan Zhang
-The Sixth ACM/IEEE Symposium on Edge Computing (ACM/IEEE SEC)
-San Jose, CA, USA, 2021.
Using charles proxy to monitor mobile SSL traffics
-
Oct 27, 2016
-
-
-
-
In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.
-My current solution is using AP to forward all SSL traffic to a proxy, charles proxy is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.
-
-
Preparations
-
-
Monitor device situation: Linux Machine with wireless adapter
-
Download the newest version(4.0.1) of charles
-
Target android devices with root privilege
-
-
-
Install Charles and Configuration
-
-
-
You have to install charles first. After downloading the charles proxy, you have to unzip it and configure some basic settings.
-
-
-
# open charles first
-./bin/charles
-
-
-
Save charles’ private key and public key
-
-
-
In Help -> SSL Proxying -> Export Charles Root Certificate and Private Key, enter a password and save the public and private key in *.p12 format.
-You also need to save charles Root Certificate, it also contains in the same menu. For convience, save it as *.pem format.
EDDL: How do we train neural networks on limited edge devices - PART 1
-
Oct 13, 2021
-
-
-
-
This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
-As the first part of the introductions, I focus only on the motivation and summary of our works.
-More details in design and implementation can be found in late posts.
-
-
-
-
Why do we need training on edge?
-
-
Cloud is not trustworthy anymore. More and more facts supports that breach on cloud happens frequently than before.
-Nowadays, with more generated personal sensitive data has been uploaded to the cloud center, tech company know better to someones than user themselves.
-
-
Researchers, no matter in industry on academia, are working in a way that still learning from users’ data but also keeping raw sensitive data under users’ control.
-Many publications already showed feasibility of only sharing after-trained model instead of raw data.
-One recent popular study on this is google’s federated learning.
-
-
During investigated this problem, we found that let end user train their own data is safe, but sacrifice efficiency.
-Since one end device has limited resources, training time and power consumption can be disappointing.
-We believe there must have a leverage between privacy and efficiency in some target scenarios.
-
-
Fortunately, we observed that users who belongs to the same campus, plant, firm and community always share similar interests.
-Therefore, these co-located users have similar demands in using AI-involved routines.
-Also, co-located users are easily targeted by same type of threats, such as ransomware to financial practitioners.
-
-
Think about this, sending features of a new malware app to cloud services in order to train a neural networks used by antivirus program.
-This process may takes long time and small amount of samples may not be recognized by the global neural networks model.
-With a customized local model trained and deployed on the edge can successfully counter the problem.
-With edge training as a supplement of cloud training can achieve better response time and let the whole system more flexible.
-
-
Why training on edge is hard?
-
-
Since all co-located users’ device can be used for an edge training, issues and challenges occur as deploying this distributed system.
-
-
The first challenge is struggling workers.
-Training devices are heterogeneity, from limited IoT camera to high-end media center with powerful GPU.
-They are not designed to do machine learnings.
-So, a good edge-based distributed learning framework must can handle variety speeds in training tasks.
-
-
The second challenge is how to scale up clusters.
-In a campus, thousands and more devices may contribute computing resources to the same training tasks.
-However, these devices may located in far not matter in physical or in network topology.
-How can we well use them well, without struggled with endless transmission time remains a challenge.
-
-
The third issue is frequently joining and exiting of devices.
-We can’t rely on each devices to faithfully working on training tasks rather than their original workload.
-Smartly schedule work balance and handle join/exit issues also need under consideration.
-
-
Our proposal
-
-
-
-
Dynamic training data distribution and runtime profiler
-
-
We design a dynamic training data distribution mechanism that helps to both the first and the third challenges.
- Preprocessing data can be transmitted without leakage of raw sensitive information.
- This can helps with struggling workers who can train small batches in order to upload parameters with a similar training time.
- Also, for extremely slow devices, join and exit of devices cases, dynamic data distribution and profiler can helps with keep global training parameters from polluted and staleness.
-
-
To counter heterogeneity’s, more approaches were applied in our later research.
- More details were introduced to runtime profiler in the later works.
-
-
-
Asynchronous and synchronous aggregation enabled
-
-
In our findings, asynchronous and synchronous parameter update have their pros and cons.
- Keeping sync all the time leads struggling worker issue unsolvable.
- However, async’s harm to accuracy and convergence time also need attentions.
- To carefully chose between these two update policies at the runtime is what we proposed to make use of their own advantages.
-
-
-
Leader role splitting
-
-
The idea is to let worker devices with higher bandwidth taking leader role during training.
- Parameter updating does not require much computation but only need bandwidth.
- Devices with sufficient bandwidth can also work as virtual leader devices.
- This approach helps with minimize physical devices we used and more leaders can further scale up workers limits.
Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries
-
Sep 15, 2020
-
-
-
-
Let’s generate a word cloud like this.
-Don’t understand the language is not a big deal.
-If your written language is based on latin alphabet(or other language has space between words), skip tokenization.
-
-
-
-
Background
-
-
Recently, I set up a web-based RSS client for retrieving and organizing everyday news. I used TinyTinyRSS, or as ttrss, a popular RSS client which friendly to docker. Thanks to developer HenryQW, a well-written Nginx-based docker configuration is already available in docker hub. With more feeds were added, I found some feeds does not need to be checked everyday. Thus I was thinking to create a script to automatically list all keywords appears in a last period and generate a heat map kind figure of it.
-
-
Before you go further, I’ll tell you all my settings to give readers a general overview.
-
-
My first step is to read all text-based information from TTRSS’s PostgreSQL database. With information, I used a Chinese-NLP library, jieba, to extract all keyword with their occurrences frequency. By using WordCloud, a python library, word cloud figure is generated and present. More details will be discussed in later sections.
-
-
Get RSS feeds’ text
-
-
My first thought is generating a keyword heat map for economy news of a last week. Since this blog post are more skewed to Chinese tokenization and draw the word cloud figure. I’ll leave my code here just in case. The SQL connector I used is psycopg2, an easy-use PostgreSQL library.
-
-
def__init__(self):
- self.dbe=psycopg2.connect(
- host=DB_HOST,port=DB_PORT,database=DB_NAME,user=DB_USER,password=DB_PASS)
-
-defget_1w_of_feed_byid(self,id=1)->list:
- cur=self.dbe.cursor()
- cur.execute('SELECT content FROM public.ttrss_entries \
- where date_updated > now() - interval \'1 week\' AND id in ( \
- select int_id from DB_TABLE_NAME \
- where feed_id='+str(id)+' \
- ) \
- ORDER BY id ASC '
- )
- rows=cur.fetchall()
- returnrows
-
-
-
Most arguments are intuitive and easy to understand. The only exception is argument of function get_1w_of_feed_byid. This id is the feed index of my subscriptions.
-
-
Tokenize with frequency
-
-
Two popular tokenization library were used, and I chose jieba after a few comparison. Before cutting the sentence, we first need to remove all punctuation marks.
After we have an all characters string, we can call jieba. By using the function jieba.posseg.cut with or without paddle, we can have a word list and their “part of speech”. As you can see in the following code, I also did two more works.
-
-
First, in the if statement, I only kept all nouns with some categories. Category abbreviation such as “nr” and “ns” represent different “part of speech”, I attached with categories I used in the following table. For more details you can find in this link.
-
-
The second work is only keeping words with length longer than 2 characters. In Chinese, there’s no space between words such as Latin writing systems. Since then, some single-character-words such as conjunction words are easy to be misrecognized as specialty-noun. And this misrecognition will cause more single-character being regarded as specialty-noun. I am not able to improve NLP method, so I used a easy way to fix this by removing any words less than 2 characters.
With all words extracted, we can easily calculate their frequencies. After this, we can using the following line of code to print a sorted result to verify correctness.
-
-
noun=seg.get_noun_jieba(test_content)
-# ... Calculate frequency of above word list ...
-print(sorted(a_dict.items(),key=lambdax:x[1]))
-
-
-
Draw word cloud
-
-
With a keyword and frequency dictionary(data structure), we can just call built-in functions from wordcloud library to generate the figure.
-
-
First we need to initialize an instance of wordcloud class. As you can see in my code, I set it with 6 parameters. Width and Height of the canvas, maximum amount of words used to generate the figure, the font of words, background color and margin between any two words.
-
-
After having the instance, we call function generate_from_frequencies and pass keyword dictionary to it. The return value of this function is an bitmap image, which we can use matplotlib to plot it to your screen.
-
-
I tested my plot on ubuntu-subsystem on Windows 10, unfortunately matplotlib under subsystem depends on x11 window manager and its not default available on windows. We need to install an x11 manager to support. Xming is the one I used.
If everything work fine, a word cloud figure will show up in a new window. My version looks like this.
-
-
-
-
This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.
In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
-Understand system call and know how to implement a simple one will be coved as the first half.
-In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb.
-
-
Xv6 Systemcall
-
-
To invoke a system call, we have to first define a user mode function to be the interface of the kernel instruction in file user.h.
-
-
voidfunction(void);
-
-
-
This interface-like function will then pass the function name, in this case function, to usys.S. When using user mode function in programs, usys.S will generate a reference to SYS_function and push system call number of this function into %eax. After that, system can know from syscall.c and determining whether this system call is available. We must define same name system function and add it into syscall.h and syscall.c.
-
-
#define SYS_function ## // ## is the system call number
-[SYS_function]sys_function// real system function name
-externintsys_function(void);// real system function declaration
-
-
-
After adding these sentences to syscall files, we can implement real function in specific place where you want to make the function works well.
-
-
Sometimes, we need to pass variables among system calls. In this case, variables’ values are not necessary and even can’t be pass directly into system_function. When invoke a system call function, all variables of this system call will be pushed into current process’ stack. In file syscall.c, multiple functions are provided to get these variables from the process. I won’t waste time on explaining how to use these functions especially when elegant and detailed comments were written in source codes. However, I will explain concepts and how process organized and works in xv6 in future articles.
-
-
Debug xv6 with gdb
-
-
Please make sure that you have used gdb before.
-If you never used gdb, you may write a simple 50-100 lines c code and practice how to use gdb first.
To make sure xv6 gdb enabled, please check if .gdbinit.tmpl file exist.
-This file is used for generate .gdbinit file which you can late consider it as a configuration for gdb.
-
-
Before running the xv6 instance in QEMU, one more thing you need to know is that using gdb to debug xv6 must be attached remotely.
-This is because xv6 was running within QEMU, and emulator is virtually gapped from the host device.
-Later when you start debugging, QEMU will open a gdb server to let gdb client connect to.
-
-
Once you want to start, using following command to compile and run xv6
-
-
$ make qemu-nox-gdb
-*** Now run 'gdb'.
-qemu-system-i386 -nographic-drivefile=fs.img,index=1,media=disk,format=raw -drivefile=xv6.img,index=0,media=disk,format=raw -smp 2 7
-
-
-
At this moment, it feels xv6 was stuck, this is because QEMU is ready to be connected by the gdb client.
-You may use the .gdbinit to automatically finish this remote connection by simple typein following command in another terminal.
-
-
$ gdb -x .gdbinit
-GNU gdb (Debian 8.2.1-2+b3) 8.2.1
-
-...
-
-The target architecture is assumed to be i8086
-[f000:fff0] 0xffff0: ljmp $0x3630,$0xf000e05b
-0x0000fff0 in ?? ()
-+ symbol-file kernel
-warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
-of GDB. Attempting to continue with the default i8086 settings.
-
-(gdb)
-
-
-
Now within this gdb client shell, type ‘c’ to continue the xv6, and you will see xv6 start execution in the first terminal.
-
-
At this moment, you may add breakpoints to your code to see if your code is correctly implemented or not.
-
-
One more thing, if you open .gdbinit file, you’ll find that it by default connect to a localhost target.
-If you are working on some other environment that target and client were not placed in the same device, change the localhost to ip address correspondingly.
-Using ssh may connect to different physical devices under same domain name, this is because load balancer were used. To check ip address, search command ip.
This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.
-
-
2016-10
-
-
Time Experiment of rsync
-
-
Patch is based on rsync with version 3.1.2. [Rsync|Patch]
-
-
How to collect data
-
-
Basically, everything of transmission time and computation time will be output with overall time will be printed on the console.
-But we also need some bash script to collect data through different size of random size and with different modification through them.
-
-
-
Start from 8K to 64M, modify at beginning, [Bash script]
-
Start from 8K to 64M, modify at last, [Bash script]
-
Start from 8K to 64M, modify at random place with a (slow) python script, [Bash script|Python program]
We also need everything be done using scripting. But this time I only design added some distance between two increasing files’ sizes.
-
-
-
Start from 8K to 16M, 4 times increasing, modify at beginning/ at 1024 different places with python script. [Bash Script|Python program]
-
After using this auto testing script, everything of output will be marked in log files of seafile, which located in ~/.ccnet/log/seafile.log
-
We need to use this simple awk code and vim operation to extract data.
-
-
-
# CDC: content defined chucks
-# HUT: Http upload traffic
-# ALL: overall time of one commit & upload
-awk'/CDC|HUT|ALL/ {print $4,$5}' ~/.ccnet/log/seafile.log > results.stat
-
-
-
Install Seafile on odroid xu
-
-
Due to failure of my cross-compile to seafile on android. I used develop board as a replacement experiment platform for ARM-seafile testing. I used a odroid xu as hardware standard. Because all I need is an ARM platform, only an ARM-Ubuntu is enough for me. But develop prototype on a board is much fun than coding, I won’t address much this time. But I’ll start a blog telling some really cool stuff I made for a strange aim.
-
-
To install a ubuntu with GUI is my all preparation work. I found to way to do this.
-
-
-
-
armhf is a website for arm-based ubuntu. It has a detailed instruction to follow at here. They also provide ubuntu 12.04/ 14.04 and debian 7.5 to choose. But unfortunately odroid xu’s hdmi output doesn’t supported by ubuntu native firmware. So install ubuntu-desktop might can’t be boot up for video output.
-
-
-
Burn images is much easy to install a pre-complied ubuntu system. I found this on odroid xu’s forum, which contains xubuntu image [download] for odroid xu. With this image, you just need to use dd command to write whole system mirror into sdcard.
-
-
-
-
# If .img end with xz, use this command to uncompress first
-unxz ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz
-# Burn image into SD-card
-sudo dd if=ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img of=/dev/sdb bs=1M conv=fsync
-sync
-
-
-
2016-11
-
-
Android Kernel
-
-
How to build an Android Kernel?
-
-
Generally, I won’t tell anything in this parts, just mark some related links, and point out some mistakes or error solutions.
-
-
-
-
Google Official Guide
-– If you don’t have AOSP sources, you have to download prebuilt toolchains which recommended in this guide might not be correct. Use following links to choose your fitting tools.
-— ASOP git root, under sub class “/platform/prebuilts/gcc”
If we want to debug under android, ftrace is a great tool for working. But, ftrace is not available in android if we used default configure file. Android kernel configuration is in arch/arm64/kernel/configs. We need to add few lines under that.
If we want to hold a rooted status after flashing boot, we need to extract an image from android devices. We can first use following command to find which blocks belongs to. According to some references, this article provide three ways to dump an image, I picked one for easy using.
-
-
-
-
-
-
-
-
diff --git a/_site/css/main.css b/_site/css/main.css
deleted file mode 100644
index 8b0f977..0000000
--- a/_site/css/main.css
+++ /dev/null
@@ -1,296 +0,0 @@
-body { margin: 0; font-family: "Arial"; font-size: 15px; line-height: 1.35; }
-
-a { text-decoration: none; color: #036; }
-
-a:hover, a:focus { text-decoration: underline; color: #069; }
-
-blockquote { background: #FFF; margin: 0; padding: 5px 20px; border-left: 10px solid #CCC; }
-
-code, pre { font-family: "Courier New"; font-size: 12px; }
-
-code { color: #900; background-color: #fff; padding: 2px 5px; border-radius: 5px; }
-
-pre { overflow-x: auto; padding: 20px 50px; }
-
-pre, pre code { color: #fafafa; background-color: #223; }
-
-pre code { padding: 0; }
-
-.hide { display: none; }
-
-.center { text-align: center; }
-
-table { border-collapse: collapse; border-spacing: 0; margin: 10pt auto; background: #FFF; }
-
-table td, table th { border: 1px solid #CCC; padding: 5px 15px; margin: 0; }
-
-table th { border-color: #555; background: #555; color: #eee; font-weight: normal; }
-
-table tr:hover { background: rgba(255, 255, 0, 0.2); }
-
-h1, h2, h3, h4, h5, h6 { font-weight: normal; }
-
-.wrapper { margin: 0 auto; max-width: 1100px; }
-
-@media (max-width: 1120px) { .wrapper { max-width: 800px; } }
-
-.header { line-height: 30px; background-color: black; padding: 10px; margin: 0; }
-
-.header:after { clear: both; content: ' '; display: block; }
-
-.header .site-title { float: left; color: white; text-decoration: none; font-size: 15px; line-height: 30px; }
-
-.header .site-nav { text-align: right; }
-
-.header .site-nav a { text-decoration: none; color: white; padding: 10px 20px; white-space: nowrap; }
-
-.header .site-nav a:hover, .header .site-nav a:focus { background: black; }
-
-.page-content { background: #e0e0e3; padding: 30px 0; }
-
-.page-content .wrapper { position: relative; background: #FAFAFA; box-shadow: 0 1px 4px #999; outline: 1px solid #CCC; }
-
-.page-content .wrapper:after { clear: both; content: ''; display: block; }
-
-.page-content .wrapper:before { content: ''; display: block; position: absolute; width: 300px; height: 100%; left: 800px; top: 0; background: #EEE; }
-
-.page-content img { max-width: 100%; }
-
-.col-main { position: relative; box-sizing: border-box; padding: 30px; width: 800px; float: left; }
-
-.col-second { position: relative; box-sizing: border-box; float: left; width: 300px; padding: 20px; background: #EEE; z-index: 10; }
-
-.col-box { color: #666; font-size: 15px; padding-bottom: 20px; }
-
-.col-box p { margin: 0; }
-
-.col-box ul { padding-left: 20px; margin: 0; }
-
-.col-box:not(:first-child) { border-top: 1px solid #ccc; padding-top: 20px; }
-
-.col-box .col-box-title { color: #333; margin-bottom: 10px; font-size: 16.5px; }
-
-@media (max-width: 1120px) { .page-content .wrapper:before { display: none; } .col-main, .col-second { width: auto; float: none; } .col-box { width: 50%; float: left; margin-bottom: 10px; } .col-box:not(:first-child) { border-top: none; padding-top: 0; } .col-second:after { clear: both; display: block; content: ' '; } }
-
-.col-box-author { text-align: center; }
-
-.col-box-author .avatar { width: 135px; height: 135px; border-radius: 100%; margin: 20px auto; display: block; }
-
-.col-box-author .name { font-size: 15px; }
-
-.col-box-author .contact { margin-top: 10px; }
-
-.col-box-author .contact a { background: #999; color: #eee; padding: 5px 10px; text-decoration: none; border-radius: 5px; white-space: nowrap; }
-
-.col-box-author .contact a:hover { transition: background 0.3s ease; background: #666; }
-
-.footer { padding: 60px 0; background-color: #e0e0e3; text-align: center; color: #666; font-size: 15px; }
-
-.post .post-header { margin: 0 100px; margin-bottom: 40px; padding: 0px; }
-
-.post .post-header .post-title { font-size: 40px; font-weight: normal; margin: 0 -100px; }
-
-@media screen and (max-width: 600px) { .post .post-header .post-title { font-size: 34px; } }
-
-.post .post-header .post-meta { color: #999; font-size: 15px; margin: 0 -100px; }
-
-@media screen and (max-width: 600px) { .post .post-header { text-align: center; margin-bottom: 10px; padding: 10px; } }
-
-.post .post-content { color: #333; }
-
-.post .post-content h1, .post .post-content h2, .post .post-content h3, .post .post-content h4, .post .post-content h5, .post .post-content h6 { color: #000; }
-
-.post .post-content h1 { font-size: xx-large; }
-
-.post .post-content h1, .post .post-content h2 { margin-bottom: 10px; margin-top: 30px; }
-
-.post .post-content h1, .post .post-content h2, .post .post-content h3 { border-bottom: 1px dotted #3f3f3f; }
-
-.post .post-content pre { margin: 0 -30px; }
-
-@media screen and (max-width: 600px) { .post .post-content pre { margin: 0 -10px; } }
-
-.post .post-content .middle-image { display: block; margin-left: auto; margin-right: auto; }
-
-.post .post-comments { padding-top: 30px; }
-
-.home .page-heading { font-size: 40px; font-weight: normal; margin: 0px; }
-
-@media screen and (max-width: 600px) { .home .page-heading { margin: 10px; font-size: 34px; } }
-
-.home .rss-link { float: right; text-decoration: none; border: 1px solid; color: #999; background: #fff; font-size: 10.5px; padding: 1px 8px; }
-
-.home .rss-link:hover, .home .rss-link:focus { color: #666; }
-
-.home .post-list { margin: 0; padding: 10px 0px; list-style: none; }
-
-.home .post-list > li { padding-bottom: 5px; border-bottom: 2px dotted #3f3f3f; margin-bottom: 5px; }
-
-.home .post-list .post-title { font-size: 28px; font-weight: bold; margin: 0; }
-
-.home .post-list .post-meta { font-size: 15px; color: #aaaaaa; margin: 0 0px; margin-bottom: .5em; }
-
-.home .post-list .post-excerpt { margin: 0 0px; }
-
-.home .post-list .post-excerpt, .home .post-list .post-excerpt * { font-size: 15px; line-height: 16.5px; padding-top: 0; padding-bottom: 0; color: #333; }
-
-.home .post-list .post-excerpt code, .home .post-list .post-excerpt pre, .home .post-list .post-excerpt pre * { color: #666; background-color: #eee; }
-
-.home .post-list .post-excerpt th { border-color: #ccc; background-color: #ccc; }
-
-.home .post-list .post-excerpt a { color: #002335; }
-
-.home .post-list .post-excerpt img { display: block; margin: 1em auto; max-height: 16em; opacity: .7; transition: opacity .3s; }
-
-.home .post-list .post-excerpt img:hover { opacity: 1; }
-
-@media screen and (max-width: 600px) { .home .post-list { padding: 10px; } }
-
-.home .pagination { text-align: center; text-decoration: none; color: #666; margin: 30px 0; }
-
-.home .pagination .page_number { margin: 0 30px; }
-
-.home .pagination .previous, .home .pagination .next { padding: 10px 20px; white-space: nowrap; }
-
-.home .pagination a.previous, .home .pagination a.next { color: #333; border-radius: 20px; border: 1px solid #CCC; }
-
-.home .pagination a.previous:hover, .home .pagination a.next:hover { background: #fefefe; color: #000; text-decoration: none; }
-
-@media screen and (max-width: 800px) { .page-content { padding: 0; } .footer { padding: 15px 0; } }
-
-@media screen and (max-width: 600px) { .header, .header .site-nav { text-align: center; } .header .site-title { float: none; } .col-main { padding: 10px; } .col-box { width: 100%; float: none; margin-bottom: 20px; } pre { padding: 10px; } }
-
-/* Monokai Theme from https://github.com/richleland/pygments-css/blob/master/monokai.css */
-.highlight { /* Comment */ /* Error */ /* Keyword */ /* Literal */ /* Name */ /* Operator */ /* Punctuation */ /* Comment.Multiline */ /* Comment.Preproc */ /* Comment.Single */ /* Comment.Special */ /* Generic.Emph */ /* Generic.Strong */ /* Keyword.Constant */ /* Keyword.Declaration */ /* Keyword.Namespace */ /* Keyword.Pseudo */ /* Keyword.Reserved */ /* Keyword.Type */ /* Literal.Date */ /* Literal.Number */ /* Literal.String */ /* Name.Attribute */ /* Name.Builtin */ /* Name.Class */ /* Name.Constant */ /* Name.Decorator */ /* Name.Entity */ /* Name.Exception */ /* Name.Function */ /* Name.Label */ /* Name.Namespace */ /* Name.Other */ /* Name.Property */ /* Name.Tag */ /* Name.Variable */ /* Operator.Word */ /* Text.Whitespace */ /* Literal.Number.Float */ /* Literal.Number.Hex */ /* Literal.Number.Integer */ /* Literal.Number.Oct */ /* Literal.String.Backtick */ /* Literal.String.Char */ /* Literal.String.Doc */ /* Literal.String.Double */ /* Literal.String.Escape */ /* Literal.String.Heredoc */ /* Literal.String.Interpol */ /* Literal.String.Other */ /* Literal.String.Regex */ /* Literal.String.Single */ /* Literal.String.Symbol */ /* Name.Builtin.Pseudo */ /* Name.Variable.Class */ /* Name.Variable.Global */ /* Name.Variable.Instance */ /* Literal.Number.Integer.Long */ /* Generic Heading & Diff Header */ /* Generic.Subheading & Diff Unified/Comment? */ /* Generic.Deleted & Diff Deleted */ /* Generic.Inserted & Diff Inserted */ }
-
-.highlight .hll { background-color: #49483e; }
-
-.highlight .c { color: #75715e; }
-
-.highlight .err { color: #960050; background-color: #1e0010; }
-
-.highlight .k { color: #66d9ef; }
-
-.highlight .l { color: #ae81ff; }
-
-.highlight .n { color: #f8f8f2; }
-
-.highlight .o { color: #f92672; }
-
-.highlight .p { color: #f8f8f2; }
-
-.highlight .cm { color: #75715e; }
-
-.highlight .cp { color: #75715e; }
-
-.highlight .c1 { color: #75715e; }
-
-.highlight .cs { color: #75715e; }
-
-.highlight .ge { font-style: italic; }
-
-.highlight .gs { font-weight: bold; }
-
-.highlight .kc { color: #66d9ef; }
-
-.highlight .kd { color: #66d9ef; }
-
-.highlight .kn { color: #f92672; }
-
-.highlight .kp { color: #66d9ef; }
-
-.highlight .kr { color: #66d9ef; }
-
-.highlight .kt { color: #66d9ef; }
-
-.highlight .ld { color: #e6db74; }
-
-.highlight .m { color: #ae81ff; }
-
-.highlight .s { color: #e6db74; }
-
-.highlight .na { color: #a6e22e; }
-
-.highlight .nb { color: #f8f8f2; }
-
-.highlight .nc { color: #a6e22e; }
-
-.highlight .no { color: #66d9ef; }
-
-.highlight .nd { color: #a6e22e; }
-
-.highlight .ni { color: #f8f8f2; }
-
-.highlight .ne { color: #a6e22e; }
-
-.highlight .nf { color: #a6e22e; }
-
-.highlight .nl { color: #f8f8f2; }
-
-.highlight .nn { color: #f8f8f2; }
-
-.highlight .nx { color: #a6e22e; }
-
-.highlight .py { color: #f8f8f2; }
-
-.highlight .nt { color: #f92672; }
-
-.highlight .nv { color: #f8f8f2; }
-
-.highlight .ow { color: #f92672; }
-
-.highlight .w { color: #f8f8f2; }
-
-.highlight .mf { color: #ae81ff; }
-
-.highlight .mh { color: #ae81ff; }
-
-.highlight .mi { color: #ae81ff; }
-
-.highlight .mo { color: #ae81ff; }
-
-.highlight .sb { color: #e6db74; }
-
-.highlight .sc { color: #e6db74; }
-
-.highlight .sd { color: #e6db74; }
-
-.highlight .s2 { color: #e6db74; }
-
-.highlight .se { color: #ae81ff; }
-
-.highlight .sh { color: #e6db74; }
-
-.highlight .si { color: #e6db74; }
-
-.highlight .sx { color: #e6db74; }
-
-.highlight .sr { color: #e6db74; }
-
-.highlight .s1 { color: #e6db74; }
-
-.highlight .ss { color: #e6db74; }
-
-.highlight .bp { color: #f8f8f2; }
-
-.highlight .vc { color: #f8f8f2; }
-
-.highlight .vg { color: #f8f8f2; }
-
-.highlight .vi { color: #f8f8f2; }
-
-.highlight .il { color: #ae81ff; }
-
-.highlight .gu { color: #75715e; }
-
-.highlight .gd { color: #f92672; }
-
-.highlight .gi { color: #a6e22e; }
-
-.page-content .wrapper .post-toc > ul { overflow: auto; }
-
-.util-notify1 { position: absolute; z-index: 100; background: rgba(0, 0, 0, 0.7); color: #FFF; padding: 5px 10px; font-size: 14px; pointer-events: none; opacity: 1; transition: .2s ease; }
-
-.util-notify1.hidden { opacity: 0; display: none; }
-
-/*# sourceMappingURL=main.css.map */
\ No newline at end of file
diff --git a/_site/css/main.css.map b/_site/css/main.css.map
deleted file mode 100644
index ef53b3e..0000000
--- a/_site/css/main.css.map
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "version": 3,
- "file": "main.css",
- "sources": [
- "main.scss",
- "_sass/_base.scss",
- "_sass/_layout.scss",
- "_sass/_post.scss",
- "_sass/_home.scss",
- "_sass/_syntax-highlighting.scss",
- "_sass/_easybook.scss"
- ],
- "sourcesContent": [
- "@charset \"utf-8\";\n\n$base-font-family: \"Arial\";// \"Times New Roman\", \"DejaVu Sans Mono\", \"PingFang SC\", \"DejaVu Sans\", \"Open Sans\", \"Helvetica Neue\", Arial, \"Noto Sans CJK SC\", \"Hiragino Sans GB\", \"微软雅黑\", Helvetica, sans-serif;\n$base-font-size: 15px;\n$small-font-size: $base-font-size;\n$base-line-height: 1.35;\n\n$code-font-family: \"Courier New\"; //Menlo, Monaco, Consolas, \"DejaVu Sans Mono\", \"Liberation Mono\", \"文泉驿等宽微米黑\", \"Courier New\", Courier, SimSun, monospace;\n$code-font-size: 12px;\n\n// Width of the content area\n$content-width: 800px;\n\n$on-palm: 600px;\n$on-laptop: 800px;\n\n$color-link: rgb(0, 0, 0);\n$color-link-hover: rgb(0, 35, 53);\n\n$header-bg: rgba(0, 0, 0, 1);\n$header-bg-hover: rgb(0, 0, 0);\n$header-link: rgb(255, 255, 255);\n$header-fg: rgb(255, 255, 255);\n\n@mixin media-query($device) {\n @media screen and (max-width: $device) {\n @content;\n }\n}\n\n\n\n// Import partials from `sass_dir` (defaults to `_sass`)\n@import\n \"base\",\n \"layout\",\n \"syntax-highlighting\",\n \"easybook\"\n;\n",
- "body {\n\tmargin: 0;\n\tfont-family: $base-font-family;\n\tfont-size: $base-font-size;\n\tline-height: $base-line-height;\n}\na {\n\ttext-decoration: none;\n\tcolor: #036;\n}\na:hover, a:focus {\n\ttext-decoration:underline;\n\tcolor: #069;\n}\nblockquote {\n\tbackground: #FFF;\n\tmargin:0;\n\tpadding: 5px 20px;\n\tborder-left: 10px solid #CCC;\n}\ncode,pre {\n\tfont-family: $code-font-family;\n\tfont-size: $code-font-size;\n}\ncode {\n\tcolor: #900;\n\tbackground-color: #fff;\n\tpadding: 2px 5px;\n\tborder-radius: 5px;\n}\npre {\n\toverflow-x: auto;\n\tpadding: 20px 50px;\n}\npre, pre code {\n\tcolor: #fafafa;\n\tbackground-color: #223;\n}\npre code {\n\tpadding: 0;\t\n}\n.hide {\n display: none;\n}\n.center {\n\ttext-align: center;\n}\ntable {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n margin: 10pt auto;\n\tbackground: #FFF;\n\n\ttd, th {\n\t\tborder: 1px solid #CCC;\n\t\tpadding: 5px 15px;\n\t\tmargin: 0;\n\t}\n\t\n\tth {\n\t\tborder-color: #555;\n\t\tbackground: #555;\n\t\tcolor: #eee;\n\t\tfont-weight:normal;\n\t}\n\t\n\ttr:hover {\n\t\tbackground: rgba(255,255,0,0.2);\n\t}\n}\n\nh1,h2,h3,h4,h5,h6{\n\tfont-weight: normal;\n}",
- ".wrapper {\n\tmargin: 0 auto;\n\tmax-width: 1100px;\n}\n@media (max-width: 1120px) {\n\t.wrapper {\n\t\tmax-width: 800px;\n\t}\n}\n\n.header {\n\tline-height: $base-font-size * 2;\n\tbackground-color: $header-bg;\n\tpadding: 10px;\n\tmargin: 0;\n\t\n\t&:after {\n\t\tclear: both;\n\t\tcontent: ' ';\n\t\tdisplay: block;\n\t}\n\t\n\t.site-title {\n\t\tfloat: left;\n\t\tcolor: $header-fg;\n\t\ttext-decoration: none;\n\t\tfont-size: $base-font-size;\n\t\tline-height: $base-font-size * 2;\n\t}\n\t.site-nav {\n\t\ttext-align:right;\n\t\t\n\t\ta {\n\t\t\ttext-decoration: none;\n\t\t\tcolor: $header-link;\n\t\t\tpadding: 10px 20px;\n\t\t\twhite-space: nowrap;\n\t\t\n\t\t\t&:hover, &:focus {\n\t\t\t\tbackground: $header-bg-hover;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.page-content {\n\tbackground:#e0e0e3;\n\tpadding: 30px 0;\n\n\t.wrapper {\n\t\tposition: relative;\n\t\tbackground: #FAFAFA;\n\t\tbox-shadow: 0 1px 4px #999;\n\t\toutline: 1px solid #CCC;\n\t\t&:after {\n\t\t\tclear:both;\n\t\t\tcontent: '';\n\t\t\tdisplay:block;\n\t\t}\n\t\t&:before {\n\t\t\tcontent: '';\n\t\t\tdisplay:block;\n\t\t\tposition: absolute;\n\t\t\twidth: 300px;\n\t\t\theight: 100%;\n\t\t\tleft: 800px;\n\t\t\ttop: 0;\n\t\t\tbackground: #EEE;\n\t\t}\n\t}\n\t\n\timg {\n\t\tmax-width:100%;\n\t}\n}\n\n// Colum\n.col-main {\n\tposition: relative;\n\tbox-sizing: border-box;\n\tpadding: 30px;\n\twidth: 800px;\n\tfloat: left;\n}\n.col-second {\n\tposition: relative;\n\tbox-sizing: border-box;\n\tfloat: left;\n\twidth: 300px;\n\tpadding: 20px;\n\tbackground: #EEE;\n\tz-index: 10;\n}\n.col-box{\n\tcolor: #666;\n\tfont-size: $small-font-size;\n\tpadding-bottom: 20px;\n\t\n\tp {\n\t margin: 0;\n\t}\n ul {\n padding-left: 20px;\n margin: 0;\n }\n\t\n\t&:not(:first-child) {\n \tborder-top: 1px solid #ccc;\n \tpadding-top: 20px;\n }\n \n .col-box-title {\n \tcolor: #333;\n\t margin-bottom: 10px;\n\t font-size: $small-font-size * 1.1;\n }\n}\n@media (max-width: 1120px) {\n\t.page-content .wrapper:before {\n\t\tdisplay: none;\n\t}\n\t.col-main,\n\t.col-second {\n\t\twidth: auto;\n\t\tfloat: none;\n\t}\n\t.col-box {\n\t\twidth: 50%;\n\t\tfloat: left;\n\t\tmargin-bottom: 10px;\n\t}\n\t.col-box:not(:first-child) {\n\t\tborder-top: none;\n\t\tpadding-top:0;\n\t}\n\t.col-second:after {\n\t\tclear: both;\n\t\tdisplay: block;\n\t\tcontent: ' ';\n\t}\n}\n.col-box-author {\n\ttext-align: center;\n\t.avatar {\n\t\twidth: 135px;\n\t\theight: 135px;\n\t\tborder-radius: 100%;\n\t\tmargin: 20px auto;\n\t\tdisplay: block;\n\t}\n\t.name {\n\t\tfont-size: $base-font-size;\n\t}\n\t.contact {\n\t\tmargin-top: 10px;\n\t\ta {\n\t\t\tbackground: #999;\n\t\t\tcolor: #eee;\n\t\t\tpadding: 5px 10px;\n\t\t\ttext-decoration: none;\n\t\t\tborder-radius: 5px;\n \t\twhite-space: nowrap;\n\t\t\t\n\t\t\t&:hover {\n\t\t\t\ttransition: background 0.3s ease;\n\t\t\t\tbackground: #666;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// footer\n.footer {\n\tpadding: 60px 0;\n\tbackground-color: #e0e0e3;\n\ttext-align:center;\n\tcolor:#666;\n\tfont-size:$small-font-size;\n}\n\n@import \"post\", \"home\";\n\n@include media-query($on-laptop) {\n\t.page-content {\n\t\tpadding: 0;\n\t}\n\t.footer {\n\t\tpadding: 15px 0 ;\n\t}\n}\n@include media-query($on-palm) {\n\t.header {\n\t\t&, .site-nav{\n\t\t\ttext-align:center;\n\t\t}\n\t\t.site-title {\n\t\t\tfloat: none;\n\t\t}\n\t}\n\t.col-main {\n\t\tpadding: 10px;\n\t}\n\t.col-box {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t\tmargin-bottom: 20px;\n\t}\n\tpre {\n\t\tpadding: 10px;\n\t}\n}\n",
- ".post {\n .post-header {\n \tmargin: 0 100px;\n \tmargin-bottom: 40px;\n \tpadding: 0px;\n .post-title {\n \tfont-size:40px;\n \tfont-weight: normal;\n \tmargin: 0 -100px;\n \t@include media-query($on-palm) {\n \t\tfont-size: 34px;\n \t}\n }\n .post-meta {\n \tcolor:#999;\n \tfont-size:$small-font-size;\n \tmargin: 0 -100px;\n }\n @include media-query($on-palm) {\n \t\ttext-align:center;\n \t\tmargin-bottom: 10px;\n \t\tpadding: 10px;\n }\n }\n .post-content {\n color: #333;\n \n h1,h2,h3,h4,h5,h6 {\n color: #000;\n }\n\n h1 {\n font-size: xx-large;\n }\n \n h1, h2 {\n // font-weight: bold;\n \tmargin-bottom: 10px;\n margin-top: 30px;\n }\n \n h1, h2, h3 {\n border-bottom: 1px dotted rgb(63, 63, 63);\n }\n \n pre {\n \tmargin: 0 -30px;\n @include media-query($on-palm) {\n\t\t margin: 0 -10px;\n }\n }\n \n .middle-image {\n display: block;\n margin-left: auto;\n margin-right: auto\n }\n }\n .post-comments {\n padding-top: 30px;\n }\n}",
- ".home {\n.page-heading {\n\tfont-size:40px;\n\tfont-weight: normal;\n\tmargin: 0px;\n @include media-query($on-palm) {\n\t\tmargin: 10px;\n\t\tfont-size: 34px;\n }\n}\n.rss-link {\n\tfloat:right;\n text-decoration: none;\n border:1px solid;\n color: #999;\n background: #fff;\n font-size: 0.7 * $base-font-size;\n padding: 1px 8px;\n \n &:hover, &:focus {\n color: #666;\n }\n}\n.post-list {\n margin: 0;\n\tpadding: 10px 0px;\n list-style: none;\n > li {\n padding-bottom: 5px;\n border-bottom: 2px dotted rgb(63, 63, 63);\n \tmargin-bottom: 5px;\n }\n .post-title {\n \tfont-size: 28px;\n \tfont-weight: bold;\n \tmargin: 0;\n }\n .post-meta {\n \tfont-size: $small-font-size;\n \tcolor: rgb(170, 170, 170);\n margin: 0 0px;\n margin-bottom: .5em;\n }\n .post-excerpt {\n &, * {\n font-size: $small-font-size;\n line-height: $small-font-size * 1.1;\n padding-top: 0;\n padding-bottom: 0;\n\t color: #333;\n }\n code, pre, pre * {\n color: #666;\n background-color: #eee;\n }\n th {\n border-color: #ccc;\n background-color: #ccc;\n }\n a {\n color: $color-link-hover;\n }\n img {\n display: block;\n margin: 1em auto;\n max-height: 16em;\n opacity: .7;\n transition: opacity .3s;\n &:hover {\n opacity: 1;\n }\n }\n margin: 0 0px;\n }\n @include media-query($on-palm) {\n\t\tpadding: 10px;\n }\n}\n.pagination {\n\ttext-align:center;\n\ttext-decoration:none;\n\tcolor: #666;\n\tmargin: 30px 0;\n .page_number {\n \tmargin:0 30px;\n }\n .previous,.next {\n \tpadding: 10px 20px;\n \twhite-space: nowrap;\n }\n a.previous,a.next {\n \tcolor: #333;\n \tborder-radius: 20px;\n \tborder: 1px solid #CCC;\n }\n a.previous:hover,a.next:hover {\n \tbackground: #fefefe;\n \tcolor: #000;\n \ttext-decoration:none;\n }\n}\n}",
- "/* Monokai Theme from https://github.com/richleland/pygments-css/blob/master/monokai.css */\n.highlight {\n .hll { background-color: #49483e }\n .c { color: #75715e } /* Comment */\n .err { color: #960050; background-color: #1e0010 } /* Error */\n .k { color: #66d9ef } /* Keyword */\n .l { color: #ae81ff } /* Literal */\n .n { color: #f8f8f2 } /* Name */\n .o { color: #f92672 } /* Operator */\n .p { color: #f8f8f2 } /* Punctuation */\n .cm { color: #75715e } /* Comment.Multiline */\n .cp { color: #75715e } /* Comment.Preproc */\n .c1 { color: #75715e } /* Comment.Single */\n .cs { color: #75715e } /* Comment.Special */\n .ge { font-style: italic } /* Generic.Emph */\n .gs { font-weight: bold } /* Generic.Strong */\n .kc { color: #66d9ef } /* Keyword.Constant */\n .kd { color: #66d9ef } /* Keyword.Declaration */\n .kn { color: #f92672 } /* Keyword.Namespace */\n .kp { color: #66d9ef } /* Keyword.Pseudo */\n .kr { color: #66d9ef } /* Keyword.Reserved */\n .kt { color: #66d9ef } /* Keyword.Type */\n .ld { color: #e6db74 } /* Literal.Date */\n .m { color: #ae81ff } /* Literal.Number */\n .s { color: #e6db74 } /* Literal.String */\n .na { color: #a6e22e } /* Name.Attribute */\n .nb { color: #f8f8f2 } /* Name.Builtin */\n .nc { color: #a6e22e } /* Name.Class */\n .no { color: #66d9ef } /* Name.Constant */\n .nd { color: #a6e22e } /* Name.Decorator */\n .ni { color: #f8f8f2 } /* Name.Entity */\n .ne { color: #a6e22e } /* Name.Exception */\n .nf { color: #a6e22e } /* Name.Function */\n .nl { color: #f8f8f2 } /* Name.Label */\n .nn { color: #f8f8f2 } /* Name.Namespace */\n .nx { color: #a6e22e } /* Name.Other */\n .py { color: #f8f8f2 } /* Name.Property */\n .nt { color: #f92672 } /* Name.Tag */\n .nv { color: #f8f8f2 } /* Name.Variable */\n .ow { color: #f92672 } /* Operator.Word */\n .w { color: #f8f8f2 } /* Text.Whitespace */\n .mf { color: #ae81ff } /* Literal.Number.Float */\n .mh { color: #ae81ff } /* Literal.Number.Hex */\n .mi { color: #ae81ff } /* Literal.Number.Integer */\n .mo { color: #ae81ff } /* Literal.Number.Oct */\n .sb { color: #e6db74 } /* Literal.String.Backtick */\n .sc { color: #e6db74 } /* Literal.String.Char */\n .sd { color: #e6db74 } /* Literal.String.Doc */\n .s2 { color: #e6db74 } /* Literal.String.Double */\n .se { color: #ae81ff } /* Literal.String.Escape */\n .sh { color: #e6db74 } /* Literal.String.Heredoc */\n .si { color: #e6db74 } /* Literal.String.Interpol */\n .sx { color: #e6db74 } /* Literal.String.Other */\n .sr { color: #e6db74 } /* Literal.String.Regex */\n .s1 { color: #e6db74 } /* Literal.String.Single */\n .ss { color: #e6db74 } /* Literal.String.Symbol */\n .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */\n .vc { color: #f8f8f2 } /* Name.Variable.Class */\n .vg { color: #f8f8f2 } /* Name.Variable.Global */\n .vi { color: #f8f8f2 } /* Name.Variable.Instance */\n .il { color: #ae81ff } /* Literal.Number.Integer.Long */\n \n .gh { } /* Generic Heading & Diff Header */\n .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */\n .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */\n .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */\n}",
- ".page-content .wrapper {\n .post-toc {\n &>ul {\n overflow: auto;\n }\n }\n}\n\n.util-notify1 {\n position: absolute;\n z-index: 100;\n background: rgba(0,0,0,0.7);\n color: #FFF;\n padding: 5px 10px;\n font-size: 14px;\n pointer-events: none;\n opacity: 1;\n transition: .2s ease;\n \n &.hidden {\n opacity: 0;\n display: none;\n }\n}"
- ],
- "names": [],
- "mappings": "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"
-}
\ No newline at end of file
diff --git a/_site/css/timeline.css b/_site/css/timeline.css
deleted file mode 100644
index 114ff73..0000000
--- a/_site/css/timeline.css
+++ /dev/null
@@ -1,235 +0,0 @@
-.timeline{
- --uiTimelineMainColor: var(--timelineMainColor, #35008a);
- --uiTimelineSecondaryColor: var(--timelineSecondaryColor, #fff);
- --uiTimelineDateColor: var(--timelineYearColor, #1470ff);
-
- position: relative;
- /* padding-top: 3rem; */
- /* padding-bottom: 3rem; */
-}
-
-.timeline:before{
- content: "";
- width: 4px;
- height: 100%;
- background-color: var(--uiTimelineMainColor);
-
- position: absolute;
- top: 0;
-}
-
-.timeline__group{
- position: relative;
-}
-
-.timeline__group:not(:first-of-type){
- margin-top: 2rem;
-}
-
-.timeline__group:last-of-type{
- margin-bottom: 0rem;
-}
-
-.timeline__year{
- padding: .5rem 1.5rem;
- color: var(--uiTimelineSecondaryColor);
- background-color: var(--uiTimelineMainColor);
-
- position: absolute;
- left: 0;
- bottom: 0;
-}
-
-.timeline__box{
- position: relative;
- bottom: 6rem;
-}
-
-.timeline__box:not(:last-of-type){
- margin-bottom: 30px;
-}
-
-.timeline__box:before{
- content: "";
- /* width: 100%; */
- width: auto;
- height: 2px;
- background-color: var(--uiTimelineMainColor);
-
- position: absolute;
- left: 0;
- z-index: -1;
-}
-
-.timeline__date{
- min-width: 65px;
- position: absolute;
- left: 0;
-
- box-sizing: border-box;
- padding: .5rem 1.5rem;
- text-align: center;
-
- background-color: var(--uiTimelineDateColor);
- color: var(--uiTimelineSecondaryColor);
-}
-
-.timeline__day{
- font-size: 2rem;
- font-weight: 700;
- display: block;
-}
-
-.timeline__month{
- display: block;
- font-size: .8em;
- text-transform: uppercase;
-}
-
-.timeline__post{
- padding: 1.5rem 1rem 1.5rem 1rem;
- border-radius: 2px;
- border-left: 3px solid var(--uiTimelineMainColor);
- box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 1px 2px 0 rgba(0, 0, 0, .24);
- background-color: var(--uiTimelineSecondaryColor);
- display: inline-block;
-}
-
-@media screen and (min-width: 641px){
-
- .timeline:before{
- left: 30px;
- }
-
- .timeline__group{
- padding-top: 55px;
- }
-
- .timeline__box{
- padding-left: 80px;
- }
-
- .timeline__box:before{
- top: 50%;
- transform: translateY(-50%);
- }
-
- .timeline__date{
- top: 50%;
- margin-top: -27px;
- }
-}
-
-@media screen and (max-width: 640px){
-
- .timeline:before{
- left: 0;
- }
-
- .timeline__group{
- padding-top: 40px;
- }
-
- .timeline__box{
- padding-left: 20px;
- padding-top: 70px;
- }
-
- .timeline__box:before{
- top: 90px;
- }
-
- .timeline__date{
- top: 0;
- }
-}
-
-.timeline{
- --timelineMainColor: #4557bb;
- font-size: 16px;
-}
-
-@media screen and (min-width: 768px){
-
- html{
- font-size: 62.5%;
- }
-}
-
-@media screen and (max-width: 767px){
-
- html{
- font-size: 55%;
- }
-}
-
-/*
-* demo page
-*/
-
-@media screen and (min-width: 768px){
-
- html{
- font-size: 62.5%;
- }
-}
-
-@media screen and (max-width: 767px){
-
- html{
- font-size: 50%;
- }
-}
-
-.page{
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- justify-content: space-around;
-}
-
-.page__demo{
- flex-grow: 1;
-}
-
-.main-container{
- max-width: 960px;
- padding-left: 2rem;
- padding-right: 2rem;
-
- margin-left: auto;
- margin-right: auto;
-}
-
-.page__container{
- padding-top: 30px;
- padding-bottom: 30px;
- max-width: 800px;
-}
-
-.footer{
- padding-top: 1rem;
- padding-bottom: 1rem;
- text-align: center;
- font-size: 1.4rem;
-}
-
-.footer__link{
- text-decoration: none;
- color: inherit;
-}
-
-@media screen and (min-width: 361px){
-
- .footer__container{
- display: flex;
- justify-content: space-between;
- }
-}
-
-@media screen and (max-width: 360px){
-
- .melnik909{
- display: none;
- }
-}
diff --git a/_site/feed.xml b/_site/feed.xml
index 704df68..695da2d 100644
--- a/_site/feed.xml
+++ b/_site/feed.xml
@@ -1,18 +1,5 @@
-
-
-
- Stop Talking, Start Doing
- My personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
-
- https://codersherlock.github.com//
-
- Wed, 13 Oct 2021 19:10:30 -0400
- Wed, 13 Oct 2021 19:10:30 -0400
- Jekyll v4.1.1
-
-
- EDDL: How do we train neural networks on limited edge devices - PART 1
- <p>This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
+Jekyll2021-10-25T11:57:39-04:00http://localhost:4000/feed.xmlStop Talking, Start DoingMy personal blog, with some boring research staff and some tricks I was fancy to. I'll try my best to make this blog fun and useful. Not just a place I complain about all happens in my Lab.
+Pengzhan Haohaopengzhan@gmail.comEDDL: How do we train neural networks on limited edge devices - PART 12021-10-13T16:53:20-04:002021-10-13T16:53:20-04:00http://localhost:4000/posts/eddl-how-do-we-train-on-limited-edge-devices<p>This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
As the first part of the introductions, I focus only on the motivation and summary of our works.
More details in design and implementation can be found in late posts.</p>
@@ -88,20 +75,7 @@ Smartly schedule work balance and handle join/exit issues also need under consid
Devices with sufficient bandwidth can also work as virtual leader devices.
This approach helps with minimize physical devices we used and more leaders can further scale up workers limits.</p>
</li>
-</ul>
-
- Wed, 13 Oct 2021 16:53:20 -0400
- https://codersherlock.github.com//archivers/eddl-how-do-we-train-on-limited-edge-devices
- https://codersherlock.github.com//archivers/eddl-how-do-we-train-on-limited-edge-devices
-
-
- Research
-
-
-
-
- Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries
- <p>Let’s generate a word cloud like this.
+</ul>Pengzhan Haohaopengzhan@gmail.comThis post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published. As the first part of the introductions, I focus only on the motivation and summary of our works. More details in design and implementation can be found in late posts. Why do we need training on edge? Cloud is not trustworthy anymore. More and more facts supports that breach on cloud happens frequently than before. Nowadays, with more generated personal sensitive data has been uploaded to the cloud center, tech company know better to someones than user themselves. Researchers, no matter in industry on academia, are working in a way that still learning from users’ data but also keeping raw sensitive data under users’ control. Many publications already showed feasibility of only sharing after-trained model instead of raw data. One recent popular study on this is google’s federated learning. During investigated this problem, we found that let end user train their own data is safe, but sacrifice efficiency. Since one end device has limited resources, training time and power consumption can be disappointing. We believe there must have a leverage between privacy and efficiency in some target scenarios. Fortunately, we observed that users who belongs to the same campus, plant, firm and community always share similar interests. Therefore, these co-located users have similar demands in using AI-involved routines. Also, co-located users are easily targeted by same type of threats, such as ransomware to financial practitioners. Think about this, sending features of a new malware app to cloud services in order to train a neural networks used by antivirus program. This process may takes long time and small amount of samples may not be recognized by the global neural networks model. With a customized local model trained and deployed on the edge can successfully counter the problem. With edge training as a supplement of cloud training can achieve better response time and let the whole system more flexible. Why training on edge is hard? Since all co-located users’ device can be used for an edge training, issues and challenges occur as deploying this distributed system. The first challenge is struggling workers. Training devices are heterogeneity, from limited IoT camera to high-end media center with powerful GPU. They are not designed to do machine learnings. So, a good edge-based distributed learning framework must can handle variety speeds in training tasks. The second challenge is how to scale up clusters. In a campus, thousands and more devices may contribute computing resources to the same training tasks. However, these devices may located in far not matter in physical or in network topology. How can we well use them well, without struggled with endless transmission time remains a challenge. The third issue is frequently joining and exiting of devices. We can’t rely on each devices to faithfully working on training tasks rather than their original workload. Smartly schedule work balance and handle join/exit issues also need under consideration. Our proposal Dynamic training data distribution and runtime profiler We design a dynamic training data distribution mechanism that helps to both the first and the third challenges. Preprocessing data can be transmitted without leakage of raw sensitive information. This can helps with struggling workers who can train small batches in order to upload parameters with a similar training time. Also, for extremely slow devices, join and exit of devices cases, dynamic data distribution and profiler can helps with keep global training parameters from polluted and staleness. To counter heterogeneity’s, more approaches were applied in our later research. More details were introduced to runtime profiler in the later works. Asynchronous and synchronous aggregation enabled In our findings, asynchronous and synchronous parameter update have their pros and cons. Keeping sync all the time leads struggling worker issue unsolvable. However, async’s harm to accuracy and convergence time also need attentions. To carefully chose between these two update policies at the runtime is what we proposed to make use of their own advantages. Leader role splitting The idea is to let worker devices with higher bandwidth taking leader role during training. Parameter updating does not require much computation but only need bandwidth. Devices with sufficient bandwidth can also work as virtual leader devices. This approach helps with minimize physical devices we used and more leaders can further scale up workers limits.Generate Word Cloud Figures with Chinese-Tokenization and WordCloud python libraries2020-09-15T22:00:14-04:002020-09-15T22:00:14-04:00http://localhost:4000/posts/generate-word-cloud-with-chinese-fenci<p>Let’s generate a word cloud like this.
Don’t understand the language is not a big deal.
If your written language is based on latin alphabet(or other language has space between words), skip tokenization.</p>
@@ -143,7 +117,7 @@ If your written language is based on latin alphabet(or other language has space
<p>Two popular tokenization library were used, and I chose <a href="https://github.com/fxsjy/jieba">jieba</a> after a few comparison. Before cutting the sentence, we first need to remove all punctuation marks.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">remove_biaodian</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
- <span class="n">punct</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="s">u''':!),.:;?]}¢'"、。〉》」』】〕〗〞︰︱︳﹐、﹒
+ <span class="n">punct</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="sa">u</span><span class="s">''':!),.:;?]}¢'"、。〉》」』】〕〗〞︰︱︳﹐、﹒
﹔﹕﹖﹗﹚﹜﹞!),.:;?|}︴︶︸︺︼︾﹀﹂﹄﹏、~¢
々‖•·ˇˉ―--′’”([{£¥'"‵〈《「『【〔〖([{£¥〝︵︷︹︻
︽︿﹁﹃﹙﹛﹝({“‘-—_…'''</span><span class="p">)</span>
@@ -259,21 +233,7 @@ If your written language is based on latin alphabet(or other language has space
<p><img src="/static/2020-09/2020-06-28.png" height="150" /></p>
-<p>This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.</p>
-
-
- Tue, 15 Sep 2020 22:00:14 -0400
- https://codersherlock.github.com//archivers/generate-word-cloud-with-chinese-fenci
- https://codersherlock.github.com//archivers/generate-word-cloud-with-chinese-fenci
-
-
- visualization
-
-
-
-
- Xv6 introduction
- <p>In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
+<p>This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.</p>Pengzhan Haohaopengzhan@gmail.comLet’s generate a word cloud like this. Don’t understand the language is not a big deal. If your written language is based on latin alphabet(or other language has space between words), skip tokenization. Background Recently, I set up a web-based RSS client for retrieving and organizing everyday news. I used TinyTinyRSS, or as ttrss, a popular RSS client which friendly to docker. Thanks to developer HenryQW, a well-written Nginx-based docker configuration is already available in docker hub. With more feeds were added, I found some feeds does not need to be checked everyday. Thus I was thinking to create a script to automatically list all keywords appears in a last period and generate a heat map kind figure of it. Before you go further, I’ll tell you all my settings to give readers a general overview. My first step is to read all text-based information from TTRSS’s PostgreSQL database. With information, I used a Chinese-NLP library, jieba, to extract all keyword with their occurrences frequency. By using WordCloud, a python library, word cloud figure is generated and present. More details will be discussed in later sections. Get RSS feeds’ text My first thought is generating a keyword heat map for economy news of a last week. Since this blog post are more skewed to Chinese tokenization and draw the word cloud figure. I’ll leave my code here just in case. The SQL connector I used is psycopg2, an easy-use PostgreSQL library. def __init__(self): self.dbe = psycopg2.connect( host=DB_HOST, port=DB_PORT, database=DB_NAME, user=DB_USER, password=DB_PASS) def get_1w_of_feed_byid(self, id=1) -> list: cur = self.dbe.cursor() cur.execute('SELECT content FROM public.ttrss_entries \ where date_updated > now() - interval \'1 week\' AND id in ( \ select int_id from DB_TABLE_NAME \ where feed_id=' + str(id) + ' \ ) \ ORDER BY id ASC ' ) rows = cur.fetchall() return rows Most arguments are intuitive and easy to understand. The only exception is argument of function get_1w_of_feed_byid. This id is the feed index of my subscriptions. Tokenize with frequency Two popular tokenization library were used, and I chose jieba after a few comparison. Before cutting the sentence, we first need to remove all punctuation marks. def remove_biaodian(text: str) -> str: punct = set(u''':!),.:;?]}¢'"、。〉》」』】〕〗〞︰︱︳﹐、﹒ ﹔﹕﹖﹗﹚﹜﹞!),.:;?|}︴︶︸︺︼︾﹀﹂﹄﹏、~¢ 々‖•·ˇˉ―--′’”([{£¥'"‵〈《「『【〔〖([{£¥〝︵︷︹︻ ︽︿﹁﹃﹙﹛﹝({“‘-—_…''') ret = "" for x in text: if x in punct: ret += '' else: ret += x return ret After we have an all characters string, we can call jieba. By using the function jieba.posseg.cut with or without paddle, we can have a word list and their “part of speech”. As you can see in the following code, I also did two more works. First, in the if statement, I only kept all nouns with some categories. Category abbreviation such as “nr” and “ns” represent different “part of speech”, I attached with categories I used in the following table. For more details you can find in this link. The second work is only keeping words with length longer than 2 characters. In Chinese, there’s no space between words such as Latin writing systems. Since then, some single-character-words such as conjunction words are easy to be misrecognized as specialty-noun. And this misrecognition will cause more single-character being regarded as specialty-noun. I am not able to improve NLP method, so I used a easy way to fix this by removing any words less than 2 characters. import jieba.posseg as pseg def get_noun_jieba(self, content: str) -> list: content = remove_biaodian(content) words = pseg.cut(content) # Invoking jieba.posseg.cut function ret = [] for word, flag in words: # print(word, flag) if flag in ['nr', 'ns', 'nt', 'nw', 'nz', 'PER', 'ORG', 'x']: # LOC ret.append(word) return [remove_biaodian(i) for i in ret if i.strip() != "" and len(remove_biaodian(i.strip())) >= 2] Word category names and abbreviations Abbreviation Category name/ Part of speech nr People name noun ns Location name noun nt Organization name noun nw Arts work noun nz Other noun PER People name noun ORG Location name noun x Non-morpheme word With all words extracted, we can easily calculate their frequencies. After this, we can using the following line of code to print a sorted result to verify correctness. noun = seg.get_noun_jieba(test_content) # ... Calculate frequency of above word list ... print(sorted(a_dict.items(), key=lambda x: x[1])) Draw word cloud With a keyword and frequency dictionary(data structure), we can just call built-in functions from wordcloud library to generate the figure. First we need to initialize an instance of wordcloud class. As you can see in my code, I set it with 6 parameters. Width and Height of the canvas, maximum amount of words used to generate the figure, the font of words, background color and margin between any two words. After having the instance, we call function generate_from_frequencies and pass keyword dictionary to it. The return value of this function is an bitmap image, which we can use matplotlib to plot it to your screen. I tested my plot on ubuntu-subsystem on Windows 10, unfortunately matplotlib under subsystem depends on x11 window manager and its not default available on windows. We need to install an x11 manager to support. Xming is the one I used. from wordcloud import WordCloud import matplotlib.pyplot as plt font_path = "./font/haipai.ttf" output_path = "./font/out.png" def show_figure_with_frequency(keywords: dict): wc = WordCloud(width=828, height=1792, max_words=200, font_path=font_path, background_color="white", margin=1).generate_from_frequencies(keywords) plt.imshow(wc) plt.axis('off') plt.show() If everything work fine, a word cloud figure will show up in a new window. My version looks like this. This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.Xv6 introduction2017-07-28T14:56:55-04:002017-07-28T14:56:55-04:00http://localhost:4000/posts/intro-xv6<p>In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
Understand system call and know how to implement a simple one will be coved as the first half.
In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb.</p>
@@ -347,20 +307,7 @@ Using ssh may connect to different physical devices under same domain name, this
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>target remote localhost:28467
<span class="c"># target remote [ip-addr]:28467</span>
-</code></pre></div></div>
-
- Fri, 28 Jul 2017 14:56:55 -0400
- https://codersherlock.github.com//archivers/intro-xv6
- https://codersherlock.github.com//archivers/intro-xv6
-
-
- xv6
-
-
-
-
- Some of my previews experiment works: 2016
- <p>This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.</p>
+</code></pre></div></div>Pengzhan Haohaopengzhan@gmail.comIn this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes. Understand system call and know how to implement a simple one will be coved as the first half. In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb. Xv6 Systemcall To invoke a system call, we have to first define a user mode function to be the interface of the kernel instruction in file user.h. void function (void); This interface-like function will then pass the function name, in this case function, to usys.S. When using user mode function in programs, usys.S will generate a reference to SYS_function and push system call number of this function into %eax. After that, system can know from syscall.c and determining whether this system call is available. We must define same name system function and add it into syscall.h and syscall.c. #define SYS_function ## // ## is the system call number [SYS_function] sys_function // real system function name extern int sys_function(void); // real system function declaration After adding these sentences to syscall files, we can implement real function in specific place where you want to make the function works well. Sometimes, we need to pass variables among system calls. In this case, variables’ values are not necessary and even can’t be pass directly into system_function. When invoke a system call function, all variables of this system call will be pushed into current process’ stack. In file syscall.c, multiple functions are provided to get these variables from the process. I won’t waste time on explaining how to use these functions especially when elegant and detailed comments were written in source codes. However, I will explain concepts and how process organized and works in xv6 in future articles. Debug xv6 with gdb Please make sure that you have used gdb before. If you never used gdb, you may write a simple 50-100 lines c code and practice how to use gdb first. GDB Manual GDB cheatsheet (pdf) To make sure xv6 gdb enabled, please check if .gdbinit.tmpl file exist. This file is used for generate .gdbinit file which you can late consider it as a configuration for gdb. Before running the xv6 instance in QEMU, one more thing you need to know is that using gdb to debug xv6 must be attached remotely. This is because xv6 was running within QEMU, and emulator is virtually gapped from the host device. Later when you start debugging, QEMU will open a gdb server to let gdb client connect to. Once you want to start, using following command to compile and run xv6 $ make qemu-nox-gdb *** Now run 'gdb'. qemu-system-i386 -nographic -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp 2 7 At this moment, it feels xv6 was stuck, this is because QEMU is ready to be connected by the gdb client. You may use the .gdbinit to automatically finish this remote connection by simple typein following command in another terminal. $ gdb -x .gdbinit GNU gdb (Debian 8.2.1-2+b3) 8.2.1 ... The target architecture is assumed to be i8086 [f000:fff0] 0xffff0: ljmp $0x3630,$0xf000e05b 0x0000fff0 in ?? () + symbol-file kernel warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration of GDB. Attempting to continue with the default i8086 settings. (gdb) Now within this gdb client shell, type ‘c’ to continue the xv6, and you will see xv6 start execution in the first terminal. At this moment, you may add breakpoints to your code to see if your code is correctly implemented or not. One more thing, if you open .gdbinit file, you’ll find that it by default connect to a localhost target. If you are working on some other environment that target and client were not placed in the same device, change the localhost to ip address correspondingly. Using ssh may connect to different physical devices under same domain name, this is because load balancer were used. To check ip address, search command ip. target remote localhost:28467 # target remote [ip-addr]:28467Some of my previews experiment works: 20162016-10-28T12:27:33-04:002016-10-28T12:27:33-04:00http://localhost:4000/posts/some-of-my-previews-exper-work<p>This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.</p>
<h1 id="2016-10">2016-10</h1>
@@ -469,20 +416,7 @@ unxz ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz
<span class="c"># dump file</span>
su
<span class="nb">dd </span><span class="k">if</span><span class="o">=</span>/dev/block/mmcblk0p37 <span class="nv">of</span><span class="o">=</span>/sdcard/boot.img
-</code></pre></div></div>
-
- Fri, 28 Oct 2016 12:27:33 -0400
- https://codersherlock.github.com//archivers/some-of-my-previews-exper-work
- https://codersherlock.github.com//archivers/some-of-my-previews-exper-work
-
-
- Research
-
-
-
-
- Using charles proxy to monitor mobile SSL traffics
- <p>In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.<br />
+</code></pre></div></div>Pengzhan Haohaopengzhan@gmail.comThis blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics. 2016-10 Time Experiment of rsync Patch is based on rsync with version 3.1.2. [Rsync|Patch] How to collect data Basically, everything of transmission time and computation time will be output with overall time will be printed on the console. But we also need some bash script to collect data through different size of random size and with different modification through them. Start from 8K to 64M, modify at beginning, [Bash script] Start from 8K to 64M, modify at last, [Bash script] Start from 8K to 64M, modify at random place with a (slow) python script, [Bash script|Python program] Time Experiment of seafile Patch is based on seafile 5.1.4. You can find the release from seafile official repo. You may follow official compile instructions from here. [Patch no longer avaiable, new version at following sections] How to collect data We also need everything be done using scripting. But this time I only design added some distance between two increasing files’ sizes. Start from 8K to 16M, 4 times increasing, modify at beginning/ at 1024 different places with python script. [Bash Script|Python program] After using this auto testing script, everything of output will be marked in log files of seafile, which located in ~/.ccnet/log/seafile.log We need to use this simple awk code and vim operation to extract data. # CDC: content defined chucks # HUT: Http upload traffic # ALL: overall time of one commit & upload awk '/CDC|HUT|ALL/ {print $4,$5}' ~/.ccnet/log/seafile.log > results.stat Install Seafile on odroid xu Due to failure of my cross-compile to seafile on android. I used develop board as a replacement experiment platform for ARM-seafile testing. I used a odroid xu as hardware standard. Because all I need is an ARM platform, only an ARM-Ubuntu is enough for me. But develop prototype on a board is much fun than coding, I won’t address much this time. But I’ll start a blog telling some really cool stuff I made for a strange aim. To install a ubuntu with GUI is my all preparation work. I found to way to do this. armhf is a website for arm-based ubuntu. It has a detailed instruction to follow at here. They also provide ubuntu 12.04/ 14.04 and debian 7.5 to choose. But unfortunately odroid xu’s hdmi output doesn’t supported by ubuntu native firmware. So install ubuntu-desktop might can’t be boot up for video output. Burn images is much easy to install a pre-complied ubuntu system. I found this on odroid xu’s forum, which contains xubuntu image [download] for odroid xu. With this image, you just need to use dd command to write whole system mirror into sdcard. # If .img end with xz, use this command to uncompress first unxz ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz # Burn image into SD-card sudo dd if=ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img of=/dev/sdb bs=1M conv=fsync sync 2016-11 Android Kernel How to build an Android Kernel? Generally, I won’t tell anything in this parts, just mark some related links, and point out some mistakes or error solutions. Google Official Guide – If you don’t have AOSP sources, you have to download prebuilt toolchains which recommended in this guide might not be correct. Use following links to choose your fitting tools. — ASOP git root, under sub class “/platform/prebuilts/gcc” Packing and Flashing a Boot.img [highly recommend] 2016-12 Android Kernel How to compile with ftrace? If we want to debug under android, ftrace is a great tool for working. But, ftrace is not available in android if we used default configure file. Android kernel configuration is in arch/arm64/kernel/configs. We need to add few lines under that. CONFIG_STRICT_MEMORY_RWX=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y CONFIG_DYNAMIC_FTRACE=y CONFIG_PERSISTENT_TRACER=y CONFIG_IRQSOFF_TRACER=y CONFIG_PREEMPT_TRACER=y CONFIG_SCHED_TRACER=y CONFIG_STACK_TRACER=y How to extract android images: Dump an image If we want to hold a rooted status after flashing boot, we need to extract an image from android devices. We can first use following command to find which blocks belongs to. According to some references, this article provide three ways to dump an image, I picked one for easy using. adb shell ls -al /dev/block/platform/$SOME\_DEVICE../../by-name # {Partitions} -> {Device Block} # dump file su dd if=/dev/block/mmcblk0p37 of=/sdcard/boot.imgUsing charles proxy to monitor mobile SSL traffics2016-10-27T22:50:33-04:002016-10-27T22:50:33-04:00http://localhost:4000/posts/charles-is-not-a-good-tool<p>In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.<br />
My current solution is using AP to forward all SSL traffic to a proxy, <a href="https://www.charlesproxy.com/">charles proxy</a> is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.</p>
<h3 id="preparations">Preparations</h3>
@@ -510,29 +444,4 @@ You also need to save charles Root Certificate, it also contains in the same men
<ul>
<li>Set Proxy and SSL Proxy</li>
-</ul>
-
- Thu, 27 Oct 2016 22:50:33 -0400
- https://codersherlock.github.com//archivers/charles-is-not-a-good-tool
- https://codersherlock.github.com//archivers/charles-is-not-a-good-tool
-
-
- Network
-
-
-
-
- Stop Talking is the worst title of one blog
-
-
- Wed, 26 Oct 2016 22:50:33 -0400
- https://codersherlock.github.com//archivers/hello
- https://codersherlock.github.com//archivers/hello
-
-
- Nonsense
-
-
-
-
-
+</ul>Pengzhan Haohaopengzhan@gmail.comIn this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one. My current solution is using AP to forward all SSL traffic to a proxy, charles proxy is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy. Preparations Monitor device situation: Linux Machine with wireless adapter Download the newest version(4.0.1) of charles Target android devices with root privilege Install Charles and Configuration You have to install charles first. After downloading the charles proxy, you have to unzip it and configure some basic settings. # open charles first ./bin/charles Save charles’ private key and public key In Help -> SSL Proxying -> Export Charles Root Certificate and Private Key, enter a password and save the public and private key in *.p12 format. You also need to save charles Root Certificate, it also contains in the same menu. For convience, save it as *.pem format. Set Proxy and SSL ProxyStop Talking is the worst title of one blog2016-10-26T22:50:33-04:002016-10-26T22:50:33-04:00http://localhost:4000/posts/welcome-to-my-blogPengzhan Haohaopengzhan@gmail.com
\ No newline at end of file
diff --git a/_site/index.html b/_site/index.html
index 9ba998d..296241d 100644
--- a/_site/index.html
+++ b/_site/index.html
@@ -1,237 +1,916 @@
-
-
+
+
+
+Home - Stop Talking, Start Doing
-
-
-
-
-
- Stop Talking, Start Doing
-
+
-
-
-
-
-
-
-
-
+ return {
+ then: function(cb) {
+ cb && (loaded ? cb() : (cbs.push(cb)));
+ }
+ };
+ })();
+})();
+(function() {
+ window.throttle = function(func, wait) {
+ var args, result, thisArg, timeoutId, lastCalled = 0;
+
+ function trailingCall() {
+ lastCalled = new Date;
+ timeoutId = null;
+ result = func.apply(thisArg, args);
+ }
+ return function() {
+ var now = new Date,
+ remaining = wait - (now - lastCalled);
+
+ args = arguments;
+ thisArg = this;
+
+ if (remaining <= 0) {
+ clearTimeout(timeoutId);
+ timeoutId = null;
+ lastCalled = now;
+ result = func.apply(thisArg, args);
+ } else if (!timeoutId) {
+ timeoutId = setTimeout(trailingCall, remaining);
+ }
+ return result;
+ };
+ };
+})();
+(function() {
+ var Set = (function() {
+ var add = function(item) {
+ var i, data = this._data;
+ for (i = 0; i < data.length; i++) {
+ if (data[i] === item) {
+ return;
+ }
+ }
+ this.size ++;
+ data.push(item);
+ return data;
+ };
+
+ var Set = function(data) {
+ this.size = 0;
+ this._data = [];
+ var i;
+ if (data.length > 0) {
+ for (i = 0; i < data.length; i++) {
+ add.call(this, data[i]);
+ }
+ }
+ };
+ Set.prototype.add = add;
+ Set.prototype.get = function(index) { return this._data[index]; };
+ Set.prototype.has = function(item) {
+ var i, data = this._data;
+ for (i = 0; i < data.length; i++) {
+ if (this.get(i) === item) {
+ return true;
+ }
+ }
+ return false;
+ };
+ Set.prototype.is = function(map) {
+ if (map._data.length !== this._data.length) { return false; }
+ var i, j, flag, tData = this._data, mData = map._data;
+ for (i = 0; i < tData.length; i++) {
+ for (flag = false, j = 0; j < mData.length; j++) {
+ if (tData[i] === mData[j]) {
+ flag = true;
+ break;
+ }
+ }
+ if (!flag) { return false; }
+ }
+ return true;
+ };
+ Set.prototype.values = function() {
+ return this._data;
+ };
+ return Set;
+ })();
+
+ window.Lazyload = (function(doc) {
+ var queue = {js: [], css: []}, sources = {js: {}, css: {}}, context = this;
+ var createNode = function(name, attrs) {
+ var node = doc.createElement(name), attr;
+ for (attr in attrs) {
+ if (attrs.hasOwnProperty(attr)) {
+ node.setAttribute(attr, attrs[attr]);
+ }
+ }
+ return node;
+ };
+ var end = function(type, url) {
+ var s, q, qi, cbs, i, j, cur, val, flag;
+ if (type === 'js' || type ==='css') {
+ s = sources[type], q = queue[type];
+ s[url] = true;
+ for (i = 0; i < q.length; i++) {
+ cur = q[i];
+ if (cur.urls.has(url)) {
+ qi = cur, val = qi.urls.values();
+ qi && (cbs = qi.callbacks);
+ for (flag = true, j = 0; j < val.length; j++) {
+ cur = val[j];
+ if (!s[cur]) {
+ flag = false;
+ }
+ }
+ if (flag && cbs && cbs.length > 0) {
+ for (j = 0; j < cbs.length; j++) {
+ cbs[j].call(context);
+ }
+ qi.load = true;
+ }
+ }
+ }
+ }
+ };
+ var load = function(type, urls, callback) {
+ var s, q, qi, node, i, cur,
+ _urls = typeof urls === 'string' ? new Set([urls]) : new Set(urls), val, url;
+ if (type === 'js' || type ==='css') {
+ s = sources[type], q = queue[type];
+ for (i = 0; i < q.length; i++) {
+ cur = q[i];
+ if (_urls.is(cur.urls)) {
+ qi = cur;
+ break;
+ }
+ }
+ val = _urls.values();
+ if (qi) {
+ callback && (qi.load || qi.callbacks.push(callback));
+ callback && (qi.load && callback());
+ } else {
+ q.push({
+ urls: _urls,
+ callbacks: callback ? [callback] : [],
+ load: false
+ });
+ for (i = 0; i < val.length; i++) {
+ node = null, url = val[i];
+ if (s[url] === undefined) {
+ (type === 'js' ) && (node = createNode('script', { src: url }));
+ (type === 'css') && (node = createNode('link', { rel: 'stylesheet', href: url }));
+ if (node) {
+ node.onload = (function(type, url) {
+ return function() {
+ end(type, url);
+ };
+ })(type, url);
+ (doc.head || doc.body).appendChild(node);
+ s[url] = false;
+ }
+ }
+ }
+ }
+ }
+ };
+ return {
+ js: function(url, callback) {
+ load('js', url, callback);
+ },
+ css: function(url, callback) {
+ load('css', url, callback);
+ }
+ };
+ })(this.document);
+})();
+
-
-
+
This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
+
+
This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
As the first part of the introductions, I focus only on the motivation and summary of our works.
-More details in design and implementation can be found in late posts.
-
-
Let’s generate a word cloud like this.
Don’t understand the language is not a big deal.
-If your written language is based on latin alphabet(or other language has space between words), skip tokenization.
+If your written language is based on latin alphabet(or other language has space between words), skip tokenization.
-
In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
+Background
+
+Recently, I set up a web-based RSS client for retrieving and organizing everyday news. I used TinyTinyRSS, or as ttrss, a popula...
In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
Understand system call and know how to implement a simple one will be coved as the first half.
-In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb.
+In the second half of this post, I will discuss a little bit more on how to debug ...
+Patch is based on rsync with version 3.1.2. [Rsync|Patch]
-
-
In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.
-My current solution is using AP to forward all SSL traffic to a proxy, charles proxy is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.
In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still did...
In this blog, I will generally talk about how to use proper tools to monitor SSL traffics of a mobile devices. Currently, I only can dealing with those SSL traffics which use an obviously certification. Some applications may not using system root cert or they doesn’t provide us a method to modify their own certs. For these situation, I still didn’t find a good solutions for it. But I’ll keep updating this if I get one.
+My current solution is using AP to forward all SSL traffic to a proxy, charles proxy is my first choice (Prof asked). It’s a non-free software which still update new versions now. So mainly, I’ll talk about how to charles SSL proxy.
+
+
Preparations
+
+
Monitor device situation: Linux Machine with wireless adapter
+
Download the newest version(4.0.1) of charles
+
Target android devices with root privilege
+
+
+
Install Charles and Configuration
+
+
+
You have to install charles first. After downloading the charles proxy, you have to unzip it and configure some basic settings.
+
+
+
# open charles first
+./bin/charles
+
+
+
Save charles’ private key and public key
+
+
+
In Help -> SSL Proxying -> Export Charles Root Certificate and Private Key, enter a password and save the public and private key in *.p12 format.
+You also need to save charles Root Certificate, it also contains in the same menu. For convience, save it as *.pem format.
This post introduces our previous milestone in project “Edge trainer”, as the paper “EDDL: A Distributed Deep Learning System for Resource-limited Edge Computing Environment.” was published.
+As the first part of the introductions, I focus only on the motivation and summary of our works.
+More details in design and implementation can be found in late posts.
+
+
+
+
Why do we need training on edge?
+
+
Cloud is not trustworthy anymore. More and more facts supports that breach on cloud happens frequently than before.
+Nowadays, with more generated personal sensitive data has been uploaded to the cloud center, tech company know better to someones than user themselves.
+
+
Researchers, no matter in industry on academia, are working in a way that still learning from users’ data but also keeping raw sensitive data under users’ control.
+Many publications already showed feasibility of only sharing after-trained model instead of raw data.
+One recent popular study on this is google’s federated learning.
+
+
During investigated this problem, we found that let end user train their own data is safe, but sacrifice efficiency.
+Since one end device has limited resources, training time and power consumption can be disappointing.
+We believe there must have a leverage between privacy and efficiency in some target scenarios.
+
+
Fortunately, we observed that users who belongs to the same campus, plant, firm and community always share similar interests.
+Therefore, these co-located users have similar demands in using AI-involved routines.
+Also, co-located users are easily targeted by same type of threats, such as ransomware to financial practitioners.
+
+
Think about this, sending features of a new malware app to cloud services in order to train a neural networks used by antivirus program.
+This process may takes long time and small amount of samples may not be recognized by the global neural networks model.
+With a customized local model trained and deployed on the edge can successfully counter the problem.
+With edge training as a supplement of cloud training can achieve better response time and let the whole system more flexible.
+
+
Why training on edge is hard?
+
+
Since all co-located users’ device can be used for an edge training, issues and challenges occur as deploying this distributed system.
+
+
The first challenge is struggling workers.
+Training devices are heterogeneity, from limited IoT camera to high-end media center with powerful GPU.
+They are not designed to do machine learnings.
+So, a good edge-based distributed learning framework must can handle variety speeds in training tasks.
+
+
The second challenge is how to scale up clusters.
+In a campus, thousands and more devices may contribute computing resources to the same training tasks.
+However, these devices may located in far not matter in physical or in network topology.
+How can we well use them well, without struggled with endless transmission time remains a challenge.
+
+
The third issue is frequently joining and exiting of devices.
+We can’t rely on each devices to faithfully working on training tasks rather than their original workload.
+Smartly schedule work balance and handle join/exit issues also need under consideration.
+
+
Our proposal
+
+
+
+
Dynamic training data distribution and runtime profiler
+
+
We design a dynamic training data distribution mechanism that helps to both the first and the third challenges.
+ Preprocessing data can be transmitted without leakage of raw sensitive information.
+ This can helps with struggling workers who can train small batches in order to upload parameters with a similar training time.
+ Also, for extremely slow devices, join and exit of devices cases, dynamic data distribution and profiler can helps with keep global training parameters from polluted and staleness.
+
+
To counter heterogeneity’s, more approaches were applied in our later research.
+ More details were introduced to runtime profiler in the later works.
+
+
+
Asynchronous and synchronous aggregation enabled
+
+
In our findings, asynchronous and synchronous parameter update have their pros and cons.
+ Keeping sync all the time leads struggling worker issue unsolvable.
+ However, async’s harm to accuracy and convergence time also need attentions.
+ To carefully chose between these two update policies at the runtime is what we proposed to make use of their own advantages.
+
+
+
Leader role splitting
+
+
The idea is to let worker devices with higher bandwidth taking leader role during training.
+ Parameter updating does not require much computation but only need bandwidth.
+ Devices with sufficient bandwidth can also work as virtual leader devices.
+ This approach helps with minimize physical devices we used and more leaders can further scale up workers limits.
Let’s generate a word cloud like this.
+Don’t understand the language is not a big deal.
+If your written language is based on latin alphabet(or other language has space between words), skip tokenization.
+
+
+
+
Background
+
+
Recently, I set up a web-based RSS client for retrieving and organizing everyday news. I used TinyTinyRSS, or as ttrss, a popular RSS client which friendly to docker. Thanks to developer HenryQW, a well-written Nginx-based docker configuration is already available in docker hub. With more feeds were added, I found some feeds does not need to be checked everyday. Thus I was thinking to create a script to automatically list all keywords appears in a last period and generate a heat map kind figure of it.
+
+
Before you go further, I’ll tell you all my settings to give readers a general overview.
+
+
My first step is to read all text-based information from TTRSS’s PostgreSQL database. With information, I used a Chinese-NLP library, jieba, to extract all keyword with their occurrences frequency. By using WordCloud, a python library, word cloud figure is generated and present. More details will be discussed in later sections.
+
+
Get RSS feeds’ text
+
+
My first thought is generating a keyword heat map for economy news of a last week. Since this blog post are more skewed to Chinese tokenization and draw the word cloud figure. I’ll leave my code here just in case. The SQL connector I used is psycopg2, an easy-use PostgreSQL library.
+
+
def__init__(self):
+ self.dbe=psycopg2.connect(
+ host=DB_HOST,port=DB_PORT,database=DB_NAME,user=DB_USER,password=DB_PASS)
+
+defget_1w_of_feed_byid(self,id=1)->list:
+ cur=self.dbe.cursor()
+ cur.execute('SELECT content FROM public.ttrss_entries \
+ where date_updated > now() - interval \'1 week\' AND id in ( \
+ select int_id from DB_TABLE_NAME \
+ where feed_id='+str(id)+' \
+ ) \
+ ORDER BY id ASC '
+ )
+ rows=cur.fetchall()
+ returnrows
+
+
+
Most arguments are intuitive and easy to understand. The only exception is argument of function get_1w_of_feed_byid. This id is the feed index of my subscriptions.
+
+
Tokenize with frequency
+
+
Two popular tokenization library were used, and I chose jieba after a few comparison. Before cutting the sentence, we first need to remove all punctuation marks.
After we have an all characters string, we can call jieba. By using the function jieba.posseg.cut with or without paddle, we can have a word list and their “part of speech”. As you can see in the following code, I also did two more works.
+
+
First, in the if statement, I only kept all nouns with some categories. Category abbreviation such as “nr” and “ns” represent different “part of speech”, I attached with categories I used in the following table. For more details you can find in this link.
+
+
The second work is only keeping words with length longer than 2 characters. In Chinese, there’s no space between words such as Latin writing systems. Since then, some single-character-words such as conjunction words are easy to be misrecognized as specialty-noun. And this misrecognition will cause more single-character being regarded as specialty-noun. I am not able to improve NLP method, so I used a easy way to fix this by removing any words less than 2 characters.
With all words extracted, we can easily calculate their frequencies. After this, we can using the following line of code to print a sorted result to verify correctness.
+
+
noun=seg.get_noun_jieba(test_content)
+# ... Calculate frequency of above word list ...
+print(sorted(a_dict.items(),key=lambdax:x[1]))
+
+
+
Draw word cloud
+
+
With a keyword and frequency dictionary(data structure), we can just call built-in functions from wordcloud library to generate the figure.
+
+
First we need to initialize an instance of wordcloud class. As you can see in my code, I set it with 6 parameters. Width and Height of the canvas, maximum amount of words used to generate the figure, the font of words, background color and margin between any two words.
+
+
After having the instance, we call function generate_from_frequencies and pass keyword dictionary to it. The return value of this function is an bitmap image, which we can use matplotlib to plot it to your screen.
+
+
I tested my plot on ubuntu-subsystem on Windows 10, unfortunately matplotlib under subsystem depends on x11 window manager and its not default available on windows. We need to install an x11 manager to support. Xming is the one I used.
If everything work fine, a word cloud figure will show up in a new window. My version looks like this.
+
+
+
+
This generated word cloud figure reflects the most popular economy news’ keyword in the week started 06-28-2020. Two largest words in the figure are “新冠” and “新冠病毒”, both means “Covid-19” (This figure was in the week of the second covid spur in Beijing, China). The size of the image fits my phone screen and I can use an app to automatic sync it to my phone’s wallpaper. However, in this image, too many location nouns are presented. This will be something I can make progress on in the future.
In this post, you will learn a few basic concepts of xv6. Learning path will be closed coupled to first project assignment I gave when I assisted in teaching OS classes.
+Understand system call and know how to implement a simple one will be coved as the first half.
+In the second half of this post, I will discuss a little bit more on how to debug xv6 using gdb.
+
+
Xv6 Systemcall
+
+
To invoke a system call, we have to first define a user mode function to be the interface of the kernel instruction in file user.h.
+
+
voidfunction(void);
+
+
+
This interface-like function will then pass the function name, in this case function, to usys.S. When using user mode function in programs, usys.S will generate a reference to SYS_function and push system call number of this function into %eax. After that, system can know from syscall.c and determining whether this system call is available. We must define same name system function and add it into syscall.h and syscall.c.
+
+
#define SYS_function ## // ## is the system call number
+[SYS_function]sys_function// real system function name
+externintsys_function(void);// real system function declaration
+
+
+
After adding these sentences to syscall files, we can implement real function in specific place where you want to make the function works well.
+
+
Sometimes, we need to pass variables among system calls. In this case, variables’ values are not necessary and even can’t be pass directly into system_function. When invoke a system call function, all variables of this system call will be pushed into current process’ stack. In file syscall.c, multiple functions are provided to get these variables from the process. I won’t waste time on explaining how to use these functions especially when elegant and detailed comments were written in source codes. However, I will explain concepts and how process organized and works in xv6 in future articles.
+
+
Debug xv6 with gdb
+
+
Please make sure that you have used gdb before.
+If you never used gdb, you may write a simple 50-100 lines c code and practice how to use gdb first.
To make sure xv6 gdb enabled, please check if .gdbinit.tmpl file exist.
+This file is used for generate .gdbinit file which you can late consider it as a configuration for gdb.
+
+
Before running the xv6 instance in QEMU, one more thing you need to know is that using gdb to debug xv6 must be attached remotely.
+This is because xv6 was running within QEMU, and emulator is virtually gapped from the host device.
+Later when you start debugging, QEMU will open a gdb server to let gdb client connect to.
+
+
Once you want to start, using following command to compile and run xv6
+
+
$ make qemu-nox-gdb
+*** Now run 'gdb'.
+qemu-system-i386 -nographic-drivefile=fs.img,index=1,media=disk,format=raw -drivefile=xv6.img,index=0,media=disk,format=raw -smp 2 7
+
+
+
At this moment, it feels xv6 was stuck, this is because QEMU is ready to be connected by the gdb client.
+You may use the .gdbinit to automatically finish this remote connection by simple typein following command in another terminal.
+
+
$ gdb -x .gdbinit
+GNU gdb (Debian 8.2.1-2+b3) 8.2.1
+
+...
+
+The target architecture is assumed to be i8086
+[f000:fff0] 0xffff0: ljmp $0x3630,$0xf000e05b
+0x0000fff0 in ?? ()
++ symbol-file kernel
+warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
+of GDB. Attempting to continue with the default i8086 settings.
+
+(gdb)
+
+
+
Now within this gdb client shell, type ‘c’ to continue the xv6, and you will see xv6 start execution in the first terminal.
+
+
At this moment, you may add breakpoints to your code to see if your code is correctly implemented or not.
+
+
One more thing, if you open .gdbinit file, you’ll find that it by default connect to a localhost target.
+If you are working on some other environment that target and client were not placed in the same device, change the localhost to ip address correspondingly.
+Using ssh may connect to different physical devices under same domain name, this is because load balancer were used. To check ip address, search command ip.
This blog contains only some basic record of my works. For some details, I will write a unique blog just for some specific topics.
+
+
2016-10
+
+
Time Experiment of rsync
+
+
Patch is based on rsync with version 3.1.2. [Rsync|Patch]
+
+
How to collect data
+
+
Basically, everything of transmission time and computation time will be output with overall time will be printed on the console.
+But we also need some bash script to collect data through different size of random size and with different modification through them.
+
+
+
Start from 8K to 64M, modify at beginning, [Bash script]
+
Start from 8K to 64M, modify at last, [Bash script]
+
Start from 8K to 64M, modify at random place with a (slow) python script, [Bash script|Python program]
We also need everything be done using scripting. But this time I only design added some distance between two increasing files’ sizes.
+
+
+
Start from 8K to 16M, 4 times increasing, modify at beginning/ at 1024 different places with python script. [Bash Script|Python program]
+
After using this auto testing script, everything of output will be marked in log files of seafile, which located in ~/.ccnet/log/seafile.log
+
We need to use this simple awk code and vim operation to extract data.
+
+
+
# CDC: content defined chucks
+# HUT: Http upload traffic
+# ALL: overall time of one commit & upload
+awk'/CDC|HUT|ALL/ {print $4,$5}' ~/.ccnet/log/seafile.log > results.stat
+
+
+
Install Seafile on odroid xu
+
+
Due to failure of my cross-compile to seafile on android. I used develop board as a replacement experiment platform for ARM-seafile testing. I used a odroid xu as hardware standard. Because all I need is an ARM platform, only an ARM-Ubuntu is enough for me. But develop prototype on a board is much fun than coding, I won’t address much this time. But I’ll start a blog telling some really cool stuff I made for a strange aim.
+
+
To install a ubuntu with GUI is my all preparation work. I found to way to do this.
+
+
+
+
armhf is a website for arm-based ubuntu. It has a detailed instruction to follow at here. They also provide ubuntu 12.04/ 14.04 and debian 7.5 to choose. But unfortunately odroid xu’s hdmi output doesn’t supported by ubuntu native firmware. So install ubuntu-desktop might can’t be boot up for video output.
+
+
+
Burn images is much easy to install a pre-complied ubuntu system. I found this on odroid xu’s forum, which contains xubuntu image [download] for odroid xu. With this image, you just need to use dd command to write whole system mirror into sdcard.
+
+
+
+
# If .img end with xz, use this command to uncompress first
+unxz ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img.xz
+# Burn image into SD-card
+sudo dd if=ubuntu-14.04lts-xubuntu-odroid-xu-20140714.img of=/dev/sdb bs=1M conv=fsync
+sync
+
+
+
2016-11
+
+
Android Kernel
+
+
How to build an Android Kernel?
+
+
Generally, I won’t tell anything in this parts, just mark some related links, and point out some mistakes or error solutions.
+
+
+
+
Google Official Guide
+– If you don’t have AOSP sources, you have to download prebuilt toolchains which recommended in this guide might not be correct. Use following links to choose your fitting tools.
+— ASOP git root, under sub class “/platform/prebuilts/gcc”
If we want to debug under android, ftrace is a great tool for working. But, ftrace is not available in android if we used default configure file. Android kernel configuration is in arch/arm64/kernel/configs. We need to add few lines under that.
If we want to hold a rooted status after flashing boot, we need to extract an image from android devices. We can first use following command to find which blocks belongs to. According to some references, this article provide three ways to dump an image, I picked one for easy using.