全站开启SSL

之前不开启SSL,是因为我发现伟大的墙很喜欢墙带有SSL的网站,因为他们没法监控内容就只能封IP了。所以我希望他们对待我的网站,可以像对待开启加密以前的维基百科一样,使用关键词重置,而不是封IP。但实际上墙发展到现在,越来越简单粗暴了,大多数网站要么全墙,要么全能访问。这估计是因为旁路重置要消耗大量的计算和网络能力吧。像我这种垃圾网站,他们一来看不上,要是看上了,也不会浪费计算资源在这个小网站上,必然是直接墙IP了。所以就干脆开SSL吧。

对My First Impression of Swift的修改

刚才看了tinyfool的My First Impression of Swift,发现了一些语法错误,所以做一些力所能及的修改。不过因为本人英语水平有限,可能改得不是很好。

Just after Apple announced swift at WWDC 2014, I downloaded Xcode 6 beta 1, but since then I didn’t have time to really learn swift. Today, I watched the WWDC Session videos about swift (Introduction to Swift, Intermediate Swift, and Advanced Swift).

Why Apple makes Swift?

There are so many theories about this. In the WWDC keynote, Craig Federighi said, “Now Objective-C has served us so well for 20 years. We absolutely love it. But we have to ask ourselves the question: what would it be like if we had Objective-C without the baggage of C? “.

Objective-C is a great programming language,  but it is still a very old language with so many baggages.

What is Objective-C without the C?

If we think this question from the angle of programming platform, I think the Objective-C platform includes:

1.Language: Objective-C language.
2.Development tools: Xcode, Interface builder and instrument.
3.Runtime library: Objective-C Runtime.
4.Framework: Cocoa and Cocoa touch.

Apple just changed the language, but still uses the same development tools, runtime library and frameworks. So Swift can change its syntax, but must have so many same  structures with Objective-C underneath. So developers who familiar with Objective-C can learn easily and fast with their old experience.
In the WWDC session I noticed that the speaker said Swift has 3 key design points: safe, modern and power.

So after combing all these things together, I think the purpose of swift is trying to create a safe (strong type), modern (convenient, easy to learn and use) and powerful (doesn’t loss any functionalities from Objective-C) language which doesn’t have any baggages from C, and can be fully supported by Apple’s development infrastructures.

My first impression of the language

1. Swift uses strong type, but the syntax looks just like weak type.

A strong type language is faster and safer than a weak type language, but it also needs more lines of code and looks more complex. On the other hand, a weak type language is convenient, easy to learn and use, but much slower and not very safe. With swift, you can declare the type of variables explicitly like this:

var somestring: String = “this is a string”

You also can declare the type of variables implicitly like this:

var somestring = “this also is a string”

When you don’t explicitly declare the type of variables, the complier will automatically inference it.

2. Swift desn’t use single root class.

Java and Objective-C both use single root class. In Objective-C your classes have to inherit NSObject directly or indirectly. But Swift doesn’t use single root class, your classes can inherit any classes or just never inherit anything.

I think that’s because at the moment when Java and Objective-C are designed, there are so many functionalities that can not be implemented by the complier easily, so just put them to the root class. Now these functionalities can be implemented by the language.

3. You don’t need to use class member variables and properties separately

In Swift, all class member variables are properties, called “stored properties”. And if you want a property that has some setters and getters, it is a computed property.

4. You don’t need to alloc memory for your objects

Yeah!!!!  The complier will do it for you.

5. Structures can have computed properties and methods

But structures still have some differences with classes:

  1. Structures can not inherit other structures.
  2. Structures are passed by value, while Classes are passed by reference.

6. Extensions can extent any classes, named types , or even built-in types

Extensions just like the category of Objective-C, which can be used to extend other classes, but in Swift, extensions can even extend built-in types.

It is convenient but may be dangerous.

7. Optional and Non-Optional type

The optional type gives you the ability to do the safety-checking of variables, making sure they are valid, and it provides a easy and convenient way to do it.

End

Ok, there are more and more syntax and features in the books and the WWDC session videos. But I just want to talk about these, which are easily to learn and may be different to other languages.

今天雅思考试遇到的问题

第二次雅思考似乎结果不会比第一次好,特别是作文,估计还是5.5左右。

考试中遇到了一些问题,第一个问题是阅读的时间分配的问题。这次还是跟上次一样用了19分钟得分的时间分配(另外一分钟写答案),但是这个办法似乎不是特别好。这次加入了平行阅读法,所以前两篇的阅读都非常快,一遍读好之后,还剩下5分钟左右的时间,但是都有一道题没有做。但是我并没有将这时间的空余累积到下一篇阅读上去,而是将这些时间花掉去寻找那一道没有找到的答案。但是在第三篇上,19分钟就不够了,一方面主要是这次最后一篇的题目一大半是乱序题,没法平行阅读,另外一个问题是,做最后一篇阅读的时候,老师就开始倒计时了,所以会开始心慌,以至于没法集中精神理解文章,本来打算是最后一分钟抄答案的,但是老师说5 minutes left的时候,我认为等到最后一分钟写答案的风险太大,所以就开始写答案了。于是后面5分钟等于是没心思做题,有6道题是空的,全都蒙D了。所以以后不应该将最后的5分钟考虑在做题时间内。

