OpenWrt开发之界面
OpenWrt的界面是名为Luci的一个包。说实在的,对路由器来说,网页界面并不是必需的,只要能ssh上路由器设备,理论上说就可以做任何事情了。不过对于普通用户来说,还是有界面会友好一些。和OpenWrt本身一样,Luci也可以扩展,也就是说你可以向Luci里面加自己的页面,在官方的opkg源里面,也可以找到许多以luci-app-开头的包,它们就是Luci的扩展。 Luci目前是用Lua作为引擎 […]
OpenWrt的界面是名为Luci的一个包。说实在的,对路由器来说,网页界面并不是必需的,只要能ssh上路由器设备,理论上说就可以做任何事情了。不过对于普通用户来说,还是有界面会友好一些。和OpenWrt本身一样,Luci也可以扩展,也就是说你可以向Luci里面加自己的页面,在官方的opkg源里面,也可以找到许多以luci-app-开头的包,它们就是Luci的扩展。 Luci目前是用Lua作为引擎 […]
当我们编译好一些包的时候,肯定是想让它能方便地使用。比如更新了路由器,又没有把自己的包内置到镜像里面去,一般就得用opkg来安装。手动安装就需要把包保存在本地,用的时候上传,验证,完成。像OpenWrt官方源里面的包都不需要上传这一步,就在列表里面选,或者直接用命令,给个包名就能安装了。和官方源一样,我们也可以自建一个opkg源,让安装变简单。 准备工作 在《如何在OpenWrt上开发》一篇中,我 […]
如果要在OpenWrt上运行自己写的程序,那其实配置文件怎么做都可以,只要程序能读它就行。然而,OpenWrt提供了一套名叫UCI,也就是“全局配置接口”的系统,用它来做配置,可以给开发者省下很多麻烦。 文件格式 一个标准的UCI配置文件长这样: UCI配置文件的一项配置分为三个层级:配置文件、配置段、配置。在上面的例子里,每个以config开头的行和之下的行都是一个配置段,第二个词是段类型,第三 […]
在上篇文章里,已经写了如何将可执行文件加入OpenWrt包中。这次再写一些更深入,但是常用的话题。 开机启动 在Linux中,把启动脚本放在/etc/init.d中可以自启动,OpenWrt也不例外。问题是如何把启动脚本打在包中。 在mypackage目录下运行: 修改刚创建的mypackage文件,这里用了procd工具,最简单的写法只需要定义start_service: 在mypackage目 […]
最近,因为一些原因,我需要把自己之前开发的程序移植到OpenWrt上面。要做到这件事,至少需要一台装有OpenWrt的设备(可以用虚拟机)、一台Linux设备用于编译(WSL我猜或许也可以)、Linux编程的知识、GNU编译工具的用法、和一定的英语水平(看文档或者查错之类的)。 下载开发工具 从官方文档里能找到下载开发工具的部分:https://openwrt.org/docs/guide-dev […]
在Python3里,可以直接用datetime对象的timestamp方法得到对应的时间戳。但是Python2又没有,为了兼容,还是要找到替代品,完成同样的事情。
1 2 3 |
from datetime import datetime t = datetime.now() timestamp = t.timestamp() # Python3才有 |
于是就Google一下“python 2 datetime timestamp”,第一个结果给出了这样的回答: [crayon-673ed76b96c9748195650 […]
C#中的async/await/Task机制是个非常方便的功能,可以将异步的功能写成像同步一样易懂。在其背后,编译器做了一些脏活,比如将async方法从await的地方切开成多个方法,按顺序在线程池中运行。这其中也暗藏了一些坑,如果不是非常有经验的程序员可能就掉进去了。 比如如下的程序,会输出什么呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Task t = new Task(async () => { Console.WriteLine("Task t start"); await Task.Delay(1000); Console.WriteLine("Task t end"); }); t.Start(); Task.Run(async () => { Console.WriteLine("Anonymous task start"); await t; Console.WriteLine("Anonymous task end"); }); Thread.Sleep(1200); |
这个程序开了两个Task,第一 […]
前言 说到浏览器插件,喜欢研究的人一定不会陌生。一般来说,浏览器的插件都是会改一些网站的页面,做到类似去广告、增加功能的事情。在逛论坛的时候,我发现这样一个插件:TamperMonkey,也就是油猴。和其他插件不同,这个插件相当于是一个引擎,用户可以在其中安装或者开发想要的脚本,以完成自己想要的事情。另外一个好处是,这个插件已经支持了目前所有的主流浏览器(当然,没有国产的浏览器……),所以只要写一 […]
前言 最近在玩一个叫《冥界狂想曲重制版》的游戏,苦于没有中文,其中又有许多难懂的词汇和句子,游戏体验不好。既然是重制版,那就会有原版,原版还是有汉化的。可要是去玩原版,这重制的意义何在?为了玩上有中文的游戏,何不如自己动手,丰衣足食一把? 汉化流程 不同的游戏肯定是使用不同的机制来呈现文本的,但基本就只有几类,汉化的方式也大体相同。要想汉化,就需要经过以下过程: 解包,找到文本和字库 修改文本和字 […]
简介 记录日志在很多情况下都是必需的。但很多时候,日志与逻辑的代码混杂,让人难以阅读代码。如果能将记录日志与代码逻辑分离,就可以在满足日志需求的同时,让代码更加简明了。可以使用aspectj来达到这一目的。 aspectj提供了面向切面编程的功能。他可以“切开”原本的代码,并在切面上插入另一些代码,达到更改代码的目的。这个功能正适合于记录日志的场景。 在项目中使用aspectj 因为aspectj […]