git コマンドをもっと覚えたい

バージョン管理に git を利用しているが主に GUI のツールを使ってきた。 まとまったコードを書いて、たまにコミットして… という分には困らなかった。 しかし、複数リポジトリに少しだけ変更を入れて…という場合にやや面倒になったのでもう少しコマンドを覚えたいと思った。

現状使っているコマンド

fetch, pull, commit, push, checkout

プルリク作ったらコンフリクトしてマージできない

→ master を今のブランチに逆マージしたい時

git fetch
git merge origin/master

やっぱりこの改修入れたくないってなった

→ リバートしたい時

git revert コミットID

コミットID は git log や git log --grep を使って調べる

ブランチに関して

# ローカルのブランチ一覧
git branch
# リモートのブランチも見たい
git branch -a
# ブランチの削除
git branch -d ブランチ名
# ブランチを作ってチェックアウトする
git checkout -b ブランチ名

あとがき

しばらく様子を見て自分が GUI のツールに戻りたがるタイミングを観察したい。 本当に複雑だったり間違えやすいところは無理する必要はないと思っているが、やり方を知らないだけなのは良くないのでそこは気をつけたい。

Java の Stream に入門した

Steram 自体はずいぶん前に出た機能だが、慣れないうちに Java をほとんど書かなくなってしまった。 久しぶりに Java のコードを読むようになったらちょこちょこ Stream が出てきて読むのが大変だったので、少し触ってみた。

JavaScript / TypeScript で似たことができるので、同様のコードを書いて並べてみる。

map、filter、anyMatch (some)

JS/TS とあまり変わらない。 stream() や collect() の見た目に慣れられれば良さそう。

List<String> list = Arrays.asList("hoge", "fuga", "piyo", "mofu");

// list.map((s) => s + s);
List<String> result1 = list.stream()
        .map(s -> s + s)
        .collect(Collectors.toList());
System.out.println(result1);
// [hogehoge, fugafuga, piyopiyo, mofumofu]

// list.filter((s) => s == "piyo")
List<String> result2 = list.stream()
        .filter(s -> s.equals("piyo"))
        .collect(Collectors.toList());
System.out.println(result2);
// [piyo]

// list.some((s) => s == "piyo")
boolean result3 = list.stream()
        .anyMatch(s -> s.equals("piyo"));
System.out.println(result3);
// true

Function、Predicate

Predicate 型が Function 型とは別に存在していることに面食らった。 「1つの引数の述語(boolean値関数)を表します」ということで and(), or(), negate() がある。

// func = (s) => s.length;
// result4 = list.map(func);
Function<String, Integer> function = s -> s.length();
List<Integer> result4 = list.stream()
        .map(function)
        .collect(Collectors.toList());
System.out.println(result4);
// [4, 4, 4, 4]

// predicate1 = (s) => s == "piyo";
// result5 = list.every(predicate1);
Predicate<String> predicate1 = s -> s.equals("piyo");
boolean result5 = list.stream()
        .allMatch(predicate1);
System.out.println(result5);
// false

// predicate2 = (s) => s == "mofu";
// predicate3 = (s) => predicate1(s) || predicate2(s);
// result6 = list.map(predicate3);
Predicate<String> predicate2 = s -> s.equals("mofu");
Predicate<String> predicate3 = predicate1.or(predicate2);
List<Boolean> result6 = list.stream()
        .map(s -> predicate3.test(s))
        .collect(Collectors.toList());
System.out.println(result6);
// [false, false, true, true]

ECR と ECS に出会った

ここしばらく全然ブログ書いていなかったけど、細かいことでももう少し書いて書くハードル下げていきたい。

昔はサーバに直接 ApacheTomcat をインストールして、アプリケーションを置いて…という構成のものの面倒を見ていた。 少し前は AWSAPI Gateway や Lambda でサーバレスに作られたものの面倒を見ていた。 その時は急にサーバレスになり DB も DynamoDB になってずいぶん戸惑ったけどそれはまた別の話。 先日部署異動により ECS を利用してサーバの管理?をしているところに来たので、上記の構成の中間ぽいなと思っている。

