OmniAICreator/Qiita-1.07M huggingface dataset:
フリーランスになって1年半経ったので、絶対にやっておくべきことをまとめた

## 業務委託に便利な稼動管理システムをリリースしました

topicを書いて「購読ファン」を増やせます
https://i-ssue.com/users/knIVlAt80UaXrYmIZfVWLwmcnu13

タイマー押すだけで稼動管理可能なシステム
https://i-ssue.com/reports

## はじめに
フリーランスとして働き始めてから1年半が経ちました。
その中で、どのように案件を受けていけばいいのか、どのような働き方をすればいいのかがイメージできてきました。
これから、独立するまたは現在フリーランスとして働き方に悩んでいる方の参考になれば思い、記事を書いてみました。

## フリーランスにとって重要なこと

### 市場価値
個人で仕事を獲得するためには企業というバックグラウンドがない分、シビアにあなたの市場価値が見られます。
常にエンジニアとしての市場価値を意識しておくといいと思います。

### 保険をかけておく
現在の契約が切れても収入が不安定にならないように、常にリスクヘッジをしておくことが重要です。

### 営業力
保険をかけておくためには、仕事を獲得する手段を持っていなければなりません。
営業といっても言葉で相手を圧倒するようなものではなく、自分ができることをわかりやすく文章で伝えられるだけでもOKです。

## やるべきこと

### 2社以上で働き2倍知見獲得をする
- システム
    - いうまでもなく、システムは知見の宝庫です。アーキテクチャ、開発体制、コードなど自分が持ち合わせていない知見も必ずあると思います。
- slack
    - timesなどを見れば他のエンジニアの方がシェアしている記事や、思考など参考になる部分はたくさんあると思います。最近は経営者の方もtimes発信されていたりするので、貴重な情報収集の場になると思います。
- ランチ
    - 会話によって得られる情報量はテキストよりも大幅に増えます。ランチのひと時で一緒に働く方々との距離を縮めるチャンスでもあります。
- ミーティング
    - 全体会議をイメージしています。エンジニアリングだけでなく、他の業務をも学べる機会です。エンジニアリングがセールスや広報などとどのように関わっているのか、自分のしていることを線で捉えることのできる貴重な時間になります。

### 2社以上で働きリスクヘッジする

- 1社に全てのリソースを当てるのは契約解除になった際に次の契約先が決まるまで収入が凹むのでリスクが高いです。
- 常にリスクヘッジとして2社以上で契約しておきましょう。
- リソース配分としては**2日**/週(1社目)**3日**/週(2社目)もしくは**2日**/週(1社目)**2日**/週(2社目)がおすすめです。(**1日**/週はパフォーマンスが出しづらいです)
- 2社で働く際のおすすめはこのようなイメージの企業です。
    - 1社目(**安定**)
        - 自分の得意な技術を扱っていたり、気心の知れた仲間と働けるような精神的に安定した企業
    - 2社目(**チャレンジ**)
        - 即戦力になれないような、知見獲得目的の企業

### 2年以内にできたモダンな技術を扱っている組織に所属する

- 2年というのは目安ですが、比較的新しい技術を使っていてかつ運用知見がたまり始めているのはこの辺りかなと思いました
- 下火になるような技術は避け、比較的モダンと言われるような技術(React.js, TypeScript, Go, ...)を扱っているところに行くと今後の技術トレンドの波にも乗り遅れづらいです
- スタートアップならではのフットワークで新しい技術を使ってるところに行きましょう 


### 将来の選択肢を減らさないようにリスペクトできる人と働く
- 一度契約が切れても、タイミング次第で**再び一緒にお仕事する**ことがあります
- その場合、企業先にリスペクトできる方がいる場合が多いです
- 自分がリスペクトしている相手には自然と振る舞いも**礼儀正しくなり、良好な関係を続けやすい**からだと思っています
- 私個人のリスペクトできる人の特徴は以下です
    - **悪口・陰口を言わない**
    - **特定の分野で深い知見を持っている**
    - **マインドに共感できる(年齢は関係ない)**

### 過去1年以内に資金調達している将来性のあるサービスを選ぶ
- 成長が見込まれるような会社はVCから資金調達をしている企業が多いと思います
- 将来性のある企業には優秀な人材が集まりやすく、知見がたまりリレーションなども構築できるのでおすすめです

### 日頃から情報発信してすぐに働ける企業を2社以上を確保しておく

