OmniAICreator/Qiita-1.07M huggingface dataset:
NumPy配列の列を抽出する方法いろいろ

2次元配列の列を取り出す方法のいろいろ.


## import
```python:
import numpy as np
```

## 配列の生成
まずは適当に5x4の配列を生成

```python:
a = np.arange(5*4).reshape([5, 4])
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]
#  [16 17 18 19]]
```

## 特定の1列を抽出する

```python:
# 2列目のみ
b = a[:, 2]
print(b)
# [ 2 6 10 14 18]
```
`a[row, column]`とすると, `row`の部分で行の指定, `column`の部分で列の指定を行う.
今回は列を取り出したいので, `row`の部分は常に`:`とする. `:`のみ記述することで, 行に関しては特に指定しないという意味になる. つまり`a[:, 2]`は, 「すべての行から, インデックスが2の要素だけください」ということになる.


## 連続する複数の列を抽出する
1, 2列目や0~2列目など, 連続する複数の列を取り出す.

```python:
# 1, 2列目
b = a[:, 1:3]
print(b)
# [[ 1  2]
#  [ 5  6]
#  [ 9 10]
#  [13 14]
#  [17 18]]
```
`1:3`は1以上3未満を意味するため, 1~2列目が取り出せる.
`1:`や`:3`のように指定すれば, 1列目以上や3列目未満の列がすべて取得できる.

```python:
# 1列目~
b = a[:, 1:]
print(b)
# [[ 1  2  3]
#  [ 5  6  7]
#  [ 9 10 11]
#  [13 14 15]
#  [17 18 19]]

# 0~2列目
b = a[:, :3]
print(b)
# [[ 0  1  2]
#  [ 4  5  6]
#  [ 8  9 10]
#  [12 13 14]
#  [16 17 18]]
```

## 偶数列, 奇数列など
```python:
# 4x8の配列を生成
a = np.arange(4*8).reshape([4, 8])
# [[ 0  1  2  3  4  5  6  7]
#  [ 8  9 10 11 12 13 14 15]
#  [16 17 18 19 20 21 22 23]
#  [24 25 26 27 28 29 30 31]]

# 偶数列
b = a[:, ::2]
print(b)
# [[ 0  2  4  6]
#  [ 8 10 12 14]
#  [16 18 20 22]
#  [24 26 28 30]]

# 奇数列
b = a[:, 1::2]
print(b)
# [[ 1  3  5  7]
#  [ 9 11 13 15]
#  [17 19 21 23]
#  [25 27 29 31]]
```
このように, 基本的にリストの操作方法に則っているため, 倍数や逆順での取得も可能.

```python:
# 後ろから3の倍数の列
b = a[:, ::-3]
print(b)
# [[ 7  4  1]
#  [15 12  9]
#  [23 20 17]
#  [31 28 25]]

# 1列目以上7列目未満の一列飛ばし
b = a[:, 1:7:2]
print(b)
# [[ 1  3  5]
#  [ 9 11 13]
#  [17 19 21]
#  [25 27 29]]
```


## 不規則に複数の列を抽出する
個人的にはここからが本題.
1, 5, 6列などのように, 不規則に列を取り出したいときがある.
ひと手間増えるが, 列の数と同じ長さのフィルターを用意することで実現できる.


```python:
# インデックス1, 5, 6の値がTrue, それ以外がFalseの長さ8のリスト
f = [False, True, False, False, False, True, True, False]

b = a[:, f]
print(b)
# [[ 1  5  6]
#  [ 9 13 14]
#  [17 21 22]
#  [25 29 30]]

# boolean型の1x8の零行列を生成して, 欲しい列のインデックスの値だけTrueに変えるパターン
f = np.zeros(8, dtype=bool)
columns = [1, 5, 6]
f[columns] = True

b = a[:, f]
print(b)
# [[ 1  5  6]
#  [ 9 13 14]
#  [17 21 22]
#  [25 29 30]]

# 指定した列以外を取得したい場合はonesですべてTrueの配列を生成し, いらない列だけFalseに変える
f = np.ones(8, dtype=bool)
columns = [1, 5, 6]
f[columns] = False

b = a[:, f]
print(b)
# [[ 0  2  3  4  7]
#  [ 8 10 11 12 15]
#  [16 18 19 20 23]
#  [24 26 27 28 31]]
```
~~numpyで扱う配列は列の数が多い場合がほとんどだと思うので, 二つ目の方法がメインになってくると思う.
例では`np.zeros`を使用しているが, 状況によっては`np.ones`で要素がすべて`True`の配列を作ってから, いらない列だけ`False`に変える方が楽かもしれない.~~

※ 2020/07/04に追記
`np.zeros`を使う方法よりも簡単な方法をコメントで教えていただいたので, 下に示す.

```python:
# 4x8の配列を生成
a = np.arange(4*8).reshape([4, 8])
# [[ 0  1  2  3  4  5  6  7]
#  [ 8  9 10 11 12 13 14 15]
#  [16 17 18 19 20 21 22 23]
#  [24 25 26 27 28 29 30 31]]

# 1, 5, 6列を取り出す
b = a[:, [1, 5, 6]]
print(b)
# [[ 1  5  6]
#  [ 9 13 14]
#  [17 21 22]
#  [25 29 30]]
```


## おわりに
あまり話を広げすぎてもわかりづらいと思い, 今回は列のみに絞って解説したが, 列同様に行も指定することで特定の行の特定の列を取り出すこともできる. 3次元以上の場合もこれらの方法を応用することで, 欲しい要素を抽出できる.

一番最後に解説した零行列を作って列を取り出す方法は, 自分としては結構綺麗にできたと思うけど、~~他にもっと楽な方法がありそうな気もする~~.


## 追記
複数の列を取り出す, よりスマートな方法を@nkayさんにコメントで教えていただいたので, 書き加えた. (July 4, 2020)
Bashの${@}と${*}の違いについて

# ShellCheckとは
シェルスクリプトの構文をチェックしてくれるソフトです。
「動くけどやめたほうがいい」というコードも教えてくれるので非常に便利です。

# SC2145

以下のコードでエラーが出ました。（実際の関数じゃないけど同じようなやつ）

```bash
say () {
    echo ${@}
}
```

どうやら[こちらのサイト](https://github.com/koalaman/shellcheck/wiki/SC2145)によると`${@}`ではなく`${*}`を使うべきらしいです。  
  
正確には`${@}`だと`IFS`を考慮せずそのまま連結してしまうためだそうです。  
自分も深くは理解してないので間違ってたらコメントでお願いします。
スムーススクロールの実装

#スムーススクロールとは
ページ内をスクロールする挙動のこと。
ボタンを押したらリンク先までスクロールされる。（Topに戻るなど）

#HTML
aタグ`href`でスクロール先をid指定する。

```html
    <ul class="menu">
      <li class="menu-profile ">
        <a href="#profile-box" class="menu-list">PROFILE</a>
      </li>
      <li class="menu-skill">
        <a href="#skill-box" class="menu-list">SKILL</a>
      </li>
      <li class="menu-works">
        <a href="#works-box" class="menu-list">WORKS</a>
      </li>
      <li class="menu-contact">
        <a href="#contact-box" class="menu-list">CONTACT</a>
      </li>
    </ul>
------------------------------------

<div id="profile-box" class="box">

<div id="skill-box" class="box">

<div id="works-box" class="box">

<div id="contact-box" class="box">
```


#JavaScript

```js
$(function(){
  // aタグをクリックし、href属性に # から始まるリンクが設定してあったら発動
  $('a[href^=#]').click(function(){
    // クリックしたaタグのhref属性（リンク先URI）を取得し、変数に格納
    var href= $(this).attr("href");
    // 上で取得した値が#か空白だったら'html'を、それ以外だったら先ほど取得したhref属性の値を変数に格納
    var target = $(href == "#" || href == "" ? 'html' : href);
    // 変数targetのページトップからの位置を取得し、変数に格納
    var position = target.offset().top;
    // 0.4秒でスクロール
    var speed = 400;
    // scrollTopに上で取得した位置を設定し、ヌルヌルとスクロールさせる
    $('body,html').animate({scrollTop:position}, speed, 'swing');
    // a要素のデフォルトの機能を無効化する
    return false;
  });
});
```
コミュニティユーザに2要素認証（SF_TOTP）を設定してみる

## 2要素認証（SF_TOTP）設定
### １．サンプルパッケージのインストール
■Sandbox環境
https://test.salesforce.com/packaging/installPackage.apexp?p0=04to0000000WA6J

■本番環境
https://login.salesforce.com/packaging/installPackage.apexp?p0=04to0000000WA6J

※リンクはSalesforceのHelpより取得。

### ２．ログインフローの作成
設定からログインフローを新規作成する。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559480/99ae4685-6f98-d0fc-f2d9-31c82c49ba2d.png)
※ここではユーザライセンスを「Customer Community Login」に設定。