ECR って?

Amazon Elastic Container Registry の略。 自分たちで作った Docker イメージなどを ECR にプッシュしておける。 ECS でクラスターを作成する際に ECR から Docker イメージをプルしてこられる。

docs.aws.amazon.com

ECS って?

Amazon Elastic Container Service の略。

どうしても何をするものかうまく自分の言葉でまとまらなかったので公式の動画と説明を貼っておく。 【AWS Black Belt Online Seminar】Amazon Elastic Container Service (Amazon ECS) - YouTube

docs.aws.amazon.com

  • タスク
    • 1タスク1ホスト(例えば EC2 1台)
    • 内部では定義に従ってコンテナが動く
  • タスク定義
    • どんなタスクにするかの設計図。使うコンテナ(ECRから引っ張ってこれる)は何か、開くポートはどれか、などなど。
  • サービス
    • タスクがいくつ動いていたら良いかの定義に従ってそれを維持する (アクセスが多ければたくさんにするなど)
  • クラスタ
    • タスクまたはサービスの論理グループ

細かい用語にしても公式の説明のほうが良い。 20200422 AWS Black Belt Online Seminar Amazon Elastic Container Servi…

感想

かなり雑なまとめになってしまったが、使ううちに概念に慣れていっている感はあるので、引き続き触れて理解を深めたい。

Confluence のページを API から作成してみた

前提

Confluence とは

Atlassian の wiki みたいなもの。

やりたかったこと

1日の終わりにやったこと等の一覧をまとめたページを自動作成し、追記することで自分用の日報的なまとめを作りたかった。

やったこと

Python で requests を使うとこんな感じになった。

    response = requests.post(
        f'https://{atlassian_domain}/wiki/rest/api/content',
        data=json.dumps({
            'title': title,
            'type': confluence_type,
            'space': {'key': space},
            'ancestors': [{'id': parent_id}],
            'body': {
                'storage': {
                    'value': body,
                    'representation': 'storage',
                }
            },
            'metadata': {
                'properties': {
                    'editor' : {
                        'value' : 'v2'
                    }
                }
            },
        }),
        auth=(user, password),
        headers={
            'Content-Type': 'application/json',
            'X-Atlassian-Token': 'no-check',
        }
    )

ポイントは metadata で editor のバージョンを指定すること。 editor のバージョンが v2 になっていれば、 Jira の URL を a タグでリンクにしておくだけで読み込み時にタイトルとステータスが展開される。 Jira のマクロを使う必要はない。

この meadata は Confluence のページ作成のドキュメントには言及がない。これに辿り着いた Community の人たちすごい… community.atlassian.com

何かと新しいエディタを推してくるので最初はなぜ古いエディタになるのかわからず、body の storage じゃなくて違うやつに入れるのか??など悩んでしまった。

シャワーホースを取り替えた

シャワーヘッドの下の金具とホースが緩んで水漏れが起きた。
確認したところ、水栓側の金具付近のホースも痛んでいた。

水栓と同じメーカーのホース・シャワーヘッドのセットが安かったのでそれを購入した。
メーカーごとにアジャスタがあったりするので、買いに行く際はメーカー名を控えておくのが必須。
不安だったので長さをはかり写真も撮っていったが、それは使わなかった。

また、プライヤ(大きいネジを締める工具)が家になさそうだったので、シャワーホースを持って、店員さんに尋ねたところ、ホームセンターだったので親切に教えてくれた。
店員さんオススメの比較的コンパクトで安いものを購入した。

水栓側の金具をプライヤで回して外し、新しいホースに同梱のパッキンを取り付け、プライヤで金具をしめてホースを取り付け、ホースの先に同梱のシャワーヘッドを手で取り付けて、作業完了。
お湯と水の蛇口の間にホースの金具があって、プライヤが大きくてぎりぎり入る感じだったので、回すのは少し頭を使ったが、工具のおかけで大して力はいらないし、短時間で作業できた。
今後水漏れしないかどうかについてはしばらく気をつけて観察したい。

