Yukii

主にプログラミング(Flutter)についての記事を書いています。

脳動脈瘤、2回目の定期検診の結果

本日、先々週の脳のCTの結果を聞きに来院しました。

 

検査から結果報告までの間はドキドキして生きた心地がしませんでした。

もし手術になったら大変だし、

手術にならなくても動脈瘤が大きくなっていたら生活を改善する必要があります。さしたら大好きなジムでのトレーニングができなくなっちゃうの?とか不安がいっぱいでした。

 

そして

肝心の診断結果はというと。。。

 

大きさ3mmのままで形状も変化なし!

 

やったー!このまま生活してまた半年後に検査です。

 

検査はこれから一生やっていきます。

目安としては2年間は半年に一回の脳のCT検査。

その後問題なければ一年に一回に頻度が減ります。

息を止めないこと。きばらないこと。過度なストレスや喫煙は避けること。

それ以外は普通に生活して良いとのことでした。

私としては2年前からハマっている筋トレをまだ続けられること(高重量などできないことはありますが)がとても嬉しいです。

長年無趣味だった私がやっと見つけた趣味なのでこれからも気をつけながらも没頭したいきたいと思います。

 

脳動脈瘤の定期検診

今日は脳動脈瘤の進行具合をみるためにCTを撮りに行ってきました!

 

今のところ半年に一回の検診なので、案の定同意書等の必要書類を忘れて再発行。

 

私は注射や点滴がきらいなので造影剤を点滴で入れるCT検査もきらい。

検査を待っている間、点滴針を刺す恐怖や結果のことを考えて不安で不安で‥‥爆睡。

 

検査室に入ってCT検査をしたのですが、今回は造影剤を入れた時、身体の末端が熱くなったのに加えて味を感じました。

点滴の味を感じるってなんか不思議な感覚でした。

 

結果は再来週!

ドキドキです。

AtCoderの過去問をDartで解いてみた~Part2~

本日は、@drkenさんの AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ の第二問目をDartで解いてみました。
第二問では

  • for 文を使わない程度の全探索
  • string 型

がキーポイントになっております。

ABC 081 A - Placing Marbles

[問題]
1,2,3の番号がついた 3つのマスからなるマス目を持っています。 各マスには 0 か 1 が書かれています。
1が書かれたマスにビー玉を置く場合、ビー玉が置かれるマスがいくつあるか求めてください。

[解法]

import 'dart:io';

void main() {
  String abc = stdin.readLineSync(); // 文字列入力
  int count;
  count = 0;
  for (int i = 0; i < 3; i++) {
    if (abc[i] == "1") count++;
  }
  print(count);
}

解法としては、入力された文字列が"1"の時に、自身で定義したcountの値を一つ増やします。

ABC 095 A - Something on It

[問題]
あるラーメン店のラーメンの値段は1杯 700円ですが、トッピング(味玉、チャーシュー、ねぎ)を乗せた場合は1種類につき100円が加算されます。
ある客がラーメンを一杯注文し、店員にトッピングの希望を伝えました。
店員は注文の内容文字列Sに書きました。1文字目が o のとき客のラーメンに味玉を乗せることを、x のとき味玉を乗せないことを表します。同様に、
2文字目、3文字目はそれぞれチャーシュー、ねぎの有無を表します。
Sが入力されるとき、対応するラーメンの値段を出力するプログラムを書いてください。

[解法]

mport 'dart:io';

void main() {
  String s = stdin.readLineSync();
  int yen = 700; //ラーメンのデフォルト値を与える
  int count;
  count = 0;
  for (int i = 0; i < 3; i++) {
    if (s[i] == "o") count++;
  }
  print(count * 100 + yen);
}

解法としては、ABC 081 Aとよく似ています。入力された文字列が"1"の時に、自身で定義したcountの値を一つ増やし、ラーメンのデフォルトの値段にcountで数えた分のトッピング料金を加算します。

ABC 085 A - Already 2018

[問題]
ある書類には、その日の日付を yyyy/mm/dd という形式で書き込む欄があります。この書類を書き終えたあと、筆者は日付欄の先頭に誤って2017と書いてしまっていたことに気がつきました日付欄を2018に修正して出力するプログラムを書いてください。

[解法]

import 'dart:io';

void main() {
  String s = stdin.readLineSync();
  String a;
  if (s.startsWith("2017")) {
    a = s.replaceFirst('2017', "2018");
  }
  print(a);
}

日付の形式が yyyy/mm/ddであるため、直接"2017"を"2018"に変更しても月、日に影響はない。

ABC 069 B - i18n

[問題]
"internationalization"という英単語は、"i18n"と略されることがあります。 これは、先頭文字 i と末尾文字 n の間に18文字が挟まっていることに由来します。
長さ3以上の英小文字のみからなる文字列s が与えらたとき、同様の規則によって sを略してください。

[解法]

import 'dart:io';

void main() {
  String s = stdin.readLineSync();
  String sf = s[0];
  String sl = s[s.length - 1];
  int len = s.length - 2;
  String ans = sf + len.toString() + sl;
  print(ans);
}

入力された文字列の最初の文字、文字の長さ、最後の文字を取得して、それらをつなげれば良い。

ABC 082 B - Two Anagrams

[問題]
英小文字のみからなる文字列s, tが与えられます。 あなたは、sもtも文字を好きな順に並べ替え、新しい文字列s'、t' を作ります。
このとき、辞書順で s'がt'より先に来ることができるか判定してください。

[解法]

import 'dart:io';

void main() {
  String s = stdin.readLineSync();
  String t = stdin.readLineSync();

  List ss = s.split(""); // 文字列をリストにする
  List sortS = ss..sort();
  String stringS = sortS.join(); // sortしたリストを文字列に直す
  List tt = t.split("");
  List sortT = tt..sort((b, a) => a.compareTo(b)); // 逆sortする

  String stringT = sortT.join();
  List before = [stringS, stringT]; // s'とt'がどちらが先かsortして判断する
  String before1 = stringS;
  String after1 = (before..sort())[0];
  String before2 = stringT;
  String after2 = (before..sort())[1];
  if (before1 == before2 && after1 == after2) { // s'もt'も全く同じ文字列の場合
    print("No");
  } else if (before1 != after1) { 
    print("No");
    return;
  } else if (before1 == after1) {
    print("Yes");
    return;
  }
}

before == afterという条件は使えなかったので各第一成分が同じかどうかで判断した。

まとめ

今回はABC 082Bが一番手こずりました。
次回は @drkenさんの AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~の第3問を解いて行きたいと思います。

(参考)
qiita.com
qiita.com

AtCoderの過去問をDartで解いてみた~Part1~

本日は、@drkenさんの AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ の第一問目をDartで解いてみました。
第一問では

  • 四則演算
  • 倍数判定

がキーポイントになっております。

ABC 086 A - Product (100 点)

[問題]
二つの正整数 a,bの積が偶数か奇数か判定してください。

[解法]

import 'dart:io';

void main() {
  List ab = stdin
      .readLineSync()
      .split(" ")
      .map((x) => int.parse(x))
      .toList(); // 一行に複数入力する方法
  int c = ab[0] * ab[1];
  if (c % 2 == 0) {
    // あまりで偶奇を判断する
    print("Even");
  } else {
    print("Odd");
  }
}

解法としては、標準入力した積の余りから偶奇を判断します。

ABC 064 A - RGB Cards

[問題]
赤、緑、青色のカードを持っています。
それぞれのカードには 1以上 9以下の整数が書かれています。
3つのカードを左から順に赤、緑、青色の順に並べ、左から整数を読んだときにこれが 4の倍数であるか判定しなさい。

[解法]

import 'dart:io';

