今年仍然是一大半没有完成。
远程工作三年半了,今年公司离职了两位同事,感觉都是因为长期的远程工作导致的一些精神情绪上的问题。目前我觉得还好,毕竟即使工作有时候很枯燥,但是每天有老婆女儿陪着,还是相当幸福的。可以说让我再远程工作几年应该都没问题的。
今年在技术方面没有多少进步,还是因为今年主要的精力都在装修房子上。其次是因为今年负责了公司一个主要营收的项目,但是恰好这个项目暂时用不到太深入的技术,虽然也是我第一次深入接触Java和Android项目。当我深入接触以后,我仍然觉得Java是非常垃圾的语言。话说Java的ORM就不能简单直接点吗,简直是我见过最差的ORM。并且用Java的公司是真有钱呀,同样规格的项目,Java的服务器配置至少两倍起步。我以前一直认为之所以很多人用Java,是因为哪怕程序员技术再差,也不会写出性能很差的项目,今年我得收回这句话了。
PM方面,在年底出了一个线上事故,一个只存在于段子里面的事故,线上数据被删了。虽然不是我做的,但毕竟我算个小领导,还是影响到年终奖了。这种操作失误的事故即使我来做也不能保证绝对不会出错,但是我也确实从来没听过谁会在线上出这样的错误。事后也不能全怪同事,毕竟也算是我们流程上有很大的漏洞,也是PM没做好,没有预料到会出这样的问题,也没有做好应急预案。
今年虽然接触AI的时间不多,但通过使用ChatGPT解决一些技术问题,我意识到AI的潜力。获取知识的速度变得非常快,有时我都懒得写技术博客了。因此,我决定在博客中少写技术,更注重技术与生活的结合。
房子装修真的是最废时间和精力的事情。前期因为装修公司进度慢,不知道和装修公司、和老婆吵了多少的架。但是我始终不觉得是因为找了熟人的问题,找其他装修公司多半会更慢,只是确实有时候看着他们慢慢的做,特别糟心。但是自己又不可能有那么多的精力来自己找人装,虽然进度和质量可能会好一点,但是精力和金钱肯定也是省不了的。装修到后期老婆不再参与,我这边能妥协的就妥协吧,我只想早点住进去,毕竟一个月6000多的利息,毕竟现在一间三口租在30平的单间配套里面。住得太小了,感觉真的会影响家庭和谐,影响一个人的气运。从4月到11月,总共8个月,可以说今年大部分业余时间都用在了装修上,这也是今年没有技术上的提升的原因。
加上借的钱和剩下的家具家电,预计总共是60万。还好,没有超预算,并且想要的基本上都有了。电竞房、衣帽间、中央空调、地暖、智能家居,基本上在自己控制预算下满足了一些。12月底开地暖的时候感觉幸福感飙升,虽然半个月烧了500立方的天然气了。。。
趁着疫情结束,我和女儿有了一次难忘的旅行。虽然原计划冬天还有旅行,但由于装修欠款,只能放弃。希望来年能有更多机会去探索新的地方。
这次的旅游主要是刚加了几天的通宵夜班,又正好公司出了个旅游补贴,8月份老婆的工作也不是很忙,所以就请假出去玩儿了。本来想着出去避暑的,但是真正能避暑的地方应该是云南和川西,这两个地方其实我们可以自驾去的,所以这次打算去远一点的地方。三亚太远太贵太热,就决定去威海,正好大学室友在日照,然后只有青岛有直达重庆的飞机,所以主要就是游览了这三个地方。
非特种兵,但还是走了很多的地方,山东虽然没有重庆热,但紫外线太强了,并且本身玩耍的地方也都是在没有遮挡的海边。
第一天应该是在海边玩儿得最久也最好玩儿的一次了,因为大学室友是本地人,直接开车把我们从火车站接到最好吃的和最好玩的地方。
没想到第一次坐飞机就看到了云层之上的彩虹
太公岛牡蛎公园
第二天上午一直在下雨,本来打算下午直接去火车站的,但是快到中午的时候雨停了,就去了一个人少的景点走走,感觉这个景区有点年代了,设施看起来有点旧,啥子也很粗。另外,日照这个城市的火车站可能之前没接到过这么多游客,规划也不够,火车站简直太挤了。
日照灯塔风景区:
早上起来就打车到火炬八街,然后在国际海水浴场玩儿到中午,接着租了辆电动摩托,带着老婆孩子骑行经典的威海骑行路线,简直太美太爽了。最后在韩乐坊吃了海鲜大餐
火炬八街、国际海水浴场、猫头山2号观景台、猫头山3号观景台、半月湾沙滩,韩乐坊
早上不想动了,就打车去了酒店附近的几个公园,纯粹打卡。中午就打车去了那香海。晚上在那香海沙滩附近看了最美日落。
威海公园、悦海公园、那香海最美日落
布鲁威斯号沉船、海边泳池,那香海。
早上租辆电动摩托去了布鲁威斯号沉船,第一次近距离观看这么大的船,并且还坐小船去喂了海鸥。
临走前还带老婆去做了一次按摩,太放松了,以后出远门玩儿都要找按摩的。
青岛第三海水浴场很美,这个沙滩就是在大城市里面的沙滩了,啥子太粗了,但是灯光很美,美归美,实在排不出来抖音上面的效果。
这是玩儿的最久的一次,终于下海游了一下泳,并且终于在海边看了烟花,人少沙细,有山有海。
仰口沙滩
早晨起来看了最美日出,但是实在玩儿不动了,我们三睡到中午就打车回青岛,然后去机场了
以后再也不坐晚上23点的飞机了,太难等了。但是以后一定要继续去机场贵宾厅,免费的食物,安静的环境,帮忙办理值机,VIP通道,体验太好了。
第一天是周五我也没请假,于是我一个人在酒店,老婆带着孩子出去玩儿的。下班后我们再一起在贵阳城区逛逛。
黔灵山森林公园、贵阳的几条好吃街、甲秀楼、贵阳白宫
上午去了天河谭景区,下午就去西江千户苗寨了,很远,但是很漂亮,一定一定要找个拍摄的店拍一套写真
从西江开车会贵阳,吃了很好吃很好吃的鸭子,但是忘了叫什么名字了,是亲戚带我们去的,下次去贵阳一定还要吃。
1 | sudo apt remove iptables-persistent -y && sudo ufw disable && sudo iptables -F# 关闭机器内部的防火墙 |
在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 | Host * |
1 | oci setup config |
/home/ubuntu/.oci/oci_api_key_public.pem
)到API Keys(My Profile -> API keys -> Paste a public key
)中,上传后可能需要等几分钟才生效1 | 用户管理iam |
可以使用React脚手架来初始化electron-react-boilerplate
mobx-persist-store
1 | npm run start # 运行APP |
添加依赖
1 | ./package.json # 非native的module,或者类型依赖@types/* |
package.json配置
1 | { |
尝试了很多方法,最终只找到下面这个方法可用
在渲染进程preload.ts
中创建一个方法向主进程获取环境变量
1 | const electronHandler = { |
在主进程中main.ts
监听该事件
1 | ipcMain.on('get-env', async (event) => { |
"electron": "^11.0.1"
redux
好用多了,就凭这一点我就放弃redux
了mobx-react-lite
,很多东西就不用写了,比如Provider,observable props(不需要在组件外部包裹observer了,默认store变化的时候会自动重新渲染),并且observer自动使用的就是React.memo,不需要单独为了优化性能去useMemo1 | npm install --save mobx |
src/stores/xxxxStore.ts
下1 | import {observable, action, makeObservable} from 'mobx'; |
看了下2021年定的2022年的目标,本以为大多数都没能完成,没想到还是完成了许多的。
远程工作两年半了,朝九晚六不加班的日子也越来越喜欢了。公司内部评级也高了一级,当然工资股票期权啥的也都涨了一些。只是后来做PM的时候确实有时候感觉有点吃力,特别是遇到其他人都解决不了得等自己解决的时候,压力还是挺大的,所以明年还是得在技术深度上多学一些。
做人要有责任和担当,应该把钱都拿出来买房,拯救国家经济
最开始只是因为老婆的工作所以来到了县城这边生活,但是真的不习惯老家的生活,这边没有关系,连个好点的幼儿园都读不到,就感觉各行各业做啥都看关系,人家根本就不看你能力,也根本不在乎做事儿的人的能力。当然大城市也有这些情况,但相对来说,大城市还是公平许多,至少我这啥关系背景都没有的人能在大城市做个打工者,努点力还能更好一点。
今年大部分的精力和时间都花在了卖房买房的事情上了,因为疫情影响,大家对房地产的信心真的是太低了,我们的房子一降再降,还好在最后一波疫情前卖出去了。卖出去了疫情就结束了,发现大家对明年房地产的预期肯定是向好的,真实日了狗了,又得赶紧去买。好在终于在农历年前把新房定了下来。贷款很多,月供超过了我上家公司的月薪了,不过好在面积还行,至少短时间内不会又想着换房子。真的,换房子的成本实在是太高了,时间、精力、金钱。这次的房子远离市中心,买在了最有书香气息的大学城,我们这条街也算是教育一条街了,沿途好多大学、高中、小学,而且是主城离老家最近的地方,除了价钱以外各方面都符合我们的预期。
2023年的最主要的事情就是装修房子了,感觉又是一件要花很多心思去考虑的事情,痛并快乐着吧。
疫情终于结束了,老婆单位也不再要求他们不准出去旅游了,所以希望今年能多出去玩几次了。
结婚大事已交卷,生娃任务已完成,只要不生病,家人平安健康,慢慢赚钱,其余都是锦上添花。——网络
家总要成,钱总要挣,奔走红尘,勿忘曾经是书生——网络
做人要有责任和担当,应该把钱都拿出来买房,拯救国家经济——网络
努力的意义就是:当好运降临在自己身上时,你会觉得我配,而不是眼看着好事落在别人身上,然后愤愤地说 我呸。——网络
我上了那么多年学,熬了那么多夜,做那么多习题,顶着各种各样的压力,参加各种残酷的考试,谈恋爱,分手,工作,加班。
我这么辛苦,竟然是为了成为一个普通人——网络
礼物不重要,重要的是礼物背后的心意:我依旧被你重视,被你放在心上。最好的婚姻,不是乍见之欢,而是久处不厌。最好的夫妻,是一起享受生活的平淡,却也喜欢带给对方的惊喜和温暖。
当爱情开花结果,就是另一场冒险的开始。
和你在一起的目的很简单,生个孩子,看你小时候的样子。——老君书屋
即使老婆在自己医院产检我也要陪她去,这样好的消息可以第一时间分享,坏的消息也能第一时间承担。
I/O -> Keyboard -> Toggle Software Keyboard
App需要提供图标的规格为40/588/60/80/87/120/160/180/1024
,另外,如果最好是将png图片转换为jpg,因为默认会把png不存在的地方背景设置为黑色。准备好图标素材以后,直接在xcode
里面的Images.xcassets
将图标拖入即可。
private key
,修改Access Control
,需要修改配置Allow all applications to access this item
,否则下面在上传的时候会提示missing private key
或者让你无限输入电脑用户名密码的问题Product->Archive
,完成后会自动弹出一个对话框(当然,这个对话框也可以通过Window->Organizer
打开,要选择对应的APP)Distribute App
,然后选择App Store Connect
,再Upload
,一直下一步应该就可以了。(如果打包能成功,但是上传却说认证失败,可能是网络问题)App Store Connect
后台的TestFlight
看到刚才的build了,这时候可以去添加测试用户,点击左侧菜单App Store Connect User
进行添加,添加方式见页面提示即可,很简单,添加完成后会发送邮件给用户,里面有个兑换码,在ios的testflightapp上点击redeem输入兑换码即可下载,如果下载时提示the app couldn't be installed because testflight isn't available
,那就等大概五分钟试试升级pod
1 | pod --version# 查看pod版本 |
**Signing for “xxx” requires a development team. Select a development team in the project editor.**解决方法: 点击项目名->targets->General->Signing,选择自己的Team,选择后重新构建,如果仍然出现该错误,那么可以重启一下xcode或者更新一下xcode多次尝试。
**打包archive的时候签名报错XXX is automatically signed for development, but a conflicting code signing identity iPhone Distribution has been manually specified. Set the code signing identity value to “Apple Development” in the build settings editor, or switch to manual signing in the Signing & Capabilities editor.**:需要去PROJECT -> BUILD SETTINGS -> COMBINED
中的Signing->Code Signing Identity
的值从iOS Developer
修改为Apple Development
,还有TARGETS -> Build Settings -> Combined
中的Signing->Code Signing Identity->Release
的值从iOS Developer
修改为Apple Development
上传archive最后提示Missing private key
Run on device突然报错Errors were encountered while preparing your device for development. Please check the Devices and Simulators Window.: 重启手机试试吧
“XXXX” has 2 Apple Distribution certificates but their private keys are not installed. Contact the creator of one of these certificates to get a copy of the private key: 可能是key过期了,去apple developer重新生成一个证书吧,下载下来安装上,但是得重启一下xcode
push app 到appstore一直在processing: 这个时候确实可以再push一个新版本,可能会更快
ios模拟弱网环境: 设置->开发者选项-> Network LINK CONDITIONER
set the code signing identity value to apple development in the build settings editor: 在TARGETS -> Build Settings -> All
中搜索signing
即可,修改对应的值为apple development
即可
sandbox账户无法登录,提示要进入设置收验证码: 无论怎样我都收不到验证码, 最后重新建了一个sandbox账户就可以了,sandbox在点击登录按钮登录的时候按理说是不用验证码的,直接就可以登录了。当然,必须得退出本机自身的apple id才行
添加了测试设备后,Xcode依然无法安装: 可能是因为Xcode没有及时更新云端的Provisioning Profile
可以删除目录~/Library/MobileDevice/Provisioning
,然后打包时候勾选Automatically manage signing
,Xcode就会重新拉取了
NSURLConnection SSL error: 通常只需要在Info.plist
中添加
1 | <key>NSAppTransportSecurity</key> |
react-native
平台对native
支持最好的表格组件了1 | npm install --save victory |
1 | <VictoryArea |
1 | import {Defs, LinearGradient, Stop} from 'react-native-svg'; |
1 | <VictoryArea |
VictoryLine
,data
就是一个开始点一个结束点即可1 | <VictoryAxis |
1 | <VictoryGruop |
1 | <VictoryLine |
1 | const CustomSlice = (props: any) => { |
1 | <VictoryScatter |
1 | <VictoryChart |
Touchable*
等组件来实现全局的事件,包裹了,点击也没用1 | <VictoryChart |
1 | <VictoryChart> |
1 | containerComponent={ |
1 | npm i @tanstack/react-query |
配置就是将其作为一个provider注入到app中
1 | const queryClient = new QueryClient() |
enabled=false
的请求,如果之前已经缓存过数据了,那么会直接使用缓存的数据,并且status === 'success', isSuccess=true
query data cannot be undefined
1 | const { |
useQuery
默认就是并发执行的,但是如果想要实现Promise.all(users.map(async(user) => {}))
这样的并发可以使用useQueries
1 | const userQueries = useQueries({ |
1 | // 这里的mutation同样有isLoading、isSuccess,isError等状态 |
isFetching
状态,表示当前是否有请求在后台执行1 | const isFetching = useIsFetching() |
1 | const prefetchTodos = async () => { |
1 | queryClient.invalidateQueries()// 过期所有 |
开发IDE: 我一般就直接用idea了,有solidity插件,但是以太坊有一个官方的IDE: remix
如果是使用hardhat
,那么就不用单独安装了,它会安装指定的版本的solc
的
1 | brew update |
可见性修饰符(只能其中一种)
函数修饰符
函数入参修饰符
变量分类,注意每个变量在声明时都会有一个对应其类型的默认值(address -> address(0), boolean -> false, enum -> 第一个元素),没有空值null的概念
内置全局变量
1 | pragma solidity ^0.8.4; |
非同质化代币(NFT)
每个NFT在链上其实就是一个uint256的token id,而metadata信息则是存储中心化的外部的,比如自己建的服务器或者S3这种图片服务存储中心,通过配置合约的_baseURI
可以设置其url前缀,然后后面加上token id就是tokenURI
了
标准方法:
标准事件
Transfer: 当NFT的所有权改变时触发该事件
Approval:当更改或确认NFT的授权地址时触发
truffle
的语法来写测试的,如果用的是hardtest
来运行测试用例,需要安装hardhat-truffle5
插件,详情见使用hardhat部署智能合约@openzeppelin/contracts/token/ERC20/ERC20.sol
npm install @openzeppelin/contracts
后可以直接在solidity中进行引入1 | //SPDX-License-Identifier: Unlicense |
balances["0x..."]
改为了balances[0x...]
就可以了 web3.utils.toWei(String(123), 'ether')
Setup -> Data -> Data Export -> Export Now -> Start Export
,大概等个5到10分钟就能在页面下载了Setup -> App Manager
,然后选择自己的首页的app,一般是Force.com
,进入编辑页面就能看到Choose the Tabs
设置了首先需要再对象的Details
设置里面打开Track Field History
由于每个对象最多只能设置20个追踪字段,所以默认没有打开,针对单独的字段得单独打开,在Object Manage -> Your Object -> Fields & Relationships
-> Set History Tracking,选中想要追踪的字段保存即可
jsforce sdk可以这样查询history
1 | // 注意如果是标准对象,那么直接加History即可,例如AccountHistory,如果是自定义对象__c,那么需要将__c替换为__History |
.sandboxname
New Connected App
菜单在Apps -> App Manager
里面,而不是在Apps -> App Manager -> Connected Apps -> Manage Connected Apps
里面
App Manager
和Manage Connected Apps
里面如果有相同的app,那么可能这两个菜单点进去会是不同的设置
在设置里面可以设置哪些profile能访问这个app,需要注意的是,即使选择的认证方法是POST的,如果你选择了所有人都能访问app(All users may self-authorize),那么它仍然不会去使用POST认证,会直接用GET去访问app,所以即使我们要所有人都能访问也要选择只允许选择的人(Admin approved users are pre-authorized),你可以选择所有的profile都行(在app最右边下拉Manage菜单中设置,不是View也不是edit)。注意修改后可能出现You don't have permissions to view application with namespace
错误,只需要在manage菜单的下面Profiles那里选择Manage Profiles,把System Administrator打开即可
app要允许oauth才能将认证token传到第三方或者自己的callback api
如果要作为tab显示在顶部菜单栏,需要
将connected app的canvas打开,并设置canvas app url
创建visualforce page,里面需要包含这个app,创建一个canvas来包含connected app,例如
1 | <apex:page standardController="Account"> |
然后在Setup里面搜索Tabs,在visualforce里面选择它,最后再在首页的tabs里面添加即可
创建了带Oauth的app后就能获取到其client_id和client_secret了(也叫Consumer Key和Consumer Secret)
__c
结尾表示custom
,__r
结尾表示relationship
首页左上角搜索app里面有Recycle Bin
,最近删除了的对象能在这里找到并恢复
Setup -> Environments -> Logs -> Debug Logs
中进行设置,如果是调试sites的guest user,只需要new的时候选择指定的user即可1 | var jsforce = require('jsforce'); |
1 | conn.describeSObject('Account');// 获取对象object的数据结构,包括recordTypeInfos |
1 | conn.metadata.list([{type: 'CustomObject'}]) // 列出所有的Custom Objects |
针对时间字段,如果是query raw sql, 记得不用加引号: CreatedDate > 2022-07-19T00:00:00Z
,如果是sobject来查询,可以const {SfDate} = require("jsforce"); SfDate.SfDate.toDateTimeLiteral('2022-07-19 00:00:00')
find方法单次默认只能查询200条记录,可以修改offset,但是最大的offset值也才2000。如果要查询所有,可以这样做
1 | // 方法1 |
1 | // 查询 |
Setup -> Data -> Duplicate Management -> Duplicate Rules
里面看看有没有什么检测重复的规则1 | npm install sfdx-cli --global |
All users may self-authorize
。如果是GET请求,会带一个参数_sfdc_canvas_authvalue = user_approval_required
到callback,callback收到该参数来决定是否启动OAuth认证流程。当用户Approve了后,canvas app应该调用一个repost方法取获取signed requestSetup > Build > Customize > Home -> Custom Links
,创建一个新的LinkSetup > Create > Packages
,选择package,在package的编辑页面的Configure Custom Link
添加该link即可1 | const onClickOAuth = () => { |
${sites_url?id=xxxx
,这里的ID就是那个survey的idPublic Access Settings
和文档里面的描述不一样,View Users
现在是点进Assigned Users
里面设置,如果要修改那几个object的权限以及Apex Classes,需要在Public Access Settings
里面设置Apex Class Access
和 Object Settings
Field Level Security
检查权限src/main.ts
中进行修改1 | 项目初始化 |
1 | npm i --save @nestjs/config |
1 | @Global()// 一般不需要这个装饰器,除非要让一个模块变成全局模块,其他地方随时能使用,这个一般作用于helpers模块,这样其他模块想用就用,而不用在其他模块一个一个imports了 |
nest g resource
能够直接生成一个资源对应的文件Module、Controller等,当然数据库model不会自动生成1 | class MyDto { |
*.entity.ts
结尾nest g controller
生成控制器,不过最好还是用nest g resource
生成一个资源,包含了一些其他的逻辑文件1 | @Controller()// 表示这是一个控制器 |
1 | 常见异常,默认返回的是{"statusCode": 422, "error": "Unprocessable Entity"}格式 |
安装:
1 | yarn add @nestjs/sequelize sequelize sequelize-typescript mysql2 |
Migration: 由于migration和代码无关,也无需依赖注入,可以直接用sequelize-cli命令来创建维护即可,参考Sequelize 使用手册
事务:官方不建议直接使用@transaction
装饰器来包装事务,其实手动写也还好,因为需要用到事务的地方并不多
配置,具体的数据表定义和用法可以参考sequelize-typescript文档以及我写的Sequelize 使用手册
1 | // app.module.ts的imports中进行引入 |
需要注意文档里的Enable authentication globally配置是全局的配置,我们一般不会需要这样做,因为登录注册等接口是不需要token的
在控制器获取jwt token的payload,可以这样做
1 | import {Request} from '@nestjs/common' |
jwt-auth.guard.ts
中可以在handleRequest中处理错误
1 | @Injectable() |
1 | const app = await NestFactory.create(AppModule, { cors: true }); |
1 | export class UserController { |
官方文档虽然提了一下,但是并没有一个方便的包来实现这些步骤,只能按照他提供的步骤摸索着来。要将nestjs转换为serverless模式,最主要的问题就是减少冷启动的时间。所以我们最好在编译阶段就进行优化。
首先安装必要的依赖
1 | For npm |
在根目录创建serverless.yml
1 | service: serverless-example |
修改main.ts
1 | import { NestFactory } from '@nestjs/core' |
在tsconfig.json
中添加配置:
1 | { |
在根目录创建webpack.config.js
1 | module.exports = (options, webpack) => { |
测试
```shell
nest build –webpack
npx serverless offline
部署,将该js文件压缩为zip包上传到aws lambda即可
package.json
的jest
下添加"testTimeout": 60000
1 | npm install web3 --save |
1 | // 可以全局用 |
1 | web3.eth.getTransactionCount('0x...')// 获取用户的transaction数量 |
1 | const account web3.eth.accounts.privateKeyToAccount('0xaaaaa');// 通过私钥获取账户信息 |
调用智能合约
1 | // 初始化 |
1 | web3.eth.net.isListening()// 代替低版本的isConnected() |
1 | // 这里的eventName就是在solidity中定义的事件的名称 |
1 | var num = BigNumber.clone() |
Web3 is undfeind / TypeError: Cannot read property ‘providers’ of undefined: typescript里面遇到这个问题,可以用(Web3 as any)
代替
replacement transaction underpriced: 我遇到两种情况:
一是提交transaction的时候nonce设置为了一样的,并且gas fee也一样,所以会报错,要么nonce不一样,如果真的要在之前的操作确认前进行覆盖,必须提高gas fee人家才愿意先挖你这个。
二是无论怎样提高gas price,transaction依然在queued队列中(注意不是pending),原因是nonce没有连续(可能是由于在geth中清空了transaction导致的或者乱修改nonce导致的),queued中的nonce和getTransactionCount
的nonce值中间有空的,这个时候尝试调用其他的transaction,直到nonce连续为止就能执行了
在前端集成的时候出现proces is not devined的问题: 我是在vite框架中遇到的,解决办法如下:
1 | // 在index.html中添加 |
cargo, rustc, rustup
工具会在~/.cargo/bin
中,可以讲他们加入到环境变量中1 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装rust及对应的工具链 |
Cargo.toml
:类似于package.json
文件1 | [package] |
if let
。代码量和我们平时写的if (val !== null)
一样,只是这相当于是强制的了?
: 如果一个函数内部有多个可能会抛出异常的地方,可以直接在结尾使用?
表示只要抛错,那么函数返回值就是Err,而不用使用unwrap或者if let了1 | println!("{} days", day); // 打印变量的值 |
1 | // 数字 |
1 | let mut v1 = Vec::new(); |
1 | // Struct结构体(有点像类) |
1 | enum Gender { |
1 | triat Playable { |
1 | .map(|x| x + 1)// 这就和js中的map类似了 |
1 | bson::from_bson()// 序列化 |
1 | for i in 1..5 {}// 生成1到4的整数 |
1 | let my_str = include_str!("filename");// 将文件内容读取为字符串 |
cargo test
的时候才会运行,在cargo build
的时候不会1 |
|
openssl-sys v0.9.66
: 执行sudo apt install libssl-dev pkg-config -y
#![feature(type_ascription)]
放到整个项目入口文件的开头即可main.rs
或者lib.rs
aarch64_apple
: 目前我仅在2022-03-22后的几个版本遇到过这个问题,安装rustup install nightly-2022-03-22
版本可以解决(注意使用的时候也需要指定版本cargo +nightly-2022-03-22
),当然如果最新的修复了,可以尝试一下最新的版本&var
1 | npm install -g hardhat |
1 | { |
1 | . |
Truffle
1 | npx hardhat compile# 编译合约,编译会编译到artifacts目录。默认只会编译更改后的 |
默认是Jest
测试
一个测试用例./test/token.js
智能合约的工具都互相兼容,如果是truffle
语法写的测试用例,仍然可以用npx hardhat test
来测试,需要先安装插件npm install --save-dev @nomiclabs/hardhat-truffle5 @nomiclabs/hardhat-web3 web3
,并在hardhat.config.js
中引入require("@nomiclabs/hardhat-truffle5");
测试的各种操作默认都是owner
,如果要切换为其他的用户,可以使用connect方法contract.connect(singer).getBalance()
,当然,得是getSigners
里面的用户才可以,不然没有私钥基本上也操作不了
1 | const { expect } = require("chai");// import { expect } from 'chai'; |
./scripts/deploy.js
1 | async function main() { |
编写完成后执行命令进行部署
1 | npx hardhat run scripts/deploy.js# 默认部署到hardhat本地的测试网络,当然成功后就没了 |
artifacts
目录下的东西是编译后的东西,感觉有必要放到git repo中去,这样就不用存储abi到数据库了,而且代码也方便调用。每次部署相同的合约会得到一个不同地址,但编译后的合约肯定是一样的。放到backend repo里面既可以用代码来部署也可以直接返回最新的给前端1 | // import '@nomiclabs/hardhat-waffle'; |
1 | macos |
data/keystore
下1 | geth --datadir ./data account list# 列出当前所有的account |
Generating DAG in progress
的操作,很慢,并且很耗CPU,这之后就好了difficulty
,是一个动态变化的值,即使初始块为0,这之后也会越来越大的1 | miner.setEtherbase(base) |
1 | personal.unlockAccount('0x111111')# 转账前需要先解锁账号 |
新建目录
1 | mkdir ~/config# 配置目录 |
创建第一个账户方便测试,记录下public address和secret key file地址,可以给它初始化balance。后面也可以用这条命令创建更多的测试账户
1 | geth account new --datadir data |
首先配置一个初始块(initial block)/创世块(Genesis Block)
1 | // vim ~/config/genesis.json |
初始化创世块,如果后续有啥不顺的,可以直接将data下的geth目录和history移除,重新初始化并创建创世块
1 | geth init --datadir ~/data ~/config/genesis.json |
启动以太坊私有测试链
http://ip:8545/graphql/ui
,但是实际看感觉graphql的api不全呀,就只能查一些区块的东西,contract的基本不支持,这应该是目前的支持列表EIP-17671 | geth --identity "FirstNode" --nodiscover --datadir data --allow-insecure-unlock --http --http.addr "0.0.0.0" --http.corsdomain '*' --http.api "eth,net,web3,personal" --graphql --graphql.corsdomain '*' --nat extip:172.168.254.4 --networkid 202203101600 console# 这里的console能够直接进入控制台 |
创建另外的节点(member节点)
admin.nodeInfo
获取到1 | geth --datadir data2 init ~/config/genesis.json# 同样需要先初始化 |
客户端报错the method xxx does not exist/is not available: 需要将要使用的api添加到--http.api
参数中,例如--http.api "eth,web3,personal,miner"
Error: invalid opcode: SHR: 需要在创世块配置里面加上
1 | "byzantiumBlock": 0, |
移除所有pending的transaction: 删除data/geth/transactions.rlp
,然后重启geth服务端,注意queued的transaction不会清除,nonce从0开始,导致queud队列中的一直执行不了,此时只需要把中间空白的nonce值补齐就行(创建transaction)
invalid host specified: 可能是在运行network的时候没有指定hosts,参考上面的配置
1 | apt install ffmpeg -y |
1 | 转换视频格式 |
1 | Print help / information / capabilities: |
按规矩先梳理一下2021年的计划,2021年的计划居然基本上都完成了,真想给自己一个棒棒哒
从20年开始远程工作,21年算是一整年的远程了。今年换了三个地方,有9个月在县城里,两个月在老家,1个月在城里,由于年初换了Mac Mini,没笔记本那么方便,每次换地方都很麻烦,所以现在在三个经常待的地方都买了电脑桌,下一步可能是三个地方都买个显示器了。
远程工作每天依然是朝9晚6,团队比较小,团队内部除了工作以外很少有其他的交流,正适合我这种社恐症患者,并且还能有更多的时间陪家人,每天下班吃了饭就是待着老婆孩子出去散步,夏天走得远一点,冬天就在小区转转,感觉非常幸福。
现在的公司是外包公司,虽说是全栈,但是技术栈还是偏前端,毕竟nodejs是万能的。今年有接触了一些令人兴奋的技术,比如tailwindcss、nestjs、nextjs等,也开始深度使用react和typescript了,PHP、Python、vue相对较少了。明年可能会接触跟多,但是深入不敢说。
因为孩子才一岁,需要花很多的时间去陪伴,所以现在业余时间基本只有家人了。每天孩子睡着到自己睡觉的那一小时属于自己,不过也坚持把塞尔达通关了。说好的有女儿就出去玩儿的,但由于疫情反复,导致今年又没有出过重庆去玩儿,去过最远的地方也就是重庆主城了。希望明年新冠特效药能出来,早日变成一个普通的流感。可以的话,希望明年能请个长假出去玩儿。
女儿今年很健康,好想就发烧过一次,要是去医院去晚了就自己好了的那种,真是棒。而且女儿养起来似乎也不是很难,老婆有时候想要二胎了,那我还是想暂时不要,主要是没钱。
就前年房子装修的钱,就几万块,不过能还完感觉还是很惊喜很意外的。明年希望再接再厉。