我最近看到了Matrix67大牛关于我们需要怎样的数学教育的一篇文章,有感而发。在数学方面,我确实不怎么样,有时候逛逛Matrix67的博客,感受到一些数学之美。然而在信息学方面,虽然说我并未接触过多少“正规”的信息学教育,但我从一些边边角角中,发现了我们的信息学教育真的很有问题!本文带有强烈的主观色彩,也许我没有什么资格能够说这些话,但是这些就是我最真实的感受和思考。

《信息技术》

我记得以前在机房培训竞赛时,偶然间看到了讲台上一本《信息技术》。我随即翻了一下,一股怒火熊熊燃起,便说了声:“这不是误人子弟吗!”老师苦笑了一下,说:“你才知道啊,这个是高二的课本……”

在这课本里,大概写了一些计算机的基本知识,包括一些常见图标所代表的文件类型。不说别的,就说说这一点。没记错的话,那些图标应该是98时代的吧?试问现在谁还在用Win9X?现在微软的桌面操作系统中,WinXP、Win7两个应该是最主流的,相信00后可能连98长什么样的不知道,试问你列出这些图标有什么用?再者说来,图标极易改变,现在很多电脑从电脑城抱出来时,系统的主题就已经不是默认的了,图标也随之改变,那书上这些图标又有何用?

如果真的想让学生们了解各种不同的文件类型,就应该试着从文件本身告诉他们,而不是只从表象。就因为只注重表象,才使得我们很多的学生难以在真正的计算机世界遨游。那么教教扩展名怎么样呢?扩展名也是表象,因为它可以更改。况且在Linux中,很多文件是不用扩展名的,比方说一个bash脚本和一个二进制文件,都可以不要扩展名,只要它们都有执行权限。不过话又说回来,在Windows中,掌握常见的扩展名确实也很重要,这样就可以从扩展名中大致判断文件类型。

这仅是一个例子,但不得不承认:现在的信息学教育,太注重表象了!

我们需要的,是那种即使你换了马甲我们也认识你的教育。

OUT!!! Read on →

前些天中午hzh写在后黑板,说三天后公布答案,结果那天晚上我解出来了,哈哈,挺有意思的一道题目。据说是经济学的经典模型,而且可以延伸出很多问题。原题如下:

有5个海盗他们抢到了100金币,他们从1号开始轮流提出分金方案,如果有一半及以上的人同意这个方案,那么就按这个方案执行,否则将提出方案的这个人投入海中喂鱼。以此类推,假设每个海盗都是绝顶聪明的,那么1号最多能得到多少金币?

受到Matrix67大牛上次那篇There is always a bigger fish的影响,看到海盗分金总是想进行状态转化,于是设海盗数量为n,从1开始推:(设Mi为第i个海盗分到的金币数量)

当n=1时,M1=100

当n=2时,2号海盗必不同意1号的分金方案,1号被杀,转化为n=1的情况,2号海盗得到100金

当n=3时,2号海盗必须同意1号海盗的分金方案(否则若1号被杀,则转化成n=2的情况,2被杀),所以1号提出的方案一定被通过。因此,1号可以提出(M1, M2, M3) = {100, 0, 0}的方案,并得到100金。

麻烦的事情发生在n=4时: Read on →

本人一直使用的是无线路由上网,怎奈笔记本上的Intel Pro/Wireless 3945ABG十分的不耐用,信号在Windows下勉勉强强,但在Linux下完全扫描不出信号……试了N方法,都没办法,只好再买一个网卡啦……于是就入手号称世界最小的USB无线网卡EDUP EP-N8508,在Windows下表现优秀(好歹也是802.11n啊,刚刚好配我的路由),现在主系统改到Ubuntu上,却发现竟然找不到设备……看来我这个Linux 小白要第一次尝尝装驱动的滋味了~!

