nyan

#!/usr/bin/env bash # Print nyan cat # https://github.com/steckel/Git-Nyan-Graph/blob/master/nyan.sh # If you want big animated version: `telnet miku.acm.uiuc.edu` e='\033' RESET="$e[0m" BOLD="$e[1m" CYAN="$e[0;96m" RED="$e[0;91m" YELLOW="$e[0;93m" GREEN="$e[0;92m" echo if [ $[$RANDOM%2] -eq "0" ]; then echo -en $RED'`·.,¸,.·*·.' echo -e $RESET$BOLD'╭━━━━╮'$RESET echo -en $YELLOW'`·.,¸,.·*·.' echo -e $RESET$BOLD'|::: /\_/\\'$RESET echo -en $GREEN'`·.,¸,.·*·.' echo -e $RESET$BOLD'|:::( ◕ᴥ◕)'$RESET echo -en $CYAN'`·.,¸,.·*·.' echo -e $RESET$BOLD'u-u━━-u--u'$RESET else echo -en $RED'-_-_-_-_-_-_-_' echo -e $RESET$BOLD',------,'$RESET echo -en $YELLOW'_-_-_-_-_-_-_-' echo -e $RESET$BOLD'| /\_/\\'$RESET echo -en $GREEN'-_-_-_-_-_-_-' echo -e $RESET$BOLD'~|__( ^ ....

March 14, 2020 · 1 min · zakudriver

浏览器显示emoji

// js 表情emoji转码 // 发送请求时将uft16转为utf-8 function utf16toEntities(str) { var patt = /[\ud800-\udbff][\udc00-\udfff]/g; // 检测utf16字符正则 return str.replace(patt, function(char) { var H, L, code; if (char.length === 2) { H = char.charCodeAt(0); // 取出高位 L = char.charCodeAt(1); // 取出低位 code = (H - 0xd800) * 0x400 + 0x10000 + L - 0xdc00; // 转换算法 return '&#' + code + ';'; } else { return char; } }); } // 收到后端的数据时展示emoji function entitiesToUtf16(str) { return str....

March 12, 2020 · 1 min · zakudriver

interface类型

Go 语言与鸭子类型的关系 If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck. 如果某个东西长得像鸭子, 像鸭子一样游泳, 像鸭子一样嘎嘎叫, 那它就可以被看成是一只鸭子. 在 Go 语言中, 如果类型的方法集完全包含接口的方法集,则可认为该类型实现了该接口. 鸭子类型是一种动态语言的风格, 在这种风格中, 一个对象有效的语义, 不是由继承自特定的类或实现特定的接口, 而是由它"当前方法和属性的集合"决定. Go 作为一种静态语言, 通过接口实现了 鸭子类型, 实际上是 Go 的编译器在其中作了隐匿的转换工作. 值接收者和指针接收者的区别 package main import "fmt" type Person struct { age int } func (p Person) howOld() int { return p.age } func (p *Person) growUp() { p....

March 9, 2020 · 11 min · zakudriver

文字超出显示省略号

// 文字超出省略号 .text-overflow { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } // 文字超出两行省略号, block元素 .text-overflow-2 { word-break: break-all; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; }

March 4, 2020 · 1 min · zakudriver

多线程

线程: 执行指令序列 保留了并发的优点, 避免了进程切换的代价. 实质: 映射表不变, PC指针变. 价值, 用处 浏览器 一个线程用来从服务器接收数据 一个线程用来显示文本 一个线程用来处理图片(解压缩) 一个线程用来显示图片 接收数据线程等待时可以切换到另一个线程(如显示文本), 更加高效利用CPU, 程序交互更加人性化. 线程切换 多线程执行互不干扰, 所以一个线程执行序列对应一个(或套)栈. 线程切换就是切换TCB. TCB (Thread Control Block) 保存线程的信息(执行序列的栈). 与PCB相似, 只是比PCB储存的信息少而已. 用户级线程 用户态切来切去. CPL为3. TCB在用户程序中. void ThreadCeate(A) { TCB *tcb = malloc(); // 申请内存创建TCB *stack = malloc(); // 创建栈 *stack = A; // 保存栈 tcb.esp = stack } // 线程切换 void Yield() { TCB2.esp = esp; esp = TCB1....

March 1, 2020 · 1 min · zakudriver