diff --git a/.gitmodules b/.gitmodules
index 105930d..bbb3b49 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
-[submodule "themes/alberta-eniac111"]
- path = themes/alberta-eniac111
- url = https://github.com/eniac111/hexo-theme-alberta
+[submodule "themes/hugo.386"]
+ path = themes/hugo.386
+ url = https://gitlab.com/maxlefou/hugo.386
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index e24dc14..0000000
--- a/_config.yml
+++ /dev/null
@@ -1,86 +0,0 @@
-# Hexo Configuration
-## Docs: http://hexo.io/docs/configuration.html
-## Source: https://github.com/hexojs/hexo/
-
-# Site
-title: Blagovest Petrov's blog
-subtitle:
-description:
-author: Blagovest Petrov
-language: en
-timezone: Europe/Sofia
-
-# Feed
-feed:
- type: atom
- path: atom.xml
- limit: 20
-
-# URL
-## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
-url: http://petrovs.info
-root: /
-permalink: :year/:month/:day/:title/
-permalink_defaults:
-
-# Directory
-source_dir: source
-public_dir: public
-tag_dir: tags
-archive_dir: archives
-category_dir: categories
-code_dir: downloads/code
-i18n_dir: :lang
-skip_render:
-
-# Writing
-new_post_name: :year-:month-:day-:title.md # File name of new posts
-default_layout: post
-titlecase: false # Transform title into titlecase
-external_link: true # Open external links in new tab
-filename_case: 0
-render_drafts: false
-post_asset_folder: true
-relative_link: false
-future: true
-highlight:
- enable: true
- line_number: true
- auto_detect: true
- tab_replace:
-
-# Category & Tag
-default_category: uncategorized
-category_map:
-tag_map:
-
-# Date / Time format
-## Hexo uses Moment.js to parse and display date
-## You can customize the date format as defined in
-## http://momentjs.com/docs/#/displaying/format/
-date_format: YYYY-MM-DD
-time_format: HH:mm:ss
-
-# Pagination
-## Set per_page to 0 to disable pagination
-per_page: 10
-pagination_dir: page
-
-# Extensions
-## Plugins: http://hexo.io/plugins/
-## Themes: http://hexo.io/themes/
-theme: transquilpeak
-
-plugins:
- -hexo-generator-cname
-
-# Disqus
-disqus_shortname: blagosblog
-
-# Deployment
-## Docs: http://hexo.io/docs/deployment.html
-deploy:
- type: git
- repo: git@github.com:eniac111/eniac111.github.io.git
- branch: master
-
diff --git a/config.toml b/config.toml
new file mode 100644
index 0000000..edde2f5
--- /dev/null
+++ b/config.toml
@@ -0,0 +1,93 @@
+baseURL = "https://petrovs.info"
+title = "Blago's blog"
+languageCode = "en"
+DefaultContentLanguage = "en" # Change this to change the site's language
+theme = "hugo.386"
+preserveTaxonomyNames = true
+
+[params]
+ # The name to display as main title in the home page
+ mainpagetitle = "Home"
+
+ # The subtitle to display under the title in the home page
+ mainpagesubtitle = "Just another personal blog about system administration and stuff"
+
+ # The description of your website. It will be displayed in the home page
+ mainpagedesc = ""
+
+ # Enables or disables the loading animations. false activates them. Default is false.
+ loadfastload = false
+
+ # Sets the speed for the page loading effect. Default is 1.0.
+ loadspeedfactor = 2.0
+
+ # Enables or disables the second flyby cursor. Default is false.
+ loadonepass = false
+
+[menu]
+ # This displays buttons in the navbar to access your contents
+ [[menu.main]]
+ identifier = "about" # An unique identifier for the button
+ name = "About" # A display name for the button
+ url = "/about/" # The path to the content. It can lead to a single page (like here)
+ weight = 10 # A number to order the buttons in the navbar
+
+ [[menu.main]]
+ identifier = "posts"
+ name = "All posts"
+ url = "/post/" # The path can lead to a content folder too.
+ weight = 20
+
+ [[menu.main]]
+ identifier = "code"
+ name = "Code"
+ url = "https://code.petrovs.info/explore/repos"
+ weight = 30
+ hrefTargetBlank = true
+
+ [[menu.main]]
+ identifier = "linkedin"
+ name = "Linkedin"
+ url = "https://www.linkedin.com/in/blpetrov/"
+ weight = 30
+ hrefTargetBlank = true
+
+ [[menu.main]]
+ identifier = "fediverse"
+ name = "Fediverse"
+ url = "https://social.petrovs.info/@blagovest"
+ weight = 30
+ hrefTargetBlank = true
+
+[taxonomies]
+category = "categories"
+tag = "tags"
+
+
+[privacy]
+
+ [privacy.vimeo]
+ disabled = false
+ simple = true
+
+ [privacy.twitter]
+ disabled = false
+ enableDNT = true
+ simple = true
+
+ [privacy.instagram]
+ disabled = false
+ simple = true
+
+ [privacy.youtube]
+ disabled = false
+ privacyEnhanced = true
+
+[services]
+
+ [services.instagram]
+ disableInlineCSS = true
+
+ [services.twitter]
+ disableInlineCSS = true
+
diff --git a/content/about/img/avatar.png b/content/about/img/avatar.png
new file mode 100644
index 0000000..7340144
Binary files /dev/null and b/content/about/img/avatar.png differ
diff --git a/content/about/img/kayak.gif b/content/about/img/kayak.gif
new file mode 100644
index 0000000..56dcb33
Binary files /dev/null and b/content/about/img/kayak.gif differ
diff --git a/content/about/index.md b/content/about/index.md
new file mode 100644
index 0000000..7817deb
--- /dev/null
+++ b/content/about/index.md
@@ -0,0 +1,8 @@
+
+![Me](img/avatar.png) My name is Blagovest Petrov and this is my personal blog. Here I'm writing mainly about Linux, System Administration and DevOps. The purpose of most of the posts is to track what I have done over the years for myself.
+
+Currently I'm working as a DevOps Engineer at [AtScale](https://www.atscale.com/).
+
+![kayak](img/kayak.gif)
+
+In my free time I like to go kayaking on dams or to the Greek seasisde, visiting music festivals, working on DIY projects, etc.. :)
\ No newline at end of file
diff --git a/source/images/.directory b/content/images/.directory
similarity index 100%
rename from source/images/.directory
rename to content/images/.directory
diff --git a/source/images/404monkey.png b/content/images/404monkey.png
similarity index 100%
rename from source/images/404monkey.png
rename to content/images/404monkey.png
diff --git a/source/images/PerlInTheOffice/foodotodt.png b/content/images/PerlInTheOffice/foodotodt.png
similarity index 100%
rename from source/images/PerlInTheOffice/foodotodt.png
rename to content/images/PerlInTheOffice/foodotodt.png
diff --git a/source/images/Posts/SlaveykovHall/salle.jpg b/content/images/Posts/SlaveykovHall/salle.jpg
similarity index 100%
rename from source/images/Posts/SlaveykovHall/salle.jpg
rename to content/images/Posts/SlaveykovHall/salle.jpg
diff --git a/source/images/WinXPVirtRecovery/'.png b/content/images/WinXPVirtRecovery/'.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/'.png
rename to content/images/WinXPVirtRecovery/'.png
diff --git a/source/images/WinXPVirtRecovery/1.png b/content/images/WinXPVirtRecovery/1.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/1.png
rename to content/images/WinXPVirtRecovery/1.png
diff --git a/source/images/WinXPVirtRecovery/10.png b/content/images/WinXPVirtRecovery/10.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/10.png
rename to content/images/WinXPVirtRecovery/10.png
diff --git a/source/images/WinXPVirtRecovery/11.png b/content/images/WinXPVirtRecovery/11.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/11.png
rename to content/images/WinXPVirtRecovery/11.png
diff --git a/source/images/WinXPVirtRecovery/12.png b/content/images/WinXPVirtRecovery/12.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/12.png
rename to content/images/WinXPVirtRecovery/12.png
diff --git a/source/images/WinXPVirtRecovery/13.png b/content/images/WinXPVirtRecovery/13.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/13.png
rename to content/images/WinXPVirtRecovery/13.png
diff --git a/source/images/WinXPVirtRecovery/14.png b/content/images/WinXPVirtRecovery/14.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/14.png
rename to content/images/WinXPVirtRecovery/14.png
diff --git a/source/images/WinXPVirtRecovery/15.png b/content/images/WinXPVirtRecovery/15.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/15.png
rename to content/images/WinXPVirtRecovery/15.png
diff --git a/source/images/WinXPVirtRecovery/2.png b/content/images/WinXPVirtRecovery/2.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/2.png
rename to content/images/WinXPVirtRecovery/2.png
diff --git a/source/images/WinXPVirtRecovery/3.png b/content/images/WinXPVirtRecovery/3.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/3.png
rename to content/images/WinXPVirtRecovery/3.png
diff --git a/source/images/WinXPVirtRecovery/4.png b/content/images/WinXPVirtRecovery/4.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/4.png
rename to content/images/WinXPVirtRecovery/4.png
diff --git a/source/images/WinXPVirtRecovery/5.png b/content/images/WinXPVirtRecovery/5.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/5.png
rename to content/images/WinXPVirtRecovery/5.png
diff --git a/source/images/WinXPVirtRecovery/6.png b/content/images/WinXPVirtRecovery/6.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/6.png
rename to content/images/WinXPVirtRecovery/6.png
diff --git a/source/images/WinXPVirtRecovery/7.png b/content/images/WinXPVirtRecovery/7.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/7.png
rename to content/images/WinXPVirtRecovery/7.png
diff --git a/source/images/WinXPVirtRecovery/8.png b/content/images/WinXPVirtRecovery/8.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/8.png
rename to content/images/WinXPVirtRecovery/8.png
diff --git a/source/images/WinXPVirtRecovery/9.png b/content/images/WinXPVirtRecovery/9.png
similarity index 100%
rename from source/images/WinXPVirtRecovery/9.png
rename to content/images/WinXPVirtRecovery/9.png
diff --git a/source/images/avatar.jpg b/content/images/avatar.jpg
similarity index 100%
rename from source/images/avatar.jpg
rename to content/images/avatar.jpg
diff --git a/source/images/bird_32_gray.png b/content/images/bird_32_gray.png
similarity index 100%
rename from source/images/bird_32_gray.png
rename to content/images/bird_32_gray.png
diff --git a/source/images/bird_32_gray_fail.png b/content/images/bird_32_gray_fail.png
similarity index 100%
rename from source/images/bird_32_gray_fail.png
rename to content/images/bird_32_gray_fail.png
diff --git a/source/images/checkbox-2x.png b/content/images/checkbox-2x.png
similarity index 100%
rename from source/images/checkbox-2x.png
rename to content/images/checkbox-2x.png
diff --git a/source/images/checkbox.png b/content/images/checkbox.png
similarity index 100%
rename from source/images/checkbox.png
rename to content/images/checkbox.png
diff --git a/source/images/code_bg.png b/content/images/code_bg.png
similarity index 100%
rename from source/images/code_bg.png
rename to content/images/code_bg.png
diff --git a/source/images/cooking/bruschettes/a.jpg b/content/images/cooking/bruschettes/a.jpg
similarity index 100%
rename from source/images/cooking/bruschettes/a.jpg
rename to content/images/cooking/bruschettes/a.jpg
diff --git a/source/images/cooking/bruschettes/b.jpg b/content/images/cooking/bruschettes/b.jpg
similarity index 100%
rename from source/images/cooking/bruschettes/b.jpg
rename to content/images/cooking/bruschettes/b.jpg
diff --git a/source/images/cooking/bruschettes/c.jpg b/content/images/cooking/bruschettes/c.jpg
similarity index 100%
rename from source/images/cooking/bruschettes/c.jpg
rename to content/images/cooking/bruschettes/c.jpg
diff --git a/source/images/cooking/bruschettes/d.jpg b/content/images/cooking/bruschettes/d.jpg
similarity index 100%
rename from source/images/cooking/bruschettes/d.jpg
rename to content/images/cooking/bruschettes/d.jpg
diff --git a/source/images/cooking/bruschettes/e.jpg b/content/images/cooking/bruschettes/e.jpg
similarity index 100%
rename from source/images/cooking/bruschettes/e.jpg
rename to content/images/cooking/bruschettes/e.jpg
diff --git a/source/images/cooking/bruschettes/f.jpg b/content/images/cooking/bruschettes/f.jpg
similarity index 100%
rename from source/images/cooking/bruschettes/f.jpg
rename to content/images/cooking/bruschettes/f.jpg
diff --git a/source/images/cooking/patatnik/a.jpg b/content/images/cooking/patatnik/a.jpg
similarity index 100%
rename from source/images/cooking/patatnik/a.jpg
rename to content/images/cooking/patatnik/a.jpg
diff --git a/source/images/cooking/patatnik/b.jpg b/content/images/cooking/patatnik/b.jpg
similarity index 100%
rename from source/images/cooking/patatnik/b.jpg
rename to content/images/cooking/patatnik/b.jpg
diff --git a/source/images/cooking/patatnik/c.jpg b/content/images/cooking/patatnik/c.jpg
similarity index 100%
rename from source/images/cooking/patatnik/c.jpg
rename to content/images/cooking/patatnik/c.jpg
diff --git a/source/images/cooking/patatnik/d.jpg b/content/images/cooking/patatnik/d.jpg
similarity index 100%
rename from source/images/cooking/patatnik/d.jpg
rename to content/images/cooking/patatnik/d.jpg
diff --git a/source/images/cooking/patatnik/e.jpg b/content/images/cooking/patatnik/e.jpg
similarity index 100%
rename from source/images/cooking/patatnik/e.jpg
rename to content/images/cooking/patatnik/e.jpg
diff --git a/source/images/cooking/patatnik/f.jpg b/content/images/cooking/patatnik/f.jpg
similarity index 100%
rename from source/images/cooking/patatnik/f.jpg
rename to content/images/cooking/patatnik/f.jpg
diff --git a/source/images/cooking/patatnik/g.jpg b/content/images/cooking/patatnik/g.jpg
similarity index 100%
rename from source/images/cooking/patatnik/g.jpg
rename to content/images/cooking/patatnik/g.jpg
diff --git a/source/images/cooking/patatnik/h.jpg b/content/images/cooking/patatnik/h.jpg
similarity index 100%
rename from source/images/cooking/patatnik/h.jpg
rename to content/images/cooking/patatnik/h.jpg
diff --git a/source/images/cooking/patatnik/i.jpg b/content/images/cooking/patatnik/i.jpg
similarity index 100%
rename from source/images/cooking/patatnik/i.jpg
rename to content/images/cooking/patatnik/i.jpg
diff --git a/source/images/cooking/patatnik/j.jpg b/content/images/cooking/patatnik/j.jpg
similarity index 100%
rename from source/images/cooking/patatnik/j.jpg
rename to content/images/cooking/patatnik/j.jpg
diff --git a/source/images/cooking/patatnik/k.jpg b/content/images/cooking/patatnik/k.jpg
similarity index 100%
rename from source/images/cooking/patatnik/k.jpg
rename to content/images/cooking/patatnik/k.jpg
diff --git a/source/images/cooking/patatnik/l.jpg b/content/images/cooking/patatnik/l.jpg
similarity index 100%
rename from source/images/cooking/patatnik/l.jpg
rename to content/images/cooking/patatnik/l.jpg
diff --git a/source/images/cooking/patatnik/tadaa.jpg b/content/images/cooking/patatnik/tadaa.jpg
similarity index 100%
rename from source/images/cooking/patatnik/tadaa.jpg
rename to content/images/cooking/patatnik/tadaa.jpg
diff --git a/source/images/dotted-border.png b/content/images/dotted-border.png
similarity index 100%
rename from source/images/dotted-border.png
rename to content/images/dotted-border.png
diff --git a/source/images/email.png b/content/images/email.png
similarity index 100%
rename from source/images/email.png
rename to content/images/email.png
diff --git a/source/images/fancybox/blank.gif b/content/images/fancybox/blank.gif
similarity index 100%
rename from source/images/fancybox/blank.gif
rename to content/images/fancybox/blank.gif
diff --git a/source/images/fancybox/fancybox_loading.gif b/content/images/fancybox/fancybox_loading.gif
similarity index 100%
rename from source/images/fancybox/fancybox_loading.gif
rename to content/images/fancybox/fancybox_loading.gif
diff --git a/source/images/fancybox/fancybox_sprite.png b/content/images/fancybox/fancybox_sprite.png
similarity index 100%
rename from source/images/fancybox/fancybox_sprite.png
rename to content/images/fancybox/fancybox_sprite.png
diff --git a/source/images/favicon.ico b/content/images/favicon.ico
similarity index 100%
rename from source/images/favicon.ico
rename to content/images/favicon.ico
diff --git a/source/images/gmail-github.png b/content/images/gmail-github.png
similarity index 100%
rename from source/images/gmail-github.png
rename to content/images/gmail-github.png
diff --git a/source/images/horse-screenshot.png b/content/images/horse-screenshot.png
similarity index 100%
rename from source/images/horse-screenshot.png
rename to content/images/horse-screenshot.png
diff --git a/source/images/illustrations/bag.png b/content/images/illustrations/bag.png
similarity index 100%
rename from source/images/illustrations/bag.png
rename to content/images/illustrations/bag.png
diff --git a/source/images/illustrations/book.png b/content/images/illustrations/book.png
similarity index 100%
rename from source/images/illustrations/book.png
rename to content/images/illustrations/book.png
diff --git a/source/images/illustrations/calendar.png b/content/images/illustrations/calendar.png
similarity index 100%
rename from source/images/illustrations/calendar.png
rename to content/images/illustrations/calendar.png
diff --git a/source/images/illustrations/clipboard.png b/content/images/illustrations/clipboard.png
similarity index 100%
rename from source/images/illustrations/clipboard.png
rename to content/images/illustrations/clipboard.png
diff --git a/source/images/illustrations/colors.png b/content/images/illustrations/colors.png
similarity index 100%
rename from source/images/illustrations/colors.png
rename to content/images/illustrations/colors.png
diff --git a/source/images/illustrations/compass.png b/content/images/illustrations/compass.png
similarity index 100%
rename from source/images/illustrations/compass.png
rename to content/images/illustrations/compass.png
diff --git a/source/images/illustrations/gift.png b/content/images/illustrations/gift.png
similarity index 100%
rename from source/images/illustrations/gift.png
rename to content/images/illustrations/gift.png
diff --git a/source/images/illustrations/infinity.png b/content/images/illustrations/infinity.png
similarity index 100%
rename from source/images/illustrations/infinity.png
rename to content/images/illustrations/infinity.png
diff --git a/source/images/illustrations/mail.png b/content/images/illustrations/mail.png
similarity index 100%
rename from source/images/illustrations/mail.png
rename to content/images/illustrations/mail.png
diff --git a/source/images/illustrations/map.png b/content/images/illustrations/map.png
similarity index 100%
rename from source/images/illustrations/map.png
rename to content/images/illustrations/map.png
diff --git a/source/images/illustrations/paper.png b/content/images/illustrations/paper.png
similarity index 100%
rename from source/images/illustrations/paper.png
rename to content/images/illustrations/paper.png
diff --git a/source/images/illustrations/retina.png b/content/images/illustrations/retina.png
similarity index 100%
rename from source/images/illustrations/retina.png
rename to content/images/illustrations/retina.png
diff --git a/source/images/illustrations/share.png b/content/images/illustrations/share.png
similarity index 100%
rename from source/images/illustrations/share.png
rename to content/images/illustrations/share.png
diff --git a/source/images/illustrations/time.png b/content/images/illustrations/time.png
similarity index 100%
rename from source/images/illustrations/time.png
rename to content/images/illustrations/time.png
diff --git a/source/images/line-tile.png b/content/images/line-tile.png
similarity index 100%
rename from source/images/line-tile.png
rename to content/images/line-tile.png
diff --git a/source/images/loading_gray.gif b/content/images/loading_gray.gif
similarity index 100%
rename from source/images/loading_gray.gif
rename to content/images/loading_gray.gif
diff --git a/source/images/loading_pacman.gif b/content/images/loading_pacman.gif
similarity index 100%
rename from source/images/loading_pacman.gif
rename to content/images/loading_pacman.gif
diff --git a/source/images/login/icon.png b/content/images/login/icon.png
similarity index 100%
rename from source/images/login/icon.png
rename to content/images/login/icon.png
diff --git a/source/images/login/imac-2x.png b/content/images/login/imac-2x.png
similarity index 100%
rename from source/images/login/imac-2x.png
rename to content/images/login/imac-2x.png
diff --git a/source/images/login/imac.png b/content/images/login/imac.png
similarity index 100%
rename from source/images/login/imac.png
rename to content/images/login/imac.png
diff --git a/source/images/lxccluster/diagram1.dia b/content/images/lxccluster/diagram1.dia
similarity index 100%
rename from source/images/lxccluster/diagram1.dia
rename to content/images/lxccluster/diagram1.dia
diff --git a/source/images/lxccluster/diagram1.jpeg b/content/images/lxccluster/diagram1.jpeg
similarity index 100%
rename from source/images/lxccluster/diagram1.jpeg
rename to content/images/lxccluster/diagram1.jpeg
diff --git a/source/images/nebopassgen.png b/content/images/nebopassgen.png
similarity index 100%
rename from source/images/nebopassgen.png
rename to content/images/nebopassgen.png
diff --git a/source/images/noise.png b/content/images/noise.png
similarity index 100%
rename from source/images/noise.png
rename to content/images/noise.png
diff --git a/source/images/pager/next.png b/content/images/pager/next.png
similarity index 100%
rename from source/images/pager/next.png
rename to content/images/pager/next.png
diff --git a/source/images/pager/previous.png b/content/images/pager/previous.png
similarity index 100%
rename from source/images/pager/previous.png
rename to content/images/pager/previous.png
diff --git a/source/images/radio-2x.png b/content/images/radio-2x.png
similarity index 100%
rename from source/images/radio-2x.png
rename to content/images/radio-2x.png
diff --git a/source/images/radio.png b/content/images/radio.png
similarity index 100%
rename from source/images/radio.png
rename to content/images/radio.png
diff --git a/source/images/rss.png b/content/images/rss.png
similarity index 100%
rename from source/images/rss.png
rename to content/images/rss.png
diff --git a/source/images/sativa.png b/content/images/sativa.png
similarity index 100%
rename from source/images/sativa.png
rename to content/images/sativa.png
diff --git a/source/images/search.png b/content/images/search.png
similarity index 100%
rename from source/images/search.png
rename to content/images/search.png
diff --git a/source/images/security_usability.png b/content/images/security_usability.png
similarity index 100%
rename from source/images/security_usability.png
rename to content/images/security_usability.png
diff --git a/source/images/security_usability.svg b/content/images/security_usability.svg
similarity index 100%
rename from source/images/security_usability.svg
rename to content/images/security_usability.svg
diff --git a/source/images/select/toggle.png b/content/images/select/toggle.png
similarity index 100%
rename from source/images/select/toggle.png
rename to content/images/select/toggle.png
diff --git a/source/images/social/coderwall.png b/content/images/social/coderwall.png
similarity index 100%
rename from source/images/social/coderwall.png
rename to content/images/social/coderwall.png
diff --git a/source/images/social/delicious.png b/content/images/social/delicious.png
similarity index 100%
rename from source/images/social/delicious.png
rename to content/images/social/delicious.png
diff --git a/source/images/social/facebook.png b/content/images/social/facebook.png
similarity index 100%
rename from source/images/social/facebook.png
rename to content/images/social/facebook.png
diff --git a/source/images/social/github.png b/content/images/social/github.png
similarity index 100%
rename from source/images/social/github.png
rename to content/images/social/github.png
diff --git a/source/images/social/google.png b/content/images/social/google.png
similarity index 100%
rename from source/images/social/google.png
rename to content/images/social/google.png
diff --git a/source/images/social/instagram.png b/content/images/social/instagram.png
similarity index 100%
rename from source/images/social/instagram.png
rename to content/images/social/instagram.png
diff --git a/source/images/social/linkedin.png b/content/images/social/linkedin.png
similarity index 100%
rename from source/images/social/linkedin.png
rename to content/images/social/linkedin.png
diff --git a/source/images/social/pinboard.png b/content/images/social/pinboard.png
similarity index 100%
rename from source/images/social/pinboard.png
rename to content/images/social/pinboard.png
diff --git a/source/images/social/pinterest.png b/content/images/social/pinterest.png
similarity index 100%
rename from source/images/social/pinterest.png
rename to content/images/social/pinterest.png
diff --git a/source/images/social/rss.png b/content/images/social/rss.png
similarity index 100%
rename from source/images/social/rss.png
rename to content/images/social/rss.png
diff --git a/source/images/social/twitter.png b/content/images/social/twitter.png
similarity index 100%
rename from source/images/social/twitter.png
rename to content/images/social/twitter.png
diff --git a/source/images/tile/ribbon-2x.png b/content/images/tile/ribbon-2x.png
similarity index 100%
rename from source/images/tile/ribbon-2x.png
rename to content/images/tile/ribbon-2x.png
diff --git a/source/images/tile/ribbon.png b/content/images/tile/ribbon.png
similarity index 100%
rename from source/images/tile/ribbon.png
rename to content/images/tile/ribbon.png
diff --git a/source/images/todo/done-2x.png b/content/images/todo/done-2x.png
similarity index 100%
rename from source/images/todo/done-2x.png
rename to content/images/todo/done-2x.png
diff --git a/source/images/todo/done.png b/content/images/todo/done.png
similarity index 100%
rename from source/images/todo/done.png
rename to content/images/todo/done.png
diff --git a/source/images/todo/search-2x.png b/content/images/todo/search-2x.png
similarity index 100%
rename from source/images/todo/search-2x.png
rename to content/images/todo/search-2x.png
diff --git a/source/images/todo/search.png b/content/images/todo/search.png
similarity index 100%
rename from source/images/todo/search.png
rename to content/images/todo/search.png
diff --git a/source/images/todo/todo-2x.png b/content/images/todo/todo-2x.png
similarity index 100%
rename from source/images/todo/todo-2x.png
rename to content/images/todo/todo-2x.png
diff --git a/source/images/todo/todo.png b/content/images/todo/todo.png
similarity index 100%
rename from source/images/todo/todo.png
rename to content/images/todo/todo.png
diff --git a/source/images/toggle/block-off.png b/content/images/toggle/block-off.png
similarity index 100%
rename from source/images/toggle/block-off.png
rename to content/images/toggle/block-off.png
diff --git a/source/images/toggle/block-on.png b/content/images/toggle/block-on.png
similarity index 100%
rename from source/images/toggle/block-on.png
rename to content/images/toggle/block-on.png
diff --git a/source/images/toggle/icon-off-2x.png b/content/images/toggle/icon-off-2x.png
similarity index 100%
rename from source/images/toggle/icon-off-2x.png
rename to content/images/toggle/icon-off-2x.png
diff --git a/source/images/toggle/icon-off.png b/content/images/toggle/icon-off.png
similarity index 100%
rename from source/images/toggle/icon-off.png
rename to content/images/toggle/icon-off.png
diff --git a/source/images/toggle/icon-on-2x.png b/content/images/toggle/icon-on-2x.png
similarity index 100%
rename from source/images/toggle/icon-on-2x.png
rename to content/images/toggle/icon-on-2x.png
diff --git a/source/images/toggle/icon-on.png b/content/images/toggle/icon-on.png
similarity index 100%
rename from source/images/toggle/icon-on.png
rename to content/images/toggle/icon-on.png
diff --git a/source/images/video/fullscreen-2x.png b/content/images/video/fullscreen-2x.png
similarity index 100%
rename from source/images/video/fullscreen-2x.png
rename to content/images/video/fullscreen-2x.png
diff --git a/source/images/video/fullscreen.png b/content/images/video/fullscreen.png
similarity index 100%
rename from source/images/video/fullscreen.png
rename to content/images/video/fullscreen.png
diff --git a/source/images/video/pause-2x.png b/content/images/video/pause-2x.png
similarity index 100%
rename from source/images/video/pause-2x.png
rename to content/images/video/pause-2x.png
diff --git a/source/images/video/pause.png b/content/images/video/pause.png
similarity index 100%
rename from source/images/video/pause.png
rename to content/images/video/pause.png
diff --git a/source/images/video/play-2x.png b/content/images/video/play-2x.png
similarity index 100%
rename from source/images/video/play-2x.png
rename to content/images/video/play-2x.png
diff --git a/source/images/video/play.png b/content/images/video/play.png
similarity index 100%
rename from source/images/video/play.png
rename to content/images/video/play.png
diff --git a/source/images/video/poster.jpg b/content/images/video/poster.jpg
similarity index 100%
rename from source/images/video/poster.jpg
rename to content/images/video/poster.jpg
diff --git a/source/images/video/volume-full-2x.png b/content/images/video/volume-full-2x.png
similarity index 100%
rename from source/images/video/volume-full-2x.png
rename to content/images/video/volume-full-2x.png
diff --git a/source/images/video/volume-full.png b/content/images/video/volume-full.png
similarity index 100%
rename from source/images/video/volume-full.png
rename to content/images/video/volume-full.png
diff --git a/source/images/video/volume-off-2x.png b/content/images/video/volume-off-2x.png
similarity index 100%
rename from source/images/video/volume-off-2x.png
rename to content/images/video/volume-off-2x.png
diff --git a/source/images/video/volume-off.png b/content/images/video/volume-off.png
similarity index 100%
rename from source/images/video/volume-off.png
rename to content/images/video/volume-off.png
diff --git a/source/images/winxpsnap/regedit.png b/content/images/winxpsnap/regedit.png
similarity index 100%
rename from source/images/winxpsnap/regedit.png
rename to content/images/winxpsnap/regedit.png
diff --git a/source/images/winxpsnap/snapshot.png b/content/images/winxpsnap/snapshot.png
similarity index 100%
rename from source/images/winxpsnap/snapshot.png
rename to content/images/winxpsnap/snapshot.png
diff --git a/content/post/2013-10-04-ubuntu-12-04-desktop-with-zentyal-3-2/img/centrefrancophone-cabinet.jpg b/content/post/2013-10-04-ubuntu-12-04-desktop-with-zentyal-3-2/img/centrefrancophone-cabinet.jpg
new file mode 100644
index 0000000..b52a1e7
Binary files /dev/null and b/content/post/2013-10-04-ubuntu-12-04-desktop-with-zentyal-3-2/img/centrefrancophone-cabinet.jpg differ
diff --git a/source/_posts/2013-10-04-ubuntu-12-dot-04-desktop-with-zentyal-3-dot-2.markdown b/content/post/2013-10-04-ubuntu-12-04-desktop-with-zentyal-3-2/index.md
similarity index 71%
rename from source/_posts/2013-10-04-ubuntu-12-dot-04-desktop-with-zentyal-3-dot-2.markdown
rename to content/post/2013-10-04-ubuntu-12-04-desktop-with-zentyal-3-2/index.md
index a02b4dc..1af2bfc 100644
--- a/source/_posts/2013-10-04-ubuntu-12-dot-04-desktop-with-zentyal-3-dot-2.markdown
+++ b/content/post/2013-10-04-ubuntu-12-04-desktop-with-zentyal-3-2/index.md
@@ -1,32 +1,43 @@
----
-layout: post
-title: "Ubuntu 12.04 Desktop with Zentyal 3.2"
-date: 2013-10-04 19:01
-comments: true
-categories: [Zentyal, System Administration, LDAP, NFS, Ubuntu, IT]
----
++++
+author = "Blagovest Petrov"
+title = "Ubuntu 12.04 Desktop with Zentyal 3.2"
+date = "2013-10-04"
+
+tags = [
+ "zentyal",
+ "system administration",
+ "ldap",
+ "nfs",
+ "Ubuntu",
+ "Desktop"
+]
+categories = [
+ "System Administration",
+ "Linux"
+]
++++
+
+[Zentyal](http://zentyal.org), The Linux Small Business Server includes the most important services for a small or medium company. Most of the services are integrated around OpenLdap. Since version 3.1, Zentyal uses Samba4 as a Directory and File Sharing services.
-[Zentyal](http://zentyal.org), The Linux Small Business Server includes the most important services for a small or medium company. Most of the services are integrated around OpenLdap. Since version 3.1, Zentyal uses Samba4 as a Directory and File Sharing service.
-
-
I'm maintaining the computers in the Francophone center in University of Sofia. Everything in this place is with Ubuntu workstations.
There was a major hardware update this year. We got new servers, workstations and laptops.
-
+![Centre Francophone](img/centrefrancophone-cabinet.jpg)
+![Centre Francophone](img/retro-torch.gif)
Following the info from [this](http://forum.zentyal.org/index.php?topic=12925.0) forum topic, I installed Ubuntu 12.04 LTS for the desktops and Zentyal 3.2 as a Directory and file server. Home directories are on NFS share in Zentyal, so that the users can use their own profiles on any workstation.
-First I decided to use Centrify DC Express ([Documentation](https://help.ubuntu.com/community/DirectControl)) as an Active Directory client Samba shares, like in the forum topic. This type of setup gave me the possibility to use Samba 4's advanced directory options because CentrifyDC immitates M$ Windows client and the security of Samba. It seemed to work in the first test, but then bugs appeared. There are some privilege issues with Samba. For example, PulseAudio cannot initialize on boot because it cannot create the _~/.pulse_ directory. There were the simmilar issues with Firefox on some of the profiles.
+First I decided to use Centrify DC Express ([Documentation](https://help.ubuntu.com/community/DirectControl)) as an Active Directory client Samba shares, like in the forum topic. This type of setup gave me the possibility to use Samba 4's advanced directory options because CentrifyDC immitates M$ Windows client and the security of Samba. It seemed to work in the first test, but then bugs appeared. There are some privilege issues with Samba. For example, PulseAudio cannot initialize on boot because it cannot create the `~/.pulse` directory. There were the simmilar issues with Firefox on some of the profiles.
-Then I decided to use NFS with Centrify, but another issue appeared. Centrify makes UID and GID different than the ones in Zentyal and users cannot write to their own profiles. NFSv4 can solve this problem with remapping, but it's still not documented and there's a lack of information on internet. If you are interested in it, you can search for _"/etc/idmapd.conf"_.
+Then I decided to use NFS with Centrify but another issue appeared. Centrify makes UID and GID different than the ones in Zentyal and users cannot write to their own profiles. NFSv4 can solve this problem with remapping, but it's still not documented and there's a lack of information on internet. If you are interested in it, you can search for `/etc/idmapd.conf`.
So, I choosed the standard LDAP setup, like in the forum topic and NFS. Well, [another bug](https://bugs.launchpad.net/ubuntu/+source/at-spi2-core/+bug/870874) appeared but it can be fixed with a small hack.
-You must comment the "If" statement about gsettings (dconf) in _/etc/X11/Xsession.d/90qt-a11y_ :
+You must comment the "If" statement about gsettings (dconf) in `/etc/X11/Xsession.d/90qt-a11y` :
-{% codeblock lang:bash Before (/etc/X11/Xsession.d/90qt-a11y) %}
+```bash
# -*- sh -*-
# Xsession.d script to set the QT_ACCESSIBILITY env variable when accessibility
# is enabled.
@@ -39,9 +50,9 @@ if [ -x "/usr/bin/gsettings" ]; then
export QT_ACCESSIBILITY=1
fi
fi
-{% endcodeblock %}
+```
-{% codeblock lang:bash After (/etc/X11/Xsession.d/90qt-a11y) %}
+```bash
# -*- sh -*-
# Xsession.d script to set the QT_ACCESSIBILITY env variable when accessibility
# is enabled.
@@ -54,23 +65,25 @@ fi
# export QT_ACCESSIBILITY=1
# fi
#fi
-{% endcodeblock %}
+```
According to the forum topic, you need to install these packages on the Ubuntu client to run LDAP:
-{% codeblock lang:bash %}
+
+```bash
$ sudo apt-get install install libnss-ldap libpam-ldap libpam-mount winbind smbclient cifs-utils ldap-utils #Ignore all requests, just hit Enter
-{% endcodeblock %}
+```
+
And for NFS:
-{% codeblock lang:bash %}
+```bash
$ sudo apt-get install nfs-common libpam-mount
-{% endcodeblock %}
+```
-Then, create again the file _/etc/ldap.conf_ :
+Then, create again the file `/etc/ldap.conf` :
-{% codeblock %}
+```ldap
base dc=neo,dc=lan
uri ldap://10.1.100.1:390
@@ -92,7 +105,7 @@ nss_schema rfc2307bis
nss_map_attribute uniqueMember member
nss_reconnect_tries 2
nss_initgroups_ignoreusers avahi,avahi-autoipd,backup,bin,colord,daemon,games,gnats,hplip,irc,kernoops,libuuid,lightdm,list,lp,mail,man,messagebus,news,proxy,pulse,root,rtkit,saned,speech-dispatcher,sshd,sync,sys,syslog,usbmux,uucp,whoopsie,www-data
-{% endcodeblock %}
+```
**Remarks:**
@@ -101,53 +114,54 @@ nss_initgroups_ignoreusers avahi,avahi-autoipd,backup,bin,colord,daemon,games,gn
* binddn - run grep ^binddn /etc/ldap.conf on your Zentyal server's shell
* bindpw - run grep ^bindpw /etc/ldap.conf on your Zentyal server's shell
-Create a link for the _ldapsearch_ tool:
+Create a link for the `ldapsearch` tool:
-{% codeblock lang:bash %}
+```bash
$ sudo ln -s /etc/ldap.conf /etc/ldap/ldap.conf
-{% endcodeblock %}
+```
For NSS:
-{% codeblock lang:bash %}
+```bash
$ sudo auth-client-config -t nss -p lac_ldap
-{% endcodeblock %}
+```
-You can test the configuration with _$id USERNAME_ where the username must be from the Active Directory.
+You can test the configuration with `$id USERNAME` where the username must be from the Active Directory.
-To mount the home folder you need to insert this line in your _/etc/security/pam_mount.conf_ between _\
+Today Perl helped me again to solve a boring office problem. The colleagues gave me a presentation with almost 1000 slides. It was designed for a theatre subtitles. The slides was simple. Just a sentence per each slide. Only the colors was mistaken. Not black on white but white on black. My colleagues spent hours in googling for M$ Office bulk color change function. Then something blinked in me. **It was Perl's Regex {}**.
+The new open Office formats - [ODF](http://en.wikipedia.org/wiki/OpenDocument) and [OOXML](http://en.wikipedia.org/wiki/Office_Open_XML) are both zipped XML files, binary media content and files with metadata. I converted the presentation to odt (It was still on PPT which is an old proprietary format) and then, just unzip it:
-{% codeblock lang:bash %}
+```bash
lin:/tmp/presentation$ unzip slides.odp
Archive: slides.odp
extracting: mimetype
inflating: content.xml
inflating: META-INF/manifest.xml
- inflating: settings.xml
+ inflating: set
+ tings.xml
inflating: styles.xml
inflating: meta.xml
- inflating: Thumbnails/thumbnail.png
-{% endcodeblock %}
+ inflating: Thumbnails/thumbnail.png
+```
-The interesting file for me was **content.xml**. It's a verry big XML text file, so it's hard to be read both by a human and a text editor, but Sublime Text withstand. Because the slides were very simple, there was only one text style. So, here is the interesting stanza:
+The interesting file for me was **content.xml**. It's a verry big XML text file, so it's hard to be read both by a human and a text editor, but Sublime Text withstand. Because the slides were very simple, there was only one text style. So, here is the interesting XML stanza:
-{% codeblock lang:xml %}
+```xml
-{% endcodeblock %}
+ style:text-underline-mode="continuous" style:letter-kerning="false"/>
+
+ ```
-I just changed **' fo:color="#ffffff" '** to **' fo:color="#000000" '** with a Perl oneliner:
+ I just changed `fo:color="#ffffff"` to `fo:color="#000000"` with a Perl oneliner:
-{% codeblock lang:perl %}
-lin:/tmp/presentation$ perl -p -i -e 's/fo:color=\"#ffffff\"/fo:color=\"#000000\"/g' content.xml
-{% endcodeblock %}
+ ```bash
+ lin:/tmp/presentation$ perl -p -i -e 's/fo:color=\"#ffffff\"/fo:color=\"#000000\"/g' content.xml
+ ```
-And then, zip again..
+ And then, zip again to odp...
-{% codeblock lang:bash %}
-lin:/tmp/presentation$ zip foo.odp content.xml meta.xml mimetype settings.xml styles.xml
+ ```bash
+ lin:/tmp/presentation$ zip foo.odp content.xml meta.xml mimetype settings.xml styles.xml
adding: content.xml (deflated 97%)
adding: meta.xml (deflated 47%)
adding: mimetype (deflated 6%)
@@ -60,12 +66,8 @@ lin:/tmp/presentation$ zip -r foo.odp META-INF
lin:/tmp/presentation$ zip -r foo.odp Thumbnails
adding: Thumbnails/ (stored 0%)
adding: Thumbnails/thumbnail.png (deflated 4%)
-{% endcodeblock %}
-
-And.. voilà! (The image is just an example. I cannot show the real one.)
-
-![picture alt]({{ root_url }}/images/PerlInTheOffice/foodotodt.png "The slide, finnished")
-
+```
+And.. voilà!
-PS: I changed the background from Powerpoint. It was easy in the GUI way :D
+![Libreoffice](img/foodotodt.png)
\ No newline at end of file
diff --git a/content/post/2014-02-02-OpenNIC-lighting-talk/index.md b/content/post/2014-02-02-OpenNIC-lighting-talk/index.md
new file mode 100644
index 0000000..ddf47a3
--- /dev/null
+++ b/content/post/2014-02-02-OpenNIC-lighting-talk/index.md
@@ -0,0 +1,15 @@
++++
+author = "Blagovest Petrov"
+title = "OpenNIC – Lighting talk on OpenFest 2013"
+date = "2014-02-02"
+
+tags = [
+ "OpenFest",
+ "DNS",
+]
+categories = [
+ "Conferences"
+]
++++
+
+{{< youtube id="VxW2WxP4_5I" >}}
\ No newline at end of file
diff --git a/content/post/2014-11-28-failover-with-linux-containers/img/diagram1.dia b/content/post/2014-11-28-failover-with-linux-containers/img/diagram1.dia
new file mode 100644
index 0000000..753f935
--- /dev/null
+++ b/content/post/2014-11-28-failover-with-linux-containers/img/diagram1.dia
@@ -0,0 +1,1913 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ #Letter#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #Node 1#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #Node2#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #RAID10 Array 2#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #RAID10 Array 1#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #RAID10 Array 2#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #RAID10 Array 1#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #DRBD r0#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #DRBD r1#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #/dev/drbd0 (master)#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #/dev/drbd1 (slave)#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #/dev/drbd0 (slave)#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #/dev/drbd1 (master)#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #Btrfs
+/srv/store1#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #LXC
+Container 1#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ##
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #Btrfs
+/srv/store2#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #LXC
+Container 2#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ##
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #Btrfs
+Snapshots#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #Btrfs
+Snapshots#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/content/post/2014-11-28-failover-with-linux-containers/img/diagram1.jpeg b/content/post/2014-11-28-failover-with-linux-containers/img/diagram1.jpeg
new file mode 100644
index 0000000..c141cd3
Binary files /dev/null and b/content/post/2014-11-28-failover-with-linux-containers/img/diagram1.jpeg differ
diff --git a/source/_posts/2014-11-28-ha-cluster-with-linux-containers.markdown b/content/post/2014-11-28-failover-with-linux-containers/index.md
similarity index 65%
rename from source/_posts/2014-11-28-ha-cluster-with-linux-containers.markdown
rename to content/post/2014-11-28-failover-with-linux-containers/index.md
index 1e3a7a5..3c66e12 100644
--- a/source/_posts/2014-11-28-ha-cluster-with-linux-containers.markdown
+++ b/content/post/2014-11-28-failover-with-linux-containers/index.md
@@ -1,20 +1,27 @@
----
-layout: post
-title: "Manual HA Cluster with Linux Containers, DRBD and Btrfs"
-date: 2014-11-28 19:20
-comments: true
-categories: [HA, Clusters, Linux Containers, DRBD, Virtualization, IT]
----
-
-In this post I'm gonna explain you how to deploy really fast and cheap cluster of Linux Containers. I use the same setup in a production enviroment for a big accounting software (10GB++ of MySQL).
-
-{% img center http://petrovs.info/images/lxccluster/diagram1.jpeg Schematic of the setup %}
-
+ +++
+author = "Blagovest Petrov"
+title = "Manual HA Failover Cluster with Linux Containers, DRBD and Btrfs"
+date = "2014-01-17"
+
+tags = [
+ "DRBD",
+ "BTRFS",
+ "High Availability"
+]
+categories = [
+ "System Administration",
+]
++++
+
+In this post I'm going to explain you how to deploy really fast and cheap cluster of Linux Containers. I use the same setup in a production enviroment for a big ERP system with accounting data (10GB++ of MySQL).
+
+![diagram1](img/diagram1.jpeg)
+
Why [LXC](https://linuxcontainers.org/)? Because it is Über-cool! Compared to the Hardware Virtualization, the runtime performance is near the bare metal speeds. Operations like starting/stopping of the system or clonning and snapshots are really fast. There's no virtual BIOS, boot loader and kernel. A given number of containers can share the same system resources as they are installed on the same bare metal system and are still isolated. It's really lightweight and flexible. You can containerize everything - a whole system or a single application. [Stéphane Graber](https://www.stgraber.org/2013/12/27/lxc-1-0-container-storage/) has a really good blog post series about LXC.
[DRBD](http://www.drbd.org/) will provide the block device replication between the servers. Let's think of it as a RAID1 array between the two machines. It can work as master-master or master-slave. The master-master setup is more risky and it works only with shared cluster file systems (GFS, OCFS2 or GlusterFS). I don't have the balls to use it master-master on two nodes for VM's and containers, so in this setup I'll use master-slave. The difference is that when an array is promoted as slave on a given machine, it cannot be accessed.
-
-[Btrfs](https://btrfs.wiki.kernel.org/index.php/Main_Page) is the new hipster in town :) It's a new "copy on write" file system and logical volume manager for the Linux kernel. It has many similarities with the ZFS, but is part of the kernel. Snapshotting and cloning of the containers are easier with Btrfs. It can make snapshots and subvolumes of a given directory and mount it as another block device. Note that it's already stable but still has problems. Stable filesystem for production environment must be 7+ years old! I bet on the backups :)
+
+[Btrfs](https://btrfs.wiki.kernel.org/index.php/Main_Page) is the new hipster in town :) It's a quite new "copy on write" file system and logical volume manager for the Linux kernel. It has many similarities with the ZFS, but it's included in the Linux kernel. Snapshotting and cloning of the containers are easier with Btrfs. It can make snapshots and subvolumes of a given directory and mount it as another block device. Note that it's already stable but still has problems. Stable filesystem for production environment must be 7+ years old! I bet on the backups :)
So, let's suppose that we have two identical machines with this sample configuration:
@@ -25,22 +32,20 @@ So, let's suppose that we have two identical machines with this sample configura
+ Standart gigabit interface/s -> eth0;
+ 10GB Ethernet interface, linked between the machines -> eth1;
-
+First, install a standard Ubuntu LTS on the RAID1 arrays and don't touch the RAID10 setup.
-First, install standart Ubuntu LTS on the RAID1 arrays and don't touch the RAID10.
-
-#The Network
+### The Network
The containers will use veth network, so we need to create a bridge:
-{% codeblock lang:bash %}
+```bash
sudo apt-get install bridge-utils
-{% endcodeblock %}
+```
-Our internet network will be 10.1.0.0/24 and our peer network - 10.0.254.0/30.
-So, */etc/network/interfaces* of node1 will be:
+Our internet network will be `10.1.0.0/24` and our peer network - `10.0.254.0/30`.
+So, `/etc/network/interfaces` of node1 will be:
-{% codeblock lang:bash %}
+```
auto lo
iface lo inet loopback
@@ -61,11 +66,10 @@ auto eth1
iface eth1 inet static
address 10.0.254.1
netmask 255.255.255.252
-{% endcodeblock %}
-
+```
And for node2:
-{% codeblock lang:bash %}
+```
auto lo
iface lo inet loopback
@@ -79,51 +83,53 @@ auto eth1
iface eth1 inet static
address 10.0.254.2
netmask 255.255.255.252
-{% endcodeblock %}
+```
-... and the hostnames in /etc/hosts. DRBD works with hostnames. On the both machines:
+... and the hostnames in `/etc/hosts` because DRBD works with hostnames. On the both of the machines:
-{% codeblock lang:bash %}
+```
127.0.0.1 localhost
10.0.254.1 node1
10.0.254.2 node2
-{% endcodeblock %}
+```
-{% codeblock lang:bash restart the network %}
+```bash
sudo service networking restart
-{% endcodeblock %}
+```
-#DRBD
-Be sure to check the official documentation. The setup of DRBD is really complex and personal, depending on the hardware, the network and the required results.
+### DRBD
-{% codeblock lang:bash Installing drbd on the both machines %}
-sudo apt-get install drbd8-utils
-{% endcodeblock %}
+Be sure to check the official documentation. The setup of DRBD is really complex and personal, depending on the hardware, the network and the required results.
-{% codeblock lang:bash Load the kernel module %}
+Installing DBRD on both of the machines:
+```bash
sudo apt-get install drbd8-utils
-{% endcodeblock %}
+```
-The time must be in sync for the DRBD. So, install NTP clien:
+Then load the kernel module:
+```bash
+modprobe drbd
+```
-{% codeblock lang:bash on the both machines %}
+The time must be in sync for the DRBD. So, install NTP client on both of the machines:
+```bash
sudo apt-get install ntp ntpdate
-{% endcodeblock %}
+```
-On this tutorial I will use the whole RAID10 arrays. It would be better if we completely erase the partition tables (if any) and start from scratch with a new partition table and just one, empty partition.
-Erase the partition tables on the both of the nodes. I expect the drive numbers to be identical because the hardware is the same:
+In this tutorial I will use the whole RAID10 arrays. It would be better if we completely erase the partition tables (if any) and start from scratch with a new partition table and just one, empty partition.
+Erase the partition tables on both of the nodes. I expect the drive numbers to be identical because the hardware is the same:
-{% codeblock lang:bash %}
+```bash
sudo dd if=/dev/zero of=/dev/sdb bs=1M count=10
-sudo dd if=/dev/zero of=/dev/sdc bs=1M count=10
-{% endcodeblock %}
+sudo dd if=/dev/zero of=/dev/sdc bs=1M count=1
+```
-DRBD can also be setup in LVM logical volume.
+DRBD can also be se in LVM logical volume :)
Let's take a look at the partition layout of the drives. For the example in the tutorial, I use a qcow2 image, mounted on my laptop and some information like the disk identifier and model will not appear. Also, **sda** is not sized for server usage.
-{% codeblock lang:bash %}
+```bash
sudo fdisk -l
Disk /dev/sda: 750.2 GB, 750156374016 bytes
@@ -160,30 +166,27 @@ Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
-Disk /dev/sdc doesn\'t contain a valid partition table
-
-{% endcodeblock %}
+Disk /dev/sdc doesn't contain a valid partition table
+```
-To partition the drives, I will use parted. The **-a optimal** flag will ensure that the partitions are properly aligned.
+To partition the drives, I will use parted. The `-a optimal` flag will ensure that the partitions are properly aligned.
-{% codeblock lang:bash %}
+```bash
sudo parted -a optimal /dev/sdb
GNU Parted 2.3
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
-(parted)
-{% endcodeblock %}
-
-...and create a new partition table:
+(parted)
+```
-{% codeblock lang:bash %}
+Create a new partition table:
+```bash
(parted) mklabel msdos
-{% endcodeblock %}
+```
View the available disk space
-
-{% codeblock lang:bash %}
+```bash
(parted) print free
Model: Unknown (unknown)
Disk /dev/sdb: 1100GB
@@ -192,11 +195,10 @@ Partition Table: msdos
Number Start End Size Type File system Flags
32,3kB 1100GB 1100GB Free Space
-{% endcodeblock %}
+```
And an overview of the partitions on all drives:
-
-{% codeblock lang:bash %}
+```bash
(parted) print all
Model: Unknown (unknown)
Disk /dev/sdb: 1100GB
@@ -229,17 +231,15 @@ Number Start End Size Type File system Flags
4 750GB 750GB 108MB primary fat32 lba
(parted)
-{% endcodeblock %}
-
-Create a primary partitions on /dev/sdb and /dev/sdc using all the available disk space. Start at 1049kB, the same block that is used on /dev/sda.
+```
-{% codeblock lang:bash %}
+Create a primary partitions on `/dev/sdb` and `/dev/sdc` using all the available disk space. Start at 1049kB, the same block that is used on `/dev/sda`.
+```bash
(parted) mkpart primary 1049kB 1100GB
-{% endcodeblock %}
+```
-And see the new partition:
-
-{% codeblock lang:bash %}
+And see the new partition:
+```bash
(parted) print free
Model: Unknown (unknown)
Disk /dev/sdb: 1100GB
@@ -249,24 +249,21 @@ Partition Table: msdos
Number Start End Size Type File system Flags
32,3kB 1049kB 1016kB Free Space
1 1049kB 1100GB 1100GB primary
-{% endcodeblock %}
+```
Check if the partition is properly aligned:
-
-{% codeblock lang:bash %}
+```bash
(parted) align-check opt 1
-{% endcodeblock %}
+```
Backup the default DRBD configuration:
-
-{% codeblock lang:bash %}
+```bash
sudo cp /etc/drbd.conf /root/drbd.conf.back
sudo cp /etc/drbd.d/global_common.conf /root/glonal_common.conf.back
-{% endcodeblock %}
-
-On Ubuntu 14.04, the section *"common"* is added to */etc/drbd.d/global_common.conf*. Add syncer rate:
+```
-{% codeblock lang:bash %}
+On Ubuntu 14.04, the section `common` is added to `/etc/drbd.d/global_common.conf`. Add syncer rate:
+```conf
global {
usage-count no;
# minor-count dialog-refresh disable-ip-verification
@@ -319,13 +316,12 @@ common {
}
}
-{% endcodeblock %}
-
-The *"syncer rate"* option is dependable on the hardware and the network. It's necessary to look the [official documentation](http://www.drbd.org/users-guide-8.3/s-configure-syncer-rate.html).
+```
-And the most important - *drbd.conf*:
+The `syncer rate` option is dependable on the hardware and the network. It's necessary to look the [official documentation](http://www.drbd.org/users-guide-8.3/s-configure-syncer-rate.html).
-{% codeblock lang:bash %}
+And the most important - `drbd.conf`:
+```bash
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
@@ -380,137 +376,127 @@ resource r1 {
meta-disk internal;
}
}
-
-{% endcodeblock %}
+```
Initialize the metadata storage:
-
-{% codeblock lang:bash On both servers %}
+```bash
sudo drbdadm create-md r0
sudo drbdadm create-md r1
-{% endcodeblock %}
+```
-Start DRBD:
-
-{% codeblock lang:bash On both servers %}
+Start DRBD on both of the servers:
+```bash
sudo /etc/init.d/drbd start
-{% endcodeblock %}
-
-To start the sync process, make the first server the primary node. Exceute this on the first server only:
+```
-{% codeblock lang:bash Only on node1 %}
+To start the sync process, make the first server the primary node. Exceute this `on the first server only`:
+```bash
sudo drbdadm -- --overwrite-data-of-peer primary all
-{% endcodeblock %}
+```
-Simmilar to the Linux software raid, you can monitor the process in *"/proc/drbd"*.
+Similar to the Linux software raid, you can monitor the process in `/proc/drbd`.
-After the sync is finnished, promote r1 (/dev/drbd1) to the second node:
+After the sync is finished, promote r1 (`/dev/drbd1`) to the second node.
-{% codeblock lang:bash Only on node 1 %}
+Only on `node1`:
+```bash
drbdadm secondary r1
-{% endcodeblock %}
+```
-{% codeblock lang:bash Only on node 2 %}
+Only on `node2`:
+```bash
drbdadm primary r1
-{% endcodeblock %}
+```
The DRBD is done, let's setup the Btrfs.
-#Btrfs
-
-First, create directories for the mount points:
-
-{% codeblock lang:bash On both servers %}
-mkdir /srv/{store1,store2}
-{% endcodeblock %}
+### Btrfs
-Install Btrfs
+First, create directories for the mount points on both of the servers:
+```bash
+mkdir -p /srv/{store1,store2}
+```
-{% codeblock lang:bash On both servers %}
+Install BTRFS on both of the servers:
+```bash
sudo apt-get install btrfs-tools
-{% endcodeblock %}
+```
-{% codeblock lang:bash Only on node 1 %}
+Make BTRFS file system on node1:
+```bash
sudo mkfs.btrfs /dev/drbd0
-mount /dev/drbd0 /srv/store1
-{% endcodeblock %}
+```
-{% codeblock lang:bash Only on node 2 %}
+Make BTRFS file system on node2:
+```bash
sudo mkfs.btrfs /dev/drbd1
-mount /dev/drbd1 /dev/store2
-{% endcodeblock %}
+```
Let's see the available space:
-
-{% codeblock lang:bash Only on node 1 %}
+```bash
du -h /srv/store1
Filesystem Size Used Avail Use% Mounted on
/dev/drbd0 1,0T 384K 1023G 1% /srv/store1
-{% endcodeblock %}
+```
It would be identical on node2.
Ok, it's time for the Lxc.
-#LXC
+### LXC
-{% codeblock lang:bash On both servers %}
+On both of the servers:
+```bash
sudo apt-get install lxc
-{% endcodeblock %}
+```
Create directories for the containers:
+```bash
+mkdir -p /srv/store1/containers
+mkdir -p /srv/store2/containers
+```
-{% codeblock lang:bash Only on node 1 %}
-mkdir /srv/store1/containers
-{% endcodeblock %}
-
-{% codeblock lang:bash Only on node 2 %}
-mkdir /srv/store2/containers
-{% endcodeblock %}
-
-Change the default path in */etc/lxc.conf*. The file may doesn't exist:
+Change the default path in `/etc/lxc.conf`. The file may not exist:
-{% codeblock lang:bash Only on node 1 %}
+Only on node1:
+```bash
lxc.lxcpath = /srv/store1/containers
-{% endcodeblock %}
+```
-{% codeblock lang:bash Only on node 2 %}
+Only on node2:
+```bash
lxc.lxcpath = /srv/store2/containers
-{% endcodeblock %}
+```
-Change the default veth network to br0 in */etc/lxc/default.conf*:
-
-{% codeblock lang:bash On both servers %}
+Change the default veth network to br0 in `/etc/lxc/default.conf` on both of the servers:
+```bash
lxc.betwork.type = veth
lxc.network.link = br0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx
-{% endcodeblock %}
-
-#Tests
+```
-The system should be ready for production. Let's create the first template. In Node1, for example:
+### Tests
-{% codeblock lang:bash Only on node 1 %}
+The system is ready for production. Let's create the first template. On Node1, for example:
+```bash
lxc-create -t ubuntu -n mysql -B btrfs
-{% endcodeblock %}
+```
-Without *"-b btrfs"*, the container's backing store will be treated as a filesystem directory and the snapshots and clones will be created with simple file copy.
+Without `-b btrfs`, the container's backing store will be treated as a filesystem directory and the snapshots and clones will be created with simple file copy.
-Copy with *scp* the files */srv/store1/containers/mysql/config* and */srv/store1/containers/mysql/fstab* to the according directory in node2 - */srv/store2/containers/mysql/ . This is necessary for the failover setup. If, for example, node1 fails, the container *"mysql"* will be easily run from node2 if the */dev/drbd0* is promoted as a primary there:
-
-{% codeblock lang:bash %}
+Copy with `scp` the files `/srv/store1/containers/mysql/config` and `/srv/store1/containers/mysql/fstab` to the according directory in node2 - `/srv/store2/containers/mysql/` . This is necessary for the failover setup. If, for example, node1 fails, the container `mysql` will be easily run from node2 if the `/dev/drbd0` is promoted as a primary there:
+```bash
drbdadm primary r1
mount /dev/drbd0 /srv/store1
lxc-start -n mysql -d
-{% endcodeblock %}
-
-##Snapshot can be created with:
+```
-{% codeblock lang:bash %}
+Snapshots can be created with:
+```bash
lxc-snapshot -n mysql
lxc-snapshot -n mysql -L #will list the snapshots
lxc-snapshot -n mysql -d snap0 # will delete snap0
-{% endcodeblock %}
+```
There is a lot of documentation available about the LXC commands and configuration options. I'll post a small howto anyway. I'm still writing backup scripts with the LXC api. If they are done, I'll post documentation about the backup.
\ No newline at end of file
diff --git a/content/post/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment/img/regedit.png b/content/post/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment/img/regedit.png
new file mode 100644
index 0000000..6dfaa6f
Binary files /dev/null and b/content/post/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment/img/regedit.png differ
diff --git a/content/post/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment/img/snapshot.png b/content/post/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment/img/snapshot.png
new file mode 100644
index 0000000..e9fc0af
Binary files /dev/null and b/content/post/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment/img/snapshot.png differ
diff --git a/content/post/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment/index.md b/content/post/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment/index.md
new file mode 100644
index 0000000..669c428
--- /dev/null
+++ b/content/post/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment/index.md
@@ -0,0 +1,139 @@
++++
+author = "Blagovest Petrov"
+title = "Quick way to setup VirtualBox VM in multi user environment"
+date = "2015-01-14"
+
+tags = [
+ "VirtualBox",
+]
+categories = [
+ "System Administration",
+ "Virtualization"
+]
++++
+
+Let's assume that we need to setup VirtualBox VM with Windows XP and an old version of Microsoft Office. The machine must be used from everyone on a given number of Linux workstations. The workstations may work with LDAP and NFS/Cifs. The standard installation of the VM would be extremely space consuming and it would cost a lot of the personal life of the administrator.
+I made an easy hack to solve this ( this is real setup in university labs).
+
+Let's install a standard local Windows XP virtual machine and permanently mount the local directories `/home/trendafil` and `/media` .
+In this example, the home directory of the user will be mounted on `X:\\` on Windows and media will be `Z:\\` .
+
+The important directories are out of the VM. So, the virtual machine will be runned from snapshot on every boot.
+The next useful step is to move the default user profile outside the VM. I don't need something different than `My Documents` but in other cases, everything from the profile can be exported to `/home`, outside the VM. So, open `regedit` in Windows and go to the
+
+```
+HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell User Folders
+```
+and change the key `My Documents` to `X:\\`
+
+![regedit](img/regedit.png)
+
+Turn off the VM and create an empty snapshot:
+![Snapshot](img/snapshot.png)
+
+Next, move the VM from `~/VirtualBox VMs` to `~/.config/VirtualBox` if it's the official VirtualBox edition or `~/.VirtualBox` for the open source edition from the Ubuntu repositories.
+
+Open the file `~/.config/VirtualBox/VirtualBox.xml` and clean it from the unnecessary stuff:
+```xml
+
+
+
+
+...
+
+
+```
+
+Also, replace the username the same way in `~/.VirtualBox/WinXP/WinXP.xml`
+
+Change the location of the harddisk image to `/var/vbox/` like this:
+```xml
+
+```
+
+Create the directory `/var/vbox/` and then move the harddisk image from `~/.VirtualBox/WinXp/winxp.vmdk` to `/var/vbox` .
+
+Then, move the whole `~/.VirtualBox` or `~/.config/VirtualBox` to `/var/vbox`
+
+Install Zenity if it's not installed:
+```bash
+$ sudo apt-get install zenity
+```
+
+Put the following script to `/usr/local/bin/startwin`:
+```bash
+#!/bin/bash
+
+# "THE BEER-WARE LICENSE" (Revision 42):
+# wrote this file.
+# As long as you retain this notice youcan do whatever you want with
+# this stuff. If we meet some day, and you thinkthis stuff is worth it,
+# you can buy me a beer in return. Blagovest Petrov
+
+# "~/.VirtualBox" is for the open source edition.
+# Change it to "~/.config/VirtualBox for the Oracle edition.
+
+(
+
+echo "30" ; sleep 1
+echo "# Preparing the Virtual Machine to start"; sleep 1
+rm -rf ~/.VirtualBox
+cp -r /var/vbox/WinXp/.VirtualBox ~/.VirtualBox
+
+echo "50" ; sleep 1
+echo "# Configuring the Virtual Machine"; sleep 1
+sed -i "s/_CURRENTUSR_/$USER/g" ~/.VirtualBox/WinXP/WinXP.vbox
+sed -i "s/_CURRENTUSR_/$USER/g" ~/.VirtualBox/VirtualBox.xml
+
+echo "99" ; sleep 1
+echo "# Starting Windows..."; sleep 1
+VBoxManage startvm WinXP
+
+echo "100" ; sleep 1
+echo "# Starting Windows..."; sleep 1
+
+) |
+zenity --progress \
+ --title="Starting Windows..." \
+ --text="Preparing the Virtual Machine to start" \
+ --percentage=0 \
+ --auto-kill \
+ --auto-close
+
+if [ "$?" = -1 ] ; then
+ zenity --error --text "Starting canceled."
+fi
+```
+
+and make it executable:
+```bash
+$ sudo chmod +x /usr/local/bin/startwin
+```
+
+It should work now. Every user of the system can start the VM from the script.
+
+Additionaly, you can create a desktop enry.
+First, find an ugly Window$ logo with an open license and put it on `/usr/share/icons/win.png`. Then, create the file `/usr/share/applications/startwin.desktop` with this content:
+
+```ini
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Name=Windows XP
+GenericName=Windows XP
+Type=Application
+Exec=/usr/lcal/bin/startwin
+TryExec=/usr/local/bin/startwin
+Icon=/usr/share/icons/win.png
+Categories=Emulator;System;Application;
+Comment=WindowsXP VirtualBox WM
+```
+
+
+
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/a.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/a.jpg
new file mode 100644
index 0000000..f3be5dd
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/a.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/b.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/b.jpg
new file mode 100644
index 0000000..0b25607
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/b.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/c.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/c.jpg
new file mode 100644
index 0000000..d0f565b
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/c.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/d.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/d.jpg
new file mode 100644
index 0000000..f8bfeae
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/d.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/e.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/e.jpg
new file mode 100644
index 0000000..a0d522b
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/e.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/f.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/f.jpg
new file mode 100644
index 0000000..be8261b
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/f.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/g.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/g.jpg
new file mode 100644
index 0000000..3f9caef
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/g.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/h.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/h.jpg
new file mode 100644
index 0000000..1e9077b
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/h.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/i.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/i.jpg
new file mode 100644
index 0000000..8fb7109
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/i.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/j.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/j.jpg
new file mode 100644
index 0000000..f2ba9d6
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/j.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/k.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/k.jpg
new file mode 100644
index 0000000..8a48986
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/k.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/l.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/l.jpg
new file mode 100644
index 0000000..bd99d5e
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/l.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/img/tadaa.jpg b/content/post/2015-03-08-how-to-cook-patatnik/img/tadaa.jpg
new file mode 100644
index 0000000..917008c
Binary files /dev/null and b/content/post/2015-03-08-how-to-cook-patatnik/img/tadaa.jpg differ
diff --git a/content/post/2015-03-08-how-to-cook-patatnik/index.md b/content/post/2015-03-08-how-to-cook-patatnik/index.md
new file mode 100644
index 0000000..31f5176
--- /dev/null
+++ b/content/post/2015-03-08-how-to-cook-patatnik/index.md
@@ -0,0 +1,62 @@
++++
+author = "Blagovest Petrov"
+title = "How to cook Patatnik"
+date = "2015-03-08"
+
+tags = [
+ "Patatnik",
+]
+categories = [
+ "Cooking"
+]
++++
+
+
+This is my first non technical post here. I'm going to explain in details my way to cook Patatnik - Bulgarian dish from the Rhodopi Mountains. It's made of shredded potatoes, eggs, onions, cheese and some local spices. I'm not sure if this is the most authentic recipe but it's the way I like it.
+
+## What is needed for two servings:
+1. 3 - 4 medium potatoes;
+2. A head of an onion;
+3. 3 eggs;
+4. ~100g. of white cheese (Sirene. It's famous in the balkans. Something similar is the greek Féta but it's too greasy. In western europe, Sirene can be found in the Polish shops (in UK) and the arabic markets);
+5. Sprig of Spearmint (in Bulgarian it's called Dzhodzhen or Gyozum, the latin name is Mentha Spicata. This spice is very suitable for potatoes and beans.);
+6. Salt. Instead of salt I'm using "Chiirska merudiya". It's a type of grass which is crushed with salt and dried. I don't know the official name of the plant. It's known and called "Chiirska merudiya" in the region of Trakia in Bulgaria. It's very simmilar to "Nectaroscordum siculum ssp. bulgaricum" which is used the same way, with salt.
+
+
+### First, peel the potatoes:
+![Peeling the potatoes](img/a.jpg)
+
+### After that, cut the onion into small pieces:
+![A head of onion](img/b.jpg)
+![Cutted onion](img/c.jpg)
+
+### Shred the potatoes to thinny pieces:
+![Potato shredder](img/d.jpg)
+![Shredded potatoes](img/e.jpg)
+
+### Squeeze the potatoes by hand to dehidrate them (That's my way?!):
+![Potato water](img/f.jpg)
+... and throw the water
+
+### Add the onion:
+![Adding the onion](img/g.jpg)
+
+### Add the eggs and the cheese:
+![Mixing the cheese and the eggs with the taties](img/h.jpg)
+The cheese and the eggs can be smashed and mixed previously.
+
+### Add the spices and then mix everthing again:
+![Everything is in...](img/i.jpg)
+
+![Merudia](img/j.jpg)
+This is how a jar of home made merudia looks like
+
+### Grease two clay plates with some oil:
+![Oiling the plates...](img/k.jpg)
+
+### Put the mixture in the plates and bake it:
+![Ready for baking...](img/l.jpg)
+It must be baked on 220°c between 30 and 60 minutes. Depends of the humidity of the mixture.
+
+### ... and voilà! Serve it with [Ayran](http://en.wikipedia.org/wiki/Ayran) and something spicy ;)
+![Tadaa](img/tadaa.jpg)
\ No newline at end of file
diff --git a/source/_posts/2015-12-27-My-way-to-auto-update-Lets-Encrypt.md b/content/post/2015-12-27-My-way-to-auto-update-Lets-Encrypt/index.md
similarity index 76%
rename from source/_posts/2015-12-27-My-way-to-auto-update-Lets-Encrypt.md
rename to content/post/2015-12-27-My-way-to-auto-update-Lets-Encrypt/index.md
index a72e785..9c722be 100644
--- a/source/_posts/2015-12-27-My-way-to-auto-update-Lets-Encrypt.md
+++ b/content/post/2015-12-27-My-way-to-auto-update-Lets-Encrypt/index.md
@@ -1,15 +1,21 @@
-title: My way to auto update "Let's Encrypt" certs without downtime.
-date: 2015-12-27 02:59:56
-tags: letsencrypt encryption web servers tls ssl
-coverImage: https.jpg
----
++++
+author = "Blagovest Petrov"
+title = "My way to auto update Let's Encrypt certs without downtime"
+date = "2015-12-27"
+
+tags = [
+ "Let's encrypt",
+ "Security"
+]
+categories = [
+ "System Administration"
+]
++++
It's been a while since my last post here. This is my first post with the new platform - [Hexo](https://hexo.io). It's faster and simpler than Octopress and it's not Ruby but nevermind...
The whole concept with the Certification Authorities is completely broken but we don't have something better which is working. A world with fully encrypted web is a really a good idea since the whole internet traffic is monitored by governments and other private organizations. [Let's encrypt](https://letsencrypt.org) is an attempt for that. It's a colaborative project between Linux foundation, EFF and some other organizations.
-
-
They are providing free (completely free!) certificates with 3 months of validity. After that time, the certificates can be updated again.
## Signing and delivery of the certificates
@@ -26,18 +32,18 @@ HAProxy will directly deliver bind the HTTPS content but we need SNI checks for
TCP frontend -> HTTPS backend/ACME client backend -> HTTPS frontend -> Application Servers HTTP backends
-{% codeblock lang:bash %}
+```bash
sudo apt-get install -y software-properties-common
sudo apt-add-repository ppa:vbernat/haproxy-1.5
sudo apt-get update
sudo apt-get install -y haproxy
-{% endcodeblock %}
+```
#### Configure HAProxy:
-Let's start with the default global config:
+Let's start with the default global config (`/etc/haproxy/haproxy.cfg`):
-{% codeblock [/etc/haproxy/haproxy.cfg] %}
+```
global
log /dev/log local0
log /dev/log local1 notice
@@ -58,11 +64,11 @@ global
# tunning
maxconn 16384
-{% endcodeblock %}
+```
-Then, append the default configuration for the http/s frontends:
+Then, append the default configuration for the http/s frontends (`/etc/haproxy/haproxy.cfg`):
-{% codeblock [/etc/haproxy/haproxy.cfg] %}
+```
defaults http
log global
mode http
@@ -80,12 +86,11 @@ defaults http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
-{% endcodeblock %}
+```
Setup the HTTP frontend. It will only refer the http requests to https:
-{% codeblock [/etc/haproxy/haproxy.cfg] %}
-
+```
frontend www-http
bind 0.0.0.0:80
reqadd X-Forwarded-Proto:\ http
@@ -96,11 +101,11 @@ frontend www-http
#Redirects
redirect prefix https://cloud.grandcity-property.com if example_sites
-{% endcodeblock %}
+```
Now, create the HTTPS frontend. The port must be different than 443.
-{% codeblock [/etc/haproxy/haproxy.cfg] %}
+```
frontend www-https
bind 0.0.0.0:4443 ssl crt example.com.pem crt www.example.com.pem crt ./ no-sslv3
@@ -111,11 +116,11 @@ frontend www-https
acl example_sites hdr(host) -i example.com www.example.com
use_backend examplecom if example_sites
-{% endcodeblock %}
+```
Create the backend for example.com:
-{% codeblock [/etc/haproxy/haproxy.cfg] %}
+```
backend examplecom
timeout server 30m
balance leastconn
@@ -123,11 +128,11 @@ backend examplecom
option forwardfor
cookie JSESSIONID prefix
server node1 192.168.0.10:80 cookie A check
-{% endcodeblock %}
+```
Now, the TCP Proxy part. TCP defaults:
-{% codeblock [/etc/haproxy/haproxy.cfg] %}
+```
#### TCP Section
defaults tcp
@@ -137,11 +142,11 @@ defaults tcp
timeout connect 10s
timeout client 600s
timeout server 600s
-{% endcodeblock %}
+```
-The TCP frontend (listening on port 443:
+The TCP frontend (listening on port 443):
-{% codeblock [/etc/haproxy/haproxy.cfg] %}
+```
frontend www-https-tcp
log global
mode tcp
@@ -156,11 +161,11 @@ frontend www-https-tcp
# sending everything that doesn't match *.acme.invalid to the HTTPS backend
default_backend bk_frontend_https_loop
-{% endcodeblock %}
+```
And the backends for www-https-tcp:
-{% codeblock [/etc/haproxy/haproxy.cfg] %}
+```
backend bk_frontend_https_loop
log global
mode tcp
@@ -172,54 +177,82 @@ backend letsencrypt
mode tcp
option tcplog
server letsencrypt 0.0.0.0:63443 #By default, Let's encrypt works on 443.
-{% endcodeblock %}
+```
The whole haproxy.cfg is in [this](https://gist.github.com/eniac111/95ef382b545aa2d43dff) gist.
### Now, install the official Let's encrypt client:
Install git:
-{% codeblock lang:bash %}
+```
sudo apt-get install -y git
-{% endcodeblock %}
+```
Download the client:
-{% codeblock lang:bash %}
+```
git clone https://github.com/letsencrypt/letsencrypt /root/letsencrypt
-{% endcodeblock %}
+```
And create the certificate for example.com and wwww.example.com:
-{% codeblock lang:bash %}
+```
/root/letsencrypt/letsencrypt-auto --email admin@example.com -d example.com -d www.example.com --authenticator standalone --tls-sni-01-port 63443 --text auth --http-01-port 8099
-{% endcodeblock %}
+```
Now, download ssl-cert-check from Prefetch.net. This is very useful script because it calculates the time difference between the current time and the certification expiration date:
-{% codeblock lang:bash %}
+```
sudo wget -O http://prefetch.net/code/ssl-cert-check /usr/local/bin/ssl-cert-check
sudo chmod +x /usr/local/bin/ssl-cert-check
-{% endcodeblock %}
+```
Put this script to /etc/cron.daily/updatessl and make it executable :
-{% gist eniac111/c7146b3e59c7eff27fbe %}
-
-{% codeblock lang:bash %}
+```bash
+#!/bin/bash
+
+########################################################################
+## Script for updating Let's encrypt certs
+## http://petrovs.info/2015/12/27/My-way-to-auto-update-Lets-Encrypt/
+## (C) 2015 Blagovest Petrov (blagovest petrovs dot info)
+## Released under the GPL
+########################################################################
+
+cd /etc/letsencrypt/live
+
+for DIRS in *; do
+ if ssl-cert-check -c $DIRS/fullchain.pem | grep -q "Valid"; then
+ echo On `date`, $DIRS is Valid. >> /var/log/letsencrypt-update.log
+ #cat $DIRS/fullchain.pem > /srv/certs/$DIRS.pem
+ #cat $DIRS/privkey.pem >> /srv/certs/$DIRS.pem
+ else
+ echo On `date`, $DIRS is NOT Valid. Generating a new certificate from Let\'s encrypt... >> /var/log/letsencrypt-update.log
+ /root/letsencrypt/letsencrypt-auto --email it@veriosoft.com -d $DIRS --authenticator standalone --tls-sni-01-port 63443 --renew-by-default --text auth --http-01-port 8099 >> /var/log/letsencrypt-update.log
+ echo Generating fullchain token for $DIRS to be used for HAProxy... >> /var/log/letsencrypt-update.log
+ cat $DIRS/fullchain.pem > /srv/certs/$DIRS.pem
+ cat $DIRS/privkey.pem >> /srv/certs/$DIRS.pem
+ echo Reloading the HAProxy configuration... >> /var/log/letsencrypt-update.log
+ service haproxy reload
+ echo Done :\) >> /var/log/letsencrypt-update.log
+ fi
+done
+```
+
+```bash
sudo wget -O https://gist.githubusercontent.com/eniac111/c7146b3e59c7eff27fbe/raw/506643d797811ec99ce6e32d8f9e23ea3a9200d4/updatessl.sh /etc/cron.daily/updatessl
sudo chmod +x /etc/cron.daily/updatessl
-{% endcodeblock %}
+```
### The last thing is to create logrotate config for the update log:
Install logrotate it it's not installed:
-{% codeblock lang:bash %}
+```bash
sudo apt-get update && sudo apt-get install -y logrotate
-{% endcodeblock %}
+```
-Put this to */etc/logrotate/letsencrypt-update*:
+Put this to `/etc/logrotate/letsencrypt-update`:
-{% codeblock [/etc/logrotate/letsencrypt-update] %}
+```
/var/log/letsencrypt-update.log {
monthly
rotate 12
@@ -229,6 +262,6 @@ Put this to */etc/logrotate/letsencrypt-update*:
notifempty
create 644 root root
}
-{% endcodeblock %}
+```
-Correct me if there is a better way. The double loop inside HAProxy is really bizzare.
+Correct me if there is a better way. The double loop inside HAProxy is really bizzare.
\ No newline at end of file
diff --git a/source/_posts/2016-01-03-Using-Ansible-with-pass.md b/content/post/2016-01-03-Using-Ansible-with-pass/index.md
similarity index 80%
rename from source/_posts/2016-01-03-Using-Ansible-with-pass.md
rename to content/post/2016-01-03-Using-Ansible-with-pass/index.md
index 9683359..5af5c7d 100644
--- a/source/_posts/2016-01-03-Using-Ansible-with-pass.md
+++ b/content/post/2016-01-03-Using-Ansible-with-pass/index.md
@@ -1,12 +1,22 @@
-title: Using Ansible with pass
-date: 2016-01-03 02:13:54
-tags: ansible, pass, passwordstore, DevOps, Security
----
+ +++
+author = "Blagovest Petrov"
+title = "Using Ansible with pass"
+date = "2016-01-03"
+
+tags = [
+ "Automation",
+ "Ansible",
+ "Configuration"
+]
+categories = [
+ "System Administration",
+ "DevOps"
+]
++++
To work with the root user and ssh keys is a common practice in the Ansible community. Another variant is to use a "deploy" user with the same password on every machine.
Another option is to use [Ansible Vault to encrypt the yaml files](https://therealmarv.com/ansible-vault-file-handling). or to use a password manager. It's never a good idea to keep passwords, private keys and other sensual data to the source code repository.
-
## Pass
@@ -17,18 +27,16 @@ Pass stores every password in a PGP encrypted file in a directory tree. It has a
It's really simple. Just use "Lookup" with pipe inside your host_vars/examplehost file, like this:
-{% codeblock lang:yaml %}
+```yaml
ansible_sudo_pass: "{ { lookup('pipe', 'pass show Inventoryname/hosts/examplehost/myusername') }}"
-{% endcodeblock %}
+```
-And append *sudo: yes* to every command in the tasks, like this:
+And append `sudo: yes` to every command in the tasks, like this:
-{% codeblock lang:yaml %}
+```
- name: Just a test task
copy: src=/etc/passwd dest=/tmp/passwdfile
sudo: yes
-{% endcodeblock %}
-
-You should also use gpg-agent. Otherwise, Ansible will ask for the gpg key password for each operation.
-
+```
+You should also use gpg-agent. Otherwise, Ansible will ask for the gpg key password for each operation.
\ No newline at end of file
diff --git a/content/post/2016-01-07-Example-of-MySQL-incremental-backup-with-XtraBackup/index.md b/content/post/2016-01-07-Example-of-MySQL-incremental-backup-with-XtraBackup/index.md
new file mode 100644
index 0000000..88ff201
--- /dev/null
+++ b/content/post/2016-01-07-Example-of-MySQL-incremental-backup-with-XtraBackup/index.md
@@ -0,0 +1,100 @@
++++
+author = "Blagovest Petrov"
+title = "Example of MySQL incremental backup with XtraBackup"
+date = "2016-01-07"
+
+tags = [
+ "Backup",
+ "SQL",
+]
+categories = [
+ "System Administration",
+ "DevOps",
+ "Databases"
+]
++++
+
+Percona's [XtraBackup](https://www.percona.com/doc/percona-xtrabackup/2.3/index.html) is really good solution for incremental backups if small or large MySQL/MariaDB databases. Mysqldump is really slow and is not downtimeless.
+In our case, we need two week history of every day. Every Sunday the backup will be full and the rest of the days, backups will be incremental, based on Sunday's full backup. The backups will be placed in a folder named `current_week`. Every Sunday, the folder will be renamed to *last_week* and new, empty `current_week` will be created before the full backup.
+
+The script:
+
+```bash
+
+#!/bin/bash
+##
+#####################################################################################
+# "THE BEER-WARE LICENSE" (Revision 42):
+# wrote this file. As long as you retain this notice you
+# can do whatever you want with this stuff. If we meet some day, and you think
+# this stuff is worth it, you can buy me a beer in return. Blagovest Petrov
+#####################################################################################
+##
+
+DAY=$1
+MYSQL_PASS=$2
+MYSQL_USER="bkpuser"
+
+BACKUPS_DIR=/var/mysql-backups
+THIS_WEEK=$BACKUPS_DIR/this_week
+LAST_WEEK=$BACKUPS_DIR/last_week
+
+function do_full_backup() {
+
+ if [ -d $LAST_WEEK ]; then
+ rm -rf $LAST_WEEK
+ mkdir $LAST_WEEK
+ fi
+
+ if [ -d $THIS_WEEK ]; then
+ mv $THIS_WEEK/* $LAST_WEEK
+ mkdir -p $THIS_WEEK/Sunday
+ fi
+
+ xtrabackup --backup --target-dir=$THIS_WEEK/Sunday \
+ --datadir=/var/lib/mysql \
+ --user=$MYSQL_USER --password=$MYSQL_PASS
+}
+
+function do_incremental_backup() {
+
+ if [ -d $THIS_WEEK/$DAY ]; then
+ rm -rf $THIS_WEEK/$DAY
+ mkdir $THIS_WEEK/$DAY
+ fi
+
+
+ xtrabackup --backup --target-dir=$THIS_WEEK/$DAY \
+ --incremental-basedir=$THIS_WEEK/Sunday \
+ --datadir=/var/lib/mysql \
+ --user=$MYSQL_USER --password=$MYSQL_PASS
+}
+
+case $1 in
+ Sunday)
+ do_full_backup
+ ;;
+ *)
+ do_incremental_backup
+esac
+```
+
+It "wants" the day of the week as the first parameter, and the mysql password as a second parameter, like this:
+
+```bash
+./backup-mysql.sh Sunday 12345
+./backup-mysql.sh Monday 12345
+```
+
+Put it in `/usr/local/bin/backup-mysql` for example and make it executable. Here is an example cron config, running every day at 2:00 AM:
+
+```
+0 2 * * 0 /usr/local/bin/backup-mysql Sunday 12345 >/dev/null 2>&1
+0 2 * * 1 /usr/local/bin/backup-mysql Monday 12345 >/dev/null 2>&1
+0 2 * * 2 /usr/local/bin/backup-mysql Tuesday 12345 >/dev/null 2>&1
+0 2 * * 3 /usr/local/bin/backup-mysql Wednesday 12345 >/dev/null 2>&1
+0 2 * * 4 /usr/local/bin/backup-mysql Thursday 12345 >/dev/null 2>&1
+0 2 * * 5 /usr/local/bin/backup-mysql Friday 12345 >/dev/null 2>&1
+0 2 * * 6 /usr/local/bin/backup-mysql Saturday 12345 >/dev/null 2>&1
+```
+
diff --git a/source/_posts/2016-01-07-HAProxy-build-with-more-Debian-like-configuration/haproxy.png b/content/post/2016-01-07-HAProxy-build-with-more-Debian-like-configuration/img/haproxy.png
similarity index 100%
rename from source/_posts/2016-01-07-HAProxy-build-with-more-Debian-like-configuration/haproxy.png
rename to content/post/2016-01-07-HAProxy-build-with-more-Debian-like-configuration/img/haproxy.png
diff --git a/source/_posts/2016-01-07-HAProxy-build-with-more-Debian-like-configuration.md b/content/post/2016-01-07-HAProxy-build-with-more-Debian-like-configuration/index.md
similarity index 55%
rename from source/_posts/2016-01-07-HAProxy-build-with-more-Debian-like-configuration.md
rename to content/post/2016-01-07-HAProxy-build-with-more-Debian-like-configuration/index.md
index e72f04a..95dd8b6 100644
--- a/source/_posts/2016-01-07-HAProxy-build-with-more-Debian-like-configuration.md
+++ b/content/post/2016-01-07-HAProxy-build-with-more-Debian-like-configuration/index.md
@@ -1,22 +1,31 @@
-title: HAProxy build with more Debian-like configuration
-date: 2016-01-07 14:22:45
-tags: HAProxy
----
-
-I made a HAProxy build with Debian-style config file because some of the *haproxy.cfg* files on my servers became really big.
-HAProxy has an option to include multiple config files as a command line arguent, like this: *haproxy -f haproxy.cfg -f haproxy2.cfg -f...etc*.
-
-
-
-{% asset_img haproxy.png HAProxy /etc directory tree %}
++++
+author = "Blagovest Petrov"
+title = "HAProxy build with more Debian-like configuration"
+date = "2016-02-07"
+
+tags = [
+ "Backup",
+ "SQL",
+]
+categories = [
+ "System Administration",
+ "DevOps",
+ "Databases"
+]
++++
+
+I made a HAProxy build with Debian-style config file because some of the `haproxy.cfg` files on my servers became really big.
+HAProxy has an option to include multiple config files as a command line arguent, like this: `haproxy -f haproxy.cfg -f haproxy2.cfg -f...etc`.
+
+![haproxy](img/haproxy.png)
So, the algoritm is like:
-1. Read /etc/haproxy/haproxy.cfg (The global settings)
-2. Read /etc/haproxy/haproxy.cfg.d/http/http.cfg (Global settings for HTTP)
-3. Read /etc/haproxy/haproxy/cfg.d/http/frontend-* (HTTP frontends)
-4. Read /etc/haproxy/haproxy.cfg.d/http/backend-* (HTTP backends)
-5. Read /etc/haproxy/haproxy.cfg.d/tcp/tcp.cfg (Global settings for TCP)
+1. Read /etc/haproxy/haproxy.cfg (The global settings);
+2. Read /etc/haproxy/haproxy.cfg.d/http/http.cfg (Global settings for HTTP);
+3. Read /etc/haproxy/haproxy/cfg.d/http/frontend-* (HTTP frontends);
+4. Read /etc/haproxy/haproxy.cfg.d/http/backend-* (HTTP backends);
+5. Read /etc/haproxy/haproxy.cfg.d/tcp/tcp.cfg (Global settings for TCP);
... and the same as for HTTP
### TODO:
@@ -25,4 +34,4 @@ So, the algoritm is like:
I have some problems with *Quilt* and *debuild* but *dpkg-buildpackage* runs?
* Systemd script.
-## [Download](https://github.com/eniac111/haproxy-debianconfig/releases/tag/1.6.3)
+## [Download](https://github.com/eniac111/haproxy-debianconfig/releases/tag/1.6.3)
\ No newline at end of file
diff --git a/source/_posts/2017-01-03-Open-data-of-SofiaTraffic.md b/content/post/2017-01-03-Open-data-of-SofiaTraffic/index.md
similarity index 86%
rename from source/_posts/2017-01-03-Open-data-of-SofiaTraffic.md
rename to content/post/2017-01-03-Open-data-of-SofiaTraffic/index.md
index 5cb339d..9ed59bb 100644
--- a/source/_posts/2017-01-03-Open-data-of-SofiaTraffic.md
+++ b/content/post/2017-01-03-Open-data-of-SofiaTraffic/index.md
@@ -1,19 +1,26 @@
-title: Open data of SofiaTraffic
-date: 2017-01-03 16:27:13
-tags: OpenData, apis, skgt, PublicTransport
-coverImage: background.jpg
----
++++
+author = "Blagovest Petrov"
+title = "Open data of SofiaTraffic"
+date = "2017-01-03"
+
+tags = [
+ "API",
+]
+categories = [
+ "Public Data",
+]
++++
Quick post, first for 2017.
I got an Android car PC computer for Christmas and the hacking ideas began to appear.
-
+
Because most the buffer parkings near the Sofia subway stations are full from early in the morning, I always have to have to do a lot of maneuvers with the car. It would be great if the car PC warns me about the free places around 1km away from the parking every morning, based on the GPS. I tried to find something some usable open information about the parkings on internet but there is nothing except this application for Android: [София Паркинг](https://play.google.com/store/apps/details?id=bg.cgm.parkingboards&hl=bg). It's only showing the free places in some blue zone parkigs in the centre of Sofia. The application is usable but not suitable for 2-din car PC. So, it wasn't so hard to find from where it gets the data:
-### *https://213.240.235.145/web-site-service/rest/parkingBoardsRequest/allFreePlaces*
+### `https://213.240.235.145/web-site-service/rest/parkingBoardsRequest/allFreePlaces`
The certificate of the page is expired but it's not a big deal. The application looks a bit unmaintained. The last update was in 2014. The page returns this JSON:
-{% codeblock Example parking data lang:JSON %}
+```json
{
"parkingRes": [
{
@@ -48,7 +55,7 @@ The certificate of the page is expired but it's not a big deal. The application
}
]
}
-{% endcodeblock %}
+```
The codes refers to the following locations:
diff --git a/package.json b/package.json
deleted file mode 100644
index 6e945a8..0000000
--- a/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "name": "hexo-site",
- "version": "0.0.0",
- "private": true,
- "hexo": {
- "version": "3.2.2"
- },
- "dependencies": {
- "hexo": "^3.2.2",
- "hexo-deployer-git": "0.0.4",
- "hexo-generator-archive": "^0.1.2",
- "hexo-generator-category": "^0.1.2",
- "hexo-generator-cname": "~0.3.0",
- "hexo-generator-feed": "~1.0.3",
- "hexo-generator-index": "^0.1.2",
- "hexo-generator-tag": "^0.1.1",
- "hexo-renderer-ejs": "^0.1.0",
- "hexo-renderer-marked": "^0.2.4",
- "hexo-renderer-stylus": "^0.3.0",
- "hexo-server": "^0.1.3"
- }
-}
diff --git a/scaffolds/draft.md b/scaffolds/draft.md
deleted file mode 100644
index 45b1bb7..0000000
--- a/scaffolds/draft.md
+++ /dev/null
@@ -1,3 +0,0 @@
-title: {{ title }}
-tags:
----
diff --git a/scaffolds/page.md b/scaffolds/page.md
deleted file mode 100644
index f484b76..0000000
--- a/scaffolds/page.md
+++ /dev/null
@@ -1,3 +0,0 @@
-title: {{ title }}
-date: {{ date }}
----
diff --git a/scaffolds/post.md b/scaffolds/post.md
deleted file mode 100644
index c590d7a..0000000
--- a/scaffolds/post.md
+++ /dev/null
@@ -1,4 +0,0 @@
-title: {{ title }}
-date: {{ date }}
-tags:
----
diff --git a/source/About/index.md b/source/About/index.md
deleted file mode 100644
index 3ab597f..0000000
--- a/source/About/index.md
+++ /dev/null
@@ -1,13 +0,0 @@
-title: About
-date: 2015-12-25 19:52:12
-comments: false
----
-
-###$whoami?
-I'm Blagovest Petrov, an ordinary system administrator from Sofia, Bulgaria.
-
-There must be a content here?! If someone is more interested about me, the social buttons are on top of the page. You can freely stalk me :)
-
-About the music, my last.fm profile is [here](http://last.fm/user/eniac111)
-
-hmm.. I like biking, hiking, interesting beers..
diff --git a/source/_posts/2013-10-19-horse-dummy-school-project.markdown b/source/_posts/2013-10-19-horse-dummy-school-project.markdown
deleted file mode 100644
index b28874e..0000000
--- a/source/_posts/2013-10-19-horse-dummy-school-project.markdown
+++ /dev/null
@@ -1,15 +0,0 @@
----
-layout: post
-title: "Horse - dummy school project"
-date: 2013-10-19 23:47
-comments: true
-categories: useless projects crap C IT
----
-
-Just a small dummy **C** project from the highschool, made probably in 2008. It's completely useless. I still keep it because someone can use it as an example of using an **escape characters** in **Bash**.
-
-
-
-
-
-The code is in GitHub
diff --git a/source/_posts/2013-10-28-my-presentation-on-openfest-2013.markdown b/source/_posts/2013-10-28-my-presentation-on-openfest-2013.markdown
deleted file mode 100644
index cdbd626..0000000
--- a/source/_posts/2013-10-28-my-presentation-on-openfest-2013.markdown
+++ /dev/null
@@ -1,21 +0,0 @@
----
-layout: post
-title: "My presentation on OpenFest 2013"
-date: 2013-10-28 22:49
-comments: true
-categories: [Conferences, Talking, System Administration, Open Source, IT]
----
-
-
- This year, on OpenFest 2013 I will talk about **Ulteo OVD** - Open Source Application Delivery system. The conference shedule was full and there was just a place on the Lighting Talks, but it's enough. I will cover the core functionality and some words about the company which is developing Ulteo. It's a good idea to invite the developers on the next OpenFest.
-
- I have a working setup in the Francophone center of Sofia University, so it's possible to show it as a demo from my laptop outside.
-
- OpenFest is the biggest conference about Free and Open Source Software and "Open Mind" in Bulgaria. Each year international guests from big projects and companies are invited.
-
- You can see the shedule and the address in the OpenFest site.
-
- My slides are on GitHub.
- Or a temporary snapshot here: http://dallas.petrovs.info/Openfest2013-UlteoOVDPresentation
-
- Hope someone is interested :)
diff --git a/source/_posts/2013-11-03-virtualize-broken-windows-xp-machine.markdown b/source/_posts/2013-11-03-virtualize-broken-windows-xp-machine.markdown
deleted file mode 100644
index d753b4c..0000000
--- a/source/_posts/2013-11-03-virtualize-broken-windows-xp-machine.markdown
+++ /dev/null
@@ -1,111 +0,0 @@
----
-layout: post
-title: "Virtualize a broken Windows XP machine with KVM or Xen, Part1"
-date: 2013-11-03 09:48
-comments: true
-categories: KVM Windows Virtualization Recovery IT
----
-
-There are still online many dirty legacy PCs which cannot be reinstalled. The most common problems are that they are installed with a special software and the CDs are lost or a license problems.
-
-
-
-
-
-But what will happen when your zombie Durom 1300 dies? And your boss wants to use the accounting software ASAP.. The best scenario is when your HDD is healthy :)
-
-First, you shoud find a cheap HDD -> USB converter. This is the clearest solution because I don't want to turn off my virtual hypervisors and probably, the old machine would have an IDE HDDs. Chinese combined IDE/SATA -> USB converters can be found for 15-16$.
-
-
-
-
-
-
-This is the one I'm using..
-
-
-##IMPORTANT!!! The old PC's are too dirty and their cases are sharp and dangerous! You should have a DPT vaccine and suitable protective clothing!!!
-
-The HDD must be put on a PC with a hardware acceleration and KVM installed. In my case, my personal laptop was the salvation. I prepared a dummy VM with virt-manager, just to generate the XML file for libvirt. Use the simplest configuration. WinXP runs on an old hardware... Here are some steps in images:
-
-
-
-
-...
-
-
-
-
-
-
-
-Just one CPU with 1024Mb Ram is OK
-
-
-
-
-
-
-
-It's not necessary to have WinXP iso. Use something just to generate the XML for LibVirt.
-
-
-
-
-
-
-
-The disk is also not revelant. It will be removed after the configuration.
-
-
-
-
-
-
-
-Better use i686
-
-
-
-
-
-
-
-Force off the machine after this window and open the terminal.
-
-
-
-In the terminal, type **$virsh dumpxml WinXp > WinXp.xml** . Open the generated text file with your text editor and find this stanzas:
-
-{% codeblock lang:xml WinXp.xml Before.. %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% endcodeblock %}
-
-Remove the whole stanza about the CD Rom and change the disk configuration like this:
-
-{% codeblock lang:xml WinXp.xml After.. %}
-
-
-
-
-
-
-{% endcodeblock %}
-
-**/dev/sdX** must be your hard drive, connected with the chinese gadget. Make sure it's not mounted on the host system. Now your XP machine should run directly from the hard drive.
-
-###Converting the hard drive to a virtual image..
diff --git a/source/_posts/2013-11-08-virtualize-a-broken-windows-xp-machine-with-kvm-or-xen.markdown b/source/_posts/2013-11-08-virtualize-a-broken-windows-xp-machine-with-kvm-or-xen.markdown
deleted file mode 100644
index e5e44fd..0000000
--- a/source/_posts/2013-11-08-virtualize-a-broken-windows-xp-machine-with-kvm-or-xen.markdown
+++ /dev/null
@@ -1,74 +0,0 @@
----
-layout: post
-title: "Virtualize a broken Windows XP machine with KVM or Xen, Part2"
-date: 2013-11-08 12:39
-comments: true
-categories: KVM Windows Virtualization Recovery IT
----
-
-It's time to convert the physical disk to a virtual image. I'm using KVM almost everywhere, so, this tutorial will be about KVM. You can use the images in Xen/VMWare almost the same way.
-
-
-
-First, install the VirtIO drivers for a better performance. The Fedora team builds isos with binary executables. Check the KVM documentation for the newest info.
-
-First, attache a new VirtIO disk image to the machine. You can use the previously generated image in the installation from Part 1 or create a new one. The size is not important. It's needed just to recognize the new storage format in Windows.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-When it's installed, you can deattach and delete the temporary VirtIO disk.
-
-And now, the converting. I use mostly three tools for this thing:
-
-* VMWare vCenter Converter which is a free tool by VmWare
-* CloneZilla - Open Source Linuxdistribution for creating disk images
-* Byte copy with dd. I don' recommend it because will copy all of the sectors of the disk, even the "empty" ones. The dd way is OK when you will use LVM for a storage format.
-
-I will show you how to convert it with the VmWare tool because It's the easiest way, I think.
-
-You need a free space somewhere to put the converted image from the tool. It's possible to mount a directory from the server, to mount a Samba share or if the physical disk is healthy and there's enough free space, you can put the image right in C:\.
-
-
-
-
-Click on "Convert machine"
-
-
-
-
-This local machine
-
-
-
-VmWare Workstation or other VmWare virtual machine; choose a directory
-
-
-
-Summary..
-
-
-
-And the job is running
-
-
-When it finnish, you will have a directory with the VMDK image in it. KVM supports VMDK, but it's better to convert it to QCOWp2 with:
-
-{% codeblock lang:bash %}
-$ kvm-img convert -O qcow2 WinXP.vmdk WinXP.qcow2
-{% endcodeblock %}
-
-Just put the QCOW2 image in KVM and your XP is virtual :)
diff --git a/source/_posts/2013-11-13-f-dot-b-purity.markdown b/source/_posts/2013-11-13-f-dot-b-purity.markdown
deleted file mode 100644
index a8e32a8..0000000
--- a/source/_posts/2013-11-13-f-dot-b-purity.markdown
+++ /dev/null
@@ -1,9 +0,0 @@
----
-layout: post
-title: "F.B. Purity"
-date: 2013-11-13 16:51
-comments: true
-categories: Fun IT
----
-
-Some of my Facebook friends have enough free time to tepost stupid Facebook page images, Tumblr gifs and other crap. Others are just not clever enough. The worst is when there's a new reality show on the TV, a new internet meme or "just-share-crap" trend. I don't wanna be part of that. **[F.B. Purity](http://www.fbpurity.com/)** helps me to filter the Facebook wall with more advanced tools than the standart FB options. It supports custom words blacklist. Mine is shared on **[GitHub](https://github.com/eniac111/F.B.-PurityBlacklist)**. :)
diff --git a/source/_posts/2014-06-16-photosphere-of-the-slaveykov-hall.markdown b/source/_posts/2014-06-16-photosphere-of-the-slaveykov-hall.markdown
deleted file mode 100644
index 67fe4db..0000000
--- a/source/_posts/2014-06-16-photosphere-of-the-slaveykov-hall.markdown
+++ /dev/null
@@ -1,27 +0,0 @@
----
-layout: post
-title: "Photosphere of the Slaveykov Hall"
-date: 2014-06-16 00:27
-comments: true
-categories: Images
----
-
-Click on the link below to view the image:
-
-
-
-The newest (restored) concert and cinema hall in Sofia. It's located inside the French Institut in Sofia.
-
-##Drag the image with the mouse to change the view and zoom in/out with the scroll
-
-
-
-
-
-
diff --git a/source/_posts/2014-12-08-gmail-is-integrated-with-github.markdown b/source/_posts/2014-12-08-gmail-is-integrated-with-github.markdown
deleted file mode 100644
index 4576ebb..0000000
--- a/source/_posts/2014-12-08-gmail-is-integrated-with-github.markdown
+++ /dev/null
@@ -1,11 +0,0 @@
----
-layout: post
-title: "Gmail is integrated with GitHub!"
-date: 2014-12-08 23:59
-comments: true
-categories: [IT, Stuff]
----
-
-Today I found that Gmail parses the messages from GitHub and integrates small buttons in it's UI :)
-
-{% img center http://petrovs.info/images/gmail-github.png Schematic of the setup %}
\ No newline at end of file
diff --git a/source/_posts/2014-12-21-quick-utility-for-enterprise-security.markdown b/source/_posts/2014-12-21-quick-utility-for-enterprise-security.markdown
deleted file mode 100644
index ac24236..0000000
--- a/source/_posts/2014-12-21-quick-utility-for-enterprise-security.markdown
+++ /dev/null
@@ -1,24 +0,0 @@
----
-layout: post
-title: "Quick utility for enterprise security"
-date: 2014-12-21 16:35
-comments: true
-categories: [IT, Security, Cloud, Utilites]
----
-
-{% img center http://petrovs.info/images/security_usability.png Schematic of the setup %}
-
-Security and usability are almost never mutually inclusive concepts. Expecially in the cloud apps. They are really useful but the security is controversial. Highest security means no internet and even computers..
-
-
-
-In our company, we use OwnCloud. It's an open source application for cloud file synchronization, like DropBox and Google Drive.
-OwnCloud can be used with private SSL keys but it's still not secure because it's written on PHP. I make updates regularly but a security flaw may be undiscovered for weeks or even years ([Heartbleed](http://heartbleed.com/) and [Shellshock](http://en.wikipedia.org/wiki/Shellshock_%28software_bug%29) for example).
-VPN is not a solution because it separates from the point in the middle when OwnCloud is used on a smartphone or tablet.
-I wrote a small application for usage inside our company. It generates an unique string from the filename and the metadata of the office documents.
-
-{% img center http://petrovs.info/images/nebopassgen.png Schematic of the setup %}
-
-The string can be set for a password of the document. This is not a strong security solution, but a small accurance. It's a matter of CPU time for the password to be cracked. But it's even closer to the point in the middle because nobody have to remember the passwords. Maybe it would be good if it uses Kde's Wallet, Gnome Keyring or something other in Windows, but it's still under consideration.
-
-It's sad but I cannot make it Open Source :D
\ No newline at end of file
diff --git a/source/_posts/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment.markdown b/source/_posts/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment.markdown
deleted file mode 100644
index 01af121..0000000
--- a/source/_posts/2015-01-14-quick-way-to-setup-virtualbox-vm-in-multi-user-environment.markdown
+++ /dev/null
@@ -1,100 +0,0 @@
----
-layout: post
-title: "Quick way to setup VirtualBox VM in multi user environment"
-date: 2015-01-14 12:07
-comments: true
-categories: [IT, Virtualization, Ubuntu, Tools, VirtualBox]
----
-
-Let's assume that we need to setup VirtualBox VM with Windows XP and an old version of Microsoft Office. The machine must be used from everyone on a given number of Linux workstations. The workstations may work with LDAP and NFS/Cifs. The standard installation of the VM would be extremely space consuming and it would cost a lot of the personal life of the administrator.
-I made an easy hack to solve this ( this is real setup in university labs).
-
-
-Let's install a standard local Windows XP virtual machine and permanently mount the local directories */home/trendafil* and */media* .
-In this example, the home directory of the user will be mounted on *X:\\* on Windows and media will be *Z:\\* .
-
-The important directories are out of the VM. So, the virtual machine will be runned from snapshot on every boot.
-The next useful step is to move the default user profile outside the VM. I don't need something different than *My Documents* but in other cases, everything from the profile can be exported to */home*, outside the VM. So, open *"regedit"* in Windows and go to the
-
-{% codeblock %}
-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell User Folders
-{% endcodeblock %}
-
-and change the key *"My Documents"* to *X:\\*
-
-
-
-Turn off the VM and create an empty snapshot
-
-
-
-Next, move the VM from *~/VirtualBox VMs* to *~/.config/VirtualBox* if it's the official VirtualBox edition or *~/.VirtualBox* for the open source edition from the Ubuntu repositories.
-
-Open the file *~/.config/VirtualBox/VirtualBox.xml* and clean it from the needless stuff:
-
-{% codeblock %}
-
-
-
-
-...
-
-
-{% endcodeblock %}
-
-Also, replace the username the same way in *"~/.VirtualBox/WinXP/WinXP.xml"*
-
-Change the location of the harddisk image to */var/vbox/* like this:
-
-{% codeblock lang:xml %}
-
-{% endcodeblock %}
-
-Create the directory */var/vbox/* and then move the harddisk image from *~/.VirtualBox/WinXp/winxp.vmdk* to */var/vbox* .
-
-Then, move the whole *~/.VirtualBox* or *~/.config/VirtualBox* to */var/vbox*
-
-Install Zenity if it's not installed:
-
-{% codeblock lang:bash %}
-$ sudo apt-get install zenity
-{% endcodeblock %}
-
-Download this file and put it on /usr/local/bin/startwin:
-
-
-
-and make it executable:
-
-{% codeblock lang:bash %}
-# chmod +x /usr/local/bin/startwin
-{% endcodeblock %}
-
-It should work now. Every user of the system can start the VM from the script.
-
-Additionaly, you can create a desktop enry.
-First, find an ugly Window$ logo with an open license and put it on */usr/share/icons/win.png*. Then, create the file */usr/share/applications/startwin.desktop* with this content:
-
-{% codeblock %}
-
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Name=Windows XP
-GenericName=Windows XP
-Type=Application
-Exec=/usr/lcal/bin/startwin
-TryExec=/usr/local/bin/startwin
-Icon=/usr/share/icons/win.png
-Categories=Emulator;System;Application;
-Comment=WindowsXP VirtualBox WM
-
-{% endcodeblock %}
diff --git a/source/_posts/2015-02-05-quick-way-to-setup-virtualbox-vm-in-multi-user-environment.markdown b/source/_posts/2015-02-05-quick-way-to-setup-virtualbox-vm-in-multi-user-environment.markdown
deleted file mode 100644
index 01af121..0000000
--- a/source/_posts/2015-02-05-quick-way-to-setup-virtualbox-vm-in-multi-user-environment.markdown
+++ /dev/null
@@ -1,100 +0,0 @@
----
-layout: post
-title: "Quick way to setup VirtualBox VM in multi user environment"
-date: 2015-01-14 12:07
-comments: true
-categories: [IT, Virtualization, Ubuntu, Tools, VirtualBox]
----
-
-Let's assume that we need to setup VirtualBox VM with Windows XP and an old version of Microsoft Office. The machine must be used from everyone on a given number of Linux workstations. The workstations may work with LDAP and NFS/Cifs. The standard installation of the VM would be extremely space consuming and it would cost a lot of the personal life of the administrator.
-I made an easy hack to solve this ( this is real setup in university labs).
-
-
-Let's install a standard local Windows XP virtual machine and permanently mount the local directories */home/trendafil* and */media* .
-In this example, the home directory of the user will be mounted on *X:\\* on Windows and media will be *Z:\\* .
-
-The important directories are out of the VM. So, the virtual machine will be runned from snapshot on every boot.
-The next useful step is to move the default user profile outside the VM. I don't need something different than *My Documents* but in other cases, everything from the profile can be exported to */home*, outside the VM. So, open *"regedit"* in Windows and go to the
-
-{% codeblock %}
-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell User Folders
-{% endcodeblock %}
-
-and change the key *"My Documents"* to *X:\\*
-
-
-
-Turn off the VM and create an empty snapshot
-
-
-
-Next, move the VM from *~/VirtualBox VMs* to *~/.config/VirtualBox* if it's the official VirtualBox edition or *~/.VirtualBox* for the open source edition from the Ubuntu repositories.
-
-Open the file *~/.config/VirtualBox/VirtualBox.xml* and clean it from the needless stuff:
-
-{% codeblock %}
-
-
-
-
-...
-
-
-{% endcodeblock %}
-
-Also, replace the username the same way in *"~/.VirtualBox/WinXP/WinXP.xml"*
-
-Change the location of the harddisk image to */var/vbox/* like this:
-
-{% codeblock lang:xml %}
-
-{% endcodeblock %}
-
-Create the directory */var/vbox/* and then move the harddisk image from *~/.VirtualBox/WinXp/winxp.vmdk* to */var/vbox* .
-
-Then, move the whole *~/.VirtualBox* or *~/.config/VirtualBox* to */var/vbox*
-
-Install Zenity if it's not installed:
-
-{% codeblock lang:bash %}
-$ sudo apt-get install zenity
-{% endcodeblock %}
-
-Download this file and put it on /usr/local/bin/startwin:
-
-
-
-and make it executable:
-
-{% codeblock lang:bash %}
-# chmod +x /usr/local/bin/startwin
-{% endcodeblock %}
-
-It should work now. Every user of the system can start the VM from the script.
-
-Additionaly, you can create a desktop enry.
-First, find an ugly Window$ logo with an open license and put it on */usr/share/icons/win.png*. Then, create the file */usr/share/applications/startwin.desktop* with this content:
-
-{% codeblock %}
-
-[Desktop Entry]
-Encoding=UTF-8
-Version=1.0
-Name=Windows XP
-GenericName=Windows XP
-Type=Application
-Exec=/usr/lcal/bin/startwin
-TryExec=/usr/local/bin/startwin
-Icon=/usr/share/icons/win.png
-Categories=Emulator;System;Application;
-Comment=WindowsXP VirtualBox WM
-
-{% endcodeblock %}
diff --git a/source/_posts/2015-03-08-how-to-cook-patatnik.markdown b/source/_posts/2015-03-08-how-to-cook-patatnik.markdown
deleted file mode 100644
index 8324b60..0000000
--- a/source/_posts/2015-03-08-how-to-cook-patatnik.markdown
+++ /dev/null
@@ -1,71 +0,0 @@
----
-layout: post
-title: "How to cook Patatnik?"
-date: 2015-03-08 23:01
-comments: true
-categories: geekscookin cooking gkin
----
-
-This is my first non technical post here. I'm goona explain in details my way to cook Patatnik - Bulgarian dish from the Rhodopi Mountains. It's made of shredded potatoes, eggs, onions, cheese and some local spices. I'm not sure if this is the most authentic recipe but it's the way I like it.
-
-
-
-## What is needed for two servings:
-1. 3 - 4 medium potatoes;
-2. A head of an onion;
-3. 3 eggs;
-4. ~100g. of white cheese (Sirene. It's famous in the balkans. Something similar is the greek Féta but it's too greasy. In western europe, Sirene can be found in the Polish shops (in UK) and the arabic markets);
-5. Sprig of Spearmint (in Bulgarian it's called Dzhodzhen or Gyozum, the latin name is Mentha Spicata. This spice is very suitable for potatoes and beans.);
-6. Salt. Instead of salt I'm using "Chiirska merudiya". It's a type of grass which is crushed with salt and dried. I don't know the official name of the plant. It's known and called "Chiirska merudiya" in the region of Trakia in Bulgaria. It's very simmilar to "Nectaroscordum siculum ssp. bulgaricum" which is used the same way, with salt.
-
-### First, peel the potatoes:
-
-
-
-### After that, cut the onion into small pieces:
-
-
-
-
-### Shred the potatoes thinly:
-
-
-
-
-### Squeeze the potatoes by hand to dehidrate them (That's my way?!):
-
-
-... and throw the water!
-
-### Add the onion:
-
-
-
-### Add the eggs and the cheese:
-
-The cheese and the eggs can be smashed and mixed previously.
-
-
-
-### Add the spices and then mix everthing again:
-
-
-
-This is how a jar of home made Merudia salt looks like:
-
-
-### Grease two clay plates with some oil:
-
-These are authentic bulgarian plates :)
-
-
-
-### Put the mixture in the plates and bake it:
-
-It must be baked on 220°c between 30 and 60 minutes. Depends of the humidity of the mixture.
-
-
-
-### ... and voilà! Serve it with [Ayran](http://en.wikipedia.org/wiki/Ayran) and something spicy ;)
-
-
diff --git a/source/_posts/2015-03-11-qnd-home-bruschettes.markdown b/source/_posts/2015-03-11-qnd-home-bruschettes.markdown
deleted file mode 100644
index 033676b..0000000
--- a/source/_posts/2015-03-11-qnd-home-bruschettes.markdown
+++ /dev/null
@@ -1,45 +0,0 @@
----
-layout: post
-title: "QnD home bruschettes"
-date: 2015-03-11 19:56
-comments: true
-categories: geekscookin cooking gkin
----
-
-My second culinary post. I'm going to show you how to bake bruschettes at home, the quick way.
-
-## What is needed:
-* A Gevrek or more gevreks;
-* Butter;
-* Salt (or Tchiyrska Merudiya, from my last post);
-* Caraway (optional)
-
-
-
-### The Gevrek...
-
-
-
-### Must be cut into small pieces:
-
-
-
-### The pan and the pieces must be spread with some butter:
-
-
-
-### ... and the pieces must be salted.
-
-Caraway and other spices are optional. Interesting idea is an olive paste or blue cheese.
-
-
-
-### Put the pan in the oven for ~10min at 220°c:
-
-
-
-### But be careful!
-
-
-
-## Fin!
\ No newline at end of file
diff --git a/source/_posts/2015-12-27-My-way-to-auto-update-Lets-Encrypt/https.jpg b/source/_posts/2015-12-27-My-way-to-auto-update-Lets-Encrypt/https.jpg
deleted file mode 100644
index e48bd3d..0000000
Binary files a/source/_posts/2015-12-27-My-way-to-auto-update-Lets-Encrypt/https.jpg and /dev/null differ
diff --git a/source/_posts/2016-01-07-Example-of-MySQL-incremental-backup-with-XtraBackup.md b/source/_posts/2016-01-07-Example-of-MySQL-incremental-backup-with-XtraBackup.md
deleted file mode 100644
index 0a4d6cf..0000000
--- a/source/_posts/2016-01-07-Example-of-MySQL-incremental-backup-with-XtraBackup.md
+++ /dev/null
@@ -1,33 +0,0 @@
-title: Example of MySQL incremental backup with XtraBackup
-date: 2016-01-07 11:54:27
-tags: MySQL MariaDB XtraBAckup Percona
----
-
-Percona's [XtraBackup](https://www.percona.com/doc/percona-xtrabackup/2.3/index.html) is really good solution for incremental backups if small or large MySQL/MariaDB databases. Mysqldump is really slow and is not downtimeless.
-In our case, we need two week history of every day. Every Sunday the backup will be full and the rest of the days, backups will be incremental, based on Sunday's full backup. The backups will be placed in a folder named *current_week*. Every Sunday, the folder will be renamed to *last_week* and new, empty *current_week* will be created before the full backup.
-
-
-
-Here is the script:
-
-{% gist eniac111/b37297e83cd5fa99e59e %}
-
-It "wants" the day of the week as the first parameter, and the mysql password as a second parameter, like this:
-
-{% codeblock lang:bash %}
-./backup-mysql.sh Sunday 12345
-./backup-mysql.sh Monday 12345
-{% endcodeblock %}
-
-Put it in */usr/local/bin/backup-mysql* for example and make it executable. Here is an example cron config, running every day at 2:00 AM:
-
-{% codeblock lang:bash %}
-0 2 * * 0 /usr/local/bin/backup-mysql Sunday 12345 >/dev/null 2>&1
-0 2 * * 1 /usr/local/bin/backup-mysql Monday 12345 >/dev/null 2>&1
-0 2 * * 2 /usr/local/bin/backup-mysql Tuesday 12345 >/dev/null 2>&1
-0 2 * * 3 /usr/local/bin/backup-mysql Wednesday 12345 >/dev/null 2>&1
-0 2 * * 4 /usr/local/bin/backup-mysql Thursday 12345 >/dev/null 2>&1
-0 2 * * 5 /usr/local/bin/backup-mysql Friday 12345 >/dev/null 2>&1
-0 2 * * 6 /usr/local/bin/backup-mysql Saturday 12345 >/dev/null 2>&1
-{% endcodeblock %}
-
diff --git a/source/_posts/2017-01-03-Open-data-of-SofiaTraffic/background.jpg b/source/_posts/2017-01-03-Open-data-of-SofiaTraffic/background.jpg
deleted file mode 100644
index 89bcb6c..0000000
Binary files a/source/_posts/2017-01-03-Open-data-of-SofiaTraffic/background.jpg and /dev/null differ
diff --git a/source/all-archives/index.md b/source/all-archives/index.md
deleted file mode 100644
index 93919cd..0000000
--- a/source/all-archives/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: "all-archives"
-layout: "all-archives"
-comments: false
----
diff --git a/source/all-categories/index.md b/source/all-categories/index.md
deleted file mode 100644
index 15adb4f..0000000
--- a/source/all-categories/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: "all-categories"
-layout: "all-categories"
-comments: false
----
diff --git a/source/all-tags/index.md b/source/all-tags/index.md
deleted file mode 100644
index fb0ad99..0000000
--- a/source/all-tags/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: "all-tags"
-layout: "all-tags"
-comments: false
----
diff --git a/static/retro-torch.gif b/static/retro-torch.gif
new file mode 100644
index 0000000..0df585e
Binary files /dev/null and b/static/retro-torch.gif differ
diff --git a/themes/alberta-eniac111 b/themes/alberta-eniac111
deleted file mode 160000
index 042a556..0000000
--- a/themes/alberta-eniac111
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 042a556e98b8d0459be9b33401f9d04e0d0703b1
diff --git a/themes/hugo.386 b/themes/hugo.386
new file mode 160000
index 0000000..f348b4f
--- /dev/null
+++ b/themes/hugo.386
@@ -0,0 +1 @@
+Subproject commit f348b4f6e84cc91516f3cabb55183b6a6c9fa4e5
diff --git a/themes/landscape/Gruntfile.js b/themes/landscape/Gruntfile.js
deleted file mode 100644
index 59fd5df..0000000
--- a/themes/landscape/Gruntfile.js
+++ /dev/null
@@ -1,46 +0,0 @@
-module.exports = function(grunt){
- grunt.initConfig({
- gitclone: {
- fontawesome: {
- options: {
- repository: 'https://github.com/FortAwesome/Font-Awesome.git',
- directory: 'tmp/fontawesome'
- },
- },
- fancybox: {
- options: {
- repository: 'https://github.com/fancyapps/fancyBox.git',
- directory: 'tmp/fancybox'
- }
- }
- },
- copy: {
- fontawesome: {
- expand: true,
- cwd: 'tmp/fontawesome/fonts/',
- src: ['**'],
- dest: 'source/css/fonts/'
- },
- fancybox: {
- expand: true,
- cwd: 'tmp/fancybox/source/',
- src: ['**'],
- dest: 'source/fancybox/'
- }
- },
- _clean: {
- tmp: ['tmp'],
- fontawesome: ['source/css/fonts'],
- fancybox: ['source/fancybox']
- }
- });
-
- require('load-grunt-tasks')(grunt);
-
- grunt.renameTask('clean', '_clean');
-
- grunt.registerTask('fontawesome', ['gitclone:fontawesome', 'copy:fontawesome', '_clean:tmp']);
- grunt.registerTask('fancybox', ['gitclone:fancybox', 'copy:fancybox', '_clean:tmp']);
- grunt.registerTask('default', ['gitclone', 'copy', '_clean:tmp']);
- grunt.registerTask('clean', ['_clean']);
-};
\ No newline at end of file
diff --git a/themes/landscape/LICENSE b/themes/landscape/LICENSE
deleted file mode 100644
index 9ce4d32..0000000
--- a/themes/landscape/LICENSE
+++ /dev/null
@@ -1,7 +0,0 @@
-Copyright (c) 2013 Tommy Chen
-
-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.
\ No newline at end of file
diff --git a/themes/landscape/README.md b/themes/landscape/README.md
deleted file mode 100644
index 8295fbe..0000000
--- a/themes/landscape/README.md
+++ /dev/null
@@ -1,111 +0,0 @@
-# Landscape
-
-A brand new default theme for [Hexo].
-
-- [Preview](http://hexo.io/hexo-theme-landscape/)
-
-## Installation
-
-### Install
-
-``` bash
-$ git clone https://github.com/hexojs/hexo-theme-landscape.git themes/landscape
-```
-
-**Landscape requires Hexo 2.4 and above.**
-
-### Enable
-
-Modify `theme` setting in `_config.yml` to `landscape`.
-
-### Update
-
-``` bash
-cd themes/landscape
-git pull
-```
-
-## Configuration
-
-``` yml
-# Header
-menu:
- Home: /
- Archives: /archives
-rss: /atom.xml
-
-# Content
-excerpt_link: Read More
-fancybox: true
-
-# Sidebar
-sidebar: right
-widgets:
-- category
-- tag
-- tagcloud
-- archives
-- recent_posts
-
-# Miscellaneous
-google_analytics:
-favicon: /favicon.png
-twitter:
-google_plus:
-```
-
-- **menu** - Navigation menu
-- **rss** - RSS link
-- **excerpt_link** - "Read More" link at the bottom of excerpted articles. `false` to hide the link.
-- **fancybox** - Enable [Fancybox]
-- **sidebar** - Sidebar style. You can choose `left`, `right`, `bottom` or `false`.
-- **widgets** - Widgets displaying in sidebar
-- **google_analytics** - Google Analytics ID
-- **favicon** - Favicon path
-- **twitter** - Twiiter ID
-- **google_plus** - Google+ ID
-
-## Features
-
-### Fancybox
-
-Landscape uses [Fancybox] to showcase your photos. You can use Markdown syntax or fancybox tag plugin to add your photos.
-
-```
-![img caption](img url)
-
-{% fancybox img_url [img_thumbnail] [img_caption] %}
-```
-
-### Sidebar
-
-You can put your sidebar in left side, right side or bottom of your site by editing `sidebar` setting.
-
-Landscape provides 5 built-in widgets:
-
-- category
-- tag
-- tagcloud
-- archives
-- recent_posts
-
-All of them are enabled by default. You can edit them in `widget` setting.
-
-## Development
-
-### Requirements
-
-- [Grunt] 0.4+
-- Hexo 2.4+
-
-### Grunt tasks
-
-- **default** - Download [Fancybox] and [Font Awesome].
-- **fontawesome** - Only download [Font Awesome].
-- **fancybox** - Only download [Fancybox].
-- **clean** - Clean temporarily files and downloaded files.
-
-[Hexo]: http://zespia.tw/hexo/
-[Fancybox]: http://fancyapps.com/fancybox/
-[Font Awesome]: http://fontawesome.io/
-[Grunt]: http://gruntjs.com/
diff --git a/themes/landscape/_config.yml b/themes/landscape/_config.yml
deleted file mode 100644
index 85a1ccf..0000000
--- a/themes/landscape/_config.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-# Header
-menu:
- Home: /
- Archives: /archives
-rss: /atom.xml
-
-# Content
-excerpt_link: Read More
-fancybox: true
-
-# Sidebar
-sidebar: right
-widgets:
-- category
-- tag
-- tagcloud
-- archive
-- recent_posts
-
-# Miscellaneous
-google_analytics:
-favicon: /favicon.png
-twitter:
-google_plus:
-fb_admins:
-fb_app_id:
\ No newline at end of file
diff --git a/themes/landscape/layout/_partial/after-footer.ejs b/themes/landscape/layout/_partial/after-footer.ejs
deleted file mode 100644
index 3ddfbee..0000000
--- a/themes/landscape/layout/_partial/after-footer.ejs
+++ /dev/null
@@ -1,24 +0,0 @@
-<% if (config.disqus_shortname){ %>
-
-<% } %>
-
-
-
-<% if (theme.fancybox){ %>
- <%- css('fancybox/jquery.fancybox') %>
- <%- js('fancybox/jquery.fancybox.pack') %>
-<% } %>
-
-<%- js('js/script') %>
diff --git a/themes/landscape/layout/_partial/archive-post.ejs b/themes/landscape/layout/_partial/archive-post.ejs
deleted file mode 100644
index 36f2cc3..0000000
--- a/themes/landscape/layout/_partial/archive-post.ejs
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
'
- ].join('');
-
- var box = $(html);
-
- $('body').append(box);
- }
-
- $('.article-share-box.on').hide();
-
- box.css({
- top: offset.top + 25,
- left: offset.left
- }).addClass('on');
- }).on('click', '.article-share-box', function(e){
- e.stopPropagation();
- }).on('click', '.article-share-box-input', function(){
- $(this).select();
- }).on('click', '.article-share-box-link', function(e){
- e.preventDefault();
- e.stopPropagation();
-
- window.open(this.href, 'article-share-box-window-' + Date.now(), 'width=500,height=450');
- });
-
- // Caption
- $('.article-entry').each(function(i){
- $(this).find('img').each(function(){
- if ($(this).parent().hasClass('fancybox')) return;
-
- var alt = this.alt;
-
- if (alt) $(this).after('' + alt + '');
-
- $(this).wrap('');
- });
-
- $(this).find('.fancybox').each(function(){
- $(this).attr('rel', 'article' + i);
- });
- });
-
- if ($.fancybox){
- $('.fancybox').fancybox();
- }
-
- // Mobile nav
- var $container = $('#container'),
- isMobileNavAnim = false,
- mobileNavAnimDuration = 200;
-
- var startMobileNavAnim = function(){
- isMobileNavAnim = true;
- };
-
- var stopMobileNavAnim = function(){
- setTimeout(function(){
- isMobileNavAnim = false;
- }, mobileNavAnimDuration);
- }
-
- $('#main-nav-toggle').on('click', function(){
- if (isMobileNavAnim) return;
-
- startMobileNavAnim();
- $container.toggleClass('mobile-nav-on');
- stopMobileNavAnim();
- });
-
- $('#wrap').on('click', function(){
- if (isMobileNavAnim || !$container.hasClass('mobile-nav-on')) return;
-
- $container.removeClass('mobile-nav-on');
- });
-})(jQuery);
\ No newline at end of file
diff --git a/themes/transquilpeak/.bowerrc b/themes/transquilpeak/.bowerrc
deleted file mode 100644
index b0bcb1e..0000000
--- a/themes/transquilpeak/.bowerrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "directory": "source/_bower_components"
-}
\ No newline at end of file
diff --git a/themes/transquilpeak/Gruntfile.js b/themes/transquilpeak/Gruntfile.js
deleted file mode 100644
index d7f1759..0000000
--- a/themes/transquilpeak/Gruntfile.js
+++ /dev/null
@@ -1,52 +0,0 @@
-module.exports = function(grunt) {
-
-
- // Load the include-all library in order to require all of our grunt
- // configurations and task registrations dynamically.
- var includeAll;
-
- try {
- includeAll = require('include-all');
- }
- catch (e0) {
- console.error('Could not find `include-all` module.');
- console.error('Skipping grunt tasks...');
- console.error('To fix this, please run:');
- console.error('npm install include-all --save-dev');
- console.error();
- }
-
- /**
- * Loads Grunt configuration modules from the specified
- * relative path. These modules should export a function
- * that, when run, should either load/configure or register
- * a Grunt task.
- */
- function loadTasks(relPath) {
- return includeAll({
- dirname: require('path').resolve(__dirname, relPath),
- filter: /(.+)\.js$/
- }) || {};
- }
-
- /**
- * Invokes the function from a Grunt configuration module with
- * a single argument - the `grunt` object.
- */
- function invokeConfigFn(tasks) {
- for (var taskName in tasks) {
- if (tasks.hasOwnProperty(taskName)) {
- tasks[taskName](grunt);
- }
- }
- }
-
- // Load task functions
- var taskConfigurations = loadTasks('./tasks/config'),
- registerDefinitions = loadTasks('./tasks/register');
-
- // Run task functions to configure Grunt.
- invokeConfigFn(taskConfigurations);
- invokeConfigFn(registerDefinitions);
-
-};
diff --git a/themes/transquilpeak/LICENSE b/themes/transquilpeak/LICENSE
deleted file mode 100644
index d653343..0000000
--- a/themes/transquilpeak/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- tranquilpeak-hexo-theme is a gorgeous theme for Hexo static blog
- Copyright (C) 2015 Louis Barranqueiro
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- tranquilpeak-hexo-theme Copyright (C) 2015 Louis Barranqueiro
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
diff --git a/themes/transquilpeak/README.md b/themes/transquilpeak/README.md
deleted file mode 100644
index 29280d6..0000000
--- a/themes/transquilpeak/README.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# Tranquilpeak
-
-A gorgeous responsive theme for Hexo blog framework
-
-![Tranquilpeak](http://d1u9biwaxjngwg.cloudfront.net/showcases/showcase-v1.6.jpg)
-
-## Summary ##
-
-- [General](#general)
-- [Features](#features)
-- [Quick start](#quick-start)
-- [Demo](#demo)
-- [Showcase](#showcase)
-- [Documentation](#documentation)
-- [Contributing](#contributing)
-- [License](#license)
-
-## General ##
-
-- **Author** : Louis Barranqueiro
-- **Version** : 1.6.0
-- **Compatibility** : Hexo 3.0.0 or later
-
-## Features ##
-
-**General features :**
-- Fully responsive
-- Optimized for tablets & mobiles
-- Configurable menu of the sidebar
-- Pages to filter tags, categories and archives
-- Background cover image
-- Beautiful about page
-- Support Open Graph protocol
-- Support internationalization (i18n)
-
-
-**Posts features :**
-- Thumbnail image
-- Cover image
-- Responsive videos & images
-- Sharing options
-- Navigation menu
-- GitHub theme for code highlighting
-- Image gallery
-- Image generator helpers
-- Table of contents
-
-
-**Integrated services :**
-- Disqus
-- Duoshuo
-- Google analytics
-- Baidu analytics
-- Gravatar
-- Swiftype
-- Facebook Insights
-
-## Quick start ##
-
-**Please read [user documentation](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/blob/master/docs/user.md), it's short and useful to discover all features and possibilities of the theme, especially the [writing posts](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/blob/master/docs/user.md#writing-posts) section**
-##### For people who want to use the original version of Tranquilpeak (users)
-1. Download the latest version ready for production utilisation here : [hexo-theme-tranquilpeak-prod-1.6.0]
-(https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/releases/download/v1.6.0/hexo-theme-tranquilpeak-built-for-production-1.6.0.zip)
-2. Follow [user documentation](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/blob/master/docs/user.md) to install and configure the theme
-
-##### For people who want to create their own version of tranquilpeak (developers)
-1. Run `git clone https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak.git`
-2. Follow [developer documentation](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/blob/master/docs/developer.md) to edit and build the theme
-
-## Demo ##
-
-Check out Tranquilpeak theme in live : [Tranquilpeak-hexo-theme demo](http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak)
-
-## Showcase ##
-
-I would like to create a showcase with all blogs having a customized version of tranquilpeak theme.
-If you have customized the original version, please, add your blog into.
-
-##### Via an issue
-1. Create an issue with your blog url and a short description of your changes by clicking [here](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/issues/new?title=Add%20my%20blog%20into%20showcase&body=Hey,%20check%20out%20my%20custom%20version%20of%20Tranquilpeak%20:%0D%0A*%20URL%20:%20%0D%0A*%20Changes%20(short%20description)%20:%20)
-
-I will judge if the theme is enough customized to be added into showcase.
-
-## Documentation ##
-
-If it's your first time using Hexo, please check [Hexo official documentation](https://hexo.io/docs/)
-
-##### For users
-To install and configure the theme, consult the following documentation : [user documentation](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/blob/master/docs/user.md)
-
-##### For developers
-To understand better the code and edit the theme, consult the following documentation : [developer documentation](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/blob/master/docs/developer.md)
-
-## Contributing ##
-
-[![Join the chat at https://gitter.im/LouisBarranqueiro/hexo-theme-tranquilpeak](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/LouisBarranqueiro/hexo-theme-tranquilpeak?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-All kinds of contributions (enhancements, new features, documentation & code improvements, issues & bugs reporting) are welcome.
-
-All pull requests must be done on the `dev` branch.
-
-## License ##
-
-Tranquilpeak-hexo-theme is released under the terms of the [GNU General Public License v3.0](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/blob/master/LICENSE)
diff --git a/themes/transquilpeak/_config.yml b/themes/transquilpeak/_config.yml
deleted file mode 100644
index 23b37e3..0000000
--- a/themes/transquilpeak/_config.yml
+++ /dev/null
@@ -1,187 +0,0 @@
-# Tranquilpeak
-# Version : 1.6.0
-# Author : Louis Barranqueiro
-
-# I STRONGLY recommend you to use a CDN to speed up loading of pages.
-# There is many free CDN like Cloudinary or you can also use indirectly
-# by using services like Google Photos.
-
-# If you want to store images yourself, please read this guidelines:
-# For users, if you only use this theme, put your images directly in `source/assets/images` folder
-# But if you want to add local images, you can put your images directly in `source/assets/images` folder
-# For developpers, if you modify this theme, put your images in `source/_images` folder and
-# use grunt task `build` to synchronize assets
-
-
-# Image directory (default: images)
-image_dir: assets/images
-
-
-# Sidebar Configuration
-# You can add groups of links and links much as you want
-# You just have to respect the indentation : `groups of links` -> `link` -> `title, link, icon`
-# E.g:
-# -------------
-# sidebar: # DON'T modify this variable name
-# menu: # Name of your groups of links (changeable)
-# home: # Name of your link (changeable)
-# title: Home # Title of your link displayed
-# url: / # URL of the link. If the URL is internal, domain name is not necessary
-# icon: home # Name of the font awesome icon class without the `fa-`
-# # Go to http://fontawesome.io/icons/ to find class name of icon
-sidebar:
- menu:
- home:
- title: global.home
- url: /
- icon: home
- categories:
- title: global.categories
- url: /all-categories
- icon: bookmark
- tags:
- title: global.tags
- url: /all-tags
- icon: tags
- archives:
- title: global.archives
- url: /all-archives
- icon: archive
- search:
- title: global.search
- url: /#search
- icon: search
- # `st-search-show-outputs` classes are used to open swiftype search window
- class: st-search-show-outputs
- about:
- title: global.about
- url: /#about
- icon: question
- author_links:
- github:
- title: Github
- url: https://github.com/eniac111
- icon: github
- # stack_overflow:
- # title: global.stack_overflow
- # url: http://stackoverflow.com/users
- # icon: stack-overflow
- twitter:
- title: global.twitter
- url: https://twitter.com/eniac111
- icon: twitter
- # facebook:
- # title: global.facebook
- # url: https://facebook.com/
- # icon: facebook
- # google_plus:
- # title: global.google_plus
- # url: https://plus.google.com/
- # icon: google-plus
- linked_in:
- title: global.linkedin
- url: https://linkedin.com/in/blpetrov
- icon: linkedin
- mail:
- title: global.mail
- url: mailto:blagovest@petrovs.info
- icon: envelope-o
- rss:
- rss:
- title: global.rss
- url: /atom.xml
- icon: rss
-
-
-# Header configuration
-# The link at the right of the header is customizable
-# You can add a link (as an icon) at the right of the header instead of the author's gravatar image or author's picture.
-# By default, author's gravatar or author's picture is displayed if `icon` is empty
-# DON'T edit `header`, `right_link`, `url`, `icon` and `class` variable name
-# E.g to display a shortcut to open swiftype search window :
-# url: /#search
-# icon: search
-# class: st-search-show-outputs
-header:
- right_link:
- url: /#about
- icon:
- class:
-
-
-# Author
-# Your biography and your job is editable in each languages files in `languages` folder
-author:
- email: blagovest@petrovs.info
- location: Sofia, Bulgaria
- # Your profile picture located in folder `source/_images/` (development)
- # or in `source/assets/images/` (production)
- # or you can use an external url
- # Overwritten by your gravatar image if `gravatar_email` is filled
- picture:
- # Your Twitter username without the @. E.g : `tranquilpeak`
- twitter: eniac111
- # Your google plus profile id. E.g : `+Tranquilpeak` or `123812884128439`
- google_plus:
-
- job: DevOps Engineer
-
-
-# Customization
-# Define the behavior of the sidebar
-# 1: Display large sidebar on large screen, medium sidebar on medium screen and header bar on small screen
-# and large sidebar is swiped
-# 2: Display medium sidebar on large and medium screen and header bar on small screen and medium sidebar is swiped (default)
-# 3: Display header bar on all screens and large sidebar is swiped
-# 4: Display header bar on all screens and medium sidebar is swiped
-sidebar_behavior: 1
-# Hide sidebar on all article page to let article take full width to improve reading, and enjoy wide images and cover images. (true: enable, false: disable)
-clear_reading: true
-# Head title displayed at the top of the table of contents.
-toc_title: Table of contents
-# Display thumbnail image of each post on index pages (false: disabled, true: enabled)
-thumbnail_image: true
-# Display thumbnail image at the right of title in index pages (`right`, `left` or `bottom`)
-# Set this value to `right` if you have old posts to keep the old style on them
-# and define `thumbnailImagePosition` on a post to overwrite this setting
-thumbnail_image_position: right
-# Automatically select the cover image or the first photo from the gallery of a post if there is no thumbnail image as the thumbnail image
-# Set this value to `true` if you have old posts that use the cover image or the first photo as the thumbnail image
-# and set `autoThumbnailImage` to `false` on a post to overwrite this setting
-auto_thumbnail_image: true
-# Your blog cover picture. I STRONGLY recommend you to use a CDN to speed up loading of pages.
-# There is many free CDN like Cloudinary or you can also use indirectly
-# by using services like Google Photos.
-# Current image is on AWS S3 and delivered by AWS CloudFront.
-# Otherwise put your image in folder `source/_images/` (development) or in `source/assets/images/` if you can't or don't want to build the theme,
-# and use relative url : `your-image.png`
-cover_image: cover.jpg
-# Your favicon located in folder `source/_images/` (development) or in `source/assets/images/` (production)
-favicon:
-# Display an image gallery at the end of a post which have photos variables (false: disabled, true: enabled)
-image_gallery: true
-# Pagination behavior of archive, category and tag pages (false: pagination disabled, true: pagination enabled)
-archive_pagination: true
-category_pagination: true
-tag_pagination: true
-
-
-# Integrated services
-# You can't use Disqus and Duoshuo together
-# then fill the right shortname
-# Your Disqus shortname
-disqus_shortname: blagosblog
-# Your Duoshuo shortname
-duoshuo_shortname:
-# Your Google analystics web property ID : UA-XXXXX-X
-google_analytics_id: UA-44632309-1
-# Your Baidu analystics web property ID : 9505a5af654a2478f93fd6c0ae4f687d
-baidu_analytics_id:
-# Your Gravatar email. Overwrite `author.picture` everywhere in the blog
-gravatar_email: blagovest@petrovs.info
-# Your swiftype install key
-swiftype_install_key:
-# Your Facebook user ids used to connect your blog with your facebook user accounts (Facebook Insights). Separate ids with comma. e.g : 9830047,1003342
-fb_admin_ids:
-# Your Facebook app id used to connect your blog with your facebook app account (Facebook Insights). E.g : 9841307
-fb_app_id:
diff --git a/themes/transquilpeak/bower.json b/themes/transquilpeak/bower.json
deleted file mode 100644
index 82f2db8..0000000
--- a/themes/transquilpeak/bower.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "hexo-theme-tranquilpeak",
- "version": "1.6.0",
- "description": "A gorgeous responsive theme for Hexo blog framework",
- "authors": [
- "Louis Barranqueiro"
- ],
- "license": "GNU General Public License v3.0",
- "ignore": [
- "**/.*",
- "node_modules",
- "source/_bower_components/",
- "test",
- "tests"
- ],
- "dependencies": {
- "fontawesome": "~4.3.0",
- "jquery": "~2.1.3",
- "fancybox": "~2.1.5"
- }
-}
diff --git a/themes/transquilpeak/docs/developer.md b/themes/transquilpeak/docs/developer.md
deleted file mode 100644
index a0a621c..0000000
--- a/themes/transquilpeak/docs/developer.md
+++ /dev/null
@@ -1,587 +0,0 @@
-# Developer documentation #
-
-This documentation will help you to understand Tranquilpeak Hexo theme code.
-
-If you want to report a bug or ask a question, [create an issue](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/issues/new).
-
-## Summary ##
-
-- [General](#general)
-- [Features](#features)
-- [Requirements](#requirements)
-- [Installation](#installation)
-- [Code structure](#code-structure)
- * [Views](#views)
- * [Assets](#assets)
- * [Stylesheets](#stylesheets)
- * [Images](#images)
- * [Images](#images)
- * [Javascript](#javascript)
-- [Build](#build)
- * [NPM dependencies](#npm-dependencies)
- * [Bower dependencies](#bower-dependencies)
- * [Grunt tasks](#grunt-tasks)
- * [Tasks structure](#tasks-structure)
- * [Pipeline](#pipeline)
- * [Config tasks](#config-tasks)
- * [Register tasks](#register-tasks)
-- [Running](#running)
-
-## General ##
-
-- **Author** : Louis Barranqueiro
-- **Version** : 1.6.0
-- **Compatibility** : Hexo 3.0.0 or later
-
-## Features ##
-
-**General features :**
-- Fully responsive
-- Optimized for tablets & mobiles
-- Configurable menu of the sidebar
-- Pages to filter tags, categories and archives
-- Background cover image
-- Beautiful about page
-- Support Open Graph protocol
-- Support internationalization (i18n)
-
-
-**Posts features :**
-- Thumbnail image
-- Cover image
-- Responsive videos & images
-- Sharing options
-- Navigation menu
-- GitHub theme for code highlighting
-- Image gallery
-- Image generator helpers
-- Table of contents
-
-
-**Integrated services :**
-- Disqus
-- Duoshuo
-- Google analytics
-- Gravatar
-- Swiftype
-- Facebook Insights
-
-## Requirements ##
-
-1. **Node** : v0.10.35 or higher. Download [Node](https://nodejs.org/download/)
-2. **Hexo CLI** : v0.1.4 or higher. Run `npm install hexo-cli -g`
-3. **Grunt CLI** : v0.1.13 or higher. Run `npm install grunt-cli -g`
-4. **Bower** : v1.4.1 or higher. Run `npm install bower -g`
-
-## Installation ##
-
-1. Run `git clone https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak.git`
-2. Rename the folder in `tranquilpeak` and place it in `themes` folder of your Hexo blog
-3. Modify the theme in `_config.yml` by changing `theme` variable to `tranquilpeak`
-4. Complete `theme/tranquilpeak/_config.yml` with your informations by following directives in comments
-
-If you want to configure the theme, please follow the [user documentation](https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/blob/master/docs/user.md)
-
-## Code structure ##
-
-```
-tranquilpeak
-├── docs
-│ ├── developer.md
-│ └── user.md
-├── languages
-│ ├── en.yml
-│ ├── fr-FR.yml
-│ ├── pt-br.yml
-│ └── zh-cn.yml
-├── layout
-│ ├── _partial
-│ │ ├── post
-│ │ │ ├── actions.ejs
-│ │ │ ├── category.ejs
-│ │ │ ├── disqus.ejs
-│ │ │ ├── duoshuo.ejs
-│ │ │ ├── gallery.ejs
-│ │ │ ├── header.ejs
-│ │ │ ├── header-cover.ejs
-│ │ │ ├── meta.ejs
-│ │ │ ├── share-options.ejs
-│ │ │ └── tag.ejs
-│ │ ├── about.ejs
-│ │ ├── archive-post.ejs
-│ │ ├── archive.ejs
-│ │ ├── cover.ejs
-│ │ ├── footer.ejs
-│ │ ├── google-analytics.ejs
-│ │ ├── head.ejs
-│ │ ├── header.ejs
-│ │ ├── index.ejs
-│ │ ├── pagination.ejs
-│ │ ├── post.ejs
-│ │ ├── script.ejs
-│ │ └── sidebar.ejs
-│ ├── all-archives.ejs
-│ ├── all-categories.ejs
-│ ├── all-tags.ejs
-│ ├── archives.ejs
-│ ├── category.ejs
-│ ├── index.ejs
-│ ├── layout.ejs
-│ ├── page.ejs
-│ ├── post.ejs
-│ └── tag.ejs
-├── scripts
-│ ├── filters
-│ │ └── excerpt.js
-│ ├── tags
-│ │ ├── alert.js
-│ │ ├── fancybox.js
-│ │ ├── hightlight_text.js
-│ │ ├── image.js
-│ │ └── wide_image.js
-├── source
-│ ├── _css
-│ │ ├── base
-│ │ │ ├── _base.scss
-│ │ ├── components
-│ │ │ ├── _alert.scss
-│ │ │ ├── _archives.scss
-│ │ │ ├── _box.scss
-│ │ │ ├── _button.scss
-│ │ │ ├── _caption.scss
-│ │ │ ├── _code.scss
-│ │ │ ├── _figure.scss
-│ │ │ ├── _form.scss
-│ │ │ ├── _hide.scss
-│ │ │ ├── _highlight-text.scss
-│ │ │ ├── _icon.scss
-│ │ │ ├── _image-gallery.scss
-│ │ │ ├── _link.scss
-│ │ │ ├── _main-content.scss
-│ │ │ ├── _markdown.scss
-│ │ │ ├── _pagination.scss
-│ │ │ ├── _post.scss
-│ │ │ ├── _post-actions.scss
-│ │ │ ├── _post-header-cover.scss
-│ │ │ ├── _postShorten.scss
-│ │ │ ├── _pullquote.scss
-│ │ │ ├── _share-options-bar.scss
-│ │ │ ├── _tag.scss
-│ │ │ ├── _text.scss
-│ │ │ ├── _tooltip.scss
-│ │ │ └── _video.scss
-│ │ ├── layout
-│ │ │ ├── _about.scss
-│ │ │ ├── _blog.scss
-│ │ │ ├── _bottom-bar.scss
-│ │ │ ├── _cover.scss
-│ │ │ ├── _footer.scss
-│ │ │ ├── _header.scss
-│ │ │ ├── _main.scss
-│ │ │ └── _sidebar.scss
-│ │ ├── utils
-│ │ │ ├── mixins
-│ │ │ │ ├── _bottom-bar.scss
-│ │ │ │ ├── _button.scss
-│ │ │ │ ├── _category.scss
-│ │ │ │ ├── _form.scss
-│ │ │ │ ├── _header.scss
-│ │ │ │ ├── _main.scss
-│ │ │ │ ├── _opacity.scss
-│ │ │ │ ├── _post-header-cover.scss
-│ │ │ │ ├── _prefix.scss
-│ │ │ │ └── _share-options-bar.scss
-│ │ │ │ └── _sidebar.scss
-│ │ │ │ └── _tag.scss
-│ │ │ ├── _font.scss
-│ │ │ └── _variables.scss
-│ │ └── tranquilpeak.scss
-│ ├── _fonts
-│ │ └── .gitkeep
-│ ├── _images
-│ │ └── cover.jpg
-│ └── _js
-│ │ ├── about.js
-│ │ ├── archives-filter.js
-│ │ ├── categories-filter.js
-│ │ ├── codeblock-resizer.js
-│ │ ├── fancybox.js
-│ │ ├── header.js
-│ │ ├── image-gallery.js
-│ │ ├── post-bottom-bar.js
-│ │ ├── share-options.js
-│ │ ├── sidebar.js
-│ │ ├── smartresize.js
-│ │ └── tags-filter.js
-├── tasks
-│ ├── config
-│ │ ├── bower.js
-│ │ ├── clean.js
-│ │ ├── concat.js
-│ │ ├── cssmin.js
-│ │ ├── replace.js
-│ │ ├── sails-linker.js
-│ │ ├── sass.js
-│ │ ├── sync.js
-│ │ ├── uglify.js
-│ │ └── default.js
-│ ├── register
-│ │ ├── build.js
-│ │ ├── buildProd.js
-│ │ ├── compileAssets.js
-│ │ ├── linkAssets.js
-│ │ ├── linkAssetsProd.js
-│ │ ├── syncAssets.js
-│ │ └── default.js
-│ └── pipeline.js
-├── .bowerrc
-├── Gruntfile.js
-├── LICENSE
-├── README.md
-├── _config.yml
-├── bower.json
-└── package.json
-```
-
-- **docs** : Contains user and developer documentation
-- **languages** : Contains language files
-- **layout** : Contains all views
-- **scripts** : Contains all scripts executed at the startup of Hexo
-- **source** : Contains all assets (css, js and images)
-- **tasks** : Contains all grunt tasks
-
-### Languages ###
-
-```
-├── languages
- ├── en.yml
- ├── fr-FR.yml
- ├── pt-br.yml
- └── zh-cn.yml
-```
-
-Each files contains all labels used in the theme.
-If you want to add a new language, duplicate an existing language file and replace all string by their translation.
-
-### Views ###
-
-```
-├── layout
- ├── _partial
- │ ├── post
- │ │ ├── actions.ejs
- │ │ ├── category.ejs
- │ │ ├── disqus.ejs
- │ │ ├── duoshuo.ejs
- │ │ ├── gallery.ejs
- │ │ ├── header.ejs
- │ │ ├── header-cover.ejs
- │ │ ├── meta.ejs
- │ │ ├── share-options.ejs
- │ │ └── tag.ejs
- │ ├── about.ejs
- │ ├── archive-post.ejs
- │ ├── archive.ejs
- │ ├── cover.ejs
- │ ├── footer.ejs
- │ ├── google-analytics.ejs
- │ ├── head.ejs
- │ ├── header.ejs
- │ ├── index.ejs
- │ ├── pagination.ejs
- │ ├── post.ejs
- │ ├── script.ejs
- │ └── sidebar.ejs
- ├── all-archives.ejs
- ├── all-categories.ejs
- ├── all-tags.ejs
- ├── archives.ejs
- ├── category.ejs
- ├── index.ejs
- ├── layout.ejs
- ├── page.ejs
- ├── post.ejs
- └── tag.ejs
-```
-
-- **layout** : Contails all mains views
-- **layout/partial** : Contains all partial views included in main views
-- **layout/partial/post** : Contains all partial views to build post
-
-### Scripts ###
-
-```
-├── scripts
-│ ├── filters
-│ │ └── excerpt.js
-│ ├── tags
-│ │ ├── alert.js
-│ │ ├── fancybox.js
-│ │ ├── highlight_text.js
-│ │ ├── image.js
-│ │ └── wide_image.js
-```
-
-Each scrips is executed a the startup of Hexo. They are separed by categories:
-- filters : A filter is used to modify some specified data. Hexo passes data to filter in sequence and filters can modify the data.
-- tags : A tag helps users insert snippets to posts easily.
-
-### Assets ###
-
-#### Stylesheets ####
-
-```
-├── source
-│ ├── _css
- ├── base
- │ ├── _base.scss
- ├── components
- │ ├── _archives.scss
- │ ├── _box.scss
- │ ├── _button.scss
- │ ├── _caption.scss
- │ ├── _code.scss
- │ ├── _figure.scss
- │ ├── _form.scss
- │ ├── _hide.scss
- │ ├── _hightlight_text.scss
- │ ├── _icon.scss
- │ ├── _image-gallery.scss
- │ ├── _link.scss
- │ ├── _main-content.scss
- │ ├── _markdown.scss
- │ ├── _pagination.scss
- │ ├── _post.scss
- │ ├── _post-actions.scss
- │ ├── _post-header-cover.scss
- │ ├── _postShorten.scss
- │ ├── _pullquote.scss
- │ ├── _share-options-bar.scss
- │ ├── _tag.scss
- │ ├── _text.scss
- │ ├── _tooltip.scss
- │ └── _video.scss
- ├── layout
- │ ├── _about.scss
- │ ├── _blog.scss
- │ ├── _bottom-bar.scss
- │ ├── _cover.scss
- │ ├── _footer.scss
- │ ├── _header.scss
- │ ├── _main.scss
- │ └── _sidebar.scss
- ├── utils
- │ ├── mixins
- │ │ ├── _bottom-bar.scss
- │ │ ├── _button.scss
- │ │ ├── _category.scss
- │ │ ├── _form.scss
- │ │ ├── _header.scss
- │ │ ├── _main.scss
- │ │ ├── _opacity.scss
- │ │ ├── _post-header-cover.scss
- │ │ ├── _prefix.scss
- │ │ └── _share-options-bar.scss
- │ │ └── _sidebar.scss
- │ │ └── _tag.scss
- │ ├── _font.scss
- │ └── _variables.scss
- └── tranquilpeak.scss
-```
-
-SCSS structure follow 7-1 pattern of [sass guidelines](http://sass-guidelin.es/#the-7-1-pattern)
-If you want more informations and to understand better this code, consult [sass guidelines](http://sass-guidelin.es/)
-
-#### Fonts #####
-
-```
-├── _fonts
- └── .gitkeep
-```
-- **.gitkeep** : Ignore this file. It only exists because git refuses to push empty directories to a remote server. .gitkeep is an unofficial convention that has emerged as a workaround for people who don't discriminate against empty directories.
-
-If you have local fonts, place them in this folder and import them in `source/_css/utils/_fonts.scss`.
-
-#### Images #####
-
-```
-├── _images
- └── cover.jpg
-```
-
-- **cover.png** : Default background cover of the blog
-
-Contains all images of the theme.
-
-#### Javascript #####
-
-```
-├── _js
- ├── about.js
- ├── archives-filter.js
- ├── categories-filter.js
- ├── codeblock-resizer.js
- ├── fancybox.js
- ├── header.js
- ├── image-gallery.js
- ├── post-bottom-bar.js
- ├── share-options.js
- ├── sidebar.js
- ├── smartresize.js
- └── tags-filter.js
-```
-
-- **about.js** : Fade out the blog and let drop the about card of the author and vice versa
-- **archives-filter.js** : Filter posts by using their date on archives page : `/archives`
-- **categories-filter.js** : Filter posts by using their categories on archives page : `/categories`
-- **codeblock-resizer.js** : Resize codeblocks to fit the screen width
-- **fancybox.js.js** : Run Fancybox plugin
-- **header.js** : Hide the header when the user scrolls down, and show it when he scrolls up
-- **image-gallery.js** : Resize all images of an image-gallery
-- **post-bottom-bar.js** : Hide the post bottom bar when the post footer is visible by the user, and vice versa
-- **share-options.js** : Open and close the share-options bar
-- **sidebar.js** : Open and close the sidebar by swiping the sidebar and the blog and vice versa
-- **smartresize.js** : Debouncing function from [John Hann](https://github.com/unscriptable)
-- **tags-filter.scss** : Filter posts by using their tags on archives page : `/tags`
-
-Each file correspond to a feature.
-
-## Build ##
-
-### NPM dependencies ###
-
-To install npm dependencies, run `npm install`
-
-NPM dependencies :
-
-``` json
-"bower" : "^1.3.12"
-"grunt" : "^0.4.5"
-"grunt-bower" : "^0.18.0"
-"grunt-contrib-clean" : "~0.5.0"
-"grunt-contrib-concat" : "^0.5.0"
-"grunt-contrib-copy" : "~0.4.1"
-"grunt-contrib-cssmin" : "^0.12.0"
-"grunt-contrib-uglify" : "^0.7.0"
-"grunt-contrib-watch" : "^0.6.1"
-"grunt-sails-linker" : "^0.10.1"
-"grunt-sass" : "1.0.0",
-"grunt-sync" : "^0.2.3"
-"grunt-text-replace" : "^0.4.0"
-"include-all" : "^0.1.6"
-"load-grunt-tasks" : "~0.2.0"
-```
-
-### Bower dependencies ###
-
-To install bower dependencies, run `bower install`
-Bower dependencies are located in `source/_bower_components`
-
-Bower dependencies :
-
-``` json
-"Font-awesome" : "~4.3.0"
-"jQuery" : "~2.1.3"
-"Fancybox" : "~2.1.5"
-```
-
-### Grunt tasks ###
-
-##### Tasks structure #####
-
-```
-├── tasks
- ├── config
- │ ├── bower.js
- │ ├── clean.js
- │ ├── concat.js
- │ ├── cssmin.js
- │ ├── replace.js
- │ ├── sails-linker.js
- │ ├── sass.js
- │ ├── sync.js
- │ ├── uglify.js
- │ └── default.js
- ├── register
- │ ├── build.js
- │ ├── buildProd.js
- │ ├── compileAssets.js
- │ ├── default.js
- │ ├── linkAssets.js
- │ ├── linkAssetsProd.js
- │ └── syncAssets.js
- └── pipeline.js
-```
-
-- **config** : Default tasks
-- **register** : Alias tasks which call multiple default tasks
-- **pipeline.js** : Files which contains a list of javascript and stylesheets files linked to the blog
-
-#### Pipeline #####
-
-``` javascript
-// Js files to inject in `layout/_partial/script.ejs`
-var tranquilpeakJsFilesToInject = [
- 'jquery.js',
- 'jquery.fancybox.js',
- 'jquery.fancybox-thumbs.js',
- 'tranquilpeak.js'
-];
-// Css files to inject in `layout/_partial/head.ejs`
-var tranquilpeakCssFilesToInject = [
- 'font-awesome.css',
- 'jquery.fancybox.css',
- 'jquery.fancybox-thumbs.css',
- 'tranquilpeak.css'
-];
-```
-
-- **tranquilpeakJsFilesToInject** : Files injected in `layout/_partial/script.ejs` (developement environment)
-- **tranquilpeakCssFilesToInject** : Files injected in`layout/_partial/head.ejs` (developement environment)
-
-On production environment, these javascript and stylesheets files are concatenate and minify in 1 javascript file and 1 stylesheet file and linked to their respective views
-
-#### Config tasks ####
-
-- **bower** : Copy all needed files by types from bower dependencies
-- **clean** : Delete `source/assets` folder
-- **concat** :
- * devJs : Concat all javascript files located in `source/_js/` into 1 file : `source/assets/js/tranquilpeak.js`
- * prodCss : Concat all stylesheets files located in `source/assets/css/` into 1 file : `source/assets/css/style.css`
- * prodJs : Concat all javascript listed in `tasks/pipeline.js` in 1 file : `source/assets/js/script.js`
-- **cssmin** : Minify `source/assets/cssstyle.css` file in : `source/assets/cssstyle.min.css`
-- **replace** :
- * linker : Replace `EJS_ENDTAG` string to resolve a problem of ejs escaping with sails-linker tasks
- * cssFancybox : Resolve path of images in fancybox.css. Impossible to use an other plugin to do that because in the bower fancybox packages, css files and images are in the same folder and that not the case in assets folder.
- * cssTranquilpeak : Resolve path of images and fonts in tranquilpeak.css.
-- **sails-linker** :
- * devJs : Link all javascript files listed in `tasks/pipeline.js` to `layout/_partial/script.ejs`
- * devCss : Link all stylesheets files listed in `tasks/pipeline.js` to `layout/_partial/head.ejs`
- * prodJs : Link `source/assets/js/script.min.js` file in `layout/_partial/script.ejs`
- * prodCss : Link `source/assets/js/style.min.css` file in `layout/_partial/head.ejs`
-- **sass** : Compile `source/_css/tranquilpeak.scss` file in `source/assets/css/tranquilpeak.css`
-- **sync** : Synchronize images from `source/_images` to `source/assets/images` and fonts from `source/_fonts` to `source/assets/fonts`
-- **uglify** : Minify `source/assets/js/script.js` file in `source/assets/js/script.min.js`
-- **watch** : Watch assets from `source/_*/**/*` folder to detect changes and launch `syncAssets` task
-
-#### Register tasks ####
-
-- **build** : Synchronize bower dependencies, images, fonts, compile assets (css and js) and link it to views
-- **buildProd** : Synchronize bower dependencies, images, fonts, compile assets (css and js) with some optimization (concat and minify) and link it to views
-- **default** : Build the theme once and rebuild after each change
-- **compileAssets** : Compile scss files and concat js files
-- **linkAssets** : Link all javascript and stylesheets files to views
-- **linkAssetsProd** : Link one javascript file and one stylesheet file (concatenated and minified) to views
-- **syncAssets** : Synchronize assets (css, js, fonts and images)
-
-When you run `grunt build` or `grunt buildProd` tasks, a `source/assets` folder will be created with all files generated in. When you will start your hexo server, only this folder will be copied in `public` folder
-
-**Development environment**:
-1. Run `grunt default` and start coding :)
-
-**Production environment (before deploying your blog)** : Run `grunt buildProd` to build the project with some optimization (concat and minify).
-Your blog will have only 1 file for javascript and 1 file for stylesheets to reduce number of HTTP requests and improve performance.
-
-## Running ##
-
-Run `hexo server` and start coding! :)
diff --git a/themes/transquilpeak/docs/user.md b/themes/transquilpeak/docs/user.md
deleted file mode 100644
index 3e8d165..0000000
--- a/themes/transquilpeak/docs/user.md
+++ /dev/null
@@ -1,622 +0,0 @@
-# User documentation #
-
-A gorgeous responsive theme for Hexo blog framework
-
-![Tranquilpeak](http://d1u9biwaxjngwg.cloudfront.net/showcases/showcase-v1.5.jpg)
-
-Tranquilpeak theme is compatible with Hexo v3.0.x. The theme is compatible with higher versions of Hexo but these versions have some bugs with generation of relative urls so I recommend to use Hexo 3.0.x for the moment.
-
-This documentation will help you to install tranquilpeak-hexo-theme and configure it to use all features which it provides.
-
-If you want to report a bug or ask a question, [create an issue](https://github.com/LouisBarranqueiro/tranquilpeak-hexo-theme/issues/new).
-
-## Summary ##
-
-- [General](#general)
-- [Features](#features)
-- [Requirements](#requirements)
-- [Installation](#installation)
-- [Hexo configuration](#hexo-configuration)
- * [Enable post assets folder](#enable-post-assets-folder)
- * [Disable relative links](#disable-relative-links)
- * [Enable RSS feed](#enable-rss-feed)
- * [Define global keywords](#define-global-keywords)
-- [Tranquilpeak configuration](#tranquilpeak-configuration)
- - [Languages configuration](#languages-configuration)
- - [Theme configuration](#theme-configuration)
- * [Sidebar](#sidebar)
- * [Header](#header)
- * [Author](#author)
- * [Customization](#customization)
- * [Integrated services](#integrated-services)
- * [Enable pages](#enable-pages)
- * [Enable all-categories page](#enable-all-categories-page)
- * [Enable all-tags page](#enable-all-tags-page)
- * [Enable all-archives page](#enable-all-archives-page)
-- [Integrated services configuration](#integrated-services-configuration)
- * [Google Analytics](#google-analytics)
- * [Exclude hostname (localhost) while writing articles](#exclude-hostname-\(localhost\)-while-wirting-articles)
-- [Writing posts](#writing-posts)
- * [Front-matter settings](#front-matter-settings)
- * [Define post excerpt](#define-post-excerpt)
- * [Display all post content](#display-all-post-content)
- * [Display table of contents](#display-table-of-contents)
- * [Tags](#tags)
- * [Alert](#alert)
- * [Highlight text](#highlight-text)
- * [Image](#image)
- * [Wide image](#wide-image)
- * [Fancybox](#fancybox)
-- [Running](#running)
-
-## General ##
-
-- **Author** : Louis Barranqueiro
-- **Version** : 1.6.0
-- **Compatibility** : Hexo 3.0.0 or later
-
-## Features ##
-
-**General features :**
-- Fully responsive
-- Optimized for tablets & mobiles
-- Configurable menu of the sidebar
-- Pages to filter tags, categories and archives
-- Background cover image
-- Beautiful about page
-- Support Open Graph protocol
-- Support internationalization (i18n)
-
-
-**Posts features :**
-- Thumbnail image
-- Cover image
-- Responsive videos & images
-- Sharing options
-- Navigation menu
-- GitHub theme for code highlighting
-- Image gallery
-- Image generator helpers
-- Table of contents
-
-
-**Integrated services :**
-- Disqus
-- Duoshuo
-- Google analytics
-- Baidu analytics
-- Gravatar
-- Swiftype
-- Facebook Insights
-
-## Requirements ##
-
-1. **Node** : v0.10.35 or higher. Download [Node](https://nodejs.org/download/)
-2. **Hexo CLI** : v0.1.4 or higher. Run `npm install hexo-cli -g`
-
-## Installation ##
-
-1. Download the latest version built and ready for production here : [hexo-theme-tranquilpeak-built-for-production-1.6.0]
-(https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/releases/download/v1.6.0/hexo-theme-tranquilpeak-prod-1.6.0.zip)
-2. Rename the folder in `tranquilpeak` and place it in `themes` folder of your Hexo blog
-
-## Hexo configuration ##
-
-Modify the theme in `_config.yml` by changing `theme` variable to `tranquilpeak`
-
-If it's your first time using Hexo, please check [Hexo official documentation](https://hexo.io/docs/)
-
-### Enable post assets folder ###
-
-If you want to take advantage of cover image, thumbnail image, and image gallery features, you have to enable post assets folder by setting `post_asset_folder` to `true`in `_config.yml`.
-
-### Disable relative links ###
-
-You have to set `relative_link` to `false` otherwise if you enter your blog url without the end `/`, like this `http://yourdomain.com/blog`, all assets will not be loaded.
-There is currently an issue on Hexo repository to fix this problem.
-
-### Enable RSS feed ###
-
-1. Execute `npm install hexo-generator-feed --save` in your Hexo blog folder
-2. Add this lines in `_config.yml` :
-
-``` yaml
-feed:
- type: atom
- path: atom.xml
- limit: 20
-```
-- **type** : Feed type
-- **path** : Feed path (Default: atom.xml/rss2.xml)
-- **limit** : Maximum number of posts in the feed (Use `0` or `false` to show all posts)
-
-If you want more informations on this plugin : [hexo-generator-feed](https://github.com/hexojs/hexo-generator-feed)
-
-### Define global keywords ###
-
-You can define keywords for search engines. These keywords will be added on all pages.
-
-``` yaml
-keywords:
-- hexo
-- javascript
-```
-
-## Tranquilpeak configuration ##
-
-### Language configuration ###
-
-If you are new to Hexo and internationalization (i18n), please read [Hexo documentation - internationalization (i18n) section](https://hexo.io/docs/internationalization.html)
-
-Currently, the theme is delivered with english (en), chinese (zh-cn), french (fr-FR) and portuguese (pt-br) language file.
-If your language is not available, follow this guidelines (E.g : add russian language (ru) :
-1. Set `language` to `ru` in Hexo configuration file `_config.yml`
-2. Create `ru.yml` file in `theme/tranquilpeak/languages/` folder
-3. Copy the content of `theme/tranquilpeak/languages/en.yml` and paste it to `ru.yml` file
-4. Replace all strings in english by their translation in russian
-5. Complete your description and your job in russian and that's it!
-
-Otherwise, complete your description and your job in the right language file(s) in `theme/tranquilpeak/languages`.
-
-**Tranquilpeak theme is currently not ready to support multi-languages. It will be the next release.**
-
-### Theme configuration ###
-
-Complete `theme/tranquilpeak/_config.yml` with your information. Read above sections to have more information.
-
-
-#### Sidebar ####
-
-The sidebar is powerful and easily configurable.
-DON'T modify variables name `sidebar`, `title`, `url` and `icon`.
-Others variables name which refer to the name of a menu or a link can be edited. Example : `menu`, `home`, `categories`, etc...
-You can add groups of links and links much as you want
-You just have to respect the indentation : `groups of links` -> `link` -> `title`, `link`, `icon`
-
-``` yaml
-sidebar:
- menu:
- home:
- title: Home
- url: /
- icon: home
- categories:
- title: Categories
- url: /all-categories
- icon: bookmark
- tags:
- title: Tags
- url: /all-tags
- icon: tags
- archives:
- title: Archives
- url: /all-archives
- icon: archive
- search:
- title: Search
- url: /#search
- icon: search
- # `st-search-show-outputs` classes are used to open swiftype search window
- class: t-search-show-outputs
- about:
- title: About me
- url: /#about
- icon: question
- author_links:
- # github:
- # title: GitHub
- # url: https://github.com/
- # icon: github
- # stack_overflow:
- # title: Stack Overflow
- # url: http://stackoverflow.com/users/
- # icon: stack-overflow
- # twitter:
- # title: Twitter
- # url: https://twitter.com/
- # icon: twitter
- # facebook:
- # title: Facebook
- # url: https://www.facebook.com/
- # icon: facebook
- # google_plus:
- # title: Google +
- # url: https://plus.google.com/
- # icon: google-plus
- # linked_in:
- # title: Linked In
- # url: https://www.linkedin.com/profile/
- # icon: linkedin
- # mail:
- # title: Mail
- # url: mailto:
- # icon: envelope-o
- rss:
- rss:
- title: RSS
- url: /atom.xml
- icon: rss
-```
-
-- **title** : Title of the link
-- **url** : URL of the link. If the URL is internal, domain name is not necessary
-- **icon** : Name of the font awesome icon class without the `fa-` (Go to [font-awesome icons](http://fontawesome.io/icons/) to find class name of icon)
-- **class** (optional) : CSS Class added to the `a` link tag
-
-
-#### Header ####
-
-The right link of the header is customizable. You can add a link (as an icon) at the right of the header instead of the author's gravatar image or author's picture. By default, author's gravatar or author's picture is displayed if `icon` is empty DON'T edit `header`, `right_link`, `url`, `icon` and `class` variable name.
-E.g to display a shortcut to open swiftype search window :
-``` yaml
-header:
- right_link:
- url: /#search
- icon: search
- class: st-search-show-outputs
-```
-
-- **url** : URL of the link. If the URL is internal, domain name is not necessary
-- **icon** : Name of the font awesome icon class without the `fa-` (Go to [font-awesome icons](http://fontawesome.io/icons/) to find class name of icon)
-- **class** : CSS Class added to the link
-
-#### Author ####
-
-``` yaml
-# Author
-author:
- email:
- location:
- picture:
- twitter:
- google_plus:
-```
-
-**Your biography and your job is editable in each languages files in `languages` folder**
-
-- **email** : Your mail address. This address will be used to get your gravatar image if you activate gravatar option
-- **location** : Your location
-- **picture** : Your profile picture. Overwritten by your gravatar image if gravatar email is filled
-- **twitter** : Your Twitter username without the @. E.g : `tranquilpeak`
-- **google_plus** : Your google plus profile id. E.g : `+TranquilPeak` or `123812884128439`
-
-#### Customization ####
-
-``` yaml
-# Customization
-sidebar_behavior: 2
-toc_title: Table of contents
-thumbnail_image: true
-thumbnail_image_position: right
-auto_thumbnail_image: true
-cover_image: cover.jpg
-favicon:
-image_gallery: true
-archive_pagination: true
-category_pagination: true
-tag_pagination: true
-```
-
-- **sidebar_behavior** : Define the behavior of the header and sidebar :
- * 1: Display large sidebar on large screen, medium sidebar on medium screen and header bar on small screen and large sidebar is swiped when open button is clicked
- * 2: Display medium sidebar on large and medium screen and header bar on small screen and medium sidebar is swiped when open button is clicked (default)
- * 3: Display header bar on all screens and large sidebar is swiped when open button is clicked
- * 4: Display header bar on all screens and medium sidebar is swiped when open button is clicked)
-- **clear_reading** : Hide sidebar on all article page to let article take full width to improve reading, and enjoy wide images and cover images. Useless if `sidebar_behavior` is equal to `3` or `4`. (true: enable, false: disable). Default behavior : `theme.clear_reading` value in theme configuration file.
-- **toc_title** : Head title displayed at the top of the table of contents.
-- **thumbnail_image** : Display thumbnail image of each post on index pages
-- **thumbnail_image_position** : Display thumbnail image at the right of title in index pages (`right`, `left` or `bottom`). Set this value to `right` if you have old posts to keep the old style on them and define `thumbnailImagePosition` on a post to overwrite this setting. (Default : `right`)
-- **auto_thumbnail_image** : Automatically select the cover image or the first photo from the gallery of a post if there is no thumbnail image as the thumbnail image. Set this value to `true` if you have old posts that use the cover image or the first photo as the thumbnail image and set `autoThumbnailImage` to `false` on a post to overwrite this setting. (Default : `true`)
-- **read_more_message** : Message displayed after the `` comment or after 300 characters in post
-- **go_to_message** : Message displayed after the `` comment or after 300 characters for post with link layout
-- **cover_image** : Your blog cover picture. **I STRONGLY recommend you to use a CDN to speed up loading of pages. There is many free CDN like Cloudinary or you can also use indirectly by using services like Google Photos.**
-Default image is on AWS S3 and delivered by AWS CloudFront. Otherwise put your image in folder `source/assets/images/` and use relative url : `your-image.png` **Change the default cover image to have an unique blog**
-- **favicon** : Your favicon located in folder `source/assets/images/`
-- **image_gallery** : Display an image gallery at the end of a post which have `photos` variables. (false: disabled, true: enabled)
-- **archive_pagination** : Displaying style of archive pages. (false: pagination disabled, true: pagination enabled)
-- **category_pagination** : Displaying style of category pages. (false: pagination disabled, true: pagination enabled)
-- **tag_pagination** : Displaying style of tag pages. (false: pagination disabled, true: pagination enabled)
-
-Example :
-A category page look like this with `category_pagination: true` :
-![archives false](http://d1u9biwaxjngwg.cloudfront.net/docs/1.4.0/ud-archives-true-300.png)
-
-The same page with `category_pagination: false`:
-![archives false](http://d1u9biwaxjngwg.cloudfront.net/docs/1.4.0/ud-archives-false-300.png)
-
-
-#### Integrated services ####
-
-``` yaml
-# Integrated services
-disqus_shortname:
-duoshuo_shortname:
-gravatar_email:
-google_analytics_id:
-swiftype_install_key:
-fb_admin_ids:
-fb_app_id:
-```
-- **disqus_shortname**: Your Disqus shortname. The theme use its own value for disqus shortname to reduce dependency with Hexo in case of this variable is deleted in a new Hexo version.
-- **duoshuo_shortname**: Your Duoshuo shortname. You can't use Disqus and Duoshuo together, then fill the right shortname. If both are filled, Disqus will be chosen.
-- **gravatar_email**: Your gravatar email. Overwrite `author.picture` everywhere in the blog
-- **google_analytics_id** : Your Google analystics web property ID : UA-XXXXX-X
-- **swiftype_install_key** : Your Swiftype install key founded in `Engines > YOUR_ENGINE_NAME > Integrate > Install Search > Install code` menu of your account. Search a line similarly to this one : `_st('install','fsdkiG43fkfder32dgsR','2.0.0');`. Swiftype install key is : `fsdkiG43fkfder32dgsR`.
-- **fb_admin_ids** : Your Facebook user ids used to connect your blog with your facebook user accounts (Facebook Insights). Separate ids with comma. E.g : `9830047,1003342`. Visit [Facebook docs](https://developers.facebook.com/docs/platforminsights/domains) for more information.
-- **fb_app_id** : Your Facebook app id used to connect your blog with your facebook app account (Facebook Insights). E.g : `9841307`. Visit [Facebook docs](https://developers.facebook.com/docs/platforminsights/domains) for more information.
-
-### Enable pages ###
-
-Tranquilpeak provides you 3 pages to display all posts title and date by tags, by categories, by date and an about page. To enable one of this pages,
-read following step.
-
-#### Enable all-categories page ####
-
-To enable `all-categories` page :
-1. Run `hexo new page "all-categories"`. A new folder named `all-categories` will be created in `source/`
-2. Replace `source/all-categories/index.md` content with :
-
-``` markdown
----
-title: "all-categories"
-layout: "all-categories"
-comments: false
----
-```
-
-New page will be reach at : `/all-categories`. On this page, users will be able to search and filter categories.
-
-#### Enable all-tags page ####
-
-To enable `all-tags` page :
-1. Run `hexo new page "all-tags"`. A new folder named `all-tags` will be created in `source/`
-2. Replace `source/all-tags/index.md` content with :
-
-``` markdown
----
-title: "all-tags"
-layout: "all-tags"
-comments: false
----
-```
-
-New page will be reach at : `/all-tags`. On this page, users will be able to search and filter tags.
-
-#### Enable all-archives page ####
-
-To enable `all-archives` page :
-1. Run `hexo new page "all-archives"`. A new folder named `all-archives` will be created in `source/`
-2. Replace `source/all-archives/index.md` content with :
-
-``` markdown
----
-title: "all-archives"
-layout: "all-archives"
-comments: false
----
-```
-
-New page will be reach at : `/all-archives`.
-On this page, users will be able to search and filter posts.
-**Search pattern** : YYYY/MMM/DD
-
-## Integrated services configuration ##
-
-### Google Analytics ###
-
-#### Exclude hostname (localhost) while writing articles ####
-
-While you are writing articles, you need to check the result a lot of times before deploying your site.
-If you have enable Google analytics service, Google will include all requests done, even when hostname is localhost and this can greatly skew the results.
-To overcome this, you have to add a filter on Google Analytics website.
-
-Follow these steps, to add new filter :
-1. Sign in to your Google Analytics account
-2. Select the **Admin** tab and navigate to the **property** in which you want to create the filter **(Account > Property > View)**
-3. In **View** column, click on **Filters** button
-4. Click on **+ NEW FILTER** button
-6. Enter a name for the filter
-7. Select **Custom filter**, **Filter Field** : `Hostname`, **Filter Pattern** : `(.*?localhost.*?)`
-8. Click on **Save** button
-
-## Writing posts ##
-
-To write articles, you have to user Markdown langague. [Here](https://guides.github.com/features/mastering-markdown/#examples) you can find the main basics of Markdown syntax.
-Please note, there are many different versions of Markdown and some of them are not supported by Hexo.
-To use tags plugins to highlight code or add Fancybox image, please read [Hexo docs](https://hexo.io/docs/tag-plugins.html)
-
- **I STRONGLY recommend you to use a CDN to speed up loading of pages. There is many free CDN like Cloudinary or you can also use indirectly by using services like Google Photos.**
-
-### Front-matter settings ###
-
-Tranquilpeak introduces new variables to give you a lot of possibilities.
-
-Example :
-``` markdown
-keywords:
-- javascript
-- hexo
-clearReading: true
-thumbnailImage: image-1.png
-thumbnailImagePosition: bottom
-autoThumbnailImage: yes
-metaAlignment: center
-coverImage: image-2.png
-coverCaption: "A beautiful sunrise"
-coverMeta: out
-coverImage: image-2.png
-photos:
- - image-3.jpg "New York"
- - image-4.png "Paris"
- - http://i.imgur.com/o9r19kD.jpg "Dubai"
- - https://lh3.googleusercontent.com/1GLR8xt-w1024-h686-no "Sidney"
-comments: false
-```
-
-- **keywords** : Define keywords for search engines. you can also define global keywords in Hexo configuration file.
-- **clearReading** : Hide sidebar on all article page to let article take full width to improve reading, and enjoy wide images and cover images. Useless if `theme.sidebar_behavior` is equal to `3` or `4`. (true: enable, false: disable). Default behavior : `theme.clear_reading` value in theme configuration file.
-- **autoThumbnailImage** : Automatically select the cover image or the first photo from the gallery of a post if there is no thumbnail image as the thumbnail image. `autoThumbnailImage` overwrite the setting `auto_thumbnail_image` in the theme configuration file
-- **thumbnailImage** : Image displayed in index view.
-- **thumbnailImagePosition** : Display thumbnail image at the right of title in index pages (`right`, `left` or `bottom`). `thumbnailImagePosition` overwrite the setting `thumbnail_image_position` in the theme configuration file
-
-Example:
-A post on index page will look like this with :`thumbnailImagePosition` set to `bottom`:
-![thumbnail-image-position-bottom](https://s3-ap-northeast-1.amazonaws.com/tranquilpeak-hexo-theme/docs/1.4.0/TIP-bottom-400.jpg)
-
-The same with : `thumbnailImagePosition` set to `right`:
-![thumbnail-image-position-right](https://s3-ap-northeast-1.amazonaws.com/tranquilpeak-hexo-theme/docs/1.4.0/TIP-right-400.png)
-
-The same with : `thumbnailImagePosition` set to `left`:
-![thumbnail-image-position-left](https://s3-ap-northeast-1.amazonaws.com/tranquilpeak-hexo-theme/docs/1.4.0/TIP-left-400.png)
-
-- **metaAlignment** : Meta (title, date and categories) alignment (right, left or center). Default behavior : left
-- **coverImage** : Image displayed in full size at the top of your post in post view. If thumbnail image is not configured, cover image is also used as thumbnail image. Check the beautiful demo here : [Cover image demo](http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak/2015/05/13/Cover-image-showcase/)
-- **coverSize**: `partial`: cover image take a part of the screen height (60%), `full`: cover image take the entire screen height.
-- **coverCaption** : Add a caption under the cover image : [Cover caption demo](http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak/2015/05/13/Cover-image-showcase/)
-- **coverMeta** : `in`: display post meta (title, date and categories) on cover image, `out`: display meta (title, date and categories) under cover image as usual. Default behavior : `in`
-- **photos** : Images displayed in an image gallery (with fancybox) at the end of the post. If thumbnail image is not configured and cover image too, the first photo is used as thumbnail image. format: `url [caption]`, E.g : `https://lh3.googleusercontent.com/1GLR8xt-w1024-h686-no "New York"`
-- **comments** : Disable the comment of the post.
-
-**The relative path of images entered is : `source/_posts/{YOUR_POST_TITLE}/`, you just have to enter the name of the image without domain name and path like written just above.
-Of course, you can set external url.**
-
-### Define post excerpt ###
-
-Tranquilpeak v1.4.0 introduce a new way to define post excerpt with `` comment. Use
-- `` to define post excerpt and keep the post excerpt in the post content
-- `` to define post excerpt and remove the post excerpt of the post content
-
-### Display all post content ###
-
-** To display all post content on index page, don't put `` and `` comment in your post content.**
-
-### Display table of contents ###
-
-As post excerpt feature enable with `` comment, you can display the table of contents of a post with ``. Place this comment where you want to display the table of content. You can also edit the title displayed at the top of the table of contents in the `_config.yml` file
-
-Here is what looks like the table of contents generated:
-![thumbnail-image-position-left](https://s3-ap-northeast-1.amazonaws.com/tranquilpeak-hexo-theme/docs/1.4.0/toc-400.png)
-
-### Tags ###
-
-Tranquilpeak introduce new tags to display alert messages, images in full width and create beautiful galleries.
-**DON'T use anymore fancybox tag**. Please use `image` tag with `fancybox` class to generate them. More information here : [Image tag](#image)
-
-#### Alert ###
-
-![alert-tag](https://s3-ap-northeast-1.amazonaws.com/tranquilpeak-hexo-theme/docs/1.6/alert-tag.png)
-
-Alert tag is useful to highlight a content like a tips or a warning. Check it live here : [Alert tag demo](http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak/2014/10/29/Tags-plugins-showcase/#Alerts)
-
-Syntax :
-```
-{% alert [classes] %}
-content
-{% endalert %}
-```
-
-E.g :
-```
-{% alert danger no-icon %}
-Here is a danger alert without icon
-{% endalert %}
-```
-
-- **classes** :
- - **info** : info style
- - **success** : success style
- - **warning** : warning style
- - **danger** : danger style
- - **no-icon** : hide icon of alert
-
-#### Highlight Text ####
-
-![highlight_text-tag](https://s3-ap-northeast-1.amazonaws.com/tranquilpeak-hexo-theme/docs/1.6/highlight_text-tag.png)
-
-Highlight text tag is useful to highlight an interesting part in a text. Check it live here : [Highlight text tag demo](http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak/2014/10/29/Tags-plugins-showcase/#Highlight-text)
-
-Syntax :
-```
-{% hl_text [(classes | hexa code | rgb color | rgba color)] %}
-content
-{% endhl_text %}
-```
-
-E.g :
-```
-{% hl_text danger %}
-your highlighted text
-{% endhl_text %}
-```
-
-- **classes** :
- - red
- - green
- - blue
- - purple
- - orange
- - yellow
- - cyan
- - primary
- - success
- - warning
- - danger
-
-**You can also use hexa color, rgb color, rgba color.**
-
-**It's important to put the paragraph that contains highlight text tag inside** `
...
`
-**otherwise the following content may not be rendered.**
-
-E.g (hexa color) :
-```
-
Sed imperdiet urna et quam ultrices {% hl_text #00FFFF %}your highlighted text{% endhl_text %} dignissim ultrices libero.
-```
-
-E.g (rgba color) :
-```
-
Sed imperdiet urna et quam ultrices {% hl_text rgba(12, 12, 12, 0.4) %}your highlighted text{% endhl_text %} dignissim ultrices libero.
-```
-
-#### Image ####
-
-Image tag is useful to add images and create beautiful galleries. Check what are the possibilities here : [Image tag demo](http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak/2014/10/29/Tags-plugins-showcase/#Images)
-
-Syntax : `{% image [classes] /path/to/image [/path/to/thumbnail] [width of thumbnail] [height of thumbnail] [title text] %}`
-E.g : `{% image fancybox right clear image2.png http://google.fr/images/image125.png 150px 300px "A beautiful sunrise" %}`
-
-- **classes (optionnal)** : You can add css classes to stylize the image. Separate class with whitespace. Tranquilpeak integrate many css class to create nice effects :
- - **fancybox** : Generate a fancybox image.
- - **nocaption** : Caption of the image will not be displayed.
- - **left** : Image will float at the left.
- - **right** : Image will float at the right.
- - **center** : Image will be at center.
- - **fig-20** : Image will take 20% of the width of post width and automatically float at left.
- - **fig-25** : Image will take 25% of the width of post width and automatically float at left.
- - **fig-33** : Image will take 33% of the width of post width and automatically float at left.
- - **fig-50** : Image will take 50% of the width of post width and automatically float at left.
- - **fig-75** : Image will take 75% of the width of post width and automatically float at left.
- - **fig-100** : Image will take 100% of the width of post width.
- - **clear** : Add a div with `clear:both;` style attached after the image to retrieve the normal flow of the post.
-- **Orignal image** : Path to the original image.
-- **Thumbnail image (optionnal)** : Path to the thumbnail image. If empty, the orignal image will be displayed.
-- **Width of thumbnail image (optionnal)** : Width to the thumbnail image. If the thumbnail image is empty, width will be attached to thumbnail image created from original image. E.g : `150px` or `85%`.
-- **Height of thumbnail image (optionnal)** : Height to the thumbnail image. If the thumbnail image is empty, height will be attached to thumbnail image created from original image. E.g : `300px` or `20%`.
-- **Title (optionnal)** : Title of image displayed in a caption under image. `Alt` HTML attribute will use this title. E.g : `"A beautiful sunrise"`.
-
-#### Wide image ####
-
-Wide image tag is useful to display wide images in full width. It take the entire window width. Check the the result : [Wide image tag demo](http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak/2014/10/29/Tags-plugins-showcase/#Wide-images)
-
-Syntax : `{% wide_image /path/to/image [title text] %}`
-E.g : `{% wide_image http://google.fr/images/image125.png "A beautiful sunrise" %}`
-
-- **image** : Path to the original image.
-- **Title (optionnal)** : Title of image displayed in a caption under image. `Alt` HTML attribute will use this title. E.g : `"A beautiful sunrise"`.
-
-#### Fancybox ####
-
-`fancybox` tag is deprecated since Tranquilpeak 1.3. Please use `image` tag with `fancybox` class to generate them. More information here : [Image tag](#image)
-
-## Running ##
-
-Run `hexo server` and start writing! :)
\ No newline at end of file
diff --git a/themes/transquilpeak/languages/en.yml b/themes/transquilpeak/languages/en.yml
deleted file mode 100644
index 752020e..0000000
--- a/themes/transquilpeak/languages/en.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-# date format displayed everywhere in the blog
-date_format: "MMM DD, YYYY"
-
-global:
- home: "Home"
- categories: "Categories"
- category: "Category"
- tags: "Tags"
- tag: "Tag"
- archives: "Archives"
- search: "Search"
- about: "About"
- github: "GitHub"
- stack_overflow: "Stack Overflow"
- twitter: "Twitter"
- facebook: "Facebook"
- google_plus: "Google Plus"
- linkedin: "LinkedIn"
- mail: "Mail"
- rss: "RSS"
- share_on_google_plus: "Share on Google Plus"
- share_on_facebook: "Share on Facebook"
- share_on_twitter: "Share on Twitter"
- search_category: "Search category"
- search_tag: "Search tag"
- search_date: "Search date (YYYY/MM/DD)"
-
-pagination:
- page: "page %d"
- of: "of %d"
- newer_posts: "NEWER POSTS"
- older_posts: "OLDER POSTS"
- previous: "PREVIOUS"
- next: "NEXT"
-
-post:
- no_title : "no title"
- categorized_in: "in"
- tagged_in: "TAGGED IN"
- toc: "Table of Contents"
- read_more: "Continue reading"
- go_to_website: "Go to website"
- comment_and_share: "Comment and share"
-
-author:
- # Your biography in english (Markdown and HTML supported)
- bio: "An ordinary IT"
- # Your job in english
- job: "DevOps Engineer"
diff --git a/themes/transquilpeak/languages/fr-FR.yml b/themes/transquilpeak/languages/fr-FR.yml
deleted file mode 100644
index 875b2c9..0000000
--- a/themes/transquilpeak/languages/fr-FR.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-# date format displayed everywhere in the blog
-date_format: "DD MMM YYYY"
-
-global:
- home: "Accueil"
- categories: "Categories"
- tags: "Tags"
- archives: "Archive"
- search: "Rechercher"
- about: "À propos"
- github: "GitHub"
- stack_overflow: "Stack Overflow"
- twitter: "Twitter"
- facebook: "Facebook"
- google_plus: "Google Plus"
- linkedin: "LinkedIn"
- mail: "Mail"
- rss: "RSS"
- share_on_google_plus: "Partager sur Google Plus"
- share_on_facebook: "Partager sur Facebook"
- share_on_twitter: "Partager sur Twitter"
- search_category: "Rechercher une catégorie"
- search_tag: "Rechercher un tag"
- search_date: "Rechercher une date (YYYY/MM/DD)"
-
-pagination:
- page: "page"
- of: "sur"
- newer_posts: "POSTS RÉCENTS"
- older_posts: "POSTS ANCIENTS"
- previous: "PRÉCÉDENT"
- next: "SUIVANT"
-
-post:
- no_title : "sans titre"
- categorized_in: "dans"
- tagged_in: "TAGGÉ DANS"
- toc: "Table des matières"
- read_more: "Continuer"
- go_to_website: "Aller au site web"
- comment_and_share: "Commenter et partager"
-
-author:
- # Your biography in french (Markdown and HTML supported)
- bio: ""
- # Your job in french
- job: ""
diff --git a/themes/transquilpeak/languages/pt-br.yml b/themes/transquilpeak/languages/pt-br.yml
deleted file mode 100644
index 20bc68c..0000000
--- a/themes/transquilpeak/languages/pt-br.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-# date format displayed everywhere in the blog
-date_format: "DD/MM/YYYY"
-
-global:
- home: "Início"
- categories: "Categorias"
- category: "Category"
- tags: "Tags"
- tag: "Tag"
- archives: "Arquivo"
- search: "Pesquisar"
- about: "Sobre"
- github: "GitHub"
- stack_overflow: "Stack Overflow"
- twitter: "Twitter"
- facebook: "Facebook"
- google_plus: "Google Plus"
- linkedin: "LinkedIn"
- mail: "Mail"
- rss: "RSS"
- share_on_google_plus: "Share on Google Plus"
- share_on_facebook: "Share on Facebook"
- share_on_twitter: "Share on Twitter"
- search_category: "Pesquisar categoria"
- search_tag: "Pesquisar tag"
- search_date: "Pesquisar data (AAAA/MM/DD)"
-
-pagination:
- page: "página %d"
- of: "de %d"
- newer_posts: "POSTS MAIS NOVOS"
- older_posts: "POSTS MAIS ANTIGOS"
- previous: "ANTERIOR"
- next: "PRÓXIMO"
-
-post:
- no_title : "sem título"
- categorized_in: "em"
- tagged_in: "ETIQUETADO em"
- toc: "Tabela de Conteúdos"
- read_more: "Continuar leitura"
- go_to_website: "Ir para o site"
- comment_and_share: "Comentar e compartilhar"
-
-author:
- # Your biography in portuguese (Markdown and HTML supported)
- bio: ""
- # Your job in portuguese
- job: ""
\ No newline at end of file
diff --git a/themes/transquilpeak/languages/zh-cn.yml b/themes/transquilpeak/languages/zh-cn.yml
deleted file mode 100644
index a3c18ee..0000000
--- a/themes/transquilpeak/languages/zh-cn.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-# 在所有地方显示的 date 格式化
-date_format: "MMM DD, YYYY"
-
-global:
- home: "首页"
- categories: "分类"
- category: "分类"
- tags: "标签"
- tag: "标签"
- archives: "归档"
- search: "搜索"
- about: "关于"
- github: "GitHub"
- stack_overflow: "Stack Overflow"
- twitter: "Twitter"
- facebook: "Facebook"
- google_plus: "Google Plus"
- linkedin: "LinkedIn"
- mail: "邮箱"
- rss: "RSS"
- share_on_google_plus: "分享到 Google+"
- share_on_facebook: "分享到 Facebook"
- share_on_twitter: "分享到 Twitter"
- search_category: "搜索分类"
- search_tag: "搜索标签"
- search_date: "搜索日期 (YYYY/MM/DD)"
-
-pagination:
- page: "第 %d 页"
- of: "共 %d 页"
- newer_posts: "上一页"
- older_posts: "下一页"
- previous: "上一篇"
- next: "下一篇"
-
-post:
- no_title : "无标题"
- categorized_in: "发布在"
- tagged_in: "标签"
- toc: "目录"
- read_more: "阅读全文"
- go_to_website: "转到"
- comment_and_share: "注释和共享"
-
-author:
- # 你的个人简介 (支持 Markdown 和 HTML 语法)
- bio: ""
- # 你的工作简介
- job: ""
diff --git a/themes/transquilpeak/languages/zh-tw.yml b/themes/transquilpeak/languages/zh-tw.yml
deleted file mode 100644
index fd5625d..0000000
--- a/themes/transquilpeak/languages/zh-tw.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-# 在所有地方顯示的 date 格式
-date_format: "MMM DD, YYYY"
-
-global:
- home: "首頁"
- categories: "分類"
- category: "分類"
- tags: "標籤"
- tag: "標籤"
- archives: "所有文章"
- search: "搜尋"
- about: "關於"
- github: "GitHub"
- stack_overflow: "Stack Overflow"
- twitter: "Twitter"
- facebook: "Facebook"
- google_plus: "Google Plus"
- linkedin: "LinkedIn"
- mail: "Email"
- rss: "Atom"
- share_on_google_plus: "分享到 Google+"
- share_on_facebook: "分享到 Facebook"
- share_on_twitter: "分享到 Twitter"
- search_category: "搜尋分類"
- search_tag: "搜尋標籤"
- search_date: "搜尋日期(YYYY/MM/DD)"
-
-pagination:
- page: "第 %d 頁"
- of: "共 %d 頁"
- newer_posts: "上一頁"
- older_posts: "下一頁"
- previous: "上一篇"
- next: "下一篇"
-
-post:
- no_title : "無標題"
- categorized_in: "分類"
- tagged_in: "標籤"
- toc: "目錄"
- read_more: "繼續閱讀"
- go_to_website: "前往"
- comment_and_share: "留言與分享"
-
-author:
- # 你的個人簡介 (支援 Markdown 和 HTML 語法)
- bio: ""
- # 你的工作簡介
- job: ""
diff --git a/themes/transquilpeak/layout/_partial/about.ejs b/themes/transquilpeak/layout/_partial/about.ejs
deleted file mode 100644
index 502730e..0000000
--- a/themes/transquilpeak/layout/_partial/about.ejs
+++ /dev/null
@@ -1,39 +0,0 @@
-<% /* Define author's picture */ %>
-<% var authorPicture = null; %>
-<% if (theme.gravatar_email && theme.gravatar_email.length) { %>
- <% authorPicture = gravatar(theme.gravatar_email, 110); %>
-<% } else if (theme.author.picture && theme.author.picture.length) { %>
- <% if (is_remote_url(theme.author.picture)) { %>
- <% authorPicture = theme.author.picture; %>
- <% } else { %>
- <% authorPicture = url_for(theme.image_dir + '/' + theme.author.picture); %>
- <% } %>
-<% } %>
-
-
-
-
-
- <% if (authorPicture) { %>
-
- <% } %>
-
<%= config.author %>
- <% if (__('author.bio')) { %>
-
<%- markdown(__('author.bio')) %>
- <% } %>
- <% if (__('author.job')) { %>
-
-
-
- <%- markdown(__('author.job')) %>
-
- <% } %>
- <% if (theme.author.location) { %>
-
-
-
- <%= theme.author.location %>
-
- <% } %>
-
-
diff --git a/themes/transquilpeak/layout/_partial/archive-post.ejs b/themes/transquilpeak/layout/_partial/archive-post.ejs
deleted file mode 100644
index f5170e1..0000000
--- a/themes/transquilpeak/layout/_partial/archive-post.ejs
+++ /dev/null
@@ -1,41 +0,0 @@
-<%
- var lastYear;
- var lastMonth;
-%>
-
-
-
-
- <% page.posts.sort('date', 'desc').each(function(post) { %>
- <% var currentYear = post.date.year(); %>
- <% var currentMonth = post.date.format('MM'); %>
- <% if (lastYear != currentYear) { %>
- <% if (lastYear != null) { %>
-
diff --git a/themes/transquilpeak/layout/_partial/post.ejs b/themes/transquilpeak/layout/_partial/post.ejs
deleted file mode 100644
index 12442ea..0000000
--- a/themes/transquilpeak/layout/_partial/post.ejs
+++ /dev/null
@@ -1,55 +0,0 @@
-<%
- var tableOfContents = null;
- var postContent = post.content;
-
- // Generate and insert table of contents in post content
- if ((//).test(postContent)) {
- if (__('post.toc_title')) {
- tableOfContents = '
' + __('post.toc') + '
';
- } else {
- tableOfContents = '';
- }
- tableOfContents += toc(postContent, {list_number: false})
- postContent = postContent.replace(//, tableOfContents)
- }
- // Replace `` by `` and `` by ``
- // it's an hack to insert html tag without
- // having auto delete or auto closed by the markdown render engine
- // Currently used to insert an image in full width, out of `main-content-wrap` div
- // which center the content and have a limited width (750px)
- postContent = postContent.replace(//g, '')
- .replace(//g, '
';
- });
- if (childCategories.length > 0) {
- // recursive iteration on its child categories
- childCategories.forEach(function(childCategory) {
- // clone parents of current category to its child category
- childCategory.parents = category.parents.slice();
- // add current category to the parent of current child category
- childCategory.parents.push(category.name.toLowerCase());
- html += displayCategoriesAndPosts(childCategory);
- });
- }
- html += '
';
- html += '
';
- return html;
-}
-
-/**
- * Display all categories of a category
- * @param category
- * @returns {string}
- */
-function displayCategories(category) {
- // get all its child categories
- var childCategories = site.categories.find({'parent': category._id});
- // init parents
- if (category.parents === undefined) {
- category.parents = [];
- }
- // create category content
- var html = '';
- html += '
';
- // recursive iteration on its child categories
- childCategories.forEach(function(childCategory) {
- // clone parents of current category to its child category
- childCategory.parents = category.parents.slice();
- // add current category to the parent of current child category
- childCategory.parents.push(category.name.toLowerCase());
- html += displayCategories(childCategory);
- });
- html += '
- <%- partial('_partial/about', null, {cache: !config.relative_link}) %>
- <%- partial('_partial/cover', null, {cache: !config.relative_link}) %>
-
- <%- partial('_partial/script', {post: page}) %>
-
diff --git a/themes/transquilpeak/layout/page.ejs b/themes/transquilpeak/layout/page.ejs
deleted file mode 100755
index 1b1ae29..0000000
--- a/themes/transquilpeak/layout/page.ejs
+++ /dev/null
@@ -1 +0,0 @@
-<%- partial('_partial/post', {post: page}) %>
diff --git a/themes/transquilpeak/layout/post.ejs b/themes/transquilpeak/layout/post.ejs
deleted file mode 100755
index 1b1ae29..0000000
--- a/themes/transquilpeak/layout/post.ejs
+++ /dev/null
@@ -1 +0,0 @@
-<%- partial('_partial/post', {post: page}) %>
diff --git a/themes/transquilpeak/layout/tag.ejs b/themes/transquilpeak/layout/tag.ejs
deleted file mode 100755
index a45dd85..0000000
--- a/themes/transquilpeak/layout/tag.ejs
+++ /dev/null
@@ -1 +0,0 @@
-<%- partial('_partial/archive', {pagination: theme.tag_pagination}) %>
\ No newline at end of file
diff --git a/themes/transquilpeak/package.json b/themes/transquilpeak/package.json
deleted file mode 100644
index 649420b..0000000
--- a/themes/transquilpeak/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "name": "hexo-theme-tranquilpeak",
- "version": "1.6.0",
- "description": "A gorgeous responsive theme for Hexo blog framework",
- "main": "Gruntfile.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak.git"
- },
- "keywords": [
- "hexo",
- "blog",
- "tranquilpeak",
- "tranquil",
- "peak"
- ],
- "author": "Louis Barranqueiro",
- "license": "GNU General Public License v3.0",
- "bugs": {
- "url": "https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak/issues"
- },
- "homepage": "https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak",
- "devDependencies": {
- "bower": "^1.3.12",
- "grunt": "^0.4.5",
- "grunt-bower": "^0.18.0",
- "grunt-contrib-clean": "~0.5.0",
- "grunt-contrib-concat": "^0.5.0",
- "grunt-contrib-copy": "~0.4.1",
- "grunt-contrib-cssmin": "^0.12.0",
- "grunt-contrib-uglify": "^0.7.0",
- "grunt-contrib-watch": "^0.6.1",
- "grunt-sails-linker": "^0.10.1",
- "grunt-sass": "1.1.0",
- "grunt-sync": "^0.2.3",
- "grunt-text-replace": "^0.4.0",
- "hexo-util": "^0.5.1",
- "include-all": "^0.1.6",
- "load-grunt-tasks": "~0.2.0",
- "rand-token": "^0.2.1",
- "strip-indent": "^1.0.1"
- }
-}
diff --git a/themes/transquilpeak/scripts/filters/excerpt.js b/themes/transquilpeak/scripts/filters/excerpt.js
deleted file mode 100644
index c977a24..0000000
--- a/themes/transquilpeak/scripts/filters/excerpt.js
+++ /dev/null
@@ -1,34 +0,0 @@
-(function() {
- 'use strict';
-
- // define function to search index in an array with a regex
- if (typeof String.prototype.regIndexOf === 'undefined') {
- String.prototype.regIndexOf = function(regex, startpos) {
- var indexOf = this.substring(startpos || 0).search(regex);
- return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
- }
-
- }
-
- var rExcerpt = //;
-
- /**
- * Excerpt
- *
- * Allow user to use `` comment to define the post excerpt
- * this post excerpt will be deleted of the post content
- *
- * It's easily to use than `post.content` and `post.more`.
- */
- hexo.extend.filter.register('after_post_render', function(data) {
- var content = data.content;
-
- if (rExcerpt.test(content)) {
- var index = content.regIndexOf(rExcerpt);
- data.excerpt = content.substr(0, index).trim();
- data.content = content.substr(index).trim();
-
- return data;
- }
- });
-})();
diff --git a/themes/transquilpeak/scripts/helpers/absolute_url.js b/themes/transquilpeak/scripts/helpers/absolute_url.js
deleted file mode 100644
index 47a4288..0000000
--- a/themes/transquilpeak/scripts/helpers/absolute_url.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-
-var regRoot = new RegExp(hexo.config.root);
-
-/**
- * Return an absolute URL
- * @param url
- * @returns {String}
- */
-hexo.extend.helper.register('absolute_url', function(url) {
- // check if url is remote
- if (!this.is_remote_url(url)) {
- // generate an URL from the one given
- url = this.url_for(url);
- // remove `root` part
- url = url.replace(regRoot, '/');
- // prepend with `config.url` set in Hexo configuration file
- return hexo.config.url + url;
- }
- else {
- return url;
- }
-});
\ No newline at end of file
diff --git a/themes/transquilpeak/scripts/helpers/is_remote_url.js b/themes/transquilpeak/scripts/helpers/is_remote_url.js
deleted file mode 100644
index 210c59c..0000000
--- a/themes/transquilpeak/scripts/helpers/is_remote_url.js
+++ /dev/null
@@ -1,8 +0,0 @@
-'use strict';
-
-/**
- * Check if url is remote
- */
-hexo.extend.helper.register('is_remote_url', function(url) {
- return url && url.indexOf('//') >= 0;
-});
\ No newline at end of file
diff --git a/themes/transquilpeak/scripts/helpers/resolve_asset_url.js b/themes/transquilpeak/scripts/helpers/resolve_asset_url.js
deleted file mode 100644
index 108f781..0000000
--- a/themes/transquilpeak/scripts/helpers/resolve_asset_url.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-
-/**
- * Resolve asset URL
- * @param url
- * @param from
- * @returns {String}
- */
-hexo.extend.helper.register('resolve_asset_url', function(from, url) {
- // resolve asset url with `from` url if url is not remote
- if (from !== null && !this.is_remote_url(url)) {
- // remove .html at the end of url
- if (from.indexOf('.html') >= 0) {
- from = from.replace('.html', '/')
- }
- // add `/` at end of `from` url
- else if (from.length !== from.lastIndexOf('/') + 1) {
- from += '/'
- }
- // remove `/` that prepend `url` url
- if (url.indexOf('/') === 0) {
- url = url.substr(1);
- }
- return this.absolute_url(from + url);
- }
- else {
- return url;
- }
-});
\ No newline at end of file
diff --git a/themes/transquilpeak/scripts/tags/alert.js b/themes/transquilpeak/scripts/tags/alert.js
deleted file mode 100644
index 59c0393..0000000
--- a/themes/transquilpeak/scripts/tags/alert.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-var regCSSClass = /^[a-zA-Z0-9-_]+$/;
-
-/**
- * Alert tag
- *
- * Syntax: {% alert [css classes] %}content{% endalert %}
- */
-hexo.extend.tag.register('alert', function(args, content) {
- var classes = [];
- var html = '';
-
- // get CSS classes
- while (args.length && regCSSClass.test(args[0])) {
- classes.push(args.shift());
- }
-
- // build html
- html += '
';
- html += hexo.render.renderSync({text: content, engine: 'markdown'});
- html += '
';
-
- return html;
-}, {ends: true});
\ No newline at end of file
diff --git a/themes/transquilpeak/scripts/tags/fancybox.js b/themes/transquilpeak/scripts/tags/fancybox.js
deleted file mode 100644
index a2bc7ea..0000000
--- a/themes/transquilpeak/scripts/tags/fancybox.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-
-var pathRegex = /(((?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/;
-var classRegex = /^[a-zA-Z0-9-_]+$/;
-
-/**
- * Fancybox tag
- *
- * Syntax:
- * {% fancybox [class name] /path/to/image [/path/to/thumbnail] [title] %}
- */
-hexo.extend.tag.register('fancybox', function(args) {
- var original,
- thumbnail = '',
- cssClass = '';
-
- if (args.length && classRegex.test(args[0])) {
- cssClass = args.shift();
- }
- original = args.shift();
-
- if (args.length && pathRegex.test(args[0])) {
- thumbnail = args.shift();
- }
-
- var title = args.join(' ');
-
- return '' +
- '' +
- '' +
- (title && cssClass !== 'inline' ? '' + title + '' : '');
-});
\ No newline at end of file
diff --git a/themes/transquilpeak/scripts/tags/highlight_text.js b/themes/transquilpeak/scripts/tags/highlight_text.js
deleted file mode 100644
index 813b748..0000000
--- a/themes/transquilpeak/scripts/tags/highlight_text.js
+++ /dev/null
@@ -1,34 +0,0 @@
-'use strict';
-
-var colorRegex = /^(#[A-Fa-f0-9]{6}|#[A-Fa-f0-9]{3})|(rgba?\(\d{1,3},\d{1,3},\d{1,3}(?:,\d{1,3})?\))$/;
-var classRegex = /^[a-zA-Z0-9-_]+$/;
-
-function highlightText(args, content) {
- var html = '';
- var color = '';
- var cssClass = '';
-
- if (colorRegex.test(args[0])) {
- color = args.shift();
- html += '';
- }
- else if (classRegex.test(args[0])) {
- cssClass = args.shift();
- html += '';
- }
-
- html += content;
- html += '';
-
- return html;
-}
-
-/**
- * Highlight text tag
- *
- * Syntax:
- * {% hl [(class | hexa code color | rgb color | rgba color)] %}content{% hl %}
- * E.g:
- * {% highlight rgba(12,12,12,0.5) %}content{% highlight %}
- */
-hexo.extend.tag.register('hl_text', highlightText, {ends: true});
\ No newline at end of file
diff --git a/themes/transquilpeak/scripts/tags/image.js b/themes/transquilpeak/scripts/tags/image.js
deleted file mode 100644
index f1fd9c9..0000000
--- a/themes/transquilpeak/scripts/tags/image.js
+++ /dev/null
@@ -1,120 +0,0 @@
-(function() {
- 'use strict';
-
- // define function to search index in an array with a regex
- if (typeof Array.prototype.regIndexOf === 'undefined') {
- Array.prototype.regIndexOf = function(rx) {
- for (var i in this) {
- if (this[i].toString().match(rx)) {
- return i;
- }
- }
- return -1;
- };
- }
-
- var rPath = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))|^[A-Za-z0-9_\/-]+\.\w{2,4})/;
- var rClass = /^[_a-zA-Z0-9-]+$/;
- var rSize = /^\d+( ?:|\.\d+)(?:px|%)?$/;
- var rFigClass = /(^fig-\d{2,3}$|^center$)/;
- var fancyboxClass = 'fancybox';
- var figureClass = 'figure';
- var captionClass = 'caption';
- var noCaptionClass = 'nocaption';
- var clearClass = 'clear';
-
- /**
- * Image tag
- *
- * Syntax:
- * {% image [classes] /path/to/image [/path/to/thumbnail] [width of thumbnail] [height of thumbnail] [title text] %}
- * E.g:
- * {% image fig-50 right fancybox image2.png http://google.fr/images/image125.png "A beautiful sunrise" %}
- */
- hexo.extend.tag.register('image', function(args) {
- var original;
- var thumbnail = '';
- var thumbnailWidth = '';
- var thumbnailHeight = '';
- var classes = [];
- var html = '';
- var fancybox = '';
- var clear = '';
-
- // Get CSS classes
- while (args.length && rClass.test(args[0])) {
- classes.push(args.shift());
- }
-
- // Get path of original image
- original = args.shift();
-
- // Get path of thumbnail image
- if (args.length && rPath.test(args[0])) {
- thumbnail = args.shift();
- }
-
- // Get width of thumbnail image
- if (args.length && rSize.test(args[0])) {
- thumbnailWidth = args.shift();
- }
-
- // Get height of thumbnail image
- if (args.length && rSize.test(args[0])) {
- thumbnailHeight = args.shift();
- }
-
- // Get title of image
- var title = args.join(' ');
- // Build the image HTML structure
- var image = '';
-
- // Build div to retrieve normal flow of document
- if (classes.indexOf(clearClass) >= 0) {
- clear = '';
- // remove `clear` class of `classes` to not be attached on the main div
- classes.splice(classes.indexOf(clearClass), 1);
- }
-
- // Add Fancybox structure around image
- if (classes.indexOf(fancyboxClass) >= 0) {
- fancybox += '';
- fancybox += image;
- fancybox += '';
- // remove `fancyfox` class of `classes` to not be attached on the main div
- classes.splice(classes.indexOf(fancyboxClass), 1);
- }
-
- // Build HTML structure
- html += '
';
- html += fancybox || image;
-
- // Add caption
- if (title && classes.indexOf(noCaptionClass) === -1) {
- html += '';
- html += title;
- html += '';
- }
-
- html += '
';
- // add `clear` div
- html += clear;
-
- return html;
- });
-})();
\ No newline at end of file
diff --git a/themes/transquilpeak/scripts/tags/wide_image.js b/themes/transquilpeak/scripts/tags/wide_image.js
deleted file mode 100644
index c858789..0000000
--- a/themes/transquilpeak/scripts/tags/wide_image.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict';
-
-var rPath = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))|^[A-Za-z0-9_\/-]+\.\w{2,4})/;
-var figureClass = 'figure';
-var figureImageClass = 'figure-img';
-var figureFullWidthClass = 'figure--fullWidth';
-var captionClass = 'caption';
-
-/**
- * Wide image tag
- *
- * Syntax:
- * {% wide_image /path/to/image [title text] %}
- * E.g:
- * {% wide_image http://google.fr/images/image125.png "A beautiful sunrise" %}
- */
-hexo.extend.tag.register('wide_image', function(args) {
- var image;
- var html = '';
-
- // Get path of image
- if (rPath.test(args[0])) {
- image = args.shift();
- }
-
- // Get title of image
- var title = args.join(' ');
-
- // Place image out of `main-content-wrap` div to be display in full width
- // We ise `` and `` here to not be auto deleted or closed by marked module.
- // The theme will replace this comment tag by `
` and `
` after marked job.
- html += '';
- html += '
';
- html += '';
- html += '';
- html += title;
- html += '';
- html += '