Couch Elephant
Jekyll
2021-07-09T20:34:36+00:00
https://blog.iken.be/
https://blog.iken.be/
https://blog.iken.be/plex-resize-art
2021-05-21T20:55:00+00:00
2021-05-21T20:55:00+00:00
https://blog.iken.be
<h2 id="起因">起因</h2>
<p>在家里使用 Plex 来管理手头的各种媒体不知不觉已经很多年了。 最近发现 Plex Server 里面的 Metadata 文件夹异常地大,几乎占了我的 NAS 的 SSD 容量的一半。分析得知其中一些搜刮器(Scraper)自动下载到的图片分辨率超过千万像素,而这些图片的用途只是媒体的封面图和页面背景图,这么大的尺寸根本没用。于是写了点代码来自动处理这个东西。</p>
<p>因为 Plex 的插件使用的都是 Python, 我一开始也打算用 Python。 看了一下 Pillow (Python 的图片处理库) 之后感觉效率不佳,就还是用了 Shell Script 来写。 所以这东西的依赖是 bash 和 imagemagick, 在不同的 distro 下表现或者使用的命令可能略有不同。</p>
<h2 id="代码如下">代码如下</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nv">OIFS</span><span class="o">=</span><span class="s2">"</span><span class="nv">$IFS</span><span class="s2">"</span>
<span class="nv">IFS</span><span class="o">=</span><span class="s1">$'</span><span class="se">\n</span><span class="s1">'</span>
<span class="c">## Parameter how many folders you want to optimize, default @100 </span>
<span class="nv">target</span><span class="o">=</span><span class="k">${</span><span class="nv">1</span><span class="k">:-</span><span class="nv">100</span><span class="k">}</span>
<span class="c">## Use parameter "clear" to clean up marks of </span>
<span class="c">## EDIT BELOW TO MATCH YOUR OWN PATH TO PLEX SERVER!!!</span>
<span class="nv">path1</span><span class="o">=</span>/home/plex/config/Library/Application<span class="se">\ </span>Support/Plex<span class="se">\ </span>Media<span class="se">\ </span>Server/Metadata/Movies
<span class="c">## EDIT HERE TO CHANGE DESIRE IMAGE SIZE</span>
<span class="nv">size</span><span class="o">=</span>900x900
<span class="nv">suffix1</span><span class="o">=</span>/Contents/com.plexapp.agents.phoenixadult
<span class="nv">count</span><span class="o">=</span>0
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$1</span> <span class="o">==</span> <span class="s2">"clear"</span> <span class="o">]]</span><span class="p">;</span><span class="k">then
</span>find <span class="s2">"</span><span class="nv">$path1</span><span class="s2">"</span>/ <span class="nt">-name</span> <span class="s2">"opted"</span> <span class="nt">-exec</span> <span class="nb">rm</span> <span class="nt">-f</span> <span class="o">{}</span> <span class="se">\;</span>
<span class="nb">exit </span>0
<span class="k">fi
for </span>folder_1 <span class="k">in</span> <span class="s2">"</span><span class="nv">$path1</span><span class="s2">"</span>/<span class="k">*</span>/<span class="p">;</span> <span class="k">do
for </span>folder_2 <span class="k">in</span> <span class="s2">"</span><span class="nv">$folder_1</span><span class="s2">"</span><span class="k">*</span><span class="p">;</span> <span class="k">do
if</span> <span class="o">((</span> count < target <span class="o">))</span> <span class="o">&&</span> <span class="o">[</span> <span class="nt">-d</span> <span class="s2">"</span><span class="nv">$folder_2</span><span class="s2">""</span><span class="nv">$suffix1</span><span class="s2">"</span> <span class="o">]</span> <span class="o">&&</span> <span class="o">[</span> <span class="o">!</span> <span class="nt">-f</span> <span class="s2">"</span><span class="nv">$folder_2</span><span class="s2">""</span><span class="nv">$suffix1</span><span class="s2">"</span>/opted <span class="o">]</span><span class="p">;</span><span class="k">then
</span>mogrify <span class="nt">-resize</span> <span class="nv">$size</span> <span class="s2">"</span><span class="nv">$folder_2</span><span class="s2">""</span><span class="nv">$suffix1</span><span class="s2">""/art/"</span><span class="k">*</span>
mogrify <span class="nt">-resize</span> <span class="nv">$size</span> <span class="s2">"</span><span class="nv">$folder_2</span><span class="s2">""</span><span class="nv">$suffix1</span><span class="s2">""/posters/"</span><span class="k">*</span>
<span class="nb">touch</span> <span class="s2">"</span><span class="nv">$folder_2</span><span class="s2">""</span><span class="nv">$suffix1</span><span class="s2">"</span>/opted
<span class="nb">echo</span> <span class="s2">"</span><span class="k">${</span><span class="nv">folder_2</span>:79<span class="k">}</span><span class="s2">"" done"</span>
<span class="nb">let </span>count+<span class="o">=</span>1
<span class="k">fi
done
done
</span><span class="nb">echo</span> <span class="nv">$count</span>
<span class="nv">IFS</span><span class="o">=</span><span class="s2">"</span><span class="nv">$OIFS</span><span class="s2">"</span>
</code></pre></div></div>
<h2 id="效果">效果</h2>
<p>空间减负15GB, 比预想中差一点但是可以接受。 也许 imagemagick 有更详细的压缩/优化选项,暂不深究了。</p>
<p><a href="https://blog.iken.be/plex-resize-art/">给 PLEX 服务器批量缩图的脚本</a> was originally published by at <a href="https://blog.iken.be">Couch Elephant</a> on May 21, 2021.</p>
https://blog.iken.be/pal.exe
2017-03-17T00:16:01+00:00
2017-03-17T00:16:01+00:00
https://blog.iken.be
<p>如果没有仙剑奇侠传, 也许我的人生轨迹真的会有很大的变化。 仙剑这个游戏本身我们放到后面谈, 先聊聊我为了玩到这个游戏都付出了哪些努力。</p>
<p>用过或者见过软驱–floppy disc driver 的看官应该跟我一样对当年的电脑游戏有类似的体会:贵、娇气、还极度容易出现各种无法排查的毛病。</p>
<p>当时我碰到的第一座大山就是提示 “内存不足” 无法进入游戏。说出来你们可能不信,但是我小的时候是还没有互联网的。知识真的是来之不易,放今天搜十分钟搜不到答案的难题我基本上就放弃了,而年少的人总是喜欢死磕。无法运行的大概一个月后,我了解到原始的仙剑是基于 MS-DOS 操作系统的,要求至少 580k 的常规内存才能顺利通过自检进入游戏(在 DOS 系统里面,内存系统被划分为常规内存、高端内存、扩充内存、扩展内存)。 DOS 系统能用的常规内存总量也只有 640k, 正常情况下自带的应用、附加设备的驱动程序、需要常驻的程序和前台的程序都在常规内存里执行。 要把空闲内存提高到满足仙剑奇侠传的要求, 对一个小学生来说, 真的不比王者荣耀上钻石来得容易。 具体执行了哪些 “整理内存” 的步骤和操作我早就不记得了, 唯一记得的细节就是我姨父家里有一本 MS-DOS 7.2 的书被我翻到几百页的大部头皱得合不拢。 终于, 我成功地, 看到了憧憬已久的仙鹤闲云、葫芦短剑, 还有霸气侧漏的李大娘。</p>
<p>那年我只有11岁, 虽然那个年代还不流行各路补习社兴趣班, 能不受限制地玩电脑游戏还是想太多了。 更何况电脑还是个新鲜玩意,</p>
<p>故事开始在 <del>梁咏琪刚刚得到最受欢迎新人奖的年代</del>, 家中刚刚添置了一台联想出品配置齐全的家庭多媒体电脑的鄙人在充分钻研完当时显得分量特别足的随机光盘之后,开始把好奇的触角伸向了其他的方向。 电脑城作为当时先进资讯的输出港口,</p>
<p>结论:对RPG的热爱,仙侠题材、寻找资料、知识、解决问题的思想</p>
<p><a href="https://blog.iken.be/pal.exe/">20年前的仙剑给我带来了什么?</a> was originally published by at <a href="https://blog.iken.be">Couch Elephant</a> on March 17, 2017.</p>
https://blog.iken.be/A-Fight
2016-05-17T00:00:00+00:00
2016-05-17T00:00:00+00:00
https://blog.iken.be
<p>他们都说生命是一场战斗。我们看冰与火之歌、看电影小说、看动画片、看别人的战斗,都是为了赢自己的那场。</p>
<p>那赢了是不是就是得到自己想要的,快快乐乐的生活呢?如果一个人想要的只是所有人都痛苦煎熬呢?</p>
<p><a href="https://blog.iken.be/A-Fight/">战斗</a> was originally published by at <a href="https://blog.iken.be">Couch Elephant</a> on May 17, 2016.</p>
https://blog.iken.be/Win-8
2015-02-22T00:16:01+00:00
2015-02-22T00:16:01+00:00
https://blog.iken.be
<p>春节前去玩了,前前后后又各种折腾导致这边没有时间和机会静下心来学正经东西。首先是给自己买了台微软的 Surface Pro3 作为主力机,一方面是割草了,一方面是考虑到以后对移动工作的需求越来越多。</p>
<p>接着就是购入各种配件和折腾系统什么的,直到适应了能有效率地使用。其实现在主要用途也不过是编辑文档和处理图像。没有买原装的 Type Cover 键盘,而是买了一个 Filco 的 Minila Air,蓝牙无线机械,手感一流,尺寸跟 SP3 搭配也刚刚好,除了布局有点不同需要适应之外我很满意。 Docking Station 因为太贵也没有买,打算过一段时间入便宜一些的或者二手。</p>
<p><a href="https://blog.iken.be/Win-8/">一个纯折腾的过程</a> was originally published by at <a href="https://blog.iken.be">Couch Elephant</a> on February 22, 2015.</p>
https://blog.iken.be/Jekyll-Themes
2015-01-29T08:00:01+00:00
2015-01-29T08:00:01+00:00
https://blog.iken.be
<p>今天折腾了很多关于 Jekyll 的东西,甚至为了看看是不是能把主题包里多余的文件去掉在我电脑的 Win7 系统里装了 Nodejs + Bower, 结果反正是不太好。 我先整理整理思绪。</p>
<p>在一开始确定使用 Jekyll 之后对我来说就意味着要对这个 blog 的样式按我的喜好进行全面掌控。 是的这是个很不好的习惯。 算下来用 blog 来做写作的载体断断续续也有十年了,从最早的网易博客到微软的 Live Spaces 到 QQ 空间到 Blogbus(博客大巴) 到 WordPress 到各种各样的空间能数出不下二十种来,其实大量的时间都是花在了折腾模板啊自定义代码啊这些东西上面,大大压缩了真正沉淀心情思考与写作的时间。 就如同我目前的记录都只是限于这个服务本身,对于我要用它干什么我要达成怎样的目标,具体怎么实现我的目标反而成了次要的事情。 我知道折腾能让我获得知识和经验, 但是我现在更想要对我来说更重要的知识了。</p>
<p>能够使这次的折腾变得有价值的,当然是形成让更多人能重复利用甚至以此为基础发展得更好的东西。 我观察了好几个流行的或者设计很好的 Jekyll 主题,发现这些主题本身都做得不错,但是如果要进行定制的话就要对主题的结构啊资源啊进行比较长时间的研究和修改。 当然也可能是我理解能力比较差或者耐心没那么好, 这里就要说到导致我部署了 Nodejs&Bower 的一个主题了:</p>
<p><a href="http://charbelrami.github.io/material-jekyll">预览</a>
<a href="https://github.com/charbelrami/material-jekyll">项目</a></p>
<p>整个项目只有一个名字 “Material Design for Jekyll using Polymer”, 预览内容也很简单,看上去干干净净直接拿来就能用是吧? 看官您想得太简单了, 这个 repo 整个是有超过 1400 个文件的。 我还真的孤陋寡闻没见过一个空白博客有一千多个文件的。 WordPress 什么的是很大文件很多可是人家是后台程序啊, 一个生成静态文件的引擎没事要爬多久能把文件解析完? 是 Polymer 是特点就是组件化没错,问题是组件化的最大优点不应该是我用不到的组件我可以去掉么? 于是我开始研究怎么样获得我想要的没有多余文件的主题。</p>
<p>一开始我把 _config.yml 配置好之后就跑到 /bower_components 把感觉用不到的各种文件删了一通,然后发现里面竟然还有各种 test、 unit test 之类的目录,我就开了一下脑洞: 既然这是跟 Bower 有关的,到处都是 Bower 说不定 Bower 能告诉我哪些东西我这用到了没用到的它会帮我干掉,原作者是好心把所有组件放进来给我, 让我可以往主题里加入新组件啊! 事实证明我还是太天真了,经过 Nodejs 和 Bower 的全局部署,经过研究了一遍文档和网路上的教程,经过用 Bower 从头获取主题项目或者安装 Polymer 模块,我确定了主题作者一扶眼镜小键盘一敲嘴角一斜往 repo 里放的就是一整个 Polymer 的项目!!</p>
<p>然后现在我就有了两个选择:</p>
<p>A 分析主题作者在那几个文件里用到了哪些组件然后自己把用不着的去掉。<br />
B 自己结合 Polymer 从头弄一个主题,最好还是弄好了有指引可拓展易维护的。</p>
<p>哦还有一个第三种选择也就是我的选择: 把 A,B 都做一遍。 于是,现在我在看 Polymer 的文档了。</p>
<p>最后关于 Jekyll 的主题我想推荐一个人的作品: 设计师<a href="http://mademistakes.com/">Michael Rose</a>, <a href="https://github.com/mmistakes">GitHub</a>。 他的作品非常有设计感,完整性很强,做的每一套主题都有几百星。 有完整的安装说明甚至还有项目里每一个文件的目录和用途注释。 他还写了一个最简化的模板叫 skinny bones 来让人快速应用到一个 Jekyll 上并且很容易能自行定制。 我没有直接用的原因是他的主题都蛮依赖 font-awesome 字体图标, 国内用户很多会有自定义字体的习惯(例如我), 这样图标显示不正常的情况就会经常出现, 要去掉的话我还不确定会不会有啥别的问题出现。 所以,希望不怕这个问题的有兴趣的人试试。</p>
<p><a href="https://blog.iken.be/Jekyll-Themes/">Jekyll 以及 Jekyll 的模板们</a> was originally published by at <a href="https://blog.iken.be">Couch Elephant</a> on January 29, 2015.</p>
https://blog.iken.be/Blog-Environment
2015-01-26T08:00:01+00:00
2015-01-26T08:00:01+00:00
https://blog.iken.be
<p>在电脑上我是选择了 GitHub 的 Windows 客户端 + Sublime Text 3 来编辑和提交修改,不但可以很方便地编辑和预览 Markdown 文件,还可以对其它格式的文件很方便地操作。为了保持热情和更方便地更新文档,我还在手机上安装了 Pocket Git + JotterX 来执行相同的事情。这也有助于我对 Git 的版本管理和分支管理有更直观的理解。</p>
<p>我之前也有在用 Sublime Text, 不过还是又看了这篇 <a href="http://zh.lucida.me/blog/sublime-text-complete-guide/">Sublime Text 全程指南</a>, GUI 环境下我也同意这是目前综合考虑最好的编辑器了。</p>
<h2 id="jekyll-的主要作用">Jekyll 的主要作用:</h2>
<p>从 GitHub 的 <a href="https://pages.github.com/versions/">dependency versions</a> 可以得到默认支持的插件</p>
<blockquote>
<ul>
<li>jekyll</li>
<li>jekyll-coffeescript</li>
<li>jekyll-sass-converter</li>
<li>kramdown</li>
<li>maruku</li>
<li>rdiscount</li>
<li>redcarpet</li>
<li>RedCloth</li>
<li>liquid</li>
<li>pygments.rb</li>
<li>jemoji</li>
<li>jekyll-mentions</li>
<li>jekyll-redirect-from</li>
<li>jekyll-sitemap</li>
<li>github-pages</li>
<li>ruby</li>
</ul>
</blockquote>
<ol>
<li>把 Markdown 等标记语言的文件生成为静态文件。(支持数种转换引擎,在 _confi.yml 进行设置,我设为了 GFM 默认的 redcarpet)</li>
<li>使用 <a href="http://liquidmarkup.org/">Liquid</a> 把一些动态数据转化为静态页面。</li>
<li>转换 SASS 为标准 CSS</li>
<li>生成站点结构</li>
</ol>
<p>##如果直接使用 HTML+JS+CSS?</p>
<p>肉身管理静态站点的问题有很多,例如有的东西一旦修改就要一个一个文件全部改一遍。人又不可能把所有东西都做到最好保证以后就永远不需要修改,所以必然很痛苦。更何况世上本来就没有最好这一说。</p>
<p>JS 和 CSS 本来就是要人手写的, CoffeeScript 和 LESS SCSS 之类的据我目前的了解知识能一定程度地把这些东西简化而已。</p>
<p>所以思考了一番我还是坚持现在的选择,以后如果想改动或者迁移,这里的架构也很方便导入到别的地方去。</p>
<p>##Liquid 的研究</p>
<p>Jekyll 的最大优点之一就是对 Liquid 的支持,通过模板的指令在生成的静态页面里加入动态的内容。 比如 <a href="rsms.github.com">rsms</a> 在他的首页 html 加入了一些循环、判断、和限制:</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{% for post in site.posts limit:25 %}<span class="nt"><a</span>
<span class="na">href=</span><span class="s">"{{ post.url }}"</span> <span class="na">class=</span><span class="s">"post-excerpt{% if post.photo_url %} photo{% endif %}"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"padded-content"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"title"</span><span class="nt">></span>{{ post.title }}<span class="nt"></div></span>
{% if post.photo_url %}
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"image"</span> <span class="na">style=</span><span class="s">"background-image:url('{{ post.photo_url }}')"</span><span class="nt">></div></span>
{% else %}
<span class="c"><!-- <div class="title">{{ post.title }}</div> --></span>
<span class="nt"><info</span> <span class="na">datetime=</span><span class="s">"{{ page.date | date: "</span><span class="err">%</span><span class="na">Y-</span><span class="err">%</span><span class="na">m-</span><span class="err">%</span><span class="na">d</span><span class="err">"</span> <span class="err">}}"</span><span class="nt">></span>
{{ post.date | date: "%b %Y" }}
<span class="nt"></info></span>
{% if post.description %}
<span class="nt"><span</span> <span class="na">class=</span><span class="s">"body"</span><span class="nt">></span>{{ post.description | strip_html }}<span class="nt"></span></span>
{% else %}
<span class="nt"><span</span> <span class="na">class=</span><span class="s">"body"</span><span class="nt">></span>{{ post.excerpt | strip_html }}<span class="nt"></span></span>
{% endif %}
{% endif %}<span class="c"><!-- post.photo_url --></span>
<span class="nt"></div></span>
<span class="nt"></a></span>{% endfor %}
</code></pre></div></div>
<p>在首页显示日志,限制在25篇以内,判断是否显示为图片日志,判断是否显示摘要,都是很智能的规则。不过我还没找到 Liquid 的这些定义文档,或者应该是 GitHub 预设的这些定义?</p>
<p>Update: <br />
找到了 <a href="https://github.com/Shopify/liquid/wiki/Liquid-for-Designers">Liquid for Designers</a> 因为我从来没考虑过自己是不是 designer 所以完全忽略了。 <br />
还有 <a href="http://havee.me">Havanna</a> 翻译的<a href="http://havee.me/internet/2013-11/jekyll-liquid-designers.html">中文版</a>,虽然我不一定要中文,不过这位的文章配色看起来蛮舒服。</p>
<p><a href="https://blog.iken.be/Blog-Environment/">关于写作环境</a> was originally published by at <a href="https://blog.iken.be">Couch Elephant</a> on January 26, 2015.</p>
https://blog.iken.be/First-Post
2015-01-25T00:00:00+00:00
2015-01-25T00:00:00+00:00
https://blog.iken.be
<p>这是在 GitHub 上的第一篇日志,也是我希望自己能完成我的目标的开始。今天也是我的生日,今天起我就29岁了,有深深的触摸到了年轻的尾巴的感觉。在许多人都已经完成自己生命中的许多成就的年纪,我却即将迎来人生的重大转变。</p>
<p>放在这里的日志是由 Jekyll 处理的,所以接下来的时间我要先研究一下 Jekyll 的使用,最好能够摸索出合适的模板。目前通过<a href="http://jekyllrb.com/docs/">文档</a> 和网络上一些文章知道的事情有:</p>
<ul>
<li>文章放在 /_posts/ 支持 html 和 markdown 格式,以 yyyy-mm-dd-title.xx 格式命名</li>
<li>需要 Jekyll 处理的文件必须包含 yaml 文件头,里面的内容可以是空白的</li>
<li>预设布局放在 /_layouts/ 里面,所以每一篇文章都只需要包含正文。在文档里有 includes 的说明,暂时还不明确是不是有本质上的区别。</li>
<li>模板应该是基于 JS 和 CSS 的,不知道是否可以自己写一个。</li>
<li>由于是基于监视文件变化生成静态页面,体量过大的话会很慢,这一点以后如果出现问题的话再考虑解决的问题。</li>
</ul>
<p>经过几个小时摸索,确定了 GitHub Pages 的使用不需要本地部署 Jekyll,我的老电脑逃过一劫。 尝试了在 VPS 上部署 Jekyll 之后发现把 repository push 到 GitHub 之后直接正常显示,本地部署的作用主要是实时预览或者别的我暂时没用到的功能,现阶段搁置不管。</p>
<p>今天的折腾就到这里,明天的首要目标是导航条和模板设置,另外还应该处理好页面们的CSS。 Markdown 的列表显示似乎没有效果,晚上回家可以看看 GFM, 应该可以解决。</p>
<p>另:以前也没有用过 Git,命令行的话每次 add,commit,push 都要三步,应该看一下是不是有捷径。</p>
<p>25 Jan 2015</p>
<p><a href="https://blog.iken.be/First-Post/">第一篇,新的开始</a> was originally published by at <a href="https://blog.iken.be">Couch Elephant</a> on January 25, 2015.</p>