あれやこれやと

自転車、プログラミング、登山など思いついたままに書いていこうと思っています

RustのTraitとかの話

底辺プログラマです(´・ω・`)

たまに趣味でプログラムしてます。
そして最近Rust始めました。

Rust難しいですよね。ライフタイムやらなにやらで、関数から&strで返そうとして発狂したり、Structの中にStructなメンバを作ったらサイズがわからねーから無理やで、みたいな事言われたり。

 

そんな中で、ふと困ったのがJavaとかででインターフェース(Interface)があって、複数実装してふるまい(動作)を分けるとかあるじゃないですか。

あれ、どうしたらいいんだ。ああそうだTraitだ。

 

と思ったのですが実現まで四苦八苦したのでメモ書きとして残します。

 

ゴール

こんな感じにして実行すると

fn main() {
    
    let mut ppp = Hoge::new(|| Fuga::new());
    ppp.display();
    ppp.display();
    ppp.display();
    ppp.display();
    ppp.display();
    ppp.display();

    let mut ppp = Hoge::new(|| Huga {});
    ppp.display();
}


こんな感じに出力される

Fuga One 1
Fuga One 2
Fuga One 3
Fuga One 4
Fuga One 5
Fuga One 6
Huga One

みたいな。
この↑のケースだとFugaとHugaが同じトレイトを実装しているイメージです。

 Fugaでは内部にカウント持ち、カウントアップして出力、Hugaは単純に同じものを出力するという実装のつもりです。

 

Fuga&Huga

 こちらはトレイトHageを持つようにします。

trait Hage {
    fn one(&mut self);
}

 そして実装は最小限で

struct Fuga {
    cnt: i32,
}

impl Fuga {
    fn new() -> Self {
        Self { cnt: 0 }
    }
}

impl Hage for Fuga {
    fn one(&mut self) {
        self.cnt += 1;
        println!("Fuga One {}", self.cnt);
    }
}

struct Huga ;

impl Hage for Huga {
    fn one(&mut self) {
        println!("Huga One");
    }
}    

としました。あとはHogeの実装です。実をいうと一番困ったのはこちらでした。

 

Hoge

こちらは色々とコンパイルエラーが出たりして、初心者にはとてもつらかったです(ノД`)・゜・。

最終的にBoxを使うことで解決しました。

struct Hoge<'a> {
    hage_t: Box,
}

impl<'a> Hoge<'a> {
    fn new<T, Z>(xxx: T) -> Self
    where
        Z: Hage + 'a,
        T: FnOnce() -> Z,
    {
        Self {
            hage_t: Box::new(xxx()),
        }
    }

    fn display(&mut self) {
        self.hage_t.one();
    }
}

 んでもって

正直初心者でよくわからないまま作成しているのでもっとよい実装があるかもしれません。

なぜこういうものを作ろうかと思ったかというと、プログラムを部分的にMockに置き換えテストしたりしたいと思ったためです。

私自身、もう一度同じのを一から作れる気がしないのでこのブログでメモ書きとして残しました。そのため命名がひどいのは許してください_| ̄|○

Pixel3 から iPhone SE (2020)に買い替えました

f:id:upopo21:20200426143128j:plain

iPhone SE 2020箱

 

やっとTouch ID付きの最新iPhoneが出ました(*´▽`*)
Pixel 3 を購入した理由がiPhone の Touch ID離れでしたので非常にうれしいです。

 

 

買った理由

今回Pixel3からの買い替えです。
その前はiPhone 7 Plusを使っていました。Pixel3が発売した時、Google製のAndroid端末を使いたかったので購入しました。

加えてiPhone X指紋認証がなくなったのも大きな理由です。

iPad mini も使用しているので相互運用の面から、iPhoneに戻りたいなとは思っていました。しかし、iPhone 11も残念ながらFace IDのみで。

そして発売された新しいiPhone SE
iPhone 8と同じ形状でTouch ID付きだということで速攻購入致しました(*´▽`*)

使ってみた端末の感想

Pixel3からの移行なので主に比較対象はPixel3になるかと思います。

カメラ

f:id:upopo21:20200426193032j:plain
f:id:upopo21:20200426193024j:plain
f:id:upopo21:20200426193021j:plain

正直なところ困っている点はほとんどないですがやっぱり基本性能はiPhone8時代なのかなという感じがあります。

 

個人的な感覚で自信はあまりないのですが、遠方の物体のディティールの表現がちょっと弱めに感じます。Pixel3の時はもう少しよかったようなイメージが。