以上。

## 動作確認
コミュニティにログイン。
![キャプチャ3_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559480/d8f4d551-3010-a08c-a491-91ea61c0a2e0.jpeg)

設定したログインフローが動き、QRコードスキャン画面に遷移。
Google認証[Google Authenticator]など認証アプリでスキャン後にトークン入力して進む。
![キャプチャ4_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559480/f3a7151c-f6a7-a946-42a1-4aa38f676198.jpeg)
※2回目以降はQRコード表示はなく、トークン入力だけ。

コミュニティにログイン。
![キャプチャ5_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559480/c18d591e-b3ab-8de8-8d6b-7234e915e653.jpeg)

問題なくコミュニティにログインできた。

## 認証システムアプリと連携を切りたい
「アプリケーション登録: ワンタイムパスワードジェネレータ」の切断を押下する。
![キャプチャ6_censored.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559480/9a03b88a-94ad-ea90-d7b8-da8a6603b130.jpeg)
※確認もなく切断されるので注意。
※この切断はSalesforce側だけの設定解除のため、必要に応じて認証アプリ側も削除する必要がある。

## 2要素認証を行うユーザを個々に指定したい
未検証だが以下2パターンがありえそう。

- 2要素認証有無でプロファイルを分ける。
- 2要素認証ロジック（TOTPPlugin.cls）をいじる。

## 画面の文言など変えたい
こちらも未検証。

- フロー「SF-TOTP」をいじる。

## うまくいかない場合
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559480/3cecaabc-696f-8a8c-4767-5570d0eeeecc.png)

「標準の Salesforce ページへのアクセスを許可」のチェックがONであるか確認する。
OFFだとエラーになる模様。標準ページを許可したくない場合はこの方法以外で検討する必要がありそう。（ログインフローをVisualforceで作りこむとか）

## 参考
https://help.salesforce.com/articleView?id=security_login_flow_examples.htm&type=5
ログインフローのサンプルパッケージ部分
Apache JMeter で大きいファイルをダウンロードする

#やりたいこと
JMeter で大容量のファイルをダウンロードするような負荷テストをしたい。
（Azure CDN を使ったファイルダウンロードの負荷テストを行いたいという要望があり調査した内容です）

#準備すべきこと
以下の条件を整えることが重要

- 64bit 版の Java をインストールする
- JVM の実行時オプションでヒープサイズを拡張する
- ヒープサイズを十分に拡張可能な実メモリを搭載する
- 64bit 版の JVM を使う
- CUI モードで実行する

#それぞれやること
##64bit 版の Java をインストールする
Java の公式サイトから、64bit 版の Java のインストーラーをダウンロードしてインストール。
手順は下記のサイトのドキュメントを参考にして、マニュアルインストールです。

https://java.com/ja/download/faq/java_win64bit.xml

##JVM の実行時オプションでヒープサイズを拡張する & 64bit 版の JVM を使う
JMeter インストール先のディレクトリにある jmeter.bat をテキストエディタで開いて、以下の部分を適宜変更。
下記の設定では、ヒープサイズを 16GB に拡張したうえ、64bit JVM を利用する設定。

```sh:before
set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m
```

```sh:after
set HEAP=-Xms1g -Xmx16g -XX:MaxMetaspaceSize=256m -d64
```

##ヒープサイズを十分に拡張可能な実メモリを搭載する
ここは、物理マシンなら財力任せですし、仮想マシンならヒープサイズよりも大きいメモリを搭載したものを選ぶのが良いでしょう。

例えば、Azure の VM だと E シリーズなどが搭載メモリ量多めで使いやすいサイズになるかな…と思います。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/ev3-esv3-series

#CUI モードで実行する
JMeter の起動時に、GUI で起動すると下記のメッセージが出るはずです。

```
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
   jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
```

GUI で jmx ファイルを生成した後、改めてコンソールから JMeter を起動しましょう。

#まとめ
上記の条件を整えれば、でかいファイルをダウンロードする類の負荷テストも JMeter で実行しやすくなると思います。（とはいえ、ヒープに確保できるメモリの量次第なので、ダメだったらごめんなさい。）

#条件が整っていないときに出るエラーたち（検索用）
JVM のヒープサイズが足りない

```
java.lang.OutOfMemoryError: Java heap space
```

64bit 版の Java がセットアップされていない

```
Error: This Java instance does not support a 64-bit JVM.
Please install the desired version.
```
DockerでGoを試す環境を作った話

# はじめに
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)をやろうと思ったんだけど、手元で試したいということがあったので、Dockerで開発環境を構築

# 完成図

```
.
├── Dockerfile
├── docker-compose.yml
└── src
    └── hello.go
```

# 作成

準備するものは以下の通り。

```
.
├── Dockerfile
└── docker-compose.yml
```

ファイルの中身

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

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

docker-composeを利用した理由は、マウントしたかったから。

# うごかす

コマンドは以下の通り。

```
# コンテナの作成と起動
$ docker-compose up -d --build

# コンテナ内に入る
$ docker-compose exec go bash

```

# Hello world

コンテナの中に入っている状態でファイル作成

```
$ touch hello.go
```
```hello.go
package main

import "fmt"

func main() {
	fmt.Println("Hello, World")
}
```

コンパイルは以下のようになる。

```
$ go run hello.go
```

# とめる

```
# コンテナから出る
$ exit

# コンテナを止める
$ docker-compose stop

# コンテナを削除
$ docker-compose down
```

# おわりに
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)を試していって、つまったところがあれば修正していきます。

# 参考

