Tutorial

教研室有台tplink不知道怎么回事,总是自己掉线,还是很奇葩的那种掉线,明明ip和网关都变0.0.0.0了,还是显示在线,导致自带的自动登陆功能不起作用。 之前都是手动check和重新登陆,实在是浪费生命,于是乎来个定时脚本搞定吧,反正教研室有24小时online的服务器。 整个任务大体上分为三个步骤: 分析tplink管理API 编写管理脚本 使用systemd timer定时启动脚本(当然cron也是可以的,但是作为Archer,怎么能不用最新技术~) 1. 分析tplink管理API 首先登陆http://192.168.0.1 (替换成自己的管理地址,下同),教研室的这个型号是WR842N,登陆界面及其简单,就一个密码框。一开始我以为是把密码用明文或者hash一下post给路由,但是填写密码后发现没有post数据,百思不得其解,后来几番搜索,找到一篇分析的好文,这篇文章不仅告诉了如何登陆,而且还分析的很详细。想了解详情的请参见这篇blog。至于代码,我做了简化,直接把chrome里监控到的header粘进代码发送,简单粗暴~ 2. 编写管理脚本 重点来了,先贴代码: #!/bin/python3 # -*- coding: utf-8 -*- import urllib.request import sys progArgs = [“get_status”, “login”] ip = […]

这个问题无外乎有三个难点: 什么是sum 什么是reduce 什么是维度(indices, 现在均改为了axis和numpy等包一致) sum很简单,就是求和,那么问题就是2和3,让我们慢慢来讲。其实彻底讲清楚了这个问题,很多关于reduce,维度的问题都会恍然大悟。 0. 到底操作哪个维度?? sum这个操作完全可以泛化为任意函数,我们就以sum为例,来看看各种情况。 首先是一维(按照tensorflow的说法其实是0维,后面会说)就是这样 a = 1 sum(a) = 1 那么看看二维的情况,为了看的更清楚,特意写成了矩阵的形式: a = [[1,2], [3,4]] sum(a) = ??? 仔细观察,那么问题来了,sum(a)到底应该是多少?有人说,当然是[3, 7](“横着加”[[1+2],[3+4]]),有人说 不应该是[4, 6](“竖着加”[[1+3],[2+4]])吗?还有人或说,不应该是10(全加在一起)吗? 谁是对的? 都是对的。 […]

$ uptime:输出最近1, 5, 15分钟的负载。 $ dmesg | tail:输出系统日志的最后10行,用于检查内核报警。 $ vmstat 1:输出系统核心指标,其中r, free, (si, so), (us, sy, id, wa, st)分别代表等待CPU资源进程数,系统可用内存数,(交换区写入,读取),(用户,系统,空闲,IO等待,其他CPU时间),参数表示刷新间隔/秒。 $ mpstat -P ALL 1:输出每个CPU的占用情况,一般若有一个CPU占用率特别高,则可能是一个单线程应用程序引起的。 $ pidstat 1:输出进程的CPU占用率。 $ iostat -xz […]

Traditional CS: CS110: Principles of Computer Systems CS161: Design and Analysis of Algorithms CS106A: Programming Methodology CS97SI: Introduction to Programming Contests CS143: Compilers AI/ML: CS221: Artificial Intelligence: Principles and Techniques […]

