Recent Posts

Phoenix Nemo's avatar

制作 Arch Linux 内存系统启动盘

之前尝试过 Arch Linux in RAM 完全运行在内存中的轻量业务系统,最近在维护一些物理服务器看到没有安装系统的服务器不断重启,想到了可以制作类似的内存系统启动盘,以高效完成系统测试、安装、远程维护等任务。

这时候就要祭出 mkarchiso 大法了。这是自动化制作最新版 Arch Live 镜像的工具集,当然也可用于制作定制化的 Arch 镜像。

准备

首先安装 archiso

1
~> sudo pacman -Syy archiso

它提供了两种配置方案,一种是只包含基本系统的 baseline,一种是可以制作定制 ISO 的 releng。要制作维护用 ISO,当然是复制 releng 配置啦。

1
2
~> cp -r /usr/share/archiso/configs/releng/ archlive
~> cd archlive

定制

整个过程不要太简单。先来了解下各个文件的用途:

  • build.sh - 用于制作镜像的自动化脚本,可以在这里修改一些名称变量或制作过程的逻辑。
  • packages.x86_64 - 一份要安装的包列表,一行一个。
  • pacman.conf - pacman 的配置文件,不用多说了吧。
  • airootfs - Live 系统的 rootfs,除了安装的包之外,其他的定制(以及启动执行脚本等)都在这里。遵循 rootfs 的目录规则。
  • efiboot / syslinux / isolinux 用于设置 BIOS / EFI 启动的配置。

[archlinuxcn] 仓库加入 pacman.conf

1
2
[archlinuxcn]
Server = https://cdn.repo.archlinuxcn.org/$arch

然后修改 packages.x86_64,加入 archlinuxcn-keyring 和其他需要预安装的包:

1
2
3
4
5
archlinuxcn-keyring
htop
iftop
iotop
ipmitool

按需修改即可啦。

要启动为内存系统,需要加启动参数 copytoram

修改文件 syslinux/archiso_pxe.cfgsyslinux/archiso_sys.cfg 文件,在启动参数后加 copytoram,像这样:

1
2
3
4
5
6
7
8
9
10
11
INCLUDE boot/syslinux/archiso_head.cfg

LABEL arch64
TEXT HELP
Boot the Arch Linux (x86_64) live medium.
It allows you to install Arch Linux or perform system maintenance.
ENDTEXT
MENU LABEL Boot Arch Linux (x86_64)
LINUX boot/x86_64/vmlinuz
INITRD boot/intel_ucode.img,boot/amd_ucode.img,boot/x86_64/archiso.img
APPEND archisobasedir=%INSTALL_DIR% archisolabel=%ARCHISO_LABEL% copytoram

启动时即可将整个 SquashFS 文件复制到内存。如果内存比较小,也可以指定 copytoram_size 来限制 tmpfs 占用内存的最大数量。

同样,也需要修改 efiboot/loader/entries/archiso-x86_64-usb.conf 的启动参数。在 options 行添加

1
options archisobasedir=%INSTALL_DIR% archisolabel=%ARCHISO_LABEL% copytoram

制作

创建工作目录和输出目录

1
mkdir -p work out

最后一步,只需要以 root 权限执行 ./build.sh 就可以啦。

要看具体执行过程的话,加 -v-h 看所有参数。

完成后,即可在 out 目录得到准备好的 ISO 文件。将其 dd 到 USB 闪存盘,大功告成(‘・ω・’)

Ref:

  1. https://wiki.archlinux.org/index.php/Archiso
  2. https://git.archlinux.org/archiso.git/tree/docs/README.bootparams#n53
's avatar

感到烦躁?先休息一会吧

Stuck? Switch to “Play Mode” 有感。

摘抄:

... Instead of trying to get things right, I should put myself in “Play Mode”. From his email:

In “Play,” just write or work on something you want... At the end, if you like what you’ve done, bring it in... If you don’t, discard it... It’s okay if nothing comes from it.

粗翻:

与其烦躁的逼着自己去做某些事情(如工作时卡住),不如先撒会欢 —— 随便写、玩或者休息一会(比如一个小时);如果撒欢时做的事情无关的话,就先放到一边。

即使做的事情无关,但是心情却会因此好起来,能够继续专注于工作。

farseerfc's avatar

【譯】使用 GNU stow 管理你的點文件

譯註

這篇是翻譯自 Brandon Invergo 的博客的英文文章 Using GNU Stow to manage your dotfiles 。 Brandon Invergo 的博客採用 CC-BY-SA 3.0 授權,因此本文也同樣採用 CC-BY-SA 3.0 ,不同於其它我寫的文章是 CC-BY-NC-SA 4.0 授權。

我自己已經使用此文中介紹的方案管理 我自己的 dotfiles 快 3 年了。最早想採用這樣的管理方案是爲了方便在多臺 Arch Linux 系統之間同步配置, 後來逐漸主力系統也更新換代了一次,又同步到了自己的 vps 上去,目前管理多個 Arch Linux 上都多少都有這套配置。甚至裝好 Arch Linux 添加好用戶最初做的事情就是安裝 …

17windy's avatar

[美羽释厄录] 0.95 发布贴 性能和游戏性大优化 12.07.2018更新

12月7日21点15分前下载的小伙伴拜托重新下载下,解决了一个蛙人关卡浣熊叶子无效的bug。

0.95更新日志:

1,感谢美羽和咲冥两位大佬的倾力支持,美羽和灵梦(卷)有了新形象,其中灵梦(卷)的形象由美羽进行了精确描述

2,伤害系统整个重构,优化性能至少50%,消灭卡顿!

3,载入功能升级,加载关卡更快更快更快

4,修改美羽的移动控制,改为弹幕类游戏通用的RAW方式,即按下移动键不会有加减速的缓冲和惯性,直接固定每次的移动距离,改善游戏体验

5,每个BOSS都有了特殊的弹幕风格,蛙人和大X王BOSS战重做,更有挑战性和观赏性

6,BOSS战胜利后会全屏消弹避免喜闻乐见

7,部分关卡的小怪会有偶尔的上下刷新

8,通常关卡整体难度下降,便于刷钱

9,美羽的特殊武器蓄能速度增加了50%

10,灵梦(卷)提供了增益!增加了30%-50%的资金获取量(视不同关卡)

11,部分武器进行了小改动,斩龙剑改造

12,战斗魔偶特殊道具更改为浣熊的叶子

13,修正了某个会导致美羽无敌的BUG

14,修正了英雄愿望有时只会造成一次伤害的BUG

15,修正了修改音量后部分关卡失效的BUG

16,灵梦(卷)商店增加了商品的描述提示,鼠标移到商品上显示

17,主菜单美化

新DLC关卡BOSS征集!请想要暴打美羽/被美羽暴打的碰友至喵窝社区论坛报名哦!

 

目前暂时只提供windows版,还望谅解。

下载链接:

0.95版本地下载

下载 Miu DB V0.95
点击次数: 26, 文件大小: 267.2 MB, 日期: 2018 12月 07

0.95版百度云分流 链接:https://pan.baidu.com/s/1ofJR7Ue4d_YGKgYiXOytAw 提取码:o19f

 

PS:之后可能会有一个月-一个半月的时间暂停更新,忙主要项目,不然会被卷素质三连~

SgDylan's avatar

EmiyaEngine 杂谈录 「其一」

人耳是一对既简单又复杂的器官。
说它简单,是因为人类可以制造电子的替代品;说它复杂,是因为再好的替代品都不能完全还原其功能。
它的原理,简单说只是将声音的机械波转换为神经电信号,但实际上这是包括耳廓、耳洞甚至是表皮绒毛的系统工程。
这些部件通过发挥其物理结构的作用对外界声音进行加工,才有了人体感知声音的前提。
再往后,大脑通过对其进行一系列解构调味,才有了最终感受到的样子。
现在的我们,将这一些系列的调味成为「心理声学」。

SgDylan's avatar

尝试在HEXO内嵌歌曲

SgDylan's avatar

关于MBR与GPT的一些记录

SgDylan's avatar

在蓝天W655SR上安装OSX

本文仅仅是单纯地记录下安装中的一些问题,
更详细的也记不太清楚了。

咱安装时笔电上已经有正版 Windows10 Pro,因此在同一块硬盘上安装引导还是有点棘手的(毕竟咱也是第一次装,网上也没有同型号的安装记录什么的)。

安装过程大概有这些问题需要注意的:

  1. MBR转GPT引导 咱安装时,SSD分区为MBR,为方便安装需进行GPT转换。 转换时需注意,必须在分区最后端保留一定大小未分区空间才可以成功转换GPT。 转换后需在当前盘的最前端划分出ESP分区进行引导,
    关于MBR安装Windows如何在EFI下引导,可以参考下MSDN,此处不赘述。

  2. 注入驱动启动黑果安装 说出来也有些丢人,咱光是引导黑果进入安装界面都花了很长时间。 这个地方一般是驱动和内存的锅。 需要确认开启了kernel pm的注入,并在plist里指定当前内存槽内的内存信息, 然后移除掉除关键驱动(Ex. FakeSMC)外的驱动注入。
    当然,EFI下的safeboot也有可能导致启动失败,所以还是关掉好了。

  3. 驱动安装 讲道理,水果的驱动除了显卡网卡还是没有什么坑的。 显卡的问题不是那么好搞定的,打开有1000MB以上的显存就够了, 就算有其他什么问题,一般也是难以解决的。 (比如那些要注入
    DSDT/SSDT 的方法,实际难以操作,难以见效) 网卡的话,不要认为可以用就OK。
    一定要多测试下,比如关闭后重开是否可以正常联网。 因为网卡版本众多,所以有很大的选择余地,完全可以找到最好的驱动。

SgDylan's avatar

如何为UWP应用开启回环访问权限

SgDylan's avatar

在 Android 设备体验 Hi-Fi

最近搞了个 XMOS 做 USB 驱动芯片,配合 ESS-9018 做 DAC 的 USB DAC。
具体型号就不说了,用的是 XMOS 官方的参考方案。

SgDylan's avatar

修复Windows10上因为MacType导致的蓝屏问题

SgDylan's avatar

Tinc 笔记

Tinc 是一个 MeshVPN 网络的实现。
以下是这玩意的踩坑记录。

SgDylan's avatar

在视频处理中使用SVP4

SVP 是一个不错的视频插帧工具,可以通过详尽的参数设定处理出适合自己的高帧率视频。
目前,SVP 的主要版本是 SVP4。
本次主要记录的是使用 SVP4 配合视频压制工具制作高帧率视频的过程。

SgDylan's avatar

EmiyaEngine 杂谈录 「其二」

上一篇中谈到了心理声学与人造玄学,其中为说明采样虚拟乐器的不完全「HiRes」,
拿了两首所谓的「HiRes」音乐做了可视化谱分析,说到了一些可能不太正确的推论。
本篇继续推进,站到技术层面窥视他们背后的原理。

SgDylan's avatar

使用Python脚本计算单片机纯软件延时计数值

编写单片机程序时,经常为了保证时序使用软件延时程序。
以下是一种精确计算软件延时的方法(强迫症福音)。

SgDylan's avatar

饥荒 Don't Starve Together 服务器安装记录

这是一份饥荒联机服务器搭建记录的流水账。
记录的是在 单核 1GB内存 1Mbps 安装有Ubuntu14.04 的 腾讯云学生机上安装饥荒联机版的过程。
安装中包括了主世界和洞穴世界,且有安装人物Mod和工具Mod。
需要注意的是,这份安装记录适用于 Steam 最新正版饥荒。TGP 版似乎并不支持。

SgDylan's avatar

一种批量下载Bilibili视频的方法

需要的环境及工具:

  1. 一台可以运行 Python3 的机器
  2. Python 3 ( 推荐 Python 3.5.1 )
  3. pip
  4. you-get
SgDylan's avatar

使用手机远程控制 PC 网易云音乐

折腾过 Foobar2000 的人可能知道,Foobar2000 有一款叫做 foo_httpcontrol 的远程控制插件。
同时,有爱好者根据这个插件提供的接口,写出了使用手机控制 Foobar2000 的 Android 应用程序
于是,做一个远程控制网易云音乐程序的想法就诞生了。
考虑到自己一时半会写不出像 foobar2000 controller 这样的 Android 应用程序,于是考虑借用这一套 API 格式实现一个兼容的控制服务端。

SgDylan's avatar

导出 nginx 自动目录的链接到 aria2

不多说废话,就是一个 Javascript 插件,实现的功能如标题所说。
在 tampermonkey 上运行正常,暂时没有发现 BUG。
用不惯 rsync 的可以试试用这个用从 seedbox 拖文件。

SgDylan's avatar

一种阻碍DPI检测上网设备数量的方法

背景
学校最近把三家运营商都并入校园网了,使用一套名为深澜的系统对绑定不同运营商的用户自动加载不同的路由实现网络流量走不同的 ISP 出口。同时,大概是为了更大地盈利,加入了 DPI 和缓存服务器,并同时屏蔽了外部网络的 53 端口。
至此,接入校园网的用户无法使用默认使用 53 端口的 DNS(TCP/UDP),同时只允许接入三台上网设备。

SgDylan's avatar

使用 ESP8266 搭建 IoT 节点

刚好要买 ARM 板子,就顺手一并买了一块传说中的廉价 WiFi 开发板——使用 ESP8266 的 NodeMCU 。
那么就来说说这块据说性能强大、价格低廉,且可以写脚本语言的开发板。

SgDylan's avatar

Roland MIDI 软件合成器安装记录

这是一篇记录软件 MIDI 合成器安装的流水账,如有错误请及时指出。

SgDylan's avatar

在 PotPlayer 中使用 VapourSynth 加载 SVP4

SVP 是很棒的视频插帧软件。SVP 看片爽过吸大麻(大雾)
但是一直以来这东西都是通过 ffdshow raw filter 加载 AviSynth 脚本的方式介入播放器作用的。
从某个版本开始,SVP4 开始支持 VapourSynth 加载,
但是官方的教程还没有跟进,所以就稍微说一下吧。
需要注意的是,这个功能需要 SVP4 Pro,使用 Free 版本的用户请买一份 Pro 先。
顺便,感谢字幕组压片dalao @hoshinokun 的帮助。

's avatar

法国服务器将在一月迁移 终止部分服务

法国服务器准备不再续约了。

考虑到十二月没有时间来迁移网站,暂时决定将服务器续期到 2019 年 1 月 31 日。

届时受影响的服务:

  • 网易云音乐反代 - 关闭服务

其他服务会在一月中旬无缝迁移到新的服务器,不受影响。

AprocySanae's avatar

谁在里面

这篇文章完全是虚构的,比如我几乎晚上不加班,也没有会 JOJO 立的同事。毫无疑问我看过冰菓小说,当然日常系推理也并非冰菓的专利。

我的确寻思过写个和千反田类似的女孩放入书中,以读者的身份引出线索。但是构思时候很悲伤地发现我并不熟悉女性的思考方式。

文辞相当市侩,但是毫无疑问这才是我熟悉的生活。

青色旋律's avatar

短暂的休止符

最近忙于生活,暂时没有更新,非常抱歉的说。

希望能早点安定下来,静下心来做自己想做的事情……青色的旋律只是进入了短暂的休止,并没有迎来终结。

更多的脑洞…… JavaScript 的教程等等等等,未完待续……

's avatar

Redis Desktop Manager (RDM) 0.9.999 x64 个人编译版

官方的 Windows 版本需要订阅,或者自己编译。

用 QT 折腾大半天后终于编译好了。

已知问题

  1. 无法切换语言。原因未知,有懂 QT 的大佬指点一下吗?

说明

因为使用的是 VS2017 x64 编译器,需要 Win7+ x64 操作系统。

VS 2017 运行时下载:微软

RDM 下载

IceHoney Blog's avatar

前端开发地图应用的调研

我司的产品终于发布了新版本,所以忙碌的开发暂时告一段落。最近在做下一期的规划,然后就是要做前端网站来满足用户的需求。由于我们的产品是和地图强相关的,所以也对地图做了很多调研。

基本需求

产品需要在国内和国外使用,费用合理,可以换地图的贴图并且能在地图上绘制各种信息。例如多边形或圆形还有贝塞尔曲线。

MapKit JS

苹果居然也出了网页版本的地图产品MapKit JS,可谓是良心。但是目前还处于Beta版本。如果以后要考虑产品的全平台化,显然不是一个很好的选择。不过苹果的产品可以在国内国外使用不用太担心地图偏移问题,而且可以贴图和绘制图形,但是目前网页版还不能绘制贝塞尔曲线,iOS客户端倒是可以。

MapBox

MapBox是一个地图服务提供商,经过调研MapBox使用最新的WebGL技术来渲染,摆脱了传统的下tile来贴图的方式,渲染速度得到了大大的提升。也能解决国内和国外的地图显示问题,但是画图功能就只有画线和多边形。不过提供了底层的画图层的接口,需要自己写WebGL的shader。这就增加了开发成本。。。

GoogleMap

谷歌地图当然好,但是我最后才说。因为谷歌无法在国内使用,这种情况下我就不得不写两套接口来对应,例如国内高德地图,国外谷歌地图,会大大增加开发成本。而且谷歌地图最近刚升级付费条款,费用是按照请求次数来收,所以用户大量增长之后的开销也会非常大。不过谷歌也不能画贝塞尔曲线。。。

地理坐标系

由于是需要在地图上绘制新的tiles,所以自然就涉及到坐标的转换和计算。如何计算一个经纬度落在哪一张tiles上,以及在不同缩放级别下tiles的正常显示和重绘。这些都是需要自己来实现的。 这里有一个还算有名的官方介绍,并给出了Python的源码。可以参考这个来进行实现。

坐标系转换

每个国家都有自己的坐标系系统,虽然GPS使用的WGS 84标准非常流行,但是这个是美国制定的。每个国家当然都需要根据自己国家需要来定制自己的标准。例如中国就有北京54坐标系,西安80坐标系。北京54和西安80是参心坐标系,大地原点分别在苏联和西安。难以表达高度信息,目前国家正在推广2000国家大地坐标系,这个和WGS84一样是地心坐标系,即以地球质量中心为原点。日本也有自己的平面直角坐标系,我们当然需要各种坐标转换,还好有现成的开源项目proj4js

总结

各个地图服务商都各有优劣,但却没有一款完美的。主要是用途也比较特殊,可能在地图服务上进行二次开发的可能性比较高吧。不过提供地图服务的也没几家可以选择的。。。

's avatar

网站部分功能下线 [已恢复]

VPS 因未知原因下线,问题还在排查中。

部分服务器的内容受到影响,包括:

  • 英文博客 (jixun.uk)
  • 评论系统 (c.jixun.moe)
  • 本站的静态资源 (s1.jixun.moe)
  • 托管于本站的资源 (jixun.downloaddl.jixun.moe)
  • 网易云音乐反代服务
  • … 以及其他个人用的子域名服务。

已经修复,根据 Uptime Robot 提供的数据,本次事件导致服务器下线总计 2 小时 25 分。

依云's avatar

通过 Cloudflare DNS 验证来申请 Let's Encrypt 证书

本文来自依云's Blog,转载请注明。

我本地的 MediaWiki 的证书过期啦,干脆申请个免费证书好了。之所以用 HTTPS,是因为 MediaWiki 不喜欢不加密的 HTTP,会登录不了……

在网上寻找时,发现 certbot 就有 Cloudflare 的插件呢!这下就方便了。首先 pacman -S certbot-dns-cloudflare 装上,然后把自己的 Cloudflare 凭证信息写到一个 ini 文件里:

dns_cloudflare_email = cloudflare@example.com
dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234567

就这么两行。保存好,设置好权限,然后就可以申请证书了:

sudo certbot certonly -d 域名列表 --dns-cloudflare --dns-cloudflare-credentials 凭证ini文件路径