- フリーランスは自分の市場価値を高め、自分を売り込む営業力を磨く必要があります
- よくある手法としては以下です
    - 経歴書をしっかり作っておく
        - wantedly
        - Githubの自己紹介リポジトリ
        - 独自にwebサイトを作る
    - 一緒に働く仲間とチームとして売り込むのもいい([参考](https://innovative-turret-f2e.notion.site/About-Resource-Development-as-a-Service-4b3e66480b4b4ec993f017d0aa8975c4))
    - 技術ブログ(Qiitaや[Dev](https://dev.to/)、はてブ、Zenn)で情報発信する


### 付き合いでの仕事は希望単価を高めに設定する

- あまり気は進まないが、どうしても付き合いで仕事を引き受ける場合もあるでしょう
- その場合はモチベーションを確保する工夫をしておくといいと思います。
    - 希望単価を高めに設定する
    - 期間(できれば短く)を決めておく
- モチベーションがない状態で受けてしまうと、成果も悪くなり評価や関係性の悪化を招きます


## まとめ
フリーランスとして働くことは様々な企業から知見を効率的に獲得できて、エンジニアとしても成長できるので私はお勧めしています。
一歩踏み出すのが大変という方々のお役に立てれば幸いです！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658704/99588134-fda6-8a69-b5d8-849af2958710.png)
https://i-ssue.com/

エンジニアの副業やフリーランス、スキルアップについての情報発信してるのでフォローしていただけると励みになります！
[@twinsdevelopper](https://twitter.com/twinsdevelopper)
IDフェデレーション とは

## 勉強前イメージ

OAuthに関連あるんじゃなかったっけ？

## 調査

### IDフェデレーション とは

元々フェデレーションというのは一度の認証で、
認証が通れば他の許可されているすべてのサービスが使えるようになる仕組みで、
IDフェデレーションは上記のID版で、IDの管理基盤はそのままでネットワークのドメインを跨いで連携させるために
IDフェデレーションが使われています。

元々ID管理やSSOは社内ネットワークのシステムやアプリケーションを管理したりしていましたが、
クラウドサービスなど社外のサービスやアプリケーションを使用することが多くなるにつれて社外とのアプリケーションでもSSOを実現する必要が増えてきました。
従来のSSOは社内ネットワークに特化しておりネットワークのドメインをまたぐのは適してなかったのです。
そこでネットワークのドメインをまたいで連携させるものとしてIDフェデレーションが使われるようになりました。

### IDフェデレーション の特徴

- ドメイン間の認証

企業や組織、サードパーティなど各ドメイン間での信頼関係を確立することでドメイン間でIDを共有して
ユーザの認証を行うことができます。

- 標準実装

SAMLやOAuth、OpenID Connectなど標準のものを使って実装されています。
これによって安全な送信が可能になります。


### SSOとIDフェデレーションの違い

IDフェデレーションはSSOの一つで、
SSOのフェデレーション方式 というイメージです。
他にも以下のようなSSOの方式があります。

- エージェント方式
- リバースプロキシ方式
- 代理認証方式
- 透過型方式

## 勉強後イメージ

最近SAMLだったりOAuthだったりちょこちょこ調べてたらイメージわかってきたけど
逆に混乱してきた部分もある・・・・
ちょっとまとめたいなぁ

## 参考

- [統合ID管理、シングルサインオンとどう違う？　「IDフェデレーション」基礎知識と選定ポイント](https://kn.itmedia.co.jp/kn/articles/1607/25/news142.html)
- [クラウドID管理における「ID フェデレーション 」とは](https://keyspider.jp/archives/234)
- [シングルサインオン（SSO）のフェデレーション方式とは？](https://it-trend.jp/single_sign_on/article/75-0028)
闇のSES「弊社は誰でもウェルカム」

これは駆け出しエンジニアのしょうたろうくんと駆け出せない美少女エンジニアのこぴぺたん（僕）のお話です。

# 闇のSES「弊社は誰でもウェルカム」

しょうたろう「聞きたいんだけど『弊社は今年未経験XX名入れます』って言ってるような小さな会社を見たんだけど、やっていけるの？」

こぴぺたん「んー…一概には言えないけど…」

しょうたろう「けど…？」

こぴぺたん「闇のSESの奴らなら…」

しょうたろう
＿人人人人人人人人人＿
＞　闇のSES！？！？　＜
￣Y^Y^Y^Y^Y^Y^Y^Y￣

<img width="400" alt="money_yami_soshiki.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/e3356cd7-643d-b225-882b-42f39a6756f0.png">

# 闇のSESとは…

こぴぺたん「闇のSES…それは古より続く組織…出来ては死に…まさに不滅…」

しょうたろう「結局どんなんなの？」

こぴぺたん「簡単に言うと人売り。しかも劣悪なやつ！」

しょうたろう「((((；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ」
<img width="400" alt="business_jinzai_tsukaisute.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/a11d6d05-b4f8-b6d4-e597-01c2742cd05b.png">

# 闇のSESの手口

こぴぺたん「闇のSESは色々種類があるん、昔からあるのは未経験詐欺！」

しょうたろう「未経験詐欺？」

こぴぺたん「未経験者を『積極採用』って言って誘うんダヨー」

しょうたろう「ｳﾝ((･ω･`;))」

こぴぺたん「んで、出荷！」

しょうたろう「ただ本当に未経験者を育成しようとしている会社も居るよね？」

こぴぺたん「あるとは思うけど、IT業界に居ない人がIT業界のそういった話を知っているかは…」

しょうたろう「当然わからないですね…」
<img width="600" alt="01.drawio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/7460260c-c568-918d-78a9-4a38637b6120.png">

## 偽装出荷
こぴぺたん「昔からよくあるのは経歴偽装！」

しょうたろう「稀によく聞きますね」

こぴぺたん「未経験だけど経歴書には何故か経歴が足されているだよ」

しょうたろう「それって詐欺じゃ…」

<img width="600" alt="02.drawio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/b00b4428-7d65-6891-b4cb-d1d976736364.png">

## エンジニアではない…？
こぴぺたん「エンジニア募集なのに仕事がエンジニアと全く無関係ってのも最近あったねー」

しょうたろう「テスターってのでもないの？」

こぴぺたん「そう！家電量販店とかさ！(　･ิω･ิ)」

しょうたろう「((((；ﾟДﾟ))))エンジニアを募集してたのに！？」

<img width="600" alt="03.drawio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/b602126f-e35a-b03d-9265-8f5d67217644.png">

## 案件が決まるまで未入社
こぴぺたん「他に酷いのは案件が決まるまで未入社って扱いもあるヨー」

しょうたろう「(´・ω・).oO（それってもう労基案件では？」

こぴぺたん「面談とか色々させて案件が決まったら入社させてやっと給与が払われる。なので無職で案件が決まらないと…」

しょうたろう「貯金がｶﾞﾘｶﾞﾘ減って…」

<img width="600" alt="04.drawio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/09d660b9-7583-dc57-b188-000bb0e2397e.png">


# SESの悪いイメージって

こぴぺたん「SESの悪いイメージも大半が闇のSESのせいなんだよ。普通こんな酷い会社はないよー」

しょうたろう「闇のSES怖いよー」
Human InterFaceGuidelineを理解する　その3

Naviagation
--
ナビゲーションはモーダルと違ってユーザーに画面遷移を気づかせないことがベスト。アプリの目的や用途に自然と溶け込むようにするのが良いとされている。
決して、ユーザーがアプリを触る集中を奪ってはいけない。

navigationの画面遷移を作成するにも三種類の組み方があるらしい。
![スクリーンショット 2021-10-26 10.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474285/d9ebec79-f6b1-45e9-040f-6931fcc99075.png)

階層ナビゲーション
--
一つの画面から階層に潜るようにナビゲーションをする方法。ある一つのコンテンツ、目的に際して、多くの画面分岐をする際に必要そう。

平面ナビゲーション
-
図にある通り、複数のコンテンツを平面的に並べる時に使う。コンテンツを並べる系アプリでよく使う・

コンテンツやＵｘドリブンのナビゲーション
--

ゲームなどで使われる。構造上、コンテンツの中身によってどのようにnavigationをするか決める。

・ユーザーが自身で今どこの画面にいるのか、コンテンツにいるのかを明確にする。
・コンテンツに簡単にアクセスできるような最小限の情報構造にする
・タッチジェスチャを使用して、簡単に画面遷移をするとよい
・標準のナビゲーションコンポーネントを使用しましょう
・基本はUIKitのコンポーネントにユーザーは慣れているのでそれを利用した画面遷移が推奨される。
・ナビゲーションバーを使用して、階層を移動させることを明示する。タイトルに書くとわかりやすい
・タブバーを使用して、コンテンツまたは機能の同列なカテゴリを綺麗にまとめる。
タブバーを使用すると、アプリ内での現在の位置に関係なく、簡単に画面を切り替えられる。
・同タイプコンテンツのページが複数ある場合は、ページコントロールでスワイプして切り替えれるようにする
・ページコントロールは、使用可能なページ数と現在アクティブなページを下の方に明確に伝える必要がある。

オンボーディング
--
インストール後の流れのこと。リピートを増やしたり、最初の流れを教育したりする

・起動画面をつくる。
・適切な向きで起動しましょう（縦向きか横向きか判断して描画する）
・すぐにアプリ使用に移りましょう(チュートリアルはリピーターには表示しない、最初の画面でのメニュー表示は最小限でコンテンツに集中させるようにする。)
・チュートリアルの基本事項を順守しましょう（アプリ操作は直感的にして、チュートリアルは必要最小限にする）
・学習は楽しく、発見可能に
動かしながら学ぶことは、説明書を読みながらよりもはるかに楽しく、ユーザーに対して効果的です。
アニメーションとインタラクティビティを使用し、コンテキストに沿って徐々に身に付けさせましょう。
また、インタラクティブに見えるスクリーンショットは表示しないでください。
・表立ってデバイスのセットアップ情報を尋ねることは避ける（多くのセットアップを求めると離脱率が多い。）
・アプリ内でライセンス契約および免責事項を表示しない
・アプリをダウンロードする前、App Storeで同意書と免責事項をしっかり提示する
・アプリの再起動時に以前の状態を復元しましょう　⇨データが消えることがないようにする
・アプリ評価を早期にまた、頻繁に求めすぎないこと⇨何回も評価を求めても嫌がれれるだけだよ
・再起動をユーザーに求めないこと
【インフラエンジニア】今後のキャリア戦略を考える

## 自己紹介
私は都内でインフラエンジニアをやっています。
主にアサインしている案件はMS製品のクラウド移行案件が多いような気がします。

## きっかけ
私自身、エンジニアになるまでという点に関してはすごく戦略立てて、エンジニアになれたと考えています。
が、一方で今後のキャリアという点に関してはまだまだ戦略不足。
そもそもまだ入社して間もないため、何ができるとか、PM/PLが何をしてるか、とかよくわからないことだらけなんですけども。
それでもキャリア戦略は立てておいて、損はないはず。
シンプルに自分の足りないところを可視化して、補うためにはどのようなアクションプランを取れば良いのかということが明確になるから。

## 目標
2年以内を目処にフルスタックエンジニアとして、独立をする
（ただしどちらかと言えばインフラ寄り）

まずは準委任としてそれなりに安定した状況で案件を受ける

その他、やりたいことはありますが、この目標設定が一番、一般的でわかりやすいと考えました。

## 調査
まずフルスタックエンジニアとして独立するためにどのような技術が必要なのか。
クラウドテックで案件を調べてみました。

### 必須スキル
- Microsoft Azure環境でのインフラ構築経験
- AWSを利用したインフラ構築
- インフラ構築の自動化
    - Cloudfoundation・ARM・Terrafomer
    - Powershellなど
- ネットワーク設計・構築
- docker、kubernetes等でのコンテナ基盤の構築
- 運用・監視ツールの導入
    - Prometheus

これらのスキルがホットワードとしてよくクラウドテックの案件の必要スキルに掲載されていました。
フルスタックエンジニアを目指すのであれば、これらのスキルに加えてアプリケーション作成の言語のスキルが必要になってくると思います。

特に使用されているであろう言語は

- Typescript
- Python

この辺りになるかと思います。
フレームワークはReact・Vue.js・Djangoなどでしょうか。

## 業務で学べるスキル
自分が今働いている企業では上記のスキルのうち学べるものは

- Microsoft Azure環境でのインフラ構築経験
- インフラ構築の自動化
    - Powershellなど
- ネットワーク設計・構築

これらのスキルは学ぶことができると考えています。
AWSについては今後学べる可能性がある、という感じでしょうか。
運用・監視についても不可能ではないと考えています。
ひとまずは上記の3つを早急に学ぶことを大前提にそこからAWSと運用・監視ツールの習得に移りたいと思います。

## 資格
インフラ関係の強みとしてはやはり資格でしょう。
どうしてもインフラやネットワーク関係はポートフォリオで示せないスキルが多いため、ポートフォリオとして資格を取得する必要があると考えます。

最低限取得を考えている資格は下記の通り。

- CCNA
- AWS
    - いわゆるAWS5冠
    - ソリューションアーキテクト アソシエイト・SysOps Administrator アソシエイト・デベロッパー アソシエイト・ソリューションアーキテクト　プロフェッショナル・DevOpsエンジニア プロフェッショナル
- Azure
    - Azure Fundamentals・Azure Developer Associate・Azure Security Engineer Associate

もちろん上位互換の資格はたくさんありますが、一旦この辺は最低限取得したいと考えています。

## 戦略
### ①社内でのアピール
まだまだスキルが足りていないことは明白。
業務でいろんな経験ができるとは言ってもすぐにいろんな経験をさせてもらえるわけではない。
となるとどうにかして自己研鑽をして、努力しているということをアピールする。
アピールの内容としては資格の取得が一番わかりやすいような気がする。
まずは業務的にもAzure Fundamentalsが最短な気がする。

### ②自己学習のアウトプット
個人的にインフラエンジニアのキャリアが見えにくい点としてアウトプットしている人が少ないように思える。
特にWEBアプリなどではYouTubeでもハンズオン形式でアプリ作成している人がいるが、一方でサーバー構築はどうだろうか？
AWSのEC2を立ち上げる、とかはよくあるが、その先のネットワークの設計・構築はどうだろうか？
結局その設計、構築をしたらWEBアプリはどうなるのだろうか？
この辺りを積極的にアウトプットしていくことで一つのポートフォリオにならないだろうか？
逆に企業側からすれば、この人はインフラのこの領域まではよく知っているんだなという風に感じ取ってもらえるような気がする。

### ③スキルシートを構築
業務で関わった案件を都度、まとめておく。
特にいざ独立するときに使えるスキルにフォーカスする

### ④WEBアプリの作成・チーム開発
いわゆるポートフォリオ。
WEBアプリの言語についてはPython、Typescriptなどを使用してWEBアプリを構築する。
知り合いのエンジニアと一緒に開発をしてチーム開発を実現する。

#### よくある開発案件
特に最近はマッチングアプリの開発が多いように思える。
Pythonならば業務効率化の領域。

### ⑤その他資格の取得
上記に記載した資格を概ね2年以内に取得する（目標高い）

## 課題
学ぶべきスキルは固有名詞で理解できた。
習熟度はどの程度求められるのであろうか？
その点については実際の業務を見ながら、どの程度の習熟度があれば、どの程度の仕事を任せられるのか、という点から逆算して考えていく。
今後、ブラッシュが必要な部分。

## 気付き
### 経験年数ではなくスキル制度であるということ
RPGで言えば、レベル制ではなく、スキル制であるということ。
○○の開発経験3年以上、みたいな募集はほとんど見なかった。
要するに、企業にそのスキルがあるということが伝わればOKであるということ。

### テーマは自動化、自動化については積極的に学ぶ
根本的にインフラは専門知識が求められる、その割には直接目に見えない部分なので、どれだけコストをかけてリターンがあるのか、わからない。
もちろん蔑ろにはできないし・・・・という諸々企業の思惑が見え隠れする中で、自動化はそれらを解決してくれる。
インフラエンジニアを育成する必要もないからコストもかかりにくい、再現性が高い...など。
構築、運用、管理、全ての工程で自動化ということが進められている。
この点については今後インフラエンジニアをやっていく上では必須スキルのようにも感じた。
PowerShellで最終更新日付（月単位）でディレクトリの中身を集計してファイルサイズと個数を出力するやつ

表題にあるとおり、`PowerShell`でファイル最終更新日付に着目して、対象ディレクトリの月単位のファイル更新でグループしてファイル使用量を出力するワンライナーを紹介します。

```PowerShell:最終更新日付（月単位）でディレクトリの中身を集計してファイルサイズと個数を出力するやつ
# 最終更新日付（月単位）でディレクトリの中身を集計してファイルサイズと個数を出力するやつ
@{Path = "./"; Recurse = $true } | ForEach-Object { Get-ChildItem @_ } | Group-Object { $_.LastWriteTime.ToString('yyyy-MM') } | Select-Object @{ Name = 'LastWriteTime'; Expression = { $_.Name } } , @{Name = 'Size(MB)'; Expression = { ($_.Group | Measure-Object Length -Sum).Sum / 1MB -as [decimal] } } , @{Name = 'FileCount'; Expression = { ($_.Group | Measure-Object).Count } } | Sort-Object LastWriteTime

# グループ化した時のGroupを残したやつ。（詳細を調査したい用）
@{Path = "./"; Recurse = $true } | ForEach-Object { Get-ChildItem @_ } | Group-Object { $_.LastWriteTime.ToString('yyyy-MM') } | Select-Object @{ Name = 'LastWriteTime'; Expression = { $_.Name } } , @{Name = 'Size(MB)'; Expression = { ($_.Group | Measure-Object Length -Sum).Sum / 1MB -as [decimal] } } , @{Name = 'FileCount'; Expression = { ($_.Group | Measure-Object).Count } } , Group | Sort-Object LastWriteTime
```

使いかたとしては、先頭にある`@{Path = "./"; Recurse = $true }`の部分に調査したいフォルダパスを入力し、サブディレクトリも対象にしたい場合は`Recurse = $true`。対象にしたくない場合は`Recurse = $false`として下さい。

基本的に、調査したいディレクトリにカレントディレクトリを移動して、上記`./`の相対パス指定で動かすでも問題ありません。

実行すると下記画像のように最終更新日付、Size（MB）、ファイル数が表示されるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/edf16f3f-1ab1-f8a0-81b8-432b91579bbe.png)
Nuxtでコンポーネントのファイルパスを動的な文字列で読み込みたいぜ・・・

# Nuxtでコンポーネントファイルを動的に読み込みたい場合の道2選。

さて、画面の条件によって読み込みたいコンポーネントを変えたい、差し替えたいって時ってありますよね。

## 動的コンポーネントのファイルパスが事前にわかる場合

```vue
<template lang="pug">
section
  component(:is='loadComponent') 
</template>
<script>
import customComponent1 from '~/components/customComponent1.vue'
import customComponent2 from '~/components/customComponent2.vue'
export default {
  components: {
    customComponent1,
    customComponent2
  },
  data() {
    return {
      // 後は条件で適当に変えて
      loadComponent: customComponent1,
    }
  }
}
</script>
```

これで、お好みのトリガーでloadComponentの値を事前に読み込んでおいたcomponentsのどれかに差し替えれば簡単にコンポーネントの動的切り替えができる。簡単ですね。

## 動的コンポーネントのファイルパスが事前にわからない場合

`import customComponent1 from '~/components/customComponent1.vue'`のファイルパスをstoreの値やapiから取得した値など、動的に変えたいときは、以下のようにしてください。

```vue
<template lang="pug">
section
  component(v-if='customComponent', :is='customComponent') 
</template>
<script>
export default {
  data() {
    return {
      customComponent: null,
    }
  },
  computed: {
    listCustomComponent() {
      return '動的に読み込みたいコンポーネントのファイル名'
    },
  },
  mounted() {
    if (this.listCustomComponent) {
      this.customComponent = () =>
        import(`~/components/xxxx/${this.listCustomComponent}`)
    }
  },
}
</script>
```

これでcomponentの指定を動的な文字列で指定することができます。
当たり前ですがファイルパスが間違っていると読み込まれませんので要注意。

この記事が役に立ったと思ったら！LGTMボタン！お願いしゃっす！
fullCalendar dayGridWeek で週変更ボタン(<,>)を日付レベルで変更できるようにする

# FullCalendar v5.10.0
Angular,React,Vue,といったフレームワークにも対応した便利なカレンダーライブラリ。
今回はフレームワークは使用していない環境下での話ですが、参考になればと。
nodejs環境下であるため、プラグインの宣言方法など違いがあるかもしれません。

# 週単位で閲覧範囲が遷移する仕様
`initialView`を`dayGridWeek`に設定すると、
デフォルトで`<`,`>`のボタンが設置され、押下すると次週に遷移する。
## 例：10月

|`>`押下前|1(Fri)|2(Sat)|3(Sun)|4(Mon)|5(Tue)|6(Wed)|7(Thu)|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|`>`押下後|**8(Fri)**|**9(Sat)**|**10(Sun)**|**11(Mon)**|**12(Tue)**|**13(Wed)**|**14(Thu)**|


# 日付単位で表示範囲を変更したい
## 例：10月

|`>`押下前|1(Fri)|2(Sat)|3(Sun)|4(Mon)|5(Tue)|6(Wed)|7(Thu)|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|`>`**押下後**|**2(Sat)**|**3(Sun)**|**4(Mon)**|**5(Tue)**|**6(Wed)**|**7(Thu)**|**8(Fri)**|

## 解決策

**customButtons**、**headerToolbar**で解決。

```js:
const date = new Date();
const calendar = new Calendar(document.getElementById('your-custom-id'), {
            plugins: [dayGridPlugin],
            initialView: 'dayGridWeek',
            locale: 'ja',
            firstDay: date.getDay(),
            customButtons: {
                nextDate: {
                    text: '>',
                    click: () => {
                        date.setDate(date.getDate() + 1);
                        calendar.setOption('firstDay', date.getDay());
                        calendar.gotoDate(date);
                    }
                },
                prevDate: {
                    text: '<',
                    click: () => {
                        date.setDate(date.getDate() - 1)
                        calendar.setOption('firstDay', date.getDay());
                        calendar.gotoDate(date);
                    }
                }
            },
            headerToolbar: {
                left: 'prevDate,nextDate',
                center: 'title',
                right: ''
            }
        });

```

## 解説

標準で用意されているボタンを非表示にして、カスタムボタンで対応。

・日付型データを作成
・firstDayにgetDayの値(曜日)を入れる。

カスタムボタンで`<`,`>`を作成し、クリックイベントで
・dateの加減算
・setOptionメソッドでカレンダーのfirstDayを更新、**(ココがミソ)**
・gotoDateメソッドでカレンダーをdateの日付に移動。

ライブラリの標準機能にないのかなぁ、。(見つけてないだけ？？)
raspberry pi 1 model bで、navit その6

#概要

raspberry pi 1 model bで、navitやってみる。
地図を表示する。

#地図を表示する。

```
sudo nano /etc/navit/navit.xml
```
以下を修正。

```



           <mapset enabled="yes">
                   <xi:include href="$NAVIT_SHAREDIR/maps/*.xml"/>
           </mapset>


           <mapset enabled="no">
                   <xi:include href="$NAVIT_SHAREDIR/maps/*.xml"/>
           </mapset>

```

```



  <!-- Mapset template for openstreetmaps -->
   <mapset enabled="no">
    <map type="binfile" enabled="yes" data="/media/mmc2/MapsNavit/osm_europe.bin"/>
   </mapset>


  <!-- Mapset template for openstreetmaps -->
   <mapset enabled="yes">
    <map type="binfile" enabled="yes" data="/home/pi/navit/japan-all.bin"/>
   </mapset>
```

#起動

デスクトップマネージャーのアプリケーションメニューのアクセサリーに Navit が追加されている。
Navit のアイコンをクリックするだけで起動。


以上。
Githubの認証をパスワードから Personal Access Token に切り替える

2021年8月13日から、パスワードを用いたGithubへの認証がセキュリティ上の理由から廃止されました。
今までコマンドラインからGithubにアクセスする際にパスワード認証をしていた場合は、それが使えなくなり、代わりに Personal Access Token(個人アクセストークン)を用いた認証かSSH認証に切り替える必要があります。
https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/

以下は、personal access token を用いた認証手順です。

### トークンの発行
初めに https://github.com/settings/tokens からトークンを発行します。一般的なgit操作(clone・pull・push等)の場合、権限はrepoにチェックが入っていれば十分です。
以降はここで発行したトークンを使います。発行画面を閉じると一切中身が見れなくなるので、忘れずにコピーしておきましょう。

### 対話的にアクセスする場合
コマンドラインから対話的にアクセスする場合、[公式のドキュメント](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)にあるように、Passwordを従来のものからトークンに置き換えれば良いです。

```bash
$ git clone https://github.com/username/repository_name.git
Username: your_username
Password: your_token
```

### 非対話的にアクセスする場合
非対話的にアクセスする場合、URLにトークンを埋め込みます。
新規にcloneする場合は、次のようにします。

```bash
git clone https://{your_token}@github.com/username/repository_name.git
```

既にcloneしてあるローカルリポジトリを更新する場合は、次のようにリモートリポジトリのURLを更新します。

```bash
$ git remote remove origin
$ git remote add origin https://{your_token}@github.com/username/repository_name.git
# 後は普通に操作ができる
$ git pull origin master
```

### SSH認証との比較
SSH認証との比較ですが、personal access tokenの方がトークン管理が楽なのと(sshキーと違ってトークンをローカルで生成・管理する必要がない)、細かい権限設定が可能なので、personal access tokenを用いる方が優れていると自分は思います。
raspberry pi 1 model bで、navit その5

#概要

raspberry pi 1 model bで、navitやってみる。
地図を日本語表示する。

#fontをインストール

```
sudo aptitude install fonts-takao fonts-takao-gothic

```


#地図を日本語表示する。

LANG=C の場合は、"TakaoGothic"
LANG=ja_JP.UTF-8 の場合は "Takaoゴシック" にします。

```
sudo nano /etc/navit/navit.xml

```

以上。
エンジニアがPMと確認した方がいい点

### 仕様

- 仕様書、画面遷移図、フロー図、API設計書、画面設計書など
- その他、開発に必要となる資料があればその資料
- 資料がまだ揃わない場合、いつ揃うのか

### 勤怠関連

- 作業をした分を何らかの勤怠管理に記録すると思うが、その時に必要な情報。

### コミュニケーション

- どこでコミュニケーションをするか（社内SNS、課題管理ツール、ミーティングなど）
- ミーティングなどやる場合、どの程度の頻度でやるか

### 背景事情

- そのプロダクトは誰がどのように使うものか。
- そのプロダクト特有の用語などがあれば、その意味

### スケジュール・成果物

- 期限はいつか
- 成果物は何か
- 成果物の提供方法は何か
- いつから開発開始できるか
- 開発の前後の作業（設計・テスト）の状況

### 開発基盤

- Gitリポジトリなどでプロダクトの変更管理をすると思うが、どのリポジトリを使うか。
- リポジトリを誰が管理するか
全世界向けにリリースされるゲームのバックエンド アーキテクチャ


海外でリリース・運営されるゲームが増えるにつれ、どのようによりよいサービスを全世界のプレイヤーに提供するのかが重要な問題となってきた。実際に全世界に向けてリリースされているゲームのなかで、よく見られるアーキテクチャは下記の通りである。
1，サーバをサービス提供リージョンの近くに配置するアーキテクチャ。リージョンごとにサーバを分ける手法だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096510/64b64b67-a912-8a08-5d0a-2184153f72da.png)
読んで字の如く、リージョンごとにサーバを分けるとは、リージョンの一つ一つにバトルサーバを配置し、プレイヤーが距離の近いバトルサーバに接続するという手法だ。各リージョンのプレイヤーを物理的に分けている形になる。
プレイヤーの近くにバトルサーバを配置することのメリットは、同じリージョンのプレイヤーを同じバトルサーバに集めることができ、遅延が少なくなるため、ゲーム体験が向上されることだ。この手法は競技性の高いFPSのようなゲームに適している。
一方、デメリットも明らかだ。まず、バックエンドでのマッチング、ディスパッチのロジックが複雑になり、プレイヤーがどのサーバに接続するのかを確定させるために、通信速度の測定やディスパッチのためのアルゴリズムが必要となる可能性がある。また、異なるリージョンのプレイヤーと一緒にプレイできないため、楽しみが大きく失われてしまう。

2，グローバル同一サーバ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096510/4af93e03-8a61-90e1-8539-6dcb38ee78f9.png)
10年前に行われたアンケートによると、今後20年間でプレイヤーがオンラインゲームに最も期待しているのが、グローバル同一サーバである。クラウド技術とインターネット技術の進歩により、このアーキテクチャを採用するゲームが増えてきている。
構造自体は非常にシンプルだ。バトルサーバを特定の地点に集中させ、全世界のユーザーがそこに接続してプレイする。
この手法のメリットは明らかである。アーキテクチャがよりシンプルになり、運営と管理のコストを抑えることができる。また、バックエンドでのマッチング、ディスパッチ、通信速度の測定などのロジックやモジュールが不要となるため、システム全体の信頼性が大きく高まる。そして、全世界のプレイヤーと一緒に遊べるということは、考えただけでワクワクしてくるような大きな魅力だ。
デメリットは、遅延が長くなり、さらにネット環境が不十分なリージョンもあるため、ゲーム体験が悪くなってしまうことだ。そのため、現時点では、グローバル同一サーバのゲームの多くが、SLG、RPGなど少々の遅延があっても気にならないゲームである。

次回はグローバル同一サーバのアーキテクチャにかかる具体的な技術とポリシーを説明する。
【mt4/mql4】スプレッド（askとbidの差）が一定値以下のみ動かす

# はじめに
<!-- 発端や概要を記載 -->
システムトレードプログラマのmt4/mql4のメモノートです。
初心者向けの簡単なトピックから公開していきます。
.noteでEAそのものも公開していますので良ければそちらも見てください。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [処理内容](#処理内容)
1. [mql4ソースコード](#mql4ソースコード)

<!-- 各チャプター -->
<a id="#処理内容"></a>
# 処理内容
スプレッド開いていてる場合には～～～したくない！といったニーズがあると思います。
スプレッド開いてる時にオーダーしたくない、決済したくない、ログ出力したくない、、、などなど
この場合のコード記述の仕方を説明します。

そもそもなんですが、取引会社によって多少差はありますが
スプレッドって基本的に可変です。
普段は0.1pipsしか離れていなくても、オーストラリア市場とか
FOMC発表直前とかに開いたりします。
この、スプレッドが開くタイミングは特殊な値動きなので
特定の動作（エントリーとか）をしたくない！ってのにつながるんですね。


<a id="#mql4ソースコード"></a>
# mql4ソースコード

こちらが関数側のソースです。呼び出し側の前に記述されている必要があります。
グローバル変数にスプレッドの固定数値をpipsで設定します。
ソースのどこのイベント内でも無い一番上に記述してください。この場合、5pipsに設定しています。

```c++:test.mq4
//+------------------------------------------------------------------+
//グローバル領域に任意のスプレッドpips値を設定

int maxspread=5;

//+------------------------------------------------------------------+
```


こちらは呼び出し側の例
呼び出したいタイミングに合わせてOnTick()、OnInit()とかOnTimer()の中で記述してみてください。何らかの条件（if文とかで特定時間になったらとか）内に記述するのが一般的でしょう。

```c++:test.mq4
if( ((Ask-Bid)/AdjustPoint(Symbol())) < maxspread )
{

//spredが一定値以下の時に動かしたい挙動をここに記述

}
```


皆様の手助けになりますように。
間違いなどあればご指摘いただけると助かります。
以上です
Aiohttpで作るSimple Web Server

前回、[Python Asyncio 入門](https://qiita.com/sand/items/0e445a13d81d20ea33c3)という記事を書きました。それはAsyncioの互換ライブラリ **Aiohttp**のhttpクライアント機能を使ったサンプルでの説明でした。


【過去記事】
[Python Asyncio入門](https://qiita.com/sand/items/0e445a13d81d20ea33c3)
[Aiohttpで作るSimple Web Server - Qiita](https://qiita.com/sand/items/971c851598ff59c1c905)
[Starletteで作る Simple Web Server - QIita](https://qiita.com/sand/items/dd622ce4f9249399974c)



**Aiohttp**にはFlaskに似たサーバ機能もあります。Flaskは同期的プログラミングですが、Aiohttpは非同期的プログラミングで速度の点で優れています。

[Asyncio公式サイト](https://docs.python.org/ja/3/library/asyncio.html)

[aiohttp公式サイト](https://docs.aiohttp.org/en/stable/)

以下のサンプルはaiohttp公式サイトのものを少し修正しして、２つのroutes、2つのHandlersにしてみました。プログラムの流れは説明不要でしょう。厳密な理解をしたいときは公式サイトをご確認ください。


```python:simple.py
from aiohttp import web

async def hello(request):
    return web.Response(text="Hello, world")

async def handle_greeting(request):
    name = request.match_info.get('name', "Anonymous")
    txt = "Hello, {}".format(name)
    return web.Response(text=txt)

app = web.Application()
app.add_routes([web.get('/', hello),
                web.get('/greet/{name}', handle_greeting)])

web.run_app(app)
```


以下のようにコマンドラインで起動できます。

```
python simple.py
======== Running on http://0.0.0.0:8080 ========
(Press CTRL+C to quit)
```

ブラウザから http-://localhost:8080/ でアクセスすると「Hello, world」と表示されます。
http-://localhost:8080/greet/taro でアクセスすると「Hello, taro」と表示されます。


また、Flaskのように **Route decorators** を使って以下のように書くこともできます。こちらの方がスッキリしているような気がします。

```python:simple2.py
from aiohttp import web

routes = web.RouteTableDef()

@routes.get('/')
async def hello(request):
    return web.Response(text="Hello, world")

@routes.get('/greet/{name}')
async def handle_greeting(request):
    name = request.match_info.get('name', "Anonymous")
    txt = "Hello, {}".format(name)
    return web.Response(text=txt)

app = web.Application()
app.add_routes(routes)
web.run_app(app)
```


aiohttpのサーバ機能は今回のさわり程度で終えたいと思います。次回以降、非同期のサーバ機能については**ASGI**(**Starlette**)を見ていきたいと思います。
【mt4/mql4】損失ありポジション全決済処理

# はじめに
<!-- 発端や概要を記載 -->
システムトレードプログラマのmt4/mql4のメモノートです。
初心者向けの簡単なトピックから公開していきます。
.noteでEAそのものも公開していますので良ければそちらも見てください。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [処理内容](#処理内容)
1. [mql4ソースコード](#mql4ソースコード)

<!-- 各チャプター -->
<a id="#処理内容"></a>
# 処理内容
自身の建てポジションのうち、損失の出ているポジションだけ決裁オーダーを出す関数です。
利益のあるポジションはそのままです。
俗にいう損切です。
スプレッド開いていてもポジション決裁を優先したいので、直前ask bidの差をスリッページに設定します。



使いどころとしては
・定期的にポジションの損切を行いたいとか

・ポジション確保したまま週末を跨ぎたくない。ので、ポジション数を減らすとか

・FOMCが迫っているのでリスク回避のためにポジション数を減らすとか

・証拠金率が下がってきたので、リスク低減のために損失のあるポジションを決裁するとか

・とある条件に合致したら、とにかく残高を増やしたいとか


ですかね。
なので基本的には使いたい条件式とセットで使う関数となります。
また、取引会社の状況によりますが、連続して決裁オーダーを出すので約定しきらない可能性があります。
なので念のためsleepを入れたあとに再度本関数を使うのも手だと思います。
なお、急な値変動やスプレッドの変化の際には、わずかな時差で必ずしも利益確定とならないポジション解消もあり得ます

<a id="#mql4ソースコード"></a>
# mql4ソースコード

こちらが関数側のソースです。呼び出し側の前に記述されている必要があります。
基本的には使いたい条件式とセットで使う関数となります。
なお、オーダーキャンセルも取引会社（FX会社側）での受理が必要ですので他の注文と合わせて使う際にはsleepなどで少しだけでも合間時間を確保しておくと、リクエスト拒否されにくいです。
グローバル変数の定義と外部関数読み込みです。（stdlib.mqhは多分無しでも動くけど念のため）
ソースのどこのイベント内でも無い一番上に記述してください

```c++:test.mq4
//+------------------------------------------------------------------+
#include <stdlib.mqh>
double Priceaskbid[2];
int    Slippage;
//+------------------------------------------------------------------+
//| スリッページにスプレッドを格納して差があるか判定
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder
//+------------------------------------------------------------------+
bool GetMarketInfo() 
{
RefreshRates();
Priceaskbid[0]=MarketInfo(OrderSymbol(),MODE_ASK);
Priceaskbid[1]=MarketInfo(OrderSymbol(),MODE_BID);
double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
if(dPoint==0) return(false);
Slippage=(Priceaskbid[0]-Priceaskbid[1])/dPoint;
return(Priceaskbid[0]>0.0 && Priceaskbid[1]>0.0);
}

//+------------------------------------------------------------------+
//| 損失有ポジションの全クローズ    ALLlossClose
//| （スプレッド開いててもクローズ優先）
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder
//+------------------------------------------------------------------+
void ALLlossClose() 
{
int iOrders=OrdersTotal()-1;
int i;
  for(i=iOrders; i>=0; i--) 
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderProfit() <= 0))
     {
      if((OrderType()<=OP_SELL) && GetMarketInfo()) 
      {
        if(!OrderClose(OrderTicket(),OrderLots(),Priceaskbid[1-OrderType()],Slippage))
        {
        Print("Close order Error");
        }
      }
    }
  }
}
//+------------------------------------------------------------------+
```


こちらは呼び出し側の例
呼び出したいタイミングに合わせてOnTick()、OnInit()とかOnTimer()の中で記述してみてください。何らかの条件（if文とかで特定時間になったらとか）内に記述するのが一般的でしょう。

```c++:test.mq4
ALLlossClose();
```


皆様の手助けになりますように。
間違いなどあればご指摘いただけると助かります。
以上です
新たなエネルギーモデルにAIが必要な理由とは

電力の消費量が増加している昨今、エネルギーの生産者と供給者は需要を的確に予測する必要に迫られています。エネルギーが化石燃料だけでなく原子力、再生可能エネルギーなど多様化し、同時に気候変動への対応を求められている現在、その必要性はこれまで以上に増しています。そんななか、もはやデータサイエンスを使わずに複雑なエネルギーエコシステムを設計することは限りなく不可能に近くなっています。

2050年に100億人に達する地球人口。これまで以上に豊富な技術の時代が到来し、電力への需要は止まることを知りません。今後人類はよりエネルギー集約度の高い大都市やメガロポリスの発展を見ることになるでしょう。

地球温暖化により、私たちはエネルギー消費の削減を余儀なくされています。2021年の7月15日、国際エネルギー機関（IEA）は世界の電力需要が2021年に5％、2022年に4％増加すると[発表](https://www.iea.org/news/global-electricity-demand-is-growing-faster-than-renewables-driving-strong-increase-in-generation-from-fossil-fuels)しました。これらの数値が逆転することはほぼありえないでしょう。このような状況のなか、エネルギー業界の企業はより環境に優しいエネルギーを生産・貯蔵する技術を展開するべく、常に技術革新に取り組んでいます。

##完全な移行期にある産業
再生可能エネルギーが登場し、競争が激化し、地球温暖化が深刻化する…。エネルギーセクターは大きな変革期を迎えています。脱炭素社会を実現するためには、化石燃料（石炭、石油、ガス）から再生可能エネルギー（太陽光、風力、バイオマス）による電力へと移行していくことになります。再生可能エネルギーの割合が増えると、主に2つの影響があります。ひとつには、将来の電力システムが、出力の不安定な発電機からの電力を多く受け入れるようになること。もうひとつは、分散化が進むことです。送電網がダイナミックになると、それぞれの家庭で発電して送電網に売ることができるようになります。逆に、誰もが一斉に電気自動車を充電するようになり、需要が急増することも考えられます。このような状況下で、電力網を効率的に運用し、停電を回避することは、今後も困難を極めるでしょう。

分散して生産される特性の異なるエネルギーを、組織としてどのように管理するか。また、太陽光や風力などの不安定なエネルギーを、使用量の削減が求められる化石燃料とどのように統合するのか。よりダイナミックなエネルギーシステムにどう対応していくか。こうした問いに答えていく必要があります。
![karsten-wurth-karsten-wuerth-0w-uTa0Xz7w-unsplash.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/dcbacb94-8f76-1aab-4623-47ee4a1ccf55.jpeg)


##ソーラーパネルの配置からプロセスの最適化まで
こうした複雑な問題に直面したエネルギー業界の企業は、数多くのAIプロジェクトを展開し始めました。例えば、ソーラーパネルの最適な設置場所や、最も効率的な風力タービンのレイアウトを決めるためのソリューションを開発しました。また、既存設備の運用を改善したり、生産現場やネットワークの故障を予測して異常を検知したり、従業員の安全性を高めるためにもAIを活用しています。また、温室効果ガスの排出量やその他の環境・社会的影響をより適切に定量化し、削減するためにもAIを活用しています。さらに、さまざまなエネルギーの生産量をより正確に推定し、顧客のさまざまな消費量を予測するためにも、これらの技術を利用しています。
![zbynek-burival-V4ZYJZJ3W4M-unsplash.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/c4f74d47-0f6a-b913-8ba2-f3cd74224bbb.jpeg)


企業は多くの風力発電や太陽光発電のプロジェクトを開発しています。エネルギー業界の企業は、生産性能を比較・最適化し、異常を検出したり、メンテナンスが必要な時期を予測したりするために、非常に多くの設備で動作を分析し、視覚化する必要に迫られています。これらの取り組みを成功させるには、データをリアルタイムに収集し、アナリストたちが簡単にアクセスできるようにし、クラウド上の演算エンジンを活用して大規模なプロセスを管理できるようにする必要があります。

エネルギー転換を成功させるには、生産から消費まで、エネルギーのバリューチェーンのすべてでAIが必要になります。そのためには、すべての人がAIを使ったシステムの構築に貢献しなければなりません。実際、AIはデータサイエンスの専門家だけのものであってはならず、エネルギー分野に詳しいステークホルダーと共同で設計し、この業界の課題や問題により良く対応していかなければなりません。

##経済的利益
純粋に経済的な観点から見ると、AIがエネルギー節約の源になるという研究結果が出ています。例えば[IEAの報告書](https://www.iea.org/reports/digitalisation-and-energy)によると、スマート照明システムなどを使ってリアルタイムで収集したデータにより、建物のエネルギー消費量を10％削減できるそうです。またこの報告書では、2040年までに110億台のスマートデバイスが相互に接続されることで、住民が送電網からの電力消費をより適切にコントロールできるようになるとのこと。その結果、185GWの柔軟性が得られ、新たな電気インフラへの投資を2,700億ドル回避できると試算しています。

このようなマルチエネルギーの生産から、工場の管理や生産チェーンの運営を含む流通まで、生産面でも消費面でも、エネルギーチェーン全体を最適化するために、AIは中心的な要素となっています。地球温暖化に直面し、エネルギーの世界は変貌し、改革されつつあります。この複雑で流動的な世界では、この移行をサポートするために、AIがもたらす機会を捉え、大きな俊敏性を発揮することが必要になります。

エネルギー業界におけるAIの活用について、詳しくは[こちら](https://pages.dataiku.com/energy-utilities-jp)


原文：[*Why AI Is Essential to the New Energy Model*](https://blog.dataiku.com/ai-new-energy-model)
Amazon Insentives APIのHTMLサンプルの実行の仕方

自分用メモ

Amazon Insentives APIを使えばアマゾンギフトコードの発行などができます。ただこれに使われている認証方法が「AWS 署名バージョン 4」というものでbasic認証などの用にただ打てばいいというわけではないそうです。ありがたいことにサンプルも用意されていますが、若干古くそのままでは動かなかったのでここにメモします。

1. Web Server for Chromeなどでローカルでサーバーを建てて、サンプルコードがあるディレクトリにネットワーク越しにアクセス可能にする。
2. google-chrome --allow-file-access-from-files --disable-web-security --user-data-dir=/home/USERNAME/HOGEHOGE のようにしてchromeを起動して、1.のURLへアクセス。
Denoの相対パスの注意点

Denoではファイルを読み込むためには、Deno.readTextFileまたはDeno.readTextFileSyncを使います。
当然、読み込むファイルのパスを指定しなければなりません。
Deno.readTextFile("path_to_file") 

文章を読む関数が実行されるTSファイルにある場合は、問題がありませんが、文章を読む関数を再利用しようと思って、その関数を別のTSファイルにインポートすると、パスのエラーが発生します。

例えば、こういうフォルダー構成があるとしましょう。

```
- read.ts　// 文章を読み込む関数が入っているTSファイル
- data.json　// 文章、ここではJSONデータ
- folder/processor.ts　// 文章を読み込む関数をインポートするTSファイル
```

```//read.ts
const dataFilePath ="./data.json"
export function readData(){
let dataToReturn=JSON.parse(Deno.readTextFileSync(dataFilePath));
return dataToReturn
}
```

```//processor.ts
import {readData} from "../read.ts"
console.log(readData())
```
processor.tsからreadTextFileSyncを起動すると、「指定された
パスが見つかりません。 (os error 2)」というエラーが発生します。


そのエラーの原因はDenoがパスを取り扱う方法にあります。
Denoはパスを実行されたファイルから読み解いていきます。
read.tsをインポートして、パスが"./data.json"になっていると思うかもしれませんが、
実行のフォルダーが"folder"なので、ルートフォルダーが"folder"になってしまいます。
すなわち、processor.tsからreadTextFileSyncが起動されると、
パスは"./data.json"ではなくて、"folder/data.json"になってしまいます。

この問題を解決するためには、import.meta.urlを使います。
import.meta.urlを使って、本当のルートフォルダーを特定できます。
パスをよく扱う場合は、個別のモージュルにまとめると便利です。
ここでは、absolutePath.tsのモージュルにします。

```
- absolutePath.ts
- read.ts
- data.json
- folder/processor.ts
```
```//absolutePath.ts
import { path } from "https://deno.land/std/path/mod.ts";
const dir = path.dirname(import.meta.url);
export function absolutePath(relativePath: string): string {
  return path.fromFileUrl(path.join(dir, relativePath));
}
```
absolutePath.tsではルートとなるフォルダー名を取得します。その後で、ルートのフォルダーに相対的なパスをくっつけて、絶対的なパスを作ります。
パスの操作のためには、Deno.landからPathのモージュルをインポートします。

続いて、absolutePath.tsをread.tsにインポートします。

```//read.ts
import {absolutePath} from "./absolutePath.ts"
const dataFilePath ="./data.json"
export function readData(){
let dataToReturn=JSON.parse(Deno.readTextFileSync(dataFilePath));
return dataToReturn
}
```

最後に、readTextFileSyncのパスをabsolutePathで包みます。

```//read.ts
import {absolutePath} from "./absolutePath.ts"
const dataFilePath ="./data.json"
export function readData(){
let dataToReturn=JSON.parse(Deno.readTextFileSync(absolutePath(dataFilePath)));
return dataToReturn
}
```

そうすると、read.tsをサブフォルダーのファイルにインポートしても、パスが正しく解消されます。

ここでは、readTextFileSyncだけを取り上げましたが、ファイルシステムの他の操作を行う時にも起こります。
Denoは実行されるファイルが置かれているフォルダーをルートフォルダーにしていると覚えると、絶対パスを利用することでOSエラーが回避できます。
#PowerApps 日付の選択（Date Picker）コントロールの表記変更

「カレンダーコントロール」って言いがちなんですけども。

日本語だと「日付の選択コントロール」。
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/controls/control-date-picker?WT.mc_id=BA-MVP-5004053

英語だと「Date Picker control」
https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/controls/control-date-picker?WT.mc_id=BA-MVP-5004053

デートピッカーコントロールの小ネタです。カタカナで書くとダサいですねｗ

# Date Picker コントロールの表記を変更する
表記の変更とは？日本語環境で Date Picker を配置した際は”yyyy年mm月dd日”になっていると思います。これを”年月日”ではなくて、スラッシュ（"/"）区切り等にする、ってコトです。

## 実際の画面(2021/10/25 時点)
下イメージのように表記が変更可能です。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/e12a3628-2614-6161-97a7-5118dc651aa9.png)

上記スクリーンショットを取得した環境は、Win10、Edge、日本語環境です。

## 設定変更の方法
既に前述の画像でネタバレしてますが、Date Picker の [Language] プロパティを変更するだけです。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/31916736-2e13-e235-893f-7e0bff32d4ee.png)

例えば、画像のように2021年10月25日だったとした場合・・・

- "ja" → 2021年10月25日
- "ja-jp" → 2021/10/25
- "en" → October 25,2021
- "en-us" → 10/25/2021

上記のように表記が変更されています。

ちなみに、英語圏（"en"）を指定すると、カレンダーアイコンをクリックした際に表示される内容も英語へ自動的に変更されます。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/d773993a-3d7d-0b65-c09d-7f9db190049f.png)

# 補足1：Language プロパティ未設定の場合
Date Picker コントロールの Docs、[主要なプロパティ](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/controls/control-date-picker?WT.mc_id=BA-MVP-5004053#key-properties)の [Language] 項目に説明がありますが、このプロパティを指定していない場合はデバイスの設定に依存するそうです。

> Language – 月の名前を含む、日付の書式を設定するために使用される言語を指定します。 このプロパティが指定されていない場合、ユーザーのデバイスの設定で言語が決まります。 サポートされる値には、"EN-us" および "FR" が含まれます。

試した限りでは、Language プロパティはデフォルトでブランク（””）です。

# 補足2：ja-jp とかナニ？
記事投稿時点の 該当コントロールの Docs には明記されてませんが、Language 関数の [言語タグ](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-language?WT.mc_id=BA-MVP-5004053#language-tags) がヒントになるでしょう。

> Power Apps は、IETF BCP-47 言語タグ 形式を使用します。

個人的には、ja、 ja-jp、en、en-us があれば事足りてます。皆さん、必要に応じてその他言語・地域はお調べください。

# 結び
カレンダーコントロールって言っちゃいますよね。Date Picker コントロールです。そして、"ja-jp" を指定すると 2021/10/25 とスラッシュ区切りになるのは面白い仕様ですよね。こんな仕様、調べるか知らなきゃ諦めちゃいますよ（汗

個人的には、こういう正直どっちでも良い細かい表記でグズグズ言って本質を見失うような状態が大嫌いなので、基本的には「デフォルトのまま実行環境依存でいいんじゃないですか」って思っています。ただ、”年月日”って文字の幅取るんですよね。レイアウト的に横幅が広げられない場合、スラッシュ（"/"）区切りにすると収まる可能性があるので知っていて損は無いかなー、です。

それでは、皆さま。素晴らしい Power Platform Life を！
aws cliのインストールとユーザーごとの初期設定メモ

私有のPCには一度`aws cli`のインストールをしたのですが、最近になって、仕事で必要になった際に手順を完全に忘れていたのでメモします！

## aws cliのインストール

[公式サイト](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html#cliv2-mac-install-cmd)を参考に以下のコマンドでインストールします。
他のサイトだとpipのインストールが必要と書いてあったりするが、特に必要ないです。

~~~bash:インストールコマンド
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
~~~


~~~bash:確認
$ aws --version
aws-cli/2.2.13 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off
~~~

## アクセスキー作成
`aws cli`でアクセスするには、アクセスキーをあらかじめ対象のアカウントで作成しないといけません。
IAM　→　ユーザー　→ 認証タブ　→ アクセスキーの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/9082ba33-3322-584f-aac3-b80b9fb8cbca.png)

上記でアクセスキーを作成したら、アクセスキーIDとシークレットアクセスキーを控えておきましょう。

## aws cliの初期設定
aws cliの初期設定は`aws configure`コマンドを使います。
--profileオプションを付けるとユーザーごとに分けることができます。

~~~bash:初期設定
$ aws configure --profile 任意のユーザー名
AWS Access Key ID [None]: 先ほど控えたアクセスキー
AWS Secret Access Key [None]: 先ほど控えたシークレットアクセスキー
Default region name [None]: ap-northeast-1(各自、自分のリージョン名を入れる)
Default output format [None]: json(一番扱いやすいのでjsonにした)
~~~

上記の４項目で設定完了です！
試しにvpc情報を取得して接続確認してみます。

~~~bash:接続確認
$ aws ec2 describe-vpcs --profile 先ほど設定したユーザー名
{
    "Vpcs": [
        {
            "CidrBlock": "242.89.0.0/16",
            "DhcpOptionsId": "dopt-1478f066",
~(以下略)~
~~~

## 終わりに
今回は、aws cliのインストールとユーザーごとの初期設定を行いました。
aws cliは使いこなせると非常に便利だと思うので、もっと色々なことができるように、継続的に勉強していこうと思います！
[Snippet] JavaScript、Node.js

# これは何？
JavaScriptで「あれってどう書くんだっけ？」を集めたメモです。

# 時間系
## Sleep

- Return: [`void`]

```javascript
const sleep = msec => new Promise(resolve => setTimeout(resolve, msec))
```

### UNIX timeを取得

- Return: [`number`]: `1635204475862` (unit: millisecond)

```javascript
Date.now()
```

### 文字列として時間を取得

- Inputs:
 - TIMESTAMP_MSEC (unit: millisecond): [`number`]: `1635204475862`
- Return: [`string`]: `"Tue Oct 26 2021 08:27:55 GMT+0900 (Japan Standard Time)"`

```javascript
new Date(TIMESTAMP_MSEC);
```

## Timezoneを考慮した時間を取得

- Return: [`string`]: `"2021-10-26T20:57:57.911+09:00"` （Format: [ISO_8601](https://ja.wikipedia.org/wiki/ISO_8601))

```javascript
const getDateNow = () => {
  const date = new Date()
  const timeOffset = date.getTimezoneOffset()
  const sign = (timeOffset)<=0 ? '+' : '-'
  const rTimeOffset = Math.abs(timeOffset)
  const tz = `${sign}${('00' + Math.floor(rTimeOffset/60)).substr(-2)}:${('00' + rTimeOffset%60).substr(-2)}`
  return new Date(date.getTime() - (timeOffset * 60000)).toJSON().replace(/Z$/, tz)
}
```

# File操作系

## ディレクトリ作成（再帰的）

- Arguments:
 - DIR_NAME: [`string`]: `"/home/hoge/download"`
- Return: [`void`]

```javascript
const fs = require('fs-extra');
try {
  fs.mkdirSync(`${DIR_NAME}`, { recursive: true })
} catch(e) {
  console.error(e.message);
}
```

## ファイル存在確認

- Arguments:
 - FILE_NAME: [`string`]: `"/home/hoge/download/test.txt"` 
- Return: [`Boolean`]

```javascript
const fs = require('fs-extra');
try {
  if (fs.existsSync(`${FILE_NAME}`)) {
    // アリ
  } else {
    // ナシ
  }
} catch(e) {
  console.error(e.message);
}
```

## ファイルを書き出す

- Arguments:
 - FILE_NAME: [`string`]: `"/home/hoge/download/test.txt"`
 - CONTENT_TEXT: [`string`]: `"aaaa\nbbbb\ncccc"`
- Return: [`Boolean`]


```javascript
const fs = require('fs-extra');
try {
  fs.writeFileSync(`${FILE_NAME}`, `${CONTENT_TEXT}`)
} catch(e) {
  console.error(e.message);
}
```

## ファイルの属性取得

- Arguments:
 - FILE_NAME: [`string`]: `"/home/hoge/download/test.txt"` 
- Return: [`object`]: [class-fsstats](https://nodejs.org/api/fs.html#class-fsstats)

```javascript
const fs = require('fs-extra');
try {
  const fileStat = fs.statSync(`${FILE_NAME}`)
} catch(e) {
  console.error(e.message);
}
```
一般ユーザ間のファイルコピー

# はじめに
普段当たり前に使っていて気にもとめない`cp`コマンドですが、今まで覚えていたことと違った出来事があったので記事に残しておきます。

# 一般ユーザ間のファイルコピー
同一サーバ内に存在する複数のユーザが同じファイルを触る要件があり、あるユーザから`cp -p`でファイルをコピーしようとすると以下のようなエラーでコピーできませんでした。

![ファイルコピー-Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/35301185-1e7f-f2c7-8124-b4b8e0f321bc.png)

```shell:一般ユーザ間でファイルコピーした場合のエラー
> cp -p /home/user1/sharefile /var/tmp/sharefile
cp: `/var/tmp/sharefile' のタイムスタンプを保存中: 許可されていない操作です
```

自分の経験ではグループやパーミッション設定が問題なければコピーできるはずでしたが、まさか今更ファイルコピーでハマるとは・・・と思いながら調査すると、一般ユーザ間でコピーする場合、グループが同じでパーミッションも問題なかったとしても、オーナーの権限を書き換えられず、`cp -p`等権限を保持したコピーをする場合、エラーでコピーできないとのこと。

ちなみに`vi`等で直接編集したり、`-p`オプション無しでコピーするような場合はオーナー権限は書き換わらないため、正常に終了します。

# Solarisの場合
一般ユーザ間で`cp -p`でコピーした場合、エラーでコピーできませんでしたが、大分昔に同じような要件のシステムがあり、その時はエラーが出るようなことは無かったはず・・・

どうにも腑に落ちず、以前よく使っていた`Solaris`を準備し、同じことをやってみると、`Solaris`ではエラーとならず、オーナー権限は書き換わらないままコピーできました。

動作についてきちんと理解できていなかったなぁと痛感しつつ、OSの違いを意識させられた出来事でした。

# おわりに
後日、`Solaris`の`cp`コマンドの`man`を見てみると、ちゃんと今回のことについても書かれていました。

ちゃんとマニュアルは読まないといけませんね。

```shell:Solarisのcpコマンドのman抜粋
       -p    保持。cp ユーティリティーは、source_file の内容を複製するだけでは
             なく、その  ACL、アクセス日時と更新日時、拡張属性、拡張システム属
             性、ファイルモード、および所有者 ID とグループ ID  を保持しようと
             します。

             cp がアクセス日時と更新日時、拡張属性、またはファイルモードを保持
             できない場合、cp はそれを失敗とは見なしません。cp が所有者 ID  と
             グループ ID を保持できない場合、コピーは失敗しませんが、cp はメッ
             セージを表示せずにターゲットのファイルモードから  S_ISUID  および
             S_ISGID ビットをクリアします。cp がこれらのビットをクリアできない
             場合、コピーは失敗します。cp が ACL  または拡張システム属性を保持
             できない場合、コピーは失敗します。コピーが失敗すると、診断メッ
             セージが stderr  に書き込まれ、(残りのオペランドすべての処理後に)
             cp がゼロ以外の終了ステータスで終了します。
```
独学でタスク管理サービスFroteをポートフォリオとして開発した

#はじめに
現在情報系の大学院１年生のつむぎといいます。web業界に行きたいと思い、フロントエンジニアのポートフォリオとしてタスク管理サービスFroteを独学で開発しました。まだ完成とは程遠いですが、今回はとりあえずサービスが公開出来るまでの過程を書いていきたいと思います。作成したものはこちらです[[Frote]] [[github]]

#開発しようと思った背景
予算的、技術的に一般ユーザーが満足するクオリティのものは作れないと思ったので、自分が欲しいものを作ろうと決めました。毎日のタスクをvscodeのテキストファイルで管理していたのですが、問題点が大きくわけて２つありました。**１つは依存関係のあるタスク同士が分かりにくい**という問題です。Aが終わらないとBが出来ない状態を「BはAに依存している」と定義するとAとBは並列の関係にあるべきではありません。つまり、AのほうがBより優先度は高いですが、あたかも同じ程度の優先度に見えてしまっていました。**２つ目は優先度の決定に時間がかかる**という問題です。依存関係も気にしつつ、こちらのほうが優先度が高いななどと判断する必要がありました。後からタスクを追加する場合もどこに入れようかなどで悩み、結果として時間がかかっていました。

この２つの問題点を解決できるようなtodoアプリは僕が探した感じは見つからなかったので、僕が作ろうと考えた次第です。Frote(フローテ)はFree priorityからフランス語のprioriteを混ぜて命名しました。
#開始時のスキル
大学でCとDBをがっつりとJavaを少し、あとはatcoderでC++を趣味程度で触っているくらいしか知識がありませんでした。html,css,javascriptはhello worldが出来るレベル。

#要件定義
・自分の技術力をアピール出来るようなもの
・タスクの依存関係の可視化、優先度の自動決定が出来るタスク管理サービス
・お金は極力かけない
・時間の関係上学習コストは出来る限り少なくしたい
・レスポンシブ対応

#技術選定
**React**
今の流行り的にSPAはやりたいと思い、採用しました。
**TypeScript**
C言語をやっていたせいか静的型付言語っぽい方が好きなので採用しました。
**styled-components**
コンポーネント志向と相性の良いCSS in JSの中で有名なのを採用しました。emotionやtailwindcssなども考えましたが、最初は生のcssを触りたかったこととstyled-componentsの方が採用例が多かったことからこちらにしました。
**material-ui**
reactのUIコンポーネントライブラリとして定番なものを選びました。
**recoil**
状態管理はrecoilでやっています。最初はuseContextでやっていたのですが、大変だったので移行しました。reduxによるチャットアプリケーションなども作ってみましたが、reduxは必要以上に複雑であまり好きではありませんでした。
**Laravel(php)**
バックエンド言語は悩みましたがphpにしました。nodejsとGOは最初に触るのには不安がありましたし、railsはSPAが得意そうな印象があまり無かったです。スクレイピングなどもする予定が無かったので、phpと一番人気のフレームワークlaravelを採用しました。
**heroku**
本当はAWSにしたかったのですが、費用と学習コストを考えてherokuにデプロイすることにしました。
**mySQL**
スタンダードなものを採用しました。

**その他使用技術**
react-roter,react-hook-form,styled-media-query,vscode,prettier,npm,webpack, Babel,Composer,Git,GitHub

DockerやCircle CI、Github Actions,jest,storybook,nextjsなども使いたかったのですが、一度に手を出しすぎると大変そうだったので今回は断念しました。

#基本設計
**優先度の決定**
パラメータなしはきついので、緊急度と重要度というパラメータをタスク追加時に決めてもらう。

**依存関係の可視化**
依存関係のあるタスクはリスト構造で保存することにし、依存関係のあるタスクの集まりを「リスト」と呼ぶ。

**タスクのグループ化**
タスクがグループ化出来るようにグループも作る。

**タスクの挿入と追加**
リストへの挿入、追加機能を作成する。また、入力フォームも動的フォームである必要がある。

**認証機能**
laravelの機能を使ったクッキーベースの認証を行う。認証情報自体はAPIで取得する。

#データベース設計

tasksテーブル
id(primary)  task_list_id(foreign) task order timestamps 

task_listsテーブル
id(primary) group_id(foreign) user_id(foreign) importance　urgency timestamps

groupsテーブル
id(primary) user_id(foreign) group

usersテーブル
id(primary) name email email_verified_at password remember_token created_at update_at

usersテーブルはlaravelのテンプレートで生成されるものを使用しています。このサービスの基本単位はリストであり、リストに１つ以上のタスクが存在します。挿入などのためにtasksテーブルはorderカラムを持っています。

#工夫した点
・**Container層の導入によるロジックの分離**
・**promiseを用いた非同期処理の制御をすることで、値を更新してから表示するようにタイミングを調整した**
・**TypeSctiptの恩恵を受けるためanyはほとんど使用しなかった**
・コンポーネント志向を意識し、切り出せる部分は切り出して使いまわした
・styled-media-queryで作成した2つのブレイクポイントを使用しレスポンシブ対応にした
・ローディング時用のUIを用意
・入力フォームにて簡単なバリデーションを実施
・atomicデザインを使用した分かりやすいディレクトリ構造
・動的フォームの実装

#改善が必要な点
・再レンダリングへの最適化がいまいち
・recoilに依存しすぎているので、その部分を抽象化したい
・SPAなのにMPAのような表示になっており、あまりSPAの良さを出せていない

#おわりに
想像していた倍時間がかかりましたが、自分が思っている機能の半分くらいは実現できました。タスクの停止機能や、別の表示方法などやりたかったことはいっぱいあったのですが、期限内に終わらせることも大切だなと感じました。まだサービスとしてはバグが多すぎるので、これからどんどん改善していきたいと思います。

[frote]:https://frote.herokuapp.com/　
[github]:https://github.com/it-tsumugi/toDoListPortfolio
上手な愚痴をこぼして、きみも愚痴マスターになろう

「良い愚痴」というもののコツを明文化して愚痴マスターになりたいと思っています。以下を参考にしています。

- [愚痴と悪口の違い](https://notion.yumemi.co.jp/9f1cf247838a40508670a97db50796ac)
- [愚痴と悪口の違いは？愚痴をこぼすのは悪いこと？｜お悩み相談室「ことり電話」](https://www.kotori-phone.com/2953)

攻撃性があるかどうかなどは愚痴の読み取り能力も訓練が必要そうなところがありますが、シンプルなルールがひとつあるようです。

## 良い愚痴は主語が「私」

> 【愚痴】
> 「主語が『わたし』」
> **私の気持ちを吐露すること。**
> 例：私は、とても辛かった

> 【悪口】
> 「主語が『あの人』」
> 他の人を、悪く言うこと。
> 例：あの人は、うるさい

引用: [愚痴と悪口の違い](https://notion.yumemi.co.jp/9f1cf247838a40508670a97db50796ac)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/50c0ef60-2f1b-625a-6d33-b504836aa7c4.png)

## 良い愚痴は「適切な場所にこぼす」

書かれているように、人は誰しも心の中で、

- 人を評価してしまったり
- 不快な気分になってしまったり
- 認めてもらいたいと思ったり

してしまいます。愚痴をこぼすかこぼさないかそれは、ストレスを

- 「外」に、出すか
- 「内」に、ため込むか

その違いだけと言えそうです。ストレスは吐き出すことを、吐き出しやすい場所に吐き出すことをまずはおすすめします。Twitterでも良いかもしれないし、社内のSlackでそれができる場所があれば、とても良い会社だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/e6607961-5c94-f09f-cf9d-643eef6905da.png)

こぼれた愚痴には以下のような効用があります。

## 良い愚痴は皆が共感してくれる

共感してくれるって嬉しいですね。

「主語をわたし」とすることのコツは「家事育児中のおかあさんが旦那さんに、手伝ってほしい気持ちを伝える」というようなシチュエーションでも使えるかもしれないです。当然開発者なら、チームメンバーに伝えるときにもヒントになります。

[「私メッセージ」で、チームメンバーにやってほしいことを伝える｜S.Yamamoto｜note](https://note.com/flyaway/n/n1b3d0b20fa24)
ここではチームメンバーに伝えるということが書かれていますが、逆から見れば、リーダーにも同じく**伝わる**ということでもあります。

- 適切に愚痴る
- 適切に助けを求める

これらは実は、リーダーを楽にします。チームメンバーがこういうところで躓いているのだなということが認識しやすくなるためです。

:::note info
「愚痴をこぼすメンバーはダメだな」なんて思うリーダーも、もしかしたらいるかもしれません（居ないとは言いません）。ですが、リーダーにとっては障害が見えやすくなったほうがマネジメントがしやすくなるのですから、良いことしか無いと思います。リーダーたるものそう思ってほしいと願うので、ここではより良い愚痴を勧めていきます。
:::

筆者は「良い愚痴」をこぼせる人はとてもチームワークが上手だと思っています。
会社のフェーズにもよるかもしれませんが、数名規模のスタートアップならまだしもある程度組織化されたチームでは、いかにチーム内の血の巡りをよくするかが開発の推進力になります。

凝りはほぐすのが一番です。ほぐしどころを見える化するのが愚痴なのです。


## 良い愚痴をこぼそう

### ナイス愚痴1
お仕事は順調でしょうか。もし順調でないと思ったならば
「これとこれとこれとこれとこれやってて今週は終わったわ...」と書いてみましょう。
できました。そうです。ナイス愚痴です！

色々やりすぎていて進まなかったんだなとわかります。
その愚痴は愚痴ではなく **非常に大事な実績ふりかえりの材料** になりました。
開発の「遅れ」は、単に見積もりと実績の差分です。

### ナイス愚痴2

愚痴のテーマはキーワードだけでも良いです。
「今日はこれとこれとこれとこれが分からなすぎて困った...」と書いてみましょう。
そうです。ナイス愚痴、ナイスわたし主語です！

「分からない」ってストレスですよね。今、この愚痴によって[何がわからないのかをわかる](https://qiita.com/K_Noko_224/items/745ecc0b604fd71177df)ヒントが可視化できました。こぼれた愚痴は **ナレッジ化すべきキーワード** に変わったということです。すべて先輩に拾ってもらいましょう。


### ナイス愚痴3

さらに。リーダーの皆さんやある程度の開発経験のある方は愚痴ってはいけないのでしょうか。そんな事はありません！むしろリーダーや「ベテラン」各位、愚痴スキルのみせどころです。「AWSなんもわからん...」そうです。後輩に教えてもらうことができます。

> 私が好きな小飼弾さんの言葉に、「一生プログラマーでいられるかどうかは、言い換えれば年下から学べるか否か」

と[和田卓人さんも仰っていました](https://www.ntt.com/shines/posts/b-t_20201012.html)。あなたの愚痴は **一生プログラマーでいるためのパスポート** に変わりました。今日から教え教えられるより良い関係の始まりです。ナイス愚痴！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/99635427-7e66-e825-0296-4eca0abb1d95.png)


## まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/2138c006-0c89-e326-6790-088a355ec351.png)

筆者はリアクションを作ってSlackに入れました。あなたも良い愚痴をこぼしてみませんか。
以上参考になればさいわいです。
JupyterLabでMarkdown出力する時のTips

何回もググるのが嫌になったので、メモしておく。

# IPython Notebook を Markdown に変換する

JupyterLab のメニューから、File > Export Notebook As... > Markdown

matplotlib inline で図を出力している場合も、その図は自動的に png に変換され、markdown に埋め込まれている状態になっている。
この時は png も含めて全部 zip でダウンロードされる。

# pandas の DataFrame を Markdown に変換するけど JupyterLab でも綺麗に出力する

pandas の `to_markdown()` に [tabulate](https://pypi.org/project/tabulate) が必要なので、先にインストールしておく。

```python
import pandas as pd
from IPython.display import display, Markdown

df = pd.DataFrame(何かのデータ)
display(Markdown(df.to_markdown()))
```

JupyterLab では普通に DataFrame を出力したように見えるけど、
Markdown に変換してダウンロードしたファイルをみると、Markdown のテーブルになっている。
作られる Markdown のテーブルはデフォルトで PHP Markdown Extra って奴かな。`to_markdown()` は tabulate にパラメータを渡せて、tabulate は物凄く高機能なんで、やろうとすればどんなことでも出来るだろう。（JupyterLab が対応しているかは別）
普通に使う分には、何も考えず `to_markdown()` するだけで十分。

# Markdown にいちいち値を手書きするのがメンドイので、値を参照して埋め込みたい

Jupyter Notebook には [python markdown](https://github.com/ipython-contrib/jupyter_contrib_nbextensions/tree/master/src/jupyter_contrib_nbextensions/nbextensions/python-markdown) という便利プラグインがあったけど、JupyterLab には残念ながら対応してない。[みんな怒っている](https://github.com/ipython-contrib/jupyter_contrib_nbextensions/issues/1360)。（みんなというのは語弊）
だから手書きしなきゃいけない。

```python
import pandas as pd
from IPython.display import display, Markdown

df = pd.DataFrame(何かのデータ)  # user_id というカラムがあるとする
display(Markdown(f'''
* データのサイズは {df.shape[0]} です
* ユーザーIDのユニーク数は {df.user_id.nunique()} です
'''))
```

Python の f-Strings は物凄い強力で、関数でも何でも評価してくれちゃうので、逆にこっちの方が便利かもしれない。

# 上の２つをまとめると

こんな関数を作っておけば更に便利かもしれない。（適当）

```python
from typing import Union
import pandas as pd
from IPython.display import display, Markdown

def show_it(data: Union[str, pd.DataFrame]) -> None:
    if isinstance(data, pd.DataFrame):
        display(Markdown(data.to_markdown())
    else:
        display(Markdown(data.strip()))
    return
```

# Markdown から code block を取り除きたい

JupyterLab で変換した Markdown は code block がそのまま残されてるけど、レポート（PDF）にするには邪魔だったり、行の長さを考えなきゃいけなかったり、ページの切れ目を考えなきゃいけなかったりする。

いっそのこと、全部消しちゃえば良い。

JupyterLab の変換時に頑張ったり、pandoc の filter で頑張ったりも出来るだろうけど、sed で一発だ。

```bash
>  sed -i.orig '/^```/,/^```/d' sample.md
```

一応 backup として元の Markdown を `sample.md.orig` というファイル名で残す場合。未練が無い場合は `-i` で良い。
Next.jsでESLintが動かなくなった現象について

## 状況
```
yarn add --dev eslint
yarn lint
-->error - ESLint must be installed: yarn add --dev eslint
```
## 解決策
```
yarn add --dev eslint@7.32.0
```
## 詳細
Next.jsの新規プロジェクトでeslintが動かなかった。
vscodeの拡張の方も動かない。
そこで色々と試したところ、どうやら```eslint-config-next```がeslintの新バージョンに対応していないらしくエラーになっていたということらしい。
参考：https://github.com/vercel/next.js/discussions/29951
【ネットワーク】IPの基礎知識

IPアドレスは、32ビットで表されます。
IPアドレスは、二種類のネットワーク部と、ホスト部によって構成されています。

192.168.2.1/24　というアドレスがあれば、/24は先頭２４ビットがネットワーク部を表すのにたいして、残りの１がホスト部を表している。

| ネットワーク部 | ホスト部 |
|:-:|:-:|
|  各ホストが所属するネットワーク自体を表す |  ネットワークに所属する各ホストを表す |
|例||
|192.168.2.|1|
|24bit部分|残りの８ビット|

IPアドレスは、クラスA、クラスB、クラスC、クラスD、クラスEの5つのアドレスクラスに分類されます。
　これらのクラスでは、IPアドレスのネットワーク部とホスト部がどの部分に該当するのかを定義しており
　また、各クラスにおいて使用できるアドレス範囲、そして、各クラスにおける用途などを定義しています。

![tmp.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162957/eed3fed2-25d9-26b1-00f8-1bb307d5f576.png)

引用元 <a href="https://www.infraexpert.com/study/ip3.html">ネットワークエンジニアとして</a>
PL/pgSQLでSelectした結果のRecord Typeから値を変数に格納する

PL/pgSQLではプログラムを書けることは分かったがSQLとの橋渡しがあまりわからなかったのでメモ
`select hoge into v_hoge`してあげるとv_hogeに格納できる（筆者はsupabaseのfunction機能で動作確認しました）

例では`select count(*)`の結果をinteger型の変数cntに格納する

```sql
DECLARE
  cnt integer;
BEGIN
  select count(*)
    into cnt
    from table_name
    where col1 = 1;
  RETURN cnt;
END
```