Vanishcode の blog
vanishcode / blog Goto Github PK
View Code? Open in Web Editor NEWvanishcodeのblog
Home Page: https://vanishcode.com
vanishcodeのblog
Home Page: https://vanishcode.com
Vanishcode の blog
比如在vue里组件标签会转换成连字符形式。之前面试两次都遇到了,然后没了sp。。
let str1 = 'marginLeft'
console.log(str1+' => '+
str1.replace(/([A-Z])/g,function($1){
return '-'+$1.toLowerCase()
})
);
let str2 = 'margin-left'
console.log(str2+' => '+
str2.replace(/-([a-z])/g,function($1){
return $1.toUpperCase().slice(1)
})
);
注意replace后面第二个参数可以是一个函数,用$1这样的字符代表匹配到的对象,于是我们可以在函数里面处理这个匹配项返回我们想要的结果。
代码链接:
RSA的历史就不细说了,自己去WIKI
主要有两个部分:
#include <iostream>
#include <cmath>
#include <cstring>
#include <ctime>
#include <cstdlib>
using namespace std;
int Plaintext[100]; //明文
long long Ciphertext[100]; //密文
int n, e = 0, d;
//二进制转换
int BianaryTransform(int num, int bin_num[])
{
int i = 0, mod = 0;
//转换为二进制,逆向暂存temp[]数组中
while (num != 0)
{
mod = num % 2;
bin_num[i] = mod;
num = num / 2;
i++;
}
//返回二进制数的位数
return i;
}
//反复平方求幂
long long Modular_Exonentiation(long long a, int b, int n)
{
int c = 0, bin_num[1000];
long long d = 1;
int k = BianaryTransform(b, bin_num) - 1;
for (int i = k; i >= 0; i--)
{
c = 2 * c;
d = (d * d) % n;
if (bin_num[i] == 1)
{
c = c + 1;
d = (d * a) % n;
}
}
//printf("%lld\n",d);
return d;
}
//生成1000以内素数
int ProducePrimeNumber(int prime[])
{
int c = 0, vis[1001];
memset(vis, 0, sizeof(vis));
for (int i = 2; i <= 1000; i++)
if (!vis[i])
{
prime[c++] = i;
for (int j = i * i; j <= 1000; j += i)
vis[j] = 1;
}
return c;
}
//欧几里得扩展算法
int Exgcd(int m, int n, int &x)
{
int x1, y1, x0, y0, y;
x0 = 1;
y0 = 0;
x1 = 0;
y1 = 1;
x = 0;
y = 1;
int r = m % n;
int q = (m - r) / n;
while (r)
{
x = x0 - q * x1;
y = y0 - q * y1;
x0 = x1;
y0 = y1;
x1 = x;
y1 = y;
m = n;
n = r;
r = m % n;
q = (m - r) / n;
}
return n;
}
//RSA初始化
void RSA_Initialize()
{
//取出1000内素数保存在prime[]数组中
int prime[5000];
int count_Prime = ProducePrimeNumber(prime);
//随机取两个素数p,q
srand((unsigned)time(NULL));
int ranNum1 = rand() % count_Prime;
int ranNum2 = rand() % count_Prime;
int p = prime[ranNum1], q = prime[ranNum2];
n = p * q;
int On = (p - 1) * (q - 1);
//用欧几里德扩展算法求e,d
for (int j = 3; j < On; j += 131)
{
int gcd = Exgcd(j, On, d);
if (gcd == 1 && d > 0)
{
e = j;
break;
}
}
}
//RSA加密
void RSA_Encrypt()
{
cout << "Public Key (e, n) : e = " << e << " n = " << n << '\n';
cout << "Private Key (d, n) : d = " << d << " n = " << n << '\n'
<< '\n';
int i = 0;
for (i = 0; i < 100; i++)
Ciphertext[i] = Modular_Exonentiation(Plaintext[i], e, n);
cout << "Use the public key (e, n) to encrypt:" << '\n';
for (i = 0; i < 100; i++)
cout << Ciphertext[i] << " ";
cout << '\n'
<< '\n';
}
//RSA解密
void RSA_Decrypt()
{
int i = 0;
for (i = 0; i < 100; i++)
Ciphertext[i] = Modular_Exonentiation(Ciphertext[i], d, n);
cout << "Use private key (d, n) to decrypt:" << '\n';
for (i = 0; i < 100; i++)
cout << Ciphertext[i] << " ";
cout << '\n'
<< '\n';
}
//算法初始化
void Initialize()
{
int i;
srand((unsigned)time(NULL));
for (i = 0; i < 100; i++)
Plaintext[i] = rand() % 1000;
cout << "Generate 100 random numbers:" << '\n';
for (i = 0; i < 100; i++)
cout << Plaintext[i] << " ";
cout << '\n'
<< '\n';
}
int main()
{
Initialize();
while (!e)
RSA_Initialize();
RSA_Encrypt();
RSA_Decrypt();
return 0;
}
ios8 下,滑动可能会出现1px的元素残留,可以通过加白边的hack方式解决~
前提:应用包已经写好 && 有web开发基础
https://www.cnblogs.com/tfanalysis/articles/4119274.html
基本就是MVC那一套,HTML模板,然后对应的接口
理论上自己跑一个服务器,如py或node然后用自己的接口提供给controller目录下的纯HTML使用,以此来达到GUI的目的控制自己的软件,也是OK的,难度会降低一些
不过目前没有测试环境,开学做好救砖的准备就是啦
好像是某年网易的面试题,今天看到,随便写了一下,没成功,后来好好想了一下,解决了:
function timer(count, delay) {
if(count==0) return
return setTimeout(() => {
console.log('hehe')
timer(--count, delay)
}, delay);
}
timer(3, 2000)
好的、规范的commit信息又帅又整洁,是好项目的基础,网上有一些commit的规范,结合自身我又给自己定了一些规范:
feat: 新功能
fix: 修改、修补bug
update: 更新,特制更新一些信息或者不是“改动”
add: 新增加文件
init: 初始提交
test: 测试
chore: 构建过程或辅助工具变动(偏宏观)
docs: 文档更新,修改(特指)
style: 样式,格式,不修改代码
refactor: 重构(用得少)
突发奇想,用Proxy实现双向绑定不是很容易吗?
然后捯饬出了这样一小段代码。。。
仔细一看,确实挺烂😭
/**
* 直接全挂载实例上了。。。。。。。。。。。。。。。。。。。。。。。。。。
* 握草
*/
const Observer = (data) => {
for (let key in data) {
console.log(typeof data[key])
if (typeof data[key] === 'object') {
//let val = data[key]
return new Proxy(data[key], {
get: (target, property) => {
console.log(`You just visited ${property}`)
return target[property]
}
})
}
}
}
/**
* 测试数据
*/
let data = {
user: {
name: "laowang",
age: "44"
},
address: {
city: "gebi"
}
};
let app = Observer(data);
这个月真是不知道什么好。
开始几天对任何事毫无兴趣,失去了梦想。。后来随便投简历,再到后来拿到第一个实习offer,焦急等待,然后陆续又拿了几个实习offer,很开心~生活充满了希望!我们不能放弃!哈哈哈。
BAT只拿了一个狼厂,比较想去鹅厂来着。。。小公司害怕,不敢去。
来北京。
几乎天天倒霉,无论是迷路还是丢公交卡还是没现金办卡。
工作上,貌似是拿来凑人手的。。?简历上并没有写PHP相关任何东西,因为这么多语言最烦PHP。。
然后还是来了。
晚上9点之后没有车,要不打滴滴,要不在公司过夜,不过,反正在哪里睡觉都很难受。
然后最近才有时间复习,感觉要挂科。。。
哎呀,修bug到了快凌晨3点,但是没那么不开心。
西二旗菜鸟码农一枚
2018.5.25
地址: Solo-GitHub
下载war
包解压后,进入目录,输入
java -cp WEB-INF/lib/*:WEB-INF/classes org.b3log.solo.Starte
就行了,贼简单:)
😏 挂起:
nohup java -cp WEB-INF/lib/*:WEB-INF/classes org.b3log.solo.Starter >/dev/null 2>&1 &
访问地址: vanishcode-another-blog
主要是两个问题,Nginx配置反向代理,Latke 配置
#### Server ####
# Browser visit protocol
serverScheme=http
# Browser visit domain name
serverHost=myblog.com
# Browser visit port, 80 as usual, THIS IS NOT SERVER LISTEN PORT!
serverPort=
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
本文灵感来源于广为流传的霓虹人写的一串颜文字,解出来看看我说了什么。。
仔细想了一下,其实原理并不复杂.
浏览器打开开发人员工具,输入进去,告诉我你看到了什么:
[]+[] // “”
{}+{} // "[object Object][object Object]"
[]+{} // "[object Object]"
{}+[] // 0
类型转换,结果出现了字符串,利用这样的原理可以写出英文字母的对应式子,如
(({}+{}).toString().split(''))[1]
就是字母 “o”,然后之前的那个转换也同样可以得出数字,也就是数组下标,这样就可以全是颜文字啦
说了那么多,你还是,http://www.jsfuck.com 自己玩去
水水的给什么教程都白搭
牛逼的要么是大牛亲手带大,要不就是自学成才
我补充:
当前学编程的:
水笔特别多,而且还目中无人,一旦学点东西,就骄傲的不得了,别人说几句就开始喷
常常和伸手党联系在一起:谁有写好的,发我一份
脑残问题特别多,行动能力极其差,很懒,
开口就是自己谷歌能解决的问题
做之前总是问这问那,总是想怎么才能最简单而不是怎样才能好好完成项目
本文为自己在2018年春招实习、秋招找工作中遇到的、想到的不是特别常见但也不是很次要的知识点、面试题。
持续更新~
1.navigator中的user agent属性是怎么来的
是navigator.appCodeName和navigator.appVersion拼接组合来的,而这两个是浏览器解析http请求包头ua字段来的
2.cookie禁用?
navigator.cookieEnabled
1.queryselector是getelement相关的引用,哪个更快:q
2.trust属性?是否由浏览器发出(不是模拟的
3.tab监控,是否打开另一界面?是否打开了dev tools
4.浏览器排序方法?插入(小于20)、快排(大于20words,chrome),归并(火狐)
5.typeof原理:二进制
6.position属性(其实共9种)
7.DOM 0级、2级、Nodelist,HTMLCollection
1.前端错误监控
https://www.jianshu.com/p/0968fc6290a9
打点、错误上报、性能performance监控上报
1.HTML生命周期
https://blog.csdn.net/Joel_h/article/details/73820070
https://www.cnblogs.com/shapeY/archive/2017/10/13/7662406.html
2.css事件监听?
animationstart balabala
https://developer.mozilla.org/en-US/docs/Web/Events/animationstart
1.XMLHttpRequest对象方法、属性
也请记住不止常用的那些
1.一个div容器,如何做到宽高自动2:1比例?里面加个东西?
加一个图片,宽高2:1的图片就可以
2.script crossorigin选项
3.onerror可以监控加载cdn中jquery库的错误吗?
1.那为什么子类的原型为什么要指向父类的实例,为什么不直接等于向父类的原型
2.debounce
function debounce(fn, delay) {
var delay = delay || 200;
var timer;
return function () {
var th = this;
var args = arguments;
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(function () {
timer = null;
fn.apply(th, args);
}, delay);
};
}
http://www.webfront-js.com/articaldetail/99.html
3.DOM遍历
不用递归或者堆栈(队列)怎么办?
https://blog.csdn.net/u012657197/article/details/73658160
creatNodeIterator(ele,whatToShow,filter,boolean)
creatNodeTreeWalker(ele,whatToShow,filter,boolean)
1.怎样实现一个较为准确的进度条
当时没答出来,现在想想可能是用dom的三个状态及onstatechange监听事件,然后进度条的进度可以用
performance api实现。目前只是想到这些,但是暂时没有去实践过。。
2.改变数组的length,或者在函数内部改变arguments的值(或长度)的影响
1.babel的async/await怎样实现的?
转成promise+generator
2.v-model原理
文档其实有。。。。忘了。。是语法糖(值与事件)
3.webpack打包原理、流程
loader,html link注入,公共抽离,tree-shaking,打包切割?(答案不准)
4.vue的render干嘛的
非组件话组件的一种方式
5.说说js6基本错误类型
Uncaught ReferenceError:引用错误
SyntaxError:语法错误
RangeError:范围错误
TypeError:类型错误
https://www.leixuesong.cn/2825
6.打印什么结果?
var f = function g() {
return 23;
};
typeof g();
7.vue2key作用:
key 的特殊属性主要用在 Vue的虚拟DOM算法,在新旧nodes对比时辨识VNodes。如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法。使用key,它会基于key的变化重新排列元素顺序,并且会移除key不存在的元素。
有相同父元素的子元素必须有独特的key。重复的key会造成渲染错误。
最常见的用例是结合 v-for:
其中之一是每个 HTML 页面的图片数据总量。当移动端的 Safari 浏览器加载了 8 到 10MB 的图片数据后,就会停止加载其他图片,甚至浏览器还会崩溃。
设备:iPhone 6及之前机型
阿里:js、node、前端基础,算法不是特别重要,有点看中高大上
百度:注重基础,css尤其,其他的,vue或者react问的不是特吧、偏重
腾讯:安全、性能、js
美团、滴滴:vue(重点),js
头条,网易:算法
搜狗:动画 html、浏览器基础知识
这篇文章是比较全了
https://www.cnblogs.com/tianshifu/p/6388391.html
直接复制,浏览打开即可~
<!DOCTYPE html>
<html>
<head>
<title>MathJax TeX Test Page</title>
<script type="text/x-mathjax-config">
var mathId = document.getElementById("post-content");
MathJax.Hub.Config({
showProcessingMessages: false,
messageStyle: "none",
extensions: ["tex2jax.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [
["$", "$"]
],
displayMath: [
["$$", "$$"]
],
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code', 'a'],
ignoreClass: "comment-content"
},
"HTML-CSS": { availableFonts: ["STIX", "TeX"], showMathMenu: false }
});
MathJax.Hub.Queue(["Typeset", MathJax.Hub, mathId]);
</script>
<script src="http://cdn.bootcss.com/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<style>
.MathJax {
outline: none;
}
</style>
</head>
<body>
<div id="post-contet">
When $a \ne 0$, there are two solutions to $ax^2 + bx + c = 0$ and they are $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$
</div>
</body>
</html>
先看代码:
<div id="box1" ondrop="drop(e)" ondragover="allowDrop(e)"></div>
另一个:
<div id="box2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
栗子:http://www.runoob.com/try/try.php?filename=tryhtml5_draganddrop
然而,第一个是错误的。。。
形参必须是event,因为这才是事件对象实例,e的话理所当然是undefined,所以就执行不了了~
(话说这是乱七八糟写多了,DOM基本操作忘了好多。。。。。)
如今的构建、打包工具大概有gulp,grunt,webpack,rollup,parcel,bili等等,市面上也提供了想相当多数量的插件、脚手架,甚至一些不太懂开发的人用这些傻瓜式操作都可以完成一个不那么复杂的页面,这是一种好事,但是这并不是重点。。
这些工具出现的目的是为了快捷开发没错,但是,仔细想想,需要复杂逻辑和优化的场景可以说是越来越少了(虽然也不少),很多情况下,开发一个功能很简单的,如查询系统的查询页面,本来手写就ok了,缺还有人用一套构建工具,如vue-cli(webpack等)来构建,当然不是说这个不好,它们都是很棒的工具,但是大材小用的感觉到处都是。。
webpack有14个初始配置文件,你确定都是有用的、缺一不可吗?vue-cli的依赖大概有几十甚至更多,你用得到全部功能么?再者,gulp、grunt和webpack里面需要插件或者loader,没有配套的话基本就不能工作了,而且貌似自己封装是挺麻烦的事,,,所以,综上,
考虑实际情景来选择是否使用构建工具,以及使用哪种构建工具,甚至是自己写一个自己项目配套的构建工具,如百度fis,腾讯的什么幺蛾子最近出的一个工具,还写了一篇webpack的配置讲解文章(呵呵,老铁你招配置工程师么,月薪20k,低了不行.............)
2020年更新
目前工作一年多了,对自己以前写的东西有了新的见解。
少部分页面确实不需要一堆构建工具,jq一把梭就搞定。体量大一些的,直接上vue,react相关这些没啥问题,有ie兼容性要求就用gulp,grunt,配合jq,ie6也不是特别难兼容(我只是说较为简单的页面)
嘻嘻。。。
key:不要刷机
这几天主要试了一下LineageOS13,是移动叔叔论坛里出的,结果各种不稳定。。。
酷安总是不能用。。。然后MIUI9.2压根刷不进去,魔趣也gg。。。
最后刷回了360OS,不过是精简版
不过想刷的,可去移动叔叔那里查,还不算难,关键的有几点
1.注意四清和双清,刷完双清
2.root,使用rec的大叔工具箱,不root会黑屏无限震动,而且不要刷第三方授权管理,否则gg
3.卡刷,注意官方原版包只能去除root才能刷回去
结论:还是别刷了。。。现在市场上很多爪机其实都能刷机了,但是ROM包少的基本都是不稳定的(貌似),想刷机,,买一加,,,,,,,,
demo:改写console
console.log = (function (origin) {
return function (str) {
origin.call(console, "hello:" + str);
}
})(console.log);
console.log("name");
注意这个origin参数就是原来的函数。之前没想明白,改写属性可以,改写方法的话(尤其追加一些操作)原方法怎么执行呢?然后问了一下别人,google了一下,特地记录。
我最讨厌的就是不管什么页面/web应用,只要能在浏览器跑,就一定非得要写一个桌面应用,而且每次都会在最后说明,目前只支持macOS。。。。。。。
哇,,比如一个图片上传的应用,用Swift写的话,打包发布最大应该不会超过15M,而你这,,动不动就50M(至少),,我去了
electron是方便了,但是并不是随便一个页面都应该变成客户端,从用户角度来讲,一个偶尔只用一次的,或者使用的情况特定,如只在浏览器发帖子时用,那么把这种应用做成native客户端的话完全是乱搞,显得自己技术很吊吗。。并不会吧,因为不合适
而且应用体积不管应用本身复杂度如何,体积都会至少达到chrome(其实并不是)内核的50M左右(可能不准),这个其实问题不小的
再者,electron开发的目的是跨平台,兼容性,快速开发,而不是烂大街的web页面变成客户端,
只支持macOS,相当不妥啊,甚至让我有点想笑。。。最起码同步兼容windows啊,,,(逃
{
"name":"Tom",
"phone":"13822222222"
}
var jsf = require('json-schema-faker');
var http = require('http');
var querystring = require('querystring');
jsf.extend('faker', function(faker) {
faker.locale = "zh_CN"; // or any other language
return faker;
});
var schema = {
type: 'object',
properties: {
name: {
type: 'string',
faker: 'name.findName'
},
phone: {
$ref: '#/definitions/positiveInt' // 定位到下方单独配置项
}
},
required: ['name', 'phone'],
definitions: {
positiveInt: {
type: 'integer',
minimum: 13800000000,
maximum: 19900000000,
exclusiveMinimum: true
}
}
};
var sample = jsf(schema);
console.log(sample)
按照通用op挂u盘的当时没有找到,后来发现/dev/bus/usb/001
有个001 和002,插拔不同u盘,确定这就是u盘,于是挂载之。
当然早知道用lsusb
好了。。。。。。。。。
// 修正settimeout
var startTime = new Date().getTime();
var count = 0;
// 模拟延时任务
setInterval(function () {
var i = 0;
while (i++ < 10000);
}, 0);
/*
* 原理:不考虑误差,每次递归,count加一,所以期望当前时间对应是count*1000,相减就是误差,
* 就是相对于正确时间“慢了的”,所以在下次调用自身时应该把这个减去,做到“提前”
*/
function fixed() {
count++;
var offset = new Date().getTime() - (startTime + count * 1000);
var nextTime = 1000 - offset;
if (nextTime < 0) nextTime = 0;
setTimeout(fixed, nextTime);
console.log(new Date().getTime() - (startTime + count * 1000));
}
setTimeout(fixed, 1000);
其实抛开第一个延时模拟,误差不是特别大,但是实际情况中基本上肯定比这个要多,这个只是做到了不累加,所以误差基本上会根据用户情况稳定在某一范围,这样其实基本满足生产要求了。
博通BCM设计架构,是将GPU作为MCU来使用,在启动时,加载bootloader(BL),初始化RAM,外设等,然后启动ARM内核CPU,开始全速运行状态.
这样设计的好处是,ARM11或者ARM-A内核,完全作为核心负责运算;GPU处理视频和外设,这样流畅度应该会比较nice,如果外设不多的话.
就像这次的BCM升级到BCM2836,外设驱动,仅仅需要修改一下GPIO等的对应的真实针脚就ok了.
最近在重新看koa的时候发现了这样类似的代码:
Math.random().toString(36).substring(7);
//当然也可以写成这样
Math.random().toString(36).slice(2);
//或者利用时间
(new Date()-0).toString(36)
复制到控制台执行,结果:
xkq49o4xet
jd2o8sb6
pqexm4
生成的都是一些随机字符串,带数字和字母,基本上就是常见的token(当然,自己手写一个生成随机字符串的几行代码也没有任何难度,但是这样确实很简洁,a little hack feeling......)
流程:生成[0,1)范围的随机小数,然后转成36进制,其实也就是26个英文字母和10个阿拉伯数字,然后再取几位即可
不过,刚开始看的时候确实有一点懵,过了两分钟才明白其实这可以说生成的不是字符串而是数字罢了
这是一个博文上针对Spring说的。MVC,用我自己的话来说,model也就是数据,怎么处理数据,最核心的东西。其中还有一个service,应该可以理解为model的具体实现,例如数据筛选,排序啥的,各种算法之类的。
然后这个view没啥好说的,就是界面,用户看到的那个。
controller这个有些不是太好理解,不过我觉得应该是(从后端角度来说)比如路由的请求处理,中间件中数据,请求等的临时处理,就是处理request和response。
大概就是这样,不过你要是喜欢。。。就想怎么写就怎么写。。。能用就行。。。。。
最近在V2和脉脉上看了挺多关于薪酬的帖子,结合前几天V2的 硕士写前端 那个帖子,我对自己的职业生涯还有此行业的未来有了一些新的、我认为对于我来说正确的想法.
”有些时候你还真是低看了自己。自己努力十几年,考上了一个不错的学校,然后本科毕业找工作竞争对手很多是大学都没上过的专科之类的,想想其实也够唏嘘。“这话不是政治正确的,但是是比较现实的。985的毕业证到头来没有体现任何社会上可显示的价值,甚至成为笑柄,这是不应该的。
一直以来我对自己一直放了一把枷锁,对于高级、深度等字眼的理解是很模糊的,也许隐约计划或知道自己要做到什么地步,达到什么层次地位,但是还是有一种其实不久就要顶破天的感觉。当然不是说自己牛逼,是说自己给自己的限制和期望在压着自己,或者说瓶颈而不是目的地。说白了就是,“做成那样就行就很厉害了吧”,类似于这样的想法。
后来,直到这几天,我发现,我对自己的要求貌似低了。
我认为前端工程师的一种深层次的进阶是:底层。也就是了解机制,了解原理,这样解决问题可以指哪打哪.
我大概目标是,工作3年,也就是25左右,成为高级工程师,对js和浏览器机制的理解达到“十分熟练”,然后30岁的时候,也差不多是接触js、前端12年的时候,希望能成为大师级人物。
最后的临时吐槽:程序员总是喜欢自称狗,其实自嘲就可以了,虽然你只是搬砖的,但是要有节操。。。咱们是工程师,不是xx员,也不是xx猿,更不是xx狗
还没写a完整,等再想想再来吹b
刚刚被面试官吊打了一下。虽然面试不是说多么高大上的题目,但是基本都是很可以考察一个人基本功的题目。然后我想,我又犯这个错误了——好高骛远,眼高手低。
貌似很多新人都会有这个问题。拿我来说,有些问题知道该怎么写,但不知为什么不这么写,举个随便想的栗子:
function a(){
return b(){
// 为什么没有这样用的?
}
}
很多东西你只见过,看过,但没有思考过,所以,面试时候,每个题其实都见过,但让你写出来,就傻眼了。
还有一个问题就是老是去追求高大上,比如Vue源码之类的,比如我就是。没完全搞明白怎么使用,怎么更有效率的使用,就去读源码,所以只是读完了没有任何收获。真正的基础以为都会了,结果考一个真正基础的反而傻眼了。
悲哀啊,以后注意了,想把啥做好,差不多都一样,就是——认真思考。
NTFS_for_Mac过期了,找了好久终于找到一个方案。
其实没什么高深的,它这个是用Python调用系统的命令挂载硬/U盘.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
import re
import os
ntfs_pattern = re.compile(r'.*NTFS.*')
device_dict = {}
def get_device_node():
disk = subprocess.check_output(['diskutil', 'list'])
disk_list = disk.split("\n")
for info in disk_list:
if ntfs_pattern.search(info):
info_list = info.split()
disk_path = "/Volumes/%s" % info_list[2]
device_node = "/dev/%s" % info_list[5]
device_dict[disk_path] = device_node
def mount_ntfs():
if not device_dict:
print "No ntfs filesystem found..."
return
for disk_path in device_dict.keys():
device_node = device_dict[disk_path]
if os.path.isdir(disk_path):
subprocess.check_output(['hdiutil', 'detach', disk_path])
print "mkdir %s" % disk_path
subprocess.check_output(['mkdir', disk_path])
print "sudo mount_ntfs -o rw,nobrowse %s %s" % (device_node, disk_path)
subprocess.check_output(['sudo',
'mount_ntfs',
'-o',
'rw,nobrowse',
device_node, disk_path])
if __name__ == '__main__':
get_device_node()
mount_ntfs()
目前为止比较好的不用花钱的方案,而且还不用换格式
1.系统编译时候就没加文件系统的支持,如openwrt
2.系统空间不够导致锁死
3.挂载
4.jeffss2 dirty
http://www.neatstudio.com/show-2568-1.shtml
算是最近的一个小坑
目标是,并不是本地输出彩色,而是通过curl这样的请求,服务器就返回的是彩色(ANISI),这样就像curl rate.sx一样,不管什么样的终端,只要是ANSI,就能原生输出彩色字符,超级醒目,好看
发现使用3.4版本初始化时出现 ImportError: cannot import name 'certificate_transparency'
错误,重新安装或者升级pip及加密模块无果,sudo也不行,索性换成3.5版本,然后就ok了(此次需要sudo)
需要指定高度,然后body设置hidden,这样可以避免橡皮筋效果(https://github.com/muwenzi/Program-Blog/issues/42)
**学校PT站净扯蛋,不能无痛过渡非要兼容ipv6.。。这帮人...
不过注意macOS没有teredo啊,有软件,能获取ipv6,但是并不能实际应用,当然也有可能是pt的锅
注意,红色字体部分为公共Teredo服务器地址,若无法连通可替换为一下列表中的值:
倒腾了一天,才跑个demo。。。
讲道理,跨平台的这几个开发套件,有一点不清真的感觉
electron之前比较坑爹,因为之前没有淘宝electron源的时候要跑个helloworld简直要死。。什么原因大家都懂,后来没这个问题了,现在用起来还是美滋滋。。。
rn和weex就有些累人了,尤其是weex,貌似是kpi项目,由此可知多么酸爽
个人认为,rn和weex应该完全做到和electron一样,完全不需要写一行native代码,比如oc,Java,kotlin,swift,也不用进行超级麻烦的配置。。。。
今天决定好了,,,iOS端的话直接用swift写native,Android端用react-native,iOS端能跑就跑,不能跑也不折腾,以Android为主。一是我比较想写macOS 的app,开发一些辅助我日常工作学习娱乐的体积小的app(因为体积的关系),目标是跨平台应用的话,用electron;二是我实在不想学Java和kotlin了,Java讲道理不怎么会,也不喜欢那种繁琐的语法,后者的话不做评价
0.复习专用-值得记录的内容
1.我们都知道,js里面数值都是64位浮点数,运算有时候会丢失精度,因为这是计算机决定的。
最近有个有一点奇怪的地方:
console.log(0.1+0.2==0.3)
和这个
console.log(1.2+0.1==1.3)
跑一跑,看结果是什么?👀
false
true
所以貌似js里面丢失精度不是说只要有小数运算就一定会丢
2.那下面这个呢?
console.log(Math.pow(2, -1075))
console.log(Math.log(0))
var a = -9e9999999999999999999999999999999999999999999999999999999999;
console.log(a);
结果:
0
-Infinity
-Infinity
2的1075次方分之一,接近于0,没毛病的~
最近玩了一下 Solo, 但却出现java no matches found
的错误,查了一会儿,发现是zsh
的锅
hello world,这是vanishchode的原创博客~
我认为有一些观念和操作是和循序渐进相悖的。
1.过早追求“系统”学习,好高骛远,眼高很容易手低,人的精力是有限的,要尊重学习规律,承认自己是普通人,告诫自己不要取巧,不要贪婪,慢慢来
2.觉得读源码是最“本质”的学习,结果是掉进细节的深坑不能自拔
3.过早埋头进“最新”技术,比如框架,在没有良好的语言基础之前学,事倍功半,”最新“技术和核心技术很多时候不是一回事,有了基础和核心,学新技术才是最有效率的,反过来却不成立
4.把编程学习等同于看书积累“知识”,但编程最终是一种技能,不动手什么也学不会,“知道”什么和“会”什么是两回事
5.具体的东西不学,却一开始就试图找到“最佳”学习路径,可能是最大的浪费了,有意义的目标是告诉自己明天干什么,而不是假设自己明天“应该”学会什么
6.过分堆砌学习资料,以为找到的资料越多,罗列越完整,自己学得越快越好,事实恰恰相反,越是罗列,噪声越大,心理压力和挫败感越强,越容易放弃,在一个阶段,一本书,配合少量网络资料足够了,”收藏“是一个不怎么好的习惯,学习的人应该追求知识的消化,而不是堆砌
我自己犯得糊涂~
for(let i = 1, len = arguments.length; i < len; i++) {
args.push('arguments[' + i + ']');
}
let result = eval('obj.fn(' + args +')');
之前疑惑,为啥不这样
args.push(arguments[i]);
return obj.fn(args);
其实真是犯了糊涂,这样会导致数组全部合并为一个字符串而不是多个
最近在macOS上编译 shadownode
地址:https://github.com/Rokid/ShadowNode/blob/master/docs/Getting-Started.md
结果出现 dbus/dbus.h no such file or directory
抱着试一试的态度,进行了 brew install dbus
结果成功了~~
看了一下只有13KB,真的很强,比较适合OpenWrt这类存储容量很小的iot类的设备
下午有时间编译一份mt7620版本的,看看表现~
1.Array.protytype.join.call(arguments,',')
快于 [...arguments]
2.在IE,Chrome,Safari中单引号
编译的速度更快,在FireFox中双引号
更快
3.ls 比 dir快,不过这没有什么代表性也没有什么卵用
4.对于arguments,Array.slice.call 性能不如直接for循环
1.break
设置断点
break 21 #在第21行设置断点
break main #在main函数处设置断点
break test #在函数test处设置断点
2.step
/ s
下一步,直接执行下一条程序 (进入函数内部)
3.continue
/ cont
下一段,如果遇到函数,不会进入函数,逐过程,有点类似VS里面的F10
4.run
运行
5.finish
结束调试
6.tbreak
设置临时断点
7.print
/ p
显示某个变量的值
p *array@len
输出数组
p i
输出i的值
8.enable
恢复失效的断点
disable
使断点失效
clear
清除断点
9.backtrace
/ bt
查看堆栈信息
https://www.jianshu.com/p/d95a7b8afa06
主要是参考这个,说白了就是一个store的state相当于一个Vue组件的data,这也是为啥vuex只能和vue一起用的原因。用一个隐藏的vue对象的data属性来模拟实现state,不得不说,还是巧妙,充分利用vue的特性惹。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.