0%

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

(void)savePreset {

UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"Preset to Remoter buttons" message:nil preferredStyle:UIAlertControllerStyleActionSheet];

UIAlertAction * preset1 = [UIAlertAction actionWithTitle:@"Preset1" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"send preset 1");
}];

UIAlertAction * preset2 = [UIAlertAction actionWithTitle:@"Preset2" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"send preset 2");
}];

UIAlertAction * preset3 = [UIAlertAction actionWithTitle:@"Preset3" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"send preset 3");
}];

UIAlertAction * preset4 = [UIAlertAction actionWithTitle:@"Preset4" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSLog(@"send preset 4");
}];

UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel
handler:^(UIAlertAction * action) {}];

[alertController addAction:defaultAction];

[preset1 setValue:[[UIImage imageNamed:@"fire"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];
[preset2 setValue:[[UIImage imageNamed:@"left"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];
[preset3 setValue:[[UIImage imageNamed:@"right"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forKey:@"image"];
[preset4 setValue:[[UIImage imageNamed:@"down"] imageWithRenderingMode:UIImageRenderingModeAutomatic] forKey:@"image"];
[alertController addAction:preset1];
[alertController addAction:preset2];
[alertController addAction:preset3];
[alertController addAction:preset4];
[self presentViewController:alertController animated:YES completion:nil];


}

`固定图片大小

UIImage * img = [UIImage imageNamed:@"doorlogo"];

CGSize itemSize = CGSizeMake(60, 60);
UIGraphicsBeginImageContext(itemSize);
CGRect imageRect = CGRectMake(0, 0, itemSize.width, itemSize.height);
[img drawInRect:imageRect];
cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();`

苹果软件发布问题汇总

上传程序不能在可选列表中显示出来怎么办?

检查开发者帐号的邮箱,会把是什么原因导制的通过邮件发过来。比较奇怪是上传过程不会有任何提示,ituneconnect帐号中也不会提示。比较挫。

出现上面的情况,一般都是程序里面的权限设置问题。

发布硬件配合的程序

发布程序的时候最好配一个联机演示的视频。不然的话,他后面会让你补上,浪费时间。

xcode打包的地方上传不了

遇到过这种情况,这里怎么也传不了,一直正在进行,不完成。可以从xcode的那个菜单里面调出一个独立的工具出来。这个工具一般比较好用。

遇到过 遇小化那个上传界面,然后恢复。就会提示已上传完成。其实根本就没有成功上传,完全是骗人的。

安装与配置

据说每个从wordpress转过来blog都会有篇文章,这个就是。

windows

两个前提和条件

  1. 首先要安装 Node.js
  2. 当然了还要安装 git

然后在Windows命令行输入

  1. 安装hexo

    1
    npm install -g hexo
  2. 初始化一个blog,这里名字就叫 hexo

    1
    hexo init hexo
  3. 进入hexo目录

    1
    cd hexo
  4. 安装依赖文件

    1
    npm install
  5. 部署形成文件

    1
    hexo generate

mac

还没有测试过如何弄。

linux

还没有测试过如何弄。

发布

本地预览

1
hexo s

就能打开一个本地服务器,通过提示的地址可以看效果。

怎么发布到Github的空间中去

首先得有github帐号,肯定有了,不说了。还有就是要在本机配置好如何能push到github上去。github官方有说明,windows还有点复杂,这里暂时不说了。

如何写文章

Draft

在文件夹的source目录下面有个_drafts目录,这里面都是没有Post。

publish

在文件夹的source目录下面有个_post目录。这里面都是已经post了的。

插件

要工作,有些插件必须要有。

  1. 发布到github上需要一个插件。
  2. 把wordpress内容导入到hexo也需要一个插件。
  3. 有个hexo admin的插件可以成倍的减少用hexo的难度。(我正在用)

使用心得

next主题很不错,要另外安装。默认的比较丑。

建立SSH信任

将A主机做为客户端(发起SSH请求 ip:192.168.200.170)
将B主机作为服务器端(接收ssh请求 ip:192.168.200.149)
以上以主动发起SSH登录请求的主机和接收请求的主机进行分类

A主机生成公,私钥证书

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@buddytj-10 .ssh]# ssh-keygen -t rsa     #rsa算法的证书
Generating public/private rsa key pair. (以下一路回车)
Enter file in which to save the key (/root/.ssh/id_rsa):

/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y (因为我的证书已存在,覆盖即可)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa. (私钥)
Your public key has been saved in /root/.ssh/id_rsa.pub. (公钥)
The key fingerprint is:
c1:26:cc:88:2b:05:dd:c3:6b:1e:78:5d:da:9c:da:8a
证书就生成了 id_rsa (私钥)|& id_rsa.pub (公钥)

将A主机生成的公钥传递给B主机

1
2
3
[root@xyh .ssh]#scp id_rsa.pub  192.168.200.149:/root/.ssh/
在B主机上将A的公钥更名为
[root@xyh .ssh]#mv id_rsa.pub authorized_keys

至此从A主机远程SSH B主机的工作即告完成

拷贝与粘贴

tmux不同的配置,快捷键会存在较大的差异。也就是说,可以定义不同的快捷键来实现复制与粘贴。详细的说明可以在 tmux 的手册中找到。
但对于其默认的设置中这样的:
使用 “ctrl-b [“ 进入拷贝模式,使用空格键(space)开始内容选取,回车键(Enter)进行拷贝,然后使用 “ctrl-b ]” 进行粘贴。

Good luck.

一篇文章的总结:原文在这里

1. 使用统一的 base 镜像

有些文章讲优化镜像会提倡使用尽量小的基础镜像,比如 busybox 或者 alpine 等。我更推荐使用统一的大家比较熟悉的基础镜像,比如 ubuntu,centos 等,因为基础镜像只需要下载一次可以共享,并不会造成太多的存储空间浪费。它的好处是这些镜像的生态比较完整,方便我们安装软件,除了问题进行调试。

2. 动静分离

经常变化的内容和基本不会变化的内容要分开,把不怎么变化的内容放在下层,创建出来不同基础镜像供上层使用。比如可以创建各种语言的基础镜像,python2.7、python3.4、go1.7、java7等等,这些镜像包含了最基本的语言库,每个组可以在上面继续构建应用级别的镜像。

3. 最小原则:只安装必需的东西

很多人构建镜像的时候,都有一种冲动——把可能用到的东西都打包到镜像中。要遏制这种想法,镜像中应该只包含必需的东西,任何可以有也可以没有的东西都不要放到里面。因为镜像的扩展很容易,而且运行容器的时候也很方便地对其进行修改。这样可以保证镜像尽可能小,构建的时候尽可能快,也保证未来的更快传输、更省网络资源。

4. 一个原则:每个镜像只有一个功能

不要在容器里运行多个不同功能的进程,每个镜像中只安装一个应用的软件包和文件,需要交互的程序通过 pod(kubernetes 提供的特性) 或者容器之间的网络进行交流。这样可以保证模块化,不同的应用可以分开维护和升级,也能减小单个镜像的大小。

5. 使用更少的层

虽然看起来把不同的命令尽量分开来,写在多个命令中容易阅读和理解。但是这样会导致出现太多的镜像层,而不好管理和分析镜像,而且镜像的层是有限的。尽量把相关的内容放到同一个层,使用换行符进行分割,这样可以进一步减小镜像大小,并且方便查看镜像历史。

6. 减少每层的内容

尽管只安装必须的内容,在这个过程中也可能会产生额外的内容或者临时文件,我们要尽量让每层安装的东西保持最小。

比如使用 –no-install-recommends 参数告诉 apt-get 不要安装推荐的软件包
安装完软件包,清楚 /var/lib/apt/list/ 缓存
删除中间文件:比如下载的压缩包
删除临时文件:如果命令产生了临时文件,也要及时删除
7. 不要在 Dockerfile 中修改文件的权限

因为 docker 镜像是分层的,任何修改都会新增一个层,修改文件或者目录权限也是如此。如果修改大文件或者目录的权限,会把这些文件复制一份,这样很容易导致镜像很大。

解决方案也很简单,要么在添加到 Dockerfile 之前就把文件的权限和用户设置好,要么在容器启动脚本(entrypoint)做这些修改。

8. 利用 cache 来加快构建速度

如果 Docker 发现某个层已经存在了,它会直接使用已经存在的层,而不会重新运行一次。如果你连续运行 docker build 多次,会发现第二次运行很快就结束了。

不过从 1.10 版本开始,Content Addressable Storage 的引入导致缓存功能的实效,目前引入了 –cache-from 参数可以手动指定一个镜像来使用它的缓存。

9. 版本控制和自动构建

最好把 Dockerfile 和对应的应用代码一起放到版本控制中,然后能够自动构建镜像。这样的好处是可以追踪各个版本镜像的内容,方便了解不同镜像有什么区别,对于调试和回滚都有好处。

另外,如果运行镜像的参数或者环境变量很多,也要有对应的文档给予说明,并且文档要随着 Dockerfile 变化而更新,这样任何人都能参考着文档很容易地使用镜像,而不是下载了镜像不知道怎么用。

以下内容来自这里:HERE

其实就这么几行配置:

1
2
3
4
setw -g mouse-resize-pane on
setw -g mouse-select-pane on
setw -g mouse-select-window on
setw -g mode-mouse on

这几行的作用分别是:

1
2
3
4
开启用鼠标拖动调节pane的大小(拖动位置是pane之间的分隔线)
开启用鼠标点击pane来激活该pane
开启用鼠标点击来切换活动window(点击位置是状态栏的窗口名称)
开启window/pane里面的鼠标支持(也即可以用鼠标滚轮回滚显示窗口内容,此时还可以用鼠标选取文本)

这几行配置加到 ~/.tmux.conf 中,然后在tmux里面按 C-b : 执行 source ~/.tmux.conf 即可生效 (也可以直接将这几行放在 C-b : 的输入行去执行,每次执行一行,不过 tmux重启后还得再来一遍)。

本来很简单的时,在IOS上涉及到的东西还挺多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

* (NSString *)getCurrentTimeString {
NSDate *today = [NSDate date];
// NSInteger interval = [[NSTimeZone systemTimeZone] secondsFromGMTForDate: today];
// NSDate *localeDate = [today dateByAddingTimeInterval: interval];

NSDateFormatter _formatter = [[NSDateFormatter alloc] init] ;
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; //hh与HH的区别:分别表示12小时制,24小时制
//设置时区,这个对于时间的处理有时很重要
//NSTimeZone_ timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
NSTimeZone* timeZone = [NSTimeZone systemTimeZone];

[formatter setTimeZone:timeZone];

//NSString * date_str = [localeDate description];
NSString * date_str = [formatter stringFromDate:today];
return date_str;
}