All posts by nisiyu

移动端前端学习——关于rem还有chrome 12px以下字体的问题

之前出国了三个星期工作,感觉自己的“正事”都没有好好干,原先写了点前端的作业,还好在笔记本里面记了点东西,在这里做点回顾,稍微写点儿东西,希望有人正好看到能够得到有些帮助。

这回是我第一次接触到移动端的前端,并且做了一个小任务,在几天内设定了个deadline,时间还是很紧的。然后我就邀请我的好朋友圣神给我来点突击进修,圣神答曰:rem很重要,于是我就去学习学习了用rem来自适应。

首先,我先来讲讲rem和px,可以说pixel是我们最经常见到的一个尺寸单位,是一个固定的单位,相对于显示器的分辨率大小来确定,所以设备打开浏览器时窗口已经有了固定的一个px大小的宽度和高度。

em是一个相对的单位,它可以相对于它的父元素计算大小,如一个父元素中字体大小为10px,则子元素中如写的是2em,则就会计算为10*2=20px。

rem与em更有不同,所有的子孙元素全都以根元素为相对尺寸计算大小,如果用于自适应不同设备的大小的话,就十分方便:只需要修改根元素的size大小,则全部以rem为单位的大小就会自适应的按比例放大缩小。

这样的话,只要根据设备的尺寸来调整根元素的字体大小,就可以自适应屏幕尺寸了。

于是我便从网上找了一个js查询屏幕宽度来自适应的代码并修改:

(function(win) {
    var doc = win.document;
    var docEl = doc.documentElement;
    var tid;

    function refreshRem() {
        var width = docEl.getBoundingClientRect().width;
        if (width > 640) {
            width = 640;
        }
        var rem = width / 6.4;
        docEl.style.fontSize = rem + 'px';
    }

    win.addEventListener('resize', function() {
        clearTimeout(tid);
        tid = setTimeout(refreshRem, 300);
    }, false);
    win.addEventListener('pageshow', function(e) {
        if (e.persisted) {
            clearTimeout(tid);
            tid = setTimeout(refreshRem, 300);
        }
    }, false);

    refreshRem();

})(window);

 

获取documentElement记在docEl变量中。使用getBundingClientRect().width获取设备宽度,判断是否大于640,以640px作为最大值,如果小于640px时,将width/6.4作为一个rem赋值到根元素的字体大小。因为设计图是640px宽度的,所以这样计算起来比较方便,例如20px的大小,就可以标注为0.2rem。

请注意,这个6.4原来不是6.4,原来我设置了64。因为想这样的话,数字会比较整。但是后来就发现了坑,我用chrome调试器在小屏幕下,字体和形状会变得很大,溢出整个空间。

假如宽度是480px,所以根元素中的字体大小为480/64=7.5px。

然后,神奇的事情发生了,我观察调试器中的字,居然是12px。为什么算错了?

后来我想起来之前看一些面试题的时候,其中有一个知识点是chrome默认只能渲染12px及以上字体,需要加入一些代码来hack才能低于12px字体。我当时还在想,这个知识点好没用啊,小于12px的字体根本不常用嘛!结果居然没过多久就收flag了。chrome里小于12px的字体都会计算成12px,所以根元素的字体大小增大了。

因此我将这个系数从64转为6.4,这样能够保证能够算出大于12px大小的字体。

CTF之ppc stega misc(新坑预告:好玩儿的东西要来了!)

最近厂里决定要做些能力提升项目,然后几个人分别去了解一些CTF题目和writeups,出点题目给组里的人做,然后我看的主要是ppc,misc和stega,先介绍一下这3个类型。

ppc是编程练习,不像那些OJ的算法题,他可能要求一个短时间内做出一个工程的能力,对算法的要求不是很苛刻,只要在有闲时间内解决一些问题即可。

misc是杂项题,比如给你一个抓包,让你针对这个抓包去做取证之类的工作,主要比较需要熟悉wireshark的用法,各类协议的熟悉程度,考察的知识范围非常广。

stega是隐写术,给人一个图片或者一段音频或视频,里面可能用某种方法隐藏着信息。

第一期的游戏也如火如荼地进行着,看着大家做着我的题被我坑,我自己也在题目谜面中疯狂玩梗,还是很有成就感的。突然觉得可以自己做个解谜游戏。(当然,更接近程序员的方式)

 

原来我的题是以同事的名字命名的,叫XX历险记,我准备布到vps上的话,就不用这个名字了,嗯,想到了再说。

关于其他类型的,主要就是最关键的二进制还有第二关键的web题了,这个我自己知道的内容也有限,没办法设计得很好,所以我还是以上述3类的解谜游戏为主,敬请期待。

CVSS3 calculator 关于CVSS3和CVSS2的区别

