2019年10月

最近到手了一个很轻便的笔记本,换装Arch的时候遇到一个问题:界面会不断地刷pcie bus error的提示,类似于

pcieport 0000:00:01.1: PCIe Bus Error: severity=Corrected, type=Physical layer, id=00e5(Recelver ID)
......

不断刷屏,根本不知道自己的命令打成了什么样,更不要提查看结果了。

几经查阅,发现这个问题大概是由于硬件间通信速度不同导致的错误,除了更换插槽以增加两个硬件之间的物理距离外,没有其他的解决方案。所以如果系统运行正常,那么搁置这个问题即可。

所以,解决无望,只能想办法屏蔽这条消息。

方法很简单。在Arch安装盘的选择界面按e(类似于编辑grub的启动项),结尾增加 pci=nomsi,再回车进入安装程序即可。

同样的,如果在安装之后还出现这个问题,则可以将这个参数加入grub启动项中来解决。不过我这里在装好之后就好了,所以我感觉这可能是USB插槽距离CPU或者某些控制器有点儿近导致的吧…

视频点此

大概是从去年,Linux阵营的改善仿佛充了会员一般……越来越多的公司开始贴近Linux。比如说微软的Linux子系统、WPS重启了Linux版本的维护、Steam开始Steam Play项目,使得非Linux阵营可以运行Windows专属游戏、百度网盘的Linux版、NVIDIA开始在Linux的驱动中加入双显卡支持……

到现在,连QQ for Linux都诈尸了

现在,在电脑版的QQ下载页的其他产品中,赫然放着 QQ for Linux 的下载入口

点进去,提供了几乎各个主流分支的安装包,直接下载安装即可。

但是,请永远记住:

Arch的源永远不会让你失望。如果没有,那么请使用AUR

至于体验如何,可以看我的视频。我在这里只想展示一下linux中国对于这次复活的一段评价


在 10 月 24 日这个程序员节上发布了 Linux QQ 2.0 版本让人觉得有点无厘头,甚至让人觉得可能仅仅是一个快闪活动,频繁的断线都让人担心是不是到了 25 日,可能 Linux QQ 就又不能用了。在 1024 程序员节的释出,使得 Linux QQ 可以以一个怀旧的形态重新出现在人们的眼前。但是,同样的,在这个节日的释出,也让人觉得这件事似乎并没有相信中的那么重视,对于 Linux QQ 的前景蒙上了一层阴影。

而且,腾讯并非一个慈善组织,对于腾讯这样的一个企业,是否会长期为一个很难产生现金流,而且小众的操作系统提供长期维护还尚未可知,更是让人无法相信 Linux QQ 的未来。

近两年来,自主研发的操作系统不断的刷屏,我们也一次次为自主研发的操作系统而欢呼。但是,高潮之后,还能剩下来的是什么?

我一直强调,操作系统卖的不是系统本身,而是卖因其产生的生态,由生态倒逼用户为系统本身付费。就如同我尝试很多次从 iPhone 转回 Andorid ,从 macOS 转回 Windows,但是,也正如我自己每次失败后的总结一样,我没有办法完全抛弃掉 iPhone 、macOS,因为其所带来的生态是我无法迁移到 Android 上的,被操作系统所挟裹,不得不去面对的现实是:最终,我还是回到了 iPhone 所构建的生态。

对于 Linux 也是一样的,Linux 的服务端的用户诉求是明确的、简单直接的、绝大多数场景都可以被覆盖掉的。而桌面端的产品可能会有数万种不同类型的需求,这使得产品经理在进行设计时预见不了需求的问题,也就很正常的问题。

我们回过头去看,Linux 想要占领桌面市场还需要什么呢?需要的不仅仅是一个 Linux QQ,我们需要给更多人提供 Linux 上的微信、办公套件等等一系列软件。没有这些软件,我们就很难让用户迈过入门的第一关:我如何登录 QQ /微信和我的同事、家人沟通。如果他发现,我用了 Linux ,但是我却没有办法使用 QQ /微信进行沟通,那么我用 Linux 还有什么意义呢?

对于 Linux 来说,除了去适配这些我们所熟悉的软件以外,更是需要有厂商能够面向 Linux 开发出独占的杀手级用户,这样,才能够更好的去推动一个操作系统的发展。

