OmniAICreator/Qiita-1.07M huggingface dataset:
Gitの警告 [ You have divergent branches and need to specify how to reconcile them]

git pull -aすると、下記のようなエラーが怒られてしまう。

```sh
service]$ git branch
* develop
service]$ git pull -a
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint:   git config pull.rebase false  # merge
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
```

解決方法

[config]を用いて、[pull.rebase], [pull.ff]のいずれかの設定を明確化する。
pullをする毎にオプションをちゃんと指定する。　ちょっと怖いですので、下記のように実施すると、問題を解消できる。

```sh
service]$ git fetch --all
service]$ git checkout develop
service]$ git pull origin develop
```
Dockerで開発環境の立上げのエラー

```
docker-compose up –build -d
```
ターミナルでこれをしたのちに
↓
エラー文
```
no matching manifest for linux/arm64/v8 in the manifest list entries
```

解決方法
https://qiita.com/jizya/items/38f15271903de629d1ab
初めてのDjangoコントリビュート

# 最初に
Djangoのチュートリアルを進めている際、バグを発見しました。当時私はDjangoの初心者でしたし、OSSへのコントリビュートも初めてでした。本記事では、簡単なOSSコントリビュートの流れをご紹介します。

# 今回出したPull Request
チュートリアル「はじめてのDjangoアプリ作成、その7」の[管理サイトのルック&フィールをカスタマイズする](https://docs.djangoproject.com/ja/5.0/intro/tutorial07/#customize-the-admin-look-and-feel )に記載されているbase_site.htmlのコードを実行すると、サイトのヘッダを置き換える際にレイアウトが崩れるバグに対するものです。
この問題はdivタグが閉じられていないことが原因でした。そのため、divタグを適切に閉じる修正を行いました。

https://github.com/django/django/pull/17608#event-11247926794

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494142/38ca54e2-cb68-23d7-11cd-f0e06a3afcae.png)

# Pull Requestを送るまでの流れ
1. 日本語版のドキュメントでバグを発見したため、英語版のドキュメントでも同様のバグがあるかを確認し、DjangoのGitHubリポジトリで当該箇所を確認