基础知识 线性代数 矩阵理论 概率论 随机过程 图论 数值分析 最优化理论 机器学习 数据挖掘 平台 Linux  语言 Python Linux shell 基础库 numpy pandas sklearn matplotlib or seaborn 框架 TensorFlow Pytorch Keras 常用模型 CNN RNN(LSTM) GAN 常用架构(包括transfer […]

随着TensorFlow学习的深入,有许多细节不得不注意,Stanford的tensorflow公开课就讲解了很多细节,记录于此,以供参考。 tf.constant()和tf.Variable(),为什么constant是小写,Variable是大写?因为constant是个op(操作节点),而Variable是个class(类)。 Variable的initialize其实就是assign初始值,所以,当定义一个Variable时,如果紧跟了一个assign操作,其实是不用initialize的,例如W = tf.Variable(10), assign_op = W.assign(100), 我们可以直接sess.run(assign_op)而不用sess.run(tf.global_variables_initializer())。详见源码,其中有一句是:self._initializer_op = state_ops.assign(self._variable, self._initial_value, validate_shape=validate_shape).op。注意,类似tf.Variable.assign_add(), tf.Variable.assign_sub()之类的方法仍然要求对变量进行initialize,因为这些操作依赖Variable的初始值。 constant是定义在graph(图)中的,而Variable是和Session绑定的。也就是说,在tensorboard中可视化graph时,可以看到constant但是看不到variable,且不同的session可以维护一个variable的不同值,例如sess1 = tf.Session(), sess2 = tf.Session(), sess1.run(W.assign(10)), sess2.run(W.assign(20)) 用另一个Variable初始化一个Variable时,要注意使用initialized_value()方法,例如W = tf.Variable(tf.truncated_normal([10,10])), U = tf.Variable(W2)是错误的,因为U使用W去初始化,在U初始化的时候,W很可能还没有初始化(TensorFlow的分布式,并行运行的特点所导致),因此,正确写法是W = tf.Variable(tf.truncated_normal([10,10])), […]

不得不说,archlinux真的是开发人员友好的…当然前提是能够接受足够新的软件环境(gcc都7.1.1了…) 安装Nvidia驱动,cuda,cudnn,配置环境变量一条命令搞定: # pacman -S nvidia cuda cudnn 对,你没有看错,就是一条命令,而且以后升级也是,交给系统,完全无忧。 如果不从源码编译的话,直接pip install tensorflow-gpu就好了,That‘s it! 如果从源码编译,请安装bazel,也是一条命令: # pacman -S bazel 然后参照官方教程编译安装即可。 比Ubuntu简单几个数量级:)

虽然用Linux好几年了,但是对shell脚本的掌握基本为零……最近需要做一些文件批量重命名,图像批量预处理,文本批量预处理的琐碎而重复的工作,于是乎下定决心好好学习一下shell脚本。于是找了一本口碑不错的shell脚本入门书—-《Linux Shell 脚本攻略 第2版》,是印度人Shantanu Tushar和Sarath Lakshman写的。边看边写博客系列(计划分九个系列完成)当做读书笔记,同时,也不完全是读书笔记,会加上一些解释的链接或者个人的经验:)当然,如果有人看,也算是做个“脱水版”的精炼shell脚本入门“指南”吧:) 基本的文件格式结构,运行规则:文件开头第一行 #!/bin/bash(这里可以是别的shell的路径),#!这玩意叫shebang,运行可以$ bash script.sh 这种运行方式首行的shebang就没什么用了,或者$ chmod +x script.sh 然后 $ ./script.sh。 命令间隔符:换行符或者分号; 是等价的,也就是说 $ cmd1; cmd2 等同于 $ cmd1 $ cmd2。 终端的打印:最基本的echo,$ echo “Hello […]

