IOS 学习笔记

iOS学习笔记

  • 在IOS中所有的页面(view)都遵循MVC架构,即数据存放在model(具体的业务类)中,使用control(viewcontrol)控制数据,在view中显示

  • 使用当前页面控制器(viewcontrol)中实现prepareForSegue方法进行页面切换前的准备。其中可以根据跳转页面的SegueIdentifier来分辨跳转目标执行具体逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let identifier = segue.identifier {
            switch identifier{
            case History.SegueIdentifier:
                if let tvc = segue.destinationViewController as? TextViewController
                {
                    if let ppc = tvc.popoverPresentationController{
                    ppc.delegate = self
                    }
                    tvc.text = "\(diagnostircHistory)"
                }
            default: break
            }
        }
    }
  • 对于一些功能组件,为了实现其方法,首先需要为其设置一个代理(类)。该类需要继承该组件指定的特点协议,通过实现协议中的方法实现组件方法。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class  DiagnosedHappinewwViewController: HappinessViewController,UIPopoverPresentationControllerDelegate
{

    override var happiness: Int{
        didSet {
            diagnostircHistory += [happiness]
        }
    }

    //
    private let defaults = NSUserDefaults.standardUserDefaults()
    var diagnostircHistory:[Int]{
        get {return defaults.objectForKey(History.DefaultsKey) as? [Int] ?? [] }
        set {defaults.setObject(newValue, forKey: History.DefaultsKey) }
    }
    private struct History {

        static let SegueIdentifier = "Show Diagnostic History"
        static let DefaultsKey = "DiagnosedHappinessViewController.History"
    }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let identifier = segue.identifier {
            switch identifier{
            case History.SegueIdentifier:
                if let tvc = segue.destinationViewController as? TextViewController
                {
                    if let ppc = tvc.popoverPresentationController{
                    ppc.delegate = self
                    }
                    tvc.text = "\(diagnostircHistory)"
                }
            default: break
            }
        }
    }

    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!, traitCollection: UITraitCollection!) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.None
    }
}

在树莓派平台上安装 Jasper

烧制树莓派镜像至SD卡

我们首先使用GParted(Ubuntu)清理SD卡。右击SD卡的每个分区,选择 ‘Unmount’ 和 ‘Delete’. 通过 Edit –> Apply All Operations应用改变.

下载 Raspbian Wheezy http://downloads.raspberrypi.org/raspbian_latest 文章对2014-01-07的版本进行了测试,之后的版本如无大改动,应该也ok。

使用 dd 命令把镜像烧制到磁盘上。再使用如下命令获得SD卡的地址:

1
sudo fdisk -l

获得地址 ‘/dev/mmcblk0’, 之后把镜像烧入磁盘:

1
sudo dd if=2013-12-20-wheezy-raspbian.img of=/dev/mmcblk0 bs=2M

烧制完成,取下SD卡,插入树莓派卡中。

配置 Raspbian

在安装Raspbian之前,我们首先要做一些先期工作安装一些一共工具与库。使用ssh登录至树莓派:

1
ssh pi@192.168.2.3 # password (default): raspberry

运行如下命令,选择 ‘Expand Filesystem’ 并重启树莓派:

1
sudo raspi-config

更新树莓派并安装相应工具:

1
2
3
sudo apt-get update
sudo apt-get upgrade --yes
sudo apt-get install vim git-core python-dev python-pip bison libasound2-dev libportaudio-dev python-pyaudio --yes

插入USB麦克风。打开ALSA配置文件:

1
sudo vim /etc/modprobe.d/alsa-base.conf

修改:

1
2
Change the following line:
options snd-usb-audio index=-2

成:

1
options snd-usb-audio index=0

返回shell,运行:

1
sudo alsa force-reload

之后使用如下命令测试录音功能(可能需要重启树莓派):

1
arecord temp.wav

确保麦克风正确连接。播放之前录制的音频文件:

1
aplay -D hw:1,0 temp.wav

添加如下行至~/.bash_profile(bashrc?)末尾:

1
2
export LD_LIBRARY_PATH="/usr/local/lib"
source .bashrc

把下面的命令添加到 ~/.bashrc 或者 ~/.bash_profile:

1
2
3
4
LD_LIBRARY_PATH="/usr/local/lib"
export LD_LIBRARY_PATH
PATH=$PATH:/usr/local/lib/
export PATH

至此,我们完成了安装Jasper前所需的准备工作。

RStudio Server 环境变量LD_LIBRARY_PATH的配置

问题

在服务器上安装了一个Rstudio-server进行基于R语言的web开发。前期一路顺利,直到开发数据库模块需要用到RODBC。在加载ODBC库后,调用函数odbcConnect结果报错:

In odbcDriverConnect(“DSN=myhps;UID=hps;PWD=hps”):
[RODBC] ERROR: state 01000, code 0, message [unixODBC][Driver Manager]Can’t open lib ‘/usr/lib/libmyodbc5-5.1.5.so’ : file not found

