OmniAICreator/Qiita-1.07M huggingface dataset:
個人情報保護法の成立と改正


### [全体の目次](https://qiita.com/tetz1/items/da4eb31b920f2acf4349)
---
# 個人情報保護法の成立と改正
##### ＊ 個人情報保護法の正式名称は「個人情報の保護に関する法律」

## 個人情報保護法
2003年（平成15年）5月23日 - 成立
2003年（平成15年）5月23日（同日） - 部分的に施行（一般企業に直接関わり罰則を含む第4〜6章以外の規定）
2005年（平成17年）4月1日 - 全面施行

## 改正個人情報保護法（平成27年改正）
2015年（平成27年）9月9日 - 成立
2016年（平成28年）1月1日 - 段階的な施行（個人情報保護委員会の設置）
2017年（平成29年）3月1日 - 段階的な施行（個人情報保護委員会へのオプトアウトの届出）
2017年（平成29年）5月30日 - 全面施行

### 主な内容：
- 個人情報の定義の明確化（個人識別符号）
- 要配慮個人情報の新設
- 匿名加工情報の新設
- 第三社提供に係る確認・記録の義務化
- 外国ヘの個人データの提供の制限
- 5000件要件の廃止
等
https://www.meti.go.jp/committee/kenkyukai/sansei/daiyoji_sangyo_chizai/pdf/003_02_00.pdf


## 改正個人情報保護法（令和2年改正）
2020年（令和2年）6月5日 - 成立
2020年（令和2年）12月12日 - 段階的な施行（法定刑の引上げ）
2021年（令和3年）10月1日 - 段階的な施行（個人データを第三者に提供しようとする際の経過措置）
2022年（令和4年）4月1日 - 全面施行

### 主な内容
- 個人の権利の在り方
  - 保有個人情報に対する請求権等の拡大（利用停止・消去請求等）
  - 6ヶ月以内の短期保存データも保有個人データとする
  - オプトアウトによる第三者提供規制の強化
- 事業者の守るべき責務の在り方
  - 報告・通知の義務化　
  - 不適切な利用の規制
- 事業者による自主的な取り組みを促す仕組みの在り方
- データ利活用に関する施策の在り方
  - 仮名加工情報の新設
  - 個人関連情報の新設
  - 提供先で個人データとなる第三者提供の規制強化
- ペナルティの在り方
  - 法定刑・罰金額の引き上げ
- 法の域外適用・越境移転の在り方
等
https://www.ppc.go.jp/personalinfo/legal/kaiseihogohou/
https://www.ppc.go.jp/files/pdf/200612_gaiyou.pdf


## 改正個人情報保護法（令和3年改正）
2021年（令和3年）5月12日 - 成立
2022年（令和4年）1月1日 - 経過措置（デジタル社会形成整備法第50条による個人情報保護法の改正に係る部分（国の行政機関・独立行政法人等関係））
2022年（令和4年）4月1日 - 段階的な施行（デジタル社会形成整備法第50条による個人情報保護法の改正に係る部分（国の行政機関・独立行政法人等関係））
22022年（令和4年）10月1日 - 経過措置（デジタル社会形成整備法第51条による改正に係る部分（地方関係））
2023年（令和5年）4月1日 - 段階的な施行（デジタル社会形成整備法第51条による改正に係る部分（地方関係））