最近在学习前端的一些技术,自己瞎做点东西。之前看到了个CVSS3,感觉公式还是挺复杂的,于是想做个动态的计算器,也算进行一点交互的小练习,链接在下方。(只有基础分)

www.nisiyu.com/CVSS/calc.html

CVSS全称是Common Vulnerability Scoring System的缩写,用CVSS的评分通常能够衡量一个漏洞的严重程度。

因为一开始查CVSS时都没有料到是CVSS3,因为平时工作上用到的都是CVSS2的打分,然后发现新增加了2项,挺有意思。这里我主要关注的是基础分。

CVSS3相比CVSS2明显的区别:

新出了2个维度,

利用维度中多了个UI user interaction维度,评价攻击者若要利用的话是否有一个正常用户正在执行操作,比如CSRF漏洞,通常需要别人点击一个钓鱼链接;比如有些漏洞只在系统更新时或者安装时才能利用,安装完毕后不能利用等,都是解决原来没有这个维度的情况。

单独多出了个新的维度 S Scope,评价了攻击者在使用这个漏洞时能否达成域的变迁,我认为这里应该是面对的是越来越多的虚拟化云化的产品,有些比如从虚拟机中系统调用实现中的漏洞可以使攻击者达成横向越权纵向越权,实现虚拟机逃逸,都可以算作是Scope Changed,比Scope Unchanged的情况更加严重。

至于还有什么具体的,还是直接扔原文链接吧,不误导人:

https://www.first.org/cvss

 

 

 

换了个vps,博客重开

稍微折腾了一下环境,主页还没有弄好,之后准备主页有博客链接同时也有作品的链接,这样能够更加方便立体地进行展示。

之前的vps没有看速度,真是慢的一比,连上去老是断,没办法只好换了家,选择了日本的服务器,这样访问也稍微快一点,几乎没有丢包,100的延迟,还不错。

看了看那些静态页面的博客系统,虽然比较geeky也比较hacker,最终还是选择了wordpress,还是觉得富文本编辑加上文章的迁移。明天写点别的充实一下,继续前行,怀挺!

py全景图生成器开发感想

说点背景:由于厂里有时候要做些PPT,喜欢把一件事涉及到的各种元素揉在一起放个图,那天我看到一个同事,做了一张很大的图,我问他这样的图有没有模板可以自动生成,回答没有,是一个个拖的。这时我就想做一个自动生成类似全景图的内容,也算是在平时做做toy project练练手。

项目地址:

https://github.com/nisiyu/overviewPictureBuilder

先上个示例图,当然了,觉得丑的话很正常,目前起码实现了自动排版的方法:

output主要还是说说几点感受:

1. 评价一下现在做的成果,跑起来了,但是比较粗糙,还是有很多可以优化的地方。现在我设计的一套格式如果想改变样式会非常麻烦,还要进python脚本修改函数的参数。而且在程序编写时发现与一开始想的会有出入,就临时推倒了一开始的想法。于是该功能的定位和思路就变得很奇怪。而且因为只有自己写,想改就改,随心所欲,在真实项目环境中应该是大忌。

2. 感觉如果遇到问题用中文进行搜索的话,会很难搜索到想要的答案。可能是百度的锅,也有可能找答案的方式和输入的语句不专业,比如我形容一个页面的XXX动作,外行跟内行描述的语汇会不一样,专业的语汇更有可能找到哦专业的答案。在这个项目中我是用了PIL模块,因为要自动排版,我需要在绘制字之前计算字的高度和宽度,但是搜相关关键字加“宽度 高度”这类都很难搜到,最后还是求助了官方文档,有一个textsize的API。同时源代码中也有相应的API。

3. 熟练化一些Python语法特性,List Generation 是一个比较具有python特点的内容。

当我想要进行一个多维序列的一个初始化,我一开始运行了第一行的代码,发现无法正常运行,发现乘法符号只是浅拷贝[[]]中[]元素,相当于把引用复制了3次,放在序列list1中,后来改用了List Generation的方式,感觉其实和之前介绍的map函数的作用比较相似,每次都生成一个全新的空序列,而且如果[] for i in range(3)是由圆括号包裹的,则是一个generator,不会立即求值,而会在迭代过程中求值,和序列有所不同。
[code lang=”python”]
# list1 is shallow copy if I changed list1[0], list[1] list[2]will always change
list1 = [[]]*3
list2 = [[] for i in range(3)]
list1[0].append(1)
list2[0].append(1)
print ‘list1’, list1
print ‘list2’, list2

# the following is print result
list1 [[1], [1], [1]]
list2 [[1], [], []]

# the following is a generator
generator = ([] for i in range(3))

[/code]

