OmniAICreator/Qiita-1.07M huggingface dataset:
NVSを使ってNode.jsをWin11にインストールする

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はNode.jsをNVSを使ってWin11環境にインストールしていきたいと思います。

# 用語
## Node.js
あっているかはおいておきますが、JavaScriptの派生形みたいなイメージなんだなぁと思ってます。

JavaScriptそれ自体はHTML/CSSと一緒に使うことでWebページに動きを出せるヤツ。ただ、このJavaScriptはこのままだとWebブラウザ上でのみしか動作できないみたいで、それをサーバ上でも実行できるようにしたのがこのNode.jsらしいです。
確かにそういわれてみると、"node"という言葉は"サーバ"みたいな使われ方をすることがありますし、NodeのJavaScript、略してNode.jsみたいな感じで覚えるとなるほど？と思ったり思わなかったりしました。

## NVS
Node Version Switcherの略
Node.jsのバージョンを簡単に切り替えられるようにするツールみたいです。
自分の環境に複数のNode.jsのバージョンを持たせることが出来るので、使い分けが出来て便利ってワケ！（？）

# 手順
## NVSをインストール
以下のGithubにアクセスしてNVSのmsiをダウンロードします。

https://github.com/jasongin/nvs/releases

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/eb7c055b-4dfe-0edb-b024-cb07ae248793.png)

ダウンロードしたmsiをダブルクリックして実行すると、以下のような画面が表示されます。
"I accept~"にチェックをつけてInstallを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/534e6ad2-2660-cf17-4f19-d8aac8d71e44.png)

正常すると"Completed the NVS Setup Wizard"という画面が出力されます。Finishを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/6a941df5-fb9c-0213-77d7-08cdce8f4145.png)

CMDを開きnvs --versionとコマンドを実行すると現在のNVSのバージョンを確認することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/5562bfbc-891b-69bf-f732-54329078c5e8.png)

## Node.jsをインストール
このNVSを使ってNode.jsをインストールしていきます。
nvs ls-remoteコマンドを実行すると、インストール可能なバージョン一覧を出力できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3564f6eb-b645-5aac-48a9-b71e4f841d9a.png)

今回は以下のコマンドを実行して2023年12月6日現在のLTS(Long Term Support)バージョンをインストールしていきます。
今回は20.10.0でありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/a45d9709-bec4-0ed9-9b2a-ed09a0a464dc.png)

これを有効化します。
nvs useコマンドでパスを自動で通してくれます。nodeコマンドでバージョンが確認できればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/bf25587a-c49c-ef57-3740-83b580b68a5f.png)

とりあえずHello Worldしてみます。
以下のようなファイルを用意。
```HelloWorld.js
console.log("Hello World");
```
これをダウンロードフォルダに突っ込みました。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/80ef947b-8039-5987-9367-a0b840b54f6b.png)

node HelloWorld.jsコマンドを実行してHello WorldとCMDに出力されることを確認します。
出力されればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d5970929-2bd2-b21d-acbb-a45c9a67208c.png)
Twitterカードが貼られたツイートはすべて詐欺です、という時代

最近見つけた現象で既に論じられているかと思ったがちょっと解説が見つからなかったのでまとめておく。

# 手短に

- X(旧Twitter)クライアントで表示される[Twitter](https://developer.twitter.com/ja/docs/tweets/optimize-with-cards/guides/getting-started)カードについてカードに表示されるドメインとは違うページにリンクさせる手法が存在する
- この手法は第三者のTwitterカードを利用することができる
- つまり悪用者は第三者のTwitterカードを表示させながら自身の意図するページに閲覧者を誘導することができる
- これはフィッシングの手法になりうる

# 見つけたツイート

以下のツイートはGoogle、Bloomberg、日経ビジネスのTwitterカードが添付されているがクリックするとそれらとは異なる情報商材サイトにジャンプする。リンク先に危険な仕組みはないと思われるがクリックは自己責任で。念を入れたい人は `curl -L`　で。

PCブラウザでカーソルを合わせてもXの短縮URLサービスである `t.co` に隠されているので一般のPCユーザーにはクリックするまでどこにジャンプするかわからない。

https://x.com/mibihe2737/status/1726873228852052049?s=20

https://x.com/DaiHayashito/status/1708924100801122776?s=20

https://x.com/dH2lZXCOHtoyLNP/status/1731963140056011148?s=20

# 何をしているの？

推測ではあるが。

Twitterカードは閲覧者のブラウザがリンク先に直接取得を試みるのではなくXのAPIサーバを介して取得される。つまりページ運営者視点だとTwitterカードの取得のためのリクエストは閲覧者ではなくXのサーバから受け取る。`curl -L` をすればわかるがジャンプ先のページまでにリダイレクトを２つ介している。リダイレクトを行なっているサーバがX APIサーバからのリクエストは偽装したいサイトへリダイレクトしTwitterカードを取得させ、閲覧者がアクセスしようとすると誘導したいページへリダイレクトする。こうすれば他者のTwitterカードで自身のページへ誘導するツイートが作れる。

# 危険なの？

例えばこの手法で〜〜銀行のTwitterカードを表示しながら「〜〜銀行がお得なポイントキャンペーンやってるよ！」とツイートし、フィッシングサイトに誘導することはできる。こう考えると公式アカウントや信用できる人が貼ったTwitterカード以外は何も信用できなくなる。

# 利用されている企業は防止できないの？

おそらくできない。X　APIサーバからのアクセスは正当にTwitterカードを表示するためにも認めなければいけない。何かしらのシグネチャ（例えばどういうリダイレクト元を介してリクエストされたのか）がついていれば判別できるかも知れないが実装が大変。

# 誰が治すの？

そりゃイーロンに言ってくれよという。つまりX社がどうにかしないといけない。安直にはTwitterカードにドメインではなくリンク先のURLを表示すれば比較的容易に目視で安全を確認できる（誤認するようなURLは話がまた別）。

Twitterカードの取得にリダイレクトが発生したら蹴るという運用だと自社の短縮URLを使っているところ（知っているのだとロイター）やあるいは趣味的に短縮URLを使う一般ユーザーが困ることになる。

# ツイートするときに気をつけることは？

URLを貼った後にさらに文章なりハッシュタグをつければURLの表示が省略されることはない。またTwitterカードはポスト作成時に手動で消すこともできる。気にしすぎだと思うがフィッシングと疑われたくなければそういう対応をする。ちなみに自分はそんな面倒なことをする気はない。

# で？

Twitterカードが貼られたツイートはすべて詐欺です
「pingコマンド」のエラー原因と解決法まとめ

# はじめに
えか太郎です。JK（情報大好き高校生）です。
本日は前回の続きとなります。前回の記事をまだご覧になっていない方はぜひ以下のリンクからどうぞ（広告）

https://qiita.com/EkaTaro3/private/4c13b5bed593bbd424aa

# 主なエラー
以下3つの原因解決策を提示します。
* 要求がタイムアウトしました
* 転送に失敗しました。一般エラーです。
* ＜アドレス＞が見つかりませんでした。ホスト名を確認してもう一度実行してみてください。
## 要求がタイムアウトしました
### 発生状況
パケットを送信したが相手からの応答が返ってこなかった場合に発生
### 原因
* 相手が落ちている
* pingをブロックする設定にされている（ウイルス対策ソフトやiptablesなど）
* ファイヤーウォール等がブロックしている
### 解決策
* 相手が正常に起動しているか確認する。（電源、カーネルパニック、謎の再起動を繰り返すなど不安定な挙動）
* 相手の設定（iptablesやウイルス対策ソフト）でping応答を有効化する
* ファイアウォールまたはルーターのパケット遮断を無効にする

## 転送に失敗しました。一般エラーです。
### 原因
* 自分のPCにIPアドレスがアサイン（割り当て）されていない。
＞IPアドレスが169.254.xxx.xxx、サブネットマスクが255.255.0.0の場合IPアドレスが割り振られていない可能性があります
* デバイスの存在しないIPアドレスを指定した。
* 指定できないIPアドレスを指定された。（タイプミスなどで1921.68.68.1など）
### 解決策
* 自分のPCに正しくIPアドレスを指定する。
* 間違ったIPを入力してないか確認する。
* IPのルールに従ったアドレスかを確認する。
## ＜アドレス＞が見つかりませんでした。ホスト名を確認してもう一度実行してみてください。 
### 原因
ホスト名をIPアドレスに変換できなかった
* IPアドレスを入力したつもりがそのIPアドレスが範囲外（例えば1921.68.68.1など）であったためこのアドレスをホスト名と判断されそのホスト名へ接続できなかった。
### 解決策
* ホスト名のスペルミスがないか確認する。
* DNSサーバーを指定する
* 有効なIPアドレスを指定する

# おわりに
今回は前回の続きとしてpingコマンドのエラーの原因と解決方法について書きました。pingコマンドによって出たエラーでググると「インターネット　つながらない」などで検索したときに出るような一般人向けの内容ではなくより詳しい適切な対象法を知ることができるのでいざという時のために覚えておくといいと思います。駄文ですが最後までご覧くださりありがとうございます。
AWS SAA合格体験談

## はじめに
　少し前になりますが、SAAに無事合格できました。
 
 ![SAA合格.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636869/be45731f-8452-733a-c749-6d2f30641030.jpeg)

ご覧の通りギリギリの点数ですが、最高に嬉しかった。

## 背景
・社内企画でAWSを使ったアプリ開発の経験あり
・部署で年度にクラウド資格を1つ以上取れと通達
・AWS認定資格未所持

## 勉強法
　最適な勉強法は個人差だと思いますが、私は [UdemyのSAAの講座](https://www.udemy.com/course/aws-associate/)を1.5倍速再生して、[Udemyにある問題集](https://www.udemy.com/course/aws-knan/)を3周しました。
  　Udemyは頻繁にセースあるから普段の値段で購入しないように気をつけてください。
   
 　試験対策ではなくきちんと知識をつけたいのなら講座は倍速再生せず、一つ一つのハンズオンをしっかりやったほうがよいかと。ただAWSは基本有料なやつが多いので、リソース削除忘れなどの間違いをしてしまったら高額請求をされる危険性あり。また、AWSのコンソールは定期的に画面レイアウトが変わったりするから、講座動画と違うところがあるのも初心者は困惑しやすいかも？

  　問題集をひたすら周回する。内容的に本番と一致しないけど雰囲気はだいたい合っています。長文が多い。これに関しては特に言うことなし。

## 感想
  　ネットワークの知識があると、VPCなどはわかりやすい。ただ講座をちゃんと見ないとSQS, SNS, kinesisなどはやっぱり疎かになった。
   　受験を期にAWSの理解を深めたい方は、公式の[AWS サービス別資料](https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all)を見ましょう。日本人のAWS技術者が解説している資料なので、~~AWS名物の機械翻訳日本語~~と違ってちゃんとわかりやすいです。
    
## 終わりに
  　すでにSAAを取得している人は次を目指すのだろう。私は一応SysOpsにしています。SAAと内容かぶる部分多いですね。
reactで何かを作りたい！

# はじめに
この記事は2023年度の振り返りです。

reactを学習し始めて数日、何か業務改善につながる物を作りたいと考え始めてました。

# 問題
どのように構築するかに焦点を当て、いくつかの選択肢を検討しました。
1. CloudFrontなどで
    - 社内用途なのでIP関連の問題が発生する可能性がある。
1. ブラウザの拡張機能
    - ブラウザ依存の問題が発生する可能性がある。
1. 社内サーバーに構築
    - 手段としては考えられるが、あまり面白くない。
1. アプリ
    - Electronを利用することで、デスクトップアプリを開発できる可能性がある。
    - デスクトップアプリって作ったことがない！

これを踏まえて、フロントサイドの技術としては、最新の技術を取り入れつつも現実的な選択として、Electron + Vite + React + TypeScriptの構成を検討しました。

# 何を使うか？
調査を進める中で、ボイラープレートと呼ばれるテンプレートが存在していることを発見しました。
以下がその一部です。


https://github.com/electron-react-boilerplate/electron-react-boilerplate

https://github.com/jctaoo/vite-electron-esbuild-starter

https://github.com/maxstue/vite-reactts-electron-starter

https://github.com/electron-vite/electron-vite-react

https://github.com/alex8088/quick-start/tree/master/packages/create-electron

これらの中で、最後の "Create Electron" が最も理想に近いものであると判断し、このボイラープレートを利用することにしました。

# おわりに
Viteを使用した自動画面更新が非常に速く、開発が非常にスムーズであることに感銘を受けました。
GitHubGuessrやってみた【勝負じゃ！！👿】

# はじめに
<!-- 発端や概要を記載 -->
ネットサーフィンをしていたら面白くてエンジニア向けのゲームを見つけました。:eyes:
[GitHubGessur](https://github-guessr.vercel.app/)というゲームです。

GitHub内の有名なリポジトリの一部のコードが表示されるので、それがどのリポジトリのコードかを当てるゲームです。

# やってみた
:laughing:まずは名前を入力してゲームスタート！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/df92550e-e43b-710a-67fb-c640b4cbc277.png)

:unamused:こんな感じでコードが表示されるので下の選択肢からそれっぽいのを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/a1e7a815-f05b-763e-d866-2eebff31c76b.png)

:joy:間違えるとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/114753b4-8303-b67f-e183-ce584c759f8d.png)