自从读研,论文阅读量直线上升,总觉得电子版读起来不如纸质的感觉好,最关键是电子版做笔记不方面。于是乎,和室友商量着买个打印机。因为是打论文看,所以对打印质量没有特别要求,只要公式清晰就行,因此为了节省成本,二手激光打印机是首选。 因为是寝室两个人用,所以网络打印机肯定是最方便的,但是贵啊……其次,考虑到成本,支持自动双面也会很划算(毕竟国产硒鼓二三十一个,而且还2000的打印量,还可以加粉,纸张的成本显得格外重要)。 目标明确:黑白激光,网络打印,自动双面,二手,开始淘宝~ 一番搜索,找到一款HP P2055DN的型号,自动双面,网络打印,但是要600多,有点贵,一番咨询,老板人很nice,推荐了HP P2015D,USB打印,自动双面,虽然不支持网络打印,但是便宜啊!当时突然觉得网络打印没那么重要了,一时心动就这个了。 买回来以后,发现,没有网络打印两个人用真的超级不方面。随时需要拔插不说,每次还要抱着笔记本蹲到角落里连上打印机……正有些懊恼的时候,看到了桌子角落里尘封已久的树莓派,心生一计,可以用这玩意儿做服务器啊,而且功耗还极低,完全可以一直保持开机状态,想想就很方便。于是乎一番搜索,有些教程极其复杂,有些有很简略,一时无所适从,还是变弄边看吧! 因为长久不用,树莓派的系统估计已经很过时了,不如格式化重来,于是到官网下载了树莓派的镜像安装系统,进行安装,这一步非常简单,到这里下载noobs,格式化TF卡,解压拷贝到TF卡里,连接电源,显示器,鼠标键盘,开机,按照提示安装即可。 接下来就是配置系统啦,首先是换源+升级系统。因为是教育网,用中科大的就很快,这里有配置教程。其实这里有个小坑,就算换了/etc/apt/sources.list文件中的源,apt-get update的时候还是会有一个官方源会卡住,那是因为/etc/apt/sources.list.d/raspi.list也需要配置,网上大部分教程没有涉及这个或者直接说删除这个文件,但是其实各大镜像是有这个的,只不过地址有点奇怪,以中科大源为例,要把这个文件中的http://archive.raspberrypi.org/debian/替换为http://mirrors.ustc.edu.cn/archive.raspberrypi.org/就OK啦。然后就是sudo apt-get update,sudo apt-get dist-upgrade。 接下来,安装USB无线网卡,以前本科毕业的时候,捡了两个TL-WN725N v2的小东西,没想到今天还用上了。然而悲催的是,驱动!这个不是官方支持的USB无线网卡,没有驱动……不过,一番搜索后,还是找到了,下载install即可,也很容易。教程,资源都在这里。唯一需要注意的地方是,文件下载可能需要翻墙,可以先用别的电脑下载对应版本的源码,拷贝到树莓派上install。 接下来就是安装cups,sudo apt-get install cups,然后输入sudo usermod -a -G lpadmin 自己的用户名(默认是pi,或者输入whoami查看),把自己添加到CUPS管理组,打开浏览器,输入127.0.0.1:631进入管理页面。 到Administration页面,添加打印机,添加驱动的时候注意,勾选上shared,并且最好上传ppd文件,不用默认的驱动,因为第一次我就是从页面里选的驱动型号,结果打印奇慢并且效果奇差,后来上传ppd文件就好了,ppd文件获取方式是,首先把打印机连接到计算机(Ubuntu 16.04,Windows不清楚……),然后到/etc/cups/ppd/文件夹下找对应型号的ppd文件,比如这个HP P2015D打印机对应的是:HP-LaserJet-P2015-Series.ppd,拷贝到树莓派上上传即可。 添加完成后即可对打印机配置,比如勾选自动双面等等,不同厂商的打印机有不同的选项,这个就参见说明了。 最后,打印测试页测试一下吧~ […]

在Android端使用TensorFlow

本篇文章中软件的下载需要科学上网支持。 主要参考资料为这篇文章,但是原文章涉及的TF版本已经过旧,有些小坑,例如android工程几个项目文件的修改,已经完全不同了。 TensorFlow的一个很突出的优势是跨平台,但是这方面的资料还比较少。 不过最近随着1.0版本的发布,文档的逐渐完善,在移动端的应用也越来越都多,并且官方增加了两个demo。其实应用在移动端还是比较容易的,只是因为官方的文档还是太省略,并且如果没有前两篇(1,2)的铺垫知识,看起来容易一头雾水。还有一个复杂的地方是,如果需要自定义app需要用到一些Android编程的知识,并且Google的Bazel编译工具也实在是太小众了。鉴于这些坑,将项目的心得分享记录于此,以供参考,节省大家的时间。 通过前两篇博客(1,2),我们通过重新训练获得了权重值文件(retrained_graph.pb)和标签文件(retrained_labels.txt),利用这两个文件和官方给的demo代码,就可以简单实现在移动端(因为我手上只有Android设备,因此仅针对Android)的实时识别。 编译Android端的app需要用到Android的SDK与NDK,首先下载这两个工具集。不过我推荐先下载Android Studio,使用Android Studio管理SDK与NDK,这样下载,管理和升级比较方便,而且毕竟以后可能还要调整demo,要用到Android的开发IDE。下载过程就不详细描述了,Android开发者网站有很详细的步骤。 有了SDK与NDK后,就可以着手利用我们重训练的权重值文件与标签编译app了。首先,需要告诉TensorFlow SDK与NDK的路径。浏览至tensorflow目录,打开WORKSPACE文件,在文件第10行左右,会看到以下代码: # Uncomment and update the paths in these entries to build the Android demo. #android_sdk_repository( # name = “androidsdk”, # […]