第一印象是我的odbc装的有问题,但locate了libmyodbc5-5.1.5.so这个文件,存在。同时,发现使用ssh登录到服务器直接进入R,可以正常使用该函数没有报错。看来环境变量出错的概率比较大。
为了进一步确认,我在Rstudio-server中键入:

1
system("source ~/.bashrc;Rscript ~/test.R",intern = TRUE)

其中,test.R中的内容为

1
2
library(RODBC)
odbcConnect("myhps","hps","hps")

运行成功,看来问题就是环境变量中引起的。经过排查,最终确定问题为环境变量LD_LIBRARY_PATH少了路径“/usr/local/lib”。那么下一步要做的事就是更新RStudio-server的LD_LIBRARY_PATH环境变量。 首先,我在RStudio中调用Sys.getenv(),打印出所有环境变量,其中:

1
2
"/usr/local/lib64/R/lib:/lib:/usr/local/lib64:/home/lyl/denpendence/jdk1.7.0_51/jre/lib/amd64/server" 
LD_LIBRARY_PATH

从包含的路径来看,RStudio肯定不是使用shell的方式读取.bashrc,/etc/bashrc等文件初始化环境变量(经过实验验证,的确是这样)。于是,google了下RStudio环境变量的设置方法,回答指向了如下链接:

https://support.rstudio.com/hc/communities/public/questions/203035636-global-environment-variable https://stat.ethz.ch/R-manual/R-patched/library/base/html/Startup.html

即通过在文件Renviron.site,Renviron.Rprofile中设置。起初,文档没看太仔细,直接用shell的语法设置环境变量了,但RStudio对环境变量设置有自己的一套语法,这里要注意:

Lines in a site or user environment file should be either comment lines starting with #, or lines of the form name=value. The latter sets the environmental variable name to value, overriding an existing value. If value contains an expression of the form ${foo-bar}, the value is that of the environmental variable foo if that exists and is set to a non-empty value, otherwise bar. (If it is of the form ${foo}, the default is “”.) This construction can be nested, so bar can be of the same form (as in ${foo-${bar-blah}}). Note that the braces are essential: for example $HOME will not be interpreted.

设置ok,重启RStudio,重启session(这里要注意是重启session,而不是重新登录。Rstudio-server会帮你保存session。重启session的方法: Session->Restart R),环境变量有变化,设置成功。重新运行函数odbcConnect,还是报同样的错误。

这里之后又折腾了几个小时,最后,重读了下RStudio-server的安装配置文档https://support.rstudio.com/hc/en-us/articles/200552316-Configuring-the-Server ,发现有这么一句话:

You can add elements to the default LD_LIBRARY_PATH for R sessions (as determined by the R ldpaths script) by adding an rsession-ld-library-path entry to the server config file. This might be useful for ensuring that packages can locate external library dependencies that aren’t installed in the system standard library paths. For example: rsession-ld-library-path=/opt/local/lib:/opt/local/someapp/lib

于是我在配置文件 /etc/rstudio/rserver.conf添加相应设置 rsession-ld-library-path=/usr/local/lib 重启RStudio-server,重启session,终于成功。看来,RStudio-server的LD_LIBARAR_PATH只有在这里设置才有用,真是个反人类的配置习惯。至此,在该问题上已经花费了5个小时。这同时也提醒我们,仔细看文档是多么的重要!

使用Goagent 进行科学上网

问题

一直需要打开一些国外的网站,例如google学术,会议官网,但是由于某些原因,不能直接上网。

解决方案

使用google app engin

  1. 使用goagent程序配置好appid,密码
  2. 设置好端口,apc的路径
  3. 设置iplist,这步是最重要的,设置一个好的iplist可以直接感觉不到中间代理的存在
  4. 速度快的ip主要是通过使用脚本的方法扫描,或者可以网上搜索现场的ip
  5. 最后,不要忘记设置dns。

Latex: 行内长公式换行

问题描述

写论文的时候有一个长公式,长度超过了半页宽度,造成了溢出,很丑陋,网上搜了下没有比较满意的换行办法。

解决方案

想到一个比较简单地方法,直接在想要换行的地方插入两个美元符号,即$ $,把一个公式拆成两个,顺利换行。

R语言 Arff 读取错误

问题描述

在arff每行的最后中写入“float”属性,结果一种一行总是与其余几行写入的结果不一样

解决

最终发现是在该行的最后面多了一个空格,删除空格即可正常读取

Latex 多行公式的对齐

问题

在写论文时要书写一个长公式,把他分成多行并在等号后面左对齐

解决方法

在数学环境内使用数组,代码如下

1
2
3
4
5
6
7
8
\begin{equation}
    \begin{array}{rcl}
        a+b+c & = & d\\
                  & = & e\\
        f+g & = & h\\
             & = &i+j+k
    \end{array}
\end{equation}

Git版本的重置

问题

当多个人对git进行修改时,会在更新时造成版本冲突,需要合并。当一个版本的修改并不重要时,不想合并

解决方案

调用如下命令,重置修改 git reset --hard HEAD^