豪翔天下

Change My World by Program

0%

今年,我工作四年多来,第一次带着家人在外旅居,整整一个月。事情的起因很简单——妻子暂时没有工作,小孩儿放暑假没地儿去,而重庆的夏天实在太过炎热。面对40度左右的高温,如果不出去避暑,基本上就得在家宅一个月,光是电费预估就得1500元,而且那样的生活难免无聊,除了吹空调看电视,实在没有其他乐趣可言。于是,我们一咬牙,决定出去走走,甚至还借了一些钱来完成这个计划。现在回头想想,做这个决定真的是明智的,旅居的支出其实还算合理:主要费用集中在3000元民宿费用和2500元左右的交通费,而大理的日常开销竟然比在重庆还低。最近我父亲买了电动车,要是早些时候拿来用,交通费至少还能省一半。

我们住的是一个带公共厨房的民宿,由于其他人多是短住客,厨房几乎成了我们的专属。每天去村里的菜市场买菜成了我们最大的乐趣。这个小小的市场虽然不大,但很接地气,当地农民自己种的蔬菜新鲜又便宜,挑菜的过程本身就是一种解压方式。回重庆后,我还特地把家附近的几个菜市场都逛了一遍,决定以后每周都去买菜。相比超市,菜市场里的烟火气让人更有生活的实感,而且确实便宜很多。

在大理住的话,有两个选择:要么住在大理古城附近,要么住在洱海边。我个人觉得,如果是长住,洱海边更合适。古城虽然热闹,但人流量太大,游客扎堆,两三天逛逛还好,天天去就没什么新意了。我们的民宿离洱海只需要两分钟步行,所以下班之后,天还没黑,一家人吃完晚饭就可以到海边散步。洱海边的骑行也是一大乐事,不过不必天天骑,最让人着迷的还是海边那些广阔的草坪。夕阳下,微风拂面,草坪上随意奔跑,仰望大理变幻莫测的云朵,生活的惬意不过如此。

大理的美景令人陶醉,但交通却让人头疼。古城周边停车极难,常年堵车,打车也不太容易。出行最方便的方式其实是摩托车,幸好我们住的民宿老板免费提供摩托,平时去古城游玩也足够了。不过,摩托车的局限也很明显——洱海边的生态廊道只能骑自行车,电动车则需要使用共享的电动自行车,价格贵得离谱,15元一小时,这不抢钱吗。幸好我们自己带了一个小电驴,体型小到可以在廊道里行驶,虽然中途坏了几天,但它的确为我们的出行提供了很多方便。

旅居结束后,我和妻子都达成了共识——大理是我们今后还会常来的地方,甚至想每年都来一次。

大理最让人怀念的,是那每天变幻无穷的云,永远都看不腻:

阅读全文 »

基本概念

  • 照相模式
    • 光圈优先:调节光圈以改变对焦范围和背景模糊程度,然后拍摄静态影像。光圈值小可使前景和背景模糊,光圈值大可使背景清晰。需要自己决定感光度和和曝光补偿,相机控制快门速度
  • 曝光三要素
    • 光圈:F后面的数字越小光圈越大,进光量就越多。还有个很重要的作用,就是会影响背景虚化的程度,光圈越大背景虚化越明显,如果要突出拍摄主体,让画面更干净就可以调小F值,调大光圈。如果想拍远处的风景、合照就可以用小光圈
    • 快门速度:1/200,这个就是快门速度,单位是秒。就是指按下拍照按钮后,镜头从打开到闭合的时间。快门速度快就适合抓拍,速度慢适合光影效果、轨迹效果
    • ISO感光度: 照片亮度
      • 太高会过曝或者模糊,但是在暗光下能捕捉更多细节,否则画面会太暗
      • 越低,噪点越少,画质越细腻
      • 光线充足的情况下,可以调低一点。像大白天室外就100,室内就400,晚上夜景才超过1000
  • 夜景拍摄:适合较快快门、高感光度
阅读全文 »

Proxychains是一个强大的工具,可以帮助用户在各种网络环境中实现代理访问,能够动态地将程序的套接字重定向到指定的代理。通过正确的配置和使用,能够大大提升网络操作的灵活性和便利性。clash的代理通常只能用于http或者https以及socks5,相当于设置了https_proxy, http_proxy, all_proxy,但不是所有的程序都会自动读取这几个环境变量,这个时候可以使用Proxychains直接更改套接字层。