2. [Djangoのリポジトリ](https://github.com/django/django) をフォーク
①Codeタブを開き、forkをクリック
![スクリーンショット 2024-04-03 13.15.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494142/0b813ac5-0dae-8776-252d-52be50a25ca0.png)
②Create forkをクリック
![スクリーンショット 2024-04-03 13.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494142/f91254b8-506f-c6f4-7e7a-d9375bc5f3a3.png)

3. ターミナルを開き、ローカル環境にクローン
`$ git clone git@github.com:django/django.git`

4. 修正用のブランチを作成
`$ git checkout -b closediv`

5. VSCodeで該当のコードを修正
修正箇所↓
![スクリーンショット 2024-03-01 23.47.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494142/01b6cef2-24a4-2539-060b-1f58d2897522.png)

6. コミット
`$ git add .`
`$ git commit`

7. Pull Request作成
`$ git push` 後、ターミナルに表示されたURLをクリックして、プルリクを作成
![スクリーンショット 2024-04-03 13.48.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494142/71a00f70-772f-ac22-0b51-e0d2c1e26bd0.png)
Pull Requestの文章については、英語で記載する必要があったため、今回は日本語で文章を考えた後、DeepLも活用しながら、より適切な英語の文章に翻訳しました。

# 参考記事

https://docs.djangoproject.com/ja/5.0/intro/contributing/

# 感想
Pull Requestを出してからマージされるまでの時間は非常に短く、1日以内で済みました。
このコントリビューションを通じて、公式ドキュメントは必ず正しいはずだという思い込みがありましたが、必ずしも正しいとは限らないということに気づきました。そして、疑問を持つ視点を養うことができました。
また、コントリビューションの手順自体は、通常のチーム開発よりもはるかに簡単に感じられました。しかし、第三者に英語のコミットメッセージを確認してもらう必要があるため、コミットメッセージには細心の注意を払い、繰り返し推敲する必要があると感じました。

# 最後に
ここまで記事を読んでいただきありがとうございました！お気づきの点があれば、ご指摘ください。直ちに修正させていただきます。

技術記事の執筆は初めてであったため、[@まく](https://qiita.com/Mk459) さんに壁打ちやフィードバックをしていただきました。ありがとうございました！

所属OrganizationのTECH WOMAN KANSAIは、関西の女性エンジニアが集まるコミュニティです。
定期的にメンバーで集まって勉強会を開催したり、月に一回Qiitaに記事を投稿したりと活動しているので、ご興味のある関西在住の女性エンジニアの方はぜひ！

https://qiita.com/organizations/tech-woman-kansai

https://tech-woman-kansai.connpass.com/
You exceeded your current quota, please check your plan and billing details.

解決までに長い時間がかかってしまいましたが，些細な間違いだったため共有します．

## エラー
```
openai.RateLimitError: Error code: 429 - 
{
	'error': {
		'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.',
		 'type': 'insufficient_quota',
		 'param': None,
		 'code': 'insufficient_quota'
	}
}
```

## 前提
- 新しくorganizationに参加した．
- API keyを生成して利用したところ，上記のエラーになった．
- Credit Grantsには十分のクレジットが入っている．
- API keyを再生成するも同様の結果になった．
- 24時間以上空けて再度試みるも同様の結果になった．

## 原因
organization参加前のアカウントが**Default organization**になっていた．
![スクリーンショット 2024-03-06 12.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665507/52663a66-acf7-5817-ae1e-40a060b811cc.png)

:::note info
つまり，もともと作成していたアカウントのクレジットがなかったためこのエラーが常に出力されていた．
:::

## 解決策
https://platform.openai.com/api-keys

上記リンクの**Default organizationの設定を，現在参加しているorganizationに変更**する．

## まとめ
複数の組織に所属している場合，組織を変更してもAPI keyの参照先は同期されないことがわかった．
専門学生のエンジニア就活！！エンジニアになるには？難しいという噂も！

## この記事で分かること
- エンジニア就活で使えるおすすめサービスは？


<br>

昨今、人気を集めている **「エンジニア」** という職業。

2024年１月に公開された、高校生のなりたい職業ランキングでは２位にランクインしています。

参考：https://news.mynavi.jp/article/20240109-2858163/

そんなエンジニアになってみたい！という人も多いでしょう。

そこで、今回はエンジニア就活で使える「おすすめサービス」について、徹底調査してみました！
<br>
という、よくあるまとめサイトのパロディでサービスの紹介記事を書いてみようと思いましたが、向いていないことはむずかしいですね。

私は今期２５卒として活動し、ありがたいことに複数社からエンジニアとして内定をいただきました。
もうすぐ、去年自分が就職活動を始めた時期が来ます。
同じ専門学生として頑張っている、２６卒専門学生のお役に立てればと思い、自分がよく使っていたサービスを感想と一緒にまとめてみました。



## エンジニア就活で使えるおすすめサービス
正直、メンターがついてくれる系のサービスはついてくれるメンターの方によりけりなところがあります。
ですので、自分に合いそうと思ったサービスを片っ端から試すのがおすすめです。

## 逆求人ナビ
https://www.studenthunting.com/
### 1日でたくさんの企業の人と話せるのでオンライン面接慣れができる

使用ツールがzoomなので、学校で導入されてない人は特におすすめ！

エンジニアのオンライン面接でツールがうまく扱えないと印象良いとは言えないと個人的に思うので。

### slackでメンターとやり取りができる
LINEや専用サイトでメンターとやり取りするサービスもあるけど、slackはコードブロックが使えたりブックマークや送信予約ができるので、メール添削の相談がすごく楽でした。

### 選考のお誘いを頂くタイミングが一緒になるので、同時に複数の選考が進み、スケジュール調整が難しい
1日で複数企業と面接をする弊害。


## キャリアセレクト
https://careerselect.jp/mypages

### 内定への道のり！がめっちゃ役にたつ
初回面談後にエクセルのシートをもらえるんだけど、これがめっちゃ役に立ちました。

就活始めたての段階で重要なことを言語化して見やすく置いておけるのがすごくよかったです。
エンジニアとして就職しようと思った中で、数多ある企業からなぜこの会社を選んだのかとかがすごく話しやすくなります。


### LINEでメンターとやり取りができる
slackと比べて、手軽にやり取りできるのがメリットと思ってます。
悩んだらすぐ相談しやすいのはLINEかも。

ただ、文章の添削などをお願いするときはLINEだけだときついので、Googleのワードみたいなやつ（googleドキュメント）で書いて、その後コメント機能で添削してもらっていました。

## サポーターズ
https://talent.supporterz.jp/events/

### 毎月開催してるハッカソンで友達いなくてもチーム開発させてもらえる
チーム開発が経験したい人におすすめです。

応募者の中から運営がランダムにチームを調整してくれるので、全く知らない人と開発ができます。自分とは全く違う学校の人や、全然考え方の違う人と知り合うことができて楽しいです。


また、オンラインで開催されるので、開発友達がいない地方民を救済してくれます！


---

いかがでしたか？
みなさんここまで読んできて、ほんとにエンジニアになれるのかな？将来はどうなってしまうの？と心配になってしまったかもしれません。

でも、これらサービスをうまく活用できれば、素敵なエンジニアライフを送れる気がしてきませんか？

みなさんのエンジニア就活を応援しております！今後も目が離せませんね！

<br>

参考：https://otakei.otakuma.net/archives/2021022507.html


## おまけ：情報収集編
情報収集に使用していたサイトやyoutubeのチャンネルです。
おすすめです。

## Serendipity
https://www.serendipity-disclosure.com/

企業の情報収集・比較に使いました。有価証券報告書の内容を企業ごとに見やすくまとめてくれているので、とっても便利です。
コードが書ければいいっていうのはそうかもだけど、これから入社しようと思う会社がどういう方針でお金を稼ごうとしてるのかとかは知っておいて損じゃないと思います。関係なくないと思うので。

## Fラン大学就職チャンネル
https://youtube.com/@user-ys6bh5zc3k?si=a_O1Pa00Mueh7awT

就活をネタにした短い動画作品を公開しているチャンネルです。２年生のころに見始めて、就活意識が変わりました。就活のスケジュール感や他の人がどんな就活してるのかなど、とっても勉強になりました。

怠惰な自分には「もう少しだけ頑張ろう」と思える励ましになりました。
一番好きな作品を貼っておきます。

https://youtu.be/1IkDPT-jWUo?si=vHBBR_6fWrpHceNe
Best Play-Doh Modeling Compound 6pcs

Mould your dreams into reality with six vibrant colours of Play-Doh. Perfect for kids aged 2 to 5, this versatile craft sparks imaginative play and artistic expression. Whether it’s for sculpting, shaping, or simply having fun, these non-toxic, easy-to-use modelling compounds are an ideal gift option. Encourage fine motor skills and endless hours of entertainment. Let your little ones explore their artistic potential and create a world of colourful possibilities with Play-Doh.
【APG4b - AtCoder C++】ABC049居合を終え、青い絵を覆う 

## AtCoder 学習記録用 (APG4b)ABC049

https://atcoder.jp/contests/abc049/tasks/abc049_a
~~~c++
#include<bits/stdc++.h>
using namespace std;

int main(){
  char c;
  bool judge = false;
  cin >> c;
  //解法1
  // if( (c == 'a') || (c == 'i') || (c == 'u') || (c=='e') || (c =='o') ){
  //   judge = true;
  // }
  //解法2
  string vowel = "aiueo";
  for(int i=0; i < vowel.size(); i++){
    if(c == vowel.at(i)){
      judge = true;
      break;
    }
  }
  
  if(judge){
    cout << "vowel" << endl;
  }else{
    cout << "consonant" << endl;
  }
}
~~~
- 今回学んだこと
解法1のときに、a,i,u,e,oをそれぞれダブルクオーテーションでくくると、char型ではなく、文字列型になり、エラーがでる。if文の条件丸カッコで丁寧に丸括弧をたくさん書いているが、なくてもよし。

- string型でaiueoを変数に格納して、at()で取り出せばchar型として比較できる。私は最初`vowel[]={a,i,...}`でchar型の配列を使って解こうとしたんてすが、途中で分からなくなり、ピボットしました。。
Attention MechanismにおけるQuery, Key, Valueを数式なしで直感的に理解したい

# はじめに

　この記事が初投稿になります．ソリングです．機械学習に関する記事を書いていきたいなと思っています．今回の記事の内容は，タイトルにもあるように「Query, Key, Value」を理解しようという内容です．

　ここ1年ほど，ChatGPTなどでTransformerモデルが話題になっています．その中で使われているAttentionメカニズム（注意機構などとも訳される）は，多くの場合「モデルが入力のどこに注目すればいいかを理解するメカニズム」だと説明されます．また，「QueryとKeyから重み付けを行い，その重みでValueの加重平均を取る」という説明を見たことがある方もいるかもしれません．
 
 この説明は正しいのですが，自分が最初に見たときはよくわからなかった記憶があります．今後Transformerモデルを学ばれる方の中にも，既存の説明ではよくわからないという方もいるかもしれません．そんな方に向けて，少しでもわかりやすい記事が書けたらいいなと思います．



# 直感的な理解

　いきなりですが質問です．

:::note info

　シロップ・コーヒー・ミルクを混ぜ合わせて飲み物を作ります．これらを混ぜて（使わないものがあっても良い），あなたにとっての理想の飲み物200gを作る場合，どのくらいの比率でこれら３つを混ぜ合わせればよいでしょうか？

:::

　僕はブラックで無糖[^1] のコーヒーが好きなので，シロップ：コーヒー：ミルク＝0:1:0の割合で混合します．コーヒーの苦味があまり得意でなくカフェオレが好きな方は，シロップ：コーヒー：ミルク＝1:9:10くらいの割合で混ぜるでしょう．また，「そもそもコーヒーが飲めません」という人はシロップ：コーヒー：ミルク＝0:0:1で牛乳200gを飲むかもしれません．

　上の例において，「どのような飲み物が作りたいか」というのが**Query**です．**Key**はシロップ・コーヒー・ミルクの特性（苦み・甘み・まろやかさ，など）を指します．上のシロップ・コーヒー・ミルクを混ぜ合わせる比率が**Attention Weight**と呼ばれるものになります．Attention WeightはQueryおよびKeyから決定されます．また，**Value**はシロップ・コーヒー・ミルクそのものを指します．

　これらを表にして，query, key, value, attention weightを整理しましょう．

| 用語 | 意味 |
|:-:|:-:|
| Query  |  「こういうものがほしい」といったリクエスト |
| Key  | それぞれの特性  |
| Attention Weight  |  QueryとKeyから導かれる，「どのくらい混ぜればよいか」という比率 |
| Value  |  シロップ・コーヒー・ミルクそのもの |

　KeyとValueは，ともに同じもの（この例でいうと，シロップ・コーヒー・ミルク）に由来します．

　この例を用いて，「QueryとKeyから重み付けを行い，その重みでValueの加重平均を取る」という意味を理解しましょう．

　例えば「苦すぎないカフェオレが飲みたい」という客からのQueryがあったとします．このQueryに基づき，あなたはシロップ・コーヒー・ミルクの特性（Key）を分析し，どのくらいの比率(Attention Weight)で混ぜ合わせればこのQueryを満たしているかを考えます．その比率をもとに実際にシロップ・コーヒー・ミルク(Value)を混ぜ，客に提供します．

　これがAttention Mechanismの気持ちとなります．数式を用いていないので厳密性に欠けますが，直感的には上のように理解すれば良いと思います．

　
 






[^1]:ブラックコーヒーの定義はその色であるため，厳密にはミルクが入っていないことを指し，砂糖が入っているかどうかはブラックコーヒーであるかどうかとは関係ないとされています．（微糖ブラックや加糖ブラックという表現が許容されているのはこのためです）
@sectionと@yieldを使って画面が真っ白になった時の対処法

# 初めに

sectionディレクティブとyieldディレクティブを使っていて
うまく継承できずに画面が真っ白になってしまったので
その対処方法を解説します。

# 解決方法

extendディレクティブを書く


# 詳しく解説する

## 環境情報

### OS
![スクリーンショット 2024-03-06 10.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/d37a6f4e-5a1f-c749-2ff9-66ae87579006.png)

### ソフトウェア

#### php
![スクリーンショット 2024-03-06 10.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/eb3c933b-b3dd-71cb-4d26-b9e51087933f.png)

#### laravel
![スクリーンショット 2024-03-06 10.46.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/22fedf89-9816-d192-f30c-4b8ab601faba.png)

## 継承先のファイル

```diff:CreateAccount.blade.php
@extends('layout')　<- ここが書かれているか確認！
@section('content')
    <p>{{ $msg }}</p>
    <form action="/CreateAccount" method="post">
        <table>
            @csrf
            <tr>
                <th>
                    ユーザーネーム
                </th>
                <td>
                    <input type="text" name="username">
                </td>
            </tr>

            <tr>
                <th>
                    メールアドレス
                </th>
                <td>
                    <input type="text" name="email">
                </td>
            </tr>

            <tr>
                <th>
                    登録
                </th>
                <td>
                    <input type="submit" value="send">
                </td>
            </tr>
        </table>
    </form>
@endsection
```
## 継承元のファイル
```diff:layout.blade.php
    <!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>

        <!-- Fonts -->
        <link rel="preconnect" href="https://fonts.bunny.net">
        <link href="https://fonts.bunny.net/css?family=figtree:400,600&display=swap" rel="stylesheet" />

        <!-- Styles -->
    </head>
    <body>
        @yield('content')
    </body>
</html>
```
## 継承とは
簡単に言えば、ファイルの情報を受け継ぐことができるってことです。

具体的に言えば
上記のファイルで言うと
継承先であるCreateAccount.blade.phpが継承元のlayout.blade.phpの情報を持つことができるってことです。

## @sectionと@yieldを使って画面が真っ白になった時の対処方法
まず@sectionと@yieldの書き方をまちがえてないかを確認しました。

継承元のファイルには@yield('継承先で指定した名前')を入れて
継承先のファイルには@section('名前を指定')を入れます。

僕のファイルでは@yield('content')、@section('content')ですね

次に確認することとしては
@extendsで継承元を指定しているかを確認する

僕のファイルでは
@extends('layout')　これですね

僕はこれを忘れていました。
これを忘れるとうまく継承できないので注意してください。

## 参考文献

https://qiita.com/vanshi/items/566eb63be555649042f6

この方の記事を参考にさせていただきました。
ありがとうございます。

## 終わりに
継承ってどっちが元でどっちが先かわからなくなると思うので
ぜひ参考にしてください！
[Flutter] AppBarだけをConsumerにしたい

# 課題
RiverpodのConsumerはWidgetのため、ScaffoldのAppBarには適用できない

# 解決方針
Consumerをカスタマイズして、PreferredSizeWidgetに準拠させる

# 実装
```
typedef PreferredConsumerBuilder = PreferredSizeWidget Function(
  BuildContext context,
  WidgetRef ref,
  Widget? child,
);

@sealed
class AppBarConsumer extends ConsumerWidget implements PreferredSizeWidget {
  const AppBarConsumer({
    super.key,
    required PreferredConsumerBuilder builder,
    Size preferredSize = const Size.fromHeight(48),
    Widget? child,
  })  : _child = child,
        _builder = builder,
        _preferredSize = preferredSize;

  final PreferredConsumerBuilder _builder;
  final Widget? _child;
  final Size _preferredSize;

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return _builder(context, ref, _child);
  }

  @override
  Size get preferredSize => _preferredSize;
}
```

# 懸念と対応
preferredSizeがbuilderで生成するAppBarのpreferredSizeと一致しない可能性があるので、そこはbuilderで生成するWidgtの型をabstractなどを使用してさらに制限する方法もあるかなと
Textに対してlineLimit(_:reservesSpace: true)とlineSpacingを同時に使ったときのバグ

検証環境: iOS 17.2 + Xcode 15.2

`Text`に対して`lineLimit(_:reservesSpace: true)`と`lineSpacing`を同時に使ったときのバグがある。
`reserve`された空白行には`lineSpacing`が適用されず、高さが揃わないのである。
これに対するワークアラウンドとして、非常に単純であるが以下のようなものが考えられる。

```swift
import SwiftUI

public struct SpaceReservingMultilineText: View {
    var text: String
    var lineLimit: Int
    var lineSpacing: CGFloat
    public var body: some View {
        ZStack(alignment: .top) {
            Text((0..<lineLimit - 1).map { _ in "\n" }.joined())
                .opacity(0)
            Text(text)
                .lineLimit(lineLimit, reservesSpace: true)
        }
        .lineSpacing(lineSpacing)
    }
}
```

使うときは以下のように属性を外からまとめて指定することができる。

```swift
SpaceReservingMultilineText(text: ..., lineLimit: 3)
    .font(...)
    .foregroundColor(...)
```

もちろん将来的に修正されたら以下のように書けるはずなので、気長に待とう。

```swift
Text(text)
    .font(...)
    .foregroundColor(...)
    .lineLimit(3, reservesSpace: true)
    .lineSpacing(5)
```
Rspecで関数のモックをしているのに実行されてしまう

# はじめに
Rspecで2回同じところにハマったのでまとめます

# 問題

以下のようなテストを書きました

```rb
require 'spec_helper'

RSpec.describe sample do
  describe 'サンプルのテスト' do

    context '正しい引数が与えられた場合' do
      it '成功する' do
        params = {"hoge"=>"fuga"}
        test.put_api(params)
        expect(TestApi).to receive(:put_test).with(params.to_json).and_return(true)
      end
    end
  end
end
```

しかし実際にAPIを叩く関数をモックしているのになぜか実際にAPIを叩いてエラーになりました

# 解決方法

このような場合はモックとアサーションを兼任しているので、実際の呼び出し前にexpectを書く必要があります

```rb
require 'spec_helper'

RSpec.describe sample do
  describe 'サンプルのテスト' do

    context '正しい引数が与えられた場合' do
      it '成功する' do
        params = {"hoge"=>"fuga"}
        expect(TestApi).to receive(:put_test).with(params.to_json).and_return(true)
        test.put_api(params)
      end
    end
  end
end
```

# おわりに

これは毎回ひっかかるだけにもしかしたらネットにおおくあるかもですね
承認申請用のリストのアイテムにアクセス権を付与する【内容を整理】

[Microsoft 365の活用ネタのまとめに戻る](https://qiita.com/Keiji_otsubo/items/5ddec87d5f1fd4e9f4af)

前回の内容では色々と試行錯誤した途中の情報も書いていたので、少々後でみたらややこしいです。
私自身のためにも本当に機能する部分だけで内容を整理したいと思います。

[承認申請用のリストのアイテムにアクセス権を付与する](https://qiita.com/Keiji_otsubo/items/46cea0fb97173ba45f1f)


# アイテムまたはファイルの共有を停止します

まずは、**アイテム**またはファイルの共有を停止します。この部分は標準のアクションをそのまま使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e9a9c3f9-3d8e-f62f-dad7-2a3f74524a64.png)

|パラメータ|値の説明|
|:--------|:-----------|
|リストまたはライブラリ名| 共有を停止するリストを選択します|
|ID|共有を停止するアイテムのIDを指定します。数値|


# マスターとして使用するリストに共有権限を与えたいグループを登録しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/07d28424-63eb-23bc-13eb-80b45b496dc5.png)

|項目名|説明|
|:--------|:-----------|
|タイトル|部門名称|
|Approver|承認者|
|canEdit|編集権限のあるグループ|
|canView|閲覧権限のあるグループ|


# 住所変更届リストのアイテムに登録されている部門マスターのIDから編集権限のあるグループを取得します。

標準のアイテムの取得アクションを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/96d0fc09-ffe8-b232-47bd-68b88e8dc8cd.png)


# グループ情報をグループの名前から取得する

 HTTP 要求アクションを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/08e642fa-b37c-6359-9c35-04e3908fcbd7.png)

IDは以下のように設定している

```
outputs('ApproverGroupMaster項目の取得')?['body/canEdit/Claims']
```

```
_api/web/sitegroups/getbyname('@{outputs('ApproverGroupMaster項目の取得')?['body/canEdit/Claims']}')
```

ヘッダ

|||
|:------------|:----------------------|
|Accept|application/json;odata=verbose|
|Content-Type|application/json;odata=verbose|

# 取得したグループの情報からIDだけを取得する

JSON の解析アクションを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0a6c87b7-46f5-4fc5-763c-aa90380371ba.png)

