2020年6月1日月曜日

Rustを学ぶ(1) : Rustの環境構築

はじめに


Rust langに入門します。
モチベーションは次の2つです。
  • 新しいプログラミング言語パラダイム(所有権やライフタイムなど)を学びたい。
  • システムプログラミングとして低レイヤを学びたい。

環境


Mac miniを使います。RustはMacをサポートしています。
  • CPU: 6コア Intel Core i7
  • メインメモリ: 16GB
  • シェル: zsh
%はプロンプトを示し、<code>ぽいところは実際の画面出力やコードです。

Installation


公式にあるrustupを使います。TerminalやiTermなどからcurlを実行します。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

curlを実行すると3つのツールがインストールされます。
  • rustc
    • Rustのソースコードをコンパイルします。
  • cargo
    • ビルドシステムとパッケージマネージャの役割をします。一番よく使います。
  • rustup
    • Rustのバージョンアップや異なるリリースチャネルからのインストールやクロスコンパイル(異なる機種へのコンパイル)をします。
途中で次の選択肢が出ます。初心者のためデフォルトの1を選択します。
やりたいことが他にあれば考える項目だと思います。

Current installation options:
    
    
       default host triple: x86_64-apple-darwin
         default toolchain: stable
                   profile: default
      modify PATH variable: yes
    
    1) Proceed with installation (default)
    2) Customize installation
    3) Cancel installation
    >1

ここでシェルを読み込み直す(. ~/.zshrc)かTerminalを閉じると、rustcなどのツールが使えるようになります。

% rustc --version
    rustc 1.43.1 (8d69840ab 2020-05-04)

今回インストールされたのは1.43.1のようです。
ちなみにRustにはstableとnightlyとbetaのチャネルがあります。基本は安定しているstableか、新実装の入ったnightlyで良いと思います。僕はstableにしています。

コンパイルと実行


Rustを任意の場所で動かします。僕はRustを書くときにVS Codeを使いたいと思いますので、事前にVS CodeのRust Extensionを入れています。

% mkdir rust_projects
   workspace % cd rust_projects
   rust_projects % mkdir hello_world
   rust_projects % cd hello_world
   hello_world % code .

コードは次の通りです。記念すべき最初の1歩、"Hello, World"です。

fn main() {
      println!("Hello, world!");
}

コンパイルして実行します。rustcを使います。

hello_world % rustc main.rs
hello_world % ./main
Hello, world!

出ました!
ところで、rustcではなくcargoを使うともっと簡単に実行できます。

プロジェクトの作成


せっかくcargoを使うのでプロジェクトから作ってみます。先の場所とは違う任意の場所に移動します。

% cargo new sample --bin
Created binary (application) `sample` package
% cd sample
% ls
Cargo.toml src

Cargo.tomlはビルドの設定ファイルです。その中身はgitに設定された内容が入っています。次のようになっているはずです。yournameとmailは個別に置き換えてください。

   [package]
   
   name = "sample"
   version = "0.0.1"
   authors = [ "yourname <mail@example.com>" ]

src/main.rsには先ほど手で作った"Hello, World"と同じ内容が書かれているはずです。では実行します。

% cargo run
       Finished dev [unoptimized + debuginfo] target(s) in 0.00s
        Running `target/debug/sample`
Hello, world!

出ました!
cargo runでコンパイルと実行をセットでやってくれます。
コンパイルだけしたいときはcargo buildでできます。
リリースビルドをしたいときはcargo build --releaseです。

ちなみに、次の2つは等価です。
  • cargo new sample --bin
  • cargo new sample
ライブラリを作る場合はcargo new sample --libにします。

おわりに


Rustの環境構築をしました。ほとんどの場合はRustがサポートされているため環境構築は難しくないと思います。次回はRustでサーバーを作りたいと思います。


参考

2020年5月30日土曜日

あつ森で集めたカブ価をグラフに出してくれるしずえさんbot

しずえさんbotは、遊び友達のグループLINEでつかっているLINE botです。
元々、はれんちさんが作ったbotに下の画像のようにグラフ出力機能を追加しました。

グラフを返してくれるしずえさん

しずえさんbotの仕組み


GASを利用したLINE bot

  1. LINEメンバーにカブ価を午前・午後で入力してもらう。
  2. 「あきおの今週のカブ価」や「今日のカブ価」をLINEに投げる。
  3. LINE botがメッセージをGASに送る。
  4. GASで処理できる定型文であればスクリプトを起動する。
  5. スクリプトの結果がLINEに返ってくる。
どうやってGASでLINE botを実装するのかについては詳しく知らないので、はれんちさんのブログを待ちたいと思います(期待)。

今日のカブ価がわかる


実装したグラフ出力機能


集計しているデータ形式は次のような形です。



コードはこちらです。実行する場合はGASにMomentライブラリを追加してください。

わからないところがあれば、コメントで質問していただけたらと思います。

ただちょっと懸念があります。
  • 出力速度が遅い(大体4秒くらい)
  • 所定のフォルダにグラフが溜まっていく

SheetのAPIを叩く回数が減れば出力速度も小さくなると思います。
上のコードを使った際は改善してみてください。

参考

2020年5月27日水曜日

週末にチョットツヨイPC自作した

ゲームと配信がしたくてPCを自作しました。
Twitterの低レイヤ界隈の人たちみたいに「CPUから作る」のではなく、普通にパーツを買ってます。

記念撮影

パーツは
  • CPU
    • AMD Ryzen 7 3700X
  • GPU
    • MSI GeForce RTX 2060 AERO ITX
  • メモリ
    • Team DDR4 3200Mhz(PC4-25600) 16GBx2枚(32GBkit)
  • M2ストレージ
    • WD SSD 500GB M.2-2280 NVMe
  • HDD
    • WD HDD 1TB WD Black
  • その他
    • MSI B450 GAMING PLUS MAX ATX マザーボード
    • Thermaltake Versa H26 Black ミドルタワー型PCケース
    • I-O DATA WiFi 無線LAN 子機 11ac 1300Mbps
    • Windows 10 Home 日本語版/May 2019 Update適用/パッケージ版

こだわりはRTX20シリーズとRyzenを使うことでした。
友達からM2は載せた方がいいと強く推されたので使ってます。(めちゃくちゃよかった!)
他は基本的にARTJUKUさんの予算別自作PC構成を参考にしています。
全部で15万円くらいです。他のBTOと比べて2~3万は安かったです。
給付金もあるし。

マザボの組み立ては絶縁プラを下敷きにするらしい
CPUクーラーの向きは一度ミスりました。要注意です。
光ってる!!!!
組み立てた感想

「OSの立ち上がりが早い!!!(M2のおかげ)」
「光ってる!!(重要)」
「ケースにもっと気を貼ってもいいな!(電源からの配線が難しかった)」
「BTOに2~3万追加してもいいな!(組み立てに半日かかった)」

ただ、普段使っている機器がどういう繋がりで動いているのかがわかるので、一度は経験しておいてもいいですね。
あと、組み立てる前にめちゃくちゃパーツの情報を調べるので、そこが勉強になりました。

参考まで。

2020年2月11日火曜日

CodeLab: Cloud Functions for Firebaseを終えた

先週にひきつづきFirebaseのCodeLabをやってました。
今週はCloud Functionsです。

Congratulations!
ちょっと詰まったところがあって、

Google Cloud Platform のCloud Vision APIとの連携

僕の中では、GCPのAPIはJSONキーを送りつけて認可されるイメージでした。
(たとえばcurlするときにjsonをつける)

しかしCodeLab中には何も書いてなくて、いろいろ探し回ったのですが情報はなく。
結局、とりあえずCodeLabの通りデプロイすることに。

で、例にあるゾンビイメージを投稿するわけですが、うまくブラー画像(ぼやけた画像)になりません。

Firebaseのコンソールを見ると、
PERMISSION_DENIED: This API method requires billing to be enabled. Please enable billing on project #hogehogehoge by visiting https://console.developers.google.com/billing/enable?project=hogehogehoge then retry. If you enabled billing for this project recently, wait a few minutes for the action to propagate to our systems and retry.
なるほど。JSONキーを置く必要はなく、請求先を登録する必要があったのか。
(ちなみに他にも「APIを許可しろ」とかエラーが出てた)

APIを許可して請求先も作った結果、
優雅なお食事シーン(見せられないよ!)

ブラーになりました。
というわけで、先回りしてプロジェクトに関係するAPIを作っとけばいいと。
GCPのAPIはGoogleのサービスないであればキーはいらないのかもしれないと思いました。

2020年2月3日月曜日

Firebase Web CodeLabを一通り終えた

タイトル通りです。


CodeLabはよくできていて、
  • Cloud Strage
  • Cloud Database
  • Cloud Hosting
を全て学べ、とりあえず動かすことができます。

できたのがこちら。



localhostで動かしていますが、Hosting機能を使ってdeployもしました。

「Cloud Functionsを学びたかったなー」とか思っていたんですが、この続きでCloud Functionsも学べるっぽい。


もうGoogleには勝てないんじゃないかな。


デメリットは全部英語。これは英語も学習できると思った方がいいんじゃないかと。
日本語にしてくれている方がいるので、英語が苦手な人はこちらも見ると良いと思います。

2019年12月25日水曜日

転職と振り返り

これは琉大 Advent Calendar 2019 23日目の記事です。

前回はこちら
次回はこちら

まとまりはないのですが、その時は質問していただけたらと思います。

転職しました


新卒で入った会社は1年半でやめる形になりました。
その会社は全国・世界にも支社のある10万人規模のいわゆるSIerでした。
そこでは会社としても珍しいモバイルアプリを開発していました。
Mac Book Proもありましたし、プロキシのないインターネットにも繋がれました。

辞めた理由


やめたのは様々な理由がありますが、最も大きい理由は
「自分自身が思い描くキャリアがこの会社では歩めない」
と思ったからです。

「あれ?じゃあなんでその会社に入ったの?」と思うかもしれません。
僕もそう思いますし、最初からキャリアを思い描けていたらと思います。
いろいろ開き直りますが、それって難しくないですか?
だって、バイトと学会くらいですよ?働いたのは。

最初からキャリアを描けた人は本当にすごいと思うし、尊敬します。
だって、大学からやりたいことがあって、それを実現しようと思っているのだから。
僕にはそれがなかった。ただそれだけ。

働き始めたら、その会社でやりたいことが生まれるかな、などと考えていました。
確かに生まれました。でもそれはこの会社でやるには5年はかかりそうだと思いました。
だからできそうな会社に転職しました。

ふりかえり


新社会人になる前に、ある人からアドバイスをいただきました。
「新卒でいい会社を引き当てるのは難しいのだから、そこまで気負わなくていい」
(本当にこうだったかは忘れましたが、多分こんな感じだったはず)
今でもこれは本当だと思うし、少なくとも最近はこうなんだろうと思います。

会社の人事や教育担当の方には本当に申し訳ないと思いました。
採用の大変さは1mmくらいは理解しているつもりです。お金もかかります。
実際、転職してから採用に関わることがあったので、最低でも書類選考の大変さは知っていますが、ただ、人が辞めてしまうのはどうしようもないことだろうと思います。
いい会社でも人は辞めますし。

辞める前にもっといろいろできたかも、と思いました。
いろいろな人と話して、働きやすくアクションを起こしやすい職場にしたほうがよかったと思いました。
イベント提案したり、社外勉強会のレポートをチームに送ったりはしましたが、そうではなく、実際に勇気出して話してみる方がよかったと思いました。
まぁ、僕は1度やって折れちゃったんですけどね...。もっと信頼貯金と熱意が必要だった。

これから


アジャイル開発とモダンな開発環境に触れる会社になったので、当面は技術を身につけながら、実装速度をあげたいと思います。

