网页豆瓣豆油提醒本来就慢,然后干别的时候还不知道来豆油了。写个油猴子脚本搞定了。 tampermonkey脚本还比较好些,查了一下提醒功能,需要chrome用户进行授权。 本来想写个短时间没处理的话,延长检查时间,后来想想本来时间就不短,没必要加了。 // ==UserScript== // @name 豆瓣豆油提醒脚本 // @namespace http://0x55aa.com/ // @version 0.1 // @description 豆瓣豆油提醒脚本,来豆油后进行弹窗提醒! // @author 0x55aa // @match https://*.douban.com/* // @grant none // ==/UserScript== (function() { 'use strict'; // 检查间隔 var interval_ = 30000; var interval = 30000; var notify_time = 0; // 提醒 if (Notification && Notification.permission !== "granted") { Notification.requestPermission(function (status) { if (Notification.permission !== status) { Notification.permission = status; } }); } function notify() { notify_time = new Date().getTime(); var titleText = "豆油来啦"; var options = { dir: "ltr", lang: "utf-8", icon: "https://img3.doubanio.com/favicon.ico", body: "请赶快处理!!!!!" }; if (Notification && Notification.permission === "granted") { var n = new Notification(titleText, options); } } function check() { // console.log(notify_time); // console.log(interval); console.log($('#top-nav-doumail-link').children().text()); if ($('#top-nav-doumail-link').children().text()){ notify(); } } var timer = setInterval(check, interval); })();

Continue

在Mac上写cocos2d游戏代码的时候,写了个label,调了几次没居中,突然想到是不是mac屏幕的原因。然后鼠标滑了一下看了一下还正好差一倍居中。 然后网上搜了一下,在github上找到了解决方案。 HiDPI屏幕都会有这种问题,有两种patch,一个改pyglet的,一个改cocos2d的,然后我手动改了一下cocos2d的代码解决了。 话说cocos2d不更新了,维护也不知道会不会改。突然感觉选择cocos2d有点虚了。 issues:https://github.com/los-cocos/cocos/issues/303

Continue