解析の対象

```
@{body('グループ情報の取得_HTTP_要求')?['d']}
```

スキーマ

```Json
{
    "type": "object",
    "properties": {
        "Id": {
            "type": "integer"
        }
    }
```

スキーマは今までリストの項目が増えたときに毎回修正していたけど、使う分だけ設定しても機能するみたいです。今回はIDしか使わないので、IDだけを指定します


# グループの権限を追加

HTTP 要求アクションを使います。
グループのIDを使ったところは　プリンシパル Idと説明されています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c88617a0-37b2-5a8e-50ca-2c9f0eea54ac.png)


URI

```
_api/lists/getByTitle('019住所変更届')/items(@{triggerBody()?['entity']?['ID']})/roleassignments/addroleassignment(PrincipalId=@{body('グループのId_JSON_の解析')?['Id']},roleDefId=1073741827)
```


|Role Definition Name	 |Role Definition Id|日本語表記|
|:-----------------------|:-----------------|:--------|
| Full Control	 |1073741829|フルコントロール|
| Design	 |1073741828|デザイン|
| Edit	 |1073741830|編集|
| Contribute	 |1073741827|投稿|
| Read	 |1073741826|閲覧|
| Limited Access	 |1073741825||
| View Only	 |1073741924||
[Memo] バックエンドAPIを作る際にいつも気にすること

# アーキテクチャ
* リポジトリ構成
    * モノレポ or マルチレポ
    * Gitブランチ戦略
* マイクロサービスの切り方
* インタフェース仕様
    * RESTful / GraphQL / gRPC
    * レスポンス形状（JSON / XML etc.)

# 言語・フレームワーク・ミドルウェア
* フルスタックフレームワーク or 軽量フレームワーク
* DBMS
* キャッシュ（KVS等）
* 非同期/並行処理
* ストリーム処理

# インフラ
* サーバ構築自動化
* コンテナ化するかどうか
* 物理サーバ（Baremetal） or IaaS or PaaS or SaaS or CaaS (Kubernetes)
* サービスメッシュ
* デプロイするサーバ
    * 台数
    * 地理的な場所（DC、AZ、Region）
* コンピューティングリソース（CPU/RAM/Disk/ネットワーク帯域）

# 共通ロジック
* クラス構造
    * 3層アーキテクチャ / オニオンアーキテクチャ etc.
    * DIの有無
* タイムアウト
* リトライ
* サーキットブレーカー
* レート制限
* ログ設計
* O/Rマッパー
* 内部通信
    * HTTPS / HTTP2
* ヘルスチェック / Probe
* 設定ファイル中央管理


# セキュリティ
* 認証・認可
* クレデンシャル管理

# CI/CD
* リンター、フォーマッター
* 静的解析
* ユニットテストフレームワーク
* 自動脆弱性診断

# 監視
* ログ、ログローテーション
* インフラ監視
* APM
* アラート
    
# テスト
* テスト環境（Local / STG）
    * テスト環境構築自動化
* スモークテスト
* 負荷試験
  * 環境
  * 要件
* Webパフォーマンスチェック（Core Web Vitals / Lighthouse）

# リリース
* リリース戦略
    * ロールバック
    * カナリアリリース / ブルーグリーン
* 新旧システム移行戦略
    * データ不整合検知
VMware Workstation Player 共有フォルダ

# 環境

ホストOS　：　Windows11　pro
VM　：　VMware Workstaion 16 Player
ゲストOS　：　ubuntu 22.04 LTS

# 目的
ホストOSとゲストOSの共有フォルダ作成。
他の説明されているサイトは説明が長く分かりづらいので、備忘録を兼ねて本記事を投稿します。

# ゲストOSのインストールの注意点

ubuntu22.04のインストールは、VMwareを起動し、新規仮想マシンの作成からダウンロードしたイメージファイルを選択して、実行して進めます。

このとき、注意点があります。
- ゲストOSはデフォルトで20GBの容量に設定されていますが、30GB以上確保する
　→　容量が少ないと、インストールが一切進まなくなります。
- インストール中は常にVMwareにフォーカスされているようにする
　→　ほかの作業をしていると、一切応答を受け付けないようになる場合があります。
- ユーザー設定などの入力画面は素早く行う
　→　しばらく放置してしまうと、キーボード入力を一切受け付けなくなります。

 # VM tools

 ホスト・テスト間でコピペなど便利な機能を使うのに必須です。

 - open-vm-tools-desktop
 - open-vm-tools

これらがインストールされているかを確認する。
``` sh
sudo apt list --installed | grep vm
```

# 共有フォルダの設定
1. VMwareの[Player]-[管理]-[仮想マシンの設定]で、[仮想マシン設定ダイアログ]を開きます
2. [オプション]タブで、リストから[共有フォルダ]を選択します
3. [フォルダの共有] の中から常に有効を選択します
4. [フォルダ]内の[追加]ボタンから[共有フォルダ設定追加ウィザード]を起動します
5.  ウィザードで指定のフォルダおよびゲストOS上での名称を決めます
　commonというフォルダ名としました。
6.　[OK]を押して、仮想マシン設定ダイアログを閉じます。

 以下のコマンドにより、commonが表示されれば成功です。
``` sh
# cd /mnt/hgfs
# ls
```

## 表示されない場合
初回はおそらくcommonフォルダがlsコマンドで見えない場合が多いかと思います。

このコマンドで、共有フォルダが設定されているかを確認します。
``` sh
# vmware-hgfsclient
common
```
共有フォルダ名が表示されていれば、以下のコマンドを実行します。
```sh
/usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other
```

これで、/mnt/hgfs以下に共有フォルダが表示されるようになるはずです。
【マレーシア】プロジェクトキックオフをKLで行いました！！

# はじめに
皆さん、こんにちは！
[AXLBIT株式会社](https://axlbit.com)の石井(@ax-ishii)です。
今回は、2024年一発目の勉強会にてお話した**マレーシアのクアラルンプール（以下、KL）でのプロジェクトキックオフ**のお話です！
# 対象者
- 海外エンジニアと関わっている方
- ちょっとでも海外に興味のあるエンジニア
- （当社に興味がある方）
# ざっと要約すると、、、
- AXLBITが「初」の海外拠点をマレーシア設立 :clap:
- 海外のエンジニアと一緒に働くときは、異文化理解って大事だよね
- 異文化出身のエンジニア同士のコミュニケーションの難しさ
- 今後のチャレンジ
# AXLBIT ASIA 始動
　当社AXLBIT株式会社は、2024年1月1日に **AXLBIT ASIA SDN. BHD.** をマレーシアのクアラルンプールに開設いたしました :clap: 今後、当社が提供しているAXLGEARの開発の一部をマレーシアで行います！

![ロゴ＿AXLBIT-ASIA（背景透過） (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190711/b207d68f-a104-a2e4-81e4-3977164fbc9f.png)
https://axlbit.com/news/2024/0117.php

様々な媒体が、AXLBIT ASIAの設立について取り上げてくれました :clap: 
以下は、その一部です！
https://prtimes.jp/main/html/rd/p/000000023.000045361.html
https://www.nna.jp/news/2614386
https://www.asean-economy.com/co-radar/co-malaysia/3201574705

# マレーシアの文化を知ろう！
マレーシアのエンジニアと一緒に開発を行う上で一番大事なことは、**マレーシア文化の理解** です。ということで、今回は、マレーシアの文化以下3種について共有しました！
- 食文化
- 宗教文化
- 言語文化

一見、こういった文化に関するお話はサービス開発とは無関係のように思えるかもしれませんが、**相手文化への興味関心なくして円滑なエンジニアリングはない！！** と思います。

相手文化について **「興味」** を持ち、異なるバックグラウンドを持つ皆と **「雑談」** をし、そして **「仕事の話」** もする。これらができるようになることが、円滑な開発の第一歩になると信じています！
 ## 文化についてわからないときは聞こう！
　宗教的ルールが複雑なマレーシアでは、「OKなこと」「NGなこと」が時々わからないことがあります。そんな時は、**本人に聞こう！!　敬意**と**興味**を持って、本人に聞くことは決して悪いことではない。ぜひ、どんどん「聞いて」みましょう！
# プロジェクトキックオフ
　今回は、半年～1年に及ぶプロジェクトのキックオフを行いました！
　キックオフのスケジュールは以下です。
**【1日目】**
 　- **プロジェクト前半戦** のキックオフミーティング：1h
**【2日目】**
 　- **プロジェクト後半戦 part1** のキックオフミーティング：3h
**【3日目】**
　 - **プロジェクト後半戦 part2** のキックオフミーティング：1h
　 - 会食

<img width="400" alt="session_image_with_blur.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190711/0570409d-7d50-9d10-f468-046a6ba28655.png">

↑　キックオフ風景
# 難しさ　と　今後のチャンレンジ
## 難しさ
### ◆異なる言語（英語）を使用すること
　言語は使っていけば慣れます。最初は全然わからなくても、慣れます。話したもの勝ちです。今後は当社全体で、**「雑談」** を積極的に行っていこうと思います！
## 今後のチャレンジ
### ◆視覚情報を用いたコミュニケーション
　言葉が難しいのであれば、脳内をそのままメンバーに伝える。つまり、図形（UML含む）を用いて、視覚情報としてメンバーに伝達することを徹底していきます！
### ◆追い情報を伝える
　１つの単語で伝わらなかったら、翻訳機をガンガンに使って、追い情報を伝える。当たり前だが、日本語だと単語で伝わる内容であったとしても、英語だとなかなか伝わらない、、。そのため、以下を意識したコミュニケーションを取ることを心がけます！
 - 話しているときに相手の表情をよく見る。
 - 「伝わっていなさそう」 or 「納得がいっていなさそう」な場合は、**別の言い方** や **背景を追い情報** として伝える。 ※情報過多にならないように気を付ける。
 - 適宜、翻訳機の使用をする。
# まとめ
　今回は、1月にKLにて行ったプロジェクトの「キックオフについて」「キックオフにおいて感じたこと」を中心にお伝えしました。現在、**ブリッジSEを通さない開発スタイル** に試行錯誤を重ねて挑戦中です。
 　これからプロジェクトが本格始動しますが、この**開発スタイルの確立**と**プロジェクト成功**を目標にガンガン進めていきます！同じような取り組みをしている方、ぜひ一緒に頑張りましょう！
# 参考文献
1.  https://axlbit.com
1.  https://prtimes.jp/main/html/rd/p/000000023.000045361.html
1.  https://www.nna.jp/news/2614386
1.  https://www.asean-economy.com/co-radar/co-malaysia/3201574705
Amazon Linux 2023でメールログが出力されない

## 概要

Amazon Linux 2023にてデフォルトでは、/var/log/maillogにメールログは出力されません。
rsyslogをインストールする必要があります。
簡単にログを確認したい場合は、journalctlを利用して以下のコマンドを実行すると良い。

```
journalctl -u postfix -r
```
【AtCoder C++】ABC081B - Shift Only 

## AtCoder 学習記録用　B shift only ABC081B -shift only
https://atcoder.jp/contests/abc081/tasks/abc081_b

~~~c++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int N,A[200],count=0;
  cin >> N;
  
  for (int i = 0; i < N; i++){
    cin >> A[i];
  }
  //偶数判定フラグ
  bool allEven = true;
  //繰り返し
  while(1){
    //A[200]に対して、%2==0なら2で割る。それ以外は、allEven=False
    for(int i = 0; i < N; i++){
      if(A[i] % 2 == 0){
        A[i] = A[i] / 2;
      }else{
        allEven = false;
        break;
      }
    }
    //falseだったらcountそのまま出力して終了
    if(!allEven){
      cout << count << endl;
      return 0;
    }else{
      count++;
    }
  }
}
~~~
初見考えても分からなかったので、解く方針を他の記事に参照してもらいました。

初めて知ったこと
* ` int A[要素数] `で配列定義できること
* `while(1)`で無限ループ。1=trueだから。ブロック内でbreakやreturnする必要あり
* 複数の数値の標準入力を受け付ける際には、配列定義と`for (int i = 0; i < N; i++){ cin >> A[i]; } `でできたこと！

### 参考文献

https://qiita.com/malbare932/items/cb942a12d175157134de
extern template使用

## 目的
`extern template`は、別のソースファイルで既に特定のテンプレートの実体化が行われていることを***コンパイラに通知***します。これによって、ソースコードの膨大化を防ぎ、コンパイル時間を短縮することができます。

通常、テンプレートが使用されると、コンパイラーはそのテンプレートが使用されるすべてのコンパイル・ユニットでそのテンプレートをインスタンス化しますが、これはコードの肥大化とコンパイル時間の増加につながります。 externテンプレートを使うと、そのテンプレートは他のコンパイル・ユニットですでにインスタンス化されているので、現在のコンパイル・ユニットでインスタンス化する必要はない、ということをコンパイラーに伝えます。

## 例

書き方
```c++
extern template class MyTemplate<int>;
```

MyTemplate.hppで宣言する。
```c++
// MyTemplate.hpp
#pragma once

template<typename T>
class MyTemplate {
public:
    MyTemplate(const T& value) : value_(value) {}
    void print() const { std::cout << "Value: " << value_ << std::endl; }
private:
    T value_;
};
```

もう一つソースファイル（Instantiation.cpp）に、`MyTemplate<int>`を実体化しました。

```c++
// Instantiation.cpp
#include "MyTemplate.hpp"

template class MyTemplate<int>;
```

Usage.cppで実体化せず`MyTemplate<int>`使用する
```c++
// Usage.cpp
#include "MyTemplate.hpp"

extern template class MyTemplate<int>; // 既に実体化したをコンパイラに通知する

int main() {
    MyTemplate<int> obj(42);
    obj.print();
    return 0;
}
```
プログラマーと子育てと高専後の進路

## きっかけ

いろいろ好調なさくらインターネットさんであっても、高専生の採用はなかなか難しいらしい。

https://twitter.com/kunihirotanaka/status/1765159448564346961


## ほんとうか？

高専偏差値最高峰の明石高専の進路

https://www.akashi.ac.jp/career.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39256/53d7f983-61dd-f70d-00c2-4a7c93b655ed.png)

主にIT形と言われる学科である、電気情報工学科卒業生の進路

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39256/09093993-5f25-7b40-a50b-b85600323c1e.png)

そもそも、就職してくださる方が10名未満という事実

### 進学先

いわゆる我が県一番の偏差値を誇る県立高校より高い偏差値が必要な、明石高等専門学校からの進学先だけのことはあると言える。

見る人によっては、我が県一番の偏差値を誇る県立高校より高い偏差値の学校なのに、東京大学数人？という見方をするかもしれないが、「我が県一番の偏差値を誇る県立高校の闇」として別の機会に議論したい


https://www.akashi.ac.jp/electrical/o7en060000000qdq-att/shinroE.pdf

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39256/2f7d84af-7f46-839c-dc89-004636ef2d7d.png)


### 就職先

「我が県一番の偏差値を誇る県立高校」より偏差値が高い明石高専の進学先に進まず、本来の設立目的に寄り添った就職という選択肢を選んだ将来がこちら。

ほとんどが、保護者共々両手離しでおお喜びするようなお名前。

ただし、就職後の企業内における高専出身者の待遇までは未調査なので言及できない。

一般的には、高専卒業の子の方が、大卒の子より待遇が悪いと聞く。

これは、経営・人事側が高専について「専門学校？」みたいな理解をしているからなのか、高専の子たちの絶対数が少ないために待遇改善というか、「大卒と同じか、院卒と同じ」ぐらいの要求を出すに至らない為かまでは不明。

とにかく、IT業界において、高専生が就職市場に放出される数は多くない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39256/be2ebd7b-d50b-9161-f857-c103f58003ed.png)

## 就職活動vs採用活動

高専生を採用するとなると、おそらくフェア↓を思いつく。

https://www.kosen-k.go.jp/exam/event/kosenfair2023.html

しかし、明石高専ぐらいになると、その前段階で教授推薦的な流れで話が決まることも有るんじゃないかと思う。

### 地方学生にとっての就職活動

そもそも、情報処理学科の偏差値高い高専から選んでいくと、進学率の高さから就職希望社が少ない。

情報処理学科の、少ない就職希望者を採用するには一本釣りするしかないのではないかと感じる。

自分が学生の頃は絶賛就職氷河期だったので、早めに離脱したが、就職氷河期いかんに関わらず、マス採用試験への対応は地方学生にとって負担でしか無い。

いまでこそ、リモート採用ができるのだが、会って話すことの優位性は高い。

### 主語は誰か

勘違いした人も多いと思うので主語を明確にしたい

>いまでこそ、リモート採用ができるのだが、会って話すことの優位性は高い。

高専生が東京に行って採用担当と会って話すのではなく、「採用担当者が各高専に赴いて、高専生に会いに伺う」という意味

`他の会社はリモート面接だったけど、この会社は会いに来てくれたという特別感`

学生にとっては、教授からの推薦よりも、嬉しいことだろう

自分だったらひょいひょいついていく


## 学生の将来

ただ、IT業界の人（主にWebサービスとか、プログラマーとか、インフラとか）思い出してほしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39256/be2ebd7b-d50b-9161-f857-c103f58003ed.png)

冠だけ見たら保護者は喜ぶ。

では、IT業界の人どうだろ、就職先名から「仕事の内容と辞める理由」がセットで予想できる会社があると思う。

学生や教授や保護者はそこに気づけ無い。

冠だけ見るから。

## 言い換える

大谷翔平選手が日本ハムを選んだときのプレゼンを例に、「チームの利益ではなく大谷翔平選手の将来を考えている」というメッセージ

https://frenchkiss-emuzu2.ssl-lolipop.jp/03/zip/121213-nihonham-ohtani.pdf

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39256/902d42ae-59cd-e241-dfd5-874b73647b07.png)

つまり、人生は長い。

## 費用対効果

そこまで高専生に割いて良いのか？

こればかりは、各社の事情によると思う。

十分に良い人材、かつ、辞めない人材を採用できていれば良いと思う。

つまり、今年の採用人数を満たしたらOKではない。

## 高専生を採用する方法

- 高専に直接赴き、マス採用ではないことを理解しておく
- 1校に数名しかいない候補を大谷翔平選手だと思って対応する
- 自分だったら他社を選ぶという選択肢（任天堂だな）がある子であれば、他社（任天堂だろ）に行くことと、転職するときはウチ来てねって伝える
静的メンバ

https://paiza.jp/works/mondai/class_primer/class_primer__static_member

```py
class Ghest():
    def __init__(self):
        #初期化
        self.sum = 0

    def take_food(self, price):
        self.sum += int(price)
    def take_softdrink(self, price):
        self.sum += int(price)
    #ここでデフォルト引数追加
    def take_alcohol(self, price=500):
        pass
    def get_sum(self):
        return self.sum

class Adult(Ghest):
    def __init__(self):
        super().__init__()
        #初期化
        self.alcohol = False
    def take_food(self, price):
        if self.alcohol:
            self.sum += int(price) - 200
        else:
            self.sum += int(price)
    def take_alcohol(self, price=500):
        self.sum += int(price)
        self.alcohol = True

N, K = map(int,input().split())
ghests = [None] * N

for i in range(N):
    age = int(input())
    if age >= 20:
        ghests[i] = Adult()
    else:
        ghests[i] = Ghest()

#注文リスト(0=number,1=order,2=price)
count = 0
for _ in range(K):
    order = input().split()
    if order[1] == "0":
        ghests[int(order[0])-1].take_alcohol()
    elif order[1] == "A":
        print(ghests[int(order[0])-1].get_sum())
        count += 1
    else:
        if order[1] == "food":
            ghests[int(order[0])-1].take_food(int(order[2]))
        elif order[1] == "softdrink":
            ghests[int(order[0])-1].take_softdrink(int(order[2]))
        else:
            ghests[int(order[0])-1].take_alcohol(int(order[2])) 
            
print(count)
```
静的メンバ。。。やってませんね。。。
えっと静的メンバというのはクラスで使えるカウントできるやつでしたね。。。
まあPHPやってたのでstaticを指すものだということぐらいはわかるのですが
とりあえずやってみます

```py
class Ghest():
    #静的メンバ追加
    n = 0
    def __init__(self):
        #初期化
        self.sum = 0

    def take_food(self, price):
        self.sum += int(price)
    def take_softdrink(self, price):
        self.sum += int(price)
    def take_alcohol(self, price=500):
        pass
    #get_sumメソッドをaccountingメソッドに変更
    def accounting(self):
        Ghest.n += 1
        return self.sum
        
class Adult(Ghest):
    def __init__(self):
        super().__init__()
        #初期化
        self.alcohol = False
    def take_food(self, price):
        if self.alcohol:
            self.sum += int(price) - 200
        else:
            self.sum += int(price)
    def take_alcohol(self, price=500):
        self.sum += int(price)
        self.alcohol = True

N, K = map(int,input().split())
ghests = [None] * N

for i in range(N):
    age = int(input())
    if age >= 20:
        ghests[i] = Adult()
    else:
        ghests[i] = Ghest()

#注文リスト(0=number,1=order,2=price)
count = 0
for _ in range(K):
    order = input().split()
    if order[1] == "0":
        ghests[int(order[0])-1].take_alcohol()
    elif order[1] == "A":
        print(ghests[int(order[0])-1].accounting())
    else:
        if order[1] == "food":
            ghests[int(order[0])-1].take_food(int(order[2]))
        elif order[1] == "softdrink":
            ghests[int(order[0])-1].take_softdrink(int(order[2]))
        else:
            ghests[int(order[0])-1].take_alcohol(int(order[2])) 

#メンバ変数表示          
print(Ghest.n)
```
こんな感じで使いました
どんな時にこう使うというのが慣れていないと難しいですね
【Flutter】ListView.builderが動かない時の対処法

こんにちは。
今回は、ListView.builderが動かない時の対処法を紹介します。

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)

ListView.Builderのプロパティに「physics: const NeverScrollableScrollPhysics()」が入っていませんか？
これを消すだけで動きます。


# 使用例
```dart

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ListView.builder(
        physics: const NeverScrollableScrollPhysics(), //これを消す！！！！
        scrollDirection: Axis.horizontal,
        itemCount: 10,
        itemBuilder: (context, index) {
          return Padding(
            padding: const EdgeInsets.all(8.0),
            child: Container(
              width: 100,
              height: 20,
              color: Colors.pink,
              child: Text('$index'),
            ),
          );
        },
      ),
    );
  }
}


```

# 実行例

![listview.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/b0d9c26e-fa7f-e030-5603-ff39920dc000.gif)


# 最後に
ここまで読んでいただき、ありがとうございました！
いいねしてくれたら、スキップして喜びます:heartpulse:
【Python】文字列は最大の悪だ！文字列撲滅に寄与するconst.py

# 目次
[1.なぜ文字列は最大の悪なのか](#なぜ文字列は最大の悪なのか)
[2.実例](#2-実例)
[3.おわりに](#3-おわりに)

# 1. なぜ文字列は最大の悪なのか
開発現場では、極力文字列をプログラム内で書かないようにしています。
Swiftで言えばR.swiftという外部ライブラリを<INS>わざわざ用いる</INS>ことで文字列排除をしています。
ではなぜ、これほど`文字列排除運動`が盛んに行われているのか、、、
それは、<INS>ヒューマンエラーを極力避けるため</INS>です。
人間はミスをするものです。普段からキーボードを見ずにブラインドタッチでガンガンタイプしているエンジニアならタイピングミスなどのヒューマンエラーによる予期せぬところでのバグ発生。複数人での開発であれば尚更です。
これが一番の無駄。
そこで現場で採用しているのは、<INS>文字列管理の手法</INS>です。

# 2. 実例
早速コードを載せます。　
①文字定義ファイル
 ~~~python: const.py
 from enum import Enum
 
# debug系
class DEBUG(Enum):
    DEBUG_SUCCESS = '処理完了:'
    DEBUG_FAIL = 'エラー発生:'

    def name(self, funcName):
       return  self.value + funcName
 ~~~
②文字定義ファイルを使う側
 ~~~python: main.py
 import sys
 import . from const

def function1():
    for i in range(10):
        ...

    successLog = lambda name : print(const.DEBUG.DEBUG_SUCCESS.name(name))
    successLog(sys._getframe().f_code.co_name)
    
def function2():
    for i in range(20):
        ...
    successLog = lambda name : print(const.DEBUG.DEBUG_SUCCESS.name(name))
    successLog(sys._getframe().f_code.co_name)


function1()
function2()
 ~~~
③実行結果
 ~~~実行結果
 処理完了:function1
 処理完了:function2
 ~~~

 # 3. おわりに
 結論、webバックエンド開発や、ゴリゴリにデバックしたい場合を除いて逆に不要です。
 今回記事を執筆するにあたり、現場の手法を用いようと考えてみたのですが、小規模開発では導入の恩恵はあまり教授できないかもしれません。ご参考程度に。
【Salesforce】簡易版勤怠管理システムを作ってみる④

勤怠管理システム作成の最後です。
[簡易版勤怠管理システムを作ってみる①](https://qiita.com/yickey/items/336340bcaa060c6a2913)
[簡易版勤怠管理システムを作ってみる②](https://qiita.com/yickey/items/22b1e4ce5a0719c68aba)
[簡易版勤怠管理システムを作ってみる③](https://qiita.com/yickey/items/afab846f06d03949aab6)

勤怠管理のダッシュボードを作成します。
勤怠管理アプリケーションを作成します。
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/ceafdae9-776d-544f-6dd3-eae53bf9d48e.gif)

## 1.レポートの作成
ダッシュボードに配置するための"勤怠管理"レポートを作成します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/0dafe693-a0c8-e14f-d0c8-41f51d60167e.png)

"レポート"を開いて"新規レポート"ボタンを押下します。
"レポートタイプを選択"で、"勤怠管理"を選択してください。
※"勤怠管理"が見つからない場合は、
　"勤怠管理"オブジェクトの"レポートを許可"にチェック
列に下記の項目を選択します。
　勤怠管理: 勤怠管理名、従業員、出勤時間、退勤時間、
　休憩時間(h)、労働時間(h)、ステータス、コメント
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/9c6b2fca-28e4-3ca7-7658-0d9c93f5c684.png)

検索条件で"表示"を"すべての勤怠管理"にします。

"保存"ボタンを押下します。
　レポート名 : 勤怠管理レポート
  フォルダー : 公開レポート

## 2.ダッシュボードの作成
月別、従業員別でレコードを抽出する"勤怠管理"ダッシュボードを作成します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/b36f3ade-2301-005f-83a7-7b95f169818a.png)

"ダッシュボード"を開いて"新規ダッシュボード"ボタンを押下します。
　名前 : 勤怠管理ダッシュボード
  フォルダー →
　　"新規フォルダー"ボタンを押下して、"公開ダッシュボード"を作成します。

"＋ ウィジェット"ボタンを押下して、"グラフまたはテーブル"を選択します。
"勤怠管理レポート"を選択してください。
列 : 勤怠管理: 勤怠管理名、従業員、出勤時間、退勤時間、
　休憩時間(h)、労働時間(h)、ステータス、コメント
並び替え : 出勤時間
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/99a82c3c-7866-e44d-74e4-54cabc4d698d.png)

"＋ 検索条件"ボタンを押下して、"出勤時間"を選択します。
"検索条件値を追加"ボタンを押下して、任意の条件を追加してください。
(例)
1.
演算子 : 次の値の間
開始日 : 2月1日
終了日 : 3月1日
※終了日は、指定した日を含まないため
表示テキスト : 2024年2月
2.
演算子 : 次の値の間
開始日 : 3月1日
終了日 : 4月1日
表示テキスト : 2024年3月
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/30c20233-4437-293b-fd7e-76e823887810.png)