:grin:正解だとこんな感じ！全部で10問で各問題60秒の制限時間があります:timer:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/9fc5270e-f244-bbc8-25b1-07e9011c3d78.png)

:relaxed:最後は結果画面！7/10点で上のグラフを見ると結構上位っぽい:sunglasses:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/bfbc374c-3345-0797-027b-b1fef04b9c5f.png)
それぞれのリポジトリ名をクリックするとそのリポジトリに飛べるので気になったものは中身を見てみるのも楽しい！

# コツ
割と上位のスコアが取れたのでおこがましくもコツを語ります。
1. リポジトリ名が特定できる文言がある時がたまにあるので、まずはそれを探すこと。mongodbとかswiftとかはそういう単語が入ってなかったら分からなかったです。
1. ヒントを見る。制限時間が30秒を切ると使用言語が、15秒を切ると画像ヒントが出てきます。
1. 知識と勘を総動員する。「確かビットコインはC++で実装されてたな」とか「なんか機械学習っぽいことやってるからTensorFlowかな」とか無根拠よりは何かしら根拠をもって回答すると若干当たりやすい気がします。

# おわりに
楽しいのでぜひやってみましょう！
- [GitHubGessur](https://github-guessr.vercel.app/)
[TCA] TextFieldの文字数制限をする方法

　TCA環境にてTextFieldの文字数制限が思ったようにできませんでした。ワークアラウンドがとりあえず動いているので紹介します。

### 直面した問題

- フォーカスのあるTextFieldに対してReducerから値を設定しても更新されない。

具体的に次のようなコードでは更新されませんでした。
（環境：TCA 1.5.1 / Xcode 15.0.1 / iOS 17.0.1）


:::note warn
`@BindingState` を使っていますがviewStoreの`binding(get:send:)`でバイディングしたり`@BindingViewState`を挟んでみたりしても解決しませんでした。
:::

#### ◾️対処前

```swift
@Reducer
struct BindingBasics {
  struct State: Equatable {
    @BindingState var text = ""
  }

  enum Action: BindableAction, Equatable {
    case binding(BindingAction<State>)
  }
  
  var body: some Reducer<State, Action> {
    BindingReducer()
    
    Reduce { state, action in
      switch action {
      case .binding(\.$text):
        state.text = String(state.text.prefix(5))  // フォーカスのあるTextFieldには反映されない
        return .none
        
      case .binding:
        return .none
      }
    }
  }
}

struct BindingBasicsView: View {
  @State var store = Store(initialState: BindingBasics.State()) {
    BindingBasics()
  }
  
  var body: some View {
    WithViewStore(self.store, observe: { $0 }) { viewStore in
      Form {
        TextField( "Type here", text: viewStore.$text )
      }
    }
  }
}
```

### 対処

　TCAを使わずTextFieldを`@State` にバインディングしていれば更新できていたので、TextFieldはTCAのStateではなく`@State`にバインディングしておき、TCAのStateと`@State`で値の同期をとることで目的の動作にさせることができました。

- `bind(_:to:)` でTCAのStateと`@State`の同期をとる
- `onChange(of:initial:_:)` で文字を加工し`@State`の値を更新
- `@State`の初期化は onAppear→Reducer→Stateを経由


#### ◾️対処後

```swift
@Reducer
struct BindingBasics {
  struct State: Equatable {
    @BindingState var text = ""
  }
  
  enum Action: BindableAction, Equatable {
    case onAppear
    case binding(BindingAction<State>)
  }
  
  var body: some Reducer<State, Action> {
    BindingReducer()
    
    Reduce { state, action in
      switch action {
      case .onAppear:
        state.text = "初期値"  // 間接的にViewの @Stateを初期化
        return .none
        
      case .binding:
        return .none
      }
    }
  }
}

struct BindingBasicsView: View {
  @State var store = Store(initialState: BindingBasics.State()) {
    BindingBasics()
  }
  
  @State var text: String = ""
  
  var body: some View {
    WithViewStore(self.store, observe: { $0 }) { viewStore in
      Form {
        TextField( "Type here", text: $text )
      }
      .bind(viewStore.$text, to: self.$text)  // TCAのStateと @State を同期
      .onAppear {
        viewStore.send(.onAppear)
      }
      .onChange(of: text) {
        text = String(text.prefix(5)) // 致し方なくここで制限をかける
      }
    }
  }
}
```

### 最後に

　ご覧のとおり「文字数制約をかけるロジックがReducerではなくViewにある」という問題があります。いくつか他の方法を探りましたが、結局「ReducerでStateを更新する」というアプローチではうまくいきませんでした。

　多分、ほかに筋の良い対処方法があるのだと思いますが、その情報に辿り着けませんでした。
原因や対処方法など、ご指摘いただけたら幸甚です🙇
Options Objectパターンでレベルアップしたコードを書こう【後編】

本記事は、[Options Objectパターンでレベルアップしたコードを書こう【前編】](https://qiita.com/odendayoko/items/d6c1eb473378622d59fd)の続きです。
こちらを読んでから、ご覧ください。

こちらのサイトを参考にしました。
[キーワード引数とOptions Objectパターン](https://typescriptbook.jp/reference/functions/keyword-arguments-and-options-object-pattern)


ここまでキーワード引数を学びました。
復習すると、**キーワード引数**とはPythonの機能で、**引数名を使って「名前=値」の形式で引数を指定する方法**でした。
しかし、残念ながらJavaScript、TypeScriptにはこれに該当する機能はありません。
その代わり、似たようなことがOptions Objectパターンで実現できます🙌

## Options Objectパターン
それでは、実際にOptions Objectパターンの書き方を見てみましょう。
> Options Objectパターンは複数の位置引数を受け取る代わりに、ひとつのオブジェクトを引数に受け取るように設計された関数を言います。
> 

```jsx
// 位置引数の関数
const normalFunc = (x, y, z) => {
	console.log(x, y, z);
};

// オブジェクトひとつだけを引数に持つ関数
const func = (options) => {
	console.log(options.x, options.y, options.z);
};

// 分割代入で書く
const func = ({x, y, z}) => {
	console.log(x, y, z);
};

// 型も書く
const func = ({ x, y, z }: { x: number; y: number; z: number }) => {
  console.log(x, y, z);
};

func({ x: 1, y: 2, z: 3 }); // => 1 2 3
```
**分割代入**で書くと聞くと、難しく感じてしまいますが、ReactコンポーネントでPropsを受け取って、関数を定義するときにいつも使っている書き方でした。
用語に苦手意識がある方は、実務で触っているソースコードと比べると身近に感じられるのではないでしょうか。
```React
// 分割代入しないと、長くなって見栄えが悪い
export const Profile = (props) => {
 return (
  <p>私の名前は{props.name}です。{props.age}歳です。</p>
 );
};

// 引数の段階で分割代入する
export const Profile = ({name, age}) => {
 return (
  <p>私の名前は{name}です。{age}歳です。</p>
 );
};
```
次に、Options Objectパターンのメリットについてまとめます。

:::note warn
### Options Objectパターンのメリット
- **引数の値が何を指すのか分かりやすい**
- **引数追加時に古いコードを壊さない**
- **デフォルト引数が省略できる**
:::

### 引数の値が何を指すのか分かりやすい
引数をbooleanで渡す場合を例にします。
```tsx
determineDinnerMood({ true, false, false });
```
これでは引数の何がtrueなのか、何を指しているのかわかリません。
関数定義しているところを見に行かなければ、引数の意味が理解できないとなると、ソースコードで見るところが行ったり来たりして大変です😢

これをOptions Objectパターンで書くと、関数を呼び出しているところだけで、引数の意味が理解できます。
日本食が気分だったみたいです🍣
```tsx
determineDinnerMood({ japanese: true, chinese: false, western: false });
```
### 引数追加時に古いコードを壊さない
これはイメージがつきにくかったのですが、要は「オブジェクトだから、将来引数を変えることになったとしても、キーとバリューの対応さえ合っていれば、順番はどうでも良い」ということだと解釈しました。

### デフォルト引数が省略できる
Options Objectパターンを用いた場合は、デフォルトにしたい引数については何も書く必要がないそうです。
上書きしたい引数だけを書けばいいのは便利ですね！
```typescript
const determineDinnerMood({
  japanese = false,
  chinese = false,
  western = false,
}) {
  console.log(japanese, chinese, western);
}
 
determineDinnerMood({ chinese: true });
// =>false true false
```

## リファクタ
教えていただいた知識を使って自分が書いたコードをリファクタしました。
```typescript
// どのプランからどのプランへ変更するか確認する
const isPlanChange = ({ from, to }: { from: Plan; to: Plan }) => {
  user.currentPlan === from && user.nextPlan === to;
};

// プランA→プランBへの変更かどうか
const willChangePlanAToPlanB = isPlanChange({from: Plan.planA, to: Plan.planB});

// プランA→プランCへの変更かどうか
const willChangePlanAToPlanC = isPlanChange({from: Plan.planA, to: Plan.planC});
```
引数が何を表しているのか、関数を呼び出しているところを見るだけで意味がわかるようになりました🎉

## 終わりに
レビューを返してもらうと、自分では気づけないことや新しい知識を身につけることができます！
今後も、レベルアップした書き方を学んでいきたいです。
広告会社の仕事に登場する数学

博報堂テクノロジーズの坂井です。
普段はメディア効果の予測や最適化のツールを開発していて、日々数学の力を借りながら開発業務をしています。

数学の領域は多岐にわたりますが、私たち広告会社の仕事によく登場する領域・しない領域があります。今回は広告会社で私自身が接してきた仕事と数学の関係を棚卸ししてみました。主に統計・機械学習とその周辺の数学の話題になります。

:::note
今回の整理は私自身の経験をもとにした個人的見解です。すべての業務領域を精査したわけではないこと留意ください。
:::

## ★★日常的に使う

### 確率論・統計学・機械学習

生活者の購買行動や広告効果を記述するために、確率・統計・機械学習まわりの数学は日常的に使います。私も先日、[負の二項分布に関する記事](https://qiita.com/SAKAIYoshiki/items/e09439ff500985a8e4b7)を書いたりもしました。
確率分布、検定、回帰分析、多変量解析などの手法はお客さま仕事でもよく使われます。
社内には機械学習や生成AIの研究開発をしているチームもあり、どんなモデルがよいか、学習方法は、評価指標はといった議論も盛んです。
人間の行動・反応はまったく決定的でないので、常々確率でモデリングしがいのある対象だなと思っています。

### 数理最適化

お客様に最適な広告キャンペーンを設計するなど、実務の中で数理最適化が必要となるシーンは多いです。開発した分析ツールの中に最適化機能を組み込むような業務もあります。
既存の最適化ライブラリの力を借りることが多いのですが、既存の手法ではフィットしない問題の場合、問題の特殊性をうまく活用したオリジナルの最適化アルゴリズムを考案・実装することもあります。
個人的には最適化手法はまだまだ感覚的・原始的に扱ってしまっている部分があり、双対理論などをしっかり勉強して幅広い最適化手法を扱いこなしたいなと思っています。

### 線形代数

テーブルデータはまさに行列の形をしていますので、行列計算はよく使います。幸か不幸か実務でよく使われるPython言語はnumpyを使って高速な行列計算に落とし込むことが多いので、何気ないループ処理を行列計算に変換することもあります。
また回帰分析や多変量解析の手法の一部には行列計算を駆使するものがあり、行列の基底・階数・固有値・固有ベクトルなどの基礎的な概念に立ち戻ることもあります。
ちなみに線形代数の一番の応用といえば連立方程式ですが、実務ではそのまま登場したことはありません。だいたいの実務上の問題が、方程式というよりも最適化の形として現れるからかもしれません。

### アルゴリズム論

分析プログラムや最適化プログラムを書いた際に、計算量を評価することは頻繁にあります。「ナイーブに計算すると指数時間だけど、多項式時間に改善できないか」「計算量のオーダーを下げるのは難しいから、定数倍の改善で我慢しとくか」などの会話もしたりします。

### 集合・論理学

あまり深い知識は使いませんが、データを集計するとき、特定の生活者に条件を絞り込んだセグメントを組み合わせるときなど、集合・論理学の思考はよく使います。打ち合わせの中でも普通に「ド・モルガンの法則を使って~」という会話をしたりします。

## ★☆ときどき使うかも
### 微積分

微分・積分いずれも、上で挙げた領域の構成要素の一つとして現れてきます。

微分は、数理最適化の一部として登場することが多いです。目的関数を微分（偏微分）して勾配情報を使うことができれば最適解への収束が速まるため、「この関数ってなんとか微分できないかなぁ」とよく悩みます。

積分は、連続確率変数の分布計算や期待値計算として登場することが多い印象です。概念としては理解する必要はありつつ、積分を自分で手計算するような機会は私はありませんでした。

### 常微分方程式

普段は微分方程式を解く機会はありませんが、生活者行動やマーケティングの現象が微分方程式と関連付けられることがあり、その結果として得られる関数クラスでモデリングしたりすることがあります。たとえば修正指数曲線モデルやBassのモデルなどが有名です。
※広告からは離れますがコロナ禍で活躍したSIRモデルも微分方程式が背景にある数理モデルです。

個人的にも、生活者行動をオリジナルの微分方程式として立式するような仕事ができたらカッコいいなぁと思っています。

## ☆☆あまり使わない・使ったことない

たとえば下記の領域は私の視野の範囲では登場頻度は高くありません:

- ベクトル解析
- 偏微分方程式
- 複素解析
- フーリエ解析・ラプラス解析
- 幾何学
- 情報理論
- 位相空間論
- 代数学

これはまだ私がまだまだ未熟だからであり、多岐にわたる広告の業務の中でどこかしら活用できるはずだと思っています。


## 最後に

仕事と数学の間には

1. 仕事で必要だから数学を学んで活用する（必要起点）
2. 数学で面白い概念を学び、どうしても仕事で使いたいから活用する（ロマン起点）

の2つのモチベーション方向があり、両者の化学反応が醍醐味だなと感じています。
今後も両方のモチベーションを大切にしながら、人類の知恵を仕事に活かしていきたいと思います。

※本記事は、[統計・機械学習の数理 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mathematical_statistics)12日目の記事として投稿いたしました。
集中力を高めたい

## はじめに
　この世界は不平等なことが多いです。しかし、この不平等な世界の中で誰もが平等に与えられているものもあります。その一つが **時間** です。どんな人にでも1日24時間という時間が毎日のように流れています。そんな中、この有限である時間をいかに有効に活用するかで人生は大きく変わります。
 　
  　時間効率を最大限にするのが**集中力**です。 本日は集中力の高め方を学んで行きましょう！
### 【本記事で学べること】
- 集中できる時間管理術
- 集中の世界への入り方
- 集中力の高め方

### 【本記事の対象読者】
- 自分は集中力がないと嘆いている方
- タスクがたまっている方
- 毎日の学習時間を確保したい方


## ドーパミンと集中力
### ドーパミンとは
　ドーパミンは、脳内で生成される神経伝達物質の一種で、集中力に大きな影響を与えます。思考力を司る脳の前頭前野にドーパミンが作用すると、集中力や、やる気が高まることが分かっており、この状態が継続すると、究極の集中状態に入ることができるのです。
 
### ドーパミンを大量に分泌する
　ドーパミンは、楽しいことをしたり、わくわくしたり、時間が制限されてテンションが上がっていたり、成功体験をしたときなどにたくさん分泌されます。集中力を高めるためには、ドーパミンをいかに大量に分泌するかで決まるとも言います。
 
### 失敗体験でドーパミンを味方につける
　成功体験を積み重ねると、ドーパミンの分泌が増え、やる気や集中力がアップするといわれますが。逆に失敗をしても増えことも知られています。目的を達成するために苦労をすればするほど達成したときに分泌されるドーパミンの量も増えるのです。
　失敗をネガティブなものにとらえず、ポジティブな学習の機会として捉えることで、挑戦への欲求を高め、集中力を向上させることに繋げていきましょう！
 
## パーキンソンの法則と時間管理
### パーキンソンの法則とは
　人は制限時間を設けることで、高い集中力を発揮することができます。そこで、今回ご紹介するのが。「パーキンソンの法則」です。この法則は、「**人は与えられた時間をすべて使おうとする**」という原理で、タスクに多くの時間を割り当てると、実際に必要な時間以上にそのタスクが拡大し、効率が低下するということです。

 　一方で、**時間を区切って締め切りを設けると、発想が大きく転換します** 。時間内にやれることを脳が集中して処理しようとするため、無駄な選択肢を排除し、生産性を高めることができます。
 
### 効果的な時間管理方法
　まずは、終わらせたいタスクを設定し、必要な時間を決めましょう。目標と時間を設定したら、タイマーをセットして、1点集中で作業に取り組みます。時間内に終わらそうと意識するため集中の世界に入ることができます。
 　**もしも制限時間がきてしまったら一旦手を止めて作業を終わりにしてください。** 続けてしまうと時間制限の意味がなくなってしまう為、休憩や気分転換でリフレッシュしましょう、その後、再度適切な時間を設定して、作業に入ります。このように**ON/OFFの切り替えをしっかりして、集中時間を管理することで、しだいに時間コントロールもできるようになるはずです。**
　次章からは、さらに実践的な時間術をご紹介していきます。

## ポモドーロテクニック
### ポモドーロテクニックとは
　有名な集中時間管理術の一つにポモドーロテクニックというものがあります。これは「25分集中作業をして、5分休憩する」を1サイクルとして、4サイクル1セットで行う方法です。（ちなみにポモドーロとは、イタリア語で「トマト」という意味があります。）
 
　私は、このテクニックをよく活用しています。1つの課題を決めて25分で取り組み、5分休憩で音楽を1曲聞く。4サイクル1セットにとらわれず、目的に合わせた形に組み替えることもできるので、自由度が高いのもポイントの一つです。私の使用しているスマートウォッチにこのタイマーがあるため、重宝しています。
  
###  ポモドーロテクニックの有効な場面
- 一人で集中して作業ができるとき
- 複数の小さなタスクに分けて取り組むことができる作業
- 限られた時間内で成果を出す必要がある場面

## 90分間作業
###  90分サイクル集中法
　続いてご紹介する方法は、ポモドーロテクニックの25分よりも3倍以上長い、「90分サイクル集中法」です。　
　昨今の研究で人間の体には「ウルトラディアンリズム」という約90分の脳波の周期があることが分かってきました。この研究では、人は覚醒度の高い90分と眠気が強い20分が交互に訪れていることが判明したのです。この人の特徴をフル活用した、90分集中作業、20分休憩を1サイクルでの作業法が「90分サイクル集中法」です。
 
 ### 人間が集中できる限界は90分
 　多くの人にとって、約90分が注意力を持続させることができる最長の時間です。それ以上長く作業を続けると、注意力の散漫や疲労が増し、効率が低下します。そのため、90分作業は生体リズムに適合し、集中力と効率を最大化するのに適した時間単位とされています。



## まとめ
　本日参考にした内容は、『自分のやりたいことを全部最速でかなえるメソッド 高速仕事術』上岡正明 著を参考にしました。この本では効率的に仕事を進める方法がいくつも書かれています。ぜひ一読することをお勧めします。
　本日のテーマである **「集中力」** に着目すると、時間効率が大幅に向上し、日々の生活の質を格段に改善することができます。ぜひ自分なりに集中する方法を見つけてより良い学びにつなげましょう。
JPPC2023の1日目Power BI関連のメモ

[Power BIアドベントカレンダー 2023](https://qiita.com/advent-calendar/2023/powerbi)のシリーズ3を埋めなくてはいけない空気を感じたので投稿（え？そんなことしなくていい？？）。

JPPC(Japan Power Platform Conference)2023の1日目のFabricワークショップに参加。

https://powerplatformconf.connpass.com/event/300458/

自分が気になった点のメモ（Qiitaの私物化）。

- Microsoft Fabric全般
  - Power BIの成功を受け、データ関連の他のPaaS製品（テクノロジーや知識のサイロ化が起きていた）をSaaS化へ。それらを統合し、Power BIライクなUIで利用できるようにしたのがMicrosoft Fabric。
  - Fabricによりペルソナ（アナリスト、データエンジニア、etc）のコラボレーションが進む。同一ワークロード内でもノートブックの同時編集のようにコラボレーションが容易に。
  - Fabric上では、Fabric上のワークロードすべてが同じdelta parquet形式のファイルにアクセス可能。ストレージとコンピューティングを分けているモダンな設計となっている。また、Delta Lakeには接続文字列で外部からもアクセス可能。
- OneLake、Delta Lake
  - OneLakeには構造化、半構造化、非構造化データのすべてを格納可能。
  - parquet形式は、列方向で圧縮をかけているため、CSVよりもファイルサイズを小さくできる。Fabric上ではVerti-parquet（Power BIのvertipaq + parquetみたいなもの）でさらに圧縮している。Verti-parquetは、ざっくり言うとデータを並べ替えて圧縮効率を高めている。
- Data Factory
  - Data Factoryはざっくり言うと、データのためのPower Automate。処理の成功/失敗に応じてその後を分岐させたり、ループ処理等が可能。
  - Data　Factoryにより、ETLがPower Query（M）、Spark, SQL, Rその他の得意なもので可能に。
  - Ctrl + Shift + Nで詳細エディターを開ける。よく使うので覚えて。
  - Fabricには処理のスロットリングを防ぐために、スムージング（タスクをスケジュールし負荷を分散）、バースティング（一時的に処理能力を増強）という仕組みが自動的に働いている。
- Power BI
  - Fabricが自動生成するセマンティック モデル（デフォルト）は、モデルを調べられなかったり、XLMAエンドポイントが使えないのでおすすめしない。
  - Direct Lakeモードについて。Direct Queryモードとインポートモードのいいとこどり。データ更新が不要で、インポートモード並みのクエリ パフォーマンス。
  - 注意：SQL分析エンドポイントでViewを作ってそれをPower BIのデータソースにすると、Direct LakeモードがDirect Queryモードになってしまう。
  - Factテーブルでは使わない列は削除するように。その方がセマンティック モデルのサイズが小さくなるし、DAXエンジンのスキャンが効率化されパフォーマンスが向上する。
  - レポート レベルメジャーを使えば、ライブ接続したモデルにメジャーを追加することが可能。自分用に追加している。
- Copilot
    - スマート説明は良さげ。他は省略。

会社でFabric使ってみたいよ。
「ビジネスをゲームに変えろ！」 マーケティングの新しい風

# ビジネスをゲームに変えろ！マーケティングの新しい風

## ゲームの力で変わるマーケティング
ゲームのようなエンゲージメントをビジネス世界に取り入れるゲーミフィケーションは、顧客体験を革新し、ブランド忠誠度を高めます。では、どのように実世界のビジネスに応用されているのでしょうか？以下の事例からその秘密を探ります。

### 実例多数：ゲーミフィケーションの成功事例

#### ナイキ「Winter’s Angry」キャンペーン

http://fightwinter.nike.com/

反射神経を競うゲームを通じて、ユーザーを繰り返しブランドサイトに誘導しました。プレイヤーは毎日の最高得点者として報酬を得ることができ、積極的な参加が促されました。

#### Norma Kamaliの３D映画

http://www.normakamali3d.com/

ファッションデザイナーブランドが3D映画を用いて、視覚的に魅力的なショッピング体験を提供しました。このユニークなアプローチは、ブランドへの注目を高めました。

#### ALDOのインスタグラム活用

http://www.aisforaldo.com/

インスタグラムの写真を選択し、それに基づいておすすめの香水を提示することで、ユーザーにバーチャルな体験を提供しました。

#### スターバックス

http://www.starbucks.co.jp/

星を集めることで無料のドリンクやトッピングがもらえる報酬プログラムで、顧客の継続的な関与を促しました。

#### ユニクロのRE.UNIQLOプロジェクト

http://www.uniqlo.com/

期間限定で商品を回収し、クーポンを提供することで、顧客の環境意識とブランドエンゲージメントを高めました。

#### Spotify

http://www.spotify.com/

音楽体験の個人化を通じて、顧客のエンゲージメントを強化しました。

#### Nike Run Club

http://www.nike.com/

ランニング記録を競い合うことで、ユーザーの運動へのモチベーションを高めました。

### ゲームがもたらす個人への影響
ゲーミフィケーションは、単に販売促進ツール以上のものです。個人の生活にポジティブな変化をもたらし、新しい価値観や行動様式を形成します。例えば、Nike Run Clubを使用したランナーは、自身の健康への関心を高め、日常生活においても活動的になりました。

### まとめ：マーケティングの未来へ
ゲーミフィケーションは、革新的なマーケティング手法として、今後もさらなる発展を遂げるでしょう。企業は顧客との新しい関係を築き、ブランド忠誠度を高めるために、このようなアプローチを積極的に取り入れることが重要です。ゲームの要素を組み込むことで、顧客は楽しみながらブランドとのつながりを深め、企業は持続可能な関係を築くことができます。これからもゲーミフィケーションはビジネス界の新しい風として、その地位を確固たるものにしていくでしょう。
TwinCATでRunモード移行時にAdsError: 4132が発生

なかなかてこずったため、対策をメモしておきます。

### 経緯
TwinCAT/C++でRunモード移行時に以下エラーが発生しました。
```
'TCRTIME' (200): start of real-time avoided by "HyperV"
'TwinCAT System' (10000): Sending ams command >> Init4\RTime: Start Interrupt: Ticker started >> AdsError: 4132 (0x1024, RTIME: incompatible software detected) << failed!
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067155/f7b75729-4d90-71d6-d8a4-6be278572715.png)

Hyper-Vが原因かと思い、「Windowsの機能」で確認しましたが、OFFになっていました。
念のため、「Windowsハイパーバイザープラットフォーム」、「仮想マシンプラットフォーム」もOFFにしましたが、結果は変わらず。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067155/0b270b8d-61f0-9b0f-9447-fa79b7e4ffef.png">

エラー内容で検索して出てきたstack overflowのサイト（ https://stackoverflow.com/questions/59463238/twincat-realtime-startup-of-isolated-cpu-fails ）を見てみるといろいろな対策がかかれていましたが、以下は試しても変わらず。

- Realtime設定のCoreのIsolation
- コア分離設定のメモリ整合性設定のOFF

ただ、Kolcさんが記載していた以下を試すとエラーが解消しました。

> Further supplement to the solutions above. I did all above, but "Virtualization-based security" was still "Enabled" in System Information (see Felipe's answer).
> 
> 
> I had to turn off SystemGuard in regedit by setting "Enabled" to "0". Registry path: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\SystemGuard
> 
> After reboot "Virtualization-based security" was correctly "Not enabled".
> 

### 解決した方法

1. Windowsキーを押してregeditと打ってレジストリーエディターを起動する
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067155/6b5ab7d8-80dc-2b51-84db-0d9a5254f1bd.png">
1. 「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\SystemGuard」をクリックする。
1. Enabledと記載されている場所をダブルクリック
1. 値が1となっていたのを削除して0とし、OKをクリック
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067155/4db9c122-ff4c-7889-52d6-ea233f709e0e.png">
1. この工程の後は他のstack overflowの他の方が記載していたシステム情報内の仮想化ベースのセキュリティーが「無効」になりました。（実行前までは「実行中」となっていた）
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067155/9206adc0-bcc7-4cd4-0feb-b66278e03140.png">

### 終わりに

TwinCATはいくつかのPCでセットアップしてきましたが、初めてこのようなエラーが発生しててこずりました。
その前は何度かブルースクリーンになったり。
TwinCATは簡単にPCをIPC化・リアルタイム処理できて（※ラインセンスは必要、トライアルライセンスもあり）便利ではありますが、エラー内容が分かりづらいこともよくあるため、知見を貯めてすぐに対処できるようにしていきたいです。
【⑥進捗管理】Vite+React+TypeScript+GitHubPagesで爆速サイト公開

## はじめに
業務ではVue.js+JavaScriptを使用しています。
が、もう少しモダンなフレームワークと言語に挑戦したい...ということでReactとTypeScriptをチョイスし、簡単なWEBアプリをつくることに:v:

...と思い立ったのが10月末。
「そういえば12月はQiitaアドベントカレンダーがあるな...そこまでに公開できたらいいな:sunglasses:」と思い、1ヶ月半程度で設計~公開まで行けると踏んで開発開始。

折角なので、制作の過程も含めて記事化してみました。

ということで、本記事は下記連載の第5弾となります。
他記事も併せてご覧ください。
[【①アイデア選定】](https://qiita.com/YutaManaka/items/f5db1d86239203db8ade)
[【②技術選定】](https://qiita.com/YutaManaka/items/b1397c0624010b693a12)
[【③設計(ロジック)】](https://qiita.com/YutaManaka/items/6d412971574c4ca9fb1b)
[【④設計(デザイン)】](https://qiita.com/YutaManaka/items/5bb6b193149e68c9b742)
[【⑤環境構築】](https://qiita.com/YutaManaka/items/60bed57196386ccce931)
[【⑥進捗管理】](https://qiita.com/YutaManaka/items/beeba2bcba64d1d1c6bd)←イマココ

ちなみに、公開サイトはこちら↓
https://yutamanaka.github.io/FragranceFinder/

リポジトリはこちら↓
https://github.com/YutaManaka/FragranceFinder

本記事では、完成までの進捗管理についてまとめました:writing_hand:

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- ポートフォリオを作成したが挫折しそうな方

## 結論
:::note
1. 締切を決定
1. 工数を見積もる
1. 1日当たりの作業量を可視化
1. ひたすら作業！
1. 完成！
:::
で納期までに完成できる！

以下、今回のプロジェクトを具体例に説明します。

## 1. 締め切りを決定
まずはスケジュールを決めます。
「いつまでに」が決まらないと、プロジェクトの成功はあり得ません。

:::note
締切日：12/1まで(作業可能日数：1ヶ月半)
:::

## 2. 工数を見積もる
続けて、全体の作業量を見積もります。
今回は「技術選定~設計~実装」までをざっくりと洗い出しました。

:::note
1週間：技術選定+設計(ロジック)
1週間：設計(デザイン)+素材集め
1週間：環境構築
3週間：実装+公開
:::
ということで、10月中旬からスタートしたので、10月中は設計フェーズとしました。
その後11月に入り、さて実装！という段階で、再度細かい工数見積もりを行いました。

:::note
コンポーネント(5)
TOPページ(1)
質問ページ(11)
結果ページ(1)
:::

## 3. 1日当たりの作業量を可視化
3週間で前述の量を実装する必要がありました。
単純に割り算すると、「1日に1個ずつ作れば間に合うか...?」て感じでした。
TOPと結果ページが少し時間かかりそうだったので、2日かかると想定して、下記の日数を見積もりました。

|ページ名|作業予定日数|個数|total日数 |
|-|:-:|:-:|:-:|
|コンポーネント|1|5|5|
|TOPページ|2|1|2|
|質問ページ|1|11|11|
|結果ページ|2|1|2|
|合計|||20|

## 4. ひたすら作業！
予定が決まればあとは実装あるのみ！
平日の業務が忙しく作業できない日もありましたが、他の平日や週末で辻褄あわせて、予定通り進捗するように心がけました。

## 5. 完成！
ということで、予定通り完成！

https://yutamanaka.github.io/FragranceFinder/

また、一連の流れをqiita記事化して、本プロジェクトは完了いたしました。
お疲れ様でした！

## おわりに
個人開発の進捗管理のノウハウについてまとめました。
GASでフォームの質問項目を投稿結果から自動で書き換える。

# フォームの質問項目を自動で調整したい！！

と思ったら、読む話。

例えば会議室の予約や先着順の催し物の参加募集なんかも、上限に達したら質問から消したり、残り数を表示したりしたいこと、ありますよね？

色々と方法はありますが、今回は一番シンプルな例を出してみようと思います。
徐々に機能拡充していくのでちょっとずつ読んでいってくださいな。

# おやつを先着〇〇名にプレゼントする企画の予約フォーム。
## 実装機能
1. スプレッドシートに、プルダウンで選択するものをリストで入れます。
1. フォームからの投稿数上限を設定する。
1. フォームからの投稿があると、countif関数で選択肢に応じて回答数をカウントするように仕込む。


フォームの回答シートはこんな感じになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/a7442266-2a3a-d130-4256-812bf2684938.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/bf7854e5-e5a4-89b1-c12a-c5c39c7aabb5.png)

:::note
こんな感じに設定します。
A列. 選択項目を手打ち
B列. countif関数でフォームの回答数を取得
C列. A列の項目ごとに、フォームに表示されるまでの上限数を手打ち。
D列. C列-B列
:::

# で、これがコード


```javascript
function edit_form() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sh = ss.getSheetByName("プルダウン");
  const rng = sh.getDataRange();
  const values = rng.getValues();
  const choiceValues = values.filter(row => row[3] >0).map(choice => [choice[0]]);  
  const formId = "フォームのidを入れてね。";
  const form = FormApp.openById(formId);
  const items = form.getItems();
  const item = items[0];
  if(choiceValues){
  item.asListItem().setTitle("好きなフルーツ").setChoiceValues(choiceValues);
  }else{
    item.asListItem().setTitle("好きなフルーツ").setChoiceValues("終了");
  }  
}

```

あとは、フォームに1個だけプルダウン選択のアイテムを作って以上のコードを動かせばオッケーです。

フォーム送信時にGASが事項されるようにトリガーつけるのを忘れずに。

フォームから回答が送られるたびに、プルダウンシートのD列が減っていきます。
かつ、フォームから回答が送られるたびに、フォームのアイテムを書き換えるGASが動きます。
D列がゼロになると、その行はGASのFilterメソッドででA列の質問項目が表示されなくなります。

最初は存在していたキャンディが・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/1360d850-01a7-f47b-39fe-09384a6babe2.png)


### 3回投稿すると、プルダウンに表示されなくなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/0980f2b0-701e-6233-2bb7-e022a4e7917e.png)
キャンディは残りが0になったので、フォームのプルダウンに表示されなくなるのです。

スプレッドシートに仕込んだ動的な要因を使って、フォームを色々と調整することは結構できます。
工夫次第でかなり仕事を効率化できるので、挑戦してみてください。
C++で線画を作ってみる

こんにちは！

以前、[Pythonで線画を作ってみる](https://qiita.com/yam_dev/items/beadcc5b74451c8c0f24)という記事を書きました。

Python以外にJava、C++でも同様のことができるようなので、C++で実装してみます。

# 要件
・カメラを起動する
・エッジを抽出する
・画像として保存する

# 環境構築
端末はMacbook Proです。
C++はすでに使える状態なので、OpenCVをインストールします。
```
brew install opencv
```
さあ、やるぞ！と気合を入れていたものの、OpenCVのインストールが終わりません。
依存関係のライブラリもインストールしているので、かなり時間がかかるようです。
結局、40分くらいでやっと終わりました。

# コード
今回実装したコードです。
4枚保存したら終了するようにしました。
```c++:line_drawing.cpp
#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // カメラをオープン
    cv::VideoCapture capture(0);
    if (!capture.isOpened()) {
        std::cerr << "カメラが開けません。" << std::endl;
        return -1;
    }

    int frame_count = 0;
    int saved_images = 0;

    // カメラがオープンしている間ループ
    while (saved_images < 4) {
        // フレームをキャプチャ
        cv::Mat frame;
        capture >> frame;
        if (frame.empty()) {
            std::cerr << "フレームの取得に失敗しました。" << std::endl;
            break;
        }

        // グレースケールに変換
        cv::Mat gray;
        cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);

        // コントラストの調整
        cv::equalizeHist(gray, gray);

        // ガウシアンブラーの適用
        cv::GaussianBlur(gray, gray, cv::Size(5, 5), 0);

        // エッジ検出で線画を生成
        cv::adaptiveThreshold(gray, gray, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 11, 7);

        // 生成した画像を表示
        cv::imshow("Line Drawing Camera", gray);

        // 10フレームごとに画像を保存
        if (frame_count % 10 == 0) {
            std::string filename = "line_drawing_" + std::to_string(frame_count) + ".jpg";
            cv::imwrite(filename, gray);
            std::cout << filename << " を保存しました。" << std::endl;
            saved_images++;
        }

        frame_count++;

        // 'q'が押されたらループを抜ける
        if (cv::waitKey(1) == 'q') {
            break;
        }
    }

    // カメラをリリースしてウィンドウを閉じる
    capture.release();
    cv::destroyAllWindows();

    return 0;
}
```
こちらもシンプルなコードですね。

# コンパイル
C++なので、コンパイルが必要です。
以下のコマンドを実行。
```bash
g++ -std=c++11 -o line_drawing line_drawing.cpp `pkg-config --cflags --libs opencv4`
```
```bash
$ ls
line_drawing*		line_drawing.cpp
```
実行ファイルが生成されました。

# 実行
それでは、実行してみます！
```bash
./line_drawing
```

...あれ？起動しない。
エラーは発生していないので、時間がかかっているだけでしょうか。
しばらく待ってみます。。

と思ったら、いきなり起動！
油断した瞬間を撮られました。
![line_drawing_30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/afe43080-6ebc-4720-6502-9581bc0e0115.jpeg)

Pythonと同様に、線画になってますね！
相変わらずメガネはくっきりです。

# まとめ
今回は、C++でOpenCVを利用してみました。
かなり久しぶりにC++をさわりましたが、様々な言語で実装してみるのも面白いですね:slight_smile:

ラズパイとかを使って、線画を撮影できるカメラがあってもいいな、と思いました。

引き続き、色々とチャレンジしてみます！
軽深演習 #6 きっかけ

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 ６日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。

### 前提知識　射(矢印)が２つの場合

いままでは、対象が２つで射（矢印）が一つの極めて単純な例のみでした。それでも射（矢印、動詞的なもの）を意識して、対象は**なんでもいい**と思えるようになると理解の見通しがはっきりします。（私にとってですけど）。**なんでもいい**をマントラもしくは、念仏のように唱えるのがいいかもしれません、思い込みや、思考停止を、**なんでもいい**と思うことによって防止できる気がします。そして、射が２つになると世界は変わります。
射がひとつの場合に、
```mermaid
flowchart LR
  A[現在]-->B[未来]
```
時系列で過去を加えてみましょう
```mermaid
flowchart LR
  X[きっかけ　過去]-->A[現在]-->B[未来]
```

2つの射には、時系列のように左に遡ることができるのもありますね。
勿論、遡っていると思えない射もありえます。
```mermaid
flowchart LR
  A-->B
  B-->A
```
[圏論の地平線](https://amzn.to/3NfOWgR)という本は、数学だけでなく、認知科学、哲学などさまざまな分野の人が登場します。それらの人は圏論との関わりを語るわけですが、まず、圏論をはじめる**きっかけ**から語り始めます。きっかけは原点ともいえますね。では、演習です。あなたの原点（きっかけ）についてです。

### 演習 子供の頃にもった疑問や、気づきが大きな成果を作り出した。例はどんなことがあるでしょうか？　アインシュタインは、高校生のときに光速度で動いたらどうなるだろうか　という疑問をもっていました。それが、相対論につながったといえるでしょう。

あなたも、高校生の頃の気づきがいまでも影響のあるきっかけになっているんではないでしょうか？　私は、小学校６年のときの集団いじめの目撃が大きなきっかけになっています。おかしいことがあったら、おかしいというのが、習性になっています。
バカにできない！！Udemyを活用して、ちょっとした隙間時間で市場価値を向上させる資格ゲットしよう

## 資格をバカにしていた自分
- 私は、普段からプログラムを書いていて、サービスの開発などをしています。資格とか、医者になるわけでもないし、無駄無駄。実力のない奴の戯言。って思ってバカにしてました。💦

## なぜこの記事を書くのか
- 正直、資格についてバカにしすぎていた自分に反省し、今現在思っていることは、資格はいらない。相手が納得できる実力と実績があるなら。かつ、相手に自分をアピールできたか。)
- けど、ほとんどの人は、採用時に、誰もが認める実績を持っているわけでもないし、持っていたとしても、相手にわかってもらえるトーク力やその時の運などがあるわけではない。経営陣からしたら、実績も大事だが、会社で即戦力になれそうかどうか、余計なことはせず、スピード感のある開発ができる人かどうか重要であると私は思う。
- これを考えた時に、雇う側が、就活や転職時に、使える人材かどうか見極めるのは困難となる。
- だからこそ、私は、こういうものだ！を説明することなく証明できる手っ取り早い証明書の一つが資格だと思う。
- 言葉を選ばずにいうなら、たとえば、東京大学を卒業したものと、どこそれ？っていう大学を卒業したものなら、前者を採用する可能性が高い。これは、後者の方が、どれだけ優れた実力を持っているかどうかに関わらず、書類の段階ではその人の人柄ややってきたこと、実力を見極めるのは極めて困難だからだ。そこで、難関IT資格が並んでいたら、少しは目に止まるであろう。この方は、努力できる人に違いない。など見る目が変わる。実力があっても、見てもらえない、チャンスが与えられない。そんなことはザラにある。だからこそ、資格は大事だと思う。
- 私が言いたいのは、自分も含め、誰もが認める実力もない、誇れる実績もない奴らは、とにかく資格を最短で取っておけ。ということです。何かしらの実績がないと、会うことさえ許されないこともあるから。ただし、資格が目標になる！はダメ。あくまで隙間時間で。
- なぜならば、エンジニアは、資格よりもコミュニケーション能力、マネジメント能力、サービスをいかに迅速に正確に仕様通りに作るという能力が圧倒的に大事だから。


というわけで、電車や移動の合間に見れる。エンジニアの勉強の邪魔をしないUdemyのIT資格講座について紹介します。

## Udemyおすすめ講座
まずは、王道資格
Udemy講座の選び方について　直感的に自身がこれがいいってのがなければ
以下に注意して選べば、まず間違い無いです。
＝＞レビュー数と星、セール中、値段

## ITパスポート
個人的には、一つ目の講座がおすすめ
要点だけを絞って、合格点をとりに行くための勉強法である。
さらに、流しながら見る人のための動画という感じ。まさに、電車や隙間時間にぴったり。
初心者ならまずは、毎日IT用語に触れることが大事なのでとてもおすすめ

- [ITパスポート最速合格コース ～効率的な学習で0から合格まで～](https://www.udemy.com/course/itpassport/)

- [【ITパスポート試験】4年連続売上No.1『ITパスポート絶対合格の教科書』著者による「絶対合格のコース」新規開講！](https://www.udemy.com/course/zettai-itpass/)

- [令和5年版:現役講師が教える【ITパスポート試験】60日合格を目指すための講義＆過去問300全解説＆指導メール](https://www.udemy.com/course/it-passport/)

## 基本情報技術者試験
基本情報のおすすめは、3, 4番目ですね。
基本情報は、午前午後に分かれるため
勉強自体も分けた方がいいかなという印象があります。
この方も午前版と、午後版で分けていたのですごくわかりやすかったです。

- [～始めから効率よく学ぶ～ 基本情報技術者試験 最速 合格講座](https://www.udemy.com/course/lerning-fe/) ⭐️4.3
- [令和5年版:現役講師が教える【基本情報技術者試験　科目A】講座　基礎理論から経営戦略までの全範囲を網羅](https://www.udemy.com/course/kihon_joho/)⭐️4.4

- [令和６年春:現役講師が教える【応用情報技術者試験　午前版】講座 　合格に必要な知識の徹底解説＋過去問題解説](https://www.udemy.com/course/ouyou_joho/)⭐️4.4

- [令和６年春版:現役講師が教える【応用情報技術者試験　午後版】講座　合格に必要な知識の徹底解説＋過去問題解説](https://www.udemy.com/course/ouyou_pm/)⭐️4.4

## 応用情報技術者試験
応用情報に関して、筆者は、以下の二つしか受講していないため、以下二つについて
基本情報で、動画を作成されていた方だったので、信用して購入しました。
この方の動画の特徴として、知識だけでなく、セキュリティ周りやDB周りの話では、手を動かしながら、できるというフェーズもあり、頭の中で想像しやすかった印象があります。


- [令和６年春:現役講師が教える【応用情報技術者試験　午前版】講座 　合格に必要な知識の徹底解説＋過去問題解説](https://www.udemy.com/course/ouyou_joho/)⭐️4.4

- [令和６年春版:現役講師が教える【応用情報技術者試験　午後版】講座　合格に必要な知識の徹底解説＋過去問題解説](https://www.udemy.com/course/ouyou_pm/)⭐️4.4

## 最後に
- IT業界は、1年で技術がアップデートされてしまうくらい、情報の更新スピードが早いです。普段から、アンテナを張り、常に自身の技術をアップデートさせて行かないといけません。。だから、自分は、どう言うやつだと言う証明書(資格)は、素早くとって、時間をかけるべきところを見極めていく必要があります。
- 最強のエンジニアになるためには、ビジョンと最適な職場環境は必要です。キャリアアップのためにも、隙間時間で、市場価値を向上させていきましょう。
ハッカソンでよく使う技術

この記事は [DeNA 24 新卒 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/dena-24-newgrad) 6日目の記事です
すでに色々なジャンルの記事が上がっていますし、これからも上がっていくので是非お見逃しなく！

https://qiita.com/advent-calendar/2023/dena-24-newgrad

# はじめに
こんにちは、かさはら([@kshrdsg](https://twitter.com/kshrdsg))です。
みなさん、ハッカソンは好きですか？私は大好きです。
たまにハッカソン後の交流会などで「どんな技術を使っているか」、「どのように選んでいるか」という話題が出てくるので、この機会に自分がハッカソンでよく使う技術についてまとめてみようかなと思います。

# 選定基準
まず、普段私がハッカソンで使う技術を選ぶ軸は以下の３つです。

## 1. 素早くアイデアを実装できること
私はハッカソンという場を、とりあえず思いついたものを作って楽しむものとして使っているため、第１にスピードを置きがちです。
慣れているとか、実現したいことを手早く実装できるライブラリがあるとか、記事が豊富とかそういうあたりですね。

## 2. 実装以外のことをあまり考えなくて済むこと
1にも関わってきますが、とにかくアイデアの実装に時間を割きたいので、最短距離を走りきれる技術が好きです。
デプロイが簡単だったり、コマンド一発で環境ができたり、チーム開発でもコンフリクトが起きにくかったりすると嬉しいですね。

## 3. チームメンバーの最大公約数であること
チームで開発するとき、誰か一人しか慣れてない技術を使うと、学習しながら作ってスピードが出なかったり、そもそもコンテキストを共有できずに開発上での齟齬が起きたりといったことが発生するので、できるだけチームメンバー全員がある程度使える技術を選んでいます。

# プラットフォーム系
## Firebase
https://firebase.google.com/?hl=ja

言わずと知れたすごいやつです。
SDKも充実しているので大体の言語やフレームワークで使えて汎用性が高いのが嬉しいですね。
ホスティングもDBも認証もこれで済むのでこれで充足するならとりあえずこれ使っておくか〜っていう感じです。

## Azure
https://azure.microsoft.com/ja-jp

Microsoftのパブリッククラウドサービスです。
herokuやrenderといったサービスが落ちる可能性を考えて、プランBとして用意しています。
基本的にコンテナベースで開発をしているので、Azure App Serviceを使ってデプロイしています。
ちなみにAzureは学生だとクレジットがもらえるのでありがたく使わせてもらってました🙏

## Deta Space
https://deta.space/

最近知った「プライベート」クラウドサービスです。
ホスティングもAPIなどのデプロイもできますし、DB（Deta Base）やオブジェクトストレージ(Deta Drive)まで揃ってます。
管理者を複数置いてよしなにやるみたいなことが（調べた限りでは）できないのでチーム開発のときは少し大変ですね。

# 言語/ライブラリ系
## HTML/CSS/JS
なんだかんだハッカソンレベルの開発だと一番手早く作れると思ってます。
ReactやVueなどよりも学習コストが低いので、初心者を交えたチームだと結構安定すると思ってます。

## Nuxt.js
https://nuxt.com/

単純にVueが好きという理由で使ってます。
ページの作り方が結構HTML/CSS/JSと近いなと個人的に思っているので、学習コストもReactよりは低いかなと思い、事前準備の期間が取れるとき、かつHTMLとかは一通りかけるよっていうメンバーが揃っていたときは使うことが多いです。
基本TSは使わずにJSでやっちゃうのでTSとの相性とかは気にせず使ってます。

## FastAPI
https://fastapi.tiangolo.com/ja/

python用のWebフレームワークです。
自動でswagger UIまで作ってくれるので、FE,BEで役割分担するときに便利だなと思ってます。
Pythonなので研究とか授業で触ったことある人が多いっていうのもポイント高いですね。

## MongoDB
https://www.mongodb.com/ja-jp

NoSQLのDBです。
ハッカソンでDBを使うときはテーブル設計してみたいなことはあんまりせず、随時プロパティを追加したりしたいのでそこらへん柔軟にできるやつを選びがち…
スキーマをバンバン変えたくはないですが、変わったときにすぐ対応できるのは嬉しいなという感じです。
あと[Mongo Express](https://github.com/mongo-express/mongo-express)が良すぎる…
データをごにょごにょしたいときにGUIベースでいじれるので、クエリとかを覚えてなくても気軽にできるっていうのがとても嬉しいです。

## Unity
https://unity.com/ja

ゲーム系で一番使うやつです。
単純に人口が多いので、ゲーム制作系だとチームの最大公約数になりがちっていうのも大きいです。
情報も多いので、なにか困ったときに大体対応できるのが嬉しいですね。
ただ、シーンの分け方とかしっかりしないとコンフリクトまつりになりがちなのでそこだけ気をつけたいなといつも思っています。

# ツール系
## devcontainer
https://code.visualstudio.com/docs/devcontainers/containers

ハッカソンでは少なからずいつもの開発環境とは異なった技術スタックで開発することになります。
ハッカソンはただでさえ時間が短く、開発環境起因のエラーとか不具合に時間取られたくないのでdevcontainerを使って開発をすることが多いです。
チームで開発するときにも、コンテナを使えば全員同じ環境でスタートできるので、なにかエラーが出たときにも手元で再現して一緒に修正できるっていうのが旨味だなと思っています。

## ngrok
https://ngrok.com/

非常用のデプロイ環境を用意するために一応用意しています。
なんかしらんけどローカルでしか動かないときとか、デプロイ環境のスペックが足りないときとかに使っています。
特に機械学習モデルで推論させたりとかっていうときにスペック足りなくなったりするので重宝しています :pray: 

# おわり
以上が私がよくハッカソンで使っている技術でした！
これ以外にも、作るものに合わせてスポットで採用する技術はありますが、ほとんど上記のスタックで参加していることが多いな〜と思います。
常に色々なサービスや技術が出てきており、ハッカソンでも初めて聞く技術を使っている人達もいるので、そこら辺もキャッチアップしてどんどん自分のデッキをアップデートしていきたいなと思います。
MVVを攻略する

## はじめに
この記事は[プロもくチャット Advent Calendar 2023](https://qiita.com/advent-calendar/2023/puromoku)の7日担当です。Qiita初投稿から次の日に2記事目を投稿することにしました。

## MVVを攻略する！
恥ずかしながら私はエンジニア転職した当時はMVVの言葉を聞いたことも意味も知りませんでした笑
今回は私みたいにMVVを理解していない人、理解したらどう行動していくか参考にしたい人向けに記事を書いていきたいと思います。

## MVVとは
M（ミッション）V（ビジョン）V（バリュー）の略です。一般的には企業理念や行動指針のことを指します。会社の目標がなんなのか迷った時のコンパスの役目になったり、同じ価値観をもった社員が集まりやすくなって働きやすい会社になったりと、MVVは会社の性格や特徴を表しています。自分の性格と企業のMVVがマッチしていると毎日が楽しく働けるんじゃないかと思っています

### ミッション
会社がなんのために存在しているのかを表しています。
（例）メルカリ：あらゆる価値を循環させ、あらゆる人の可能性を広げる

### ビジョン
ミッションを達成したときの会社の理想の姿を表しています。
（例）リクルートホールディングス：Follow Your Heart

### バリュー
従業員が働く上で大切なことや価値観を示しています。
（例）DeNA：「こと」に向かう、全力コミットなど

## 私達求職者にとってなにが重要か？
ミッションやビジョンは会社が定める目標です。ですので会社が向かっている目標に共感して納得できるのもであれば十分だと思います。
バリューは従業員の普段の行動や価値観に密接に関係してくるものになります。会社が求めるバリューと自分の価値観がマッチしていることが企業側に認めてもらえば内定ももらいやすくなるのではないでしょうか。

## ITベンシャーやスタートアップが求めているバリューとは
色々な企業を調べていると大体似ているバリューを掲げているところが多いです。
私は本質的には下記の5つのいくつかに当てはまると思っています。
* 主体的であれ
* 早く行動しよう
* 失敗を恐れずチャレンジしよう
* GIVEの精神
* チームの心理的安全性を意識しよう

## 求めているバリューが分かったので
バリューが分かったらあとは先ほどの5つのバリューを普段の生活や業務に落とし込めば企業が求めている人材に早変わりです。それが難しいのですがそれぞれを自分なりに解釈してMyバリューを作っていくといいかもしれません。下記に自分が今まで意識していたこと、もっと頑張っていきたいことを書いてみました。

### 主体的であれ
* 仕事は自分から提案、取りに行く
* 仕事の進め方や計画も自分で考えて責任を持つ

### 早く行動しよう
* 返信は即レス
* 調整も早く
* 問題や相談事も素早く対応

### 失敗を恐れずチャレンジしよう
* 知り合い皆無のLT会で登壇
* 新しい技術に触れてみる

### GIVEの精神
* 技術記事を書いてみんなにシェアしよう
* OSSコミッターになってみる

### 心理的安全性を意識しよう
* 相手の立場になって考えてみる
* 適切なフィードバックをする
* 指摘やアドバイスは真摯に受け止める

## 最後に
3年前まではMVVよりも技術力や経験が重要だった時代だと感じていましたが、昨今は同じ価値観を共有できる仲間とともに会社を育てていく風潮が強く感じられます。
今回の記事を読んでくれた人がMyバリューを作るきっかけになってくれたら嬉しいです。
私も今回書いたMyバリューを元に行動できるように頑張っていきたいと思います！
Milk-V Duo の datasheet の内容を抜粋

https://github.com/milkv-duo/duo-files/tree/main/hardware/duo
ここにある、duo-datasheet-v1.2.pdf からピックアップして再構成。

# ピン配置

ピン40ピン、および Ethernet 用の5ピンと裏側に2ピンがあります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f9ab489f-6354-3891-d0ea-75abfdc46111.png)

40 ピンのうち、汎用IOとして以下のように使えます。

- 3.3V 汎⽤ I/O (GPIO) ピン x 25
  - デジタル専⽤ピン x 23
  - ADC 対応ピン x2

残りは以下の通りです。
- GND 8本
- GND以外の電源入出力や電源コントロールに4本
- リセット 1本
- 空き 2本

# 電源

USB-C または外部電源からユニットに電⼒を供給

# USBインターフェース

USB インターフェースはホスト モードとデバイス モードの両⽅をサポートします。

USB Type-C ポートで接続するとコンピュータからSDカードなどの記憶媒体にアクセスできます。

- 電源とデータ⽤
- TF カードの再プログラミングにも使⽤できます。

USB_VBUS_DET (PIN45/ADC2)が GND になると USB インターフェースはホストモードで動きます。
PCB の背⾯にある 2 つの USB パッドはこの⽬的のために予約されており、MILKV-DUO を
ベースボードまたは USB ハブの USB Type-A ポートに接続するために使⽤できます。


# ネットワーク接続

- イーサネットコネクタ
  - トランスなしの 5 ピン Ethernetポート
- SPI で WiFi チップとつなぐことができます。

# カメラ⽤の 16 ピン FPC インターフェイス

CSI-2(MIPIシリアルカメラ)⼊⼒の2レーンデータをサポートする16ピン FPC インターフェイスが用意されています。
 


# リセット

MILKV-DUO を⼿動で再起動するには、RUN ピンをプルアップします。

この RUN ピンは電圧レベルを継続的に監視しています。電圧レベルが特定のしきい値を下回るとチップが⾃動的に再起動します。


# LED

MILKV-DUO ボードには、⾚⾊の電源インジケータ LED と⻘⾊のユーザー定義 LED の 2 つの LED が含まれています。⾚⾊ LED は 3.3V 電源に接続されており、ボードに電⼒が供給されると点灯します。⻘⾊ LED は CV1800B MCU の GPIOC24 ピンに接続されていてユーザーのソフトウェアによっ
て制御できます。

# 電気的範囲

## 1.8Vドメイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/eefb2273-bd91-b55e-8ba9-b16185307dfc.png)
1.8V IO ドメインには Ethernet,カメラ信号、USB信号が含まれます。
電流出力レベルはレジスタにより8段階で制御されます。


## 3.3Vドメイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/21b78777-d015-5e12-7215-06ca3d52332b.png)

40ピンのヘッダのうち、3.3V IO ドメインには UART,I2C,SPI,Flash,PWM,SDIOが含まれます。
電流出力レベルはレジスタにより8段階で制御されます。

# MILKV-Duo ユニットをモジュールとしてリフローはんだ付けするには

推奨フットプリントが示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/64f2b180-c0fd-fdc3-10f8-e9151207e517.png)
ちょっとリッチなGit操作をそろそろ覚える

会社勤めになるにあたって何を勉強したらいいか
一番最初にヒットしたのが**Git管理方法**だ。

一番わかりやすいGitについてのサイトはサル君かな？
会社の代表にも勧められた。

https://backlog.com/ja/git-tutorial/intro/01/

とりあえず
init → add → commit → branch

など基本的なことを会社に入る前に覚えた。

会社で共同開発を進めていくうちに
pull / push / merge

を覚えた。


なんとかそれでいいと思ったが、
次の派遣先のGitが他でやってこなかったような
管理方法をしていた。

**rebase?**
**revert?**

**cherry-pick?**

なにそれ

# 軽くおさらい

### ブランチ戦略
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/0a14e902-b09d-feea-1e45-55267e1794d0.png)
この図に尽きるでしょう。

### checkout
VS CODEでいうところのこれ。
ブランチを切り替えることを**チェックアウト**という。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/5d87f558-432b-4066-e681-15e584dc424a.png)
```
git checkout ブランチ名
```
### HEAD
現在使用しているブランチの先頭を表す名前
#### なんか似たような奴に「--hard」ってあるよね...
大量の不要な変更やエラーが発生し、最新の安定した状態に戻りたい場合
### --hard
git reset --hard [コミットID]を実行すると、
指定されたコミットに現在のブランチのHEADが移動します。

作業ディレクトリとインデックス（ステージングエリア）の内容も
そのコミットの状態に完全に戻ります。

この操作は、未ステージング、未コミットの変更をすべて破棄します。
使用する際は注意が必要です。


### --mixed
git reset [コミットID]またはgit reset --mixed [コミットID]を実行すると、
指定されたコミットにHEADが移動します。

インデックス（ステージングエリア）は指定したコミットの状態にリセットされますが、
作業ディレクトリのファイルは変更されません。

これにより、ステージングされていた変更は取り消されますが、
作業ディレクトリの変更は保持されます。

### --soft
git reset --soft [コミットID]を実行すると、指定されたコミットにHEADが移動しますが、
インデックス（ステージングエリア）と作業ディレクトリの状態は変更されません。

これにより、HEADの移動前にステージングされていた変更は、
移動後もステージングされたままとなります。

このオプションは、コミットを再構成する際に便利です。
例えば、複数のコミットを1つにまとめる場合などです。

(Chat GPTより)
...ここら辺はユースケースも踏まえたうえで
実際に使ってみないとわからないよね。


# rebase
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/5f3b2e39-a140-58cb-2f29-2e64a0a305cd.png)
む
rebaseは分岐点からごっそり統合先にくっつける。

Gitの勉強、地味...
WindowsアップデートしたらデュアルブートのUbuntuが起動しなくなった

UEFI環境下にWindowsとUbuntuのデュアルブートを構築した端末にて、
ある日Windows側をアップデートしたところ、以下のようなエラーが出てUbuntuが起動しなくなりました。

```
Failed to open \EFI\ubuntu\grubx64.efi - Not Found
Failed to load image \EFI\ubuntu\grubx64.efi: Not Found
start_image() returned Not Found, falling back to default
Failed to open \EFI\ubuntu\grubx64.efi - Not Found
Failed to load image \EFI\ubuntu\grubx64.efi: Not Found
start_image() returned Not Found
```

調べたところ、よく分かりませんが、とにかくWindowsが悪いんだと思います。

# 修復手順

GRUBを再インストールすることで修復していきます。
ただ、元々のUbuntuは起動できない状態なので、代用のUbuntuを用意して作業する必要があります。

なのでまずは、UbuntuのライブUSBを作成し、ライブセッションでUbuntuを起動しましょう。

https://diagnose-fix.com/topic2-003/

起動したら、とりあえず偉くなっておきましょう。

```
$ sudo -s
```

次に元々のUbuntuがインストールされているディスクをマウントしていきます。

`[Ubuntuパーティション]`の部分は「ディスク」というアプリから探しましょう。

```
$ mount /dev/[Ubuntuパーティション] /mnt
$ mount --bind /dev /mnt/dev
$ mount --bind /dev/pts /mnt/dev/pts
$ mount --bind /proc /mnt/proc
$ mount --bind /sys /mnt/sys
$ mount --bind /run /mnt/run
```

全てマウントできたらそこへchrootします。

```
$ chroot /mnt
```

次にEFIパーティションをマウントします。
こちらも`[EFIパーティション]`部分は「ディスク」から調べましょう。

```
$ mount /dev/[EFIパーティション] /boot/efi
```

最初のエラーの通り、`grubx64.efi`が無くなってしまっていることを確認します。

```
$ ls /boot/efi/EFI/ubuntu/grubx64.efi
```

Grubをインストールします。
インターネット接続が必要だと思います。

```
$ grub-install --efi-directory=/boot/efi
$ update-grub
```

`grubx64.efi`があることを確認します。

```
$ ls /boot/efi/EFI/ubuntu/grubx64.efi
```

これで起動するようになったはずです。

# 参考

https://guminote.sakura.ne.jp/archives/316
スプレッドシートとGoogle Apps Scriptで作る簡易出席記録

## はじめに
こんにちは！
この記事では、小規模な習い事教室のためにスプレッドシートとGoogle Apps Script（GAS）で簡易な出席記録表を作ったときの方法を書きます。
より良い方法もあると思いますが、一例として参考になれば幸いです。

## スプレッドシートの構成

* 生徒一覧シート
* メインシート
    * 生徒一覧から一人だけ選んで表示できる（データの入力規則とVLOOKUPを利用）
    * 後述するスクリプトを実行できるボタン（スクリプト割り当てた図形）を配置
* 出席記録シート
* あの人しばらく来ていないなシート（最後に書きます）

## スクリプト

レッスンしたら出席記録シートに追加する関数
```js:
function LessonInput(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const mainst = ss.getSheetByName('メインシート');
  const countst = ss.getSheetByName('出席記録シート');
  const name = mainst.getRange('生徒氏名のセル').getValue();
  const id = mainst.getRange('生徒番号のセル').getValue();
  const dayTime = new Date();
  const data = [[id,name,dayTime]]
  const nextRow = countst.getLastRow() + 1;
  
  countst.getRange(nextRow,1,1,data[0].length).setValues(data);
}

```

## あの人しばらく来ていないなシートとは
この出席記録表を使う習い事教室には、決まった曜日に来るコースのほかに、単発レッスンのプランもありました。
「あの人しばらく来ていないなシート」は、退会の連絡はないけど3ヶ月以上来ていないな…という方のリストをスクリプトで出力するためのシートです。
このシート自体は一行目だけに項目名を書いて、下記スクリプトでリストを出します。

```js:
function NoncountList(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const infost = ss.getSheetByName('生徒一覧シート');
  const countst = ss.getSheetByName('出席記録シート');
  const listst = ss.getSheetByName('あの人しばらく来ていないなシート');
  //関数実行時を基準に3ヶ月前の日付を取る
  const date = new Date();
  const limitdate = date.setMonth(date.getMonth()-3);

  //生徒一覧シートのB列に生徒番号、C列に氏名、P列に退会かどうか記載しているのでそこまで取っています
  let infoarray = infost.getRange(2,2,infost.getLastRow() - 1,16).getValues(); 
  //P列が空白なら未退会
  infoarray = infoarray.filter(array => array[14] == (''));

  //3ヶ月間の出席記録を取得
  let countarray = countst.getRange(2,1,infost.getLastRow() - 1,3).getValues();
  countarray = countarray.filter(array => Number(array[2]) >= limitdate);

  //未退会の配列から出席記録がある人を取り除く
  let resultarray = infoarray.filter((a) => {
    return countarray.findIndex((b) => a[0] === b[0]) === -1;
  });
  //番号、氏名のみにする
    resultarray = resultarray.map(array => [array[0],array[1]]);

  //あの人しばらく来ていないなシートの二行目以降に入力があればクリアする
  const list_last_row = listst.getLastRow();
  if(list_last_row > 1){
    listst.getRange(2,1, list_last_row -1,2).clearContent();
    }
  //シートに出力
  listst.getRange(2,1, resultarray.length,2).setValues(resultarray);

}
```

## おわりに
読んでいただき、ありがとうございました！
疑問点や改善案などありましたら、コメントください。