如果 Linux QQ 仍然继续更新,那对于 Linux 来说,是一大利好消息,一些做的好的、做的不好的应用,都可能会重新考虑创建自己的 Linux 版本。而过去,可能没有这样的机会。


我个人还是比较认同这种观点的。不只是腾讯QQ,算上之前发布的百度网盘,我也觉得是为了顺应国家政策而不得不开发出的产品。所以说,很多国内Linux用户一看到QQ for Linux复活了,就好像多大的喜事一般欢呼雀跃,奔走相告,甚至乐观的认为腾讯良心发现……

谈不上,甚至对提出这种观点的人有一股愚昧的印象。目光真的就只能看这么近吗?如果说,腾讯在之后发布了更多的迭代版本,功能上不求跟上Windows,能跟上OSX,再说它“良心发现”也还算过得去(虽然我不认为发布Linux版本软件能跟所谓“良心”挂上钩)。现在仅仅发布了一版便如此兴奋,正所谓“希望越大,失望越大”。

所以,请保持平常心。就仿佛Windows又新出了一个软件一样的心态来看待QQ for Linux的复活吧…

视频点此

之前的内容中,我提到了Arch中高级的英特尔、英伟达切换方案。如果你还记得,就应该知道,当时我说了一句“Hybrid项目不用管,用前两个就够了”。

Hybrid,翻译成“混合”。但是林纳斯曾说过一句名言:

So, NVIDIA, fxxk you!

不禁让我感到疑惑:这个Hybrid真的有用吗?

为了寻找这个答案,我翻阅了这个显卡切换项目的git。其中一则issue引起了我的兴趣

issue

其中提到的链接第二段是这么说的:

The NVIDIA 435.17 driver has a new PRIME render offload implementation supported for Vulkan and OpenGL (with GLX). This PRIME offloading is about using one GPU for display but having the actual rendering be done on a secondary GPU, as is common with many of today's high-end notebooks that have Intel integrated graphics paired with a discrete NVIDIA GPU.

NVIDIA的Linux驱动终于开始支持双显卡了。虽然依旧闭源,但至虽然开始针对Linux的驱动进行改进,但这其实也说明不了太大的问题,直到又看到了这个新闻

NVIDIA,也开始涉足开源领域了。

为什么说也?

IBM收购RedHat、Steam开始专门提供Linux支持、微软加入Linux基金会、腾讯宣布开源……这些都算得上是英伟达的前人。尚不必说一直推崇开源的英特尔、有自知之明主动开源的AMD了。

所以,开源到底好在哪儿了?

首先,要明白一个问题:开源是什么意思?

字面理解,就是开放源代码。但是,这不代表你可以任意使用,更不意味着开源就是免费。它有很多方式可以实现盈利:双重许可、有偿技术支持、软硬件一体化…开源不是做慈善,更不是反开源的一个理由。

然后,就可以来说说开源的优势了。

我记得我在之前关于N卡A卡的内容里就说过一个优势:让更多人参与到程序的优化中。付出同样的成本,得到更多更全面的维护,“白嫖”谁不爱?

这是对于作者的,那对于用户,开源的优势在哪儿?

可以直接看到源码。一款闭源软件,你既不知道其构成,又只能从部分渠道得知它的安全性。而开源让你真正的“眼见为实”。就像前一阵子Deepin被传代码内植入了监视代码,直接被中国监视。虽然是谣言,官方也解释过CNZZ代码段的作用,但多少的可以说明开源这种看得到的安全。

完全定制。能得到源代码,这便使完全修剪成为了可能。

北京地铁为例。房山线老车的车内屏幕使用XP系统(也可能是CE),因为现在车均崩溃,你可以很方便的看到界面细节。这也是XP时代的一个典型代表:在那个时候,很多设备选择了XP或者CE作为嵌入式系统。但伴随着设备多样化,Linux逐渐受到重视,就像9号线站台屏。因为Linux本身占用就不高,加上Linux的开源性,可以做到完全的修剪,进一步减少占用、节约硬件成本。

但是,这种随意性使得它有个对应的问题:“百家争鸣”。

Windows只有Windows,而Linux有各种各样的Linux。这就使得原作者对项目控制能力有了限制。

