diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml deleted file mode 100644 index 0ed84cfa..00000000 --- a/.github/workflows/jekyll.yml +++ /dev/null @@ -1,64 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# Sample workflow for building and deploying a Jekyll site to GitHub Pages -name: Deploy Jekyll site to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: ["master"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - # Build job - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v5 - - name: Setup Ruby - uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0 - with: - ruby-version: '3.4.7' # Not needed with a .ruby-version file - bundler-cache: true # runs 'bundle install' and caches installed gems automatically - cache-version: 0 # Increment this number if you need to re-download cached gems - - name: Setup Pages - id: pages - uses: actions/configure-pages@v5 - - name: Build with Jekyll - # Outputs to the './_site' directory by default - run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" - env: - JEKYLL_ENV: production - - name: Upload artifact - # Automatically uploads an artifact from the './_site' directory by default - uses: actions/upload-pages-artifact@v4 - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 24695d96..66da23ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ .DS_Store _site - -.jekyll-cache diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index ade7bf2f..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.exclude": { - ".jekyll-cache": true - } -} \ No newline at end of file diff --git a/Gemfile b/Gemfile deleted file mode 100644 index eddfe8e1..00000000 --- a/Gemfile +++ /dev/null @@ -1,10 +0,0 @@ -source 'https://rubygems.org' - -gem 'jekyll', '~> 4.4.0' - -group :jekyll_plugins do - gem 'jekyll-feed', '~> 0.17.0' - gem 'jekyll-sitemap', '~> 1.4.0' - gem 'jekyll-remote-theme', '~> 0.4.3' - gem 'jekyll-seo-tag', '~> 2.8.0' -end \ No newline at end of file diff --git a/_config.yml b/_config.yml index 1a204608..15602f62 100644 --- a/_config.yml +++ b/_config.yml @@ -1,115 +1,143 @@ -# ==================== # -# Default Configuration ovewrite -# ==================== # - -# # Where things are -# source : . -# destination : ./_site -# collections_dir : . -# plugins_dir : _plugins # takes an array of strings and loads plugins in that order -# layouts_dir : _layouts -# data_dir : _data -# includes_dir : _includes -sass: - # sass_dir: _sass - style: compressed -# collections: -# posts: -# output : true - -# # Handling Reading -# safe : false -# include : [".htaccess"] -# exclude : ["Gemfile", "Gemfile.lock", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"] -# keep_files : [".git", ".svn"] -# encoding : "utf-8" -# markdown_ext : "markdown,mkdown,mkdn,mkd,md" -# strict_front_matter : false - -# # Filtering Content -# show_drafts : null -# limit_posts : 0 -# future : false -# unpublished : false - -# # Plugins -# whitelist : [] -plugins: +# Where things are +source: . +destination: ./_site +plugins_dir: ./_plugins +layouts_dir: ./_layouts +data_dir: ./_data +includes_dir: ./_includes + +# this config will lead github pages blog(jekyll 3.0.3) generate no rendered posts +# so comment out this until github used jekyll updated +# collections: null + +# Handling Reading +safe: false +include: [".htaccess"] +exclude: [] +keep_files: [".git", ".svn"] +encoding: "utf-8" +markdown_ext: "markdown,mkdown,mkdn,mkd,md" + +# Filtering Content +show_drafts: null +limit_posts: 0 +future: true +unpublished: false + +# Plugins +whitelist: [] +gems: - jekyll-feed - - jekyll-seo-tag - jekyll-sitemap - - jekyll-remote-theme - -# # Conversion -# markdown : kramdown -# highlighter : rouge -# lsi : false -# excerpt_separator : "\n\n" -# incremental : false - -# # Serving -# detach : false -# port : 4000 -# host : 127.0.0.1 -# baseurl : "" # does not include hostname -# show_dir_listing : false - -# # Outputting -permalink : "/:year/:month/:title:output_ext" -# paginate_path : /page:num + +# Conversion +markdown: kramdown +highlighter: rouge +lsi: false +excerpt_separator: "\n\n" +incremental: false + +# Serving +detach: false +port: 4000 +host: 127.0.0.1 +baseurl: "" # does not include hostname + +# Outputting +permalink: /:year/:month/:title.html +# paginate: 8 +paginate_path: /page:num timezone: Asia/Shanghai -# quiet : false -# verbose : false +feed: + path: feed.xml + +quiet: false defaults: - - scope: + - + scope: path: "" # empty string for all files type: posts # limit to posts values: comments: true - layout: post - - scope: + - + scope: path: "" # empty string for all files type: pages # limit to posts values: comments: false - layout: page - -# liquid: -# error_mode : warn -# strict_filters : false -# strict_variables : false - -# # Markdown Processors -# kramdown: -# auto_ids : true -# entity_output : as_char -# toc_levels : [1, 2, 3, 4, 5, 6] -# smart_quotes : lsquo,rsquo,ldquo,rdquo -# input : GFM -# hard_wrap : false -# footnote_nr : 1 -# show_warnings : false - -# ==================== # -# User Configuration -# ==================== # - -#站点基础配置 -title: 自说Me话 -tagline: I Say Me | 我说我自己 | 我说世界 -description: ik0r's Individual Blog. 自说Me话,一个前端开发新手的网络记录,同喜欢网络,Linux,前端开发,爱折腾的人共同分享,记录折腾心得还有学习过程. -keywords: ik0r,Linux,Web,前端开发,自说Me话,ISayme,Internet -url: https://isay.me -# comments -comments: - provider: disqus - disqus: - shortname: isaymesite +# Markdown Processors +kramdown: + input: GFM + hard_wrap: false + syntax_highlighter: rouge + auto_ids: true + footnote_nr: 1 + entity_output: as_char + toc_levels: 1..6 + smart_quotes: lsquo,rsquo,ldquo,rdquo + enable_coderay: false -remote_theme: ik0r/jekyll-theme-iLotus + coderay: + coderay_wrap: div + coderay_line_numbers: inline + coderay_line_number_start: 1 + coderay_tab_width: 4 + coderay_bold_every: 10 + coderay_css: style #iLotus configs iLotus: columns: 1 + begin: 2011 + + # comments provider + comments: + provider: duoshuo + duoshuo: + short_name: isayme + + archives_path: /archives.html + contact_path: /contact.html + links_path: /links.html + tags_path: /tags.html + + #菜单配置 + navs: + - text: 首页 + url: / + icon: fa fa-home + class: home + - text: 文章归档 + url: /archives.html + icon: fa fa-reorder + class: none + - text: 文章标签 + url: /tags.html + icon: fa fa-tags + class: none + - text: 关于我 + url: /contact.html + icon: fa fa-user + class: none + - text: 博客源代码 + url: https://github.com/Treri/treri.github.io + icon: fa fa-github-square + class: none + +#站点基础配置 +title: 自说Me话 +subTitle: I Say Me | 我说我自己 | 我说世界 +description: Treri's Individual Blog. 自说Me话,一个前端开发新手的网络记录,同喜欢网络,Linux,前端开发,爱折腾的人共同分享,记录折腾心得还有学习过程. +keywords: Treri,Linux,Web,前端开发,自说Me话,ISayme,Internet +url: http://isay.me + +author: + name : Treri + email: treri.liu@gmail.com + github: Treri + twitter: Treri_liu + douban: lwent + QQ: 83692901 + weibo: leftupme diff --git a/_data/iLotus.yml b/_data/iLotus.yml deleted file mode 100644 index 1bd4ff6f..00000000 --- a/_data/iLotus.yml +++ /dev/null @@ -1,22 +0,0 @@ -copyright: - begin_year: 2011 - -nav_items: - - title: 首页 - url: / - icon: fa fa-home - class: home - - title: 文章归档 - url: /archives.html - icon: fa fa-reorder - - title: 文章标签 - url: /tags.html - icon: fa fa-tags - - title: 友情链接 - url: /links.html - icon: fa fa-link - -menu_items: - - title: 关于我 - url: /contact.html - icon: fa fa-user diff --git a/_drafts/2023-07-19-ssh-slow.md b/_drafts/2023-07-19-ssh-slow.md deleted file mode 100644 index 9467614c..00000000 --- a/_drafts/2023-07-19-ssh-slow.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: ssh 连接缓慢解决 -pid: 20230701901 -tags: [SSH] ---- - -1. 特权容器,开启 `nesting` 功能即可。 - -2. 非特权容器,可以尝试命令 - - ``` - systemctl mask systemd-logind - ``` - - 参考文章:https://www.reddit.com/r/Proxmox/comments/ph10mb/debian_11_lxc_login_delay/ diff --git a/_drafts/2024-04-30-traefik-authelia-integration.md b/_drafts/2024-04-30-traefik-authelia-integration.md deleted file mode 100644 index 5ba2a4fb..00000000 --- a/_drafts/2024-04-30-traefik-authelia-integration.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: 使用 Authelia 为 traefik 提供统一登录认证 -pid: 20240403001 -tags: [traefik, Authelia] ---- - -在 traefik 中我一直使用的是 traefik 的 basicauth middleware, 但是这个方案有一个缺点就是输入密码时由于调用的是浏览器原生的弹窗, 所以像 vaultwarden 这类工具是没法自动填充密码的. 另外了解到 traefik 还有另一个 forwardauth middleware, 但是这个 middleware 使用时需要有已运行的 forwardauth 服务, 所以现在就需要找一个 forwarauth 服务. - -通过搜索 traefik forward auth 关键字, 首先找到的是 github 上的项目 [thomseddon/traefik-forward-auth](https://github.com/thomseddon/traefik-forward-auth), 但是看这个项目已经 3 年没更新了, 所以再找找其它的项目. - -又搜索了一番, 发现了 authentik 项目, 找到了 Authentik 相关链接如下 - -- 官方网站: -- ecwu 写的文档: [Authentik 教程系列:简介和安装配置](https://ecwuuuuu.com/post/authentik-tutorial-1-introduction-and-install/) -- ecwu 在 bilibili 发布的视频教程 [Authentik 教程系列](https://www.bilibili.com/video/BV1pm41167WK/) - -看完上面的文档和视频后, 我对 Authentik 的感觉就是, Authentik 功能虽然很强大, 但是对于个人项目来说太重了. 所以作了一些搜索和对比后, 决定使用 Authelia. Authelia 轻量使用时, 可以不使用任何数据库的, 完全使用文件作为配置工具, 对于备份和维护很方便. - -Authelia 相关链接如下 - -- 官方网站 -- Github - -下面介绍如何使用 Authelia 为 traefik 提供统一登录认证. - diff --git a/_drafts/2024-05-19-pve-backup-to-nfs.md b/_drafts/2024-05-19-pve-backup-to-nfs.md deleted file mode 100644 index 3ddd3fb4..00000000 --- a/_drafts/2024-05-19-pve-backup-to-nfs.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: PVE 配置自动备份到 NFS -pid: 2024051901 -tags: [PVE, NFS] ---- - -1. 群晖开启 NFS 服务 -2. 新建共享目录 `backups0`, 配置 nfs 权限允许 PVE IP 访问, 并且映射所有用户为 `admin` -3. PVE 挂载 NFS 目录, 内容选择为 `VZDump备份文件`. -4. 配置自动备份任务, 存储位置为刚才挂载的 NFS 目录. -5. PVE 宿主机修改 `/etc/vzdump.conf` 文件, 新增 `tmpdir` 配置. 如果不加的话, 直接备份 nfs 会失败. -并且我配置了nfs 目录直接通过 cloudSync 同步到oneDrive. 如果不设置 `tmpdir` 的话, 在备份过程中的临时文件也会触发 oneDrive 同步. 所以通过配置 `tmpdir` 可以只同步最后生成好的文件即可. \ No newline at end of file diff --git a/_drafts/2024-05-24-pve-remove-swap.md b/_drafts/2024-05-24-pve-remove-swap.md deleted file mode 100644 index 27dee200..00000000 --- a/_drafts/2024-05-24-pve-remove-swap.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: PVE删除 swap,并把空间合并到local -pid: 2024052401 -tags: [PVE, swap] ---- - -我的 PVE 是安装在 U 盘中, PVE安装完成后, 自动划分了 3.5G 空间作为 swap 分区. 最近发现 PVE 系统的 io 延迟很高, 一直在 10%~30% 跳动. 网上搜了一下, 有说是因为 swap 性能太差导致的, 所以尝试下把 swap 禁用, 结果真的有效. 所以记录一下. - -**首先**是设置系统不使用 swap, 修改 `/etc/sysctl.conf` 文件, 添加如下内容 - -``` -vm.swappiness=0 -``` - -**然后**刷新系统设置 - -``` -sysctl -p -``` - -**然后**停用 swap 文件 - -``` -swapoff -a -``` - -**然后**删掉 swap 文件, 并扩充空间到 local - -``` -lvremove /dev/pve/swap -lvextend -l+100%FREE /dev/mapper/pve-root -resize2fs /dev/mapper/pve-root -``` - -**然后**更新 `/etc/fstab` 文件, 将 swap 文件挂载的配置删掉或将如下内容注释 - -``` -# /dev/pve/swap none wrap sw 0 0 -``` - -**最后**是重启系统. 在重启之前我的 io 延迟依然很高, 重启后下降到 `0.17%`, 并且因为 io 延迟降低, CPU 占用率也下降了一点. - -下面是禁用 swap 前的 CPU 占用率和 io 延迟与禁用 swap 之后的 CPU 占用率和 io 延迟对比. - -禁用前 -![](/uploads/2024/05/2024052401-01.png) -![](/uploads/2024/05/2024052401-02.png) - -禁用后 -![](/uploads/2024/05/2024052401-03.png) -![](/uploads/2024/05/2024052401-04.png) diff --git a/_drafts/2025-09-20-lxc-setup.md b/_drafts/2025-09-20-lxc-setup.md deleted file mode 100644 index 99009c21..00000000 --- a/_drafts/2025-09-20-lxc-setup.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: lxc 容器初始化步骤 -pid: 2025092001 -tags: [PVE, lxc] ---- - -创建 lxc 容器时, 记得把非特权容器取消勾选。非特权容器中,无法使用非root用户运行 docker 命令 - -**首先** 更换 apt 源, 直接按照 ustc 源的操作步骤进行替换。 -``` -sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources -apt update -apt upgrade -``` - -**然后** 添加普通用户 -``` -adduser wyntau -``` - -**然后** 安装git, zsh, curl sudo等命令 -``` -apt install git zsh curl sudo -``` -安装 sudo 后,修改 `/etc/sudoers` 文件,将 `wyntau` 用户添加到 root 用户组中 - - -**然后** 用新用户登录,配置 dotfiles git zsh -``` -git clone --depth 1 https://github.com/wyntau/dotfiles.git ~/.dotfiles -cd ~/.dotfiles -./install.sh git_config -./install.sh zsh_zim -``` - -重新登录前,可以把 zsh 配置更新 -``` -cat ~/.dotfiles/zsh/.zshr.common >> ~/.zshrc -``` - -**然后** 重新登录,使用环境变量生效,使用前面 zsh 配置中的源安装 homebrew -``` -cd ~/.dotfiles -./install.sh homebrew -``` - -**然后** 重新登录, 使 homebrew 配置生效,使用 hombrew 安装 rustup, nvm 等工具 -``` -brew install rustup nvm -``` - -安装完成后,安装 rust 以及 node, pnpm 等 -``` -rustup-init -nvm install 22 -npm install -g pnpm -``` - -**然后** 安装 docker, 使用 ustc 源进行安装 -``` -HTTPS_PROXY=xxx curl -fsSL https://get.docker.com -o get-docker.sh -sudo DOWNLOAD_URL=https://mirrors.ustc.edu.cn/docker-ce sh get-docker.sh -``` - -允许普通用户运行 docker 命令 -``` -sudo groupadd docker -sudo usermod -aG docker your_username -``` - -设置 docker 代理 -``` -sudo mkdir -p /etc/systemd/system/docker.service.d -sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf -``` - -``` -[Service] -Environment="HTTP_PROXY=http://127.0.0.1:8123" -Environment="HTTPS_PROXY=http://127.0.0.1:8123" -``` - -这里的127.0.0.1是直接用了本机的 http 代理,然后重启服务才能生效 -``` -sudo systemctl daemon-reload -sudo systemctl restart docker -``` - -可以通过sudo systemctl show --property=Environment docker看到设置的环境变量。 - -然后docker pull就会使用代理啦! - - diff --git a/_includes/comments b/_includes/comments new file mode 100644 index 00000000..d8f44c8d --- /dev/null +++ b/_includes/comments @@ -0,0 +1,12 @@ +{% if jekyll.environment == 'production' and site.iLotus.comments.provider %} + {% if page.comments %} + +
+{% case site.iLotus.comments.provider %} +{% when "duoshuo" %} + {% include comments-providers/duoshuo %} +{% endcase %} +
+ + {% endif %} +{% endif %} diff --git a/_includes/comments-providers/duoshuo b/_includes/comments-providers/duoshuo new file mode 100644 index 00000000..5fb36e2b --- /dev/null +++ b/_includes/comments-providers/duoshuo @@ -0,0 +1,36 @@ + + +
+ + + + diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 00000000..c5872bf4 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,77 @@ + + + + + + + {% if page.title %} + {{ page.title }} + {% else %} + {{ site.title }} + {% endif %} + + + + {% if page.description %} + + {% elsif site.description %} + + {% endif %} + {% if page.kekeywords %} + + {% elsif site.keywords %} + + {% endif %} + {% feed_meta %} + + + + + + + + + + {{ content }} + +
+

Copyright © {{ site.iLotus.begin }}–{{ site.time | date: "%Y" }} {{ site.title }} All rights reserved. Design by zhanxin.

+
+ + + + + + diff --git a/_layouts/page.html b/_layouts/page.html new file mode 100644 index 00000000..6cfb20c2 --- /dev/null +++ b/_layouts/page.html @@ -0,0 +1,16 @@ +--- +layout: default +--- + +

+ 首页 + > + {{ page.title }} +

+ +

{{ page.title }}

+
+{{ content }} +
+ +{% include comments %} diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 00000000..1fcd83d3 --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,27 @@ +--- +layout: default +--- + +

+ Home + > + Archives + > + {{ page.title }} +

+

{{ page.title }}

+

Publish:

+
+{{ content }} +
+

声明: 本文采用 BY-NC-SA 授权。转载请注明转自: {{ site.author.name }}

+
+ {% if page.previous %} + + {% endif %} + {% if page.next %} + + {% endif %} +
+ +{% include comments %} diff --git a/_posts/2011-03-24-13-jquery-lazyload-for-wordpress.md b/_posts/2011-03-24-13-jquery-lazyload-for-wordpress.md index 8e1d8e93..0e92b2e2 100644 --- a/_posts/2011-03-24-13-jquery-lazyload-for-wordpress.md +++ b/_posts/2011-03-24-13-jquery-lazyload-for-wordpress.md @@ -1,4 +1,5 @@ --- +layout: post title: 给wordpress添加图片渐显效果 pid: 13 tags: [WordPress] diff --git a/_posts/2011-03-24-16-pe-win7-ghost.md b/_posts/2011-03-24-16-pe-win7-ghost.md old mode 100755 new mode 100644 index 52c6bf30..9240a208 --- a/_posts/2011-03-24-16-pe-win7-ghost.md +++ b/_posts/2011-03-24-16-pe-win7-ghost.md @@ -1,4 +1,5 @@ --- +layout: post title: PE安装win7(安装版)图解,附带GHOST版安装思路 pid: 16 tags: [Windows, 原创] @@ -44,37 +45,37 @@ tags: [Windows, 原创] 第一步,从PE启动计算机,进入后格式化C盘,然后选择VDM虚拟光驱 -![](/uploads/2011/03/20110324-16-01.jpg) +![](/uploads/2011/03/24_01.jpg) 第二步,装载win7安装镜像文件,然后将虚拟光驱最小化(不能点×号,点了就没有加载的镜像了)。 -![](/uploads/2011/03/20110324-16-02.jpg) +![](/uploads/2011/03/24_02.jpg) -![](/uploads/2011/03/20110324-16-03.jpg) +![](/uploads/2011/03/24_03.jpg) -![](/uploads/2011/03/20110324-16-04.jpg) +![](/uploads/2011/03/24_04.jpg) 第三步,打开win7安装器,按提示操作,选择WIM文件路径 -![](/uploads/2011/03/20110324-16-05.jpg) +![](/uploads/2011/03/24_05.jpg) -![](/uploads/2011/03/20110324-16-06.jpg) +![](/uploads/2011/03/24_06.jpg) -![](/uploads/2011/03/20110324-16-07.jpg) +![](/uploads/2011/03/24_07.jpg) -![](/uploads/2011/03/20110324-16-08.jpg) +![](/uploads/2011/03/24_08.jpg) 然后选择旗舰版序号5,选择安装位置,选择活动磁盘位置, -![](/uploads/2011/03/20110324-16-09.jpg) +![](/uploads/2011/03/24_09.jpg) 确认,释放展开文件,再是漫长的等待...... -![](/uploads/2011/03/20110324-16-10.jpg) +![](/uploads/2011/03/24_10.jpg) -![](/uploads/2011/03/20110324-16-11.jpg) +![](/uploads/2011/03/24_11.jpg) -![](/uploads/2011/03/20110324-16-12.jpg) +![](/uploads/2011/03/24_12.jpg) 第四步,重新启动计算机吧,按照提示就可以了。要激活工具的说声。呵呵 diff --git a/_posts/2011-03-24-17-custom-ubuntu-boot-menu.md b/_posts/2011-03-24-17-custom-ubuntu-boot-menu.md old mode 100755 new mode 100644 index 1bc8f02f..90de849f --- a/_posts/2011-03-24-17-custom-ubuntu-boot-menu.md +++ b/_posts/2011-03-24-17-custom-ubuntu-boot-menu.md @@ -1,9 +1,10 @@ --- +layout: post title: 自定义Ubuntu系统引导菜单 pid: 17 tags: [Linux] --- -![](/uploads/2011/03/20110324-17-07.png) +![](/uploads/2011/03/24_32.png) grub2是ubuntu的默认引导工具,但是却不是最漂亮的引导工具.我们知道ubuntu是可以高度自定义化的,这次我们就要教你怎么让你的引导工具更漂亮. @@ -15,21 +16,21 @@ grub2是ubuntu的默认引导工具,但是却不是最漂亮的引导工具.我 sudo add-apt-repository ppa:bean123ch/burg && sudo apt-get update -![](/uploads/2011/03/20110324-17-01.png) +![](/uploads/2011/03/24_13.png) 完成以后,打开新立德软件包管理器,搜索 burg,然后标记,以便安装. -![](/uploads/2011/03/20110324-17-02.png) +![](/uploads/2011/03/24_14.png) **注意,建议使用新立德安装burg,以免使用终端安装时出现错误** 在安装的过程中,你会遇到设置窗口.出现第一个窗口时,什么都不要做,直接下一步. -![](/uploads/2011/03/20110324-17-03.png) +![](/uploads/2011/03/24_15.png) 第二个窗口时你需要告诉burg安装在什么地方.选择你的ubuntu的根驱动器,如果你有/boot目录的话,就选择/boot目录. -![](/uploads/2011/03/20110324-17-04.png) +![](/uploads/2011/03/24_16.png) 最后一件事就是确保burg能够正常启动,打开终端输入如下命令. @@ -37,7 +38,7 @@ grub2是ubuntu的默认引导工具,但是却不是最漂亮的引导工具.我 这样安装和设置就结束了.重启机器后 引导工具就会被burg替代.在引导菜单画面时,按下F1获得帮助和其他菜单,按下F2查看主题列表,按下F3更改屏幕分辨率. -![](/uploads/2011/03/20110324-17-05.png) +![](/uploads/2011/03/24_17.png) **安装 主题** @@ -45,7 +46,7 @@ grub2是ubuntu的默认引导工具,但是却不是最漂亮的引导工具.我 sudo cp *PathToFile*/Fortune-BURG-v03.tar.gz /boot/burg/themes -![](/uploads/2011/03/20110324-17-06.png) +![](/uploads/2011/03/24_18.png) 根据你的安装位置和下载文件进行命令调整即可.完成之后执行一下命令. diff --git a/_posts/2011-03-24-20-what-to-do-after-install-fedora13.md b/_posts/2011-03-24-20-what-to-do-after-install-fedora13.md index fa51c072..3c48476e 100644 --- a/_posts/2011-03-24-20-what-to-do-after-install-fedora13.md +++ b/_posts/2011-03-24-20-what-to-do-after-install-fedora13.md @@ -1,4 +1,5 @@ --- +layout: post title: 安装完fedora13我要干的几件事 pid: 20 tags: [Linux, 原创] diff --git a/_posts/2011-03-24-21-fedora13-googlechrome-extension.md b/_posts/2011-03-24-21-fedora13-googlechrome-extension.md old mode 100755 new mode 100644 index 561a0b2a..f3f4708e --- a/_posts/2011-03-24-21-fedora13-googlechrome-extension.md +++ b/_posts/2011-03-24-21-fedora13-googlechrome-extension.md @@ -1,4 +1,5 @@ --- +layout: post title: fedora13安装chrome以及经典扩展程序推荐 pid: 21 tags: [Chrome, Linux, 原创] @@ -41,15 +42,15 @@ tags: [Chrome, Linux, 原创] 最受欢迎的Google 浏览器扩充功能,拥有超过150 万位使用者!阻挡网路上所有的广告 下面就贴两张图对比一下 -![](/uploads/2011/03/20110324-21-01.png) +![](/uploads/2011/03/24_19.png) -![](/uploads/2011/03/20110324-21-02.png) +![](/uploads/2011/03/24_20.png) [2  Discuz! 论坛助手](https://chrome.google.com/extensions/detail/bpcbeglppddgdmmlcdbeigkhbmjnldme) 去除 Discuz! 论坛中的广告,支持Discuz! 和 Discuz!X. -![](/uploads/2011/03/20110324-21-03.png) +![](/uploads/2011/03/24_21.png) [3  Google Reader Auto Https](https://chrome.google.com/extensions/detail/kkeglijakjolgbmcbfhnmijhijgkmclh) @@ -65,57 +66,57 @@ tags: [Chrome, Linux, 原创] 说明一下 Smooth Gestures 事大多数人推荐的,但是这个在linux中的chrome中不能用,因为这个插件要求chrome的版本>=8.0,而linux中的stable版本只有7.0,所以就用Mouse Stroke 足够了 -![](/uploads/2011/03/20110324-21-04.png) +![](/uploads/2011/03/24_22.png) [5  No BaiduAd](https://chrome.google.com/extensions/detail/amdhfoilnhpfanohkineenoakiffblec) 本扩展程序可以有效屏蔽或高亮百度竞价排名广告 -![](/uploads/2011/03/20110324-21-05.png) +![](/uploads/2011/03/24_23.png) [6  One Number](https://chrome.google.com/extensions/detail/cfkohgkpafhkpdcnfadadcibfboapggi) Check GMail, Google Reader, Google Voice, and Google Wave. Many sources, one number.让你一次就可以知道多个东西是否有了更新 -![](/uploads/2011/03/20110324-21-06.png) +![](/uploads/2011/03/24_24.png) -![](/uploads/2011/03/20110324-21-07.png) +![](/uploads/2011/03/24_25.png) [7  RSS Subscription Extension(由 Google 提供)](https://chrome.google.com/extensions/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd) 在您的工具栏上添加一键订阅。谷歌浏览器本身没有RSS订阅功能,所以用这个扩展就可以随意订阅想要的网站了,只要这个网站支持RSS输出,此扩展程序就会在地址栏出现RSS订阅标志, -![](/uploads/2011/03/20110324-21-08.png) +![](/uploads/2011/03/24_26.png) [8  SearchPreview for Google](https://chrome.google.com/extensions/detail/hcjdanpjacpeeppdjkppebobilhaglfo) Adds preview images (thumbnails) to your Google search results.就是可以看到搜索到的网页的缩略图,看看是不是被墙掉了,顺便大体了解一下网站上到底是什么内容. -![](/uploads/2011/03/20110324-21-09.png) +![](/uploads/2011/03/24_27.png) [9  Webmail Ad Blocker](https://chrome.google.com/extensions/detail/cbhfdchmklhpcngcgjmpdbjakdggkkjp) 在屏幕上时,使用雅虎邮件,Hotmail和Gmail的空间,从而扩大您的消息右边座广告 -![](/uploads/2011/03/20110324-21-10.png) +![](/uploads/2011/03/24_28.png) [10  人人网改造器](https://chrome.google.com/extensions/detail/bafellppfmjodafekndapfceggodmkfc) 为人人网([renren.com](http://renren.com/),原校内网[xiaonei.com](http://xiaonei.com/))清理广告、新鲜事、各种烦人的通告,增加更多功能…… -![](/uploads/2011/03/20110324-21-11.png) +![](/uploads/2011/03/24_29.png) [11  自动回贴机](https://chrome.google.com/extensions/detail/lbkdfmcbclnoggeijjjakleeealgoncm) 帮助用户快速回复的隐藏贴好像其他论坛也可以回复,因为我在雨林木风论坛上遇到的隐藏贴就自动回复了 -![](/uploads/2011/03/20110324-21-12.png) +![](/uploads/2011/03/24_30.png) [12  百科抄抄](https://chrome.google.com/extensions/detail/agfhhcchechmgiabincfjdgolmpbnkkc) 可以自动删除掉百度百科里\[编辑本段\] 这个链接,可以更方便的复制。 -![](/uploads/2011/03/20110324-21-13.png) +![](/uploads/2011/03/24_31.png) [13  回到顶部](https://chrome.google.com/extensions/detail/aadikfohengoplibnbfjhmhafjlgiooo) diff --git a/_posts/2011-03-24-22-fawave-add-twitter-sync.md b/_posts/2011-03-24-22-fawave-add-twitter-sync.md index 287e13c9..5a5ed9e3 100644 --- a/_posts/2011-03-24-22-fawave-add-twitter-sync.md +++ b/_posts/2011-03-24-22-fawave-add-twitter-sync.md @@ -1,4 +1,5 @@ --- +layout: post title: 发微(FaWave)添加twitter同步 pid: 22 tags: [Twitter] diff --git a/_posts/2011-03-25-11-slimbox-plugins-picture-slides.md b/_posts/2011-03-25-11-slimbox-plugins-picture-slides.md index 73f1ce56..37d34f67 100644 --- a/_posts/2011-03-25-11-slimbox-plugins-picture-slides.md +++ b/_posts/2011-03-25-11-slimbox-plugins-picture-slides.md @@ -1,4 +1,5 @@ --- +layout: post title: slimbox插件,实现图片的幻灯片效果 pid: 11 tags: [WordPress] diff --git a/_posts/2011-03-25-12-wordpress-add-ajax-comments.md b/_posts/2011-03-25-12-wordpress-add-ajax-comments.md index c2aa06d5..65c85381 100644 --- a/_posts/2011-03-25-12-wordpress-add-ajax-comments.md +++ b/_posts/2011-03-25-12-wordpress-add-ajax-comments.md @@ -1,4 +1,5 @@ --- +layout: post title: wordpress添加AJAX评论效果(非插件版) pid: 12 tags: [WordPress] diff --git a/_posts/2011-03-25-18-history-command-enhance-efficiency-in-linux.md b/_posts/2011-03-25-18-history-command-enhance-efficiency-in-linux.md old mode 100755 new mode 100644 index aa870fe8..17abd99c --- a/_posts/2011-03-25-18-history-command-enhance-efficiency-in-linux.md +++ b/_posts/2011-03-25-18-history-command-enhance-efficiency-in-linux.md @@ -1,9 +1,10 @@ --- +layout: post title: Linux中使用history命令提升效率 pid: 18 tags: [Linux] --- -![](/uploads/2011/03/20110325-18-01.png) +![](/uploads/2011/03/25_01.png) 无论你是linux命令行新手还是老鸟,这些技巧都可以让您得到提升,节省时间,提升效率,增加兴趣.... @@ -15,19 +16,19 @@ tags: [Linux] 然后你就会看到类似下图 -![](/uploads/2011/03/20110325-18-02.png) +![](/uploads/2011/03/25_02.png) 要想执行历史中的某一条命令,只要用 !加上命令前的行号就可以了. !510 -![](/uploads/2011/03/20110325-18-03.png) +![](/uploads/2011/03/25_03.png) 你也可以看一条命令是什么时候被执行的,我们来看看3条命令之前的命令是什么. !-3 -![](/uploads/2011/03/20110325-18-04.png) +![](/uploads/2011/03/25_04.png) **快速替换** @@ -35,13 +36,13 @@ tags: [Linux] sudo !! -![](/uploads/2011/03/20110325-18-05.png) +![](/uploads/2011/03/25_05.png) 假设你想要运行一个命令,而此命令的参数,在上一个命令中已经有了,但是再打出来就太麻烦了,好了,直接用!$代替即可. cd !$ -![](/uploads/2011/03/20110325-18-06.png) +![](/uploads/2011/03/25_06.png) 如果你已经运行了一个带有两个参数的命令,但是接下来想要使用第一个参数的话,就可以使用!^命令,这个命令在你备份一个文件,然后想再编辑原文件的时候非常有用. @@ -49,17 +50,17 @@ tags: [Linux] (注意看图中的上一条命令) -![](/uploads/2011/03/20110325-18-07.png) +![](/uploads/2011/03/25_07.png) 接下来让我们从你历史中搜索某条特定的命令.按下Ctrl+R,当你输入的时候,就会自动搜索.你可以使用方向键找到你想要的命令. -![](/uploads/2011/03/20110325-18-08.png) +![](/uploads/2011/03/25_08.png) 如果你知道你运行过的命令的特定的关键字,可以跳过搜索步骤,直接找到. !keyword(keyword换成你的关键字即可) -![](/uploads/2011/03/20110325-18-09.png) +![](/uploads/2011/03/25_09.png) **清空历史** @@ -79,7 +80,7 @@ tags: [Linux] 在下面的第四行中,cd前面是空格,所以历史中忽略了 -![](/uploads/2011/03/20110325-18-10.png) +![](/uploads/2011/03/25_10.png) **去掉重复** @@ -87,7 +88,7 @@ tags: [Linux] HISTCONTROL=ignoredups -![](/uploads/2011/03/20110325-18-10.png) +![](/uploads/2011/03/25_10.png) 如果你既想忽略空格,也想忽略重复的话,使用如下命令 diff --git a/_posts/2011-03-26-9-wordpresss-feed-output-copyright-information.md b/_posts/2011-03-26-9-wordpresss-feed-output-copyright-information.md index 5e8d84b7..2ea9496e 100644 --- a/_posts/2011-03-26-9-wordpresss-feed-output-copyright-information.md +++ b/_posts/2011-03-26-9-wordpresss-feed-output-copyright-information.md @@ -1,4 +1,5 @@ --- +layout: post title: wordpress的feed输出版权信息 pid: 9 tags: [WordPress] diff --git a/_posts/2011-03-27-14-to-be-a-lazy-programmer.md b/_posts/2011-03-27-14-to-be-a-lazy-programmer.md index d91f7954..442c7541 100644 --- a/_posts/2011-03-27-14-to-be-a-lazy-programmer.md +++ b/_posts/2011-03-27-14-to-be-a-lazy-programmer.md @@ -1,4 +1,5 @@ --- +layout: post title: 做一个懒惰的程序员 pid: 14 tags: [Programmer] diff --git a/_posts/2011-03-27-15-debian-or-ubuntu.md b/_posts/2011-03-27-15-debian-or-ubuntu.md index b67b1818..a2450ff7 100644 --- a/_posts/2011-03-27-15-debian-or-ubuntu.md +++ b/_posts/2011-03-27-15-debian-or-ubuntu.md @@ -1,4 +1,5 @@ --- +layout: post title: Debian or Ubuntu? pid: 15 tags: [Linux] diff --git a/_posts/2011-03-28-8-non-plug-in-to-achieve-pagenavi-page.md b/_posts/2011-03-28-8-non-plug-in-to-achieve-pagenavi-page.md index 33cbf65c..94b5fd79 100644 --- a/_posts/2011-03-28-8-non-plug-in-to-achieve-pagenavi-page.md +++ b/_posts/2011-03-28-8-non-plug-in-to-achieve-pagenavi-page.md @@ -1,4 +1,5 @@ --- +layout: post title: 非插件实现Pagenavi 翻页 pid: 8 tags: [WordPress] diff --git a/_posts/2011-03-30-6-how-a-reply-notification-email.md b/_posts/2011-03-30-6-how-a-reply-notification-email.md old mode 100755 new mode 100644 index 1cf9e4f9..2b553d94 --- a/_posts/2011-03-30-6-how-a-reply-notification-email.md +++ b/_posts/2011-03-30-6-how-a-reply-notification-email.md @@ -1,4 +1,5 @@ --- +layout: post title: 转-如何让wordpress评论者收到回复通知邮件? pid: 6 tags: [WordPress] @@ -21,7 +22,7 @@ tags: [WordPress] 修改版后台设置如下图: -![](/uploads/2011/03/20110330-6-01.png) +![](/uploads/2011/03/30_01.png) 2、根据自己的需要**修改发件人姓名及邮箱地址** diff --git a/_posts/2011-03-31-10-eight-queens-problem.md b/_posts/2011-03-31-10-eight-queens-problem.md index d527c4df..18d10034 100644 --- a/_posts/2011-03-31-10-eight-queens-problem.md +++ b/_posts/2011-03-31-10-eight-queens-problem.md @@ -1,4 +1,5 @@ --- +layout: post title: 初识 八皇后问题 pid: 10 tags: [数据结构] diff --git a/_posts/2011-03-31-23-new-target-for-commenter-links.md b/_posts/2011-03-31-23-new-target-for-commenter-links.md index c0588ba2..7c1c1007 100644 --- a/_posts/2011-03-31-23-new-target-for-commenter-links.md +++ b/_posts/2011-03-31-23-new-target-for-commenter-links.md @@ -1,4 +1,5 @@ --- +layout: post title: 让评论者链接在新窗口打开 pid: 23 tags: [WordPress] diff --git a/_posts/2011-04-01-24-increase-the-expression-of-wp.md b/_posts/2011-04-01-24-increase-the-expression-of-wp.md old mode 100755 new mode 100644 index 264d1d74..ac9e5a04 --- a/_posts/2011-04-01-24-increase-the-expression-of-wp.md +++ b/_posts/2011-04-01-24-increase-the-expression-of-wp.md @@ -1,4 +1,5 @@ --- +layout: post title: 给WP增加多套表情 pid: 24 tags: [WordPress, 原创] @@ -13,23 +14,23 @@ tags: [WordPress, 原创] **馒头** -![](/uploads/2011/04/20110401-24-01.jpg) +![](/uploads/2011/04/01_01.jpg) **海绵宝宝** -![](/uploads/2011/04/20110401-24-02.jpg) +![](/uploads/2011/04/01_02.jpg) **阿狸** -![](/uploads/2011/04/20110401-24-03.jpg) +![](/uploads/2011/04/01_03.jpg) **囧囧熊** -![](/uploads/2011/04/20110401-24-04.jpg) +![](/uploads/2011/04/01_04.jpg) **兔斯基** -![](/uploads/2011/04/20110401-24-05.jpg) +![](/uploads/2011/04/01_05.jpg) 原来的做法叫做替换表情,是把下载好的图片修改成原来服务器上文件夹里面的图片名字.然后上传覆盖就可以了. 但是我想在保留原来图片的情况下,增加多套表情.所以还是要在文件上下功夫.以下的方法参考了[自由人](http://www.zenoven.com/life/other/200911737.html)的博客.在这里表示感谢. diff --git a/_posts/2011-04-02-26-toss-my-wordpress-copyright.md b/_posts/2011-04-02-26-toss-my-wordpress-copyright.md index 7ab6963f..b32a30e1 100644 --- a/_posts/2011-04-02-26-toss-my-wordpress-copyright.md +++ b/_posts/2011-04-02-26-toss-my-wordpress-copyright.md @@ -1,4 +1,5 @@ --- +layout: post title: 我的wordpress文章版权折腾记 pid: 26 tags: [WordPress, 原创] diff --git a/_posts/2011-04-02-27-wp-add-background-expression.md b/_posts/2011-04-02-27-wp-add-background-expression.md index 3d9c79d0..5bdbdef7 100644 --- a/_posts/2011-04-02-27-wp-add-background-expression.md +++ b/_posts/2011-04-02-27-wp-add-background-expression.md @@ -1,4 +1,5 @@ --- +layout: post title: wp后台回复添加表情 pid: 27 tags: [WordPress, 原创] diff --git a/_posts/2011-04-03-30-philna2-add-category-to-navigation-menu.md b/_posts/2011-04-03-30-philna2-add-category-to-navigation-menu.md old mode 100755 new mode 100644 index 18382315..99da4f5a --- a/_posts/2011-04-03-30-philna2-add-category-to-navigation-menu.md +++ b/_posts/2011-04-03-30-philna2-add-category-to-navigation-menu.md @@ -1,4 +1,5 @@ --- +layout: post title: 把PhilNa2分类添加到导航菜单 pid: 30 tags: [PhilNa2, WordPress, 原创] @@ -9,7 +10,7 @@ tags: [PhilNa2, WordPress, 原创] 看了IM路人的一篇文章,[把PhilNa2分类添加到导航菜单](http://imluren.com/2010/07/add-to-philna2-category-navigation-menu.html) 按照里面的方法做完后.效果并不是我想要的,具体效果会出现如下的情况. -![](/uploads/2011/04/20110403-30-01.png) +![](/uploads/2011/04/03_01.png) 导航栏上有各个页面,再加一个"分类目录". 所有的分类 都在 分类目录 里面.鼠标放在分类目录上,就会下拉菜单,然后显示各个分类. 不是各个分类像页面一样列在导航栏上. diff --git a/_posts/2011-04-03-32-details-wp_list_categories.md b/_posts/2011-04-03-32-details-wp_list_categories.md index 2fe72d68..1cb8ee92 100644 --- a/_posts/2011-04-03-32-details-wp_list_categories.md +++ b/_posts/2011-04-03-32-details-wp_list_categories.md @@ -1,4 +1,5 @@ --- +layout: post title: 转-wp_list_categories详细介绍 pid: 32 tags: [WordPress] diff --git a/_posts/2011-04-04-33-three-column-friends-sidebar.md b/_posts/2011-04-04-33-three-column-friends-sidebar.md index 0aae46ad..bd6c64bb 100644 --- a/_posts/2011-04-04-33-three-column-friends-sidebar.md +++ b/_posts/2011-04-04-33-three-column-friends-sidebar.md @@ -1,4 +1,5 @@ --- +layout: post title: 侧栏友链3栏显示 pid: 33 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-04-04-34-add-expression-to-editor-background.md b/_posts/2011-04-04-34-add-expression-to-editor-background.md old mode 100755 new mode 100644 index 94724b5b..bc2fc9c4 --- a/_posts/2011-04-04-34-add-expression-to-editor-background.md +++ b/_posts/2011-04-04-34-add-expression-to-editor-background.md @@ -1,4 +1,5 @@ --- +layout: post title: wp后台编辑器添加表情 pid: 34 tags: [PhilNa2, WordPress] @@ -8,7 +9,7 @@ tags: [PhilNa2, WordPress] 原来是在前台的评论框里面 点击想要的表情看看是数目转义字符,然后复制到编辑器里面.可是又写了几次,感觉这样好麻烦啊.给编辑器添加表情该多好啊.所以到网上去找找.果真有人有这样的需求,所以我也顺便弄下来啦 :lol: 效果图 -![](/uploads/2011/04/20110404-34-01.png) +![](/uploads/2011/04/04_01.png) 参考地址是[荒野无灯weblog](http://www.ihacklog.com/wordpress/wpskills/add-wp-smiley-for-html-and-rich-text-editor.html) diff --git a/_posts/2011-04-05-35-modify-comment-editor-note.md b/_posts/2011-04-05-35-modify-comment-editor-note.md index 03822159..9cc2a509 100644 --- a/_posts/2011-04-05-35-modify-comment-editor-note.md +++ b/_posts/2011-04-05-35-modify-comment-editor-note.md @@ -1,4 +1,5 @@ --- +layout: post title: 评论框编辑器修改小记 pid: 35 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-04-05-36-non-plugin-for-archive-page.md b/_posts/2011-04-05-36-non-plugin-for-archive-page.md index 518fefe1..423e2ed8 100644 --- a/_posts/2011-04-05-36-non-plugin-for-archive-page.md +++ b/_posts/2011-04-05-36-non-plugin-for-archive-page.md @@ -1,4 +1,5 @@ --- +layout: post title: 归档页面非插件化 pid: 36 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-04-06-37-use-webshot-for-blog.md b/_posts/2011-04-06-37-use-webshot-for-blog.md index a699876b..f3618529 100644 --- a/_posts/2011-04-06-37-use-webshot-for-blog.md +++ b/_posts/2011-04-06-37-use-webshot-for-blog.md @@ -1,4 +1,5 @@ --- +layout: post title: 使用网页缩略图种种.. pid: 37 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-04-07-38-new-chrome-set-the-font.md b/_posts/2011-04-07-38-new-chrome-set-the-font.md index 5431376a..3b97de92 100644 --- a/_posts/2011-04-07-38-new-chrome-set-the-font.md +++ b/_posts/2011-04-07-38-new-chrome-set-the-font.md @@ -1,4 +1,5 @@ --- +layout: post title: 解决Linux中chrome设置字体无效 pid: 38 tags: [Chrome, Linux, Ubuntu] diff --git a/_posts/2011-04-08-39-pure-css-on-mouse-larger-picture.md b/_posts/2011-04-08-39-pure-css-on-mouse-larger-picture.md index 4811d5d5..95fde9f6 100644 --- a/_posts/2011-04-08-39-pure-css-on-mouse-larger-picture.md +++ b/_posts/2011-04-08-39-pure-css-on-mouse-larger-picture.md @@ -1,4 +1,5 @@ --- +layout: post title: 纯css鼠标放上去图片变大 pid: 39 tags: [WordPress, CSS] diff --git a/_posts/2011-04-08-40-record-for-modify-philna2-theme.md b/_posts/2011-04-08-40-record-for-modify-philna2-theme.md index f6c16b7a..37c6a59a 100644 --- a/_posts/2011-04-08-40-record-for-modify-philna2-theme.md +++ b/_posts/2011-04-08-40-record-for-modify-philna2-theme.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2主题修改优化细节记录 pid: 40 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-04-08-41-set-mod-rewrite-for-wp-ubuntu.md b/_posts/2011-04-08-41-set-mod-rewrite-for-wp-ubuntu.md index 29b9d9f7..845f33db 100644 --- a/_posts/2011-04-08-41-set-mod-rewrite-for-wp-ubuntu.md +++ b/_posts/2011-04-08-41-set-mod-rewrite-for-wp-ubuntu.md @@ -1,4 +1,5 @@ --- +layout: post title: 本地wordpress设置固定链接无效的解决办法 pid: 41 tags: [Linux, Ubuntu] diff --git a/_posts/2011-04-09-42-final-version-feed-output-copyright-information.md b/_posts/2011-04-09-42-final-version-feed-output-copyright-information.md index f115b18d..f17cd0f0 100644 --- a/_posts/2011-04-09-42-final-version-feed-output-copyright-information.md +++ b/_posts/2011-04-09-42-final-version-feed-output-copyright-information.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2主题feed输出版权最终版 pid: 42 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-04-09-43-modify-philna2-page-templates.md b/_posts/2011-04-09-43-modify-philna2-page-templates.md index d7fe4d9f..2ef0fa62 100644 --- a/_posts/2011-04-09-43-modify-philna2-page-templates.md +++ b/_posts/2011-04-09-43-modify-philna2-page-templates.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2主题页面模板修改 pid: 43 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-04-09-44-girl-should-have-boyfriend-with-i-blog.md b/_posts/2011-04-09-44-girl-should-have-boyfriend-with-i-blog.md index 31f6c52b..43f9d5b2 100644 --- a/_posts/2011-04-09-44-girl-should-have-boyfriend-with-i-blog.md +++ b/_posts/2011-04-09-44-girl-should-have-boyfriend-with-i-blog.md @@ -1,4 +1,5 @@ --- +layout: post title: 转-女生应该找个有独立博客的男朋友 pid: 44 tags: [转载] diff --git a/_posts/2011-04-11-46-entangled-in-the-wp-theme.md b/_posts/2011-04-11-46-entangled-in-the-wp-theme.md index 971a9e04..a814d8ad 100644 --- a/_posts/2011-04-11-46-entangled-in-the-wp-theme.md +++ b/_posts/2011-04-11-46-entangled-in-the-wp-theme.md @@ -1,4 +1,5 @@ --- +layout: post title: 纠结于WP主题 pid: 46 tags: [PhilNa2] diff --git a/_posts/2011-04-13-47-links-page-repair.md b/_posts/2011-04-13-47-links-page-repair.md index a230f58c..9f785670 100644 --- a/_posts/2011-04-13-47-links-page-repair.md +++ b/_posts/2011-04-13-47-links-page-repair.md @@ -1,4 +1,5 @@ --- +layout: post title: 友情链接页面修复 pid: 47 tags: [WordPress, 原创] diff --git a/_posts/2011-04-13-48-javascript-function-bookmark.md b/_posts/2011-04-13-48-javascript-function-bookmark.md index b126a91c..5fa01e1f 100644 --- a/_posts/2011-04-13-48-javascript-function-bookmark.md +++ b/_posts/2011-04-13-48-javascript-function-bookmark.md @@ -1,4 +1,5 @@ --- +layout: post title: 咱也来段JavaScript功能书签(4.16更新) pid: 48 tags: [Blog, JavaScript] diff --git a/_posts/2011-04-16-jquery-scroll-up-and-down.md b/_posts/2011-04-16-jquery-scroll-up-and-down.md index bb882fe2..15efa32c 100644 --- a/_posts/2011-04-16-jquery-scroll-up-and-down.md +++ b/_posts/2011-04-16-jquery-scroll-up-and-down.md @@ -1,4 +1,5 @@ --- +layout: post title: jQuery上下浮动滚动[4-22更新] pid: 83 tags: [PhilNa2, WordPress] diff --git a/_posts/2011-04-17-a-data-structure-exercise.md b/_posts/2011-04-17-a-data-structure-exercise.md index 80f98c09..e5e8e948 100644 --- a/_posts/2011-04-17-a-data-structure-exercise.md +++ b/_posts/2011-04-17-a-data-structure-exercise.md @@ -1,4 +1,5 @@ --- +layout: post title: 数据结构习题一则 pid: 84 tags: [C, 原创, 数据结构] diff --git a/_posts/2011-04-18-set-twitalker-bot.md b/_posts/2011-04-18-set-twitalker-bot.md index 6cd9bd50..c5c1c6f5 100644 --- a/_posts/2011-04-18-set-twitalker-bot.md +++ b/_posts/2011-04-18-set-twitalker-bot.md @@ -1,4 +1,5 @@ --- +layout: post title: TwiTalker bot搭建成功 pid: 85 tags: [Twitter] diff --git a/_posts/2011-04-19-philna2-add-nav-menu.md b/_posts/2011-04-19-philna2-add-nav-menu.md index f55527e8..6e24b8d9 100644 --- a/_posts/2011-04-19-philna2-add-nav-menu.md +++ b/_posts/2011-04-19-philna2-add-nav-menu.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2增加自定义导航菜单 pid: 86 tags: [PhilNa2, WordPress] diff --git a/_posts/2011-04-21-take-in-aim-by-liuliangbao.md b/_posts/2011-04-21-take-in-aim-by-liuliangbao.md old mode 100755 new mode 100644 index def6a0c0..30e2c6e1 --- a/_posts/2011-04-21-take-in-aim-by-liuliangbao.md +++ b/_posts/2011-04-21-take-in-aim-by-liuliangbao.md @@ -1,4 +1,5 @@ --- +layout: post title: 昨天无故被流量宝瞄上 pid: 100 tags: [点滴] @@ -7,11 +8,11 @@ tags: [点滴] 下午的时候无意间想看看百度统计是个什么情况,唉哟!原来网站人这么多了啊.各个省份的都有了啊. -![](/uploads/2011/04/20110421-100-01.png) +![](/uploads/2011/04/21_01.png) 可是再仔细一看,我就郁闷了.来源网站上有一多半是来自搜狗的.原来从来没见过搜狗来的流量.昨天怎么这么给力了.一看完整报告.OMG!流量宝以绝对优势占据第一位.可是我的博客上从来没有什么流量宝的关键词啊. -![](/uploads/2011/04/20110421-100-02.png) +![](/uploads/2011/04/21_02.png) 到网上一找,才知道,原来流量宝是用来刷流量的.可是我没申请过流量啊,看来天上掉馅饼的事还真有啊. :jiong: 可是流量宝真的有用吗?再一找,到处都是说它的不好的.虽说使用流量宝短期内流量确实增加了(应该是刷流量的软加起作用了),可是长期下去,弊端却大大显露出来了. diff --git a/_posts/2011-04-22-a-note-about-myblog.md b/_posts/2011-04-22-a-note-about-myblog.md old mode 100755 new mode 100644 index fa7c78c3..541cb2e7 --- a/_posts/2011-04-22-a-note-about-myblog.md +++ b/_posts/2011-04-22-a-note-about-myblog.md @@ -1,4 +1,5 @@ --- +layout: post title: 博客小记一篇 pid: 102 tags: [Blog, 点滴] @@ -20,14 +21,14 @@ tags: [Blog, 点滴] 加载的css文件部分 -![](/uploads/2011/04/20110422-102-01.png) +![](/uploads/2011/04/22_01.png) 加载的js文件部分 -![](/uploads/2011/04/20110422-102-02.png) +![](/uploads/2011/04/22_02.png) 加载的html部分 -![](/uploads/2011/04/20110422-102-03.png) +![](/uploads/2011/04/22_03.png) 看到这些之后是不是有点想法了?新浪微博很占地方啊.而且有时候我还发现新浪微博的连接情况不是很好,有时候根本就刷不出来,其他部分都出来了,只剩下微博部分一篇空白.所以还是要好好想象要不要这个微博啊. diff --git a/_posts/2011-04-22-several-update-for-mod-philna2.md b/_posts/2011-04-22-several-update-for-mod-philna2.md index 802dea56..90399c00 100644 --- a/_posts/2011-04-22-several-update-for-mod-philna2.md +++ b/_posts/2011-04-22-several-update-for-mod-philna2.md @@ -1,4 +1,5 @@ --- +layout: post title: 修改philna2主题之文章几处更新 pid: 103 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-04-22-super-google-reader-extension.md b/_posts/2011-04-22-super-google-reader-extension.md old mode 100755 new mode 100644 index ceff2270..e5328ae5 --- a/_posts/2011-04-22-super-google-reader-extension.md +++ b/_posts/2011-04-22-super-google-reader-extension.md @@ -1,4 +1,5 @@ --- +layout: post title: chrome扩展Super Google Reader一枚 pid: 101 tags: [Chrome, Greader] @@ -13,19 +14,19 @@ tags: [Chrome, Greader] 看到这个扩展之后我就马上使用了一下.效果相当好啊.不需要什么设置就可以用了. 安装后阅读界面的效果如下 -![](/uploads/2011/04/20110422-101-01.png) +![](/uploads/2011/04/22_04.png) -![](/uploads/2011/04/20110422-101-02.png) +![](/uploads/2011/04/22_05.png) 当你遇到一个不是全文输出的条目时,只需要点击**super settings**,然后点击**Readable content**马上就加载出全部文章了. 如果你点击**full entry content**的话,效果就会变成了从Greader里面去看网站原文.所有的格式都在,效果见下面 -![](/uploads/2011/04/20110422-101-03.png) +![](/uploads/2011/04/22_06.png) 在google阅读器的设置界面中还有一个单独的super选单.可以进行更详细的设置,你甚至可以让他预先读取全文和图片,或者是为不同的feed设置不同的参数. -![](/uploads/2011/04/20110422-101-04.png) +![](/uploads/2011/04/22_07.png) 怎么样,效果相当强大啊.以后就不怕摘要输出了! diff --git a/_posts/2011-04-26-server-recovery.md b/_posts/2011-04-26-server-recovery.md index f1819620..91258c2e 100644 --- a/_posts/2011-04-26-server-recovery.md +++ b/_posts/2011-04-26-server-recovery.md @@ -1,4 +1,5 @@ --- +layout: post title: 服务器恢复正常 pid: 104 tags: [点滴] diff --git a/_posts/2011-04-28-philna2-sidebar-tab-switch.md b/_posts/2011-04-28-philna2-sidebar-tab-switch.md old mode 100755 new mode 100644 index 754a3b33..fef5faa0 --- a/_posts/2011-04-28-philna2-sidebar-tab-switch.md +++ b/_posts/2011-04-28-philna2-sidebar-tab-switch.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2侧栏tab切换 pid: 105 tags: [PhilNa2, WordPress] @@ -9,7 +10,7 @@ tags: [PhilNa2, WordPress] 该说正题了.就是我现在使用的侧栏的tab切换(效果见下图),大家试试感觉怎么样?我感觉还是挺好的.最起码节省空间,当侧栏的东西有点多的时候最起码不会把侧栏拉的太长,影响美观. -![](/uploads/2011/04/20110428-105-01.png) +![](/uploads/2011/04/28_01.png) 起初在[自由的风](http://loosky.net) 博客上看到了 移植Hotnews Pro主题上的那个tab切换.只不过是上下切换的,当时我就有点心动了,只是不好意思向博主开口请教该怎么设置.前两天服务器出问题了,所以我只能到那些牛人的博客上去看看了,发现还是多多看看他们的博客才是王道啊.哈哈.这个tab切换就是从人家那里看到的源码,然后我又按照主题修改了一下,就OK啦. diff --git a/_posts/2011-04-29-beautify-reader-wall-blood-slip.md b/_posts/2011-04-29-beautify-reader-wall-blood-slip.md index 75652d9c..c6131163 100644 --- a/_posts/2011-04-29-beautify-reader-wall-blood-slip.md +++ b/_posts/2011-04-29-beautify-reader-wall-blood-slip.md @@ -1,4 +1,5 @@ --- +layout: post title: 读者墙血条显示 pid: 106 tags: [WordPress, 转载] diff --git a/_posts/2011-04-30-a-diary-note.md b/_posts/2011-04-30-a-diary-note.md index 528bee64..fa1faf0d 100644 --- a/_posts/2011-04-30-a-diary-note.md +++ b/_posts/2011-04-30-a-diary-note.md @@ -1,4 +1,5 @@ --- +layout: post title: 流水帐一篇[4.30] pid: 107 tags: [点滴] diff --git a/_posts/2011-04-30-change-fontsize-new-code.md b/_posts/2011-04-30-change-fontsize-new-code.md index 31140b5b..f5b797c6 100644 --- a/_posts/2011-04-30-change-fontsize-new-code.md +++ b/_posts/2011-04-30-change-fontsize-new-code.md @@ -1,4 +1,5 @@ --- +layout: post title: 文章页实时更改文字大小新代码 pid: 108 tags: [PhilNa2, WordPress] diff --git a/_posts/2011-05-01-code-enable-social-share-tool.md b/_posts/2011-05-01-code-enable-social-share-tool.md index e8c809b1..fb3b331f 100644 --- a/_posts/2011-05-01-code-enable-social-share-tool.md +++ b/_posts/2011-05-01-code-enable-social-share-tool.md @@ -1,4 +1,5 @@ --- +layout: post title: 转-代码实现社会化分享工具 pid: 110 tags: [Blog, 转载] diff --git a/_posts/2011-05-01-wp-login-failed-notify.md b/_posts/2011-05-01-wp-login-failed-notify.md index 438953cc..78c65a7b 100644 --- a/_posts/2011-05-01-wp-login-failed-notify.md +++ b/_posts/2011-05-01-wp-login-failed-notify.md @@ -1,4 +1,5 @@ --- +layout: post title: 转-防止攻击 - WordPress登录邮件提醒 pid: 109 tags: [转载] diff --git a/_posts/2011-05-03-debian6-install-note.md b/_posts/2011-05-03-debian6-install-note.md index c18b3129..42b70ad7 100644 --- a/_posts/2011-05-03-debian6-install-note.md +++ b/_posts/2011-05-03-debian6-install-note.md @@ -1,4 +1,5 @@ --- +layout: post title: Debian6安装小记 pid: 111 tags: [Debian, Linux, 原创] diff --git a/_posts/2011-05-04-solve-eight-queens-problem.md b/_posts/2011-05-04-solve-eight-queens-problem.md index 69781927..e427c000 100644 --- a/_posts/2011-05-04-solve-eight-queens-problem.md +++ b/_posts/2011-05-04-solve-eight-queens-problem.md @@ -1,4 +1,5 @@ --- +layout: post title: 解决-数据结构八皇后问题 pid: 113 tags: [C, 原创, 数据结构] diff --git a/_posts/2011-05-06-home-article-toggle-problems.md b/_posts/2011-05-06-home-article-toggle-problems.md index 3dfbcdc1..460cffdd 100644 --- a/_posts/2011-05-06-home-article-toggle-problems.md +++ b/_posts/2011-05-06-home-article-toggle-problems.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2首页文章收缩及问题修复 pid: 117 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-05-06-reinstall-system-again.md b/_posts/2011-05-06-reinstall-system-again.md index 192c5108..7ad16990 100644 --- a/_posts/2011-05-06-reinstall-system-again.md +++ b/_posts/2011-05-06-reinstall-system-again.md @@ -1,4 +1,5 @@ --- +layout: post title: 又一次重装系统 pid: 116 tags: [Debian, Linux, 点滴] diff --git a/_posts/2011-05-07-after-modify-database-prefix.md b/_posts/2011-05-07-after-modify-database-prefix.md old mode 100755 new mode 100644 index ffdcf35d..d4896940 --- a/_posts/2011-05-07-after-modify-database-prefix.md +++ b/_posts/2011-05-07-after-modify-database-prefix.md @@ -1,4 +1,5 @@ --- +layout: post title: 修改数据库前缀之后 pid: 119 tags: [Blog, WordPress] @@ -11,7 +12,7 @@ tags: [Blog, WordPress] 访问网站没有任何异常.我以为这样就可以了.没想到,只是这样做完还不行. 当我访问后台的时候,悲剧的提示我"您没有足够的权限访问这个页面".如下图. -![](/uploads/2011/05/20110507-119-01.png) +![](/uploads/2011/05/07_01.png) 到网上一搜索,修改wp的数据库前缀,这种情况很常见.所以顺便摘抄一下.如果有童鞋在修改前缀的时候,遇到了这样的情况,不要害怕,很容易就解决啦. 由于那些对于数据库的SQL语句 我不知道怎么用,所以找了一个手动修改的.就几个地方,也不是很麻烦. @@ -19,10 +20,10 @@ tags: [Blog, WordPress] *首先*打开?\_options表,修改optionname字段值为?\_user_roles,修改为与你的前缀对应. -![](/uploads/2011/05/20110507-119-02.jpg) +![](/uploads/2011/05/07_02.jpg) *然后*打开?\_usermeta表,将meta-key字段中有旧前缀的值,更为新的前缀就OK。 -![](/uploads/2011/05/20110507-119-03.jpg) +![](/uploads/2011/05/07_03.jpg) 这样完成后就OK啦.网上那些SQL语句,我看了很害怕啊.就怕我操作失误会把wp搞挂了..... diff --git a/_posts/2011-05-07-code-for-random-posts.md b/_posts/2011-05-07-code-for-random-posts.md index 9917f23f..edb03cdc 100644 --- a/_posts/2011-05-07-code-for-random-posts.md +++ b/_posts/2011-05-07-code-for-random-posts.md @@ -1,4 +1,5 @@ --- +layout: post title: 代码访问随机日志 pid: 118 tags: [WordPress, 转载] diff --git a/_posts/2011-05-08-anti-spam-works.md b/_posts/2011-05-08-anti-spam-works.md old mode 100755 new mode 100644 index b0dad068..553adc7e --- a/_posts/2011-05-08-anti-spam-works.md +++ b/_posts/2011-05-08-anti-spam-works.md @@ -1,4 +1,5 @@ --- +layout: post title: Anti Spam小墙貌似已经可以了 pid: 121 tags: [spam, 点滴] @@ -15,7 +16,7 @@ tags: [spam, 点滴] o(∩\_∩)o 哈哈,下午果真来了一个,我是中午的时候装上的小墙,下午3点多的时候就来了个试验品,竟然以身犯险.小墙直接就拦下了,效果刚刚的.o(∩_∩)o :lol: 如下图. -![](/uploads/2011/05/20110508-121-01.png) +![](/uploads/2011/05/08_01.png) 由于刚开始用,所以还在寻找可能出现的错误,所以修改的过程就先不说啦.到时候看看完全没有错误的时候再分享一下. 想说一下willin kan大师真是厉害,那些个ajax提交评论,anti spam小墙,已经流传非常广泛啦,willin kan大师真是令人佩服. diff --git a/_posts/2011-05-08-code-some-chinese-please.md b/_posts/2011-05-08-code-some-chinese-please.md old mode 100755 new mode 100644 index 66bc3db5..b036308b --- a/_posts/2011-05-08-code-some-chinese-please.md +++ b/_posts/2011-05-08-code-some-chinese-please.md @@ -1,4 +1,5 @@ --- +layout: post title: "[PhilNa2]some chinese please" pid: 120 tags: [PhilNa2, WordPress, 原创] @@ -6,7 +7,7 @@ tags: [PhilNa2, WordPress, 原创] 今天又看到了垃圾评论.自从我使用wp之后,虽然来的垃圾评论不多,但是也挺烦人的.都是些纯英文评论,关于loan的,关于credit的,干嘛的都有. 但是邮箱 网址神马的都是无效的.所以打算把这些英文评论挡在外面. -![](/uploads/2011/05/20110508-120-02.png) +![](/uploads/2011/05/08_02.png) 网上人用的最多的是willin kan大师的 anti spam小墙,无奈此主题不能使用.况且我的垃圾评论不像其他人那样一来几百条的规模. 我只想把 那些纯英文评论挡住就行了. @@ -18,7 +19,7 @@ tags: [PhilNa2, WordPress, 原创] 原因:像我现在的主题.如果评论框里面不输入任何东西提交的话,就会弹出对话框提醒.但是用上那些代码后,就只是在评论下方列上一个标记. 如下图,感觉不太好看. -![](/uploads/2011/05/20110508-120-03.png) +![](/uploads/2011/05/08_03.png) 所以看看怎么改一下.既然不输入东西的时候会提示.那么就按照那个提示代码的形式改一下. @@ -58,7 +59,7 @@ tags: [PhilNa2, WordPress, 原创] *效果如下图* -![](/uploads/2011/05/20110508-120-01.png) +![](/uploads/2011/05/08_04.png) 那个提示语你可以自己看着修改. diff --git a/_posts/2011-05-09-change-smilies-dafult-dir.md b/_posts/2011-05-09-change-smilies-dafult-dir.md index b9a3811f..255102a6 100644 --- a/_posts/2011-05-09-change-smilies-dafult-dir.md +++ b/_posts/2011-05-09-change-smilies-dafult-dir.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2-更改默认表情图片位置 pid: 123 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-05-10-linux-note-summary.md b/_posts/2011-05-10-linux-note-summary.md index ce0d997f..b7d577b2 100644 --- a/_posts/2011-05-10-linux-note-summary.md +++ b/_posts/2011-05-10-linux-note-summary.md @@ -1,4 +1,5 @@ --- +layout: post title: Linux记录总结 pid: 125 tags: [Linux, Ubuntu] diff --git a/_posts/2011-05-10-perfect-autosave-disable-version-control.md b/_posts/2011-05-10-perfect-autosave-disable-version-control.md old mode 100755 new mode 100644 index 2feaa462..6a0db1f0 --- a/_posts/2011-05-10-perfect-autosave-disable-version-control.md +++ b/_posts/2011-05-10-perfect-autosave-disable-version-control.md @@ -1,4 +1,5 @@ --- +layout: post title: WP3.1.2-完美自动保存,禁用版本控制 pid: 122 tags: [Blog, WordPress, 转载] @@ -132,4 +133,4 @@ tags: [Blog, WordPress, 转载] define('AUTOSAVE_INTERVAL', false); 的话,请注释掉.因为此文章中的方法是保留自动保存的功能,如果config中继续有这句话,在新建文章的时候会引起强烈冲突,导致服务器负荷急剧上升.如果不信的话,可以在本地服务器测试一下.切记切记!!!!!否则出现问题.不负责.... -![](/uploads/2011/05/20110510-122-01.png) +![](/uploads/2011/05/10_01.png) diff --git a/_posts/2011-05-10-wp-head-redundant-code.md b/_posts/2011-05-10-wp-head-redundant-code.md index 03fd7f3e..fc03bee1 100644 --- a/_posts/2011-05-10-wp-head-redundant-code.md +++ b/_posts/2011-05-10-wp-head-redundant-code.md @@ -1,4 +1,5 @@ --- +layout: post title: 转-去除wp头部代码中不需要的 pid: 124 tags: [WordPress, 转载] diff --git a/_posts/2011-05-11-backeditor-add-audio-button.md b/_posts/2011-05-11-backeditor-add-audio-button.md index 35313961..ce05f6be 100644 --- a/_posts/2011-05-11-backeditor-add-audio-button.md +++ b/_posts/2011-05-11-backeditor-add-audio-button.md @@ -1,4 +1,5 @@ --- +layout: post title: 后台快速添加mp3按钮 pid: 128 tags: [WordPress, 原创, 转载] diff --git a/_posts/2011-05-11-shortcode-enable-mp3player.md b/_posts/2011-05-11-shortcode-enable-mp3player.md index f18da380..ac7a8d1f 100644 --- a/_posts/2011-05-11-shortcode-enable-mp3player.md +++ b/_posts/2011-05-11-shortcode-enable-mp3player.md @@ -1,4 +1,5 @@ --- +layout: post title: 短代码 mp3player pid: 127 tags: [WordPress, 原创] diff --git a/_posts/2011-05-12-remove-sidebar-admin-respond.md b/_posts/2011-05-12-remove-sidebar-admin-respond.md old mode 100755 new mode 100644 index ca1016ae..04b8552f --- a/_posts/2011-05-12-remove-sidebar-admin-respond.md +++ b/_posts/2011-05-12-remove-sidebar-admin-respond.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2-侧栏去掉博主回复 pid: 129 tags: [PhilNa2, WordPress, 原创] @@ -9,7 +10,7 @@ tags: [PhilNa2, WordPress, 原创] 去掉博主回复这个也是无意间鼓捣的. 效果图如下所示 -![](/uploads/2011/05/20110512-129-01.png) +![](/uploads/2011/05/12_01.png) 在本地的wordpress乱翻那些php文件,就翻到了app/recentcomments.php文件.然后打开看了看.网上好多人侧栏去掉博主评论都是用的那种直接从数据库中读取评论时不读取mail等于博主邮箱的评论.但是philna2主题不是用的直接从数据库中读取,而是使用了wp官方的get_comments()函数. diff --git a/_posts/2011-05-13-feed-add-comment-num.md b/_posts/2011-05-13-feed-add-comment-num.md old mode 100755 new mode 100644 index 5d99efc5..555e6af5 --- a/_posts/2011-05-13-feed-add-comment-num.md +++ b/_posts/2011-05-13-feed-add-comment-num.md @@ -1,4 +1,5 @@ --- +layout: post title: 给feed输出 添加评论条数 pid: 131 tags: [PhilNa2, WordPress] @@ -11,7 +12,7 @@ tags: [PhilNa2, WordPress] 今天又到主题作者yinheli的博客上又转了转,看到了好多的技术文,可惜咱神马都不懂,只能看看热闹.可是我看到了好玩的东西.在rss中 输出评论条数.增强和读者的交互性.就像这样. --- -![](/uploads/2011/05/20110513-131-01.png) +![](/uploads/2011/05/13_02.png) 当时在winysky的文章[WordPress订阅源里显示评论数](http://winysky.com/show-feeds-in-wordpress-comments)就看到winysky说代码参考自 philna2主题.这里说的代码应该就是我看到的这个.但是不知道为什么,在我用的主题里面没有,只在yinheli的博文中看到了.于是我就弄过来放到了rss输出里面.恰好feedburner抓取rss,就看到了上图的结果. diff --git a/_posts/2011-05-13-recovery-admin-respond.md b/_posts/2011-05-13-recovery-admin-respond.md old mode 100755 new mode 100644 index f2f466de..1b4aba94 --- a/_posts/2011-05-13-recovery-admin-respond.md +++ b/_posts/2011-05-13-recovery-admin-respond.md @@ -1,4 +1,5 @@ --- +layout: post title: 还是决定恢复显示博主回复~~ pid: 130 tags: [点滴] @@ -7,7 +8,7 @@ tags: [点滴] 使用了一天.我最终还是决定 显示博主回复.而且恢复到主题的默认样式.不再搞两行显示了. 原因是嘛呢,嘿嘿,看图就知道了. -![](/uploads/2011/05/20110513-130-01.png) +![](/uploads/2011/05/13_01.png) 由于两行显示,占用的空间变大了.因此为了和最新文章,随机文章的长度相适应.我就要减少最新评论的输出条数. 但是这样就造成侧栏的评论容易形成刷屏的效果. diff --git a/_posts/2011-05-14-philna2-can-use-anti-spam.md b/_posts/2011-05-14-philna2-can-use-anti-spam.md index 3ce87fe5..dd489658 100644 --- a/_posts/2011-05-14-philna2-can-use-anti-spam.md +++ b/_posts/2011-05-14-philna2-can-use-anti-spam.md @@ -1,4 +1,5 @@ --- +layout: post title: 让PhilNa2用上Anti Spam小墙 pid: 132 tags: [PhilNa2, spam, WordPress, 原创] diff --git a/_posts/2011-05-14-slide-toggle-for-wp-syntax.md b/_posts/2011-05-14-slide-toggle-for-wp-syntax.md index f61d335d..babccd06 100644 --- a/_posts/2011-05-14-slide-toggle-for-wp-syntax.md +++ b/_posts/2011-05-14-slide-toggle-for-wp-syntax.md @@ -1,4 +1,5 @@ --- +layout: post title: WP-Syntax代码框增加滑动效果 pid: 133 tags: [WordPress, 转载] diff --git a/_posts/2011-05-16-note-for-mod-philna2.md b/_posts/2011-05-16-note-for-mod-philna2.md index a504f32c..3204d826 100644 --- a/_posts/2011-05-16-note-for-mod-philna2.md +++ b/_posts/2011-05-16-note-for-mod-philna2.md @@ -1,4 +1,5 @@ --- +layout: post title: 数数我对PhilNa2的Mod pid: 134 tags: [PhilNa2, 原创, 点滴] diff --git a/_posts/2011-05-16-think-for-ajax-loading-atricles.md b/_posts/2011-05-16-think-for-ajax-loading-atricles.md index 27824de3..37373df8 100644 --- a/_posts/2011-05-16-think-for-ajax-loading-atricles.md +++ b/_posts/2011-05-16-think-for-ajax-loading-atricles.md @@ -1,4 +1,5 @@ --- +layout: post title: 关于Ajax加载首页文章的想法 pid: 135 tags: [Ajax, WordPress, 点滴] diff --git a/_posts/2011-05-17-ajax-loading-articles-success.md b/_posts/2011-05-17-ajax-loading-articles-success.md index c445d416..9e922a66 100644 --- a/_posts/2011-05-17-ajax-loading-articles-success.md +++ b/_posts/2011-05-17-ajax-loading-articles-success.md @@ -1,4 +1,5 @@ --- +layout: post title: 首页Ajax加载文章成功 pid: 136 tags: [Ajax, jQuery, 点滴] diff --git a/_posts/2011-05-17-decode-ineo-theme.md b/_posts/2011-05-17-decode-ineo-theme.md index 3f969c58..a96bc1f6 100644 --- a/_posts/2011-05-17-decode-ineo-theme.md +++ b/_posts/2011-05-17-decode-ineo-theme.md @@ -1,4 +1,5 @@ --- +layout: post title: 解密ineo1.0.2 pid: 137 tags: [Linux, PHP, Themes, 点滴] diff --git a/_posts/2011-05-19-change-the-theme-success.md b/_posts/2011-05-19-change-the-theme-success.md index 88681728..8cab0689 100644 --- a/_posts/2011-05-19-change-the-theme-success.md +++ b/_posts/2011-05-19-change-the-theme-success.md @@ -1,4 +1,5 @@ --- +layout: post title: 换主题成功 pid: 138 tags: [Themes, 点滴] diff --git a/_posts/2011-05-19-want-say-after-changing-theme.md b/_posts/2011-05-19-want-say-after-changing-theme.md index f4898dac..4b8da317 100644 --- a/_posts/2011-05-19-want-say-after-changing-theme.md +++ b/_posts/2011-05-19-want-say-after-changing-theme.md @@ -1,4 +1,5 @@ --- +layout: post title: 更换主题后想说说 pid: 139 tags: [Themes, 点滴] diff --git a/_posts/2011-05-20-dont-know-reload-js-function.md b/_posts/2011-05-20-dont-know-reload-js-function.md index a8555a79..a3e5c8af 100644 --- a/_posts/2011-05-20-dont-know-reload-js-function.md +++ b/_posts/2011-05-20-dont-know-reload-js-function.md @@ -1,4 +1,5 @@ --- +layout: post title: js函数重新加载,不会~ pid: 140 tags: [Ajax, jQuery, PhilNa2] diff --git a/_posts/2011-05-20-how-philna2-ajax-load-articles.md b/_posts/2011-05-20-how-philna2-ajax-load-articles.md index 9785e956..cd58220d 100644 --- a/_posts/2011-05-20-how-philna2-ajax-load-articles.md +++ b/_posts/2011-05-20-how-philna2-ajax-load-articles.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2首页Ajax加载文章 pid: 141 tags: [Ajax, jQuery, PhilNa2, 原创] diff --git a/_posts/2011-05-22-note-about-optimize-blog.md b/_posts/2011-05-22-note-about-optimize-blog.md index 197d8eac..4aa6c80d 100644 --- a/_posts/2011-05-22-note-about-optimize-blog.md +++ b/_posts/2011-05-22-note-about-optimize-blog.md @@ -1,4 +1,5 @@ --- +layout: post title: 博客优化小记 pid: 142 tags: [Blog, WordPress, 点滴] diff --git a/_posts/2011-05-23-note-about-optimize-blog-two.md b/_posts/2011-05-23-note-about-optimize-blog-two.md index bc086dcd..7876a410 100644 --- a/_posts/2011-05-23-note-about-optimize-blog-two.md +++ b/_posts/2011-05-23-note-about-optimize-blog-two.md @@ -1,4 +1,5 @@ --- +layout: post title: 博客优化小记二 pid: 143 tags: [Blog, WordPress, 优化, 点滴] diff --git a/_posts/2011-05-25-fix-article-toggle-problems.md b/_posts/2011-05-25-fix-article-toggle-problems.md index 6f778c6c..72fecac8 100644 --- a/_posts/2011-05-25-fix-article-toggle-problems.md +++ b/_posts/2011-05-25-fix-article-toggle-problems.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2首页文章收缩再修复 pid: 144 tags: [jQuery, PhilNa2, WordPress, 原创] diff --git a/_posts/2011-05-26-little-understanding-for-philna2-ajax.md b/_posts/2011-05-26-little-understanding-for-philna2-ajax.md index c5b7006c..db541ee2 100644 --- a/_posts/2011-05-26-little-understanding-for-philna2-ajax.md +++ b/_posts/2011-05-26-little-understanding-for-philna2-ajax.md @@ -1,4 +1,5 @@ --- +layout: post title: 对PhilNa2的Ajax的一丁点理解 pid: 145 tags: [Ajax, jQuery, PhilNa2, 原创] diff --git a/_posts/2011-05-27-unlimited-page-to-new-version.md b/_posts/2011-05-27-unlimited-page-to-new-version.md index 3ec78a1e..5f398456 100644 --- a/_posts/2011-05-27-unlimited-page-to-new-version.md +++ b/_posts/2011-05-27-unlimited-page-to-new-version.md @@ -1,4 +1,5 @@ --- +layout: post title: 停用无限翻页,准备换新版~ pid: 146 tags: [Ajax, WordPress, 点滴] diff --git a/_posts/2011-05-27-w1s-unlimited-pages.md b/_posts/2011-05-27-w1s-unlimited-pages.md index a8e08e95..4c84f404 100644 --- a/_posts/2011-05-27-w1s-unlimited-pages.md +++ b/_posts/2011-05-27-w1s-unlimited-pages.md @@ -1,4 +1,5 @@ --- +layout: post title: W1免费版无限翻页 pid: 147 tags: [Ajax, jQuery, w1s, WordPress] diff --git a/_posts/2011-05-28-philna2-use-google-custom-search.md b/_posts/2011-05-28-philna2-use-google-custom-search.md index eaa1568c..9d1b0260 100644 --- a/_posts/2011-05-28-philna2-use-google-custom-search.md +++ b/_posts/2011-05-28-philna2-use-google-custom-search.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2使用google自定义搜索 pid: 150 tags: [Google, PhilNa2, WordPress, 原创] diff --git a/_posts/2011-05-28-w1s-new-ajax-page.md b/_posts/2011-05-28-w1s-new-ajax-page.md index f00ede12..67b37030 100644 --- a/_posts/2011-05-28-w1s-new-ajax-page.md +++ b/_posts/2011-05-28-w1s-new-ajax-page.md @@ -1,4 +1,5 @@ --- +layout: post title: W1s 首页Ajax翻页新效果 pid: 148 tags: [Ajax, w1s, WordPress, 原创] diff --git a/_posts/2011-05-29-visit-wpcn-forum.md b/_posts/2011-05-29-visit-wpcn-forum.md index 0d74fabe..9634fcf1 100644 --- a/_posts/2011-05-29-visit-wpcn-forum.md +++ b/_posts/2011-05-29-visit-wpcn-forum.md @@ -1,4 +1,5 @@ --- +layout: post title: 逛了下wp论坛 pid: 151 tags: [Blog, 点滴] diff --git a/_posts/2011-05-30-apology-to-japhia-anddengken.md b/_posts/2011-05-30-apology-to-japhia-anddengken.md index 3e8281b0..ab8326ea 100644 --- a/_posts/2011-05-30-apology-to-japhia-anddengken.md +++ b/_posts/2011-05-30-apology-to-japhia-anddengken.md @@ -1,4 +1,5 @@ --- +layout: post title: 嵌套评论的问题及向Japhia,邓肯致歉 pid: 152 tags: [Apology, PhilNa2, 点滴] diff --git a/_posts/2011-05-30-change-the-theme-again.md b/_posts/2011-05-30-change-the-theme-again.md index 046d1acd..97ce5cb6 100644 --- a/_posts/2011-05-30-change-the-theme-again.md +++ b/_posts/2011-05-30-change-the-theme-again.md @@ -1,4 +1,5 @@ --- +layout: post title: 又一次更换主题 pid: 157 tags: [Themes, 点滴] diff --git a/_posts/2011-05-31-some-announcement-and-plan.md b/_posts/2011-05-31-some-announcement-and-plan.md index dfe7ee34..d2d50617 100644 --- a/_posts/2011-05-31-some-announcement-and-plan.md +++ b/_posts/2011-05-31-some-announcement-and-plan.md @@ -1,4 +1,5 @@ --- +layout: post title: 使用主题的一点说明和计划 pid: 158 tags: [PhilNa2, Themes, 原创] diff --git a/_posts/2011-06-01-today-theme-thinks.md b/_posts/2011-06-01-today-theme-thinks.md index 871024d3..f9cc1870 100644 --- a/_posts/2011-06-01-today-theme-thinks.md +++ b/_posts/2011-06-01-today-theme-thinks.md @@ -1,4 +1,5 @@ --- +layout: post title: 今日整理主题感想 pid: 159 tags: [PhilNa2, 点滴] diff --git a/_posts/2011-06-02-philna2-remod-by-sayme.md b/_posts/2011-06-02-philna2-remod-by-sayme.md old mode 100755 new mode 100644 index ae0492e0..a12a7e0d --- a/_posts/2011-06-02-philna2-remod-by-sayme.md +++ b/_posts/2011-06-02-philna2-remod-by-sayme.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2-自说Me话扩展版 pid: 160 tags: [PhilNa2, Themes, WordPress, 原创] @@ -54,7 +55,7 @@ FAQ开始吧,(不知道可否叫FAQ) 2.14 自动在文章结尾和feed中添加版权(非PhilNa2后台设置内容,请勿在后台重复设置) 2.15 slimbox图片灯箱效果,Ajax翻页后仍然有效 效果请点击下图(随便找了一张服务器上的图,哈哈) -![](/uploads/2011/05/20110513-130-01.png) +![](/uploads/2011/05/13_01.png) 2.16 图片Lazyload效果,理论上Ajax翻页后依旧有效 2.17 文章末尾自带社会化分享工具(由于Ajax翻页后,分享的内容为未翻页之前的内容,因此翻页后使之失效) diff --git a/_posts/2011-06-04-blog-updates-suspended.md b/_posts/2011-06-04-blog-updates-suspended.md index 9cfd7fd2..b1d469b7 100644 --- a/_posts/2011-06-04-blog-updates-suspended.md +++ b/_posts/2011-06-04-blog-updates-suspended.md @@ -1,4 +1,5 @@ --- +layout: post title: 博客暂停更新 pid: 161 tags: [点滴] diff --git a/_posts/2011-06-06-move-to-zhujigd.md b/_posts/2011-06-06-move-to-zhujigd.md index e603af52..d5040227 100644 --- a/_posts/2011-06-06-move-to-zhujigd.md +++ b/_posts/2011-06-06-move-to-zhujigd.md @@ -1,4 +1,5 @@ --- +layout: post title: 搬家到主机格调 pid: 162 tags: [WordPress, 主机格调, 点滴] diff --git a/_posts/2011-06-09-google-doodle-9th-june.md b/_posts/2011-06-09-google-doodle-9th-june.md index 1531d6d4..169755b3 100644 --- a/_posts/2011-06-09-google-doodle-9th-june.md +++ b/_posts/2011-06-09-google-doodle-9th-june.md @@ -1,4 +1,5 @@ --- +layout: post title: 6月9日Google Doodle pid: 164 tags: [Doodle, Google] diff --git a/_posts/2011-06-09-welcome-msg-function.md b/_posts/2011-06-09-welcome-msg-function.md old mode 100755 new mode 100644 index 998ec5ba..eda8e1b3 --- a/_posts/2011-06-09-welcome-msg-function.md +++ b/_posts/2011-06-09-welcome-msg-function.md @@ -1,4 +1,5 @@ --- +layout: post title: 博客右侧欢迎信息 pid: 163 tags: [PhilNa2, WordPress] @@ -7,7 +8,7 @@ tags: [PhilNa2, WordPress] 具体效果见此处 (点击看清晰图) -![欢迎信息](/uploads/2011/06/20110609-163-01.png) +![欢迎信息](/uploads/2011/06/09_01.png) 这个东西的来历呢,应该还是从PhilNa2说起.在早期版本的PhilNa2中是有这个功能的.只是在后来的版本中去掉了这个功能,我不明白是什么原因.呵呵. diff --git a/_posts/2011-06-10-google-doodle-10th-june.md b/_posts/2011-06-10-google-doodle-10th-june.md index 50705285..adcd98ac 100644 --- a/_posts/2011-06-10-google-doodle-10th-june.md +++ b/_posts/2011-06-10-google-doodle-10th-june.md @@ -1,4 +1,5 @@ --- +layout: post title: 6月10日Google Doodle pid: 166 tags: [Doodle, Google] diff --git a/_posts/2011-06-10-philna2-remod-by-sayme-v1-2.md b/_posts/2011-06-10-philna2-remod-by-sayme-v1-2.md old mode 100755 new mode 100644 index 6869d05d..fec017f4 --- a/_posts/2011-06-10-philna2-remod-by-sayme-v1-2.md +++ b/_posts/2011-06-10-philna2-remod-by-sayme-v1-2.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2自说Me话扩展版V1.2 pid: 165 tags: [PhilNa2, WordPress, 原创] @@ -36,7 +37,7 @@ tags: [PhilNa2, WordPress, 原创] - - - 后台添加的选项如图所示(点击看清晰图片) -![后台选项](/uploads/2011/06/20110610-165-01.png) +![后台选项](/uploads/2011/06/10_01.png) 新版本地址,点击此处 请前往最新地址下载 diff --git a/_posts/2011-06-14-my-blog-will-goon.md b/_posts/2011-06-14-my-blog-will-goon.md index 8a30ecf1..5bea6990 100644 --- a/_posts/2011-06-14-my-blog-will-goon.md +++ b/_posts/2011-06-14-my-blog-will-goon.md @@ -1,4 +1,5 @@ --- +layout: post title: 我还在坚持 pid: 168 tags: [点滴] diff --git a/_posts/2011-06-16-handsome-in-my-blog.md b/_posts/2011-06-16-handsome-in-my-blog.md index ec284c85..8a27443b 100644 --- a/_posts/2011-06-16-handsome-in-my-blog.md +++ b/_posts/2011-06-16-handsome-in-my-blog.md @@ -1,4 +1,5 @@ --- +layout: post title: 我瞎弄的帅哥认证 pid: 169 tags: [Blog, WordPress, 原创] diff --git a/_posts/2011-06-18-philna2-remod-by-sayme-v1-3.md b/_posts/2011-06-18-philna2-remod-by-sayme-v1-3.md index 8c137b3b..ac15a20c 100644 --- a/_posts/2011-06-18-philna2-remod-by-sayme-v1-3.md +++ b/_posts/2011-06-18-philna2-remod-by-sayme-v1-3.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2自说Me话扩展版 v1.3 pid: 170 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-06-19-two-colorful-tag-cloud-methods.md b/_posts/2011-06-19-two-colorful-tag-cloud-methods.md index 9ef9e2a8..1d021e09 100644 --- a/_posts/2011-06-19-two-colorful-tag-cloud-methods.md +++ b/_posts/2011-06-19-two-colorful-tag-cloud-methods.md @@ -1,4 +1,5 @@ --- +layout: post title: 我所知道的两种彩色标签云 pid: 171 tags: [Tag, WordPress] diff --git a/_posts/2011-06-20-wget-mirror-codex-wordpress.md b/_posts/2011-06-20-wget-mirror-codex-wordpress.md old mode 100755 new mode 100644 index a8c735ba..3155d554 --- a/_posts/2011-06-20-wget-mirror-codex-wordpress.md +++ b/_posts/2011-06-20-wget-mirror-codex-wordpress.md @@ -1,4 +1,5 @@ --- +layout: post title: wget镜像codex.wordpress.org pid: 172 tags: [Linux, Wget, WordPress] @@ -44,4 +45,4 @@ sed加grep 正则表达式轻松搞定.中间加了号来转义"和/.这样点 HOHO~~,完毕,有童鞋想要的没? 看看要的人多的话,俺看看上传到网盘上去 -![](/uploads/2011/06/20110620-172-01.png) +![](/uploads/2011/06/20_01.png) diff --git a/_posts/2011-06-21-leifeng-tshirt-2011.md b/_posts/2011-06-21-leifeng-tshirt-2011.md old mode 100755 new mode 100644 index 2df68bb4..0508d0d3 --- a/_posts/2011-06-21-leifeng-tshirt-2011.md +++ b/_posts/2011-06-21-leifeng-tshirt-2011.md @@ -1,4 +1,5 @@ --- +layout: post title: 独立博客文化衫定制活动 pid: 173 tags: [Blog, 雷锋群] @@ -9,7 +10,7 @@ tags: [Blog, 雷锋群] #### T恤图案: -![](/uploads/2011/06/20110621-173_01.jpg) +![](/uploads/2011/06/21_01.jpg) #### 设计思路:[野鹤](http://xianyunyehe.net/) > 这个T恤设计的大的框架是以中国地图为背景,这样也不会太局限于雷锋群,只要是玩博客的,就很适合!一些常用的博客系统特别的用红色来标识出来,突显主题:不管是用什么博客系统,我们都是一家人! diff --git a/_posts/2011-06-23-daily-write-23th-june.md b/_posts/2011-06-23-daily-write-23th-june.md index ce41229f..d57d4c0d 100644 --- a/_posts/2011-06-23-daily-write-23th-june.md +++ b/_posts/2011-06-23-daily-write-23th-june.md @@ -1,4 +1,5 @@ --- +layout: post title: 6月23日吐槽 pid: 174 tags: [点滴] diff --git a/_posts/2011-06-25-something-about-mirror-website.md b/_posts/2011-06-25-something-about-mirror-website.md index 5b207bbd..99007044 100644 --- a/_posts/2011-06-25-something-about-mirror-website.md +++ b/_posts/2011-06-25-something-about-mirror-website.md @@ -1,4 +1,5 @@ --- +layout: post title: 镜像网站遇到的那些事儿 pid: 175 tags: [Linux, website, 原创] diff --git a/_posts/2011-06-26-functions-in-handsome-certification.md b/_posts/2011-06-26-functions-in-handsome-certification.md index bd019fa8..24c6294e 100644 --- a/_posts/2011-06-26-functions-in-handsome-certification.md +++ b/_posts/2011-06-26-functions-in-handsome-certification.md @@ -1,4 +1,5 @@ --- +layout: post title: 帅哥认证用到的两个函数 pid: 176 tags: [PHP, Study] diff --git a/_posts/2011-06-27-extend-wp-widget.md b/_posts/2011-06-27-extend-wp-widget.md old mode 100755 new mode 100644 index c3a5f76c..6b783cfa --- a/_posts/2011-06-27-extend-wp-widget.md +++ b/_posts/2011-06-27-extend-wp-widget.md @@ -1,4 +1,5 @@ --- +layout: post title: 扩展后台侧栏小工具初记 pid: 177 tags: [Widget, WordPress] @@ -52,7 +53,7 @@ tags: [Widget, WordPress] 具体的看图 -[![](/uploads/2011/06/20110627-177-01.png)) +[![](/uploads/2011/06/27-1.png)](/uploads/2011/06/27-1.png) 由于不会说,就不说了.等着有空了,就直接更新到主题上~~加上这个功能 另外,那个人体时钟我也去掉了.把 随便看看 的那个链接用木木讲的方法hook到了导航菜单上面.节省了空间了还不需要额外设置.呵呵. diff --git a/_posts/2011-06-29-css3-readerwall.md b/_posts/2011-06-29-css3-readerwall.md index 83f8a06c..fa118c47 100644 --- a/_posts/2011-06-29-css3-readerwall.md +++ b/_posts/2011-06-29-css3-readerwall.md @@ -1,4 +1,5 @@ --- +layout: post title: css3版读者墙 pid: 179 tags: [CSS3, 读者墙] diff --git a/_posts/2011-06-29-have-nothing-todo-29th-june.md b/_posts/2011-06-29-have-nothing-todo-29th-june.md old mode 100755 new mode 100644 index 9cde24ff..02ceeeb3 --- a/_posts/2011-06-29-have-nothing-todo-29th-june.md +++ b/_posts/2011-06-29-have-nothing-todo-29th-june.md @@ -1,4 +1,5 @@ --- +layout: post title: 无事可做的唠叨 pid: 178 tags: [点滴] @@ -23,4 +24,4 @@ tags: [点滴] 主题简洁,我也喜欢那个风格,所以就趁着兴趣好好弄弄吧. 只能在本地弄了.要不然大家连评论的地方都找不到. 给大家看看样子 -![](/uploads/2011/06/20110629-178-01.png) +![](/uploads/2011/06/29_01.png) diff --git a/_posts/2011-06-30-philna2-remod-by-sayme-v1-4.md b/_posts/2011-06-30-philna2-remod-by-sayme-v1-4.md index 7526f6a4..a261279f 100644 --- a/_posts/2011-06-30-philna2-remod-by-sayme-v1-4.md +++ b/_posts/2011-06-30-philna2-remod-by-sayme-v1-4.md @@ -1,4 +1,5 @@ --- +layout: post title: PhilNa2自说Me话扩展版 v1.4 pid: 180 tags: [PhilNa2, WordPress, 原创] diff --git a/_posts/2011-07-04-test-gone-away.md b/_posts/2011-07-04-test-gone-away.md index dba95af6..4095d41a 100644 --- a/_posts/2011-07-04-test-gone-away.md +++ b/_posts/2011-07-04-test-gone-away.md @@ -1,4 +1,5 @@ --- +layout: post title: 考试结束,新生活开始 pid: 181 tags: [点滴] diff --git a/_posts/2011-07-05-wordpress-ftp-password.md b/_posts/2011-07-05-wordpress-ftp-password.md index 629259a3..4fde626d 100644 --- a/_posts/2011-07-05-wordpress-ftp-password.md +++ b/_posts/2011-07-05-wordpress-ftp-password.md @@ -1,4 +1,5 @@ --- +layout: post title: 本地wordpress后台需要FTP密码解决办法 pid: 182 tags: [Linux, Ubuntu, WordPress] diff --git a/_posts/2011-07-07-fix-for-ubuntu-guide.md b/_posts/2011-07-07-fix-for-ubuntu-guide.md index bc3e83c6..01c01baa 100644 --- a/_posts/2011-07-07-fix-for-ubuntu-guide.md +++ b/_posts/2011-07-07-fix-for-ubuntu-guide.md @@ -1,4 +1,5 @@ --- +layout: post title: 重装windows后修复Ubuntu引导项 pid: 183 tags: [Linux, Ubuntu, Windows] diff --git a/_posts/2011-07-07-sourcecode-2011-movie.md b/_posts/2011-07-07-sourcecode-2011-movie.md index cd07ba9d..9b1d7120 100644 --- a/_posts/2011-07-07-sourcecode-2011-movie.md +++ b/_posts/2011-07-07-sourcecode-2011-movie.md @@ -1,4 +1,5 @@ --- +layout: post title: 源代码 Source Code (2011) pid: 184 tags: [Movie] diff --git a/_posts/2011-07-08-my-blog-name-is-a-failure.md b/_posts/2011-07-08-my-blog-name-is-a-failure.md index 82ca7217..52bfe87a 100644 --- a/_posts/2011-07-08-my-blog-name-is-a-failure.md +++ b/_posts/2011-07-08-my-blog-name-is-a-failure.md @@ -1,4 +1,5 @@ --- +layout: post title: 我起的名字很失败 pid: 185 tags: [Blog, 点滴] diff --git a/_posts/2011-07-09-upgrade-to-wordpress-v32.md b/_posts/2011-07-09-upgrade-to-wordpress-v32.md index 85c1dd71..c87a6186 100644 --- a/_posts/2011-07-09-upgrade-to-wordpress-v32.md +++ b/_posts/2011-07-09-upgrade-to-wordpress-v32.md @@ -1,4 +1,5 @@ --- +layout: post title: wordpress升级3.2成功 pid: 187 tags: [Upgrade, WordPress] diff --git a/_posts/2011-07-11-sidebar-slider-comment.md b/_posts/2011-07-11-sidebar-slider-comment.md index 3375cc5a..dc4b3c9c 100644 --- a/_posts/2011-07-11-sidebar-slider-comment.md +++ b/_posts/2011-07-11-sidebar-slider-comment.md @@ -1,4 +1,5 @@ --- +layout: post title: 侧栏最新评论滑动显示 pid: 188 tags: [JavaScript, WordPress] diff --git a/_posts/2011-07-14-understand-slider-comment.md b/_posts/2011-07-14-understand-slider-comment.md index ed474958..9770de1e 100644 --- a/_posts/2011-07-14-understand-slider-comment.md +++ b/_posts/2011-07-14-understand-slider-comment.md @@ -1,4 +1,5 @@ --- +layout: post title: 侧栏评论滑动显示的一点理解 pid: 189 tags: [JavaScript, Study, WordPress] diff --git a/_posts/2011-07-18-w1s-remod-by-sayme.md b/_posts/2011-07-18-w1s-remod-by-sayme.md index 90af1799..f767df4a 100644 --- a/_posts/2011-07-18-w1s-remod-by-sayme.md +++ b/_posts/2011-07-18-w1s-remod-by-sayme.md @@ -1,4 +1,5 @@ --- +layout: post title: W1s自说Me话扩展版 pid: 190 tags: [Themes, w1s, 原创] diff --git a/_posts/2011-07-20-talk-about-computer-system.md b/_posts/2011-07-20-talk-about-computer-system.md old mode 100755 new mode 100644 index e217eb68..9ffc4ef9 --- a/_posts/2011-07-20-talk-about-computer-system.md +++ b/_posts/2011-07-20-talk-about-computer-system.md @@ -1,4 +1,5 @@ --- +layout: post title: 电脑系统之谈顺便推荐两个win7 pid: 191 tags: [Windows, 原创] @@ -30,7 +31,7 @@ Win7系统中.用过的也不少,由于感觉win7还不成熟,所以我尽量不 先说那种专门的专业版,文件名是 **SW_DVD5_Win_Pro_7_32BIT_ChnSimp_Full_MLF_X15-71025.ISO**,大小2.29G -![](/uploads/2011/07/20110720-191-01.jpg) +![](/uploads/2011/07/20_01.jpg) 为什么要向人家推荐这个呢? >这个是批量授权的版本 对大客户开放的 只有旗舰、企业、专业 三个版本提供(所谓的Eopen) @@ -43,11 +44,11 @@ Win7系统中.用过的也不少,由于感觉win7还不成熟,所以我尽量不 再说说另外一个,就是**windows Thin PC**了,这个应该说是更精简的了.文件名 **ThinPC_110415_EVAL_x86fre.iso**,大小1.46G -![](/uploads/2011/07/20110720-191-02.jpg) +![](/uploads/2011/07/20_02.jpg) 安装完成后,C盘占用3G多一点.和普通的win7系统安装完成后占用近10G来说,确实是一个真正的精简版,并且界面还小清新哦(点击看大图) -![](/uploads/2011/07/20110720-191-03.jpg) +![](/uploads/2011/07/20_03.jpg) 但是此系统安装完成后要想正常使用的话,还需要进行一番改动.需要安装**中文语言包**.另外,此系统,没有win7的搜索组件,不能用win7自带的搜索功能.并且没有自带**.NET环境**.需要手动安装.最要命是,这个系统,么有自带的看图程序.这也是我用了两天之后换回上面的专业版的原因. diff --git a/_posts/2011-07-23-css3-readerwall-sourcecode.md b/_posts/2011-07-23-css3-readerwall-sourcecode.md index 5d1661cf..5c15a898 100644 --- a/_posts/2011-07-23-css3-readerwall-sourcecode.md +++ b/_posts/2011-07-23-css3-readerwall-sourcecode.md @@ -1,4 +1,5 @@ --- +layout: post title: css3读者墙 源代码 pid: 192 tags: [CSS3, PHP, 原创, 读者墙] diff --git a/_posts/2011-07-24-simple-evaluation-for-edit-software.md b/_posts/2011-07-24-simple-evaluation-for-edit-software.md old mode 100755 new mode 100644 index d2200d1a..7c580433 --- a/_posts/2011-07-24-simple-evaluation-for-edit-software.md +++ b/_posts/2011-07-24-simple-evaluation-for-edit-software.md @@ -1,4 +1,5 @@ --- +layout: post title: Editplus notepad++ Gedit UltraEdit简单对比(评测) pid: 193 tags: [Programmer, Software, 原创] @@ -18,38 +19,38 @@ __gedit__ > __ultraedit__ > __notepad++__ > __Editplus__ __gedit安装包__ -![gedit安装包](/uploads/2011/07/20110724-193-01.jpg) +![gedit安装包](/uploads/2011/07/24_01.jpg) __ultraedit安装包__ -![ultraedit安装包](/uploads/2011/07/20110724-193-02.jpg) +![ultraedit安装包](/uploads/2011/07/24_02.jpg) __notepad安装包__ -![notepad安装包](/uploads/2011/07/20110724-193-03.jpg) +![notepad安装包](/uploads/2011/07/24_03.jpg) __editplus安装包__ -![editplus安装包](/uploads/2011/07/20110724-193-04.jpg) +![editplus安装包](/uploads/2011/07/24_04.jpg) #### 3,安装后软件大小 __gedit__ > __ultraedit__ > __notepad++__ > __editplus__ __gedit__ -![gedit大小](/uploads/2011/07/20110724-193-05.jpg) +![gedit大小](/uploads/2011/07/24_05.jpg) __ultraedit__ -![ultraedit大小](/uploads/2011/07/20110724-193-06.jpg) +![ultraedit大小](/uploads/2011/07/24_06.jpg) __notepad++__ -![notepad大小](/uploads/2011/07/20110724-193-07.jpg) +![notepad大小](/uploads/2011/07/24_07.jpg) __Editplus__ -![editplus大小](/uploads/2011/07/20110724-193-08.jpg) +![editplus大小](/uploads/2011/07/24_08.jpg) #### 4,安装位置 都可选安装位置.没有像google软件那样的.呵呵 @@ -59,11 +60,11 @@ gedit和notepad++带有主题,每个主题配有各自的高亮代码配色 Edit __gedit主题__ -![gedit主题](/uploads/2011/07/20110724-193-09.jpg) +![gedit主题](/uploads/2011/07/24_09.jpg) __notepad主题__ -![notepad主题](/uploads/2011/07/20110724-193-10.jpg) +![notepad主题](/uploads/2011/07/24_10.jpg) #### 6,启动速度 __Editplus__快于__notepad++__快于__Ultraedit__快于__Gedit__ @@ -75,34 +76,34 @@ __gedit__ > __ultraedit__ >__notepad++__ > __Editplus__ __gedit__ -![gedit](/uploads/2011/07/20110724-193-11.jpg) +![gedit](/uploads/2011/07/24_11.jpg) __ultraedit__ -![ultraedit](/uploads/2011/07/20110724-193-12.jpg) +![ultraedit](/uploads/2011/07/24_12.jpg) __notepad__ -![notepad](/uploads/2011/07/20110724-193-13.jpg) +![notepad](/uploads/2011/07/24_13.jpg) __editplus__ -![editplus](/uploads/2011/07/20110724-193-14.jpg) +![editplus](/uploads/2011/07/24_14.jpg) #### 8,编码问题 ultraedit notepad++ Editplus可选 新建文件的编码,notepad++还有有无bom选项,notepad++ Editplus有UNIX和PC选项的区别(这个的区别好像主要是回车的控制符问题) __notepad++__ -![notepad编码](/uploads/2011/07/20110724-193-15.jpg) +![notepad编码](/uploads/2011/07/24_15.jpg) __editplus__ -![editplus编码](/uploads/2011/07/20110724-193-16.jpg) +![editplus编码](/uploads/2011/07/24_16.jpg) __ultraedit__ -![ultraedit编码](/uploads/2011/07/20110724-193-17.jpg) +![ultraedit编码](/uploads/2011/07/24_17.jpg) #### 9,代码高亮 代码折叠 四款软件都有代码高亮的功能. diff --git a/_posts/2011-07-26-getaway-from-windows.md b/_posts/2011-07-26-getaway-from-windows.md index a8f8bb1e..fd97096b 100644 --- a/_posts/2011-07-26-getaway-from-windows.md +++ b/_posts/2011-07-26-getaway-from-windows.md @@ -1,4 +1,5 @@ --- +layout: post title: 终于决定放弃windows pid: 194 tags: [Linux, Windows] diff --git a/_posts/2011-07-27-fix-wget-for-zh-cn.md b/_posts/2011-07-27-fix-wget-for-zh-cn.md index 0e9d407b..c0e70ac6 100644 --- a/_posts/2011-07-27-fix-wget-for-zh-cn.md +++ b/_posts/2011-07-27-fix-wget-for-zh-cn.md @@ -1,4 +1,5 @@ --- +layout: post title: wget中文乱码 pid: 195 tags: [C, Linux, Wget] diff --git a/_posts/2011-07-28-i-prefer-fcitx-363.md b/_posts/2011-07-28-i-prefer-fcitx-363.md index e98b01a5..b2c4d689 100644 --- a/_posts/2011-07-28-i-prefer-fcitx-363.md +++ b/_posts/2011-07-28-i-prefer-fcitx-363.md @@ -1,4 +1,5 @@ --- +layout: post title: 我选择Fcitx 3.6.3 pid: 196 tags: [Fcitx, Linux] diff --git a/_posts/2011-07-30-debian6-reinstall-note.md b/_posts/2011-07-30-debian6-reinstall-note.md index de68388d..58d4a26e 100644 --- a/_posts/2011-07-30-debian6-reinstall-note.md +++ b/_posts/2011-07-30-debian6-reinstall-note.md @@ -1,4 +1,5 @@ --- +layout: post title: debian6再安装小记 pid: 197 tags: [Debian, Linux] diff --git a/_posts/2011-07-31-an-amazing-python-code.md b/_posts/2011-07-31-an-amazing-python-code.md index 46259078..948f1b78 100644 --- a/_posts/2011-07-31-an-amazing-python-code.md +++ b/_posts/2011-07-31-an-amazing-python-code.md @@ -1,4 +1,5 @@ --- +layout: post title: 一段python代码显神通 pid: 198 tags: [Linux, Python] diff --git a/_posts/2011-08-02-ubuntu-install-dropbox.md b/_posts/2011-08-02-ubuntu-install-dropbox.md index 05dfcf28..a6884073 100644 --- a/_posts/2011-08-02-ubuntu-install-dropbox.md +++ b/_posts/2011-08-02-ubuntu-install-dropbox.md @@ -1,4 +1,5 @@ --- +layout: post title: ubuntu安装dropbox失败 解决方法 pid: 199 tags: [Dropbox, Ubuntu] diff --git a/_posts/2011-08-06-jsfunciton-themeurl.md b/_posts/2011-08-06-jsfunciton-themeurl.md index 431066a6..1c3e88f7 100644 --- a/_posts/2011-08-06-jsfunciton-themeurl.md +++ b/_posts/2011-08-06-jsfunciton-themeurl.md @@ -1,4 +1,5 @@ --- +layout: post title: 修改js获取主题地址函数 pid: 200 tags: [JavaScript, Themes, WordPress] diff --git a/_posts/2011-08-09-schoolday-comming.md b/_posts/2011-08-09-schoolday-comming.md index af8735db..02b0dc8e 100644 --- a/_posts/2011-08-09-schoolday-comming.md +++ b/_posts/2011-08-09-schoolday-comming.md @@ -1,4 +1,5 @@ --- +layout: post title: 临开学小记 pid: 201 tags: [点滴] diff --git a/_posts/2011-08-13-bash-php-corporation.md b/_posts/2011-08-13-bash-php-corporation.md index 44539244..051d8dcc 100644 --- a/_posts/2011-08-13-bash-php-corporation.md +++ b/_posts/2011-08-13-bash-php-corporation.md @@ -1,4 +1,5 @@ --- +layout: post title: bash搭配php批量下载图片 pid: 202 tags: [Bash, Linux, PHP, Wget] diff --git a/_posts/2011-08-16-recent-chores.md b/_posts/2011-08-16-recent-chores.md index 62169bd4..951e2e7f 100644 --- a/_posts/2011-08-16-recent-chores.md +++ b/_posts/2011-08-16-recent-chores.md @@ -1,4 +1,5 @@ --- +layout: post title: 最近杂事 pid: 204 tags: [点滴] diff --git a/_posts/2011-08-17-improve-pidgin-for-qq-fetion.md b/_posts/2011-08-17-improve-pidgin-for-qq-fetion.md index 7ba56b58..390d25f2 100644 --- a/_posts/2011-08-17-improve-pidgin-for-qq-fetion.md +++ b/_posts/2011-08-17-improve-pidgin-for-qq-fetion.md @@ -1,4 +1,5 @@ --- +layout: post title: 让pidgin威力大增,添加QQ和Fetion pid: 205 tags: [Linux, Pidgin] diff --git a/_posts/2011-08-19-suckerfish-css.md b/_posts/2011-08-19-suckerfish-css.md index 2e0671f9..38e003e6 100644 --- a/_posts/2011-08-19-suckerfish-css.md +++ b/_posts/2011-08-19-suckerfish-css.md @@ -1,4 +1,5 @@ --- +layout: post title: suckerfish下拉菜单 pid: 206 tags: [CSS] diff --git a/_posts/2011-08-20-streamline-my-menu.md b/_posts/2011-08-20-streamline-my-menu.md index 77924eee..2f40cf4d 100644 --- a/_posts/2011-08-20-streamline-my-menu.md +++ b/_posts/2011-08-20-streamline-my-menu.md @@ -1,4 +1,5 @@ --- +layout: post title: 精简了导航部分 pid: 207 tags: [CSS, PhilNa2, WordPress] diff --git a/_posts/2011-08-23-lots-things-recently.md b/_posts/2011-08-23-lots-things-recently.md index 2d81071e..e233e72a 100644 --- a/_posts/2011-08-23-lots-things-recently.md +++ b/_posts/2011-08-23-lots-things-recently.md @@ -1,4 +1,5 @@ --- +layout: post title: 最近琐事多多 pid: 208 tags: [点滴] diff --git a/_posts/2011-08-24-first-using-vim-ctrls-save.md b/_posts/2011-08-24-first-using-vim-ctrls-save.md index c6b7ce81..f8252518 100644 --- a/_posts/2011-08-24-first-using-vim-ctrls-save.md +++ b/_posts/2011-08-24-first-using-vim-ctrls-save.md @@ -1,4 +1,5 @@ --- +layout: post title: 初用vim,让vim能CTRL+S保存 pid: 209 tags: [VIM] diff --git a/_posts/2011-08-27-get-doubanfm-songlist.md b/_posts/2011-08-27-get-doubanfm-songlist.md index 92042839..456feed6 100644 --- a/_posts/2011-08-27-get-doubanfm-songlist.md +++ b/_posts/2011-08-27-get-doubanfm-songlist.md @@ -1,4 +1,5 @@ --- +layout: post title: 获取豆瓣FM加红心列表 pid: 210 tags: [DoubanFM, Python] diff --git a/_posts/2011-08-28-compile-and-install-wget113.md b/_posts/2011-08-28-compile-and-install-wget113.md index 035d0c33..76fcf212 100644 --- a/_posts/2011-08-28-compile-and-install-wget113.md +++ b/_posts/2011-08-28-compile-and-install-wget113.md @@ -1,4 +1,5 @@ --- +layout: post title: 折腾之编译安装wget 1.13 pid: 212 tags: [Linux, Wget] diff --git a/_posts/2011-08-28-upgrade-debian6-stable-to-testing.md b/_posts/2011-08-28-upgrade-debian6-stable-to-testing.md index f002018c..fabc6e6a 100644 --- a/_posts/2011-08-28-upgrade-debian6-stable-to-testing.md +++ b/_posts/2011-08-28-upgrade-debian6-stable-to-testing.md @@ -1,4 +1,5 @@ --- +layout: post title: debian 6 stable蛋疼升级记 pid: 211 tags: [debian, Linux, 原创] diff --git a/_posts/2011-08-30-worst-network-school.md b/_posts/2011-08-30-worst-network-school.md index c98d2c85..cd47ceaf 100644 --- a/_posts/2011-08-30-worst-network-school.md +++ b/_posts/2011-08-30-worst-network-school.md @@ -1,4 +1,5 @@ --- +layout: post title: 艹,牛逼的校园网认证 pid: 213 tags: [点滴] diff --git a/_posts/2011-09-02-make-the-theme-thiner.md b/_posts/2011-09-02-make-the-theme-thiner.md index 275228a5..7d6618f9 100644 --- a/_posts/2011-09-02-make-the-theme-thiner.md +++ b/_posts/2011-09-02-make-the-theme-thiner.md @@ -1,4 +1,5 @@ --- +layout: post title: 对主题适当精简 pid: 214 tags: [Themes, WordPress] diff --git a/_posts/2011-09-04-made-a-theme-today.md b/_posts/2011-09-04-made-a-theme-today.md old mode 100755 new mode 100644 index dd338364..d43b31a2 --- a/_posts/2011-09-04-made-a-theme-today.md +++ b/_posts/2011-09-04-made-a-theme-today.md @@ -1,4 +1,5 @@ --- +layout: post title: 今天移植了一个主题 pid: 215 tags: [Themes, WordPress] @@ -20,4 +21,4 @@ javacsript部分只能先放一放,等其它部分都弄完了,再回来写js, __点击看大图__ -![](/uploads/2011/09/20110904-215-01.png) +![](/uploads/2011/09/04_01.png) diff --git a/_posts/2011-09-05-mywork-fakeblogger-v01.md b/_posts/2011-09-05-mywork-fakeblogger-v01.md old mode 100755 new mode 100644 index f3da88e4..15c853ca --- a/_posts/2011-09-05-mywork-fakeblogger-v01.md +++ b/_posts/2011-09-05-mywork-fakeblogger-v01.md @@ -1,4 +1,5 @@ --- +layout: post title: 移植主题FakeBlogger 0.1 pid: 216 tags: [MyWorks, Themes, WordPress] @@ -34,4 +35,4 @@ __问题__: 感兴趣的话,可以看看哦.呵呵.[下载](/uploads/2011/09/fakebloggerV0.1.zip) -![](/uploads/2011/09/20110905-216-01.jpg) +![](/uploads/2011/09/05_01.jpg) diff --git a/_posts/2011-09-05-what-done-today.md b/_posts/2011-09-05-what-done-today.md index 03ebc694..61d0d069 100644 --- a/_posts/2011-09-05-what-done-today.md +++ b/_posts/2011-09-05-what-done-today.md @@ -1,4 +1,5 @@ --- +layout: post title: 今日主题进展 pid: 217 tags: [Themes] diff --git a/_posts/2011-09-07-fakeblogger-cometo-beta.md b/_posts/2011-09-07-fakeblogger-cometo-beta.md index d4d64d18..3104e87a 100644 --- a/_posts/2011-09-07-fakeblogger-cometo-beta.md +++ b/_posts/2011-09-07-fakeblogger-cometo-beta.md @@ -1,4 +1,5 @@ --- +layout: post title: FakeBlogger主题初步完成 pid: 218 tags: [Themes, WordPress] diff --git a/_posts/2011-09-10-fakeblogger-share.md b/_posts/2011-09-10-fakeblogger-share.md index 2eb9bec4..dcdc90d4 100644 --- a/_posts/2011-09-10-fakeblogger-share.md +++ b/_posts/2011-09-10-fakeblogger-share.md @@ -1,4 +1,5 @@ --- +layout: post title: FakeBlogger主题分享 pid: 219 tags: [Themes] diff --git a/_posts/2011-09-14-tired-beginning-of-school.md b/_posts/2011-09-14-tired-beginning-of-school.md index 62d972e6..c0fa442a 100644 --- a/_posts/2011-09-14-tired-beginning-of-school.md +++ b/_posts/2011-09-14-tired-beginning-of-school.md @@ -1,4 +1,5 @@ --- +layout: post title: 开学真累啊 pid: 220 tags: [点滴] diff --git a/_posts/2011-09-15-why-i-say-the-theme-is-mine.md b/_posts/2011-09-15-why-i-say-the-theme-is-mine.md index adca0601..58320a11 100644 --- a/_posts/2011-09-15-why-i-say-the-theme-is-mine.md +++ b/_posts/2011-09-15-why-i-say-the-theme-is-mine.md @@ -1,4 +1,5 @@ --- +layout: post title: 为什么我认定是我的!! pid: 221 tags: [PhilNa2, WordPress] diff --git a/_posts/2011-09-19-daily-write-2011-09-19.md b/_posts/2011-09-19-daily-write-2011-09-19.md index d1f6ad8e..9cbb2075 100644 --- a/_posts/2011-09-19-daily-write-2011-09-19.md +++ b/_posts/2011-09-19-daily-write-2011-09-19.md @@ -1,4 +1,5 @@ --- +layout: post title: 无力吐槽 pid: 222 tags: [点滴] diff --git a/_posts/2011-09-23-about-the-theme-coda_za.md b/_posts/2011-09-23-about-the-theme-coda_za.md index de9702ba..e23ab51b 100644 --- a/_posts/2011-09-23-about-the-theme-coda_za.md +++ b/_posts/2011-09-23-about-the-theme-coda_za.md @@ -1,4 +1,5 @@ --- +layout: post title: 关于此主题 Coda_Za pid: 223 tags: [Themes, WordPress] diff --git a/_posts/2011-09-26-shell-script-download-pic.md b/_posts/2011-09-26-shell-script-download-pic.md index d9ef7881..249efeb4 100644 --- a/_posts/2011-09-26-shell-script-download-pic.md +++ b/_posts/2011-09-26-shell-script-download-pic.md @@ -1,4 +1,5 @@ --- +layout: post title: 一段shell程序下载图片 pid: 224 tags: [Bash, Linux] diff --git a/_posts/2011-09-30-happy-national-day.md b/_posts/2011-09-30-happy-national-day.md index 157a84d8..59e084e0 100644 --- a/_posts/2011-09-30-happy-national-day.md +++ b/_posts/2011-09-30-happy-national-day.md @@ -1,4 +1,5 @@ --- +layout: post title: 几天没上,祝各位国庆快乐~~ pid: 225 tags: [点滴] diff --git a/_posts/2011-10-05-consummate-coda_za.md b/_posts/2011-10-05-consummate-coda_za.md index 4f23698b..50fbad0f 100644 --- a/_posts/2011-10-05-consummate-coda_za.md +++ b/_posts/2011-10-05-consummate-coda_za.md @@ -1,4 +1,5 @@ --- +layout: post title: 完善主题coda_za pid: 226 tags: [WordPress, 点滴] diff --git a/_posts/2011-10-11-daily-write-2011-10-11.md b/_posts/2011-10-11-daily-write-2011-10-11.md index f52609f8..f40e64cb 100644 --- a/_posts/2011-10-11-daily-write-2011-10-11.md +++ b/_posts/2011-10-11-daily-write-2011-10-11.md @@ -1,4 +1,5 @@ --- +layout: post title: 10月11日小记 pid: 227 tags: [点滴] diff --git a/_posts/2011-10-17-organize-css-structure.md b/_posts/2011-10-17-organize-css-structure.md index 5305b4ff..44ebcfe1 100644 --- a/_posts/2011-10-17-organize-css-structure.md +++ b/_posts/2011-10-17-organize-css-structure.md @@ -1,4 +1,5 @@ --- +layout: post title: 组织好css代码文件的结构. pid: 228 tags: [CSS] diff --git a/_posts/2011-10-22-remod-theme-for-html5.md b/_posts/2011-10-22-remod-theme-for-html5.md index b2553e3b..698aab80 100644 --- a/_posts/2011-10-22-remod-theme-for-html5.md +++ b/_posts/2011-10-22-remod-theme-for-html5.md @@ -1,4 +1,5 @@ --- +layout: post title: 准备重构主题为html5 pid: 229 tags: [HTML5, 点滴] diff --git a/_posts/2011-10-25-domextend-function.md b/_posts/2011-10-25-domextend-function.md index 28795cb6..af6e6b2b 100644 --- a/_posts/2011-10-25-domextend-function.md +++ b/_posts/2011-10-25-domextend-function.md @@ -1,4 +1,5 @@ --- +layout: post title: 一个扩展DOM的函数 pid: 230 tags: [DOM, JavaScript] diff --git a/_posts/2011-10-27-sorry-for-cant-comment.md b/_posts/2011-10-27-sorry-for-cant-comment.md index a547d644..43e91118 100644 --- a/_posts/2011-10-27-sorry-for-cant-comment.md +++ b/_posts/2011-10-27-sorry-for-cant-comment.md @@ -1,4 +1,5 @@ --- +layout: post title: 这两天博客不能评论的说明 pid: 231 tags: [WordPress, 点滴] diff --git a/_posts/2011-10-29-my-several-js-function.md b/_posts/2011-10-29-my-several-js-function.md index 53fa856a..8a5a7715 100644 --- a/_posts/2011-10-29-my-several-js-function.md +++ b/_posts/2011-10-29-my-several-js-function.md @@ -1,4 +1,5 @@ --- +layout: post title: 自己写的几个js函数 pid: 232 tags: [JavaScript, jQuery] diff --git a/_posts/2011-11-06-an-ajax-package.md b/_posts/2011-11-06-an-ajax-package.md index 8afdf864..33675b8a 100644 --- a/_posts/2011-11-06-an-ajax-package.md +++ b/_posts/2011-11-06-an-ajax-package.md @@ -1,4 +1,5 @@ --- +layout: post title: 看书找到的一个ajax函数封装 pid: 233 tags: [Ajax, JavaScript] diff --git a/_posts/2011-11-12-buy-kindle4.md b/_posts/2011-11-12-buy-kindle4.md index 29c434c7..aedc24a9 100644 --- a/_posts/2011-11-12-buy-kindle4.md +++ b/_posts/2011-11-12-buy-kindle4.md @@ -1,4 +1,5 @@ --- +layout: post title: 入手$79版kindle4 pid: 234 tags: [点滴, Kindle] diff --git a/_posts/2011-11-13-remove-all-friends-links.md b/_posts/2011-11-13-remove-all-friends-links.md index 96a137d6..80e4f19e 100644 --- a/_posts/2011-11-13-remove-all-friends-links.md +++ b/_posts/2011-11-13-remove-all-friends-links.md @@ -1,4 +1,5 @@ --- +layout: post title: 决定去掉友情链接 pid: 235 tags: [WordPress, 点滴] diff --git a/_posts/2011-11-20-two-kindle-ebooks.md b/_posts/2011-11-20-two-kindle-ebooks.md index a63a3630..d843c241 100644 --- a/_posts/2011-11-20-two-kindle-ebooks.md +++ b/_posts/2011-11-20-two-kindle-ebooks.md @@ -1,4 +1,5 @@ --- +layout: post title: 自制两个英文版kindle格式小说 pid: 236 tags: [Kindle] diff --git a/_posts/2011-11-25-cut-pdf-whitespace-for-kindle.md b/_posts/2011-11-25-cut-pdf-whitespace-for-kindle.md index 76690f50..3407de7e 100644 --- a/_posts/2011-11-25-cut-pdf-whitespace-for-kindle.md +++ b/_posts/2011-11-25-cut-pdf-whitespace-for-kindle.md @@ -1,4 +1,5 @@ --- +layout: post title: 为kindle上的pdf切白边 pid: 237 tags: [Kindle] diff --git a/_posts/2011-11-30-wordpress-theme-debug-code.md b/_posts/2011-11-30-wordpress-theme-debug-code.md index 9e1592e0..de1b6d5b 100644 --- a/_posts/2011-11-30-wordpress-theme-debug-code.md +++ b/_posts/2011-11-30-wordpress-theme-debug-code.md @@ -1,4 +1,5 @@ --- +layout: post title: 一段wordpress的Theme DEBUG程序 pid: 238 tags: [PhilNa2, Themes, WordPress] diff --git a/_posts/2011-12-07-one-note.md b/_posts/2011-12-07-one-note.md index e1b6141c..a6dfca23 100644 --- a/_posts/2011-12-07-one-note.md +++ b/_posts/2011-12-07-one-note.md @@ -1,4 +1,5 @@ --- +layout: post title: 一贴 pid: 239 --- diff --git a/_posts/2011-12-20-one-1220-note.md b/_posts/2011-12-20-one-1220-note.md index 2f042899..58972b35 100644 --- a/_posts/2011-12-20-one-1220-note.md +++ b/_posts/2011-12-20-one-1220-note.md @@ -1,4 +1,5 @@ --- +layout: post title: 暂时停止更新吧 pid: 240 tags: [点滴] diff --git a/_posts/2011-12-31-old-2011-summary-new-begin.md b/_posts/2011-12-31-old-2011-summary-new-begin.md index a8d3abf8..cf70dab8 100644 --- a/_posts/2011-12-31-old-2011-summary-new-begin.md +++ b/_posts/2011-12-31-old-2011-summary-new-begin.md @@ -1,4 +1,5 @@ --- +layout: post title: 旧年总结,新年快乐 pid: 241 --- diff --git a/_posts/2012-01-16-ready-for-go-home.md b/_posts/2012-01-16-ready-for-go-home.md index bbfc4d81..f6fe8dc8 100644 --- a/_posts/2012-01-16-ready-for-go-home.md +++ b/_posts/2012-01-16-ready-for-go-home.md @@ -1,4 +1,5 @@ --- +layout: post title: 收拾行李,准备回家 pid: 242 --- diff --git a/_posts/2012-03-16-typecho-css3-readerwall.md b/_posts/2012-03-16-typecho-css3-readerwall.md index 31509a30..e5f3d229 100644 --- a/_posts/2012-03-16-typecho-css3-readerwall.md +++ b/_posts/2012-03-16-typecho-css3-readerwall.md @@ -1,4 +1,5 @@ --- +layout: post title: Typecho版 css3读者墙 pid: 243 tags: [CSS3, Typecho, 读者墙] diff --git a/_posts/2012-03-21-ready-for-typecho.md b/_posts/2012-03-21-ready-for-typecho.md index a5a1a52a..5be21519 100644 --- a/_posts/2012-03-21-ready-for-typecho.md +++ b/_posts/2012-03-21-ready-for-typecho.md @@ -1,4 +1,5 @@ --- +layout: post title: 准备更换typecho pid: 244 tags: [PhilNa2, Typecho] diff --git a/_posts/2012-03-23-typecho-philna2.md b/_posts/2012-03-23-typecho-philna2.md index 7d19dcee..fa969e7f 100644 --- a/_posts/2012-03-23-typecho-philna2.md +++ b/_posts/2012-03-23-typecho-philna2.md @@ -1,4 +1,5 @@ --- +layout: post title: Typecho移植版PhilNa2已经可用 pid: 245 tags: [PhilNa2, Typecho] diff --git a/_posts/2012-06-05-i-am-back.md b/_posts/2012-06-05-i-am-back.md index 313b90d7..aa224efb 100644 --- a/_posts/2012-06-05-i-am-back.md +++ b/_posts/2012-06-05-i-am-back.md @@ -1,4 +1,5 @@ --- +layout: post title: hi 朋友们,你回归了吗 pid: 246 --- diff --git a/_posts/2012-09-29-sublime-text2-v2_0_1-zhlanguage.md b/_posts/2012-09-29-sublime-text2-v2_0_1-zhlanguage.md old mode 100755 new mode 100644 index 0718ea99..f7f85e1f --- a/_posts/2012-09-29-sublime-text2-v2_0_1-zhlanguage.md +++ b/_posts/2012-09-29-sublime-text2-v2_0_1-zhlanguage.md @@ -1,4 +1,5 @@ --- +layout: post title: sublime text2 v2.0.1汉化文件 pid: 247 tags: [SublimeText2] @@ -18,4 +19,4 @@ tags: [SublimeText2] [Sublime\_Text2\_V2.0.1_zh-CN.zip](/uploads/2012/09/Sublime_Text2_V2.0.1_zh-CN.zip) -![sublimetext2](/uploads/2012/09/20120929-247-01.jpg) +![sublimetext2](/uploads/2012/09/29_01.jpg) diff --git a/_posts/2012-10-04-css3-brower-support-mirror-2012-10-4.md b/_posts/2012-10-04-css3-brower-support-mirror-2012-10-4.md index e7135e05..f5a7bc60 100644 --- a/_posts/2012-10-04-css3-brower-support-mirror-2012-10-4.md +++ b/_posts/2012-10-04-css3-brower-support-mirror-2012-10-4.md @@ -1,4 +1,5 @@ --- +layout: post title: CSS3 Brower Support mirror(2012-10-4) pid: 248 tags: [CSS3] diff --git a/_posts/2012-10-20-install-centos6-3-livecd.md b/_posts/2012-10-20-install-centos6-3-livecd.md index bcdd4c65..bfd03c41 100644 --- a/_posts/2012-10-20-install-centos6-3-livecd.md +++ b/_posts/2012-10-20-install-centos6-3-livecd.md @@ -1,4 +1,5 @@ --- +layout: post title: Centos6.3 LiveCD安装手记 pid: 249 tags: [CentOS, Linux] diff --git a/_posts/2012-11-16-original-js-philnasay.md b/_posts/2012-11-16-original-js-philnasay.md index 40f291bf..0ee7ddee 100644 --- a/_posts/2012-11-16-original-js-philnasay.md +++ b/_posts/2012-11-16-original-js-philnasay.md @@ -1,4 +1,5 @@ --- +layout: post title: 单PHP文件原生js版PhilnaSay pid: 250 tags: [PhilNa2, JavaScript] @@ -10,4 +11,4 @@ tags: [PhilNa2, JavaScript] 把以下代码随便保存一个名字,比如 `PhilnaSay.php`在想展示PhilnaSay的地方输入以下内容, <?php include 'PhilnaSay.php';?> - + diff --git a/_posts/2012-11-17-chrome-little-animation.md b/_posts/2012-11-17-chrome-little-animation.md old mode 100755 new mode 100644 index 436b012a..5462cbe2 --- a/_posts/2012-11-17-chrome-little-animation.md +++ b/_posts/2012-11-17-chrome-little-animation.md @@ -1,4 +1,5 @@ --- +layout: post title: Chrome下载页面小效果一个 pid: 251 tags: [Chrome, JavaScript] @@ -7,7 +8,7 @@ tags: [Chrome, JavaScript] 下面是demo,仅限Chrome.鼠标放上去就可以看到效果了 - + + ## 检验方法 diff --git a/_posts/2014-03-08-switch-to-domain-isayme.md b/_posts/2014-03-08-switch-to-domain-isayme.md index f398c7f8..ad150d88 100644 --- a/_posts/2014-03-08-switch-to-domain-isayme.md +++ b/_posts/2014-03-08-switch-to-domain-isayme.md @@ -1,4 +1,5 @@ --- +layout: post title: "切换域名至isay.me" pid: 2014030801 tags: [点滴] diff --git a/_posts/2014-05-13-mac-nginx-php-fpm.md b/_posts/2014-05-13-mac-nginx-php-fpm.md index 35904ec2..c326ba02 100644 --- a/_posts/2014-05-13-mac-nginx-php-fpm.md +++ b/_posts/2014-05-13-mac-nginx-php-fpm.md @@ -1,4 +1,5 @@ --- +layout: post title: "mac下nginx搭配php-fpm解析php文件" pid: 2014051301 keywords: "nginx php-fpm" diff --git a/_posts/2014-05-22-phpmyadmin-error-2002.md b/_posts/2014-05-22-phpmyadmin-error-2002.md index 3b18d84b..4d0a6323 100644 --- a/_posts/2014-05-22-phpmyadmin-error-2002.md +++ b/_posts/2014-05-22-phpmyadmin-error-2002.md @@ -1,4 +1,5 @@ --- +layout: post title: "nginx配置phpmyadmin, 解决#2002错误" pid: 2014052201 keywords: "phpMyadmin" diff --git a/_posts/2014-05-29-do-debian-vps-locale-problem.md b/_posts/2014-05-29-do-debian-vps-locale-problem.md index b7c30520..785790a4 100644 --- a/_posts/2014-05-29-do-debian-vps-locale-problem.md +++ b/_posts/2014-05-29-do-debian-vps-locale-problem.md @@ -1,4 +1,5 @@ --- +layout: post title: DO vps locale错误 pid: 2014052901 tags: [VPS] diff --git a/_posts/2014-06-05-angular-directive-equal-and-and-scope.md b/_posts/2014-06-05-angular-directive-equal-and-and-scope.md index e560a5ee..bd9f48b0 100644 --- a/_posts/2014-06-05-angular-directive-equal-and-and-scope.md +++ b/_posts/2014-06-05-angular-directive-equal-and-and-scope.md @@ -1,4 +1,5 @@ --- +layout: post title: "angular创建directive时, &与=在继承callback中的差异" pid: 2014060501 tags: [Angular] diff --git a/_posts/2014-06-06-angular-prerender-seo-and-use-resolve-for-page-flicker.md b/_posts/2014-06-06-angular-prerender-seo-and-use-resolve-for-page-flicker.md index 857581ab..df4249be 100644 --- a/_posts/2014-06-06-angular-prerender-seo-and-use-resolve-for-page-flicker.md +++ b/_posts/2014-06-06-angular-prerender-seo-and-use-resolve-for-page-flicker.md @@ -1,4 +1,5 @@ --- +layout: post title: "Angular Prerender SEO实践" pid: 2014060601 keywords: "angular prerender autoscroll seo ngcloak uirouter" diff --git a/_posts/2014-07-12-angular-me-pageloading-module.md b/_posts/2014-07-12-angular-me-pageloading-module.md index 06b43f73..600851fb 100644 --- a/_posts/2014-07-12-angular-me-pageloading-module.md +++ b/_posts/2014-07-12-angular-me-pageloading-module.md @@ -1,4 +1,5 @@ --- +layout: post title: Angular 全局页面切换动画 me-pageloading pid: 2014071201 keywords: "Angular pageloading ui-router angular-route" @@ -7,7 +8,7 @@ tags: [Angular] 最近看了Codrops的一篇文章, 里面讲到了一个页面切换的效果, 详情点击[此处](http://tympanus.net/codrops/2014/04/23/page-loading-effects/). 看了这个效果感觉很赞, 觉得这个效果可以用在angular的页面切换中, 所以将这个效果移植到angular中, 做成一个angular module, 方便以后添加类似效果时, 直接使用. -Github: +Github: 做好的demo效果 diff --git a/_posts/2014-07-15-integrate-animatecss-with-angular.md b/_posts/2014-07-15-integrate-animatecss-with-angular.md index 3337db42..5606e788 100644 --- a/_posts/2014-07-15-integrate-animatecss-with-angular.md +++ b/_posts/2014-07-15-integrate-animatecss-with-angular.md @@ -1,4 +1,5 @@ --- +layout: post title: "Angular.js与animate.css集成" pid: 2014071501 tags: [Angular, Animate] @@ -14,6 +15,6 @@ animate.css经过很多css高手的贡献, 现在已经有很多的动画了. 而重复执行的动画, 则就可以作为angular中的普通动画, 重复执行. -本人制作的一个demo如下 +本人制作的一个demo如下 欢迎大家感兴趣的一起来探讨. diff --git a/_posts/2014-08-06-osx109-install-laravel4.md b/_posts/2014-08-06-osx109-install-laravel4.md index ca060514..2b08ec19 100644 --- a/_posts/2014-08-06-osx109-install-laravel4.md +++ b/_posts/2014-08-06-osx109-install-laravel4.md @@ -1,4 +1,5 @@ --- +layout: post title: "OS X 10.9 安装配置 laravel4" pid: 2014080601 keywords: "Laravel" diff --git a/_posts/2014-08-15-router-wds.md b/_posts/2014-08-15-router-wds.md index cf7fd3cf..fba13ff4 100644 --- a/_posts/2014-08-15-router-wds.md +++ b/_posts/2014-08-15-router-wds.md @@ -1,4 +1,5 @@ --- +layout: post title: "副路由器开启WDS功能连接主路由器上网" pid: 2014081501 keywords: "WDS" diff --git a/_posts/2014-08-15-wds-static-ip.md b/_posts/2014-08-15-wds-static-ip.md index c60442c4..fb12e4b6 100644 --- a/_posts/2014-08-15-wds-static-ip.md +++ b/_posts/2014-08-15-wds-static-ip.md @@ -1,4 +1,5 @@ --- +layout: post title: "为连接到WDS路由器的主机设置静态IP" pid: 2014081502 keywords: "WDS" diff --git a/_posts/2015-01-16-install-gentoo-notes.md b/_posts/2015-01-16-install-gentoo-notes.md index 4c30befe..04ebc515 100644 --- a/_posts/2015-01-16-install-gentoo-notes.md +++ b/_posts/2015-01-16-install-gentoo-notes.md @@ -1,4 +1,5 @@ --- +layout: post title: Gentoo安装手记 pid: 2015011601 tags: [Linux, Gentoo] diff --git a/_posts/2015-01-17-gentoo-config-framebuffer-uvesafb.md b/_posts/2015-01-17-gentoo-config-framebuffer-uvesafb.md index c13315d2..ad70b2eb 100644 --- a/_posts/2015-01-17-gentoo-config-framebuffer-uvesafb.md +++ b/_posts/2015-01-17-gentoo-config-framebuffer-uvesafb.md @@ -1,4 +1,5 @@ --- +layout: post title: Gentoo使用uvesafb配置Framebuffer pid: 2015011701 tags: [Linux, Gentoo] diff --git a/_posts/2015-01-18-01-gentoo-install-xorg-and-nvidia-drivers.md b/_posts/2015-01-18-01-gentoo-install-xorg-and-nvidia-drivers.md index 44f52094..5ff9206d 100644 --- a/_posts/2015-01-18-01-gentoo-install-xorg-and-nvidia-drivers.md +++ b/_posts/2015-01-18-01-gentoo-install-xorg-and-nvidia-drivers.md @@ -1,4 +1,5 @@ --- +layout: post title: Gentoo安装Xorg server和nvidia官方闭源驱动 pid: 2015011801 tags: [Linux, Gentoo] diff --git a/_posts/2015-01-18-02-gentoo-install-xfce-desktop.md b/_posts/2015-01-18-02-gentoo-install-xfce-desktop.md index 6a949b49..75fb5ba1 100644 --- a/_posts/2015-01-18-02-gentoo-install-xfce-desktop.md +++ b/_posts/2015-01-18-02-gentoo-install-xfce-desktop.md @@ -1,4 +1,5 @@ --- +layout: post title: Gentoo安装xfce桌面环境 pid: 2015011802 tags: [Linux, Gentoo] diff --git a/_posts/2015-01-18-03-gentoo-xfce-install-fcitx.md b/_posts/2015-01-18-03-gentoo-xfce-install-fcitx.md index 94cd9c7f..40107150 100644 --- a/_posts/2015-01-18-03-gentoo-xfce-install-fcitx.md +++ b/_posts/2015-01-18-03-gentoo-xfce-install-fcitx.md @@ -1,4 +1,5 @@ --- +layout: post title: Gentoo xfce桌面安装fcitx 以及firefox pid: 2015011803 tags: [Linux, Gentoo] diff --git a/_posts/2015-01-18-04-gentoo-alsa-sound-enable.md b/_posts/2015-01-18-04-gentoo-alsa-sound-enable.md index 6df62451..f1dae23e 100644 --- a/_posts/2015-01-18-04-gentoo-alsa-sound-enable.md +++ b/_posts/2015-01-18-04-gentoo-alsa-sound-enable.md @@ -1,4 +1,5 @@ --- +layout: post title: Gentoo开启声卡支持 pid: 2015011804 tags: [Linux, Gentoo] diff --git a/_posts/2015-01-18-05-gentoo-install-networkmanager-and-vpn.md b/_posts/2015-01-18-05-gentoo-install-networkmanager-and-vpn.md index 3464e32b..6b0e222e 100644 --- a/_posts/2015-01-18-05-gentoo-install-networkmanager-and-vpn.md +++ b/_posts/2015-01-18-05-gentoo-install-networkmanager-and-vpn.md @@ -1,4 +1,5 @@ --- +layout: post title: Gentoo安装networkmanager以及配置vpn pid: 2015011805 tags: [Linux, Gentoo] diff --git a/_posts/2015-01-22-gentoo-enable-usb-and-bluetooth.md b/_posts/2015-01-22-gentoo-enable-usb-and-bluetooth.md index 16bbf55a..815dff4e 100644 --- a/_posts/2015-01-22-gentoo-enable-usb-and-bluetooth.md +++ b/_posts/2015-01-22-gentoo-enable-usb-and-bluetooth.md @@ -1,4 +1,5 @@ --- +layout: post title: Gentoo设置内核, 开启USB及蓝牙支持 pid: 2015012201 tags: [Linux, Gentoo] diff --git a/_posts/2015-01-30-gentoo-enable-portage-log.md b/_posts/2015-01-30-gentoo-enable-portage-log.md index 319a141c..4dc4434f 100644 --- a/_posts/2015-01-30-gentoo-enable-portage-log.md +++ b/_posts/2015-01-30-gentoo-enable-portage-log.md @@ -1,4 +1,5 @@ --- +layout: post title: Gentoo开启portage log pid: 2015013001 tags: [Linux, Gentoo] diff --git a/_posts/2015-09-25-one-css-bug--webkit-overflow-scrolling-touch.md b/_posts/2015-09-25-one-css-bug--webkit-overflow-scrolling-touch.md index d5d219c6..df2894d4 100644 --- a/_posts/2015-09-25-one-css-bug--webkit-overflow-scrolling-touch.md +++ b/_posts/2015-09-25-one-css-bug--webkit-overflow-scrolling-touch.md @@ -1,4 +1,5 @@ --- +layout: post title: "-webkit-overflow-scrolling设置为touch的一个bug" pid: 2015092501 tags: [CSS] diff --git a/_posts/2015-09-25-some-android-overflow-auto-cant-scroll-to-new-element.md b/_posts/2015-09-25-some-android-overflow-auto-cant-scroll-to-new-element.md index 71e229c7..b30aa380 100644 --- a/_posts/2015-09-25-some-android-overflow-auto-cant-scroll-to-new-element.md +++ b/_posts/2015-09-25-some-android-overflow-auto-cant-scroll-to-new-element.md @@ -1,4 +1,5 @@ --- +layout: post title: "部分安卓设备出现元素设置overflow为auto时, 无法滚动到动态加载的元素问题" pid: 2015092502 tags: [CSS] diff --git a/_posts/2016-02-21-new-theme-ilotus.md b/_posts/2016-02-21-new-theme-ilotus.md index 96013e7e..67ce3ad0 100644 --- a/_posts/2016-02-21-new-theme-ilotus.md +++ b/_posts/2016-02-21-new-theme-ilotus.md @@ -1,4 +1,5 @@ --- +layout: post title: 新的主题, 博客继续 pid: 2016022101 tags: [Jekyll] @@ -13,7 +14,7 @@ tags: [Jekyll] 喜欢的朋友可以查看 -在原版的基础上, 本人进行了一些修改, 修改版地址: +在原版的基础上, 本人进行了一些修改, 修改版地址: 主要修改内容: diff --git a/_posts/2016-02-21-use-github-sync-dotfile.md b/_posts/2016-02-21-use-github-sync-dotfile.md index ddbd513e..9d03d639 100644 --- a/_posts/2016-02-21-use-github-sync-dotfile.md +++ b/_posts/2016-02-21-use-github-sync-dotfile.md @@ -1,4 +1,5 @@ --- +layout: post title: 使用Github管理配置文件 pid: 2016022102 tags: [GitHub] @@ -16,7 +17,7 @@ Github, 一个神奇的网站. 重装系统或者更换电脑后, 使用一个git命令, 所有熟悉的配置全部回来了, 这感觉! - + $ git summary diff --git a/_posts/2016-02-26-angular-used-project-from-requirejs-to-webpack-1.md b/_posts/2016-02-26-angular-used-project-from-requirejs-to-webpack-1.md index b5e9075b..e7672a93 100644 --- a/_posts/2016-02-26-angular-used-project-from-requirejs-to-webpack-1.md +++ b/_posts/2016-02-26-angular-used-project-from-requirejs-to-webpack-1.md @@ -1,4 +1,5 @@ --- +layout: post title: 在Angular.js项目中使用异步加载(一) pid: 2016022601 tags: [webpack, Angular, RequireJS] diff --git a/_posts/2016-02-26-angular-used-project-from-requirejs-to-webpack-2.md b/_posts/2016-02-26-angular-used-project-from-requirejs-to-webpack-2.md index 30fca4bd..e44f8daa 100644 --- a/_posts/2016-02-26-angular-used-project-from-requirejs-to-webpack-2.md +++ b/_posts/2016-02-26-angular-used-project-from-requirejs-to-webpack-2.md @@ -1,4 +1,5 @@ --- +layout: post title: 在Angular.js项目中使用异步加载(二) pid: 2016022602 tags: [webpack, Angular, RequireJS] @@ -162,6 +163,6 @@ $stateProvider 你可以将这些代码进行抽象, 封装成一个方法. 对于 css 文件的加载, 可以在开发模式, 使用 `RequireJS` 进行加载. 而在发布模式时, 不单独加载 css 文件, 而是配合下篇讲的方法, 将 css 的内容注入到对应的 controller 中. -为了简化代码, 我写了一个 angular 的 模块, [angular-require](https://github.com/ik0r/angular-require). 本篇写的代码, 就是这个小项目的原型. +为了简化代码, 我写了一个 angular 的 模块, [angular-require](https://github.com/Treri/angular-require). 本篇写的代码, 就是这个小项目的原型. 在以 Angular.js 为框架的项目中, 使用 `RequireJS` 进行代码的异步加载, 其实并不是很难, 下篇将写一下, 在这样的项目中, 怎么对代码进行构建发布. diff --git a/_posts/2016-02-27-angular-used-project-from-requirejs-to-webpack-3.md b/_posts/2016-02-27-angular-used-project-from-requirejs-to-webpack-3.md index 4eb796c8..6f6f0cea 100644 --- a/_posts/2016-02-27-angular-used-project-from-requirejs-to-webpack-3.md +++ b/_posts/2016-02-27-angular-used-project-from-requirejs-to-webpack-3.md @@ -1,4 +1,5 @@ --- +layout: post title: 在Angular.js项目中使用异步加载(三) pid: 2016022701 tags: [webpack, Angular, RequireJS] @@ -13,7 +14,7 @@ tags: [webpack, Angular, RequireJS] 2. service, directive, factory, 因为像这样的, 一般都会是公共模块, 所以只是将这些文件进行压缩, 而不和其它一些文件合并. 如果在写 directive 时, 使用了一些 css 文件, 那么也可以像 controller 那样, 将 directive 的 js 文件和 css 文件合并起来. 3. views, 使用 html-minifier 工具, 进行压缩, 去除多余的空格及空行. -那如何将 css 文件和 js 文件进行合并呢, 答案是, 将 css 的内容通过 js 注入到 style 标签中. 为此我还写过 grunt 插件 [grunt-inline-css](https://github.com/ik0r/grunt-inline-css) 和 gulp 插件 [gulp-scriptcss](https://github.com/ik0r/gulp-scriptcss). +那如何将 css 文件和 js 文件进行合并呢, 答案是, 将 css 的内容通过 js 注入到 style 标签中. 为此我还写过 grunt 插件 [grunt-inline-css](https://github.com/Treri/grunt-inline-css) 和 gulp 插件 [gulp-scriptcss](https://github.com/Treri/gulp-scriptcss). 其实核心方法就是下面的这么简单 diff --git a/_posts/2016-02-27-angular-used-project-from-requirejs-to-webpack-4.md b/_posts/2016-02-27-angular-used-project-from-requirejs-to-webpack-4.md index 91bbf9e2..f9cde758 100644 --- a/_posts/2016-02-27-angular-used-project-from-requirejs-to-webpack-4.md +++ b/_posts/2016-02-27-angular-used-project-from-requirejs-to-webpack-4.md @@ -1,4 +1,5 @@ --- +layout: post title: 在Angular.js项目中使用异步加载(四) pid: 2016022702 tags: [webpack, Angular, RequireJS] @@ -58,7 +59,7 @@ define([ }); ``` -如果有公共模块的话, 我还需要调用一次方法才行, 能不能默认就返回一个promise呢? 所以基于 promise-loader, 我修改了一个 [then-loader](https://github.com/ik0r/then-loader), 其它功能和 promise-loader 相同, 但是返回的就是一个 promise, 不需要调用方法. +如果有公共模块的话, 我还需要调用一次方法才行, 能不能默认就返回一个promise呢? 所以基于 promise-loader, 我修改了一个 [then-loader](https://github.com/Treri/then-loader), 其它功能和 promise-loader 相同, 但是返回的就是一个 promise, 不需要调用方法. 现在定义模块时, 我的写法是这样的 diff --git a/_posts/2016-03-11-angular-used-project-from-requirejs-to-webpack-5.md b/_posts/2016-03-11-angular-used-project-from-requirejs-to-webpack-5.md index 751737c9..5ce7075c 100644 --- a/_posts/2016-03-11-angular-used-project-from-requirejs-to-webpack-5.md +++ b/_posts/2016-03-11-angular-used-project-from-requirejs-to-webpack-5.md @@ -1,4 +1,5 @@ --- +layout: post title: 在Angular.js项目中使用异步加载(五) pid: 2016031101 tags: [webpack, Angular, RequireJS] @@ -29,7 +30,7 @@ tags: [webpack, Angular, RequireJS] 通过网上的搜索, 找到一些简单的模块加载器, 并在此基础上进行修改以满足要求. -项目地址: +项目地址: ##### 使用方法 diff --git a/_posts/2016-03-19-angular-used-project-from-requirejs-to-webpack-6.md b/_posts/2016-03-19-angular-used-project-from-requirejs-to-webpack-6.md index bac08d59..5574de3e 100644 --- a/_posts/2016-03-19-angular-used-project-from-requirejs-to-webpack-6.md +++ b/_posts/2016-03-19-angular-used-project-from-requirejs-to-webpack-6.md @@ -1,4 +1,5 @@ --- +layout: post title: 在Angular.js项目中使用异步加载(六) - 动态加载第三方模块 pid: 2016031901 tags: [webpack, Angular, RequireJS] diff --git a/_posts/2016-04-13-use-systemjs-as-es6-loader.md b/_posts/2016-04-13-use-systemjs-as-es6-loader.md index 7ad5c7f3..dceedd7e 100644 --- a/_posts/2016-04-13-use-systemjs-as-es6-loader.md +++ b/_posts/2016-04-13-use-systemjs-as-es6-loader.md @@ -1,4 +1,5 @@ --- +layout: post title: 使用 System.js 作为 ES6 的加载器 pid: 2016041301 tags: [ES6, System.js, webpack] @@ -10,9 +11,9 @@ webpack 为大家提供了 webpack-dev-server 用于开发环境, webpack-dev-se 但是我在使用 webpack 搭配 webpack-dev-server 的时候, 由于项目很大, 文件特别多, 所以遇到了一个很大的问题, rebuild 等待的时间太久了, 完全不如我原来没有使用 webpack 时保存代码后手动刷新浏览器来的快速. 但是因为我使用了 webpack 进行合并压缩, 我不得不等待整个项目编译完成才能进行调试. -为了解决这个问题, 我写了 [webpack-source-code-loader](https://github.com/ik0r/webpack-source-code-loader), 并且写了一篇文章 [在Angular.js项目中使用异步加载(五)]({% post_url 2016-03-11-angular-used-project-from-requirejs-to-webpack-5 %}). +为了解决这个问题, 我写了 [webpack-source-code-loader](https://github.com/Treri/webpack-source-code-loader), 并且写了一篇文章 [在Angular.js项目中使用异步加载(五)]({% post_url 2016-03-11-angular-used-project-from-requirejs-to-webpack-5 %}). -后来接触到了 [System.js](https://github.com/systemjs/systemjs), 发现其实我的需求完全可以使用 System.js 进行解决. 因为 System.js 可以通过 Babel.js 或者 TypeScript 在浏览器中完成 ES6 => ES5 的编译工作. 具体例子请看我写的 [demo](https://github.com/ik0r/systemjs-example) +后来接触到了 [System.js](https://github.com/systemjs/systemjs), 发现其实我的需求完全可以使用 System.js 进行解决. 因为 System.js 可以通过 Babel.js 或者 TypeScript 在浏览器中完成 ES6 => ES5 的编译工作. 具体例子请看我写的 [demo](https://github.com/Treri/systemjs-example) 在使用的时候我发现, 使用 TypeScript 时会比使用 Babel.js 有更快的编译速度, 同时还可以使用 TypeScript 提供的类型系统, 真的很好. 并且, System.js 和 Babel.js@6.x 有兼容性问题, 目前还只能使用 Babel.js@5.x 才能进行正常工作. diff --git a/_posts/2016-04-15-is-webpack-chunkid-a-good-concept.md b/_posts/2016-04-15-is-webpack-chunkid-a-good-concept.md new file mode 100644 index 00000000..d0bc0da7 --- /dev/null +++ b/_posts/2016-04-15-is-webpack-chunkid-a-good-concept.md @@ -0,0 +1,57 @@ +--- +layout: post +title: webpack 的 chunkId 是不是一个好的概念 +pid: 2016041501 +tags: [webpack] +--- + +webpack 因为有各种各样的 loader, 可以让我们把所有的东西都使用相同的 require 写法进行加载, 同时还可以配合各种 compiler, 让我们从现在就可以享受到 ES6 给我们带来的便利, 所以 webpack 受到了大家的欢迎, 成为 2015 - 2016 特别受欢迎的打包及模块化方案. + +但是在使用 webpack 的时候, 遇到了一个不小的问题, webpack 的 `chunkId` 对于永久缓存的支持. + +假设我们有这样一个 SPA 页面场景, 有一个路由文件 route.js, 会在此文件中使用 webpack 的 `code spliting` 写法, 按需加载文件. + +在 route.js 中分别对应三个页面(foo, bar, baz), 按需加载对应的入口文件. 在入口文件中, 会再分别加载各个子页面依赖的文件. + +- foo.js + - dep1.js + - dep2.js +- bar.js + - dep2.js + - dep3.js +- baz.js + - dep1.js + - dep3.js + +当我们使用 webpack 进行 build 后, webpack 会给每个文件分配一个 `chunkId`, 这个 chunkId 是随着 webpack 处理到的文件的数目而进行递增的. 一种结果是类似于下面这样的, 文件后面的括号中是生成的 chunkId 号 + +- foo.js (1) + - dep1.js (4) + - dep2.js (5) +- bar.js (2) + - dep2.js (5) + - dep3.js (6) +- baz.js (3) + - dep1.js (4) + - dep3.js (6) + +如果我们需要在foo.js中增加一个依赖 `dep4.js`, 那么相应的 chunkId 会变成类似于下面这样 + +- foo.js (1) + - dep1.js (4) + - dep2.js (5) + - dep4.js (6) +- bar.js (2) + - dep2.js (5) + - dep3.js (7) +- baz.js (3) + - dep1.js (4) + - dep3.js (7) + +我们只增加(或删除)了一个文件, 却导致了多个文件的 chunkId 变化, 这样就导致多个文件的内容发生了变化. 那么当重新发布后, 其实有的页面的内容根本不需要变化, 但是仅仅是因为 chunkId 变化, 而导致需要重新下载这些文件, 使得没法使用浏览器已经缓存的文件. + +如果你的页面有几十个, 每次添加或者删除一个文件后, 都会导致几乎所有的文件的浏览器缓存失效. + +我们期望的结果是, 每当我们修改一个文件后, 只有依赖此文件的文件会更新, 而其它的文件不会发生变化. 当重新发布后, 只会去重新下载那些已经被更新的文件, 这样我们就可以做到类似于增量更新的效果. + +但是 webpack 采用的 chunkId 的概念好像没办法避免这样的问题. 如果将 chunkId 换成依赖文件的路径, 是不是可以减少这种问题的发生呢? diff --git a/_posts/2016-05-13-use-eslint-force-code-style-check.md b/_posts/2016-05-13-use-eslint-force-code-style-check.md index eb891043..86aca5d8 100644 --- a/_posts/2016-05-13-use-eslint-force-code-style-check.md +++ b/_posts/2016-05-13-use-eslint-force-code-style-check.md @@ -1,4 +1,5 @@ --- +layout: post title: 在使用 JS 的项目中使用 ESLint 强制进行 code style check pid: 2016051301 tags: [ESLint] diff --git a/_posts/2017-03-26-migrate-duoshuo-to-disqus.md b/_posts/2017-03-26-migrate-duoshuo-to-disqus.md deleted file mode 100644 index 36d6972a..00000000 --- a/_posts/2017-03-26-migrate-duoshuo-to-disqus.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: 将多说评论系统迁移到Disqus -pid: 2017032601 -tags: [Disqus] ---- - -最近几天看到多说官方发布消息, 多说评论系统将于2017年6月1日正式停止服务, 是时间考虑将评论系统换一下了. - -当初使用多说, 一是因为是国内的服务, 速度会比较快, 二是国内用的人确实不少, 沟通起来可以比较方便. - -现在多说不能使用了, 其实大可以直接将博客中的多说下掉, 但是以前的评论就没有了. 这些评论是从使用 WordPress 时就积累下来的, 如果丢失了, 真的比较可惜. - -所以将评论迁移, 第一个考虑切换的目标就是使用人最多的 Disqus 了. - -网上找了一番, 发现迁移脚本都是时间比较长的了, 害怕会有些变化, 所以打算自己写一个. - -[duoshuo2disqus](https://github.com/ik0r/duoshuo2disqus) - -参考了 Disqus 导入时的格式 WXR, 然后使用 Node 处理一下多说导出的数据. - -处理数据的时候还遇到了一个问题. 多说导出的文章和评论中, 都有一个 `thread_id` 和 `post_id` 的字段. -这两个字段导出的类型为数字类型, 而且非常大. 导致 Node 在 require 这些内容的时候, 数字不准确, 造成非常多的重复和错乱. - -解决办法就是, 先把导出的内容中, 这两个字段由数字类型, 转为字符串类型, 即可解决. diff --git a/_posts/2017-04-08-vue-projects-development-with-fis3.md b/_posts/2017-04-08-vue-projects-development-with-fis3.md deleted file mode 100755 index 75557974..00000000 --- a/_posts/2017-04-08-vue-projects-development-with-fis3.md +++ /dev/null @@ -1,358 +0,0 @@ ---- -title: 使用 FIS3 构建 Vue 前端工程. webpack 用户也请看过来 -pid: 2017040801 -tags: [Vue, FIS3, webpack] ---- - -本文的目标是通过一个例子向大家展示如何使用 FIS3 作为构建工具, 来对使用 Vue 的前端工程进行构建. -当然, Vue 只是一个例子, 完全可以推广到其它的项目中. - -前端构建工具, 我从 Grunt, Gulp, webpack 一路用过来. 虽然 webpack 非常火, 但是最终我在项目中使用的是 FIS3. 为什么用 webpack 的那么多, 我却没有使用呢. - -我在使用 wepback 的过程中, 遇到了比较大的问题, 所以最终没用 webpack. 这也是文章标题中请 webpack 用户也看过来的原因. - -### 1. webpack 基于数字的模块ID方案, 会很大程序上导致浏览器的缓存大面积失效 - -在 webpack 的配置中, 大家一般都会使用文件 hash 作为文件名, 然后在静态服务器中设置强制缓存, 可以保证用户在使用缓存的同时, 方便我们进行文件的更新. 只要 hash 一变, 用户自然就会去下载新的文件了. - -但是, 文件内容没有变化, 仅仅因为我们组织、引用文件的顺序变化, 或者新添加了一个模块, 就有可能导致缓存大面积失效. - -假设我们有这样一个场景, 有一个路由文件 route.js, 会在此文件中使用 webpack 的 `code spliting` 写法, 按需加载文件. - -在 route.js 中分别对应三个页面(foo, bar, baz), 按需加载对应的入口文件. 在入口文件中, 会再分别加载各个子页面依赖的文件. - -- foo.js - - dep1.js - - dep2.js -- bar.js - - dep2.js - - dep3.js -- baz.js - - dep1.js - - dep3.js - -当我们使用 webpack 进行 build 后, webpack 会给每个文件分配一个 `moduleId`, 这个 moduleId 是随着 webpack 扫描到的文件的数目而进行递增的. 一种结果是类似于下面的示例, 文件后面的括号中是生成的 moduleId 号 - -- foo.js (1) - - dep1.js (4) - - dep2.js (5) -- bar.js (2) - - dep2.js (5) - - dep3.js (6) -- baz.js (3) - - dep1.js (4) - - dep3.js (6) - -如果我们调整了文件的依赖顺序, 把 dep2 放在 dep1 之前, 那么相应的moduleId 会变成类似下面这样 - -- foo.js (1) - - dep2.js (4) - - dep1.js (5) -- bar.js (2) - - dep2.js (4) - - dep3.js (6) -- baz.js (3) - - dep1.js (5) - - dep3.js (6) - -而如果我们需要在foo.js中增加一个依赖 `dep4.js`, 那么相应的 moduleId 会变成类似于下面这样 - -- foo.js (1) - - dep1.js (4) - - dep2.js (5) - - dep4.js (6) -- bar.js (2) - - dep2.js (5) - - dep3.js (7) -- baz.js (3) - - dep1.js (4) - - dep3.js (7) - -我们只增加(或删除)了一个文件, 或者只调整了文件的引用顺序, 却导致了多个文件的 moduleId 变化, 这样就导致多个文件的内容发生了变化. -那么当重新发布后, 其实有的页面的内容根本没有变化, 但是仅仅因为 moduleId 变化, 而导致需要重新下载这些文件, 使得没法使用浏览器已经缓存的文件. - -听说现在已经有了 namedModulePlugin 这个插件, 可以保证文件的模块ID是稳定的, 但是请看下面的一个问题. - -### 2. 多页面中 webpack 的 commonChunksPlugin 插件, 导致的冗余加载问题 - -在项目中, 肯定会有很多公共模块, 所以大家都会使用 commonChunksPlugin 来提取公共模块. - -像一些第三方库的话, 我们可以通过 commonChunksPlugin, 将第三方类库放到 vendor 中. -我们自己写的公共模块, 一般也是通过 commonChunksPlugin, 并传入 minChunks 选项来进行抽取. 如果一个模块被依赖次数达到了 minChunks 的大小, 就会被抽取到一个类似 common.js 中. - -只是模块抽取的逻辑, 以及导致的冗余加载的问题, 大家有没有关注过呢. - -比如在多页面项目中, 设置了多个 entry, 并通过 commonChunksPlugin 抽取公共模块, 假设我们配置的公共模块抽取的目标文件为 common.js. - -当 minChunks 为最小值 2 时, 即只要一个模块被依赖次数大于等于 2, 就会被抽取到 common.js 中. 所以构建完成后, common.js 会包含所有的公共模块. 那么当我们在加载的时候, 可能只需要其中的一个模块, 却要把整个文件下载下来. 这样造成的冗余性非常大. - -那么如果我们把 minChunks 设置的大一些会怎么样呢? 如果一个公共模块被依赖的次数没有达到 minChunks, 那么此模块就会在所有依赖它的文件中都会被打包一份. 同样也造成了资源的冗余加载. - -所以, 不管 minChunks 被设置为多少, 总是会有冗余加载的问题. 使用 webpack 的用户, 请看一下你们的 commonChunksPlugin 配置, 然后再看一下你们 build 之后的文件, 是不是会出现我上面所说的问题. - -### 3. SPA 中, code split 导致的冗余加载问题 - -多页面的项目, 冗余加载的问题其实并没有那么严重, 即使有冗余加载, 但是因为用户刷新了页面, 也不会占用过多资源. -但是在 SPA 项目中, 影响就会变得大了, 同时还会有一些潜在的问题. - -在 SPA 中, 一般我们都是通过在 route 中使用 require.ensure 实现动态加载. 但是 webpack 在切分文件时, 也会造成冗余加载的问题. - -比如 - -a.js -```js -require('./c'); -console.log('a.js') -``` - -b.js -```js -require('./b'); -console.log('a.js') -``` - -c.js -```js -console.log('c.js'); -``` - -main.js -```js -module.exports = { - a: function(){ - require.ensure([], function(){ - require('./a'); - }) - }, - b: function(){ - require.ensure([], function(){ - require('./b'); - }) - } -}; -``` - -webpack.config.js -```js -var path = require('path'); -var webpack = require('webpack'); -module.exports = { - entry: path.resolve(__dirname, 'main.js'), - output: { - filename: '[name].js', - path: path.resolve('.', 'dist') - } -}; -``` - -最终通过 webpack, 生成了三个文件. 0.js, 1.js, main.js, 内容分别如下 - -0.js 对应 main.js 中的 a -```js -webpackJsonp([0],[ -/* 0 */, -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { -__webpack_require__(3); -console.log('b.js') -/***/ }), -/* 2 */, -/* 3 */ -/***/ (function(module, exports) { -console.log('c.js'); -/***/ }) -]); -``` - -1.js 对应 main.js 中的 b -```js -webpackJsonp([1],[ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { -__webpack_require__(3); -console.log('a.js') -/***/ }), -/* 1 */, -/* 2 */, -/* 3 */ -/***/ (function(module, exports) { -console.log('c.js'); -/***/ }) -]); -``` - -可以看到, 相同的 c.js 被分别打包进了 a.js 和 b.js - -所以当我们加载的时候, A 模块依赖 C 模块, 下载下来的文件中, 既有 A, 也会有 C. 但是 B 模块也依赖 C 模块, 下载下来的文件中, 既有 B, 也会有 C. 相同的 C 模块被下载了2次. - -设想一下, 如果这个 C 模块是一个 EventBus 模块, A 使用它来发布消息, B 使用它来订阅消息. 那么 A B 之间的通讯就会出现问题. 因为 A 使用的 C 和 B 使用的 C 是两个完全不同的模块, 它们的数据并不会共享, 也并不知道彼此的存在 - -这几个问题, 是我在使用 webpack 的时候, 一直在思考的问题, 也在网上搜索过相关的知识. 但是好像使用 webpack 的用户, 都不认为这是问题? - ---- - -在构建项目的时候, 我想让模块ID能够稳定, 那么使用文件的路径作为模块ID就是一个不错的方案. -我需要按需加载, 但是却不希望有冗余加载. 一个办法是, 在构建的时候, 其它流程都正常进行, 但是却不合并, 或者是通过配置有限合并. 加载的时候采取其它的办法. 这个办法后面会讲到. - -但是对 webpack 来说, 它作为一个打包器, 却要让它不进行打包合并, 真的是困难. - -## 使用 FIS3 - -因为上面的问题, 在了解了 FIS3 之后, 我就选择了 FIS3. -我选择 FIS3, 首先是因为它能很好的解决上面的问题, 其次在它的基础上, 我们还能有更加优化的办法. - -FIS3 默认使用文件路径作为模块ID, 所以也就不存在模块ID不稳定的问题. 其次, 如果在没有进一步配置的情况下, FIS3 产出的文件是没有任何合并的, 只是把 commonjs 模块包装成 amd 模块, 添加了模块ID, 并且会产出一份静态文件资源表, 标识出文件之间的互相依赖关系. - -虽然没有自动合并, 但是 FIS3 提供了打包合并的配置, 我们可以通过配置选择将哪些文件合并打包在一起. 由于是我们自己控制的, 所以肯定会比 webpack 的自动化打包方案更灵活. - -可能使用 webpack 的人会有疑问, 通过手动配置的方式? 这不是更麻烦吗. 其实后面通过例子会看到, 真的很简单. - -下面是一个使用 FIS3 的实现的一个 demo. 此 demo 是 vue 官方出的 [vue-hackernews-2.0](https://github.com/vuejs/vue-hackernews-2.0), 我把它改成使用 FIS3 进行构建. - -这是整个项目的结构及依赖关系. - -![](/uploads/2017/04/2017040801-01.png) - -1. 最下层的是作为全局的第三方类库, 整个项目初始化时就需要加载. 所以我通过 FIS3 的 packTo 配置, 将他们打包为 `runtimes/packages.js` 文件. fis 的配置只需要下面这样 - ```js - // node_modules 库, 只 packTo 部分文件, 有的文件不是全局依赖还是按需加载 - fis.match('/(node_modules/{' + require('./src/runtimes/packages.json').join(',') + '}/**.{js,ts})', { - packTo: '/src/runtimes/packages.js' - }) - ``` - - `runtimes/package.json` 中的内容如下 - ```js - [ - "es6-promise", - "vue", - "vuex", - "vue-router", - "vuex-router-sync", - "process", - "tslib", - "firebase" - ] - ``` - - 我在 `runtimes/packages.json` 中定义哪些 node_modules 模块作为初始化加载的依赖. 如果没有在这里列出, 就会走异步加载的流程. -2. 往上一层是项目的全局依赖模块, 包括 route, filters, app.vue 等等, 我把他们全都放到 runtimes 文件夹下, 表示它们都是作为运行时依赖. 我把它们合并为 `runtimes/runtimes.js` - ```js - // 全局 runtimes 文件 - fis.match('/src/runtimes/**.{js,ts,vue}', { - packTo: '/src/runtimes/runtimes.js' - }) - ``` -3. 再往上一层就是我们的 view, 业务逻辑. 每个 view 占据 views 下面的一个文件夹, 做到高度自制. 即, 此 view 需要的所有私有依赖, 都放到此文件夹下, 包括但不限于 自用组件, 图片, 字体, 工具函数等等. 上面图中 vuex 中的 store 我也把它放在这里, 因为 vuex 中有 registerModule 方法, 可以在 view 被加载时, 动态注册 vuex module. 最后通过 FIS3, 把每个view的文件夹合并为一个文件. fis 的配置中, 通过 FIS3 提供的类似于 glob 的语法, 可以很方便的进行配置 - ```js - // 各个页面自用的文件, 打包成一个文件, 减少http请求 - fis.match('/src/views/(*)/**.{js,ts,vue}', { - packTo: '/src/views/$1-pack.js' - }) - ``` - - 但是这里, 有个需要注意的地方. 如果是其中的某个模块, 也被其它模块依赖时, 可以把此依赖从此 view 文件夹中提出来, 上移到公共模块文件夹中. 但是如果是一些 icon 图片, 我更倾向于复制一份到view中, 而不是把它上移到公共图片目录中. 这样当某个view不需要了, 可以安全的将此目录直接删除 -4. 右边就是一些公共模块, 公共组件了, 它们依赖 node_modules, 同时被各个 view 所依赖. 但是它们不会被合并到任何文件中, 每个模块在构建完毕后, 都是一个单独的文件, 所以也就不会出现冗余加载的情况发生. - -其实通过上面的一些结构或者做法, 我们做了下面这些事情 - -1. 我们把初始化需要的 node_modules 模块放到一个文件中, 这和 webpack 中通过定义 vendor, 然后使用 commonChunksPlugin 将 vendor 抽取到 vendor.js 中效果一样 -2. 我们把项目中的运行时依赖, 合并为 `runtimes/runtimes.js` 中, 这和 webpack 中, 通过 commonChunksPlugin 抽取项目公共模块的做法类似, 但是更精准. 只合并了项目初始化需要的依赖, 并不包括各个 view 展示时需要的依赖. -3. 各个 view 中的模块都被合并成一个文件, 加载一个 view, 最小的 http 请求变为一个 - -那么, 如果一个 view 依赖了很多公共模块, 不就会出现很多的请求吗? - -## 请求数优化方法 - -因为 FIS3 在构建时, 会产出一份静态资源表, 所以我们根据此资源表, 可以有两种解决办法. - -1. 本地 localStorage 缓存, 这是只需要前端, 不需要后端配合就可以完成的一种方案, 但并不是最好的办法. - - 1. 初次加载时, 将模块缓存到 localStorage 中, 并以文件 url 或者文件 hash 作为标识 - 2. 再次加载时, 首先检查 localStorage 中是否有缓存的模块, 以及模块 hash 是否匹配. 如果匹配的话, 直接拿出使用, 否则去远程加载 - - 所以当第一次到达某个页面时, http 请求可能会很多. 但是当用户以后再次到达此页面时, 因为localStorage 中有缓存, 所以完全可以做到 0 个请求. - -2. 上面的办法不是最好的办法, 是因为它没法解决第一次加载时, http 请求数目过多的问题. 那么解决此问题最好的办法就是, 后端 combo 服务. - - 由于我们有静态资源表, 所以当加载某个模块时, 在发出请求之前, 我们就可以通过静态资源表递归的找到所有依赖, 然后拼装成 combo 服务接收的参数, 一次请求, 把所有的依赖全部下载下来. - -如果把上面的 1, 2 结合起来, 我认为才是真正最好的解决方案. - -1. 首次加载时, 通过 combo 服务, 一个请求, 即可把模块的递归依赖全部下载下来, 然后缓存到 localStorage 中, http 请求数最小 -2. 再次加载时, 由于 localStorage 中有缓存, 所以不需要发出 http 请求即可完成. -3. 如果是在其它view中加载某个模块, 首先通过静态资源表, 递归的把所有的依赖找到, 然后先去 localStorage 缓存中过滤一遍, 将 localStorage 中已经存在并可以使用的模块缓存直接拿出来使用, 然后再将 localStorage 中没有或者已经失效的模块, 使用 combo 服务进行加载. 这样就可以实现以最小的请求量以及最少的请求数, 即可完成模块加载. - - 比如首次加载 a.js, 依赖模块有 b, c, d. 当再次加载时, 因为已经有缓存, 所以不需要发出 http 请求, 直接使用缓存即可. 当加载另一个模块 e.js 时, 分析出的依赖模块有 c, d, f, g. 此时, 先去 localStorage 中, 发现缓存中有 c, d 模块, 直接拿出使用. 然后再用一个请求, 将 f, g 模块使用 combo 服务下载下来 - -最终的 demo 的链接 [fis3-typescript-vue-hackernews-2.0](https://github.com/ik0r/fis3-typescript-vue-hackernews-2.0). - -dev 模式下的请求 - -![](/uploads/2017/04/2017040801-02.png) - -在 dev 模式下, 我没有配置任何的合并, 所以进入首页后, 请求数很多. 除去 livereload, 以及 vconsole 这两个 dev 模式下才有的模块外, 还有 21 个文件请求. - -production 模式下的请求 - -![](/uploads/2017/04/2017040801-03.png) - -在 production 模式下, 我通过上面说到的使用 FIS3 的 packTo 配置, 将请求数降到 7 个. 其实还可以更进下一步, 将 `init.js` 和 `runtimes/runtimes.js` 再合并一下, 将运行时依赖以及项目启动文件, 同时合并到 `runtimes/init.js` 中 - -```js -// init 初始化文件 -fis.match('/src/{boot,app}.{js,ts,vue}', { - packTo: '/src/runtimes/init.js' -}) - -// 全局 runtimes 文件 -fis.match('/src/runtimes/**.{js,ts,vue}', { - packTo: '/src/runtimes/init.js' -}) -``` - -那么这时候只剩下了 6 个请求, 还剩下的没有被合并的就是首页 view 依赖的一些公共组件模块了. 这里可以看一下, FIS3 提供的模块加载框架 mod.js 根据静态资源表分析到的文件依赖关系. - -![](/uploads/2017/04/2017040801-04.png) - -最后一个分组中的文件, 就是前面一个图中最后加载的 4 个文件. 我们已经可以在请求发出前, 就知道这4个文件有关联, 所以使用 combo 服务, 就可以一次请求这4个文件. - -那么最后, 通过使用 FIS3 的 packTo 配置, 再配合使用 combo 服务的话, 我就可以将 21 个文件请求, 优化到 3 个文件请求. 如果进行页面切换的话, 因为有 combo, 发出的请求数也会很少. - -再进下一步, 假如我们不使用 FIS3 的 packTo 配置, 而只使用 combo 服务的话, 通过上面的图, 可以看出, 也是可以将首次请求数量优化到3个. - -第一个请求 - - "boot" - "node_modules/es6-promise/dist/es6-promise" - "node_modules/process/browser" - -第二个请求 - - "app" - "node_modules/tslib/tslib" - "node_modules/vue/dist/vue" - "node_modules/vuex-router-sync/index" - "runtimes/filters/filters" - "runtimes/router/router" - "node_modules/vue-router/dist/vue-router.common" - "runtimes/store/store" - "node_modules/vuex/dist/vuex" - "runtimes/store/api" - "runtimes/store/create-api" - "node_modules/firebase/app" - "node_modules/firebase/database" - "runtimes/views/app" - -第三个请求 - - "views/createListView" - "components/ItemList" - "components/Spinner" - "components/Item" - -只是, combo 服务需要后端或者 CDN 去配合, 只是前端的话, 就可以只使用 packTo 的配置, 效果也是很明显的. - -### Edit - -经掘金上的[任侠](https://juejin.im/user/57c9687e67f3560057b2409c)提醒, 在使用文件名 hash 和 CDN 强缓存的情况下, 浏览器根本不会去远端请求,直接从本地读取, 所以就不需要使用 localStorage 了. diff --git a/_posts/2023-05-15-traefik-as-reverse-proxy.md b/_posts/2023-05-15-traefik-as-reverse-proxy.md deleted file mode 100644 index 3b636756..00000000 --- a/_posts/2023-05-15-traefik-as-reverse-proxy.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -title: traefik 作为反向代理 -pid: 20230515 -tags: [traefik, Synology] ---- - -### 优点 -- 不需要集中维护代理配置文件 -- 和 docker 完美配合 -- docker label 自动更新时, 服务自动发现 -- docker 各个服务启动顺序没有强制关系, 只要 label 中有 traefik 相关配置, 当 traefik 服务启动时, 都可以自动配置对应的反向代理服务 -### 缺点 -- docker 版本的 traefik 不好像群晖中的 nginx 反向代理一样, 可以方便的向局域网中的其它 IP 进行反向代理 - -# traefik 配置 -traefik 配置分为两类, 静态配置和动态配置 -## 静态配置 -静态配置一般在两个地方配置, ① traefik 启动时的命令行参数, ②静态配置文件. -静态配置一般是用来定义 provider 和 entrypoint 用的. 另外, 在 entrypoint 的配置中, 还可以配置全局的 middleware 以及 tls 选项. -动态配置的配置项就比较多, 除了静态配置之外的都可以配置. - -# 群晖docker中使用 traefik -traefik 启动配置就不再啰嗦, 但是有个地方需要重点注意. - -docker 中的 traefik 无法方便的访问宿主机(也就是群晖)所在的局域网, 最多只能从容器中访问宿主机, 此时需要在 `docker-compose.yml` 中添加如下配置, 使容器内部可以请求到宿主机 -```yml -extra_hosts: - - host.docker.internal:host-gateway -``` -此时 traefik 可以将请求转发给宿主机, 但是仍然无法转发给局域网中的其它机器. 解决这个问题有两个方案. - -### 方案一: 搭配使用 traefik -对, 就是再搭配使用一个 traefik 实例(以下就叫实例 2, 前面说的 traefik 服务叫做实例 1), 但是启动时选择的网络模式是 host 模式, 实例 2 就可以自由访问到局域网中的其它IP. - -此时实例 1 中通过动态配置新增一个服务, 服务IP为 `host.docker.internal`, 将请求转发给宿主机. 实例 2 在宿主机中监听所有请求, 然后再通过路由规则代理到对应的局域网IP. - -但是这里有个问题是 -1. 如果实例2启动时使用了 providers.docker, 那么两个实例都会尝试读取 docker label 中的信息, 并且由于两个 traefik 实例的dashboard 服务名字都叫 `api@internal`, 势必会造成冲突. -2. 如果实例2未启用 providers.docker, 那么就需要在实例2的动态配置中定义好 dashboard 服务. - -但是我倾向于 dashboard 这种内建服务还是使用 docker label 动态化配置比较好. 而且实例 1 也无法在 docker label 中定义到宿主机的代理配置, 需要一个专门的动态配置才行(试验了一下, `loadbalancer.servers.url` 只能在动态配置文件中定义, 如果放在 docker label 中会提示 `servers` 字段不存在) - -所以如果使用两个 traefik 实例的话, 配置文件会变多, 并且容易造成冲突. 而我的倾向是能放在 docker label 中的配置尽量不使用动态配置文件来实现. - -所以我尝试了使用其它的方案. - -### 方案二: 搭配使用 nginx + 群晖反向代理 -我尝试的另一个方案是再加一个 nginx 实例, 但是需要和群晖的反向代理功能配合. - -nginx 实例的唯一作用是将 traefik 的请求转发给宿主机, 然后由宿主机也就是群晖的反向代理将请求转发给对应的服务上去. - -和方案一对比起来不一样的就是, 方案一是把到局域网的转发配置维护在 traefik 中, 方案二是把到局域网的转发配置维护在群晖中.(相对来说, 其实上面的方案更优, 但是在实践的过程中, 上面的方案总是会报错) - -相比方案一是在 traefik 实例中访问宿主机, 在方案二里是由 nginx 实例访问宿主机, nginx 作为 traefik 的一个承接服务, 这样就可以把 nginx 相关配置放在 docker label 中. nginx 实例的 `docker-compose.yml` 配置如下 -```yml -traefik-proxy: - image: nginx:stable-alpine - container_name: traefik-proxy - volumes: - - /volume2/docker/traefik/nginx-templates:/etc/nginx/templates:ro - networks: - - traefik - environment: - - NGINX_HOST_PORT=51080 - extra_hosts: - - host.docker.internal:host-gateway - labels: - - traefik.enable=true - - # routers - - traefik.http.routers.openwrt.entrypoints=websecure - - traefik.http.routers.openwrt.rule=Host(`domain.com`) -``` - -nginx 反向代理配置如下 -```nginx -server { - listen 80 default_server; - - location / { - proxy_pass http://host.docker.internal:${NGINX_HOST_PORT}; - - proxy_redirect off; - - # proxy_http_version 1.1定义用于代理的HTTP协议版本,默认情况下将其设置为1.0。对于Websocket和keepalive连接,您需要使用1.1版。 - proxy_http_version 1.1; - - # proxy_cache_bypass $http_upgrade设置websocket不从缓存中获取响应,而是直接通过应用。 - proxy_cache_bypass $http_upgrade; - - # Upgrade $http_upgrade和Connection "upgrade"如果您的应用程序使用Websockets,则这些字段是必填字段。 - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - proxy_set_header Host $host; - # X-Real-IP $remote_addr 将真实的客户端地址转发到应用,如果没有设置,你应用获取到将会是Nginx服务器IP地址。 - proxy_set_header X-Real-IP $remote_addr; - # X-Forwarded-For $proxy_add_x_forwarded_for转发客户端请求头的X-Forwarded-For字段到应用。 - # 如果客户端请求头中不存在X-Forwarded-For字段,则$proxy_add_x_forwarded_for变量等同于$remote_addr变量 - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # X-Forwarded-Proto $scheme这将会转发客户端所使用的HTTP协议或者是HTTPS协议。 - proxy_set_header X-Forwarded-Proto $scheme; - # X-Forwarded-Host $host转发客户端请求的原始主机到应用。X-Forwarded-Port $server_port定义客户端请求的原始端口。 - proxy_set_header X-Forwarded-Host $server_name; - proxy_set_header X-Forwarded-Port $server_port; - } -} -``` - -### 重回方案一 -当我在写这篇总结的时候, 突然我意识到方案一我错在哪里了. - -实例2的docker labels 是给实例1看的, 但是我误认为实例2可以看到. 并且我在实例2的labels中定义的 dashboard router 名字和在实例 1 中的一样导致冲突, 结果实例 1 的 dashboard 也进入不了了, 所以我误认为是两个 traefik 一起使用的话会出现问题. - -仔细思考可以得出, 正确的做法应该是 -1. 实例1开启 `providers.docker` 以及 `providers.file`. 前者是用来自动发现其它的 docker 服务, 并提供反向代理服务. 后者是用来定义 https 以及从实例 1 到实例 2 的转发配置. -2. 实例2只开启 `providers.file`, 所以它的 dashboard 以及其它各种配置只能在动态配置文件中定义. -3. 由于实例 2 和实例 1 根本不在一个网络中, 并且实例 2 也没有开启 `providers.docker`, 所以实例2中的 docker label 没有意义, 所以不需要任何 docker label. - -通过前面的总结, 按照最新的方案一, 使用两个 traefik 终于完成了群晖中的 traefik 配置, 并且所有的配置都维护在 traefik 内部, 这样的话也方便迁移到非群晖的系统中去. - -完整的 `docker-compose.yml` 配置如下 -```yml -version: '3' -services: - traefik-docker: - # The official v2 Traefik docker image - image: traefik:v2.9 - container_name: traefik-docker - ports: - # The HTTP port - # - 52080:52080 - - 52443:52443 - # The Web UI (enabled by --api.insecure=true) - # - "58080:8080" - volumes: - # So that Traefik can listen to the Docker events - - /var/run/docker.sock:/var/run/docker.sock:ro - # dynamic conf - - /volume2/docker/traefik/traefik-docker:/etc/traefik/config:ro - networks: - - traefik - extra_hosts: - - host.docker.internal:host-gateway - command: - # - --entrypoints.web.address=:52080 - # - --entrypoints.web.http.middlewares=shared-compress@docker - - - --entrypoints.websecure.address=:52443 - # global config for response compress - - --entrypoints.websecure.http.middlewares=shared-compress@docker - # global config for https - - --entrypoints.websecure.http.tls=true - - - --api=true - - # - --providers.docker=true - - --providers.docker.exposedbydefault=false - - --providers.file.directory=/etc/traefik/config - - --providers.file.watch=true - labels: - - traefik.enable=true - - # global shared middlewares - ## response compress - - traefik.http.middlewares.shared-compress.compress=true - - # service specific middlewares - ## dashboard-auth - # 在 labels 中配置密码时, 需要将 $ 进行转义变成 2 个 - - traefik.http.middlewares.dashboard-auth.basicauth.users=user:passwd - - # routers - - traefik.http.routers.dashboard-traefik-docker.entrypoints=websecure - - traefik.http.routers.dashboard-traefik-docker.rule=Host(`traefik.example.com`) - - traefik.http.routers.dashboard-traefik-docker.service=api@internal - - traefik.http.routers.dashboard-traefik-docker.middlewares=dashboard-auth@docker - - - traefik.http.routers.dashboard-traefik-host.entrypoints=websecure - - traefik.http.routers.dashboard-traefik-host.rule=Host(`traefik-host.example.com`) - - traefik.http.routers.dashboard-traefik-host.service=traefik-host@file - - traefik.http.routers.dashboard-traefik-host.middlewares=dashboard-auth@docker - - - traefik.http.routers.openwrt.entrypoints=websecure - - traefik.http.routers.openwrt.rule=Host(`op.example.com`) - - traefik.http.routers.openwrt.service=traefik-host@file - - traefik-host: - image: traefik:v2.9 - container_name: traefik-host - # ports: - # - 52081:52081 - volumes: - - /volume2/docker/traefik/traefik-host:/etc/traefik/config:ro - network_mode: host - command: - - --entrypoints.web.address=:52081 - # - --entrypoints.web.http.middlewares=shared-compress@docker - - # - --entrypoints.websecure.address=:52443 - # global config for response compress - # - --entrypoints.websecure.http.middlewares=shared-compress@docker - # global config for https - # - --entrypoints.websecure.http.tls=true - - - --api=true - - # - --providers.docker=true - # - --providers.docker.exposedbydefault=false - - --providers.file.directory=/etc/traefik/config - - --providers.file.watch=true - -networks: - traefik: - external: true -``` - -实例1 的动态配置文件如下所示 -动态配置的作用有两个 -1. 定义 https 证书 -2. 定义从 docker 转发请求到 host 的服务, 通过 host.docker.internal 指向宿主机. - -```toml -[[tls.certificates]] - certFile = "/path/to/tls.cer" - keyFile = "/path/do/tls.key" - -[[http.services.traefik-host.loadBalancer.servers]] - url = "http://host.docker.internal:52081" -``` - -实例2 的动态配置文件如下所示, 动态配置的作用就是定义 dashboard 和转发请求到局域网中的其它IP. - -```toml -# dashboard -[http.routers.dashboard] - entryPoints = ["web"] - rule = "Host(`traefik-host.example.com`)" - service = "api@internal" - -# openwrt -[http.routers.openwrt] - entryPoints = ["web"] - rule = "Host(`op.example.com`)" - service = "openwrt@file" -[[http.services.openwrt.loadBalancer.servers]] - url = "http://192.168.88.4:80" -``` - -# 思考 -后续再思考一下 -1. 如果使用方案一, 实例2使用 traefik 或者 nginx 都可以, 唯一的区别可能是 traefik 支持在不重启的情况下修改路由规则就可以生效, 而 nginx 必须要重启才可以生效. -2. 如果使用方案二, 局域网的转发配置也可以维护在 nginx 实例中, 此时就需要将 nginx 实例使用 `host` 网络模式启动, 和方案一中的 traefik 实例2 一样. \ No newline at end of file diff --git a/_posts/2023-05-16-pve-enable-iommu-and-sata-controller-passthrough.md b/_posts/2023-05-16-pve-enable-iommu-and-sata-controller-passthrough.md deleted file mode 100644 index 2f712a15..00000000 --- a/_posts/2023-05-16-pve-enable-iommu-and-sata-controller-passthrough.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: PVE 启用 IOMMU 功能为虚拟机开启 sata 控制器直通 -pid: 2023051602 -tags: [PVE] ---- - -PVE 安装了个黑群晖, PVE 系统安装在 U 盘上, 所以想把 sata 控制器整个直通给群晖, 方便进行硬盘管理. 在网上搜索了一番, 最终直通成功. - -### 启用 IOMMU 功能 -由于我的 CPU 是 intel 的, 所以按照下面步骤开启 - -1. 编辑 grub 文件 `/etc/default/grub` -2. 找到 `GRUB_CMDLINE_LINUX_DEFAULT="quiet"` 修改为 `GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"` -3. `update-initramfs -u -k all` -4. 使用 `update-grub` 更新 grub - -### 增加虚拟化驱动,加载vifo系统模块 -修改 `/etc/modules` 文件, 添加如下内容 - -``` -vfio -vfio_iommu_type1 -vfio_pci -vfio_virqfd #not needed if on kernel 6.2 or newer -``` - -### 重启验证 - -重启系统, 然后运行命令 `dmesg | grep -e DMAR -e IOMMU`. 如果有输出, 表示成功. - -### 虚拟机添加 pci 设备 -接下来就可以为虚拟机添加设备了. \ No newline at end of file diff --git a/_posts/2023-05-16-routeros-auto-switch-dhcp-options.md b/_posts/2023-05-16-routeros-auto-switch-dhcp-options.md deleted file mode 100644 index f504b497..00000000 --- a/_posts/2023-05-16-routeros-auto-switch-dhcp-options.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: RouterOS 自动根据 IP 是否在线切换下发 DHCP options -pid: 2023051601 -tags: [RouterOS] ---- - -今天通过问 chatGPT, 解决了我一个使用 RouterOS 时的问题. - -目前在我的网络中, 存在两个网关和两个DNS, 分别是 RouterOS 路由器本身, 以及另外的一个 openwrt. -在 RouterOS 的 DHCP 配置中, 会下发 openwrt 的 IP 作为网络中的设备使用的网关及 DNS 服务器. -但是如果 openwrt 由于我折腾挂掉后, 就导致设备就无法上网了. 所以如果 RouterOS 能在 openwrt 设备离线后自动将下发的网关及 DNS 服务器切换加 RouterOS 路由器就可以保持网络不中断. - -chatGPT 给出了答案, 根据自己的实际情况稍微改了一下就利用起来了. 下面是 chatGPT 给出的原脚本代码 - -``` -:local ipToCheck "192.168.100.4" # 要检查的 IP -:local onlineGateway "'192.168.100.4'" # 在线时的网关和DNS -:local offlineGateway "'192.168.100.1'" # 不在线时的备用网关和DNS - -:if ([ping $ipToCheck count=2] = 0) do={ - # IP offline - :log warning "IP $ipToCheck offline, set fallback gateway and DNS" - /ip dhcp-server option set [find name=gateway] value=$offlineGateway - /ip dhcp-server option set [find name=dns] value=$offlineGateway -} else={ - # IP online - :log info "IP $ipToCheck online, set gateway and DNS" - /ip dhcp-server option set [find name=gateway] value=$onlineGateway - /ip dhcp-server option set [find name=dns] value=$onlineGateway -} -``` - -这里有个地方需要注意, 检查 IP 是否在线时, 使用的是 `192.168.100.4`, 对 gateway 和 dns 赋值时, 使用是 `'192.168.100.4'` 和 `'192.168.100.1'`, 值是带有单引号的. 如果直接使用 `192.168.100.4` 和 `192.168.100.1` 时会导致设置失败. \ No newline at end of file diff --git a/_posts/2023-05-24-aria2-traefik.md b/_posts/2023-05-24-aria2-traefik.md deleted file mode 100644 index 3cf8067d..00000000 --- a/_posts/2023-05-24-aria2-traefik.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: 使用 traefik 代理 aria2 -pid: 2023052401 -tags: [traefik, aria2] ---- - -aria2-pro 搭配 traefik 使用, 主要是利用 traefik 对 aria2 的 jsonrpc 请求, 以及 tcp/udp 端口进行代理. -网上很多教程都是直接启动 docker, 很少有涉及到 traefik 的使用. - -在 traefik 配置中, udp 配置中没有 rule 相关配置, 所以只能 aria2 独自占用一个端口. -tpc 配置中, 如果未启用 tls 配置, rule 只能配置为 "HostSNI(\`*\`)", 如果启用了 https, 就可以和其它需要使用 tcp 的服务共用一个端口. - -完整的 docker-compose 内容如下, 环境变量通过 `docker-compose --env-file [file]` 进行指定 - -```yml -version: '3' -services: - aria2-pro: - image: p3terx/aria2-pro - container_name: aria2-pro - restart: unless-stopped - volumes: - - ${ARIA2_CONFIG_DIR}:/config - - ${ARIA2_DOWNLOADS_DIR}:/downloads - environment: - - RPC_SECRET=${ARIA2_RPC_SECRET} - networks: - - traefik - labels: - - traefik.enable=true - - - traefik.http.routers.aria2-pro.entrypoints=websecure - - traefik.http.routers.aria2-pro.rule=Host(`${ARIA2_DOMAIN}`) - - traefik.http.services.aria2-pro.loadbalancer.server.port=6800 - - - traefik.tcp.routers.aria2-pro.entrypoints=aria2tcp - - traefik.tcp.routers.aria2-pro.rule=HostSNI(`*`) - - traefik.tcp.services.aria2-pro.loadbalancer.server.port=6888 - - - traefik.udp.routers.aria2-pro.entrypoints=aria2udp - - traefik.udp.services.aria2-pro.loadbalancer.server.port=6888 -networks: - traefik: - external: true - -``` - -traefik 除正常的 http 配置外, 还需要新增 tcp 以及 udp 的配置 - -```toml -[entryPoints.aria2tcp] - address = ":6888/tcp" -[entryPoints.aria2udp] - address = ":6888/udp" -``` diff --git a/_posts/2023-06-29-multi-plex-server-instance-and-traefik.md b/_posts/2023-06-29-multi-plex-server-instance-and-traefik.md deleted file mode 100644 index 3bb86b9e..00000000 --- a/_posts/2023-06-29-multi-plex-server-instance-and-traefik.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: 通过 Plex 自定义服务器访问 URL 搭配反向代理工具优化内外网访问 -pid: 2023062901 -tags: [traefik, plex] ---- - -安装Plex Media Server 后, 有几种方式可以访问到 plex -1. 可以直接使用局域网的方式, http://{局域网IP}:32400 的方式访问 -2. 在未开启 plex 远程访问但是路由器中正确配置了端口转发后, 直接使用对应的公网 IP 加端口号32400 的方式访问 -3. 在成功开启了 plex 远程访问功能并且路由器中正确配置了端口转发后, 直接使用 https://app.plex.tv 的访问 - -上面 2 和 3 的区别就是, 在开启了 plex 远程访问功能后, plex 会获取当前 plex 服务器的内网IP以及公网IP. 然后在使用 https://app.plex.tv 访问时, 会尝试使用公网IP及对应的端口号访问, 转发到内网的 plex 服务器. - -但是在不开启 plex 的远程访问功能的情况下, 如果我们已经知道了公网IP, 也可以直接访问公网IP加端口号. 只是在通过 https://app.plex.tv 访问时, 由于 plex 并不知道这个公网IP, 所以会无法请求数据. - -支持的访问方式多, 但是各自都有一些不方便及不完美的地方 -1. 上面方式1只能在内网访问, 如果在外网就需要用方式2和方式3 -2. 上面方式2, 需要记住公网IP, 如果有域名以及 ddns 配合的话就方便一些, 这是在只有一个 plex server 的情况下. 但是假如有多个 plex server 的话, 就需要频繁切换域名访问, 此时可能就需要使用方式3 -3. 方式3的话, 则需要在路由器中为 plex 单独映射一个端口, 并且为了安全起见, 还需要单独配置 SSL 证书, 比较麻烦. 如果已经有了统一的 traefik 或者 nginx 等反向代理工具的话, 则显的有些多余. - -那么有没有什么更好的方式能解决上面3点呢, 通过查看 plex 设置后台, 发现了 自定义服务器访问 URL 这个功能, 经过测试, 搭配本地的反向代理工具可以完美解决. 并且可以实现如下效果. -1. 不需要开启 plex 后台设置中的远程访问功能 -2. 所有 plex 服务器都可以统一通过 https://app.plex.tv 访问 -3. 当在内网时, 直接请求的是 plex 服务器的内网IP -4. 当在公网时, 请求的是路由器的公网IP, 并通过路由器及反向代理工具, 转发到内网对应的 plex 服务器 -5. 统一由 traefik 或 nginx 等反向代理工具配置 SSL 证书 -6. 除 app.plex.tv 外, 还可以使用自定义域名的方式访问, 并且由于统一配置了 SSL 证书, 请求类型也是 https 的, 更安全. - -下面会以两个 plex 服务器实现来讲具体实现. 假设两个 plex 服务器分别为 -1. Plex 服务器a, 对应内网IP 为 192.168.88.10, 路由器已配置了泛解析 ddns 域名 *.foo.example.com, 端口号 3456, 路由器转发所有请求到内网的 traefik 实例上 -2. Plex 服务器b, 对应内网IP 为 192.168.100.47, 路由器已配置了泛解析 ddns 域名 *.bar.example.com, 端口号 5678, 路由器转发所有请求到内网的 traefik 实例上. - -首先配置 traefik, 针对 plex-a 以及 plex-b 分别添加内网转发配置. - -Plex-a 配置 -```toml -[http.routers.plex] - entryPoints = ["websecure"] - rule = "Host(`plex.foo.example.com`)" - service = "plex@file" - -[[http.services.plex.loadBalancer.servers]] - url = "http://192.168.88.10:32400" -``` - -Plex-b 配置 -```toml -[http.routers.plex] - entryPoints = ["websecure"] - rule = "Host(`plex.bar.example.com`)" - service = "plex@file" - -[[http.services.plex.loadBalancer.servers]] - url = "http://192.168.100.47:32400" -``` - -然后, plex 后台配置自定义服务器访问 URL, 具体设置位置为 设置=>网络=>自定义服务器访问URL - -Plex-a 后台配置 -``` -http://192.168.88.10:32400,https://plex.foo.example.com:3456 -``` - -Plex-b 后台配置 -``` -http://192.168.100.47:32400,https://plex.bar.example.com:5678 -``` - -注意上面的自定义服务器访问 URL 分别设置了两个值, 一个内网, 一个外网. - -当这样设置后, plex 会为当前 plex 服务器分配一个 https://192-168-100-47.xxxxxxx.plex.direct 这样的域名, 实际解析到的地址就是内网的 192.168.100.47. - -具体这样做的原因是因为, https://app.plex.tv 是使用 https 方式访问, 浏览器安全策略会禁止在 https 页面访问 http 资源的行为. 所以 plex 为了解决这个问题, 为每个 plex 服务器的内网IP分配了一个单独 https 的地址并在 plex 服务器上为 https://192-168-100-47.xxxxxxx.plex.direct 这样的单独域名安装上对应的SSL证书. - -此时, 当你的路由器端口转发正常, 并且 traefik 正确配置了 SSL 泛解析证书的情况下, 访问 app.plex.tv 页面可以同时看到你的 plex-a 以及 plex-b 两个服务器的数据. - -- 当在 plex-a 所在的内网访问 app.plex.tv 时, 请求的是 plex-a 的内网IP, plex-b 的公网IP -- 当在 plex-b 所在的内网访问 app.plex.tv 时, 请求的是 plex-a 的公网IP, plex-b 的内网IP -- 当在公网访问 app.plex.tv 时, 请求的是 plex-a 的公网IP, plex-b 的公网IP - -**注意** -如果你内网使用了 OpenWrt DNS 的话, 还需要多设置一步. - -由于 https://192-168-100-47.xxx.plex.direct 这样的域名解析出的 IP 实际是内网IP, 会被 OpenWrt 的 DNS 策略拦截, 此时 app.plex.tv 页面在浏览器请求 https://192-168-100-47.xxx.plex.direct 这个地址会被报告 DNS 解析错误, 所以 app.plex.tv 会 fallback 到公网地址. - -具体配置位置为 网络=> DHCP/DNS=>重绑定保护, 取消打勾后就可以了. \ No newline at end of file diff --git a/_posts/2023-07-01-pve-lxc-nvidia-gpu-passthrough.md b/_posts/2023-07-01-pve-lxc-nvidia-gpu-passthrough.md deleted file mode 100644 index 19d4138c..00000000 --- a/_posts/2023-07-01-pve-lxc-nvidia-gpu-passthrough.md +++ /dev/null @@ -1,226 +0,0 @@ ---- -title: PVE LXC 容器直通 Nvidia 显卡 -pid: 2023070101 -tags: [PVE, Nvidia, LXC] ---- - -一直看到网上有讨论说在 PVE 下直通显卡给虚拟机或容器来作为 Plex、emby或者jeffyin 的解码/编码工具, 所以一直在关注这个. - -在 v2ex 上看到讨论, 大家推荐使用 nvidia T400 显卡, 因为这个显卡支持编解码的格式多, 而且不需要单独供电, 功耗只有30W, 所以在闲鱼上购入一张 T400 4GB 显卡. - -显卡有了, 接下来就是看怎么在 PVE 中直通了. 搜索了一圈, 发现了一个博主写的文章比较详细, 这篇文章中介绍了虚拟机直通以及 lxc 容器直通的区别. 通过这篇文章, 觉得使用 lxc 容器直通显然更经济一些, 非独占式, 可以多个容器共用一张显卡, 做到资源利用最大化. 所以按照博客文章的步骤, 在自己的 PVE 机器上安装, 经过一些修改和测试, 最终安装并直通成功. - -下面主要记录下安装中的一些步骤,方便后面再次安装时用到. - -## 宿主机配置 -**首先**是安装驱动 - -由于 debian 源中已经有了 nvidia-driver, 所以我选择直接使用源安装, 方便进行升级。唯一的缺点是源中的版本旧一些. 目前 PVE 7.4 是基于 debian 11 bullseye, 在我安装时源中最新的 nvidia-driver 驱动版本为 470.182.03. - -更新 `/etc/apt/sources.list` 文件, 开启 nvidia-driver 所在的库 `non-free`,为了保险起见,把 `contrib` 也加上 - -``` -deb https://mirrors.ustc.edu.cn/debian bullseye main contrib non-free -deb https://mirrors.ustc.edu.cn/debian bullseye-updates main contrib non-free -# security updates -deb https://mirrors.ustc.edu.cn/debian-security bullseye-security main contrib non-free -``` - -然后执行更新并安装 pve-headers 和 nvidia-driver. - -这里要注意一下,不能只安装 `nvidia-driver`。由于在安装过程中需要编译,依赖 `pve-headers` 模块,但是 `nvidia-driver` 并没有标识 `pve-headers` 作为依赖,所以需要手动安装。 - -``` -apt update && apt install pve-headers nvidia-driver -``` - -**然后**是确认驱动及对应模块配置正确,并屏蔽掉开源的显卡驱动 nouveau - -在 `/etc/modules-load.d/nvidia.conf` 文件中,确认以下内容存在,如果有缺少的需要补全。在我的机器上安装完 nvidia-driver 后,这个文件里只有一个 `nvidia-drm`, 导致后面在直通时缺少对应的设备,需要把 `nvidia` 和 `nvidia_uvm` 补全。 - -``` -nvidia-drm -nvidia -nvidia_uvm -``` - -安装完 nvidia-driver 后,在 `/etc/modprobe.d/` 目录下,可以看到如下内容 - -``` -/etc/modprobe.d/dkms.conf -/etc/modprobe.d/nvidia-kernel-common.conf -/etc/modprobe.d/nvidia-blacklists-nouveau.conf -/etc/modprobe.d/pve-blacklist.conf -/etc/modprobe.d/nvidia.conf -``` - -在 `nvidia-blacklists-nouveau.conf` 文件中,有如下内容 - -``` -blacklist nouveau -``` - -在 `pve-blacklist.conf` 文件中,有如下内容 - -``` -blacklist nvidiafb -``` - -保证这两个 blacklist 存在,并且没有重复。如果没有的话,需要进行补全。 - -**然后**是更新内核模块 - -由于在 `/etc/modules-load.d/nvidia.conf` 中添加了 `nvidia` 以及 `nvidia_uvm` 模块,所以需要对内核模块进行更新。使用如下命令 - -``` -update-initramfs -u -``` - -在上面我贴的博客文章中使用的命令是 `update-initramfs -u -k all` 对本地的所有内核模块进行更新,但是按照我的理解 nvidia module 是和内核模块版本绑定的, 所以把 nvidia module 更新到旧的内核中会有风险导致旧的内核模块在加载 nvidia 模块时版本不匹配出现问题. 我觉得只使用一个 `-u` 选项可能更合理一些。 - -**然后**是创建对应的脚本文件 - -创建文件路径 `/etc/udev/rules.d/70-nvidia.rules`, 内容如下 - -``` -# Create /nvidia0, /dev/nvidia1 … and /nvidiactl when nvidia module is loaded -KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'" -# Create the CUDA node when nvidia_uvm CUDA module is loaded -KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'" -``` - -这些规则作用: -- 设置更宽松的权限 -- 启用默认情况下未启动的 nvidia_uvm(至少对于我的卡而言) - -**然后**就是重启,并检查对应的设备及显卡运行情况 - -重启后,正常情况下显卡驱动应该正常加载,查看对应位置内容进行验证。 - -`ls -al /dev/nvidia*` 内容如下 - -``` -crw-rw-rw- 1 root root 195, 0 Jun 30 23:08 /dev/nvidia0 -crw-rw-rw- 1 root root 195, 255 Jun 30 23:08 /dev/nvidiactl -crw-rw-rw- 1 root root 195, 254 Jun 30 23:08 /dev/nvidia-modeset -crw-rw-rw- 1 root root 506, 0 Jun 30 23:08 /dev/nvidia-uvm -crw-rw-rw- 1 root root 506, 1 Jun 30 23:08 /dev/nvidia-uvm-tools - -/dev/nvidia-caps: -total 0 -drw-rw-rw- 2 root root 80 Jun 30 23:08 . -drwxr-xr-x 20 root root 4560 Jun 30 23:08 .. -cr-------- 1 root root 509, 1 Jun 30 23:08 nvidia-cap1 -cr--r--r-- 1 root root 509, 2 Jun 30 23:08 nvidia-cap2 -``` - -`ls -al /dev/dri` 内容如下 - -``` -drwxr-xr-x 3 root root 120 Jun 30 23:08 . -drwxr-xr-x 20 root root 4560 Jun 30 23:08 .. -drwxr-xr-x 2 root root 100 Jun 30 23:08 by-path -crw-rw---- 1 root video 226, 0 Jun 30 23:08 card0 -crw-rw---- 1 root video 226, 1 Jun 30 23:08 card1 -crw-rw---- 1 root render 226, 128 Jun 30 23:08 renderD128 -``` - -注意上面出现的数字(195、506、226),这些是之后LXC中需要的,所以先记录下来。 - -**注意**: 上述设备缺一不可至少包含:nvidia0、nvidiactl、nvidia-modeset、vidia-uvm、nvidia-uvm-tools; 少了说明驱动有组件没有安装成功,需要详细检查. - -另外,使用 `nvidia-smi` 命令会输出当前显卡的信息 - -``` -+-----------------------------------------------------------------------------+ -| NVIDIA-SMI 470.182.03 Driver Version: 470.182.03 CUDA Version: 11.4 | -|-------------------------------+----------------------+----------------------+ -| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | -| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | -| | | MIG M. | -|===============================+======================+======================| -| 0 NVIDIA T400 4GB On | 00000000:01:00.0 Off | N/A | -| 38% 38C P8 N/A / 31W | 3MiB / 3911MiB | 0% Default | -| | | N/A | -+-------------------------------+----------------------+----------------------+ - -+-----------------------------------------------------------------------------+ -| Processes: | -| GPU GI CI PID Type Process name GPU Memory | -| ID ID Usage | -|=============================================================================| -| No running processes found | -+-----------------------------------------------------------------------------+ -``` - -这些的设备以及 nvidia-smi 输出正确的内容后,表示显卡驱动已正确安装并加载。 - -**最后**是对 LXC 容器进行配置 - -宿主机进入 `/etc/pve/lxc/` 找到对应LXC的ID配置文件,打开后在最后一行加入以下内容: - -``` -lxc.cgroup2.devices.allow: c 195:* rwm -lxc.cgroup2.devices.allow: c 506:* rwm -lxc.cgroup2.devices.allow: c 226:* rwm -lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file -lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file -lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file -lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file -lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file -lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir -``` - -这里的 195、506和226就是上面记录下的数值。 -注意这里使用的是 `lxc.cgroup2.devices.allow`, 和我上面博客文章中写的 `lxc.cgroup.devices.allow` 不一致,是因为 PVE 6 升级 7 时,升级说明已经提到了这个写法的变化,应该是博客文章的作者没有更新。 - -到这里宿主机配置应该就全部结束了。下面是 lxc 容器中的配置。 - -## LXC 容器配置 - -**首先**是确认容器的相关设备映射成功。使用 `ls -al /dev/nvidia*` 以及 `ls -al /dev/dri` 命令应该会得到和宿主机一样的输出。 - -**然后**是安装驱动。 - -注意 LXC 容器安装的驱动版本需要和宿主机**完全一致**。并且不能使用内核模块。所以在容器中安装驱动,我没有再使用源来安装,因为源中的驱动不支持指定 `--no-kernel-module` 选项,但是这个选项在 LXC 容器直通显卡时是必须的。 - -所以在容器中通过下载 nvidia 驱动安装文件的方式进行安装。对应的官网地址为 https://www.nvidia.com/en-us/drivers/unix/ ,找到和宿主版本相同的驱动下载即可。我使用的 470.182.03 版本驱动文件下载命令如下 - -``` -wget https://cn.download.nvidia.cn/XFree86/Linux-x86_64/470.182.03/NVIDIA-Linux-x86_64-470.182.03.run -``` - -下载后,添加可执行权限并进行安装。 - -``` -chmod +x NVIDIA-Linux-x86_64-470.182.03.run -./NVIDIA-Linux-x86_64-470.182.03.run --no-kernel-module -``` - -安装驱动后,执行命令 `nvidia-smi` 可以看到输出内容如下 - -``` -+-----------------------------------------------------------------------------+ -| NVIDIA-SMI 470.182.03 Driver Version: 470.182.03 CUDA Version: 11.4 | -|-------------------------------+----------------------+----------------------+ -| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | -| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | -| | | MIG M. | -|===============================+======================+======================| -| 0 NVIDIA T400 4GB Off | 00000000:01:00.0 Off | N/A | -| 38% 38C P8 N/A / 31W | 3MiB / 3911MiB | 0% Default | -| | | N/A | -+-------------------------------+----------------------+----------------------+ - -+-----------------------------------------------------------------------------+ -| Processes: | -| GPU GI CI PID Type Process name GPU Memory | -| ID ID Usage | -|=============================================================================| -| No running processes found | -+-----------------------------------------------------------------------------+ -``` - -证明 LXC 容器中的显卡驱动也正常. 如果 `nvidia-smi` 没有输出,可以尝试下重启 LXC 容器。 - -至此,PVE LXC 容器直通显卡工作就结束了。 diff --git a/_posts/2023-07-02-pve-lxc-install-jellyfin.md b/_posts/2023-07-02-pve-lxc-install-jellyfin.md deleted file mode 100755 index d0961ca1..00000000 --- a/_posts/2023-07-02-pve-lxc-install-jellyfin.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: PVE LXC 安装 Jellyfin -pid: 2023070201 -tags: [Jellyfin, PVE, LXC] ---- - -LXC 容器首先按照昨天讲的 nvidia 显卡直通步骤, 开启显卡直通功能. 下面是安装 Jellyfin 的步骤 - -**首先**是启用 `non-free` 源 - -我使用的是 lxc 容器, 模板是 debian 12, 所以在 debian 的源中, 先启用 `non-free` 源. -在 debian 12中, 原来的 `non-free` 被分为了 `non-free` 和 `non-free-firmware`, 所以将这两部分都启用. - -``` -$ cat /etc/apt/sources.list - -deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware -deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware -deb http://security.debian.org bookworm-security main contrib non-free non-free-firmware -``` - -**然后**是安装 jellyfin - -安装方法参考 jellyfin 官方建议 [Debuntu (Debian, Ubuntu, and derivatives using apt)](https://jellyfin.org/docs/general/installation/linux#debuntu-debian-ubuntu-and-derivatives-using-apt) - -使用 `curl` 执行如下命令 - -``` -curl https://repo.jellyfin.org/install-debuntu.sh | bash -``` - -如果没安装 curl, 可以用 `wget` 执行如下命令 - -``` -wget -O- https://repo.jellyfin.org/install-debuntu.sh | bash -``` - -**最后**想要开启硬件转码功能, 还需要安装 `jellyfin-ffmpeg5` - -``` -apt install jellyfin-ffmpeg5 -``` - -注意这里可能会出错, 源里面有一个 `jellyfin-ffmpeg`, 还有一个 `jellyfin-ffmpeg5`, 按照 jellyfin 官方的说明, 这里应该安装的是 `jellyfin-ffmpeg5`, 如果安装了 `jellyfin-ffmpeg` 会把 `jellyfin` 这个包替换掉 - -安装完毕后, 去 jellyfin 后台开启硬件转码功能即可. jellyfin web 端的端口号是 8096. - -开启路径: `控制台` => `播放` => `硬件加速`. -![](/uploads/2023/07/2023070201-01.png) diff --git a/_posts/2023-07-07-pve-lxc-enable-tailscale-site-to-site-networking.md b/_posts/2023-07-07-pve-lxc-enable-tailscale-site-to-site-networking.md deleted file mode 100644 index 3cc4ad27..00000000 --- a/_posts/2023-07-07-pve-lxc-enable-tailscale-site-to-site-networking.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: PVE LXC 安装 Tailscale 并开启 site-to-site networking -pid: 2023070701 -tags: [PVE, Tailscale, LXC] ---- - -Tailscale 是一个很方便的组网工具, 官方发布了文章介绍 tailscale 的工作原理是什么样的 [How Tailscale works](https://tailscale.com/blog/how-tailscale-works/). - -本篇文章介绍如何在 PVE LXC 容器下安装 tailscale, 并在多个网络之间通过 tailscale 建立 `site-to-site networking` 连接. - -安装 tailscale 时选择的是在 pve 的 lxc 容器而不是通过 docker 安装, 因为我在测试过程中发现使用 docker 安装后, 无法开启 `site-to-site networking`, 具体原因还没搞清楚. - -**首先** 建立 lxc 容器, 并做好相应的配置 -选择新建一个非特权CT容器, 模板我选择的是 `Debian 11(bullseye)`, 建立容器时, 网卡名称最好是叫 `eth0`, 因为后面配置 `site-to-site networking` 时会用到. - -由于是非特权容器, 容器启动后会缺少 tailscale 运行需要的东西, 所以先不启动而是对容器作一些配置修改. - -在 pve 宿主中, 确认 `/dev/net/tun` 存在并获取对应的信息, 具体命令和返回如下 - -``` -root@pve:~# ls -al /dev/net/tun -crw-rw-rw- 1 root root 10, 200 Jun 30 23:08 /dev/net/tun -``` - -记录其中的 `10, 200` 这两个数字, 后面需要用到. - -然后修改 `/etc/pve/lxc/CTID.conf` 文件, 新增如下两行 - -``` -lxc.cgroup2.devices.allow: c 10:200 rwm -lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file -``` - -上面的 `10:200` 需要和前面使用 `ls -al /dev/net/tun` 获取的结果对应起来. - -配置完成后启动容器, 然后按照 tailscale 官方的文档安装 tailscale. 具体文档可查看 [Setting up Tailscale on Debian Bullseye](https://tailscale.com/kb/1038/install-debian-bullseye/) - -**然后** 是开启 lxc 的 IP 转发功能 - -编辑 `/etc/sysctl.conf` 文件, 将以下两行的注释去掉. 如果没有这两行, 需要添加 - -``` -net.ipv4.ip_forward=1 -net.ipv6.conf.all.forwarding=1 -``` - -编辑完成后, 使用 `sysctl` 命令 reload - -``` -sysctl -p /etc/sysctl.conf -``` - -**然后** 是启动 tailscale -由于是两个网络之间建立 `site-to-site networking`, 所以我这边会以两个网络举例. - -网络 A 为 `192.168.100.0/24`, 安装 tailscale 的机器 A IP 为 `192.168.100.16`, 网络 B 为 `192.168.88.0/24`, 安装 tailscale 的机器 B IP 为 `192.168.88.16`. - -机器 A 执行命令 -``` -tailscale up --authkey=xxxxx --accept-routes --advertise-routes=192.168.100.0/24 --hostname=tailscale-A -``` - -机器 B 执行命令 -``` -tailscale up --authkey=xxxxx --accept-routes --advertise-routes=192.168.88.0/24 --hostname=tailscale-B -``` - -上面 `--autkey=xxx` 中的 `xxxxx` 需要替换为 tailscale 后台生成的 authkey. 如果 authkey 没有配置 `autoApprovers` 的话, 需要到 tailscale 后台开启`子网路由(subnet router)` 功能, 将各自所在的子网暴露给 tailscale 虚拟局域网. autoApprovers 可以查看文档 [Auto Approvers for routes and exit nodes](https://tailscale.com/kb/1018/acls/#auto-approvers-for-routes-and-exit-nodes). - -此时机器 A 和 B 都已经处于 tailscale 虚拟局域网中, 机器 A 可以访问网络 B 中的所有设备, 机器 B 也可以访问网络 A 中的所有设备. - -**然后** 是开启 `site-to-site networking` - -`site-to-site networking` 能实现的效果是: 机器 A 和 B 安装了 tailscale, 他们就可以做为两个网络的桥梁, 允许两个网络中未安装 tailscale 的设备通过两个安装了 tailscale 设备的桥接, 实现互访. 官方文档 [Site-to-site networking](https://tailscale.com/kb/1214/site-to-site/). - -机器 A 执行命令 -``` -iptables -t mangle -A FORWARD -i tailscale0 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu -``` - -机器 B 执行命令 -``` -iptables -t mangle -A FORWARD -i tailscale0 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu -``` - -然后需要做的就是在每个网络的网关配置到另一个网络的静态路由. 以我使用的 RouterOS 路由器为例 - -网络 A 网关执行命令 -``` -/ip route add dst-address=192.168.88.0/24 gateway=192.168.100.16 -/ip route add dst-address=100.64.0.0/10 gateway=192.168.100.16 -``` - -网络 B 网关执行命令 -``` -/ip route add dst-address=192.168.100.0/24 gateway=192.168.88.16 -/ip route add dst-address=100.64.0.0/10 gateway=192.168.100.16 -``` - -100.64.0.0/10 是 tailscale 固定的子网. - -此时正常情况下, 网络 A 和 B 中未安装 tailscale 的设备就可以访问对方网络中的服务了. - -**最后** 是一些说明 - -在官方的 [Site-to-site networking](https://tailscale.com/kb/1214/site-to-site/) 文档中, 有一个 `--snat-subnet-routes=false` 的选项, 我实践之后发现, 如果加了这个选项, 会导致所有请求都不通. 但是不加这个选项, 互访是正常的, 只是有一些小瑕疵. 网络 A 请求网络 B 中的服务时, 服务看到的来源 IP 会是网络 B 中安装了 tailscale 那台机器的 IP, 网络 B 请求网络 A 中的服务时, 服务看到的来源 IP 会是网络 A 中安装了 tailscale 那台机器的 IP. 如果对这个小的细节没有要求的话, 则不需要深究了. - diff --git a/_posts/2023-07-10-tailscale-systemd-autostart.md b/_posts/2023-07-10-tailscale-systemd-autostart.md deleted file mode 100644 index 6136d3dd..00000000 --- a/_posts/2023-07-10-tailscale-systemd-autostart.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: tailscale 使用 systemd 开机自动启动 -pid: 2023071001 -tags: [Tailscale, Systemd] ---- - -上篇讲了如何在 lxc 容器中安装 tailscale 并运行. 由于 tailscale 安装后没有自带自启动脚本, 所以本篇介绍如何使用 systemd 自动启动 tailscale, 防止服务器重启后 tailscale 断连. - -**首先**创建 systemd unit 文件内容如下 - -``` -[Unit] -Description=AutoStart tailscale -After=tailscaled.service -Requires=tailscaled.service - -[Service] -EnvironmentFile=/path/to/envfile -Type=oneshot -ExecStart=/usr/bin/tailscale up --authkey=${TAILSCALE_AUTHKEY} --accept-routes --advertise-routes=${TAILSCALE_ROUTES} --hostname=${TAILSCALE_HOSTNAME} -ExecStop=/usr/bin/tailscale down -RemainAfterExit=yes -Restart=on-failure - -[Install] -WantedBy=multi-user.target -``` - -`EnvironmentFile` 文件中定义的是 `ExecStart` 命令中用到的一些环境变量, 上面的例子中有 `TAILSCALE_AUTHKEY`, `TAILSCALE_ROUTES` 和 `TAILSCALE_HOSTNAME` 3 个变量. - -systemd unit 文件的写法参考了阮一峰博客中关于 systemd 的讲解, 文章链接 [Systemd 入门教程:实战篇](https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html) - -**然后** 是配置步骤 - -1. 将 systemd unit 文件链接到正确的位置上, `/path/to/tailscale.service` 就是 system unit 文件所在的位置 - ``` - ln -s /path/to/tailscale.service /etc/systemd/system/ - ``` -2. 启用自动运行 - ``` - systemctl enable tailscale.service - ``` -3. 由于自动运行只有在下次启动后才生效, 所以本次使用 start 命令先启动. - ``` - systemctl start tailscale.service - ``` \ No newline at end of file diff --git a/_posts/2023-07-16-pve-lxc-enable-zerotier-site-to-site-networking.md b/_posts/2023-07-16-pve-lxc-enable-zerotier-site-to-site-networking.md deleted file mode 100644 index c1baff65..00000000 --- a/_posts/2023-07-16-pve-lxc-enable-zerotier-site-to-site-networking.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: PVE LXC 安装 ZeroTier 并开启 site-to-site networking -pid: 20230701601 -tags: [ZeroTier, PVE, LXC] ---- - -前面两篇介绍了如何在 PVE LXC 容器下安装 tailscale 并开启 `site-to-site networking`. - -和 tailscale 齐名的就是 zerotier 了, 所以本篇来介绍一下在 PVE LXC 容器下怎么安装 zerotier, 标题中的 `site-to-site networking` 是我复用了 tailscale 里的名称, 因为我希望在 zerotier 中也实现一样的效果. - -**首先** 建立 lxc 容器, 并做好相应的配置 -选择新建一个非特权CT容器, 模板我选择的是 `Debian 11(bullseye)`, 建立容器时, 网卡名称最好是叫 `eth0`, 因为后面配置 `site-to-site networking` 时会用到. - -由于是非特权容器, 容器启动后会缺少 zerotier 运行需要的东西, 所以先不启动而是对容器作一些配置修改. - -在 pve 宿主中, 确认 `/dev/net/tun` 存在并获取对应的信息, 具体命令和返回如下 - -``` -root@pve:~# ls -al /dev/net/tun -crw-rw-rw- 1 root root 10, 200 Jun 30 23:08 /dev/net/tun -``` - -记录其中的 `10, 200` 这两个数字, 后面需要用到. - -然后修改 `/etc/pve/lxc/CTID.conf` 文件, 新增如下两行 - -``` -lxc.cgroup2.devices.allow: c 10:200 rwm -lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file -``` - -上面的 `10:200` 需要和前面使用 `ls -al /dev/net/tun` 获取的结果对应起来. - -**然后** 是开启 lxc 的 IP 转发功能 - -启动 lxc 容器后, 编辑 `/etc/sysctl.conf` 文件, 将以下两行的注释去掉. 如果没有这两行, 需要添加 - -``` -net.ipv4.ip_forward=1 -net.ipv6.conf.all.forwarding=1 -``` - -编辑完成后, 使用 `sysctl` 命令 reload - -``` -sysctl -p /etc/sysctl.conf -``` - -**然后** 是安装 zerotier - -``` -apt update && apt install curl pgp iptables iptables-persistent -curl -s https://install.zerotier.com | bash -``` - -如果你的源速度比较慢, 可以先换成速度比较快的源再安装. - -**然后** 是加入 zerotier 网络 - -``` -zerotier-cli join -``` - -如果是加入的一个 `private network`, 需要在 zerotier 后台点击允许, 可以按需分配一个IP地址. 至于 zerotier 如何创建网络并选择子网前缀这些我就不再讲了. - -**然后** 是开启 `site-to-site networking` - -zerotier 官方文档地址 [Route between ZeroTier and Physical Networks](https://docs.zerotier.com/route-between-phys-and-virt/), 下面的内容是结合官方文档以及个人的实际情况举例. - -由于是两个网络之间建立 `site-to-site networking`, 所以我这边会以两个网络举例. - -网络 A 为 `192.168.100.0/24`, 安装 zerotier 的机器 A IP 为 `192.168.100.17`, 网络 B 为 `192.168.88.0/24`, 安装 zerotier 的机器 B IP 为 `192.168.88.17`. - -在 zerotier 后台配置到两个网络的静态路由, 我给两个 zerotier 客户端分配的IP分别为 `10.244.100.17` 和 `10.244.88.17`, 在 zerotier 后台配置静态路由如下 - -``` -10.244.0.0/16 (LAN) # 这条是选择 zerotier 子网前缀后自动生成的 -192.168.100.0/24 via 10.244.100.17 -192.168.88.0/24 via 10.244.88.17 -``` - -**然后** 是客户端配置 iptables - -通过 `ip a` 命令可以查询到 zerotier 虚拟网卡的名称是什么, 这里假设 zerotier 网卡名称为 `ztabcdef`, 物理网卡名称为 `eth0`. 对以下变量进行赋值 - -``` -PHY_IFACE=eth0; ZT_IFACE=ztabcdef -``` - -分别在两个 zerotier 客户端上运行下面 3 条 iptables 规则. - -``` -iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE -iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT -iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT -``` - -**然后** 是配置各个子网的静态路由. - -在两个网络的网关(路由器)中, 分别添加一条到另一个网络的静态路由, 分别指向 `192.168.100.17` 以及 `192.168.88.17` 中. 我的网关是 RouterOS 路由器, 以 RouterOS 路由器举例 - -网络 A 网关执行命令 -``` -/ip route add dst-address=192.168.88.0 gateway=192.168.100.17 -``` - -网络 B 网关执行命令 -``` -/ip route add dst-address=192.168.100.0 gateway=192.168.88.17 -``` - -此时正常情况下, 网络 A 和 B 中未安装 zerotier 的设备就可以访问对方网络中的服务了. - -**最后** 是固化 iptables 规则, 方便重启后规则仍然生效 - -由于之前已经安装了 iptables-persistent, 所以可以把 iptables 规则固化到 `/etc/iptables/rules.v4` 文件中, 重启后 iptables-persistent 会自动读取这个文件并执行相应的规则. 执行如下命令 - -``` -iptables-save > /etc/iptables/rules.v4 -``` - -执行命令后, 查看 `/etc/iptables/rules.v4` 文件就可以看到对应的内容. \ No newline at end of file diff --git a/_posts/2023-07-17-systemd-start-ssh-agent.md b/_posts/2023-07-17-systemd-start-ssh-agent.md deleted file mode 100644 index 144cd01c..00000000 --- a/_posts/2023-07-17-systemd-start-ssh-agent.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: 使用 systemd 自动启动 ssh-agent -pid: 20230701701 -tags: [Systemd, SSH] ---- - -最近在整理自己的 sshkey, 看了网上大家的讨论, 虽然 sshkey 普遍用在无密码登录场景, 但是最好也给 sshkey 加一个密码. 加密码的好处是为了更好的安全性, 即使密钥丢失, 没有密码也可以保证安全. 至于 ssh 连接时需要输入密码的问题, 可以使用 ssh-agent 来解决. - -所以搜索了一些关于 ssh-agent 的知识, 打算重新生成一批 sshkey 并添加密码, 然后交给 ssh-agent 进行管理. - -本文记录一下在 linux 中如何使用 systemd 在用户登录时自动启动 ssh-agent 并常驻后台, 方便 ssh 连接时进行使用. - -**首先** 是新建 systemd unit `~/.config/systemd/user/ssh-agent.service` 文件如下 -``` -[Unit] -Description=SSH key agent - -[Service] -Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket -ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK -# ExecStartPost=/usr/bin/ssh-add -t 1h - -[Install] -WantedBy=default.target -``` - -由于是 systemd用户服务单元, 所以创建位置为 `~/.config/systemd/user/ssh-agent.service`. - -当设置 `Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket` 时,它将为systemd用户服务单元中的 `SSH_AUTH_SOCK` 环境变量指定一个特定的值。设置`SSH_AUTH_SOCK` 环境变量为 `%t/ssh-agent.socket` 的目的是告诉SSH客户端在与ssh-agent进行通信时使用这个套接字文件。SSH客户端将通过该套接字与ssh-agent建立连接,以请求私钥并进行身份验证。`%t` 是systemd的一个模式,代表了服务单元的运行时目录。对于用户服务单元,`%t` 指代了当前用户的运行时目录。对于用户服务单元,`%t` 通常会被替换为当前用户的运行时目录, 用户运行时目录的默认位置是` /run/user/`,其中 `` 是当前用户的用户ID. 因此,当使用`%t` 模式时,例如 `%t/ssh-agent.socket` ,它将被展开为当前用户的运行时目录加上后续的路径。例如,如果当前用户的用户ID是1000,那么 `%t/ssh-agent.socket` 会被展开为 `/run/user/1000/ssh-agent.socket`. - -`ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK` 的作用是让 ssh-agent 以守护进程(daemon)模式运行. - -`ssh-add -t 1h` 命令,它的作用是将私钥添加到ssh-agent代理中,并设置私钥的有效时间为1小时(1h)。这样,在成功登录到远程服务器后,私钥将在ssh-agent中保持有效状态1小时,而无需再次输入密码。此功能可以提高安全性,因为私钥在有效时间过后将自动从代理中移除,减少了私钥长时间暴露在内存中的风险。一旦有效时间到期,就需要重新输入密码来重新加载私钥到ssh-agent,以继续使用该私钥进行SSH连接。 - -但是看上面 `ExecStartPost` 被注释掉了,在这里被注释的原因是,如果私钥都是无密码的那就没问题,但是如果私钥是有密码的,那么这个命令会出现一个输入密码的 prompt, 由于 systemd 无法输入密码, 所以会导致启动失败,因此 `ExecStartPost` 在这里注释掉。 - -当 ssh-agent 启动成功后,后续可以执行 `ssh-add` 命令,手动将 `~/.ssh` 目录下的私钥添加到 ssh-agent 中并输入密码。添加成功后, 后续再通过 ssh 连接时就不需要输入密码了。 - -**然后** 是配置 ssh 使用 ssh-agent - -配置 ssh 使用 ssh-agent 有两种方案 - -第一种方案是在 shell 启动时, 执行 `eval $(ssh-agent -s)`. - -`ssh-agent -s` 输出内容如下所示 -``` -SSH_AUTH_SOCK=/var/folders/g9/yczk5ymn4k16g211z5pn9bdr0000gn/T//ssh-HPXEJnNTleTH/agent.21286; export SSH_AUTH_SOCK; -SSH_AGENT_PID=21287; export SSH_AGENT_PID; -echo Agent pid 21287; -``` - -但是如果通过 `eval` 执行, 就会在 shell 中输出一名话 `Agent pid 21287`. 所以看起来可能会比较烦. - -另一种方案是 `.bashrc` 等文件中对 `SSH_AUTH_SOCK` 变量进行赋值. - -在上面 systemd unit 文件中, 使用了 `Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket` 指定 socket 路径, 所以可以在 `.bashrc` 等文件中使用 `export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/ssh-agent.socket"` 来指定环境变量以便 ssh 来读取. - -`XDG_RUNTIME_DIR` 是一个环境变量,用于指定当前用户的运行时目录(runtime directory)。该目录用于存储运行时数据,例如套接字文件、临时文件等。一般情况下,`XDG_RUNTIME_DIR` 的值是 `/run/user/` ,其中 `` 是当前用户的用户ID。可以看到 `XDG_RUNTIME_DIR` 和 systemd unit 文件中的 `%t` 定义基本一致. - -如果你的系统没有 `XDG_RUNTIME_DIR` 这个变量, 那就执行一下 `ssh-agent -s` 看下 `SSH_AUTH_SOCK` 的值是多少, 写到 `.bashrc` 等文件里就行了. - -**最后** 是使服务单元生效。 - -在终端中运行以下命令: - -``` -systemctl --user enable ssh-agent -``` - -这将使 `ssh-agent.service` 成为用户的默认服务。 - -启动服务。在终端中运行以下命令: - -``` -systemctl --user start ssh-agent -``` - -这将启动 ssh-agent 并将其绑定到 `SSH_AUTH_SOCK` 路径。 - -现在,当登录到用户帐户时,ssh-agent 将自动启动,并且可以通过 `ssh-add` 命令添加私钥并将其保存在代理中。这样,在使用 ssh 连接到远程服务器时将不再需要每次输入密码。 - ---- - -**后记** - -在 PVE LXC 容器中, 由于是使用的 root 用户登录,按照上面的步骤配置时, 当执行 `systemctl --user enable ssh-agent` 时会遇到报错 - -``` -Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=@.host --user to connect to bus of other user) -``` - -此时可以选择直接以 root 用户身份运行 ssh-agent. - -systemd unit 文件 `/etc/systemd/system/ssh-agent.service` 内容如下 - -``` -[Unit] -Description=SSH key agent - -[Service] -Environment=SSH_AUTH_SOCK=/var/run/user/ssh-agent.socket -ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK -# ExecStartPost=/usr/bin/ssh-add -t 1h - -[Install] -WantedBy=default.target -``` - -systemd 启用命令 - -``` -systemctl enable ssh-agent.service -systemctl start ssh-agent.service -``` \ No newline at end of file diff --git a/_posts/2024-04-08-after-pve-reinstall.md b/_posts/2024-04-08-after-pve-reinstall.md deleted file mode 100755 index f67265a1..00000000 --- a/_posts/2024-04-08-after-pve-reinstall.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: PVE 重装后做的几件事 -pid: 2024040801 -tags: [PVE] ---- - -# 背景 -小区楼要更新配电箱, 所以需要进行断电. 在断电前我把 PVE 关机. 但是在来电后, 重启 PVE 失败. 经过排查后发现是 PVE 的系统 U 盘损坏. -经过 fsck 检查后, 仍然无法启动. 正好手头有一个备用 U 盘, 所以只好重装 PVE 系统. - -之前 PVE 系统是 7.x, 这次就趁机会直接安装最新的 8.x 版本. 安装后当然所有的虚拟机及相关配置都没有了. - -但是因为所有的虚拟机及lxc 容器都单独放在了一个硬盘上, 接下来需要做的就是将这些虚拟机及 lxc 容器进行恢复. - -# 恢复虚拟机数据磁盘及备份磁盘自动挂载 -系统重装完成后, 共有 2 块 nvme 硬盘, 再加一个 sata 控制器下的两个 hdd 硬盘. 现在要做的是把这 2 块 nvme 硬盘挂载到 PVE 系统中作为镜像盘和备份盘. - -如果是未使用的磁盘, 可以直接在 PVE 中配置挂载. 但是因为磁盘是已经使用过的, 所以就不能在 PVE 中配置自动挂载, 而要手动处理了. -![](/uploads/2024/04/2024040801-01.png) - -PVE 配置自动挂载实际是使用的 systemd 的功能, 所以手动挂载也是一样的. - -1. 在 `/mnt/pve/` 下新建 `nvme0` 及 `nvme1` 两个空目录作为挂载点. - - ```shell - mkdir -p /mnt/pve/nvme0 - mkdir -p /mnt/pve/nvme1 - ``` -2. 在 `/etc/systemd/system` 上分别新建 `mnt-pve-nvme0.mount` 及 `mnt-pve-nvme1.mount` 文件, 用于 systemd 挂载磁盘. - - `mnt-pve-nvme0.mount` 内容如下 - ``` - [Install] - WantedBy=multi-user.target - - [Mount] - Options=defaults - Type=ext4 - What=/dev/disk/by-uuid/d9b8de77-2020-4b27-b213-8a3158acda69 - Where=/mnt/pve/nvme0 - - [Unit] - Description=Mount storage 'nvme0' under /mnt/pve - ``` - - `mnt-pve-nvme1.mount` 内容如下 - ``` - [Install] - WantedBy=multi-user.target - - [Mount] - Options=defaults - Type=ext4 - What=/dev/disk/by-uuid/e6dc0972-1361-4502-b5cc-596e6eb7be88 - Where=/mnt/pve/nvme1 - - [Unit] - Description=Mount storage 'nvme1' under /mnt/pve - ``` - - 上面文件中的 by-uuid 后面的一串 uuid 可以通过命令查到 - - ```shell - $ ls -al /dev/disk/by-uuid/ - total 0 - drwxr-xr-x 2 root root 180 Apr 7 20:00 . - drwxr-xr-x 7 root root 140 Mar 28 22:56 .. - lrwxrwxrwx 1 root root 15 Mar 28 22:52 d9b8de77-2020-4b27-b213-8a3158acda69 -> ../../nvme1n1p1 - lrwxrwxrwx 1 root root 15 Mar 28 22:52 e6dc0972-1361-4502-b5cc-596e6eb7be88 -> ../../nvme0n1p1 - ``` - - 可以看到两块硬盘的 uuid 分别是什么, 填写到上面的 systemd 配置文件中即可. - - 那么如何确定上面的 `nvme1n1p1` 和 `nvme0n1p1` 分别是哪块硬盘呢. 这个可以到 PVE web ui 中查看. 可能通过磁盘大小, 以及型号确定对应的硬盘. - - ![](/uploads/2024/04/2024040801-02.png) -3. 设置自动挂载配置文件生效 - - ```shell - systemctl enable --now mnt-pve-nvme0.mount - systemctl enable --now mnt-pve-nvme1.mount - ``` - - 命令运行成功后, 正常情况下就可以在 PVE webui 中看到已经挂载好的目录了. - - ![](/uploads/2024/04/2024040801-05.png) - - 通过 systemd 命令也可以查看状态 - - ``` - $ systemctl status mnt-pve-nvme0.mount - ● mnt-pve-nvme0.mount - Mount storage 'nvme0' under /mnt/pve - Loaded: loaded (/etc/systemd/system/mnt-pve-nvme0.mount; enabled; preset: enabled) - Active: active (mounted) since Thu 2024-03-28 22:52:33 CST; 1 week 3 days ago - Where: /mnt/pve/nvme0 - What: /dev/nvme1n1p1 - Tasks: 0 (limit: 18888) - Memory: 1008.0K - CPU: 24ms - CGroup: /system.slice/mnt-pve-nvme0.mount - - Mar 28 22:52:33 pve systemd[1]: mnt-pve-nvme0.mount: Directory /mnt/pve/nvme0 to mount over is not empty, mounting anyway. - Mar 28 22:52:33 pve systemd[1]: Mounting mnt-pve-nvme0.mount - Mount storage 'nvme0' under /mnt/pve... - Mar 28 22:52:33 pve systemd[1]: Mounted mnt-pve-nvme0.mount - Mount storage 'nvme0' under /mnt/pve. - ``` - -4. 完成镜像盘和备份盘的挂载后, 下一步是配置数据中心的存储 - - ![](/uploads/2024/04/2024040801-03.png) - - ![](/uploads/2024/04/2024040801-04.png) - - 在添加目录时, id 我输入的是 `nvme0` 和 `nvme1`, 目录我输入的是 `/mnt/pve/nvme0` 和 `/mnt/pve/nvme1`. 内容选择好目录对应的存储类型即可. 我的 nvme0 负责硬盘映像和模板, nvme1 负责备份文件. - - -# 恢复 sata 控制器直通 -恢复完了磁盘挂载, 正常来说下一步是恢复虚拟机和 lxc 容器了. 但是由于我的其中一个虚拟机直通了 sata 控制器, 所以还需要进行一些额外的处理 - -sata 控制器的直通, 可以查看之前已经写的文章 [PVE 启用 IOMMU 功能为虚拟机开启 sata 控制器直通]({% post_url 2023-05-16-pve-enable-iommu-and-sata-controller-passthrough %}) - -# 恢复虚拟机及容器 -这个没有什么需要说的, 我的 PVE 虚拟机开启了自动备份, 备份位置是一块单独的硬盘. 所以重装 PVE 系统后, 通过上面的操作重新挂载硬盘后, 就可以到备份盘中将需要的虚拟机有 lxc 容器进行恢复了. - -PVE 开启自动备份位置及相关配置如下图 - -![](/uploads/2024/04/2024040801-06.png) - -![](/uploads/2024/04/2024040801-07.png) \ No newline at end of file diff --git a/_posts/2024-04-14-lxc-mount-host-dir.md b/_posts/2024-04-14-lxc-mount-host-dir.md deleted file mode 100644 index 03a20a9f..00000000 --- a/_posts/2024-04-14-lxc-mount-host-dir.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: PVE lxc 容器挂载宿主目录 -pid: 2024041401 -tags: [PVE, lxc] ---- - -**命令行方式**, 在 PVE shell 中运行以下命令 - -``` -pct set PID -mp0 /path/to/host/dir0,mp=/path/to/lxc/dir0 -pct set PID -mp1 /path/to/host/dir1,mp=/path/to/lxc/dir1 -``` - -`-mp0`, `-mp1` 指对 lxc 容器设置的第几个文件夹. 从 `mp0` 开始, 依次递增. - -`mp=` 后面的路径表示在 lxc 容器中的位置. - -**直接修改配置文件方式**, 除命令行方式外, 还可以直接修改 lxc 窗口的配置文件 - -``` -$ cat 510.conf -arch: amd64 -cores: 1 -hostname: JellyfinServer -memory: 512 -mp0: /mnt/pve/path0/,mp=/mnt/path0 -mp1: /mnt/pve/path1/,mp=/mnt/path1 -``` - -返回结果中的 `mp0`, `mp1` 就是已经配置的内容. diff --git a/_posts/2024-04-14-pve-remove-local-lvm.md b/_posts/2024-04-14-pve-remove-local-lvm.md deleted file mode 100755 index 380b7220..00000000 --- a/_posts/2024-04-14-pve-remove-local-lvm.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: PVE删除local-lvm,并把空间合并到local -pid: 2024041402 -tags: [PVE] ---- - -PVE 安装完系统后, 会自动把系统所在硬盘划分为 `local` 和 `local-lvm` 两个部分, 但是有时候并不需要 `local-lvm`, 那么应该如何删掉 `local-lvm`, 然后把原来 `local-lvm` 占用的空间和 `local` 进行合并呢. - -**提醒**: 由于 `local-lvm` 默认是用来存储虚拟机镜像的, 所以如果已经有存在的虚拟机并且存储位置正好是 `local-lvm`, 就需要先进行虚拟机备份, 待操作完成后再进行恢复. -因为删掉 `local-lvm` 后, 原来的虚拟机都会消失. - -下面开始进行操作. - -**首先**编辑 `local`, 将原来 `local-lvm` 存储的内容和 `local` 进行合并. - -可以直接通过 webui 进行操作, 如下图 - -![](/uploads/2024/04/2024041402-01.jpg) - -也可以直接编辑 `/etc/pve/storage.cfg` 文件, 将 `local-lvm` 部分的 content 内容 `rootdir,images` 两项与 `local` 的 content 内容进行合并, 然后删掉 `local-lvm` 相关配置. - -``` -$ cat /etc/pve/storage.cfg -dir: local - path /var/lib/vz - content vztmpl,backup,iso,rootdir,images -``` - -**然后**执行如下命令, 删掉 `local-lvm` - -``` -lvremove pve/data -``` - -**然后**将剩余空间全部扩充到 local 中 - -``` -lvextend -l+100%FREE /dev/mapper/pve-root -resize2fs /dev/mapper/pve-root -``` - -**然后**到数据中心中, 删掉 `local-lvm` 所在的目录配置即可. -![](/uploads/2024/04/2024041402-02.jpg) - -**最后** 可以通过 `lvs` 或者 `df -h` 命令确认新的空间分布情况. - -``` -$ lvs - LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert - root pve -wi-ao---- <25.25g - swap pve -wi-ao---- 3.50g -``` - -``` -$ df -h -Filesystem Size Used Avail Use% Mounted on -udev 7.7G 0 7.7G 0% /dev -tmpfs 1.6G 1.3M 1.6G 1% /run -/dev/mapper/pve-root 25G 5.4G 19G 23% / -tmpfs 7.8G 46M 7.7G 1% /dev/shm -tmpfs 5.0M 0 5.0M 0% /run/lock -efivarfs 512K 115K 393K 23% /sys/firmware/efi/efivars -``` - -参考文章: [https://gist.github.com/dergachev/6828967](https://gist.github.com/dergachev/6828967) diff --git a/_posts/2024-04-21-pve-harddisk-passthrough.md b/_posts/2024-04-21-pve-harddisk-passthrough.md deleted file mode 100755 index 1fe97afb..00000000 --- a/_posts/2024-04-21-pve-harddisk-passthrough.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Proxmox VE直通硬盘(全盘映射方式) -pid: 2024042101 -tags: [PVE] ---- - -使用PVE有时为了方便,需要将硬盘直通,一般有两种方式,一是硬件直通,一是全盘映射,这里介绍第二种,方法如下: - -**一、打开PVE管理网页Shell** - -输入 - -```shell -ls /dev/disk/by-id -``` - -查看存储设备的id - -![](/uploads/2024/04/2024042101-01.png) - -图上划红线即为硬盘ID号,复制下来 - -**二、硬盘映射** - -**注意:这里需要将100换成虚拟机的真实ID,sata1这里也可以换成未占用的id数(PVE支持satat0-5)** - -```shell -qm set 100 -sata1 /dev/disk/by-id/ata-WDC_XXXX_XXXX_XXXX -``` - -如果返回以下信息,说明已成功映射 - -```shell -update VM 100: -sata1 /dev/disk/by-id/ata-WDC_XXXX_XXXX_XXXX -``` - -**三、确定是否成功** - -进入PVE对应虚拟机的硬件页面,查看是否硬盘是否已经在虚拟机里,如图所示说明已成功,这时打开虚拟机就能找到对应硬盘。 - -![](/uploads/2024/04/2024042101-02.png) diff --git a/_posts/2024-04-22-pve-lxc-docker-nvidia-gpu.md b/_posts/2024-04-22-pve-lxc-docker-nvidia-gpu.md deleted file mode 100755 index 579eb4c0..00000000 --- a/_posts/2024-04-22-pve-lxc-docker-nvidia-gpu.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: 为 PVE lxc 中的 docker 容器添加 nvidia GPU 支持 -pid: 2024042201 -tags: [PVE, lxc, nvidia, docker] ---- - -本篇介绍如何在 lxc 容器中的 docker 容器中能够使用 nvidia GPU. 如果可以在 docker 容器中使用 nvidia GPU, 那么就可以在 docker 容器中安装 jellyfin 并启用硬件转码了. - -之前写过一篇在 PVE lxc 中直接通过 linux 包管理工具安装 jellyfin 的文章 [PVE LXC 安装 Jellyfin]({% post_url 2023-07-02-pve-lxc-install-jellyfin %}), 如果不需要在 docker 中安装 jellyfin 的话可以进行参考. - -在 lxc 容器中的 docker 容器中使用 nvidia GPU, 首先需要在 lxc 容器中安装 nvidia 显卡驱动, 之前也写过一篇文章 [PVE LXC 容器直通 Nvidia 显卡]({% post_url 2023-07-01-pve-lxc-nvidia-gpu-passthrough %}), 可以进行参考. - -下面开始介绍如何为 docker 容器添加 nvidia GPU 支持. 安装过程参考了 nvidia 的官方文档 . - -**首先**执行以下命令为 apt 添加 `nvidia-container-toolkit` 源信息 - -```shell -curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg -curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | tee /etc/apt/sources.list.d/nvidia-container-toolkit.list -``` - -**然后**更新 apt 并安装 `nvidia-container-toolkit`. 这里官方文档里只写了安装 `nvidia-container-toolkit`, 实测 `nvidia-container-runtime` 也是需要安装的. - -```shell -apt update -apt install nvidia-container-toolkit nvidia-container-runtime -``` - -**然后**是配置 `nvidia-container-runtime` - -```shell -nvidia-ctk runtime configure --runtime=docker -``` - -运行此命令会在 `/etc/docker/daemon.json` 中写入 nvidia runtime 相关信息. - -**然后**是重启 docker. - -```shell -systemctl restart docker.service -``` - -**最后**是验证 nvidia GPU 是否正常使用 - -通过上面一系列操作, 此时 `nvidia-container-toolkit` 相关配置已经完成, 可以通过下面的命令, 对 docker 中的 nvidia GPU 进行测试. 官方的测试命令如下 - -```shell -docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi -``` - -由于我是需要在 docker 中安装 jellyfin, 并且 ubuntu 镜像比较大下载时间较长, 所以我直接用了 jellyfin 镜像来测试. 测试方法是先在后台运行一个 jellyfin 容器, 然后通过 `docker exec` 连接到 jellyfin 容器并运行 `nvidia-smi` 命令, 查看输出结果. - -```shell -docker run --rm --name jellyfin-test --runtime=nvidia --gpus all -d jellyfin/jellyfin -docker exec -it jellyfin-test nvidia-smi -``` - -我在运行上面第一条命令时, 遇到了错误, 错误信息如下 - -``` -Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy' -nvidia-container-cli: mount error: failed to add device rules: unable to find any existing device filters attached to the cgroup: bpf_prog_query(BPF_CGROUP_DEVICE) failed: operation not permitted: unknown -``` - -通过搜索找到了下面的两篇讨论, 参考了其中的一个方案, 并成功解决. 相关文档 - -- -- - -修复方案就是在 lxc 容器下修改 `nvidia-container-runtime` 配置文件 `/etc/nvidia-container-runtime/config.toml`, 将其中的 `# no-cgroups = false` 修改为 `no-cgroups = true`. - -通过上面的修复后, 重新启动 docker, 并再次测试 - -```shell -systemctl restart docker.service -docker run --rm --name jellyfin-test --runtime=nvidia --gpus all -d jellyfin/jellyfin -docker exec -it jellyfin-test nvidia-smi -``` - -如果输出类似下面的内容, 就表示 docker 容器中的 nvidia GPU 可以正常使用了 - -``` -+-----------------------------------------------------------------------------+ -| NVIDIA-SMI 525.147.05 Driver Version: 525.147.05 CUDA Version: 12.0 | -|-------------------------------+----------------------+----------------------+ -| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | -| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | -| | | MIG M. | -|===============================+======================+======================| -| 0 NVIDIA T400 4GB Off | 00000000:01:00.0 Off | N/A | -| 38% 32C P8 N/A / 31W | 1MiB / 4096MiB | 0% Default | -| | | N/A | -+-------------------------------+----------------------+----------------------+ - -+-----------------------------------------------------------------------------+ -| Processes: | -| GPU GI CI PID Type Process name GPU Memory | -| ID ID Usage | -|=============================================================================| -| No running processes found | -+-----------------------------------------------------------------------------+ -``` diff --git a/_posts/2024-04-23-unprevileged-lxc-mount-host-cifs-nobody.md b/_posts/2024-04-23-unprevileged-lxc-mount-host-cifs-nobody.md deleted file mode 100644 index 1dddabbe..00000000 --- a/_posts/2024-04-23-unprevileged-lxc-mount-host-cifs-nobody.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: PVE LXC 非特权容器挂载宿主 cifs 目录权限 nobody 问题解决方案 -pid: 2024042301 -tags: [PVE, lxc] ---- - -之前写过一篇文章 [PVE lxc 容器挂载宿主目录]({% post_url 2024-04-14-lxc-mount-host-dir %}) 介绍如何在 lxc 容器中挂载宿主目录. - -在安装 jellyfin 时需要将宿主机中的 cifs 目录挂载到 lxc 容器中, 但是在 lxc 容器中通过 `ls -al` 命令查看挂载的目录, 可以发现权限属于 `nobody:nogroup`, 所以在 lxc 容器中是无法对挂载的目录中的文件进行修改的. - -那么出现这种情况的原因是什么呢. lxc 非特权容器使用了新内核特性 user namespaces, 所有的容器内部 UID(用户 ID)和 GID(组 ID)都被映射到了宿主机上不同的ID,通常 root(UID 0)变成了 100000,1 变成了 100001, 依此类推. 挂载的目录在宿主机中的权限为 `0:0`, 而 lxc 容器在宿主中的权限实际为 `100000:100000`, 当然 lxc 容器就没有权限对目录中的内容进行修改了. - -下面介绍如何配置能在 lxc 容器中对挂载的目录进行修改, 参考了 PVE 官方文档 [Unprivileged LXC containers](https://pve.proxmox.com/wiki/Unprivileged_LXC_containers) 以及博客文章 [LXC非特权容器绑定宿主机目录nobody](http://www.icharm.me/unprivileged-lxc/index.zh-cn.html), 针对我的使用场景进行了一些细微的修改. - -**首先** 在宿主机中创建用户和用户组 `lxc_root`, 方便后面使用. 由于在宿主机中新建用户默认是从 1000 开始. 为了防止和普通用户冲突我这里设置 `lxc_root` 使用的 uid 和 gid 都是 2000. - -```shell -groupadd -u 2000 lxc_root -useradd lxc_root -u 2000 -g 2000 -``` - -**然后** 映射宿主到容器的 uid, 编辑 `/etc/pve/lxc/ID.conf`, 添加如下内容 -``` -# uid map: from uid 0 map 2000 uids (in the ct) to the range starting 100000 (on the host), so 0..2000 (ct) → 100000..102000 (host) -lxc.idmap = u 0 100000 2000 -lxc.idmap = g 0 100000 2000 -# we map 1 uid starting from uid 2000 onto 2000, so 2000 → 2000 -lxc.idmap = u 2000 2000 1 -lxc.idmap = g 2000 2000 1 -# we map the rest of 65535 from 2001 upto 102001, so 2001..65535 → 102001..165535 -lxc.idmap = u 2001 102001 63535 -lxc.idmap = g 2001 102001 63535 -``` - -**然后**更新宿主机的配置文件 `/etc/subuid` 和 `/etc/subgid` - -```shell -echo 'root:2000:1' >> /etc/subuid -echo 'root:2000:1' >> /etc/subgid -``` - -uid 和 gid 的映射完成后, **然后** 在宿主机中修改挂载 cifs 时的 uid 和 gid - -```shell -# 设置 cifs 挂载时的uid和gid -pvesm set -options uid=2000,gid=2000 -``` - -此时, 查看宿主机 `/etc/pve/storage.cfg` 文件可以看到 options 已经被加入进去了 - -```shell -cat /etc/pve/storage.cfg - -cifs: resources0 - path /mnt/pve/resources0 - server 192.168.100.21 - share resources0 - content iso - options uid=2000,gid=2000 - username user -``` - -**接下来**是重新挂载目录, 应用新的 options - -```shell -# 停止当前的 storage -pvesm set -disable 1 - -# 使用 umount 卸载目录挂载 -umount /path/to/storage - -# 最后重新挂载目录 -pvesm set -disable 0 -``` - -操作完成后, 可以通过 `mount` 命令进行确认新的挂载是否使用了 options `uid=2000,gid=2000` - -```shell -$ mount -//192.168.100.21/resources0 on /mnt/pve/resources0 type cifs (rw,relatime,vers=3.1.1,cache=strict,username=user,uid=2000,noforceuid,gid=2000,noforcegid,addr=192.168.100.21,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=4194304,wsize=4194304,bsize=1048576,echo_interval=60,actimeo=1,closetimeo=1) -``` - -在上面的输出中, 可以看到挂载 options 中有 `uid=2000,gid=2000`, 说明配置的 storage 挂载选项正确生效了. 也可以通过以下命令对挂载的目录进行确认. - -```shell -ls -al /mnt/pve -drwxr-xr-x 8 root root 4096 Apr 23 08:05 . -drwxr-xr-x 3 root root 4096 Mar 27 22:54 .. -drwxr-xr-x 2 lxc_root lxc_root 0 Apr 23 21:51 resources0 -``` - -可以从上面的输出中看到, `resources0` 目录权限属于 `lxc_root:lxc_root` 了. - -**然后**把 lxc 容器重启. 如果一切正常的话, 在 lxc 容器中查看被挂载的目录权限应该是 `2000:2000`, 修改文件也可以成功了. - -```shell -ls -al /media -root@DeamonLocal:~# ls -al /media/ -total 8 -drwxr-xr-x 4 root root 4096 Apr 22 14:13 . -drwxr-xr-x 19 root root 4096 Apr 23 15:00 .. -drwxr-xr-x 2 2000 2000 0 Apr 23 13:51 resources0 -``` - -**最后**想说的是, 如果要挂载的目录不是 cifs 目录的话, 就不需要像上面这么麻烦, 修改权限直接使用 `chown -R lxc_root:lxc_root /path/to/storage` 就行了. diff --git a/_posts/2024-04-30-traefik-as-reverse-proxy.md b/_posts/2024-04-30-traefik-as-reverse-proxy.md deleted file mode 100644 index eccbc79a..00000000 --- a/_posts/2024-04-30-traefik-as-reverse-proxy.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: 使用 traefik 作为反向代理工具 -pid: 20240403002 -tags: [traefik] ---- - -很久之前写过一篇使用 traefik 的文章 [traefik 作为反向代理]({% post_url 2023-05-15-traefik-as-reverse-proxy %}). 但是现在回过头来看, 发现当时由于刚开始使用 traefik 一些理解其实是有问题的, 而且也走了一些弯路. 正值 traefik 正式发布 3.0 版本之际, 所以这次重新写这篇文章, 也是对 traefik 的使用作一些总结. - -在写具体的使用之前, 先说下从开始使用 traefik 到现在的一些感受. - -最大的一个感受是, 如果服务是通过 docker 部署的, 使用 traefik 配合 docker 可以极大减少反向代理配置的维护成本. 体现在两个地方, ① docker 容器的 IP traefik 可以自动感知, 所以也就不需要启动容器时指定固定IP, 让 docker 随机分配就好, 也不需要在转发规则中指定某个域名指向具体的 IP, traefik 会统一维护好. ② traefik 通过读取 docker 容器的 label 确定转发规则, 所以可以将转发配置和容器本身的配置集中在一起, 比如可以放在 `docker-compose.yml` 中. 而像 nginx 这样的工具, 容器服务的配置是在容器侧. 转发规则的配置是在 nginx 侧, 时间久了就不容易维护了. - -说一下我使用 traefik 的场景, 我使用 docker 部署 traefik, 同时会在 docker 中部署一些其它的服务, 比如 vaultwarden 等. 用 docker 部署的服务会通过 label 的方式配置转发规则. 除了 docker 配置的服务外, 我还会在 traefik 中配置一些静态的转发规则, 转发到一些非 docker 部署的服务上, 比如 pve 管理端, openwrt 等. - -traefik 启动时的配置文件分为静态配置和动态配置. -- 静态配置是配置监听端口、动态配置目录、docker 容器和网络等全局性的配置, 可以写在配置文件中, 也可以写在 traefik 启动时的参数中. -- 动态配置基本上就是转发规则相关的配置, 可以写在配置文件中, 也可以写在 docker label 中. - -所以我把静态配置文件写在静态配置文件中, docker 容器的配置写在 label 中, 非 docker 容器的配置写在动态配置文件中. - -静态配置内容如下. 如果想看每个配置代表的含义, 可以参考 traefik 配置文件的模板 [`traefik.sample.toml` -](https://github.com/traefik/traefik/blob/master/traefik.sample.toml). 在下面的配置中, 我只开启了 https 端口, 所有 http 转发都启用了 `compress` middleware, 这个 middleware 会对所有响应的数据进行压缩, 如果响应的数据比较大, 可以提高响应速度. - -> 下面的配置文件中, 有一些关于 entryPoint, router, service, middleware 等的概念, 这些概念的含义可以参考 traefik 的官方文档 [Concepts](https://doc.traefik.io/traefik/getting-started/concepts/) - -```toml -[entryPoints] - [entryPoints.websecure] # websecure 是这个 entryPoint 的名字 - address = ":443" # websecure 这个 entryPoint 监听的端口 - [entryPoints.websecure.http] - middlewares = ["shared-compress@file"] # 所有请求都使用 shared-compress middleware - tls = true # websecure 这个 entryPoint 开启 https - # 如果同时监听 http 的话, 可以再定义一个 web entryPoint - [entryPoints.web] - address = ":80" - [entryPoints.websecure.http] - middlewares = ["shared-compress@file"] # 所有请求都使用 shared-compress middleware -[log] # 开启日志 -[api] # 开启 traefik dashboard -[ping] # 开启 ping 接口 -[providers.docker] # 监听 docker 容器 - # 默认不转发, 只有通过label `traefik.enable=true` 时才转发 - exposedByDefault = false - network = "traefik" -[providers.file] # 监听动态配置文件 - # 动态配置文件目录 - directory = "/etc/traefik/dynamic" - # 动态配置文件目录变化时, 自动更新 traefik 配置 - watch = true -[serversTransport] - # 内部转发时, 跳过证书验证 - # 因为像 PVE 这种服务只支持 https 访问且使用是自签证书, 如果验证证书的话, 会导致转发失败. - insecureSkipVerify = true -``` - -`shared-compress` middleware 配置如下 -```toml -[http.middlewares.shared-compress] - compress = true -``` - -traefik 本身服务的 docker-compose 配置及注释如下 -```yaml -version: '3' -services: - traefik: - # The official v2 Traefik docker image - image: traefik:2.11.2 - container_name: traefik - restart: always - ports: - - "443:443" - - "80:80" # 如果对外暴露多个端口的话, 这里可以定义多个端口. 冒号前是 host 端口, 冒号后是容器端口 - healthcheck: - test: traefik healthcheck --ping - interval: 3s - retries: 10 - volumes: - # So that Traefik can listen to the Docker events - - /var/run/docker.sock:/var/run/docker.sock:ro - # 静态配置映射 - - /path/to/static.toml:/etc/traefik/traefik.toml:ro - # 动态配置映射 - - /path/to/dynamic:/etc/traefik/dynamic:ro - # https 证书目录映射 - - /path/to/certs:/etc/traefik/certs:ro - networks: - - traefik # 加入已经提前创建好的 traefik 网络 - labels: - - traefik.enable=true - # 新增了一个 router, 名字叫 dashboard, 使用 websecure entryPoint - - traefik.http.routers.dashboard.entrypoints=websecure - # 转发规则, 匹配域名 traefik.example.com - - traefik.http.routers.dashboard.rule=Host(`traefik.example.com`) - # 转发到 traefik dashboard 服务 - - traefik.http.routers.dashboard.service=api@internal -networks: - traefik: - external: true # 这里声明 traefik 是外部已经已经创建好的网络 -``` - -开启了 https, 那么证书应该怎么配置呢? 我是使用的 acme.sh 生成证书, 然后放在 traefik 中使用. 首先通过上面的目录映射, 将证书目录映射到 traefik 容器中, 然后在动态配置目录下增加对应的配置 - -```toml -[[tls.certificates]] - certFile = "/etc/traefik/certs/foo.example.com/foo.example.com.cer" - keyFile = "/etc/traefik/certs/foo.example.com/foo.example.com.key" - -# 如果有多个配置, 可以继续增加 -[[tls.certificates]] - certFile = "/etc/traefik/certs/bar.example.com/bar.example.com.cer" - keyFile = "/etc/traefik/certs/bar.example.com/bar.example.com.key" -``` - -traefik 本身的配置完了, 下面分别讲下 docker 容器动态配置, 以及非 docker 容器的静态配置. - -docker 容器动态配置以 whoami 为例子 -```yaml -version: '3' -services: - whoami: - image: traefik/whoami - container_name: whoami - restart: unless-stopped - networks: - - traefik # 使用 traefik 网络, 可以让 traefik 在容器网络内部进行转发 - labels: - # 启用 traefik 转发 - - traefik.enable=true - # 转发使用在上面静态配置中定义好的 websecure entryPoint, 也就是 443 端口 - - traefik.http.routers.whoami.entrypoints=websecure - # 转发规则, 匹配域名 whoami.example.com - - traefik.http.routers.whoami.rule=Host(`whoami.example.com`) - # 转发到目标服务的端口, 如果 docker 容器 expose 了1个端口, 大多数情况是不需要这个配置的 - # 如果 expose 了多个端口, 可以显式告诉 traefik 转发到哪个端口上 - - traefik.http.services.whoami.loadbalancer.server.port=80 -networks: - traefik: - external: true # 这里声明 traefik 是外部已经已经创建好的网络 -``` - -非 docker 容器的静态配置, 以 pve 管理端为例子 - -```toml -[http.routers.pve] # 定义这个服务的名字 - entryPoints = ["websecure"] # 定义使用的 entryPoint, 如果要同时监听 http 和 https, 可以在这里定义多个 entryPoint - rule = "Host(`pve.example.com`)" # 转发规则, 匹配域名 pve.example.com - service = "pve@file" # 转发到 `pve@file` 服务上, 这个服务在下面的动态配置文件中定义. 这里的 `@file` `@docker` 是区分服务注册源是什么 - -# 定义 pve@file 服务, 名字不一定和上面的 routers 里的名字一样, 但是要和上面指向的 service 的名字一样 -[[http.services.pve.loadBalancer.servers]] # 定义 pve@file 这个服务的 ip 地址 - url = "https://192.168.100.11:8006" -[[http.services.pve.loadBalancer.servers]] # 定义 pve@file 这个服务的 ip 地址 - url = "https://192.168.100.10:8006" # 如果有多个 ip 地址, 可以在这里定义多个, traefik 会负责做负载均衡 -``` - -最后, 总结一下, 使用 traefik 作为反向代理工具, 可以极大减少反向代理配置的维护成本, 并且可以将转发规则集中在一起, 方便管理. 如果你之前使用的是 nginx, nginx proxy manager 之类的工具, 可以参考这篇文章, 看看如何使用 traefik 减少维护成本. diff --git a/_posts/2024-05-12-pve-hba-card-passthrough.md b/_posts/2024-05-12-pve-hba-card-passthrough.md deleted file mode 100644 index 5962c2e2..00000000 --- a/_posts/2024-05-12-pve-hba-card-passthrough.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: PVE HBA 卡直通 -pid: 2024051201 -tags: [PVE, HBA] ---- - -最近购入了一张 HBA 卡,计划将 HBA 卡和外置的硬盘笼进行连接,然后将 HBA 卡直通给黑群晖,由群晖管理所有的硬盘。在配置直通的过程中遇到了一些问题,所以在这里记录下。 - -在配置直通前,需要确认 HBA 卡已经正常加载了。在 pve shell 中通过 `lspci` 命令列出所有的设备。 -``` -... -02:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS2308 PCI-Express Fusion-MPT SAS-2 (rev 05) -... -``` -在上面的输出中,可以看到 HBA 卡正常加载了。 - -接下来是开启 iommu,开启 iommu 的配置之前写过一篇直通 sata 控制器的总结,步骤是一样的。可以参考 [PVE 启用 IOMMU 功能为虚拟机开启 sata 控制器直通]({% post_url 2023-05-16-pve-enable-iommu-and-sata-controller-passthrough %}) - -开启 iommu 后,找到要直通的虚拟机,就可以在虚拟机的硬件配置中添加 pci 设备了。 - -![](/uploads/2024/05/2024051201-01.png) - -![](/uploads/2024/05/2024051201-02.png) - -此时需要确认下, HBA 卡对应的 iommu 组号有没有和别的设备重复。如果 HBA 卡的 iommu 组号没有重复,此时添加完 pci 设备后, 重启虚拟机应该就完成 HBA 的直通了。 - -在我的配置过程中,HBA 卡的 iommu 组号是和别的设备有重复的。如果直接添加 pci 设备重启虚拟机的话,会导致虚拟机卡住启动失败。所以还需要再进行一些额外的配置,参考了 pve 官方文档 [PCI Passthrough](https://pve.proxmox.com/wiki/PCI_Passthrough#Verifying_IOMMU_parameters) 成功解决。 - -第一步,按照 pve 文档描述,需要确认 `IOMMU interrupt remapping` 功能是否支持。 - -```shell -$ dmesg | grep 'remapping' -[ 0.106362] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. -[ 0.106821] DMAR-IR: Enabled IRQ remapping in x2apic mode -``` - -从上面输出,可以看到 `DMAR-IR: Enabled IRQ remapping in x2apic mode` 代表是支持的。如果是 amd CPU, 输出应该是 `AMD-Vi: Interrupt remapping enabled`. - -下一步是确认主板支持 `ACS(Access Control Services)`, 不一样的主板好像选项所在位置不一样,经过确认我的主板是开启了的。 - -下一步是添加内核启动参数,修改 `/etc/default/grub` 文件,在 `GRUB_CMDLINE_LINUX_DEFAULT` 参数最后追加 `pcie_acs_override=downstream`. 我的参数配置完成后是这样的 - -``` -GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream" -``` - -上面配置中的 `iommu=pt` 看网上的解释是说可以提高未直通设备PCIe的性能,所以先加上了,但是不是必须的。 - -下一步是更新 grub -```shell -update-grub -``` - -grub 更新完成后,重启 pve 系统,此时再到虚拟机的硬件配置中添加 pci 设备,不同设备的 iommu 组号应该就不一样了。 此时将 HBA 卡添加后再启动虚拟机,正常情况下就可以启动成功,并且 HBA 卡直通成功了。 diff --git a/archives.html b/archives.html index 6610beb4..066bab37 100644 --- a/archives.html +++ b/archives.html @@ -1,4 +1,34 @@ --- -layout: archives +layout: page title: 文章归档 --- + +{% for post in site.posts %} + {% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %} + {% capture next_year %}{{ post.previous.date | date: "%Y" }}{% endcapture %} + + {% if forloop.first %} +
    +
  • {{this_year}}   +
      + {% endif %} + +
    • {{ post.date | date: "%m-%d" }} : {{ post.title }}
    • + + {% if forloop.last %} +
    +
  • +
+ {% else %} + {% if this_year != next_year %} + + + +
    +
  • {{next_year}}   +
      + {% endif %} + {% endif %} + + +{% endfor %} diff --git a/contact.html b/contact.html index b512425b..0bbbc77d 100644 --- a/contact.html +++ b/contact.html @@ -1,4 +1,5 @@ --- +layout: page title: 关于我 pid: 7 comments: true @@ -9,7 +10,7 @@

      Blog

      From 2011-03-24 to now
      GAE(micolog) --> WordPress --> Jekyll

      -

      ik0r

      +

      Treri

      a

      @@ -17,7 +18,7 @@

      ik0r

      who involved in

      -

      GitHub

      +

      GitHub

      douban

      @@ -25,12 +26,12 @@

      ik0r

      mail

      -

      i@ik0r.com

      +

      treri.liu@gmail.com

      or follow

      -

      @ik0r

      +

      @Treri

      -

      @ik0r

      +

      @Treri

      to reach me

      diff --git a/index.html b/index.html index e4d427d2..b95e555d 100644 --- a/index.html +++ b/index.html @@ -1,3 +1,37 @@ --- -layout: home +layout: default --- + +{% for rpost in site.posts limit:4 %} + +{% endfor %} +
      +
      +

      近期文章

      +
        + {% for npost in site.posts limit:4 offset:4 %} +
      • {{ npost.title }}
      • + {% endfor %} +
      +
      +
      +

      相关页面

      +
        + {% for page in site.html_pages %} + {% if page.url != '/'%} +
      • + {{ page.title }} +
      • + {% endif %} + {% endfor %} +
      +
      +
      diff --git a/links.html b/links.html index 8d3c3fea..6489cd64 100644 --- a/links.html +++ b/links.html @@ -1,8 +1,9 @@ --- +layout: page title: 友情链接 --- -

      排名不分先后.

      +

      排名不分先后. 新申请友链的请不要联系我.

      • 清泉古雾
      • IM路人
      • diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 5db72dd6..00000000 --- a/renovate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:recommended" - ] -} diff --git a/rss.xml b/rss.xml new file mode 100644 index 00000000..15c4a7db --- /dev/null +++ b/rss.xml @@ -0,0 +1,29 @@ +--- +--- + + + + {{ site.title | xml_escape }} + {% if site.description %}{{ site.description | xml_escape }}{% endif %} + {{ site.url | append: site.baseurl }} + + {% for post in site.posts %} + + {{ post.title | xml_escape }} + {% if post.author.name %} + {{ post.author.name | xml_escape }} + {% else %} + {{ site.author.name | xml_escape }} + {% endif %} + {% if post.excerpt %} + {{ post.excerpt | xml_escape }} + {% else %} + {{ post.content | xml_escape }} + {% endif %} + {{ post.date | date_to_rfc822 }} + {{ site.url | append: site.baseurl }}{{ post.url }} + {{ site.url | append: site.baseurl }}{{ post.url }} + + {% endfor %} + + diff --git a/static/css/font-awesome.css b/static/css/font-awesome.css new file mode 100644 index 00000000..b2a5fe2f --- /dev/null +++ b/static/css/font-awesome.css @@ -0,0 +1,2086 @@ +/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.5.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} diff --git a/static/css/font-awesome.min.css b/static/css/font-awesome.min.css new file mode 100644 index 00000000..d0603cb4 --- /dev/null +++ b/static/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.5.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"} diff --git a/static/fonts/FontAwesome.otf b/static/fonts/FontAwesome.otf new file mode 100644 index 00000000..3ed7f8b4 Binary files /dev/null and b/static/fonts/FontAwesome.otf differ diff --git a/static/fonts/fontawesome-webfont.eot b/static/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..9b6afaed Binary files /dev/null and b/static/fonts/fontawesome-webfont.eot differ diff --git a/static/fonts/fontawesome-webfont.svg b/static/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..d05688e9 --- /dev/null +++ b/static/fonts/fontawesome-webfont.svg @@ -0,0 +1,655 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/fonts/fontawesome-webfont.ttf b/static/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..26dea795 Binary files /dev/null and b/static/fonts/fontawesome-webfont.ttf differ diff --git a/static/fonts/fontawesome-webfont.woff b/static/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..dc35ce3c Binary files /dev/null and b/static/fonts/fontawesome-webfont.woff differ diff --git a/static/fonts/fontawesome-webfont.woff2 b/static/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..500e5172 Binary files /dev/null and b/static/fonts/fontawesome-webfont.woff2 differ diff --git a/static/images/404.png b/static/images/404.png new file mode 100644 index 00000000..4e15e5cb Binary files /dev/null and b/static/images/404.png differ diff --git a/static/images/load.gif b/static/images/load.gif new file mode 100644 index 00000000..c1010534 Binary files /dev/null and b/static/images/load.gif differ diff --git a/static/images/logo.jpg b/static/images/logo.jpg new file mode 100644 index 00000000..08279b71 Binary files /dev/null and b/static/images/logo.jpg differ diff --git a/static/jekyll-github.css b/static/jekyll-github.css new file mode 100644 index 00000000..50835e4a --- /dev/null +++ b/static/jekyll-github.css @@ -0,0 +1,69 @@ +/* + * GitHub style for Pygments syntax highlighter, for use with Jekyll + * Courtesy of GitHub.com + * @see https://github.com/aahan/pygments-github-style + */ + +.highlight pre, pre, .highlight .hll { background-color: #f8f8f8; border: 1px solid #ccc; padding: 6px 10px; border-radius: 3px; } +.highlight .c { color: #999988; font-style: italic; } +.highlight .err { color: #a61717; background-color: #e3d2d2; } +.highlight .k { font-weight: bold; } +.highlight .o { font-weight: bold; } +.highlight .cm { color: #999988; font-style: italic; } +.highlight .cp { color: #999999; font-weight: bold; } +.highlight .c1 { color: #999988; font-style: italic; } +.highlight .cs { color: #999999; font-weight: bold; font-style: italic; } +.highlight .gd { color: #000000; background-color: #ffdddd; } +.highlight .gd .x { color: #000000; background-color: #ffaaaa; } +.highlight .ge { font-style: italic; } +.highlight .gr { color: #aa0000; } +.highlight .gh { color: #999999; } +.highlight .gi { color: #000000; background-color: #ddffdd; } +.highlight .gi .x { color: #000000; background-color: #aaffaa; } +.highlight .go { color: #888888; } +.highlight .gp { color: #555555; } +.highlight .gs { font-weight: bold; } +.highlight .gu { color: #800080; font-weight: bold; } +.highlight .gt { color: #aa0000; } +.highlight .kc { font-weight: bold; } +.highlight .kd { font-weight: bold; } +.highlight .kn { font-weight: bold; } +.highlight .kp { font-weight: bold; } +.highlight .kr { font-weight: bold; } +.highlight .kt { color: #445588; font-weight: bold; } +.highlight .m { color: #009999; } +.highlight .s { color: #dd1144; } +.highlight .n { color: #333333; } +.highlight .na { color: teal; } +.highlight .nb { color: #0086b3; } +.highlight .nc { color: #445588; font-weight: bold; } +.highlight .no { color: teal; } +.highlight .ni { color: purple; } +.highlight .ne { color: #990000; font-weight: bold; } +.highlight .nf { color: #990000; font-weight: bold; } +.highlight .nn { color: #555555; } +.highlight .nt { color: navy; } +.highlight .nv { color: teal; } +.highlight .ow { font-weight: bold; } +.highlight .w { color: #bbbbbb; } +.highlight .mf { color: #009999; } +.highlight .mh { color: #009999; } +.highlight .mi { color: #009999; } +.highlight .mo { color: #009999; } +.highlight .sb { color: #dd1144; } +.highlight .sc { color: #dd1144; } +.highlight .sd { color: #dd1144; } +.highlight .s2 { color: #dd1144; } +.highlight .se { color: #dd1144; } +.highlight .sh { color: #dd1144; } +.highlight .si { color: #dd1144; } +.highlight .sx { color: #dd1144; } +.highlight .sr { color: #009926; } +.highlight .s1 { color: #dd1144; } +.highlight .ss { color: #990073; } +.highlight .bp { color: #999999; } +.highlight .vc { color: teal; } +.highlight .vg { color: teal; } +.highlight .vi { color: teal; } +.highlight .il { color: #009999; } +.highlight .gc { color: #999; background-color: #EAF2F5; } diff --git a/static/js/html5.js b/static/js/html5.js new file mode 100755 index 00000000..6fce0a06 --- /dev/null +++ b/static/js/html5.js @@ -0,0 +1,51 @@ +// html5shiv MIT @rem remysharp.com/html5-enabling-script +// iepp v1.6.2 MIT @jon_neal iecss.com/print-protector +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b";return a.childNodes.length!==1}())){a.iepp=a.iepp||{};var c=a.iepp,d=c.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",e=d.split("|"),f=e.length,g=new RegExp("(^|\\s)("+d+")","gi"),h=new RegExp("<(/*)("+d+")","gi"),i=/^\s*[\{\}]\s*$/,j=new RegExp("(^|[^\\n]*?\\s)("+d+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),k=b.createDocumentFragment(),l=b.documentElement,m=l.firstChild,n=b.createElement("body"),o=b.createElement("style"),p=/print|all/,q;c.getCSS=function(a,b){if(a+""===undefined)return"";var d=-1,e=a.length,f,g=[];while(++d-1;}};ua.version=(ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1];ua.webkit=ua.test("webkit");ua.gecko=ua.test("gecko")&&!ua.webkit;ua.opera=ua.test("opera");ua.ie=ua.test("msie")&&!ua.opera;ua.ie6=ua.ie&&document.compatMode&&typeof document.documentElement.style.maxHeight==="undefined";ua.ie7=ua.ie&&document.documentElement&&typeof document.documentElement.style.maxHeight!=="undefined"&&typeof XDomainRequest==="undefined";ua.ie8=ua.ie&&typeof XDomainRequest!=="undefined";var domReady=function(){var _1=[];var _2=function(){if(!arguments.callee.done){arguments.callee.done=true;for(var i=0;i<_1.length;i++){_1[i]();}}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",_2,false);} + if(ua.ie){(function(){try{document.documentElement.doScroll("left");} + catch(e){setTimeout(arguments.callee,50);return;} + _2();})();document.onreadystatechange=function(){if(document.readyState==="complete"){document.onreadystatechange=null;_2();}};} + if(ua.webkit&&document.readyState){(function(){if(document.readyState!=="loading"){_2();}else{setTimeout(arguments.callee,10);}})();} + window.onload=_2;return function(fn){if(typeof fn==="function"){_1[_1.length]=fn;} + return fn;};}();var cssHelper=function(){var _3={BLOCKS:/[^\s{][^{]*\{(?:[^{}]*\{[^{}]*\}[^{}]*|[^{}]*)*\}/g,BLOCKS_INSIDE:/[^\s{][^{]*\{[^{}]*\}/g,DECLARATIONS:/[a-zA-Z\-]+[^;]*:[^;]+;/g,RELATIVE_URLS:/url\(['"]?([^\/\)'"][^:\)'"]+)['"]?\)/g,REDUNDANT_COMPONENTS:/(?:\/\*([^*\\\\]|\*(?!\/))+\*\/|@import[^;]+;)/g,REDUNDANT_WHITESPACE:/\s*(,|:|;|\{|\})\s*/g,MORE_WHITESPACE:/\s{2,}/g,FINAL_SEMICOLONS:/;\}/g,NOT_WHITESPACE:/\S+/g};var _4,_5=false;var _6=[];var _7=function(fn){if(typeof fn==="function"){_6[_6.length]=fn;}};var _8=function(){for(var i=0;i<_6.length;i++){_6[i](_4);}};var _9={};var _a=function(n,v){if(_9[n]){var _b=_9[n].listeners;if(_b){for(var i=0;i<_b.length;i++){_b[i](v);}}}};var _c=function(_d,_e,_f){if(ua.ie&&!window.XMLHttpRequest){window.XMLHttpRequest=function(){return new ActiveXObject("Microsoft.XMLHTTP");};} + if(!XMLHttpRequest){return"";} + var r=new XMLHttpRequest();try{r.open("get",_d,true);r.setRequestHeader("X_REQUESTED_WITH","XMLHttpRequest");} + catch(e){_f();return;} + var _10=false;setTimeout(function(){_10=true;},5000);document.documentElement.style.cursor="progress";r.onreadystatechange=function(){if(r.readyState===4&&!_10){if(!r.status&&location.protocol==="file:"||(r.status>=200&&r.status<300)||r.status===304||navigator.userAgent.indexOf("Safari")>-1&&typeof r.status==="undefined"){_e(r.responseText);}else{_f();} + document.documentElement.style.cursor="";r=null;}};r.send("");};var _11=function(_12){_12=_12.replace(_3.REDUNDANT_COMPONENTS,"");_12=_12.replace(_3.REDUNDANT_WHITESPACE,"$1");_12=_12.replace(_3.MORE_WHITESPACE," ");_12=_12.replace(_3.FINAL_SEMICOLONS,"}");return _12;};var _13={mediaQueryList:function(s){var o={};var idx=s.indexOf("{");var lt=s.substring(0,idx);s=s.substring(idx+1,s.length-1);var mqs=[],rs=[];var qts=lt.toLowerCase().substring(7).split(",");for(var i=0;i-1&&_23.href&&_23.href.length!==0&&!_23.disabled){_1f[_1f.length]=_23;}} + if(_1f.length>0){var c=0;var _24=function(){c++;if(c===_1f.length){_20();}};var _25=function(_26){var _27=_26.href;_c(_27,function(_28){_28=_11(_28).replace(_3.RELATIVE_URLS,"url("+_27.substring(0,_27.lastIndexOf("/"))+"/$1)");_26.cssHelperText=_28;_24();},_24);};for(i=0;i<_1f.length;i++){_25(_1f[i]);}}else{_20();}};var _29={mediaQueryLists:"array",rules:"array",selectors:"object",declarations:"array",properties:"object"};var _2a={mediaQueryLists:null,rules:null,selectors:null,declarations:null,properties:null};var _2b=function(_2c,v){if(_2a[_2c]!==null){if(_29[_2c]==="array"){return(_2a[_2c]=_2a[_2c].concat(v));}else{var c=_2a[_2c];for(var n in v){if(v.hasOwnProperty(n)){if(!c[n]){c[n]=v[n];}else{c[n]=c[n].concat(v[n]);}}} + return c;}}};var _2d=function(_2e){_2a[_2e]=(_29[_2e]==="array")?[]:{};for(var i=0;i<_4.length;i++){_2b(_2e,_4[i].cssHelperParsed[_2e]);} + return _2a[_2e];};domReady(function(){var els=document.body.getElementsByTagName("*");for(var i=0;i=_44)||(max&&_46<_44)||(!min&&!max&&_46===_44));}else{return false;}}else{return _46>0;}}else{if("device-height"===_41.substring(l-13,l)){_47=screen.height;if(_42!==null){if(_43==="length"){return((min&&_47>=_44)||(max&&_47<_44)||(!min&&!max&&_47===_44));}else{return false;}}else{return _47>0;}}else{if("width"===_41.substring(l-5,l)){_46=document.documentElement.clientWidth||document.body.clientWidth;if(_42!==null){if(_43==="length"){return((min&&_46>=_44)||(max&&_46<_44)||(!min&&!max&&_46===_44));}else{return false;}}else{return _46>0;}}else{if("height"===_41.substring(l-6,l)){_47=document.documentElement.clientHeight||document.body.clientHeight;if(_42!==null){if(_43==="length"){return((min&&_47>=_44)||(max&&_47<_44)||(!min&&!max&&_47===_44));}else{return false;}}else{return _47>0;}}else{if("device-aspect-ratio"===_41.substring(l-19,l)){return _43==="aspect-ratio"&&screen.width*_44[1]===screen.height*_44[0];}else{if("color-index"===_41.substring(l-11,l)){var _48=Math.pow(2,screen.colorDepth);if(_42!==null){if(_43==="absolute"){return((min&&_48>=_44)||(max&&_48<_44)||(!min&&!max&&_48===_44));}else{return false;}}else{return _48>0;}}else{if("color"===_41.substring(l-5,l)){var _49=screen.colorDepth;if(_42!==null){if(_43==="absolute"){return((min&&_49>=_44)||(max&&_49<_44)||(!min&&!max&&_49===_44));}else{return false;}}else{return _49>0;}}else{if("resolution"===_41.substring(l-10,l)){var res;if(_45==="dpcm"){res=_3d("1cm");}else{res=_3d("1in");} + if(_42!==null){if(_43==="resolution"){return((min&&res>=_44)||(max&&res<_44)||(!min&&!max&&res===_44));}else{return false;}}else{return res>0;}}else{return false;}}}}}}}}};var _4a=function(mq){var _4b=mq.getValid();var _4c=mq.getExpressions();var l=_4c.length;if(l>0){for(var i=0;i0){s[c++]=",";} + s[c++]=n;}} + if(s.length>0){_39[_39.length]=cssHelper.addStyle("@media "+s.join("")+"{"+mql.getCssText()+"}",false);}};var _4e=function(_4f){for(var i=0;i<_4f.length;i++){_4d(_4f[i]);} + if(ua.ie){document.documentElement.style.display="block";setTimeout(function(){document.documentElement.style.display="";},0);setTimeout(function(){cssHelper.broadcast("cssMediaQueriesTested");},100);}else{cssHelper.broadcast("cssMediaQueriesTested");}};var _50=function(){for(var i=0;i<_39.length;i++){cssHelper.removeStyle(_39[i]);} + _39=[];cssHelper.mediaQueryLists(_4e);};var _51=0;var _52=function(){var _53=cssHelper.getViewportWidth();var _54=cssHelper.getViewportHeight();if(ua.ie){var el=document.createElement("div");el.style.position="absolute";el.style.top="-9999em";el.style.overflow="scroll";document.body.appendChild(el);_51=el.offsetWidth-el.clientWidth;document.body.removeChild(el);} + var _55;var _56=function(){var vpw=cssHelper.getViewportWidth();var vph=cssHelper.getViewportHeight();if(Math.abs(vpw-_53)>_51||Math.abs(vph-_54)>_51){_53=vpw;_54=vph;clearTimeout(_55);_55=setTimeout(function(){if(!_3a()){_50();}else{cssHelper.broadcast("cssMediaQueriesTested");}},500);}};window.onresize=function(){var x=window.onresize||function(){};return function(){x();_56();};}();};var _57=document.documentElement;_57.style.marginLeft="-32767px";setTimeout(function(){_57.style.marginTop="";},20000);return function(){if(!_3a()){cssHelper.addListener("newStyleParsed",function(el){_4e(el.cssHelperParsed.mediaQueryLists);});cssHelper.addListener("cssMediaQueriesTested",function(){if(ua.ie){_57.style.width="1px";} + setTimeout(function(){_57.style.width="";_57.style.marginLeft="";},0);cssHelper.removeListener("cssMediaQueriesTested",arguments.callee);});_3c();_50();}else{_57.style.marginLeft="";} + _52();};}());try{document.execCommand("BackgroundImageCache",false,true);} +catch(e){} diff --git a/static/js/iLotus.js b/static/js/iLotus.js new file mode 100644 index 00000000..6f6a7186 --- /dev/null +++ b/static/js/iLotus.js @@ -0,0 +1,133 @@ + +/** + * author: PIZn + * version: 1.0 + * site: http://www.pizn.net + */ +$(document).ready(function() { + //为什么我会写这个呢? + var iLotus = { + Version: "1.0", + Author: "PIZn" + }; + /** + * goTop + */ + iLotus.goTop = { + nodeName: "J-backTop", + scrollHeight: "100", + linkBottom: "60px", + linkRight: 30, + linkWidth: 32, + contentWidth: 720, + contenBigtWidth: 1024, + _scrollTop: function() { + if(jQuery.scrollTo) { + jQuery.scrollTo(0, 800, {queue:true}); + } + }, + _scrollScreen: function() { + var that = this, topLink = $('#' + that.nodeName); + if(jQuery(document).scrollTop() <= that.scrollHeight) { + topLink.hide(); + return true; + } else { + topLink.fadeIn(); + } + }, + _resizeWindow: function(right) { + var that = this, topLink = $('#' + that.nodeName); + topLink.css({ + 'right' : right + 'px', + 'bottom': that.linkBottom + }); + }, + _changeRight: function() { + var that = this, right; + if(jQuery(window).width() > 1440) { + right = parseInt((jQuery(window).width() - that.contenBigtWidth + 1)/2 - that.linkWidth - that.linkRight, 10); + } else { + + right = parseInt((jQuery(window).width() - that.contentWidth + 1)/2 - that.linkWidth - that.linkRight, 10); + } + if( right < 20 ) { + right = 20; + } + return right; + }, + run: function() { + var that = this, topLink = $(''); + topLink.appendTo($('body')); + topLink.css({ + 'display': 'none', + 'position': 'fixed', + 'right': that._changeRight() + 'px', + 'bottom': that.linkBottom + }); + if(jQuery.scrollTo) { + topLink.click(function() { + that._scrollTop(); + return false; + }); + } + jQuery(window).resize(function() { + that._resizeWindow(that._changeRight()); + }); + jQuery(window).scroll(function() { + that._scrollScreen(); + + }); + + } + } + /** + * iLotus.changeTheme + */ + iLotus.changeTheme = { + A: function() { + if(this.check() == "A") { + $("#J-html").addClass("iLight"); + jQuery.cookie('iTheme', 'B', { expires: 7, path: '/' }); + } else { + $("#J-html").removeClass("iLight"); + jQuery.cookie('iTheme', 'A', { expires: 7, path: '/' }); + } + }, + B: function() { + if(this.check() == "B") { + $("#J-html").addClass("iLight"); + } else { + $("#J-html").removeClass("iLight"); + } + }, + check: function() { + var iThemeCookie = jQuery.cookie("iTheme"); + if(iThemeCookie != null) { + return iThemeCookie; + } else { + jQuery.cookie('iTheme', 'A', { expires: 7, path: '/' }); + return "A"; + } + }, + init: function() { + var that = this; + $("#J-changeTheme").toggle(function(e) { + that.A(); + }, function(e) { + that.A(); + }); + this.B(); + } + } + /** + * iLotus JS init + */ + iLotus.init = { + run: function() { + iLotus.goTop.run(); + iLotus.changeTheme.init(); + } + }; + //run + iLotus.init.run(); +}); diff --git a/static/js/jquery.cookie.js b/static/js/jquery.cookie.js new file mode 100644 index 00000000..91574990 --- /dev/null +++ b/static/js/jquery.cookie.js @@ -0,0 +1,72 @@ +/*! + * jQuery Cookie Plugin v1.3 + * https://github.com/carhartl/jquery-cookie + * + * Copyright 2011, Klaus Hartl + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://www.opensource.org/licenses/mit-license.php + * http://www.opensource.org/licenses/GPL-2.0 + */ +(function ($, document, undefined) { + + var pluses = /\+/g; + + function raw(s) { + return s; + } + + function decoded(s) { + return decodeURIComponent(s.replace(pluses, ' ')); + } + + var config = $.cookie = function (key, value, options) { + + // write + if (value !== undefined) { + options = $.extend({}, config.defaults, options); + + if (value === null) { + options.expires = -1; + } + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setDate(t.getDate() + days); + } + + value = config.json ? JSON.stringify(value) : String(value); + + return (document.cookie = [ + encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // read + var decode = config.raw ? raw : decoded; + var cookies = document.cookie.split('; '); + for (var i = 0, l = cookies.length; i < l; i++) { + var parts = cookies[i].split('='); + if (decode(parts.shift()) === key) { + var cookie = decode(parts.join('=')); + return config.json ? JSON.parse(cookie) : cookie; + } + } + + return null; + }; + + config.defaults = {}; + + $.removeCookie = function (key, options) { + if ($.cookie(key) !== null) { + $.cookie(key, null, options); + return true; + } + return false; + }; + +})(jQuery, document); diff --git a/static/js/jquery.js b/static/js/jquery.js new file mode 100644 index 00000000..3b8d15d0 --- /dev/null +++ b/static/js/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v@1.8.1 jquery.com | jquery.org/license */ +(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.1",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b
        a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
        t
        ",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
        ",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j=0),h[l]&&j.push(k);j.length&&t.push({elem:f,matches:j})}n.length>o&&t.push({elem:this,matches:n.slice(o)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function $(a,b,c,d){c=c||[],b=b||q;var e,f,g,j,k=b.nodeType;if(k!==1&&k!==9)return[];if(!a||typeof a!="string")return c;g=h(b);if(!g&&!d)if(e=L.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&i(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return u.apply(c,t.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&X&&b.getElementsByClassName)return u.apply(c,t.call(b.getElementsByClassName(j),0)),c}return bk(a,b,c,d,g)}function _(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function ba(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bb(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bc(a,b,c,d){var e,g,h,i,j,k,l,m,n,p,r=!c&&b!==q,s=(r?"":"")+a.replace(H,"$1"),u=y[o][s];if(u)return d?0:t.call(u,0);j=a,k=[],m=0,n=f.preFilter,p=f.filter;while(j){if(!e||(g=I.exec(j)))g&&(j=j.slice(g[0].length),h.selector=l),k.push(h=[]),l="",r&&(j=" "+j);e=!1;if(g=J.exec(j))l+=g[0],j=j.slice(g[0].length),e=h.push({part:g.pop().replace(H," "),string:g[0],captures:g});for(i in p)(g=S[i].exec(j))&&(!n[i]||(g=n[i](g,b,c)))&&(l+=g[0],j=j.slice(g[0].length),e=h.push({part:i,string:g.shift(),captures:g}));if(!e)break}return l&&(h.selector=l),d?j.length:j?$.error(a):t.call(y(s,k),0)}function bd(a,b,e,f){var g=b.dir,h=s++;return a||(a=function(a){return a===e}),b.first?function(b){while(b=b[g])if(b.nodeType===1)return a(b)&&b}:f?function(b){while(b=b[g])if(b.nodeType===1&&a(b))return b}:function(b){var e,f=h+"."+c,i=f+"."+d;while(b=b[g])if(b.nodeType===1){if((e=b[o])===i)return b.sizset;if(typeof e=="string"&&e.indexOf(f)===0){if(b.sizset)return b}else{b[o]=i;if(a(b))return b.sizset=!0,b;b.sizset=!1}}}}function be(a,b){return a?function(c){var d=b(c);return d&&a(d===!0?c:d)}:b}function bf(a,b,c){var d,e,g=0;for(;d=a[g];g++)f.relative[d.part]?e=bd(e,f.relative[d.part],b,c):e=be(e,f.filter[d.part].apply(null,d.captures.concat(b,c)));return e}function bg(a){return function(b){var c,d=0;for(;c=a[d];d++)if(c(b))return!0;return!1}}function bh(a,b,c,d){var e=0,f=b.length;for(;e0?i(h,c,g):[]}function bj(a,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s=0,t=a.length,v=S.POS,w=new RegExp("^"+v.source+"(?!"+A+")","i"),x=function(){var a=1,c=arguments.length-2;for(;al){g+=k.slice(l,n.index),l=p,q=[c],J.test(g)&&(m&&(q=m),m=e);if(r=O.test(g))g=g.slice(0,-5).replace(J,"$&*"),l++;n.length>1&&n[0].replace(w,x),m=bi(g,n[1],n[2],q,m,r)}g=""}}o||(g+=k),o=!1}g?J.test(g)?bh(g,m||[c],d,e):$(g,c,d,e?e.concat(m):m):u.apply(d,m)}return t===1?d:$.uniqueSort(d)}function bk(a,b,e,g,h){a=a.replace(H,"$1");var i,k,l,m,n,o,p,q,r,s,v=bc(a,b,h),w=b.nodeType;if(S.POS.test(a))return bj(v,b,e,g);if(g)i=t.call(g,0);else if(v.length===1){if((o=t.call(v[0],0)).length>2&&(p=o[0]).part==="ID"&&w===9&&!h&&f.relative[o[1].part]){b=f.find.ID(p.captures[0].replace(R,""),b,h)[0];if(!b)return e;a=a.slice(o.shift().string.length)}r=(v=N.exec(o[0].string))&&!v.index&&b.parentNode||b,q="";for(n=o.length-1;n>=0;n--){p=o[n],s=p.part,q=p.string+q;if(f.relative[s])break;if(f.order.test(s)){i=f.find[s](p.captures[0].replace(R,""),r,h);if(i==null)continue;a=a.slice(0,a.length-q.length)+q.replace(S[s],""),a||u.apply(e,t.call(i,0));break}}}if(a){k=j(a,b,h),c=k.dirruns++,i==null&&(i=f.find.TAG("*",N.test(a)&&b.parentNode||b));for(n=0;m=i[n];n++)d=k.runs++,k(m)&&e.push(m)}return e}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=a.document,r=q.documentElement,s=0,t=[].slice,u=[].push,v=function(a,b){return a[o]=b||!0,a},w=function(){var a={},b=[];return v(function(c,d){return b.push(c)>f.cacheLength&&delete a[b.shift()],a[c]=d},a)},x=w(),y=w(),z=w(),A="[\\x20\\t\\r\\n\\f]",B="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",C=B.replace("w","w#"),D="([*^$|!~]?=)",E="\\["+A+"*("+B+")"+A+"*(?:"+D+A+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+C+")|)|)"+A+"*\\]",F=":("+B+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+E+")|[^:]|\\\\.)*|.*))\\)|)",G=":(nth|eq|gt|lt|first|last|even|odd)(?:\\(((?:-\\d)?\\d*)\\)|)(?=[^-]|$)",H=new RegExp("^"+A+"+|((?:^|[^\\\\])(?:\\\\.)*)"+A+"+$","g"),I=new RegExp("^"+A+"*,"+A+"*"),J=new RegExp("^"+A+"*([\\x20\\t\\r\\n\\f>+~])"+A+"*"),K=new RegExp(F),L=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,M=/^:not/,N=/[\x20\t\r\n\f]*[+~]/,O=/:not\($/,P=/h\d/i,Q=/input|select|textarea|button/i,R=/\\(?!\\)/g,S={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),NAME:new RegExp("^\\[name=['\"]?("+B+")['\"]?\\]"),TAG:new RegExp("^("+B.replace("w","w*")+")"),ATTR:new RegExp("^"+E),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+A+"*(even|odd|(([+-]|)(\\d*)n|)"+A+"*(?:([+-]|)"+A+"*(\\d+)|))"+A+"*\\)|)","i"),POS:new RegExp(G,"ig"),needsContext:new RegExp("^"+A+"*[>+~]|"+G,"i")},T=function(a){var b=q.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},U=T(function(a){return a.appendChild(q.createComment("")),!a.getElementsByTagName("*").length}),V=T(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),W=T(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),X=T(function(a){return a.innerHTML="",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),Y=T(function(a){a.id=o+0,a.innerHTML="
        ",r.insertBefore(a,r.firstChild);var b=q.getElementsByName&&q.getElementsByName(o).length===2+q.getElementsByName(o+0).length;return e=!q.getElementById(o),r.removeChild(a),b});try{t.call(r.childNodes,0)[0].nodeType}catch(Z){t=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}$.matches=function(a,b){return $(a,null,null,b)},$.matchesSelector=function(a,b){return $(b,null,null,[a]).length>0},g=$.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=g(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=g(b);return c},h=$.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},i=$.contains=r.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:r.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},$.attr=function(a,b){var c,d=h(a);return d||(b=b.toLowerCase()),f.attrHandle[b]?f.attrHandle[b](a):W||d?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},f=$.selectors={cacheLength:50,createPseudo:v,match:S,order:new RegExp("ID|TAG"+(Y?"|NAME":"")+(X?"|CLASS":"")),attrHandle:V?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:e?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:U?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(R,""),a[3]=(a[4]||a[5]||"").replace(R,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||$.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&$.error(a[0]),a},PSEUDO:function(a,b,c){var d,e;if(S.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(d=a[4])K.test(d)&&(e=bc(d,b,c,!0))&&(e=d.indexOf(")",d.length-e)-d.length)&&(d=d.slice(0,e),a[0]=a[0].slice(0,e)),a[2]=d;return a.slice(0,3)}},filter:{ID:e?function(a){return a=a.replace(R,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(R,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(R,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=x[o][a];return b||(b=x(a,new RegExp("(^|"+A+")"+a+"("+A+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=$.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return $.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=s++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[o]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[o]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e,g=f.pseudos[a]||f.pseudos[a.toLowerCase()];return g||$.error("unsupported pseudo: "+a),g[o]?g(b,c,d):g.length>1?(e=[a,a,"",b],function(a){return g(a,0,e)}):g}},pseudos:{not:v(function(a,b,c){var d=j(a.replace(H,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!f.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:v(function(a){return function(b){return(b.textContent||b.innerText||g(b)).indexOf(a)>-1}}),has:v(function(a){return function(b){return $(a,b).length>0}}),header:function(a){return P.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:_("radio"),checkbox:_("checkbox"),file:_("file"),password:_("password"),image:_("image"),submit:ba("submit"),reset:ba("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return Q.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e",a.querySelectorAll("[selected]").length||e.push("\\["+A+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="

        ",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+A+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bk=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return u.apply(f,t.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j,k,l,m=d.getAttribute("id"),n=m||o,p=N.test(a)&&d.parentNode||d;m?n=n.replace(c,"\\$&"):d.setAttribute("id",n),j=bc(a,d,h),n="[id='"+n+"']";for(k=0,l=j.length;k0})}(),f.setFilters.nth=f.setFilters.eq,f.filters=f.pseudos,$.attr=p.attr,p.find=$,p.expr=$.selectors,p.expr[":"]=p.expr.pseudos,p.unique=$.uniqueSort,p.text=$.getText,p.isXMLDoc=$.isXML,p.contains=$.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
        ","
        "],thead:[1,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],col:[2,"","
        "],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
        ","
        "]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{cj=f.href}catch(cy){cj=e.createElement("a"),cj.href="",cj=cj.href}ck=ct.exec(cj.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
        ").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:cj,isLocal:cn.test(ck[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=""+(c||y),k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,ck[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]==ck[1]&&i[2]==ck[2]&&(i[3]||(i[1]==="http:"?80:443))==(ck[3]||(ck[1]==="http:"?80:443)))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e,f=this.createTween(a,b),g=cQ.exec(b),h=f.cur(),i=+h||0,j=1;if(g){c=+g[2],d=g[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&i){i=p.css(f.elem,a,!0)||c||1;do e=j=j||".5",i=i/j,p.style(f.elem,a,i+d),j=f.cur()/h;while(j!==1&&j!==e)}f.unit=d,f.start=i,f.end=g[1]?i+(g[1]+1)*c:c}return f}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/static/js/jquery.scrollTo.js b/static/js/jquery.scrollTo.js new file mode 100644 index 00000000..e47c1a88 --- /dev/null +++ b/static/js/jquery.scrollTo.js @@ -0,0 +1,218 @@ +/*! + * jQuery.ScrollTo + * Copyright (c) 2007-2012 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Dual licensed under MIT and GPL. + * Date: 4/09/2012 + * + * @projectDescription Easy element scrolling using jQuery. + * http://flesler.blogspot.com/2007/10/jqueryscrollto.html + * @author Ariel Flesler + * @version 1.4.3.1 + * + * @id jQuery.scrollTo + * @id jQuery.fn.scrollTo + * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements. + * The different options for target are: + * - A number position (will be applied to all axes). + * - A string position ('44', '100px', '+=90', etc ) will be applied to all axes + * - A jQuery/DOM element ( logically, child of the element to scroll ) + * - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc ) + * - A hash { top:x, left:y }, x and y can be any kind of number/string like above. + * - A percentage of the container's dimension/s, for example: 50% to go to the middle. + * - The string 'max' for go-to-end. + * @param {Number, Function} duration The OVERALL length of the animation, this argument can be the settings object instead. + * @param {Object,Function} settings Optional set of settings or the onAfter callback. + * @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'. + * @option {Number, Function} duration The OVERALL length of the animation. + * @option {String} easing The easing method for the animation. + * @option {Boolean} margin If true, the margin of the target element will be deducted from the final position. + * @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }. + * @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes. + * @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends. + * @option {Function} onAfter Function to be called after the scrolling ends. + * @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends. + * @return {jQuery} Returns the same jQuery object, for chaining. + * + * @desc Scroll to a fixed position + * @example $('div').scrollTo( 340 ); + * + * @desc Scroll relatively to the actual position + * @example $('div').scrollTo( '+=340px', { axis:'y' } ); + * + * @desc Scroll using a selector (relative to the scrolled element) + * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } ); + * + * @desc Scroll to a DOM element (same for jQuery object) + * @example var second_child = document.getElementById('container').firstChild.nextSibling; + * $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){ + * alert('scrolled!!'); + * }}); + * + * @desc Scroll on both axes, to different values + * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } ); + */ + +;(function( $ ){ + + var $scrollTo = $.scrollTo = function( target, duration, settings ){ + $(window).scrollTo( target, duration, settings ); + }; + + $scrollTo.defaults = { + axis:'xy', + duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1, + limit:true + }; + + // Returns the element that needs to be animated to scroll the window. + // Kept for backwards compatibility (specially for localScroll & serialScroll) + $scrollTo.window = function( scope ){ + return $(window)._scrollable(); + }; + + // Hack, hack, hack :) + // Returns the real elements to scroll (supports window/iframes, documents and regular nodes) + $.fn._scrollable = function(){ + return this.map(function(){ + var elem = this, + isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1; + + if( !isWin ) + return elem; + + var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem; + + return /webkit/i.test(navigator.userAgent) || doc.compatMode == 'BackCompat' ? + doc.body : + doc.documentElement; + }); + }; + + $.fn.scrollTo = function( target, duration, settings ){ + if( typeof duration == 'object' ){ + settings = duration; + duration = 0; + } + if( typeof settings == 'function' ) + settings = { onAfter:settings }; + + if( target == 'max' ) + target = 9e9; + + settings = $.extend( {}, $scrollTo.defaults, settings ); + // Speed is still recognized for backwards compatibility + duration = duration || settings.duration; + // Make sure the settings are given right + settings.queue = settings.queue && settings.axis.length > 1; + + if( settings.queue ) + // Let's keep the overall duration + duration /= 2; + settings.offset = both( settings.offset ); + settings.over = both( settings.over ); + + return this._scrollable().each(function(){ + // Null target yields nothing, just like jQuery does + if (target == null) return; + + var elem = this, + $elem = $(elem), + targ = target, toff, attr = {}, + win = $elem.is('html,body'); + + switch( typeof targ ){ + // A number will pass the regex + case 'number': + case 'string': + if( /^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(targ) ){ + targ = both( targ ); + // We are done + break; + } + // Relative selector, no break! + targ = $(targ,this); + if (!targ.length) return; + case 'object': + // DOMElement / jQuery + if( targ.is || targ.style ) + // Get the real position of the target + toff = (targ = $(targ)).offset(); + } + $.each( settings.axis.split(''), function( i, axis ){ + var Pos = axis == 'x' ? 'Left' : 'Top', + pos = Pos.toLowerCase(), + key = 'scroll' + Pos, + old = elem[key], + max = $scrollTo.max(elem, axis); + + if( toff ){// jQuery / DOMElement + attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); + + // If it's a dom element, reduce the margin + if( settings.margin ){ + attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; + attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; + } + + attr[key] += settings.offset[pos] || 0; + + if( settings.over[pos] ) + // Scroll to a fraction of its width/height + attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos]; + }else{ + var val = targ[pos]; + // Handle percentage values + attr[key] = val.slice && val.slice(-1) == '%' ? + parseFloat(val) / 100 * max + : val; + } + + // Number or 'number' + if( settings.limit && /^\d+$/.test(attr[key]) ) + // Check the limits + attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); + + // Queueing axes + if( !i && settings.queue ){ + // Don't waste time animating, if there's no need. + if( old != attr[key] ) + // Intermediate animation + animate( settings.onAfterFirst ); + // Don't animate this axis again in the next iteration. + delete attr[key]; + } + }); + + animate( settings.onAfter ); + + function animate( callback ){ + $elem.animate( attr, duration, settings.easing, callback && function(){ + callback.call(this, target, settings); + }); + }; + + }).end(); + }; + + // Max scrolling position, works on quirks mode + // It only fails (not too badly) on IE, quirks mode. + $scrollTo.max = function( elem, axis ){ + var Dim = axis == 'x' ? 'Width' : 'Height', + scroll = 'scroll'+Dim; + + if( !$(elem).is('html,body') ) + return elem[scroll] - $(elem)[Dim.toLowerCase()](); + + var size = 'client' + Dim, + html = elem.ownerDocument.documentElement, + body = elem.ownerDocument.body; + + return Math.max( html[scroll], body[scroll] ) + - Math.min( html[size] , body[size] ); + }; + + function both( val ){ + return typeof val == 'object' ? val : { top:val, left:val }; + }; + +})( jQuery ); \ No newline at end of file diff --git a/static/style.css b/static/style.css new file mode 100644 index 00000000..cd617f32 --- /dev/null +++ b/static/style.css @@ -0,0 +1,819 @@ +@charset "utf-8"; + +/************************* +Theme Name: iLotus +Author: 展新(pizner@gmail.com) +*************************/ + + +/************************* + * style font +*************************/ + +@font-face { + font-family: 'PT Serif'; + font-style: normal; + font-weight: 700; + src: local('PT Serif Bold'), local('PTSerif-Bold'), url(font/PTSerifBold.woff) format('woff'); +} + +@font-face { + font-family: 'PT Serif'; + font-style: italic; + font-weight: 400; + src: local('PT Serif Italic'), local('PTSerif-Italic'), url(font/PTSerifItalic.woff) format('woff'); +} + +@font-face { + font-family: 'PT Serif'; + font-style: normal; + font-weight: 400; + src: local('PT Serif'), local('PTSerif-Regular'), url(font/PTSerif.woff) format('woff'); +} + +/************************* + * reset style +*************************/ + +html { + color: #1F0909; + background: #f3f2ee; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +body, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td, hr, button, article, aside, details, figcaption, figure, footer, header, group, menu, nav, section { + margin: 0; + padding: 0; +} + +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; +} + +audio, canvas, video {display: inline-block; +} + +body, button, input, select, textarea { + font: 500 14px/1.8 'PT Serif', 'Hiragino Sans GB', sans-serif; +} + +table { + border-collapse: collapse; + border-spacing: 0; + width: 100%; +} + +th { + text-align: inherit; +} + +fieldset, img { + border: 0; +} + +img { + -ms-interpolation-mode: bicubic; +} + +iframe { + display: block; +} + +blockquote { + padding: 0.5em 1em 0.1em 1em; + margin-bottom: 1em; + background: rgba(214, 214, 214, 0.5); + border-width: 1px 1px 1px 0.4em; + border-color: #d8d8d8 #d8d8d8 #d8d8d8 #d0d0d0; + border-style: solid; + vertical-align: middle; + border-radius: 0px 2px 2px 0; +} + +blockquote blockquote { + padding: 0 1em 0 1em; + margin-left: 2em; + border-width: 1px 1px 1px 0.4em; + border-style: solid; + border-color: rgba(120, 120, 120, 0.1); +} + +acronym, abbr { + border-bottom: 1px dotted; + font-variant: normal; +} + +abbr { + cursor: help; +} + +del { + text-decoration: line-through; +} + +address, caption, cite, code, den, em, th, var { + font-style: normal; + font-weight: 500; +} + +ul, ol { + list-style: none; +} + +caption, th { + text-align: left; +} + +q:before, q:after { + content: ''; +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: text-top\9; +} + +:root sub, :root sup { + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +a { + color: #065588; + font-size: 100%; +} + +a:hover { + text-decoration: underline; +} + +ins, a { + text-decoration: none; +} + +u, .lotus-u { + text-decoration: underline; +} + +mark { + background: #FFFB99; +} + +pre, code { + font-family: "Courier New", Courier, monospace; + overflow-x: auto; + vertical-align: middle; +} + +pre { + font-size: 12px; + border: 1px solid #d8d8d8; + border-left-width: 0.4em; + background: rgba(214, 214, 214, 0.5); + padding: 10px; +} + +code { + color: #4d4d4d; +} + +code { + padding: 0 0.2em; + margin: 0; + border: 1px solid #bdbdbd; + background: rgba(214, 214, 214, 0.5); + border-radius: 2px; +} +pre code{ + display: inline; + max-width: initial; + padding: 0; + margin: 0; + overflow: initial; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +small { + font-size: 12px; + color: #888; +} + +::selection { + background: rgba(0, 0, 0, 0.1); +} + +::-moz-selection { + background: rgba(0, 0, 0, 0.1); +} + +img::selection { + background: rgba(127, 191, 17, 0.2); + width: 100%; +} + +img::-moz-selection { + background: rgba(127, 191, 17, 0.2); + width: 100%; +} + + +/************************* + * function +*************************/ + +.fn-clear:before, .fn-clear:after { + content: ""; + display: table; +} + +.fn-clear:after { + clear: both +} + +.fn-clear { + zoom: 1 +} + +.fn-img { + display: block; + width: auto; + max-width: 99%; + text-align: center; + background: #fefefe; + margin-top: .3em; + margin-bottom: .3em; + border: 1px solid #b8b8b8; + box-shadow: 3px 3px 0 #d8d8d8; +} + +.fn-img-lf { + width: auto; + max-width: 32%; + float: left; + margin-right: .8em; +} + +.fn-img-rg { + width: auto; + max-width: 32%; + float: right; + margin-left: .8em; +} + +.fn-img:hover { + border: 1px solid #a8a8a8; +} + +/************************* + * lotus design +*************************/ + +.lotus p, +.lotus pre, +.lotus ul, +.lotus ol, +.lotus dl, +.lotus form, +.lotus hr, +.lotus table { + margin-bottom: 1em; + vertical-align: middle; +} + +.lotus blockquote p { + margin-bottom: 0.4em; +} + +.lotus blockquote p:before { + content: "“"; + font-size: 38px; + line-height: 18px; + position: relative; + color: #c8c8c8; + overflow: hidden; + top: 18px; +} + +.lotus blockquote p:after { + content: "”"; + font-size: 38px; + line-height: 18px; + position: relative; + color: #c8c8c8; + overflow: hidden; + top: 14px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 500; + font-weight: 700\9; + color: #333; +} + +.lotus h1, +.lotus h2, +.lotus h3, +.lotus h4, +.lotus h5, +.lotus h6 { + margin-bottom: 0.4em; + line-height: 1.5; +} + +.lotus h1 { + font-size: 1.8em; +} + +.lotus h2 { + font-size: 1.6em; +} + +.lotus h3 { + font-size: 1.4em; + border-bottom: 1px dotted #d8d8d8; + margin-top: 1.4em; +} + +.index h3 { + margin-top: 0; +} + +.lotus h4 { + font-size: 1.2em; +} + +.lotus h5, +.lotus h6 { + font-size: 1em; +} + +.lotus .lotus-pagetit { + padding-bottom: 0.5em; + margin-bottom: 0.5em; + border-bottom: 1px solid #C5C5C5; +} + +.lotus ul{ + margin-left: 1.3em; + list-style: disc; +} + +.lotus ol{ + list-style: decimal; + margin-left: 1.9em; +} + +.lotus li ul, +.lotus li ol{ + margin-top: 0; + margin-bottom: 0; + margin-left: 2em; +} + +.lotus li ul{ + list-style: circle; +} + +.lotus table th, +.lotus table td { + border: 1px solid #d0d0d0; + padding: 5px 10px; +} + +.lotus table th { + background: rgba(214, 214, 214, 0.5); +} + +.lotus table thead th { + background: rgba(214, 214, 214, 0.8); +} + +.lotus em { + font-weight: 700; +} + +.lotus .lotus-anno { + text-align: right; + padding: 5px 10px; + font-size: 12px; + color: #A0A0A0; + background: #e4e4e2; + border-top: 1px solid #d0d0d0; +} + +.lotus .lotus-anno a { + color: #1F0909; +} + + +/************************* + * lotus layout +*************************/ + +.lotus { + width: 720px; + padding: 1em 0 0em 0; + margin: 0 auto; +} + +.index { + padding: 1em 0 0 0; +} + +.index h3 { + border-bottom: none; +} + +.lotus-nav { + width: 58px; + height: 100%; + background: #474747; + background: -moz-linear-gradient( 180deg, #292929 0%, #404040 8%, #474747 14%, #474747 100%); + background: -webkit-linear-gradient( 180deg, #292929 0%, #404040 8%, #474747 14%, #474747 100%); + background: -ms-linear-gradient( 180deg, #292929 0%, #404040 8%, #474747 14%, #474747 100%); + background: linear-gradient( to 180deg, #292929 0%, #404040 8%, #474747 14%, #474747 100%); + border-right: 1px solid #212121; + position: fixed; + left: 0; + top: 0; +} + +.lotus-nav ul { + list-style: none; + width: 58px; + margin: 0 0; + border-bottom: 1px solid #313131; +} + +.lotus-nav ul li { + height: 42px; + display: block; + font-size: 20px; + line-height: 42px; + text-align: center; + border-top: 1px solid #313131; + overflow: hidden; +} + +.lotus-nav ul .home { + margin-bottom: 3.8em; + border-top: 0; +} + +.lotus-nav ul li a { + color: #ffffff; + display: block; + cursor: pointer; +} + +.lotus-nav ul li a:hover, +.lotus-nav ul .current a { + text-decoration: none; + box-shadow: 1px 1px 24px rgba(0, 0, 0, 0.8) inset; + -moz-transition: box-shadow .3s linear; + -webkit-transition: box-shadow .3s linear; + transition: box-shadow .3s linear; + text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3); +} + +.lotus-nav ul .last { + position: relative; +} + +.lotus-logo { + border-bottom: 1px solid #d0d0d0; +} + +.lotus-article { + margin: 2em 0 2em 0; + border-bottom: 1px dotted #c8c8c8; +} + +.lotus-double { + margin-bottom: 3em; +} + +.lotus-double .article { + float: left; +} + +.lotus-double .article-first { + width: 54%; + border-right: 1px dotted #C8C8C8; +} + +.lotus-double .article-last { + width: 42%; + margin-left: 1.5em; +} + +.lotus-breadcrub { + padding-bottom: 1em; +} + +.lotus-404 { + padding-top: 20em; + background: url(images/404.png) no-repeat center 0; +} + +.lotus-post img { + max-width: 100%; +} + +.lotus-post img:hover { + cursor: pointer; +} + +.lotus-nextpage { + margin-top: 1em; +} + +.lotus-nextpage .lotus-nextpage-left { + float: left; +} + +.lotus-nextpage .lotus-nextpage-right { + float: right; +} + +.lotus-footer { + margin-top: 3em; +} + +.lotus-footer-link a { + color: #f3f2ee; +} + +.lotus-backtop { + width: 35px; + height: 40px; + line-height: 40px; + text-align: center; + overflow: hidden; + font-size: 40px; + color: #474747; + opacity: 0.5; +} + +.lotus-backtop:hover { + opacity: .8; + text-decoration: none; +} + +.lotus-meta { + color: #a8a8a8; +} + +/** violet-site **/ + +.violet-site { + float: left; + margin: 20px 0 12px 0px; + position: relative; + color: #525252; +} + +.violet-site h1, +.violet-site h1 a { + font-family: "Times New Roman", Times, serif; + font-size: 32px; + font-weight: normal; + color: #525252; + margin-bottom: 0; +} + +.violet-site h1 a:hover { + color: #323232; + text-decoration: none; +} + +.violet-site h1 span { + display: inline; + padding: 0px 5px 0 3px; + position: relative; + line-height: 12px; + font-size: 10px; + font-family: Verdana, Arial, Helvetica, sans-serif; + color: #525252; + background: #d8d8d8; + border-radius: 7px 0px 7px 0; + top: -23px; + left: 5px; + font-weight: 600; +} + +.violet-site h2 { + padding-top: 2px; + font-size: 14px; + line-height: 14px; + border-top: 1px solid #313131; +} + + +/************************* + * iLight +*************************/ + +.iLight { + color: #080808; + background: #FEFEFE; +} + +.iLight .lotus-nav { + background: #f1f1ed; + background: -moz-linear-gradient( 180deg, #e3e3e3 0%, #f1f1ed 8%, #f1f1ed 14%, #f1f1ed 100%); + background: -webkit-linear-gradient( 180deg, #e3e3e3 0%, #f1f1ed 8%, #f1f1ed 14%, #f1f1ed 100%); + background: -ms-linear-gradient( 180deg, #e3e3e3 0%, #f1f1ed 8%, #f1f1ed 14%, #f1f1ed 100%); + background: linear-gradient( to 180deg, #e3e3e3 0%, #f1f1ed 8%, #f1f1ed 14%, #f1f1ed 100%); + border-right: 1px solid #dfdfdf; +} + +.iLight .lotus-nav ul { + border-bottom: 1px solid #e3e3e3; +} + +.iLight .lotus-nav ul li { + border-top: 1px solid #e3e3e3; +} + +.iLight .lotus-nav ul .home { + border-top: 0; +} + +.iLight .lotus-nav ul li a { + color: #c5c5bb; +} + +.iLight .lotus-nav ul li a:hover, +.iLight .lotus-nav ul .current a { + background: #CD0001; + color: #FEFEFE; + box-shadow: 1px 1px 24px rgba(0, 0, 0, 0.6) inset; + -moz-transition: box-shadow .3s linear, background .3s linear, color .3s linear; + -webkit-transition: box-shadow .3s linear, background .3s linear, color .3s linear; + transition: box-shadow .3s linear, background .3s linear, color .3s linear; + text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.3); +} + +.iLight a { + color: #9C0001; +} + +.iLight a:hover, +.iLight a:active { + color: #CD0001; +} + +.iLight blockquote { + border-color: #d4d4d4; + background: rgba(214, 214, 214, 0.2); +} + +.iLight .fn-img { + padding: 3px 3px; + box-shadow: 0px 0px 3px #d4d4d4; + background: #FEFEFE; + border: 1px solid #d4d4d4; +} + +.iLight .lotus-backtop { + color: #c5c5bb; +} + +.iLight .violet-site h1 span { + background: #f1f1ed; +} + + +/************************* + * iMac +*************************/ + +@media only screen and (min-width: 1440px) { + .lotus { + width: 1024px; + } + .lotus-post-columns-2 { + -moz-column-count: 2; + -moz-column-gap: 3em; + -moz-column-rule: #c8c8c8 1px dotted; + -webkit-column-count: 2; + -webkit-column-gap: 3em; + -webkit-column-rule: #c8c8c8 1px dotted; + column-count: 2; + column-gap: 3em; + column-rule: #c8c8c8 1px dotted; + } +} + + +/************************* + * iPad +*************************/ + +@media only screen and (min-width: 768px) and (max-width: 1024px) { + .lotus { + width: 600px; + } +} + + +/************************* + * iPhone +*************************/ + +@media only screen and (min-width: 320px) and (max-width: 767px) { + .lotus table th, + .lotus table td { + padding: 2px 0; + text-align: center; + vertical-align: middle; + } + .lotus { + width: 90%; + padding: 7em 5% 0 5%; + position: relative; + } + .index { + padding-top: 3em; + } + .lotus-nav { + width: 100%; + height: 42px; + top: 0; + position: absolute; + z-index: 1000; + background: -moz-linear-gradient( 90deg, #292929 0%, #404040 8%, #474747 14%, #474747 100%); + background: -webkit-linear-gradient( 90deg, #292929 0%, #404040 8%, #474747 14%, #474747 100%); + background: -ms-linear-gradient( 90deg, #292929 0%, #404040 8%, #474747 14%, #474747 100%); + background: linear-gradient( to 90deg, #292929 0%, #404040 8%, #474747 14%, #474747 100%); + border-left: none; + border-bottom: 1px solid #212121; + } + .lotus-nav ul { + width: 320px; + margin: 0 auto; + } + .lotus-nav ul li { + float: left; + width: 60px; + line-height: 42px; + border-top: 0; + } + .lotus-nav ul .home { + margin-bottom: 0; + } + .lotus-double .article-first { + width: 100%; + border-right: none; + border-bottom: 1px dotted #C8C8C8; + } + .lotus-double .article-last { + width: 100%; + margin-left: 0; + margin-top: 2em; + } + .iLight .lotus-nav { + background: #f1f1ed; + background: -moz-linear-gradient( 90deg, #e3e3e3 0%, #f1f1ed 8%, #f1f1ed 14%, #f1f1ed 100%); + background: -webkit-linear-gradient( 90deg, #e3e3e3 0%, #f1f1ed 8%, #f1f1ed 14%, #f1f1ed 100%); + background: -ms-linear-gradient( 90deg, #e3e3e3 0%, #f1f1ed 8%, #f1f1ed 14%, #f1f1ed 100%); + background: linear-gradient( to 90deg, #e3e3e3 0%, #f1f1ed 8%, #f1f1ed 14%, #f1f1ed 100%); + border-right: none; + border-bottom: 1px solid #dfdfdf; + } + .iLight .lotus-nav ul li { + border-top: 0; + } + .lotus-breadcrub { + padding-top: 10px; + } +} + + +/* + * for print + */ +@media print { + .lotus-nav { + display: none; + } +} diff --git a/tags.html b/tags.html index 5a7722be..c832ca27 100644 --- a/tags.html +++ b/tags.html @@ -1,4 +1,24 @@ --- -layout: tags +layout: page title: 文章标签 --- + +
        + {% for tag in site.tags %} + {{ tag[0] }} + {% endfor %} +
        +{% if site.tags.size %} +
          + {% for tag in site.tags %} +
        • + {{ tag[0] }} +
            + {% for post in tag[1] %} +
          • {{ post.date | date: "%Y-%m-%d" }} : {{ post.title }}
          • + {% endfor %} +
          +
        • + {% endfor %} +
        +{% endif %} diff --git a/uploads/2011/03/20110324-16-01.jpg b/uploads/2011/03/24_01.jpg similarity index 100% rename from uploads/2011/03/20110324-16-01.jpg rename to uploads/2011/03/24_01.jpg diff --git a/uploads/2011/03/20110324-16-02.jpg b/uploads/2011/03/24_02.jpg similarity index 100% rename from uploads/2011/03/20110324-16-02.jpg rename to uploads/2011/03/24_02.jpg diff --git a/uploads/2011/03/20110324-16-03.jpg b/uploads/2011/03/24_03.jpg similarity index 100% rename from uploads/2011/03/20110324-16-03.jpg rename to uploads/2011/03/24_03.jpg diff --git a/uploads/2011/03/20110324-16-04.jpg b/uploads/2011/03/24_04.jpg similarity index 100% rename from uploads/2011/03/20110324-16-04.jpg rename to uploads/2011/03/24_04.jpg diff --git a/uploads/2011/03/20110324-16-05.jpg b/uploads/2011/03/24_05.jpg similarity index 100% rename from uploads/2011/03/20110324-16-05.jpg rename to uploads/2011/03/24_05.jpg diff --git a/uploads/2011/03/20110324-16-06.jpg b/uploads/2011/03/24_06.jpg similarity index 100% rename from uploads/2011/03/20110324-16-06.jpg rename to uploads/2011/03/24_06.jpg diff --git a/uploads/2011/03/20110324-16-07.jpg b/uploads/2011/03/24_07.jpg similarity index 100% rename from uploads/2011/03/20110324-16-07.jpg rename to uploads/2011/03/24_07.jpg diff --git a/uploads/2011/03/20110324-16-08.jpg b/uploads/2011/03/24_08.jpg similarity index 100% rename from uploads/2011/03/20110324-16-08.jpg rename to uploads/2011/03/24_08.jpg diff --git a/uploads/2011/03/20110324-16-09.jpg b/uploads/2011/03/24_09.jpg similarity index 100% rename from uploads/2011/03/20110324-16-09.jpg rename to uploads/2011/03/24_09.jpg diff --git a/uploads/2011/03/20110324-16-10.jpg b/uploads/2011/03/24_10.jpg similarity index 100% rename from uploads/2011/03/20110324-16-10.jpg rename to uploads/2011/03/24_10.jpg diff --git a/uploads/2011/03/20110324-16-11.jpg b/uploads/2011/03/24_11.jpg similarity index 100% rename from uploads/2011/03/20110324-16-11.jpg rename to uploads/2011/03/24_11.jpg diff --git a/uploads/2011/03/20110324-16-12.jpg b/uploads/2011/03/24_12.jpg similarity index 100% rename from uploads/2011/03/20110324-16-12.jpg rename to uploads/2011/03/24_12.jpg diff --git a/uploads/2011/03/20110324-17-01.png b/uploads/2011/03/24_13.png similarity index 100% rename from uploads/2011/03/20110324-17-01.png rename to uploads/2011/03/24_13.png diff --git a/uploads/2011/03/20110324-17-02.png b/uploads/2011/03/24_14.png similarity index 100% rename from uploads/2011/03/20110324-17-02.png rename to uploads/2011/03/24_14.png diff --git a/uploads/2011/03/20110324-17-03.png b/uploads/2011/03/24_15.png similarity index 100% rename from uploads/2011/03/20110324-17-03.png rename to uploads/2011/03/24_15.png diff --git a/uploads/2011/03/20110324-17-04.png b/uploads/2011/03/24_16.png similarity index 100% rename from uploads/2011/03/20110324-17-04.png rename to uploads/2011/03/24_16.png diff --git a/uploads/2011/03/20110324-17-05.png b/uploads/2011/03/24_17.png similarity index 100% rename from uploads/2011/03/20110324-17-05.png rename to uploads/2011/03/24_17.png diff --git a/uploads/2011/03/20110324-17-06.png b/uploads/2011/03/24_18.png similarity index 100% rename from uploads/2011/03/20110324-17-06.png rename to uploads/2011/03/24_18.png diff --git a/uploads/2011/03/20110324-21-01.png b/uploads/2011/03/24_19.png similarity index 100% rename from uploads/2011/03/20110324-21-01.png rename to uploads/2011/03/24_19.png diff --git a/uploads/2011/03/20110324-21-02.png b/uploads/2011/03/24_20.png similarity index 100% rename from uploads/2011/03/20110324-21-02.png rename to uploads/2011/03/24_20.png diff --git a/uploads/2011/03/20110324-21-03.png b/uploads/2011/03/24_21.png similarity index 100% rename from uploads/2011/03/20110324-21-03.png rename to uploads/2011/03/24_21.png diff --git a/uploads/2011/03/20110324-21-04.png b/uploads/2011/03/24_22.png similarity index 100% rename from uploads/2011/03/20110324-21-04.png rename to uploads/2011/03/24_22.png diff --git a/uploads/2011/03/20110324-21-05.png b/uploads/2011/03/24_23.png similarity index 100% rename from uploads/2011/03/20110324-21-05.png rename to uploads/2011/03/24_23.png diff --git a/uploads/2011/03/20110324-21-06.png b/uploads/2011/03/24_24.png similarity index 100% rename from uploads/2011/03/20110324-21-06.png rename to uploads/2011/03/24_24.png diff --git a/uploads/2011/03/20110324-21-07.png b/uploads/2011/03/24_25.png similarity index 100% rename from uploads/2011/03/20110324-21-07.png rename to uploads/2011/03/24_25.png diff --git a/uploads/2011/03/20110324-21-08.png b/uploads/2011/03/24_26.png similarity index 100% rename from uploads/2011/03/20110324-21-08.png rename to uploads/2011/03/24_26.png diff --git a/uploads/2011/03/20110324-21-09.png b/uploads/2011/03/24_27.png similarity index 100% rename from uploads/2011/03/20110324-21-09.png rename to uploads/2011/03/24_27.png diff --git a/uploads/2011/03/20110324-21-10.png b/uploads/2011/03/24_28.png similarity index 100% rename from uploads/2011/03/20110324-21-10.png rename to uploads/2011/03/24_28.png diff --git a/uploads/2011/03/20110324-21-11.png b/uploads/2011/03/24_29.png similarity index 100% rename from uploads/2011/03/20110324-21-11.png rename to uploads/2011/03/24_29.png diff --git a/uploads/2011/03/20110324-21-12.png b/uploads/2011/03/24_30.png similarity index 100% rename from uploads/2011/03/20110324-21-12.png rename to uploads/2011/03/24_30.png diff --git a/uploads/2011/03/20110324-21-13.png b/uploads/2011/03/24_31.png similarity index 100% rename from uploads/2011/03/20110324-21-13.png rename to uploads/2011/03/24_31.png diff --git a/uploads/2011/03/20110324-17-07.png b/uploads/2011/03/24_32.png similarity index 100% rename from uploads/2011/03/20110324-17-07.png rename to uploads/2011/03/24_32.png diff --git a/uploads/2011/03/20110325-18-01.png b/uploads/2011/03/25_01.png similarity index 100% rename from uploads/2011/03/20110325-18-01.png rename to uploads/2011/03/25_01.png diff --git a/uploads/2011/03/20110325-18-02.png b/uploads/2011/03/25_02.png similarity index 100% rename from uploads/2011/03/20110325-18-02.png rename to uploads/2011/03/25_02.png diff --git a/uploads/2011/03/20110325-18-03.png b/uploads/2011/03/25_03.png similarity index 100% rename from uploads/2011/03/20110325-18-03.png rename to uploads/2011/03/25_03.png diff --git a/uploads/2011/03/20110325-18-04.png b/uploads/2011/03/25_04.png similarity index 100% rename from uploads/2011/03/20110325-18-04.png rename to uploads/2011/03/25_04.png diff --git a/uploads/2011/03/20110325-18-05.png b/uploads/2011/03/25_05.png similarity index 100% rename from uploads/2011/03/20110325-18-05.png rename to uploads/2011/03/25_05.png diff --git a/uploads/2011/03/20110325-18-06.png b/uploads/2011/03/25_06.png similarity index 100% rename from uploads/2011/03/20110325-18-06.png rename to uploads/2011/03/25_06.png diff --git a/uploads/2011/03/20110325-18-07.png b/uploads/2011/03/25_07.png similarity index 100% rename from uploads/2011/03/20110325-18-07.png rename to uploads/2011/03/25_07.png diff --git a/uploads/2011/03/20110325-18-08.png b/uploads/2011/03/25_08.png similarity index 100% rename from uploads/2011/03/20110325-18-08.png rename to uploads/2011/03/25_08.png diff --git a/uploads/2011/03/20110325-18-09.png b/uploads/2011/03/25_09.png similarity index 100% rename from uploads/2011/03/20110325-18-09.png rename to uploads/2011/03/25_09.png diff --git a/uploads/2011/03/20110325-18-10.png b/uploads/2011/03/25_10.png similarity index 100% rename from uploads/2011/03/20110325-18-10.png rename to uploads/2011/03/25_10.png diff --git a/uploads/2011/03/25_11.png b/uploads/2011/03/25_11.png new file mode 100755 index 00000000..a3e9d79d Binary files /dev/null and b/uploads/2011/03/25_11.png differ diff --git a/uploads/2011/03/20110330-6-01.png b/uploads/2011/03/30_01.png similarity index 100% rename from uploads/2011/03/20110330-6-01.png rename to uploads/2011/03/30_01.png diff --git a/uploads/2011/04/20110401-24-01.jpg b/uploads/2011/04/01_01.jpg similarity index 100% rename from uploads/2011/04/20110401-24-01.jpg rename to uploads/2011/04/01_01.jpg diff --git a/uploads/2011/04/20110401-24-02.jpg b/uploads/2011/04/01_02.jpg similarity index 100% rename from uploads/2011/04/20110401-24-02.jpg rename to uploads/2011/04/01_02.jpg diff --git a/uploads/2011/04/20110401-24-03.jpg b/uploads/2011/04/01_03.jpg similarity index 100% rename from uploads/2011/04/20110401-24-03.jpg rename to uploads/2011/04/01_03.jpg diff --git a/uploads/2011/04/20110401-24-04.jpg b/uploads/2011/04/01_04.jpg similarity index 100% rename from uploads/2011/04/20110401-24-04.jpg rename to uploads/2011/04/01_04.jpg diff --git a/uploads/2011/04/20110401-24-05.jpg b/uploads/2011/04/01_05.jpg similarity index 100% rename from uploads/2011/04/20110401-24-05.jpg rename to uploads/2011/04/01_05.jpg diff --git a/uploads/2011/04/20110403-30-01.png b/uploads/2011/04/03_01.png similarity index 100% rename from uploads/2011/04/20110403-30-01.png rename to uploads/2011/04/03_01.png diff --git a/uploads/2011/04/20110404-34-01.png b/uploads/2011/04/04_01.png similarity index 100% rename from uploads/2011/04/20110404-34-01.png rename to uploads/2011/04/04_01.png diff --git a/uploads/2011/04/20110421-100-01.png b/uploads/2011/04/21_01.png similarity index 100% rename from uploads/2011/04/20110421-100-01.png rename to uploads/2011/04/21_01.png diff --git a/uploads/2011/04/20110421-100-02.png b/uploads/2011/04/21_02.png similarity index 100% rename from uploads/2011/04/20110421-100-02.png rename to uploads/2011/04/21_02.png diff --git a/uploads/2011/04/20110422-102-01.png b/uploads/2011/04/22_01.png similarity index 100% rename from uploads/2011/04/20110422-102-01.png rename to uploads/2011/04/22_01.png diff --git a/uploads/2011/04/20110422-102-02.png b/uploads/2011/04/22_02.png similarity index 100% rename from uploads/2011/04/20110422-102-02.png rename to uploads/2011/04/22_02.png diff --git a/uploads/2011/04/20110422-102-03.png b/uploads/2011/04/22_03.png similarity index 100% rename from uploads/2011/04/20110422-102-03.png rename to uploads/2011/04/22_03.png diff --git a/uploads/2011/04/20110422-101-01.png b/uploads/2011/04/22_04.png similarity index 100% rename from uploads/2011/04/20110422-101-01.png rename to uploads/2011/04/22_04.png diff --git a/uploads/2011/04/20110422-101-02.png b/uploads/2011/04/22_05.png similarity index 100% rename from uploads/2011/04/20110422-101-02.png rename to uploads/2011/04/22_05.png diff --git a/uploads/2011/04/20110422-101-03.png b/uploads/2011/04/22_06.png similarity index 100% rename from uploads/2011/04/20110422-101-03.png rename to uploads/2011/04/22_06.png diff --git a/uploads/2011/04/20110422-101-04.png b/uploads/2011/04/22_07.png similarity index 100% rename from uploads/2011/04/20110422-101-04.png rename to uploads/2011/04/22_07.png diff --git a/uploads/2011/04/20110428-105-01.png b/uploads/2011/04/28_01.png similarity index 100% rename from uploads/2011/04/20110428-105-01.png rename to uploads/2011/04/28_01.png diff --git a/uploads/2011/05/20110507-119-01.png b/uploads/2011/05/07_01.png similarity index 100% rename from uploads/2011/05/20110507-119-01.png rename to uploads/2011/05/07_01.png diff --git a/uploads/2011/05/20110507-119-02.jpg b/uploads/2011/05/07_02.jpg similarity index 100% rename from uploads/2011/05/20110507-119-02.jpg rename to uploads/2011/05/07_02.jpg diff --git a/uploads/2011/05/20110507-119-03.jpg b/uploads/2011/05/07_03.jpg similarity index 100% rename from uploads/2011/05/20110507-119-03.jpg rename to uploads/2011/05/07_03.jpg diff --git a/uploads/2011/05/20110508-121-01.png b/uploads/2011/05/08_01.png similarity index 100% rename from uploads/2011/05/20110508-121-01.png rename to uploads/2011/05/08_01.png diff --git a/uploads/2011/05/20110508-120-02.png b/uploads/2011/05/08_02.png similarity index 100% rename from uploads/2011/05/20110508-120-02.png rename to uploads/2011/05/08_02.png diff --git a/uploads/2011/05/20110508-120-03.png b/uploads/2011/05/08_03.png similarity index 100% rename from uploads/2011/05/20110508-120-03.png rename to uploads/2011/05/08_03.png diff --git a/uploads/2011/05/20110508-120-01.png b/uploads/2011/05/08_04.png similarity index 100% rename from uploads/2011/05/20110508-120-01.png rename to uploads/2011/05/08_04.png diff --git a/uploads/2011/05/20110510-122-01.png b/uploads/2011/05/10_01.png similarity index 100% rename from uploads/2011/05/20110510-122-01.png rename to uploads/2011/05/10_01.png diff --git a/uploads/2011/05/20110512-129-01.png b/uploads/2011/05/12_01.png similarity index 100% rename from uploads/2011/05/20110512-129-01.png rename to uploads/2011/05/12_01.png diff --git a/uploads/2011/05/20110513-130-01.png b/uploads/2011/05/13_01.png similarity index 100% rename from uploads/2011/05/20110513-130-01.png rename to uploads/2011/05/13_01.png diff --git a/uploads/2011/05/20110513-131-01.png b/uploads/2011/05/13_02.png similarity index 100% rename from uploads/2011/05/20110513-131-01.png rename to uploads/2011/05/13_02.png diff --git a/uploads/2011/06/20110609-163-01.png b/uploads/2011/06/09_01.png similarity index 100% rename from uploads/2011/06/20110609-163-01.png rename to uploads/2011/06/09_01.png diff --git a/uploads/2011/06/20110610-165-01.png b/uploads/2011/06/10_01.png similarity index 100% rename from uploads/2011/06/20110610-165-01.png rename to uploads/2011/06/10_01.png diff --git a/uploads/2011/06/20110620-172-01.png b/uploads/2011/06/20_01.png similarity index 100% rename from uploads/2011/06/20110620-172-01.png rename to uploads/2011/06/20_01.png diff --git a/uploads/2011/06/20110621-173_01.jpg b/uploads/2011/06/21_01.jpg similarity index 100% rename from uploads/2011/06/20110621-173_01.jpg rename to uploads/2011/06/21_01.jpg diff --git a/uploads/2011/06/20110627-177-01.png b/uploads/2011/06/27-1.png similarity index 100% rename from uploads/2011/06/20110627-177-01.png rename to uploads/2011/06/27-1.png diff --git a/uploads/2011/06/20110629-178-01.png b/uploads/2011/06/29_01.png similarity index 100% rename from uploads/2011/06/20110629-178-01.png rename to uploads/2011/06/29_01.png diff --git a/uploads/2011/07/20110720-191-01.jpg b/uploads/2011/07/20_01.jpg similarity index 100% rename from uploads/2011/07/20110720-191-01.jpg rename to uploads/2011/07/20_01.jpg diff --git a/uploads/2011/07/20110720-191-02.jpg b/uploads/2011/07/20_02.jpg similarity index 100% rename from uploads/2011/07/20110720-191-02.jpg rename to uploads/2011/07/20_02.jpg diff --git a/uploads/2011/07/20110720-191-03.jpg b/uploads/2011/07/20_03.jpg similarity index 100% rename from uploads/2011/07/20110720-191-03.jpg rename to uploads/2011/07/20_03.jpg diff --git a/uploads/2011/07/20110724-193-01.jpg b/uploads/2011/07/24_01.jpg similarity index 100% rename from uploads/2011/07/20110724-193-01.jpg rename to uploads/2011/07/24_01.jpg diff --git a/uploads/2011/07/20110724-193-02.jpg b/uploads/2011/07/24_02.jpg similarity index 100% rename from uploads/2011/07/20110724-193-02.jpg rename to uploads/2011/07/24_02.jpg diff --git a/uploads/2011/07/20110724-193-03.jpg b/uploads/2011/07/24_03.jpg similarity index 100% rename from uploads/2011/07/20110724-193-03.jpg rename to uploads/2011/07/24_03.jpg diff --git a/uploads/2011/07/20110724-193-04.jpg b/uploads/2011/07/24_04.jpg similarity index 100% rename from uploads/2011/07/20110724-193-04.jpg rename to uploads/2011/07/24_04.jpg diff --git a/uploads/2011/07/20110724-193-05.jpg b/uploads/2011/07/24_05.jpg similarity index 100% rename from uploads/2011/07/20110724-193-05.jpg rename to uploads/2011/07/24_05.jpg diff --git a/uploads/2011/07/20110724-193-06.jpg b/uploads/2011/07/24_06.jpg similarity index 100% rename from uploads/2011/07/20110724-193-06.jpg rename to uploads/2011/07/24_06.jpg diff --git a/uploads/2011/07/20110724-193-07.jpg b/uploads/2011/07/24_07.jpg similarity index 100% rename from uploads/2011/07/20110724-193-07.jpg rename to uploads/2011/07/24_07.jpg diff --git a/uploads/2011/07/20110724-193-08.jpg b/uploads/2011/07/24_08.jpg similarity index 100% rename from uploads/2011/07/20110724-193-08.jpg rename to uploads/2011/07/24_08.jpg diff --git a/uploads/2011/07/20110724-193-09.jpg b/uploads/2011/07/24_09.jpg similarity index 100% rename from uploads/2011/07/20110724-193-09.jpg rename to uploads/2011/07/24_09.jpg diff --git a/uploads/2011/07/20110724-193-10.jpg b/uploads/2011/07/24_10.jpg similarity index 100% rename from uploads/2011/07/20110724-193-10.jpg rename to uploads/2011/07/24_10.jpg diff --git a/uploads/2011/07/20110724-193-11.jpg b/uploads/2011/07/24_11.jpg similarity index 100% rename from uploads/2011/07/20110724-193-11.jpg rename to uploads/2011/07/24_11.jpg diff --git a/uploads/2011/07/20110724-193-12.jpg b/uploads/2011/07/24_12.jpg similarity index 100% rename from uploads/2011/07/20110724-193-12.jpg rename to uploads/2011/07/24_12.jpg diff --git a/uploads/2011/07/20110724-193-13.jpg b/uploads/2011/07/24_13.jpg similarity index 100% rename from uploads/2011/07/20110724-193-13.jpg rename to uploads/2011/07/24_13.jpg diff --git a/uploads/2011/07/20110724-193-14.jpg b/uploads/2011/07/24_14.jpg similarity index 100% rename from uploads/2011/07/20110724-193-14.jpg rename to uploads/2011/07/24_14.jpg diff --git a/uploads/2011/07/20110724-193-15.jpg b/uploads/2011/07/24_15.jpg similarity index 100% rename from uploads/2011/07/20110724-193-15.jpg rename to uploads/2011/07/24_15.jpg diff --git a/uploads/2011/07/20110724-193-16.jpg b/uploads/2011/07/24_16.jpg similarity index 100% rename from uploads/2011/07/20110724-193-16.jpg rename to uploads/2011/07/24_16.jpg diff --git a/uploads/2011/07/20110724-193-17.jpg b/uploads/2011/07/24_17.jpg similarity index 100% rename from uploads/2011/07/20110724-193-17.jpg rename to uploads/2011/07/24_17.jpg diff --git a/uploads/2011/09/20110904-215-01.png b/uploads/2011/09/04_01.png similarity index 100% rename from uploads/2011/09/20110904-215-01.png rename to uploads/2011/09/04_01.png diff --git a/uploads/2011/09/20110905-216-01.jpg b/uploads/2011/09/05_01.jpg similarity index 100% rename from uploads/2011/09/20110905-216-01.jpg rename to uploads/2011/09/05_01.jpg diff --git a/uploads/2012/09/20120929-247-01.jpg b/uploads/2012/09/29_01.jpg similarity index 100% rename from uploads/2012/09/20120929-247-01.jpg rename to uploads/2012/09/29_01.jpg diff --git a/uploads/2012/11/20121117-251-01.png b/uploads/2012/11/17_01.png similarity index 100% rename from uploads/2012/11/20121117-251-01.png rename to uploads/2012/11/17_01.png diff --git a/uploads/2013/03/20130303-253-01.png b/uploads/2013/03/03_01.png similarity index 100% rename from uploads/2013/03/20130303-253-01.png rename to uploads/2013/03/03_01.png diff --git a/uploads/2013/07/2013071001-01.png b/uploads/2013/07/10_01-blame-view.png similarity index 100% rename from uploads/2013/07/2013071001-01.png rename to uploads/2013/07/10_01-blame-view.png diff --git a/uploads/2013/07/2013071001-02.png b/uploads/2013/07/10_02-diff-view.png similarity index 100% rename from uploads/2013/07/2013071001-02.png rename to uploads/2013/07/10_02-diff-view.png diff --git a/uploads/2013/07/2013071001-03.png b/uploads/2013/07/10_03-log-view.png similarity index 100% rename from uploads/2013/07/2013071001-03.png rename to uploads/2013/07/10_03-log-view.png diff --git a/uploads/2013/07/2013071001-04.png b/uploads/2013/07/10_04-main-view-split.png similarity index 100% rename from uploads/2013/07/2013071001-04.png rename to uploads/2013/07/10_04-main-view-split.png diff --git a/uploads/2013/07/2013071001-05.png b/uploads/2013/07/10_05-main-view.png similarity index 100% rename from uploads/2013/07/2013071001-05.png rename to uploads/2013/07/10_05-main-view.png diff --git a/uploads/2013/07/2013071001-06.png b/uploads/2013/07/10_06-rev-graph.png similarity index 100% rename from uploads/2013/07/2013071001-06.png rename to uploads/2013/07/10_06-rev-graph.png diff --git a/uploads/2013/07/2013071001-07.png b/uploads/2013/07/10_07-tree-view.png similarity index 100% rename from uploads/2013/07/2013071001-07.png rename to uploads/2013/07/10_07-tree-view.png diff --git a/uploads/2017/04/2017040801-01.png b/uploads/2017/04/2017040801-01.png deleted file mode 100644 index a4e0109e..00000000 Binary files a/uploads/2017/04/2017040801-01.png and /dev/null differ diff --git a/uploads/2017/04/2017040801-02.png b/uploads/2017/04/2017040801-02.png deleted file mode 100644 index 21baae6a..00000000 Binary files a/uploads/2017/04/2017040801-02.png and /dev/null differ diff --git a/uploads/2017/04/2017040801-03.png b/uploads/2017/04/2017040801-03.png deleted file mode 100644 index 307de743..00000000 Binary files a/uploads/2017/04/2017040801-03.png and /dev/null differ diff --git a/uploads/2017/04/2017040801-04.png b/uploads/2017/04/2017040801-04.png deleted file mode 100644 index 37791f84..00000000 Binary files a/uploads/2017/04/2017040801-04.png and /dev/null differ diff --git a/uploads/2023/07/2023070201-01.png b/uploads/2023/07/2023070201-01.png deleted file mode 100644 index 225b1ee7..00000000 Binary files a/uploads/2023/07/2023070201-01.png and /dev/null differ diff --git a/uploads/2024/04/2024040801-01.png b/uploads/2024/04/2024040801-01.png deleted file mode 100644 index 738bed8a..00000000 Binary files a/uploads/2024/04/2024040801-01.png and /dev/null differ diff --git a/uploads/2024/04/2024040801-02.png b/uploads/2024/04/2024040801-02.png deleted file mode 100644 index 203f42f1..00000000 Binary files a/uploads/2024/04/2024040801-02.png and /dev/null differ diff --git a/uploads/2024/04/2024040801-03.png b/uploads/2024/04/2024040801-03.png deleted file mode 100644 index dff24ee7..00000000 Binary files a/uploads/2024/04/2024040801-03.png and /dev/null differ diff --git a/uploads/2024/04/2024040801-04.png b/uploads/2024/04/2024040801-04.png deleted file mode 100644 index e290bb39..00000000 Binary files a/uploads/2024/04/2024040801-04.png and /dev/null differ diff --git a/uploads/2024/04/2024040801-05.png b/uploads/2024/04/2024040801-05.png deleted file mode 100644 index 5c7e040e..00000000 Binary files a/uploads/2024/04/2024040801-05.png and /dev/null differ diff --git a/uploads/2024/04/2024040801-06.png b/uploads/2024/04/2024040801-06.png deleted file mode 100644 index a5c793e4..00000000 Binary files a/uploads/2024/04/2024040801-06.png and /dev/null differ diff --git a/uploads/2024/04/2024040801-07.png b/uploads/2024/04/2024040801-07.png deleted file mode 100644 index 94575d8b..00000000 Binary files a/uploads/2024/04/2024040801-07.png and /dev/null differ diff --git a/uploads/2024/04/2024041402-01.jpg b/uploads/2024/04/2024041402-01.jpg deleted file mode 100644 index 546a5921..00000000 Binary files a/uploads/2024/04/2024041402-01.jpg and /dev/null differ diff --git a/uploads/2024/04/2024041402-02.jpg b/uploads/2024/04/2024041402-02.jpg deleted file mode 100644 index a3b8b7c9..00000000 Binary files a/uploads/2024/04/2024041402-02.jpg and /dev/null differ diff --git a/uploads/2024/04/2024042101-01.png b/uploads/2024/04/2024042101-01.png deleted file mode 100644 index 12f0be11..00000000 Binary files a/uploads/2024/04/2024042101-01.png and /dev/null differ diff --git a/uploads/2024/04/2024042101-02.png b/uploads/2024/04/2024042101-02.png deleted file mode 100644 index 46b0464c..00000000 Binary files a/uploads/2024/04/2024042101-02.png and /dev/null differ diff --git a/uploads/2024/05/2024051201-01.png b/uploads/2024/05/2024051201-01.png deleted file mode 100755 index 9a3f670e..00000000 Binary files a/uploads/2024/05/2024051201-01.png and /dev/null differ diff --git a/uploads/2024/05/2024051201-02.png b/uploads/2024/05/2024051201-02.png deleted file mode 100755 index 173da9c9..00000000 Binary files a/uploads/2024/05/2024051201-02.png and /dev/null differ diff --git a/uploads/2024/05/2024052401-01.png b/uploads/2024/05/2024052401-01.png deleted file mode 100755 index ccf701db..00000000 Binary files a/uploads/2024/05/2024052401-01.png and /dev/null differ diff --git a/uploads/2024/05/2024052401-02.png b/uploads/2024/05/2024052401-02.png deleted file mode 100755 index 048382ff..00000000 Binary files a/uploads/2024/05/2024052401-02.png and /dev/null differ diff --git a/uploads/2024/05/2024052401-03.png b/uploads/2024/05/2024052401-03.png deleted file mode 100755 index ec22aeba..00000000 Binary files a/uploads/2024/05/2024052401-03.png and /dev/null differ diff --git a/uploads/2024/05/2024052401-04.png b/uploads/2024/05/2024052401-04.png deleted file mode 100755 index 52f6752f..00000000 Binary files a/uploads/2024/05/2024052401-04.png and /dev/null differ