OmniAICreator/Qiita-1.07M huggingface dataset:
enumの値を表示

## はじめに
PHPのenumを初めて使用した際に、学んだ内容になっております。

## 環境
・PHP8.1
・Laravel9

## enumファイルの位置
今回はModelの中でファイルを管理してます。
```
Packages
　↳Domain
　　↳Models
```

## enumファイル
```　weekType.php
<?php

namespace Packages\Domain\Models;

enum WeekType: int
{
    case Monday = 1;
    case Tuesday = 2;
    case Wednesday = 3;
    case Thursday = 4;
    case Friday = 5;
    case Saturday = 6;
    case Sunday = 7;

    public function label(): string
    {
        return match($this){
            WeekType::Monday => '月',
            WeekType::Tuesday => '火',
            WeekType::Wednesday => '水',
            WeekType::Thursday => '木',
            WeekType::Friday => '金',
            WeekType::Saturday => '土',
            WeekType::Sunday => '日',
        };
    }
}

```

## 他のファイルでenumを使用したい場合
``` exampleController.php
<?php

namespace App\Http\Controllers;

use Packages\Domain\Models\WeekType;

class exampleController extends Controller
{
    public function show()
    {
        // Mondayを取得したい場合
        WeekType::Monday;

        // Mondayのnameを取得したい場合
        WeekType::Monday->name;

        // Mondayのvalueを取得したい場合
        WeekType::Monday->value;

        // 「月」を取得したい場合
        WeekType::Monday->label();

        // 4番目（木）の値を取得したい場合
        WeekType::from(4);

    }
}
```
## 表示内容
- 「月」を取得したい場合の結果
```
Packages\Domain\Models\WeekType {
    name: "Monday"
    value: 1
}
```

- Mondayのnameを取得したい場合の結果
```
Monday
```

- Mondayのvalueを取得したい場合の結果
```
1
```

- 「木」を取得したい場合の結果
```
月
```

- 4番目（木）の値を取得したい場合の結果
```
Packages\Domain\Models\WeekType {
    name: "Thursday"
    value: 4
}
```
PDCAサイクルとデータ整理技法

「「「「「
# ブレーンストーミング
複数人で自由に意見を言い合って、幅広いアイデアを引っ張り出す手法。

## ルール
### 批判厳禁
```人の発言を批判しない。```発言の機会を奪わない。

### 自由奔放
```型にとらわれない奇抜な発想```を重視する。

### 質より量
発言の```質にこだわらず、とにかくたくさんの意見やアイデア```を出し合う

### 結合改善
便乗意見は大歓迎。
```アイデア同士をくっつけることで、新しいアイデアが生まれたりする。```

## 気づき
気軽に会話するようにするのか。
そうすることで問題発見、問題改善をするのか。

# バズセッション
会議する人が多すぎるとこれもまた困る。
なので```全体を少人数のグループに分け、それぞれのグループごとに結論を出す```ようにする。

それぞれの```結論を持ち寄る```ことにより、全体としての結論を導きだす。

# KJ法(KJ: 川喜田　次郎）
事実を整理して、解決すべき問題を明快にするデータ整理技法。

収集した情報をカード化して、それらをグループ化することで問題点を浮かび上がらせる。
情報収集→カード作成→グルーピング→見出し作り→図解→文書化
## 気づき
カード化することでそれらをグループ化して、新たな結論を導き出すのか。

p６７７の図を見る。

# 決定表(デシジョンテーブル)
```複数の条件と、それによって決定づけられる行動を整理```するのに有効。

プログラミング時に内部の処理条件を整理した理、試験パターンを作ったりという用途に使われます。

### 図

https://shiftasia.com/ja/column/%E3%83%87%E3%82%B7%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%EF%BC%88%E6%B1%BA%E5%AE%9A%E8%A1%A8%EF%BC%89%E3%81%A8%E3%81%AF/
【Flutter】【Firebase】CocoaPods could not find compatible versions for pod "FirebaseFirestore": の解決法

Flutterの環境構築を進めていく上でFirebaseの追加作業をしている途中でビルドが通らない事態に。

```
[!] CocoaPods could not find compatible versions for pod "FirebaseFirestore":
  In Podfile:
    FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `9.3.0`)

    cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) was resolved to 3.4.6, which depends on
      Firebase/Firestore (= 9.4.0) was resolved to 9.4.0, which depends on
        FirebaseFirestore (~> 9.4.0)
```
どうやら元々のバージョンが古いためエラーが発生した模様。


```
pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '9.3.0'
```
Podfileにて
記述の通りにバージョンを［9.3.0］の部分を［9.4.0］に書き換えるとビルドが通るようになりました。
今回のようなエラーが出た場合は既存のバージョンを指定のバージョンにアップデートするとビルドが通るかもしれません。参考の程に。
Windowsでmoviepyを使用する際に、TextClipに日本語が描画されない問題

# 問題
Windowsでmoviepyを使用して動画を出力しても、日本語が映像に合成されない。
TextClipに設定したはずの日本語が描画されない。

# 解決方法
TextClip上で日本語を扱うには以下の2点を守る必要がある
 - 日本語に対応したフォントを指定する
 - フォントのパスにバックスラッシュ「\\」または「¥」が含まれる場合は、スラッシュ「/」に置き換える

フォントのパスが
```
C:\Users\UserName\Desktop\project_dir\font_file.otf
```
であれば、
```
C:/Users/UserName/Desktop/project_dir/font_file.otf
```
にする必要がある。

そのため、テキストクリップを生成する際は
```python
text_clip=TextClip(
        'テキスト',
        # バックスラッシュ(\)をスラッシュ(/)に置換して設定
        font="C:/Users/UserName/Desktop/project_dir/font_file.otf",
        color='white')
```
のように指定する必要がある
Azure Functions の Python をバージョンアップしてみました

## 概要

備忘録となります。Azure Functions の Linuxで使用されている Python のバージョンを 3.7 から 3.8 にバージョンアップしたときの手順です。

### 実行環境

macOS Monterey 12.3.1 
Azure CLI 2.34.1
Azure Functions Core Tools 4.0.3971

### 現在の Python のバージョン

```
$ az functionapp config show -n <Function名> -g <リソースグループ名> --query 'linuxFxVersion' -o tsv
PYTHON|3.7
```

### Python のバージョンアップ

```
az functionapp config set -n <Function名> -g <リソースグループ名> --linux-fx-version "Python|3.8"
```

確認

```
$ az functionapp config show -n <Function名> -g <リソースグループ名> --query 'linuxFxVersion' -o tsv
Python|3.8
```

無事、バージョンアップできました、、、

### 参考記事

以下の記事を参考にさせていただきました。
[Azure Functions ランタイム バージョンをターゲットにする方法](https://docs.microsoft.com/ja-jp/azure/azure-functions/set-runtime-version?tabs=azurecli)
エンジニア向けのおすすめの本

読んだおすすめの本
わかりやすい　JAVAオブジェクト指向　徹底解説　　　　　　　　　　　入門JavaScript                                           苦しんで覚えるC言語　　　　　　　　　　　　　　　　　　　　　　　　Python完全入門
【これは便利！】データ取得時、他テーブルの状態を見て取得するか判断する


#### 感動したコードがこちら！
userに関連する'address'テーブル内の
'country'カラムが「japan」、'area'カラムが「tokyo」の場合のuserを取得しています


```
$user_exist = User::whereHas('address', function ($query) {
    $query->where('country', 'japan')
        ->where('area', 'tokyo');
})->get();
```

### Usersテーブルの構造
```
id
name
age
email
```

### addressテーブルの構造
```
id
user_id
country
area
post_code
```

これで関連するデータを一度取得したり、```if文```や```foreach```で判断したりと、
長々としたコードと手間が省ける！！
ラッキー！！
【Svelte】これは便利！マークアップの中でawaitが使える

## 概要
Svelteはマークアップの中でawaitを使うことができる。
Promiseが成功した場合と失敗した場合の出し分けはそのままマークアップ側で制御することができる。


![ezgif-3-c605072fa0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94596/230d2881-ccd0-4a3e-b435-8a114ff22354.gif)


## 何がいいのか
- ロジック側に非同期処理の成功、失敗を用意しておく必要がなくなるので、コードを簡潔にまとめることができる。


## サンプルコード
https://svelte.dev/repl/062bb8ec024d4a058b81aba7ef824cfe?version=3.50.0
PokeAPIを利用してランダムにポケモンデータを取得する簡単な実装になっています。
非同期処理が完了するまでの期間は「...waiting」と表示されるので、マークアップ側でawaitを利用できていることが確認できます。

また、catchブロックを省略した書き方もできます。後ろの数行に記載させていただきました。

```javascript
<script>
	async function getRandomNumber() {
		const randomNumber = Math.floor( Math.random() * 150 ) + 1
		const res = await fetch(`https://pokeapi.co/api/v2/pokemon/` + randomNumber);
		const json = await res.json();
		await sleep(1000) // 非同期処理をわかりやすくするための待ち時間
		return json
	}
	
	let promise = getRandomNumber();

	function handleClick() {
		promise = getRandomNumber();
	}
	function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
	}
