栃木旅行:グランピング、那須ハイランドパーク、ホテルエピナール那須

9月15日から2泊3日で栃木に家族旅行を行ってまいりました。

もうかなり気温は下がってますが、遅めの夏休みです。

せっかくブログもやっているので、思い出として記録しておきます。

栃木旅行

1日目:宇都宮、レイワゴルフリゾート グランピング&ヴィラ

東京から高速で宇都宮へ。 途中、羽生PAと佐野SAによってショッピング。

これから宇都宮で餃子食べるのに、羽生PAの『ずんだ茶寮』のスイーツが美味しくて、ぺろっと平らげてしまいました。

www.driveplaza.com

宇都宮に着いて、とりあえず餃子を食べたかったので、駅ナカにある『宇都宮餃子館』でランチ。 健太餃子、お肉餃子、佐野ラーメンを頂きました。

宇都宮餃子館のラーメン

www.gyozakan.jp

そこから1日目のお宿のレイワゴルフリゾート グランピング&ヴィラへ。

travel.rakuten.co.jp

ゴルフ場にポツンと1軒だけグランピング施設があります。

レイワゴルフリゾート グランピング&ヴィラ

レイワゴルフリゾート グランピング&ヴィラ 内

夜はここのBBQを頂きましたが、想像以上のおいしさ! お肉はとろける、エビはプリっぷり、アヒージョはぐつぐつ、カレーは言うまでもない。

グランピングでBBQ 食材

グランピングでBBQ

2日目:那須ハイランドパーク、ホテルエピナール那須

レイワゴルフリゾート グランピング&ヴィラで朝食バイキングを頂き、那須ハイランドパークへ。

那須ハイランドパーク

www.nasuhai.co.jp

レジャパスを利用して入場料は無料だったのですが、アトラクションの乗り放題チケットが大人4,000円、子供3,100円かかります。 もちろん都度お金を払ってもいいのですが、ティーカップとかでも500円ぐらいかかりますので、乗り放題チケットを買ったほうが良いと思います。

今回は、大人2人、子供1人の乗り放題チケット計12,100円で、以下のアトラクションを楽しむことができました。 都度で支払っていたら、合計30,500円かかっていたので、かなり乗り放題チケットはお得です。

  1. ティーカップ3回
  2. ルーセル3回
  3. ウェーブスインガーNEO
  4. カイバルーン2回
  5. スカイサイクル2回
  6. 立体迷路2周
  7. 大観覧車
  8. うんこミュージアム
  9. ウービーのトレジャーハンティング2回
  10. ウォーターパレード2回
  11. ハローキティ&フレンズ ホップンスマイル
  12. リバーアドベンチャー

予定よりだいぶ遅れてしまいましたが、そのあとはホテルエピナール那須へ。

www.epinard.jp

ここがまた素晴らしい。今回たまたまクラブ会員限定のツインルームの部屋が空いていたため、ホテルの方がそちらを手配してくださりました。

ホテルエピナール那須 ツインルーム

窓からの景色も絶景で、那須連山を見渡すことができます。

ホテルエピナール那須からの景色

ディナーまで時間があったので、ホテルの外にある芝生で花火をしました。 娘にとっては初めての花火なので、少し怖がってました。花火より煙が怖いそう。

ディナーは、ホテル内のビュッフェで食べましたが、ここも素晴らしく、子供用のバイキングエリアがあります。 これには子供も大喜びで、好き勝手にプレートに食事をよそっていました。

3日目:帰路

ホテルで体験工房があり、天然石を利用したブレスレットを、娘が一生懸命作りました。

天然石ブレスレット

こういう体験ができるの、子供にとって貴重で良いですね。

まだ時間があったので、ホテル内のプールで遊びます。これから運転だけど体力持つかな?って心配になりましたが、とりあえず全力でプールで遊びました。

案の定、娘は車で爆睡。私はコーヒー飲みまくって、目をバッキバキにして、安全運転で東京に帰りました。

振り返って

3歳の娘は、以前と比べて色々積極的に挑戦しようとするので、今回は親も結構楽しむことができました。 グランピングやBBQとか娘は楽しめるか心配でしたが、割と探検とか楽しんでいて、子供の好奇心さが出てきたなって感じました。

ホテルエピナール那須が、もっとアクティビティができそうだったので、もう1度行ってほかにも色々やってみようかと思います。

レソト(Lesotho)の喪で髪を切る文化

DMM英会話で、久しぶりにレソトの女性の講師の方のレッスンを受講出来たとき、髪の毛をバッサリ切られていてました。

どうやら追悼として髪を切るレソトの文化らしいのですが、全くなじみがない文化でしたので、自分なりに調べてみました。

Lesotho

そもそもレソトは、イギリスから1966年に独立した、南アフリカの世界最南の内陸国です。

レソトというの言葉は、「ソト語を話す人たち」という意味です。

なのでソト族という民族が多くおり、今回出会った髪を切る文化も、ソト族の文化になります。

ソト族の追悼文化

人が亡くなると、遺族に対してもたらされる、人の死による汚染を浄化するために、go tloša setšhilaと呼ばれる儀式が行われます。 つまり遺族は、「不運」「災難」をもたらすと考えられ、それを浄化するんですね。

その儀式の最中は、遺族が身につけなければ衣類やアームバンドやお守りなどがあります。 このお守りは、親を亡くした末っ子が身に着けるのですが、日中眠くなるのを防いでくれるそうです。 親を亡くすと、日中座ってても歩いてても、眠くなると信じられているためです。(興味深い話ですね) これらの衣類やアームバンドやお守りには、喪に服す前に伝統的な薬を振りかけます。

追悼期間中は、makgomaと呼ばれる病気に関連する不純物や不運を運ぶとされているため、様々な行動が禁じられます。 例えば公の催し事で料理をしたり、教会に行ったり、散歩すら許可されません。 あと未亡人と男やもめは、一定期間コミュニティとの交流や、性行為が禁止されます。 また家族全員髪の毛を切り、故人の衣類を家族内で共有します。

子供がまだ小さい近所の人たちは、遺族を呼んで、子供たちにお水を飲ませます。 このとき、大きな盃の水を最初に飲むのは遺族で、そのあと、盃を渡して同じ水を飲ませます。 これは遺族に会ったとき、災難に見舞われないようにするためです。

そして追悼期間(数か月~1年)が終わると、日常の生活に戻ることができます。

ただどこまで厳格にやるかは、周囲によって違うようです。今回の講師の方の場合、外出などは普通にできたそうです。

調べてみて

レソトの講師の方は、悲しみにあふれた追悼期間を終え、数か月ぶりにオンライン英会話に戻ってきてくださいました。

その方に教えていただかなければ、このような文化を知ることはなかったので、こういうところは英語の本当にいいところだなって思いました。

RustのOwnershipについて読んでみた

Rustのownershipの考えは特徴的なので、慣れないと今後「あれ??」ってなりそう。 後で振り返られるように軽くまとめておきます。

doc.rust-lang.org

Ownershipとは

日本語で所有権を意味するこの言葉は、その文字通り、ある値に対する「所有権」を表している。

このOwnershipには、以下の3つのルールがある。

  • Each value in Rust has an owner.
    • Rustの各値には、所有者がいる
  • There can only be one owner at a time.
    • 一度になれる所有者は、たった1つ
  • When the owner goes out of scope, the value will be dropped.
    • 所有者がスコープから外れたら、もれなく値も消える

各ルールを細かく見ていく。

Each value in Rust has an owner.

以下のコードで、ヒープ領域に格納された”hello”の所有者は、s1になる。

let s1 = String::from("hello");

ownerを持つ

There can only be one owner at a time.

ここがミソで、例えば以下のコードはコンパイルエラーとなる。

なぜならString型の hello の所有権を、s1とs2の両方が保持することができないからである。

let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1); // s1にはもう所有権はない

最終的な所有権はs1からs2に移っている。(=move)

s1からs2にownershipがmoveしている

When the owner goes out of scope, the value will be dropped.

