Blog


GTomatoD

I always have the problem of concentrate on something. For people like me, GTD(Get things done) work stream and tomato working method is very helpful. But I found apps are usually focus on either GTD or tomato working method. And that is where I came out the thought of combine these two things together.

Now you can not just get things done but also tomato done! : )

If you have any problem when using my App or you want something more in this App, please leave a comment below or just email me whatever you would like to say about this App.

My email address: flamelapp@gmail.com

 


 

一直以来无法专心的问题都困扰着我。对于像我这样的人来说,GTD(Get things done) 工作流和番茄工作法都是非常帮助的选择。但我发现各个App基本都专注于这两者的其中之一。这也是我想到把两者结合在一起的想法出现的地方。

现在您将不仅可以Get things done而且还能Get tomato done。:)

如果您在使用我的App时遇到了任何问题或者您希望这个App添加更多的功能,请在下方留言或者直接email给我您的想法。

我的电子邮箱地址:flamelapp@gmail.com




利用context和kubectx快速切换kubernetes集群

在使用kubectl操作kubernetes集群的过程中,可能会遇到需要操作不同集群的问题,例如本地的minikube集群和线上的部署集群,或是线上的测试集群和线上的部署集群,如果集群之间切换不频繁,也可以使用笨办法,比如准备多个config文件在/.kube文件夹下,要切换的时候就改config的名字。不过对于需要频繁切换操作集群的人来说,这个方法显然太麻烦了,当然也不够cool。

当然,k8s是非常完善的集群解决方案,肯定是考虑到了这个问题的,这里就用到了k8s的config文件的context(上下文)了。

如果你是从零开始配置两个集群的cluster, user等信息的,那么可以参照官方的这个文档

Define-clusters-users-and-contexts

这里就不详细说以上这种方法了,我们来说说已经存在了两个集群的config文件时如何简单的生成context,当然,在上述文档的后半部分,也有我要说明的这些,也可以去看英文原文,我这里是因为遇到了一个坑,所以详细解释一下。

首先说方法,我们都知道kubectl如果没有设置config相关位置的环境变量,那么其会默认去一个地方寻找,对于Mac来说,就是

$HOME/.kube/config

如果要自己指定一个config文件所在的位置,那么就要设置KUBECONFIG环境变量,例如:

export KUBECONFIG=$KUBECONFIG:$HOME/.kube/config

而如果有两个集群的配置文件呢,其实就可以非常简单的直接加在环境变量的后面,然后让kubectl自动为我们生成context,例如:

export KUBECONFIG=$KUBECONFIG:$HOME/.kube/config:$HOME/.kube/config-2

注意:可以使用

kubectl config view

来查看目前的context的情况

那么坑在哪里呢,由于两个集群的配置文件可能是管理员只分配给你自己使用的,那么用户名就可能是相同的,在用户名相同的情况下,如果集群的连接启用了TLS验证,那么kubectl自己融合的config文件就会使用相同的client-certificate-data和client-key-data,如果两个集群在同一服务商的同一片网络下还好,可是如果是在不同的网络下,那么就会出现只能连接上其中一个,而另一个集群无法连接的情况,这种时候,我的解决办法是修改用户名,但要注意,在config里的context下,可以看到user和name两个字段,我们要修改的是user字段,这里只是一个名称,不影响集群侧的用户验证,修改完user字段,记得翻到users字段下,那里面有一个name,这个name的值应该和刚刚修改之前的user字段中的值一样,把这里也修改成同样的新值,保存,重新配置环境变量使之生效,这时候就可以使用了。

至于官方提供的切换集群的方法,在上述文档中也能找到,这里也不在赘述,这里主要介绍一个第三方工具来帮我们更快捷的做这个事:
kubectx

这个工具可以给context指定alias并快速的切换他们,简单的介绍一下

kubectx                     : 列出目前所有的context
kubectx <NAME>              : 切换到<NAME>对应的context
kubectx -                   : 切换到上一次的context
kubectx <NEW NAME>=<NAME>   : 给<NAME>context命名一个新名字
kubectx <NAME>=.            : 给当前context命名一个新名字

可以看出,在完成了上述config文件自动融合之后,使用这个工具就可以快速的切换不同的操作集群,同时这个工具还支持bash/zsh的tab自动补全,以及fzf这个快速选择工具,可以说从此以后切换集群就可以如丝般顺滑了,不过缺点就是kubectx这个工具会影响对kubectl的自动补全,全看各位的习惯了
 




睁眼还(Debts)介绍页面

  • 2019年1月3日
  • 产品

如果有问题意见或建议请在本篇文章下留言。或者,

发送邮件到本人的邮箱:flamelapp@gmail.com

If you have any problem or suggestion please leave a comment under this article. Or,

You can send an email to my mailbox: flamelapp@gmail.com




iOS开发如何浏览模拟器中的coredata数据