### 主な内容
デジタル社会形成整備法に基づく改正(官民を通じた個人情報保護制度の見直し（官民一元化）
- 官民通じた個人情報の保護と活用の強化
- 医療分野・学術分野における規制の統一
- 学術研究に係る適用除外規定の見直し 
 等

https://www.ppc.go.jp/personalinfo/minaoshi/
https://www.soumu.go.jp/main_content/000790352.pdf
MathML?「ページのソースの表示」から,タグを削除したい。(awk版)ver0.1

＆IE?等、置き換えが不十分です。
①awkのEND文を使わない方法を教えて下さい。
②おすすめの変換webページを教えて下さい。


# online web  

https://awk.js.org/

# 実行例 

入力方法

・Command line (--help):
入力窓の高さについて、
右下の三角マーク？(正式な呼び方を教えて下さい。）をドラッグしたら高さを変更できました。

``` awk
'{
    Line = Line $0 
 }
END{
gsub("&theta;", "θ",Line)       
gsub("&it;", "<",Line)       
gsub("<[^>]+>", "",Line)       
gsub("【", "\r【"   ,Line)
gsub("．", "．\r"   ,Line)
print Line
}'
```

・STDIN:
```
ブラウザ「ページのソースの表示」をコピー貼り付けする。
(例)M.E.T.A.様の(MathML?)2022　大学入学共通テスト　本試　数学II・数学IIBMathJax
view-source:https://mathexamtest.web.fc2.com/2022/202210000/2022100000200mj.html
```

・STDOUT | STDERR:
すぐに結果が反映されます。
```
結果
2022　大学入学共通テスト　本試　数学II・数学IIBMathJax2022　大学入学共通テスト　本試験　数学II・IBMathJaxMathematicsExaminationTestArchivesMETAトップへ年度一覧へ2022年度一覧へ大学別一覧へ共通テスト一覧へ2022-10000-0201おおぞらラボさんの解答へ数学入試問題さんの解答（PDF）へなかけんの数学ノートさんの解答へ望星塾さんの解答(PDF1頁11行目)へ2022　大学入学共通テスト　本試数学II，IIB共通配点15点正解と配点易□　並□　難□
【１】［１］　座標平面上に点A(-8,0)をとる．
また，不等式x2+y2-4x-10y+4&lE;0の表す領域をDとする．
(1)　領域Dは，中心が点(ア,イ)，半径がウの円のエである．
以下省略....
```
法人取引先と個人取引先


# 質問

+ [Is it possible to convert a Person Account to a Business Account, if a community user is already attached?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IT5t3SAD)


# 説明
Salesforce では、法人取引先と個人取引先は[個人取引先レコードタイプ](https://developer.salesforce.com/docs/atlas.ja-jp.api.meta/api/sforce_api_guidelines_personaccounts.htm)に基づいて区別されます。


個人取引先レコードタイプを使用すると、個人に対して営業、取引を行う B2C 機能を使用できます。たとえば、医師、美容師、不動産業者など、個人をクライアントとする業種でこうした機能を使用します。

Account 項目 IsPersonAccount が true に設定されている場合、レコードタイプは個人取引先レコードタイプとなります。Salesforce では 1 つのデフォルトの個人取引先レコードタイプ、PersonAccount がありますが、管理者は、追加の個人取引先レコードタイプを作成できます。それに対し、Account 項目 IsPersonAccount を false に設定しているレコードタイプは「法人取引先」レコードタイプで、通常のビジネス対ビジネス (B2B) の Salesforce 取引先です。

個人取引先が作成されると (または既存の法人取引先が個人取引先に変更されると)、対応する取引先責任者レコードも作成されます。この取引先責任者レコードは、「個人取引先責任者」といいます。個人取引先責任者を使用すると、個人取引先は、取引先および取引先責任者と同時に機能することができます。このレコードは、個人取引先と直接関連付けることができる唯一の取引先責任者レコードです。また、対応する個人取引先責任者レコードの ID は、個人取引先の PersonContactId 項目に保存されます。


# 法人取引先を個人取引先に変更する

組織を準備し、法人取引先を個人取引先に変更する方法の詳細な手順については、以下を参照してください。

1. Setting Up Person Accounts ガイド (英語) へアクセスします。
2. 「Convert Business Accounts to Person Accounts」セクションまでスクロールします。
3. 慎重に読み、その指示に従ってください。

この手順を完了すると、以下の内容を含む CSV ファイルが作成されているはずです。
+ 個人取引先に変換したい法人取引先の ID のみを含む取引先 ID 列
+ 新たに移行した個人取引先に関連付けたい個人取引先のレコードタイプ ID を格納するレコードタイプ ID 列

データローダで他の項目を対応付けると、更新が失敗します。

作成したファイルとデータローダを使用して、取引先レコードの「RecordTypeId」項目の更新を実行します。

既存の法人取引先のレコードタイプ ID を個人取引先のレコードタイプ ID に更新すると、効果的に個人取引先に変換されます。詳細については「Import Person Accounts」 (個人取引先のインポート) を参照してください。

[Change business accounts to person accounts](https://help.salesforce.com/s/articleView?id=000323364&type=1)

# 個人取引先を法人取引先に変更する

個人アカウントをビジネスアカウントと連絡先に分離する機能は、現在、APIを介して個人アカウントレコードのRecordTypeIdを変更することで可能です。これにより、新しいアカウントや連絡先レコードをインポートしたり、個人アカウントデータを削除したりすることなく、個人アカウントで以前に取得したすべてのフィールド値と関係を維持できます。カスタムWebサービスを作成して、この更新を実行したり、Dataloaderなどの他のツールを使用したりできます。
このプロセスには、注意が必要ないくつかの制限があります。最も重要なのは、同じ更新でアカウントのフィールドに他の変更を加えることができないことです。試行すると、エラーが発生します。

[Convert a Person Account to a business Account & Contact](https://ideas.salesforce.com/s/idea/a0B8W00000GdndgUAB/convert-a-person-account-to-a-business-account-contact)

# 関連資料

+ [Dynamic SOQL + Person Accounts](https://dave-norris.medium.com/dynamic-soql-person-accounts-2cd43a552149)

# 比較

+ [What is meant by Person Accounts. How it is differ from Business accounts? Kindly help me with this.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eqJSQ)

:::note
Please check this article.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T49jkSAB

https://www.salesforceben.com/salesforce-person-accounts-pros-and-cons/
:::
Jetpack ComposeでAutoSizeTextViewを実装する

AndroidViewでは簡単に設定できたことがJetpack Composeでは少し工夫しないと実装できないことがいくつかあったので紹介します。

### autoSizeMinTextSize, autoSizeMaxTextSize 
[autoSizeText](https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview?hl=ja#granularity)が公式でサポートされていないため、Jetpack Composeへの移行に伴いどのように実装できるか調べました。

```.kt
@Composable
fun AutoSizeableText(
    text: String,
    maxTextSize: TextUnit,
    minTextSize: TextUnit,
    modifier: Modifier = Modifier
) {

    var textSize by remember(text) { mutableStateOf(maxTextSize) }

    Text(
        text = text,
        fontSize = textSize,
        maxLines = 1,
        overflow = TextOverflow.Ellipsis,
        modifier = modifier,
        onTextLayout = {
            if (it.hasVisualOverflow && textSize > minTextSize) {
                textSize = (textSize.value - 1.0F).sp
            }
        }
    )
}
```

`hasVisualOverflow`でテキストが枠外に溢れているかどうかをBooleanで返し、`true`の時はmaxTextSizeから1sp引いて再度`hasVisualOverflow`をチェックしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/05ec7f87-3316-9948-2bd1-0812a0205c93.png)

### autoSizeText
Androd端末のフォントサイズ設定に影響を受けず、フォントサイズを固定する実装は以下の通りです。

```.kt
fun TextFont(
    text: String,
    modifier: Modifier = Modifier,
    fontSize: TextUnit = 10.sp
) {
    FloatingActionButton(onClick = { /*TODO*/ }, modifier = modifier) {
        Text(
            text = text,
            fontSize = with(LocalDensity.current) {
                (fontSize.value / fontScale).sp
            },
        )
    }
}

@Preview(showBackground = true, fontScale = 1.0f)
@Preview(showBackground = true, fontScale = 2f)
@Composable
fun PreviewTextFont() {
    TextFont(text = "Button")
}
```

`LocalDensity.current`を使うことで端末のフォントサイズが取得できる(`fontScale`)ため、`fontSize`を`fontScale`で割ってあげています。そうすることで引数で渡したfontSizeが適用されます。


|  Before  |  After  |
| ---- | ---- |
|  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/8ef70f91-8657-fc0f-d98b-702cc3c16419.png)  |  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/88a4047a-c874-55ce-467e-164fc6e0faf6.png)  |


### 参考記事
https://stackoverflow.com/questions/69108033/prevent-text-in-jetpack-compose-from-enlarging-when-device-font-size-is-increase
gitでaddし忘れたファイルがあった場合の対応方法


## 結論
以下を行えば良い。

### 1.
追加し忘れたファイルをgit addする

```bash
git add ${addし忘れたファイル}
```

### 2.
以下コマンドを実行する

```bash
git commit --amend
```

コミットメッセージを修正する画面が表示される。
特に編集しないで`:wq`を入力する。

## 参考
https://tech-blog.rakus.co.jp/entry/20191113/git
vCenterの証明書期限切れ対応

vCenterの証明書の期限切れでトラブったので、解決に役立った情報をメモ。
誰かのお役に立てば。

## 事前に知っておくべきこと

良記事でした。
ありがたやありがたや :pray: 

- https://t-dilemma.info/how-do-deal-with-vsphere70u2/
- https://t-dilemma.info/vcsa70-certificate/
- https://t-dilemma.info/vsphere70-expired-certificate-reovery-by-all-option8/

## やったこと１: machine証明書の更新および、VMCAのroot証明書など諸々の更新

証明書の更新方法。
普通はこれだけで解決する。

- https://kb.vmware.com/s/article/2097936

## やったこと２: Security Token Service の証明書更新

Security Token Service (STS) の証明書の期限切れ確認と更新

- check
  - https://kb.vmware.com/s/article/79248
- checkで期限切れがあったら更新
  - https://kb.vmware.com/s/article/76719

## やったこと3: Lookup Service の情報更新

Lookup Service の保持する証明書情報の更新

- checkして、問題があるところが見つかったら該当コマンドで更新
  - https://kb.vmware.com/s/article/80469

checkで問題があるとこんな感じでエラーが出るので、この場合は `python lsdoctor.py --trustfix`　を実行する。

```shell
$ python lsdoctor.py -l

2022-07-05T10:31:18 ERROR generateReport: hogehoge found SSL Trust Mismatch: Please run python ls_doctor.py --trustfix option on this node.
```

以上です :innocent:
ざっくり学ぶ個人情報保護法とその対応

# 目次
## 個人情報保護法の概要
- [個人情報保護法の成立と改正](https://qiita.com/tetz1/items/87ceed6479bf982af1a3 "個人情報保護法の成立と改正")
- [個人情報保護法関連情報・ウェブサイト](https://qiita.com/tetz1/items/85ec0c8f36cae75a97a7)
- 個人情報保護法対応はなんのため？
- 個人情報保護法をとりまく社会環境（国内・グローバル）
- 個人情報保護法をとりまく社会環境（事件・事故）
- 個人情報保護のためのその他の規制・フレームワーク（ISO等）
- [個人情報とは？（個人情報・個人識別符号・要配慮個人情報・個人情報、個人データ、個人情報データベース、保有個人データ）](https://qiita.com/tetz1/items/8915d20a161b80c91621 "個人情報とは？")
- 個人情報とプライバシーの違い
- 個人情報取扱事業者
- 仮名加工情報と匿名加工情報
- [個人情報取扱事業者等の義務](https://qiita.com/tetz1/items/93a925b465170333b125)
- 個人情報の取得
  - [適正な取得、要配慮個人情報の取得](https://qiita.com/tetz1/items/ce735c09882d4b0ae188)
  - [利用目的の通知または公表](https://qiita.com/tetz1/items/770dcca8a954cbfe901c)
  - [直接書面等による個人情報の取得](https://qiita.com/tetz1/items/d96eb60cd0dd24688a4d)
  - [利用目的の通知等をしなくてよい場合](https://qiita.com/tetz1/items/02a4526ad1f298c27f11)
- 不適正利用の禁止
- 同意
- 個人情報の利用目的
  - [利用目的の特定、利用目的の変更、利用目的による制限](https://qiita.com/tetz1/items/c6d8a0432d34347a121d)
  - [事業の承継](https://qiita.com/tetz1/items/8f0a6006bdc0987635c8)
  - [利用目的による制限の例外](https://qiita.com/tetz1/items/dd3a40c885aee1966821)
- 個人データの管理
  - [データ内容の正確性の確保等、安全管理措置](https://qiita.com/tetz1/items/5b526e239fd8e3876dae)
  - [従業者の監督](https://qiita.com/tetz1/items/536cba3266081d8ae35f)
  - 委託先の監督
- 個人データの漏えい等の報告等
  - [「漏えい等」の考え方（「漏えい」「滅失」「毀損」の考え方）](https://qiita.com/tetz1/items/8444d90558f8e6327485)
  - [漏えい等事案が発覚した場合に講ずべき措置](https://qiita.com/tetz1/items/98506bf0f14c833fe416)
  - 個人情報保護委員会への報告
     - [報告対象となる事態](https://qiita.com/tetz1/items/2a7ce2948400da4ec6a2)
     - [報告義務の主体、速報、確報](https://qiita.com/tetz1/items/9795719757154b99855b)
     - [委託元への通知による例外](https://qiita.com/tetz1/items/2423fa98fc53bb990a42)
   - 本人への通知
     - 通知対象となる事態及び通知義務の主体、通知の時間的制限、通知の内容、通知の方法、通知の例外

- 個人データの第三者への提供

- 域外移転（越境移転）
- データ主体からの要求に対する対応（保有個人データに関する事項の公表等、保有個人データの開示・訂正等・利用停止等）
  - 保有個人データに関する事項の公表等（保有個人データに関する事項の本人への周知、保有個人データの利用目的の通知）
  - [保有個人データの開示](https://qiita.com/tetz1/items/01ef7145b2bbeecc192b)
  - 第三者提供記録の開示（第三者提供記録の定義、第三者提供記録の開示の方法、第三者提供記録の不開示事由等）
  - [保有個人データの訂正等](https://qiita.com/tetz1/items/b8d2cf8bf651070e8c5a)
  - 保有個人データの利用停止等
  - 理由の説明、開示等の請求等に応じる手続、手数料

- 罰則
- [本人への通知が必要な主なケース](https://qiita.com/tetz1/items/a503e8c9d8e196526fde)
- [公表が必要な主なケース](https://qiita.com/tetz1/items/600cb3525a9945ac0f07)
- [同意が必要な主なケース](https://qiita.com/tetz1/items/8746863ef31a8274d7a7)

## 個人情報保護法対応の自動化
- 個人情報保護法対応の現状と課題
SLDS関係

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


この中を読むと非推奨になったクラスが書かれていますが、まとまったものがない。

https://www.lightningdesignsystem.com/release-notes/


この質問のスクリーンショットをみても、非推奨になっているとは思えない。
[Hi I am trying to create a custom lookup and I am using the code from below url .however in vscode in getting error "this class is deprecated" for below classes . Let me know if this is fine or the code is outdated?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000IPm4NSAT)


# そのほか

+ [$a.util.toggleclassがコミュニティで機能していません](https://qiita.com/Keiji_otsubo/items/5f6e057ffb5f32cfc60f)
+ [Winter'21での不具合](https://qiita.com/Keiji_otsubo/items/3b47f3529f0c55df4f2f)
+ [Bell icon color の色を変えるCSS](https://qiita.com/Keiji_otsubo/items/53fc923fd7400e732d7f)
+ [AuraのSLDSについて slds-theme--info -- の扱い](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077Bm7A)



# CompilerError: LWC1051: Forbidden tag found in template: '<link>' tag is not allowed.

1 - Include @salesforce-ux/design-system in package.json.
2- Copy SLDS resources into /src/assets/ with scripts/copy-resources.
3- Link to the SLDS stylesheets in src/layouts/main.html.
4- Configure lwr.config.json to handle the SLDS resources.

[How can I add SLDS to LWR OSS ?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000E9qqP)
【GAS】Google Apps Script API をオンにしているのに、拡張機能 GitHub アシスタントで、[github assistant] undefined がでる問題



追記です
-

複数アカウント使ってる場合は、chromeのアカウント(プロファイル)自体を切り替えるのが一番よさそうです

![スクリーンショット 2023-01-08 9.24.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425910/cf2bf6c5-cb5b-1eba-cee1-495ea0e3d970.png)



問題
-

### 発生した事象

Google Apps Scriptで、pushやpullをしようとすると以下のエラーが発生
`[github assistant] undefined`

![スクリーンショット 2022-07-06 7.30.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425910/5ba22537-1d32-597a-b9c9-f41fb4fcb1e6.png)

Chromeの検証機能でネットワークを確認すると、

![スクリーンショット 2022-07-06 7.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425910/3b9f1b7d-642e-0b65-ec8f-ad0a5809b948.png)


```
{
  "error": {
    "code": 401,
    "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED"
  }
}
```

### 発生条件

こちらの記事を参考に、githubと正しく連携

https://qiita.com/kita3folio/items/7a5bd678864ae46ff616

また、こちらの記事を参考に、Google Apps Script API をオンにしている

https://hiroga.hatenablog.com/entry/2021/01/30/174715




解決策
-

Chrome上部のメニューバーの「ウィンドウ」
=> 拡張機能
=> 「Google Apps Script GitHub アシスタント」の詳細
=> 「拡張機能のオプション」を押下

「拡張機能のオプション」を押下時に以下のようなポップアップが表示されることがある。
※どういう条件の時にポップアップが表示されるかがハッキリとわからず、、googleアカウントを一度ログインしなおす等するとポップアップが表示するっぽい :thinking: 

<img width="500" alt="スクリーンショット 2022-07-05 16 37 10" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425910/4c591d9d-d9af-cfa9-4aac-810d96ccecde.png">

以下の画面に進むので、GasHubにGoogleアカウントへのアクセスの認可を行います。

<img width="500" alt="スクリーンショット 2022-07-05 16 37 10" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425910/0edee702-3b1b-ed1d-c7b4-e58b915a8a83.png">



補足
-

エラーにもいくつかバリエーションがあるっぽい。
同じ`401`でも、以下のようにdetailsがついてるケースもあったが、この場合も上記の方法で解決した。

```
{
  "error": {
    "code": 401,
    "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "CREDENTIALS_MISSING",
        "domain": "googleapis.com",
        "metadata": {
          "service": "script.googleapis.com",
          "method": "google.apps.script.management.v1.ProjectsService.GetContent"
        }
      }
    ]
  }
}
```

発生条件が定かでなく、再現できていないが、`403` `PERMISSION_DENIED`が返ってくるケースもあったが、こちらも上記の手法で解決した。
```
{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

```

追記
-
複数のGoogleアカウントを切り替えたりしてるとGithubとの連携がおかしくなるので、Chromeのユーザーを切り替えましょう。
新規プロジェクト立上げ時にGitHubにプロジェクトフォルダ全体を共有する方法

# 目的
gitの勉強をすると、アップロードする対象がファイルであることが多いです。
実際にプロジェクトを進めるうえで、プロジェクトフォルダごとgitにアップロードしたいと思い、その方法を今後のメモ用にまとめておきます。

+ GitHubにレポジトリを新規作成
+ ローカルにプロジェクトファイルを作成し、gitに紐付ける
+ GitHubにプロジェクトフォルダをまるごとアップロード

# 手順
gitとGitHubの設定が済んでいることを前提として話を進めます。
設定がまだの方は、下の記事を参考に設定を済ませましょう。

https://prog-8.com/docs/git-env

## GitHubにレポジトリを新規作成
まずはGitHub上に新規レポジトリを作成します。
Repository nameは`sample_app`とします。

レポジトリを作成した後の画面でQuick setupという欄の【HTTPS/SSH】というボタンの**SSH**を選択し、表示されたURLをコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/9149a35e-96f7-d5d9-7464-e48e0c26503e.png)


## ローカルにプロジェクトフォルダを作成し、gitに紐づける
次に、ローカル上にプロジェクトフォルダを作成し、gitに紐づけます。
ターミナル上で下記のようにコマンドを実行します。
```terminal
# sample_appフォルダと必要なフォルダを一括作成
$ rails new sample_app -G

# sample_appフォルダに移動
$ cd sample_app

# 作成したフォルダをGitで管理できるようにする
$ git init

# プッシュ先のリモートリポジトリを指定する
$ git remote add origin <sshで取得したURL>

# 登録されているリモートリポジトリを確認する
$ git remote -v
=> origin  git@github.com:<ユーザー名>/sample_app.git (fetch)
=> origin  git@github.com:<ユーザー名>/sample_app.git (push)
  
```

## フォルダをプッシュする

```terminal
# 変更されたすべてのフォルダとファイルを選択
$ git add .

# 変更履歴を記載する
$ git commit -m "Create sample_app"

# リポジトリに選択したフォルダとファイルをアップロードする
$ git push --set-upstream origin main

# パスワードを求められる
$ Enter passphrase for key '/Users/<フォルダ名>/.ssh/id_ed25519':(パスワードを入力)
```

`git add .`は**前回アップされた状態から変更のあるすべてのファイル/フォルダをステージングする**というコマンドです。
Progate等の教材では`git add <ファイル名>`のように一つずつファイルを指定していますが、今回紹介した方法で一括でステージングしてしまう方が手間がかかりませんし、アップし忘れも防ぐことができます。

`git push origin main`だとエラーが出るので、pushの後に`--set-upstream`を付けるのがポイントです。
`-u`と略すことも可能です。

パスワードは[この記事の5項](https://prog-8.com/docs/git-env)で設定したパスワードです。
ターミナル上では入力内容は表示されません。
焦らずに落ち着いて入力しましょう。

### git add . でエラーが出たら
ファイルを編集した後に`git add .`をすると、
```terminal
warning: LF will be replaced by CRLF in log/error_2022-07-18.log.
The file will have its original line endings in your working directory
```
と出ることがあります。
そんな時はこちらの記事を参考にしてください。
[【Gitエラー解決】warning: LF will be replaced by CRLF (Qiita)](https://qiita.com/WebEngrChild/items/133484ca79fc90a207d5)

# まとめと今後の流れ
以上がGitHubにフォルダ全体を共有する方法となります。

**今後の流れ**
+ [新しくブランチを切り、編集内容を親ブランチにマージする](https://qiita.com/ysk91_engineer/items/f7676f2a7cde7251132b)
+ [開発チームに参加し、GitHubからプロジェクトファイルをcloneする](https://qiita.com/ysk91_engineer/items/9eb685619e462a852355)
+ 共同作業の中で同一ファイルを編集したときの対処法
RayでPypeRの処理を分散する方法

(株)日立製作所 研究開発グループ サービスコンピューティング研究部の上野です。

前回の記事では、[PypeRでPythonコードとRコードをまとめる方法]()についてご紹介しました。
今回は、PypeRとRayの組み合わせについてご紹介します。

[Ray](https://docs.ray.io/en/latest/index.html)は、スケーラブルで汎用的な分散処理のフレームワークです。
Rayのネイティブライブラリとツールにより、複雑なアプリケーションの計算ができます。
Rayは近年注目を集めているOSSで、Ray Summit 2021ではAWSがプラチナムスポンサーになっています。

大量データの分析などに分散処理は欠かせない要素ですが、Pythonだけで書こうとするコードが複雑になりやすいという問題があります。Rayが提供するライブラリを使うことによって、分散処理をシンプルに実装できます。

Rayの詳細については、[分散処理を民主化するRay](https://qiita.com/yu_nakata/items/ee9514d48eb891d61bae)でも紹介しておりますので、よろしければご参考ください。

こちらの記事では、前回記事の内容を踏まえて、PypeRの処理をRayで分散する方法についてご紹介します。

## 使い方

Rayを用いてR処理を複数のインスタンスで実行することで、Rで直列処理していた処理を並列処理へすることができるため、処理の高速化が図れます。

PypeRの処理を分散するインスタンスには、それぞれPypeRパッケージとRのランタイムがインストールされている必要があります。方法については、[こちら]()をご参考ください。

PypeRとRayの組み合わせは以下の方法で実現できます。

```py
import ray
ray.init()

@ray.remote
def f():
    import pyper
    r = pyper.R(use_pandas=True)
    # ライブラリをインポート
    r("library(<library's name>)")
    # PythonからRにデータを渡す
    r.assign('<key in R>', <Key in Python>)
    # RからPythonにデータを渡す
    r("<R process code>")
```

注意すべき点としては、Task内にPypeRパッケージのインポートからRライブラリのインポートまで含める必要があります。
Taskを受け取ったインスタンスで、PypeRで作成されるオブジェクトのシリアライズが正常に行われず、処理に失敗するためです。

## 利用例

[こちらの記事]()でRの処理をPythonコードにまとめ上げたものを参考にします。
以下のようにPypeRで書いたR処理を実行するコードを、RayのTaskとして書き換えることでできます。

```py
import ray
ray.init()

supportThreshold = 0.4

@ray.remote
def f():
    import pyper
    r = pyper.R(use_pandas=True)

    # 必要なパッケージをインストール
    r("library(Matrix)")
    r("library(arules)")
    r("library(arulesSequences)")

    # PythonからRにデータを渡す
    r.assign('supportTh', supportThreshold)
  
    # PythonからRにデータを渡す
    r("x <- read_baskets('~/data/test.txt', info = c('sequenceID','eventID','SIZE'))")
    r("as(x, 'data.frame')")
    r("s1 <- cspade(x, parameter = list(support = supportTh, maxgap = NULL), control = list(verbose = TRUE))")
    r("summary(s1)")
    r("results = as(s1, 'data.frame')")

    # RからPythonにデータを渡す
    result = r.get('results')
    return result

results = [f.remote() for i in range(4)]
print(results)
```

# まとめ

本記事では、PypeRの直列処理をRayでインスタンスへ分散して並列処理へ書き換える方法を紹介しました。

既存のRで書かれたリソースを活かしつつRayにより分散分析を行うことで、１からコードを書き直すより容易に既存システムに分散分析を取り入れられる可能性があります。
Google Apps Script V8 エンジンでの JDBC バグが修正？！（2年5ヶ月待ち）

2021年02月16日に投稿した GAS(Google Apps Script) V8 エンジンでの JDBC 動作不良の続報です。

https://qiita.com/tnishiki/items/7599983f47dc8d58e5aa

2020年2月12日、IssueTracker に「Chrome V8 : ReferenceError: Jdbc is not defined」として、V8 エンジンで JDBC の動作不良について投稿がありました。

https://issuetracker.google.com/issues/149273194

実際に使ってみると、数回程度の接続だと繋がるものの途中からセッションが切れるなどの症状が発生し、非常に不安定になります。この投稿には 80件以上、同様の症状が出るとのコメントが連なったものの、google から全く音沙汰なしの状態でした。

ところが、2022/7/5 10:26UTC に、

> mi...@google.com<mi...@google.com> #85
> Hi,
>
> This issue has been fixed. To anyone previously affected by this, can you check whether you can still reproduce this?
>
> Kind regards.
超和訳（この問題直ってますよー、だれか直ってないか確認してくれない？）

との投稿が！

### ｷﾀ━━━━━━(ﾟ∀ﾟ)━━━━━━!!!

いやー、待ったかいがあった、いよいよ V8 エンジンで JDBC が使えるぜ！
と思ったのですが・・・・

この投稿のあと、

> la...@ljd-tech.com<la...@ljd-tech.com> #92
>
> The original problem is still not fixed, and the workaround is still broken.
> 超和訳（いや直ってないです。回避策の方もおかしいままです）

との投稿が。
ちなみに回避策とは、ライブラリ機能などを駆使して JDBC を正常に動作させる方法です。この Issue コメントの中で有志により見いだされました。どうやらこれもうまく動かなくなったようです。

2022/7/5 15:50 UTC 時点では、まだ修正はできていないようです。
残念。。。

進展がありましたらまた投稿します。
githubに反映されない原因を解決した

最近週１か２は出勤前の1〜２時間をプログラミングの勉強に充てています。本日も頑張っていきましょう。

今日はcommitしてpushしたはずなのに、githubに反映されないというトラブルを解決したことを記録に残します。

ことの発端はデプロイ時のエラー（デプロイで毎回エラー。。。）です。

```qiita:terminal
remote:  !     The Ruby version you are trying to install does not exist on this stack.
remote:  !     
remote:  !     You are trying to install ruby-2.6.3 on heroku-22.
remote:  !     
remote:  !     Ruby ruby-2.6.3 is present on the following stacks:
remote:  !     
remote:  !     - heroku-18
remote:  !     
remote:  !     Heroku recommends you use the latest supported Ruby version listed here:
remote:  !     https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
remote:  !     
remote:  !     For more information on syntax for declaring a Ruby version see:
remote:  !     https://devcenter.heroku.com/articles/ruby-versions
remote:  !
```
これはエラー分だけみると、「ruby2.6.3はheroku-18にしか対応してませんよ」的なものだと思いますが、
僕はGemfile内のrubyのバージョン指定を外していたので、このエラーが出るのは想定外でした。

で、Gemfileを確認してみると、、、更新されている。。。
次にgithubを確認してみると、、、更新されてない！！

色々調べたもののよく分からず、「git status」で状況確認をすることに。すると

```qiita:terminal
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   Gemfile
        modified:   Gemfile.lock
        modified:   app/controllers/application_controller.rb
        modified:   config/routes.rb
```
pushしても「up to date」と出ているのに、commitが残っているではないか。。。（理解あってますか？）

そこで、試しにここに書いてある「git reset」を実行。

```qiita:terminal
$ git reset
Unstaged changes after reset:
M       Gemfile
M       Gemfile.lock
M       app/controllers/application_controller.rb
M       config/routes.rb
```

元に戻せたっぽい。ということでもう一回commitし直し、
そしてpushしてみたところ、うまく行きました！
無事デプロイできたのでチュートリアルの続きやってきます。
機械学習による株価予測 KaggleのJPXコンペを終えて

# はじめに
UKIです。

Kaggleで開催された[JPX Tokyo Stock Exchange Prediction](https://www.kaggle.com/competitions/jpx-tokyo-stock-exchange-prediction)のサブミッションが終了しました。本コンペの結果が出るのは3ヶ月後ですが、記憶が鮮明なうちにコンペを終えた感想をまとめておきたいと思います。

# コンペ仕様
ざっくり要約すると、
- 日本株2000銘柄の中から、
- 毎日200銘柄ロング、200銘柄ショートし、
- 3カ月間の日次損益のシャープを競う

運ゲーになりがちなファイナンスコンペですが、以下の点で問題設定に工夫が凝らされていると感じました。

- 買い入れ銘柄数を大きくすることで異常値の影響を軽減する  
例えば買い入れ銘柄が少ない場合、運よくSTOP高銘柄を引き当てたプレイヤーは大きなアドバンテージを得ることになります。買い入れ銘柄を大きくすることで異常値の影響を軽減し、予測性能の実力を可能なかぎり測れるよう配慮されています。

- 評価指標がシャープレシオ
単純に利益の絶対額を競うのではなくポートフォリオの安定性を競うことになります。シャープレシオはリターンの平均と標準偏差（＝リスク）から計算されます。このうちリターンの平均は期間に応じてバラツキが大きく運要素が大きくなってしまいがちですが、リスクはある程度のコントロールが可能です。リスクコントロールスキルが要求されるコンペとなります。

- ウェートの設定
ロングもしくはショートする200銘柄は均等ウェートではなく、リニアウェートとなっています。この部分でもポートフォリオ構築スキルが要求される仕様となっています。


# コンペで最も重要だったこと
上記で説明した通り、リスクコントロールが最重要であったと思います。リスクコントロールには「事前的」な手法と「事後的」な手法がありますが、今回はとにかく事後的な手法の1つであるファクター中立化（Factor Neutralization、以下FN）が特に顕著な効果がありました。

以下はモデルの一例です。訓練期間は2020年までであり、以下のバランスカーブは完全にアウトオブサンプル（リークなし）の曲線です。2021年1月から2022年6月までのおよそ1年半にわたるデイリーシャープは、FNを行うことで0.066→0.22と大きく改善しています。

![fig01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562749/934e3a37-b89a-10bc-a5cd-ec4a3649f078.png)



# コンペは運ゲーとなるのか？
このようにFNしていないモデルとFNしたモデルで、Privateのシャープレシオ分布はどのようになるでしょうか。株価の予測は水物であり、当然ながらPrivate期間の市場動向次第でFNしたモデルがFNしていないモデルに敗れることもありえます。どの程度の確率でそのような事象が発生しうるか、モデル提出前にきちんと把握しておくべきです。

ここでは事例として、FNしていないモデルとFNしたモデルについて日々損益をランダム抽出し、両者の利益額とシャープの分布がそれぞれどうなるか比較しました。

![fig02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562749/992eb714-ce92-b7a8-3f03-06934cf11eb3.png)



上記から分かるように、利益の平均や絶対額を評価指標としてしまうとFNなしモデルのほうがテールが長くなってしまいます。これはつまり、高スコアを狙うためには当てずっぽうでハイバリアンスなモデルを提出する戦略に優位性があります（完全に運ゲー状態）。一方で今回のコンペのようにシャープレシオを評価指標とすると、前述のようなハイバリアンスなモデルを提出する戦略は殆ど機能しなくなります。

今回のランダム試行では、FNなしモデルがFNありモデルよりもPrivateでパフォーマンスが良くなる確率は、16～20%程度の結果となりました。このレベルであれば、参加者の試行錯誤は比較的報われる結果になると思います。

# おわりに

優勝スコアはヒストグラムからざっくり推定すると、少なくとも0.4、場合によっては0.5以上となる可能性があります。このスコアが引けるかどうか、すなわちバラツキ分布の中から良いものを手繰り寄せることができるかどうかは、参加者の運も必要となってくるでしょう。ファイナンスコンペではやはり実力と運の両方が必要なのです。

それでは参加者の皆様へ幸運のご加護があらんことを！
三か月後にまた会いましょう。
（また2位なんてことがありませんように）
Mysql文一覧表

<h2>
よく使うmysql文一覧表を作っていく（随時更新)


<p>

```mysql:mysql
SELECT id, zipcode, address 
FROM db_name
WHERE id=1 AND address like '埼玉県川口市%'
```

<h3>📕基本文

<h5>SELECT

>表示したいテーブル
これら→no, zipcode, address

<h5>FROM

>表示したいテーブルがあるデータベースの名前

<h5>WHERE

>条件を記入するところ
idの1が格納されているところが欲しかったら
id=1

<h3>📕SELECT内で使う条件文

<h5>AS

※使用例
SELECT id AS 管理ID

>idのタイトル名を作る


<h3>📕WHERE内で使う条件文

プログラミング言語を学習していれば、基本的なこともありますが記入しておきます。
※小文字でも取れる場合あります。

<h5>=

>等しいものとる時

<h5>AND

>複数条件を記入できる

<h5>LIKE

>文字列のパターン取得すると
例：埼玉県川口市に当てはまる地名が欲しいとき
address like '埼玉県川口市%'
「%」はここまで当てはまるという意味なのでつけてください
「_」は１文字・・・

※ここらへんもそのうち追加予定
INNER JOIN

最終更新：2022/07/06
関連リストのフィールドに表示されているフィールドを増やす【英語の回答例】



[Case details shown on account page](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000IPwXnSAL)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ac5c2d70-a699-cc3d-a1ca-a5259344792f.png)


Go to setup> Object Manager> Accounts> Page layouts and edit the necessary page layout.

Scroll down to the related lists and click on the wrench icon on the Case related list.

You can now add/remove fields as needed

https://help.salesforce.com/s/articleView?id=sf.customizing_related_lists.htm&type=5
loggingの多重実行を防止する

# 概要
GoogleColab上でloggingを含むコードを複数回実行すると同一のログが重複して出力される。
全く同じ内容のログで不要なので出力されないようにする。

# コード(変更前)

```Python
from logging import StreamHandler, Formatter, INFO, getLogger

handler = StreamHandler()
handler.setLevel(INFO)
handler.setFormatter(Formatter("[%(asctime)s] [%(threadName)s] %(message)s"))
logger = getLogger()
logger.addHandler(handler)
logger.setLevel(INFO)
...
```

こんな感じのコードがあったとする。
これを複数回実行すると重複して出力されてしまう。
`logger.addHandler` を実行するとハンドラが `logger.handlers` 変数に格納される。
`handlers`は、「同じハンドラは2重登録しない」ようになっているが、別のハンドラインスタンスを作成してaddHandlerに渡した場合、「違うハンドラ」なので登録されてしまうらしい。

# コード(変更後)
```Python
from logging import StreamHandler, Formatter, INFO, getLogger

handler = StreamHandler()
handler.setLevel(INFO)
handler.setFormatter(Formatter("[%(asctime)s] [%(threadName)s] %(message)s"))
logger = getLogger()
for h in logger.handlers[:]:
  logger.removeHandler(h)
  h.close()
logger.addHandler(handler)
logger.setLevel(INFO)
...
```

一番簡単な対処方法は`logger.handlers`を`addHandler`前に初期化してしまうこと。
これで複数回出力はされなくなる。
JavaによるSwingを用いたオセロゲームの作成

## 環境
Eclipse IDE 2022-03 (4.23.0)
MacBook Pro 2020
macOS Monterey バージョン12.4

## 使用技術
Java (11.0.14.1)
Swing

## プログラムの概要
ローカルのPC上で動作するオセロゲームアプリケーション。
プログラムで動作するコンピュータが相手となる。

## 機能
- オセロゲームの基本的なアクション。(コマの配置、パス)
- 難易度の選択

## 工夫した点
#### コンピュータがコマを置く場所を探索する際の動き
##### ①最初に考えたプログラム
自分の駒が置いてあるマスの周りにある敵の駒を探し、敵の駒があればその場所から再度周りの敵のコマ探す
##### ②工夫したプログラム
自分の駒が置いてあるマスの座標を取得し、周囲に敵の駒があった場合にその方向のマスの座標を連続してリストとして取得し最終地点に空きマスがあるか判定する

①の場合、コードを見たときに直感的にわかりにくくバグの確認などが難しくなる可能性があったため、工夫をしました。
100日後くらいに個人開発するぞ！day052

## 今日はインスタンスメソッドを学んでみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/1927ee16-998b-e958-856c-3062b5e1877a.png)




## 今日の学び
### クラスの中で定義したメソッドの使い方
* クラスの中でメソッドを定義でき、「インスタンス.メソッド名」で呼び出せる
    * 例
        * `class Menu`
        * ` attr_accessor :name`
        * ` attr_accessor :price`
        * ` def show`
        * `  puts "私はメニューです"`
        * ` end`
        * `end`
        * `menu1 = Menu.new`
        * `puts menu1.show`
* インスタンスメソッドも引数を受け取ったり戻り値を返すことができる
    * 例
        * `class Menu`
        * ` attr_accessor :name`
        * ` attr_accessor :price`
        * ` def show(data)`
        * `  return "私は#{data}です"`
        * ` end`
        * `end`
        * `menu1 = Menu.new`
        * `puts menu1.show("メニュー")`


### インスタンスメソッドの中でインスタンス変数を使う方法
* インスタンスメソッドの中で「self.変数名」を使うことでインスタンス変数を使える
    * 例
        * `class Menu`
        * ` attr_accessor :name`
        * ` attr_accessor :price`
        * ` def show_name`
        * `  return "私は#{self.name}です"`
        * ` end`
        * `end`
        * `menu1 = Menu.new`
        * `menu1.name = "ピザ"`
        * `menu1.show`
【C++】基礎を学ぶ①～Hello Worldを理解する～

# はじめに
本記事ではC++でHelloWorldを出力するプログラムを解説する

# HelloWorldを出力するプログラム
```cpp
#include <iostream>

int main(){
  std::cout << "HelloWorld" << std::endl;
  return 0;
}
```

## `#include <iostream>`とは
外部の装置と入出力を行う機能（ライブラリ）を追加している
プログラムを作るうえで絶対に必要になる

### `#include`
○○を取り込むという意味
右側にあるファイルを読み込む

### `<iostream>`
外部の装置と入出力を行う装置
`input output stream`の略

## `std::cout << "HelloWorld" << std::endl;`とは
HelloWorldという文字列を出力して改行するプログラム

### `std::cout`
名前空間`std`の`cout`オブジェクト
標準出力に対応するオブジェクト
`cout`は`character output`の略

### `std::endl`
名前空間`std`の`endl`関数
改行文字を出力してバッファをフラッシュ
`endl`は`end line`の略

### 名前空間
重複を防ぐための仕組み
変数・関数・クラスが存在する住所を定義

## `int main()`とは
１番最初に実行される関数
プログラムを作るうえで絶対に必要になる

### 関数の構文
```
終了時に返す値 関数の名前 (外部から投入する値){
  具体的な処理
}
```

# 次の記事
[【C++】基礎を学ぶ②～文字列・数値を出力する～](https://qiita.com/rapirapi/items/d874bbc8fcf612c240ee)
SageMathインストールメモ

# Mambaforgeインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149874/c18df515-2e4a-673d-e26c-0aa603984e22.png)

https://github.com/conda-forge/miniforge

```
chmod +x Mambaforge-Linux-x86_64.sh
./Mambaforge-Linux-x86_64.sh
```

# SageMathインストール
```
mamba create -n sage sage python=3.9
mamba activate sage
```

# SageMath起動
```
sage -n jupyter
```
[Firebase] cloud functionsの.runtimeconfig.jsonに定義した環境変数の設定をワンライナーコマンドで設定する

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[もぐめっと](https://mogmet.com)です。

本日は便利コマンドのメモ的な共有です。

## 便利コマンドの紹介

早速結論から紹介します。
こんな感じで簡単に環境変数をセットできます。

```shell
cat .runtimeconfig.json | jq -r "to_entries[]| [.key, (.value | tojson)] | join(\"='\")" | sed -e "s/}$/}'/" | xargs firebase  -P dev functions:config:set
```

変数の内容に空白があっても設定できるようにしています！頑張った！

## なぜワンライナーでセットしたいか

2点理由があります。

### 1. エミュレーターと環境を同期したい

.runtimeconfig.jsonというファイルをfunctionsディレクトリに置いておくとemulatorで起動した時に環境変数を自動で設定してくれます。
基本的にはこのファイルで環境変数を管理していて、変更があった時にでもワンライナーコマンドを毎回設定することで自動的に環境変数を設定できるようにしたいんです。

### 2. キャメルケースで変数を扱いたい

本来cloud functionsのfunctions:config:setは、変数名にスネークケースを設定しないと設定してくれません。
しかし便利コマンドでやるとキャメルケースの変数名でも設定できちゃうのでプログラム的には命名統一できていい感じです。

ちなみにparser.jsを書いてる人もいるが、これを使うとスネークケースでないとエラーになったりします。

https://medium.com/@AllanHasegawa/setting-config-for-firebase-cloud-functions-with-json-136f455e7c69

## まとめ

CIでも使えるようにワンライナーで設定できるコマンドの紹介でした！

ちなみにシークレット情報にあたるものだったら環境変数じゃなくてSecret Managerを使うようにした方がいいです。

https://qiita.com/korih/items/3366b2a60ff14f81ac3c


最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com
【classicASP】Active Server Pagesとは

### 1.背景
会社でASPを使用しており、先輩や上司への質問や書籍を参考にしながら学習を進めています。
今回はASPについてまとめていきます。

### 2.環境
- windows10 バージョン21H2
- Microsoft-IIS 10.0
- VBScript 5.8（16384）

### 3.ASPとは
**Active Server Pages**（アクティブサーバーページ、**ASP**）は、マイクロソフトが開発した、ウェブページを動的に作成するサーバーの拡張機能のことです。HTMLなどのマークアップ言語とVBScriptやJavaScriptなどのスクリプト言語を組み合わせることで成り立ちます。

似ているものとして、JSP（JavaServer Pages）があります。
※JavaServer Pages (JSP) ：HTML内にJavaのコードを埋め込んでおき、Webサーバで動的にWebページを生成してクライアントに返す技術のこと。

後継技術でASP.NET(Active Server Pagesを.NET向けにしたもの)というものがあり、ASP.NETと区別するためASPを「クラシックASP」「レガシーASP」と呼ぶこともあります。

#### 動的と静的
静的な性質は、プログラムを実行していない状態で決まる性質のことで、例えばソースコードだけで一意に決まるような性質は静的です。
これに対して動的な性質は、プログラムを動かしてみて初めて決定する性質を意味します。

- 静的なプログラミング言語：Java,C++など
- 動的なプログラミング言語：JavaScript,PHP,Rubyなど

### 4.使用方法
マイクロソフト製の標準WebサーバーであるIIS(Internet Infomation Services)で動作することができます。
※IISのインストールについては別の記事でまとめようと思います。

既定の言語はVBScriptですが、スクリプトの宣言やIISに既定の言語として設定すると
利用できるようになります。

拡張子は「.asp」となります。

下記はVBScriptを使ってブラウザに「Hello World」を出力したコードの例です。
Response.Write は、その後に指定されたテキストをブラウザに送信します。

HTMLタグの記述と区別するため、「デリミタ」である`<%`と`%>`を使って記述します。
※デリミタ：ある情報単位の開始と終了を示す文字または文字の並びのこと。

```sample.asp
<%@ Language = VBScript codepage = 65001 %>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<%
   Response.Write "Hello World" 
%>
<html>
<body>
</body>
</html>
```

### 5.ブラウザでの確認方法

①IISのルートディレクトリ上にファイルを保存します。
デフォルトでは「%SystemDrive%\inetpub\wwwroot」になっており、一般的には「C:\inetpub\wwwroot」になります。

②ブラウザにURLを入力して確認します。
（例）wwwroot直下にsample.aspを保存した場合：「http://localhost/sample.asp」

### 6.まとめ
今回はASPについて、基本的なところをまとめてみました。
公式リファレンス等に目を通してまとめることで整理できました。

### 7.参考
1.[Active Server Pages](https://ja.wikipedia.org/wiki/Active_Server_Pages)
2.[アクティブ・サーバ・ページとは？](https://bb-navi.jp/netjiten/a21.html)
3.[JavaServer Pages](https://ja.wikipedia.org/wiki/JavaServer_Pages)
4.[ASP.NET](https://ja.wikipedia.org/wiki/ASP.NET)
5.[まつもとゆきひろのプログラミング言語論](https://xtech.nikkei.com/it/article/COLUMN/20060314/232388/)
6.[Internet Information Services](https://ja.wikipedia.org/wiki/Internet_Information_Services)
7.[ASPページを作成する](https://docs.microsoft.com/ja-jp/previous-versions/iis/iis-5.0/cc338728(v=msdn.10))
8.[Windows10でIISのルートディレクトリ（トップページのhtmlファイル）の場所](https://www.wannko.net/windows10/iis/iis_01.html)

### 8.最後に
記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。
Connect to and Sync Your Remote Canada Data

回避策

[Error "INVALID_LOGIN: Invalid username, password, security token; or user locked out" Connecting to Salesforce](https://kb.tableau.com/articles/issue/error-invalid-login-invalid-username-password-security-token-or-user-locked-out-connecting-to-salesforce?_ga=2.242663745.2144190731.1656215356-1896281659.1645253617)

# Connect to and Sync Your Remote Canada Data > Select the connection to source dialog

[Connect to and Sync Your Remote Canada Data > Select the connection to source dialog](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000El0nVSAR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b7d885fd-c365-4baa-f28d-f24deec13f64.png)

# Error: Connect to and Sync Your Remote Canada Data

+ [Error: Connect to and Sync Your Remote Canada Data](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HE6J2SAL)

+ [Unable to connect to Canada Data](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JganKSAR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/30b9b064-71de-e6fb-4511-26de290b9f05.png)

:::note
Please check this article.

https://kb.tableau.com/articles/issue/error-invalid-login-invalid-username-password-security-token-or-user-locked-out-connecting-to-salesforce
:::
ソースコードをPDF化する（2022年版, Vimユーザ向け）

新しいコードを理解しようとするとき、画面上のエディタで読むことに不満がない人もいると思いますが、エディタ上だと「どこを読んでいたっけ？」となりやすいので、私には紙に印刷して（あるいはiPadとApple Pencilで）書き込みを入れながら読むのが一番合っているようです。そんなとき、行番号付きで、シンタックスハイライトも付いて、日本語にも対応で、お気に入りのフォントで、綺麗にPDF化することができると嬉しいですね。本記事では、私が数年かけて試行錯誤して現状ベストだと思っている手法を紹介します。

## TL;DR...先に結論を

```bash
#!/bin/bash

filein=$1
opt=${2:-Portrait}  # 長い行のときはLandscapeオプションが便利
vim ${filein} -c 'colorscheme default | set number | TOhtml | w tmp.html | qa!'
wkhtmltopdf --page-size B4 -O ${opt} --footer-left "[date] [time] ${filein}" \
  --footer-right "[page]/[topage]" --no-background --margin-top 4 --margin-right 3 \
  --margin-left 4 --margin-bottom 10 tmp.html ${filein}.pdf 
rm -f tmp.html
```
このシェルスクリプトにtopdfと名前をつけ、実行権限を与え、パスの通ったところに置いておくと良いでしょう。使用時は
```bash
topdf SOME_INPUT_FILE
```
とすればPDF化してくれます。

## 解説

まず、Vimの出力機能を使うことのメリットを挙げておきます。これは、我々Vim使いであれば、読みたい言語のシンタックスハイライトが既にVimに揃っているという前提があります。流星のように現れた最新の言語でも、閉じたコミュニティで代々使われている古の独自言語でも、 ~/.vim/syntax さえメンテナンスしてあれば、PDF化に際して別途シンタックスハイライトと格闘しなくて済むということです。

```bash
vim ${filein} -c 'colorscheme default | set number | TOhtml | w tmp.html | qa!'
```

上の行ですが、vimにコマンドライン引数を与えて`TOhtml`でtmp.htmlというHTMLファイルに変換しています。`colorscheme default`を付けているのは、画面表示向きのカラースキームだと印刷して見づらいことがあったためです。`qa!`はvimを閉じるコマンドです。

続いて、wkhtmltopdfでPDF化してやります。HTMLを経由せずPS（PostScript）形式を経由してPDF化していたこともあったのですが、日本語対応などHTML形式の方がうまくいきました。
```bash
wkhtmltopdf --page-size B4 -O ${opt} --footer-left "[date] [time] ${filein}" \
  --footer-right "[page]/[topage]" --no-background --margin-top 4 --margin-right 3 \
  --margin-left 4 --margin-bottom 10 tmp.html ${filein}.pdf 
```
上の行でHTML→PDFの変換を行っています。`--page-size B4`としているのは、実質的には文字サイズの調整です。`--page-size A4`とすれば文字が相対的に大きくなり、`--page-size A3`なら文字が小さくなります。私にはB4（縦の場合1ページにちょうど100行）がちょうどいい塩梅でした。

`-O`は配置（orientation）のオプションです。`${opt}`に`Landscape`を与えるとページが横向きになります。1行が長いコードをPDF化する際に便利です。使用時に`topdf SOME_INPUT_FILE Landscape`と与えます。

`--footer-*`はお好みで。変換した日付や元のファイル名、ページ番号などを入れています。

`--margin-*`は文字通り余白の設定ですが、フッターを入れる関係で下部を大きめにしています。

以上で、日本語対応、シンタックスハイライト対応のPDF化ができます。ソースコードを印刷して読みたいVim派の方はぜひ試してみてください。

<img width="600"　alt="sample" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146259/e555863d-24ba-39c8-27c4-253a705c6c37.png">
サンプル（トリミング済み）です。
【Docker】別環境のmysqlコンテナに接続するphpMyAdminコンテナ作成

# はじめに
開発環境のDockerComposeとは別でphpMyAdminコンテナを作成して開発環境内のmysqlの操作ができるようにしてみた備忘録。

# 行なった環境
- macOS Monterey
- Docker Desktop for Macインストール済み
- 開発環境用のDockerは既に環境構築済み（DockerCompose：nginx,php,node,mysql）
- Docker公式のphpMyAdminイメージを使用
 https://hub.docker.com/r/phpmyadmin/phpmyadmin/

# phpMyAdminコンテナの作成

### 起動中の開発環境用Dockerのmysqlコンテナ名を調べる
```zsh:zsh
% docker ps
CONTAINER ID   IMAGE              COMMAND              CREATED        STATUS      PORTS         NAMES
xxxxxxxxxxx   sample_mysql  "docker-entrypoint.s…"   7 hours ago    Up 7 hours   3306/tcp    sample-mysql
・・・
・・・
```
mysqlのコンテナ名　→ 「sample-mysql」



### 起動中の開発環境用Dockerのネットワーク名を調べる
```zsh:zsh
% docker network ls
NETWORK ID     NAME                    DRIVER    SCOPE
xxxxxxxxxxx1   bridge                  bridge    local
xxxxxxxxxxx2   sample_network          bridge    local
xxxxxxxxxxx3   host                    host      local
xxxxxxxxxxx4   none                    null      local
```
ネットワーク名　→ 「sample_network」


### mysqlのコンテナ名とネットワーク名を指定してdocker run
```zsh:zsh
% docker run --net=sample_network --name phpmyadmin -d --link sample-mysql:db -p 8081:80 phpmyadmin/phpmyadmin
```
- `--net`：mysqlコンテナのネットワーク名を指定
- `--name`：phpMyAdminコンテナ名を指定
- `-d`：バックグラウドで起動
- `--link`：mysqlコンテナ名を指定
- `-p`：ポートを指定（他のコンテナと被らないように8081にしてます）

以上でphpMyAdminコンテナの完成！


# ブラウザでphpMyAdminにアクセス
- 「localhost:8081」でphpMyAdminにアクセス
- mysqlコンテナで設定した認証情報でログイン

phpMyAdminコンテナを新しく作成し、開発用のDokerComposeのmysqlを操作できるようになりました。
Laravel7でtwigを使う

# 概要
Laravel7におけるTwigの適用方法

## Twigとは
`Twig`とはテンプレートエンジンのこと。
Laravelは標準では`Blade`が使われている。

### 1.composerでtwigbridgeをインストール

```
composer require rcrowe/twigbridge
```
### 2.twigの設定ファイルを追加する
```
php artisan vendor:publish --provider="TwigBridge\ServiceProvider"
```
`config/twigbridge.php`が作成される

### 3.viewにTwigファイルを作成

`resources/views`ディレクトリに`test.twig`を作成

`resources/views/test.twig`
```test.twig
twigテンプレートです
```
### 4.twigファイルへのルーティングを作成する

`/routes/web.php`
```.web.php
Route::get('/test', function () {
    return view('test');
});
```

### 5.一応キャッシュを消しておく
```
php artisan route:clear
php artisan config:clear
php artisan view:clear
php artisan cache:clear
```

これでページにアクセスすると`twigテンプレートです`が表示される。

## 参考
https://blog.capilano-fw.com/?p=2678

https://alaki.co.jp/blog/?p=2890

## Twigの公式リファレンス
https://twig.symfony.com/
【RuboCop】commit時にRuboCopを実行する【Lefthook】


## gemのインストール
以下のコマンドを実行して`Lefthook`をインストールします。
```:ターミナル
$ gem install lefthook
```

## Lefthookの設定
Lefthookの設定をします。
`lefthook.yml`を作成し、以下のように記述します。
```lefthook.yml
pre-commit:
  parallel: true
  commands:
    rubocop:
      files: git diff --name-only --staged
      glob: "*.rb"
      run: rubocop --force-exclusion {files}
```

## 動作確認
以下のコマンドを実行し、正常に動作するか確認します。
```:ターミナル
＄ lefthook install && lefthook run pre-commit
```
【Python】ワンライナーコッホ曲線【ネタ】

# はじめに
徒然なるままに研究室に居ると、隣で後輩が課題のコッホ曲線を描画するプログラムを書いていたので、自分も書いてみむとて書くなり。

# コッホ曲線とは
>コッホ曲線（コッホきょくせん、英: Koch curve）はフラクタル図形の一つ。スウェーデンの数学者ヘルゲ・フォン・コッホ (Helge von Koch) が考案した[1]。線分を3等分し、分割した2点を頂点とする正三角形の作図を無限に繰り返すことによって得られる図形である。　　- [コッホ曲線 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%83%E3%83%9B%E6%9B%B2%E7%B7%9A)

こんなの↓
![Koch_curve.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501281/b296d9c7-6bfd-e5ce-1cbd-989b00fe7cf1.png)

# 書くなり
```python
koch = lambda x: np.r_[x[:1],(x[:-1]+np.diff(x,1,0)@np.array([[[1/3,0],[0,1/3]],[[.5,.5/3**.5],[-.5/3**.5,.5]],[[2/3,0],[0,2/3]],[[1,0],[0,1]]])).T.reshape(2,-1).T]
```

# つかいかた
最低2点の座標x,yを渡す。
ex）`[[0, 0], [1, 0]]`

```python
import numpy as np

a = [[0, 0], [1, 0]]
koch(a)
# ---> array([[0., 0.], [0.33333333, 0.], [0.5, 0.28867513], [0.66666667, 0.], [1., 0.]])
```

# 動作確認
```python
import numpy as np
import matplotlib.pyplot as plt

a = [[0, 0], [1, 0]]
for _ in range(5):
    a = koch(a)
plt.plot(*a.T, lw=1)
plt.axis("equal")
plt.show()
```
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501281/e0f520da-2d3f-26d4-1035-b87da4885980.png)

# 簡単な解説
隣り合った頂点へのベクトルに1/3倍、1/$\sqrt{3}$倍+$\pi$/6回転、2/3倍、1倍の演算をそれぞれ施して、
それを それぞれの頂点座標に足し合わす操作をしています。
reactファイル作成手順

# ファイル作成手順
1. `$npx create-react-app 好きなファイル名`
2. `$code 好きなファイル名`でvscodeを開く
3. `$npx start`で立ち上げる

storybookサーバーを起動
1.`$npx sb init`
2.`$yarn storybook`
【VueRouter】パスの一部がパスパラメータとして認識されてしまい悩んだ話

VueRouterを使用していて、目的のコンポーネントが表示されずにつまづいたので、備忘録として記事にしました。


### 問題のルート
~~~javascript
Vue.use(VueRouter);

const routes = [
  // 企業一覧
  {
    path: '/companies',
    name: 'COMPANY_LIST',
    component: CompanyList
  },
  // 企業詳細
  {
    path: '/companies/:company_id',
    name: 'COMPANY_DETAILS',
    component: CompanyDetails
  },
  // 企業登録
  {
    path: '/companies/create',
    name: 'COMPANY_CREATE',
    component: CompanyCreate
  }
];

const router = new VueRouter({
  mode: 'history',
  routes
});

export default router;
~~~

### 起きた問題
このようなルート群を定義し、`/companies/create`にアクセスすると、`CompanyCreate(企業登録)`コンポーネントではなく、`CompanyDetails(企業詳細)`コンポーネントが表示されてしまいます。
****
### 原因
- Vue Routerには、**マッチングの優先度**なるものがあります。
> しばしば同じ URL で複数のルートがマッチすることがあります。そのようなケースではマッチングの優先度はルートの定義された順番によって決定されます。先に定義されたルートほど優先度が高くなります。([VueRouter公式ドキュメント](https://v3.router.vuejs.org/ja/guide/essentials/dynamic-matching.html#%E3%83%9E%E3%83%83%E3%83%81%E3%83%B3%E3%82%AF%E3%82%99%E3%81%AE%E5%84%AA%E5%85%88%E5%BA%A6))

- 特定のパスに遷移した際、定義されているルートを上から順にチェックしていき、最初にパスがマッチしたものを画面に表示する。という流れでVueRouterはルーティング処理を行なっています。

- ルート`企業詳細`には、パスパラメータ`company_id`が設定されています。パスパラメータには基本的に型の制限がありません。`create`という文字列も入れることができるということです。つまり、`companies/create`も`企業詳細`のパスに該当します。
- `/companies/create`に遷移した場合、VueRouterは`routes`の中を順にチェックしていきます。パスがマッチするルートは、`企業詳細`と`企業登録`になります。ここで、**マッチングの優先度**により、マッチしたルートの中でも一番上で定義された`企業詳細`が結果として画面に表示されてしまったのが今回の問題の原因でした。

****

### 改善
- 他のルートと共通のパスを持ち、パスパラメータを含む場合は、以下のように他のルートよりも下に定義してあげましょう。
- こうすることで、`/companies/create`に遷移すると、パスが最初にマッチする`企業登録`画面が正常に表示されます。
~~~javascript
const routes = [
  // 企業一覧
  {
    path: '/companies',
    name: 'COMPANY_LIST',
    component: CompanyList
  },
  // 企業登録
  {
    path: '/companies/create',
    name: 'COMPANY_CREATE',
    component: CompanyCreate
  },
  // 企業詳細
  {
    path: '/companies/:company_id',
    name: 'COMPANY_DETAILS',
    component: CompanyDetails
  }
];
~~~

****

VueRouterの**マッチングの優先度**を紹介しました。

あまり順序などを気にせずにルートを定義してしまっていたのですが、目的のコンポーネントが表示されず悩んだことで、ルート定義の順序を気にする必要があることを学びました。

今回の記事が、同じ問題にぶち当たっている方のお役に立てると光栄です。

最後まで読んでいただき、ありがとうございました。
Zoom に音声認識検索とワードカウンタを付けてみた

キャンペーンとのことで参加してみようと
https://qiita.com/official-campaigns/engineer-festa/2022

まだ途中ですが、しんどくなってきたので、
現時点までをまとめて公開し、余裕が出てきたら継続しようかと

# 機能
Zoom会議中に発言すると、音声認識し都度、
1. 検索　　　　　：名詞らしきものを抽出し、Youtube（など）の検索結果を表示する
2. ワードカウンタ：抽出した名詞らしきものをカウントし、上位を表示する
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1171945/f76d72bb-a5ce-4ba9-1786-a75013daba54.png)

# ねらい
検索機能は、
・ブレストなどでヒントとなるような情報提示をしたい
・雑談などで会話を膨らませる話題提供をしたい

ワードカウンタ機能は、
・会議の振り返りとして、自分が何に重点を置いたか分かるようにしたい
（テーマに重点が置けたかどうか、）
（他に意外に重点を置いた点があったか、）
（テーマに沿ったワードがほとんど出ていなければ、聞く側としては何の話だったか分からないはず、）
（など振り返り）

# 発展
検索機能は、
会話に沿った広告の表示が可能になると思われる。

広告について考えると
・Google検索でのリスティング広告は広く受け入れられていると思うが
・Gmailの広告はプライバシーとの相性が悪く受け入れられにくいと思う

Web会議をこの2つのどちらかに分類するとしたら Gmail 側と思う。
会話をしていると、それに沿った広告が表示されてくると気持ち悪いように思う。

ただしここで、音声認識検索を入れるとどうか。
検索したいときに自分の意思でオンにすると検索結果が出てくる、
その中に会話に沿った広告が含まれる。
これは上記2択のリスティング広告側になり得るように思う。

また、リスティング広告では大抵、数個のワードでの検索になると思うが、
会話では数十個のワードが検出されていく、
するとより目的に沿った広告の表示が可能になるように思う。
（ただし誤検知はデメリット）
Contact Form 7で動的に選択肢を生成する方法　

## Contact Form 7で動的に選択肢を生成する方法　

カスタム投稿などをもとに、Contact Form7でチェックボックス、ラジオボタン、プルダウンなどを動的に生成したい時がある。

例えば製品についてのお問い合わせフォームなど。

カスタム投稿として登録されている製品の名前を吸い出して、
動的にチェックボックスを作りたいといったシチュエーションだ。

そんな希望を叶える実装方法を紹介する。

手順は至ってシンプル。
1. カスタム投稿の情報を吸い出してHTMLを生成する関数を作成する。
関数の中身は以下のような内容。
1-1. WP_Queryで投稿情報を取得しまわす。
1-2. ob_startでバッファリングを有効にし、その中でHTMLを書く。
タイトルやカスタムフィールドの値など自由に取得可能。
1-3. 最後にバッファを返す
2. 1で作成したコードをContact Form7のショートコードに登録。
3. 2で作成したショートコードをContact Form7の編集画面に張り付ける。 

コードは以下のようになる。

```functions.php
<?php
function add_original_choices()
{

  ob_start();

  $args = array(
    'post_type' => 'works', //worksというカスタム投稿をもとに動的にinputを生成
    'order' => 'ASC'
  );

  $the_query = new WP_Query($args);
  $i = 0;
  if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post();
?>
      <label for="<?php echo $i; ?>"><?php the_title(); ?></label> <!-- $postのIDをもとに本文やカスタムフィールドの値など自由に取得可能 -->
       <input type="checkbox" id="<?php echo $i; ?>" value="<?php the_title(); ?>">
<?php
      $i++;
    endwhile;
  endif;
  return ob_get_clean();
}
wpcf7_add_form_tag('add_original_tag', 'add_original_choices');
// この場合「add_original_tag」がショートコード名

```

add_original_choicesという関数でカスタム投稿の情報を吸い出し、HTMLを生成しreturnする。
wpcf7_add_form_tagはContact Form7に独自のショートコードを追加する関数なので、
それを利用してadd_original_choices関数をadd_original_tagというショートコードにする。

上記で作成したadd_original_tagショートコードをContact Form7の編集画面に張り付ければ完成だ。
【Vue.js】Computed, Watchの使い分け

## この記事の目的
PRでレビューをいただいた際に疑問に思ったため、アウトプット用
独自の解釈もあるので、間違いがあればご指摘をいただきたいです！

## どう分けるのか
基本的には`computed`の方が簡潔に記述できるから良い
→`computed`内に記述されている変数は依存関係になっている
→`watch`は依存関係(監視する変数)を宣言しないと監視できない(コードが冗長になる)
```js
watch: {
    firstName(val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName(val) {
      this.fullName = this.firstName + ' ' + val
    }
}
```
`firstName`, `lastName`は同時に`watch`することも可能

```js
computed: {
    fullName() {
      return this.firstName + ' ' + this.lastName
    }
  }
```
`firstName`, `lastName`は特に宣言しなくても依存関係になる(監視)

#### 以下の場合は`watch`の方が良い
- 非同期で値を使うとき(axiosでの値取得など)
- 更新前と更新後の値を使う場合
- 処理を実行するだけ(`return`しない)の時

## 参考文献
[Vue公式ドキュメント](https://v3.ja.vuejs.org/guide/computed.html)
[【Vue.js】computedとwatchの違い・使い分け](https://qiita.com/t_t238/items/14a07b858a8afd95417d)
kubectlをMacにcurl経由でinstallした時にcomplete:13: command not found: compdefのエラーが出たときの解消方法

KubectlをMacにinstallした時にエラーが出他のでその時の解消方法のメモ

# 現象

以下の手順でインストールを試みたところ、sourceコマンド実行時にエラーが出た。

```.terminal
$ curl -O "https://storage.googleapis.com/kubernetes-release/release/v1.18.2/bin/darwin/amd64/kubectl"
$ chmod -x kubectl
$ sudo -x kubectl /usr/local/bin/kubectl

# for zsh user
$ source <(kubectl completion zsh) # -> これを実行した時にerror complete:13: command not found: compdef
```

# 解決策
調べてみたところ、他のCLIのインストールでも同様のケースがあり、同じ方法で解決することができた。以下の二つのコマンドを実行した後に、再度 `source <(kubectl completion zsh)`を実行すると動作するとエラーが出なくなる。

```.terminal
$ autoload -Uz compinit
$ compinit
```

## compinitコマンドで毎回メッセージが出る場合

二つ目の `compinit`コマンド実行時に毎回

```.zsh
$ compinit
# Ignore insecure directories and continue [y] or abort compinit [n]?
```

とメッセージが表示されていて、そのたびにyを押すのが面倒だったので、以下のコマンドを実行したところ解消した。

```.zsh
$ compaudit | xargs chmod g-w
```


# 余談

毎回シェル起動時に上の手順を手動で実行するのは面倒なので、 `.zshrc`に追記した

```.zshrc
$ autoload -Uz compinit && compinit
$ source <(kubectl completion zsh)
```

# 参考文献
compinitのエラーが出た時の解消方法
https://github.com/zsh-users/zsh-completions/issues/680

compinitコマンドで毎回メッセージが出るところを解消するのに必要なコマンド
https://qiita.com/kylasakerskog/items/736169f4477947cf7126