所有者がスコープから外れれば、もれなく値も消えます。

これはRustが安全と言われる理由の1つだと思います。

{
    let s = String::from("hello");
}
println!("{}, world!", s); // sはスコープから外れているので、データもろとも破棄されている

Reference

Ownershipは、メモリを安全・効率的に利用するのに非常に有効です。

ですが、以下のように、関数やメソッドを利用する場合、毎度所有権を返さないとなりません。

fn main() {
    let s1 = String::from("hello");
    let (s2, ok) = is_valid(s1); // s1を所有権ごと渡しているので、s1はここで無効になる
    println!("{} is {}.", s2, ok);
}

fn is_valid(s: String) -> (String, bool) { 
    let ok = s.len() > 0;
    (s, ok) // boolだけ返したいのに、Stringの所有権も返さないと、呼び出し側で使えない
}

このような場合、毎回所有権を動かすのではなく、ヒープ領域に格納されているデータのアドレスをReference(参照)することで、所有権を動かすことなく、データを利用することができます。

これの仕組みをBorrowと呼びます。

fn main() {
    let s1 = String::from("hello");
    let ok = is_valid(&s1); // s1の所有権は渡さず、参照だけ渡している
    println!("{} is {}.", s1, ok);
}

fn is_valid(s: &String) -> bool { 
    s.len() > 0
}

デフォルトだと、ReferenceもImmutableですが、MutableなReferenceをBorrowすることもできます。

これにより、Referenceを通じて値を変更することができます。

let mut s1 = String::from("hello");
let r1 = &mut s1;
r1.push_str(", world");
println!("{}", r1);

ただこのReferenceにも、ルールがあります。

  • At any given time, you can have either one mutable reference or any number of immutable references.
    • いかなる時も、1つのmutableなreference、または任意の数のimmutableなreferenceのどちらかしか持てない
  • References must always be valid.
    • referenceは常に正しくなければならない。

ここでも各ルールについてみてみましょう。

At any given time, you can have either one mutable reference or any number of immutable references.

つまりReferenceに関しては、以下の2パターンのどちらかしか、許容されていません。

  1. たった1つのMutableなReference
  2. 任意の数のImmutableなReference
let mut s1 = String::from("hello");
let r1_1 = &s1;
let r1_2 = &s1; // OK
println!("{}, {}", r1_1, r1_2);

let mut s2 = String::from("hello");
let r2_1 = &s2;
let r2_2 = &mut s2; // 同時にmutableとimmutableなreferenceは不可
println!("{}, {}", r2_1, r2_2);

let mut s3 = String::from("hello");
let r3_1 = &mut s3;
let r3_2 = &mut s3; // 複数のmutableなreferenceは不可
println!("{}, {}", r3_1, r3_2);

MutableなReference先にあるのデータと、同じものを指すReferenceがあるとします。

もしReferenceに変更が生じてしまったら、他のReferenceにも同期する必要があります。

これは非常に悩まされる問題で、下手をすると、もう有効ではない参照先をずっと保持している事態にもなりかねません。(=Dangling References)

Rustではこれを安全に解決するために、上記ルールを設けられています。

References must always be valid.

参照は常に有効でなければなりません。

参照が無効になる場合、コンパイル時に検知されるので、Rustは安全な仕組みになっています。

fn dangle() -> &String { // 最終的に参照が無効になるため、コンパイルエラー
    let s = String::from("hello");
    &s // Stringの参照を返している
} // sがスコープから外れ、メモリーが開放されてしまう

最後に

本当にRustはよくできているな、と感心させられました。

絶対にOwnershipは、Rust初心者の私は躓くと思うので、何度でも初心に帰ろうと思います。

『エンジニアリング組織論への招待』を読んで

エンジニアリングについての知識をつけたくて調べたら、『エンジニアリング組織論への招待』が評判良かったので、早速購入して読んでみました。 www.amazon.co.jp

自分なりにネタバレしすぎない程度に、ログとしてまとめておきます。