</script>

<button on:click={handleClick}>
	Pokemon gettin'!
</button>

{#await promise}
	<p>...waiting</p>
{:then pokemon}
	<p>The pokemon is {pokemon.name}</p>
	<p><img src={pokemon.sprites.front_default}/></p>
{:catch error}
	<p style="color: red">{error.message}</p>
{/await}

catchブロックを省略して記載することもできる
{#await promise then pokemon}
	<p>The pokemon is {pokemon.name}</p>
	<p><img src={pokemon.sprites.front_default}/></p>
{/await}
```



## まとめ
- Svelteではマークアップの中でawaitが使えるので、ロジックをスッキリさせることができる。
- catchブロックを省略して書くこともできる。
TypeScript入門で学んだこと(1) 文と式

# 文と式の概念
## TSにおける式と文とは
#### 式
- 値を生成する
- 変数にできる代入できる
- 例　```const nativeLanguage = "Japanese";```の```"Japanese"```の部分が式
#### 文 
- 処理単位であり、```;```で文と文を区切る。
- 例　```const nativeLanguage = "Japanese";```全体が文
### 式と文の違い
#### 式
- 実行結果が返ってくる
#### 文
- 実行結果が返ってこない

## ```console.log(nativeLanguage);```はどっち？
### 
- ```console.log(nativeLanguage);```自体は結果を返していないので文とみなして良い
- 厳密に言えば全ての関数が戻り値を返していて、返すものがない関数はundefinedを返す。
#### もう一歩踏み込んでみる
-  ```console.log(nativeLanguage);```は文であり、式文でもある
-  式文とは
    - ```式;```の形のもの。式を実行したいが、戻り値は必要ない時に使用する。
    - ```console.log(nativeLanguage);```も```console.log("My native language is " + nativeLanguage + ".");```も式文
勉強会に行こう！

# はじめに
[connpass](https://connpass.com)などで検索するとたくさんの勉強会が見つかります。
興味がある内容だったら参加してみませんか？
ここ３〜４年間の勉強会に参加しまくった感想を書き殴ってみます。
(リモートの話とオフラインの話がゴチャゴチャになっています。:bow_tone1:)


# 時代は変わった
ここ数年で全国でリモート開催の勉強会が増えました。
今まで東京に行かないと参加できなかった、高レベルな勉強会に地方から参加できるようになりました。
地方在住だと交通費はかかるし、会社は休まないといけないし...大変だったんです！
ありがたい時代になったものです。
オフライン勉強会は *「ここだけの話」* が聞けたりするので、それはそれで良いのですが。

# 勉強会に参加する利点
## 勉強になる
勉強会なので当たり前ですが、ある分野に関する知識、スキルや裏ワザ、黒魔術が身に付きます。
CI/CDなど他社の取り組みや成功例も大変参考になります。
(ためになったよ〜)

職場に帰ったあとでメンバーに内容をフィードバック(オウム返し)してあげると
*「こいつ...できる奴かもしれん」* と職場内の立ち位置が確立していったような気もします。



## 技術トレンドを感じることができる
「SwiftUIって導入してもいいの？」
「UIKitってどうなるの？」
「Flutterって何？」
「どのアーキテクチャがイケてるの？」
... ... などなど
技術選定を行うときに悩みは尽きないと思います。
どの技術が今後伸びてきそうか？今導入しても問題無さそうか？
勉強会で業界の共通認識を感じることができます。



## 各社のつよつよエンジニアを知ることができる
勉強会に参加していると *「甲斐国に武田信玄あり！:racehorse:」* みたいに、どの企業にどんな **つよつよエンジニア** 様がいらっしゃるのか分かるようになってきます。
まるで戦国武将がそろい踏みの様相です。テンション上がります。:smile:
TwitterやGitHubでフォローしておくと、「この人が言うんだから間違いないやろ」と**信頼できる情報ソース**として活用できます。(裏取りはしましょう)

### 勉強の仕方が勉強できる
**つよつよエンジニア** 様に「〜について勉強したいのですが」と相談すると、参考書籍、情報ソースやコツを教えていただけます。(ありがたや:clap:)

### 懇親会でお知り合いになれるかも
勉強会の後で懇親会が開催されることも少なくありません。
コミュ力が必要ですが、**つよつよエンジニア** 様とお知り合いになれるチャンスがあるかもしれません。

### 転職動向が興味深い
Twitterを見ていると **つよつよエンジニア** 様の転職のお知らせが流れてくることがあります。
どこに活躍の場を移しているのか? どの企業が勢いがあるのか? どんな点が魅力なのか? といった動向も興味深かったりします。

## 言葉が通じる仲間がいるという安心感がある
「ある技術テーマについて議論がやりたい！」と思っていても、エンジニアがいない職場や、いてもジュニアレベルでいらっしゃると、 **言葉が通じない** 疎外感を感じることもあります。
相手のレベルに合わせて専門用語を変換してコミュニケーションするのも長期間やっていると、もどかしくてストレスを感じます。
そんな時に勉強会に参加したら、ストレートに言葉が通じる人たちがたくさんいました！
久しぶりに海外から祖国へ帰ってきて母国語を聞いている感覚を味わうことができます。



## プレゼンが参考になる
発表はほぼPowerPointやKeynoteを使ったプレゼンです。
「こんな構成のスライドにすればいいのか！」
「この人はスライドがカッコイイなぁ」
「この人は調査力がハンパないなぁ」など
自分がプレゼンするときの参考になるポイントが何かしら見つかるはずです。




## LAPRASのポイントが上がる
[LAPRAS](https://lapras.com)をやっている方限定。
[connpass](https://connpass.com)とリンクしていると勉強会参加後にポイントがちょびっと上がります。
塵も積もれば山となるで継続していると誰かの目にとまるかもしれません。



# 勉強会の闇
あくまで「聞いた話」なのですが。:relaxed:

## 職場のアレ:sake:
飲みニケーションを重視する職場だった場合...
勉強会参加のために職場の飲み会を欠席すると **「あいつはどうして参加しないんだ！:japanese_goblin:」**  付き合いが悪い奴だというレッテルを貼られるかもしれません。
ハラスメント事案にならないように都会のお土産を配ってご機嫌を取りましょう。:cookie:
定時後-勉強会開始まで(18:00-18:30)の超時短飲み会という案もあったりなかったり。


## 正体を明かすな:spy:
社員が外部との接点を持つことを嫌がる職場だった場合...
「企業秘密を漏らすのではないか？」「企業の見解と異なる発言をするのではないか？」と心配されることがあるかもしれません。
勉強会に参加していることを上司や同僚にカミングアウトするのはタイミングを見計らった方がいいかもしれません。

## 転職したくなるかも:footprints:
勉強会に何度も参加していると自分の職場がどの程度のレベルなのか?だんだん分かってくるようになります。
自分の職場を世界一のレベルに引っ張って行くのは、それはそれで大変チャレンジングな事なのですが、現時点で世界一の環境に身を置いた方が手っ取り早く幸せになれるかも？と思えてきちゃったりするかもしれません。(「世界一の環境」は人それぞれです。:relaxed:)


# Next Step
## 勉強会に登壇しよう！
世の中はGive and Takeと言われております。
Takeばっかりしてないで少しはGiveしないとバランスが取れません。
「そうだ、何か発表しよう！」 (そう思い続けて早３年...)
楽天サマーインターン「二子玉川夏の陣2022」に参加しました！

今年の8月22日~26日までの5日間オンラインで実施された株式会社楽天のサマーインターン[「二子玉川夏の陣2022」](https://commerce-engineer.rakuten.careers/careers/graduates/internship/summer-short2022?_ga=2.2220848.1285067020.1661502999-275598259.1647520769)に参加しました。本記事では、来年以降当インターンに参加する方々のために、インターン参加に応募してからこの5日間を乗り切るまでの振り返りを書いていこうと思います。

## 選考会通過まで
私が参加した「新規プロトタイプ開発コース」ではエントリーシート(ES)提出・外部サービスを利用したコーディングテスト・オンラインでの最終面接に参加する必要がありました。

ESには私がこれまでにFlutterでモバイルアプリを複数人で開発した経験や、大学院での研究、学会で書いた論文について事細かに記述して提出しました。コーディングテストは制限時間もあるので相当身構えて臨みましたが、想像していたよりかなり簡単だったように思えます。高専・大学の情報科で真面目にプログラミングをやっていれば突破できるかなといった感じです。

## 概要
当インターンはハッカソンのような形式で、5日間の日程で

- 4~6人程度のチームを作る
- 初日に大まかなテーマが掲示される
- テーマに沿って開発するプロダクトの方向性をチームで検討
- 実装の方法やメンバーの役割分担などを決定
- 開発
- 最終日にプレゼン **（英語で発表）**

を行うという流れになります。スケジュールは非常にタイトで、開発にかけられる時間は**1日半**程度です。わずかこれだけの時間でデモを動かせるレベルまで持ってこなければなりません。

## 開発の進め方
開発までにメンバーの中でこれまでの開発経験や得意な言語・フレームワークを話して、開発の方針を決めていきました。といっても私がいたグループはWebやモバイル向けのアプリ開発や複数人での開発に明るい人は少なく、バックエンドを用意せずともアプリ単体で完結するシステムを構想していたため、私が得意なFlutterを使ったiOS/Androidアプリ開発を、全員で使い方を覚えるところからやっていこうということになりました。特に、1日半という開発期間の短さから、そこまで大規模なシステムは(他のチームも含めて)作れないだろうという予想をしていました。

[こちらのサイト](https://www.flutter-study.dev/introduction/about-flutter)のTo-Doリスト作成手順を残りのメンバーに勉強してもらいながら、私が画面遷移の流れやProvider（[Riverpod](https://riverpod.dev/ja/)を導入すべきなんでしょうけど、ネット上の情報がまだないのと初学者には複雑すぎるので昔ながらのProviderを選択）による変数の管理などの大枠を考え、各画面ごとの開発をそれぞれのメンバーに担当していただくということにしました。最終的にこんな感じのシャンプやマスク、食料品みたいな消耗品の買い替え時期を管理するアプリ「reBUYnder」ができました。↓

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834675/1e88a3e1-8668-1206-f97a-7013726c55f3.jpeg" width=30%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834675/d6068045-655b-bbc7-89a4-3a4998178588.jpeg" width=30%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/834675/c05232ae-a5c3-6bee-06bb-91c2babe3fed.jpeg" width=31.45%>

## 振り返って
インターンが終わってから改めて自分達の仕事を振り返ってみると、最善を尽くせたとは言えないというのが正直なところでした。理由を挙げると

- 単独のモバイルアプリで勝負していたのは我々くらいで、他の多くのチームではもっと複雑なシステムを開発していた。 
- 他チームはフロントエンド、バックエンド、その他（UIなど）の役割をそれぞれ得意な人が1〜2人で担当して回していた。また、それぞれ楽天レシピAPIを使ったり独自APIの実装、画像認識モデルのフレームワークを利用したり経路探索アルゴリズムを独自で作ったりと、**各々のチームごとに持てる技術を最大限活かし、プロダクトにインパクトを与えていた**。
- プロダクトの方向性を詰めるのが足りず、**作りたいものの具体的な新規性、独自性、面白さのアピールが足りていなかった。**
- **最終発表のスライドのクオリティもかなり力が入れられていた。** パッと見の可読性や全体的な統一感を保つのはもちろん、上位のチームでは**プロダクトのロゴやチームメンバーのZoomの背景まで作ったり**と、細部までこだわって作り込まれていた。一方我々はマークダウンでスライドを作れるツールを使って必要最低限のクオリティでスライドを作ってしまっていた。

という感じです。私は過去にハッカソンに参加した経験があり、自分達が作っているもののクオリティの低さは気にかかってはいたものの、集団開発にもハッカソンにも不慣れな他のメンバーに負担をかけたくないと思って口出しは控えていました。しかし今になって考えてみると、多少なりとも経験のある私が色々と先導すべきだったなと少し後悔しています。

## 最後に
本記事では楽天夏インターン2022の体験談を語ってきました。来年以降に参加する方には、ぜひ参考にしていただきたいです。また、無事選考に通って本番でいい結果を残したいと思っている方は、
- **プロダクトの方向性、新規性、独自性、既存サービスと比べた優位性、面白さ、...などを明確にする。**
- **チームメンバーの技術と人的リソースを余すことなく利用し(FigmaやTrelloなどのツールを有効に活用するのがおすすめ)、限られた時間で出来る限りいいものを作る。**
- **発表スライドも可読性とデザイン性、内容のわかりやすさをよくすることに注力し、発表内容を作り込む。**

ことを目指してみるといいと思います。ぜひぜひ頑張ってみてください！
そのif文もっと見やすくしてみません？

# 基本
```
if($priceA > $price B){
    $message = 'Aの方が高い';
}else{
    #message = 'Bと同じかBの方が高い';
}
```
というコードがあったら
```
$price = $price > $price 
    ? 'Aの方が高い'
    : 'Bと同じかBの方が高い';
```
と書けるよというのがこのお話の基本
（?とか:を先頭にしておくと、三項演算子の処理が続くよ、とわかるのでおすすめ）

循環複雑度が下がるので不具合の発生度が下がるはず

# 応用
基本があれば応用があるのが世の習い
もっと複雑な処理でもこんなふうに綺麗になる
## 汚いif文
```

if ($paymentTotal > $salesTotal) {
            $differenceBetweenPaymentsAndSales = $paymentTotal - $salesTotal;
            if ($price1) {
                $result1 -= $differenceBetweenPaymentsAndSales;
                if ($differenceBetweenPaymentsAndSales > $price1) {
                    $result2 += $differenceBetweenPaymentsAndSales - $price1;
                }
            } else {
                $result2 += $differenceBetweenPaymentsAndSales;
            }
        } elseif ($salesTotal > $paymentTotal) {
            $differenceBetweenSalesAndPayments = $salesTotal - $paymentTotal;
            if ($price2) {
                $result2 -= $differenceBetweenSalesAndPayments;
                if ($differenceBetweenSalesAndPayments > $price2) {
                    $result1 += $differenceBetweenSalesAndPayments - $price2;
                }
            } else {
                $result1 += $differenceBetweenSalesAndPayments;
            }
        }
return [
    'result1' => $result1,
    'result2' => $result2
];
```
読む気も失せたら、あなたの感覚は正しい
これを引き継いで改修する人は苦労することが明白
このコードを書いた人も、仕様を必死に再現しようとしただけ、きっと誰も悪くない😪

## 綺麗なternary
```
return $paymentTotal > $salesTotal 
        ?  [
            'result1' => $price1 
                ? - $differenceBetweenPaymentsAndSales
                : 0,
            'result2' => $price1 
                ? max(0, $differenceBetweenPaymentsAndSales - $price1)
                : $differenceBetweenPaymentsAndSales
        ] 
        : [
            'result1' => $price2 
                ? -$differenceBetweenSalesAndPayments 
                : 0,
            'result2' => $price2 
                ? max(0, $differenceBetweenSalesAndPayments - $price2) 
                : $differenceBetweenSalesAndPayments
        ];
```

行数も減ってだいぶ良くなったのでは無いでしょうかね
ちなみにmax(), min()を使うとternary自体の個数も減らせるんです。これはまた今度。

（一番いいのは、きちんとモデリングしてクラス切ることだということは忘れないで生きていこ
1dayインターンと3dayインターンを終えて


こんにちは,こんばんは,現在修士課程1年生の堀内です.
初投稿になりますがお手柔らかにお願いします.
今回の記事ではそれぞれのインターンで得られた考えなどを記録に残しておきたいと思い,記してます.

#### 参加させていただいたインターン
以下の２つになります
- アプリケーション系のYさん: バックエンドの1dayインターン
- 広告代理系Iさん: フルスタックチックなチーム開発3dayインターン



#### アプリケーション系のYさん:バックエンドの1dayインターン

すごく楽しかったです.3人チームで組み,事前に上司が作成した要件定義書を完成させるというシナリオでやりました
DBのテーブル作成,POST・GETメソッドのResponseの構成の定義など,シーケンス図の作成を行いました.

###### 学び
- 途中まで作成されたものなので,解釈が無限大(実際,他のチームと比べてもDBの構成に被りがなかった)
- 自分は学ぶことを楽しんでる人間だと思いました.DBの構成などはMermaid(?)という言語で書いたのですが初めて書くものだったので楽しかったです.
- 自分の情報系の知識の低さ:自分はアルゴリズムとか好きだったのでアプリとかそんなに作らなかったのですが,アプリを作るのはたくさんの技術があるなぁ...全然知識ないわ...ワクワク!(~~アーニャ~~)

#### 広告代理系Iさん: フルスタックなチーム開発3dayインターン
こちらも3日間通して楽しかったです.チームは5人1組でした.
**社員としてデータを用いて旅行会社が役に立ちそうなアプリやツールを作ってください**.という課題でした
みんなで最後の数分までコード書いてました.
自分らのチームは天気で変化する旅行プランの場所提示アプリを作りました.
大阪城行きたいのに雨降っちゃたー！,あべのハルカスを薦める.みたいなイメージです.

###### 学び
- チームで開発する楽しさ:すごく楽しかった
- 要件定義など全て0からだったので大変だったけど意見を出し合う過程も楽しかった.(その人の考えなども知れるので)
- コードの保守管理の大切さ: 他人のコード初見は大変だと思った.リーダブルコードやミノ駆動さんの本などの大切さが分かりました
- 顧客が求めているものを作っても,それが会社の利益になるのか
- また逆に顧客が求めているものを汲み取って作れているのか.コミュニケーションって大事だなと...
- コード書くの楽しい


エラーなどは幾千度と見た気がするので「大体この辺が悪いのかな？」で解決したのが運良かったです.
初めてのチーム開発は「周りに迷惑かけないかな...」と不安でした笑


#### まとめ
２つのインターンはすごくいい経験になったと思います.特にお客さんのことを考えてツールやアプリを作ることが重要と思いました.
これは実務経験ある人は一段落違うわ・・・と思いましたね.(学部1年の時にやればよかった...)
もしインターンや実務経験がつめる人は**どしどし**つみましょう.
プログラミングに興味ある人,学部などでプログラミングを学んでいる人は恐れずに応募しましょう.
面接やコード試験もいい経験だと思います.
最後まで読んでいただきましてありがとうございます.
メモアプリ開発メモ①　「哲学的疑問の管理と可視化」をコンセプトに

# 企画内容と発想に至る経緯
(↓アプリのイメージ)
![model_tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822374/ced83757-4c9d-0877-9e14-e25c9be730a4.png)

どんな疑問であれ、つきつめて考えていくときりがないくらい派生した疑問が湧いてくることがある。**一つの問いからねずみ算式に湧いてくる問い達を(樹形図などの)見やすい形で整理したメモとして残しておきたい。** そんな風に最近感じる。　では、webアプリのアイデアにしてしまおう。という思い付きを文章化したのが今回の記事である。　
例えば、以下のように疑問というものは得てして更なる疑問を呼びこみ、連鎖を成すもので。


|派生する疑問の例|
|:-:|
|  1. 出発点の問い「なぜ勉強せねばならんのか」 |
|  2. 「勉強が有用だとしても、その効用は勉強以外から得られないのだろうか」 |
|  3. 「そもそも誰がどんな時に勉強をせよ、とけしかけるのか」 |
|  4. 「人間、そもそも生きていれば常に多少なりとも勉強している状態にあるのではないか」 |
| 5. 「勉強は為すべき行為だと結論が出たとしても、そもそもなぜ倫理的に正しくて、目的に適ったことをしなければならないのか」  |
|  6. 「今日の夜には寿命がきてしまう人にとって勉強とはなんだろう」 |
|  7. 「そもそもこんな議論なんてやめて、黙って勉強を始めた方がいいのではないか（実行したあとにこそ勉強の真価がつかめるのではないか）」 |
|  8. 「"勉強より大事なことがある"は勉強しない理由として妥当か」 |
| 9. 「社会に居る全員が勉強しなくても生きていける状況とはどんな状況?」  |



　そこで思い至る。これをアプリケーションとして作ってみてはどうか、と。うむ。これは最近習ったばかりのToDoメモアプリ作りの応用問題としても有用そうだぞ、と。
　樹形図というイメージに準えて名づけるならアプリケーションの名前は**Forestion(Forest for the Question/問いのための森)** といった所か。ひとまず仮名も決まったところで、具体的にどんなサービスを実装できるか妄想をつらつらと書き連ねてみます。
![messageImage_1662211418388.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822374/143a52c5-a5a4-f69e-560b-2a70b0b8ce64.jpeg)
(↑まずはモチベを高めるためにも仮のイメージでejsファイルを書いてみる。さぁ始めるぞ～、と。)

# 漠とした構想等
・一つの問いから生じた数々の問いを、樹形図状のグラフで表現する。枝別れたした問いを一望できれば便利だし、抱えきれないほどの問いも記録できるので、次々に問いを思いつくことに抵抗感がなくなる。

・また、哲学カフェや哲学対話といったイベントの中で出てきた「良い問い」は、アーカイブされずにローカルなグループの中で共有されておわり、となってしまう事が多く実に勿体ない。問いは島嶼ならず。他の問いとのコラボレーションの中で真価を発揮する問いだってあるはずだ。本アプリはそんな＜**問い同士が孤立している現状＞への処方箋** たりうる。

・他のユーザーの問いからも枝を延ばしてリレーできるような機能があれば、いよいよ問いを通した生態系=森がアプリの中でできていくだろう。

・一方で、マインドマップ等の情報整理サービスとの差別化として、**「情報を見通しの利く形に刈りそろえるのでなく、ひたすらに繁茂した問いの森の中でさまよう」** という「探索／迷い込む」を軸にした使用体験も打ちだしてみてはどうか。個人の情報管理ツールとして使用可能であるのは勿論のこと。しかし同時に、色んな人の問い同士が見通しのきかない複雑なつながりで造り上げる「限定された視界」の中で先もわからぬまま遊歩するという楽しみ方もできるようにしたい。

・基本的に「問いで生態系を作る」というコンセプトなので問いに対して「一つの答え」を出してしまうことはせず、「その問いの答えは○○だ」ではなく、「その問いの答えは○○ではないか」といったオープンエンドな問いの形で枝をのばすような仕組みで設計する。

・また「森」というメタファーを広げれば色んな派生機能も作れそうだ。
   問いの葉(生じた疑問のメモ)を鳥や蟻が咥えて、ランダムに他のユーザーのマイページのもとへ運んでいくようにすれば意外性のある問いとの出会い、セレンディピティも期待できる。
他にも、かつて自分が抱いた問いについて、それについて出した答えが不本意なものであれば「腐葉土」として提供し、それがアーカイブとなって何かに役に立つといった副次的な機能も作れる。
・「あなたの問いを森に委ねてみませんか？」といったような謳い文句もつけられるだろう。つまり、自分の抱えるもやもやを具体的な問いとして形にして共有することがユーザーに一種のカタルシスを与えるといった体験も期待できる(設計次第ではあるが)。


# おおよその機能要件
・会員データの入力を受け付け、ログイン操作ができる。

・ユーザーからインプットされたメモをデータベースへ登録する(まずは単純で列数の少ないSQLで実現し、少しずつ改良していく)。

・タグ等のメタデータに応じて問いの葉メモのソートや検索等ができる(JSON形式でデータを返す)。

・他のユーザーの問いを起点としてリレーをつなげることができる(枝を育てるための蕾を他のユーザーの木に植える、といった感じ。　こういう機能の実装はまだ自分の勉強が及んでいない範囲なので工夫と勉強が必要だ）。

・他のユーザーが生やした問いの葉が、ランダムに(完全なランダム？それ以外の選択肢も？）運ばれてくるようにする（インタフェースとして鳥や蟻といった森の生物のビジュアルを用いる）。セレンディピティ。

・表示を樹形図とリスト形式の二種類で切り替え表示ができるようにする。
・自分が育てている木(データベース)を他のユーザーに公開するかどうかの切り替えができるようにする(庭と森という二つのモードで切り替えられるようにする)。

# 道は長い･･･
さぁ次回からは具体的にexpress.jsを使って少しずつアプリを作っていこうではないか、という所で今回は終了。まだまだ稚拙な部分の残る杜撰きわまるプランではあるが、出発点としては(ギリギリ)十分だろう。
ドン・キホーテじみた徒労に終わる可能性はあるが、果たして。


それでは　GOODNIGHT WORLD!
JS 勉強　基礎知識

## 型変換
- 暗黙的型変換
- なんのため：データ型を意識しなくてもプログラムが書けるように
- if文の条件式→データを真偽に変換
## 真偽値の判定
- falseになる値
・false
・On
・underfined
・NaN
・null
・0
・""（空文字）
AtCoder ABC267 C問題 詳解

# AtCoder ABC267 C問題 詳解
ABC267 C問題の公式解説が物足りなかったため、備忘録の意味も込めて詳解を投稿します。

### 問題
> ```math
> 長さNの整数列A=(A_{1},A_{2},...,A_{N})が与えられます。\\
> 長さMのAの連続部分列B=(B_{1},B_{2},...,B_{M})に対する、
> \sum_{i=1}^{M}i×B_{i}
> の最大値を求めてください。
> ```
すなわち、
```math
f(x)=1×A_{x}+2×A_{x+1}+\dots+M×A_{x+M-1}, (1\leq x\leq N-M+1)\\
```
の最大値を求める問題です。

### 詳解
##### 総当たりの場合
まず、総当たりを考えます。
$f(1)$から$f(N-M+1)$を全て計算した後、最大値を求めればよいです。
このとき、$f(x)$を求めるのに$M(\leq N)$回加算を行い、その操作を$(N-M+1)$回行うので計算量は

```math
O(M)×O(N-M+1)\leq O(N)×O(N-M+1) = O(N^2)
```
となります。$O(N^2)$より当然`TLE`となるので工夫が必要です。

##### 工夫
`TLE`となる原因は、$O(N)$の計算を繰り返すことです。
これを回避するために$f(x+1)$を$f(x)$を用いて求められるようにする必要があります。
そのために次の工夫を考えます。
```math
g(x)=A_{x}+A_{x+1}+\dots+A_{x+M-1}, h(x)=M×A_{x+M-1}
```
とすると
```math
f(2)=f(1)-g(1)+h(1)\\
f(3)=f(2)-g(2)+h(2)\\
\vdots\\
f(x+1)=f(x)-g(x)+h(x)
```
式よりも図として見る方が理解しやすいと思います。
![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627757/f6bff0d1-26b3-70c7-450a-8d0e54b16ed9.jpeg)
![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627757/852d39a9-2658-ba03-f21f-ed8fa80b5261.jpeg)
さらに
```math
g(2)=g(1)-A_{1}+A_{1+M}\\
g(3)=g(2)-A_{2}+A_{2+M}\\
\vdots\\
g(x+1)=g(x)-A_{x-1}+A_{x+M}
```
より、$f(x),g(x)$は$f(1),g(1)$さえ求めれば以降は$O(1)$で求められることになります。
なお、$h(x)$はただの乗算なのでこちらも計算量は$O(1)$です。
したがって、最終的な計算量は
```math
f(1)=O(M)\leq O(N)\\
g(1)=O(M)\leq O(N)\\
```
となります。

### 参照
[C - Index × A(Continuous ver.)](https://atcoder.jp/contests/abc267/tasks/abc267_c)
【Angular】コンポーネント間でのデータの受け渡し方法

# はじめに
今回はAngularでは使用頻度が高いコンポーネント間でのデータの受け渡し方法についてまとめました。
※まとめた後に気が付きましたが公式に詳細が載っていました😅
　さらっと見たい方は私のページを、詳細を知りたい方は公式のページをご確認ください。

# バージョン
- Angular: 9.1.11
バージョンの確認方法については過去記事に記載しております。

https://qiita.com/Shogongon/items/81c8a26028c82892a5c4#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3

# 結論
## 公式
[Angular：ディレクティブとコンポーネントの親子間でのデータ共有](https://angular.jp/guide/inputs-outputs)

## 親から子へデータを渡す方法
`@input`を使用して親コンポーネントから子コンポーネントに値を渡しています。

- 親コンポーネント
```tsx:parent.component.ts
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-parent',
  templateUrl: './parent.component.html'
})
export class ParentComponent implements OnInit
{
  parentData : string = "";

  constructor() { }

  ngOnInit() {
    this.parentData = "child.componentへ渡すデータ";
  }
}
```
```html:parent.component.html
<div>
  <app-child [childData]="parentData"></app-child>
<div>
```

- 子コンポーネント
```tsx:child.component.ts
import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html'
})
export class ChildComponent implements OnInit
{
  @Input() childData: string = null;

  constructor() { }

  ngOnInit() {
  }
}
```
```html:child.component.html
<div>{{childData}}</div>
```

## 子から親へデータを渡す方法
`@output`と`EventEmitter`を使用して、親コンポーネントに値を渡します。

- 親コンポーネント
```tsx:parent.component.ts
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-parent',
  templateUrl: './parent.component.html'
})
export class ParentComponent implements OnInit
{
  constructor() { }

  ngOnInit() {
  }

  onReceiveData(event) {
    console.log(event); // 子データ
  }
}
```
```html:parent.component.html
<div>
  <!-- eventオブジェクトでデータが渡される -->
  <app-child (childData)="onReceiveData($event)"></app-child>
<div>
```

- 子コンポーネント
```tsx:child.component.ts
import { Component, OnInit, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html'
})
export class ChildComponent implements OnInit
{
  @Output() childData = new EventEmitter<string>();

  constructor() { }