Pixel3と同様にシングルカメラなのでズームはデジタルズームのみで弱いです。
2倍ぐらいのレンズがあると助かるなぁと感じています。

 

ポートレート撮影機能があります。ただし人物のみ対応です。Pixel3の場合はどんな物体でもOKでしたのでそこは結構違うなと感じています。
なんせ人にカメラ向けることが少ないので・・・。

 

夜間撮影機能もありません。夜、フラッシュを炊かないでとりたいというシチュエーションは非常にツライかなと思います。

私の撮影用途では夜間撮影と2倍ズームがあると嬉しいのですが、そこはコンデジでも買おうかなぁと思っています。

ディスプレイ

iPhone8は液晶でPxel3は有機ELディスプレイとなっています。
ただ正直なところ液晶だから発色が・・・みたいな気持ちにはなっていません。

 

ただTrue Toneディスプレイのせいだと思うのですが、Pixel3と比較して色温度低いなぁと最初思いました。ただ環境によって変わって来るので問題はないかと思います。
(気にになる人はTrue Toneディスプレイを切ればよいと思います)

 

解像度に関しても基本は気にならないものの、一部のゲームで解像度の粗さが気になる結果になりました。
具体的に言うと、アイドルマスター ミリオンシアター(ミリシタ)でカメラが引いたときのキャラの表現が悪くなります。ドット数が低いのでディティールが崩れてしまいます。

この辺はPixel3ぐらいの解像度があると違うのですが・・・。

それ以外の使用においては全然問題は感じませんでした。ppiが300を超えてるので文字見る用途では十分ではないかなとおもっています。

電池の持ち

電池の持ちは悪いです。
Pixel3も悪いですが、使っているときの消耗速度はそれよりも速いイメージです。
ただ使っていない時の電池の消耗は非常に低いのはiPhoneならではかなと思っています。

運用としては細かく充電をして、常に100%を保つようにしようかと。電池がへたって来たらApple Care使って電池交換する方向がいいのかなと思っています。

 

Android から移行で困った事

Pixel3に限らずAndroidからiPhoneに移行で手間取ったのでその辺ついて書いていきたいと思います。

電子マネー

電子マネー関連は手続きが個別にあって結構手間がかかりました。
 SuicaモバイルSuicaアプリを使い事前に移行手続きが必要でしたし、Quick Payとして利用してるMIzuhoのSmart Debitはクソめんどくさい登録を一からやり直しに。

 

以前iPhone 7Plusで使えていたDカードのIDでですが、いつの間にかSPモードの認証が必要なっていて、MVNOの私は使えなくなっていました。
IDのため契約していたのでこれはもう解約するしかないですね。。。

AlterLock

AlterLockは自転車盗難防止用のアイテムです。

こちらは端末を変える際には一旦デバイスの強制解除が必要です。そして再登録にはAlterLockの説明書にある認証コードが必要に。。。

人によってはうっかりしててしまいそうなので注意が必要です。

ハイキングに使ったりする地図アプリ

そもそも地図ロイドというアプリでログを取っていたのですが、同じアプリはないので別のを使う必要がありました。

以前iPhone 7 PlusではFiledAccess 2というアプリでログを取っていたのですが現在AppStoreにはなくなっていたので代替アプリを探しています( ;∀;)

 

終わりに

このiPhone SE (2020)は最新機種ではありますが、最上位機種ではありません。
どちらかというと普及価格帯のスマートフォンです。

今回一世代前の上位機種Pixel3からの移行のため、やはりいくつかの点では割り切って使う必要があるかと思いました。

それと11Pro MAXとかですと、私が使用しているiPad mini 5と使用用途が被るのでこのサイズがちょうどいいというのもあります。

個人的には5インチ前後の端末が一番手になじむため長く使っていけたらいいなと思います。

 

ブログはじめて見ようかと思いました

元々はぽつりぽつりとQiitaやQrunchにプログラミング的なことを書いていたのですが、いくつか思うところがあってブログをはじめようと思うことにしました。

 

そもそもQiitaでQrunchを続けなかった理由ですが

Qrunchに移行するつもりだったのですが、トレンド見ても毎日変わらない状況やアクセス解析がおかしくなる日があったので、あんまり運営に手を掛けていないように思いました。

 

そういった理由から新たにブログを書くのもよいかなと思い立ち上げました。

まだ何もないですが見に来て頂いたすべての方に感謝いたします(*´▽`*)

 

私はそんな技術力もないですし、自分のメモ用途的な底辺技術記事、あと自己満足な自転車の話や、ハイキングの話、商品の購入のレビューとかを書いていくことなるかと思っています。

 

長く続けられればいいなーと。