RustでEnumを文字列(文字列slice)から生成したい

Rustを書いていると自分で定義したEnumを文字列から生成したくなる時がある。コード例で示すとこんな感じ pub enum Foo { Foo1, Foo2, Foo3, Foo4 } Foo::from_str("Foo1") // -> Foo::Foo1 こんな時は標準ライブラリに入っている、std::str::FromStr トレイトを実装してやるとうまいこといくし、他の似たような挙動をする型と一緒に扱えたりして便利で作法的にも良い。例は以下の通り use std::str::FromStr; use std::str::FromStr; pub enum Foo { Foo1, Foo2, Foo3 } impl FromStr for Foo { type Err = &'static str; fn from_str(s: &str) -> Result<Self, Self::Err> { match s { "Foo1" => Ok(Foo::Foo1), "Foo2" => Ok(Foo::Foo2), "Foo3" => Ok(Foo::Foo3), _ => Err("Error") } } } Foo::from_str("Foo1") // Ok(Foo::Foo1) Foo::from_str("Foo1sadasd") // Err("Error") もちろんFromStrはトレイトなのでenum以外にも適用可能なので、任意の型を文字列から生成したい時にはこの方法を使いましょう。

Posted

SPAにおけるOpen ID Connect認証

サーバーサイドとクライアントサイド両方とも実装する機運が出てきたのでそれぞれの役割を整理するためにシーケンス図を書いた。 Googleって書いてあるところはOAuthプロバイダーなら何でも置き替えられるはず 間違ってたら教えてくれ 追記: とりあえずシーケンス図が書けたのでAPIサーバーに求められている機構を実装した。curlで試しているのと、SPAのガワが存在していないため一旦セッションに入れたりstateの検証するのは省いた。 const { createHash } = require("crypto"); const url = require("url"); const express = require("express"); const bp = require("body-parser"); const axios = require("axios"); const jwt = require("jwt-simple"); const secret = require("./secret.json"); const app = express(); app.use(bp.json()); const salt = "hakatanosalt"; app.get("/oauth/callback", (req, res) => { console.log( JSON.stringify({ code: req.query.code, state: req.query.state }) ); res.send("ok"); }); app.get("/oauth/google/login", function(req, res) { const state = createHash("sha256") .update(`${salt}${Math.random()}${+new Date()}`) .digest("hex"); const params = new url.

Posted

RustでMarkdown to Htmlを試してみる

有給を取って、ここ最近新しい事を始められてなかったことを思い出したので前からやりたかったRustに入門をしました。 んで、まぁいつも通りブログシステムでも書いてみるかなぁとか思ってRocket触ってDBまでアクセスしてInsert流す所までは普通にできたので、とりあえず次はMarkdownをパースしてhtmlに変換するやつでも書こうかなと思ったのでやってみることに。 ライブラリを物色してみるとpulldown-cmarkというやつが人気そうなので雑にインストールして使ってみることにしました:smile: インストール Rustの環境構築は一旦省いて、以下のコマンドでパッケージを切って依存関係にpulldown-cmarkを入れていきます。 $ cargo new --bin pulldown_cmark_playground $ cd pulldown_cmark_playground $ cat 'pulldown-cmark = "0.1.2"' >> Cargo.toml $ cargo build cargo buildした時に依存関係にあるpulldown-cmarkが落ちてきてビルドされます。エコシステムがしっかりしていて完全に便利。文明の息吹を感じろ。 htmlに変換してみる というわけでライブラリを使う準備が整ったのでさっそくMarkdownをhtmlに変換してみる。 GitHubのREADME.mdにはサンプルコードらしき物が書いていないが、ドキュメントの方にはちゃんと書いてあるのでそちらを参照しよう。大体以下のコードになります。 extern crate pulldown_cmark; use pulldown_cmark::{html, Parser}; fn main() { let markdown_str = r#"# Hello 人間は愚かな生物。 [俺のブログ](https://blog.himanoa.net) "#; let parser = Parser::new(markdown_str); let mut html_buf = String::new(); html::push_html(&mut html_buf, parser); println!("{}", html_buf); } $ cargo run で実行してみると以下の結果が出力されます。 <h1>Hello</h1> <p>人間は愚かな生物。</p> <p><a href="https://blog.

Posted

EFFY one of unreasonable "if" をクリアした

Vertical Strilke Endless Challenge を作ったサークルProject ICKX さん の第一作である所の EFFY one of unreasonable “if” をNormalでクリアしたのでそれの感想を書く。ネタバレもある。たぶん どんなゲームかというと、フライトシューティング(エースコンバット的な)で敵をバッタバッタと撃墜していく感じ。主人公機には専用の装備とかわいい戦術A.Iがついており、専用の装備で超起動したりめっちゃ加速できたりする ご購入はこちら! パッケージ版 COMIC ZINhttps://t.co/WKPjxpppJF AKIBA HOBBYhttps://t.co/wQJnz6YRzt げっちゅ屋https://t.co/QaLL4oMm3b ※2018/8/7現在、上記以外で新品の委託先はありません DL版https://t.co/64HnvYHuflhttps://t.co/DSjXp16BYG メロンブックスDLhttps://t.co/fusq0riFJK — EFFY開発チーム (@effy_staffs) 2018年8月6日 ストーリー 民間軍事企業のテストパイロットをやっていたと思ったら敵が襲いかかってきたので、振りかかる火の粉を払ってたらいつの間にかに戦争になっていた。上司は無茶なミッションばっか頼んでくるしこれからわたし、どうなっちゃうのー!?みたいな感じ。主人公が男なのでこれからわたし、どうなっちゃうのー!?ではないが。 驚きのフルボイス ゲーム中のセリフがフルボイスになっていて神、難易度が高いというのもあるが、レーダーみたり機銃のレティクルみたりでセリフ追ってプレイしていられないのでフルボイスなのは嬉しい。シナリオの把握がしやすい 頻繁にキャラクターが喋ってるのでテキスト量も膨大な感じがするんだがしっかりボイスが付いててすごいと思った。 あと味方のモブが主人公ワッショイしてくれる演出もすき。オタクは自己肯定観がひくいので 機載AIのエフィーがかわいい 機体の性能が高いところに由来するのか妙に自信家なところとか、被弾しまくると落ち込んだりするところがかわいい。 セリフからドヤ顔が浮かぶ… 「わたしを使って 彼らを斃して」だとか「勝てない筈がないのです」とか、こうプレイヤーを奮起させるセリフをバシバシ言ってくのが僕的にはスコポイントでした。 エースコンバット ACE余裕じゃなんとかならない難易度 まじで難しい。エースコンバットはかなり得意なゲームなんですけどEasyでも死んだ箇所があったくらいには難しかった。Normalはやばいですね。難しいポイント攻略するのにかなり時間がかかった。敵が物量の暴力で攻めてくるのもあるんだけどエースコンバットよりも攻撃をよくするイメージがついた。全部俺が撃墜してやるぜーなんてやると一瞬で蒸発したりする。 攻略のコツとか まずは全部自分でなんとかするという気持ちを殺すことです。敵がおおいのでミサイルいっぱいあっても足りなかったりする。 味方が有能なので味方と一緒に飛ぶ事を心がける事でこの変はなんとかなったりする。あと母艦が出てくるミッションは困ったら母艦の上空をグルグル回ったりしとけば敵が勝手に死ぬ。この変はエースコンバットよりどうやって飛ぶかを考えさせられるゲームだった。

Posted

Python + Firebase RealtimeDBでDiscordBotを作った感想

Vの者の配信をしてたら放送のリンクをDiscordに自動で投稿してくれる感じのDiscordBotを書きましたhttps://t.co/xKtgGYRJ7w から各位のDiscordServerに登録できます! 簡易的なDiscordBotの作り方について書いた本を本日のコミックマーケット 西め07a にて販売するので、そちらもよろしくお願いします pic.twitter.com/EmHfRv9b0g — ひまのあ??? (@h1manoa) 2018年8月9日 これの話です。 これの裏側はPython3.6 + Firebase RealtimeDB + GAE(Flexible Enviroment)になっています。 今回はRealtime Databsaeを使った感想について書いていきます そもそもなぜReatimeDBを? 人間がデプロイしないで自分のサーバーに追加できるDiscordBotを組みたかったので何かしらに永続化する必要がある。 RDBMSで何か遊ぶことには慣れてるので、本当はRDBMSを使いたかったのだが、無料で使える or もしくはコスパがよろしいプランが存在しなかったので、NosqlなFirebase Realtime DBを採用したみたいな経緯でした。 よかった話 安い 日のデータ通信量がわかれば月のデータ通信量もなんとなくわかるのでわかるんですが、安いのは個人のホビーとしてはポイントがたかい。 僕のユースケースだと無料枠に収まりそうなのでよかった 見えるものが動くまでのサイクルがはやい。 テーブル設計しなくても適当にDatabaseに実データが入れられたり、リアルタイム同期してくれるため動くものを作るまでのサイクルはめちゃくちゃ簡略化できる。 しんどかった話 flattenなスキーマ設計 RealtimeDBはスキーマレスだが開発を効率的にやるためにはやはりスキーマはあったほうがいいと思っているのでアプリケーションコード上でやった。 RealtimeDBはあるテーブルのデータを一覧で取得してくるとその子要素も全部取得してしまうため、データが増えてくるとpayloadは巨大化するしコストも増えていくので、flattenに設計していく必要があるのだがそうすると今度は削除や書き込み時に複数のエンドポイントを更新しないといけなくなるため、漏れが発生するとすぐに破綻するのが大変だった。 そもそもFirestoreを選定しなかった理由 まだベータ版だったのと良さげなAPIClientがなかったため今回は敬遠した。が今度試してみたいですね

Posted