  ngOnInit() {
  }

  submitData() {
    this.childData.emit("子データ");
  }
}
```
```html:child.component.html
<div>
  <button (click)="submitData()">親コンポーネントへデータを渡す</button>
</div>
```

# 参考文献
[Angular：ディレクティブとコンポーネントの親子間でのデータ共有](https://angular.jp/guide/inputs-outputs)
[Angular：Input](https://angular.jp/api/core/Input)
[Angular：Output](https://angular.jp/api/core/Output)
[Angular：EventEmitter](https://angular.jp/api/core/EventEmitter)
[Angular：$eventオブジェクトからユーザー入力を取得する](https://angular.jp/guide/user-input#event%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8B%E3%82%89%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%85%A5%E5%8A%9B%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)
【文学は大人の教養！】初心者が青空文庫検索Line Botを作った

# 作品名を入力すると青空文庫のURLを送ってくれるLine Botを作ってみた

はじめまして。
今回、[LINE Developers](https://developers.line.biz/en/)と[Make](https://www.make.com/en/login)を使用して、
作品名を入力すると青空文庫のリンクを回答するLINE Botをノーコードで作成してみました。

まずは出来上がりがこちら。
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/76414796-7658-8ee7-950c-833fe41c42a7.gif)


「走れメロス」とLINEに入力すると「走れメロス」が掲載された[青空文庫のURL](https://www.aozora.gr.jp/cards/000035/files/1567_14913.html)を返します。
ついでにおしゃれカフェの紹介記事も。

文系のくせに国語の授業が苦手で、ほとんどの文学に触れないまま社会人になっていました。
「銀河鉄道の夜」「人間失格」「吾輩は猫である」etc
タイトルは知っているけど、読んだことのない名作は数知れず。

特にこのままじゃいけない！と大昔に買った「銀河鉄道の夜」は、
積読として今も実家の本棚の飾りになっており、実家に帰るたびに罪悪感を覚えます…

今更、教科書に載っているような有名作品を本屋のレジに持っていくのは恥ずかしい。
そして積読だらけのkindleライブラリに更に追加するのも抵抗がある。
そんな自分やあなたに贈りたい。LINEで簡単青空文庫検索！
<B>教養あふれる素敵な大人になるのは、今からでも遅くないはずです！</B>

ということで、
プログラミング歴０年の私でも１日程度で完成させることができたので、
この記事で紹介していきます。

:::note info
[青空文庫](https://www.aozora.gr.jp/)とは、パブリックドメイン化した作品及び著者が許諾した作品を、テキストまたはXHTMLでインターネット上に電子掲載しているウェブサイトである。
:::

# Makeの使用モジュール

今回Makeで使用したモジュールとシナリオは以下の通り。

![スクリーンショット 2022-09-04 15.29.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/d397be0a-b864-5f3f-8a24-b3615ed3cdf6.png)

+ LINE: Watch Event
+ HTTP: Make a Request
+ JSON: Parse json
+ LINE: Send a Broadcast Message


# シナリオ作成のポイント



1\. 青空文庫のデータ検索にあたっては、青空文庫APIサーバーをお借りしました。

https://qiita.com/ksato9700/items/626cc82c007ba8337034

<br></br>
2\.追加パラメーター「title」で作品名のフィルタをかけることができるので、
 Query Stringで「title」を指定し、LINEで入力されたテキストで作品名検索できるよう設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/584f6284-8332-7a64-ea81-e4cb74b2b598.png)

<br></br>
3\. 「 Send a Broadcast Message」のモジュールで以下をアウトプットするよう設定。
+ 作者名
+ 作品名
+ HTMLのURL

ここの処理でLINEのアウトプットは正常であるにも関わらず、エラーでシナリオが停止する事象が稀に発生。
「add error handler」からエラーを無視して成功処理とするエラーハンドリング「Ignore」を設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/c1c59549-27d5-deff-1b94-bd0f0b184af9.png)


<br></br>
4\. 「分からない」とLINEに入力した場合のみ、青空文庫の総合インデックスを回答するよう分岐を設定。
ついでに読書時におすすめなアロマ紹介した記事をレコメンドしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811387/2d94085d-63fe-8b0d-2ccc-811632fdbfbe.png)

# さいごに

これで、学生の頃、まったく文学に触れずに過ごしてしまった後悔を青空文庫検索Botで断ち切れるかも？

作品のURLのついでにおすすめのカフェやアロマを紹介した記事をレコメンドするようにしています。
（本当は現在位置を取得し近くのカフェを表示するAPIを追加したかったが不特定多数が使用する前提のBotでは合わなさそうなので諦めた。
いいものがあればぜひ教えていただきたいです。）
ここを自社が作成した記事に変えるなどして業務に転用することも可能だと感じました。
IAMユーザーに有効期限を設定する

## 経緯
社内で使用しているAWSのIAMユーザーに対して、使用者の契約期間に紐づいた有効期限を設定する必要がでてきたため、IAMポリシーにて実装したメモ。

## 前提
・社内ADを使用できないため、AWS内での実装が必要。
・使用人数が多くないこともあり、簡単にあまり労力を費やさずに実装したい。

## どう対応したか
新規でIAMポリシーを作成しIAMグループに紐づけて対応。
既に複数のIAMポリシーを適用しているため、指定した日時を超えると与えている権限もすべて拒否されるように実装。
(IAMポリシーはAllowよりもDenyが優先されるため。)

## 実際のJSON
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "DateGreaterThan": {"aws:CurrentTime": "2022-09-30T15:00:00Z"}
            }
        }
    ]
}
```

