引入ace编辑器用作代码高亮(杀鸡焉用牛刀?

作者:V君 发布于:2020-3-20 22:57 Friday 分类:小服杂记

博客中有不少文章把代码段贴出来,有(dan)空(teng)的时候想办法去弄点样式,没(lan)空的时候就直接贴纯文本。是时候应该解决一下了。那就去看看用什么组件好吧。

(放狗出去找)发现了 highlight.js ,看起来不错,但不支持显示行号,并且作者也不打算实现它。那就再找找吧,(找了一会儿),想起 ace 编辑器了,如果只要设置成只读,它就是一个优秀的代码高亮组件,还能折叠代码块。

废话少说开始干!首先找到代码插入点,这次我选择在 content/templates/default/footer.php 底部的 #wrap 结束标记后面,插入 CDN 库引用然后写了下面的代码来启用。

先TL;DR一下使用方法:在需要高亮的元素上增加以下属性

  1. highlight="ace" 启用代码高亮
  2. ace-lang="javascript" 必选,指定代码语言
  3. ace-theme="chrome" 可选,配色主题

代码语言和配色主题可以参照源代码文件名。

注释掉 log 语句并甩锅给 IE(

//replace nbsp \xa0 to normal space \x20
function normalizeSpaces(elm){
    var nodes = elm.childNodes;
    for (var i=0; i < nodes.length; ++i){
        if(nodes[i].nodeName === "#text") nodes[i].textContent = nodes[i].textContent.split("\xa0").join('\x20');
        else normalizeSpaces(nodes[i]);
    }
}

if (ace===undefined){
    console.log('highlight: ace undefined, no works');
}else{
    var items = document.querySelectorAll('[highlight=ace]');
    //console.log(`highlight: found ${items.length} element(s) to highlight, dealing with it.`);
    for (var i=0;i<items.length;++i){
        var item = items[i];
        
        var aceLang=item.getAttribute("ace-lang");
        if (aceLang === null){
            //console.warn(`highlight: the highlight element #${i} missing attribute 'ace-lang', skipped`);
            continue;
        }
        
        normalizeSpaces(item);
        
        var aceTheme=item.getAttribute("ace-theme");
        if (aceTheme === null) aceTheme = "Chrome";
        
        var editor = ace.edit(item);
        editor.setReadOnly(true);
        editor.setOptions({maxLines: Infinity});
        editor.setTheme("ace/theme/"+aceTheme);
        editor.session.setMode("ace/mode/"+aceLang);
    }
}

继续水

标签: 软件开发 javascript Web技术

评论(0) 引用(0) 浏览(13)

自己动手用C#写无盘引导服务

作者:V君 发布于:2020-3-5 22:18 Thursday 分类:我的应用

发表一下最近折腾的东西,还没折腾完,因此不太TL;DR,再扯扯 (pia

[ 源代码 ] 目前只做了 DHCP、TFTP 和 iPXE 用的 HTTP 脚本服务。由于只是勉强能用,并不友好,因此尚未提供直接可用的二进制文件

— 使用方法:开始 —

将源代码弄下来,还原 NuGet 包,编译。导航到解决方案根目录的 bin 文件夹,我把它们的输出全都指向这里以方便编辑配置文件。

  • 编辑 DHCP 配置文件,正确设置监听地址
  • 编辑 TFTP 配置文件,正确设置监听地址、正确设置根路径
  • 编辑 HTTP 配置文件,正确设置监听前缀

启动这三者,不要忘记调整防火墙,插好网线启动从机,设置好 BIOS 使其从 PXE 启动。这时候还不能顺利引导,DHCP 服务会在 DhcpEntries 文件夹会自动生成 MAC 地址的对应的 json 配置文件,修改 default 配置文件设置除了IP之外的字段,如子网掩码、网关、DNS、启动文件名,然后再在对应 MAC 的配置文件里面指定 IP 地址,将 Enable 字段置为 true。注意字段 Enable 对 Default 配置文件无效。这时候从机应该能分配到 IP 地址,然后去 TFTP 获取启动文件了。本例使用 iPXE 作为引导。

本例提供的 iPXE 嵌入了【再次获取 DHCP 并将启动文件名作为 chain 目标】,可以将 chain 指定为 HTTP 的 URI,从服务器吐出脚本来实现动态执行。通过 iPXE 发出的 DHCP 请求带有 UserClass 字段,会自动生成配置文件,可以另外指定启动文件名为 HTTP 网址。

配置文件的叠加顺序为:Default → Default-【UserClass】 → MAC → MAC-【UserClass】。值为 null 的字段将被忽略。接下来就可以去 IpxeScripts 文件夹配置 iPXE 脚本了。引导部分到此结束,接下来的步骤是连接到存储服务器、启动系统了。

— 使用方法:结束 —

— 扩充:开始 —

常见的的无盘使用 iSCSI 方式连接到服务器,详细用法请参考示例或查阅 iPXE 使用手册。iSCSI 服务端可以使用 StarWind 或者 TalAloni/iSCSIConsole 亦或者是 我的fork。 我在 TalAloni 的基础上增加了大容量、可加载 RamDisk 和类似 StarWind 的 ibv 支持。能从一个镜像中创建分支快照,能让多台机器同时使用,有点像 VMware 的链接克隆。

— 扩充:结束 —

— 扯扯:开始 —

刚刚开始的时候我用了 TFTPD32、Grub4Dos、固定脚本的 iPXE、还有 Star wind。由于效果很不理想,得想办法解决。 TFTPD32 的毛病:分配IP地址时间较长、TFTP经常抽筋;StarWind 的毛病:服务进程经常崩溃;尽管 TalAloni 的实现很稳定,但它的界面简直就是个 DEMO,每次打开都要配置……后来深入了解 DHCP 协议,发现可以它很简洁,可扩展性又强,再了解 iPXE 动态脚本,这套组合拳就打出来了。

虽然 DHCP 和 TFTP 的协议都挺好搞,但 iSCSI 协议就复杂了,想让指定的 Target 能根据客户端 iqn 自动创建快照, 实现不同机器连接到同一个 Target,却是各自使用自己的快照,目前还在咕咕咕(

— 扯扯:结束 —

标签: 软件开发 C# HTTP PXE DHCP TFTP iPXE

评论(0) 引用(0) 浏览(39)

开始接触 STM32 —— Keil μVision 和 Visual Studio 相比太难用啦!

作者:V君 发布于:2019-12-31 10:59 Tuesday 分类:折腾手记

最近开始摸STM32,用 Keil μVision 来编写代码和调试。单片机型号是 F103 用 ST-Link/v2 以 SWD 的方式下载和调试。尽管 Keil 在占据的市场份额不小,但对于我这个被 VS 宠坏了的家伙来说,太难用啦!先列举些槽点,然后再看看有没有代替方案,如果能用 VS 来搞 STM32 开发就好咯……

吐槽:文档页签不能拖动
吐槽:编译、下载、启动调试,似乎不能一气呵成,得分开操作
  但愿是我不知道怎么配置一键,难道大伙们都能忍?
吐槽:智能感知……只能说是聊胜于无吧,尽管默认绑了 F12——
  可以转到定义,但在找到多个重复定义时,你蹦出一个符号窗格给我……
吐槽:项目 wide 搜索,貌似没有像VS那样列出匹配,只能上一个、下一个来导航
  但愿又是默认不启用的功能,只是我不没调出来……

代替方案?起初想到用 VsCode 来编辑代码,然后再回到 Keil 调试,考虑到 C 语言过于依赖环境,多一个少一个符号定义都会发生很大变化,估计 VsCode 的智能感知估计也不会好到哪里去吧……用各种关键字喂咕狗,找到一个叫做 VisualGDB 的扩展,主页上提到可以用来搞 STM32,但目前还没有试试看能不能用……(咕咕咕)后话:剁手买了正版,很香!

月底了,不刷存在感会觉得很方,必须凑合着发点什么出来

标签: 软件开发 嵌入式

评论(2) 引用(0) 浏览(94)

Xamarin Android 新手历险记之 AccessibilityService

作者:V君 发布于:2019-11-30 19:49 Saturday 分类:折腾手记

最近开始折腾 Android 的原生功能,想获取显示在屏幕上的界面元素。说到 Android 还想用我大 C♯ 去写,当然就是 Xamarin 啦!和往常一样,还是从 TL;DR 开始,然后再展开详细。

- TL;DR -
1. 在项目中新增一个类,本例命名为 MyAccessibilityService
2. 使其继承于 AccessibilityService (Android.AccessibilityServices)
3. 追加必要的 Attribute ,如 Service、IntentFilter、MetaData
4. 重写 OnServiceConnected 方法增加 SetServiceInfo 调用
5. 重写 OnAccessibilityEvent 根据 ServiceInfo 做对应动作,达到目的

- 展开 -
1. 略 (o ‵-′)ノ”(ノ﹏<。)
2. 略 (o ‵-′)ノ”(ノ﹏<。)
3. 这里可以稍稍展开
 ✸ Service 特性主要是 Label 和 Permission
  > 用 Label 来指定服务的显示名称
  > 用 Permission 指定必须的权限 BindAccessibilityService
 ✸ IntentFilter 喂进去一个 "android.accessibilityservice.AccessibilityService"
 ✸ MetaData 喂进去 "android.accessibilityservice" 和 Resource = XML 资源路径
  > XML 路径一般是 "@xml/accessibility_service_config",在对应地方写好配置文件即可
  > 为了能访问界面元素,确保在配置文件中启用 android:canRetrieveWindowContent
  ⚠ 注意 MetaData 第一个参数写错不会有检查,只会让服务不按XML配置文件工作
4. 这里主要是创建一个 AccessibilityServiceInfo 实例,然后喂给 SetServiceInfo 方法
  > Flags 属性确保有 RetrieveInteractiveWindows 位
  > EventTypes 用来给接下来的地方做事件筛选,比如用 WindowsChanged
5. 到这里就可以开始搞事情啦
  > 使用当前对象的 RootInActiveWindow 属性获取界面元素的树状结构根节点

- 再稍稍补充一下 -
如果只有 Service 而没有主界面,那就得手动跑到系统设置的辅助功能去启动服务。
有的国产Android手机系统界面被魔改得连辅助功能入口都被砍掉,这太尴尬。
我们可以在主界面做个按钮来导航到辅助功能设置:
1. 使用 Android.Provider.Settings.ActionAccessibilitySettings 实例化 Intent
2. 将其喂给 StartActivity 就可以实现捷径了

- 感受 -
这次能分担给大家的东西并不多。
我不会说因为 MetaData 第一个参数写错,然而没有报错,也获取不到界面元素,让我花了很多时间才找到问题所在。这个细节上咕狗做得很不厚道呀……

说好的每月一篇文章,这次有点踩线呀,虽然创建时间是19点,但发布时已经超过零点了,咕咕咕

标签: 软件开发 C# Android

评论(0) 引用(0) 浏览(145)

初体验.NET Core 3.0,Core新特性和传统Framework的差别

作者:V君 发布于:2019-9-30 17:21 Monday 分类:折腾手记

这次不是解决问题,因此不像往常那样有TL;DR,那就做个TOC吧

- TOC -

  1. 框架程序集(差别)
  2. 接口默认实现(新特性)
  3. 编辑并继续(差别,已更正)
  4. 通过SSH远程调试(新特性)
  5. 项目文件(差别)
  6. 嵌入资源(差别)
  7. ASP .NET Core(差别)

- 0.先扯扯 -

最近更新了 VS2019,终于有机会接触 .NET Core 3.0,在看官方文档前先行体验一波,体验过程不断收集发现就有了本文的TOC,如果你去看文档,会发现有少量文档未提及的差别,也为撰写本文提供了动力。主要从个人体验总结。

- 1.框架程序集(差别) -

从新建第一个Core项目开始,和传统Framework的差别就能体现出来,Core已经自动把整个系统类库的所有程序集作为SDK引用到项目中,不像从前需要手动引入各种系统类库程序集。

- 2.接口默认实现(新特性) -

早在半年多以前就听说,C♯ 8.0 将能够在接口中定义包含方法体的方法,这个特性名为「接口默认实现」,也是打动我,使我投奔Core的诱惑之一。亲手操练之后发现,现在不仅能在接口中写实现方法,更能定义常量、甚至还能写静态方法,昔日的接口扩展方法将可以用默认实现代替。

- 3.编辑并继续(差别,已更正) -

这个差异在16.3.0得到更正,现在已经能在改变当前语句的同时将代码变更应用。(请无视这一条)编辑并继续:在调试中命中断点停下来,编辑代码,改变当前语句并继续执行。这里有点细节和传统不一样,需要改变操作顺序,会稍稍造成一点体验差异。传统Framework调试时我们可以按照 命中断点→修改代码→拖动箭头或者使用上下文菜单来改变接下来要执行的语句,拖动在改变语句的同时,代码变更会生效,使我们能够执按修改如期执行;到了.NET Core就有点不一样了,修改完代码之后不能紧接就着改变当前语句,这会实代码变更的提交动作被跳过,执行的行为和看到的代码将会不一致,我们只能继续往前走一步才生效。操作顺序就变成 命中断点→改变当前语句到要修改的代码前→修改代码→继续执行。

- 4.通过SSH远程调试(新特性) -

在过去要调试运行在Linux上的.NET应用程序,只能依靠第三方调试器,比如之前提到的MonoRemoteDebugger,第三方工具的体验和稳定性都远远比不上官方集成功能。现在我们可以通过SSH的方式直接附加到远程进程了。

- 5.项目文件(差别) -

过去的C♯项目文件记录着所有已包含的文件,而且变更后VS会重新载入项目,动作有点大。在Core之后有了极大改善,项目文件不再一一记录包含文件而是引入默认行为,将项目目录下的文件以扩展名对应默认生成行为的方式默认包含到项目中,如果有变更则仅记录变更的项。在项目文件变更后也极大地减轻了重新载入(刷新、应用变更)项目的动作。

- 6.嵌入资源(差别) -

这一点还没有查到相关文档。受影响的地方是生成操作为「嵌入的资源」的项,若和旁边的.cs文件同名(任意扩展名),则会生成与.cs文件中定义的第一个类全名的嵌入资源,且不带扩展名。若在.cs文件旁边有两个同名(不同扩展名)的文件设置为嵌入资源,将引发重名编译错误。这个行为和传统Framework不同。

- 7.ASP .NET Core(差别) -

关于ASP.NET Core和传统ASP.NET的差别太多,这里就简单点一下个人感受。对于ASP.NET Core而言Web服务器不再是必备环境,引入了SelfHost的工作方式。HTTP Runtime格局也有巨大变化,传统ASP.NET想要以最简单粗暴地方式处理请求需要引入HTTP模块,到了ASP.NET Core,新建一个空项目就是一个空的回调并传入HTTP上下文给你处理,简单粗暴更上一层楼了!

差点以为这个月会打破惯例至少发表一篇文章…

标签: 软件开发 C#

评论(0) 引用(0) 浏览(187)

Powered by emlog 去你妹的备案 sitemap