ヤドンのしっぽ作った

f:id:Yuhshi:20150816153854j:plain
f:id:Yuhshi:20150816155353j:plain

経緯

ヤドンとは → ヤドンパラダイス|ポケモンだいすきクラブ

ポケモンセンターで売られているヤドンのしっぽはもふもふとしたぬいぐるみらしい感触だったが、ヤドンのしっぽはもっとつるりとした感触ではないかと思ったので、自分で作ってみることにした。

材料

  • 寒天 (粉タイプ)
  • 煮小豆 (缶詰 200g。こしあんがあればその方が楽)
  • 牛乳
  • 砂糖

道具

  • 鍋2つ
  • 食品を入れられるポリ袋
  • セロハンテープ
  • 麦茶入れ (幅と高さがある。深いボールでも良いが、しっぽを立てて冷やすために高さが必要)
  • 金ザル
  • ヘラ
  • 計量カップ (寒天のパッケージに牛乳寒天の分量は載ってることが多そうなのでそれを参考に計るか、適当にぐぐってください…)

大雑把な作り方

  1. しっぽの型を用意する。ポリ袋を斜めに折って、セロテープで固定しておく。もしも、ホイップクリーム用の袋が余っていたらその方が扱いやすそう。ポリ袋はぺらぺらするので抑えるのが大変。
  2. 煮小豆(要するにつぶあん)をザルでこす。木べらより、柔軟性のあるシリコン等のヘラの方がこしやすい。
  3. 鍋に粉寒天と水を入れて、温めて溶かす。
  4. 別の鍋で牛乳をほんのり温めておいて、溶けた寒天の半分(もしくは3分の1でも良いかも)をそこに加える。さらに砂糖も加えて溶かす。
  5. 麦茶入れ(もしくは深いボール)に氷水を用意する。
  6. ポリ袋を立てて、適当な高さまで牛乳寒天を入れる。そのまま氷水で固まるまで冷やす(しっぽの形にするため、何とかして押さえておく必要あり)。
  7. 牛乳じゃない方の鍋に、こしたあんこを投入する。一度に全部入れず、色を見ながら調整する。色が濃すぎるようなら牛乳を入れるのもあり。あんこが甘ければ砂糖は少量でもいいかもしれない。
  8. 牛乳寒天が固まったら、あんこ寒天を入れて、さらに氷水で冷やす。形が固まれば冷蔵庫に入れることも可能。今回は麦茶を入れる容器を使っており、ふたでビニール袋の端を挟み込んで立てたままの形を維持できたので、粗熱が取れ次第冷蔵庫に入れることができた。(※寒天は常温でも固まります。冷やして食べたかったので…)
  9. 固まったらビニール袋を切って取り出す。そのまましゃぶるもよし(設定通りほんのり甘い)、普通に切り分けてもよし。

感想

まともな型が用意できなかったので、固まるまでの寒天を押さえる必要があり、それがとにかく大変だった。
料理の経験値が低くて、手際が悪くてそれも大変だった。
まな板の上のしっぽはぷるぷると揺れて、思ったよりリアル感があった…

羊毛フェルトでどりやん

f:id:Yuhshi:20141229181123j:plain
最初期の「やんのかオラ!」って感じの表情になった。

前書き

どりやんとは、テレビ東京のリトルトーキョーライブのキャラクター。売れ残りのドリアン。リトルトーキョーライブ:テレビ東京
パペット写真はこちら →

コンセプト

  • まだグッズがないようなので自分で作る
  • 前回の羊毛フェルトのナナナと並べても違和感ないサイズで作る

材料

ナナナに比べて大変だったこと

トゲがとにかく手間だった。羊毛フェルトを丸めて少しつついてから体につけていった。
あと、思ったよりやや小さくなってしまって、ナナナに食べられる感じのサイズになってしまった…

最後に

  • ナナナが帰ってきてくれて嬉しい。(トーキョーライブが4月終了→時刻変わって10月再スタート)
  • どりやんのグッズも早く出てほしい。