scheduler.New() 定义在kubernetes/pkg/scheduler/scheduler.go 返回一个Scheduler type Scheduler struct { config *factory.Config } 首先先用New传过来的参数替换schedulerOptions默认配置 type schedulerOptions struct { // 调度器的名字,pod创建的时候可以根据这个名字选择使用哪个调度器,默认值"default-scheduler" schedulerName string // hardPodAffinitySymmetricWeight int32 disablePreemption bool percentageOfNodesToScore int32 bindTimeoutSeconds int64 } 然后调用factory.NewConfigFactory创建一个factory.Configurator,需要传入一个factory.ConfigFactoryArgs 还有个configFactory,这几个差不都都是参数传进来的几个值,具体还不知道干什么的。先看几个参数吧。 cc.InformerFactory.Core().V1().Nodes() 对应类型 nodeInformer coreinformers.NodeInformer 其中cc.InformerFactory在kubernetes/cmd/kube-scheduler/app/options/options.go中初始化: c.InformerFactory = informers.NewSharedInformerFactory(client, 0), 创建一个新的factory, 结构体主要为cc.client和informers map[reflect.Type]cache.SharedIndexInformer. Core()是New了一个新的group, 感觉还是啥没有,还是factory那几个值。 V1()是New了一个v1,返回一个version,还是哪几个值. Nodes() 传的还是那几个值,返回一个nodeInformer. 最重要的就是保留了factory,然后能够调用nodeInformer接口下的几个方法。后边用的吧。 nodeLister: args.NodeInformer.Lister(), 在NewConfigFactory()里创建configFactory的时候,调用了.Lister()方法。 func (f *nodeInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { return NewFilteredNodeInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) } func (f *nodeInformer) Informer() cache.SharedIndexInformer { return f.factory.InformerFor(&corev1.Node{}, f.defaultInformer) } func (f *nodeInformer) Lister() v1.NodeLister { return v1.NewNodeLister(f.Informer().GetIndexer()) } 调用太多,看代码最烦的就是调来调去,然后还有各种新数据定义,翻来翻去然后回不来了。。。 corev1.Node 这个里边应该都是返回的数据格式类型定义, 没细看。 看InformerFor里边defaultInformer是个真正调用的函数, InformerFor就是用来包装了一下 v1.NewNodeLister 看起来就是定义的restful api的请求。 看的有点细,其实这部分都是client-go里的,是封装的api请求,应该是分不同资源请求不同的interface cc.PodInformer 看这个应该比较重要 c.PodInformer = factory.NewPodInformer(client, 0) 用来返回non-terminal状态的pod configFactory其他初始化参数不看了,后边用到再看。

Continue

代码读的master上最新的 1641ff411. 命令入口文件在kubernetes/cmd/kube-scheduler/scheduler.go 主要就两句,设置启动参数。其他的设置命令行参数和日志打印。具体不看了 command := app.NewSchedulerCommand() command.Execute(); NewSchedulerCommand 在文件kubernetes/cmd/kube-scheduler/app/server.go 很多代码都是设置scheduler命令参数的,也是用的cobra这个库,跟docker是一样的。 opts, err := options.NewOptions() 读取默认配置 runCommand()执行命令 runCommand 比较有用的几行: c, err := opts.Config() 这里边东西比较多,比如初始化kube-client与api交互,eventclient,选举相关的配置。没仔细看,代码在kubernetes/cmd/kube-scheduler/app/options/options.go cc := c.Complete() stopCh := make(chan struct{}) 这个channel传入了Run函数,Run只会在报异常或者这个channel关闭的时候返回 是用来配合context提示go协程退出的 函数最后调用return Run(cc, stopCh) Run() 生成一个新的scheduler, sched, err := scheduler.New() 后边启动了事件传输,监控选举的,还有监控和指标收集的,这个先不看了。 再后边就是stopChannel配合context管理协程,还有一个leader选举的功能,是通过cc.LeaderElection参数来控制的. leader选举功能开启是为了高可用的时候使用 无论是否leader选举,最后都进入sched.Run()

Continue

这个问题官方github上有说,学了新知识,记一下。 wine-binfmt这个包没找到,然后我就继续安装,软件启动了但是没办法编译代码。issue上有排错,确实是wine安装问题。我在issue里边找到了解决办法。 手动添加一个解析 Windows 的 exe 的 binfmt 配置 vim /usr/share/binfmts/wine 内容填入 package wine interpreter /usr/bin/wine magic MZ 保存退出,更新一下配置就好了 sudo update-binfmts --import wine

Continue

办公电脑代码比较多,不方便网上共享,然后跟自己用的电脑同步一些东西比较麻烦。想着直接把办公电脑ssh内网穿透,这样回去看一下办公电脑上的文件就方便多了。 办公电脑基本不关机的。然后出口端口映射这些方法就不用想了,我正好有一台阿里云主机,网上找了一个反向隧道的方法。 在阿里云机器上.ssh/authorized_keys添加办公电脑的ssh公钥,准备两个空闲端口5678和54345端口。 办公电脑上安装autossh。 sudo apt install autossh 办公电脑上执行 autossh -M 5678 -fN -o "PubkeyAuthentication=yes" -o "StrictHostKeyChecking=false" -o "PasswordAuthentication=no" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 123.56.21.222:54345:localhost:22 userN@123.56.21.222 -p61397 # “-M 5678” 选项指定中继服务器上的监视端口,用于交换监视 SSH 会话的测试数据。中继服务器上的其它程序不能使用这个端口。 # “-fN” 选项传递给 ssh 命令,让 SSH 隧道在后台运行。 # “-o XXXX” 选项让 ssh: # * 使用密钥验证,而不是密码验证。 # * 自动接受(未知)SSH 主机密钥。 # * 每 60 秒交换 keep-alive 消息。 # * 没有收到任何响应时最多发送 3 条 keep-alive 消息。 # 如果你想系统启动时自动运行 SSH 隧道,你可以将上面的 autossh 命令添加到 /etc/rc.local。 ssh userN@123.56.21.222 -p 54345 #登录办公电脑

Continue

之前搞过一轮,又搞了一次。把试过的几种方法总结一下。 一种适合基本普通的安卓apk包,基本流程就是 1 右击apk包,使用mac解包工具解压, 2 把classes.dex转成jar包,cd ~/Downloads/dex2jar-2.0/ ./d2j-dex2jar.sh -f ~/Downloads/game.v316602/classes.dex 3 使用工具查看jar包源码,反编译java代码。 cd ~/tmp/jadx/build/jadx/bin -:> ./jadx-gui 然后想提取游戏资源,有的素材没加密可以直接从解压包里找到。其他针对不同情况从网上找了几种工具。 一种万能的工具: 一种英伟达的: 下载地址在这里 https://developer.nvidia.com/gameworksdownload 下载Tegra Graphics Debugger 支持Mac Linux Windows Tegra 机型查询 http://www.nvidia.cn/object/tegra-phones-cn.html 一种高通的: 下载地址: https://developer.qualcomm.com/software/adreno-gpu-sdk/tools 其他根据用的游戏框架不同,比如unity的框架,有专用的工具破解游戏资源。

Continue

又换ubuntu环境开发了,没找到好用的mysql客户端。用了几天mysql workbench,发现用不了,太难用了。准备还是用命令行来解决。 新建-:> vim ~/.my.cnf -:> cat ~/.my.cnf [clienttest_icloud] host=10.144.12.36 port=3306 user=icloud password=_icloud database=icloud .bashrc里边配置: alias db_test_icloud="mysql --defaults-group-suffix=test_icloud" 然后就可以直接执行db_test_icloud 来链接数据库了。

Continue

粗略的找了一个字体,要求不高,看着还行,然后小写l的样子有强迫症。最后选了一个monospace,总共看了没几个字体,这个就是下划线难看。以后再说 用打thinkpad,触摸板三指手势没搞定,网上的方法不好用,等后边再看看。 快捷键,准备把alt和ctrl调换一下,然后改一下终端tty的ctrl c中断。从网上搜了一下方法。 lsusb来确定外接键盘的vendorID和productID: dmesg 按键ID用的我之前文章里写的键盘记录工具。 /etc/udev/hwdb.d/ -:> cat external_keyboard.hwdb evdev:input:b*v0510p0032* KEYBOARD_KEY_0x700e2=leftctrl KEYBOARD_KEY_0x700e0=leftalt 执行更新操作 sudo udevadm hwdb --update sudo udevadm trigger --sysname-match="event*" 发现更改了也不好用,怎么都不能跟mac那样,还得改回去,看来只能慢慢适应了。

Continue

有测试机可以使用,但是想了想还是在自己电脑上装一份,就是低配mac硬盘不够用啊。 稳定版下载地址: https://download.docker.com/mac/stable/Docker.dmg 找了一圈好像稳定版都是这个地址。 还在下载,说说问啥要自己电脑上搞一份,准备把之前写的mysql查询平台放到github上,之前同事有要。想了想虽然没啥技术含量,放到github上搞个镜像,写个脚本,一键启动。这样方便安装,虽然项目我基本都写安装文档,但是还是一键启动的爽。初步想法是写个Dockerfile,执行安装脚本build。这样更新的话还是需要重新build。先这么搞搞看看。 动动鼠标,然后就安装成功了? -:> docker version Client: Version: 17.09.1-ce API version: 1.32 Go version: go1.8.3 Git commit: 19e2cf6 Built: Thu Dec 7 22:22:25 2017 OS/Arch: darwin/amd64 Server: Version: 17.09.1-ce API version: 1.32 (minimum version 1.12) Go version: go1.8.3 Git commit: 19e2cf6 Built: Thu Dec 7 22:28:28 2017 OS/Arch: linux/amd64 Experimental: true

Continue