写作的话,这次考了道地图题。当然这在我的预料范围之内,因为我关注了今年所有的考题,想想大概这次是要考地图题了,所以考前着重复习了一下地图题,还是有点帮助的。不过在大的压力下写文章真的比较难,有些词组什么的,平时用得好好的,到了考试的时候就会记岔,或者写得对的词组,会怀疑是不是写错了,然后改改就改错了,这个问题主要表现在介词的使用上的,比如这次说花园通过一条footpath和教学楼相连。相连物体之间的相连准确的用应该是be connected to,但是我改改就变成with了(当然也有这个词组,但是这个是侧重精神上的)。

大作文上面,在考试压力下我估算了一下只能发挥到60%左右。这次写大作文的策略和上次不同,降低了用词的复杂度和句子的复杂度,提高了语法准确度。其实是因为复杂的词语我一紧张就不敢用,有时候写了一个词,想想没有把握,就换一个稍微确定一点的简单词。不过还是有很多错误,最严重的两个是把medical care写成了medicalcare,然后把medical conditions和health problems记混了,写成了health conditions了。另外,行文上面也出了重大的纰漏。第二段论证的时候,我本来想论证的是,城市里面工厂比较集中,造成的污染会有损人的健康。但是写的时候,论证了太多为什么城市会比农村污染严重,但是忘记把最后的结论引到有损人的健康上面去(这次的题目是“大城市的生活是否对人的健康不利”)。所以这段论证是偏题的。这些问题实际上在考试结束后,我在厕所就想到了。但是在考场上就没想到这些问题,这也是一直困扰我的,在我高中的时候,也经常发现,一些题目在考试的时候没有思路,但是一旦走出考场,甚至是刚跨出一步,就想到了解题办法。这次因为task1用的时间有点超时,所以task2没有列提纲。如果用顾家北的ARE方法列提纲的话,大概是可以避免论证结构的问题的。

总之,马上又要给雅思网站充钱去了。明天还要考口试,这次口试没怎么复习过,不知道能考多少。。。

上海居住证攻略(2013年7月1日后)

2013年7月1日起,上海市居住证实施新的管理办法,采用积分制,并且需要本人去办理(之前是公司办理的)。事实上,除了旧办法办理居住证所需的材料之外,新办法需要另外一些材料。因为之前不清楚,所以跑了很多冤枉路。

首先要说明的是,办理新的居住证只能在居住证过期前30日内办理,不可以提早办理。另外,如果居住证过期后60日内没有续办,则积分全部归零。这个很重要,因为现在部分人才引进居住证和普通居住证了,积分是唯一有区别的地方。

需要准备的材料有:

  1. 必备材料
    1. 来沪人员管理站证明①
    2. 身份证和户口簿的复印件(验原件)
    3. 本市居住6个月以上的住所证明(四选一)
      1. 居住在自购住房的,提供房屋产权证复印件(验原件)
      2. 居住在租赁住房内的,提供住房租赁合同登记备案证明复印件(验原件)
      3. 居住在单位集体宿舍的,必须提供单位出具的集体宿舍证明
      4. 居住在亲戚朋友家的,须提供居委会出具的寄宿证明
  2. 辅助材料
    1. 来沪就业的,提供6个月以上的有效劳动合同复印件(验原件),及近6个月以上的本市社会保险清单
    2. 来沪投资开业的,提供本人有效营业执照复印件(验原件),及近6个月以上的本市社会保险清单
    3. 投靠本市户籍配偶、子女或父母的,分别提供结婚证复印件(验原件)、公安部门认定的父母子女关系证明复印件(验原件)、双方身份证复印件(验原件)
    4. 来沪就读、进修的,提供本市大、中院校的录取通知书复印件(验原件)

 其中①和②是旧办法中不需要提供的,所以这里要做特别的说明。

①来沪人员管理站证明实际上是“上海市居住证办证通知”,需要到小区所属的来沪人员管理办公室开具,具体在哪里需要问一下小区的居委会,开具时,请准备好身份证或者户口簿,以及上述的住所证明。办证通知上会写明办证地点。

②社会保险清单需要http://www.12333sh.gov.cn/200912333/2009wsbs/grbs/shbx/01/200909/t20090917_1085043.shtml(这个地方,如果你光是从首页进去,永远找不到这一页,这个是人事发给我的)上面打印,要特别注意的是,这个网站是IE only的,如果使用其他浏览器,可能会导致要找的信息无法找到以及无法登录的问题(有一段javascript是错误的)。另外,如果你忘了这个网站的密码,或者是第一次使用这个网站,你必须前往最近的社会保险事业管理中心重置密码。

有了这些材料,就可以到办证处办证了,办证处会提供受理回执,在两个月之后凭回执和身份证领取新证,另外,人事可能会需要这个回执去办理积分过户证明。

《记词助手》使用帮助

 

隐私条款

本软件不主动记录任何用户的隐私信息,包括且不限于:

  • 地理位置
  • 电话番号
  • 通信录
  • 短信

献给所有致力于肉翻的同仁。

增加单词列表

使用批量输入

点击“增加word list”,再点击批量输入,即进入批量输入界面。

批量输入界面

注意,必须保证一行一个单词(大小写不敏感,行尾空格不敏感)。

使用iTunes导入

连接iOS设备到电脑,并打开iTunes,进入设备同步界面。

点击应用程序标签:

此界面下拉到底,可以看到可共享文档的软件列表:

选中“记词助手”,即可看到右边的共享文稿。点击添加可向里面添加单词文件。

注意,单词文件需要以.txt作为后缀,每行一个单词。

删除单词列表

主界面中选中“查看已有word lists”。点击右上角编辑,即可选择要删除的单词列表。

学习安排

学习安排界面能够按照艾宾浩斯记忆法安排每日需要完成的任务(包括学习和复习)。

删除单词列表中的单词

进入一个单词列表之后,可以点击右上角的编辑按钮,即可选择要删除的单词。

向已存在的单词列表增加单词

在单词列表内,点击右下方的+按钮,就可以选择增加单词方式。

目前方式有两种,一是手动输入一个单词。二是通过iTunes导入的txt文件批量增加。

偏好设置

点击设置,进入设置页面。

关于易混淆单词

目前设定的易混淆单词规则为:如果两个单词编辑距离小于等于3,或者最长公共子串的长度超过较长单词的一半长度,即为易混淆单词。由于ARM架构计算能力有限,此功能耗时比较长。

 

 

使用django的ImageField和forms from models快速制作上传图片表单

需求描述:

做一个简单的注册页面,使得用户在注册页上传头像。

解决办法:

以前用java写这个的时候,在action上面需要用IO接受文件,然后生成一个文件名,再将文件相对路径保存到user表的img字段中。而在django的model层上,有一个叫做ImageField的字段(还有FileField,两者几乎一样),看了文档中对于这个字段的描述,大致意思就是自动将文件保存在media的文件夹里面,然后产生的文件路径保存到一个var char的字段中。如果一个model有ImageField字段,则在其对应表里面就会有一个var char字段,正是用于保存路径的。

 

1.设置setting中的MEDIA_ROOT:

如果使用django的快捷方法,那么所有用户上传的文件应该都会被保存到MEDIA_ROOT定义的文件夹中去。注意这里需要绝对路径。我的设置是:

这样就能将MEDIA_ROOT设置为项目目录下的media目录。注意最后的斜杠,如果不加最后的斜杠,那么在保存的时候会出现奇怪的错误。

 

2.设置model:

为了方便,自己建了一个User的Model:

这里要注意的地方是null=True之后,要也要加上blank=True。其中null=True是针对数据库的,而blank=True是针对validation的。如果blank=True没加,那么在下面做form的时候,省略字段的话验证不会通过。

这里面有一个img字段,是ImageField类型的,这个在快速制作上传图片的表单里起了至关重要的作用。里面有一句upload_to=’xxxxx’,是指文件保存在MEDIA_ROOT中的哪个子目录下。

 

3.设置forms from models:

django有一个form类,这个类抽象出了html的form。用在view里的话,就能在template里生成form的html。但是可以发现用户注册时,表单的字段和model的字段非常相似,所以可以通过model生成form类。

而model类里面并不是所有的内容都需要用户填写,比如regTime就不需要。这时候可以指定那些字段会成为form字段(使用fields=(xxxx)),或者可以指定哪些字段不会成为form字段(使用exclude=(xxx))。这里,我们似乎只有一个regTime不需要显示。

另外,我们的model里面password字段是CharField,django不会聪明到通过变量名的意思来生成form,所以默认生成出来的会是input type=”text”的表单,我们需要通过一种方法修改掉它。综上所述,最后的form代码是这样的:

这样就能生成一个简单的form了。forms from models和普通的form类有一个区别,就是它有save()方法,这个方法在view中将会被使用。

 

4.在view里调用form

这里,假设注册页面为/reg/。如果使用get方法,则浏览器中给出注册表单,如果用post方法,则将表单内容保存到数据库。

如果使用forms from models,则在view上面将会非常的简单:

 

5.template中的使用:

这里和普通form是一样的。当然也可以手动设置格式,详见文档。

最后再配置一下urlpattern,就能在这个表单上传图片了。

 

不足:

单单这样做注册表单有个不足之处,就是没有confirm password这个字段。不过我们可以在UserForm类中增加一个表单字段,最后结果会是:

 

不过这样一来,template中生成的表单,会把confirm_password字段放在最下面。所以得手动设定格式。另外,form.is_valid()也不会监测password和它是不是一样,需要在后面手动加逻辑。

上面的方法不一定是最好的,不过也提供了一些思路。另外,即便是不使用forms from models,也可以方便的使用ImageField保存图片:见http://www.nitinh.com/2009/02/django-example-filefield-and-imagefield/

 

访问media目录:

media文件夹里的内容需要使用urlpatterns映射才能访问。在urls里面添加: