OmniAICreator/Qiita-1.07M huggingface dataset:
プロダクトと事業部をつなぐ、たこちーと申します

3分で読めそうです。

#はじめに
プラットフォーム事業本部（以下PF）のあおいと申します。
いきなりですが、先日こんな記事を書きました。

>[Slackチャンネルで情報発信したら謎の組織と呼ばれなくなった](https://qiita.com/aoichan/items/f75713051b98ccdc054b)

そして、記事内で
><code>（他事業コンサルチームについてはまたどこかでお話しします。）</code>

とお話しさせていただきましたので、

本記事では私が所属する<code>*PF他事業コンサルグループ*</code>について書いてみようと思います。

#社内からは”たこちー:octopus:”と呼んでもらっています
他事業部コンサルチームは
2021年10月現在で**「他事業コンサルティンググループ」**が正式名称となっています。
過去、グループではなくチームでしたので
頭文字を取って<code>”たこちー”</code>を通称に活動しています。
（名付け親は　@emi-hayashi さん)

少し長いですもんね、「たじぎょうこんさるてぃんぐぐるーぷ」って。。

当初は社内で名乗っても「ふ〜ん」という感じだったのですが
努力の甲斐あってか「ああ、聞いたことあるよ〜」と言ってもらえるようになりました。


#たこちーのお仕事
”たこちー”は先述の通りPF事業本部に所属しているのですが
DMMの組織を俯瞰してみるとDMMのひとつの事業部になりまして
我々以外にもサービス展開している事業部や
インフラ・マーケティングなど横断的な部署もあるんですね。
そして
我々PFが提供している共通機能ごとに、開発・運用しているプロダクトチームがあるのですが
共通機能は幅広く（そして深く）
相談先がわからない問い合わせがあったり
プロダクトチーム側としても開発に集中できなかったりしたんですね…

![PFの他事業コンサルチームの位置 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649937/d2a98ff9-12ed-0221-bb5e-4dbac8d1c092.png)




そこを一挙に引き受け、PF窓口として立たせていただいているのが”たこちー”です。

既存の事業部からの質問や相談に対応するヘルプデスク業務や
新規サービス立ち上げ相談に対し、
ヒアリング・共通機能のコーディネートなどの業務が主な日々の動きです。

問い合わせ元の方をできるだけ迷わせず、
PFプロダクトメンバーが開発に集中できるようにしたい。
そんな思いでたこちー、お仕事やらせてもらっています。