所以说,就像微软从“Linux是毒瘤”到现在“我们是一家开源公司”的转变,开源随着科技发展正逐渐的被重视起来,设备的多样性也在催化着开源的完善、壮大。

就怕忘了。万一啥时候主题一更新,或者手残一重装,又要重新来一遍可怎么办…

顶栏公告栏

修改效果:顶部导航栏下面滚动自定义的公告;后台的设置外观界面可以自定义公告和滚动速度

编辑当前外观中,在functions.phpfunction themeConfig($form)方法里添加代码

//公告栏设置
$notice = new Typecho_Widget_Helper_Form_Element_Textarea('notice', NULL, NULL, _t('公告'), _t('公告栏,可用一部分html标签'));
$form->addInput($notice);
$speed = new Typecho_Widget_Helper_Form_Element_Textarea('speed', NULL, NULL, _t('公告游动控制'), _t('设置公告文字游动速度'));
$form->addInput($speed);

然后,在header.php</nav>下增加公告栏位

<!-- 公告牌 -->
<div id="bbs">
    <marquee class="nav-link" scrollamount=<?php $this->options->speed(); ?> onmouseover=this.stop() onmouseout=this.start() style="line-height:18px;">  
</div>

<!-- 下面这个脚本,可以实现公告滚动几次之后自动隐藏 -->
<!-- 如果没有这个需求,可以不用;上方div的id也可以不用 -->
<!-- 用的话,在marquee标签里增加loop="数字"来给出循环次数 -->
<script>
    function hideboard(){
        bbs.style.display="none"
    }
</script>

修正https导致的问题

可能只在cloudflare使用flexible模式时候才需要修改。

具体看这里吧

获得评论者正确的ip地址

只需要在网站根目录的config.inc.php中,增加/修改一个字段即可:

/** IP地址来源 */
define('__TYPECHO_IP_SOURCE__', 'HTTP_X_FORWARDED_FOR');

/** 具体需要看phpinfo的PHP Variable里边能展示真正ip的字段 */

Typecho支持PHP7的修正

由于PHP7的一部分函数被取消,导致Typecho默认并不能支持PHP7.但只需要将根目录/config.inc.php中的$db = new Typecho_Db('Mysql', 'typecho_');更改为$db = new Typecho_Db('Pdo_Mysql', 'typecho_');,保存即可。

RAW主题去掉日志/说说切换栏

index.php中,带有“日志”和“说说”两个div删掉即可。

RAW主题,文章列表页顶栏修正

当把typecho的主页设置为静态页面时,文章列表(就是默认的首页)的顶栏会置空。应该是开发时没有注意到这个问题。
修复也很简单,在index.php中,将

<?php if ($this->is('index')): ?><!-- 页面为首页时 -->
最近文章
<?php if...

一句的if条件加上$this->is('front'),即条件语句变为

<?php if ($this->is('index') || $this->is('front')): ?><!-- 页面为首页/文章列表页时 -->

保存即可。

Access插件,控制面板仅管理员账号显示

  • 编辑Access的plugin.php文件,将active方法中的第2行最后一个参数修改为administrator,即改变成
Helper::addPanel(1, self::$panel, _t('Access控制台'), _t('Access插件控制台'), 'administrator');
  • 注释adminFooter方法中的所有行
  • 保存。如果不生效,则重新应用插件

RAW主题,增加前台注册页

最终效果:点击弹出登录窗口后,拥有链接导向注册页。点击后弹出注册窗口,用户可以输入用户名和邮箱注册,之后跳转到后台。

修改RAW主题的header.php文件

1、修改登录页,增加注册页链接

  • 找到action="<?php $this->options->loginAction()?>的form表单,在文本中加入注册页的链接:
<a style="text-decoration: underline" data-fancybox="" data-src="#hidden-register-form" href="javascript:;" target="_blank">注册</a>

2、增加注册表单

相同文档里,增加下述代码:

