作为一个(曾经的)内核开发者,弄到块板子怎么能不重新编译内核?系统配好跑起来后的第二件事,就是编译内核了。在树莓派上编译内核很简单,基本上就是按照官方文档跑脚本,先放GitHub上的Script传送门build/kernel.sh

系统简介

文件系统

树莓派的文件系统设计还是不错的,能比较方便地更新内核和各种固件。整个文件系统分为两个部分:Fat32分区和Ext4分区。Fat32分区是mount到/boot上的,里面放了内核和启动的核心固件;Ext4就是一般的根文件系统了,放其他的所有东西,包括firmware和各种ko等。这种设计免去了用户烧录的麻烦,只是他们的bootloader没有开放源码,对于极客来说是很不爽的事情。
所谓的系统更新,就是每次编译kernel之后,直接把生成的文件放到特定的地方,重启就行。这也是为什么系统自带的工具rpi-update可以自动更新内核、firmware等等一切东西。

硬件的选择和启动

树莓派一代和二代用的两个不同的ARM芯片,这个差别在操作系统中并没有体现出来,我是指:官方提供的系统镜像是同一个。开始我很奇怪,后来看到了它的文件系统,才明白,它是靠不同的kernel文件名来区分的。这两种板子的platform分别叫”bcm2708”和”bcm2709”,启动的时候bootloader会根据硬件情况自动区分,读取不同的kernel image,进而load不同的firmware和driver。

阅读全文 »

关于树莓派的开箱流程、初始配置文章不少,那些基础的有GUI配置的我就不多说了。可能是版本原因,我看到的有的东西已经跟我手头上的对不太上,记录一下。我是二代B型(真不想说我是2B😂),自用主机是MacBookPro,以下内容都基于此。另外我是基于一个程序员的视角而写,所以那些怎么ssh,开终端之类的东西都省略。所有脚本我都放在了GitHub上,传送门

阅读全文 »

不知是哪根天线收到了什么隐藏信息,突发奇想想去买个树莓派玩玩。其实家里还有一块前公司齐活的开发板,但性能差了点,板子又大,总之就是腻味了以后哪儿哪儿都是缺点,新的诱惑无限大。于是去买了块树莓派2B,打算配个服务器学点Python玩玩,从下午一直折腾到半夜,终于配置得算是差不多成型了。
以前没怎么研究过,认真四处看看,大致上情况是摸清了:硬件上总共出了算是三代n个型号(第三代Zero刚出),第一代硬件资料全齐,第二代就有点遮遮掩掩。我买的第二代B型,外设方面4口USB2.0,TF插槽、网口、HDMI、耳机插口、DSI摄像头接口、DSI屏幕接口各一。首先,我感觉USB2.0有点落伍,至少给一个3.0吧;其次,没有Nand flash,略不方便;再次,GPIO接口有点少,就那么40Pin还共用了串口+i2c+spi*2,也没数模转换,有点不够用;最后,那个LCDC接口是给谁用的啊?要自己单独做块转接板那么麻烦……除此之外,硬件凑合,但拿来做开发板太浪费,除非你的东西计算量很大;用来当个小小服务器、小小Linux机还不错。
软件方面,官方操作系统是Debian的。那套GUI对我来说真的有点鸡肋,居然还有Office和Mathematical,然而这种配置跑图形界面,

阅读全文 »

作为初学者,基础的几个UI控件必须要熟练,现在的我还处于打开Xcode在控件表里面瞎找,看着谁好像是我想要的就往StoryBoard里面拖的阶段……正式写了点东西以后,越来越感觉到,该认真把控件过一遍了。上周写了这么个UIView的Demo,本意是看看各种效果,结果各种状况,花了不少时间。最终效果如下:

因为准备做不止一个控件的Demo测试,又不愿意每个控件开一个ViewController,想所有的Demo都重用同一个页面,于是妖蛾子就出来了。(背景:这个Demo的具体实现部分和ViewController是分开的两个File)

阅读全文 »

新闻的实时性,必然导致其列表清单对“下拉刷新”和“上拉更多”的实现要求。一开始我以为这两个可以很容易地通过手势的处理来实现,找了找先是发现了个控件UIRefreshControl,很简单地实现了下拉刷新,想着上拉不是一样嘛,先用用再研究上拉怎么搞,于是放进了Code里面:

@IBOutlet weak var loading: UIActivityIndicatorView!
override func viewDidLoad() {
    //添加下拉刷新
    sliding.addTarget(self, action: "updateLatesList", forControlEvents: UIControlEvents.ValueChanged)
    sliding.attributedTitle = NSAttributedString(string: "下拉松手刷新...")
    self.ListTableView.addSubview(sliding)
}

func updateLatesList(){
    //TODO:刷新数据
    self.sliding.endRefreshing()
}

这个一看便知,注册一下回调,修改一下显示的字符串;然后在控件的监听回调里面刷新好数据,关掉动画,搞定!简直顺利得不敢相信。然后开始研究怎么通过这个改上拉更多……恕我驽钝,搞不定。上网查了一圈,貌似大家的上拉都不是用这个控件,这个控件的可定制性据说也比较差……😰没办法,乖乖自己写了。
去找了个第三方的“上拉更多”库,看源码(Sorry,已经不知道是哪个库了,GitHub上一大堆,我直接在浏览器里面看完就关了),发现里面的关键就是监听滑动事件,然后通过计算坐标来判断是否是上拉:

阅读全文 »

虽然我的新闻客户端app进展告一段落,暂停两个礼拜,但之前积攒下来的东西还没有写完,继续总结码字。
我从API拿到的数据,具体的新闻信息,使用的是HTML格式,包括图片地址什么的。我不想用WebView,一方面是网络方面的东西我还没怎么接触,怕麻烦、不会,另一方面因为还有标题、评论什么的,最好是能直接解析显示出来,放在一个TextView里面。我的目的是学习,那些第三方库什么的能不用也都不用了,于是找了找,TextView确实能解决这个问题,一般都是OC版的,用Swift写是这样:

let opt = [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType]
let html =  "<div style=\"background-color:#F1F1F1; font-size:14px; color:#304182; \n  text-align:center; margin-left:10px; padding-right:10px\"> \n<p>Test <span style=\"font-size:18px; color:#E88834;\">测试结束</span> Tips</p>\n</div>"

do{
let attributedString = try NSMutableAttributedString(data: html.dataUsingEncoding(NSUnicodeStringEncoding)!, options:opt, documentAttributes: nil)
post.attributedText = attributedString
}catch {print(error)}

不但能解析字体、颜色等等html标识,有图片的话也是没问题的。不过,事情没这么容易解决……

阅读全文 »

这些小Tips为本人近期读书笔记,收集来自网络开发者发布的技术文档,并非原创,共享的目的是为了扩散分享技术,共同进步。如有侵权不得转载等情况,请联系我告知,谢谢!

  • 所谓闭包,就是函数及其词法作用域的合称
  • 什么不是重构?:
    1. 添加新功能
    2. 改变某个类型的公共接口
    3. 改变某个类型的行为
      这些东西都只能叫做重写。有一个很简单的判断方式:你是否需要改变单元测试?如果需要的话,那么只就是重写,否则的话才是重构。
  • 设置UIView的背景图片
    1. 将图片作为UIView的背景色,会在生成color时占用大量的内存。如果图片大小不够,就会平铺多张图片,不会去拉伸图片以适应View的大小
    2. 在UIView上再添加一个UIImageView显示图片作为UIView的背景图片
      阅读全文 »

读完的书

  1. 老码说编程之玩转Swift江湖
    这本书从打开到终于看完也断断续续看了好久,算是中文原作开发教程中相当不错的一本。虽然作者写的例子都很中二,有点自以为幽默其实看着很烦,骗稿费之嫌,但讲正事还是蛮能讲到点子上的,看得出来是有实际经验的开发者。作为语法入门,这本书很好,也很适合曾经会一点别的语言的开发者。该知道的基本知识都有,看中实际操作,甚至是从装黑苹果开始手把手教,有自己的东西,不像很多东拼西凑的教材,新手看了摸不着头脑,半天还是连编译器都不会用。
    阅读全文 »