文章

通过RSS订阅我的博客

  • ETC 比赛无线网络搭建小记

    正好上着李贺武老师的《无线移动网络技术》课,然后今天又给 ETC 比赛搭建无线网络,于是周二的时候找老师咨询了一下意见。我们大概给老师讲了一下场地的样子和尺寸(当时估计的大了),然后老师给我们提供了一个可以供参考的部署方案,包括几个 AP 分别放在哪,这些 AP 的 2.4GHz 都用哪个 channel ,然后都用多少功率。并且很友善地在周五的时候让助教来场地帮我们 survey 一下无线网络的状况。我们用 Fluke Networks 的 AirCheck Wi-Fi Tester 看了一下场地的各个频道的 AP 数量和信号强度,发现虽然 AP 挺多的,但是它们的信号都比我们的小不少,而且我们也都开到了 50mW ,所以干扰不大。 然后昨天下午一点半钟来到场地,用板车把设备都运到计算机开放实验室,然后开始部署无线网络。我们提前来踩过几次点,这边的网络是没有 DHCP 服务器的,通过一个指定的网关出去。我们发现可以利用已有的这些交换机从地下连到各个电脑上的网线,来连接我们的 AP 和交换机,这样我们就免去了走线的麻烦。于是我们先定下放 AP...
  • Unicode En Dash 小坑

    今天有同学问到我这个问题: $ gcc -o ph ph.c –lpthread 为啥不工作。我怎么看都觉得没啥问题,一开始以为是找不到 pthread ,但马上又排除了。想了下会不会是有隐藏的字符,于是让同学 pbpaste | xxd 一下,果然发现这里的 – 是 \xe2\x80\x93 ,查了下是 Unicode 里的 En Dash 。由于这是从 PDF 里直接拷贝出来的,所以凉了。改成正常的短横杠即可。
  • 软工平台踩坑记

    老师要求我们搞 CI/CD ,CI 自然是很快就搞好了,不过 CD 还得配一下。今天研究了一下它的 Deployer 架构,发现了若干易用性问题: 缺乏文档 只有样例配置没有讲解 已有的文档 语焉不详 官方对此回复:功能太多,还没忙过来写文档 于是只好经常戳助教然后尝试理解这个东西。。然后遇到了很多的 BUG : 容器没有重启功能。。。 容器死了还是活着看一个图的颜色。。。毫无说明 容器虽然有 Console ,但是输入过长后直接回到行首没有换行。。。 容器对外的域名里有下划线。。。 Django 上来就一句 Invalid HTTP_HOST header: 'xxxx_xxx.app.secoder.net'. The domain name provided...
  • 在荔枝糖(Lichee Tang)上初次体验 FPGA

    今天从张宇翔学长那拿到了 荔枝糖(Lichee Tang) 的 FPGA 板子,于是立即开始把前段时间学到的Verilog应用上来。不过想到现在我手上没有多少外设,然后又必须远程到 Windows 电脑上去操作,于是先实现了一下 UART 通信。 在网上找到了 ben-marshall/uart 一个简易的实现,很快做到了一直在串口上打印 A 字符。接着我开始尝试实现一个简单的串口回显。一开始,我直接把 UART 读到的数据直接输出,果然可以了,但是一旦传输速率跟不上了,就会丢失数据。于是我添加了 FIFO IP 核,然后把读入的数据存入 FIFO ,又从 FIFO 中读取数据写入到 UART 中去。不过发现了一个小 BUG:每次打印的是倒数第二次输入的字符,即丢失了第一个字符。在张宇翔学长的帮助下找到了问题:当 FIFO 的读使能信号为高时,其数据在下一个时钟周期才来,于是解决方案就是等到数据来的时候再向 UART 中写数据: always...
  • 使用 veth 实现 IPv6-only 的 Brouter 功能

    最近从 @shankerwangmiao 学到了一个方法:通过 veth 把两个 bridge 的 IPv6 桥接起来。方法如下: $ ip link add veth-v6-in type veth peer name veth-v6-out $ brctl addif br-in veth-v6-in $ brctl addif br-out veth-v6-out $ ebtables -t...
  • 在 Android 上打开 LTE 的 IPv6

    听闻北京移动给 LTE 配置了 SLAAC ,但现在需要手动打开,方法如下: Settings -> Network & Internet -> Mobile Network -> Advanced -> Access Point Names -> 中国移动 GPRS (China Mobile) -> 把 APN procotol 和 APN roaming protocol...
  • THUCTF 2018 和 Teaser Dragon CTF 2018 小记

    终于可以公开 writeup 了,大家也可以去看谭闻德写的 writeup 。 这次是我第一次打 CTF ,发现题目还挺有意思的,虽然也有一些题目做不出来,有拿钱还是美滋滋。 这次也认识了好些会打 CTF 的人吧,如 0x00, user1, igoodvegetable 等队伍的同学。一开始被蛤力橙叫来打比赛,我觉得心里挺没底的,然后花了很多时间做题目,一点一点还是做出了不少题目来。最精彩的还是结束以后,当知晓没做出来的题目的做法时候,会不自觉感叹题目的巧妙。也学到了一些梗: #define 1000000007 twd2 接着就参与了一下 Teaser Dragon CTF 2018 ,是个在线赛,许多人一起做题,只有 24 小时。看了下题目,除了签到题,其它题都比 THUCTF 2018 难多了,我只能围观他们做题。最后看到别人写的 writeup ,真是太巧妙了,一环接一环,真的想不到。不过也有很麻烦的题目,特别是有的逆向的题目,太考验人的耐心了。 接下来就等待官方的...
  • 绕过 GPGMail 的激活检测

    前段时间 GPGMail 宣布不再免费,在三十天的试用期后就不给用了。唉,可能是官方实在没钱维护了,也可能是官方想赚钱了。不过,既然 GPGMail 采用的是自由的许可证,意味着我们可以自己对代码进行更改。和许可证验证相关的代码如下: - (BOOL)hasActiveContract { NSDictionary *contractInformation = [self contractInformation]; return [contractInformation[@"Active"] boolValue]; } 我们只要改成 return TRUE ,在自己的电脑上手动编译、并复制到 /Library/Application Support/GPGTools/GPGMail 下即可。 另:还有一个直接对二进制打 patch 的方法(仍然符合许可证),利用了最近打 CTF 学到的一些知识。找到以上这个函数,然后把返回值修改成非零即可。这里就不提供方法了。最后的更改: $ radiff2 -D...
  • 在 macOS 的 VirtualBox 上从 USB 启动

    做了一个 Windows 10 安装 U 盘,想测试一下能不能启动,于是想用 VirtualBox 起一个虚拟机。但是发现,一般情况下要从 ISO 或者把 U 盘克隆成一个 vdi/vmdk etc 再启动。不过找到了 Cem Arslan 的 VirtualBox - Booting From USB (MAC) 实验了一下,确实可以用,以 /dev/disk2 为例方法如下: $ diskutil unmountDisk /dev/disk2 $...
  • 在 Ubuntu 上跨版本迁移 MongoDB

    由于 MongoDB 只支持当前版本和上一个版本的数据库格式,然后刚刚滚系统升级的时候升级到了 3.6.x ,而数据库格式仍然是 3.2.x 的,于是需要先安装回 3.4.x 版本的 MongoDB,输入命令把数据库升级到 3.4.x 版本后,再用 3.6.x 的数据库进行升级。 以 从 Ubuntu 14.04 LTS 升级到 Ubuntu 18.04.1 LTS 为例,方法如下: $ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.4.17.tgz $ tar xvf mongodb-linux-x86_64-ubuntu1604-3.4.17.tgz $...
  • 通过 SSH 隧道连接 ADB 和 Android 设备

    由于本机算力不足,想要在远程编译 LineageOS ,其中有一步需要连接到已有的设备,于是突发奇想: adb 可以通过 网络连接 ssh 可以进行端口转发,这里是把 remote 的端口转发到 Android 设备上的端口。 方法如下: $ adb shell ip -f inet addr show wlan0 $ # remember the ip address here $ adb tcpip...
  • 在 LEDE (OpenWrt) 上启用 wpad

    WPAD(Web Proxy Auto-Discovery Protocol)是一个可以利用 dhcp 分发 pac 配置的协议。方法如下: $ # ssh to router first $ vim /etc/dnsmasq.conf dhcp-option=252,"http://router_ip/wpad.dat" $ vim /www/wpad.dat # put pac here $ service dnsmasq restart $ # ensure...
  • 在 Xcode 9 上启用 Vim 模拟(XVim 2)

    作为一个不用 vim 编辑会死星人,用 Xcode 总是止不住自己想 Escape 的心。于是找到了 XVimProject/XVim2 进行配置。 大致方法如下: 按照 Signing Xcode 对 Xcode 进行重签名。套路和对 GDB 进行签名一样。不过这次,签名完成的时间可长多了,毕竟 Xcode 这么大。 接着按照项目的 README ,首先 git clone 然后 make ,第一次打开 Xcode 的时候选择 Load Bundle...
  • 在 macOS 上读取移动硬盘的 S.M.A.R.T. 信息

    之前想看看自己各个盘的情况,但是发现只能看电脑内置的 SSD 的 S.M.A.R.T 信息,而移动硬盘的都显示: $ smartctl -a /dev/disk2 smartctl 6.6 2017-11-05 r4594 [Darwin 17.7.0 x86_64] (local build) Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org /dev/disk2: Unable to detect device type...
  • 通过 Ipfilter Extension 实现 RFC8367

    前几天无聊闲逛看到了一个很有趣的 RFC8367 - Wrongful Termination of Internet Protocol (IP) Packets ,看到日期大家应该都懂了,这是个粥客,不过里面还是反映了一些事情,咳。 之前看到闪客实现了 shankerwangmiao/xt_PROTO ,想到自己也可以做一个 iptables 扩展,于是就写了 jiegec/xt_EQUALIZE 。它是这样使用的: $ git clone git@github.com:jiegec/xt_EQUALIZE.git $ make $ sudo make install $ sudo iptables -t...
  • 在 macOS 上 TAP Interface 上启用 IPv6 自动配置

    由于 macOS 对 TAP Interface 不会自动出现一个设置中对应的服务,所以需要手动进行配置。一番测试后,发现可以通过: $ sudo ipconfig set [tap_if] automatic-v6 $ sudo ipconfig set [tap_if] dhcp 启用系统自带的 dhcp 和 ra 功能。也许有方法可以把这些 tap 搬到系统的设置中去。 UPDATE: 可以把 TAP Interface 加到系统的设置中去。方法参考Virtual network interface...
  • 在 macOS 下实现 GRETAP

    由于没有找到 macOS 下现成的 GRETAP 实现,我就想到自己实现一个。由于tuntaposx提供了一个和 Linux 下基本一样的 TAP Interface,于是自己利用 raw socket 和 TAP Interface 实现了一下,主要方法: 打开 raw socket ,读取收到的 proto 47 的包,判断是否为 GRETAP 包,是,则写入内层包到打开的 TAP Interface 中。 从 TAP Interface 中读入包,自己加上 GRE...
  • 在 WireGuard 构建的 Overlay Network 上跑 babel 路由协议

    受 Run Babeld over Wireguard - Fugoes’s Blog 和 Route-based VPN on Linux with WireGuard 启发,自己也想尝试一下,在一个有多个结点的网络中,如何通过 WireGuard 构建一个 overlay network,并通过 babel 自动进行结点发现和路径选择。 首先建立点对点的 WireGuard Tunnel 。由于我们用 babel 进行路由,所以我们不能采用 Wiregurad 本身基于目的地址的端口复用,所以每一个 WireGuard interface...
  • 更改 macOS 屏幕亮度的按键

    由于我打开了「Invert Fn」功能,所以需要调亮度的时候,是采用Fn+F1/F2的方法。但是,我的机械键盘则是,不按Fn时为1-9,按着Fn时为对应的F1-F9,但是就无法调整亮度和声音了。 然后捣腾了一下,发现可以用ScLk和Pa/Br(名称在各个键盘上不大一样)调整亮度。不过,还没发现如何更改音量。。。
  • 向 Lenovo y1s 刷入 OpenWRT 17.01.5 固件,并把 IPv6 bridge 到内网中和配置认证脚本

    首先参照OpenWRT Wiki - Lenovo Y1 v1找到刷固件教程: 下载Lenovo y1s 的固件备用 断开电源,等待一段时间,插入电源同时快速按下重置按钮,如果面板双闪,则说明进入了恢复模式 电脑连接到四个 LAN 口中任意一个,配置静态地址在 192.168.1.0/24 网段 打开 192.168.1.1 可以看到刷固件的页面 上传固件,等待路由器重启 配置 IP 地址为 DHCP 模式,打开 192.168.1.1 进行配置 然后就是常规的密码设置,opkg 源设置为 tuna 的源,配置 ssh 和...
  • 构建简易的 initramfs

    一直对 Linux 的启动很感兴趣,但对 initrd 和 initramfs 等概念不大了解,于是上网找了资料,自己成功地看到了现象。 参考资料: Build and boot a minimal Linux system with qemu Custom Initramfs initramfs vs initrd ramfs, rootfs and initramfs The Kernel Newbie Corner: “initrd” and...
  • 用 multicast 地址找到同一网段的主机

    IPv4 : $ ping -t1 224.0.0.1 IPv6: $ ping -t1 ff02::1%iface
  • 用 MuSSH 快速对多台机器进行软件包升级

    Debian Stretch 9.5 刚刚更新,自己手上有不少 stretch 的机器,于是顺手把他们都升级了。不过,这个过程比较繁琐,于是我采用了 MuSSH 的方法,让这个效率可以提高,即自动同时 SSH 到多台机器上进行更新。 首先编写 hostlist 文件,一行一个地址,分别对应每台机器。 然后采用 MuSSH 对每台机器执行同样的命令 $ mussh -H hostlist -c 'apt update && apt upgrade -y' 此时要求,ssh 上去以后有相应的权限。这个有许多方法,不再赘述。然后就可以看到一台台机器升级,打上安全补丁,爽啊。
  • 配置 fcitx-fbterm 实现在终端下显示和输入中文

    参考网站: Ubuntu使用fbterm无法打开fb设备的解决及fcitx-fbterm安装 Fcitx - ArchWiki 完美中文tty, fbterm+yong(小小输入法) 让linux console支持中文显示和fcitx输入法 考虑到 lemote yeeloong 机器的 cpu 运算性能,跑一个图形界面会非常卡,于是选择直接用 framebuffer 。但是,显示中文又成了问题。于是,采用了 fbterm 和 fcitx 配合,加上 gdm 的方法,完成了终端下的中文输入。 首先,安装相关的包: $ sudo apt install gpm fcitx-fronend-fbterm dbus-x11 fbterm...
  • 在 Lemote Yeeloong 上安装 Debian jessie

    参考网站: gNewSense To MIPS Run a TFTP server on macOS Debian on Yeeloong Debian MIPS port wiki Debian MIPS port 首先,进入设备的 PMON: Press Del to enter PMON 然后,下载 Debian Jessie 的 netboot...
  • 通过 systemd-run 直接在容器中执行命令

    之前使用 systemd-nspawn 开了容器,然后通过 machinectl shell 进去,想要起一个服务然后丢到后台继续执行,但是发现离开这个 session 后这个进程总是会被杀掉,于是找了 systemd-run 的方案,即: systemd-run --machine machine_name_here absolute_path_to_executable args_here 这样可以直接在容器中跑服务,而且用这个命令输出的临时 server 名称,还可以看到日志: journalctl --machine machine_name_here -u unit_name_above
  • 通过 iptables 在同一个端口根据源地址解复用(demux)

    现在遇到一个场景,原来的一个服务只给一个客户端用,但现在增加了一个客户端,由于客户端配置相同,但是服务端需要区别对待两个客户端的服务端配置,所以利用 iptables 根据源地址做了一个端口转发,实现了 demux 。 假设:服务器在 192.168.0.1 ,客户端分别在 192.168.0.2 和 192.168.0.3 。客户端配置的服务端地址是 192.168.0.1:8000 。之前,在服务器上只跑了一个服务,监听着 8000 端口。 现在,在服务器上再跑一个服务,监听 8001 端口,同时根据需求进行相应的配置。然后,加上如下 iptables 规则: $ sudo iptables -t nat -A PREROUTING -s 192.168.0.3 -d 192.168.0.1...
  • 升级 MongoDB 到 4.0

    MongoDB 4.0 刚刚发布,加入了我很想要的 Transaction 功能。不过,我一更新就发现 MongoDB 起不来了。研究了一下日志,发现由于我创建数据库时,MongoDB版本是 3.4 ,虽然后来升级到了 3.6 ,但还是用着 3.4的兼容模式。这个可以这样来检测: $ mongo > db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) 如果不是 3.6, 升级到 4.0 之前,需要先执行如下操作: $ # MongoDB version...
  • Wireguard 隧道搭建

    随着 Wireguard Go 版本的开发,在 macOS 上起 WireGuard Tunnel 成为现实。于是,搭建了一个 macOS 和 Linux 之间的 WireGuard Tunnel。假设 Linux 端为服务端, macOS 端为客户端。 macOS端: $ brew install wireguard-tools $ cd /usr/local/etc/wireguard $ wg genkey > privatekey...
  • Verilog 初体验

    自己以前一直对硬件方面没有接触,但是大二大三很快就要接触相关知识,所以自己就先预习一下 Verilog HDL,以便以后造计算机。听学长们推荐了一本书叫《自己动手写CPU》,由于自己手中只有很老的 Spartan-3 板子,手上没有可以用来试验的 FPGA ,所以选择用 Verilog + Verilator 进行模拟。既然是模拟,自然是会有一定的问题,不过这个以后再说。 然后就是模仿着这本书的例子,写了指令的获取和指令的解码两部分很少很少的代码,只能解码 ori (or with immidiate) 这一个指令。然后,通过 verilator 跑模拟,输出 vcd 文件,再用 gtkwave 显示波形,终于能够看到我想要的结果了。能够看到,前一个时钟周期获取指令,下一个时钟周期进行解码,出现了流水线的结果。这让我十分开心。 接下来就是实现一些基本的算术指令,然后讲计算的结果写入到相应的寄存器中。这样做完之后,就可以做一个基于 verilator 的简易 A+B 程序了。 我的代码发布在jiegec/learn_verilog中。最近马上到考试周,可能到暑假会更频繁地更新吧。
  • 在 ArchLinux 上编译 LineageOS for Huawei Angler

    实践了一下如何在 ArchLinux 上编译自己的 LineageOS 。本文主要根据官方文档 进行编写。 $ # for py2 virtualenv and running x86 prebuilt binaries(e.g. bison) $ sudo pacman -Sy python2-virtualenv lib32-gcc-libs $ mkdir -p ~/bin $ mkdir -p ~/virtualenv $...
  • 编写 eBPF 程序和利用 HyperLogLog 统计包的信息

    前段时间在写概率论与数理统计的期末论文,讨论的主题是如何对一个十分巨大的多重集合(或者是流)中相异元素个数进行估计,写的是 HyperLogLog 等算法。联想到前段时间 LWN 上多次提到的 eBPF 和 BCC 的文章,我准备自己用 eBPF 实现一个高效的估计 inbound packet 中来相异源地址的个数和 outbound packet 中相异目的地址的个数。经过了许多的尝试和努力,最终是写成了 jiegec/hll_ebpf ,大致原理如下: 由于 eBPF 是一个采用专用的 bytecode 并且跑在内核中的语言,虽然我们可以用 clang 写 C 语言然后交给 LLVM 生成相应地 eBPF bytecode...
  • 调整 Nginx 和 PHP 的上传文件大小限制

    之前迁移的 MediaWiki ,有人提出说无法上传一个 1.4M 的文件。我去看了一下网站,上面写的是限制在 2M ,但是一上传就说 Entity Too Large,无法上传。后来经过研究,是 Nginx 对 POST 的大小进行了限制,同时 PHP 也有限制。 Nginx 的话,可以在 nginx.conf 的 http 中添加,也可以在 server 或者 location 中加入这么一行: client_max_body_size 100m; 我的建议是,尽量缩小范围到需要的地方,即 location > server...
  • 最近写 Node.js 遇到的若干坑

    最近在做前后端分离,前端在用 Vue.js 逐步重写,后端则变为 api 的形式。同时,我尝试了用 autocannon 和 clinic 工具测试自己的 api endpoint 的性能,一开始发现有几个延迟会特别高,即使是一个很简单的 api 也有不正常的高延迟。 于是,我用 clinic 生成了 flamegraph ,发现了一些问题: 我在 session 里保存了一些缓存的信息,这部分内容比较大, express-session 在保存到数据库前会先 JSON.stringify 再 crc 判断是否有改变,如果有改变则保存下来。但是由于我的这个对象嵌套层数多,所以时间花得很多。我调整了这个对象的结构,缩小了很多以后,果然这部分快了很多 有一个 API 需要大量的数据库查询,原本是 O(结点总数)次查询,我考虑到我们数据的结构,改成了O(深度),果然快了许多...
  • 在 Nginx 将某个子路径反代

    现在遇到这么一个需求,访问根下面是提供一个服务,访问某个子路径(/abc),则需要提供另一个服务。这两个服务处于不同的机器上,我们现在通过反代把他们合在一起。在配置这个的时候,遇到了一些问题,最后得以解决。 upstream root { server 1.2.3.4:1234; } upstream subpath { server 4.3.2.1:4321; } server { listen 443 ssl; server_name test.example.com; # the last slash is useful, see below location /abc/ { proxy_set_header...
  • 向 Nexus 6P 中刷入 LineageOS 实践

    Nexus 6P 自带的系统没有允许 Root ,所以需要自己解锁 bootloader 并且刷上别的系统。我选择了 LineageOS 。Nexus 6P 的代号为 angler, 首先可以找到官方的安装教程。 我们需要下载的东西: $ wget https://mirrorbits.lineageos.org/full/angler/20180521/lineage-15.1-20180521-nightly-angler-signed.zip $ wget https://mirrorbits.lineageos.org/full/angler/20180521/lineage-15.1-20180521-nightly-angler-signed.zip?sha256 -O lineage-15.1-20180521-nightly-angler-signed.zip.sha256 $ wget https://mirrorbits.lineageos.org/su/addonsu-15.1-arm64-signed.zip $ wget https://mirrorbits.lineageos.org/su/addonsu-15.1-arm64-signed.zip?sha256 -O addonsu-15.1-arm64-signed.zip $ wget...
  • 在 WSL 上开启一个 getty 到串口的方法

    为了测试一个硬件的 terminal ,想在 Windows 上向串口开一个 tty ,跑各种软件来测试。这件事情在 Linux 上和 macOS 上都有实践,但一直不知道 Windows 上怎么搞。经过了一番搜索,找到了 https://blogs.msdn.microsoft.com/wsl/2017/04/14/serial-support-on-the-windows-subsystem-for-linux/ 和 https://unix.stackexchange.com/a/123559 的方案。 以 COM5 为例: $ sudo chmod 666 /dev/ttyS5 $ sudo agetty -s 115200 ttyS5 linux...
  • 体验 Fedora on RISCV

    看到 RISCV 很久了,但一直没能体验。最近工具链不断更新, QEMU 在 2.12.0 也正式加入了 riscv 的模拟。但是自己编译一个内核又太麻烦,就找到了 Fedora 做的 RISCV port,下载下来试用了一下。之前试过一次,但是遇到了一些问题,刚才总算是成功地搞出来了。 官方文档地址: https://fedorapeople.org/groups/risc-v/disk-images/readme.txt 首先下载 https://fedorapeople.org/groups/risc-v/disk-images/ 下的 bbl vmlinux 和 stage4-disk.img.xz 三个文件,然后解压 stage4-disk.img.xz ,大约有 5G 的样子。之前作者在脚本里作死开得特别大,导致我以前光是解压这一步就成功不了。现在终于解决了。 然后启动 qemu 命令打开虚拟机: qemu-system-riscv64 \...
  • 在 VMware ESXi 上部署 vCSA 实践

    首先获取 vCSA 的 ISO 镜像,挂载到 Linux 下(如 /mnt),然后找到 /mnt/vcsa-cli-installer/templates/install 下的 embedded_vCSA_on_ESXi.json ,复制到其它目录并且修改必要的字段,第一个 password 为 ESXi 的登录密码,一会在安装的过程中再输入。下面有个 deployment_option,根据你的集群大小来选择,我则是用的 small 。下面配置这台机器的 IP 地址,用内网地址即可。下面的 system_name 如果要写 fqdn ,记得要让这个域名可以解析到正确的地址,不然会安装失败,我因此重装了一次。下面的密码都可以留空,在命令行中输入即可。SSO 为 vSphere Client 登录时用的密码和域名,默认用户名为 Administrator@domain_name (默认的话,则是 Administrator@vsphere.local)...
  • 在脚本中寻找 X11 的 DISPLAY 和 XAUTHORITY

    之前在搞一个小工具,在里面需要访问 X11 server ,但是访问 X11 server 我们需要两个东西:DISPLAY和XAUTHORITY两个环境变量。但是,由于它们在不同的发型版和Display Manager下都有些不同,所以花了不少功夫才写了一些。 为了验证我们是否可以连上 X11 server, 我们使用这一句: DIMENSIONS=$(xdpyinfo | grep 'dimensions:' | awk '{print $2;exit}') 它尝试打开当前的 DISPLAY,并且输出它的分辨率。接下来,我对不同的一些发型版,综合网上的方法,尝试去找到正确的环境变量。 对于 Debian: DISPLAY=$(w -hs | awk -v tty="$(cat /sys/class/tty/tty0/active)" '$2...
  • 在 macOS 和 Linux 之间搭建 tinc 网络

    一直听说 tinc 比较科学,所以尝试自己用 tinc 搭建一个网络。这里,macOS 这段没有固定 IP 地址,Linux 机器有固定 IP 地址 linux_ip 。假设网络名称为 example , macOS 端名为 macos 地址为 192.168.0.2, linux 端名为 linux 地址为 192.168.0.1。 在 macOS 上配置: brew install tinc mkdir...
  • 使用 Nginx 转发 VMware ESXi

    我们的 VMware ESXi 在一台 NAT Router 之后,但是我们希望通过域名可以直接访问 VMware ESXi 。我们首先的尝试是,把 8443 转发到它的 443 端口,比如: socat TCP-LISTEN:8443,reuseaddr,fork TCP:esxi_addr:443 它能工作地很好(假的,如果你把 8443 换成 9443 它就不工作了),但是,我们想要的是,直接通过 esxi.example.org 就可以访问它。于是,我们需要 Nginx 在其中做一个转发的功能。在这个过程中遇到了很多的坑,最后终于是做好了 (VMware Remote Console等功能还不行,需要继续研究)。 首先讲讲为啥把 8443 换成...
  • 搭建 FTP server behind NAT

    我们出现新的需求,要把以前的 FTP 服务器迁移到 NAT 之后的一台机器上。但是,FTP 不仅用到 20 21 端口, PASV 还会用到高端口,这给端口转发带来了一些麻烦。我们一开始测试,直接在 Router 上转发 20 和 21 端口到 Server 上。但是很快发现, Filezilla 通过 PASV 获取到地址为 (内网地址,端口高8位,端口低8位),然后,Filezilla 检测出这个地址是内网地址,于是转而向 router_ip:port 发包,这自然是不会得到结果的。 此时我们去网上找了找资料,找到了一个很粗暴的方法: iptables -A PREROUTING -i...
  • 使用 iptables 和策略路由进行带源地址的 forwarding

    陈老师打开他的服务器,突然发现 CPU 莫名高负载,然后发现是有一个用户被远程登录拿来挖矿了。但是这台机器在 NAT 后,所以登录的源地址全是 NAT 路由,所以不知道对方的地址是什么。我们为了能使用 fail2ban 来禁用多次尝试失败的 IP ,但又不想因为别人把 NAT 路由的地址给禁了,这样我们自己也用不了了。所以必须要让这台机器能够知道 ssh 的源地址,我们现在简单的 socat 方案不能满足这个需求。 需求: 可以在外网连 NAT 路由的高端口(如2222)来访问这台机器。 在内网中,既可以直接连它的内网地址,也可以连 NAT 路由的高端口来访问这台服务器。此时,由于连 ssh 的机器就在同一个子网中,如果保留了源地址,服务器发的包会直接回来不经过 NAT 。所以我们还是保留了 socat 的方案。 实现方法: 在...
  • 利用 UPnP 协议进行 mosh NAT 穿透的研究

    由于经常要从宿舍、教室等不同的 Wi-Fi 之间切换,但是 ssh 连接又总是断,所以想用 mosh 代替 ssh 。但是 mosh 也有它的问题: 不能滚动。这个可以在 mosh 中嵌套一层 tmux 解决。我目前写了一些自动 mosh 后打开 tmux 并且开启鼠标支持的脚本,但还是有缺陷。 在高端口 60000+ 监听 UDP ,这使得 NAT 后的服务器难以直接通过端口转发。如果直接转发到 NAT 后的机器,那么 NAT 后面如果有多台机器,这又失效了。 于是找了找网上的...
  • 在 Archlinux 上用 winbind 配合 pam 配置 Windows AD 认证登录

    作为不清真的网络管理员,为了配置一套完整的统一认证系统,陈老师采用了 Windows AD 的方法给这里配置统一认证。重装了系统,自然要把之前的统一认证再配到新装的 Archlinux 上。 参考资料: Active Directory Integration 首先安装相应的包: pacman -S samba 我们还没有配好 Kerberos,所以跳过。 然后配置 /etc/samba/smb.conf ,以下是一个例子。可以根据文档微调。 [global] security = ads realm = YOUR-AD-HERE workgroup = YOUR-GROUP-HERE idmap uid =...
  • 在服务器上安装 Archlinux 记录

    有一台服务器的 Ubuntu 挂了,我们想在上面重装一个 Archlinux 。我们首先下载了 archlinux-2018.04.01 的 ISO, 直接 dd 到 U 盘上,但是遇到了问题。 首先遇到的问题是,一启动之后就会花屏。我们一开始怀疑是 NVIDIA 驱动的问题,于是想改 kernel param 但是发现,这个 ISO 是 hybrid 的,我们在 macOS 和 Windows 上都不能 mount 上这种类型的盘。于是我们选择自己搞分区表。我们把 U 盘插到电脑上,然后在 Linux...
  • 使用 Cisco AC + AP 组合搭建网络实践

    有一台已配置好直接可用的 AC 在地址 ac-address 。我们需要搭建交换机 + AP 的网络,并且用一台 Linux 服务器进行 DHCP 从而给 AP 分发 AC 的地址。这里以 systemd-networkd 为例。 我们约定,vlan 2 上联外网, vlan 3 为 Linux 服务器和 AP 的内部网络。 接下来,配置交换机给 Linux 服务器的端口为 trunk...
  • 把 GDB 降级到 8.0.1

    在 macOS 上使用 GDB 需要 codesigning 。但是在 GDB 升级到 8.1 后这种方法不知道为何失效了。所以我安装回了 GDB 8.0.1 并且重新 codesigning ,现在又可以正常升级了。 对 Formula 进行 patch: diff --git a/Formula/gdb.rb b/Formula/gdb.rb index 29a1c590..25360893 100644 --- a/Formula/gdb.rb +++ b/Formula/gdb.rb @@...
  • 近来做 Stanford CS140e 的一些进展和思考(8)

    在上一篇文章之后,我其实还是很忙,但是一直心理惦记着这件事,毕竟只剩最后的一点点就可以做完了,不做完总是觉得心痒。 今天做的部分是调度。我们目前只在 EL0 运行了一个 shell ,每当触发 exception 时回到 kernel 进行处理,再回到原来的地方。但现在,我要实现一个 preemtive round-robin scheduler ,就需要管理当前的所有进程,并且维护当前的进程状态,当时钟中断到来的时候,决定下一个 time slice 要执行的进程,再切换过去。这个过程当然会遇到不少的坑。 首先,我们需要判断一个进程是否可以执行了。考虑到阻塞的 IO ,作者提供了一个优雅的方法:如果这个进程阻塞在 IO 上,那么,提供一个函数,在 scheduler 中调用,判断所需要的数据是否到达。这样,我们就可以一个循环把下一个 time slice 要执行的线程找到。如果找不到,就等待 interrupt 再尝试。 困难的地方在于,在启动的时候,切换到一个起始线程。并且在上下文切换的时候,在 process 1...
  • 近来做 Stanford CS140e 的一些进展和思考(7)

    在上一篇文章之后,我很长时间都没有在继续我这个项目,清明节刚好闲下来了我就回来继续啃它。Stanford那边已经结课,最后的 3-spawn 也只有一部分,剩下的部分不知道什么时候作者才会填上去了。 这次主要要写的代码就是,对异常的处理。这里的异常并不是我们编程语言中的 catch/throw ,而是硬件的异常。AArch64 和 x86 一样,也有不同的特权级别的区分,前者是 EL0~EL3 ,后者则是 RING0 和 RING3 。特权级别高可以往特权级别低转换,但是反过来,只能通过异常的方式提高特权等级,并且切换特权等级后只有固定的一些代码可能会跳转,这就是 exception handler/vectors 。这些函数可以知道是什么原因调用了他们,根据硬件规定好的文档,我们可以知道发生了什么事情,是对齐出错了呢,还是用户调用了 syscall 呢,等等。根据不同的情况,我们需要进行不同的处理。当处理完之后,我们需要考虑,跳转回用户代码的时候,回到哪里,提供什么值,不提供什么。 实现的话,需要很多步骤。首先是构造好 exception vector ,这里作者已经写好了一个宏(这里 @BenYip 遇到了一个 assembler 的 BUG ),直接用宏就可以把它写出来。然后,我们需要把它加载到当前 EL 的...
  • 最近比较忙

    最近一直没有更新我的 CS140e 系列文章,是因为最近一直忙于各种事情。等有空了再更新吧。
  • 偶遇清华吴文虎教授

    今天百团大战,正准备收摊的时候,天空工场那边来了一位长者,在和他们聊着什么。我很感兴趣,就上去听。老人大概已有八十高龄(后来查,是1936年生),但依然精神矍铄,首先和我们讲,作为工科的学生,一定在理解原理的基础上,多多去实践。他举了他自己的例子,他首先在电机系学习,后来,计算机系成立(当时还是自动控制系),他转到了计算机系,重新学起了计算机,说计算机编程学起来并没有什么难的。当年,苹果公司送过来了中国第一台 Apple-2 ,他们就把电脑拆了下来研究原理,又装上去继续工作。后来,他就在计算机系任教,教的正是《程序设计基础》这门课程。他十分重视实践,在第一年开课的时候就说,最关键的就是实践,安排了一些编程实验课,期中期末就是大作业。一开始有一些同学不重视实践,结果期末就挂科了。后来同学们就明白了实践的重要性,实践起来发现并没有那么难,最后就说,“吴老师,你说得对”。他又谈到了他的体育,他当年是北京长跑代表队的集训队选手,擅长一千五百米项目,他三千米只需要九分钟就能跑完。我们都感到自愧不如。我们说,现在的《程序设计基础》是徐明星老师在教,他说徐明星是他的博士生,邬晓钧也是他的博士生,他另外还有一个高徒我记不清楚了。他还是IOI中国队的前教练,听到我们有过一些OI基础,表示了赞许和鼓励。还有一些细节记不清楚了,记起来了再补充吧。
  • 〖新手向〗绕过 C++ 类的访问限制

    这是一篇很水的文章,面向萌新,已经知道了的可以自觉绕道。 昨天上课,有同学问,如果用户偷偷把 private 改成 public 再和原有的库链接,是不是就可以在用户代码里更改了。这个答案是肯定的。下面我们就做个实验: 首先,创建 good_class.h 和 good_class.cpp: class SomeClass { private: int data; public: int getData(); }; #include "good_class.h" int SomeClass::getData() { return data; } 然后,首先编译, clang++ -c good_class.cpp...
  • 近来做 Stanford CS140e 的一些进展和思考(6)

    在上一篇文章之后,作者终于更新了测试的用例,我的程序终于可以成功跑过所有测试,也成功在树莓派跑起来。不过,我的代码中很多地方的错误处理比较偷懒,往往直接 panic ,显然并不友好。同时,我想到了使用 cargo-fuzz 来进行自动化测试,果然,使用这个很快就修复了不少我没想到的会出错的地方,比如乘法溢出,目录项没有正确结束等等。目前还发现一个 timeout 的问题,研究发现大概是文件的 cluster chain 中出现了环,导致一直读取文件而没有停止。要解决这个问题,我目前想到的是 Floyd 的判圈算法,但还没上实现。等过几天,新的 Assignment 3 出了以后,再继续更新。希望作者少点跳票,多点勤奋,哈哈哈哈哈 更新:下一篇在这里。
  • 近来做 Stanford CS140e 的一些进展和思考(5)

    在上一篇文章之后,作者多次延期跳票之后(again),终于放出了 Assignment 2 Phase 3: Saddle Up 。这次,我们要做的变成了把已经写好的(错漏百出)的 fat32 的驱动搬到树莓派里面去,然后实现一些基本的 shell 命令: ls cat cd 等等。作者首先更新了老版本的新的测试样例,放了一些映像然后提供了预期的结果,结果发现,这里的 fat32 有一些不同,主要的就是 bytes_per_sector 不是 512 了,意味着物理的扇区和逻辑扇区并不一致。同时, sectors_per_cluster 也不是 1 了,需要考虑多个扇区的情况。同时, read_cluster 传入的 offset 也可能不再是第一个 sector 中的,所以需要做一个处理。对于物理和逻辑扇区的问题,作者推荐的方案是,把...
  • 近来做 Stanford CS140e 的一些进展和思考(4)

    在上一篇文章之后,作者多次延期跳票之后,终于放出了 Assignment 2 Phase 2:32-bit Lipids ,这两天就把只读 FAT32 写完了(不过封装得并不好,许多地方利用了 pub(super) 把变量可以访问的范围控制到 vfat 中,然后直接读,只有少数需要特殊处理的进行了函数的封装)。首先当然是研究了半天 MBR 和 FAT32 的结构,拿了不同来源的 FAT 结构说明进行对比和验证,最后终于把格式搞清楚了,先实现了 MasterBootRecord ,这个其实很好实现,以前也有接触过 MBR ,本身也很简单。然后就是根据 MBR 找到第一个 FAT32 的分区,根据偏移找到分区的开头,开头的第一个扇区就是 EBPB 数据结构,里面保存了 FAT32 分区的各种信息。根据里面的信息,可以找到 FAT...
  • 近来做 Stanford CS140e 的一些进展和思考(3)

    由于 Assignment 2: File System 延期发布,所以中间那段时间转向 MIT 6.828 稍微研究了一下。前几天放出了新的任务,在上一篇文章之后,我又有了一些进展: 实现了从内存中读取 ATAGS(ARM Tags) 信息的代码,从而可以获得内存大小的信息,根据这个信息,实现了 bump 和 bin 两种内存分配器,并且把二者之一注册为全局内存分配器,利用上更新了的 std 就可以使用需要动态分配内存的相关工具了。利用这个,我实现了 shell 输入历史的回溯,把输入历史保存在一个动态增长的数组中,再特殊处理上下键,把当前的行替换为历史。 这个过程也不是没有踩坑。一开始代码放出来了,但是题目说明还没出,我就自己按照代码做了 ATAGS 和 bump 分配器,后来做完了,看到说明出了以后,发现理解还是有偏差,把代码更改了并修复了分配器的 BUG 。看到 bin 分配器的时候,我按照网上的 buddy memory...
  • 近来做 Stanford CS140e 的一些进展和思考(2)

    在上一篇文章之后,我又有了一些进展:UART ,简易的shell ,修复了之前写的 xmodem 中的 BUG,一个可以从 UART 接收一个 kernel 写入到内存中再跳转过去的 bootloader 。 首先是 UART ,就是通过两个 GPIO pin 进行数据传输,首先在 memory mapped IO 上进行相应的初始化,然后包装了 io::Read 和 io::Write (这里实现一开始有 BUG,后来修复了),然后很快地完成了一个仅仅能 echo 的 kernel 。 然后实现了...
  • 近来做 Stanford CS140e 的一些进展和思考

    最近,受各路安利,剁手买下了 这个淘宝商家的树莓派的套餐C ,还买了许多 LED 灯泡、杜邦线和电阻,开始按照 CS 140e 学习 Rust 并且用 Rust 编译写一个简易的操作系统。Assignment 0 的目标就是编写一个向 GPIO 16 连接的 LED 灯闪烁。首先当然就是愉快地按照教程下载 bootloader ,下载交叉编译工具链,顺带装一个 Raspbian 到机器上,随时可以当成一个低性能的 ARM/ARM64 (实际上,Raspbian 只用了armv7l,没有用 64bit)机器来用,以后如果配上 @scateu 团购的 Motorola Laptop Dock...
  • 再次吐槽 VS 关于 scanf 和 scanf_s 的问题

    继上次的吐槽后,今天再次遇到同学因为 scanf 在 VS 下的 deprecation error 感到十分迷茫,在知乎上求助又因为拍照的原因被说,我就在此再次吐槽一下 VS 这对初学者很不友善很不友善的两点。 一点就是上面提到的这个,另一点就是程序结束后任意键以退出这一功能要做得更加醒目一点 。前者由于大多数新手在学习 C/C++ 的时候都会跟着书上或者网上的代码敲一遍输入输出的代码,很容易就会撞到这个问题。后者则会让新手习惯性地以为程序闪退了,没有出结果,而不知道其实是程序执行结束后关闭而已。
  • 我正在使用的两个 Emacs 的 Patch

    我在本地对 emacs.rb 进行了修改: diff --git a/Formula/emacs.rb b/Formula/emacs.rb index d0138cd..de3c5ff 100644 --- a/Formula/emacs.rb +++ b/Formula/emacs.rb @@ -4,6 +4,14 @@ class Emacs < Formula url "https://ftp.gnu.org/gnu/emacs/emacs-25.3.tar.xz" sha256 "253ac5e7075e594549b83fd9ec116a9dc37294d415e2f21f8ee109829307c00b" + patch do + url "https://gist.githubusercontent.com/aatxe/260261daf70865fbf1749095de9172c5/raw/214b50c62450be1cbee9f11cecba846dd66c7d06/patch-multicolor-font.diff"...
  • NAT64 初尝试

    最近宿舍里有线网络的 IPv4 总是拿不到地址,只能连无线网,不禁对计算机系学生的可怕的设备数量有了深刻的认识。不过,作为一个有道德(误)的良好青年,还是不要给已经枯竭的 IPv4 地址填堵了,还是赶紧玩玩 IPv6 的网络吧。然后在 TUNA 群里受青年千人续本达 (@heroxbd) 的安利,本地搭建一下 NAT64+DNS64 的环境。不过考虑到宿舍还是拿不到有线的 IPv4 地址,我就先利用苹果先前在强制 iOS 的应用支持 NAT64 网络的同时,在 macOS 上为了方便开发者调试,提供的便捷的建立 NAT64 网络的能力。 首先在设置中按住 Option 键打开 Sharing , 点击 Internet Sharing ,勾上...
  • 有趣的 Java 日期格式化问题

    今天在群里看到有人说, Java 的日期格式化有问题,如果用 YYYY-MM-dd ,今天的日期就会显示 2018-12-31 。我立马在本地用 Java REPL (aka Groovy) 跑了一下,果然如此: $ date = new Date() ===> Sun Dec 31 10:51:26 CST 2017 $ import java.text.SimpleDateFormat ===> java.text.SimpleDateFormat $ new SimpleDateFormat("YYYY-MM-dd").format(date)...
  • 在 macOS 上试用 Gentoo/Prefix

    前几天参加了许朋程主讲的Tunight,对Gentoo有了一定的了解,不过看到如此复杂的安装过程和长久的编译时间,又看看我的CPU,只能望而却步了。不过,有Gentoo/Prefix这个工具,使得我们可以在其它的操作系统(如macOS,Solaris等)上在一个 $EPREFIX 下跑 Portage ,也就是把 Portage 运行在别的操作系统,当作一个包管理器,并且可以和别的操作系统并存。 首先还是祭出官网:Project:Prefix。 首先设定好环境变量 $EPREFIX ,之后所有的东西都会安装到这个目录下,把 bootstrap-prefix.sh 下载到 $EPREFIX ,然后 ./bootstrap-prefix.sh ,会进行一系列的问题,一一回答即可。建议在运行前设置好 GENTOO_MIRRORS=http://mirrors.tuna.tsinghua.edu.cn/gentoo 由于TUNA没有对gentoo_prefix做镜像,只能把distfiles切换到TUNA的镜像上。 然后。。。 stage1… stage2.. stage3. emerge -e @world BOOM 经过 n 次跑挂以后,终于搞完了 stage3 ,然后...
  • Lsp And Cpp

    之前时间,巨硬发布了LSP(Language Server Protocol),目的是解决目前IDE和各语言的m+n问题。想法很好,不过直到最近,终于有我觉得可以用的工具出来了,并且已经代替了我在使用的其它的插件。 由于我最近主要就是做做程设作业,做做OJ这些,主要就是和C++打交道。所以我当然就开始找一些比较成熟的C++的LSP server。有一个 Sourcegraph 维护的 langserver.org ,上面有着目前的各个语言和编辑器/IDE的支持情况,我刚才提到的cquery也会加入到这个列表里去。从这个列表里可以看到,我用的比较多的Python和Haskell都已经有不错的的LSP server,我已经开始在本地体验pyls和hie了,感觉做得挺不错的。 回到C++,我的主力编辑器是Emacs,其次是CLion,而Emacs上的LSP支持 lsp-mode也在快速发展,与之配合的lsp-ui 也出现了很多很棒的功能。 下面开始编译并配置cquery: git clone https://github.com/jacobdufault/cquery --recursive cd cquery ./waf configure # to use system clang, append --use-system-clang ./waf build 然后配置Emacs:...
  • On Nginx Memory Pool

    今晚参加了 Tunight ,会长给我们讲了 Nginx 的一些内部运作的机制和原理。中间的时候,会长展示的代码中用到了线程池方面的一些函数,但是大多地方只有调用 ngx_pcalloc 而没有看到相应的对象释放的过程,于是在演示的最后,会长应大家要求对 Nginx 魔幻的线程池实现做了现场代码分析。 在分析的中途遇到了很多坑,最后才终于理清了内存池的工作原理。这里直接解释结论吧。以下代码均摘自 Nginx 1.13.7 ,代码都可以在官方仓库找到。 首先分析一下创建一个内存池的函数: ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) { ngx_pool_t *p; p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); if (p == NULL)...
  • Run Cpp In Jupyter Notebook

    刚刚在HN上看到了这么一个文章:Interactive Workflows for C++ with Jupyter HN ,终于可以在Jupyter Notebook里跑C++代码了,很开心,于是开始自己研究了起来怎么本地跑。 首先当然是更新一波jupyter,安装一波cling: pip3 install -U jupyter brew install cling 然后根据官方教程里的要求执行: cd /usr/local/share/cling/Jupyter/kernel pip3 install -e . jupyter kernelspec install cling-cpp11 jupyter kernelspec install cling-cpp14...
  • 用CPUID获取评测机器的CPU

    受用 CPUID 检测各大 OJ 测评机所用的 CPU(以及日常黑 BZOJ)的启发,我决定去测试一下徐老师自己写的OJ(名为Tyche)所跑的机器是什么CPU。于是我改造一下代码,用以下代码测评: #include <stdint.h> #include <iostream> #include <time.h> #include <cpuid.h> #include <sys/time.h> static void cpuid(uint32_t func, uint32_t sub, uint32_t data[4]) { __cpuid_count(func, sub, data[0], data[1], data[2], data[3]);...
  • 一个代替Pulse Secure客户端的工具

    清华的校外VPN服务使用的是Pulse Secure,所以在外网我们需要在客户端上安装Pulse Secure才能使用内网的info和网络学堂等网站.但是Pulse Secure一是非自由软件二界面难看,所以我找到了一个代替它的工具:OpenConnect. 安装后,输入以下命令: sudo openconnect --user 你的学号 sslvpn.tsinghua.edu.cn --juniper --reconnect-timeout 60 --servercert sha256:398c6bccf414f7d71b6dc8d59b8e3b16f6d410f305aed7e30ce911c3a4064b31 然后输入你的info密码即可.
  • 分析一个我第一次见的素数测试函数

    今天逛到这个连接,发现其中的第四种素数判定方法很有意思: #include<stdio.h> #include<math.h> int p[8]={4,2,4,2,4,6,2,6}; int prime(int n) { int i=7,j,q; if(n==1)return 0; if(n==2||n==5||n==3)return 1; if(n%2==0||n%3==0||n%5==0)return 0; q=(int)sqrt(n); for(;i<=q;){ for(j=0;j<8;j++){ if(n%i==0)return 0; i+=p[j]; } if(n%i==0)return 0; } return 1; } void main()...
  • 关于scanf和scanf_s的问题

    最近作为程设基础的小教员,收到很多同学的求助,关于scanf和scanf_s的问题已经遇到了两次,特此写一篇博文来叙述一下这个问题。 一开始,有同学问我, char a; scanf("%c",&a); 为什么会报错?我说,vs默认强制要求使用scanf_s函数,于是我建议这位同学把这个错误信息关掉了。嗯。经过百度,这位同学的问题解决了。 后来,又有一位同学问我, char a; scanf_s("%c",&a); 程序为什么会崩溃?我想了想,如果scanf_s和scanf是一样的行为,这段代码是没问题的。但scanf_s既然安全,必然是在字符串方面做了处理。这里的char*勉强也算一个?网上一查,果然,应该写成scanf_s("%c",&a,1);,字符串则要写成scanf_s("%s",str,sizeof(str)),来保证缓冲区不会溢出。 但是,这样解决这个问题又面临着不同的选择: 学习scanf_s和scanf的不同,把所有scanf换成scanf_s并做相应的修改。 这样当然符合了语言进化的潮流,也会让vs闭嘴。但是,scanf_s只有在C11标准中有,而且,根据cpprefrence.com上关于scanf的描述,只有在__STDC_LIB_EXT1__被定义且在#include<stdio.h>之前#define __STDC_WANT_LIB_EXT1__才能确保使用scanf_s能使用,当然在vs较新版本中是默认可以使用的。但是,程设基础的作业是要丢到oj上的,而oj上的编译器不一定支持这些,所以这个选项不行。 坚持用scanf,自己按照题目要求保证缓冲区不溢出,同时让vs闭嘴。 网上已有教程,已经讲的很全面了,大家可以根据这个教程把vs教训一顿。为了能在oj里跑,建议用里面的方法五到八。(个人最推荐在文件头添加#define _CRT_SECURE_NO_WARNINGS) 以后再遇到这个问题,我就丢这个连接上来就好了咯。yeah!
  • 一个搞笑的伸展树的Wiki

    光哲同学在群里发了这个链接,特别搞笑,特此分享: 伸展树 - 百度百科 伸展树(Spaly Tree,事实上在国内 IO 界常常被称作 Tajarn 发明的 Spaly Tree,与此同理的还有 Terap),也叫分裂树,是一种二叉排序树,它能在 O(n log n) 内完成插入、查找和删除操作。它由 Daniel Sleator 和 Robert Tajarn 发现,后者对其进行了改造。它的优势可以不断伸展枝干(一个月 2~3 次),从而使树冠散开,提高光合作用效率。木材坚硬,是重要的经济类乔木。与其他植物不同的是,伸展树可以进行出芽生殖,繁殖速度极快。
  • 回顾昨天的酒井知识竞赛

    昨天晚上,我作为蒟蒻组的一员在三教2102参加了酒井知识竞赛,并因此鸽掉了TUNA和Lab mU的迎新会hhh,不过运气好拿到了二等奖的好成绩,获得Paperang便携打印机一台。中间遇到了好一些网络方面的知识,这对于没有记忆OSI模型的我无疑有巨大的难度。下面是几道比较有印象的题目: 以下哪个不是编程语言? A. J B. L C. R D. K 这题不难,R肯定对,J见过,K略微有印象,选B IPv6链路层地址解析的协议是? A. ARP B. Neighbour Solicitation C. Neighbour Advertisement D. Neighbour Discovery 对于一个没研究过IPv6的人来说这只好蒙了。。。ARP是IPv4时代的,ND(Neighbour Discovery则是IPv6时代的新产物,把ARP和ICMP等协议的功能都包含了进来,并且有新的功能。之前样题里还出现过问IPv6中去掉了Unicast,Anycast,Multicast,Broadcast中的哪种,答案是Broadcast。 第一个把程序错误称做bug的是? 选项太多忘了,答案是Grace Hopper,因为当时一只飞蛾意外飞入了机器导致了故障,后来慢慢就流传下来了。 以下不是网络操作系统的是? A. Windows...
  • 华为随行 WiFi 2 mini开箱

    前段时间,我办了4G升级,移动送了一张副卡,有不少免费的流量,由于我的手机是iPhone不支持双卡,老爸就借了我他的GlocalMe当成MiFi来用,不过呢GlocalMe放在这里当然是大材小用了,所以我就网购了华为随行WiFi 2 mini,把我的副卡装上一个壳放进去就可以了!把这个MiFi插入电脑,会弹出一个目录,里面有Win/Mac的驱动安装文件,打开后在网络设置里就有HUAWEI_MOBILE的连接了,并自动打开网络配置界面。设置一下SSID和密码,就能正常使用了,手机连上也很正常,手机上可以下载HUAWEI HiLink来配置MiFi,挺爽的。随赠的有联通的上网卡,不过我准备在北京买个上网卡放MiFi里面用。
  • Farewell, Flash

    It’s time to say goodbye to Flash. HN #1 HN #2
  • In macOS Sierra, Karabiner-Elements finally support complex modifications

    In favor of this commit, Karabiner-Elements now supports the much welcomed yet long-lost feature, namely complex modifications that enable users to trigger complex keypress. Now I can achieve this: If I press...
  • 等时圆

    最近学校老师讲了一下等时圆。先从这个题讲起: 在同一个地方向不同倾角光滑斜面用不同的初速度上滑,到达最高点所用时间相等,求最高点的轨迹是什么? A. 直线 B. 椭圆 C. 抛物线 D. 圆 当时做这个题目的第一想法是把x和y座标表示出来: 然后就傻眼了,并得不到x与y的关系式。当然了可以求出几个点,强行带入二次曲线通式求解。不过想了想还是用解析几何的方法去做吧: 这么一代入,显然是圆。但既然这是物理题,可不可以用物理方法做呢? 可以,这就是等时圆。 啥叫等时圆? 等时圆就是,在一个光滑圆环上选择任意一点,让一个小球从这个点沿着光滑直杆到圆的最低点,无论这个点在哪里(最低点不算哈),时间都是一样的。怎么证明? 很简单:设小球与最低点连线与数值方向上夹角为,那么 你会发现t与无关。证明完毕。 其实也可以倒过来:从圆的最高点往各个方向下滑,到达圆周时间相等。 好了,到此为止内容都没什么,但你会想问这和前面那道题目有什么关系呢?这怎么等时圆?重力往下诶。运动可是往右上方。 Here comes the black magic :) 我们考虑向下滑到最低点的那个等时圆,在这个圆周上滑倒最低点的时间都相等。好,我们把这个图沿着竖直方向旋转180度形成一个球,想想这个球上每一个点到最低点时间是不是也一样?那么考虑逆过程,让小球从斜面上滑下来,我对刚才的球体再竖着切一刀,得到的平面不就是题目中那个吗?得证。 当然了最好能有动画说明,限于本人时间问题暂时不提供 ^_^
  • A Good Way To Show Git Diff For Compressed Files

    I have found a good way to track changes in .gz files: Add these to ~/.gitconfig: [core] attributesFile = ~/.gitattributes [diff "zip"] textconv = unzip -p binary = true [diff "gz"] textconv...
  • The End Of Senior Two

    Finally the end of Senior 2 arrives. I’m on the way to Senior 3. The summer vacation is rather short which is really common in China. These days I have been diving...
  • Exciting New Software Updates

    Just got a piece of great news: GHC 8.0.1 is out! See the announcement [here][http://article.gmane.org/gmane.comp.lang.haskell.ghc.devel/11928]. So excited! And Emacs 25 release will be out soon. Using Emacs 25.0.94 now. Many new features...
  • Interesting Links

    Having a bad cold. Really annoying. Okay, here comes the interesting links: https://glyph.twistedmatrix.com/2015/11/editor-malware.html http://kitchingroup.cheme.cmu.edu/blog/2016/04/07/Writing-hy-code-from-hy-code/ https://github.com/holomorph/transmission https://github.com/bergey/org-babel-diagrams http://ess.r-project.org/ http://projects.haskell.org/diagrams/
  • Tips On Git Shallow Clone

    Just learned a new tip on git shallow clone. As you know, some repository are really really large, such as emacs and linux. Cloning is slow and unstable. And there is no...
  • Listen And Write Subtitles Cameron

    Here is the subtitle: We meet in a week that could change the United Kingdom for ever. Indeed, it could end the United Kingdom as we know it. On Thursday, Scotland votes,...
  • Logo Is A Lisp Dialect

    Most of us have learnt how to use PCLogo to draw some graphics. Logo is a dialect of Lisp in fact, so most of us used a Lisp dialect at a early...
  • Some Interesting Links

    I’m here to share some interesting links. I do not have much time writing the blog now. Recently I have been working on CodeFalling/MacGesture on Github. If you are interested in it,...
  • Using Chinese Pyim

    Recently i have been using tumashu’s chinese-pyim. It’s great to write Chinese right in Emacs. But as the personal dict is empty, this must be a hard time for me to build...
  • Unix Nice

    I just saw this interesting tweet: Unix系统的每个进程,都有一个nice值。这个值越大,优先级越低。然后,还有一个nice命令,每运行一次,指定进程的nice值+10。它的意思就是做人要nice,把更多的CPU时间留给别人。nice值越高,你留给自己的份额就越少。 From hereby @ruanyf. And i didn’t known that until now. Cool! The name ‘nice’ is nice, too. Don’t worry if you can’t read Chinese. See...
  • Start Next Term Tomorrow

    My term starts tomorrow. Sad. Homework haven’t finished. I went to Guangzhou for GDKOI thie weekend, and i haven’t known the result. It should be bad. I have no confidence at all....
  • Building Emacs Git Version With Xwidgets And Modules In Archlinux

    First you need to install these packages: sudo pacman -S git autoconf automake gtk3 webkitgtk git clone --depth 1 https://github.com/emacs-mirror/emacs.git (or git protocol if you like) cd emacs ./autogen.sh all ./configure --with-xwidgets...
  • How To Create A Vpn

    Today i’m going to introduce how to create a vpn. First of all you need a VPS somewhere with a static ip. Then, choose CentOS 7 and use the script from here....
  • Screen Capturing Tips in macOS

    I’m sure many people have already known this. But i haven’t memorize it yet. How to screen capture: Shift+Command+3: Capture fullscreen. Shift+Command+4: Capture region. : Press space to capture window. : Hold...
  • News

    Oh StartSSL places its PKI in 360’s server. You know, i hate 360. SO please beware if the website is using StartSSL. Here is the link. And here comes the vim-tips: You...
  • Good Software Engineering Rules

    I saw a great saying: No code runs faster than no code. No code has fewer bugs than no code. No code uses less memory than no code. No code is easier...
  • And She Has Gone

    And eventually, she has gone at 20 o’clock. Real RIP this time.
  • Bad News From My Grand Grandma

    When I was on my way to dinner, a phone call came. It said my grand grandma was dying. She was born in Xuantong 2nd, which is 1910 in Gregorian calendar. She...
  • The Beginning Of My Blog

    This is the first blog here. I am talkative deep inside, but i do not have enough opportunities to express myself. Most of the listeners can’t understand me. So i would like...
在文末,让我们膜一下2017安徽理科状元申奥大佬吧: