Rust と Web Framework
最近色々思うところがあって、また趣味でRustを触って思うようになりました。 普段Webプログラミングをしていることもあって、まずはとあるWebAPI的なものを作りたいかなと思い調べ始めました。
ですがよくわからない。 私が以前始めたときはactix-webで決まりかなと思っていました。 しかしRust 1.39で導入されたasync/await対応でややこしくなっているように感じます。
もやっとしつつ調べたことを備忘録的に書いていきたいと思います。
async/await とは
Rustのasync/awaitをスムーズに使うためのテクニック - Qiitaによりますと
RustのFutureとasync/awaitは、「時間のかかる処理」をするときに、「処理が終わるまでOSスレッドをブロックする(同期Rust)」のではなく、「当該処理を中断して、そのOSスレッドを別のタスクの処理に使う(非同期Rust)」ことで、スレッド数よりも多くの処理を同時に行う仕組みです。
とあります。 私はC#やっておりましたので比較的イメージしやすかったです。JavaScript(ES6?)にasync/awaitがありますしありますし他言語扱っている方はイメージしやすいかもしれません。 C#では多用していましたので、変にコールバック待つような関数がこれで扱いやすくなるなら万々歳かなと思っていました。
async/await で困ること?
Rustのasync/awaitの実装は3種類あるようです。
こちらの記事によると、Web Frameworkによって使うasync/awaitランタイムが違うようです。
ということのようです。 上記の記事ではオススメはtokioということでwarp&rwebを調べました。
warp & rweb について
この二つのフレームワークのうちrwebはwarpを利用されて作られたフレームワークで、個人的にはこちらの方が作りやすく感じられました。
ただwarp自体、バージョンが0.2.3と若くまだまだ機能不足を感じました。 現在のバージョンで作るのはなぁという気が(;´∀`)
actix-web
多分、今Rustでは一番使われているWeb Frameworkのような気がします。 Web Frameworkでの必要な機能を網羅し、連携する各種ライブラリもそろっています。
気になっているのは上の方で書いた「2019 年の非同期 Rust の動向調査 - Qiita」のページでは今はいいけど今後はオススメではない的な雰囲気を感じました。 ですが、結局のところ機能面など考えると結局のところこれしかないような気がします。
本当にこれでいいの? とはちょっと思いもやっとしています。
結局のところ
若干もやっとしつつもactix-webを使っていこうかと思います。 正直、識者にこの辺の話、教えてほしいなぁとか思ったりも🤣
Pixel3 を修理した話
現在はiPhone SEを使っているのですが、Pixel3は楽天MNOのSIMを入れてサブ機としていました。 気が付いたらバッテリが大膨張。 仕方なく修理したというどうでもイイ話です。
Pixel3を修理するには?
私のPixel3はGoogle Storeから購入したSIMフリー版です。 そうしますと、修理の窓口がどこかが気になります。 キャリアのショップで買った場合であれば、キャリアで購入していないのでそういった窓口は使えません。
Webページによると「サポートされている国の Google ストアで手続きを開始します。」と記載されており、そのリンクをたどってもGoogle Storeへのトップページへ遷移し、修理窓口を見つけることができませんでした。
個人的には そんな馬鹿な・・・・ という気持ちですが、いくら探しても窓口が見つかりません。 そのため、同ページ内に「修理には主に、スマートフォンを配送する方法と、認定修理担当パートナーに持ち込む方法の 2 つがあります。修理オプションについて詳しくは、認定修理担当パートナーの一覧をご覧ください。」とあり、 認定修理パートナーについて調べると日本では「iCracked」というお店が担当しているようです。
iCrakedというお店
iCrakedというお店自体は修理専門店のようです。たまたま地元の駅にiCrackedがあったので、行ってみたところ「Web予約がない場合、Pixel3の修理ができない」との回答。部品を在庫で持っていないようです。 そもそも、このお店携帯電話ショップ内にあるようで、外からは「UQmobile」の販売店のように見えました。 店舗としても非常に小さく、Googleの認定修理パートナーってこんな感じなの?とちょっと思ってしまいます。
この辺は日本でシェアが非常に多いAppleとの差が大きくちょっと愕然としていまいました(;´∀`)
その後、たまたま吉祥寺方面に来ることがあり、そちらのiCrackedへふらり寄ったところこちらではPixel3の部品の在庫があるのか修理対応が可能でした。 こちらのお店は外からもiCrackedという看板がかかっていて専業であることがわかります。
推測ですが、iCrackedのショップはいわゆる系列のお店と、代理店みたいなお店があってお店のレベルみたいなものが全然違うように思います。 Pixelを修理するなら部品の都合もありますし、個人的には大きめなiCrackedへ行くことをオススメしたいなぁという気持ちになりました。
Pixel3のバッテリ交換
こちら交換前にGPSやマイクなど各種ハードウェアのテスト行いその後交換に入りました。 ちょっとメインカメラのAF回り怪しいなぁと個人的には思っていたのですが、問題ないらしいです(´▽`) ほんとかどうかは知らんけどw
交換前のチェックは意外と時間がかかって20分ぐらいはかかったのでしょうか。 あらかじめ本体をリセットしてSIMも外して持って行ったのですが、テストの都合でセットアップやSIM入れる必要があってそこらへんは想定外でした(;´∀`)
その他、Googleに思うこと
GoogleのWebページに直接修理依頼する方法について記載がないし、iCrackedは普通の街中の修理店という感じなので、ちょっとAppleの対応に比べると正直がっかり感がでかいです。 さすがに販売規模も違うので・・・というのはあるのですが、Google自体あんまり売る気とかないよね。 そんな感じに受け取ってしまいます。
今回のこの状況を考えても今後新品のGoogle製品買うのは躊躇するなぁという気持ちです。 メーカーに直接修理依頼出せないのは気持ち的には納得できない感じです。
Microsoft、Dell、Appleといった他のメーカーに修理依頼が直接出せるのでサポートはしない感がすごい感じます。
VSCodeでVue(NUXT)のファイルを編集する
最近、NUXTのプロジェクトを作成してVSCode開発というのがちょくちょくあります。 その時に、設定をしないとVSCodeでフォーマットのルールと、NUXTの開発Webサーバ起動中にチェックする内容が違うためです。
実のところJavaScript初心者なのでこの辺ESLint? Pretter?なにそれという人ではあるのですが、最終的に下記の設定を行うことで私の目的は達成できました。
{ "editor.formatOnSave": false, "editor.codeActionsOnSave": { "source.fixAll": true }, "vetur.format.defaultFormatter.html": "prettier", "vetur.format.defaultFormatter.js": "prettier", "[vue]": { "editor.tabSize": 2, "editor.insertSpaces": true, "files.eol": "\n" }, "[javascript]": { "editor.tabSize": 2, "editor.insertSpaces": true, "files.eol": "\n" }, }
この手の設定はすぐ忘れがちなので自分のブログでメモ書きとして残して置こうと思いました。まる
AirPods Proを購入しました、とレビューみたいなもの
今更感がすごいのですが、iPhone SEも購入しましたし、給付金を当てにしてAirPods Proを購入しました。
元々iPad mini持ってたりするのでApple製品に固めて利便性良くしてみるのもよいかなと思いまして。
今まで使ってきたBluetoohヘッドホンと比較しながら感想を書いていきます。
- 今までのBluetoothイヤホン(ヘッドホン)歴
- 今回AirPods Proを買ったわけ
- ペアリングが簡単、切り替えも楽ちん
- ノイズキャンセリングは?
- 音質はどう?
- ボリューム操作に困る
- その他:思えばParrot Zikシリーズはすごかった
- その他:AndroidやWindows PCにもつなげられます
今までのBluetoothイヤホン(ヘッドホン)歴
- Jabraのヘッドホン(型番不明)
- SONYかオーディオテクニカの普通のイヤホンをBlutoothに変換する機器(型番不明)
- Parrot Zik
- Parrot Zik2
- SONY MDR-ABN100
この中で今でもすごいと思っているのはParrot Zikシリーズです。
今では他社でも採用されてますが、ヘッドホンハウジングのタッチやスライドによる制御、Zik2ではノイズキャンセリングに加え、AirPods Proにもあるようなストリートモードがあります(しかもかかり具合を調整可能!)
そんなZikの最大の弱点が音声会話時の音質が悪いこと、こちらはHFP,HSPどちらだか覚えてないですがプロファイルの問題で音質が悪かったです。
そこでMDR-ABN100に変えた感じとなります。音楽の音質、通話時の音質を優先した形です。一部不満があるものの全体的満足していたので3年ほど使ってます。
今回AirPods Proを買ったわけ
MDR-ABN100を3年ぐらい使って、主にノイズキャンセリングの機能が怪しくなってきました。
突如ハウリングのような音だしたりと。また電池も随分持たなくなった気がします。
パッドやハウジングが割れたりしたのですが、保証を使って直したので見た目は結構新しいのですがそろそろ新しいのかなぁと考えたりしていまして・・・。
コロナで給付金とかいう話があったり、iPhoneSEに乗り換えたりとかありまして。
ここで一つApple信者になりましょうということ購入をしました。
あとAirPods Proはレイテンシが低いのでそこそこリズムゲームもできるらしいという話もありまして・・・・。
ペアリングが簡単、切り替えも楽ちん
AirPods Proを最初に使って思ったことは接続・切り替えが非常に楽だということです。
操作方法とかは適当にYoutube検索するとよくわかると思うので割愛します。
何が楽に感じるかというと、切断→接続の2ステップが必要ないということです。
iPhoneからiPadに繋ぎ変えるときに、新しくつなぎたいほうで接続だけすればつながってしまう。
比較的頻繁に切り替えするほうだと思うので、この辺のイライラが解消されてありがたいです。
ノイズキャンセリングは?
前まで使っていたMDR-ABN100との比較です。
ノイズキャンセリングの効き自体は圧倒的にAirPods Proのほうが強く効きます。
またMDR-ABN100では外歩いているとき、風が強く吹くと「ボボボボボ」とむしろうるさくなってしまうことが多いです。
AirPods Proではそういったことが現時点なく快適に過ごせています。
この辺は3年以上前の機種との差が大きいですよね。
音質はどう?
音質に関しては人によってだいぶ感想が変わると思います。
私はすでに40歳を超えたおっさんの耳なので、音質については話半分に感じて頂ければと。
音のタイプとしてはイヤホンよりヘッドホンが好きなので正直MDR-ABN100のほうが好きな音です。
やっぱりスピーカーの口径が大きく取れる分、低音まで無理なく音が広がるのはヘッドホンのメリットかなと。
逆にAirPods Proのスピーカー部分の口径が小さいので低音の出方がしばらく気になってしまうところがありました。とは言え半日で慣れました。
多分有線イヤホンにしたら実売1万円程度ぐらいの音質だと思うので音質思ったよりよくないなって思う人はいるかと思います。
ボリューム操作に困る
良いことばかりのAirPods Proですがどうしても困っていることが一つあります。
それはボリューム操作です。
一通りの操作をタッチ操作で可能なAIrPods Proですが、ボリューム操作はできません。
ボリューム操作をしたい時がたまにあるのですが、そういったときは仕方なくSiriを使って「Hey Siri! ボリューム下げて」とかやっています。
その他:思えばParrot Zikシリーズはすごかった
Parrot Zik 2が発表したのは2014年です。
このParrot Zik 2.0は今から6年前にすでにストリートモード(外音取込機能)が実装されています。
しかもアプリで効き具合を調整することも可能です。イコライザーの機能、サラウンド機能などの機能も盛り込んであります。
しかもヘッドホンのハウジング部分にタッチセンサをつけて操作が可能です。
これらの機能を私の知る限り一番最初につけたへッドホンです。
Zik 3.0以降、開発をやめてしまったぽいのが残念です。。。
その他:AndroidやWindows PCにもつなげられます
Bluetooth機器なので不通にAndroid や Windows PCにもつながります。
たまーに、自分のノートPCにつなげたくなる時があるのでそういう時に使っています。
パナレーサー 携帯ミニワンタッチポンプ(BMP-23AEZ)を購入しました
パナレーサーから2020年4月に発売した、自転車用の携帯ミニポンプ(BMP-23AEZ)を購入しました。
購入の動機は「高圧でも重くなりづらい」という情報を得たからです。
自転車のサイクリングで持っていくポンプとしては「例のポンプ」と言われていた中華製の携帯ミニポンプを使っていました。
正直この例のポンプ以前とは空気入れるときの楽さが全然違うので、例のポンプ以外持てない感じになってしまってました。
個人的には名のあるメーカーのものを使いたいとも思っていて、このパナレーサーのミニポンプが発売されたので試しに使ってみることにしました。
形状とか
以前使っていたBlackBirdのポンプとの比較です。私はこのポンプにお助けチューブをつけて使っていました。
写真の通り、長さは短く、そしてチューブ分かさばる感じになっています。
また意図せず伸びてしないように、押し込んだ状態で回しておくとロックされ伸びなくなります。
こういう細かい配慮が例のポンプとの違いかなと思っています。
ポンピング
20インチ(406)のタイヤに空気いれています。
取り付け、取り外しに関しては少々コツがいるように感じます。
最初取り外しができずに、非常に困っていました。思わず自室へ戻ってYoutubeを検索するぐらいには(;´∀`)
こちら取り付け、取り外しに関してはまっすぐ力がかかるように、脇からではなくタイヤの正面に立って取り付け取りはずしをしたらするっととれましたw
それさえなければ非常に楽に取り付け、取り外しが楽に行えるので非常に良いと思います。
どちらが良いか
正直、お値段はまだ中華な例のポンプのほうが安いですが、全体的な配慮とか考えるとこのパナレーサーの携帯ミニワンタッチポンプ(BMP-23AEZ)のほうがよいと感じています。
多分今後、自転車でのお出かけのオトモはこちらを使っていくと思います(*´▽`*)
Rust async は意外とツライ件
忘れないようにサクサクとメモ書きです。
そんな私がRust 1.39でasync/awaitが入ったということで喜んでがりがり使ってみようと
思ったけどあんまりうまく行かなかったって話です。
Rust初心者がasync/await使ってハマったのは・・・・
- traitの実装ではではasync関数使えない。ただしasync-traitのクレートを使うと行けるようです。
- trait内のasync関数ではSendではなくSyncの実装が必要っぽい?試行錯誤していたらSyncが足りないみたいなエラーが出たりしてまいました。
- async fn で定義した関数で再起呼び出しすると、BoxFutureを戻り値にとか言われて混乱したので最終的に通常の関数内にasync blockを作ってblock_onメソッドで実行するようにした(本末転倒気味)
- 上記のような関数に対して、Fn(a: &str) -> bool みたいな関数をフィルタとして引数として取ろうとしたら、スレッドセーフじゃないからダメだぜ!って言われて途方に暮れる。
きっとネイティブで動く故の制限だったりするのだろうか。特にスレッドセーフにならないような状況が推測できるときにコンパイルエラーになるようです。
きっと回避策はあるのでしょうが、どうすりゃいいの!?!?ってなっていまして(;´∀`)
impl Hoge { fn search_dirs(&mut self, dir: PathBuf, func: Boxbool>) -> Result<Vec > { let mut result:Vec = Vec::new(); let result_task:BoxFuture<Result<Vec >> = async move { let mut dir = fs::read_dir(dir).await?; while let Some(entry) = dir.next().await { let entry = entry?; let file_type = entry.file_type().await?; if file_type.is_dir() { // ディレクトリの場合は再起で深堀していきます let r = self.search_dirs(entry.path(), func)?; result = result.into_iter().chain(r.into_iter()).collect(); } else { if func(&entry.path()) { result.push(entry.path()); } } } Ok(result) }.boxed(); async_std::task::block_on(result_task) } }
例えばこんな感じに作ってたら、
`dyn for<'r> std::ops::Fn(&'r async_std::path::pathbuf::PathBuf) -> bool` cannot be sent between threads safely
とか言われちゃいましてね。
まだまだ勉強不足を痛感するところです(´・ω・`)
C#だと結構この辺意識せずすいすい使えたので、シンドイといか結構新鮮というかw
メモ書きなんでこの辺で。。。
自転車のスマホマウントのお話(レックマウント+)
先日購入したiPhone SEですが自転車に乗って走るときにスマホマウントに取り付けて走っています。
今までトピーク(TOPEAK)のライドケースマウント(RideCase Mount)、クアッドロック(QUAD LOCK)を使っていて、今回はレックマウントプラス(REC MOUNT PLUS)を使ってみることにしました。
購入動機
今までライドケースマウントとQUAD LOCKを使っていて、まぁ何か良いのがあればいいなぁと思ったこと、ハンドルバーの前方にスマホを取り付けたいと思ったということもあり調べていたら、このレックマウントプラスに行きつきました
今回はケースとマウンタ、そしてオプションのリング、アクションカメラを取り付けるアダプタを買っています。
使ってみて
まずスマホケースですが、背面に固定用コネクタ?がある以外はいわゆる普通のケースだと思います。
このケース、いやゆるTPU系のぐにゃぐにゃ出来る感じではないのですが、どちらかというと硬いほうのケースです。その割につけ外ししやすかったのでお値段考えると結構よかったなと思っています。
固定用コネクタにはスマホリングが取り付けられるようになっていて、普通に指と通してつかったり、スマホを立てて動画を見るのに使ったりできます。
あと、マウントと接続して使っているとき、万が一外れても飛んでいかないようにストラップがつけられるようになっています。付属のストラップを使って、マウンタとつなげておくと保険になる形です。
マウント側ですが、自転車につけるとこのような形になります。
ただし今回はフロントバックとの兼ね合いで平行に伸ばすように取り付けはせず、斜め上方向に取り付けています。
こうすることで下部にスペースを作りアクションカメラを取り付け出来るようにしました。
なお、スマホの取り付け自体は上から押して回すといった形になります。外すときはレバーを押して回すと外せます。
レバーがスマホからちょっとだけはみ出すので片手で簡単に取り外せます。
付属品として、レバーの色違いがいっぱいついてきました。ぶっちゃけ、個人的には黒だけで十分です(笑)
固定力は十分でどんなところ走っても外れる気配はありませんでした。
他のマウントとの比較
ライドケースマウント
一番の違いは取り付け方法にあると思います。回して取り付けるのではなくスライドして取り付けます。
こちらの取り付け方法でも問題はないのですが、個人的にダメなのがケースのスタンド機能です。
このスタンド機能で立てようとしてもすぐ倒れてしまって個人的には全く使い物になりませんでした。また私が調べた限りですが、iPhone SE用のケースでは無接点充電が使えるケースはないようです。そのため無接点充電は諦める必要があります。
マウント部分については水平に取り付けるマウントも別商品として存在します。
topeak.jpこれはこれでよい製品なのですが、取り付け角度が水平固定になります。そのため今回のよう取り付けをしてフロントバッグと共存、といった使い方は出来ません。
QUAD LOCK
使い勝手とか丸被りなのがコレ。
ぐるっと回して取り付け、レバー(ないマウントは下へスライド)で取り外し。
ケースとマウントのセット製品がレバーによる取り外しができません_| ̄|○
これはツライ。
www.quadlockjapan.comオプションのこちらを購入するとレバー付きになりますが、ケースもあせると結構なご予算(´・ω・`)
そんなわけで価格的にはレックマウント+のほうが良いように思います。
ただカッコイイのはこちらかなと思ったり。
まとめ
結論から言うと、レックマウントプラスで大満足してます。
理由としては
- QUAD LOCKより安くて必要なものをそろえやすい
- トピークのケースがイケてなくて、レックマウントのほうが良い
- レックマウントだと取り付けに調整幅がデカイのでつけやすい
といったところです。
色々なオプションパーツもあるので満足しています。