とはいえ
PF事業本部という組織を知らなければ相談いただけないので
認知度を上げる動きとして、新入社員向けの説明会実施も業務の一つです。
>[プラットフォーム認知度を上げるための「オンボーディング」のすすめ](https://qiita.com/emi-hayashi/items/11b379a5248c7f9a5587)

そのほか、前の記事で記載したPF機能の情報発信など広報分野もやっています。
>[Slackチャンネルで情報発信したら謎の組織と呼ばれなくなった](https://qiita.com/aoichan/items/f75713051b98ccdc054b)

（記事の紹介がしつこくてすみません！）


#おわりに

だらだら書いちゃいましたが
上記でご紹介した業務をざっくり箇条書きすると

- PF機能の質問/相談の窓口（サービスの課題解決支援）
- 新規サービスのオンボーディング、PF機能利用の提案
- PF事業本部/PF機能の認知度アップアクション（説明会や情報発信）

こんな感じです。


DMMinsideにて下記記事も展開していますので
気になった方は合わせてみていただけると幸いです！
>[事業とPFをつなぐためのコンサル支援（他事業部コンサルグループ紹介）](https://inside.dmm.com/entry/2019/12/13/tako-introduce)



私たちのチーム、たこちーを簡単に紹介させていただきました。
本日もポエムにて失礼しました…。
PowerAutomateDesktopを用いてexcelの表まとめの自動化までのメモ　その6

それっぽいのが出来たけど
行がズレる……
例）
excelにて

```excel
　　　　　56期A＋B　　　　　
　　　　　　　　　　　　　　　ココに書き込まれてしまう。
```

今は行数決めうちなのだが
出来れば↑の56期hogehogeを探して欲しいな……

その方法を考えるっ
scss | 正規表現 | pxをvwに置き換える

#px→vw変換
スタイルシートで関数を用いる場合、例えば「 `px`を `vw` に置き換えたい」と思った場合
`vw` は気軽に計算できないので、下記のような変換の関数を用いる。

```css
@function vw($size, $viewport:375) {
  $rate: 100 / $viewport;
  @return $rate * $size * 1vw;
}
```
viewport: 375px（iPhone） を基準に変換しています。
これを使ってサイズを指定する場合、こうなります。

```css
border: 1px solid #ff0000;
↓
border: vw(1) solid #ff0000;
```
もしもデザインがAndroid基準で作ってる場合
下記のように記述する。

```css
border: 1px solid #ff0000;
↓
border: vw(1, 360) solid #ff0000;
```

しかし、今まで作ったcssをいちいち消して書いてするのは、とても面倒です。
`px` 消して`)`を書いて、カーソルを移動して`px(`を書いて、とやるのは大変。
そんな事を数字全部にやってたら日が暮れます。

#正規表現で置換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/dad3d8b2-db3c-00b6-411e-e0c10e786c2c.png)
正規表現で4回置換をかけます。
(`[0-9]`…数字`{4}`…文字数)px　これで「1234px」的な感じの文字列が置き換える対象になります。
vw(`$1`)…$1 は、上の置き換える対象の中で()で囲んだ文字を指しています。1234という数字を残せます。

```
([0-9]{4})px
vw($1)
```
width: 1000px;
→width: vw(1000);

```
([0-9]{3})px
vw($1)
```
width: 375px;
→width: vw(375);

```
([0-9]{2})px
vw($1)
```
font-size: 16px;
→font-size: vw(16);

```
([0-9]{1})px
vw($1)
```
border: 1px solid #ff0000;
→border: vw(1) solid #ff0000;

#注意
4桁→3桁→2桁→1桁の順にやらないとおかしくなります。
マイナスの数値には対応していないので、スタイルにマイナスを多用している場合は、
マイナスを先に置き換えてあげたほうが良いです。（例）

```
(-[0-9]{4})px
vw($1)
```
【2021年版】Scala環境構築【Scala3対応】

追記：こっちの[公式ドキュメント](https://docs.scala-lang.org/ja/getting-started/index.html)翻訳したのでこれをみてください
---
[公式の記事](https://docs.scala-lang.org/ja/scala3/getting-started.html)が冗長だったので推奨方法だけ抜粋

```bash
brew install coursier/formulas/coursier && cs setup
cs install scala3-compiler
cs install scala3-repl
```
Unity仕事メモ

■カメラ座標を移動できない
　
　CinemachineのVirtual Cameraが座標を上書きするらしい

　■参考サイト
　https://tsubakit1.hateblo.jp/entry/2018/09/08/223556

■指定コミット番号をチェリーピック

````
git cherry-pick [コミットID]
````

　■参考サイト
　https://www.sejuku.net/blog/71544


■コルーチンをawaitしたい

　■参考サイト
　https://qiita.com/Euglenach/items/6579854924036deee7bc
vue-chartjsをchart.js v3で使う（Nuxt.js）

[vue-chartjs](https://www.npmjs.com/package/vue-chartjs)を使おうと思ったのですが、なんか動かなかったので調べてみました。

# 原因

どうやらChart.jsがVersion3にあがったことによる影響みたいです

https://github.com/apertureless/vue-chartjs/issues/695


# 対策

Chart.jsのv3系への移行方法を参考に対応します

https://www.chartjs.org/docs/3.2.0/getting-started/v3-migration.html

↓のようにしたところ、一応ドーナツチャートは表示されました

```components/chart/doughnut.vue
<template>
  <canvas id="myChartDoughnut" />
</template>
<script lang="ts">
import {
  Chart,
  ChartData,
  ChartOptions,
  DoughnutController,
  ArcElement,
  PointElement,
  LinearScale,
  Title,
} from 'chart.js';
import { Component, Vue, Prop } from 'nuxt-property-decorator';
import { Doughnut, mixins } from 'vue-chartjs';

Chart.register(DoughnutController, ArcElement, PointElement, LinearScale, Title);

@Component({
  extends: Doughnut,
  mixins: [mixins.reactiveProp],
})
export default class ChartDoughnut extends Vue {
  @Prop({ required: true })
  chartData: ChartData;

  @Prop({ default: () => {} })
  options: ChartOptions;

  mounted() {
    const ctx = (document.getElementById('myChartDoughnut') as HTMLCanvasElement).getContext('2d');
    const myChart = new Chart(ctx, {
      type: 'doughnut',
      data: this.chartData,
      options: this.options,
    });
  }
}
</script>
```

### ポイント

- `Chart.register`でコントローラー等を登録すること
- レンダリングは`this.renderChart`から`new Chart`に変更
nvarguscamerasrc

nvarguscamerasrcのOptionを使う事で、Jetson ISP(Image Signal Processor)にアクセスしパラメーターの調整が可能になる。

![isp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/e50db2f3-f0f2-0cb9-f804-a108f5642708.png)


## pipeline例

OptionはDefault値を使用。Glass2Glassで70ms程度の遅延。

```
gst-launch-1.0 \
nvarguscamerasrc \
sensor-id=0 ! \
'video/x-raw(memory:NVMM), width=1280, height=720, framerate=60/1' ! \
nv3dsink
```

exposuretimerange(露出時間幅)を指定し、取り込み。Glass2Glassで70ms程度の遅延。

```
gst-launch-1.0 \
nvarguscamerasrc \
sensor-id=0 \
exposuretimerange="34000 358733000" ! \
'video/x-raw(memory:NVMM), width=1280, height=720, framerate=60/1' ! \
nv3dsink
```

## Option一覧

```
gst-inspect-1.0 nvarguscamerasrc
```

|項目|範囲|
|:--|:--|
|設定可能なサイズ(x,y)|[1,2147483647],[1,2147483647]|
|フォーマット|NV12, P010_10LE|
|フレームレート|[0/1, 2147483647/1]|

|項目|処理|Default値|
|:--|:--|:--|
|name|オブジェクトの名前|nvarguscamerasrc0|
|parent|オブジェクトの親||
|blocksize|バッファー単位での読み込みのバイトサイズを設定|4096|
|num-buffers|送信EOSの前の出力バッファー値を設定|-1|
|typefind|ネゴシエーション前にtypefindを走らせる|false|
|do-timestamp|bufferにタイムスタンプを付与する|true|
|silent|詳細ログの表示<br><br>(falseに設定する詳細ログが有効に)|true|
|timeout|秒単位でのタイムアウト設定|0|
|wbmode|ホワイトバランスで写真の色温度を調整<br><br>(0):off<br>(1):auto<br>(2):incandescent<br>(3):fluorescent<br>(4):warm-fluorescent<br>(5)daylight<br>(6)cloud-daylight<br>(7)twiltight<br>(8)shade<br>(9)manual<br>|0|
|saturation|飽和値の設定|1|
|sensor-id|カメラのidをセット|0|
|total-sensor-modes|利用可能なセンサーモードの数を照会|0|
|exposuretimerange|露出時間幅の調整<br><br>例) exposeuretimerange="34000 358733000"|null|
|ispdigitalgainrange|デジタルゲインの調整<br><br>例) gainrange="1 16"|null|
|tnr-strength|時間的ノイズ除去を調整するためのプロパティ|-1|
|tnr-mode|時間的ノイズ除去の選択<br><br>(0): NoiseReduction_Off<br>(1): NoiseReduction_Fast<br>(2): NoiseReduction_HighQuality|1|
|ee-mode|エッジ強調モードの選択<br><br>(0): EdgeEnhancement_Off<br>(1): EdgeEnhancement_Fast<br>(2): EdgeEnhancement_HighQuality|1|
|ee-strength|エッジ強調モードの調整|-1|
|aeantibanding|自動露出アンチバンディングモードの選択<br><br>(0): AeAntibandingMode_Off<br>(1): AeAntibandingMode_Auto<br>(2): AeAntibandingMode_50HZ<br>(3): AeAntibandingMode_60HZ|1|
|exposurecompensation|露出補正の調整|0|
|aelock|自動露出を設定するかどうか|false|
|awblock|自動ホワイトバランスロックを設定するかどうか|false|
|bufapi-version|新しいBufferAPIを使うかどうか|false|

## CSIカメラの120fpsでの取り込み

120fpsでの取り込みは過去のJetPackではできたが、最新版のJetPackでは非対応になっている。

120fpsでのCSIカメラの取り込みをおこないたい場合は、Kernelを再ビルドする。

https://forums.developer.nvidia.com/t/120-fps-mode-support-removed-for-imx219-sensor/174327
SlackでVonageのVideoを実行

Slackは、1日あたり推定1,000万人以上のアクティブユーザーがいる人気のあるコラボレーションツールです。非常に多くの人々がSlackを使用しているため、Vonage　VideoをSlackに統合しSlack上でカスタマイズ可能な高品質なビデオエクスペリエンスを提供する事は多くのユーザーの期待に応える事でした。

今回は、SlackにVonageのVideo APIを統合させる方法をご紹介します。

尚、以下の作業を進める前に[Vonage Video API＝TokBoxの登録](https://tokbox.com/account/user/signup)と[Slack上でTokBoxを許可](https://www.tokbox.com/developer/slack)する設定を行なって下さい。

![image2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1880931/aeec1bf2-8bcc-9995-02ea-03ce3e0121dc.png)

Vonage Videoアプリ（TokBox）は、デフォルトでライブビデオ会議を提供します。

Vonage Video SDKを使用する事で独自ブランドでフル機能のビデオ会議アプリケーションを簡単に実装可能です。Slack上からは1つのコマンドで、Slack上で統合されたVonage Video APIを呼ぶ事が可能で、それによりユーザーはビデオセッションをシームレスに開始できます。

Slack上でのVonageビデオアプリの構成
---------------------------------------
[開始するには、まずはVonageアカウントにサインアップが必要です。](https://tokbox.com/account/user/signup)これが完了したら、TokBoxを使い、いくつかの簡単なコマンドで会議を作成できるようになります。

次のコマンド`/ tokbox`を使用すると、Slack上でアプリを構成できると同時に、ワークスペースのユーザーがVonageでホストされているライブビデオ会議のユニークなリンクを生成できるようになります。

他にも重要で便利なコマンドがありますのでご紹介します。

```
/tokbox config  
```

Vonage Video＝TokBoxのProjectAPIキーとシークレットを設定します。ワークスペースにすでにアプリが構成されている場合は、新しいクレデンシャルで上書きされます。

```
/tokbox config
```

現在のプロジェクトAPIキーを表示します。応答は、コマンドを入力したユーザーにのみ表示されます。

```
/tokbox
```

新しい会議を作成します。会議のリンクは、ユーザーがコマンドを入力したチャネルに投稿されます。

```
/tokbox remove
```

現在のビデオプロジェクトAPIキーとシークレットを削除します。

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1880931/5ccc121e-8f1c-7052-c4a8-48251073ea32.png)


これで、Slackのワークスペースを離れることなく、カスタマイズされた高品質のVonageビデオ会議とコラボレーションする準備が整いました！

標準で実装されているVideo call機能に問題が発生した時のバックアップとしてご利用される方も多くいます。是非使ってみて下さい。

参照記事
---------------------------------------
https://learn.vonage.com/blog/2019/02/01/how-launch-video-meetings-slack-with-tokbox-app/

連絡先
---------------------------------------
Vonage Japan合同会社
Mail: sales-japan@vonage.com
URL: https://www.vonagebusiness.jp/communications-apis/
VSCodeのArduino拡張機能でボード選択が空になる

#VSCodeのArduino拡張機能でボード選択が空になる現象が発生した

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/d334dde4-321e-7967-5ae1-ad88638502f4.png)

#どうやら v0.4.6 のバグらしい...
一つ前にロールバックするといいらしい。
「拡張機能」－「アンイストール」－「別のバージョンをインストール...」を選択するとバージョンリストが出てくるので「0.4.5」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/b0d82825-5e34-bacb-99c1-9f7dea541f8c.png)

#インストールすると「v0.4.5」になってるはず
（※v0.4.5を以前にインストールしていると「再読み込み」ボタンが表示されるはず）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/30476ae3-f503-bf8d-23b7-7f77e900d25c.png)


#出た
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203949/85138a6c-f712-15ef-322f-481ad38780c8.png)

しばらくはこれで回避。


参照元：
https://github.com/microsoft/vscode-arduino/issues/1360

https://stackoverflow.com/questions/69508270/vscode-arduino-board-configuration-offers-no-boards-to-select
vue3 のref() reactive()について

#はじめに
vue3の学んでいく中で、新しく実装されたref　reactiveの違いが曖昧だったので調べてみました。
参考にしてもらえると幸いです。

#vue3　ref() reactive()とは
refとreactiveはどちらも値をリアクティブな状態にするときに使うメソッドです。
使い方としては、vueから`import`で利用することが出来ます。

```JavaScript:import方法
import { reactive, ref } from 'vue'
```

###それぞれの役割
######refメソッド
refは独立したプリミティブ値をリアクティブにする際に利用します。

```JavaScript:refの例
import { ref } from 'vue'

const count = ref(0)
console.log(count.value) // 0

count.value++
console.log(count.value) // 1
```

refを実行すると、返り値としてミュータブルなオブジェクトを返すようになります。
そのため、`.value`で呼び出す必要がある点注意が必要です。

また、`ref`がレンダーコンテキストかつ、テンプレート内でアクセスする必要がある場合、自動的に浅くアンラップされる仕様になっています。
入れ子になった`ref`がテンプレート内で`.value`が必要になります。

```vuejs:refのアンラップ
<template>
  <div>
    <span>{{ count }}</span>
    <button @click="count ++">Increment count</button>
    <button @click="nested.count.value ++">Nested Increment count</button>
  </div>
</template>

<script>
  import { ref } from 'vue'
  export default {
    setup() {
      const count = ref(0)
      return {
        count,

        nested: {
          count
        }
      }
    }
  }
</script>
```

######reactiveメソッド
refの単数に対してreactiveは単数ではなくオブジェクトをリアクティブにするメソッドです。

```javascript:reactiveの例
import { reactive } from 'vue'

// リアクティブな状態
const state = reactive({
  count: 0
})
```

vue2における`Vue.observable()`APIに相当するメソッドになります。
vue3にアップデートされたことにより改名されました。

`reactive`メソッドを実行した場合、オブジェクトの中身はすべてリアクティブになります。
デフォルトに`deep`モードが影響しているためです。
そのため、入れ子になっていた場合でもリアクティブになります。

実はdata()でオブジェクトを返す際にもこの`reactive`メソッドが内部で実行されています。

#最後に
良いVueライフを〜

###参考にさせてもらったサイト
https://v3.ja.vuejs.org/guide/reactivity-fundamentals.html#%E3%83%AA%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%95%E3%82%99%E3%81%AA%E7%8A%B6%E6%85%8B%E3%81%AE%E5%AE%A3%E8%A8%80
最近何故か多い質問にCMTDがあります

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



+ [【Salesforce】拡張関連リスト「CMTD Enhanced Related List 」で、取引先に受注商談の関連リストを表示する](https://lible.co/%E3%80%90salesforce%E3%80%91%E6%8B%A1%E5%BC%B5%E9%96%A2%E9%80%A3%E3%83%AA%E3%82%B9%E3%83%88%E3%80%8Ccmtd-enhanced-related-list-%E3%80%8D%E3%81%A7%E3%80%81%E5%8F%96%E5%BC%95%E5%85%88%E3%81%AB%E5%8F%97/)


+ [Required fields are missing: [ModelId] ?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BsoV2SAJ)

フィールドのセキュリティの問題だったようです。何がうまくいかなかったかは、よく分からんけど。
+ [CMTD Enhanced Related list field missing](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BtNunSAF)

解決策を読んでも分からん。そもそもCMTDを理解できん。
[誰かがCMTDツールとの連絡に関するキャンペーン関連リストの設定を手伝ってもらえますか？](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000ChsXbSAJ)

+ [表示するレコードがない場合、CMTD 関連リストを非表示にすることはできますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000DcEIu)


# 未解決

+ [順序なし/順序付きリストHTMLの表示方法（エスケープなしHTMLが有効）](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Bqt7G)
【ポエム】「プロセス主義」の真髄

##前書き
　**『そうだな…わたしは「結果」だけを求めてはいない。
　　「結果」だけを求めていると、人は近道をしたがるものだ…
　　近道した時真実を見失うかもしれない。やる気も次第に失せていく。
　　大切なのは『真実に向かおうとする意志』だと思っている。
　　向かおうとする意志さえあれば、たとえ今回は犯人が逃げたとしても、
　　いつかはたどり着くだろう？
　　向かっているわけだからな…違うかい？』**
　　　　　　　（出典：ジョジョの奇妙な冒険　荒木飛呂彦　集英社）

http://www.jojo-builder.com/blog/archives/983

私の好きなセリフだ。荒木先生は『ジョジョ』を通して、人生に必要なことを教えてくれる。

ー『結果』は大事だ。だが、しかし。『結果』が全てではない。そのプロセス（過程）が大事なのだ。ー

ビジネスの世界でも使われる「プロセス主義」。
いまでは使い古された感のあるコトバではあるが、今日読んだ致知出版社[『1日1話、読めば心が熱くなる365人の仕事の教科書』][1]の一節で、
とあるフランス人経営者に、その真髄について「気づき」を貰えたという話である。

[1]:https://www.amazon.co.jp/1%E6%97%A51%E8%A9%B1%E3%80%81%E8%AA%AD%E3%82%81%E3%81%B0%E5%BF%83%E3%81%8C%E7%86%B1%E3%81%8F%E3%81%AA%E3%82%8B365%E4%BA%BA%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E8%97%A4%E5%B0%BE%E7%A7%80%E6%98%AD/dp/4800912474

##本題　【6月22日】 正射必中－経営に生かす弓道の極意<br> ジェローム・シュシャン 　ゴディバジャパン社長

ジェローム・シュシャン。経営者。2010年よりゴディバジャパンの社長を務める。
売上を7年間で3倍に成長させた。学生時代に日本で出逢った弓道に魅せられ五段の腕前を持つ。
弓道の精神を経営に生かしているとか。
1961年生まれ。御年、今年で60歳。

シュシャンが語るのは「経営に活かす弓道の極意」。それは『結果を狙うのではなく、プロセスを求める』ということ。
>『弓道には、「正射必中」という言葉があります。正しく射られた矢は必ず的に当たるという意味です。（中略）
　だから、弓道では的に当たる結果よりも、矢を放ち終わるまでのプロセスを大切にしています。
　プロセスを正しく行えば、結果は正しくついてくると。
　ビジネスも同じで、売り上げ目標やノルマがあるじゃないですか。それだけを考えると、気を取られて上手くいかない。』

シュシャンがゴディバジャパンの社長に就任する前の三年間、既存店の売り上げや来客数は下がっていたという。

>『そういう中で、今年は十五％増を目指そうと言ったところで、誰もついてこないと思うんですよ。
　だから、目標はプレッシャーにならないように、五％増の予算を立てる。けれど、新商品は何にするか、どこに出店するか、
　どんな社員研修をやるか、といった毎日毎日やることは一生懸命ベストを尽くす。
　これはいま日本の会社で一番足りないところだと思います。「これやれ、あれやれ」と上から命令されてもやる気って出ないでしょう。
　私が社長に就任する前の三年間は、まさにそういう状態に陥りかけていました。予算を達成できなくて、社員のモチベーションが下がる。
　達成できないと、上の人は「もっとやれ」と命令する。これはよくないですよね。
　ですから、「明るく、楽しく」と「一生懸命」、両方大事です。』

結果、ゴディバジャパンの売り上げは七年間で３倍になったという。

>『私はビジネスの秘訣とは「当てる」ではなくて「当たる」ところにあると考えているんです。
　ビジネスにおける「的」はお客様のこと。お客様という的に「当てる」ことを狙わずに、「当たる」というヒット現象を起こすんです。
　そのためには、お客様の気持ちと会社の行動が一体にならなくてはなりません。社員一人ひとりが我を捨て、「純粋な心」でお客様と向き合う。
　お客様の気持ちを素直に聞き、よいものをつくるために無心で仕事に向き合う。そうしてお客様と心が一体になった時に、本当のヒットが生まれるんです。』

なるほど。『お客様の気持ちと会社の行動が一体にならなくてはなりません』か。
言うは易しいが非常に難しそうだ。
会社が、役員も上司も社員も「一致団結」したうえで、さらにお客様とも「一致団結」 するんだからな。
秘訣も書いてあるな。
『社員一人ひとりが我を捨て、「純粋な心」でお客様と向き合う。お客様の気持ちを素直に聞き、よいものをつくるために無心で仕事に向き合う。』か。

シュシャンは締めくくる。

>『弓道の場合、無意識で矢を放つのが理想と言われています。雑念が入ると、的には当たりません。無心になるためには並々ならぬ努力が必要です。』

日本の武士の精神、弓道の心得を持った、このフランス人の経営者から、日本人が教わることは多いのかもしれないな。

##結論 「プロセス主義」の真髄とは

前提として、それは、**結果を出すための手段。**
弓道で例えると、**『正射必中』。プロセスを正しく行えば、結果は正しくついてくる。**
だから、仕事でも私生活でも、**『純粋な心』で『毎日毎日やることは一生懸命ベストを尽くす。』**

改めて、荒木先生のコトバの意味も理解できた気がする。
**大切なのは『真実に向かおうとする意志』**
なのだ。

（参考）
求道者たち　正射必中　ー上智大学 社会人プログラム ～上智大学
　https://www.sophia-professionalstudies.jp/kyudosha0601/
3D球面調和関数を、Python3/matplotlibの３Dスキャタ表示してみる

調和関数が、平均値の性質を満たしているか、Python3/matplotlib 3Dスキャタ表示をして試してみる。
平均値の性質を簡単に説明すると、r=1球面上で調和関数の値を積分すると0になる。という事である。
これだと、f(x,y,z)=2　のような調和関数には、当てはまらないので、f(0,0,0)=0の調和関数に限定して考える。

曲座標系の関数はわかりにくので、デカルト座標での関数を考える。

この論文に、デカルト座標の調和関数がリストされている。
http://lucille.sourceforge.net/blog/images/shpoly.pdf

![Screen Shot 2021-10-14 at 3.45.55 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204041/ba1596dd-bc5e-2995-8443-e3e474939de6.png)


$\sqrt{\frac{3}{4\pi}}$ のような係数は、今回は無視して１とする。
赤の＊は、重複しているので省略します。
$y_{0,0}$は、白一色になるので、省略


$y_{3,-2}=xyz$

![rotation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204041/985302e1-19f5-e7ec-36d2-152f0da4072e.gif)

GIFアニメーションを生成するコードは、こちら

```harmony_animation.py
import math
from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import matplotlib.animation as animation

def y3_2(x,y,z):
  return x*y*z

fig = plt.figure()
ax = plt.axes(projection='3d')

s = 0.0
c = 0
N = 50
zdata = np.linspace(0,0,2*N*N)
xdata = np.linspace(0,0,2*N*N)
ydata = np.linspace(0,0,2*N*N)
udata = np.linspace(0,0,2*N*N)

for j in range(0,N):
  ps = math.pi*(j+0.5)/N
  w = int(N*math.sin(ps))
  for i in range(-1*w,w):
    th = math.pi*(i+0.5)/w
    z = math.cos(ps)
    x = math.sin(ps)*math.cos(th)
    y = math.sin(ps)*math.sin(th)
    xdata[c] = x
    ydata[c] = y
    zdata[c] = z
    u = y3_2(x,y,z) #replace here!! y53,y63,y65
    udata[c] = u
    c = c+1
    s = s + u

ax.set_aspect('equal')
ax.scatter3D(xdata, ydata, zdata, c=udata, cmap=cm.coolwarm);
#plt.show()
def rotate(angle):
    ax.view_init(azim=angle)

print("Making animation")
rot_animation = animation.FuncAnimation(fig, rotate, frames=np.arange(0, 362, 2), interval=100)
rot_animation.save('rotation.gif', dpi=80, writer='imagemagick')
```
Marshalの本当の意味知ってる？

# 背景
Go言語を触っていると、よく構造体をJSONに変換するために以下のように Marshal という関数を使いますよね。何気なく使っていていましたが、Marshal の意味とは何か知りたくなったので調べてみました。


```golang:json.Marshal使用例
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	p := Person{
		Name: "hoge",
		Age: 30,
	}
	s, err := json.Marshal(p)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(s))
}
```

# Marshaling とは

まずはWikipediaからの情報です。

> In computer science, marshalling or marshaling (US spelling) is the process of transforming the memory representation of an object into a data format suitable for storage or transmission.

Google翻訳をかけると、Marshalingとは、
**オブジェクトのメモリ表現をストレージまたは送信に適したデータ形式に変換するプロセスです。**

上記のプログラム例で言うと、
「オブジェクトのメモリ表現」が Person構造体であるp
「送信に適したデータ形式」が JSON形式
ということになります。

# 結論
Marshal とは、JSON形式に変換することではなく、あくまでも「オブジェクトのメモリ表現を**送信に適したデータ形式に変換する**」ということです。


## 参考
https://en.wikipedia.org/wiki/Marshalling_(computer_science)
エンジニア採用で大事なのはスキルか？マインドか？

## はじめに
中途採用の担当をしているTaaagaです。
技術的な話はありませんので、ご興味があれば暇つぶし的に見て頂ければと思います。
人材会社のキャリアコンサルタントとしてエンジニアの紹介をしていたときと、企業の採用担当としてエンジニア採用に従事している今で感じたことを書きます。私見です。

### いきなりまとめ
エンジニア採用において、スキル・技術はもちろん大事。
だけど、今持っているスキルよりも学び成長していく意欲や、会社の掲げるミッション・ビジョン・バリューに共感しカルチャーフィットしているか、何より同じ会社で働く仲間として信頼できる人物か、がとても重要なことだと思います。
スキル以上に考え方などマインド面の方が大切なんじゃないかと思います。

###### ・では、選考でなにをみるのか？

### 書類選考でみるもの
応募書類（またはスカウトを送るとき）でみているものの大半は、まず経験・スキルです。
・どんな案件に従事してきたか
・どんな言語を使えるか
・どんなポジションにいたか
・どこまでの業務を担当してきたか
など
当たり前ですが、「この人は何ができるのか？」をみます。
志望動機や自己PRも読みますが、このへんは会話で確認したい。

### 面接でみるもの
書類選考で一定の能力があると判断されたので、面接では仕事への考え方や人生観、人柄などマインド的な部分をみます。
・どんな働き方をしたいのか
・会社選びの基準はなにか
・働く上でモチベーションを高めるものはなにか、下げるものはなにか
・入社後、自身のキャリアとして何を実現したいか
・過去の失敗経験とそのときどう対処したか
ほかにも退職理由や志望動機からその方の想いを探ることもあります。

面接は平等な立場でお互いに見極める場だと私は思っているので、できるだけ本音で話し合える空気にしたいなと思っています。

### もっかいまとめ
一定のスキル基準はあるものの、エンジニア採用で大事なのはスキルよりマインドマッチ。
これは、自分が採用担当として携わってみて、より感じたことです。
キャリアコンサルタントとしてエンジニアの紹介を行っているときは、基本的にはスキル重視。
当然っちゃ当然ですが、立ち位置によってものの見方は変わるんだなぁと実感しました。
まだまだ勉強不足のため、採用する側、採用される側ともにHAPPYになれるような採用活動を目指していきたいと思います。
Ubuntu 21.04 から 21.10 へのアップグレードの仕方

# 1. まず現在の Ubuntu 21.04 を最新状態にします。
```
$ sudo apt update 
$ sudo apt full-upgrade
```

# 2. 次に不要物を全消しします
```
$ sudo apt autoremove
```

# 3. 更新の設定をします。
`/etc/update-manager/release-upgrades` を開いて、`Prompt`を`normal`に設定します。

```
# Default behavior for the release upgrader.

[DEFAULT]
# Default prompting behavior, valid options:
#
#  never  - Never check for a new release.
#  normal - Check to see if a new release is available.  If more than one new
#           release is found, the release upgrader will attempt to upgrade to
#           the release that immediately succeeds the currently-running
#           release.
#  lts    - Check to see if a new LTS release is available.  The upgrader
#           will attempt to upgrade to the first LTS release available after
#           the currently-running one.  Note that this option should not be
#           used if the currently-running release is not itself an LTS
#           release, since in that case the upgrader won't be able to
#           determine if a newer release is available.
Prompt=normal
```

# 4. 最後に 21.10 へのアップグレードを実行します。
```
$ sudo do-release-upgrade
```
いつも通り数時間、時間がかかりますので、余裕をもって作業してください。

お疲れさまでした。
Mac上に保存されているパスワードを確認する

## 概要

先日、大事なVPNのパスワードを完全に失念してしまいました。

VPNのパスワードはMacのKeychainに保存されており、

Keychainに保存されているパスワードはKeychainアプリから参照可能だそうです。

また忘れそうなので、その手順を残しておこうと思います。

## 調べ方

1. MacでKeychainを開く。

検索で探すと早いかも。

![スクリーンショット 2021-10-15 8.23.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627146/0d03fced-987d-9c77-c91e-5fea75b73608.png)

2. ここから探したいパスワードを探してクリックします。

VPNの場合はPPPパスワードという種類で保存されています。

3. 左下のパスワードを表示をクリックし、Mac本体のパスワード(起動時のパスワード)を入力。

![スクリーンショット 2021-10-15 8.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627146/def66977-a97f-edd6-844d-3f4706216b34.png)

これで無事に確認できるようになりました！

よかった…
ローカルサーバーを簡単に作れるNode.jsのライブラリ「JSON Serve」



## ローカルサーバーのセッティング
Node.jsのライブラリ`JSON Server`を使います。

```
yarn add json-server --dev
```

`package.json`と同じ階層に`db.json`を作成します。

```json:db.json
{
  "todos":[
    {
      "id": 1,
      "content": "ローカルで使えるサーバーを用意する",
      "done": true
    },
    {
      "id": 2,
      "content": "サーバーで利用するデータを作成する",
      "done": false
    },
    {
      "id": 3,
      "content": "用意したデータの表示を確認する",
      "done": false
    }
  ]
}
```

データができたら`yarn start`で起動させます。
次にサーバーを起動させます。

```
npx json-server --watch db.json --port 3100
```

`--watch`をつけるとdb.jsonの更新を監視してくれます。
`--port 3100`で任意のポート番号を指定できます。

[http://localhost:3100/todos](http://localhost:3100/todos)に接続することで`db.json`に作成したJSONデータがブラウザに表示されると思います。

## サーバーと通信できるようにする
HTTP通信を行うためのNode.jsのライブラリaxiosをインストールします。
GETやPOSTのHTTPリクエストを使ってデータの取得や更新ができます。

```
yarn add axios
```

インストールが終わったあと下記のように記述することで利用できます。
定義した`todoDataUrl`を利用してデータの取得や更新追加を行います。

```js:App.js
import axios from 'axios';

const todoDataUrl = 'http://localhost:3100/todos';
```
ターミナルコマンド一覧（よく使うもの）

初学者のための用語解説：
・ディレクトリ＝Windowsでいうとフォルダ。いろいろなファイルが中に入っている。クリアファイルみたいなやつを想像するといい。
・ファイル＝Exelファイルやtextファイルなど、中身が書いてあるもの。クリアファイルに入ってる書類。
・パス＝ディレクトリのある場所。ドキュメントの中の、電子書籍フォルダの中の、鬼滅の刃フォルダの中に、鬼滅の刃2巻ファイルが入ってるみたいな感じ。
・コマンド＝パソコンへの命令。

##ディレクトリの作成・削除

###ディレクトリを作成
```
$ mkdir ディレクトリ名
```

###ディレクトリの移動
```
$ cd ディレクトリ名
```

cdで移動してみたら今のパスを確認してみましょう。

現在置のパスを表示するコマンド。

```
$ pwd
```

###ディレクトリの削除

```
$ rm -r ファイル名
```

###ディレクトリのコピー

```
cp -r コピーするファイル名 新しいファイル名
```

###現在のディレクトリのファイルを表示

ファイルやディレクトリを作成、削除したらlsコマンドで確認してみましょう。

```
$ ls
```
このコマンドを使って何も表示されないときは、そこになんのフォルダもファイルも入っていないということ。

##ファイルの操作
###ファイルの中身を見る

```
$ cat test.txt
```
test.txtは例。

###ファイルをコピーする

```
$ cp コピー元のファイル名 コピー先ファイル名
```
ファイル名はちゃんと拡張子（ドットの後ろ）まで入れましょう。

###空のファイルを作成
```
$ touch ファイル名
```
そういえばwindowsのターミナル（power shell）ではファイルの作成はtouchではなく、nulというコマンドを使うと聞いたことがある（詳しくは調べてください）。

###ファイルへのテキスト記載
```
$ echo "記載内容" > ファイル名
```
ファイルがまだがない場合はエラーが返される。また、「>」でファイルへの記載を行うと前に記載された内容はすべて消されて新しく記載された内容のみとなってしまう。

```
$ echo "記載内容" >> ファイル名
```

「echo "記載内容" > ファイル名」でまっさらなところに記載するのに対して、>>はフォルダに既に記載されている内容に追記する。これだけを使ってファイルを記述することもできる。

###ファイルの削除
```
$ rm ファイル名
```
ディレクトリを削除するときは「-r」オプションをつける（上述）。


###ファイル名の変更
```
mv 変更するファイル名 変更したいファイル名
```

###ファイルのコピー
```
cp コピーするファイル名 新しいファイル名
```
もしディレクトリをコピーする場合は
「-r」オプションをつける。


###ファイルの移動
```
mv 移動したいファイル名 移動後のディレクトリ
```

##この記事について
自分用にメモとしてまとめた。書くにあたって以下の記事からかなり引用しました。問題があったらこの記事を削除します。
[Qiita"ターミナルのよく使うコマンド"](https://qiita.com/ryo2132/items/b7e312b0eb50fc449841)

あと初心者はこのサイト↓を見るといいかも。
[参考資料：ターミナルの使い方](https://infolit.uec.tmu.ac.jp/lit/contents/basics/appendix/terminal.html)
[python] [cx_Oracle.DatabaseError:  DPI-1047: Cannot locate a 64-bit Oracle Client library] が起きた時の対処法３選

- #目次
  - [状況](https://qiita.com/mahiro72/items/1d5384a6e503d3d585dd#%E7%8A%B6%E6%B3%81)
  - [環境](https://qiita.com/mahiro72/items/1d5384a6e503d3d585dd#%E7%92%B0%E5%A2%83)
  - [エラー内容](https://qiita.com/mahiro72/items/1d5384a6e503d3d585dd#%E3%82%A8%E3%83%A9%E3%83%BC%E5%86%85%E5%AE%B9)
  - [エラー解決法](https://qiita.com/mahiro72/items/1d5384a6e503d3d585dd#%E3%82%A8%E3%83%A9%E3%83%BC%E8%A7%A3%E6%B1%BA%E6%B3%95)



- ###状況
  pythonとcx_Oracleを使ってデータベースに接続したい

- ###環境
  - windows10
  - Python 3.8.5
  - cx-Oracle 8.2.1
 
- ###エラー内容

```
cx_Oracle.DatabaseError: 
DPI-1047: Cannot locate a 64-bit Oracle Client library: 
"The specified module could not be found".
 See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help
```
 

- ##エラー解決法
  1. [Oracle Instant Clientをダウンロードしてない](https://qiita.com/mahiro72/items/1d5384a6e503d3d585dd#oracle-instant-client%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E3%81%AA%E3%81%84)
  1. [Oracle Instant Clientのpathを正しく通せてない](https://qiita.com/mahiro72/items/1d5384a6e503d3d585dd#oracle-instant-client%E3%81%AEpath%E3%82%92%E6%AD%A3%E3%81%97%E3%81%8F%E9%80%9A%E3%81%9B%E3%81%A6%E3%81%AA%E3%81%84)
  1. [それでも解決できないとき...](https://qiita.com/mahiro72/items/1d5384a6e503d3d585dd#%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82%E8%A7%A3%E6%B1%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D)


- ###Oracle Instant Clientをダウンロードしてない
cx_Oracleを使う場合にダウンロードが必要です。
windowsは[こちら](https://www.oracle.com/jp/database/technologies/instant-client/winx64-64-downloads.html)から(64bit)

- ###Oracle Instant Clientのpathを正しく通せてない
pathを設定する必要がある  
  1. **環境変数の編集から設定する方法** (2のほうが簡単かも)  
左下のwindowsキーを押して検索から「環境変数」と入力
環境変数を編集を選び、ユーザーの環境変数のPathから
新規でinstantclient_19_121までのpathを設定  
(例: C:\Users\ユーザー名\hoge\instantclient_19_12 など)    
  2. **コードでpathをかく方法**  
cx_Oracle.init_oracle_client()を使ってpathを設定できる

```
import cx_Oracle

lib_dir = "自分のPC内のinstantclientまでのpath"
cx_Oracle.init_oracle_client(lib_dir=lib_dir)

# フォルダーまでのpath
# pathの最初にrを付けること つけないとSyntaxErrorがでる
# (例 : r"C:\Users\ユーザー名\hoge\instantclient_19_12" )
```

- ###それでも解決できないとき...  
自分はこの場合でしたが、デスクトップにあったinstantclient_19_12のフォルダーを
別の場所(Downloadsなど)に変えてからpathを設定すると動きました
原因はわからないです...



-
unityでwebGLビルドした際のエラーと解決策

# はじめに
Unityで作ったプロジェクトをwebGLビルドした際に直面したエラーまとめ
（追記していきます）

#エラー
### 文字が消える
テキストのフォントがデフォルトのArialのままになっている。
Arielフォントは日本語に対応していないので変えるのが吉。

### Pro Builderで製作したオブジェクトが表示されない
Pro Builderのバージョンをアップデートしたら直った。
https://forum.unity.com/threads/probuilder-on-webgl-nullreferenceexception-for-simple-generateplane.807081/
PDFから画像抽出して一括保存するプログラム書いた！

# 概要

某レイヤーさんの写真集がPDF形式の画像ファイルで販売されているけど、そのままだと不便なので画像だけぶっこ抜いて保存するようにしました

# 使用する言語、外部ライブラリなど

- python
    - [pymupdf](https://pymupdf.readthedocs.io/en/latest/tutorial.html)

# コード

```python
# -*- coding: utf-8 -*-
from pathlib import Path
import fitz

# 読み込むPDFファイル
PDF_SOURCE: str = "PATH\\TO\\FILE.pdf"
# 画像の保存先ディレクトリ
DESTINATION_SAVE_TO: str = "SAVE\\TO\\DIRNAME"

pdf = fitz.open(PDF_SOURCE)
# 保存先ディレクトリが存在しない場合、作成
if not Path(DESTINATION_SAVE_TO).exists():
    Path(DESTINATION_SAVE_TO).mkdir()

# ページごとに読み込んで画像を保存する
for i in pdf:
    IMAGE = Path(Path(DESTINATION_SAVE_TO)).joinpath(f"{i.number}.png")
    pix = i.get_pixmap()
    pix.save(IMAGE)
```

# 参考にしたページ

- [pymupdf](https://pymupdf.readthedocs.io/en/latest/tutorial.html)
GitHubへのPush時にAWS CodeCommitに任意のブランチを同期する

以前、GitHubへのPush時にAWS CodeCommitにリポジトリを同期する方法をまとめました。

https://qiita.com/itouuuuuuuuu/items/bb58cf4531e62dc6c6e5

しかし、この方法はリポジトリをまるまるミラーリングするため、特定のブランチのみ同期したいという場合は使えません。
今回、GitHubの任意のブランチをCodeCommitの任意のブランチにGitHub Actionsから同期する方法を検討したためメモしておきます。

# GitHubのSecretsに必要な情報を登録
GitHubの管理画面で、「Settings」 -> 「Secrets」から、必要な情報を登録します。
![github secrets](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279032/fb3df90e-0c05-6567-cf3c-ee99aa537e5b.jpeg)



登録する情報は下記となります。

* `CODECOMMIT_REPO_URL`
CodeCommitのリポジトリのURL

* `CODECOMMIT_SSH_CONFIG`
SSH接続するためのコンフィグ情報

```sh
Host git-codecommit.*.amazonaws.com
  User {CodeCommitのSSHキーID}
  IdentityFile ~/.ssh/id_rsa
  StrictHostKeyChecking no
```

* `CODECOMMIT_SSH_PRIVATE_KEY`
SSHシークレットキー

# GitHub Actionsを設定
下記のコードを、GitHub Actionsのワークフローとして登録します。

```yaml
name: "Deploy: main"

on: [ workflow_dispatch ]

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 5

    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Extract branch name
        shell: bash
        run: echo "::set-output name=branch::${GITHUB_REF#refs/heads/}"
        id: extract_branch

      - name: Push to AWS CodeCommit
        env:
          CODECOMMIT_HOST: git-codecommit.ap-northeast-1.amazonaws.com # ap-northeast-1の部分は自身のリージョンを指定
          CODECOMMIT_REPO_URL: ${{ secrets.CODECOMMIT_REPO_URL }}
          CODECOMMIT_SSH_CONFIG: ${{ secrets.CODECOMMIT_SSH_CONFIG }}
          CODECOMMIT_SSH_PRIVATE_KEY: ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }}
          BRANCH_NAME: ${{ steps.extract_branch.outputs.branch }}
        shell: bash
        run: |
          mkdir ~/.ssh
          echo "$CODECOMMIT_SSH_PRIVATE_KEY" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
          echo "$CODECOMMIT_SSH_CONFIG" > ~/.ssh/config && chmod 600 ~/.ssh/config
          ssh-keyscan "$CODECOMMIT_HOST" >> ~/.ssh/known_hosts && chmod 600 ~/.ssh/known_hosts
          git remote add codecommit "$CODECOMMIT_REPO_URL"
          git push codecommit ${{ env.BRANCH_NAME }}:main -f # mainの部分はCodeCommitの同期したいブランチを指定
```

# GitHub Actionsから同期を実行
GitHub Actionsから、CodeCommitに同期したいブランチを選択して「Run workflow」を実行することで、任意のブランチをCodeCommitのmainブランチにpushできます。
ワークフローの、CodeCommitの同期したいブランチを変更することで、任意のブランチと同期可能になります。
![スクリーンショット 2021-10-15 3.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279032/40bf0fb0-20d0-3781-09cc-98c4c4378806.png)
try-with-resources文の書き方

#動機
try-with-resourcesがイマイチ使いこなせていない。
Java7で導入され、Java9で一部仕様変更があった。
この際、しっかりと使いこなせるように整理したい。

#参考にした資料
The Java® Language Specification
Java SE 11 Edition

#検索キーワード
java spec

#構文規則

```x:
TryWithResourcesStatement:
try ResourceSpecification Block [Catches] [Finally]

ResourceSpecification:
( ResourceList [;] )

ResourceList:
Resource {; Resource}

Resource:
{VariableModifier} LocalVariableType Identifier = Expression
VariableAccess

VariableAccess:
ExpressionName
FieldAccess
```

```x:
VariableModifier:
Annotation
final

LocalVariableType:
UnannType
var
```
BracketsでWordhintがインストール出来ない問題

#せっかちな人へ
[WordhintのZipファイル](https://github.com/bigeyex/brackets-wordhint)を解凍して以下のフォルダに解凍した物を導入してリロードすれば反映される．
Mac /Users/(ユーザ名)/Library/Application Support/Brackets/extensions/user
Windows C:/Users(ユーザ名)/AppData/Roaming/Brackets/extensions/user

#気付いたキッカケ
~~環境再構築してたらサポート終わってストアもどきからダウンロードできなかったから．~~
(2022年2月18日追記)新開発体制になったらちゃんとダウンロードできたよ！

# 感想
BracketsのやってることただのZip解凍やんけ．
~~今この記事見てる人，さっさと別のエディタに乗り換えましょう．~~
(2022年2月18日) ver2以降なら大丈夫でしょう．maybe.
DockerでAmazonLinux環境を構築し、そこでインストールしたPythonライブラリをLambdaレイヤーにアップ

#前提
・Docker使える状態
・AWSサービス使える状態

#①amazon linuxのイメージを取得

```
docker pull amazonlinux
```

#②Dockerfileを作成

```Dockerfile
FROM amazonlinux:latest
RUN yum install -y python3 zip
RUN mkdir /home/deploy
```

#③docker-compose.ymlを作成

```docker-compose.yml
version: '2'
services:
  app:
    build: .
    volumes:
      - './deploy:/home/deploy'
    command: >
      bash -c "pip3 install -r /home/deploy/requirements.txt -t /home/deploy/python &&
      cd /home/deploy &&
      /usr/bin/zip -r bs4.zip python"
```

#④ディレクトリを作成
今回は、Dockerfileとymlに記載したディレクトリ名と合わせてdeployというディレクトリと、その下にこちらは決め打ちのpythonというディレクトリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/43980179-7563-fb89-8860-ea2d879a94e2.png)
<hr>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/c590d01b-7c49-2517-5261-9191f09947ef.png)

#⑤pip installするライブラリを記述したrequirement.txtを作成しdeployディレクトリ配下に置く。
今回はwebスクレイピングで使うbs4とrequestsを記述します。まずはbs4のみ。

```requirements.text
bs4

```

#⑥ディレクトリ構成の確認

```
$ tree
├── Dockerfile
├── deploy
│   ├── python
│   └── requirements.txt
└── docker-compose.yml
```

#⑦Lambdaレイヤーにアップロードするパッケージを取得
下記をコマンド実行します。

```
docker-compose up --build
```

#⑧もう一つのパッケージを作るために③と⑤を編集し⑦を実行(必要なパッケージが一つだけなら不要)
```docker-compose.yml
version: '2'
services:
  app:
    build: .
    volumes:
      - './deploy:/home/deploy'
    command: >
      bash -c "pip3 install -r /home/deploy/requirements.txt -t /home/deploy/python &&
      cd /home/deploy &&
      /usr/bin/zip -r requests.zip python"
```
<hr>

```requirements.text
requests
```
<hr>

```
docker-compose up --build
```

#⑨レイヤーの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/e7b8953a-1e38-b0c1-1d2e-19dc4a97293e.png)
<hr>
⑧までに作成したパッケージをアップロードします。
※ランタイムは3.7以下にします。3.8以上はamazonlinux2でないといけないので本記事の対象外です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/623abb84-e1cd-9734-5d04-2908fe0d4044.png)

#⑩レイヤーの追加
先ほどの⑨で作ったレイヤーを動かしたいLambda関数に追加します。
種類はカスタムレイヤーで選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/81136774-f6c9-658e-1581-e94205750139.png)

#⑪Lambdaを動かしてみる
まずはレイヤーを作らなかった時の失敗例をご覧ください。bs4やrequestsは元々Lambdaに用意されていないのでエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/38f032c1-47b9-21ef-f075-f2279420a22a.png)

<hr>
続きましてレイヤーを追加した成功例です。今回はライブラリがimportできているので、目的の口コミスクレイピングが出来ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/d3df3a58-c4b7-b6fa-6087-9ca67737a343.png)
Error: error converting ".git" to absolute: EvalSymlinks: too many links (Windows 10)

# 要約

Windows上でgit lfsを利用する場合、junction (mount point)は使えず、ドライブレターを割り当てたパス直接でないとならない。
BoxのようなCloud同期する場所もダメらしい。

# 不具合詳細

gitでlfsを使うリポジトリ(github, gitlabとリンク)をCドライブに置いていたが、容量が（別の理由で）逼迫してきたので、余っていたパーティションをCドライブの下のディレクトリにマウントする形（WindowsではJUNCTION というらしい）でつなぎ、その中にgit管理しているディレクトリを移動した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294073/45730864-ba3b-b770-ddac-9a6ab501a833.png)
ドライブ文字を与えなかったのは、Linuxのmountみたいなものだと考えて試してみたかったから。問題が起きるとは思っていなかった。

するとpullやbranchの切替を行う度にタイトルに上げたエラーが発生。加えてリポジトリのトップディレクトリにlfs, hooksといった名称のディレクトリが湧いて出るようになった。
エラーのせいでremoteにプッシュも出来ない(lfsエラーで止まる)。

湧いたlfs, hooksは消しても問題ないらしいという情報をネットで得て一旦消すも、branch切り替える度に再度湧き出る。
勿論エラーも解消されない。

さらに検索した結果以下のIssueに到達。

https://github.com/git-lfs/git-lfs/issues/4050

Goのバグらしいが治す予定は無いとgolangチームから言われたそう。
git v2.31でなんとかfix出来るかもとなってますが、

https://github.com/git-lfs/git-lfs/issues/3898

の最後にも報告がある(2021-09-26)ように、治せてないと思われる。

# 対策

マウントする設定を消して単純にドライブレターを与えたら普通に使えるようになりました。

lfsファイルをコミット後に湧いて出たlfs, hooksといったディレクトリを消したりしたリポジトリは、lfsの実体ファイルが見つからない等の別のエラーに見舞われたので、remoteからクローンしなおしました。
多分、lfsファイルのコミットをして無ければ問題なかったのじゃないかな。

未確認ですが、lfsオブジェクトが無ければjunctionでも問題ないのかも知れない。

# システム情報

```
Windows 10 Enterprise (build 19041.1237)
git version 2.32.0.windows.2
git-lfs/2.13.3 (GitHub; windows amd64; go 1.16.2; git a5e65851)
```

# 補足情報

https://github.com/git-lfs/git-lfs/issues/4627

にBoxと同期するディレクトリで同じエラーに見舞われている報告があり、治せないと回答されて強制クローズされているので、そういったCloudストレージと同期するディレクトリも避けたほうが良さそう。
チーム開発時のGitHub

#　チーム開発時のGitHub

## はじめに
初学者です。チーム開発時のGitHubの使い方を個人的にまとめたものです。
リポジトリは作成していることを想定しています。

### 統合ブランチとトピックブランチ
基本的にmainブランチでは作業をしないみたいです。
統合ブランチとトピックブランチに分けます。
統合ブランチはいつでもリリース可能な状態にしておくブランチ。
そのため統合ブランチ内ではバグ等はないはず、、、
トピックブランチの分岐元になります。
トピックブランチは機能追加や修正をするブランチです。
統合ブランチから分岐させて、作業完了後統合ブランチへ取り込みます。

## 大まかな流れ
・統合ブランチ(今回はブランチ名：developとする)から各自トピックブランチ作成
・各自作業
・作業完了後、プッシュ

```
 $ git add .
 $ git commit -m "コメント"
 $ git push origin ブランチ名
```
・Gitへ移動してプルリクエスト、マージ前の確認
・確認後マージ
・各自developブランチへ移動して更新をプル

```
 $ git checkout develop
 $ git pull origin develop
```
・次の作業のためブランチ作成

## コンフリクトとは
チーム開発で切っても切れないものな気がします。
プルリクエストの際に「Can’t automatically merge.」と表示
されていることがあります。
基本的にGitは何もなければ自動的に変更箇所を統合してくれるのですが、
同じ箇所の変更があった際にGitはどうしたいんだよ！と怒ります。
それがコンフリクトです。

## コンフリクトの解消
コンフリクトの箇所は
　<<<<<ブランチ名
　作業内容
　=====
　マージしようとしたブランチ
　>>>>>develop
と表示されますので、「<」 「=」 「>」等の不要な部分を消してあげます。
そして「Mark as resolved」を押すと解消されます。
※pullした際にコンフリクトが起こることもあるので、同様の作業をした上で、コミットプッシュをします。
私は変に色々コマンド入力してしまって、訳がわからない状態にもなったので、きちんと確認してから作業しましょう。
色々やってみようではダメですね。。。


以上、ざっくりしたまとめです。
画像とかあれば分かりやすかったのですが、、、
また色々思いついたら追記していきます。
Firestoreから取得したtimestampをAngularで日付に変換しようとする場合

自分が結構2時間ほど苦労した部分だったので、同じように悩んでいる方にも役に立てればと思いメモして置きました。

正解ではないかも知らないですが、一応実行はできるようになりましたので、あくまでも参考程度にしておけばと思います。

#背景

同じ日付変数を：

- Firestoreでの日付タイプはtimestampの形で保存されている
- AngularではDateタイプで定義されている

AngularからFirestoreに保存する時は、そのままDateタイプで送ってもFirestoreで対応してくれてるので問題ないですが、

Firestoreから取得した時には、Date関連関数使ってもうまくいけませんでした。

エラーメッセージとしては、関数がないよとかコンパイル時点でエラーになったりなどしました。

#解決方法

解決は意外と簡単でした。（正解とは言えないですが）

```Typescript
      let timestamp = <any>from_firestore.deliveryDate;

　      //　場合によっては直接Dateタイプで帰ってくる場合もあるので判断をする
      // Dateタイプなのか判断して処理を区分する
      if (timestamp instanceof Date) {
        d = timestamp; // Dateタイプであればそのまま使う
      } else {
        // Dateタイプでない場合は、toDate()で変換をかける
        let date = <any>timestamp;
        d = date.toDate();
      }
      this.deliveryDate.year = d.getFullYear();
      this.deliveryDate.month = d.getMonth() + 1; // 0からスタートなので
      this.deliveryDate.day = d.getDate(); // 注意getDayは曜日を取得、間違いないように
```

このように、一旦Firestoreから取得した日付データを　<any>で強制的にanyタイプにして置きます。（これをしないと次の行で、toDate()がエラーになってしまいます）

そして、toDate()で日付タイプに変換すると、通常通りjavascriptのDateタイプ関数で内容を取得することができるようになります。

# お願い

正解ではないですが、一応困った時の解決策にはなりましたので紹介します。もし正しい方法を知っているかたいましたらご指摘よろしくお願いいたします。
Rで分散分析するためのCSVファイルと実行コード

#概要
[anovakun](http://riseki.php.xdomain.jp/index.php?ANOVA%E5%90%9B)を用いて分散分析をする際に、どのようなデータ構造でどのような処理をすれば良いかまとめます。

# データ
ここでは下記のデータ構造を前提に進めます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143255/c3d6539b-ba41-250a-cd09-a466be9c6253.png" width=600>

これは、**5つのtype条件が参加者間**、**6つのsize条件が参加者内**の実験計画のデータになります。

各実験参加者はユニークなidを振られ「1つのtype条件」で「6つのsize条件」ごとにスコアを集計され、1人辺り6行分のデータが蓄積されます。

# R
ここでは分散分析を行うために[anovakun](http://riseki.php.xdomain.jp/index.php?ANOVA%E5%90%9B)を用い、データを整形するために[tidyverse](https://www.tidyverse.org/)を用います。

### 2要因混合（参加者間+参加者内）分散分析

```R
library(tidyverse)
source("anovakun_485.txt")

#データ読み込み
csv = read.csv("result.csv", header = T, encoding = "UTF-8")

#使うデータだけに絞り込む
src = csv %>% select(, c("id", "type", "size", "score.a"))

#データを整形する
dat_AsB = src %>% 
  #データをtype, id, sizeの順にソート
  arrange(type, id, size) %>% 
  #データを各idのtype毎にsizeのスコアを横並びにする
  pivot_wider(c(id, type), names_from = "size", values_from = "score.a") %>% 
  #idは不要なので削除
  select(, -c("id"))

#anovakunで分散分析
#dat_AsBデータを渡し、2要因混合（参加者間:A、参加者内:B）を意味する"AsB"を指定
#第5,6引数に分析結果の各値のラベルを指定
anovakun(dat_AsB, "AsB", auto = T, eta = T,
         type = c("東京","神奈川","千葉","埼玉","茨城"),
         size = c("24cm","25cm","26cm","27cm","28cm","29cm"))
```
`arrange()`は`pivot_wider()`する際に、**各実験参加者のデータを同じsize順に並ばせる**為に行います。

### 1要因参加者内分散分析

```R
library(tidyverse)
source("anovakun_485.txt")

#データ読み込み
csv = read.csv("result.csv", header = T, encoding = "UTF-8")

#使うデータだけに絞り込む
src = csv %>% select(, c("id", "type", "size", "score.a"))

#データを整形する
dat_sA = src %>% 
  #type条件を1つに絞る
  filter(type == "2") %>% 
  #データをtype, id, sizeの順にソート
  arrange(type, id, size) %>% 
  #データを各id毎にsizeのスコアを横並びにする
  pivot_wider(c(id, size), names_from = "size", values_from = "score.a") %>%
  #idは不要なので削除
  select(, -c("id"))

#anovakunで分散分析
#dat_sAデータを渡し、1要因参加者内を意味する"sA"を指定、sizeのデータ個数を指定
anovakun(dat_sA, "sA", 6, auto = T, eta = T)
```

### 1要因参加者間分散分析

```R
#データを整形する
dat_As = src %>% 
  #size条件を1つに絞る
  filter(size=="24") %>% 
  #データをtype, idの順にソート
  arrange(type, id) %>% 
  #元データが縦構造なのでここではpivotは不要
  #id、sizeは不要なので削除
  select(, -c("id", "size"))

#anovakunで分散分析
#dat_Asデータを渡し、1要因参加者間を意味する"As"を指定、typeのデータ個数を指定
anovakun(dat_As, "As", 5, eta = T)
```

## まとめ
[anovakun](http://riseki.php.xdomain.jp/index.php?ANOVA%E5%90%9B)を用いて分散分析するためのデータ構造と処理についてまとめました。

どの条件を参加者間/参加者内にするかよく検討し、後の分析を考慮してデータ構造の設計を行うようにしましょう（自戒）　

### おまけ
```R
#pipe演算子は command⌘ + shift⇧ + m がショートカット
%>%
```
Python エスケープシーケンスまとめ

#エスケープシーケンスとは

エスケープシーケンスとは、文字そのものではなく、改行やタブなどを表す文字列のことをいう。

##主なエスケープシーケンス
| エスケープシーケンス| 意味 |
|:-:|:-:|
|  ¥n |  改行 |
| ¥'  | シングルクォーテーション  |
| ¥"  | ダブルクォーテーション  |
| ¥b  | バックスペース  |
| ¥¥  | ¥マーク（バックスラッシュ）  |
| ¥t  | タブ  |

##使い方
####¥n

```
print("あいうえお¥nかきくけこ")

"""
あいうえお
かきくけこ
"""
```

####¥'
```
print('あいうえお「¥'」かきくけこ')

"""
あいうえお「'」かきくけこ
"""
```
####¥"
```
print("あいうえお「¥"」かきくけこ")

"""
あいうえお「"」かきくけこ
"""
```
####¥b
```
print("あいうえお")
print("¥bあいうえお")
"""
あいうえお
　あいうえお
"""
```
####¥¥
```
print("¥¥")
"""
¥
"""
```
####¥t
```
print("あいうえお")
print("¥tあいうえお")
"""
あいうえお
    あいうえお
"""
```


#raw文字列の利用
エスケープシーケンスを無視（無効化）する文字列のこと。
##使用方法
```
print(r"あ¥tい¥nう¥tえ¥¥お")

"""
あ¥tい¥nう¥tえ¥¥お
"""
```
HDRPでUnityちゃんを入れたらマテリアルが緑色になった

Unityちゃんが緑色になった

今回の記事はこのUnityちゃんを救ってあげる記事です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/3b26a821-5287-09e1-5488-b37d842a0251.png)

ピッコロやんけ。
今回使用したアセット下記のアセットです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/85a140eb-3626-780b-3d38-41f947f7632f.png)

## 直し方

Unityちゃんに使用されているマテリアルを見つけて，

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/1ee6dab0-d516-a069-24a4-6c49892fca55.png)

Subsurfaceの項目を０にするといいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/654b1c61-2bfb-cc8f-ed39-14880c1ac23f.png)

全部変更してあげるとかわいいUnityちゃんになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/14497a3b-0580-e0b8-8c79-3a33ea1512e0.png)

## 原因追及

とまぁここまでで終わらせてしまう訳にもいかず，原因追及を始めました。

**というわけで公式へGO!!**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/aba04b9e-5f0f-dfed-cc12-94a5c9092030.png)

載ってない……！？

https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@7.1/manual/Lit-Shader.html

それならとマニュアル内検索をしたものの，完全一致するものはなし。
というか「Subsurface」と「Mask」の両方の単語を含んだ記事は２桁もなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/c66f2c37-cc65-eedb-26d5-1fac3a810ecb.png)

むむ？と頭を悩ませた結果，よくヒットする「Subsurface Scattering」について調べたところこれが成功。

Subsurface Maskとはこれの可視性についてのものらしい。
0 = 見えない
1 = 完全に見える
といった感じ。

ではSubsurface Scatteringとはなんぞやと。

検索の結果この記事を発見。

https://www.lovehatetubaki.work/entry/hdlp/sss

解決しました。
[Liveview] LiveviewとLiveComponent間の状態管理

LiveviewとLivecmponent間の状態管理の理解があやふやだったので、覚書として簡単にまとめました。

主にsocketのassignsを更新する方法についてです。

# Liveview自身の状態更新
Liveview自身の状態の更新の場合はassign/2 or assign/3を使ってシンプルに更新できます。

```elixir
  assign(socket, hoge: "new_hoge")
```

参考文献：

https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html#assign/2

# LiveComponentからLiveviewへの状態更新
LiveviewとLiveComponentは同じプロセス内にいるため、LiveComponent側からLiveview(つまりselfへ)メッセージを送信し、Liveview側でhandle_info/2を用いて受信することで状態を更新できます。

```elixir
  # from LiveComponent
  send self(), {:msg, %{hoge: "new_hoge"}}

  # in the Liveview
  def handle_info({:msg, hoge}, socket) do
    {:noreply, assign(socket, hoge)}
  end

```
参考文献： 下記リンクのManaging Stateより

https://hexdocs.pm/phoenix_live_view/Phoenix.LiveComponent.html#content

# LiveviewからLiveComponentへの状態更新
LiveviewはLiveComponentの親であるため、send_update/3を用いてLiveComponentの状態更新ができます。

```elixir
  send_update(Hoge, id: "hoge", hoge: "new_hoge")
```
参考文献：

https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html#send_update/3

# LiveComponent自身の状態更新
Liveview自身の状態更新の時と基本的に同じ手順ですが、一点異なるのはテンプレートでphx-clickイベントを設定するときにphx-target={@myself}も一緒に書くという点です。
phx-target={@myself』を付けないとイベントがliveviewの方に送られてしまうので、LiveComponent自身にイベントが送られるようにするためです。

```elixir
  # in the Heex templete
  <button phx-click="update_hoge" phx-target={@myself} >Update Hoge</button>

  # in the LiveComponent 
  def handle_event("update_hoge", ...
```
参考文献：下記リンクの Targeting Component Eventsより

https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html#assign/2
【Vue.js】 親子コンポーネント間のライフサイクルフック

## Vue.js 親子コンポーネント間のライフサイクルフック

### はじめに
・Vue.jsの単一コンポーネントのライフサイクルフックは[こちらの記事]([https://qiita.com/chan_kaku/items/7f3233053b0e209ef355)などにもあるように、実装をするうえで避けては通れない概念です。
ただ、親子間のライフサイクルについて、あまり言及されている記事が無く、実装中に詰まった箇所がありましたので、こちらでまとめようと思います。

### 前提
Vue.jsのライブラリとしてVuetityを使用。

### 起こった事象  
下記のような親子コンポーネントを想定する。


```vuejs:parent.ts
<template>
:
<v-row>
  <v-expansion-panels accordion>
    <v-expansion-panel @click="openAcordion()">
      <v-expansion-panel-header>XXXX</v-expansion-panel-header>
      <v-expansion-panel-content>
        <Child
          :reportText.sync="reportText"
          :parentsParams="parentsParams"
        />
      </v-expansion-panel-content>
    </v-expansion-panel>
  </v-expansion-panels>
</v-row>
:
</template>

<script>
private mounted (): void {
    this.parentsParams = 'thisIsTest'
}
</script>
```


```vuejs:Child.ts
<script>
mounted (): void {
  this.getTextArea()
}

//バック側のAPIにパラメータをpostする処理を記述
～～～～～
</script>
```

■改修点  
親コンポーネントを、アコーディオンメニューではなく、普通に表示をしたい。
v-row以下を下記のように修正したい

```vuejs:parent.ts
<v-row>
  <v-col>
    <Child
      :reportText.sync="reportText"
      :parentsParams="parentsParams"
    />
  </v-col>
</v-row>

```

■エラーの内容  
バック側にpostしたとき、親コンポーネントで定義しているはずのparentsParamsがnullだとエラーが出る。  
（実際にAPIへpostをしているのはchildコンポーネント側）


■エラーの原因  
子コンポーネントではparentsParamが定義されていないため

なぜ、parentsParamが定義されていなかったのか？  
→親子間のライフサイクルの違い

◆親子間のライフサイクルフック  

```
親created  
↓  
子created  
↓  
子mount  
↓  
親mount
```
上のように、親のmount時に定義しても、それより早く子の方がmountされるため、上記のようなエラーが出た。

改修時にこのエラーが起こったのは、
改修前はアコーディオンメニューを使っており、アコーディオンメニューボタンクリック時に
子コンポーネントが読み込まれる。つまり初期表示時のライフサイクルの影響を受けていなかった。  

### 対策
子コンポーネントでmountされるよりも前に（つまり、親のcreated時など）値を定義する。

親子間でのデータ受け渡しがされている値は、どのタイミングで定義されているか、を常に意識しておく必要がある。
定義されているよりも前に使うとエラーになる。
ABC160 C - Traveling Salesman around Lake から学んだ

https://atcoder.jp/contests/abc160/tasks/abc160_c

![abc160c_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/f713ee69-ce71-07bf-c965-ec626edadfae.png)
![abc160c_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/b57e85f3-66f4-bdf8-d36d-4fdf3f21855a.png)

わからん。解答 please

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

なるほど。以下でどうでしょう。。

```abc160c.py
K,N = map(int,input().split())
A = list(map(int,input().split()))

X = A[0]
lis = []
for i in range(1,N):
    lis.append(A[i]-X)
    X = A[i]
lis.append(K+A[0]-A[N-1])
#print(lis)
print(sum(lis)-max(lis))
```

できた。
Udemy「ネットワークエンジニアを目指す初心者はここから始めよう！「ゼロから学ぶネットワーク基礎」1014

回線交換方式　

・データを送るためにリソースを占有する。

・専用の道が作られる。

・他の相手は割り込むことができない。

※代表的な例、公衆電話網


リソース

・計算や通信に使える余力のこと。

・使用されると減少する。

メモリ（記憶容量）

ハードディスク（記憶容量）

CPU（計算能力）※データを処理をすればするほど計算のパワーが減る。



パケット交換方式

・データを小さく分割する。

・リソースを占有しない。

・同時に通信ができる。

※代表的な例：インターネット通信



トポロジ

・構成を意味する。

・物理トポロジと論理トポロジがある。

・物理トポロジ：有線/無線でコンピュータがどのように接続されているのか。

・論理トポロジ：どこのデータをやりとりできるのか、できないのか。



スター型

・スイッチ/ハブを使い一ヶ所に集線

・スイッチ/ ハブの故障が全体に影響

・最近の主流


バス型

・１本のケーブルにコンピュータが接続する。

・最近ではまず見ない。


リング型

・環状型にデータが流れる。


メッシュ型

・複数の他のコンピュータに接続する。

・完全メッシュと部分メッシュに分けられる。
・故障時に逆回りで通信できるものもある。

・最近ではまず見ない。



コネクション型

・通信前に相手に事前確認を行う。

・データの送信状態を確認しながら通信をする。


コネクションレス型

・通信前の事前確認は行わない。

・送信者のタイミングでデータを送る。
DockerでGO,Gin環境構築

# 前提条件
Dockerがインストール済み

# 手順

### フォルダ構成の作成

```
go
 - web
   - Dockerfile 
   - main.go
 - docker-compose.yml 
```

### Dockerfileの記述

```Dockerfile:Dockerfile
FROM golang:latest
WORKDIR /go/src
```

```yml:docker-compose.yml
version: '3'
services:
  web:
    build: ./web
    tty: true
    volumes:
      - ./web:/go/src
    ports:
      - "3000:3000"
```

### Docker起動～サーバーの起動まで

VSCodeのDocker拡張を使ってる場合は1,2番はGUIでもできます。

1.docker起動

```shell
docker-compose up
```

2.コンテナに入る(別ターミナルで)

```shell
docker-compose exec web bash
```

3.ginモジュールの追加

``` shell
go mod init
go get github.com/gin-gonic/gin
```

4.main.goの記述

```go:main.go
package main 

import (
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()

	router.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "Hello World",
		})
	})

	router.Run(":3000")
}
```

5.サーバーの起動

```shell
go run main.go
```

### 確認
ブラウザで「localhost:3000」にアクセス

jsonの内容が表示されれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139166/98b86b87-ce62-449d-63b3-bac771c24c95.png)