【代码札记】 从零开始的Clojure环境搭建
我现在日常开发的主力语言是 Java 和 Kotlin,其中后者可能占比更加多一些,如果可以的话我尽可能的会选择 Kotlin 来做我熟悉的事情,但是另一种情况,比如尝试我以前未曾涉足过的非 Kotlin 原生框架(例如 DeepLearning4J
),我就比较偏好于使用 Java,因为通常情况下我可以从框架的文档处很方便的复制粘贴来一些代码跑跑看。
我现在日常开发的主力语言是 Java 和 Kotlin,其中后者可能占比更加多一些,如果可以的话我尽可能的会选择 Kotlin 来做我熟悉的事情,但是另一种情况,比如尝试我以前未曾涉足过的非 Kotlin 原生框架(例如 DeepLearning4J
),我就比较偏好于使用 Java,因为通常情况下我可以从框架的文档处很方便的复制粘贴来一些代码跑跑看。
目前使用的 Mirages 主题已经很漂亮了,但是考虑到我个人需求比较刁钻,因此对其文件进行了修改。本文将记述当前对于 Mirages 主题文件的一些修改,以便后续升级之后手动维护和排除差错之用。
众所周知,个人博客这个东西向来都是干砸钱不赚钱,想弄些广告补贴收入,用户体验就会直线下滑。本文将尝试在 Typecho 的摘要线处添加广告。
在 Typecho 中,摘要线就是 <!-- more -->
,在网页源代码中可以看到这一行就以 HTML 注释的方式存在着,因此本文的目的就是尝试将广告放在摘要线下面。
关于广告的位置,我考虑了很多地方,最开始就是放在版权声明的下面,但是谷歌广告联盟很贼啊,你不把页面拖到下面,他就不算一次展示,所以平均下来我这一天还没有 100 次展示量呢。可是用谷歌的自动广告,它选的位置我都不喜欢。比如一打开网页在文章前面放一个广告,这固然有助于收益,但是我个人认为这个位置太具有侵略性了,人家点进来是看文章的,你给人家先放个广告,给人感觉过于的重视盈利了。其他的位置,诸如文章中间插入,在我看来完全就是不可接受的,毕竟文章还是一个整体,中间插入一个广告就非常影响阅读体验。就目前而言,本站也并非所有文章都开启了摘要线广告。原来处于「1080P 番剧补全计划」、「随便写写」、「读书」分类下,那些我很在意阅读体验的文章,我都关掉了广告。毕竟我还是觉得我的个人博客还是以生活为主,盈利还是第二位的。
关于广告联盟,我选择谷歌 AdSense,其他广告联盟应该也行,如果比较野性的话,选择 TrafficJunky 也不失为一种办法,可能 R18 的广告点击率会更高,收益也更高呢,反正我是没渴求收益到这种程度,就谷歌挺好。
关于广告类型,我在版权处使用的广告单元类型是「展示广告」,他比较适合在一个框框内自成一体。而文章中间这种类型就不太行了,我使用的是「文章内嵌广告」,在 PC 上更贴合一些,手机上嘛,我现在的手机坏了,疫情闹得我也出不了门,买的备用机也一直没发货,所以尚不可知。但是考虑到手机屏幕的尺寸,我觉得在手机端这两种广告区别不大。
为了方便日后更换广告代码,我决定不把广告代码写死在 PHP 页面里,这是一方面,另一方面是 PHP 我也不熟悉,多行字符串我也不会弄,最后改完了整的文件看起来很不优雅。所以最终我决定使用一个啥也不干的插件,专门存储广告代码。
请在网站根目录下 /usr/plugins/AdSense/Plugin.php
写入如下内容,其中路径里的 AdSense
是插件名,可以自定义,但是要确保和下面的内容对上:
- <?php
- /**
- * AdSense
- *
- * @package AdSense
- * @author 天空Blond
- * @version 1.0.0
- * @link https://skyblond.info
- */
- class AdSense_Plugin implements Typecho_Plugin_Interface{
- /* 激活插件方法 */
- public static function activate(){}
-
- /* 禁用插件方法 */
- public static function deactivate(){}
-
- /* 插件配置方法 */
- public static function config(Typecho_Widget_Helper_Form $form){
- $ad = new Typecho_Widget_Helper_Form_Element_Textarea('adsenseCode', NULL, '',_t('AdSense代码'), _t('推荐使用文章内嵌广告单元'));
- $form->addInput($ad);
- }
-
- /* 个人用户的配置方法 */
- public static function personalConfig(Typecho_Widget_Helper_Form $form){}
-
- /* 插件实现方法 */
- public static function render(){}
- }
- ?>
这个模板来自于 Typecho 插件开发文档,关于对上述代码的修改,也可以参照文档进行。
上面的代码做的事就是在注册一个插件设置,名字叫 adsenseCode
,可供输入多行文本。之后可以通过 Typecho_Widget::widget('Widget_Options')->plugin('AdSense')->adsenseCode
来调用这里面存储的值。
这部分本来也想用插件来实现的来着,但是插件文档似乎并没有提到有关于控制文章内容的接口。故这里直接通过修改负责显示文章的文件来达成。在我使用的主题中,负责显示的文件是网页根目录下 /usr/themes/Mirages/post.php
文件,其中负责显示的是 echo Content::parse($this->content);
这一句,我们需要修改这一句让他来显示广告。
$this->content
中会包含 <!--more-->
,此处可以使用 PHP 自带的字符串替换功能来实现,同时为了让是否显示摘要线广告可控,可以利用文章的自定义字段来控制。这里我判断 hideAds
字段的值是否为 true
,是则隐藏广告,否则默认是显示。
需要注意的是如果只替换 <!-- more -->
,则有可能会处理掉文章中的内容,实践中摘要分割线一定是在段落(<p></p>
)后,所以可以连 </p>
一起作为判断,进行替换。
最终替换的代码如下:
- <?php
- if(Utils::isTrue($this->fields->hideAds)){
- echo Content::parse($this->content);
- }else{
- echo str_replace("</p><!--more-->",'</p><!-- more --><br/>' . Typecho_Widget::widget('Widget_Options')->plugin('AdSense')->adsenseCode . '<br/>', Content::parse($this->content));
- }
- ?>
其中 Utils::isTrue
是我用的主题自带的函数,其实现如下:
- public static function isTrue($field, $key = NULL) {
- if (is_array($field) && !empty($key)) {
- return in_array($key, $field);
- }
- return $field > 0 || strtolower($field) == 'true';
- }
其实只要最后一个 return
语句就行了。
最后保存文件,记得在设置里填上正确的广告代码,应该就可以了。如果想关闭摘要线广告,只要设定自定义字段,名称叫 hideAds
并设置值为 true
或者大于 0 的整数。
如果你想默认隐藏广告,可以利用 showAds
来进行判断,并反转上面代码的 if-else
字段。
- 全文完 -
原来的手机因为电池鼓起来把后盖顶开了,没法用了。遂启用了备用机的备用机(备用机因为 2019-nCov 的影响,发货时间尚不可知),是 HTC M8,运行安卓 6.0 系统,实测没法安装科学上网的 app,由此很不方便,而且好像也没法手动设定 DNS 服务器等设置,不然就可以做 SNI 反代了。遂在无奈之下,考虑按照网站架设反向代理。
最近开始入门脉冲神经网络,本来想用这个做个单神经元 XOR,结果发现 1993 年的同行们已经发过论文了,而且还设计了 4 种不同的神经元。我想把论文下载来看看,结果因为没用校园网,被施普林格拦住了,想在家下载还得花美元。下个论文跟遇见个拦路抢劫的似的,这上哪说理去。没辙,等开学回学校再说吧。
本文记述一种本打算在项目中实际使用的用户鉴权系统,但是由于过于复杂,初期并不考虑实装,故撰文记述以备后续之用。