AtCoder参加してみた

使用する言語

せっかくなら触ったことがない言語で学びながらやろうって気持ちでこの二つの言語を使用してます

なんで二つの言語かは、気分です

標準入力

  • AtCoderをやるまでは、標準入力なんてきにしたことなかったのであたふたしました

  • AtCoderにも載っている例やQiitaを参考にしました

  • Go

var n int
fmt.Scanf("%d", &n)

※fmt.Scan(&n)でもいけます

i = input()
  • 複数の入力値を受け取る場合

  • Go

var n1 n2 int
fmt.Scanf("%d %d", &n1, &n2)
a, b, c = map(int, input(.split()))

標準入力が理解できればあとは処理書くぞ

  • Aは単純な問題の場合が多くなっております。

    • 例えば、if else文で解ける問題も多いです。
    • 実際に問題を解いて提出をしたら、予めAtCoder側が用意したテストが自動で行われます。すべて通過すれば「AC」となり得点が獲得できます
  • Bの問題なのですがここから少しずつレベルが上がっていきます。

  • Cの問題からは数学的知識が必要になってくるので僕は、算数も危ういので中学数学から勉強しようと思ってます。

過去問

  • 実際に参加する前に過去問を解くことも可能です。個人的にはA,Bはマストで回答できるようになりたいので過去問をしつつ、開催時は参加するようにしてます

  • 実際にAC(正解)になったコードを晒したいと思います。

  • 第166回目のA, Bをpythonで解いたコードになります

    • 問題文は、下記URLを参照してください。

atcoder.jp

  • この問題は非常に簡単でした。
i = input()
if i == "ABC":
    print("ARC")
else:
    print("ABC")
  • B
n, k = map(int, input().split())
d = [0]*n  # 0 * n個分の要素数の配列を作成 ex. [0, 0, 0, 0, .....]
for _ in range(k):
    input()
    l = (list(map(int, input().split())))
    for i in l:
        d[i - 1] = 1  # 0を1に変更する

print(d.count(0))  # 0の要素の個数をカウント
  • せっかくなのでGoで解いたコードも晒します(別の問題になります)

    • 第160回目のA,B
  • A

package main

func main() {
    var a string
    fmt.Scanf("%s", &a)
    l := strings.Split(a, "")
    if l[2] == l[3] && l[4] == l[5] {
        fmt.Printf("Yes")
    } else {
        fmt.Printf("No")
    }
}
  • B
package main

func main() {
    var a int
    fmt.Scanf("%d", &a)
    b := a % 500
    r := a/500*1000 + b/5*5

    fmt.Println(r)
 
}

他者の解答

  • AtCoderのいい点としては、自分が正解不正解かかわらず、他者の正解したコードを閲覧できアルゴリズムのバリエーションを学ぶことができます
  • 解けなかった場合はとても参考になりますし、正解だった場合でも僕は、みるようにして次のコンテストや過去問を解くのに生かせるようにしてます

参加した感想

  • 各問題を解けたときは、嬉しく楽しいです
  • 普段の業務では、JS、PHPを使用していますが言語は違えどアルゴリズムという観点で考えると業務に活かせる場面が出てくるので引続き時間が許す限りAtCoderのコンテストには参加していこうと思っています

まとめ

  • 競プロ系のサービスは、考える力の向上や他者の考えもみれたりできるのでおもしろいです
  • せっかくなので今後も続けていきレーティングを少しずつ上げていけたらなとおもいます

AtCoder初参加

結果

  • 恥ずかしながら0点でした

理由

  • 自分のPCであまり確認せずひとまず実行を繰り返し、phpで書いたんですがローカルで動くプログラムがかけていても「WA」を連発してしまった。なぜWAになったのか不明。
    • 同じ問題を同じようにGoとpythonで書いたら問題なかった
  • Cの問題をみたけどまったく日本語が理解できなかった

今後

  • 個人的には、できるだけ参加してABは、回答できるようになる。
  • Cに挑戦できるようにする。

まとめ

  • エンジニアなら解けるだろうって思うかもしれないけど数学的要素がはいるとからっきし だめなんですよね自分。ただの言い訳になるけども今後は、数学的な知識もしっかりと身につけていかなければなーって思いました。

リモート作業で使っているアイテム

椅子

  • 以前は、ニトリのこちらの椅子を使用してました

www.nitori-net.jp

  • 今回会社の支援金を使い購入したもの

www.ergohuman.jp

感想

  • まぁー別格です。
  • あらためて椅子の大事さを知った。基本PC作業の人は椅子に投資は惜しんだら体に直接的なダメージが積み重なっていくとおもう

デスク

  • イケアのデスクです
  • こちらは、天板と足を別で買って組み立てたものになります。
  • 二人用のデスクなのでわりと広めです

キーボード

  • 自宅には3個ほどあるんですがずっと欲しかったこちらを使ってました