"＋ 検索条件"ボタンを押下して、"従業員"を選択します。
"検索条件値を追加"ボタンを押下して、任意の条件を追加してください。
(例)
1.
演算子 : 次の文字列と一致する
値 : セールス 太郎
2.
演算子 : 次の文字列と一致する
値 : サービス 花子
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/8c73f3d3-6c94-3198-5f04-d2171f56d1fe.png)

"保存"ボタンを押下します。

## 3.アプリケーションの作成
勤怠管理アプリケーションを作成して、"勤怠管理"オブジェクトと"勤怠管理"ダッシュボードを配置します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3255462/93d4269b-62fb-e2f8-51d5-b51db2eeccfd.png)

設定→アプリケーションマネージャーで"新規Lightningアプリケーション"ボタンを押下します。
◯アプリケーションの詳細およびブランド設定
アプリケーション名 : 勤怠管理
API 参照名 : attendance_management
◯アプリケーションオプション
デフォルト
◯ユーティリティ項目 (デスクトップのみ)
デフォルト
◯ナビゲーション項目
選択済みの項目 : 勤怠管理、ダッシュボード
◯ユーザープロファイル
選択済みプロファイル : システム管理者、標準ユーザー

## 完成
標準機能を使って簡単な勤怠管理システムを作成することができました。
従業員は、勤怠管理を毎日使用するため、Salesforceの社内浸透に効果を発揮します。
デフォルト引数

https://paiza.jp/works/mondai/class_primer/class_primer__set_default

すみません、デフォルト引数を使わないまま
解答しました。。。

```py
class Ghest():
    def __init__(self):
        #初期化
        self.sum = 0

    def take_food(self, price):
        self.sum += int(price)
    def take_softdrink(self, price):
        self.sum += int(price)

    def take_alcohol(self, price):
        pass
    def get_sum(self):
        return self.sum

class Adult(Ghest):
    def __init__(self):
        super().__init__()
        #初期化
        self.alcohol = False
    def take_food(self, price):
        if self.alcohol:
            self.sum += int(price) - 200
        else:
            self.sum += int(price)
    def take_alcohol(self,price):
        self.sum += int(price)
        self.alcohol = True

N, K = map(int,input().split())
ghests = [None] * N

for i in range(N):
    age = int(input())
    if age >= 20:
        ghests[i] = Adult()
    else:
        ghests[i] = Ghest()

#注文リスト(0=number,1=order,2=price)
for _ in range(K):
    order = input().split()
    if order[1] == "food":
        ghests[int(order[0])-1].take_food(int(order[2]))
    elif order[1] == "softdrink":
        ghests[int(order[0])-1].take_softdrink(int(order[2]))
    elif order[1] == "0":
        ghests[int(order[0])-1].take_alcohol(500)  
    else:
        ghests[int(order[0])-1].take_alcohol(int(order[2]))

#結果
for ghest in ghests:
    print(ghest.get_sum())

```

デフォルト引数使うと

```py
class Ghest():
    def __init__(self):
        #初期化
        self.sum = 0

    def take_food(self, price):
        self.sum += int(price)
    def take_softdrink(self, price):
        self.sum += int(price)
    #ここでデフォルト引数追加
    def take_alcohol(self, price=500):
        pass
    def get_sum(self):
        return self.sum

class Adult(Ghest):
    def __init__(self):
        super().__init__()
        #初期化
        self.alcohol = False
    def take_food(self, price):
        if self.alcohol:
            self.sum += int(price) - 200
        else:
            self.sum += int(price)
    def take_alcohol(self, price=500):
        self.sum += int(price)
        self.alcohol = True

N, K = map(int,input().split())
ghests = [None] * N

for i in range(N):
    age = int(input())
    if age >= 20:
        ghests[i] = Adult()
    else:
        ghests[i] = Ghest()

#注文リスト(0=number,1=order,2=price)
for _ in range(K):
    order = input().split()
    if order[1] == "food":
        ghests[int(order[0])-1].take_food(int(order[2]))
    elif order[1] == "softdrink":
        ghests[int(order[0])-1].take_softdrink(int(order[2]))
    elif order[1] == "0":
        #ここの引数がなくなった
        ghests[int(order[0])-1].take_alcohol()  
    else:
        ghests[int(order[0])-1].take_alcohol(int(order[2]))

#結果
for ghest in ghests:
    print(ghest.get_sum())

```

とまあ、こんなふうな変化しかないですが
一応メモで
Unity 状態遷移でゲームを動かす

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/f652bd32-b3a4-4cb6-7a42-9755c2b60641.png)

ゲームにかかわらず状態遷移の考え方はプログラム全般の核となる部分だと思っている。ブログラムすべてとなる順次　反復　分岐の分岐にあたるのがこの考え方。フラグ管理も状態遷移のひとつと考えることができる。
ONとOFFの２つの状態だ。

## 御託はいいから、Unity上で実現したい
StateMachineBehaviour継承したクラスを作りアタッチする。

```
    public class すきな名前 : StateMachineBehaviour
    {
        public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            Debug.Log("Idle_Enter");
        }
        public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            Debug.Log("Idle_Update");
        }
        public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            Debug.Log("Idle_Exit");
        }
    }
```
AnimatorタブStateを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/1de253b8-2164-4e11-df95-0755bd4d2c2e.png)

Add Behaviourから作成したScriptをアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/4dbbcf00-d94f-0229-fab8-e5a9047955cc.png)
実行するとStateに入った時、入り中、出た時のタイミングで実行される
![steate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/6ff5b506-b0f8-e582-9282-473f145b195c.gif)


## 状態遷移の実行タイミング
- （状態に入る前の処理）
- 状態に入った瞬間
- 状態中
- 状態を抜ける時
- （状態に抜けた後の処理）
大きく分けると３つ（プラス２つ）のタイミングで処理を呼び出すことが出来ればどんな複雑な処理も実現できる。

Unityにはこれに相当するコールバックが用意されているのでそれを利用する。

## UnityAnimationで実装する利点
Unityの画面上でいまどんな状態なのかが確認しやすい。その状態かがどんな状態へ遷移できるのか、矢印で表示されているためわかりやすい。