void main() {
  List rgb = stdin.readLineSync().split(" ").map((x) => int.parse(x)).toList();
  int sum = rgb[0] * 100 + rgb[1] * 10 + rgb[2]; // カードの整数を各桁に設置する
  if (sum % 4 == 0) {
    print("YES");
  } else {
    print("NO");
  }
}

解法としては、カードの整数を各桁に設置して、4で割った余りから判断します。

ABC 088 A - Infinite Coins

[問題]
1円硬貨をA枚と500円硬貨を無限枚持っています。
これらの硬貨だけを使うことによって、ちょうどN円を支払うことができるかを判定しなさい。

[解法]

import 'dart:io';

void main() {
  int n = int.parse(stdin.readLineSync());
  int a = int.parse(stdin.readLineSync());

  int ans = n % 500;
  if (ans <= a) {
    print("Yes");
  } else
    print("No");
}

解法としては、持っている500円硬貨は無数個なので余りのみ考えれば良いことになります。

ABC 157 A - Duplex Printing

[問題]
全Nページから成る書類を両面印刷します。両面印刷では1枚の紙に2ページ分のデータを印刷することが出来ます。
最小で何枚の紙が必要か求めてください。

[解法]

import 'dart:io';

void main() {
  int n = int.parse(stdin.readLineSync());

  int ans0 = (n / 2).floor();
  int ans1 = n % 2;
  if (ans1 == 0) {
    print(ans0);
  } else
    print(ans0 + 1);// 余りが出たら1ページ足す
}

ceil()を使っても良かったかもしれません。

まとめ

業務ではFlutterを使っているので、このようなdartの扱いをしたことがなかったのでとても楽しかったです。
そもそも「標準入力って何?」からはじまりました。
しかし、以下の記事を参考に5日間勉強して楽しくコンテストを受けることができました。
残りの練習問題もボチボチ記事にしていきますのでよろしくおねがいいたします!

(参考)
qiita.com
qiita.com

AtCorderをDartで初めて受けたはなし

先月末(2020/8/22(土))に初めてArtCorderを受けました。
コンテスト名は「AtCoder Beginner Contest 177」。
点数自体は全然取れませんでしたが、とても楽しんでうけることができました!

AtCorderとは

