雑多なブログ

音楽や語学、プログラム関連の話題について書いています

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関連のアプリケーションを学べる。 機械学習?なども取り扱っている模様。

docs.microsoft.com

現代の JavaScript チュートリアル

タイトルの通りJavaScriptの基礎を学べる。

ja.javascript.info

JavaScript Promiseの本

タイトルの通り、JavaScriptのPromiseについて学ぶ事ができる。
かなりおすすめ。

azu.github.io

exercism

exercism.org

Rustハンズオン@エウレカ

スライド資料。基礎的な話題について紹介されている。
cat、grepコマンドの実装を通してrustについて学べる内容となっている。

speakerdeck.com


その他

プログラミング学習サイトではないが、プログラミングを学ぶために便利なサイトはこちら。

wandbox

Web上で多種多様な言語を実行する事ができるサイト。

wandbox.org

人間の思考は条件反射

人間は自由に思考していると思っていたけれど、実はそうではなく、条件反射で考えているだけなのだと考えるようになった。

知識や記憶があると、その知識を前提にした条件反射が起こる。

例えば、レモンをイメージしたり、写真や実物のレモンを見ると、反射的に唾が出てきたり、口が酸っぱくなった時のような反応が起こる。この話は有名な話なので言うまでもないかもしれない。この例では、体の反応が起こるが、思考においても同様の範的な思考が起きる。

記憶や経験という情報をインプットし、それに基づいてアウトプットが行われる、というのはコンピューターのプログラムと同じ。人間の方が、細かく込み入った状況に対応しているため、自由に思考しているようには見えるけれど、極限まで内容を拡大して分析してみると、反射的な行動として捉えることができる。

思考などその程度のものなので、こだわってもこだわらなくても良い。どっちでも良い。ただ、思考を俯瞰して、一定の距離を置く必要はある。 ベッタリ思考と意識を結びつけて生活していると、心から余裕が奪われるように思う。

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で管理する必要がないコンテンツはで埋め込めば、実装が単純で良いと思う。あとは、htmlのレイアウトファイルにヘッダ・コンテンツ・フッタのそれぞれの要素をで構築するような時は便利かな?

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 aroundifcondition)

例) 警告が出る記述

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
}

まとめ

リテラル型をユニオン型で結合する宣言が便利かも。