<div id="hidden-register-form" class="login-form" style="display:none">
    <form action="<?php $this->options->registerAction();?>" method="post" name="register" role="form">
        <p>注册</p>
        <p>
            <input type="hidden" name="_" value="<?php echo $this->security->getToken($this->request->getRequestUrl());?>">
            <input type="text" name="name" placeholder="用户名" required/>
        </p>
        <p>
            <input type="email" id="mail" name="mail" placeholder="邮箱" required/>
        </p>
        <p style="font-weight: bold; color: red">
            成功后请立刻修改密码!否则随机密码你是记不住的!
        </p>
        <button type="submit" name="loginsubmit" value="true">注册</button>
    </form>
</div>

保存即可。

随便看看功能

整合在热门文章插件中,可共同启停用。最终显示在电脑端左栏中。

  • 在热评插件的plugin.php中,增加功能:
public static function outputRandomPosts() {
    $archive = Typecho_Widget::widget('Widget_Archive');
    $pluginOpts = Typecho_Widget::widget('Widget_Options')->plugin('TePostViews');
    $sortBy = $pluginOpts->sortBy;
    $hotNums = $pluginOpts->hotNums;
    $minViews = $pluginOpts->minViews;
    $linkClass = $pluginOpts->linkClass;
    $hotNums = intval($hotNums) <= 0 ? 8 : $hotNums;
    $minViews = intval($minViews) <= 0 ? 0 : $minViews;
    $linkClass = strlen($linkClass) > 0 ? 'class="'.$linkClass.'" ' : '';
    $db = Typecho_Db::get();
    $select = $db->select()->from('table.contents')
        ->where('table.contents.type = ?', 'post')
        ->where('table.contents.status = ?', 'publish')
        ->order('', 'RAND()')
        ->limit($hotNums);
    $rows = $db->fetchAll($select);
    foreach ($rows as $row) {
        $row = $archive->filter($row);
        echo '<span><a ' . $linkClass . 'href="' . $row['permalink'] . '" title="' . $row['title'] . '">' . $row['title'] . '</a><br>
        <span style="margin-right:1em"><i class="fa fa-eye"></i>&nbsp;'.$row['viewsNum'].'</span>
        <span><i class="fa fa-comment"></i>&nbsp;'.$row['commentsNum'].'</span></span>';
    }
}
  • RAW主题的nav-left.php文件中,在nav标签合适位置增加下述代码:
<aside>
    <div id="hot-posts" style="animation-delay:0.4s">
        <span><i class="fa fa-random"></i> 随便看看</span>
        <?php TePostViews_Plugin::outputRandomPosts(); ?>
    </div>
</aside>

Access插件,兼容ipv6地址记录

通过直接记录ip,而不使用ip2long来保存。性能会下降

数据库:

access_log表中,修改ip列为varchar(100)

插件:

page/console.php: 类似于Access->long2ip()的字段全部只保留ip变量$log['ip']

Access_Core.php: 注释所有$ip = bindec(decbin(ip2long($ip)));

Access_IP.php: $nip2 = pack('N', ip2long($nip));改为$nip2 = pack('N', $nip);

编辑文章时增加标签选择列表

来源:Typecho Wiki

在typecho目录admin下找到write-post.php文件并进行编辑,在其中找到代码(大概在94行左右):

<p><input id="tags" name="tags" type="text" value="<?php $post->tags(',', false); ?>" class="w-100 text" /></p>

在这段代码后面增加如下代码:

<div id="exist-tags">
<p style="background: #fff;border: 1px solid #D9D9D6;display: block;padding: 2px 4px;">
<?php
$stack = Typecho_Widget::widget('Widget_Metas_Tag_Cloud')->stack;
$i = 0; 
while (isset($stack[$i])) {
  echo "<a id=\"mydiv$i\" style=\"cursor:pointer;padding: 0px 6px;margin: 2px 0;display: inline-block;\" onclick=\"mytag=document.getElementById('mydiv$i');mytag.style.backgroundColor='#E9E9E6';t=document.getElementById('tags').value;c=t?',':'';document.getElementById('tags').value=t+c+'",$stack[$i]['name'],"'\">",$stack[$i]['name'], "</a>";
  $i++;
  if (isset($stack[$i])) echo "  ";
}
?>
</p>
</div>

Typecho修改头像地址

现在gravatar的地址已经不可连接,所以替换为镜像源以确保头像可以正常显示。

前往网站根目录/var/Typecho/Common.php,将gravatarUrl方法中的网址按规律修改即可。具体镜像源可以参考知乎文章这个博客