日時の部分はUTCなので、-9時間してあげる必要があります。
このポリシーであれば、2022年10月1日0時からは使用できません。

## 参考にしたサイト

[IAMユーザに有効期限を設定することはできますか?](https://dev.classmethod.jp/articles/iam_add_limit/)
→安定のクラメゾさんの記事。
[AWS: 日付と時刻に基づいてアクセスを許可します](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_aws-dates.html)
→AWS公式ドキュメント。

## 独り言
社内ADを使わせてほしい。。
運用を考えるとベストな手段ではなく、あくまで応急処置的な対応かと…
[AWS SAM] 環境変数に AWS_DEFAULT_REGION を設定しようとしてエラー発生

# エラーメッセージ

> Resource handler returned message: "Lambda was unable to configure your environment variables because the environment variables you have provided contains reserved keys that are currently not supported for modification. Reserved keys used in this request: AWS_DEFAULT_REGION (Service: Lambda, Status Code: 400, ... , HandlerErrorCode: InvalidRequest)

「`AWS_DEFAULT_REGION`という環境変数は、予約済み(reserved)なので、現在は書き換えられないよ。」と仰っている。


# 問題の箇所

```yaml:template.yaml
...

Globals:
  Function:
    Timeout: 3
    MemorySize: 256
    Tracing: Active
    Environment:
      Variables:
        AWS_DEFAULT_REGION: us-east-1  # <-- ココ
  Api:
    TracingEnabled: True

...
```

人によって記載箇所は違うと思うが、

```yaml
    Environment:
      Variables:
        AWS_DEFAULT_REGION: ~~~~~
```

という記載がどこかにあれば、冒頭に記載したエラーが発生すると思われる。


# 対処

以下の記事を見てわかったのだけど、`AWS_DEFAULT_REGION`は、自分でわざわざ設定しなくても自動でAWSが設定してくれる。

https://qiita.com/sekitaka_1214/items/f5365451f6e703058933

なので、

```yaml
    Environment:
      Variables:
        AWS_DEFAULT_REGION: ~~~~~
```

は削除してOK(´^ω^｀)気付かなかった


# 関連記事

https://qiita.com/yahsan2/items/90fa7abd3c303935870b

本記事と、ちょっと似てる話。
Splunk: ルックアップで複数行ヒット時に1行だけ抽出する


###### 実施環境： Splunk Free 8.2.2

### 0. 概要

 Splunk のルックアップ処理で複数行がヒットした場合、デフォルトの設定ではヒットしたすべての行が抽出されます。
ただ、実務上は1行だけ抽出したい場合も多いです。
そのような場合、ルックアップ定義の設定を変更すると実現可能です。

### 1. デフォルト設定

以下のような CSV 「 test_hit.csv 」をルックアップテーブルとして登録し、それを「 test_hit 」としてルックアップ定義にします。

| ID | NAME |
|-----:|-----:|
| A01 | BBB |
| A01 | AAA |
| A01 | CCC |

![WS000226.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d455b4c9-3142-63b8-f20f-7dc8914aa878.jpeg "test_hit.csv")

この場合、以下のようにマルチバリューという形式ですべてのヒット行が抽出されます。

```Splunk:Splunk
| makeresults count=1
| eval ID = "A01"
| lookup test_hit ID OUTPUT NAME
```

![WS000227.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/9ce92c4c-4b1f-1751-20d2-ed7ca61906a0.jpeg "test_hit1")

マルチバリュー自体は mvexpand コマンドを使用することで別々の行に分割可能です。

```Splunk:Splunk
| makeresults count=1
| eval ID = "A01"
| lookup test_hit ID OUTPUT NAME
| mvexpand NAME
```

![WS000228.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/109fbfea-ba6e-a6bc-68ab-3e9f45076c69.jpeg "test_hit2")

### 2. join を使用する方法

ただ、この複数ヒットの場合に、全行でなく1行だけ抽出したい場合もあります。
一応、以下のように join コマンドを使用して1行だけ抽出を実現することも可能ですが、性能的にはあまりよい方法ではありません。

```Splunk:Splunk
| makeresults count=1
| eval ID = "A01"
| join ID
    [
      | inputlookup test_hit.csv
    ]
```

![WS000229.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8be19493-7a1f-b474-6cd0-7b9001cbf249.jpeg "join")

では、どうすればよいでしょうか。

### 3. ルックアップ定義の設定を変更する方法

実は、ルックアップ定義の設定を変更するだけで1行だけ抽出を実現することが可能です。
まず、ルックアップ定義の設定画面で「詳細オプション」にチェックを入れます。

![WS000230.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3e0ab41b-9f13-6d94-d123-d57962b25a48.jpeg "option1")

すると複数の追加設定が表示されますが、ここで「最大一致数」という項目に「1」を指定します。

![WS000232.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8ad2209e-b489-10d4-868e-79f1c5361734.jpeg "option2")

これだけです。
これだけで、最初の SPL の結果が以下の通り1行だけ抽出になります。

![WS000234.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c1d41e70-82b0-0461-949e-bf97378c53ec.jpeg "test_hit3")

なお、抽出される1行はルックアップテーブルの中で最も上の行になります。
そのため、抽出される1行に規則性を持たせたい場合はルックアップテーブル作成の時点でデータを並び替えておく必要があることに注意しましょう。
プレイリストシステム①

# 自己紹介

## 社会人としてのプロフィール
20年入社、社会人3年目のインフラエンジニアです。
業務では主にAWSの設計・構築をしています。
AWSを触り始めて１年ちょっとたって自信もついてきたかなと思っていたところに設計やMWレイヤーを触る機会があり自信が粉々に砕かれ将来に不安を感じている最中です。

## 個人的なプロフィール
基本インドアです。
野球観戦（家で）とかライブにたまに行きますが家でゲームをしていることが多いです。
あと、料理も結構好きです。

## Qiitaの使い方
今まで見るだけでしたが自分でも記事を投稿しようと思い立ちました。上でも書きましたが最近ちょっとついていた自信を粉々に砕かれ将来への不安を感じているところで、クオリティはともかく１人でWebアプリを作ってみようと思いその備忘録として使っていくつもりです。また、AWSサービスのメモも残していこうかなと考えています。

# Webアプリ作成

## 目的
１人でWebアプリを作りきってAWSはもちろんOS,MWレイヤーについて詳しくなる

## どんなアプリを作るか
アプリ作成の人間ではないので大した事のないものを作ります。
自分の好きな歌手(B'z)のおススメのプレイリストの登録・検索アプリをイメージしています。
UIとかもあまりこだわらない予定です。

ただ、インフラレイヤーの勉強が目的なのでバックアップや負荷分散とかする必要はないと思いますが
実際のシステムを意識した構成にしていきたいと思っています。（少々お金はかかってくると思いますが）

### 画面イメージ

## ![スクリーンショット 2022-09-04 221213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/36273c79-0b76-36fd-e18a-e5a85e6e8eca.png)
![スクリーンショット 2022-09-04 221229.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/16a54aa6-4fae-c920-7f58-2f8b3cb7e415.png)

## 具体的なイメージ
- WEB,APL,DBの3層
- 環境はAWS使用
- MWはとりあえずapache,tomcat
- DBエンジンは何を使ったらいいの？から調べる
【メモ】ワークステーションとローカルの環境の間でのディレクトリの通信コマンド

ワークステーション(WS)とローカルの環境(ここではM1macbookを想定)の間でディレクトリなどのやり取りをする際のコマンドをメモリしておきます。

### WS　->　local  


```
scp -i path/to/the/id_rsa -r user名@WSのIPアドレス:path/to/the/directory path/to/the/directory
```


#### よくない例

```
name@WS's name:~/pyed$ scp -i ~/.ssh/id_rsa -r user名@WSのIPアドレス:/path/to/dir /Users/pcのuser名/
Enter passphrase for key '/home/sakurai/.ssh/id_rsa': 

identity_sign: private key /home/user名/.ssh/id_rsa contents do not match public
user名@WSのIPアドレス: Permission denied (publickey).
```

原因
1. WS内部でコマンドを実行している。
2. コピー先のディレクトリが書いていない

なので、WS->localの通信であっても、localでコマンドを実行します。


### local -> WS


```
scp -i ~/.ssh/id_rsa -r /Users/pcのusr名/path/to/the/directory user名@WSのIPアドレス:~
```
Python vs Nerves(Elixir) Lチカ点滅速度競争


Ｌチカの待ち時間を0にして最短点滅時間を調べてみました

実際に使うときに、こんなプログラムを書くことは無いですが、ベンチマークとしてやってみました。

# 比較条件

Target Raspberry Pi Zero W
Erlang 25.0.4　Elixir 1.13.4-otp-25
Python 3.4.2

Elixirのプログラム
```Elixir
  defp toggle_pin_forever(output_gpio) do
    GPIO.write(output_gpio, 1)
    GPIO.write(output_gpio, 0)
    toggle_pin_forever(output_gpio)
  end
```


Pythonのプログラム
```Python
while True:
    GPIO.output(pin_no, True)
    GPIO.output(pin_no, False)
```

# 結果

|プログラム|H時間|L時間|周期|
|---|----|----|---|
|Elixir(Nerves)|6.2μS|4.8μS|11.0μS|
|Python|5.0μS|5.4μS|10.4μS|
|C言語|0.080μS|0.084μS|0.164μS|

僅差でPythonの勝ち

※ C言語（wiringPi使用)も追加しました。
圧倒的に速いですね

# 感想

ここまで僅差の勝負になるとは思いませんでした。もしかして、Elixirの方が圧倒的に速いのでは？と思ったんですが、そうでもなかったです。
PythonもByte Codeにコンパイルして実行してますからね。
いろいろな要素があるので、簡単に比較できませんが、極端な違いはないと解釈しました。

Elixirの結果
![DS1Z_QuickPrint1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/48c254a3-6dd3-5673-5b32-41ea3a044586.png)

Pythonの結果
![DS1Z_QuickPrint3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/cbbd4a9b-978e-6f71-6fe3-5f1d1153f6d3.png)

参考（C言語の結果）
![DS1Z_QuickPrint4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/4e40cd07-5a46-0700-2f56-cbb470c1611d.png)
React Nativeをやってみよう

# React Nativeをやってみよう (1) - 環境構築
## 環境構築
Expo Goプロジェクトを作成、移動
```
npx create-expo-app AwesomeProject
cd AwesomeProject
```
開発サーバーが起動
```
npm start # you can also use: npx expo start
```
Expo GoアプリをiOSまたはAndroidにインストール
https://expo.dev/client

Android では、Expo Go アプリを使用して端末から QR コードをスキャンし、プロジェクトを開く
iOS では、デフォルトの iOS カメラ アプリの組み込み QR コード スキャナーを使用する

以下の画面が表示される

![default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822993/6441e03e-a978-fafe-9826-aaec24556c6b.png)

プロジェクトルートフォルダのapp.jsを書き換えて
Hello Worldのような任意の文字列に修正する

```
import { StatusBar } from 'expo-status-bar';
import { StyleSheet, Text, View } from 'react-native';

export default function App() {
  return (
    <View style={styles.container}>
      <Text>Hello World! We 're BlackRabbits!</Text>
      <StatusBar style="auto" />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});
```

自動でリロードされ、以下の画面が表示される

![helloworld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822993/3a12d19d-9910-16de-96b2-1e49362ffd07.png)
SwiftUIのプレビュー画面にてレスポンシブ対応を確認する

SwiftUIのプレビュー画面でiPadやiPhoneシリーズの画面の違いを同時に確認する方法を自分のメモ代わりに残しておこうと思います。

# 複数画面をプレビューにて表示する
### 複数の画面をプレビューで表示するにはGroupを使用する
``` Swift: 複数のプレビューを表示
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ContentView()
            ContentView()
        }
    }
}
```

これで二つのプレビュー画面が出てきます。
私は、引数ごとに違う画面を確認する時によく使用します。
例えば、タイトル表示が違うものを確認したかったら、以下のようにします、

``` Swift: 複数のプレビューを表示（タイトル違い）
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ContentView(title:"サンプル１")
            ContentView(title:"サンプル２")
        }
    }
}
```

## プレビュー画面の対象iOS Simulatorをコード上で変更する。
プレビュー画面の対象iOSはXcodeにて設定できますが、コード上でも指定できます。

```Swift: 対象iOSを指定する
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ContentView().previewDevice(PreviewDevice(rawValue: "iPhone SE (3rd generation)"))
        }
    }
}
```

上記ではiPhoneSEの画面でプレビューすることを指定してます。
Xcodeで指定しているものよりもコード上で指定したものが優先されます。名前の指定では半角スペースの場所に注意してください。
名前がおかしくても、特に怒られたりはしないです。ただプレビュー画面がXcodeで指定しているものになります。

## 複数のiOSの対象をプレビューで確認する

### プレビューを複数用意し、それぞれの対象iOSを指定する

```Swift: 複数の対象iOSを表示（iPadとiPhoneSEの画面を表示）
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ContentView().previewDevice(PreviewDevice(rawValue: "iPad Air (5th generation))"))
            ContentView().previewDevice(PreviewDevice(rawValue: "iPhone SE (3rd generation)"))
        }
    }
}
```

上記で、iPadの画面の時と、iPhoneSEの時の画面の違いを確認できます。

## まとめ
iPhoneでも、ホームボタンの有無で画面の表示が少し違うので、同時に確認できると開発しやすかったです。
- 参考
　https://www.youtube.com/watch?v=keEQ0RrXEx0
仮想環境の構築・起動 と pythonファイルのexe化

【仮想環境の構築 作成】
-------------------------------------------------------------------------------------

https://www.acrovision.jp/career/?p=2254
venvで仮想環境を作成するには、「python -m venv ○○」（○○は仮想環境名）というコマンドを実行します。

cd H:\python_pg/Py_venv
　（仮想環境を作成したいフォルダ階層まで移動）

python -m venv ○○
　（仮想環境の作成　○○ の部分に仮想環境の名前）



【仮想環境の起動】
-------------------------------------------------------------------------------------


https://zenn.dev/nekocodex/articles/eb3403961ad9b966ff6e


「①必要なら」
Set-ExecutionPolicy コマンドを使用して、今操作しているVisual Studio Codeのターミナル (PowerShell) のみ、実行可能な RemoteSigned ポリシーを適用してあげる。

（例）（ターミナルで）
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process


「②次に、仮想環境を構築したフォルダまで移動する」
cd C:\python_pg\〇〇
（この、C:\python_pg\Py_venvの次に、仮想環境として構築したvenvという名前のフォルダを個人的に作った）

 「③仮想環境の起動」
./〇〇/Scripts/Activate
（このvenv（●●）の部分は、仮想構築したフォルダ名）
（場合によったら、最初からこの一文でも実行できる）

「cd C:\python_pg/Py_venv」

「./venv_2/Scripts/Activate」


【仮想環境　切断】
-------------------------------------------------------------------------------------

「deactivate」


【もしpip でエラーがおきたら！】（ModuleNotFoundError: No module named 'pip'）
-------------------------------------------------------------------------------------


https://pip.pypa.io/en/stable/installation/

Pythonにはensurepipモジュール1が付属しており、Python環境にpipをインストールできます。
py -m ensurepip --upgrade



【もし仮想環境でブレークポイントが止まらなかったら！】
-----------

https://manichannel.com/python-vs-code-venv/

launch.json に "justMyCode": false を追加する。ライブラリのメソッドでもブレークポイントが効くようにする


![ブレークポイント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823597/c4022907-d7b1-3b12-2d8c-6ff1cc52df7e.png)




【うまく仮想環境のpythonのインタプリタからデバッグができなかったら？】
-----------
https://blog.logical.co.jp/entry/2021/04/19/160000#%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%B8%E3%81%AE%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88

Vscodeの右下のほうに、実行中のPythonが表示されているので、それを確認。
![インタプリタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823597/555e637a-e0ef-7e3d-5e5e-ca8919b3db71.png)
（もし違ったら設定を行う）

⓪
現在実行中の仮想環境を、deactivate

①
設定方法
VS Code を起動した状態で、Ctrl + Shift + P を押し、コマンドパレットを開きます。python: select と入力し、Python: Select Interpreter をクリックします。

②
Enter interpreter path... をクリックし、続いて Find... をクリックします。

③
エクスプローラーが起動するので、仮想環境にある python.exe を選択し、「インタープリターを選択」をクリックします。
（もしくはpython.exe を選択した後にpythonw.exeを選択 ？）

④
vscodeを開きなおします。


【もしデバッグにprintが表示されなかったら】
------------------
https://keisyuke-blogyakkyoku.xyz/python-lesson1

jsonファイルの”configurations”に”redirectOutput”: trueを追加

F5を実行し、デバッグコンソールを確認すると、printの内容が表示されている。


【exeファイル化】
-------------------------------------------------------------------------------------

pip install pyinstaller

pyinstaller 「メインのファイル」.py --name <出力exeファイル名> --onefile --icon <アイコンファイル> --noconsole


まずはスクリプトを保存した場所を確認すると、「dist」というフォルダが作成されていることが確認できますので、このフォルダの中身を確認します。
https://laboratory.kazuuu.net/create-an-executable-file-from-a-python-script-using-pyinstaller/


（exe化した後に、exeファイルの同じ階層にフォルダを指定したいときなど）

パスは、
MY_DIR = __file__ではなく、
MY_DIR = os.path.abspath(sys.argv[0]) # フォルダのパス
にしたほうがうまくいく？

MY_DIR = __file__では、windowsのキャッシュの場所にフォルダを作成してしまう。（なぜ？）
【SwiftUI】WheelDatePickerStyleが壊れてるから自作した

# はじめに
https://qiita.com/SNQ-2001/items/05f02e55333a52ca8aa5

上記の記事では`Picker`でしたが、今回は`DatePicker`です。
`DatePicker`にもwheelスタイルが存在し、`Picker`と同様に壊れています。
使い物になる`DatePicker`をUIKitを使って作っていきます。

# 問題
```swift
struct ContentView: View {
    @State var date: Date = Date()
    var body: some View {
        DatePicker("", selection: $date, displayedComponents: .hourAndMinute)
            .datePickerStyle(WheelDatePickerStyle())
            .frame(width: 200, height: 80, alignment: .center)
            .background(Color.yellow)
            .clipped()
    }
}
```

このようになります。(わかりやすいように背景色を付けてます)
![Simulator Screen Shot - iPhone 12 - 2022-09-04 at 20.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3fc104e7-3321-e425-28eb-4f1a3c712c41.png)
一見問題なさそうに見えますが重大なバグが潜んでいます。
下記の画像の青い部分が全て`DatePicker`の判定になっています。
どういうことかと言うと、青い部分をスクロールすればホイールが反応してしまう訳です。
![スクリーンショット 2022-09-04 20.40.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/85784cd4-f33b-99fb-f5fd-f151d928bf02.png)

![画面収録_2022-09-04_20_42_04_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4d30ebb3-d1c3-67e0-4961-38491891d16d.gif)

# 実装
```swift:WheelTimePickerView
struct WheelTimePickerView: UIViewRepresentable {
    @Binding private var selection: Date

    init(selection: Binding<Date>) {
        self._selection = selection
    }

    func makeUIView(context: Context) -> UIDatePicker {
        let picker = UIDatePicker(frame: .zero)

        picker.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
        picker.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

        picker.preferredDatePickerStyle = .wheels
        picker.datePickerMode = .time

        picker.addTarget(context.coordinator, action: #selector(Coordinator.changed(_:)), for: .valueChanged)

        return picker
    }

    func updateUIView(_ uiDatePicker: UIDatePicker, context: Context) {
        uiDatePicker.date = selection
    }

    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }

    class Coordinator: NSObject {
        var wheelTimePickerView: WheelTimePickerView

        init(_ wheelTimePickerView: WheelTimePickerView) {
            self.wheelTimePickerView = wheelTimePickerView
        }

        @objc func changed(_ sender: UIDatePicker) {
            self.wheelTimePickerView.selection = sender.date
        }
    }
}
```

# 完成形
![スクリーンショット 2022-09-04 20.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7d6ffb16-fba2-eeb8-4788-f3a5c80dca3c.png)

範囲も修正されています。
![スクリーンショット 2022-09-04 20.46.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/03bd7497-0052-4764-30c3-e399ca9098e1.png)

# おわり
iOS16では修正されていることを願います
Ubuntuで久しぶりにDocker desktopを使おうとしたらログインできない

実は、stable_diffusion.openvinoを実行できるDockerfileを知り、試してみたいと思いました。
それで、久しぶりにUbuntu Studio20.04.5に、Dockerをインストールしました。

https://zenn.dev/masaru21/articles/7ed6e629792236

Dockerは、CLIで使えます。
でも、Docker Desktopも使ってみたいと思いました。

下記の記事を、参考にしました。

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0719

そして、Docker DesktopでDocker Hubにログインしようとしたら、この画面が出ました。
![Docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/32b372d7-4e5d-b44a-1658-a8e4c61e155e.png)

機械翻訳を使い、このページを読んでいました。

https://docs.docker.com/desktop/get-started/#credentials-management-for-linux-users
どうやらアカウントを管理するために、暗号化してパソコンに保存するようです。
その初期化をしてくださいと、案内画面に誘導しているようです。

このコマンドを実行しました。
```bash 
gpg --generate-key

gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

```
と表示されて、本名を入力するように、言ってきます。
次にメールアドレスを入力するように、言ってきます。

この後パスワードを設定するダイアログが、表示されます。
このパスワードは、Dockerとは別の方が良いかも知れないです。

秘密鍵と公開鍵に証明したと、表示されます。

```bash
名前(N)、電子メール(E)の変更、またはOK(O)か終了(Q)? o
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。


公開鍵と秘密鍵を作成し、署名しました。


```

その表示された暗号を、次のコマンドで入力します。

```bash
pass init　***********************
```

******の部分は、先に出来た下記の***********部分を入力してください。

```bash
pub   rsa◯◯◯ 2022-09-04 [SC] [有効期限: xxxx-xx-xx]
      ************************
```
次にDockerにCLIで、ログインしてください。

```bash
docker login
```

これでDocker Desktopに、ログインできました。
LPC812MAXでGPIOレジ直で遊ぶ(IN)


目的
GPIO_INのテスト


![o_con722.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/461f73de-be28-ef22-12e4-ebd53ecffc5c.jpeg)



```c++



//GPIO_in_P0_7_test_812_1

#include "mbed.h"

//         TX    RX
Serial pc(P0_4, P0_0); //812

DigitalIn enable(P0_7);

//メイン関数
int main()
{

    int hex1[] = {
        '0','1','2','3','4','5','6','7',
        '8','9','A','B','C','D','E','F'
    };

    int x;

    //無限ループ
    while(1) {

        x = LPC_GPIO_PORT->PIN0;

        pc.putc( hex1[ (x>>4) &  0x0f ]  );
        pc.putc( hex1[ (x)    &  0x0f ]  );
        pc.putc( '\r' );
        pc.putc( '\n' );

        wait_ms(500);//0.5秒待つ

    }//while

}//main



```


![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fabc80e7-41be-fe29-47a2-02655e07551e.jpeg)



-10-
Vueでhello world!①

# 前準備
https://qiita.com/gusuku/items/51d017f281eef07a1d10

# 以下ファイルを作成

```vue:script.js
new Vue({
    el:'#app',
    data(){
        return{
            text:"hello world!"
        };
    }
})
```

```vue:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vuedemo</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <p>{{text}}</p>
    </div>
    <script src="script.js"></script>
</body>
</html>
```

# ブラウザへ表示する
index.htmlをブラウザのurlへドラッグ&ドロップする
hello world!
と表示されればOK！
![スクリーンショット 2022-09-04 19.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1030700/1c54285d-dc81-e743-57f3-3ddaf6dc710a.png)

# 参考
https://blog.codecamp.jp/vuejs-helloworld-display
【Android】画面を縦方向、横方向で固定する

# はじめに
今回はAndroidアプリ内で画面を縦画面、横画面でそれぞれ固定する方法を記事にします。
基本的に、指定がない場合は　端末を縦にすれば縦画面に、横にすれば横画面になるのがデフォルトです。
ですが、レイアウトやデザインによっては画面の回転に対応できないケースもあります。
そういった場合には、それぞれ指定してあげる必要があります。
# 指定方法
AndroidManifest.xml の manifest → application → activity に 
”screenOrientation”
を追加します。


横画面に固定するには

```
<activity android:screenOrientation="landscape">
```

縦画面に固定するには

```
<activity android:screenOrientation="portrait">
```

また、縦横以外にも指定方法があるので表でまとめておきます。

|screenOrientationの値|説明|
|:---|:---|
|unspicified|デフォルトの状態、自動回転する|
|landscape|横向き固定|
|portrait|縦向き固定|
|user|現在のレイアウトに従う、ユーザーの操作により切り替え可能|
|behind|親のactivityに従う、ユーザーの操作により切り替え可能|
|sensor|センサーの通りにする|
|nosensor|センサーを無視する|
ドッカ―コンテナが「exit code 1」のとき、GitHub Actionsのステップが終わらなかった件について

### はじめに
前回の記事「[Github ActionsでSpring Bootのテストコードを検証する](https://qiita.com/yuri_san/items/8a69b6f412993fa6c74f)」のためのサンプルコードを作成したところ、
GitHub Actions上で`docker-compose up`するとテストが失敗してもアクションがsuccessになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727545/436ebbd2-df13-c9c0-6c42-f6b670bcf048.png)
[>詳細結果](https://github.com/crane93/github-actions-spring-boot/actions/runs/2939445375)
ということで、その原因と解決方法について調査してみました。
### 原因
> Nonzero value (any integer but 0)	failure	Any other exit code indicates the action failed. When an action fails, all concurrent actions are canceled and future actions are skipped. The check run and check suite both get a failure status.

[GitHub Actionsドキュメント](https://docs.github.com/en/actions/creating-actions/setting-exit-codes-for-actions#about-exit-codes)によりますと、`exit code 0`以外はアクション失敗になりますけど、
どうやら単純な`docker-compose up`ではコンテナの起動が失敗してもGitHub Actionsでは「問題なし」と見なされるようです。
なので、GitHub Actionsにコンテナのexit codeが1であることを知らせる必要があります。
### 解決方法
`docker-compose up`に以下のいずれかのオプションをつければOKです。
#### --exit-code-from
- 意味：指定したコンテナのexit codeを返却
- 例：`--exit-code-from (対象になるコンテナ名)`
- 私の場合はSpring Bootアプリケーションが存在するコンテナ名がwebなので
`docker-compose up --exit-code-from web`と記入しました。
- [詳細結果](https://github.com/crane93/github-actions-spring-boot/actions/runs/2987245341)
#### --abort-on-container-exit
- 意味：起動するコンテナの中で一つでも停止されたらすべてのコンテナを停止する
- 解決方法をググったら上のオプションの方法がよくみられますが、一応このオプションもいけます。
- [詳細結果](https://github.com/crane93/github-actions-spring-boot/actions/runs/2941892026)
### おわりに
サンプルコードやActionsの結果は以下のレポジトリでご確認してください！
https://github.com/crane93/github-actions-spring-boot
### 参考になった記事
- https://7me.nobiki.com/2021/01/20/docker-compose-on-github-actions-get-exit-code-from-container/
- https://stackoverflow.com/questions/73255602/exit-code-1-does-not-fail-my-github-actions-step