[DockerでGoの開発環境を構築する](https://qiita.com/uji_/items/8c9eda89526abe0ba900)
Vue.jsでの複数checkboxの状態管理

vueのチェックボックス管理はクセがありますよね。
例えば複数のメッセージをそれぞれチェックボックスで表示非表示制御するコンポーネントを作るとします。

```vuejs

<module :params="{1:{name:'ほげ', is_checked:true}, 2:{name:'はげ', is_checked:false}}"></module>
```

```vuejs:module.vue

<template>
<div>
    <div v-for="(param, index) in params" :key="'key_'+index">
        <div>
            <label>
                <input 
                    type="checkbox" 
                    :name="'checkbox['+index+']" 
                    v-model="conditions[index]">
                <span>{{ param.name }}</span>
            </label>
        </div>
        <div v-if="conditions[index]">
            お前が{{ param.name }}を覗き込む時{{ param.name }}もまたお前を覗いているのだ
        </div>
    </div>
</div>
</template>

<script>
export default {
    props: ['params'],
    data() {
        return {
            conditions:{}
        }
    },
    created: function() {
        Object.keys(this.params).forEach(index => {
            this.conditions[index] = this.params[index].is_checked;
        }
    }
</script>

```

以上のようにチェックボックス状態管理配列conditions[index]のbool型でチェックボックスのonoffとメッセージの表示v-ifを制御しようとしてもうまく動きません。

vueは複数チェックボックスのonoff管理をv-modelで指定する配列に該当のvalueが含まれるかどうかでやりますので

```vuejs:module.vue

<template>
<div>
    <div v-for="(param, index) in params" :key="'key_'+index">
        <div>
            <label>
                <input 
                    type="checkbox" 
                    :name="'checkbox['+index+']" 
                    :value="index" 
                    v-model="conditions">
                <span>{{ param.name }}</span>
            </label>
        </div>
        <div v-if="conditions.includes(index)">
            お前が{{ param.name }}を覗き込む時{{ param.name }}もまたお前を覗いているのだ
        </div>
    </div>
</div>
</template>

<script>
export default {
    props: ['params'],
    data() {
        return {
            conditions:[]
        }
    },
    created: function() {
        Object.keys(this.params).forEach(index => {
            if(this.params[index].is_checked){
                this.conditions.push(index);
            }
        }
    }
</script>

```

としてやると動くと思います。
Ubuntu20.04 + AX200でWiFiが認識しない問題

※内容は[ブログ記事](https://musaprg.hatenablog.com/entry/2020/07/02/134021)と同じ

WiFIモジュールがUSBを占領するのに腹が立ったので、最近AX200を買って装着しました。

非常に快適な上にBT5.0もついてて2000台はお得。

ただUbuntu20.04上でのみWiFi機能が利用できなくなる問題にぶつかったのでメモ。

## 環境

OSはUbuntu20.04LTSです。

m.2 SSDごとデュアルブートしているので、WindowsとUbuntuで2枚m.2が刺さってる構成です。

たぶんデュアルブート環境ではどの構成でも起こりうる気がします

## 原因

Windows側のFast bootが悪さをしていた。

詳しい原因については調べてないのでわかりませんが、とりあえずFast bootが原因みたいです。

ソースはここ https://bugzilla.kernel.org/show_bug.cgi?id=205299

## 対処法

Fast bootを無効にしてください。

やり方の一例はここ 

https://www.windowscentral.com/how-disable-windows-10-fast-startup
たまにしかしないので、忘れてしまう設定の覚え

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

+ [管理者は任意のユーザーとしてログインできますの設定](https://qiita.com/Keiji_otsubo/items/f6ebf294a8d5c36b6cb6)

# Sandboxを新しく作った時の設定
リリース接続の承認

[デプロイメント接続の承認](https://help.salesforce.com/articleView?id=t_changesets_deployment_connection.htm&type=5)


# システム管理者が [他のユーザとしてログイン] を使用するとログアウトする
他のユーザとしてログインして、ログアウトすると
管理者としてもログアウトされてしまって、再度ログインすることになります。

設定変更で、他のユーザとしてログアウトしても管理者として戻れるようにする。

[System administrator gets logged out when they use 'Login as User'](https://help.salesforce.com/articleView?id=000312323&language=ja&mode=1&type=1)

上の方になって見つけにくい。

![再ログインの強制.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e5ae5af0-4e43-a9b7-dd4b-e260e6b50747.png)


# 証明書の有効期限のお知らせのメールが来た場合

[Error 'You have one or more certificates in your Salesforce org that will expire soon'](https://help.salesforce.com/articleView?id=000329338&language=ja&type=1&mode=1)

記載された組織を開き、[設定] | [セキュリティ] | [証明書と鍵の管理] に移動します。
ここで、新しい証明書を作ります。


私の場合は、ほぼＩＤプロバイダで使っているので
ID プロバイダ　で証明書を変更します。

その後、証明書と鍵の管理に戻って古い証明書を削除します。

+ [SAML シングルサインオン構成の証明書の署名要求で使用している証明書の作成、更新に関して](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KDbIR)

:::note
今回期限切れが近い証明書は「IDプロバイダ証明書」ではなく、 
SAML シングルサインオン構成 の「 証明書の署名要求 」で使用されているものでした。 

Salesforce.comを ID プロバイダーとして有効化 していない為、 
下記ヘルプサイトを読む感じ、差し替えずとも影響はないように思えます。 
https://help.salesforce.com/s/articleView?id=000392854&type=1
:::

# リストビューにカスタムボタンを追加する。
残念がら私がVF Pageを使う場面です。（本当はLightningがいいんですが...あとはPDF作成も...)

忘れるのは、VF Pageの設定でLightningで使うためのチェックと
リストビューにボタンを追加する場所。


何で、Classicの検索レイアウトなんだろう。まさかと思って入れ忘れて表示できないことが多いなぁ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/91314e66-5af4-5f1b-0e17-3b95851301a8.png)


# 開発中のキャッシュ設定の無効化

[開発中のキャッシュ設定の無効化](https://developer.salesforce.com/docs/atlas.ja-jp.lightning.meta/lightning/debug_disable_caching.htm?search_text=%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5)


# その他

+ [ログイン時のデフォルト画面が設定とは違って別画面にリダイレクトされる【未解決】](https://qiita.com/Keiji_otsubo/items/5bdb45b5200381184546)
+ [salesCloudとserviceCloudの違いの説明について](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000Msk4)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/45ab8e46-7367-09c3-dec1-555b4bca9c1a.png)
Word/Excel/PowerPoint/PDFで仕様書等を外部公開する際に意図しない情報漏洩を防ぐための手順

# はじめに
仕様書等でWord、Excel、PowerPoint、PDF等の文書を顧客に送ったり、ネット上に公開したりすることも多いと思います。しかし、自分で作ったドキュメントを他人の目にさらす前に、最低限ここはチェックすべし！というところを押さえてから公開しましょう。インターネット上では一度公開してしまうと何らかの履歴が残るため、過ちはずっと履歴に記録されたままとなってしまいます( ;∀;)
そうならないように、気を付けましょう。

# Officeファイル (Word/Excel/PowerPoint) の特徴と注意点
古いタイプのフォーマット (拡張子 .doc, .xls, .ppt 等)は**OLE Compound Fileフォーマット**と呼ばれる、同じ構造を持つファイル形式です。また、Office 2007以降で採用された新しいタイプのフォーマット (拡張子  .docx, .xlsx, .pptx 等)は**Open XMLフォーマット**と呼ばれ、ZIPファイルの中にXMLファイルが格納された形式になっています。

いずれの形式の場合も、ファイルにプロパティ情報と呼ばれる属性情報が添付されており、エクスプローラでファイルを右クリックして「プロパティ」を表示させると、文書のタイトル、件名、タグ、前回保存者、作成者などの情報が自動的に保存されているのがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/d2edb1ec-a30a-2ff2-3559-0b649989b581.png)

この状態で配布すると、たとえば自分の名前とか組織の人の名前がファイルに意図せず含まれたまま、いろいろなところにファイルがばらまかれることになります。これは避けたいところです。

### 回避方法1:Office アプリケーションで「ドキュメント検査」を行う
Officeアプリケーションでファイルを開いて、ファイルタブから「バックステージビュー」で**「情報」-「問題のチェック」-「ドキュメント検査」**を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/57aaf12d-2b25-8acc-1a37-9afde3b1d042.png)

以下のようなダイアログボックスが表示されるので、「ドキュメントのプロパティと個人情報」にチェックが入っていることを確認して、「検査」ボタンをクリックします。検査が終わったら、ドキュメントのプロパティと個人情報を「すべて削除」して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/ce933f10-67da-6692-cd9e-e47c3ea6d4b1.png)

これでファイルから個人情報がすべて削除されました。


### 回避方法2:エクスプローラのプロパティから「プロパティや個人情報を削除」する
Officeアプリケーションを使わなくても、エクスプローラ上から削除する方法もあります。Windows 10であれば、ファイルの「プロパティ」の「詳細」タブに表示されている情報は、下の「プロパティや個人情報を削除」をクリックして削除できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/4456472f-9501-aa5b-4d7d-87f9b0c1d03b.png)

すべての情報を削除するか、選択した項目だけ削除するかを選びます。「OK」で確定すると、ファイルから個人情報がすべて削除されます。

# PDFファイルの特徴と注意点
PDFファイルも、ファイルの中にプロパティ情報と呼ばれる属性情報が添付されており、Adobe Acrobat Readerでファイルを開き、「ファイル」-「プロパティ」を表示させると、文書のタイトル、サブタイトル、作成者などの情報が自動的に保存されているのがわかります。(Windowsエクスプローラの「プロパティ」の「詳細」タブからは表示されません。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/68bd85cd-392b-1543-d12b-4798393491a9.png)


### 回避方法:作成するアプリケーションでPDFエクスポート時に情報を削除する
Adobe PDFから情報を削除するには、元の文書からPDFへのエクスポート時に個人情報をファイルに含めないようにします。

OfficeアプリケーションからPDFを作成する場合、**保存時の「オプション」で、「ドキュメントのプロパティ」のチェックを外します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/38b817d4-cfc2-9c5a-8df7-72ef8baccd07.png)