www.archisite.co.jp

  • ただこれの青軸を買って(軸の知識がなかったため欲しさのあまりあまりみずに買ってしまった)しまったため以下の問題がありました
  • 問題点としては、青軸なのでリモートでのペアプロMTG中にキーボードのうるささが目立ってしまう。また十字キーが存在しないのでまぁまぁ難易度がたかった(自分にとって)
    • Fn + I or K or L or J で移動なんだけど指の置き方が疲れた
  • 悩みに悩んでこちらに変更した

www.archisite.co.jp

パームレスト

  • これはFlicoのスポンジみたいなやつの厚めの方を書いました。

感想

  • 個人的にmd600からの変更で打ちづらさが最初はあったけどかなりいい感じ
    • 一番よかったのは、静音赤軸(HHKBの最新作と同じ?)にして音が全くなくなったことです
  • またPC作業でよく起こる問題としての巻き肩や姿勢の悪さへの改善も見込めてだいぶ快適に過ごしてます

モニター

  • こちらは、あまりこだわりがないので型とインチが異なるLGのモニターを二枚使用してます。
  • モニターアームを使用しているので縦置きと横置き(スタンダード)で使用してます。

感想

  • 個人的には、曲面のデカいモニターにすればよかったなと気持ちもあるが今の環境に満足している

ガジェットの紹介は以上です

  • いかがでしたでしょうか?
  • って締める文章は嫌いです

総括

  • このご時世なのでリモートで作業されている人も多いと思います。より快適な作業環境を模索してみてはどうでしょうか?お金も時間もかかるかもしれませんが快適なリモート生活を手に入れて少しでもストレスを減らしましょう。

composerでのちょっとした楽

Composerがある環境

  • 例えばLaravelを使用している場合
    • 環境構築ってまぁまぁめんどい多くが下のコマンドのような流れのはず
git clone https:/xxxxxxx
composer install
cp env-example .env
php artisan key:generate
php artisan migrate
  • これすらめんどいわけで。。。
    • docker 環境だったとしたらdocker-compose up -d --buildした時点でshellが走るようにしてればいいんだけども
    • 環境がそれぞれのPCに依存している場合とかだとまぁーめんどいしREADMEに書くのもだるい

めんどいのcomposer.jsonに書けばいい

  • rails とかだと用意されているんだけど(もちろんプロジェクト単位での追記はあると思うけど)setupコマンドを作っとけばいい
    • composer のscriptsって箇所に追記すればいい。例えば下記のように
       "set-up": [
            "composer install",
            "cp .env.example .env",
            "php artisan key:generate"
        ]
  • って書いておけば
composer set-up
  • 一回で済む話。

  • もしまだやったことがなくコマンド都度打つような環境なら最初の段階であらかじめ追記しておいた方がいい。そうしたらドキュメントも一行で済むし、他の作業者が間違えることなく初期環境構築が終えられると思う。できる限り日々小さなことでもめんどーは避けたい。

レガシーなPHPシステムにPHPUnitを入れてみる

目的

  • 単体テストがなく、なんの動作保証もない実装がすぐにローンチされている環境をなくしたい
  • 色々とメンテナンスされていないライブラリを消し去りたい
  • 他にも色々と理由はあった・・・・気がするけど主にこのへん

現状

  • レガシーのシステムなのでPHPのversionはもちろんサポ外ですよ

    • なので極力対象のシステムが動く環境で検証実装
    • 既存の秘伝のタレで作成されるvagrant環境を参考にdockerの環境構築に着手した
      • しかし大きな問題が発生。メンテされていない、ドキュメントも少ない、安全な保証なしってことで消し去りたいライブラリを入れられないって問題。あまり時間も取られたくないのでひとまず秘伝のタレでできているvagrant 環境で実装することに※実際みる限り問題なく動いてはいるはず。
  • 単体テストを使用しようとした痕跡はあるけどもそれ自体がテストとして成立してないものなので、即全削除。0からの実装が確定

調査・事前準備

  • 該当のPHP versionで動くPHPUnitDbUnitの組み合わせで検証プロトタイプの作成
  • その後秘伝のタレのvagrant環境で動作確認

先々考えるとしんどい

  • 理由
    • PHPUnit, DbUnitのversionをPHPのversionに伴ってあげるとpathが変わる。
    • そこを考慮して実装しないと世代アップにも時間が取られることになる。

次のブログで導入手順を書く

ブログ再開

主に書いていくこと

  • エンジニアっぽいこと
  • アニメの考察や感想
  • 趣味など

ブログを再開する理由

  • アウトプットが少ないからブログでアウトプットしていくため

書いている人について

  • 一応エンジニア(怠け者の極みである)
  • アニメが好き
  • 音楽が好き
  • 金儲けが好き

ひとまず続けてみようと思う