EP-N8508的芯片是RTL8188CUS,好在Realtek提供了很丰富的驱动,包括了Linux。到Realtek网上查找,找到了RTL8188CUS的驱动下载页面。下载Linux driver for Kernel 2.6.x,是一个压缩包,tar解压缩后,得到一个文件夹RTL8192CU_8188CUS_8188CE-VAU_linux_v2.0.1324.20110126:

1
2
cd RTL8192CU_8188CUS_8188CE-VAU_linux_v2.0.1324.20110126
sudo ./install.sh

如果编译没有出什么问题,这样子就安装好了~!每次更换内核,都得重新安装。

注,本文同样适用于RTL8192CURTL8188CE

如果Network Manager提示未托管,则可以看看下一篇文章的解决办法。

话说安装完驱动,重启几次后,遇到一个很郁闷的问题,Ubuntu的network-manager竟然显示“设备未托管”,囧死了。经过多方面查找,终于有办法了:

打开/etc/NetworkManager/nm-system-settings.conf(记得要用sudo提权),找到[ifupdown]这一段,把managed=false改成managed=true即可~!

保存后,运行:

1
sudo service network-manager restart

再看看Network Manager,是不是好了? 如果这样操作后,“启用无线”不可用,重启即可。

Network Manager设备未托管

(Notice: Clicking a picture can see the large picture)

As we know we can’t visit some websites such as Facebook and Youtube in Chinese mainland because of something that we all know. Of course, we can use some software to “Jump across the wall”. If you’ve ever searched for 翻墙, you may be disappointed because 翻墙 has been hidden in Baidu. And if you searched 翻墙 in Google, you’ll find that the page cannot be displayed. So can’t we visit those wonderful webpages? Yes, we can! With the help of Tor, we can easily connect the outside network which has been forbidden by the GFW.

So, what are we waiting for? Let’s start!

First at all, you should download Tor and then install it. To get it, you can visit:https://www.torproject.org/download/download.html.en. For Windows users, I advise you to download [Stable Vidalia Bundle works with Windows 7, Vista, XP]. For Linux users, I’ll write it in another article. After finishing downloading it, you need to install Tor. I think it’s not difficult under Windows to install a software. By the way, remember to install Tor+Vidalia+Polipo together. If you like using Firefox, you can install Torbutton(It’s useful).

Set the bridgesNext, run Vidalia. You’ll find that you can’t connect to Tor Network. Yeah, because you’re in China now. Your ISP blocks connections to Tor Network. So let’s solve the problem. Click on “Setting” in Vidalia Control Panel. Switch to Network tab and select “My ISP blocks connections to the Tor network”. At the same time, visit https://bridges.torproject.org/ to get the bridges. Add them into your Vidalia. Now stop Tor and start Tor again. Wait for seconds, you’ll see that you’re online.

Then, set your browser. If you’re using Internet Explorer, follow me. Internet Options -> Lan setting -> Address:127.0.0.1 Port:8118. (Why the port is 8118, you’ll know it in my next article.)

Now, all the rest is to wait for finishing connecting to the Tor network. If you are successful in connecting, try to visit some websites that are forbidden before. There’s a suprise!Successful in connecting the Tor network

Read on →

前几天翻开noi导刊,看到一题关于用1×2的骨牌密铺矩形的题目,最后一个优化方法是用了这个公式(来自维基百科:http://en.wikipedia.org/wiki/Domino_tiling)。相当牛逼,不多说,上公式:

下面是用Mathematica代入了几个m,n的计算结果: Read on →

The RTCLP——The Randomly Three Color LED Project,今天终于完成了(其实也就从昨天开始搞……)。顾名思义,由RGB三色LED灯合成颜色,组成一盏变化的“灯”,灯的颜色是随机变化的,并且带渐变。实际上The RTCLP是上次讲的基于软件的PWM的应用,因为确确实实里面用到了上次的PWM.c。

说下思路吧,三路PWM控制RGB三种颜色,为了增强亮度,就将每一路又复制两份(PORTC->PORTA、PORTB)。开始时准备打一个颜色表,然后定时切换,后来发现效果不理想。想想,既然这次用了16.9344MHz的晶振,那干脆引用用随机函数吧,反正速度够快。事实上也确实是,产生一次随机数只要73μs。写了一个SetPWM(char,char,char),用来修改亮度,实际上是渐变的,每一次+1或-1,直到到达目标。本想写一个for简介一点,但是想到还要写个全局数组,而数组相当占时间(其实是懒啦,毕竟晶振够快),所以就用老土的Copy&Paste写了三次。SetPWM里面的那个delay就是用来控制颜色变化的快慢的。其他方面基本上没有什么好说的了。

挺郁闷的是,要过年了没有提前买元件,所以LED灯都凑不齐……╮(╯▽╰)╭要三个高亮散光的LED,结果只有一个高亮散光的R、一个普通亮度的G、一个高亮聚光的B……过几天再弄弄吧……

代码如下: Read on →

这学期的期末考,算了,不说了,悲剧……在考物理、化学时因为太无聊,所以就花了几个图来消磨时间……本想画个雪花的,想到还要擦掉1/3,就放弃了。

昨天上午研究完了基于硬件的PWM,由于懒得去找电机,所以干脆下午就开始研究基于软件的PWM。动机很简单,因为PIC16F877A只支持2通道的PWM,要是多一点,那就麻烦了,岂不是还得用专门的芯片?所以还是自己研究一下基于软件的PWM。

基于软件的PWM,注定要占用CPU许多时间,所以频率不能很高。比如100Hz,一个周期就是1s/100Hz1000=10ms,一个周期实现10档占空比调整(10%,20%,…,100%),那么一档的时间就是:10ms/101000=1000μs。1000μs能干嘛呢?对于4MHz的晶振来说,就是1000条语句,所以时间很紧。

不过实现的原理很简单,用TMR2精确定时(如果选用TMR0需要自己冗余误差),每一档进入一次中断。在中断里面判断是否到达时间,到达的话就修改引脚的输出。还是以上面100Hz,分10档,晶振4MHz,控制6路I/O口说起:
  1. 要实现100Hz,也就是一档1000μs,那么TMR2的预分频设为1:4,PR=249,这样每次溢出的时间就是(249+1)*4=1000μs,刚刚好。(TMR2的优势在这里高度体现o(╯□╰)o)
  2. 软件方面,设置一个_pwm数组记录每一个通道的占空比,sta数组记录每一个通道目前的时间是多少。则当pwm[i]=_sta[i]时,开始输出低电平;当_sta[i]>_maxpwm时,一个周期结束,_sta[i]清零,同时开始输出高电平。
  3. 为了方便以后修改以及自定义方便,设置了_maxpwm规定最大的占空比,_maxpwm越大,实现的效果就越精细。
  4. 通过void PWM_Init(const char t2con, const char pr2)来开启PWM模块,t2con为TMR2的参数,pr2就是PR2。
  5. 通过void PWM_SetPWM(const char index, const char value)来设置每一路的占空比。
  6. 而void PWM_interrupt()则要加进中断里面,使单片机能够处理TMR2的中断。void PWM_interrupt()里面就是关于PWM的详细实现。
  7. 至于_T变量,可以用来实现多任务系统,具体不多说。下面的示例因为太简单,所以没用到_T,而是用老土的delay。_T变量参考第1个通道,把第一个通道变成0当作一个周期结束。
  8. 为了项目方便,可以建立一个头文件,将这些函数、变量在里面extern。

再次强调:做PWM这种事情是很耗CPU的!比如控制8路I/O,需要时间就要:612μs,请问还有多少时间留给其它事情?所以我建议要实现软件PWM,要么晶振加快,要么就单独搞个芯片出来,要么就是限制I/O口数量。

下面就详细看看代码是怎么实现的(不加注释,根据上面自己应该可以理解,不懂再回复): Read on →