fn main() { let C: [i32; 6] = [3, 2, 1, 3, 0, 2]; let mut A = 620; let V: [i32; 6] = [1, 5, 10, 50, 100, 500]; let mut ans: i32 = 0; for i in (0..6).rev() { let t = std::cmp::min(A / V[i], C[i]); A -= t * V[i]; ans += t; } println!("{}", ans); }
Category: uncategorized
【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
【Rust】スタックマシンでループ文を実装するための準備
ループで実行する処理文を記憶するために、”{ }”で囲まれている中身を取得してベクターで保存しておく。
fn main() { let mut stack = vec![]; let mut instructions = vec![]; let str = "1 2 + { 10 20 + }".to_string(); let mut words: Vec<_> = str.split(" ").collect(); while let Some((&word, mut rest)) = words.split_first() { if word.is_empty() { break; } if word == "{" { (instructions, rest) = parse_instruction(rest); } else if let Ok(parsed) = word.parse::<i32>() { stack.push(parsed.to_string()); } else { match word { "+" => add(&mut stack), _ => panic!("{word:?} could not be parsed"), } } words = rest.to_vec(); } println!("{:?}", stack); println!("{:?}", instructions); } fn parse_instruction<'src, 'a>(input: &'a [&'src str])-> (Vec<String>, &'a [&'src str]) { let mut tokens: Vec<String> = vec![]; let mut words = input; while let Some((&word, mut rest)) = words.split_first() { if word.is_empty() { break; } if word == "}" { return (tokens, rest); } else { tokens.push(word.to_string()) } words = rest; } (tokens, words) } fn add(stack: &mut Vec<String>) { let rhs: i32 = stack.pop().unwrap().parse::<i32>().unwrap(); let lhs: i32 = stack.pop().unwrap().parse::<i32>().unwrap(); stack.push((lhs + rhs).to_string()); }
Running `target/debug/sample`
[“3”]
[“10”, “20”, “+”]
【Rust】axumでcookieを取得する
routeにmiddlewareをくっつけます。
Requestのheadersからcookieを取得します。
#[tokio::main] async fn main() { let app = axum::Router::new() .route("/", axum::routing::get(handle_index)) .layer(middleware::from_fn(my_middleware)); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap(); } // async fn my_middleware(req: Request, next: Next,) -> impl IntoResponse { let mut session_token = req .headers() .get_all("Cookie") .iter() .filter_map(|cookie| { cookie .to_str() .ok() .and_then(|cookie| cookie.parse::<cookie::Cookie>().ok()) }) .find_map(|cookie| { (cookie.name() == "hoge".to_string()).then(move || cookie.value().to_owned()) }); println!("{:?}", &session_token); let cookies = req.headers().get("cookie"); println!("{:?}", &cookies); let mut res = next.run(req).await; res }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.60s
Running `target/debug/axum`
Some(“value”)
Some(“hoge=value”)
hoge=value; Max-Age=600
ほう、なるほど。middlewareにリダイレクトを追加したい。
【Rust】型エイリアス(type)
fn main(){ let x = 123; println!("{}", type_of(x)); } fn type_of<T>(_: T) -> &'static str { std::any::type_name::<T>() }
c++だと、typeid
#include <iostream> #include <typeinfo> struct Base {}; struct Derived : public Base {}; struct PolyBase {virtual void member(){}}; struct PolyDerived : public PolyBase {}; int main() { int i; int* pi; std::cout << "int is: " << typeid(int).name() << std::endl; std::cout << "i is: " << typeid(i).name() << std::endl; std::cout << "pi is: " << typeid(pi).name() << std::endl; std::cout << "*pi is: " << typeid(*pi).name() << std::endl; std::cout << std::endl; Derived derived; Base *pbase = &derived; std::cout << "derived is: " << typeid(derived).name() << std::endl; std::cout << "*pbase is: " << typeid(*pbase).name() << std::endl; std::cout << std::boolalpha << "same type? " << (typeid(derived) == typeid(*pbase)) << std::endl; std::cout << std::endl; PolyDerived polyderived; PolyBase* ppolybase = &polyderived; std::cout << "polyderived is: " << typeid(polyderived).name() << std::endl; std::cout << "*ppolybase is: " << typeid(*ppolybase).name() << std::endl; std::cout << std::boolalpha << "same type? " << (typeid(polyderived) == typeid(*ppolybase)) << std::endl; }
fn main(){ let i = 10; let j = 3.14; println!("{}", type_of(i)); println!("{}", type_of(j)); } fn type_of<T>(_: T) -> &'static str { std::any::type_name::<T>() }
derivedは派生。rustはclassがなくstructとimplなので、baseとderivedという概念があるか不明。。
【Rust】スライス
fn main(){ let s = String::from("ABCDEFGH"); let s1 = &s[0..3]; let s2 = &s[3..6]; println!("{} {}", s1, s2); }
c++でsliceはないので、関数で書いている場合
#include <iostream> #include <vector> template<typename T> void print(std::vector<T> const &v) { for (auto i: v) { std::cout << i << ' '; } std::cout << std::endl; } template<typename T> std::vector<T> slice(std::vector<T> const &v, int m, int n) { auto first = v.cbegin() + m; auto last = v.cbegin() + n + 1; std::vector<T> vec(first, last); return vec; } int main() { std::vector<int> v = {1, 2, 3, 4, 2, 2, 4, 6, 5}; int m = 4, n = 7; std::vector<int> sub_vec = slice(v, m, n); print(sub_vec); return 0; }
fn print(v: Vec<i32>) { for &i in & v { print!("{} ", &i); } print!("\n"); } fn slicing(v: Vec<i32>, m: i32, n: i32) -> Vec<i32> { let vec = &v[m..n]; return vec.to_vec(); } fn main(){ let mut vect = vec![1, 2, 3, 4, 2, 2, 4, 6, 5]; let v = slicing(vect, 4, 7); print(v); }
>> slice indices are of type `usize` or ranges of `usize`
これでなぜ引数i32がエラーになるか理解できん…
[shell] コマンドを実行する
シェルでのコマンドの実行はevalで実行する
command="echo hoge" eval $command
$ ./test.sh
hoge
終了コードで処理を変える
command="echo hoge" eval $command retval=$? if [ $retval -eq 0 ] then echo "成功しました!" else echo "失敗しました" fi
これをechoではなく、bitcoin-core.cli –getinfoにします。
command="bitcoin-core.cli --getinfo" eval $command retval=$? if [ $retval -eq 0 ] then echo "成功しました!" else echo "失敗しました" fi
値が1の時に起動するように書けばよさそうですね。
[bitcoin] Berkeley DB
Bitcoincoreで使用されているBerkeley DBについて
– Cで記述されたソフトウェアライブラリ
– Key/value API
– SQL APIとしてSQLiteが組み込まれている
– Bツリー、ハッシュ、キュー、RECNOストレージ
– C++, Java/JNI, C#, Python, Perlなど
– Java Direct Persistence Layer
– JavaコレクションAPI
– レプリケーション
– Berkeley DB is not a relational database, although it has database features including database transactions, multiversion concurrency control and write-ahead logging. BDB runs on a wide variety of operating systems including most Unix-like and Windows systems, and real-time operating systems.
– SQLのようなデータ操作言語を持たず、データベースへのアクセスは全てサブルーチン呼び出しによって行う。しかしdbmとは異なり、データ操作機能にトランザクションやレプリケーションに対応するインタフェースが備わっている
– Berkeley DB本体が対応するプログラミング言語はCおよびC++だけだが、Perl、Python、Tcl他多くの言語にバインディングが用意されており、それらから容易に利用することができる。
概要はわかったので、使い方ですな。
Pythonでeval()の使い方
eval関数は文字列をPythonのコードとして実行する
num = eval("1 + 2 + 3") print(num)
Pythonでzfill
s = ‘1234’
print(s.zfill(10))
$ python3 test.py
0000001234