Wikipediaによりますと、AtCoderとは、「競技プログラミング」と呼ばれるコンピュータプログラムのコンテストを行うサービスで、高橋直大氏が代表を務める運営会社を指すそうです。(AtCoder - Wikipedia
その中でも私は「AtCoder Beginner Contest (ABC)」を受けました。これは競技プログラミング初心者/初級者向けのコンテストでです。
配点は100-200-300-400-500-600固定の6問構成で、Rated対象は1999以下となっています。

ABC では、A 問題から F 問題までの 6 問が出題されます。(用語集 - AtCoder Beginner Contest 074)

  • A 問題: スコア 100 点であることが多い、簡単な文法の確認
  • B 問題: スコア 200 点であることが多い、簡単な for 文、if 文を含む処理, Fizz Buzz と同程度
  • C 問題: スコア 300 点であることが多い、計算量を意識したコーディングが求められるようになります
  • D 問題: スコア 400 点であることが多い、ここから先はアルゴリズムの勉強も必要になってきます
  • E 問題: スコア 500 点であることが多い、本格的な難しい問題です
  • F 問題: スコア 600 点であることが多い、一気に難しくなります。黄色を目指すなら解きたい問題です

(ちなみに私はA,Bは比較的短時間で回答できましたが、Cはスタック・オーバーフローを回避できずアクセプトに至りませんでした。。)

コンテストの参加方法

用語集 - AtCoder Beginner Contest 074
に詳しく書かれておりました。

Accepted の判断基準とは

運営が用意したテストを全てパスし、正しいプログラムであると判定されたときのみAccept(AC)になります。
メモリ制限を超えていたり、問題で指定された実行時間以内にプログラムが終了しない場合もACになりません。
(参考)
atcoder.jp
qiita.com

レーティングについて

AtCoder コンテストについての tips - Qiitaによりますと、レーティングによって8このランクに分かれているようです。

コンテストを受けた感想

ただただ楽しかったです!
コンテストを受けるために5日間ほど
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita
に掲載されている問題をdartで解いてみました。
AtCorderをdartで受ける人は数少なかったですが、AtCorderに提出されたコードは自由に閲覧できるので、それを見て勉強したり、
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita
を参考にして勉強しました。

もともと私はエンジニアになる前は数値計算を用いた理論研究者でしたのでこう言う問題を解くのは大好きです。
しかし、研究所にはめっちゃ性能の良いCPUがあるので計算オーダーなどさほど気にしていなかったのが、今回のコンテストでネックになってしまいましたね。。

今後の課題

次回のコンテストではCまで解くことが目標なので、計算量オーダーを意識したプログラムの組み方を勉強したいと思います。
(参考)
qiita.com

なりたい自分になるためのデイリーノートの書き方

今日は、なりたい自分になるためにノートを使ってどう自己管理していくかを書きたいと思います。

自分になるために必要な行動

私なりに考えた、なりたい自分になるために必要な行動は以下の通りです。

  • 目標を明確にする
    • やりたいこと、やりたくないことを洗い出す -> 今一番なりたい自分を明確にする
    • なりたい自分になるための要素を棚卸する
  • 目標達成のための計画を立てる
    • 目標達成のために踏むべきステップと年間計画をたてる
  • 目標達成するために行動する
    • 細かいタスクに落とし込む
    • 月単位、週単位、日単位でタスクを可視化する
    • タスクをこなす
  • 行動の調整
    • やるべきこと、やらなくてもよかったことを洗い出す
    • 日々のタスクに無理がないかチェックし調整する
  • 目標に近づいていることを実感する

参考にした方法

上記の行動を実行/管理するために参考にした2つの方法を紹介します。

  1. PDCAノート

www.amazon.co.jp

  1. バレットジャーナル

www.wakibungu.com

私は、目標設定や計画、日々の実行と評価、改善に対しては1のPDCAノートを、目標に近づくためのタスクの管理を2の バレットジャーナルを参考にしました。

デイリーノートの書き方

上記の方法を参考に作成したノートの構成を紹介します。

  1. 目標設定
    1. やりたいことリストページを作る
    2. やらないことリストページを作る
      • 左半分: やらないことリスト、右半分: 左の文を肯定的に書き直した分
    3. 上記の2ページに渡って書いたリストを、一年以内 / 三年以内 / いつか に達成したいかに分ける
    4. 年間計画GPSページを作る
      • 一番上に、なりたい自分のゴールを一個選んで書く
      • その下の余白になりたい自分の要素を箇条書きで書きくだす
  2. 計画・ステップ
    1. 一年間の計画・ステップページを作る
      • 一番上にゴールを書く
      • その下をマス状に分けて、3ポイント、3ステップ、年間スケジュールを書く
    2. 3ヶ月間の計画・ステップページを作る
      • 一番上にゴールを書く
      • その下をマス状に分けて、3ポイント、3ステップ、アクション、月間スケジュールを書く
    3. Future Logページを作る
      • 見開き6ヶ月×2ページ
      • バレット、日付、内容をどんどん書きこんでいく
    4. Monthly Logページを作る
      • 見開きページを使う
      • 一番上に今月の月を記載する
      • 左ページ: 日付、曜日を縦書きし、予定を書く。右ページ: 今月のバレット、日付、内容をどんどん書きこんでいく
  3. 実行・振りかえり
    1. 1日のPDCA & Daily Logを1ページ内に書き込む
      • 1ページを縦に四分割する
      • P: 時間と予定を書く。 D: 実行した実際のスケジュールを書く。CA: 評価・気付き / 改善策を書く。 Daily Log: その日のタスク・イベントを書く
      • 書き順: Daily Logと一番右に書いて、一番左にPを書き、 Daily Logで書いたタスク、イベントをスケジュールに落とし込んでいく。 そして日中に D、C、Aを書いていく。
  4. カスタムコレクション
    • Todo List、計画、まとめノートなどを必要なときにその都度作る


以上、私が実践しているなりたい自分になるためのデイリーノートの書き方でした!

Flutterでの多言語対応をする

本日はFlutterでの多言語対応のの方法と確認方法について書きたいと思います。

設定方法

1. pubspec.yamlにpackageを追加

まず、多言語用にパッケージを追加します。
f:id:muscle_girl:20200531181442p:plain

2. lib/l10n というファイルを作成し、その中にローカライズ用のクラスを作成

l10n.dartf:id:muscle_girl:20200522164358p:plain

l10n_delegate.dart
f:id:muscle_girl:20200531202102p:plainf:id:muscle_girl:20200531202247p:plain


3. messates.dartを作成し、多言語に使うためのgetterを定義する

f:id:muscle_girl:20200531182115p:plain
今後、言語を追加したいときに逐次このファイルに追加します。

4. メインのarbファイル自動作成

f:id:muscle_girl:20200531182324p:plain
これによって intl_messages.arbが生成されます。

5. 主言語のarbファイル自動作成(今回は日本語)

f:id:muscle_girl:20200531182532p:plain
この命令で、4で生成されたintl_messages.arbをコピーしてintl_ja.arbを作成します。

6.別言語のarbファイル作成(今回は英語)

intl_ja.arbを参考に別言語のarbファイル((ex) 英語ならintl_en.arb)を作ります。
(messages.dartに新たに追加したgetterから生成したJSONがintl_ja.arbに追加されているので、その部分を別言語のarbファイルにコピーしvalueを翻訳してください(下図の赤枠部分))。
f:id:muscle_girl:20200531185250p:plain


7. arbファイル群から多言語対応に必要なクラスを自動生成

f:id:muscle_girl:20200531185423p:plain
messages_*.dartが生成されます。(生成されたmessages_*.dartは編集しないでください)

8. main.dartに設定

f:id:muscle_girl:20200531202247p:plain
f:id:muscle_girl:20200531185623p:plain
パッケージと設定ファイルをインポートし、localizationsDelegatesと supportedLocalesをMaterialAppに設定します。
ここで L10c.delegateは今回のローカライズのために 2.で作成したDelegateです。
GlobalMaterialLocalizations.delegate は多分組み込みのローカライズのものらしく日付のフォーマットなどが管理されています。
GlobalWidgetsLocalizationsはウィジェットローカライズするために必要らしく右から書く言語とかに対応するためにいるみたいです。
GlobalCupertinoLocalizations.delegateはFlutterで多言語対応をした場合にiosで言語を日本語にして、TextFieldで長押しするとクラッシュするのを回避ために設置しました。

9. 多言語設定したい各ファイルに設定

f:id:muscle_girl:20200531202613p:plain
f:id:muscle_girl:20200531185933p:plain
設定ファイルをインポートし、言語切り替えしたい部分に呼び出します。
この時、l10n.dartで生成したClass名を使ってmessages.dartで設定したgetterのメソット名を使います。
さらにここではBuildContext contextが使える範囲で使用しないとエラーが発生するので、設定場所を工夫したたり、contextを変数にしておいてbuild内等で初めて代入するなど工夫が必要は部分も出てきます。

確認方法

1. iOS

1.1-XcodeでLocalozationを変える
f:id:muscle_girl:20200531190555p:plain
このDevelopment Languageはproject.pbxproj の以下の部分を変えると変更できます。
f:id:muscle_girl:20200531190659p:plain

1-2. runするときの言語と地域を選択する
f:id:muscle_girl:20200531191413p:plain

1-3. 実機を起動してチェック

2. Android

端末の言語を切り替えるだけで確認できます。