个人理解这里也是给程序员一种快捷的编写方式能够更加便利地通过一个序列生成另外一个序列,不过它也有不是一一对应的,和map函数有所不同,序列生成可以增加条件,如下代码就计算了0-9序列中序列中元素的平方小于50的序列,就将原来的序列的部分映射出来了。

[code lang=”python”]
# list generation with condition
print [i for i in range(10) if i*i < 50]

[0, 1, 2, 3, 4, 5, 6, 7]
[/code]

打一针鸡血,我继续装逼去了。

提升自己的道路也正在不断进行,与工作时间互相切换,感到有点疲倦。要完成转型的话,留给我的时间并不多了。。。

前些天在豆瓣阅读上看了两本小电子书,《程序员跳槽指南》和《谈谈全栈工程师》,篇幅不长,像是程序员的杂文集,都给人说了一下互联网程序员的一些技术路线,如何打造自己个人的品牌,如何提升自己,选择职业,感觉还是有些受益的。

总的来说,还是需要多与人交流合作,如在开源项目中贡献自己的一份力,是一项非常关键的能力,提到开源项目,有一句话我非常欣赏:“如果因为自己代码差就不开源,这是说不过去的。”。如果真能接收到有意义的骂或吐槽,那对我的代码也是很有意义的,而且我也会更想去提升这代码的质量。

挖掘一下自己的能力,感觉确实没有很亮眼的地方,写了写简历,发现也是一个技能罗列,并没有说出什么特殊的部分,无力感还是很强的。所以很需要搞些能装装逼的东西~搞搞搞。

看了《谈谈全栈工程师》这篇文章后,觉得很必要将博客转到GitHub Pages上,进一步提升自己的逼格。这里主要写点看书心得,发发牢骚之类的,如果可以的话会部署个人作品。技术类的还是希望能够搞到GitHub Pages上。

不管怎么样,还是先开始水吧

最近又是一股对现在生活的极度厌倦和对别的生活的向往,感觉自己入错了行,感觉之前太安于现状。

偶尔对一个同事说起过觉得自己实力太差一定要提高,然后对方却一股劲地鄙视技术道路,给我泼冷水说前路没有希望,不会到很高的位置,而且有太多的人比我牛。确实让我心凉了一截,对,他说的没错,我要是很牛的话,我也不会落到现在这个地步。但人也不是为了爬到顶点而存活着的,我想要走技术线,是因为享受其中的有趣。

今年要不要订个计划呢?我往回翻了翻刚开这个博客时的列表,然后笑了。。。

先不要定宏伟的目标吧,无论怎样,我就坚持经常写日记,以两三天的频率开始水,说不定哪一天回头看时就熬成了一碗汤。

吹吹逼,最近看一本《沟通的艺术》,里面有一个章节提到知觉验核,具体的话我就不用社科书上文绉绉的翻译腔来复述了。主要是说不要武断地判断别人的真实想法,要想知道,还是需要问对方。

书中就提及如何优雅地问对方,看完以后我感到很有趣,想起我平时有很多武断判断“她喜欢我”的故事,可以跟平时我遇上的“她喜欢我”的故事联系起来。

“首先描述观察到的现象”——“我发现你刚刚在看我”

“提出你对这个现象的两个假设”——“我觉得你可能是喜欢我也有可能是发呆”

“然后说明你很想知道对方是怎么想的”——“所以你到底喜不喜欢我”

我的这个例子举得有点歪,哈哈。

不过这里还是感觉到了沟通的一些智慧在里面,关键是提出两个对于对方行为和现象的假设。既能够表现出自己的疑惑,也能够表示出自己认真思考过可能的原因,也能够降低对方的防备心理。可能对方在想“你既然都能差不多猜中了那就告诉你吧”,如果在疑问时把填空题变为一个选择题,可能在生活中的沟通还是很实用的。

 

开坑预告

最近在单位时疯狂摸鱼,玩了点代码分析的内容,看了一门技术叫符号执行,接触到了LLVM和klee工具觉得有点意思,虽然对原理我说不出个所以然来,但是工具确实很厉害。也不枉费我花了1-2天时间才部署好。。。(当然也是因为遇到了几个坑)有机会的话,我会在家里也做做实验,来分享一下大家关于符号执行的奥秘。

另外,我厂是个胶片汇报公司哈哈哈,我上次想到个idea,准备做一个自动生成xxx全景图的框架,这样的图片在我厂的胶片中非常普遍,关于算法之前想了些,主要还是需要熟悉熟悉一些出图的API,写出来的话也会秀秀。

还有,想起买的Leap Motion和Rhaspberry Pi都没玩过,有点想做个手势控制的收音机?好吧,这个项目肯定会鸽,不用抱什么希望。

