rustでSteamのAPIからゲームタイトルのリストを取得する。
SteamのAPIからゲームタイトルのリストを取得して、標準出力に出力するプログラムを作った。
割と内容はしょうもない内容だと思う。
API URL
http://api.steampowered.com/ISteamApps/GetAppList/v0002/?format=json
APIレスポンス
レスポンスとして、ネストした構造のJSONデータが取得できる。
出力例
{ "applist": { "apps": [ { "appid": 000000, "name": "ゲームタイトル" } ] } }
rustでの実装について
rustにはserdeというJSONデータを処理するためのライブラリがある。
rustでは、このライブラリを用いてJSONを処理するのがスタンダードらしい。
JSONを処理するには、構造体を定義する必要があるのだけど、
ネストしているJSONデータを扱う場合は、キーごとに構造体の定義が必要でその点が面倒だった。
実装例
Cargo.toml
使用したライブラリは下記の通り。
[dependencies] reqwest = { version = "0.10", features = ["json"] } tokio = { version = "0.2", features = ["full"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0"
main.rs
use serde::{ Serialize, Deserialize }; #[derive(Serialize, Deserialize, Debug)] struct AppList { applist: Apps } #[derive(Serialize, Deserialize, Debug)] struct Apps { apps: Vec<Title>, } #[derive(Serialize, Deserialize, Debug)] struct Title { appid: u32, name: String, } #[tokio::main] async fn main() -> Result<(), reqwest::Error> { let api_url = String::from("http://api.steampowered.com/ISteamApps/GetAppList/v0002/?format=json"); let response = reqwest::get(&api_url).await?; let values = serde_json::from_str::<AppList>(&response.text().await?); for title in &values.unwrap().applist.apps { println!("#{:?}: {}", title.appid, title.name); } Ok(()) }
普段phpしか触っていない人間にとっては、なかなか難しいけれど、学ぶ価値はあると思うので、地道にrustの学習進めていきたいと思う。
プログラミングが無料で学べるサイト&資料
2022年1月13日更新
Microsoft Learn
rustやpython、go、その他Microsoft関連のアプリケーションを学べる。 機械学習?なども取り扱っている模様。
現代の JavaScript チュートリアル
タイトルの通りJavaScriptの基礎を学べる。
JavaScript Promiseの本
タイトルの通り、JavaScriptのPromiseについて学ぶ事ができる。
かなりおすすめ。
exercism
Rustハンズオン@エウレカ社
スライド資料。基礎的な話題について紹介されている。
cat、grepコマンドの実装を通してrustについて学べる内容となっている。
その他
プログラミング学習サイトではないが、プログラミングを学ぶために便利なサイトはこちら。
wandbox
Web上で多種多様な言語を実行する事ができるサイト。
人間の思考は条件反射
人間は自由に思考していると思っていたけれど、実はそうではなく、条件反射で考えているだけなのだと考えるようになった。
知識や記憶があると、その知識を前提にした条件反射が起こる。
例えば、レモンをイメージしたり、写真や実物のレモンを見ると、反射的に唾が出てきたり、口が酸っぱくなった時のような反応が起こる。この話は有名な話なので言うまでもないかもしれない。この例では、体の反応が起こるが、思考においても同様の範的な思考が起きる。
記憶や経験という情報をインプットし、それに基づいてアウトプットが行われる、というのはコンピューターのプログラムと同じ。人間の方が、細かく込み入った状況に対応しているため、自由に思考しているようには見えるけれど、極限まで内容を拡大して分析してみると、反射的な行動として捉えることができる。
思考などその程度のものなので、こだわってもこだわらなくても良い。どっちでも良い。ただ、思考を俯瞰して、一定の距離を置く必要はある。 ベッタリ思考と意識を結びつけて生活していると、心から余裕が奪われるように思う。
vu3: <slot>
スロットは、コンポーネントの中にコンテンツを埋め込む事ができる。文章で理解するよりも、出力例を見るのが早いと思う。
スロットの使用例
コンポーネントの定義
<template> <h2>ハロースロット</h2> <div> <slot></slot> </div> </template>
コンポーネント利用
<component> <b>スロットに出力されるhtml</b> </component>
出力
<h2>ハロースロット</h2> <div> <b>スロットに出力されるhtml</b> </div>
コンポーネント内の
スロットが複数の例
コンポーネントの定義
<template> <h2>コンポーネント</h2> <div> <slot name="slot1"></slot> </div> <slot name="slot2"></slot> </template>
コンポーネントの利用
<component> <template v-slot:slot1> <b>スロット1に出力されるhtml</b> </template> <template v-slot:slot2> <b>スロット2に出力されるhtml</b> </template> </component>
出力
<h2>コンポーネント</h2> <div> <b>スロット1に出力されるhtml</b> </div> <b>スロット2に出力されるhtml</b>
propsで管理する必要がないコンテンツは
rust: ループ
rust には次の3種類のループが使用できる。
- loop
- while
- for
loop
loop は同じコードを停止するまで実行する。
loop { println!("Helloooooooooo"); }
while
条件が真の間実行され続ける。
なお、whileの場合も条件式をまる括弧で囲まずに記述する。
let mut n = 0; while n <= 10 { println!("n={}", n); n = n + 1; }
for
range
1〜10の数字を出力。
for n in 1..10 { println!("{}", n); }
逆順に数字を出力。
for n in (1..10).rev() { println!("{}", n); }
イテレーターのループ
let a = [2, 3, 4, 5, 6]; for value in a.iter() { println!("{}", value); }
rust: if式
if式
let x = 2; if x == 1 { println!("xの値は1です。"); } else if x > 1 { println!("xの値は1より大きいです。"); } else { println!("xに想定外の値が代入されています。"); }
単一の条件の場合については、括弧を使わずに記述する。
次の例のように記述すると、コンパイラの警告が出る(warning: unnecessary parentheses around
ifcondition
)
例) 警告が出る記述
if (x == 1) {
if式をlet文で使用する
ifは式なので、let文の右辺で使用できる。
let is_large_num = false; let value = if is_large_num { 5 } else { 10 }; println!("{}", value);
if式の結果に基づいた値が、変数 value
に束縛される。
Typescript: 型エイリアス
定義方法
型エイリアスは type
キーワードを使って宣言する。
エイリアスは先頭を大文字で記述する。
プリミティブ型
type AgeValue = number const age: AgeValue = 29
ユニオン型
type StringOrNull = string | null let string_value = 'value' string_value = null
配列型
type NumberArray = number[] const nums: NumberArray = [1, 2, 3, 4, 5, 6]
リテラル型をユニオン型で結合
type ColorValue = 'red' | 'green' | 'yellow' | 'black' | 'white' const color: ColorValue = 'green'
オブジェクト型
type DataValue = { name: string; age: number; } const data: DataValue = { name: 'tarou', age: 24 }
まとめ
リテラル型をユニオン型で結合する宣言が便利かも。