安装使用

1
2
3
4
5
brew install proxychains-ng	# For Mac

vim ~/.proxychains/proxychains.conf # 创建配置文件,内容如下:
[ProxyList]
socks5 127.0.0.1 7890 # 这就是我实际代理的地址,clash默认就是7890端口

使用场景

之前不能使用代理的很多场景现在都能通过代理了:

  • Firebase

    1
    proxychains4 node main.js
  • Android Studio模拟器:

    1
    proxychains4 ~/Library/Android/sdk/emulator/emulator -avd Medium_Tablet_API_26

上个月,我迎来了人生中的一个重要时刻——搬进了新家。30岁,终于搬进了我们夫妻俩共同拥有的第一套房。过去的一年里,我们的生活都被各种装修、软装和选购所填满。由于担心甲醛的问题,房子还空置了几个月,终于熬到了搬家的一天。

新家是跃层呀

很多人都保证自己买房肯定不会买跃层,我也不例外。从来没想过买复式房,不过这次因为各种难以拒绝的原因最终还是选择了它。毕竟这套房子的设计还是很合理的:一楼只有客厅、厨房和一个卫生间,二楼是休息的地方,三个大阳台,三楼则是储物间。这样安排,减少了上楼拿东西的不便,天然的动静分离。另外,经历过疫情后,突然发现家里有楼梯也蛮方便的,适合拿来锻炼。感觉每天走上走下已经可以消耗很多卡路里了。

老婆心心念念的衣帽间

老婆一直梦想有个衣帽间,现在她的愿望终于实现了。我们的衣帽间和我的电竞房在同一个套房里。我很喜欢这种安排,她在一旁化妆或者看书,而我在这边写代码,彼此相伴,互不干扰。

阅读全文 »

与 ESLint 不同,EditorConfig 旨在为不同的编辑器、编码语言和文件类型提供统一的配置。ESLint 是专注于 JavaScript 代码质量和规范的检测工具,而 EditorConfig 则通过配置文件为各种编辑器设定一致的代码风格和格式要求。主流的编辑器,如 VSCode、Sublime Text、Atom 等,通常会默认支持 EditorConfig,并自动加载其规范,使得跨团队协作时代码风格更加统一,减少了因编辑器差异导致的代码格式问题。建议在无论代码是否使用eslint,都添加上.editorconfig文件

通配符说明

1
2
3
4
5
6
7
	说明
* 匹配除/之外的任意字符串
** 匹配任意字符串
? 匹配任意单个字符
[name] 匹配 name 字符
[!name] 匹配非 name 字符
{s1,s3,s3} 匹配任意给定的字符串(0.11.0 起支持)
阅读全文 »

趁着上了几天夜班,今天在工作日休息,记录一下8月份去山东旅游的一些事情。

这次的旅游主要是刚加了几天的通宵夜班,又正好公司出了个旅游补贴,8月份老婆的工作也不是很忙,所以就请假出去玩儿了。本来想着出去避暑的,但是真正能避暑的地方应该是云南和川西,这两个地方其实我们可以自驾去的,所以这次打算去远一点的地方。三亚太远太贵太热,就决定去威海,正好大学室友在日照,然后只有青岛有直达重庆的飞机,所以主要就是游览了这三个地方。

阅读全文 »

疫情后实在憋得太久了,7月的重庆也实在太热了,于是找个周末说走就走。好在我现在是在电脑上面工作,所以周四晚上就能出发。

行程

Day1: 贵阳

第一天是周五我也没请假,于是我一个人在酒店,老婆带着孩子出去玩儿的。下班后我们再一起在贵阳城区逛逛。

黔灵山森林公园、贵阳的几条好吃街、甲秀楼、贵阳白宫

阅读全文 »

Instance

  • 如果停止或者重启卡住了,是无法进行强制操作的,最多要等15分钟才能恢复
1
sudo apt remove iptables-persistent -y && sudo ufw disable && sudo iptables -F	# 关闭机器内部的防火墙

使用Bastion跳板机登录Instance

  • 在Instance详情页的Virtual Cloud Agent中打开Bastion,然后在Bastion的管理面板中创建session,(注意,bastion的private ip需要加入到机器的network中添加一条路由,允许22端口),最后复制登录命令即可,例如:

    1
    ssh -i <privateKey> -o ProxyCommand="ssh -i <privateKey> -W %h:%p -p 22 ocid1.bastionsession.oc1.us-sanjose-1.xxxxxx@host.bastion.us-sanjose-1.oci.oraclecloud.com" -p 22 ubuntu@10.0.8.89
  • 如果登录报错(sign_and_send_pubkey: no mutual signature supported)可以尝试在~/.ssh/config中添加配置:

    1
    2
    3
    Host *
    PubkeyAcceptedKeyTypes=+ssh-rsa
    HostKeyAlgorithms=+ssh-rsa

OCI(Oracle Cloud Infrasturcture)

  • Oracle的命令行工具

安装

1
2
3
4
5
oci setup config
Enter a location for your config [/home/ubuntu/.oci/config]: # 默认即可
Enter a user OCID: # 这里的user OCID来自于user profile里面的OCID
Enter a tenancy OCID: # 来自于右上角头像里面的Tenancy里面的OCID
# 其他默认即可
  • 上传Public Key(/home/ubuntu/.oci/oci_api_key_public.pem)到API Keys(My Profile -> API keys -> Paste a public key)中,上传后可能需要等几分钟才生效

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 用户管理iam
oci iam compartment list --all # 列出所有的compartment,可以获取到compartment id,下面很多命令都需要的

# 计算资源compute
oci compute instance list --compartment-id=ocidxxxxx # 列出所有的实例
oci compute instance get --instance-id=ocid1.xxxxx # 获取实例详情,但是这里不会返回IP,要获取IP还是得用vinc来弄

# 公网IP,public-ip
oci network public-ip list --compartment-id=ocidxxxxx --scope=REGION # 列出所有的公网IP
oci network public-ip update --public-ip-id=ocid1.publicip.xxxxxxx --private-ip-id= # 将公网IP与私有IP解绑,解绑后服务器内部kennel
oci network public-ip update --public-ip-id=ocid1.publicip.xxxxxxx --private-ip-id=ocid1.privateip.xxxxxx # 将公网IP绑定到指定的私有IP
oci network public-ip create --compartment-id={COMPARTMENT_ID} --lifetime=RESERVED --display-name=test # 创建新的reversed ip
oci network public-ip delete --public-ip-id=ocid1.publicip.xxxxxxx --force # 删除public ip,加了--force参数就不会询问你了

# 私网IP,private-ip来自于VNIC Details里面的Private IP Address
oci network private-ip get --private-ip-id=ocid1.privateip.xxxxxxx

# 获取VNIC详情, VNIC的OCID在VPIC Details里面获取,注意不是那个FQDN
oci network vnic get --vnic-id=ocid1.vnic.xxxxx

  • 使用Nodejs编写跨平台桌面应用程序
  • Electron Fiddle是官方的沙盒程序

安装配置

  • 可以使用React脚手架来初始化electron-react-boilerplate

    • 虽然它推荐的是Electron Store来存储状态,但是依然可以用redux或者mobx,并且持久化也可以直接用localStorage,mobx的话就是mobx-persist-store
1
2
3
4
npm run start 	# 运行APP
npm run build # 编译
ANALYZE=true npm run build # 能够直接分析build完成后包的各部分所占的体积
npm run package # 打包app,能直接打包成zip或者dmg。可以在package.json中修改package参数,如果添加-mwl表示同时打包--mac, --win, --linux
  • 添加依赖

    1
    2
    ./package.json # 非native的module,或者类型依赖@types/*
    ./release/app/package.json # native modules需要安装在这里,不需要编译
  • package.json配置

    1
    2
    3
    4
    5
    6
    7
    {
    "build": {
    "mac": {
    "identity": "Apple Development: xxxx (xxx)" // 指定签名的identity,否则可能会自动选择到一个无效的identity导致应用打不开,可以用security find-identity -v查看当前所有的identity
    }
    }
    }
阅读全文 »