关于博客,感觉自己还是要经常写,最近在公司内网把我几个写的小项目加上了markdown,觉得博客还是用markdown写比较好,计划找找插件更新一下吧。

 

晚来的新年博客

我似乎已经很久没有写过博客了。。。

不出意料的,我基本上鸽了所有的去年信誓旦旦立下的目标。。。

回顾一下2015年做了些什么,感觉技术上没什么提升,可能python用得更加熟了点吧,上班摸鱼的时候重新回顾了一下django并且着手搞了搞,做个自娱自乐的项目,把它和代码扫描器集成到一起。然后觉得,仔细阅读一下django框架的官方说明,一步步的文档让我有种如沐春风的感觉,django的官方文档真是太友好了,学习起来十分舒服,而且,英文原版的字体和颜色都很好看。

2015年身体变差了很多,体重增加,体检指标不好,白发蹭蹭增多,在一段时间内我选择了去健健身,但是一段时间疯狂忙碌也把这个放下了,身体状态比较糟糕,希望健身还是能坚持下去吧,在我健身的那两三个月里确实精神状态好了不少。

夏天的时候认识了个人,本来以为一切都像小说或电影般的美丽邂逅,发现都是我的泡影,还以为自己偶尔能当回男主角呢。。。

上半年工作关系去了西班牙,然后项目中途破产,独自在西班牙流浪,疯狂寻找美食,一个人独游,没有让我感到很惊艳的地方。下半年请了几天假,与弟弟去了日本,感觉真是开心,还想要再去,吃的感觉又好,旅游景点也还不错。

心血来潮上了几天coursera,看了会机器学习还有前端的内容,好吧,前端的内容仅仅涉及到bootstrap,突然意识到了几年前面试时别人问我的问题,原来仅仅上了2课就找到了答案。。。不过结果是。。。我显然也没有上完这些课。

学习了一会吹奏口琴,上网买了把布鲁斯十孔口琴,对着网上教程,学了点最基本的吹奏,但是随着教程往后,二把位感觉吸气好难啊。。。然后不知不觉很多时间没吹了,发现摔了一下把一个音摔坏了,吸不出来了。

whatever,讲了这些七七八八,我也许是平庸的人,但是想想我做的种种尝试,我应该还没有完全对生活失去希望吧,2016年希望自己还是一个有意思的人,干点值得人称道可以装逼的事。

黑客的情怀——《黑客与画家》读后感

《黑客与画家》一直是我挺想看的一本书,但是作为一个拖延症患者,迟迟没有看过,有一天突然有个人给我分享了个微盘(反对盗版,支持正版,我一定会补上买书的钱的!),于是我在手机上用一点空闲的时间把书看完了。

看这本书的时候,各种欣喜,相见恨晚的感觉,有时觉得仿佛说出了自己一直在心里却因为表达能力有限没有办法表达出来的话。

印象最深的几点,一是文章的开头所讲述的关于聪明、极客、黑客的理念,讲述nerd为何在学校中被欺负,为什么在人群中显得一点也不酷。又说了hacker是原先是一个褒义词,说明了一个人对这件事非常精通,很能动手。书里说到“聪明是我最大的梦想,如果要用聪明换取受欢迎,我肯定是不愿意的”,作为我来说,我觉得很多时候我有自己的想法,不随波逐流,倔强地相信自己所思考的内容,这些都是我的优势,让我自认为是比在周围的人们聪明的部分。当然啦,上班上久了就觉得越来越蠢了。。。

第二点就是说自由,保持自己的想法,自由地思考,并且付诸行动,去打破和颠覆那些陈腐的东西。不断发明新的轮子,这就是黑客的情怀。忽然间想到了Linux,想到了GNU,开源真是给软件业乃至整个世界带来了一场革命。不断地去思考现有的东西中能够改进的东西,然后自己去创造它,这样的事太酷了!我也想写更多的代码,先不去想这些代码写得好不好,也不管有没有这样的轮子,或是展示出来怕被打脸,而是应该做出来,show the code。

第三点印象深的就是本书对财富的定义,书中提到的理念十分有趣。说到贫富差距大人们第一想到的是社会的黑暗,还有为富不仁。变得富有可以有贿赂和欺骗的手段,这种手段并不创造财富。有些发明创造方便了人类生活,有些分工优化增加了生产效率,有些金融手段帮助了那些创造者更好地创造,都是创造财富的。《黑客与画家》也是一部很鼓吹创业的书,看得我燃起来了,因为在小的精英化的团队更有可能成为财富高密度的创造者,而不像在大公司内要为了办公室政治和KPI比拼,花许多时间在不创造财富的工作上。

追求自由,发挥自己的聪明才智创造财富,就是黑客的情怀吧。