在后端开发使用go语言时,网络包的使用经历了beego,fasthttp等包,最终又用回了go的官方http包(当然这个包最近各种升级例如支持了优雅退出啊等等就算是另一说了),发现还是尽量用官方的东西更好一些。

iOS开发也是这样,iOS开发中本地数据库操作也有不少的解决方案,从iOS自带的coredata,到FMDB,再到完全不依赖sqlite的Realm,我原本也使用了一段时间的realm,但有两点让我很不爽

  1. 毕竟是第三方项目,总是要更新,如果你是使用OC语言的,那么还好,但如果你是像我一样使用swift语言的,那么swift的更新外加realm自身的更新能够把你烦死
  2. realm对于字段变更的操作非常不友好,如果还没生成数据还则罢了,如果已经生成了数据,那么不好意思,请按照realm提供的反人类一样的方法一步一步执行,而且你还得关注当前的字段版本,比如最老的版本是1.0,之后你又推出了1.0.1和1.0.2的更新,那么你就至少得写下1.0到1.0.2和1.0.1到1.0.2的两个版本迁移的代码块,因为我们是在面向C端的,你永远不知道你的用户什么时候更新你的APP,所以你得提供所有老版本到最新版本的转化方式。

综上,最终我还是决定用回coredata,至少官方的支持还是可以的,swift版本也不用像OC一样需要几个步骤生成连接代码等等,直接在model文件里操作好,背后的一切工作swift都已经帮你完成了,当然,这里我要强调一点,那就是本地数据库并不应该存储多么巨大复杂的数据,如果一个用户一天在你的APP里生成10条数据,一年也不到4000条,完全到不了需要拼速度和优化的时候。

终于说到正题,既然使用了coredata,那么调试的时候免不了会想要查看一下数据或者手动更改数据,可是模拟器的数据一是藏得深,二是并没有直接浏览更改的方式,我们分别解决一下。

获取数据路径

在AppDelegate文件的didfinishlaunch中加入下面这一行代码

print(FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask))

这样会把当前模拟器的文件路径打印出来,有了路径,就好办了,比如可以在terminal里直接open,然后应该会看到一个名为“Application Support”的文件夹,里面就是对应的.sqlite文件

查看.sqlite文件

有了文件,如何查看又是个问题,下面提供以下几个方法,可以根据自身情况自由选择

  • (推荐)使用sqlite3直接在terminal里查看
    • 对于习惯于用命令行操纵MySQL的人来说,sqlite3的操作应该没有什么入门难度,也是比较推荐的方法,Mac又是自带Python和sqlite3的,如果找不到,那么可以从如下网站来进行安装:https://www.sqlite.org/download.html
  • (推荐)可视化方案:DB Browser for SQLite
    • 对于习惯于可视化管理的人来说,我推荐这个方案,本身是一个在GitHub上的开源项目,马上要突破1万星,安全和可靠性都有保障,还是免费的,只要把.sqlite文件拖到这个APP内就可以自动打开,当然coredata自动命名的表名和你自己命名的略有区别,比如我创建了一个Objectives的Enity,在这里看到就是ZOBJECTIVES,自己找一下就可以了
    • GitHub地址:https://github.com/sqlitebrowser/sqlitebrowser
    • 官方网页直接下载打包好的版本:https://sqlitebrowser.org
  • 可视化方案:Base 2
    • 功能更完善,界面更好看,但没有优先推荐的原因是其是收费的,20欧的售价其实并不算高,不过没有特别专业复杂的需求,用上面的就足够了
    • 官网地址:https://menial.co.uk/base/
  • 可视化方案:Firefox sqlite插件
    • 这个大概就是特定适合使用火狐浏览器的人群了吧,我本身不用火狐,所以各位如果用的也可以测试了给我反馈一下
  • (不推荐尝试)可视化方案:Core-Data-Editor
    • 同样是GitHub上的一个开源方案,但由OC写成,同时也只支持OC,同时需要有一个初始的适配过程,并且不能直接打开.sqlite文件
    • GitHub地址:https://github.com/ChristianKienle/Core-Data-Editor



在kubernetes集群中使用私有镜像源

最近公司迁移到了新集群,为了确保服务上线后的稳定性,所有的应用上线之前都要在本地的minikube上跑一下,但原本在集群上用得正常的yaml,在minikube里就无法正常拉取docker镜像,Google一番之后被kubernetes的官方文档搞得一头雾水,拉到最下面才找到了原因,其实好好研究一下yaml就能发现不同的点,即yaml里有这样一行

imagePullSecrets

当deployment指定了特定的secret之后,其便会遵循这个secret中的docker镜像源的信息来拉取镜像,创建非常简单,只要

$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret "myregistrykey" created.

其中email是选填的

在yaml里就可以直接这样写:

apiVersion: v1
kind: Pod
metadata:
  name: foo
  namespace: awesomeapps
spec:
  containers:
    - name: foo
      image: janedoe/awesomeapp:v1
  imagePullSecrets:
    - name: myregistrykey

参考资料:
https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry