月度归档:2014年02月

通过树莓派局域网中共享影片和文件的尝试

[旧日志恢复……]

前些日子入了一台新小米盒子,性能上感觉还是比较一般,反应速度不是特别的快,但是勉强足够,对于1080P的片子有一些解码比笔记本顺畅多了。感觉好处在于终于可以回来之后不开电脑直接躺床上看剧了,而且作为粗粮手机用户,还能用到一些和手机交互的功能。其他东西就不多说了。

但是问题在于,每次更新硬盘内容还是超级麻烦的,要从电脑上拷进下好的电影到硬盘,然后又通过OTG线插到盒子上。手头上有一个树莓派,想了一下这货跑的不就是debian的一个变种吗,想起以前别人共享文件的办法,决定试试看安个samba上去试试,配好了做个网络位置映射,直接把迅雷什么的下载目录设定成映射的位置。配置的过程可以参考这篇文章。另外,为了能够挂载外接的硬盘,需要一个有源Hub。有了有源Hub,Pi也不需要电源线了,直接从USB就能供电。

刚配好之后做了个映射

 

 


Rasp-NAS
 

随便传了一个文件,100KB/S左右的速度,当场看傻了。自己照着网上广为流传的方法做了一下修改,主要是对缓存大小和异步读取/写入的块大小做了修改

 

 

这样做之后速度有了比较大的提升,然而峰值也仅仅是4MB/s的写入速度,大多数时候只有1~3MB/S的写入速度。而且传输的时候树莓派变得特别的卡,top一下发现:

top

感觉应该是因为挂载的硬盘是NTFS格式,拖慢了Pi的速度,使用ext3可能会好点。总体而言,Pi的性能应该是不够吧。

限制于这样的速度,这样的传输能力只能用来看720P的影片,打开一个稍微高码率的1080P影片,整个播放过程简直就是灾难。而且这个速度完全不适合用来传文件,目前手头上的极路由貌似是150M的传输速率,按理说10MB/S的速度还是能支持的,但是树莓派成了整个传输过程的瓶颈。

总而言之,要是让树莓派做NAS的想法在我这里还是不够实际,解决的办法看来最好还是买一个NAS或者试试带Atom和1000M网卡的板子了,好在后者价格还算便宜。

为树莓派添加动态域名解析

[旧日志恢复……]

如果要在公司或者其他地方访问家中的树莓派,在自己有闲置域名的情况下如果能通过域名访问那么是再方便不过了。

由于在家使用一般都是ADSL,拥有固定IP基本是很困难的一件事情,动态域名解析就成了唯一的选择。提供动态域名解析的之前有花生壳,但是使用花生壳的服务个人感觉整个过程并不是特别友好,在树莓派上的配置文件个人觉得还是比较不方便的。相比之下 DNSPod 的真是让人省心了很多,它所提供的API调用十分方便,通过API可以进行创建域名记录、修改域名记录等操作,并且官方提供了Python脚本,只需要简单的配置就能实现动态域名解析的效果。插一句,DNSPod提供的API真是让这项需求变得简单了许多。

虽然已经有了官方的脚本,我自己简单的进行了一些小小的改造,代码可以在我的 Github 上。这里主要修改的是配置方式和获取外网IP的方法。在这里我是用的是ip138提供的获取外网IP的方法:

 

 

通过请求此页面之后,可以通过文本解析得到此页面中包含的树莓派的外网IP地址,之后写入DNSPod上建立的记录之中。使用此脚本的方法请参加我的 Github 页面上的说明。

需要值得注意的是,在自己的家用路由器上是需要开启DMZ主机设置才能通过外网对树莓派进行访问的。此外,北京电信通的ADSL不管使用哪一种方式,都没法通过外网访问,这个还需要进一步的了解原因。

团队破冰活动

[旧日志恢复……]
1 概述

1.1 起因

昨天有一个新团队的团队破冰活动,原本的主持人因为比较忙没法参与,之后我就去接替了这项工作。之前从来没有参与组织过任何活动的我硬着头皮就去参与了这个工作。整个过程还算顺利~没见过世面的我决定还是把参与这次的这次活动记录下来吧。

1.2 破冰的意义

个人感觉破冰的意义其实主要意义在于认识各位新同事,减少甚至消除各个人之间的隔阂。而其他的一些关于团队文化,工作态度,做事方法的宣讲其实是和培训人有关系的,培训人的能力和口才决定了整个破冰活动过程中的一些较高层次上的成败。比如同样介绍做事方法,我在台上的宣讲必然效果是远远地比不上部门经理们宣讲的效果的。

1.3 其他

个人记录而已……轻拍。这里只选了一些想说的东西,并不是完整的一次破冰组织过程记录。

2 活动组织

2.1 激励的选择

既然是破冰活动,首先有的一个问题的就是大家都不认识,既然在不认识的前提之下,那么整个活动很有可能因为大家放不开,变得场面就很沉闷,如果加上是我这种闷瓜作为主持人,个人认为一定会让这次活动毁掉。

那么,选择一个方式让大家能够参与更加积极的激励方式,个人感觉就是一种通过激发大家的竞争意识,让大家愿意获取奖励,从而更加投入的参与到整个破冰活动中的手段,也是弥补没有强有力的演说者带动大家参与到破冰活动的一种策略。

本次破冰活动选择的激励是比较简单的,通过积分表示目前队伍的领先情况,之后选择了饮料和公仔作为奖品,并且奖品的数量并不是很多。个人感觉本次在奖品的价值和新意上并没有任何的亮点,但是限于资金,个人认为这样的激励只是作为一种象征性的存在,作为破的冰辅助手段还是可以理解的。如果选择了价值更高的奖品,在一定程度上个人觉得是一定会让参与同学更加投入的。

2.2 活动组织

破冰活动如果只是单纯的宣讲那么和新员工培训就完全没有太多的区别,必须要有活动来进行支撑,游戏就成为了活动的一个好选择。

参与组织本次活动之后个人感觉游戏选择有几个前提,分别是集体参与团队协作切合主题。下面会分别说说自己对这几个原则的理解。

2.2.1 集体参与

前面也说了团队破冰的一个目标是让大家都认识一下,至少要熟悉各位的名字,那么如何才能让大家都熟悉对方的名字呢?个人觉得在选择游戏的时候一定要选择那些能让每个人都参与到的游戏内容作为开场游戏,这也就是标题中的集体参与。

那么怎么能让大家都参与呢?自我介绍当然好像是最简单的方法,但是首先,在团队人数少的前提下记住各个人的新名字还算容易,人数一多起来只要一会儿没有提起,那么我想忘记人名是很正常的事情。考虑到我国文字的复杂性,一些复杂的姓氏名字就算记住了发音,也是难以写对的,工作之中邮件写错名字个人觉得真是很尴尬的一件事情。其次,自我介绍事实上我觉得没有太多效果,听众们始终都在接受,没有参与感,也许就是带过了。自我介绍环节玩手机的同学,搞不好过了一会儿会问:那啥刚那女生叫啥来着?这样的话自我介绍完全没有起到让大家初步认识的过程。

昨天的活动我们选择了如下几个游戏进行这一类型的互动:制作名牌真真假假姓名串烧。下面会具体说说这些游戏。

2.2.1.1 制作名牌

准确说这并不算是一个游戏,这个活动主要做法是发给每位同学一张A4纸,之后简单折叠做成三棱柱型,上面用记号笔写上自己的名字,同时还需要注音,之后放在自己身前。

首先,制作名牌这一个过程让大家都参与到了活动,其次,名牌会一直放在自己面前(参见各种会议前面放名牌的方法),如果同时记不住你的名字,那么只需要看看你的名牌就行,对于名字里有生僻字的同学还可以让大家明确你的名字的写法和读法,避免一些尴尬的发生~

2.2.1.2 真真假假

老实说我也没有想到一个更好的名字,那么我还是描述一下这个游戏的玩法吧。

游戏的玩法是首先每个人写下自己的N件事情(N表示分组数目),N-1真1假,可以是个人情况,也可以是兴趣爱好,这些信息主要的目的是增进大家对你的了解。首先要经历分组的过程,分组相关的内容将会在团队协作部分出现。每组一次全部上台,然后逐个首先再次介绍自己的名字(强化其他人对你名字的记忆……),之后悄悄告诉主持人哪一个信息是错误的,之后告诉大家这N项信息,之后剩余的N-1组抢答,每个队伍对一个人只有一次猜测的机会,一旦有抢答成功,那么本组下一位成员上场。

其中我们使用计分制度激励大家抢答,在N个组参加的前提下,若第一个猜出了假的项目,那么计分为N-1分,第二个则是N-2分,依次递减,若其他全部组猜错,则参与宣讲的组加N-1分。

个人觉得这个游戏首先编写自己的基本情况,抢答环节让每个人都能够参与到游戏中(编写基本情况都需要参与,抢答环节让其他组员参与),是一个集体参与的项目。这个项目目的在于大家首先互相继续熟悉名字,之后的竞猜环节相当于是交换个人兴趣爱好的过程,增进大家的相互了解。

主持人这里我感觉首先是维持现场抢答秩序,另外还需要根据人数确定是否全组都进行这个游戏,如果人数太多,可以考虑每组选择一部分人进行这个游戏。

2.2.1.3 姓名串烧

游戏说起来感觉比较麻烦。

首先每组选择2人进行这个游戏,之后大家分组站好,围成一圈,第一个首先说,“大家好,我是来自A(地区)的a(姓名)”,第二个个人仍然是与第一个人同组,之后第二个人与第一个人同组,第二个人说,“大家好,我是来自A的a旁边的来自B(地区)的b(姓名)”,之后连续的两个人都同组,第三个人需要说的格式是“大家好,我是来自A的a旁边的来自B的b的旁边的来自C(地区)的c(姓名)”,剩余的人以此类推。

这个游戏一样有积分奖励机制,由于到了最后越来越难,那么积分的策略可以是,例如有N组参加,在第4组断掉接龙,那么这一组的前3组都能获得积分,积分顺序为3,2,1。如果没有断掉则得分为最后一组得N分,倒数第二组得N-1分,以此类推。为了公平起见会从每组开始都进行一轮,即ab一组,cd一组,ef一组,那么会进行三轮,第一轮从a开始,第二轮从c开始,第三轮从e开始,最后游戏结束。

同样的,这个游戏还是在强调重复姓名,同时也有告诉各位新成员自己的家乡,我认为大家的乡土观念可以让成员更轻松的认识其他组员,从而达到了集体参与的目的。

2.2.2 团队协作

团队协作方面选择的游戏和策略主要由:拼图分组盲眼报数我说你做手工合作

2.2.2.1 拼图分组

首先要说一说为什么要设定这样一个环节。本次团队破冰有来自不同工作岗位的同事,比如可能来了前端、测试、研发、运营的同事,那么由于大家已经在一起共事一个月了,自己的职位的同事可能已经熟悉了,如果采用自由分组,那么很可能是本职位同事抱团,这样的破冰并没有起到一个应有的效果。而强制打乱分组未免看起来趣味性不足。

根据上面遇到的问题,这次采用拼图的方法,即首先根据分组数目打印出对应张数的图片,之后等分裁成多片,之后随机分发给大家,让大家自由分组。

另外一点,分组希望能够让人形成抱团的感觉,最好的结果是组内外向的成员带动内向的成员更加投入的进入到这次活动之中。

这一过程有点意思,可以看到哪一些人在活动中更为主动,哪一些人更为被动。个人觉得可以对一个人的性格有个简单的了解,至少可以猜测各位成员外向与否。

2.2.2.2 盲眼报数

本环节活动过程是积分最高和最低的的两组打乱顺序站好,同学们闭上双眼,大家逐个报数,不需指定开始人,之后如果有人同时报数,则重新开始。之后积分次最高的和次最低的两组重复这一游戏。用时最少的组合得分最多。

这个游戏的意义在于可以和同事分享沟通一下如何在工作之中的灰色地带处理事情的问题,因为工作中有一些问题可能是自己没有负责的但是可以去进行的工作,这样的工作可能看起来没有人在处理,但是也有可能已经有同事在着手处理,如果自己这时候介入,那么就是像是游戏中的重复报数。

2.2.2.3 我说你做

本轮不计分,单纯游戏。

这个游戏分为两个部分,同学们都要闭上眼睛,一个部分是主持人说,同学们做,但是同学们不能问问题;一部分是同学代表上来说,同学们做,但是可以问问题。

具体过程是主持人可以执行纸的对折、去角、旋转等操作,之后同学们跟着完成,最后检查同学们的纸张完成情况,检查形状是否有差别。

在第二阶段,同学们问问题同学代表只能用是或者否回答,而且每人只能问一个问题,在每一次操作中。

在这里可以和同学们讨论在合作中如果进行沟通,可以让同事分享对于沟通方面的感想。

2.2.2.4 手工合作

这一个游戏可以用做手工这个来概括。这个手工合作可以看做我说你做的扩展。

本次选择的是做笔筒这个游戏,即发4张A4纸,然后首先给5分钟给大家进行沟通,但是坚决不能让大家接触纸张,只能动口。之后给5分钟给大家完成,期间只能动手,不可以沟通。最后完成之后放入两只马克笔,检查笔筒是否能够直立,比拼外观和牢固程度。

 

 

 

笔筒
一个小组同学完成的作品
 

这里个人感觉主要是考验沟通和执行能力,之后可以让大家讨论沟通和执行在工作中的关系,以及合作过程中的感想,比如需求要减少二义性(柱状笔筒到底指的的圆柱还是棱柱?),需求要有根据(做成三角形笔筒是因为三角形结构很稳定),执行要迅速(为什么时间相同,一些组完成了笔筒而自己没有呢?),执行时要注意分工(女生心细,负责折纸,男生力气大,可以加工多次层叠后的后纸张)。

2.2.3 切合主题

切合主题是一个很大的话题,但是可以在活动中穿插。

穿插主题可以是在游戏结束之后的讨论中进行,但是个人觉得时长需要控制,而且主持人可以首先选择观察到的外向的人进行发言,从而带动气氛。此外可以选择优胜队进行发言,发言时首先可以让优胜队对胜利的结果进行陈述,而不是直接往主题上走,主持人之后可以根据情况,引导优胜队把游戏结果和主题结合,带动大家的讨论气氛。

单纯的做游戏,而不去思考游戏之于破冰主题的意义,我认为这样的游戏对于这样的活动来说是没有意义的。

例如选择手工合作这个游戏,一个目的就在于切合破冰活动中想要贯彻的主题——高效沟通,迅速执行。之后游戏结束之后的讨论也是围绕着主题进行的。

2.3 活动后期工作

主要包括颁奖环节和影像资料记录环节(就是拍照啦~),同时还有一次完整的总结过程。

在彻底结束之后,发出邮件周知本次破冰活动,可以在内部沟通群或者社交网络上讨论这一问题,邀请参加破冰活动的同学参与话题,比如进行照片吐槽等活动,从而进一步让新同学们能够更加放松的进行沟通和熟悉。

3 其他

3.1 主持人的作用

主持人个人认为是个重要的环节,主持人作用至少要有

  • 梳理流程,促进完整的活动有序进行(至少不会忘了这个游戏下一个活动是什么……)
  • 活跃气氛(能在冷场的时候说一些活跃气氛的话)
  • 能引导和总结活动以及活动过程中的讨论
  • 记录活动中的各项事件,例如拍照、录像等等过程

3.2 存在的问题

由于第一次参与这样的活动,其中一个环节个人认为处理的不是很理想。

本次活动有一个技术问答的环节,由于没有彻底了解参与同学的技术分布,造成了出题过程中技术偏向过于严重的情况,导致一些同学根本没有机会回答问题,间接的降低参与度。这里个人觉得以后组织活动需要注意参会人员的偏好问题,提前做好准备。一定要选择尽量能集体参与的活动。

BackWPup不能备份的一种可能性

BackWPup是一款非常赞的WP备份插件,可以自动增加定时任务实现对Wordpress的备份,并且可以指定目录文件以及数据库的具体备份规则,并且提供了备份到Dropbox的功能。不想折腾的话用这款插件是非常适合的。

由于VPS性能比较一般,为了能够提高响应速度,使用了Wordpress的Memcached插件做缓存操作,这样可以减少数据库的查询操作,经过测试提升速度还是比较明显的,用法参见我爱水煮鱼

在没有一次的自动备份完成后,由于新增了一些配置,决定自己手动备份一下,点击 立即执行 手动备份计划时,却被通知“每周备份”正在进行中( 每周备份 是我设定的一个备份计划的名称),无法进行备份操作。

简单看了一下BackWPup的代码,发现这里读取的是缓存中的 site-options 类型的数据,而在Memcached插件的readme中找到可能缓存的数据组中包含了这一数据,并且在Memcached插件的object-cache.php文件中,发现默认超时为0,即缓存的数据不失效,那么应该是上一次写入缓存标记BackWPup正在执行的数据尚未过期,所以引起的这个问题。

解决方法目前就是直接用 kill -9 杀死memcached的进程,之后手动执行备份操作。

这样做坏处就在于缓存都没了,后面打算想想办法如何能够针对这一插件做一些特殊处理。

Mediawiki 登录操作

Mediawiki是一个广泛使用的wiki系统之一。

整个wiki的搭建过程十分的简便,几乎是各种下一步的傻瓜安装方式。安装时在有Memcached的机器的前提下,强烈建议配置上Memcached,在配与不配Memcached这个选项上,配置了Memcached之后速度会有明显的提升。

在使用wiki的过程中,可能我们需要对外公开wiki的内容,但是不能让未授权用户编辑的情况,这时候就需要使用认证。在官方网站上有很多的认证插件可以选择,不过有时需要加入自己使用的wiki系统的一些特性的时候(比如用公司的统一登录接口),插件就不一定适用了,需要自己编写插件。

基本信息

下面是Mediawiki默认的user表表结构,在下文中对于表字段的操作依据都来源于下方:

插件编写

关于插件的编写,可以首先看看官网上对于认证插件的说明,自己尝试编写了两种登录的方式,一种是通过继承 AuthPlugin 类并重写 authenticate 方法实现,另一种是编写 UserLoadFromSession 的对应处理方法处理利用现有的Cookie进行登录的方法。第一种方法个人觉得适合使用同一登录的情况下使用,第二种方法适合wiki与提供认证的服务处于同域的情况下使用,实现同步登录。

重写 authenticate 方法

首先我们要做的就是继承 AuthPlugin 类,并且将标记认证对象的全局变量 $wgAuth 设定为一个这一类型的对象。

参见 AuthPlugin 类中 authenticate 方法的定义:

需要实现的就是一个传入用户名密码并在验证之后返回结果的方法。用户在wiki点击登录动作发送来的用户名密码将会在这个方法中得到认证,利用使用公司邮箱密码登录,利用统一的LDAP登录接口获取数据,判断是否登录成功。

对于登录成功的,应当返回 true,登录不成功的,应当返回 false

但是,在使用外部确认的登录方式的情况下,仍然需要在wiki数据库中的 WIKI_TABLE_PREFIX_user 表中建立用户(WIKI_TABLE_PREFIX_ 表示是),在认证通过之后,需要构建一个 User 类的对象,并且将表示当前登录用户的全局变量 $wgUser 设定为生成的User类对象。例如登录成功之后返回用户的用户名,假设用户名是唯一的情况下,可以在数据库中检索出相关的数据,构建用户对象。

启用这一方式进行登录验证还需要在wiki代码根目录下的 LocalSettings.php 文件中引入这一文件(根据实际位置决定)。

如果是想要将wiki通过iframe形式加入其它页面的,记得还需要在 LocalSettings.php 中设定

Mediawiki默认是不允许wiki被iframe加载的。

用如下代码大致可以表示整个方法的实现:

编写 UserLoadFromSession 的对应处理方法

在请求数据的过程中, 通过注册到 $hooks 中的方法,可以进行进行验证($hooks 参见官方说明,是Mediawiki中可以让用户自定义方法在特定情况下使用的机制),对于这个方法,名称可以任意取,但是参数必须为:

即传入一个 User 类的对象和一个标记用户是否已登录的布尔值,其中布尔值用于确定用户登录状态。

此方法的返回值,官方文档建议一直返回 true (即In any case, return true)。

对于判定用户是否登录,在同域的情况下,自己尝试的思路是检查Cookie中是否带有指定的字段信息,例如token值以及用户名,将其与数据库中的数据进行比对,通过则构建一个用户对象并将其赋值给 $wgUser 全局变量。

可以在上述类中添加如下代码完成功能:

这里需要注意token是应当有超时的,我的处理方式是在user表中增加如下一个字段来记录超时的时间戳:

通过在取回token的同时取回超时时间戳,并与当前时间戳做对比,若当前时间戳小于超时,则认定未过期。

如果需要实现同步登录状态,那么在还需要在主要的登录环境中在退出时,取消用户登录状态,例如将token字段置空,这样可以标记用户已经退出。同时也要对直接从wiki登录的用户做处理,可以针对 UserLogout 这个hook编写一个处理方法,名称任意,在这一处理方法中将token字段置空。在这里需要在代码中注册 UserLoadFromSession 以及 UserLogout 对应的处理方法:

可以考虑使用Redis或者Memcached缓存token等信息,并且设定上数据超时,能减少数据库访问并且相应速度更快。