## もっと便利に
### 状態の階層化
Sub State Machineを利用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/3ea332d4-90d7-0995-93bb-131fcd1e7efc.png)

たとえばあるくととまるの状態があり、それぞれあるいているときにはジャンプとはしるを行いたい、という状況があるとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/a28cfcae-e86b-c79d-33df-f3b54fa1c871.png)
CreateSubStateMachineからあるくを実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/4971b032-cebf-43a8-e8fb-6db113e55bac.png)
ダブルクリックで中にはいれる
Entryからあるくへ、出口はBaseLayerのはしるにつなげる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/d160f737-521f-a081-930d-c8bbc0ccd9b8.png)

これでSubState使用前と同じ機能を作ることができる。

### レイヤー化のTips
なんでもレイヤー化すればよいというものでもない。複雑さが増すため使用する時には注意すること。

### テンプレを作る
VisualStadioなら

https://qiita.com/sebunwork009/items/c9f1c20f65b93a77781d


## 参考サイト

https://note.com/hikohiro/n/n7cc04a125711

https://qiita.com/TakashiHamada/items/a5ff15ca7e63c06bfb23

https://nn-hokuson.hatenablog.com/entry/2017/04/07/195859

https://tsubakit1.hateblo.jp/entry/2015/05/01/032208

https://q7z.hatenablog.com/entry/2017/05/26/224255
サーバ間でのデータ転送をUGEで実行する

サーバAから遺伝研スパコンへ、UGEで大量にsftpでファイルを転送したい場合のジョブスクリプト（備忘録）。

```
$ cat transfer.sh
#!/bin/sh
#$ -cwd

sshpass -p 'yourpassword' sftp　-oPort=xxxx -oCiphers=aes256-cbc -oBatchMode=no -b - username@server.address.com << !
#   sftpのコマンドが使用できる
#   cd remote_directory_path
#   lcd local_directory_path
   mget *
   bye
!
```
sftpのオプション
username@server.address.com: サーバAのアカウント名とアドレス
yourpassword: サーバAのパスワード
-oPort=xxxx: サーバAにポート指定がある場合
-oCiphers=aes256-cbc: サーバAに暗号化方式の指定がある場合


最後の!は、勝手にテキストエディタがスペースを補完することがあり、そのままだとエラーになるので注意する。例えばこのスクリプトを実行すると、
```
sshpass -p 'yourpassword' sftp -oPort=xxxx -oCiphers=aes256-cbc -oBatchMode=no -b - username@serveradress << !
#   cd remote_directory_path
#   lcd local_directory_path
   mget *
   bye
　　　　　!
```
以下のエラーが出る。
```
transfer.sh: line 10: warning: here-document at line 5 delimited by end-of-file (wanted `!')
```
(メモ)IBM i のネットワークファイル共有：ネットサーバー

以前、[こちらの記事](https://www.i-cafe.info/column/serials/dekiruibmi_no11)　でIBM i のネットワークファイル共有について書きましたが、
IBM i OSはCIFS, SMB, NFSなど標準的なファイル共有機能をOS標準で提供しています。

**IBM i のファイル共有機能をネットサーバー(Net Server)**　とよびます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/309993d2-0a91-0a15-82ad-15db62977d83.png)

## IBM i ネットサーバーのサポートするCIFS(SMB)バージョン
以前調べた情報がこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/80ac78f6-4c4b-98b2-599f-0f1190086971.png)

## ネットサーバーのサポートするCIFS(SMB)バージョン情報
現時点では恐らく最新の情報が下記にありました。
※もし、一つ上の画像のサポート表と比較して相違があれば、下記リンクの情報が正です。

[What versions of SMB are supported by IBM i NetServer?](https://www.ibm.com/support/pages/what-versions-smb-are-supported-ibm-i-netserver)

上記URL記事のサマリー：IBM i OSのSMBバージョンサポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8df81ff0-f77a-cace-0583-c047da0a6098.png)

## ネットサーバーのCIFS(SMB)バージョンの制御方法

というリンクがありましたので一先ず貼ります。あとでまとめたいと思います。

[IBM i NetServer SMB protocol version control guide](https://www.ibm.com/support/pages/ibm-i-netserver-smb-protocol-version-control-guide)

## ネットサーバーQA
guriguriさんからコメント頂きました内容を追記します。

Q1. 日本語は使える？
A1. YES.
ACSなど5250端末以外から使う場合は特に考慮点はありません。ただ、5250端末では"DBCSの前後にSO/SIコードが付与して表示される"という点に注意が必要です。（※あくまで表示だけで、実際のファイル名にはSO/SIは付与されない、というところがミソかと思います）

例えば下記のようにCPYコマンドでIFS上のCSV(SBCSファイル名）をDBCSのファイル名でコピーしようとすると、SO/SIコードが付与されて表示されます（ エラー の前後にSO/SIが入って表示されている）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/571b5d8a-f4a9-f242-7f64-67334797cbb6.png)

上記コマンドで作成されたファイルを5250端末とACSのIFS表示から見てみると、、
左側のACS IFS表示では普通に エラー.CSV と表示されています（IBM i OS上に作成されたファイル名）。一方,5250端末で見るとSO/SIが前後に表示されて エラー .CSV と表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/973776f3-4287-b3a3-98e3-3e8d87929657.png)

SO/SIを表示して確認したい場合は,ACSの場合は Ctrl + F1キーで表示できます。下記のようにSO/SIを ｛｝で表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d9a200d0-3737-e7e6-7139-41160a492400.png)



うむ、なんかバタバタでメモ書きですみません。更新したいと思います。
Unity Asset Modern UI Pack の使い方

## Modern UI Packとは
シンプルでモダンなデザインのUIが利用できる。
どんな感じかは動画で見たほうが早い

https://www.youtube.com/watch?v=B9p5ZsGllMQ

## 使い方
基本的にはUnityのUIと同じような感じで使用できる。UnityのUIのシステムを組み込んで作っている部分もある。
UnityのUIと同じようにCanvasの配下で機能する。ここ重要。

Assetとインストールしたら、たとえばボタンなら
右クリック＞ModernUI>Button>Basic(ボタンの動きかた)>Blue(ボタンの色
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/302cb81f-179c-5020-4fc3-1d6bf7687806.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/fca9a7c9-a13f-b8e3-fcc0-e5abbff467ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/0909f74f-4f09-f591-0071-f88be1329db4.png)

## ModernUIの特徴的な使い方
オブジェクトの子に2つのオブジェクト（Text,Ripple) があるが基本的には親のButtonのinspectorで設定が行えるようになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/6b038993-ae60-6d47-5a0b-55f54ec0db63.png)

（コンセプトとしてはそう作られているのだとおもうけど、うまく機能していない）

ここがタブになっていて切り替えて設定をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/3a5297cb-1895-0ba4-79bc-3748a9488dc2.png)

そして、重要なのが設定はUI Managerでまとめて変更するようになっていること、inspector上で変更しても表示上では変わっているようにみえても変わらないことがあるためひっかかりやすいポイント。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/75664171-ff77-e5e9-f4f9-3c683eab47c9.png)

設定が変わらないと思ったら。まずManagerで設定していないか確認する。
例えばボタンだと、Fontや文字の大きさはここで設定しないと変化しない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/91d16cf5-eed9-63a6-b738-da0e09918ca1.png)
その上で個別の親のオブジェクトの設定をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/14cfcfb8-85e4-66b6-6424-b1329951c7ae.png)
そのあと子の設定を見直す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/1f9f670a-40a5-c6ec-bdcc-4917bf04c52b.png)

## 別の画面を表示する　ModalWindowの使い方
やりたいこと
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/41802aa5-c7d1-378c-8352-9492be0ef2d1.gif)
ModalWindowを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/5d4b1303-9ae9-d356-0c95-ac2aa94f9735.png)

タイトルとか書いてある文字を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/35f3ae99-8156-9011-ca94-6a14e93efd23.png)

このModalWindowManagerScriptの中に呼び出し用の関数が実装されているためのこれをなんでもいいのでButtonにアタッチする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/2b146fb3-f951-0bd2-a954-28151ed342e4.png)

OpenWindowを呼び出す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/3485d024-15c7-8011-49ac-a8d2e2c48b04.png)

これでOK


## 所感
すべて親オブジェクトで設定できる、または親の設定がオーバライドしているのは警告なり出てくるようにするなどしてほしい。
ドキュメントも詳細ではないので手放しでおすすめできるAssetではないかも


## 参考サイト
https://docs.michsky.com/docs/modern-ui-pack/