補遺

できるだけ辞めたくなかったなぁとは思います。
いい人が多かったし、すごくできる同僚にも恵まれた。
linuxをカーネルを読む人がいたり、コンパイラ組んでる人もいました。
論文出したり、特許出したり。

同期が周りにいない職場だったので、勝手に社内チャットを作ったりして、知っている同期をバンバン招待しました。
チャットはクローズしましたが、その時のコミュニティはまだあるみたいです。作ってよかった。

2019年12月22日日曜日

Flutter for Webで簡単なToDoリストを作るぞ

この記事はFlutter #2 Advent Calendar 2019の21日目です。

前回はこちら
次回はこちら

1日遅れてすいません。しかも解説は追記予定です。
ソースコードだけは置くので参考になれば幸いです。

(追記2020/2/16)
githubにプロジェクトコードを置きました。
Firebaseでデモを置きました。




最近Dartを使っているので、Flutterを再び勉強するモチベーションが出てまいりました。Flutterは以前少しだけ触って放置していたので、改めてキャッチアップしてみると、なんとFlutter for Webというのがあったので興味本位で触ってみることにしました。

そういうわけでFlutter for Webで簡単なTodoリストを作ります。

やること


開発するときにみた情報源の話。作り始めのころの雰囲気を記録したいと思います。なので読みにくい点もあると思いますが、その時はもし良ければ「読みにくい」ってコメントをお願いします🙇‍♂️

やらないこと


設計周りの話はしません。今はクリーンなアーキテクチャよりもプログラミングを楽しむことに価値を置きたいと思います。

どういうのを作るのか


仕様を決めます。

  • ユーザーはタスクリストを見ることができる。
  • ユーザーはタスク名を入力し、タスクリストに追加できる。
  • ユーザーはタスクリストから終わったタスクをワンクリックで消すことができる。
  • ユーザーはタスクリストに書いたタスクを次回も見ることができる。

足りなければ追加するということで、とりあえずこれで行きます。
あとは画面のモックを作っておきます。
ハイクオリティな画面モック
では取り掛かっていきます。

環境構築


公式の方法に従って導入します。
現在はbetaチャンネルなので今後stableに変わると思います。

というわけでプロジェクトを作ります。

flutter create --org com.akior todolist_app
cd todolist_app
code .

VSCodeであらかじめ設定しておけばこれでプロジェクトで開けるはずです。
あと、VSCodeはFlutterの拡張設定は必要です。

flutter run -d chrome

これでweb画面が起動します。
ちなみにVSCodeからも起動できます。

Touch Barの実行ボタンでも起動できます。白い三角が実行、中抜き三角がデバッグ実行。
lib/main.dartを編集していきます。

完成


タスクを追加する処理です。
ユーザーはタスク名を入力し、タスクリストに追加できる


タスクを削除する処理です。
ユーザーはタスクリストから終わったタスクをワンクリックで消すことができる


更新しても画面は保持されたままです。
ユーザーはタスクリストに書いたタスクを次回も見ることができる

ここにソースコードを示します。



解説

使ったのはAnimatedListとWebStorageです。
アプリならSharedPreferencesを使うところですが、WebなのでWebStorageを使うことができました。使うにはdart:htmlをインポートする必要があります。

おわりに


Flutter for Webで簡単なToDo リストを作成しました🎉
Flutterのお作法で悩みながら楽しく作れたと思います。Widgetツリーを意識しながら構造的に書くことは勉強になりました。

課題として、

  • ネットワークの要素を取り入れる(Firebaseなどと通信する)
  • PWAのように使えるのか調査する(hi fiveみたいにキャッシュにためたあと通信する機構など)
  • オリジナルのデザインをつかう

があげられそうです。

余談


最初にFlutter for Webを書き始めたときは12月始めで、そのときはdevチャンネルでした。
なので12日のFlutter Interactでbetaチャンネルに移行したときは飲み会で一芸を楽しみにしてる感じの声が出ました。
Flutterにsearch.array().