どんな人におすすめか

  • エンジニアリングに悩むPM
  • 適切に自発的に動けるエンジニアを育て上げたい人
  • チームビルディングに悩むマネージャ
  • エンジニアとの軋轢に悩む経営者

どんな本か

不安材料を放置していたがために、いつまでたってもリリース予定時期が定まらない。 依頼主を意図をくみ取り切れずに開発していたため、依頼主の期待外れのシステムが出来上がる。

このように、エンジニアリングには、様々な障害が引き起こされます。 その主たる原因は「不確実性」です。

不確実性には、「未来」に対する不確実性と、「他人」に対する不確実性があります。 未来にどうなっているかわからない。 他人に伝えたい情報が伝わっているか、またそれに伴う行動が期待通りなのかわからない。 この状態の解消を後回しにすると、エンジニアリングに取り返しのつかない事態を起こしかねないです。

思考、メンタリング、チーム、組織レベルで、どのように「不確実性」に対して対応していけばいいか。 これについて、課題の確認、根本の原因、対策、実例を交えながら、論理的に解説されています。

感想

良かったところ

  • 体系的に「不確実性」の対策について、学ぶことができた
  • 営業や企画との調整で、悩んでいたので、タイムリーで実践できそう
  • チームメンバーの成長に貢献できそうな内容があり、こちらも実践ができそう
  • 適度に例え話が含まれていて、より理解を深めることができた

気になったところ

  • アジャイルを把握していることが前提に感じられたので、全くの無知だとつまづく(特に3章)
  • 解説の順序が、個人の思考から始まり、チームについて、会社全体となるので、後半はもっとキャリアを積んでからの方が、理解が進むかなと思った
  • 理論の元となる記述があまりなかった

Rustを学び始める

今週からRustを紐解き始めたので、経緯やRustについてまとめておきます。 Rustの学習は、こちらを参考にしています。

doc.rust-lang.org

なぜRustを学ぼうと思ったのか

低レイヤーを学びなおしたかった

Java, C#, Python, Go とやってきた自分は、CPUやメモリやリソースなど、言語側の手厚いサポートされることに慣れていました。 ただ低レイヤー層をしっかり意識するのと、しないのとでは、プログラムの内部の挙動の理解度が全然違います。

小手先で動くものを簡単に作ることはできますが、もっと根本的なところから「それはメモリを圧迫していないか」「CPUを無駄に酷使して、無駄に高いインスタンスを使うことになってないか」といった低レイヤーからの視点も身に着けていきたいところです。

そういった意味でも、しっかり低レイヤーを学ぶことは、意義あることだと思いました。

今学ぶならC,C++よりRust

過保護な環境でプログラミングしていた僕としては、今からC,C++を泥臭く学ぶのは、レガシーに感じてしまい抵抗がありました。 話題性、安全性がありつつ、低レイヤーを学ぶのにRustは適しているのではないかと思います。

高評価の割合が多そう

stackoverflowの2021年のレポートですが、最も愛されている割合が多いのが、Rustでした。 insights.stackoverflow.com

何がそんなに愛されているのかが、気になっていました。

まだRustaceansになったばかりですが、Rustについて歴史と導入事例だけ簡潔にまとめておきます。

Rustとは

歴史

2006年 Graydon Hoareの個人プロジェクトとして開発が始まる。 Graydon Hoareさんが趣味で始めたものらしく、Swiftの開発にも関わっていた方です。

2009年 Mozillaの公式プロジェクトになる。 Graydon Hoareさんの所属していたMozillaが、2009年からRustにかかわり始め、2010年にプロジェクトとして公表しました。

2012年 0.1版リリースされる。 いわゆるプレアルファです。安定板リリースに至るまで、多くの仕様変更が行われました。

2015年 1.0版リリースされる。 正式リリースです。そこから6週間ごとに定期リリースが行われているみたいです。

Rust (プログラミング言語) - Wikipedia

導入事例

終わりに

Rustについてまだスタートラインについたばかりですが、背景や実例をリサーチすると、Rustを学ぶ意義が感じられました。 今後もちょこちょこRustに関する投稿をしていきたいと思います。