稍微回答几个问题,证书就在 /etc/letsencrypt/live 下准备好啦。在 nginx 里配置一下就好了。

然后还要加个 cron 任务来更新证书(dcron 格式):

@weekly         ID=cert-renew   certbot renew -q

这样就大功告成了。

依云's avatar

正确地上传至 PyPI 并展示文档

本文来自依云's Blog,转载请注明。

数年过去了,今天经过多次尝试和询问,我终于成功让 nvchecker 的文档以富文件的形式展示在 PyPI 上了!

正确地打包上传命令是这样的:

rm -rf dist && python setup.py sdist && twine check dist/* && twine upload -s dist/*

如果 twine check 不通过,那么修正后重新执行。如果文档包含错误,PyPI 会以纯文本形式展示。

  • 听说要设置 long_description_content_type。好像 Markdown 才要设置的,rst 不用。
  • 听说不支持 # 开头的链接。实际上现在已经支持了。
  • 听说要用 twine,那就用吧。

原来我之前的文档一直没有正确地渲染,是因为有一个标题的「-」少了两个……

关于 PyPI 的资料是挺多的,但是细节不够详细,陈旧信息很多,唉。

Phoenix Nemo's avatar

使用 fs.WriteStream 编写超简单的日志流

虽然 console.log 很好用,但是生产环境需要保存日志的时候就比较蛋疼。暴力 fs.appendFile 会消耗大量的 file handler,因此用 writable stream 来复用 file handler 是更好的选择。

大概是个不能再简单的思路了。先创建一个写入流

1
2
3
const fs = require('fs');

let logStream = fs.createWriteStream('./test.log');

这样便创建了一个文件写入口,需要时直接调用 logStream.write 即可写入数据。
接下来编写一个用于记录日志的函数替代 console.log

1
2
3
function logger (message) {
logStream.write(message);
}

至此基本功能就写完啦。但是太简陋了对不对,还是要再加点装饰。

重写 logger 函数,区分 stdoutstderr

1
2
3
4
5
6
7
8
9
10
11
12
let logInfo = fs.createWriteStream('./stdout.log');
let logError = fs.createWriteStream('./stderr.log');

let Logger = {};

Logger.info = (message) => {
logInfo.write('[INFO] ' + message);
}

Logger.error = (message) => {
logError.write('[ERROR] ' + message);
}

感觉还是少了点什么…日期?

1
2
3
Logger.info = (message) => {
logInfo.write(new Date().toISOString() + ' [INFO] ' + message + '\n');
}

嗯嗯。这就像样了。把代码整合起来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const fs = require('fs');

let logInfo = fs.createWriteStream('./stdout.log');
let logError = fs.createWiteStream('./stderr.log');

let Logger = {};

Logger.info = (message) => {
logInfo.write(new Date().toISOString() + ' [INFO] ' + message + '\n');
}
Logger.error = (message) => {
logError.write(new Date().toISOString() + ' [ERROR] ' + message + '\n');
}

module.exports = Logger;

需要用时

1
Logger.info('This is an information.');

现在看对应的 stdout.log 文件就有相应内容啦。

1
2
~> tail -f stdout.log
2018-11-18T10:52:57.333Z [INFO] This is an information.

不够刺激?

1
2
3
[...Array(10000)].forEach((item, index) => {
Logger.info('Hello! ' + index);
});
1
2
3
4
5
6
7
8
9
10
11
12
~> tail -f stdout.log
...
2018-11-18T10:58:30.661Z [INFO] Hello! 9990
2018-11-18T10:58:30.661Z [INFO] Hello! 9991
2018-11-18T10:58:30.661Z [INFO] Hello! 9992
2018-11-18T10:58:30.661Z [INFO] Hello! 9993
2018-11-18T10:58:30.661Z [INFO] Hello! 9994
2018-11-18T10:58:30.661Z [INFO] Hello! 9995
2018-11-18T10:58:30.661Z [INFO] Hello! 9996
2018-11-18T10:58:30.661Z [INFO] Hello! 9997
2018-11-18T10:58:30.661Z [INFO] Hello! 9998
2018-11-18T10:58:30.661Z [INFO] Hello! 9999

搞定(┌・ω・)┌超简单的吧。

's avatar

十一月十七日 -- 前女友小说,字体,摄影

今天没打游戏。

小说

磨了一点 Your Diary 的感想,就没动了,买了另外一本三秋的书,加上一本书凑免邮。反而是看纸城境介的继母的拖油瓶是前女友看到快 6 点。

很有趣的小说。男性向的。

因为看轻小说不用带脑子,所以这也是不带脑子的评论。这也是我的一种心理安慰。一个人如果因为一本无趣的小说而熬夜,那未免也太空虚了吧。

在访谈中,关于连载,作者纸城大致是这么说的:如果小说被印刷成书出版,那只能让读者享受 3 小时;而如果放在网络上连载,则能够让读者每周都享受 168 小时。

关于这部书有趣的地方,作者大致是这么说的:我写这部作品,就专注于这一点,而不是加入学园祭等各种元素来充实内容,这使得这部作品非常纯粹。

因为我记的不太清楚了,所以就不加 quote 了。当然这也不代表我个人观点,虽然说人会把记忆改造成自己想要的样子,但我觉得这观点怎样都好,所以就忘的差不多了,更别说根据自己的好恶改造了。

我个人觉得误会是这部作品的一个支撑,也是全篇反复出现的一个要素。男女主人公因为小小的误会,关系出现了隔阂,导致最终的分手。男主自认为讨厌女主,但心里还给女主留着位置,他并努力和女主保持着适当的距离;而反观女主,男主在面前的时候针锋相对,不在面前的时候变身大花痴。导致怎么看,都是变相秀恩爱。

这让我想起了作品时间和现实时间同步的一部网络小说,其天气也是忠实于日本某地的天气。可名字忘了。

今天下雨。

看了一点人间失格,感觉不能理解。先不管三张相片是想表达什么(从内容上看推测是概括了主角的一生),几页看下来,大致是一位神经性厌食症少年的独白。具体是不是还要继续往下看。

摄影

我不摄影。

看了一篇关于 Magnum Contact Sheets 的博客,讲的很长很详细,地址忘了。

Contact sheets 是在底片时代,摄影师为了降低成本,就先把底片的缩小版印下来,再在其中挑选想要的照片。从 contact sheets 中可以看到摄影师的思考,过程,以及失败。Magnum 是有名的摄影师社区,其成员都是经过遴选的,因此这本书里的 contact sheets 也可算是大师级别的作品。

看到 Dali Atomicus 的时候,我以为里面的人是随便一个演员,结果一查是达利本人,而其创意也来自达利的画 Leda Atomica,里面的物体都是漂浮着的,在照片中该画被悬在右侧。照片里的猫也是真的,是助手丢出去的。大概那时候没有动物保护组织,可以随便来。照片一共拍了28次,可以说不管是摄影师,达利,打扫的人,还是猫都辛苦了,猫还会被水浇到,所以可能最辛苦。

总而言之,文章想对广大摄影爱好者表达的几点建议,一个是多拍,一个是拍了要看,一个是以前拍的也要看,说不定会有新的发现(因此不要立即删掉觉得不好的照片)。

字体

方正面向移动端阅读,推出了方正悠宋。当然要钱,而且不能发布。因此我没用。当然如果遇到什么好的免费的衬线体,大概是会换的,不然英文是衬线,中文是黑体,不免有些不协调。

注:移动端是这样,电脑端可能不是这样。

Hymmnos 字体也会加回来的,大概。

其他的记不清了。

想不到要写什么了。

's avatar

Fedora 29 安装 FCITX 输入法 + Rime/拼音

上图为安装后的效果


首先安装适配各种程序的基础包:

sudo dnf install fcitx-{ui-light,qt{4,5},table,gtk{2,3},table-{extra,other,chinese},configtool}

安装「中州韵」:

# 启用 fzug - 中文社区源
sudo dnf install https://mirrors.tuna.tsinghua.edu.cn/fzug/free/29/x86_64/fzug-release-29-0.1.noarch.rpm

# 安装中州韵
sudo dnf install fcitx-rime

如果不想安装 fzug 中文社区源,可以安装普通的拼音: sudo dnf install fcitx-pinyin

之后运行「im-chooser」在弹出的界面选择 fcitx,然后登出重新登录即可生效。

's avatar

100% 橙汁修改器更新 (4.0)

更新 4.0

很久没有更新这个修改器了…原因是对修改器进行了重做,现在改用 C++ 开发,抛弃掉 .net 环境。

支持联网获取修改器所需数据,希望能解决每个版本的游戏都需要重新编译修改器的问题。

缺点:

  1. 不支持离线使用。每次点击“寻找游戏”都需要联网查询所需数据,可能在后续版本会建立一个缓存机制。
  2. 不支持 XP,也希望我能不需要支持 XP。如果真的需要 XP 的支持的话,请在留言告诉我,我会更新编译器使其兼容。

以后如果不是游戏有大更新,修改器应该也不用更新。

100% Orange Juice 修改器

依云's avatar

与 Android 进行 WLAN Direct 连接

本文来自依云's Blog,转载请注明。

首先 iw list 看是否支持。如果支持,那就

iw dev wlan0 interface add p2p0 type __p2pdev

这样其实并不会多出一个叫 p2p0 的网络接口。iw dev 能看到多了个「Unnamed/non-netdev」设备。不执行这个也可以连接上 WLAN Direct,但是当前的 managed Wi-Fi 连接会断掉。执行之后再连接,managed 连接会持续,iw dev 里会有两个 Unnamed,不知道何故。另外这个 type __p2pdev 加上去了我就不知道怎么删除了。试了几个命令,结果搞得内核 oops 了……

然后是 wpa_supplicant 配置文件:

ctrl_interface=/run/wpa_supplicant_p2p
ap_scan=1

device_name=起一个名字
device_type=1-0050F204-1

driver_param=use_p2p_group_interface=1

wpa_supplicant 跑起来。注意这里的接口名还是那个 managed 接口的。

wpa_supplicant -i wlan0 -c p2p_config.conf

然后 wpa_cli 连过去操作:

wpa_cli -p /run/wpa_supplicant_p2p

首先用 p2p_find 开启搜索。这时候对端设备能够看到自己了。使用 p2p_connect 对端MAC pbc go_intent=0 连接,在对端接受连接即可。go_intent=0 是让对方作为 group owner,这样对端 Android 才会提供 DHCP 服务(否则要本地提供了)。

然后就可以给自己添加 IP 地址了。此时是可以用 dhcpcd 的,然而直接跑的话它会抢走默认路由,所以知道地址范围之后手动加一个好了:

ip a add 192.168.49.22/24 dev p2p-wlan0-1

Android 设备的地址是 192.168.49.1。

之后就可以用 adb connect 然后 scrcpy 了。

PS: Android 很喜欢四十几的 IP 段呢。USB 网络共享是 192.168.42.129/24,Wi-Fi 网络共享是 192.168.43.1/24,而 WLAN Direct 是 192.168.49.1/24。不知道蓝牙网络共享是多少呢。

PPS: scrcpy 在我的 XZ2C 上运行完美,但是在 MIUI 10 上需要去开发者选项里开启选项「USB 调试(安全设置)」,否则会是「只读模式」,只能看,所有交互操作无效。

参考资料

Kouga's avatar

速成速冻肉丸

  1. 空气炸锅200℃预热2分钟;
  2. 速冻的撒尿牛丸拆开,裹点油,入锅,120℃5分钟;
  3. 为了得到脆外皮,再烤180℃1分钟出锅;

嗯,是不是很简单喵?结果咱咬开第一颗就爆了喵……QAQ……没照片喵……

Felix Yan's avatar

为 glibc localedata 添加民国纪年支持

昨天被 @聞其詳 问起 glibc 对日本平成XX年的纪年支持情况(感谢 @farseerfc 老师),发现 glibc localedata 中并未包括民国纪年支持。在查询文档后稍微鼓捣了一下,简单实现了这个功能:

$ LC_TIME=zh_TW.UTF-8 date +%EY
民國107年
$ LC_TIME=zh_TW.UTF-8 date +%EY --date="1912/4/3"
民國元年
$ LC_TIME=zh_TW.UTF-8 date +%EY --date="1913/4/3"
民國2年
$ LC_TIME=zh_TW.UTF-8 date +%EY --date="1911/4/3"
民前1年
$ LC_TIME=zh_TW.UTF-8 date +%EY --date="1900/4/3"
民前12年

修改方法:

编辑 /usr/share/i18n/locales/zh_TW 文件,找到 END LC_TIME,在它之前加入这样三行:

era "+:2:1913//01//01:+*:民國:%EC%Ey年";/
    "+:1:1912//01//01:1912//12//31:民國:%EC元年";/
    "+:1:1911//12//31:-*:民前:%EC%Ey年"

保存后重新 locale-gen 即可。

不足:暂时没有弄明白怎么实现中文数字,不过阿拉伯数字也还过得去……

提交:glibc 的提交方式好像比较麻烦,所以先写篇博客好了。

发散:这个方法当然还可以用来实现各种自定义年号,比如朝鲜的主体纪年同样在 1912 年为元年,另外还有1970 “Unix 元年”、2013(咚咚咚,敲门声

h404bi's avatar

再谈谈 Scoop 这个 Windows 下的软件包管理器

与 Chocolatey Windows 包管理工具(Package Manager)相比, Scoop 是一款更为轻量的 Windows 包管理器。本文将对比 Chocolatey Scoop 这两款工具的区别,介绍一下 Scoop 安装使用体验,如果你没有重度的包管理需求, 不妨可以尝试一下 Scoop PowerShell Concfg 这套组合。
's avatar

如何被 GitHub Pages 蹬鼻子上脸

被什么蹬鼻子上脸?

GitHub Pages 是 GitHub 不知道在哪一年推出的网站托管服务。用户将网站内容放在一个 GitHub 仓库中(无论仓库是公共还是私有的),然后喝口水的功夫,网站就建立起来了。

GitHub Pages 有如下几个好处:

  1. 不要钱(以这种寒酸网站为基准)
  2. 方便,一键部署,一键 TLS
  3. 使用 GitHub CDN,不容易炸
  4. 炸了也是 GitHub 背锅

用户可以通过如下的几种方式部署 GitHub Pages:

  1. 使用名为 <username/org name>.github.io 的仓库作为网站的根目录 (webroot)
  2. 使用一个仓库的 mastergh-pages 分支作为网站的根目录
  3. 使用一个仓库的 master 分支的 docs/ 文件夹作为网站的根目录

在方式 1 下,默认可以通过<username/org name>.github.io 访问建立的网站;而在方式 2 和 3 下,默认通过 <username/org name>.github.io/<repo name> 进行访问。

除了给定的域名,GitHub Pages 还提供了自定义域名的选项,支持 example.comwww.example.com 形式的域名。具体看 wiki 。

被 GitHub Pages 怎么上脸?

通常来说,建一个博客需要如下几个部分:

  1. IP
  2. 域名
  3. 服务器
  4. 内容

使用网页托管服务,相当于用户交出了对服务器的完全控制,这有其两面性:用户可以不管什么阿帕奇,什么引擎X,但用户在服务器层面上能有多大的自由,完全取决于托管服务商的支持。

在 GitHub Pages 为例,用户失去了:

  1. HTTP redirect 的能力,具体来说,用户只能用一个 meta 标签做重定向,而不是返回 HTTP 301/302 进行重定向。
  2. 个性化错误页面,只能按照 GitHub Pages 的要求指定一个网页作为 404 页面(虽然大多情况下这就够了)。

你说的我都明白,所以这又怎么了?

其实没怎么。

由于上一篇博客中做的修改,现在的 RSS 变成了一个到中文 RSS Feed 的 HTTP 重定向。用 GitHub Pages 会使得无法重定向,导致 RSS 订阅会掉。

另外一个没有提及的问题是 GitHub Pages 的罪恶连锁:

不使用 .github.io -> 自定义域名不能使用 CNAME -> 自定义域名使用 A 记录 -> 每次部署的时候报警

以及

不使用 .github.io -> 自定义域名不能使用 CNAME -> 自定义域名使用 A 记录 -> 随机 302

其中第二个问题是由于 GitHub 方面需要平衡负载而导致的。

下一步?

再说。

cunky's avatar

Python 教程开坑

Why

关于写Python入门教程可以说是心血来潮?(°Д°)
嘛 主要是我过于菜鸟 会的东西也不多 博客搭好也不知道写些什么
就跟朋友 TYMON 42 >大佬 一起写Python的入门教程

EMMM

还是第一次写教程 很多东西可能都没有考虑到 有疑问的可以在下面评论留言
我会尽量地回答问题 也希望能从我这稍微学到一点有用的东西( ̄▽ ̄)~*

Continue

Cunky > 一只鸽子(只会咕咕咕!!!∑(゚Д゚ノ)ノ
TYMON 42 > 大佬(主力军ヽ(゚Д゚)ノ

笔记最后更新时间 2018-10-29 23:19

's avatar

育碧 key 切断了那条蛇

Yubikey & PAM

之前没看懂 PAM 怎么用,今天重新看了一下pam(8),打算搞好之前想弄的 yubikey 解锁桌面。

pam(8)的结果:这在说什么?

看了一篇讲 PAM 的博客:噢,我明白了(没有懂),甚至应该修改 /etc/pam.d下的哪一个文件都不清楚。

还是另一篇博客让我豁然开朗。

先在 Arch Linux 上安装yubico-pam包。

然后修改/etc/pam.d/system-auth,将下面一行添加到 auth required pam_unix.so ... 那一行的前面。如果添加到后面的话,还会先调用 pam_unix.so 来索取密码,而且失败了就失败了,并不能 fallback 到 Yubikey 登陆,然而将 sufficientpam_yubico 放在最前,当 yubikey 验证成功了就一定成功。

如果写的是 required 而不是 sufficient ,结果就是不仅要 yubikey 验证成功,而且还要接着再输一遍密码,相当于倒过来的二步验证。

auth sufficient pam_yubico.so id=<yubikey API id> authfile=/etc/yubikeys

这样就大功告成了!现在 sudo,解锁屏,登陆都可以用 Yubikey 一摁完成了!

当然,如果 KDE 的用户

  • 只想用它解锁屏,就把这一行放到 /etc/pam.d/kde 里的对应位置,注意当前用户需要有 authfile 的读权限,否则无法使用
  • 只想用它登陆,就把这一行放到 /etc/pam.d/sddm 里的对应位置

如果只想用 yubikey 登陆 console (估计没有这样的人),就把这一行放到 /etc/pam.d/login 里就行了,ssh类似,大概。

而如果想离线也能验证,或者嫌在线验证时间过长的话,就换用 challenge-response 模式就可以了。具体见 Yubico 官网的相关页面,就懒得再翻译一遍了。设置好之后甚至连一摁都不需要了。

Arch Wiki 关于 Yubikey 的条目可以说比较混乱,而 Fedora Wiki 的页面则较为简洁直白,可以作为参考。

顺便一提,也是 Fedora Wiki 告诉我有 modhex 这种东西。 Yubikey 作为键盘输入,它只会向机器发送键盘扫描码,机器再将其转换为按键。因此 Yubikey 不能控制键盘的 layout ,也就导致如果随意输入,在不同的键盘 layout 上可能会输出不同的字符。比如QWERTY的Y,在德语键盘上就成了Z(它交换了Y和Z),而在日语键盘上差不多就是假名 N (说差不多的意思是在假名输入下才是 N)。因此 Yubikey 选择了那些在任何键盘 layout 下都不会变的16个字符,用以表示16进制数,这就是 modhex 。

请关掉假名输入!不然そそそそそそりこはすいきまにすこまきましすいりそなままりこのかいそひひしきのにすきしのき

中断

今天读了一篇关于硬件中断,以及如何用 PIC 处理的博文,因为没怎么看懂,就不翻译了。

玩蛇?玩个蛇皮!

Arcaea 潜力值终于上 9 了,或者说,才上 9 。啊……

慢慢来吧。

imi415's avatar

Mbed OS 5的自定义开发板移植 - NRF51

前言

最开始看到Mbed OS5的时候没太在意,然而最近Nucleo买多了就变成了……

真香!


步骤

正好手头的BLE开发板就又开始痒痒,那就上咯

手头的NRF51开发板是微雪的NRF51822开发板,芯片型号为_AC,意即32KB SRAM+256KB Flash的型号。我们首先用Mbed CLI新建一个项目,起名叫nrf51_hello就好了。

mbed new nrf51_hello

会在当前目录创建工程目录,随便写一个main.cpp,包含main函数用来对付链接问题((

#include <mbed.h>

DigitalOut led(LED1);

int main() {
        while(true) {
                led = !led;
                wait(0.5);
        }
}

嗯,点灯工程师。

于是我们来处理板子的问题。Mbed OS 5的大致结构如下

lwl12's avatar

更新至第三代服务器环境 | Docker 萌新体验记

博客算是 lwl 第一个用上 VPS 的项目了,和很多初学者一样,lwl 一直在使用一键包来完成服务器环境的架设。随着时间的推移以及请求量的增加,现有的服务器环境维护变得越来越困难,甚至开始出现了一些无法找到原因的问题。为此, lwl 决定开始着手设计和部署第三代服务器运行环境。
Kouga's avatar

Ghost 这个博客升级真是烦死了喵!

从 0.x 时代开始用的这货,竟然弄了个断崖式升级喵喵喵!所有 1.x 之前的数据无法直接导入到 2.x 喵!

于是升级流程就变成了(卧槽这货的编辑器支持中文输入法也有问题喵个咪……)

  1. 将0.x时代的所有博文用 JSON 导出(前提是你的 0.x 博客还能启动,此时推荐NVM来安装 node 6.x.x LTS 版本启动);
  2. 安装 Ghost Cli 工具(建议 nvm 切换到 8.x.x LTS 版本);
  3. 安装 Ghost 1.x 版本(只是过一遍数据,本地即可) ghost install local --v1 --db=sqlite3
  4. 在 1.x 的控制台上导入 0.x 时代的 JSON 文件,再导出一份 1.x 的JSON文件备份;
  5. 尝试直接升级 Ghost ghost update ,如果成功应该能升级到 2.x 的当前版本;
  6. 如果 步骤5 大量出错不可解,新建个文件夹再次安装 Ghost 当前版本 ghost install 然后尝试导入 步骤4 导出的 1.x JSON 备份文件;

如果以上都不行,那还是放弃这个平台比较好喵……我导入后只是不少文章顺序混乱了,但是都还在喵……

参考链接🔗:

IceHoney Blog's avatar

后端开发的技术总结

说实话,最近前端开发的事情并不是很多。所以自己也慢慢开始做后端开发,逐渐向全沾工程师靠拢。现在的开发工作,分工分明,后端也只需要专注API的请求与返回就好了。

API文档

使用API Blueprint作为API规范,并使用RSpec API Blueprint来自动生成文档。 生成的Markdown文件,可以很方便的转换成网页便于客户端开发。例如这个工具aglio

后端开发

现在采用的开发技术框架是Ruby on Rails。不得不吐嘈一句,Ruby on Rails在日本真是压倒性的流行。Ruby on Rails还是MVC架构,原生支持RESTful API。但我觉得下一代的接口标准应该是facebook推出的GraphQL,不过先阶段RESTful API也足够了。

Models

Models主要是用来描述数据库结构,表与表之间的关系。还可以定义对数据库操作的方法,数据之间复杂的业务逻辑基本都是放在这里。

Views

Views主要是用来定义相应的数据的格式,把数据整合成统一的JSON标准供客户端使用。

Controllers

Controllers是请求的入口,用来定义请求的参数,并接收请求进行参数的过滤处理。然后调用Models里定义的方法完成数据的操作,并调用Views来完成数据的响应。

权限管理

权限管理是一件非常复杂的事情,定义某个接口在什么条件下可以调用,需要检查用户是什么身份。所以推荐是使用现有的成熟框架来进行管理。这里使用pundit来管理各个请求的权限检查。

软删除

在实际的项目中,我们需要进行软删除操作。例如用户加入了某个组织,以组织成员的身份发表了文章。当用户退出这个组织的时候,我们并不能直接删除数据库记录。否则无法显示文章的作者。这时候我们就需要软删除操作,对用户来说这条记录已经消失了。但对开发者来说,这条记录还是需要的。我们也使用框架来解决这个问题,这里采用的是Paranoia

测试

后端开发是偏向于纯逻辑的开发,所以测试非常重要。正常情况下的输入输出非常简单,代码的80%都是需要考虑到各种各样的边界条件。需要考虑到用户的各种不同情况下的操作,给出合适的错误提示。所以需要完善的测试来覆盖所有场景,这里采用的是e2e测试,模拟请求,测试后端服务器的响应输出是否符合预期。采用的测试框架是rspec-rails

参考:

Ruby on Rails Guides

Roy Binux's avatar

少女前线拖尸脚本 和 生成它的可视化工具

最近在玩少女前线,这是一个手机游戏,over。不是,就真的没有什么好讲的嘛,了解的人早有耳闻,不了解的就只要知道这是个手机游戏就好了,嗯。

然后,我会好好地,正常地,氪金地去玩这个游戏吗?不可能的,玩游戏哪有破解它有意思呢。当年破解 Ingress 是因为它用的 HTTPS 通信的,算是本行。百万亚瑟王是因为别人已经逆向好了,我只是写了一些 bot。现在这么办,玩不了了吗?作为一个不会安卓,不会逆向,不会汇编的菜鸡,那我只好上按键精灵了啊。于是乎,我找到了这个: AnkuLua

AnkuLua 是一個專注在自動化的Android App
基本自動化動作有:

  • 抓取螢幕並找尋指定圖案
  • 對找圖結果採取使用者要的動作(例如點擊、抓放(drag and drop)、打字…等等)

最重要的是,它能运行 lua 脚本!虽然我是一个不会安卓,不会逆向,不会汇编的菜鸡,但是我会 lua 啊。

ankulua-vision

不过,在使用过程中发现,找寻指定图案,需要不断截图/裁剪,这样太麻烦了。于是我又用 electron 做了一个可视化的截图资源管理器 ankulua-vision,像这样的:

基本思路就是,一般游戏是由众多 UI 界面组成的,点击某个按钮能跳转到某个界面上去。那么通过截图,标注识别区域,那么程序就能知道游戏现在所处的界面。通过标注按钮区域,那么只需要 goto('battle'),程序就能自动规划从当前界面到 battle 的可行路径,然后点啊点啊就完成需要的操作了。这样一方面不需要自己去裁剪图片了,另一方面通过框架代码,在运行过程中能够有更多的错误检查,自动应对可能出现的各种异常。

理论上,对于点啊点的游戏,是能实现无代码的。即使不能,对于复杂的动作,也可以通过 lua 拓展。

源码在这里:https://github.com/binux/ankulua-vision

你依旧需要在安卓手机或者模拟器中安装 ankulua,然后加载生成的 start.lua 脚本。默认自带了一个简单的循环逻辑,运行后可以直接图形化界面配置运行。当然你也可以通过 lua 脚本拓展,除了 ankulua 本身的 API 可用之外,你也可以使用 stateMachine 这套界面跳转逻辑 API,重用简化步骤。stateMachine 的 API 在 README 中有简略的文档说明。

源码使用 GPLv3 或 MIT 许可证,取决于第一个有效 PR(例如 fix typo 不算),如果第一个 PR 之前有商业化需求或者 PR 作者要求,则 MIT。

少女前线拖尸脚本

WARNING: 任何使用脚本的行为都是官方禁止的,我不对下文所述任何内容以及其后果负责

于是,这里就是 少女前线的拖尸脚本:

https://github.com/binux/binux_github_com/releases/download/gf/shojo.zip

同时它也是一个 ankulua-vision 的项目,你可以通过 ankulua-vision 打开这个项目目录,调整截屏或者按钮位置。

脚本实现的功能

  • 43e, 02, 52n 拖尸
  • 自动重启后勤
  • 自动强化或者分解人形
  • 自动修理

使用方法

  1. 根据 [填坑结束?][失了智]萌新向拖尸教学帖[更新8-1N相关] 一文准备好打手和阵型,一队练级队,二队补给队,52n 还需要 3 队狗粮队。
  2. 解压拷贝脚本到手机中,在 ankulua 中加载 start.lua。
  3. 在启动界面中选择你的两个打手(每轮结束后,两个打手会交换),选择拖尸任务,如果仅自动后勤,选择 null 就好了。

其中 52n 会在战斗中撤退 5, 8 号位 (见 NGA 文 “43e的说明” 展开部分),02 在选择 m4a1 时会撤退 1, 7 号位。

然后开始吧!

WARNING: 任何使用脚本的行为都是官方禁止的,我不对上文所述任何内容以及其后果负责

over

依云's avatar

获得高精度环形镜子一枚

本文来自依云's Blog,转载请注明。

如图:

这面镜子上边有好几百G数据呢,然而早已读不出来了。

镜子来源于九年前的西数移动硬盘。因为太老了所以坏掉了吧,反正是识别不了了。最近看到 YouTube 上有人各种折腾硬盘,群里又有人拆了好几面镜子出来,所以我把它找出来拆啦。这镜子比我那总也擦不干净的丽塔芙镜子清晰多了呢,就是小了点儿。

拆起来也不难。首先想办法把壳弄开。然后见着螺丝就旋下来,见着贴纸就撕掉。那覆盖一个螺丝孔的小圆片不用撕下来,直接螺丝刀往中间捅,然后把螺丝旋下来就好了。

覆盖磁头的那块金属有两个螺丝,其中一个在洞里。它上边有块形状奇怪的磁铁,照片里吸了很多螺丝的就是了。磁头是直接翻个面,让重力把它拉下来就可以了,我之前以为还有螺丝之类的还弄了好久呢,结果手一翻它自己掉下来了。马达中间那个螺丝很不容易取下,因为整体会跟着转。我是用剪刀卡住它的两个洞才给旋下来的。剩下的手拆就可以了。

's avatar

multilanguage

借助 hexo generator multilingual feed 的帮助,本站的 RSS feed 实现了语言的隔离。

中文文章的 RSS feed
RSS feed of English posts

当然 原来的 RSS feed 还是任何语言都会有的。

本来想实现 post 的隔离,但既不会又不想去学。所以就搁置啦!

Felix Yan's avatar

请不要把 Wifi Dongle 翻译成加密狗

在许多翻译过来的文本里,无线网卡(Wifi Dongle / Wifi Adapter)被翻译成了“加密狗”。最近在微博大火的一篇《俄罗斯特工又蠢了!实名行动暴露自己还卖了300多特工队友…..》里面,又出现了类似的错误,让我不得不想说说这个问题。

先来看看这个例子:

文章描述了几个黑客在目标附近发射伪造热点钓鱼,此处的未翻译单词包括了 Wifi 和 Dongle。根据上下文,带一个无线网卡发射热点应该是正确的意思,而加密狗在这里和上下文没啥关系……

我尝试在搜索引擎里搜索对应词组,很不幸,惨状令人叹息:

就连正规电子产品的用户界面都中了枪:

这个问题的来源,看起来是国内加密狗早年被简单称呼为 Dongle:

Dongle,按照维基百科的解释,是和 Adapter(适配器)很类似的一个词,泛指了一大类连接、转换器。

Wireless/Wifi Dongle = Wifi 适配器,Bluetooth Dongle = 蓝牙适配器,以此类推。所以,在看到类似 USB Dongle 这样模糊名字的时候,请务必联系上下文。如果原文用了 Wifi Dongle 这样比较明确含义的词组,请翻译为 Wifi 适配器,或者无线适配器,不要再翻译成加密狗了。

cunky's avatar

2018 · 夏日笔记

多图警告!

这里是Cunky的说~
可以说这又是一个新坑了 (虽然之前也没开过什么坑ε=(´ο`*)))唉

嘛 这个笔记本质就是记录一下生活的 没有什么别的 也不会写的像一篇散文一样 最多是流水账吧(/ω\)

珠海 · 夏

Cunky今年从六月到十月就没出过门(包括国庆假期
说来也是有些遗憾的,不过这些天在翻看照片时,发现了一些挺好看的随手拍的照片

这是珠海海边的标志性建筑 大贝壳儿~
话说贝壳儿附近的海都这么蓝么 (。-_-。)

途经活动中心的时候随手拍的

珠海的望海楼 可以看见情侣路中的绝大多数景象╰(°▽°)╯

这张图是在野狸岛上拍的 可以看见城区乌云密布 也是挺有意思的场景
(回去的时候被淋成落汤鸡了 [●´Å`●]  


这俩图片是傍晚回家的时候路过拍的 感觉很漂亮呢!
只可惜没有拿相机 手机拍下来的也修不了图(˘•ω•˘)

这张图片是和朋友一块看日出的时候拍的
(五点就把我叫醒ヽ(ー_ー)ノ

这是石景山啦~ 那天和朋友出去转了转 只是天气不大好
(不过有种奇妙的感觉Σ(っ°Д°;)っ

说来之后要和 TYMON 42 一起更新Python相关的内容呢~
(对于我这只鸽子来说 可能...
To Be Continue

笔记最后更新时间 2018-10-27 23:02

17windy's avatar

[美羽释厄录]更新预告

0.92更新预告(进行中):

1,主菜单UI美化

2,载入功能升级,实现战斗场景同步加载(即载入显示完成即可玩)

3,伤害系统重做,以期整体提升游戏性能减少卡顿

4,部分敌人刷新行为修改(影响全部小怪关卡)

5,美羽武器系统数值平衡

6,三大BOSS战继续完善,为不同BOSS增设不同的子弹造型,调整战斗难度,掉落物调整

7,商店场景为可购买物品增加鼠标悬停时的提示(可选,低优先度)

8,斩龙剑性能改造

9,BOSS战胜利自动消除全部子弹

0.91更新(已完成):

1,商店UI优化,商店物品价格调整

2,游戏场景载入时间可感觉的优化缩短

3,降低敌人普通小弹的伤害,大幅降低敌人追踪导弹的伤害

4,增加美羽初始弹药的伤害触发范围,稍微增加美羽初始弹药的伤害,稍微增加刀风类射击的射程

5,Level9 BOSS难度调整(P2弹幕修改、受弹面正常化、稍微降低防御力)

6,Level1+2难度降低

7,三路射击鱼形怪物首次射击延后0.5秒

8,主菜单开始游戏部分菜单底部增加当前Gems数量显示

9,所有战斗场景增加了暂停功能(Esc)

10,修复主菜单的语言本地化设置

11,修复Level6蛙人BOSS战不出小怪的问题

cunky's avatar

Cloud-Torrent搭建日志

很多人买了VPS以后 会出现资源闲置的情况
今天就给大家介绍一下Cloud-Torrent这款简单好用(还行吧XD)的BT下载工具

链接

GitHub项目:https://github.com/jpillora/cloud-torrent

准备

你需要一台能用的VPS 我这里用的是一台OVZ的小机子

安装

安装Cloud-Torrent十分简单
在终端输入

curl https://i.jpillora.com/cloud-torrent! | bash

即可
附:Cloud-Torrent最新版本:https://github.com/jpillora/cloud-torrent/releases/latest
成功安装以后输入 cloud-torrent --help 可以查看帮助

接下来是启动Cloud-Torrent

cloud-torrent \
  -t 'Cunky' \
  -p '9090' \
  -a 'cunky:testest0744'

完成后即可通过 http://ip:port 进入Web管理界面
注:cunky为用户名 testest0744为密码
其他安装方法 如docker等请参考GitHub的Cloud-Torrent项目
这里建议安装SSL证书保证安全性

使用

如图

可以直接将种子拖进去 也可以直接上传 或者填写磁力链接
我这的机子测试最高到过50MB/s
这个也可以结合脚本和Rclone来用 都是不错的

笔记最后更新时间 2018-10-02 22:08

17windy's avatar

[美羽释厄录] 0.91先行版 发布贴 10.02.2018更新

0.91更新日志:

1,商店UI优化,商店物品价格调整

2,游戏场景载入时间可感觉的优化缩短

3,降低敌人普通小弹的伤害,大幅降低敌人追踪导弹的伤害

4,增加美羽初始弹药的伤害触发范围,稍微增加美羽初始弹药的伤害,稍微增加刀风类射击的射程

5,Level9 BOSS难度调整(P2弹幕修改、受弹面正常化、稍微降低防御力)

6,Level1+2难度降低

7,三路射击鱼形怪物首次射击延后0.5秒

8,主菜单开始游戏部分菜单底部增加当前Gems数量显示

9,所有战斗场景增加了暂停功能(Esc)

10,修复主菜单的语言本地化设置

11,修复Level6蛙人BOSS战不出小怪的问题


经过一段时间的开(gu)发(gu)惭愧,美羽释厄录先行版终于发布啦!希望各位朋友能够喜欢:)

游戏类型:

横版飞行射击

游戏主题:

东方+喵窝

游戏作者:

17windy

游戏版本:

先行0.9版

已知问题:

分辨率自适应脚本存在问题,切换分辨率数字标示不明确

游戏UI还很简陋,将在未来继续完善

虽然经过了大量的优化工作,部分战斗仍存在少量掉帧问题…

语言本地化未完工(道具部分多语言问题很大),目前暂以中文文本为主

部分场景载入速度较慢

首发网站:

17.works


感谢释萝对于黑洞背景和美羽人物形象设计的付出。

该版本游戏不用于任何商业目的,欢迎下载试玩,可在不修改游戏安装包并注明作者的情况下随意转载。


先行版目前暂时只提供windows版,还望谅解。

下载链接:

0.91版

下载 Miu DB V0.91
点击次数: 34, 文件大小: 233.9 MB, 日期: 2018 10月 02

0.9版

下载 Miu DB V0.9
点击次数: 15, 文件大小: 240.4 MB, 日期: 2018 10月 01

百度云分流:

0.91版 链接:https://pan.baidu.com/s/1cnWUV-QuDKuZ2rfO9QKtyA 提取码:8dmk

0.9版 链接:https://pan.baidu.com/s/1v2UfCHoyUyoct5AmZfofVA 提取码:0zx7

Phoenix Nemo's avatar

重构 StickerSetBot

关注 Telegraf 有一段时间了。特别是最近 Telegram 上 spammer 猖獗导致 Telegram 对于用户行为限制越来越严格,由此想过写一个简单的 bot 来处理加群请求之类的。

总之原因都是没时间。终于搞定一些事情之后发现之前瞎写的 Telegram 导出贴图 bot 居然备受欢迎…正好 Telegram Bot API 也更新了,来重构吧!

拆分逻辑代码

最头疼的事情首先是当时写这 bot 的时候只顾着考虑各种情况,逻辑像流水一样全部写成一坨。虽然实际不复杂吧但这不是 best practice。于是把每个功能单独拆出来先。

on('command') 的逻辑代码整块移出来作为 handler,然后能够原子化的功能再单独拆分成函数调用。目前的效果虽然还是有不少逻辑层在 handler 里,但是基本达到了比较方便维护的目的。

handler 本来就是拿来写逻辑的啊摔

接下来再清理冗余代码和各种 hard code,加了两个方法让代码看起来更整洁一些。于是就先这样。

迁移框架

好在 Telegraf 和之前用的框架在参数上很多兼容,所以这没有花太多时间。顺便尝试采用了一部分 ES6 的风格,嘛…果然不喜欢。

所以就不要吐槽为什么 ES5 和 ES6 的风格混写了。

之前要一大长串的传参现在只要一个 context 了好方便啊。中间件也好方便啊~

以上。

调试:无尽的 bugfix

并不指望一通大换血之后的代码能一次跑起来…但是没跑起来的原因是我传错了中间件值这不能忍!!为什么一会儿传的是函数本体一会儿传的是函数调用啊摔!!

而且这问题还让我调了两个小时!!!

调通了之后就很舒服了

遇到的坑还有 context 本身不能当 session 用,然而不想再引入 session 中间件于是自己写了个超简陋的内存 session。就是为了多语言支持。因为一觉醒来发现这 bot 语言莫名其妙变中文了(messages 成了全局变量 = =

当然还有 Telegram 自己的坑,比如什么贴纸就是死下载不能然后整个程序就 hang 着了。

一键导出贴纸包

终于!Telegram bot API 添加了 StickerSet 类型。只要有贴纸包名称,就可以获取整个贴纸包的信息。考虑不改变用户习惯的情况下(你哪有什么用户啊可恶)对本身处理贴纸和其他消息的函数做了修改,顺便又拆了俩函数出来(怎么代码越来越多了啊喂!

最后结果就是没有一屏看不到头的函数啦~(你快够

以及加入了用贴纸包链接导出一整组贴纸的功能,算是真正意义上的 StickerSetBot 了。

然后贴纸过多卡死了 Telegram 的 ratelimiting

直接导出单张贴纸

既然功能拆分了那也就方便加更多别的功能啦。比如不新建任务,直接甩过去一张贴纸来获得 PNG 文件~

这只 bot 在这里,源码在这里。欢迎各种玩坏~(记得去发 issue

就酱(,,•﹏•,,)

依云's avatar

每次修 Python 代码的 bug 的时候总会想念 Rust

本文来自依云's Blog,转载请注明。

俗话说:由俭入奢易,由奢入俭难。

之前写 Python,老是在实现完一个特性之后,弄出来几个 AttributeError: 'NoneType' object has no attribute 或者 TypeError: list indices must be integers or slices, not str,还有 TypeError: can only concatenate str (not "int") to str 这样的错误。一看就明白自己又是哪里一不小心疏忽了,稍微修一下就好。

后来啊,我遇见了 Rust,整个流程就变了。之前写的时候,基本上都是通过手动测试来发现这种问题。为了高效、不破坏性地测试,需要控制测试的数据量,需要保证出错的时候相关的数据不会处于某种中间状态。当然在服务器上跑的脚本,我还要来来回回地传更新的脚本,或者弄个本地测试环境。而这一切,可能不过是为了跑一个成功之后再也不会用到的小程序,比如之前分析抓包数据的那次。而在 Rust 里,这些最容易犯的错误,cargo check 一下,编译器基本上能全给你指出来。所以有时候写一些小工具我也用 Rust,虽然写起来慢,但写好就能正常运行,不用反复试错,多好啊!

最近给 Arch Linux 中文社区的自动打包机器人 lilac 增加新特性。结果实现完部署之后,夜里就被 lilac 叫起来修 bug 了,还一下子就是仨……(lilac 很难本地测试,而短暂地服务中断又没多大影响,所以我都是不进行本地测试的。)

第一个 bug 是,与 dict.get 不一样,getattr 是没有默认值的。Python 里这种不一致很多,比如 configparser 里默认值要用关键字参数指定。Rust 遇到类似的情况,就会返回一个 Option。或者如果 API 决定如果不存在就 panic 的话,那么它就会直接返回我要取的值的类型,而不会包一层 Option。而我后边的代码是预期到这里可能取不到那个属性的,所以弄错了就会类型不匹配。

第二个 bug 是局部变量在一个分支上没有初始化。Rust 当然不会允许这种情况了。实际上 C 都不用担心这种问题,编译器会给出警告的,还有一些 linter 可以用。而 Python,很遗憾的是,我所使用的 pyflakes 并没有对此发出警告。我当然知道 pylint 那些。我很讨厌 pylint 和 jslint 这种不区分潜在 bug 和风格问题的 linter。我只需要工具在我可能疏忽的时候提醒我,而不需要它对我的编码风格指指点点,特别是那些指指点点往往是不对的。比如我的文件描述符变量名不叫 fd 难道要叫 fildes?

第三个 bug 是一个可能为 None 的变量我忘了先作 is not None 判断。这段代码如果初写的话我肯定是会注意到的,但是改的时候,只想着如果 pkg 里有冒号我得处理一下,就忘记了根本没有关联的包名的情况。Python 的 None,以及 C 和 C++ 的 NULL、Java 的 null、Lua 和 Ruby 的 nil、JavaScript 的 undefined 和 null,被称作是十亿美元错误,给无数程序员和用户带来了无尽的 bug。幸好这个东西在 Rust 里不存在:表达「没有值」的值没有被作为特殊值存在于几乎所有类型中,而是作为一类类型的可能的值之一。想要使用「正常」的值,就需要显式地进行类型转换,所以不可能被不小心忽略掉。顺便说一下,Go 里也有 nil 这种东西,以至于会出现这种不容易发现的 bug

Python 现在也给出了解决方案:类型注解,提供类似的类型检查。不过检查器是第三方的,也并不十分完善。等我找到机会试用过之后再来写感想啦。

Felix Yan's avatar

Thunderbolt 3 eGPU Bumblebee 方案尝鲜

最近从公司淘了一块 GTX 1060,淘宝了一个显卡盒折腾 TB3 eGPU 方案。由于笔记本经常带出门,打算采用即插即用的 bumblebee 方案(回家插上盒子用独显,拔下盒子可以带出门,可以正常待机不用重启)。下面记录一下 Arch 上配置的步骤和遇到的坑。

1、准备软件包

# pacman -S bumblebee primus lib32-primus nvidia-dkms lib32-nvidia-utils bolt

2、修改 bumblebee 配置

修改 /etc/bumblebee/xorg.conf.nvidia,在 Section “Device” 中加入:

Option "AllowExternalGpus" "true"

修改 /etc/bumblebee/bumblebee.conf,在 [optirun] 中修改:

Bridge=primus

3、插入 TB 线,验证设备(不建议完全关闭设备验证!)

输入 boltctl 查看设备信息,记下设备的 uuid。

$ boltctl
 ● TUL TBX-550CA
   ├─ type:          peripheral
   ├─ name:          TBX-550CA
   ├─ vendor:        TUL
   ├─ uuid:          00xxxxxx-xxxx-xxxx-ffff-ffffffffffff
   ├─ status:        authorized
   │  ├─ domain:     domain0
   │  └─ authflags:  none
   ├─ authorized:    Fri 28 Sep 2018 08:23:25 AM UTC
   ├─ connected:     Fri 28 Sep 2018 08:23:21 AM UTC
   └─ stored:        Thu 27 Sep 2018 05:22:07 AM UTC
      ├─ policy:     auto
      └─ key:        no

验证设备并设置为自动验证:

$ boltctl enroll --policy=auto 00xxxxxx-xxxx-xxxx-ffff-ffffffffffff

4、启动 bumblebeed

# systemctl start bumblebeed

5、测试、运行程序

$ optirun glxspheres64
Polygons in scene: 62464 (61 spheres * 1024 polys/spheres)
Visual ID of window: 0x13f
Context is Direct
OpenGL Renderer: GeForce GTX 1060 5GB/PCIe/SSE2
……

6、安全删除设备(参考了 jpamills 博客里的脚本)

#!/bin/bash

secs=5
tbt_chain=/sys/bus/thunderbolt/devices/0-0/../../../..

echo "Unplug eGPU script started."
if [ "$(id -u)" != "0" ]; then
        echo "Please run using sudo. Exiting."
        exit 1
fi

systemctl restart bumblebeed
sleep 2
modprobe -r nvidia_modeset
modprobe -r nvidia-uvm
modprobe -r nvidia

if [ -e $tbt_chain/remove ]
then
        echo 1 > $tbt_chain/remove
        echo "Thunderbolt chain removed from PCI tree. Please unplug eGPU now."
        while [ $secs -gt 0 ]; do
                echo -ne "$secs to rescan...\033[0K\r"
                sleep 1
                : $((secs--))
        done
        echo 1 > /sys/bus/pci/rescan
        echo "Rescanned the PCI bus. Completed."
        exit 0
else
        echo "eGPU does not appear to be attached. Exiting."
        exit 1
fi

如果和我一样在盒子上插了外置硬盘,还可以在脚本里加上相应的 umount 语句。删除设备时需要先把使用设备的程序退出。

效果展示

剩下的问题

  • 脚本里可以考虑通过判断 nvidia-smi 列出的 PID 自动杀掉所有还在用卡的进程
  • Vulkan 应用程序暂时无法使用外置卡运行(仍然使用集显),可能需要 bumblebee 提供支持
Phoenix Nemo's avatar

想要导出 Telegram 贴图

Telegram 上出现了越来越多的优质贴纸,想要把这些贴纸用到其他 IM 平台上的时候就会比较麻烦,所以一直想要一键导出一个贴纸包的功能。

可惜的是,Telegram bot API 的限制,并没有任何简单的办法通过贴纸消息获得贴纸包的信息。寻找另外的途径,例如 telegram.me 的贴纸链接会定向到 tg://addstickers?set=[StickerSet]。搜索了一下现成客户端的源码,都是交给 MTProto 的 API 处理,也没有明确的解析过程。而这些客户端所调用的 messages.getStickerSet 也没有在官方的文档中列出。(吐槽:Telegram 的协议、文档和代码真是糟糕,查阅的时候我的表情一直是 黑人问号.gif

由于最近状况不是很好,所以只好暂时放弃继续读 webogram 的源码。因为读 Angular 的东西实在是折磨…

所以依然是选择直接发 sticker 再转为图片发给用户的模式。这样的已经有了相关的 bot,于是改为多个 sticker 打包、支持多语言、支持 jpg 和 png 以及批量缩放功能的 bot。需要安装 Node.js v4.0 及以上版本和支持 webp 的 ImageMagick。

虽然实现效果看起来还可以,但是并未实现最初希望的功能,所以只能是练手用的轮子而已。不过,这个轮子稍微尝试了一些新的东西。例如超简陋的内存数据库,而且很多细节考量更加周到,例如任务锁虽然不是写过最麻烦的,不过应该算是相对完善的。当然也考虑了内存数据库的手动释放以防内存爆炸为此还特地在群里讨论了 object children 被 undefine 而 object 其他 children 还在被引用的状态下是否可以回收部分内存的问题

源码的实现非常简单,但是好久不写代码还是手生,折腾了一下午写功能加一晚上和朋友们 debug。读源码戳 GitHub

这里有一只 bot 跑在测试环境,所以可以尝试一下。如果没理你说明沙盒没开,那么就请自己去跑源码来使用辣ᕕ(ᐛ)ᕗ

有几点坑,比如这个 node-telegram-bot-apionText 方法无法正确匹配 Negative Lookahead 的正则表达式(不应该啊…然而没深究),adm-zip 非常非常不好用,jszip 文档表述不清 API 调用复杂然而用起来了就还不错。

但是最坑的是,只为实现这么一个简单功能的 bot,我的 node_modules 目录下居然有

1
2
Phoenix-X1-Carbon :: js/telegram-stickerimagebot/node_modules ‹master› » ll | wc -l                                                                                               1
104

WHAT??? 104 个依赖包!!!

真是可怕…明明我已经尽可能减少不必要的依赖了…

===== 2018/9/28 更新 =====

Telegram bot API 更新了(早就)

于是这只 bot 可以一键导出一组贴纸了。详情

依云's avatar

永远不要 tail -f 管道

本文来自依云's Blog,转载请注明。

运维同事为了收集日志,配置程序将日志写入一个命名管道。然后他在外边拿 tail -f 去读,结果发生了灵异事件。通过 strace 可以看到,tail 进程读取了日志,但是却并没有再输出来。但是如果不启动输出日志的程序,而是在实例启动之后再进去往管道里写数据,却又是可以立即得到 tail 的输出的。

很奇怪的行为,一群人在那里研究半天,猜测是不是环境变量造成的啊,是不是放后台组执行造成的啊,是不是 XYZ 啊。——典型的「霰弹枪式」除错法

我当时也被带沟里了。于是跑去尝试复现,接着去读 tail 的源码。花了好久才明白这是一个很简单的问题:tail -f 的语义首先是 tail 这个词本身——先读文件最末尾的数据(默认是十行),然后再是 -f 选项的语义,即在文件更新时接着读取数据并输出。所以,当程序往里边写日志时,管道写端一直没关闭,tail 就一直读不到文件结束,也就无法确定最后十行是什么。当他们测试的时候,因为使用的是 echo shell 命令,打开文件、写入数据、关闭。这样 tail 一下子就读取到了文件末尾,然后把数据输出来了。接下来就是边读边输出了。

其实这种使用方法本身就很奇怪了,以至于这个执行流是兼容许多系统的 tail 的各种分支里,最最不常规、无可奈何的那一个分支。你都用管道了,cat 一下嘛。如果怕遇到管道被 reopen 的情况,就在 while true 里 cat 就好。

这个事件中,我也是见识了很多人解决问题的奇怪思路:「我猜猜猜。猜对了哦耶,猜错了,哎呀编程好难啊,Linux 系统好难啊……」猜你妹啊!你长的是大脑又不是骰子,用逻辑一步一步地取得结果不好吗!

有一个小游戏——猜数字。比如甲确定一个 1 到 1000 之内的整数,然后乙来猜。每当乙给出一个猜测时,甲回应猜对了,还是过大或者过小。如果乙知道什么叫二进制的话,乙可以保证在十次之内猜中的。

计算机系统和编程世界里,最棒的一点是确定性和逻辑性。虽然经常也不是像上例那样完全确定的,但至少比起人类社会要容易确定得多。特别是在有源码的时候。所以解决问题的路线也很简单,顺着问题的症状一路回溯,确认然后排除那些没有问题的部分,逐步缩小问题所在的范围,直接你看见它。就跟上边的猜数字游戏或者地毯式搜索一样。每一次猜测都是带着排除一部分没有问题的地方而去,而不是明明有证据表明某个地方不可能有问题,你还偏偏怀疑问题在那里,做无用功。

就像调查一个凶案,这些人放着有作案嫌疑的人不管,非要费劲地去调查那些有相当好的不在场证明的人。

Arch Linux 中文社区这边也有很多这种人。出了问题描述不清楚症状。新手嘛,没经验也没学习过如何描述事实,讲不清楚也没什么,引导对方获取截屏、日志,逐步排查问题就好了嘛。可就是有些热心人,喜欢提出自己的猜测。重点是:都不尝试证实猜测是否属实,就急着上解决方案。结果就是,我询问细节事实的消息没人理,求助者试试这个,试试那个,最终问题能否解决,就跟买彩票能否中奖一样,全凭运气。

AlisterTT's avatar

觉得有必要放点什么东西

突然发现最近一篇日志还是去年8月写的,这都9月了,一年没更新,还是随便写点吧。

分享个有意思的东西,关于皮神的奇妙旅行。

前两年基友在日本出差的时候,回来给我带伴手礼,选了个皮神的amiibo,刚好那两天要去Great Hall围观一个颁奖晚会,就顺手把皮神揣口袋里了,于是有了下面的照片:

Processed with VSCO with kk2 preset Processed with VSCO with hb1 preset

不出意外的话,这应该是历史上第一个在Great Hall里拍写真的皮神。

这两天刚好又有活动,去坝上那边参观,脑子一抽又把皮神揣口袋里了,于是有了下面的照片:

Processed with VSCO with c2 preset Processed with VSCO with hb2 preset

感觉还是棒棒的,以后出门都把他带上好了。

依云's avatar

人生苦短,我用 skim

本文来自依云's Blog,转载请注明。

前两天我又看到了基于子序列匹配的字符串过滤工具 fzf 的绚丽效果了。实际上我很早就听说了这个工具,只是懒得动手配置。此次提及,我发现 fzf 已经在官方软件源里了,而我也正好有时间,所以打算试一试。

然后呢,Arch Linux CN 群组里艾穎初提到 skim 这么一个工具。了解了一下,这个就是 Rust 版本的 fzf,并且在 archlinuxcn 源里也有(git 版本,即 skim-git)。这太好了,就是它了!

skim 的操作很简单。文章开头的链接里已经有效果演示了。常用的也就是输入子序列去过滤,然后再输入一个进一步过滤,直到看到想要的。使用 ! 前缀可以反向过滤,^ 匹配开头 $ 匹配结尾。Ctrl-p/n 来上下移动。提示符那里也支持通常的行编辑。

到现在为止,我自行实现了 sk-cd、sk-search-history、sk-vim-mru 三个功能。另外使用了自带的 completion.zsh 文件。由于各种不满意,没有使用自带的 key-bindings.zsh 文件(也就包含 cd 和历史命令搜索功能啦)。

completion.zsh 里目前有两个功能。kill 时通过 ps 补全进程 pid。这个想法很好,以后我可能专门做一个通用的方便 strace 啊 lsof 啊 gdb 啊之类的用。

另一个是遇到两个星号(**)时按 Tab 补全,查找并替换成当前目录下的文件。

我实现的 sk-cd 是从 autojump 取目录列表,然后喂给 skim。于是就成了交互式的 autojump~这是一个我很需要的功能。原来我都是通过 Tab 补全列出可能的项,然后再 Tab 过去选的,有些慢也有些麻烦。

sk-search-history 就是在历史命令里找东西。因为遇到特殊字符时无法正确地加载预览,我并没有开启预览功能。反正找到的命令只会放在命令行上,并不会自动执行的,选错了可以及时取消。

以上两个功能分别绑定到 Alt-s d 和 Alt-s r 上。我使用 Alt-s 作为 skim 快捷键的开头,以便保留 zsh 原本的快捷键,避免冲突,特别是以后可能会有更多功能被加入。我在 Vim 里,也是类似的做法,Alt-q 是 easymotion 的开头快捷键,Alt-d 是 denite 的开头快捷键。

sk-vim-mru 仅仅是个命令了。使用的数据是 mru.vim 的历史记录文件。然后做了两个函数:vim-mru 使用 Vim 编辑文件,vv-mru 使用我自己的 vv 命令在已有的 gVim 里编辑文件。

我做的版本和 skim 自带版本,最大的差别在于,我的版本会尽量使用全部的窗口空间,而 skim 自带的总是会使用 40% 窗口高度。(所以我有个函数用来获取当前光标位置,有需要的可以自己拿去用。)

如果你想用我的配置,可以 wget https://github.com/lilydjwg/dotzsh/raw/master/plugins/sk-tools.zsh 回去,然后 source 一下就好。有需要的话(比如数据来源、键绑定等)可以自行修改。


2018年09月17日更新:我尝试了一下把 sk-search-history 映射到 Ctrl-r 上,然后很快就放弃了。因为 skim 的结果是不可预测的,而默认的 Ctrl-r 的结果是完全可预测的(只要还记得;当然你不能开(那个让我在服务器上误杀过进程的)实时历史共享)。可预测性对提高效率非常关键,因为你不需要中断思维,停下来等结果。

imi415's avatar

i.MX RT1050 简单上手

前言

i.MX RT1050大概是能买到的比较便宜的Cortex-M7 MCU了,本文介绍从裸Linux环境开始配置完整工作环境。

一、硬件准备

  • i.MX RT1050开发板
  • JTAG/SWD调试器
  • 足够多的USB线和杜邦线

二、软件准备

  • ARM GCC(任意版本,>= 7)
  • CMake
  • OpenOCD(越新越好)
  • 文本编辑器(任意)

三、OpenOCD调试环境准备

  • 在任意位置保存如下target配置
# NXP i.MX RT1050 family (Arm Cortex-M7 @ 600 MHz)
#

if { [info exists CHIPNAME] } {
        set _CHIPNAME $CHIPNAME
} else {
        set _CHIPNAME imxrt1050
}

source
IceHoney Blog's avatar

跨域请求中的cookies处理

现在的前后端开发已经完全分离,后端服务器和前端服务器分别部署在不同的服务器。同时也对应不同的域名,所以跨域请求领域方面的知识也需要补充。

跨域请求添加header

我们都知道,出于安全考虑,JS是有同源策略限制。所以,我们在对其他域名发起请求的时候需要添加 http header。

    Access-Control-Allow-Origin: *

这个参数的值只能为星号或者具体的网址,星号代表所有网站。

跨域请求添加cookie

JS跨域请求有两个API可以使用,XMLHttpRequestfetchXMLHttpRequest会默认带上cookies,但是fetch默认不会带上。如果需要带上cookies,需要把withCredentials设置为true

跨域请求服务器设置cookie

我们都知道服务器设置cookie是通过set-cookie的 http header来完成。浏览器会读取这个信息设置cookie。但是对于跨与请求,默认是无效的。我们需要再添加一个 http header。

    Access-Control-Allow-Credentials: true

当设置了这个 http header,Access-Control-Allow-Origin就不能设置为星号了,必须指定具体的网址。我们必须指定withCredentialstrue并且Access-Control-Allow-Credentialstrue的时候,服务器返回的set-cookie才会生效。

参考:

Access-Control-Allow-Credentials

CORS

Felix Yan's avatar

Arch Linux 社区中不成文的约定(一)

作为一个年轻和小众的社区(咳咳),Arch Linux 社区中有着许多不成文的约定。本文希望通过稍稍讲解一二,来消除一些新人们常常感到的困惑。由于预感到日后可能还会有更多问题,暂且认为这是系列里的第一篇

  • 修理“坏”包和提醒更新

仓库里一般的包可能有一个或多个维护者,也可能没有维护者,成为“孤儿”。如果坏掉或者过期的包是一个孤儿,申请从仓库里删掉是更有效的方法,这样它可以在 AUR 找到新的主人。发邮件到 aur-general 解释一下情况,并表明自己或者别人想维护它,一般都会很快得到解决。

如果“坏”包有维护者,但他太忙了呢?这种情况下,这个包很可能已经在 Bug Tracker 里泥足深陷。这种时候可以通过帮维护者一个小忙的方式来促进问题的解决。如果有人找到了上游 Bug Report,并且上游已经修复提供了 patch 的话,可以考虑把 patch 贴到 Arch 的 Bug Tracker;如果这件事已经有人做了,可以修改 PKGBUILD 打上 patch,然后把改好的 PKGBUILD 贴上去;如果连 PKGBUILD 都有人准备好了,而且过去了一段时间的话,可以考虑把这份准备好的 srcpkg 或者 diff 直接发邮件给维护者,附上简短的感谢和一个笑脸

同样的道理,如果一个过期包已经被标记过期很久了,也可以准备一个新版的 PKGBUILD 发邮件给维护者。

  • 提供旧版软件包

因为懒得迁移各种各样的原因,你可能希望某些软件包的新旧版本同时提供。在 Arch 的实践中,这种情况被尽量避免了。把无法迁移的古老软件删掉还是提供一个旧版库让古老的软件能用,一定程度上取决于维护者对这个古老的软件有多坚持。

另一个考虑的因素是上游如何看待新旧版本。有的软件新版发布后,旧版就不再维护了,这种情况下 Arch 通常尽力避免成为新的上游。而有的上游则同时维护多个版本,Arch 这边根据其他软件的依赖情况,可能会有选择性地同时维护几个。

  • 第三方 patch 能不能加上

Arch 对 patch 的态度比较保守,在规则里写的是一般只有修复编译和主要功能的上游已经接受的 patch 会考虑。在实践中,有些时候没有这么严格,比如开发者自己写的 patch 一边提交给上游,还没等答复,一边就加到了包里。因为 Arch 打包并没有 Review 过程,实际上加了什么 patch、靠不靠谱就全靠开发者自己掂量了。

一般来说,被上游明确拒绝的功能性 patch 是不怎么会考虑的。修复一个特定问题,尤其是影响比较大的问题的上游有点意见的 patch 有可能会被考虑。修复一个安全问题的 patch 经常会被接受,尤其是已经拿到 CVE 号的。

  • 使用上游二进制 vs 从源码编译

一般常识是发行版们倾向于从源码编译一个软件,理由包括确保二进制真的来自这份源码、尽量使用系统中的动态链接库而不是静态编译一份以满足安全更新和体积方面的考虑、进行必要的修改等。

但是因为太懒一些问题,即使是在 Arch 官方仓库里也直接重新打包了一些上游的二进制。这些问题包括:源代码不开放(nvidia、flash 等)、编译过程中会去下载东西,而且不容易解决(dart、一些 java 软件等)。

  • 文档是否打包

现在互联网十分发达,开发者们查询文档通常都是直接上网搜索。在这样的背景下,是否打包软件包的文档(通常都是开发文档)成为了一个问题。早些时候的包开启文档较多,如果太占体积还会考虑拆一个单独的文档包。后来才增加的新包则很多都没有启用文档,除非被用户要求提供文档才考虑这件事。

cunky's avatar

在阿里云免费申请SSL证书

SSL证书

在国内提供免费SSL证书服务的云厂商其实不少
比如阿里云 腾讯等
最近因为觉得Let's Energy证书需要3个月续签过于麻烦(虽然一个脚本的事...
于是生起在国内寻找是否有免费提供SSL证书服务的云厂商 一查 果然不少
由于对阿里云的偏好(不包括阿里云无尽的推销电话服务
果断选择了阿里云作为这次的目标

证书申请

阿里云提供的是Symantec的单域名证书申请
登录阿里云官网并进入控制台 搜索SSL证书
并在右上角点击购买证书

进入该界面 并做如下操作

请务必按照顺序操作

选择品牌> Symantec
保护类型> 1个域名
证书类型> 免费型DV SSL
立即购买

购买完成后 不要着急 阿里云还需要审核你的身份
进入控制台 > SSL证书管理
按照真实信息进行填写并审核(审核速度还可以的 至少没有网上说的一个小时 我只花了10分钟左右
之后在证书管理处直接下载证书并部署即可(阿里鱼有专门的安装证书的说明 很方便就安装完成了

笔记最后更新时间 2018-08-26 04:40

cunky's avatar

如何申请Let's encrypt免费证书

Let's encryptLet's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起...
cunky's avatar

Typecho博客的安装之旅

关于TypechoTypecho是一个简单而强大的PHP博客平台Typecho is a PHP Blogging Platform. Simple and Powerful.官网:https:...
cunky's avatar

网站从Wordpress搬迁至Typecho!

Wow~
由于Wordpress过于臃肿 很早就想换到另一个更好的博客
只是一直没下定决心 今天终于是从Wordpress搬到Typecho这个由国人开发的博客
网站的响应速度也是很快
嘛 总是一切都还不错
就这样啦~ 之后会发一篇新笔记吧...
咕咕咕~~

网站LOGO来源:Nahaki - 第六駆逐隊(58769413_p4)
网站背景图片来源:CZY - 大爆炸 (65523930)

笔记最后更新时间 2018-08-25 15:41

's avatar

好像太久没有更新了

这里的内容已经一年没有更新了。

与其说是懒得更新更应该说是没有做出什么能让我更新的事情吧。

说起来这段时间一直都比较糟糕,既没有搞出什么新的作品,在学业上也是遇到了一堆问题。真是太失败了。

今后的话……还是希望能提起精神造出一些新的内容来,不过我好像对自己失去信心了呢。

之后再看吧。

Dimpurr's avatar

钉子的谜之 SETUP 18 @ Ningen

本文原载于 人间 / Dimpurr Cheny ,前文 钉子的谜之 SETUP (2014) 。

简要介绍一下自己,并且谈谈正在做什么?

这里钉子,现役帝都大学生。曾经写写画画做过不少事情,当过宅圈内知名前端博主,设计过几个流行的 WordPress 主题,发起过一点音乐社区相关小项目,都已经成为过去。大一以来,唯一的成就是为了拯救北邮人技术组废部危机,不得不成为偶像,建立了 BYRIO 开源社区。目前在选择遵循自己内心去做游戏设计和编曲,还是顺应他人期待继续在 CASIA 和 MSRA 的 ML 搬砖日常前犹豫不决。

你使用的硬件有?

主役 MacBook Pro + Surface Pro ,经常同时携带 (虽然很重) ,前者用于影音处理、工程开发、平面设计、绘图板画画 (Wacom Intuos PTM CTH680) ,后者用于 PDF 阅读和批注、 OneNote 笔记、 Surface Pen 作画、推 Gal 和小游戏 (V-A HALL, FrostPunk) 。 Surface Pro 虽然性能有限,但是在轻薄的前提上能让自己在任何时空基本具备进行任何工作的能力。

宿舍配备 Linksys WRT1900AC v1 用于享受百兆校园网 (IPv6 免流 + 学校网络中心成员特权套餐) ,一块 26’ DELL UltraSharp Monitor U2415 外接屏一般连接 MBP 用于宿舍组团看 Rick and Morty 或少女歌剧、瀑布流展示作画和人体结构参考资料、工作时看论文和文档等,计划接上 Switch Dock 之后用来在宿舍玩舞力全开。配置 MIDIPLUS X6 键盘 + ATH-AD2000X 开放式大耳用于演奏。

随身 Sony XPERIA XZ1 ,佩戴 Moto 360 。 SHURE SE846 耳塞退烧,前端 iBasso DX90 和耳放 Sony PHA3 常年借给同学。 iPad mini 用于音游 (Cytus II, Arcera, Groove Coaster, Dynamix) , Nintendo Switch 用于 Party Game (分手厨房) 和沉迷死喷浪涂 (Splatoon) 。

你使用的软件有?

常年 macOS, Windows 和 Linux 跨平台用户,曾经是 OpenSUSE 党。 macOS 下剪贴板历史 Paste 和快速访问 Spotlight 重度用户, Win 对应工具是 Ditto 和 Keypirinha 。所有常用 App 必须选择跨平台解决方案, 必备滴答清单 + SimpleList 。日常 IM Telegram 和 QQ ,偶尔用 HexChat 挂 IRC 。念念不忘的 Mac 独占 App 有 Sketch, GarageBand, Agenda, OmniFocus 和 XLD 。念念不忘的 Win 或者 Unix 独占 App 没有,非要说的话 PC 游戏。

曾经 Sublime Text 2 党,如今 Visual Studio Code 忠实用户,必备插件是 background 自带魔理沙背景 + GitLens 。终端分别 iTerm2 和 Cmder / MobaXTerm 。 macOS 下用 SourceTree 做 Git GUI ,用 MAMP PRO 做服务器测试环境。写作环境 ByWord 和 Typora ,设计主 Sketch 辅 Axure 和 PhotoShop ,偶尔用 Illustrator 描矢量画或者 InDesign 做小册子。剪辑一般用 Final Cut Pro 或者 Premiere 。三维制作 3DS MAX 和 Blender 。

主要用 CLIP STUDIO PAINT 作画,新的拟真铅笔手感非常好。有时候会使用 Krita , Tyson 大大绘制的 Kiki 启动屏幕非常可爱,自带的丰富笔刷和镜像画笔等功能很能激发创作灵感, BYRIO 社区还组织参与过 Krita 中文文档的翻译工作,在此安利。

你梦想中的设备是怎么样的?

梦想是巨硬让 Surface Pro 性能、品控和售后再好一点,水果让 MacBook Pro 再便宜一点,索法不要搞 XZ2 这种歪门邪道好好出 XZP 这种全平衡侧面指纹带耳机孔的好手机。离开大学宿舍后可能会对个人工作站的设备有新的愿望,目前暂时并没有什么其他的梦想。

 以下附图。

Surface Pro 桌面

Surface Pro 开始

MacBook Pro 桌面

MacBook Pro LaunchPad

本文来自 钉子の次元 - Dimpurr - 千里之行,始於足下。 ,原文地址 钉子的谜之 SETUP 18 @ Ningen

kookxiang's avatar

安装 homebridge

说实在的,哪个土豪会只在一台机器上跑一个应用…
多个应用共用一台机器不是很正常吗?

node.js 一升级,homebridge 就挂了 23333333

那么,有没有什么办法能延续 homebridge 的寿命呢?

首先我们把锅烧热,新建一个目录(~/homebridge)
然后再在里面运行 npm init 初始化

接下来就是神奇的时刻了,这时候输入 npm install node@8
然后你就会惊奇地发现 node_modules 下面有个 node…

这时候再通过 npm i -S homebridge 安装 homebridge 和其他组件
这样再系统无论怎么升级都不会挂啦~

然后再在 package.json 添加一段

  "scripts": {
    "start": "homebridge"
  },

最后通过 npm run start 就能正常使用啦~
最后当然是写个 systemd service 调用 npm 启动啦

附上手游玩家氪金的悲惨故事:
< 访问完整版以查看此播放器 > 视频:

's avatar

NES 冒险岛 IV - 无敌修改

《高桥名人之冒险岛IV》(高橋名人の冒険島IV)是 Hudson Soft 在1994年6月24日在 FC 平台发售的一款横向卷轴平台类型游戏。 百科

补丁基于 20121002 NOKOH 汉化版本制作,网上随便搜了个日版的 ROM 能用,英文版基于日版翻译应该也可以用。

小时候玩的可是日版,根本没理解过里面的文字和剧情,因此这次算是好好的过了一遍了。

做补丁的原因主要是打到倒数第二个 BOSS 的时候实在是打不动,只好上 Fceux 调试看看了。




就目前发现的三种伤害计算来看,需要补丁下述文件位置:

伤害类型 文件地址 原始内容 修改内容
普通伤害 03C2AD B1 A9
刺的伤害 01C799 01 00
岩浆伤害 008BCB 6E 07 D0 6F 07 F0

如果还有伤害不能免除的话,可以在这里留言(如果能提供一下密码就更好了)。

IPS 补丁下载:Takahashi.Meijin.no.Bouken.Shima.IV.(J).Invincible.Patch.ips

以及在网上找到的 密码生成器

Fenking's avatar

明日方舟,明年方舟

等明日方舟这款手游已经等了好久了。
这主要是因为对海猫氢弹库(海猫络合物)的个人风格的喜爱和敬佩。
没等到一测的我,也没等到二测。不过同学的朋友有幸得到了激活码,而且并不打算玩,就把号交给了同学。
可惜画风一转,在某二本的同学受难于周围同学过于傻逼,在7月31日的聚会上宣布自己复读去了,第二天就开学。
我们顺理成章的继承了他的所有个人”遗产”:fgo、少前、舰R账号,一部游戏手机以及一个欠了2000花呗没还的支付宝。
我没什么手游爱好,顺理成章地继承了明日方舟。

也许是某种魅力,我第一次沉迷于手游:每天畅游在托福与明日方舟的海洋里,拿着他瞎打的一堆废角色,重新练级,重新推图,在梦中思考每一关的战略,为了在二测结束前通关主线剧情——登上”dalao榜”,拼命的过图。
最终功夫不负有心人,4月9日上午,我通关了主线剧情,也放弃了只有真dalao才能打过的额外关卡回声测试。
盼望已久的德克萨斯(干员名称)也得到了,想舔的白金和蓝毒却也没得到(完全没有狙击单位)
现在游戏记名正式结束了,11、12两天就是资源大狂欢。
最后记录一下繁忙中自己的最终成果。
非抽卡
欧抽卡


各种剧情图







最后一关4-10的各种图










我的最终成果与纪念

23:59结束统计纪念







我的主力们


以及传说中的玫剑圣

明日方舟,明年再见(也许

lwl12's avatar

让小爱同学登上云村

前天 LWL 氪了一台垂涎很久了的小米小爱音箱 Mini,现在买还优惠十块只要 ¥159 快去买啊~(Mi Boy 打死),提回家后才发现这音箱居然没和云村合作???

个人喜欢的挺多歌都是同人角色曲一类的,好像除了云村和 5sing 也没什么别的地方能找到了。不支持云村显然忍不了,正巧之前酷安上有人拿了(我的?)一言 API 去接入小爱,让我记下来了这音箱还是有个开放平台的,然后我本来就有一个音乐搜索项目在跑着……(不去写个接入我都感觉亏

万事俱备只欠东风,说干就干!

接入开放平台

小爱开放平台,顾名思义也就是提供给开发者做高级技能的地方啦!(说起来小米这次感觉也是投了血本要扩大小爱的技能范围,这开放平台甚至能建免费云主机用……)

要在开放平台上创建应用的话需要上传手持身份证,给个差评,虽然最终还是传了(真香)。审核通过以后就可以开始建立应用了。

技能信息


除了技能名称和唤醒词,其他的项目如果不需要发布的话可以瞎填,没啥影响。不过这里不得不吐槽一下这糟糕的唤醒词功能,也不知道是不是我用法有误(文档反正是没写清楚),带意图的唤醒词实际用起来完全无效,于是整个语音请求一下子多了一轮对话,效率降低不少。

交互模型

交互模型这块的话,由于并没有什么公开的歌名/作者名数据库,所以词表可以忽略掉,主要是设置意图。

槽位

首先要添加意图,接着就可以开始添加槽位了。由于云村的搜索还挺智能的,所以只需要把用户提到涉及歌曲信息的文字全部选出来一股脑丢给搜索就行,省去了一部分麻烦。

虽然追问和回复似乎并没有什么用,但是在槽位必选的情况下一定要填……这个比较无所谓,开心就好(

语料

说白了就是猜用户会用什么语言来尝试调用这个应用,自用的话想想自己常说的就行

值得一提的是这个页面的底部有一个模糊匹配选项,虽然好像没什么用但是也没有负面影响,可以打开试试

配置信息

前面提到了小米这次免费给开云主机用,其实就是为这里的函数计算功能服务的。整体用下来应该是和 SAE 差不多一个性质的东西。

咱这次的代码也就跑在函数计算上面,所以按引导申请一下计算资源就行。注意在申请的最后一步会要求选择触发器,需要建立一个 SkillTrigger,并在创建完成后拿到他的 ID 填回开放平台。

函数代码放在后文了(

设备调测

全部配置好以后就可以在这里进行测试了,虽然这个测试真的很难用,出错了连个实际错误信息都没有……

函数代码

不废话直接放了:Github,记得给个 Star(
实质上就是一个类似中间件的东西吧,连接小爱的语音识别和我的 Music API (这 API 一直是半公开状态因此并没有文档_(:з」∠)_

填到函数计算后台的函数代码里就好~

使用条款

对于开发者

  • 禁止不合理利用源码内的 Music API,例如作为违法用途,高频率调用等
  • 禁止商业使用

对于音箱用户

虽然感觉应该过不了审但是如果过了的话……

  • 居然过审了,爱怎么用怎么用吧(
  • 我也不知道这些音乐是哪来的啊,完全不懂,好像都是随随便便就读到了,云村好像听着挺耳熟的不过我也不知道是哪家公司呢,总之能用就好吧(

其实呢,本来是不打算写这篇文章的……毕竟感觉这种作大死的东西拿出来摆着不知道什么时候就收到律师函了呢(疯狂毒奶
不过确实想填一下后台的使用条款和隐私政策所以还是写了(是的你现在看到的这条和后面那条才是本文最关键的地方了)

隐私策略

如果小爱的逻辑比较糟糕的话有可能会被 NGINX 记录到设备 IP,其他的信息则完全不会被记录。

最后

感觉大概应该是过不了审,所以发出来也还行吧……如果你碰巧有同样需求的话可以尝试自己搭建一个,然后让小爱音箱进入开发者模式就能自用了。
Enjoy music 🙂

- EOF -

AprocySanae's avatar

恶龙会梦见经济学家吗?(其二)

SLAY MORE, GAIN MORE

AprocySanae's avatar

恶龙会梦见经济学家吗?

经济学就是屠龙术,字面意义上。

— 《高等宏观经济学》 王国历112年修订版 第一页第一行

's avatar

我喜欢网络上的大家,但是我好纠结

在现实中没有很好的社交能力、爱好小众、情商又不高,所以交不到什么朋友;即使是有相识的人,平常也会不会觉得有什么事情需要找对方,从而很久也不会联系——这样要怎么办呢?人类是社交性动物,如果没有与其他人类交流的话,迟早无聊或者孤单死的。有着这样情况的我,就只好投奔了网络,寻找与自己合得来的其它人类。

感谢科技,在网络上寻找朋友这样的事,已经不能变得再简单了。在现实中畏畏缩缩的我,终于在没有面对面的对话中,找到了新的生命。

我喜欢几乎我熟悉的每一个网友,大家都是那么的可爱。我明白,藏在萌妹头像背后的,也许是一个留着汗的大叔,但那样又有什么关系呢?即使是大叔,那也是可爱的大叔,是我喜欢的朋友。网络真是太好了,它给了这样多外表不惹人喜爱的人另一次机会,让他们也能被人喜欢。

长辈们跟我说,“网络上的东西都是虚拟的。”嘛……那确实没错,大家大都是拿着不真实的名称,不真实的头像,简直就像是用假身份在交流一样。但在这背后的,怎么说都是一个个真实的人呐。当然要说有机器人也没错,但机器人总归还是能够看出它的冰冷和机械的。因此,即使长辈如此告诫,我仍然是将整个身心都放给网络上的大家。

我是如此的迷恋于网络社交,以至于将它想象的太过美好,但经过了这么长的时间,直到现在,我才明白了它没有想象中那样美妙。它有着许多令我难以接受但也没有办法的事情,即使是我喜欢的网友之中,也不例外。

说不定在看这篇文章的你也会觉得“诶,这很正常啊“,然后觉得我的想法才是奇怪的。那你就有可能是上面所说的“我喜欢但拥有难以接受事情的网友”呢。不过别担心,我还是喜欢你的啦。

但问题是,这样的状况,出现得有些太频繁了。我害怕被大家讨厌,因为没有了网友,我的信息交流就少掉了几乎全部了。因此,我只好小心翼翼地在遇到难以接受的事情的时候,把自己的想法紧握在手中,只有在很少而且认为对方不会因为我提出意见就讨厌我的前提下,会让它从口中——不对——手指间传出。

我不想被大家讨厌,可是,今天我觉得我的承受能力已经快要见底了。所以我要这些事情,在这里一个一个地写出来。但是我还是不想被大家讨厌,所以在写完这些之后,还是会努力继续和大家交流下去的,也不指望能有什么改变。这些不是对谁的批评,只是我自己的抱怨罢了。


我觉得好多人都不珍惜网络上的友谊。在现实中,如果与朋友之间有不满,像比如对方有什么无关的事情老是叫我,觉得很烦,或者对方说话比较直接,批评不拐弯抹角。我接受不了了,这时候要怎么办?首先想到的,当然是跟那位提出这个问题啊。告诉对方自己觉得很烦,或者有些事情不想被批评。这是件很容易的事情吧?我觉得只要那位朋友是正常的人,在听到了这样的话之后,肯定会改善自己的做法的。这样,问题不是以双赢的方式解决了吗?

可是在网友之间,经常不是这样的状况。“绝交”这个字眼,应该是一个很严重的字眼了,我甚至在文学作品中都很少见到它。可是我悲哀的发现,它是许多网友处理矛盾的 首要 方式。网上不像现实,在一般的社交网络里,屏蔽一个人、断绝一切往来不过是按两下按钮那样简单的事情。而那实际上,就是绝交了。就因为一点小小的可以处理的矛盾,就抛弃了曾经一切的回忆,抛弃了所有和好的机会,这样的做法,太难以理解了。

而屏蔽,实际上比绝交还要残酷,绝交至少还有能有最后解释的机会,可屏蔽的话,那就是单方面、一刀斩、阻断全部解决方案了。

我看到其它的人之间发生这样的“绝交”,自己也同样害怕,不会自己那天也因为做了什么无意识的事情,就被屏蔽的?我害怕。也许可以说我不应该和这样的人做朋友,但是他们除了这一点以外,其它都是我所喜欢的朋友呀。如果因为这样程度的观念不符就“不和他做朋友”,那自己也就成为同样不珍惜友谊的人了。


同样是有关于屏蔽,另一件令我不解的事情,是许多人喜欢把自己在现实中认识的人,在网络上屏蔽掉。最奇怪的是,这样残酷的做法,甚至被当作一种政治正确被开着玩笑做到。这可是你现实中认识的人诶!如果只是对不想分享个人生活的长辈、同事之类的那还可以理解,但即使是朋友的话也这样做,那就太奇怪了啊。本来就是要分享个人生活的朋友,在网上却要互相屏蔽。而且还不是仅仅不互相搭理,是互相屏蔽!就是上一段所说的,比绝交还残酷的事情。

不过因为现实中还认识,所以实际上应该还没有绝交那样严重。但这样的做法被当作玩笑一样,以各种姿势哈哈笑着屏蔽掉各种人、还向其它网友互相笑嘻嘻地感叹“这才是正确做法”是怎么回事?夸张地说,这就像是两位杀人魔笑嘻嘻地说“哈哈,我今天杀掉了两个人,他们的表情真漂亮。”“呀嗬,不错嘛,我实际上前天杀了三个人,不过你干得漂亮。”

比喻可能夸张了几万倍不止了,但大体就是这样的感觉。这样的“正确做法”,我觉得难以接受,要是现实中有朋友在网上屏蔽我的话,我一定会觉得莫名其妙的。有好几次看到自己喜欢的网友有在这样做,我真的想冲进评论去,发出我的疑问,可是看到在评论里的所有人都是一片“和睦”的样子在说“哈哈哈,这才是正确做法”,我要是冲进去了,那我就又变成了不识趣的人了,会被讨厌吧。


我个人是觉得,政治话题这样的东西,在公开谈论不但不是禁忌,更是好事,它可以让更多思维的火花产生碰撞,说不定还可以让改善问题变得容易一些。但有些人不这么认为,许多人觉得政治这样的东西就要避免谈论,这样的想法也不奇怪——没有什么类型的话题能比政治更能让人恼羞成怒了。要是两个程序员之间在争论两个程序语言之间哪个更好,这争论很少是火力全开、互相破口大骂甚至人身攻击的。但要是两个政治观点相悖的人在吵,那就没边了,一前一后几句话,根本不忍直视。

恼羞成怒的人不会认真讨论,甚至有时候连骂都懒得了。于是便给对方批量地扣上各种帽子,像“屌圈”、“自由派”之类,原谅我没有搞清楚这两个词究竟代表的意思是什么。还有“川粉”和“白左”这样的分类,这我倒也许明白其中的一点意思,按照见到过的评判来看,我应该算是再典型不过的白左了,虽然没有被证实过。

以上都不是问题,人爱骂骂去吧,不关我事。但问题就在于,我喜欢的人中,有“屌圈”,有“自由派”,有“川粉”,有“白左”。除了遇到另一派的时候,他们都是很好的人。许多还有着许多的共通点——像是对猫咪的喜爱。可是,仅仅是因为政治观点上的不同,就让大家互相变成了仇人一般的存在。这样太可惜了。

夹在两个人中间,他们是互相屏蔽的,提到另一边就会“啊?”地提起眼角。这时候作为“胶水”,是要尽力粘住、让两人放下芥蒂才比较好呐。但事实上这样做,不但没有很大可能达到预期效果,还有可能自己也被两边仇视。那就鸡飞蛋打了。

能有什么办法呢?没有,我只能眼睁睁地看。


最后要从比较具体的一件事说起,羽毛的死。

是很沉重的话题,不过还是必须要讲。羽毛是一位药娘,就是原本是男性,后来认为自己应该生来是女性,决定吃激素变性的人。听起来可能不是那么令人轻松的描述,不过请相信我,药娘中有许多很棒的人。羽毛有一位关系非常好的另一位药娘,叫做 Neko ,但是因为整个社会对这个群体的歧视,还有和她的家人和各种各样的困难,自杀了。几个月后,肝肠寸断的羽毛也跟着自杀了,那就是前段时间的事情。

听起来很可怜,不是吗?但对于这位已经自杀之人,却有许多人向她的尸体投掷了更多的刀子。“不值得同情”,“这种人就是问题儿童”,“再转发羽毛死的消息我通通屏蔽”。这太荒唐了,尤其是其中有我曾经认为非常善良的人的时候。

不过荒唐的事情总有原因。公开发表了疑问的我,得到了这篇文章的一个链接,阅读之后,大概了解了几件事情:羽毛劝过别人自杀、羽毛在别人家制作过毒药。

不能否认,这是很严重的罪行,但是人家现在先是恋人死了,然后自己都死了,就是这样也不能有一点怜悯之心吗?没有怜悯之心也就算了,还要有憎恨之心,还不允许别人有怜悯之心,这就过分了。

不过我也不能乱说,因为我也不知道,羽毛是不是还犯过什么别的事情,什么让我听了之后也觉得该死的事情。但是我不知道啊,这种事情也没有人有客观的记录。所以我是不是也要悼念一下她呢?按照“再转发羽毛死的消息我通通屏蔽”这样的话来看,我不应该悼念,因为这样会被屏蔽,虽然被拥有这样心理的人屏蔽,是不是一件值得避免的事情还不好说。


几乎是通宵地完成了这篇文章,那么就告尾声吧。

最后,请不要把这篇文章的内容当作我其他人的意见或者建议,这文章只是我的抱怨。当然,你要是觉得你属于上述其中行列,然后觉得自己的做法值得改进的话,很感谢你能把我看那么重。不过,也请不要认为这篇文章包含了对任何人改变自己做法的希望。因为要是这样认为的话,我会被讨厌的,请不要讨厌我。

最后,爱大家 💕。


除特殊说明外,本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。转载时请注明来自 FiveYellowMice's Blog ,以及原文链接

虽然 RSS 是一种很好的新闻获取方式,但是不同的 RSS 阅读器所显示的内容可能会有很大差距,有些甚至无法显示所有内容。所以为了能够获取到完整的内容,最好还是点开网页链接看。
之所以还是保留了 RSS 的全文输出,是因为摘要输出会被很多人讨厌……

依云's avatar

XZ2C: 没有 root 的日子(也还过得去)

本文来自依云's Blog,转载请注明。

现在手机两三年不换新,日子就没法过了!所以我明知没有 root 还是买了 Sony Xperia XZ2 Compact(XZ2C),用于替换之前使用的 Z5C。

嗯,还是 Compact 版本。尤其是尝试在地铁上操作小米 Note 3,结果发现为了避免自己跌倒或者手机被摔地上,我不得不使用嘴唇来点击部分区域的时候,我决定绝不放弃能够安稳地握紧的 Compact 版本了。

啊,我知道有单手模式的!XZ2C 底部那三个虚拟键的位置,向左或右滑,就可以启动了,很方便!然而,最需要此功能的小米 Note 3,使用的是实体触摸按键,中间还是个凹下去的指纹识别,我很难成功启动单手模式。而且由于手机过大,这个动作操作的时候,手只能握住手机的下半部分,重心还是悬在外边,列车适时地颠一下说不定就会脱手而出了。

XZ2C 比 Z5C 重了很多,背面还是弧面的,手感意外地很棒呢。指纹识别在背部,拿在手里的时候倒是很好按,也不会有小米那握不稳的问题。不过你们懂的,放桌面上的时候,不拿起来就按不了。而且双击唤醒屏幕被禁用了(除非已抬起手机,屏幕已显示时间),密码解锁也并不方便。双击唤醒大概还是可以启用的吧,不过 Z5C 拿在手里走路的时候,屏幕经常被会意外点亮不说,还会一不小心就把锁屏时钟给换了样式。所以就不用啦。

这指纹解锁速度比起 Z5C 的侧面那个小的,快了非常多。而且可以配上很好看动画效果啊!就是 Sony 宣传片里的那种,不过它竟然不仅仅是在主屏幕上呈现,在任何应用打开的时候也能出现呢。

哦还有,XZ2C 充电、看视频时都不会像 Z5C 那样烫了~

系统是 Android 8 Oreo。最棒的莫过于通知管理了!之前我一直希望某些不重要的通知出现,但是不要发出声音(比如微信的「加好友」通知),但是只能寄希望于应用本身提供这种设置。现在不用啦,系统通知管理可以直接设置了。而且应用还可以给通知分门别类,然后用户按需要给不同类别的通知不同的设置(比如 Telegram 就能精确到会话)。在通知出现的时候,长按选择「所有类别」打开设置的时候,对应的类别也会闪动一下,不用用户去猜这是哪个类别的通知。

其次是应用图标的长按功能,可以查应用信息,可以访问应用提供的快捷入口,也可以把这些入口添加到主屏幕,或者添加该应用的小部件。而且应用信息里可以直接打开 Google Play 了!我之前都只好去搜索应用名的。在 YouTube 上看到有人直接把应用图标拖到一个控件上就能打开商店,然而我并不知道那是什么应用。

还有很重要的一点是:运行很流畅!不只是我以前新手机刚到手的那种流畅,而且装个应用一两秒、开机启动完了我还没反应过来,超出了预期好多!当然并不是说开机刷一下子就完了,而是我没想到 Android 的开机能有这么快。

啊,最后进入正题:没有 root,只能找替代了。

首先是权限管理。Android O 的权限管理已经强大了不少,而且我已经把大部分国内应用转移到小米上了,所以还好吧。

时间显示秒。这个功能,在「系统界面调谐器」里已经有选项了。长按下拉通知出现的齿轮图标,直接它转动起来,然后就可以在「设置」里看到「系统界面调谐器」了。

互联网访问。放弃修补好的 fqrouter,发现现在的主流软件其实也挺不错的。只是偶尔需要手动切换节点了。另外就是 SSRR 这个东西,连接上的时候如果切换节点,有大概率导致网络故障(DNS 解析异常等)。需要重启手机才可解决。

绿色守护。被黑阈取代了。但我发现其实需要黑阈掉的应用也不多。我目前添加到黑阈名单里的有微信、彩云天气、企业微信、Inoreader、形色、高德地图等,基本上都是国产应用。微信一大堆服务在后台跑着,虽然支持 FCM(GCM 升级版),被黑阈干掉之后会收不到新消息(而 Telegram 和 Twitter 什么的好像都能)。

Wi-Fi adb。这个其实开机后接 USB 线,adb tcpip 5555 一下,就可以一直通过网络连接了。黑阈等需要通过 adb 执行命令的应用,也可以自行调用。

「去你大爷的内置浏览器」。现在火狐支持 Custom Tabs 了呢,所以大部分应用都能够调用火狐了。虽然 Custom Tabs 里是不加载扩展的,不过再选择在火狐中打开就可以了,大部分内容都缓存了,再加载一遍也是挺快的。Inoreader 有「webview」、「chrome tab」和「外置浏览器」三种方案,其中「chrome tab」其实就是「Custome Tabs」。Google 自家的大部分应用也会使用「Custom Tabs」,除了「Google 搜索」仍然坚持调用 Chrome,不过它可以设置为在外置浏览器中打开。「新闻与天气」也需要设置为在外置浏览器中打开,不然因为没加载扩展,会有大量广告辣眼睛的。微信当然是无解的,只能在需要时浪费些流量和时间手动选择在浏览器里再开一次了。

五笔输入法。这个之所以和 root 权限有关,是因为之前我都是拿 XPrivacy 禁用输入法的联网能力,所以什么百度啊触宝啊,我都能接受。现在没法断它网了,我自然是不会再用不开源又非系统自带的输入法了,尤其是触宝这种,一联网立马弹出好几个广告的。一开始找到叫「五笔输入法」的试验品。功能很简洁,但不愧是试验品,不能输入中文标点也就算了,一次输入英文还不能超过四个字母……然后想起 trime——rime 在 Android 平台上的版本。使用感受是:我从未经历过如此简单的码表导入!把我的 fcitx 码表导出,然后一行命令调整一下格式就可以了!然后把码表和五笔输入方案推到内部存储设备上,「部署」一下,我终于可以在手机上使用我自己的码表了!

ssh、备份和调试。这个没办法。通过 termux 能很方便地启动个 sshd,但是权限很有限,比如只能只读访问外置 SD 卡。所以我通过 adb 起了一个 dropbear 来同步这些内容。系统分区没办法访问,只能依靠 Google 和 Sony 的在线备份功能了。

啊对了,Sony 的「Xperia 换机助手」真是垃圾啊。首先,很多应用不能带数据迁移。其次,我这里一次传输只能传一项内容!不然就会出现连接错误。好不容易在论坛上找到的方案,一次只传少量数据,所以短信和通讯录什么的都可以过来,小一些的应用也能过来。大的应用就没办法了。

还有些小功能。通话振动。这也是个 Xposed 模块,就是电话接通的时候振动一下。属于锦上添花的功能,没了就没了吧……还有 Xposed Torch 也是。不能长按音量键开手电筒,那就划开通知点按钮好了。微X模块,很好用,但也不是非要不可。

整理下来,因为没有 root 而失去的功能并不是很多,最严重的是没有完整、增量的备份了。其它的,相对于运行流畅所带来的体验提升,其实并没有那么重要。这次我真的是换了手机才知道旧手机已经全面卡顿了……

Phoenix Nemo's avatar

Office Service Router 解决方案:Arch Linux in RAM

一直把自己在办公室的 PC 保持开机用于连回办公区、存取数据工作需求。由于最近办公室所在的写字楼要全馆断电检点,所以诞生了构建一个 Service Router 的想法。

思路

运行在内存里对于 Linux 系统来说是完全可能(而且简单)的事情。

最直接的想法就是使用内核 hook 在启动时复制根分区到内存盘然后挂载内存里的数据作为根分区即可。

设备的话,设置 Power on AC 即可通电自启动。

ramroot

作为一只懒卷,这种简单的事情当然先顺手搜索下啦。然后就发现了几乎完美的解决方案——ramroot

ramroot 通过加入内核 hook 然后自动在内存建立 zram 分区,同步根分区数据再启动。还可以在启动时选择是否启动进内存,正好解决了所有的需求。

实现

硬件选择是一台便宜的 Intel NUC,安装两根 4GB LPDDR3 低压内存和一块 120G 2.5 SSD。虽然说起来其实并不需要 SSD(因为数据全部都在内存里,速度比 SSD 更快)但是毕竟日本多震,还是为数据安全着想。毕竟硬盘坏了的话内存系统也无法启动了。

当然如果有集成 32GB eMMC 的小型 PC 的话也是好的选择。

正常安装完 Arch Linux 系统,安装 openssh 和各种必要的服务程序,修改配置文件,然后安装 ramroot 并执行

1
# ramroot enable

此时先别急着重启,先把不需要的包、缓存等文件(/var/cache)删除,保持最小化的根分区。然后再重启。便可看到加载内核 hook 时的提示是否进入内存系统,默认超时后就会自动复制根分区到内存啦。

由于整个系统是运行在内存中的,所以完全没有等待读盘的时间。整个系统的响应速度非常快。限制是内存不够大的话运行一些业务会比较捉襟见肘,而且这样低功耗、低发热的 SoC 处理性能也只能运行一些轻型任务。

下面是一些 IO 性能测试

1
2
3
4
5
6
7
8
9
10
11
12
# ioping -s 1G /
1 GiB <<< . (ext4 /dev/zram0): request=1 time=1.04 s (warmup)
1 GiB <<< . (ext4 /dev/zram0): request=2 time=1.04 s
1 GiB <<< . (ext4 /dev/zram0): request=3 time=1.04 s
1 GiB <<< . (ext4 /dev/zram0): request=4 time=1.04 s
1 GiB <<< . (ext4 /dev/zram0): request=5 time=1.04 s
1 GiB <<< . (ext4 /dev/zram0): request=6 time=1.04 s ^C

--- / (ext4 /dev/zram0) ioping statistics ---
5 requests completed in 5.18 s, 5 GiB read, 0 iops, 988.4 MiB/s
generated 6 requests in 7.20 s, 6 GiB, 0 iops, 853.8 MiB/s
min/avg/max/mdev = 1.04 s / 1.04 s / 1.04 s / 550.7 us
1
2
3
4
5
6
# ioping -RD /

--- / (ext4 /dev/zram0) ioping statistics ---
530.0 k requests completed in 2.49 s, 2.02 GiB read, 212.9 k iops, 831.7 MiB/s
generated 530.0 k requests in 3.00 s, 2.02 GiB, 176.7 k iops, 690.1 MiB/s
min/avg/max/mdev = 3.44 us / 4.70 us / 69.0 us / 1.39 us

可以看到系统根分区在 zram 里,经过压缩因此 IO 带宽受到了 CPU 处理性能的限制。但是 IOPS 依然高得爆表,对比一下 Intel Optane 900P 的 IOPS 性能:

1
2
3
4
# ioping -RD /
--- / (ext4 /dev/nvme0n1p1) ioping statistics ---
163.1 k requests completed in 3.00 s, 56.5 k iops, 220.8 MiB/s
min/avg/max/mdev = 11 us / 17 us / 114 us / 4 us

炒鸡厉害对不对!

不过需要做永久性修改的话还是要下面的方法之一

  • 重新挂载磁盘(虽然并不麻烦)然后手动修改配置文件
  • 重新挂载磁盘然后 rsync zram 到磁盘(方便但是可能会多一些不必要的东西)
  • 重启进入磁盘系统然后运行修改(需要物理接触)

硬件设置

进入系统 BIOS 设置,开启 Power on AC 或设置 Power Failure 后的操作,选择为 Power On (默认一般是 Last State)。

关闭系统、拔出电源,或意外断电后,再接入电源即可自动开机引导系统。因为数据本身就只在内存中,除了运行中的临时更改会丢失,系统和硬盘本体都是安然无恙的。

再也不担心办公室断电检查啦。

大概就是这样。

Phoenix Nemo's avatar

通过 SSH 修正安装有 GPU 的 HPE Proliant 服务器

由于越来越多的渲染、压制等需求,托供货商的关系搞来一台带有独立显卡的 HPE 服务器。经过几番折腾(包括特别奇怪的 LS26-C14 电源线)麻烦了帮忙托管的数据中心的大兄弟好几回,终于算是上架可以开机了。

登入 iLO,安装许可证,启动 iLO Remote Console,打开电源,一切都很顺利。但是 Console 里显示 Early Initialization… 完成后,突然画面一黑,完全没了动静。

以为 iLO 出了 bug,冷重启好几次都是一样的结果。百思不得其解。

再重启一次。仔细观察了一番发现虽然没了画面,但是 POST Code 还是不断变化的,而且 Virtual Media 指示灯不断在闪烁,说明系统仍在正常运行,只是没有视频输出而已。

因此问题定位在视频输出而非系统硬件。既然这台服务器装了显卡,那么很可能是 PCI-e 初始化后视频输出全部交给显卡处理了。搜索了一下 HPE Community,确实有这样的情况存在。解决方案是通过 BIOS 修改显卡设置为默认集成显卡、备选独立显卡。

尝试在设备初始化阶段进入 BIOS,失败。

联系数据中心远程操作的话,可能要等一段时间。

纠结时随便点开 iLO 的管理页面,突然发现了华点:这货居然支持 SSH。

对啦,HPE 的底层系统几乎都是魔改版 Linux,连他们的 SmartArray 都是 Linux 启动一个 Firefox 浏览器来操作的(X

于是正好在网上搜到一篇通过 SSH 修改 BIOS 视频设置的方法。记录如下。

SSH 进入 iLO

确保 SSH 在 iLO 管理页面中已开启,然后使用 SSH 客户端正常连接:

1
ssh Administrator@10.6.254.121

(ssh 用户名是 Administrator 感觉各种违和)

连接到 Virtual Serial Port

命令很简单:vsp

在 iLO 管理页面重启系统,然后等待初始化完成。如果看到按下 F9 进入 BIOS 设置的提示,不要按下它否则会进入 GUI 模式(于是又去独立显卡了就。

看到 ESC + 9 进入 BIOS Setup Utility 时按下键组合,稍等一会儿应该就可以看到提示符 rbsu>

修改视频设置

命令 SHOW CONFIG VIDEO OPTIONS

显示如下

1
2
3
1|Optional Video Primary, Embedded Video Disabled <=
2|Optional Video Primary, Embedded Video Secondary
3|Embedded Video Primary, Optional Video Secondary

即默认关闭了集成显卡,只用独立显卡(不觉得很蠢吗!

于是修改为第三项,默认使用集成显卡,独立显卡作为备用。

1
SET CONFIG VIDEO OPTIONS 3
1
2
3
1|Optional Video Primary, Embedded Video Disabled
2|Optional Video Primary, Embedded Video Secondary
3|Embedded Video Primary, Optional Video Secondary <=

然后敲 EXIT 退出并重启系统。

安装系统和驱动

至此即可通过 iLO Advanced Console 正常安装操作系统。不过需要注意的是进入操作系统后即便安装了对应的显卡驱动,依然默认使用的是集成显卡。以及 RDP 只能使用软解,无法使用独立显卡加速视频输出。这不影响 Blender 或者 Cinema 4D 等直接操作显卡进行计算的程序,但是会影响直接输出视频到桌面的程序。通过 Teamviewer 则可以强制桌面运行在独立显卡上。

顺便吐槽:Blender 把我的工程材质弄丢了…

cunky's avatar

使用Rclone在各系统挂载网盘

Rclone是啥玩意儿?Rclone是一款命令行工具,支持在不同对象储存、网盘之间上传、下载以及同步数据Rclone官网:https://rclone.orgGitHub项目:https://g...
IceHoney Blog's avatar

伪随机的种子问题

最近前端的工作不是很多,所以就帮忙写写后端的ruby on rails。在写测试用例的时候,虽然单元测试的数据每次都是随机生成的,但是我们需要根据单元测试来生成API文档。如果测试文档每次都是随机的数据会很难检查每次API更新了什么,所以我们需要在生产测试文档的时候,保证随机数据的稳定性。

Random seed

seed的意义就在于,初始化了随机数生成器。保证了每次随机的结果都一样。例如代码:

@rand = Random.new(1234)

puts @rand.rand

puts @rand.rand(0..1050)

puts @rand.rand(0..1050)

puts @rand.rand

这段代码每次执行都会输出:

0.1915194503788923
674
699
0.2725926052826416

rand range

但是当我们把中间的rand的范围稍微修改:

@rand = Random.new(1234)

puts @rand.rand

puts @rand.rand(10..150)

puts @rand.rand(10..150)

puts @rand.rand

会发现输出发生了变化:

0.1915194503788923
48
63
0.4377277390071145

第一次的输出还是不变,当然2,3两次肯定是变化的,重点是最后一次。我们发现最后一次的随机数也发生了变化。

总结

通过调查ruby源码发现,对于有范围的rand。ruby会不断生成随机数,判断是否落在区间范围内,如果是在范围内就返回,否则继续尝试。默认在0到1之间是百分百命中,所以是随机一次。如果是其他范围,命中次数不一样会导致生成随机数的次数发生变化。所以影响到之后的随机数生成。

参考:

ruby

Random

cunky's avatar

网站重新搬迁了!

这一次算是服务器最后一次更改域名了(笑
嘛 至少以后五到十年不会再修改了
希望大家可以来支持我的博客 谢谢Thanks♪(・ω・)ノ
(至于更新?什么时候有时间了我就会来更新一些有趣的文章

笔记最后更新时间 2018-08-01 16:43

17windy's avatar

[美羽释厄录]开发进度

本地化 –> 玩家设定 –> 普通怪物设定  –> 小BOSS设定  –> 背包系统 –> 武器系统全家福 –> 经济系统设定 –> 对象池系统 –> 美术资源P1 –> 数据存储读取 –> 第一轮内部测试 –> 开箱系统 –> 商店系统 –> 物品几率掉落 –> 场景整合 –> 三大BOSS –> 美术资源P2 –> 各项菜单设定 –> 音乐音效整合 –> 打包发布

商店场景开箱测试B站 https://www.bilibili.com/video/av30563058/

由于Unity升级后和Bolt又出现了兼容问题,导致无法Build成功(Build的文件闪退),所以先在编辑器里录个屏,编辑器里卡卡的。

关卡战斗演示B站 https://www.bilibili.com/video/av32485793/

(使用初始武器战斗,难度中等。)

开发DLC:

1,解决了无法Build的问题 09-04

2,改进部分弹幕性能表现 09-04

3,游戏执行性能进一步优化 09-15

4,解决了一个导致掉落卡顿影响游戏体验的问题 9-30

更新日期:09-30-2018

Phoenix Nemo's avatar

NetFLOW / sFLOW 流量报告:FastNetMon + InfluxDB + Grafana

最近稍微有点时间折腾了下 Cisco 的三层交换,尝试搭建了一套数据中心用的流量统计/监控/报告系统。过程不是很复杂,但是也只算利用了一套高级软件组合的一点点功能。之后打算继续研究更多的功能实现,不过也要看有没有时间了…

准备工作

首先确认出口路由设备支持 netflow/sflow 的对应版本。一般 Cisco 的路由器或者三层交换都是支持的。

然后准备一个常见的 Linux 系统,虚拟机或者物理机都可以。

出口路由设备能够连通到该 Linux 系统,并且 flow collector 设置到该 Linux 系统的 IP 地址和对应端口。

FastNetMon

安装 fastnetmon,只需要一条简单的脚本命令。

然后将所有要监控的网段加入 /etc/networks_list。一行一个,例如:

1
2
3
10.1.0.0/16
192.168.254.0/24
8.8.0.0/16

按照安装文档打开两个终端,分别启动主进程和客户端

1
/opt/fastnetmon/fastnetmon
1
/opt/fastnetmon/fastnetmon_client

如果没有问题,应该在客户端上可以看到收到的 flow 数据。

先关闭 fastnetmon 进程,修改配置文件打开 Graphite 支持:

1
2
3
4
graphite = on
graphite_host = 127.0.0.1
graphite_port = 2003
graphite_prefix = fastnetmon

=== 2018-07-26 更新 ===

如果有比较新的发行版(内核 >= 3.6)可以开启 AF_PACKET,安装并启动 irqbalance 来获得更好的抓包性能。

InfluxDB

安装 InfluxDB,官方提供了各种包管理器的安装方式。

配置文件一般位于 /etc/influxdb/influxdb.conf,需要根据环境做安全相关设置(侦听地址、端口、鉴权、etc)并打开 Graphite Simulation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[[graphite]]
enabled = true
bind-address = "127.0.0.1:2003"
database = "flow_dc1"
protocol = "tcp"
consistency-level = "one"
name-separator = "."

# batch-size / batch-timeout requires InfluxDB >= 0.9.3
batch-size = 5000 # will flush if this many points get buffered
batch-timeout = "1s" # will flush at least this often even if we haven't hit buffer limit

templates = [
"fastnetmon.hosts.* app.measurement.cidr.direction.function.resource",
"fastnetmon.networks.* app.measurement.cidr.direction.resource",
"fastnetmon.total.* app.measurement.direction.resource"
]

顺序重启 InfluxDB 和 fastnetmon。检查 flow 数据是否记录到 InfluxDB:

1
2
3
4
5
6
7
8
9
10
11
$ influx
Connected to http://localhost:8086 version 1.2.4
InfluxDB shell version: 1.2.4
> use flow_dc1
Using database flow_dc1
> select mean(value) from networks where direction = 'incoming' and resource = 'bps' group by *
name: networks
tags: app=fastnetmon, cidr=10_1_0_0_24, direction=incoming, resource=bps
time mean
---- ----
0 4735.049632696411

Grafana

Grafana 是一款非常强大且易用的数据可视化工具。安装 Grafana 然后修改配置文件的必要部分,配置文件一般位于 /etc/grafana/grafana.ini

完成后重启 Grafana,将浏览器指向 Grafana 的 HTTP 服务器地址即可看到登录界面。如果内部使用的话,建议关闭匿名访问和注册功能。

使用默认的 admin / admin 登录,按照引导完成配置、添加数据源(Data source),数据源即是 InfluxDB 的 HTTP API 地址。如果 Grafana 中限制了数据源白名单,需要将 InfluxDB 的 HTTP API 地址和端口加到白名单里。

添加面板、Graph,在 Graph 编辑模式里写入类似这样的查询语句:

1
SELECT mean("value") FROM "networks" WHERE "direction" = 'incoming' AND "resource" = 'bps' AND "cidr" =~ /^10_1_0_0_16/ AND $timeFilter GROUP BY time($interval) fill(previous)

即可看到有图表出现。根据需求完善查询语句和图表配置即可简单实现各种可视化效果。例如流量和数据包的实时报告:

总结

通过配合 FastNetMon,InfluxDB 和 Grafana 即可快速实现一套基于 NetFLOW / sFLOW 的流量统计报告系统。但是 FastNetMon 的功能远不止流量统计,Grafana 也有大量插件和灵活的用法可以满足更多需求。如果配置合理,此方案也可适用于 40Gbps+ 接入的中型数据中心且成本低廉。以及——

  1. InfluxDB 真的很快!
  2. Grafana 的图表真的很省资源!
  3. Chronograph 卡死了我的浏览器!(i7-7700K / Chrome)

以及一大早手工修好了 K812 的耳机线,省掉了 2 万日元的线材费用非常开心

依云's avatar

使用 iptables 透明代理 TCP 与 UDP

本文来自依云's Blog,转载请注明。

很早之前,我在《Linux「真」全局 HTTP 代理方案》中介绍了 redsocks 方案。不过它只处理了 TCP,并没有处理 UDP,DNS 也是采用强制 TCP 的方式来处理的,再加上它本身还要将请求转发到真正的代理客户端,延迟比较高。然后,还可以结合 Wi-Fi 分享 或者网络命令空间,玩点更有趣的。

首先要有支持的代理客户端,比如 ss-redir。这个就不用多介绍了,配置好、跑起来即可。以下假设此代理跑在 127.0.0.1 的 $PPROT 端口上。

然后,TCP 的代理设置。使用的是和 redoscks 一样的方案。这个比较简单,除了有一点需要注意:DNAT 到 127.0.0.1 时,需要设置内核选项net.ipv4.conf.all.route_localnet=1

最麻烦的是 UDP 的代理,使用的是 TPROXY。首先,需要把要走代理的数据包路由到本地。以下假设我们给要代理的数据包打上标签 1。那么执行:

ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

那个 100 是路由表的编号,可以自己选一个喜欢的。

然后,对于转发流量(来自局域网或者另外的网络命名空间),直接把需要代理的数据包扔给 TPROXY 目标,并且打上对应的标签即可。而对于本地产生的流量,不仅要带有对应的标签,而且需要在 OUTPUT 链打上一个(与之前不同的)标签,触发 reroute check 才行。

最后,对需要代理的数据包设置 iptables 规则:

协议 来源 目标
TCP 本地 nat OUTPUT -j REDIRECT --to-ports $PPROT
转发 PREROUTING -j DNAT --to-destination 127.0.0.1:$PPROT
UDP 本地 mangle OUTPUT
PREROUTING
-j MARK --set-mark 1
-j TPROXY --on-port $PPROT --on-ip 127.0.0.1
转发 PREROUTING -j TPROXY --on-port $PPROT --on-ip 127.0.0.1 --tproxy-mark 1/1

比如来自网络命名空间或者局域网的 IP 段 192.168.57.0/24 全部走代理:

iptables -t nat -A PREROUTING -p tcp -s 192.168.57.0/24 ! -d 192.168.57.0/24 -j DNAT --to-destination 127.0.0.1:$PPROT
iptables -t mangle -A PREROUTING -p udp -s 192.168.57.0/24 ! -d 192.168.57.0/24 -j TPROXY --on-port $PPROT --on-ip 127.0.0.1 --tproxy-mark 1/1
imi415's avatar

Arch Linux的蓝牙音频sink媒体控制配置

标题有点长……
ArchWiki里介绍了如何使用PC作为蓝牙音频Sink,将手机等设备的Bluetooth音频经由系统回放设备输出,本文章介绍如何将设备输出的媒体信息通过MPRIS兼容控制插件读取并控制。

TL;DR:

随便找个地方运行

mpris-proxy

Log

下面的部分介绍如何找到这个Bluez内置功能的

根据Ask Ubuntu等地的回复,Bluez从5.0起支持设备媒体信息发送到D-Bus,从位于 org.bluez/hciN/dev_YOUR_DEVICE_BT_MAC_ADDRESS/org.bluez.MediaControlN 的属性中即可读取音频信息,相同节点的方法即可控制设备播放状态(如下图)

这马赛克打得完全没意义,算了
然后就想到,能不能把这一部分和D-Bus的MPRIS消息对接,实现系统MPRIS控制设备播放状态。
搜索了一圈发现没有人做这一部分,还有点小兴奋,有坑?开!
然而,随便换了几个关键字,突然发现manpage里有一条名叫mpris-proxy的页面,打开一看居然是属于bluez本身的东西……看了看居然完全满足需求,一时间心情复杂……
所以……

"Comment and Close"

此坑已死。

mpris-proxy工具说明:

imi415@imi415 ~ % mpris-proxy -h
Usage:
  mpris-proxy [OPTION?]

Help Options:
  -h, --help        Show help options

Application Options:
  -v, --version     Show version information and exit
  -e, --export      Export remote players

imi415@imi415 ~ % 
依云's avatar

Linux 下获取文件的创建时间

本文来自依云's Blog,转载请注明。

其实 Linux 是支持文件的创建时间的呢。不过不是所有文件系统都支持,比如 ext4、xfs、btrfs 都支持,zfs、vfat、ntfs 不支持。

但是呢,用户基本上是看不到的。文件系统有记录,但是没有 API 可以获取到这个数据。所以你用 stat 命令的话,会看到「创建时间」一行总是「-」。用 debugfs 搞 ext4 是可以的,但是那个需要 root 权限,并且一不小心会搞坏文件系统。

最近,我阅读内核源码时,忽然发现内核已经通过 4.11 版本引入的 statx 系统调用支持获取创建时间了。字段名里用的是 btime(birth time),没有用 crtime(creation time),也没有用大写的 Btime 呢。

但是 glibc 并没有支持,所以要用 syscall 函数来调用。也不是很复杂。不过我正着手用 Rust 实现的时候,却在内核源码树里找到了 samples/statx/test-statx.c 这么个文件。原来有现成的啊!

gcc 编译一下,还真好用:

>>> statx /
statx(/) = 0
results=fff
  Size: 224             Blocks: 0          IO Block: 4096    directory
Device: fe:01           Inode: 96          Links: 17
Access: (0755/drwxr-xr-x)  Uid:     0   Gid:     0
Access: 2018-07-11 13:33:08.659477830+0800
Modify: 2018-03-30 15:06:02.645864827+0800
Change: 2018-03-30 15:06:02.645864827+0800
 Birth: 2017-06-19 21:07:53.653467000+0800
IceHoney Blog's avatar

Web离线的解决方案

最近的工作是做嵌入在IOS程序内部的页面,其中有一个需求就是需要满足在离线的情况下显示页面。当然,现在主流的离线方式是使用Service Worker来完成离线需求。 但是IOS内置的WKWebView并不支持最新的Service Worker(取决于IOS版本)最新版本已经支持,所以不得不想办法来解决。

Application Cache

AppCache是一个过时的技术,但是在IOS下勉强还能用。不过Chrome对这种过时的技术支持不是很好,单个缓存文件最大只支持5MB。而且还有请求的BUG:Accept header on GET request for appcache manifest。触发AppCache是在html标签中添加manifest属性。


  ...

通过manifest.appcache文件来定义需要缓存的文件,不过载入manifest.appcache的页面会被作为Master entries缓存起来。因为AppCache出现的时候还是以静态网站为主,所以并不能缓存请求的Ajax数据。我们需要自己再手动实现缓存所有请求在localStorage,但是localStorage同样也有最大5MB的限制。所以也需要考虑相应的解决方案。不过,我最终采取的方式是通过嵌入iframe来实现触发AppCache,这样做的好处是因为SPA应用是自己来控制路由的,所以导致每个路径都会保存一份Master entries。但是通过iframe的话,我们的Master entries永远只有一份。并且当前页面的所有资源也被顺利缓存,因为SPA无论访问哪个路径返回的都是相同的index.html。由JS来控制路由并加载相应的组件。

这里要补充的一点是,针对https的Application Cache是无法完成跨域请求的,所以请慎重。

WorkBox

Service Worker是现在主流的缓存技术,会帮你缓存所有的静态文件和数据请求。但是对于SPA项目,我们不可能自己手动书写缓存清单。所以还是借助现有的开源解决方案,这里最出名的解决方案是谷歌的Workbox。通过使用Webpack插件和简单的配置,我们便可以做到缓存所有的静态资源和数据。Service Worker有很多种缓存策略可以选择,例如Cache First和NetWork First。但是AppCache每次都会优先使用缓存,然后再去更新最新的文件。所以我们不得不在发生更新的时候去重新加载页面。

总结

最终的解决方案是优先使用Service Worker,当不支持Service Worker的时候再回退到AppCache。但是想要从AppCache升级到Service Worker的时候,必须清除所有AppCache的所有数据。浏览器并没有提供相应的接口,我们目前采用的方式是手动删除AppCache储存的数据库来完成这一需求。

参考:

Using the application cache

HTML5 Offline Application Cache

Application Cache plugin for Webpack

Workbox webpack Plugins

Appcache Facts

HY's avatar

Dark Souls II

魂2基本上玩的快通关了。 虽然魂2的确有不少亮点之处,但是也是知道了为什么魂2被骂得这么惨的原因。魂2整体作为 […]
's avatar

梦日记 01

#1

阳光透过五楼的窗户毫无遮拦地洒进教室。怠惰的蝉鸣,时不时夹杂在下课的吵闹声中。

教室里,有的同学摇晃着椅子和他人交谈;有一些在一张桌子旁围成一圈,看不到在做什么。有的人靠在窗边,朝着运动场的方向眺望,似乎在寻找什么。

看着黑板上的粉笔字,他感到一阵目眩。

这时,一个同学注意到了他,向他打了声招呼。他呆住了,没有反应。他不认识这位同学。

而且他满脑子里只有一件事。

20年之后,他又回到他以前就读的这座高中了。

#2

她放学后会去练弓。

但他不会射箭,辅助新手练习的射箭俱乐部的同学也不在。不过他不关心。他只对她感兴趣,所以他就跪坐在一旁看着。

他知道这所学校其实没有射箭俱乐部,也知道这个国家的人不会像他这样坐。他没想那么多。

当夕阳将要消失在远处教学楼的阴影中的时候,她开始收拾东西准备离开。

她没有向他搭话。她几乎不向任何人搭话。

他犹豫着是否要追上那提着包消失在门后的背影。

但他没有站起来。他的腿有点麻了。

#3.A

他的奶奶对他说过,爱一个人,就应该保护她的尊严。

他的奶奶也可能没对他说过这句话。她住在几百公里外的乡下,葡萄藤长得繁盛的地方。他几个月才会和她见一次面。

他暗自下定决心,如果这句话不是他奶奶说的,那他就自封为名言家。

名言家就是说名言的专家。比如说奥斯卡・王尔德,就是过去一位有名的名言家。

人总是在自己方便的时候想出一些名言,来作为自己的行动的理由。

想着这样的名言,他忍着发麻的腿,向着两位弓箭部的成员,一瘸一拐地走去。

向着背地里嘲笑她的两人走去。

#4

起因往往会是一些微不足道的事情。

望着街道另一头渐渐下沉的太阳,他走在放学后的路上。

沿街没有买小吃的小摊,到深夜才能看到这些推着小车的摊贩的身影。

他忍着饥饿,想着晚饭吃什么。

“嘿。”

他定住了。他认得几米之外,向他招手的这个人。

这个人和他穿着同样的校服,但在太阳光的对比下,显得有些暗。

20年前,记不清为什么了,他和这个同班同学的关系不太好。说是不太好,但连讨厌也算不上,就只是单纯的平行线,没有一点交集。

高中毕业之后,两人也分道扬镳了。

你,也回来了吗?

他嘴唇动了动,又随着口水一起,将这句话咽了回去。因为看着他的这个人的笑脸上,带着一抹感伤。

#3.B

他紧紧抱住了面前的她。

“我喜欢你!”他喊道。

他没有说下一句话。

在他怀里的她没有回过头来,也没有说话。

在他的眼前,一切都慢慢融解在金色的光芒中。

写在最后

我总有一些后悔的事。

不过有一些人,他们无忧无虑、达观岸然,他们对过去,对自己无怨无悔。

所以这里还是把人给划掉,改说我总有一些后悔的事好了。

回头看自己这些年,总感觉有一些后悔,有一些不甘:有的事情,自己本可以做得更好;如果那时候能那样,那说不定现在也不会这样了。

但即使这样感慨,也不会有任何改变。

无论是多么美好的梦,都有醒来的时候。

而新一天的太阳,照常会升起。

写在最后的后面

说好写 Apeiria 的感想的,结果鸽了5个月。这次可能要鸽到红瞳的后面了。

's avatar

100% 橙汁修改器更新 (3.1.271)

更新 3.1.271

游戏发布了新版本(v1.27.1),修改器进行了相应的维护性更新。

没有新增功能,仅修复了游戏版本更新带来的兼容性问题。

100% Orange Juice 修改器

依云's avatar

递归遍历目录:Python vs Go vs Rust

本文来自依云's Blog,转载请注明。

群友提出了一个简单的任务:递归遍历一个很大的目录,根据文件名数一下有多少 JPEG 文件。怎么最快呢?然后他用了 Go 语言实现。

我忽略想起 Python 3.5 的 What's New 里提到,他们优化了 os.scandir 使得目录遍历快了好几倍(PEP 471)。其核心思想是:不进行不必要的 stat 系统调用,因为读目录获得了不少信息,原来都是丢弃掉了,现在改成了通过 DirEntry 对象来返回。这些信息包括文件名等,刚好有我们需要的。

于是 Go 做了这个优化没有呢?

翻了一下代码。Go 自带的实现位于 src/path/filepath/path.go 文件中。可以看到,它对每一个文件都 lstat 了。后来一阁指出,不仅如此,而且它还莫名其妙地对目录下的文件名进行了排序

呃,前者可以说是疏忽了,毕竟 Python 也是直到 3.5 才优化的。可是,它排那个序干嘛呢……

然后我又想到,Rust 那边如何呢?

结果是,Rust 对它所包含的东西非常审慎,标准库里并没有递归遍历目录的函数。那我们自己写一个?才不呢,用第三方库啦!可以看到,它也是返回 DirEntry 对象的。

后来了解到,Go 也有一个第三方的实现 godirwalk,对这些细节进行了优化。

光是了解实现不够。我们让它们来比试一下吧。顺便,把 find 和 fd 也拖进来好了。

任务:数一数一个拥有近万文件的目录下有多少 JPEG 文件。

实现代码:walkdir-test

结果:

   Rust: top:    4.78, min:    4.72, avg:    4.90, max:    5.46, mdev:    0.17, cnt:  20
 Go_3rd: top:    7.71, min:    7.64, avg:    7.79, max:    8.41, mdev:    0.16, cnt:  20
   find: top:   11.49, min:   11.32, avg:   11.76, max:   14.18, mdev:    0.59, cnt:  20
     fd: top:   18.17, min:   15.18, avg:   21.29, max:   29.94, mdev:    3.84, cnt:  20
     Go: top:   21.08, min:   20.91, avg:   21.28, max:   22.70, mdev:    0.37, cnt:  20
 Python: top:   29.66, min:   29.51, avg:   30.43, max:   35.84, mdev:    1.45, cnt:  20
Python2: top:   30.37, min:   30.10, avg:   30.85, max:   33.15, mdev:    0.75, cnt:  20

Rust 如预期一样是最快的。Go_3rd 就是那个第三方库的实现,也非常快的。fd 是 Rust 实现的,目标之一是快,但是这次并没有比老牌的 find 快。Go 自带的那个实现,十分令人遗憾地连 find 都没比过呢,不过还是比 Python 快了不少。Python 2 这次终于没有跑在 Python 3 前边了(虽然差距很小),我猜是 PEP 471 那个优化的功劳。

对了,还有代码行数:

  15 Python/walk
  29 Rust/src/main.rs
  30 Go/walk.go
  33 Go_3rd/walk.go

Rust 竟然不是最长的。不过确实是字符数最多的。

话说 Go 的 } 竟然也是有规定的,结构体的不能另起一行写,只能跟 Lisp 的风格那样堆在一行的尾巴里。

PS: 没想到之前给 swapview 写的 benchmark 程序在另外的项目里用上了呢,果然写东西还是通用些的好。


更新:在群友的提示下,我找了一个更大的目录来测试,结果很不一样呢。这次遍历的目录是 /usr,共有 320397 个文件。

     fd: top:  265.80, min:  259.84, avg:  273.89, max:  319.76, mdev:   15.03, cnt:  20
   Rust: top:  269.98, min:  266.86, avg:  272.82, max:  282.84, mdev:    4.17, cnt:  20
 Go_3rd: top:  361.17, min:  359.05, avg:  363.82, max:  370.22, mdev:    3.31, cnt:  20
   find: top:  454.03, min:  450.79, avg:  458.51, max:  467.31, mdev:    5.08, cnt:  20
 Python: top:  624.80, min:  615.73, avg:  630.67, max:  640.88, mdev:    6.79, cnt:  20
     Go: top:  890.03, min:  876.98, avg:  910.63, max:  967.14, mdev:   24.84, cnt:  20
Python2: top: 1171.38, min: 1157.19, avg: 1189.99, max: 1228.09, mdev: 4186.28, cnt:  20

可以看到,唯一的并行版本 fd 胜出了~Rust 版本紧随其后,显然在此例中并行并没有多么有效。Go_3rd 还是慢于 Rust 但也并不多。然后,经过优化的 Python 终于在更大的数据量上明显胜过了 Go 以及 Python 2 这两个浪费了很多系统调用的版本。

Dimpurr's avatar

如何在 Krita 中创建材质笔刷

Krita 是 KDE 基金会项目下的一款专注于数码图形绘画 (Digital Art) 的跨平台开源软件。

在 Krita 官方讨论区 Krita Tutorial & Resources 板块和官方文档 Resources 页面可以获得许多有用的材质和笔刷。本文主体内容改编翻译自 https://forum.kde.org/viewtopic.php?f=274&t=140349

钉子的知识库: http://note.dimpurr.com/#艺术和动漫绘画学习索引

今天我将教你们如何创建一个酷炫的材质笔刷。如果你需要一些类似 Photoshop 的双重画笔一样的工具,那就是这个没错了。我想这是材质绘制的极佳方式。让我们开始吧:

首先创建一个基本笔刷贴图尺寸的文件(我使用 300*300px)并删除背景。

插入(或者手动绘制)「基础」贴图。这个贴图会决定笔刷贴图的形式、尺寸、比例并仅用于创建选区。随后右键点击该图层,在菜单中选择「选择不透明度 (Select Opaque)」。

image

隐藏这个图层,并创建 5-10 个新图层。

选择某个材质笔刷,并在空白图层上绘画。使用随机的分散/镜像/旋转设置以增加贴图的多样性。对每个图层都这样做。你可以设置分离图层(Isolate layer)或者 Alt + 点击 切换单独绘制每个图层让这个过程舒服一点。

image

现在让我们创建新的动画笔刷材质。点击 +印戳 (+Stamp) 按钮并选择 风格:动态 ,模式 :随机 (当然你也可以是用别的)。

image

这将会使用目前所有的可见图层作为笔刷的贴图。不要使用自动间隙(Auto Spacing),记得为笔刷命名。你需要反复尝试让笔刷变得正常,可以直接在画布上测试你的新笔刷。

image

于是我们有了一个还未经设置的笔刷贴图,接下来进行一系列配置吧。对于方形笔刷贴图,我建议你使用镜像(Mirror)以增加多样性。对圆形笔刷贴图你也可以使用旋转(Rotation)。你也可以调节空隙曲线增加某种动态笔压,我以这种方式让高压力时能画出厚重的线条。

image

别忘了设置你还可以使用滤镜(filters),有时候我会使用非锐化蒙版(Unsharp)、模糊(Blur)、色彩调整曲线(Color Adjustment Curves)。色彩调整曲线(Color Adjustment Curves)在透明通道(Alpha channel )绘制的时候特别有用(当然平常也有效)。

后面是最终效果的一些例子。在我的笔刷包中,我做了许多有用的基本笔刷、材质笔刷并做好了预设。

image

本文来自 钉子の次元 - Dimpurr - 千里之行,始於足下。 ,原文地址 如何在 Krita 中创建材质笔刷

Phoenix Nemo's avatar

在线扩展 LVM root 分区

才不是没东西写了呢

遇到一个奇葩的原因导致 root 分区被占满的。而且还是奇葩的 CentOS,root 分区是 LVM,Hypervisor 里扩展磁盘后无法直接用 resize2fs。

lwl12's avatar

明日之心,高考加油~

如果结果不如你所愿,就在尘埃落定前奋力一搏。

 
现在是 2018 年高考前夕啦,去年差不多这个时候,lwl 也发了一篇贺文呢。
 
嘛,今年祝各位用明日之心成就明日之星!
 
本博主今年也有考试啦_(:з」∠)_
 

IceHoney Blog's avatar

如何封装第三方vue组件

终于算是正式接触SPA的前端工作了,最近在解决很多Vue组件的问题,其中就有一个针对第三方组件的定制化需求,花了不少时间来折腾。

解决v-model绑定

这次封装的就是element的前端vue框架,因为框架本身对IOS兼容性不好,所以需要二次封装。封装的是一个select组件。所以需要数据的双向绑定,官方教程也已经解释了。 v-model 本质上就是绑定一个值和监听相应的事件。 这次本质是封装的一个input元素,所以我们需要手动绑定value和监听事件。


  
  

官方文档也解释了这个内置变量的用法vm-listeners

继承父元素的属性

父元素的属性继承可以使用v-bind="$attrs"来完成。所以完成组建的透明封装只需要加上三个指令。


  
  

虽然知道答案之后很简单,但是探索的过程中还是比较花时间的。希望能帮助大家解决这个问题,如果有什么疏漏之处,也请大家指正。

依云's avatar

这个博客要死了

本文来自依云's Blog,转载请注明。

很早的时候,那个时候我还在读大学,博客火了一阵。

那时候我刚拥有自己的计算机没多久。那时候我才开始在 Linux 系统里摸索着自学编程。犹犹豫豫地,我注册了一个 WordPress 账号。过了一两周的样子,我那个只有「Hello World」的博客随着众多 WordPress 博客一起被墙了。

那么就换一个地方吧。没过多久,我开通了 Google 提供的 blogger 博客。次日被墙。

那个时候,在国内的网站上发布内容还不需要提供手机号,位于国内的网站也不需要备案。所以我找了个国内的服务,也就是由当时我经常上的 Ubuntu 中文论坛所提供的博客服务。我在那里写过几篇不成熟的文章。过了挺长一段时间的。后来,他们宣布中止服务。

我后来就来到了这里,is-programmer.com。那时候这里还挺繁荣的,有好多人在这里写博客。那时候也没有多少垃圾评论。就这么安静地过了很长时间,站长突然联系不上了。再接着就是用户越来越少,垃圾评论越来越多。我挺担心哪天域名过期,然后自己的博客就消失了。还好我之前向站长申请过自定义域名,于是就用上了。使用 JavaScript 做了跳转和替换,Google 说这样子也是可以的,不过百度那边显然不认可这种做法。后来我又担心这VPS到期没人续费。还好这些都没有发生,域名和VPS都还活着。当然为了以防万一我写了个爬虫,把博客数据爬回来做了备份。

再后来,博客挂了差不多一天。我想方设法登录到了服务器上,删除了大量缓存和日志文件,腾出来些磁盘空间,这才又恢复。然后顺便把之前上传的文件也备份了回来,把域名跳转改成了通过301重定向的方式。不过很可惜,百度依旧不懂。

就这样勉强活着吧。我本来想自己写一个博客程序,可生活实在是太累了,就一直也没有写出来。也不太想用静态博客,因为不方便评论。特别是 Disqus 曾经用欺骗的方式拿了我的社交账号又要求注册 Disqus 账号,以及后来默认不允许匿名评论、匿名评论不显示头像,使得我对 Disqus 挺反感的。

而就在前几天,我这博客被入侵了。入侵者篡改了首页。虽然刷新缓存之后就恢复了,但我感觉很不好。

这博客,已经老了。就算我通过各种打补丁的方式,支持 HTTPS,支持 IPv6,更换自己控制的域名,使用脚本更改页面中的旧链接,但是,它还是在一点一点、不可避免地衰老。

Fenking's avatar

火种与传承

今天,我突然笑了。
笑的十分开心,有如不曾这么开心过。
都是因为目睹了我所无法预料的,有生之年的历史的传承。
2005年,玄女只做了中国第一张东方同人CD–《境界生命物语》
2006年,中国东方同人第一次打入日本cm,成为新的起点–《盈月纪年》
在那之后,我们又创作了更多奇迹。
时隔多年微博上在没有传出关于盈月纪年的消息,今天突然打破了那长久的宁静。
今年5月20日,zun终于来到中国大陆,在北大举办讲座。如此高规格的事件,自然请到了中国东方圈的大多数鼻祖和历史人物。
过去中国东方第一个论坛,也是创造奇迹的论坛——动漫渔场(东方小镇)的站长airzhangfish和论坛的主要音乐制作人haku_wang(月代彩)也被请到了现场,这是一场空前绝后的历史的聚集。
而在今天早上,囧仙把fish托付给的这两张有着起点意义的专辑亲手交给了zun。
东方同人的火苗在这两张cd中点燃。虽然一时好像熄灭,但是不会的,它终将被传承下去————
最终,它被交接到了东方的鼻祖——zun手中。我们的历史的成功,历史的结晶真正地被迎接下去,我们走过的路,我们会把它记录下来,然后这一份宝物,永远珍藏在历史的原点,我们的出发点。
这是里程碑。意义重大。

我是一个渺小的人,不过是一个微不足道的历史记录员罢了。
2011年,我从stg进入东方;
2011年,我接触到东方同人音乐;
2011年11月,我第一次听到盈月纪年;
2011年末,进入东方小镇,但是由于年少已经淡忘账号消息;
2013年,开始发掘盈月纪年1,2,以及境界生命物语级其他老同音专辑的信息
————2017年5月24日,获得《盈月纪年2》
————2018年5月21日,fish站长成功完成中国同人与东方本体的交付于对接。

如果历史的苏醒都能在有生之年让我亲眼所见,那么我也没有什么不可能完成的事情。

Fenking's avatar

生活记录ep1

一直以来十分忙碌,没有怎么管理网站,只是草草做了个日迹线就又回归到不堪的生活中了。
不过这种不堪的生活是在日本。
某种程度上,这是个令人抑郁的国度,但是这份抑郁的根本来源,或许是来自于现在的生活吧。
我们考试,我们徘徊在进学和回国的分界点,时间和情报的优势决定了一切,背后可以依靠的力量克服了一切问题。有人自信,有人自卑;有人计划长远,有人迫在眉睫;有人十项全备,也有人白手空拳。
我们焦躁地,不安地走着,心中没有那一份底。

下一篇生活记录可能还有一个月。

via these people and places