fn dfs(i: i32, sum: i32) -> bool { let k = 10; let n = 10; if (i == n) { return sum == k; } if (dfs(i + 1, sum)) { return true; } if (dfs(i + 1, sum + i)) { return true; } return false; } fn main() { if (dfs (0, 0)) { println!("yes"); } else { println!("no"); } }
Ants POJ 1852
fn main() { let n = 10; let L = 100; let mut minT: i32 = 0; for i in 0..n { minT = std::cmp::max(minT, i.min(L - i)); } let mut maxT: i32 = 0; for i in 0..n { maxT = std::cmp::max(minT, std::cmp::max(i, L - i)); } println!("max:{}, min: {}", minT, maxT); }
max:9, min: 91
三角形の周長
fn main() { let mut ans: i32 = 0; let n: i32 = 10; for i in 0..n { let j = i + 1; for j in j..n { let k = j + 1; for k in k..n { let len = i + j + k; let ma = std::cmp::max(i, std::cmp::max(j, k)); let rest = len - ma; if (ma < rest) { ans = std::cmp::max(ans, len); } } } } println!("{}", ans); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.14s
Running `target/debug/basic`
24
【Blockchain】Avalancheのノードの稼働
$ wget -nd -m https://raw.githubusercontent.com/ava-labs/avalanche-docs/master/scripts/avalanchego-installer.sh;\
chmod 755 avalanchego-installer.sh;\
./avalanchego-installer.sh
$ ./avalanchego –network-id=local –staking-enabled=false –snow-sample-size=1 –snow-quorum-size=1 –http-host=0.0.0.0
【Blockchain】Cardanoのノードの稼働
### 依存パッケージのインストール
$ sudo apt update
$ sudo apt install -y libssl-dev build-essential m4 jq curl
MithrilクライアントはRustで開発されている
### Rustツールチェーンのインストール
$ curl –proto ‘=https’ –tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source $HOME/.cargo/env
$ rustup install stable
$ rustup default stable
$ rustup update
$ rustup component add clippy rustfmt
$ rustup target add x86_64-unknown-linux-musl
Mithrilクライアントは、Cardanoノードのデータベースを迅速に同期するためのツール
$ git clone https://github.com/input-output-hk/mithril.git
$ cd mithril
$ ls
CHANGELOG.md NOTICE internal mithril-install.sh
CODE-OF-CONDUCT.md README.md mithril-aggregator mithril-relay
CONTRIBUTING.md SECURITY.md mithril-client mithril-signer
Cargo.lock demo mithril-client-cli mithril-stm
Cargo.toml docs mithril-client-wasm mithril-test-lab
DEV-ADR.md examples mithril-common networks.json
LICENSE flake.lock mithril-explorer openapi.yaml
Makefile flake.nix mithril-infra
$ git fetch –all –prune
$ git checkout tags/2403.1
$ cd mithril-client-cli
$ make build
$ ./mithril-client -V
$ sudo mv mithril-client /usr/local/bin/mithril-client
$ mithril-client cardano-db snapshot list
$ mithril-client cardano-db snapshot download –snapshot-id
【Blockchain】ethereumのlight nodeをサーバで動かしたい
### ubuntuにaptよりインストール
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt update
$ sudo apt install -y geth
### light modeについて
$ geth –syncmode “light”
INFO [06-02|12:21:33.754] Starting Geth on Ethereum mainnet…
INFO [06-02|12:21:33.756] Bumping default cache on mainnet provided=1024 updated=4096
INFO [06-02|12:21:33.762] Maximum peer count ETH=50 total=50
INFO [06-02|12:21:33.767] Smartcard socket not found, disabling err=”stat /run/pcscd/pcscd.comm: no such file or directory”
WARN [06-02|12:21:33.773] Sanitizing cache to Go’s GC limits provided=4096 updated=654
Fatal: –syncmode: unknown sync mode “light”, want “full” or “snap”
lightクライアント機能は削除されている模様
### snap (軽量なフルノード)
数時間で同期可能
400GB以上が必要
$ geth –syncmode=snap
【Rust】プロセススケジュラー
#[derive(Debug, Clone, Copy, PartialEq, Eq)] enum ProcessState { Ready, Running, Waiting, Terminated, } #[derive(Debug)] struct Process { pid: usize, state: ProcessState, } struct Scheduler { processes: Vec<Process>, current_index: usize, } impl Scheduler { fn new(processes: Vec<Process>) -> Self { Scheduler { processes, current_index: 0, } } fn schedule(&mut self) -> Option<&Process> { if self.processes.is_empty() { return None; } let len = self.processes.len(); for _ in 0..len { self.current_index = (self.current_index + 1) % len; let proc = &mut self.processes[self.current_index]; if proc.state == ProcessState::Ready { proc.state = ProcessState::Running; return Some(proc); } } None } fn update_state(&mut self, pid: usize, new_state: ProcessState) { if let Some(proc) = self.processes.iter_mut().find(|p| p.pid == pid) { proc.state = new_state; } } } fn main(){ let mut scheduler = Scheduler::new(vec![ Process { pid: 1, state: ProcessState::Ready}, Process { pid: 2, state: ProcessState::Ready}, Process { pid: 3, state: ProcessState::Waiting}, ]); for _ in 0..5 { if let Some(proc) = scheduler.schedule() { println!("Running process: {:?}", proc.pid); scheduler.update_state(proc.pid, ProcessState::Ready); } else { println!("No Runnable processes."); break; } } }
【Rust】メモリ管理
const FRAME_SIZE: usize = 4096; const TOTAL_MEMORY: usize = 1024 * 1024 * 128; const TOTAL_FRAMES: usize = TOTAL_MEMORY / FRAME_SIZE; static mut FRAME_BITMAP: [bool; TOTAL_FRAMES] = [false; TOTAL_FRAMES]; pub struct FrameAllocator; impl FrameAllocator { pub fn alloc() -> Option<usize> { unsafe { for (i, used) in FRAME_BITMAP.iter_mut() enumerate() { if !*used { *used = true; return Some(i * FRAME_SIZE); } } None } } pub fn dealloc(addr: usize) { let index = addr / FRAME_SIZE; if index < TOTAL_FRAMES { unsafe { FRAME_BITMAP[index] = false; } } } }
【Rust】バイナリデータへの処理
### 文字列の変換
fn main() { let text = "Hello, Rust!"; let binary = text.as_bytes(); println!("binary: {:?}", binary); }
binary: [72, 101, 108, 108, 111, 44, 32, 82, 117, 115, 116, 33]
### テキストファイルの変換
input.txt
Hello Rust! This is sample
use std::fs::File; use std::io::{self, Read, Write}; fn main() -> io::Result<()>{ let mut input_file = File::open("./data/input.txt")?; let mut buffer = Vec::new(); input_file.read_to_end(&mut buffer)?; println!("binary: {:?}", &buffer); Ok(()) }
### データのchunk
fn main(){ let data = vec![0u8; 10000]; let chunk_size = 1024; for(i, chunk) in data.chunks(chunk_size).enumerate() { println!("チャンク {}: サイズ = {}", i, chunk.len()); } }
チャンク 0: サイズ = 1024
チャンク 1: サイズ = 1024
チャンク 2: サイズ = 1024
チャンク 3: サイズ = 1024
チャンク 4: サイズ = 1024
チャンク 5: サイズ = 1024
チャンク 6: サイズ = 1024
チャンク 7: サイズ = 1024
チャンク 8: サイズ = 1024
チャンク 9: サイズ = 784
### 画像データのchunk
use std::fs::File; use std::io::{self, Read, Write}; fn main()-> io::Result<()>{ let mut input_file = File::open("./data/test.jpg")?; let mut buffer = Vec::new(); input_file.read_to_end(&mut buffer)?; let chunk_size = 1024; for(i, chunk) in buffer.chunks(chunk_size).enumerate() { println!("チャンク {}: 値 = {:?}", i, chunk); } Ok(()) }
Rustでmalloc, free
use std::alloc::{alloc, dealloc, Layout}; use std::ptr; fn main() { unsafe { let layout = Layout::new::<i32>(); let ptr = alloc(layout) as *mut i32; if ptr.is_null() { panic!("メモリ確保に失敗しました"); } *ptr = 42; println!("ptrが指す値: {}", *ptr); dealloc(ptr as *mut u8, layout); } }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.83s
Running `target/debug/memory`
ptrが指す値: 42