# おわりに
ファイルからの個人情報の削除は、ついつい忘れがちなのですが、カッコ悪いのでドキュメントを外に出す前に削除しておきましょう。変に後で追跡されることのないように...(^_-)-☆

|￣￣|￣￣|￣￣|￣|≡≡∧,,∧　ﾝﾊﾞｯ!
|￣|￣￣|￣￣|￣￣|≡∠(*'ω')／　
|￣￣|￣￣|￣￣|￣|≡≡(　　(
|￣|￣￣|￣￣|￣￣|≡..＜￣￣＼
bundle updateでfastlaneを更新できないときの対処(can't find gem rake (>= 0.a) with executable rake)

iOSアプリ開発で、bundlerでfastlaneを管理している場合の話。
bundle update fastlaneをすると以下のエラーが発生した。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
...
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
...
/Users/<username>/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0/rubygems.rb:277:in `find_spec_for_exe': can't find gem rake
(>= 0.a) with executable rake (Gem::GemNotFoundException)
	from /Users/<username>/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0/rubygems.rb:296:in `activate_bin_path'
	from /Users/<username>/.rbenv/versions/2.7.1/bin/rake:23:in `<main>'
...
An error occurred while installing digest-crc (0.6.0), and Bundler cannot continue.
Make sure that `gem install digest-crc -v '0.6.0' --source 'https://rubygems.org/'` succeeds before bundling.
```

「rakeが見つからないよ」と言われている。PCには普通にrake入れているが駄目。
Gemfileに以下の記述を追加したら解決した。

```
gem 'rake'
```
高位合成言語　karuta その２

#概要

スクリプト言語　karutaやってみた。
zundoko書いてみた。

#サンプルコード


```
shared r #8

func rnd() {
  r = r * 5 + 1
}

var n int = 0
r = 234
for var i int = 0; i < 10; i {
  rnd()
  if r < 127 {
    n++
    print("zun")
  } else {
    n = 0
    print("doko")
  }
  if n == 4 {
    i = 11
  }
}
print("doko kiyosi!!")

```

以上。
Cloud RunにGoアプリを自動デプロイ

Github
https://github.com/wmetaw/cloud-run-exec-gcloud-command

Cloud RunにGoアプリを自動デプロイ
https://www.apps-gcp.com/deploy-go-app-to-cloud-run-by-cloud-build/

```go:main.go
package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"os/exec"
)

func main() {

	http.HandleFunc("/", index)
	http.HandleFunc("/version", version)

	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("Defauting to port %s", port)
	}

	log.Printf("Linstening on port %s", port)

	err := http.ListenAndServe(fmt.Sprintf(":%s", port), nil)
	if err != nil {
		log.Fatal(err)
	}
}

func index(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "hello cloud run")
}

func version(w http.ResponseWriter, r *http.Request) {
	s, err := exec.Command("gcloud", "version").Output()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Fprintf(w, string(s))
}
```

```go:go.mod
module github.com/wmetaw/cloud-run-exec-gcloud-command

go 1.14
```

```docker:Dockerfile
FROM golang:1.14.4-alpine3.12 as builder
WORKDIR /go/src
COPY . .

RUN CGO_ENABLED=0 GOOS=linux go build -v -o main

FROM gcr.io/cloud-builders/gcloud:latest
WORKDIR /usr/local/bin

COPY --from=builder /go/src/main /main
ENTRYPOINT ["/main"]
```

```yaml:cloudbuild.yaml
steps:
  # dockerビルド
  # build -t ['イメージ名:タグ'] [DcokerFileパス]
  - name: 'gcr.io/cloud-builders/docker'
    id: 'build-docker-image'
    args: ['build', '-t', 'gcr.io/$PROJECT_ID/${_SERVICE_NAME}', '.']

  # docker imageをpush
  - name: 'gcr.io/cloud-builders/docker'
    id: 'push-docker-image'
    args: ['push', 'gcr.io/$PROJECT_ID/${_SERVICE_NAME}']

  # Cloud Runへデプロイ
  # --platformはmanaged,gke,kubernetesのいずれかを指定 see https://cloud.google.com/sdk/gcloud/reference/beta/run/deploy
  - name: 'gcr.io/cloud-builders/gcloud'
    id: 'deploy-cloud-run'
    args: ['run', 'deploy', '${_SERVICE_NAME}', '--image', 'gcr.io/$PROJECT_ID/${_SERVICE_NAME}', '--region', '${_REGION}', '--platform', 'managed']

  # Cloud Run閲覧権限付与
  - name: 'gcr.io/cloud-builders/gcloud'
    id: 'apply-member-role-cloud-run'
    args: ['run', 'services', 'add-iam-policy-binding', '${_SERVICE_NAME}', '--region', '${_REGION}', '--member', 'allUsers', '--role', 'roles/run.invoker', '--platform', 'managed']

# 変数定義
# see https://cloud.google.com/cloud-build/docs/configuring-builds/substitute-variable-values?hl=ja
substitutions:
  _REGION: asia-northeast1
  _SERVICE_NAME: exec-gcloud-command

# imagesフィールドにはCloudBuildがContainerRegistry にpushする1つ以上の Dockerイメージを指定
images:
  - gcr.io/$PROJECT_ID/${_SERVICE_NAME}
```
Selenium関連サイトまとめ

## Selenium関連サイト

毎回　Google先生にお世話になっているので、纏め

### **Selenium 公式サイト**
https://www.selenium.dev/
**Download**
https://www.selenium.dev/downloads/
**Document**
https://www.selenium.dev/documentation/en/
**日本語**
https://www.selenium.dev/documentation/ja/
### **Github**
https://github.com/SeleniumHQ/selenium
**Selenium docker**
https://github.com/SeleniumHQ/docker-selenium
**WebDriver manager**
https://github.com/bonigarcia/webdrivermanager

### 各種WebDriver
**chrome**
https://chromedriver.chromium.org/downloads
**Firefox**
https://github.com/mozilla/geckodriver/releases
**Edge**
https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/

### maven
**Selenium-java**
https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
**WebDriverManager**
https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager
iperf でネットワークパフォーマンス測定

# 事前説明

iperfとは、serverとclientでトラフィックを受け渡し、どれだけのトラフィックが流れたかを確認するツール。
iperf用のserverとclientを立てて、その間をプロトコルを指定して通信させながらスループットを測定する。
異なるOS間での測定も可能（これが便利）。

[iperf 公式ドキュメント](https://iperf.fr/iperf-doc.php)

# 環境

今回は二つのPCの間にswiching hubを置き、その間のスループットを測定した。

iperf version: 3.1.3
iperf server： Ubuntu server  18.04 LTS
iperf client： Windows10
switching hub: [netgear GS105E](https://www.amazon.co.jp/dp/B00KEXR0GA)

# 目的

switching hubを挟んだ際の、2つのPC間のスループットを測る。


# 準備

下記のようなネットワークを作る。

![iperf_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296126/3349cc8e-c29d-5c97-b5ce-aeb6ece5fc6d.png)

実際の写真は以下のよう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296126/66811e6d-f734-2984-b2f6-17d57d2f31c6.jpeg" width=50%>

まだ、iperfにはバージョンがあり、バージョンが違うとスループットを測ることができない。

```
apt install iperf # version 2系
apt install iperf3 # version 3系
```

# 実測

```:terminal
$ iperf3 -s
```

```:cmd/pwd
$ iperf3 -c 192.168.0.2
```

server側、client側両方に詳細情報が出てくる。
例えば、client側のログはこんな感じ。

```:cmd/pwd

Connecting to host 192.168.0.2, port 5201
[  5] local 192.168.0.10 port 54178 connected to 192.168.0.2 port 5201
iperf3: getsockopt - Protocol not available
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  5]   0.00-1.00   sec   108 MBytes   901 Mbits/sec  1296506930   0.00 Bytes       
iperf3: getsockopt - Protocol not available
[  5]   1.00-2.00   sec   107 MBytes   898 Mbits/sec    0   0.00 Bytes       
iperf3: getsockopt - Protocol not available
[  5]   2.00-3.00   sec   107 MBytes   899 Mbits/sec    0   0.00 Bytes       
iperf3: getsockopt - Protocol not available
[  5]   3.00-4.00   sec   106 MBytes   893 Mbits/sec    0   0.00 Bytes       
iperf3: getsockopt - Protocol not available
[  5]   4.00-5.00   sec   108 MBytes   911 Mbits/sec    0   0.00 Bytes       
iperf3: getsockopt - Protocol not available
[  5]   5.00-6.00   sec   107 MBytes   898 Mbits/sec    0   0.00 Bytes       
iperf3: getsockopt - Protocol not available
[  5]   6.00-7.00   sec   107 MBytes   896 Mbits/sec    0   0.00 Bytes       
iperf3: getsockopt - Protocol not available
[  5]   7.00-8.00   sec   108 MBytes   902 Mbits/sec    0   0.00 Bytes       
iperf3: getsockopt - Protocol not available
[  5]   8.00-9.00   sec   107 MBytes   895 Mbits/sec    0   0.00 Bytes       
iperf3: getsockopt - Protocol not available
[  5]   9.00-10.00  sec   108 MBytes   902 Mbits/sec  2998460366   0.00 Bytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  5]   0.00-10.00  sec  1.05 GBytes   900 Mbits/sec    0             sender
[  5]   0.00-10.00  sec  1.05 GBytes   900 Mbits/sec                  receiver

iperf Done.

```

## (補足) 今回、本当に知りたかったこと

目的として、netgear のスイッチでローカルポートミラーリングの際にスループットが低下しないかを実際に測定して確認したかった。
調べたら分かることなんだけど、運用していく上で本当にそこがボトルネックにならないか気になって仕方が無くなり、どうしても実地実験の結果が気になった。

今回、switchにローカルポートミラーリングの設定をして、その先に実際にパケットを送ってもスループットが低下しなかった！
良かった。
Django~ブラウザに表示させてみよう~

#はじめに
今回はDjnagoで「Hello world」をブラウザに表示させる手順を書いていきます。
Djangoを初めて触れる人は、下の記事に目を通してもらえるとスムーズに進められると思います。
[PycharmでDjangoでアプリケーションを作成する手順~準備編~](https://qiita.com/heku_777/items/0951bb1da7b664affbfb)
[Django~settings.py編~](https://qiita.com/heku_777/items/0962d426d967c4c0b016)

プロジェクト全体のディレクトリやファイルは下記のようになっています。

```
Pycharmプロジェクト
      |
      |___djangoプロジェクトディレクトリ
      |
      |___djangoアプリケーションディレクトリ__templatesディレクトリ
      |
      |___manage.py
      |
      |___その他のファイル類
```

それではいきましょう！

#プロジェクトの「urls.py」を編集

まずdjangoアプリケーションディレクトリにある、「urls.py」に移動します。
おそらくこんな感じのものが書かれているはずです。

```
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]
```
これを下のように追記してください。

```
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include('todo.urls')),
]
#ここでの「'app/'」はアプリケーション名を入れることが多いので、各自好きなものを入れてください。
```
「include」とすることで、URLの最後に「app/」と入力すると、アプリケーションの方の「urls.py」に飛んでくれます。
なぜ2つあるのかというと、プロジェクトとアプリケーションで「urls.py」を分けると、コードが見やすくなるためです。

#アプリケーションの「urls.py」の編集
次にアプリケーションの「urls.py」に書き込んでいきます。

そもそも「urls.py」とはナンジャいという方もいると思います。
一言で言うと『ブラウザに表示したいものの材料が書かれている指示書』です。
お母さんから買い物を頼まれ、その時に渡された「何を買うかのメモ」とイメージしておいてください。

デフォルトでは用意されていないので、作っていない人は作っていきましょう。

```
#アプリケーションディレクトリに移動
cd アプリケーションディレクトリ名

#urls.pyファイルの作成
touch urls.py
```
これでOKです。

作ったばかりで中身は空っぽなので、早速書いていきましょう。

```
from django.urls import path
from .views import HomeView　　　#views.pyから「HomeView」クラスを読み込んでいる。

urlpatterns = [
    path('home/', HomeView.as_view())
]
#「home/」はURl部分に入力するもの。
#「HomeView.as_view()」は、YRL部分に「home/」と入力することでviews.pyの「HomeView」を呼び出す。
```
views.pyと言われてもなんのこっちゃという感じだと思うので、次の章で解説していきます。

#「view.py」の編集
views.pyはurls.pyからの指示通りに必要な材料をかき集めてくる場所です。
お母さんから渡されたメモ通りに食材を買ってくる子供が「view.py」です。

早速追記していきましょう。
デフォルトでは下のように書かれているはずです。

```
from django.shortcuts import render

# Create your views here.
```
まずは。「# Create your views here.」この部分を削除して、次のように追記していきます。

```
from django.shortcuts import render
from django.views.generic import TemplateView #テンプレート表示に特化したもののインポート

class HomeView(TemplateView):  　　 #さっきurls.pyに読み込んだ「HomeView」クラス
    template_name = 'home.html'　　 #利用するHTMLファイルの指定
```

#「HTMLファイル」の編集
ではここからHTMLファイル編集していきましょう。
まずtemplatesディレクトリに移動します。

```
cd templates
```
templatesディレクトリの中に、HTMLファイルを作成していきます。

```
touch home.html   #〇〇.htmlと作成してください
```
作成すると中身は空っぽなので、書いていきましょう。
まず「!」とタブキーを同時に押します。
そうすると下のようなものが出てきます。

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
</html>
```
これが出て来なかった場合はコピペしてください。
その後下のように追記+変更してください。

```
<!DOCTYPE html>
<html lang="ja">    #日本語に
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Hello World</h1>　　　＃追記
</body>
</html>
```

これで準備は万端です！

#実行
では実行していきましょう！

```
python manage.py runserver
```

```
http://127.0.0.1:8000/」
```
と出てくると思うのでクリックするとブラウザに飛びます。
そこで「Hello World」と表示できていれば完璧です！

#終わりに
今回は「Hello World」を表示させる手順を紹介しました。
まずは小さなことから経験してどんどん成長していきましょう!
これからもアウトプットとして記事を書いていくのでよければ見ていってください。
[bash]ディレクトリが存在しない場合は作成。存在かつ空でない場合は警告を出力して終了する構文

よくあるシュチュエーションだと思いますが必要な判定処理・構文が端的にまとまっている記事が見つけられなかったので記載しておきます。

なお、背景として、ディレクトリが存在する場合/空でない場合に**スクリプトで自動削除（`rm -rf <ディレクトリ>`）してしまうのはパスを間違えた場合に大事故につながるので避けたい**という背景があります。（したがって手動操作が許容されるスクリプトでのみ有効）

```bash
#!bin/bash

DSTDIR=/path/to/dir

if [ ! -d $DSTDIR ]; then
  # 存在しない場合は作成（本処理へ)
  mkdir $DSTDIR
else
  # 存在して空でない場合は警告を出して終了
  if [ -n "$(ls -A $DSTDIR)" ]; then
    echo "出力先にファイルが存在します。削除してください。=> $DSTDIR"
    exit 1
  fi
fi

本処理

```

# lsの-Aオプションについて

先頭がコロンで始まるファイル・ディレクトリも表示対象となります。
例として、testディレクトリ下に`.dummy_file`と`.dummy_dir`を追加して試してみます。

```bash
$ ls test
⇒ 空
```

```bash
$ ls -A test
.dummy_dir  .dummy_file
```

```bash
$ ls -a test
.  ..  .dummy_dir  .dummy_file
```
スクロール時、グローバルメニューの固定

ポートフォリオにグローバルメニューを導入しました。

#イメージ
[![Image from Gyazo](https://i.gyazo.com/327a9c4db08b1cf247a364ba40738017.gif)](https://gyazo.com/327a9c4db08b1cf247a364ba40738017)

#HTML
JSで`#global-nav`を取得する部分が`<nav id="global-nav">`になります。

```html
  <nav id="global-nav">
    <ul class="menu">
      <li class="menu-profile ">
        <a href="#profile-box" class="menu-list">PROFILE</a>
      </li>
      <li class="menu-skill">
        <a href="#skill-box" class="menu-list">SKILL</a>
      </li>
      <li class="menu-works">
        <a href="#works-box" class="menu-list">WORKS</a>
      </li>
      <li class="menu-contact">
        <a href="#contact-box" class="menu-list">CONTACT</a>
      </li>
    </ul>
  </nav>
```

#CSS
グローバルメニューが画面上に達した時、`.m_fixed`が付与される。
`.m_fixed`が付与された時、`position: fixed;`で固定する。

```css


/* ---------------------------------------------

グローバルメニュー

------------------------------------------------ */
#global-nav {
  background: #fff;
  width: 100%;
}
#global-nav.m_fixed {
  left: 0;
  position: fixed;
  top: 0;
}

```

#JavaScript
`#global-nav`を取得し、if文でグローバルメニューが画面上部に達した時、`m_fixed`クラスの追加。
達していない時、削除の処理をかく。

[jQueryのメソッド](http://www.kantenna.com/reference/jquery/api/)

```js
var navPos = jQuery( '#global-nav' ).offset().top;  // グローバルメニューの位置
var navHeight = jQuery( '#global-nav' ).outerHeight();  // グローバルメニューの高さ
jQuery( window ).on( 'scroll', function() {
  if ( jQuery( this ).scrollTop() > navPos ) {  // もしscrollTopの位置がnavPosより大きければ
    jQuery( 'body' ).css( 'padding-top', navHeight );
    jQuery( '#global-nav' ).addClass( 'm_fixed' );  // m_fixed追加
  } else {
    jQuery( 'body' ).css( 'padding-top', 0 );
    jQuery( '#global-nav' ).removeClass( 'm_fixed' );  // m_fixed削除
  }
});
```
java.net.BindException: Address already in use: bindとなった時の対応方法

- 環境
    - Windows 10 Pro 64bit バージョン1909
    - Payara Server 5.194
    - Eclipse Version 2020-03
    - openjdk version 11

# 事象 : Payaraを起動したらエラーダイアログが表示された
```text:ダイアログメッセージ
Unable to start server due following issues:
Launch process failed with exit code 1
```

```text:Eclipseのコンソールのログ
[#|2020-07-01T16:07:06.852+0900|重大|Payara 5.194|javax.enterprise.system.core|_ThreadID=1;_ThreadName=main;_TimeMillis=1593587226852;_LevelValue=1000;_MessageID=NCLS-CORE-00019;|
  Shutting down server due to startup exception
java.net.BindException: Address already in use: bind
    at java.base/sun.nio.ch.Net.bind0(Native Method)
    at java.base/sun.nio.ch.Net.bind(Net.java:461)
    at java.base/sun.nio.ch.Net.bind(Net.java:453)
    at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
    at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80)
    at org.glassfish.grizzly.nio.transport.TCPNIOBindingHandler.bindToChannelAndAddress(TCPNIOBindingHandler.java:107)
...省略...
```
# 原因 : Payaraで使っているポートが他のアプリで使っているから

```bash
# 1. Payaraで使っているポートを確認する
$ grep -i port /c/apps/payara5/glassfish/domains/domain1/config/domain.xml | grep network-listener
          <network-listener protocol="http-listener-1" port="8080" name="http-listener-1" thread-pool="http-thread-pool" transport="tcp"></network-listener>
...省略...

# 2. ポートを使っているPIDを確認する
$ netstat -nao | grep 8080
  TCP         0.0.0.0:8080           0.0.0.0:0              LISTENING       5104
  TCP         [::]:8080              [::]:0                 LISTENING       5104

# 3. PIDを使っているアプリを確認する
$ tasklist | grep 5104
httpd.exe              5104 Services          0      1,776 K
```

## 対応 : ポートを使っているアプリを止める
ポートを使っているアプリは自動起動しているApacheだった・・・。
[Local by Flywheelを使ったときにApacheとポートが重複したので「8080」に変更したんだった。](https://qiita.com/ponsuke0531/items/7b33e7a48cb27c42fbdc)
Apacheは自動起動をやめて使うときだけ起動することにして、停止する。

1. Win + R > `services.msc` + Enter > サービスダイアログ表示
2. 対象のサービス(今回はApache)を選択してダブルクリックでダイアログ表示
3. [スタートアップの種類]で「手動」を選択
4. [停止]ボタンでサービスを停止
5. [OK]ボタンでダイアログを閉じる
高位合成言語　karuta

# 概要

スクリプト言語　karutaやってみた。
fizzbuzz書いてみた。

# サンプルコード


```
for var i int = i; i < 101; i++ {
  var s int
  var l int
  var m int
  s = i - (i / 15) * 15
  l = i - (i / 5) * 5
  m = i - (i / 3) * 3
  if s == 0 {
    print("fizzbuzz")
  } else if l == 0 {
    print("buzz")
  } else if m == 0 {
    print("fizz")
  } else {
    print(i)
  }
}
```

以上。
Vue.js導入方法

# 導入前に

```
$ node -v
$ npm -v
```

上記をターミナルで打ち込んで何も出ない人は見てください

# 導入 ( node, npm )
Macの方は<a href="https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09" target="_blank" rel="noopener">こちらのサイト</a>を参考してください

Windowsの方は<a href="https://qiita.com/maecho/items/ae71da38c88418b806ff" target="_blank" rel="noopener">こちらのサイト</a>を参考してください

# 導入 ( Vue-cli, vue )
```
$ npm install -g vue-cli
```
以上のコマンドを打ち込んでください

```
$ vue -V
```
と打ち込んでversionが表示されれば完了です
C言語の関数型と関数ポインタ型の話

C言語には、代入可能な変数で使う関数ポインタ型の他に、**関数型**も存在します。
関数型は、関数プロトタイプ宣言における、関数(変数)のための型です。

関数定義出現前に関数を呼び出すとき使用する関数プロトタイプ宣言は、変数宣言と同じく、C言語の**宣言文(declaration)**の一つです。

```c
/* 関数ポインタ型変数宣言文 */
int (* add_p)(int, int);

/* 関数プロトタイプ宣言文 */
int add(int, int);
```

ちなみに、この関数名の`add`も、C言語のシンタックス上では変数ですが、**代入は不可能**なものです(セマンティックでのエラー)。

---

そして`typedef`文も、宣言文です。関数ポインタ型と関数型の`typedef`宣言は以下のようになります。

```c
/* 関数ポインタ型のtypedef宣言文 */
typedef int (* op_p)(int, int);

/* 関数ポインタ型のtypedef宣言文 */
typedef int op_t(int, int);
```

`typedef`宣言で定義された**`typedef`名**を用いて、先程の関数ポインタ型変数宣言文と関数プロトタイプ宣言文を記述することができます。

```c
/* 関数ポインタ型変数宣言文 */
op_p add_p;

/* 関数プロトタイプ宣言文 */
op_t add;
```

後者のプロトタイプ宣言のために`typedef`を用いる事例は少なく、その存在を知らない人も多いかもしれません。

---

また、関数型の`typedef`名を用いることで、関数ポインタ型を導出する事もできます。

```c
/* 関数ポインタ型変数宣言文 */
op_t * add_p;

/* 関数ポインタ型のtypedef宣言文 */
typedef op_t * op_p;
```

ただし、関数型自体に`const`や`volatile`(、`restrict`)といった**型修飾子(qualifier)を併用することは仕様上は禁止**です。もちろん、そのポインタについては、型修飾子をつけることは可能です。

```c
/* 正しくない変数宣言文 */
const op_t * add_p = 0;

/* 正しい関数ポインタ型変数宣言文 */
op_t * const add_p = 0;
```

前者は、gccもclangも、コンパイルエラーではなくwarningレベルでした。
(ポインタの対象の型についたconst修飾は、代入では(やはりwarningありで)無視するからだろう)

---

関数型や関数型変数(プロトタイプ宣言)を、`sizeof`で利用することは不正です。

```c
/* 不正 */
size_t ftsize = sizeof (int (int, int));

int add(int, int);
/* 不正 */
size_t fsize = sizeof add;
```

gccもclangもどちらもwarningを出すにとどまり、実行した時の結果は1になりました。

---

代入できないので、関数型は、関数の戻り値型や`struct`/`union`のメンバーとしては使用できません。

しかし、関数の引数では、関数型の引数を記述できます。
これは、関数の引数の配列型がポインタ型扱いになるのと同様、関数の**引数の関数型もポインタ型扱い**になるためです。

```c
/* opは関数ポインタ型 */
int apply(int op(int, int), int v) {
  return (*op)(v, v);
}
```

```c
typedef int op_t(int, int);

/* opは関数ポインタ型 */
int apply(op_t op, int v) {
  return (*op)(v, v);
}
```

----

参考: 警告なしコンパイル&実行可能な、関数型使用のコード例

```c:func-type-example.c
/* cc -std=c89 -pedantic -Wall -Wextra func-type-example.c */

/* types for function (prototype)  */
typedef int op2_t(int, int);

/* function prototype declaration with typedef types */
static op2_t add, sub;

/* types for function pointer */
typedef op2_t * op2_ptr1;
typedef int (* op2_ptr2)(int, int);

/* function type in parameter as function pointer type */
static int apply(op2_t op, int a, int b) {
  return (*op)(a, b);
}

extern int main() {
  const op2_ptr1 padd = &add;
  op2_t * psub = &sub;
  return padd(10, apply(psub, 2, 3)); /* echo $? => 9 */
}

/* K&R C style definition */
int add(a, b) int a; int b; {
  return a + b;
}

/* ANSI C style definition */
int sub(int a, int b)  {
  return a - b;
}
```
【Unity】「1 exception was raised by workers」 の直し方

どうもマカロンです。

ここではUntiyで「1 exception was raised by workers」というエラーが出てしまった人たちを助けるために私がnoteの方で書かせていただいた記事を紹介させていただきます。

[Unity エラー「1 exception was raised by workers」との死闘 ](https://note.com/08_14/n/n4b7828dddac4)

[【完全版】続・Unity エラー「1 exception was raised by workers」との死闘 ](https://note.com/08_14/n/n9d709a92a7cb)


全5項目紹介していますので、エラーが出てしまっている人はぜひ確認してみてください！！
【Laravel】自作ヘルパー

# ヘルパーを自作する
ページのタイトル名を返すヘルパーを例にヘルパーの作り方を説明してみる
手順は以下のとおり

　1. helpers.phpを作成
　2. composer.jsonへの追加
　3. composer dump-autoload コマンドの実行

# 手順1
appフォルダ以下にhelper.phpを作って、作りたいヘルパーを定義

```php:app/helper.php
<?php
function full_title($title=null) {
    $app_name = config('app.name', 'Laravel');
    if ($title != null) {
        return $title . ' - ' . $app_name ;
    }
    return $app_name;
}
?>
```

# 手順2
composer.jsonのautoloadの項目にヘルパーを定義したファイルのパスを追加

```json:composer.json
"autoload": {
        ...(省略)...
        "files": [
            "app/helpers.php"
        ]
    }
```

# 手順3
composer.jsonにパスを追加しただけでは機能しない
以下のコマンドを実行

```zsh
% composer dump-autoload
```

# 使用例
```php
<title>full_title('Home')</title>
```
上の例では「Home - Laravel」といったタイトルになる

# おわり
簡単でしたね
Laravel側で用意しているヘルパーがたくさんあるので、[Readouble](https://readouble.com/laravel/7.x/ja/helpers.html)を一読してみてはどうかな？
cypressでiframeの要素を検証する方法

# iFrame内の要素を検証したかった

 - 必要な設定

```json.cypress.json
{
  〜〜他の設定〜〜
  "chromeWebSecurity": false
}
```


```hoge.spec.js
const getIframeDocument = (attr, value) => {
  return cy
  .get('iframe[' + attr + '="' + value +  '"]')
  .its('0.contentDocument').should('exist')
}

const getIframeBody = (attr, value) => {
  return getIframeDocument(attr, value)
  .its('body').should('not.be.undefined')
  .then(cy.wrap)
}

context('hogeTest', () => {
  beforeEach(() => {
    cy.visit('https://hogetest/url')
  });

  it('iFrame内', () => {
    getIframeBody('id' ,'iframe_id').find('#iframe_in_element_id').should('not.exist')
    cy.get('#show_iframe_button_id').click()
    getIframeBody('id' ,'iframe_id').find('#iframe_in_element_id').should('exist')
  }) 
})
```

フレームで異なるドメインの要素をjavascriptで操作するのは大きなセキュリティホールになる、とガンダ○ルフが言っていた

https://www.cypress.io/blog/2020/02/12/working-with-iframes-in-cypress/

ちなみにcy-data属性である必要はない。
でもidとかはcssとかでいじったりする可能性があるかもしれないので、data属性に逃すのがベストプラクティスなんだと上司が仰っておった（神〜）


ちなみに引用URLの中身を少しいじって、呼び出す側からhtml属性も指定できるようにしました。
idでもclassでもいけるだろうけど、idしか試してないから他の属性でできるかどうかは適当にテストしてください。


もっと強くなりてェなァ...
error creating aufs mount: invalid argument

I ran into this error while preparing docker-in-docker.

```
WARN Couldn't run auplink before unmount /var/lib/docker/aufs/mnt/*: exit status 22 
ERRO Handler for POST /v1.30/containers/create returned error: error creating aufs mount to /var/lib/docker/aufs/mnt/*: invalid argument
```

In my case, I just needed to add `VOLUME /var/lib/docker` to the Dockerfile for outer docker image. In this way we can set `Backing Filesystem: extfs` (in `docker info`).
HighSierra Server.appのWikiコンテンツを別のHighSierraマシンに移行する手順

###本当のタイトル：運用中のHighSierra ServerAppのWikiコンテンツをVitualBoxでビルドしたHighSierra仮想マシン上でWikiサービスを再開するまで、その2

Appleにより提供されていたServerAppは、バージョンアップを重ねるごとに、その機能の多くを捨てていきました。Wikiサービスもその一つです。https://developer.apple.com/support/downloads/macOS-Server-Service-Migration-Guide.pdf にて、静的HTMLファイルやWordPress形式に変換する方法が提示されました。しかし試しにやってみたところ、その見た目は、運用に耐えません。
そこで、社内への仮想HighSierraマシンによるWikiサービス継続提供を試みました。

##前提
- [手順その1を参照](https://qiita.com/rubyist_yasunao/items/ef33c2c2ba261c93a4bb)：VirtualBoxにて旧サーバと同じOSバージョンのHighSierra仮想マシンが稼働している
- コンテンツの移行だけであれば、実機のHighSierraマシンでも同じ手順でいけます。

### 仮想マシンのネットワーク設定
- システム環境設定のネットーワ設定でIPアドレスを適切に設定してある（ユーザー端末が同じセグメントまたはルーティングされている）
- ルーターアドレス、プロクシーサーバなども適切に設定してある
- ユーザー端末よりpingが通る

##仮想マシン上に古いServer.app 5.6.3をインストールする
- HighSierra仮想マシンにて、AppStoreを起動する
- 購入済みタブからmacOS Serverが見えます
- このピクチャーだとアップデートになっていますが、実際にはインストールボタンとなっています。
- インストールすると、「HighSierraでインストールできる最新のサーバをインストールするか？」という類のダイアログがでます。インストールする。
- めでたく5.6.3がインストールされます
![](https://paper-attachments.dropbox.com/s_9311FBE03F92B5DCB05DDE7622B758D7241EF54104372949C4BFC212DE288C65_1593583539076_AppStore.png)

##Wikiサービスを開始する
- アプリケーションよりServerを初めて起動する
- サーバー管理者の名前（ログインしているログイン名がデフォルトで入力されています）とパスワードを設定する。
- 初期設定プロセスに少し時間がかかります
- メニューバー：表示：Wikiを選択します→左タブサービスにWikiが追加され→Wiki設定画面が表示されます。
- 設定画面右上のスイッチをオンにする
- ほかの端末のサファリからURLにIPアドレス（例：192.168.84.176）を入力するとwikiが表示されることが確認できます。
- この時点でコンテンツは空っぽです
![](https://paper-attachments.dropbox.com/s_9311FBE03F92B5DCB05DDE7622B758D7241EF54104372949C4BFC212DE288C65_1593584096114_Wiki.png)

##旧サーバから新サーバ にWiki を移動する
###条件
- OS、Server.appともに全くバージョンナンバーが同じである

###旧サーバのWikiコンテンツをファイルにエキスポートする
- ターミナルを開く

```
  $ sudo wikiadmin export -all -path /Library/Server/Wiki/Save
```

- これで、Saveディレクトリにコンテンツがエキスポートされます
- コンテンツ量によっては時間がかかります。
- 外付けハードディスクにSaveをコピーしておく

###新サーバへデータをインポートする
- HighSierra仮想マシンに外付けハードディスク（名称例：ExternalHD）を接続、認識されるはずです。
- ターミナルより以下のコマンドを実行する

```
  $ sudo chown -R _teamsserver /Volumes/ExternalHD/Save
  $ sudo wikiadmin import -all -path /Volumes/ExternalHD/Save
```

- かなり時間がかかります。昼寝でもしましょう。

###Wikiコンテンツのアクセス権を設定
- 仮装マシン上のServerアプリには、管理者しかユーザーおよびグループが登録されていません
- これまでの運用にそって、必要なアカウントおよびグループを作成しましょう。
- wikiドキュメント個々にアクセス権データを再設定しましょう。

----------

以上で、仮想マシン上で過去のコンテンツのWikiサービスを提供できるようになりました。
AppleのServer.appで提供してたWikiコンテンツの行く末に絶望を感じていた方々に希望の光を灯せれば幸いです。
これでプロフェッショナルでない私でも、オンプレミスのサーバー機のOSアップデートがあろうと、経年劣化に対応するために新しいMacを購入しようとも、VirtualBoxとこの仮想マシンのイメージファイルさえあれば、サービスを継続できる（はずです）。感謝。

##余談

アクセス権設定と検索可能な文書情報蓄積システムに、どのプラットホームを採用するかは、非常に難しい問題です。どれもサービス提供終了の可能性があるからです。10年前は社内機密文書をクラウドで保存することにためらいを感じオンプレミスでサービスを構築しました。
[Qiita Team](https://teams.qiita.com) ,NotePM、Confluence、Fleekdrive、ASTRUX SaaS、Documal SaaS、楽々Document Plus、Dropbox Business、box、Knowledge、WordPress、Github、自作Railsシステム、原始的にファイル保存、みなさんはどうしていますか？
NavigationController下においての画面遷移

#1つ前の画面に戻る

```ruby:swift
    @IBAction func calendarButton(_ sender: Any) {
        self.navigationController?.popViewController(animated: true)

    }
```

#階層のトップ画面に戻る
```ruby:swift
    @IBAction func walkButton(_ sender: Any) {
        self.navigationController?.popToRootViewController(animated: true)
    }
```
WidgetKitノート

WWDC20を見て、`WidgetKit`にキャッチアップしたので、基礎知識をまとめます。
これからキャッチアップしたいよ、という方に向けたノートです。

### 構成要素

- kind: ウィジェットは1アプリに対していくつかつくれる（たとえばStockアプリのリスト表示、チャート表示など）
- configuration: ウィジェットの基本設定
    - StaticConfiguration: ユーザーがカスタマイズ不可の静的デザイン
    - IntentConfiguration: ユーザーがカスタマイズ可能な動的デザイン
- supportedFamilies: systemSmall/systemMedium/systemLarge
- placeholder: Default Content but no user data

### Snapshot

- Widget Galleyに並ぶスクリーンショット的なView（正確にはスクリーンショットではない）

### Timeline

- ウィジェットの更新タイミング
- ウィジェットの更新タイミングも三種類
- Timeline.ReloadPolicy: after(Date), atEnd, never
- atEndはデフォルトでfetchされたら（タイミングは自分で指定）、afterは指定した時間以降、neverは更新しない
- WidgetCenterのメソッドを使うことで開発者の任意のタイミングでreloadが可能（バックグラウンド）
- サーバー通信が必要なときはURLSessionも使える

### 機能ガイドライン

- ウィジェットはミニアプリではない
- スクロール不可
- 動画不可
- タップしたら表示している情報に関連するアプリ内の詳細Viewに飛ぶ
    - そのためにWidgetURLとLinkという新APIが追加されている
- ウィジェットはホーム画面でライブ更新するものではないので、毎秒reloadするような頻繁な更新はやめて、適切なreloadタイミングを設定すること

### 参考
[Meet WidgetKit](https://developer.apple.com/videos/play/wwdc2020/10028)
[Widgets Code-along, part 1: The adventure begins](https://developer.apple.com/videos/play/wwdc2020/10034)

「Meet WidgetKit」を見た後で、「Widgets Code-along」に移る順番がオススメです。
（僕は逆に見てしまったせいで）前提知識の説明なくて困惑しました）
AWS EC2 AmazonLinux 2でGitHubからクローンしたdocker-compose.ymlを動かす


お気軽検証環境を作る必要があったのでその時のメモ。
プルするときに毎回パスワード聞いてくるようにしたかったのでcloneは意図的にhttpsを使っています。

## EC2
### 前準備

```
$ sudo yum update
```

### Gitのインストール

```
$ sudo yum install git
...
$ git version
git version 2.23.3
```

### GitHubからクローン
```
$ git clone https://github.com/xxxx/xxxx.git
Cloning into 'xxxx'...
Username for 'https://github.com': // ユーザー名の入力
Password for 'https://xxxx@github.com': // パスワードの入力
```

### Dockerのインストール
```
$ sudo amazon-linux-extras install docker
...
$ sudo service docker start
```

### docker-compose のインストール
```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
...
$ sudo chmod +x /usr/local/bin/docker-compose
...
$ docker-compose --version
```

### 起動

```
$ docker-compose up -d
```


「ERROR: Couldn't connect to Docker daemon」が発生する場合

[DockerでCouldn’t connect to Docker daemonが出る場合の原因と解決方法](https://www.virment.com/how-to-fix-couldnt-connect-to-docker-daemon/)
[ユーザをdockerグループに入れる](https://qiita.com/tifa2chan/items/9dc28a56efcfb50c7fbe)

```
$ sudo usermod -aG docker $USER
```
起動時に「no space left on device」が発生する場合

[EC2のボリュームを増やす](https://qiita.com/HideM/items/53158ccb528d115daf57)
文字列から指定の文字以降を削除する


```
str = "A30-60_10000"
```

### 後ろを消す
```
str.sub(/_.*/, "")
```
結果↓

```
=> "A30-60"
```

### 前を消す
 ```
str.sub(/.*_/, "")
```
結果↓

```
"10000"
```

参考
https://qiita.com/flmil/items/8cbfbf49844ddef79000
Swift UITextField

今回はTextFieldの使い方です

TextFieldは選択すると文字を入力できるものですね

今回もUIの接続をしたところから解説していきます

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func button(_ sender: Any) {
    }   
}
```

接続後のコードです

まずは`textField`に入力した文字を`button`を押した時に`label`に表示するようにしていきましょう

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func button(_ sender: Any) {
        label.text = textField.text
    }   
}
```

これで`label`に文字を表示できます
しかし、このままではキーボードが表示されたままになってしまいます
なので、キーボードの`return`を押した時にキーボードを閉じるようにします

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self   //追記
    }

    @IBAction func button(_ sender: Any) {
        label.text = textField.text
    }   
}

//以下を追記
extension ViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
    }
}
```

`textField.delegate = self`でdelegateを設定してあげます
delegateについてはいづれ記事を書きます
delegateを設定すると`UITextFieldDelegate`を継承して！と言われるので`fix`を押してもいいですし、extensionで拡張してから書いてもいいです
あとは決まり文句みたいなものだと思って書いてください

雑な解説になってしまいすみません
今回はこれで終わります