Don't wanna be here? Send us removal request.
Text
クリーンアーキテクチャ
『Clean Architecture 達人に学ぶソフトウェアの構造と設計』という本を半分位読んだ。
主に依存関係を整理してメンテしやすくする考え方が書いてある。interface沢山使う。
重要で、あまり変更されず、抽象的なコードの塊に、他のより重要でなく変更されやすく具体的なコードの塊を依存させる。依存関係を一方向にすることで(特に循環依存をなくすことで)、メンテの効率を上げる。
色々なコードから依存されていると変更しづらくなるから、重要で変更されにくいコードを沢山依存されるようにするとちょうどよい。また、抽象的であることは、それ自体の修正の必要性が大きく減ることになるし、拡張性も担保される(インターフェースにメソッド追加とかすぐできる)ので、重要で変更されにくい沢山依存されるコードとしてはちょうどよい。
下記はクリーンアーキテクチャを実践したgoのプロジェクトらしい。
https://github.com/bxcodec/go-clean-arch
domain, delivery, repository, usecaseがある。
domainは重要で、あまり変更されず、抽象的なコードが主に入っている。deliveryはhandlerみたいなやつ。repositoryはDBとかAPIとかを操作するやつ。usecaseはユースケース。
上記のgitリポジトリだと、articleとauthorでディレクトリ分けてるけど、そこまでするんかーと思った。このメリットはまだよく分からない。今度テストの仕方とか見つつ、実際試してみようと思いました。
0 notes
Text
vscodeでyamlファイルを自動フォーマット
vscodeでyamlファイルを自動フォーマットしたいと思い、vscode-yamlを入れました。
schemaを設定したりすると、lintみたいに色々警告してくれるらしい。vscodeの自動フォーマットに設定できます。
ただ、docker-compose.ymlは自動フォーマットできず、vscodeのsettings.jsonに、下記のようにしてみてもエラーが出ました。
"[dockercompose]": {
"editor.defaultFormatter": "redhat.vscode-yaml"
},
vscode-dockerにもフォーマット機能があるので、それを使いました。
"[dockercompose]": {
"editor.defaultFormatter": "ms-azuretools.vscode-docker"
},
yamlのインデントを好きなスペースで自動フォーマットさせるためには、vscodeのウインドウ右下の下記画像赤枠の部分から「スペースによるインデント」を好きなサイズに設定した上で、自動フォーマットを実行するとできました。
0 notes
Text
ArchLinuxでdocker-compose upしたらエラーが出た
docker-compose up -d したら、突然下記エラーが出た。
[3480] Error loading Python lib '/tmp/_MEIGimHK7/libpython3.7m.so.1.0': dlopen: libcrypt.so.1: cannot open shared object file: No such file or directory
下記をしたらエラーが出なくなった。
sudo pacman -S libxcrypt-compat
下記に書いてあった。
https://stackoverflow.com/questions/71319730/error-loading-python-lib-tmp-meir5krcn-libpython3-7m-so-1-0-dlopen-libcryp
0 notes
Text
Hardhatでデプロイ済みコントラクトにアクセスする
デプロイ済みのコントラクトは、アドレスとABIがあればアクセスできる。
hardhatでは、abiは下記で取得できた。
hre.artifacts.readArtifactSync("Hoge").abi
でも、abiを取得しなくても、下記で実行できた。
const address = "0x5fbdb2315678afecb367f032d93f642f64180aa3"
const hoge = await hre.ethers.getContractAt("Hoge", address);
const num = await hoge.getNum(); //コントラクトhogeのgetNum関数を呼び出し
ここに関連する関数が色々書いてあった。
0 notes
Text
archlinuxでsolcを使う
sudo pacman -Syu
sudo pacman -S solidity
solc --version
solc, the solidity compiler commandline interface
Version: 0.8.12+commit.f00d7308.Linux.g++
cat Hoge.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;
contract Hoge {
uint public num = 10;
}%
solc --optimize --bin Hoge.sol
======= Hoge.sol:Hoge =======
Binary:
6080604052600a600055348015601457600080fd5b50607d806100236000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80634e70b1dc14602d575b600080fd5b603560005481565b60405190815260200160405180910390f3fea2646970667358221220caf7aadf7bf4c6d17c648df99fbe7e993054091a3ed80634b8482ff66376520364736f6c634300080c0033
solc --abi Hoge.sol
======= Hoge.sol:Hoge =======
Contract JSON ABI
[{"inputs":[],"name":"num","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
0 notes
Text
hardhatのconsoleの使い方
npx hardhat nodeでもブロックチェーンを作れるけど、npx hardhat consoleでも対話型のコンソール&blockchainが作れるっぽい。npx hardhat consoleを開いている状態はblockchainが維持されるから、localhost:8545に接続して、コントラクトをデプロイしたら、cosoleから見られるのかなと思った。gethは、コンソールに接続するネットワークも指定できたからそういうことも可能かもしれない。consoleでは下記のようなコマンドが使える。
config
await ethers.getSigner()
await ethers.provider.getBlockNumber()
await ethers.provider.listAccounts()
(await ethers.getSigner()).address
(await ethers.getSigner()).populateTransaction(txrq)
await (await ethers.getSigner()).sendTransaction(txrq)
npx hardhat nodeとnpx hardhat consoleを一緒に実行してもエラーにならない。両方とも、127.0.0.1:8545になってる。同じなのかな。両方閉じたら、リセットされるのかな?ちょっと確認してみよう。
とりあえず、consoleをrestartしたら、blockchainはリセットされた。
nodeを実行してないと、console実行中でもcurlで接続できない。node実行中だと、下記になる。
curl 127.0.0.1:8545
{"jsonrpc":"2.0","id":null,"error":{"code":-32700,"message":"Parse error: Unexpected end of JSON input"}}
consoleとnodeは別で、外部接続にはnode実行が必要なのかも。
npx hardhat run scripts/deploy_hoge.ts --network localhost
上記でコントラクトをデプロイしたけど、consoleの方はblockNumberは0のままだった。
とりあえずやっぱり別物なんだなあ。consoleにnodeで実行中のchainを接続できるのかな?
npx hardhat --network localhost console
上記で接続できた。
0 notes
Text
Solidity0.8の関数と状態変数の可視タイプ
extract
他のコントラクトや、トランザクションを介して呼び出すことができる。
内部呼び出しは出来ないが、this.f()と呼び出すことは可能。
call dataがmemoryにコピーされない。
public
内部呼び出しか、メッセージを介して呼び出すことができる。
publicな状態変数は、自動的なゲッター関数が生成される。
internal
内部アクセスのみ可能。
派生したコントラクトからもアクセス可能。
private
内部アクセスのみ可能。
派生したコントラクトからはアクセスできない。
https://docs.soliditylang.org/en/v0.8.0/contracts.html#visibility-and-getters
0 notes
Text
goをdocker-composeで使う
GinでWEBサーバつくってるからdocker-compose.ymlのtty:trueはいらないはず。tty:trueを設定したら、fmt.Println("Hello")だけのコードでもコンテナは終わらない。
airというのは便利で、ホットリロードしてくれる。airの設定内容は全く確認してないけど、airのリポジトリのサンプルをそのままにしてる。
goのアプリを動かすコンテナで、airをインストールして、ローカルのコードをコンテナにコピーして、go mod tidyして、airをスタートさせたい。DockerfileのCMDとかRUNというのは、どうも、docker-composeのvolumesの設定完了前に、実行される(ことが多い)っぽい。だから、go mod tidyとかをDockerfileのRUNで実行後に、volumesでsrcディレクトリを共有すると、最初にRUNでコンテナ側で作成された、go.sumとかが消えちゃうものと思われる。
ちなみに、airはgo installしており、これはsrcディレクトリにインストールされるわけではないっぽいので(グローバルなインストールなので)、Dockerfileでinstallしている。CMD ["air", "-c", ".air.toml"]とかしても大丈夫だと思う。ただ、airが一度ビルド(goコードのコンパイル)に失敗した後に、再度コード変更を検知し、ビルドしてくれるのかというと、どうもしない感じだった。なので、結局、docker-composeのcommandで、go mod tidy && air を実行するようにしてみた。
0 notes
Text
ArchLinuxのpacmanで削除する
> sudo pacman -R nodejs npm
https://wiki.archlinux.jp/index.php/Pacman#.E3.83.91.E3.83.83.E3.82.B1.E3.83.BC.E3.82.B8.E3.81.AE.E5.89.8A.E9.99.A4
0 notes
Text
ArchLinuxで複数ユーザでvscodeを使う
新たに追加したユーザだと、vscodeとexplorer.exeがエラーで開けなかった。
下記のようにLinux起動時のデフォルトユーザを設定したら、デフォルトユーザであれば、vscodeが使えるようになった。あと、そのユーザがsudo権限を持っている必要があるかも。
デフォルトユーザの設定
/etc/wsl.confに下記を追加
[user] default = "hoge"
wslを再起動
PowerShellを開いて下記を実行
> wsl --shutdown
0 notes
Text
ArchLinuxでシェルをZshに変更
ArchLinuxで追加したユーザのパスワードを設定するには、rootで passwd hoge を実行します。シェルをzshに変更するには、chsh -s /bin/zsh です。
1 note
·
View note
Text
ArchLinuxでuseradd
ArchLinuxでuserを追加するには、 sudo useradd -m hoge です。-mはHome Directoryを作成します。グループ設定がないとユーザ名と同じグループが自動作成されます。
https://wiki.archlinux.jp/index.php/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A8%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97
0 notes