MENU

瞎折腾

平时随便搞的乱七八糟的东西。

【歪门邪道】在 Logisim 中实现32位超前进位加法器

这学期的课程普遍偏向硬件部分,正好我也补一补在硬件知识上的短缺。众所不一定周知,我这几年一直是在JVM上摸爬滚打,在硬件方面的发展早在六七年前就停了,一方面是家里不太适合放那些零碎的芯片,另一方面买芯片确实是得花钱,而写程序恰好还就能省钱。所以迫于金钱所困,十二岁从硬件入门这方面,两三年之后便开始转向Java的阵营(还是得说,Java天下第一,不接受其他任何观点),直至最近。上学期学了门数字逻辑,一下子觉得FPGA挺有意思,寒假也买了块学校同款芯片的FPGA开发板,是真他娘的贵,但是确实是有意思。遂决定趁此学期好好巩固一下硬件。(题外话:课余学习日语的计划真是荒废了好几年了,看来今年也够呛了呢)

Read More

【代码札记】 从零开始的Clojure环境搭建

我现在日常开发的主力语言是Java和Kotlin,其中后者可能占比更加多一些,如果可以的话我尽可能的会选择Kotlin来做我熟悉的事情,但是另一种情况,比如尝试我以前未曾涉足过的非Kotlin原生框架(例如DeepLearning4J),我就比较偏好于使用Java,因为通常情况下我可以从框架的文档处很方便的复制粘贴来一些代码跑跑看。

Read More

【歪门邪道】Typecho中在摘要线上放置广告

众所周知,个人博客这个东西向来都是干砸钱不赚钱,想弄些广告补贴收入,用户体验就会直线下滑。本文将尝试在Typecho的摘要线处添加广告。

摘要线和广告

在Typecho中,摘要线就是<!-- more -->,在网页源代码中可以看到这一行就以HTML注释的方式存在着,因此本文的目的就是尝试将广告放在摘要线下面。

关于广告的位置,我考虑了很多地方,最开始就是放在版权声明的下面,但是谷歌广告联盟很贼啊,你不把页面拖到下面,他就不算一次展示,所以平均下来我这一天还没有100次展示量呢。可是用谷歌的自动广告,它选的位置我都不喜欢。比如一打开网页在文章前面放一个广告,这固然有助于收益,但是我个人认为这个位置太具有侵略性了,人家点进来是看文章的,你给人家先放个广告,给人感觉过于的重视盈利了。其他的位置,诸如文章中间插入,在我看来完全就是不可接受的,毕竟文章还是一个整体,中间插入一个广告就非常影响阅读体验。就目前而言,本站也并非所有文章都开启了摘要线广告。原来处于「1080P番剧补全计划」、「随便写写」、「读书」分类下,那些我很在意阅读体验的文章,我都关掉了广告。毕竟我还是觉得我的个人博客还是以生活为主,盈利还是第二位的。

但有一说一CN2的线路是真的贵,要不然我也不至于通过广告来补贴点家用。

关于广告联盟,我选择谷歌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字段。

-全文完-

Read More