OmniAICreator/Qiita-1.07M huggingface dataset:
オブジェクトの配列から 特定プロパティの値が重複した要素を取り除く方法


# オブジェクトの配列から 特定プロパティの値が重複した要素を取り除く方法

Typescriptで書いているので、JSで実行する場合は型宣言を消すこと。


``` ts
const users = [
    {
        name : "tanaka",
        age : 23,
    },
    {
        name : "yamada",
        age : 45,
    },
    {
        name : "tanaka",
        age : 23,
    },
    {
        name : "suzuki",
        age : 56,
    },
    {
        name : "takahashi",
        age : 23,
    },
    {
        name : "suzuki",
        age : 56,
    },
]

// 上の配列から 以下の配列を得たい

const expectation = [
    { name: 'tanaka', age: 23 },
    { name: 'yamada', age: 45 },
    { name: 'suzuki', age: 56 },
    { name: 'takahashi', age: 23 }
]
```

suzuki と tanaka が 重複しているのでそれを取り除いた配列を得たいという需要に応えるものです。
メモを作って重複を取り除く実装(+Mapをつかったテクニック)です。

※ nameはアプリケーション仕様でユニークキーであるという前提です。

### 配列をメモとして使うパターン 対象が少ない場合は場合は問題ない(線形走査 なので遅い

``` ts
const nameMemo : string[] = []
const uniqueUsers1 = users.filter((user) => {
    if(!nameMemo.includes(user.name)){
        nameMemo.push(user.name)
        return true
    }
    return false
})

console.log(uniqueUsers1)
```

## Setを使うパターン 対象が非常に多い場合

``` ts
const nameMemoSet : Set<string> = new Set()
const uniqueUsers2 = users.filter((user) => {
    if(!nameMemoSet.has(user.name)){
        nameMemoSet.add(user.name)
        return true
    }
    return false
})

console.log(uniqueUsers2)
```

## メモのスコープが広い事が気になる場合は 即時実行関数式(IIFE)にすると良い。

### 配列パターン

``` ts
const uniqueUsers3 = users.filter((memo => (user:typeof users[number]) => {
    if(!memo.includes(user.name)){
        memo.push(user.name)
        return true
    }
    return false

})([] as string[]))

console.log(uniqueUsers3)
```

### Setパターン

``` ts
const uniqueUsers4 = users.filter((memo => (user:typeof users[number]) => {
    if(!memo.has(user.name)){
        memo.add(user.name)
        return true
    }
    return false
})(new Set<string>()))

console.log(uniqueUsers4)
```

コードは書いていないが、ユニークなキーがオブジェクトのキーになれる値であればObjectのキーをメモにする事もできる。



### Mapを使った方法、Mapのキーが重複出来ないことを利用している。

一見しただけだと要素を絞り込んでいるように見えないため好みが分かれそう。

``` ts
const uniqueUsers5 = [...( new Map<string,typeof users[number]>( users.map(user => [user.name , user ]) )).values()]

console.log(uniqueUsers5)
```
Vue CLIでプロジェクトを作る方法

#プロジェクト作成で参考にした記事を紹介

目的はローカルサーバーを立ち上げて以下の画面を出すこと
![スクリーンショット 2020-07-16 12.58.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/dd2de922-33b3-3745-b0a2-fb67d9ded3b8.png)

参考記事
①https://www.monster-dive.com/blog/web_creative/20180608_001789.php
②https://ajike.github.io/install-vue-cli/

①のアプリ開発をしたいと思い、最初に試したが、

```
vue init webpack
```
をコマンドで入力するとエラーになった。

②の

```
vue create [プロジェクト名]
```
の手順から始めたところ無事画面が表示された。

2020/7/24追記
久々にvue cliを使用しようとして、ターミナルでvueコマンドを打つとcommand not foundとなってしまった。
アンインストールしたり、npmを更新しようと試みるも失敗、、

###解決方法
どうやらパスが合っていなかった様子。
https://qiita.com/masakun1150/items/01b231f48ee6a8d8899d
こちらの記事の方法で解決

```javascript

npm bin -g
/Users/xxxxxxx/npm/bin
```
これでパスを通す内容を確認

```javascript
$ export PATH=/Users/xxxxxxx/npm/bin:$PATH
```

これでパスを通す。

#Vue CLIインストール時にviewsフォルダが作成されない件

```
vue create [プロジェクト名]
```

をした後にデフォルトではなく任意設定を選択する。
そこで元から選択されている「BabelとLinter / Formatter」に追加して「Router」も選択する。
参考：https://qiita.com/azukiazusa/items/fd82b3c35929add9dafe

その他の設定はひとまず全てエンターで問題なさそう。

#Vuetifyのインストール
作業ディレクトリ内でターミナルを開き

```
vue add vuetify
```

を入力。基本はエンターで進めれば良さそう
参考：https://vuetifyjs.com/ja/getting-started/quick-start/


#vuexのインストール
インストールしたいプロジェクトのディレクトリへ移動しターミナルで

```
vue add vuex
```

でインストール可能

Vue CLIでcreateする際にデフォルトではなく、カスタムでvuexを選択すると同様にインストール可能

インストールされると以下のファイルが作成される
<img width="305" alt="スクリーンショット 2020-08-06 14.40.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/ad9fa779-3e73-c12e-bbb3-e4b31eaa1b21.png">

#作成したディレクトリをGitHubにpushする方法
以下の記事に記載あり
https://kirikko-scondcube.hatenablog.com/entry/2020/06/29/134515

```
git init 
git add .
git commit -m "add new file"
git remote add origin [ギットハブのリポジトリのURL]
git push origin master
```

エラーが出なければ上記手順でpush可能


#yarnのインストール
npmの代わりにyarnを使用する場合、vue cliをインストールした後、対象のアプリのディレクトリへ移動しインストールする

```
//Project setup
yarn install

//Compiles and hot-reloads for development
yarn serve

//Compiles and minifies for production
yarn build

//Lints and fixes files
yarn lint
```

基本使うだけなら yarn installでインストールし、yarn serveでサーバーを立ち上げるのみ使えば良い
仮想ホストに割り当て可能なネットワークアダプター数 

#仮想ホストに割り当て可能なネットワークアダプター数

■Hyper-V 　

8個　(レガシネットワークアダプターを使えば12個)

■esxi6.5

10個


※何も考えず、仮想ルータにNIC追加をしていて引っ掛かってしまった。
　タグ付きのままゲストに流すのが吉かな。
MaterialColorsクラスを使ってattrの色を取得したり色を重ねる

material-components-android 1.2.0-alpha06 より `MaterialColors` というクラスが正式に使えるようになりました。(これまでは `@RestrictTo(LIBRARY_GROUP)` がついていた)
`MaterialColors` を使うと何ができるのかを紹介したいと思います。

### Recap
- `MaterialColors#getColor` で R.attr の色を取得できる
- `MaterialColors#layer` で background と overlay の重ねた(**not blend**)色を取得できる
- `MaterialColors#compositeARGBWithAlpha` で ARGB の色に対して alpha 値を追加した色を取得できる


### MaterialColors#getColor

- これまでプロジェクトで拡張関数作っていたであろう R.attr の色を取得処理がこれでできる

```kotlin
val primaryColor = MaterialColors.getColor(view, R.attr.colorPrimary)

val primaryColor = MaterialColors.getColor(context, R.attr.colorPrimary, "the attribute is not set in the current theme" /* errorMessageComponent */)

val primaryOrDefaultColor = MaterialColors.getColor(context, R.attr.colorPrimary, defaultColor)
```

### MaterialColors#layer

- background と overlay の重ねた色が取得できる
- overlay には alpha 値を設定することもできる
- あくまで overlay を重ねるので、透過していない overlay を使うと overlay の色がそのまま取得される
- DarkTheme の Elevation overlay もこれで色が作成できる  
(基本的には `MaterialShapeDrawable#createWithElevationOverlay` を使うことの方が多いはず)

```kotlin
// primary をベースに 54% の surface が重なった色
MaterialColors.layer(view, R.attr.colorPrimary, R.attr.colorSurface, 0.54F))
```

### MaterialColors#compositeARGBWithAlpha

- ARGB の色にさらに alpha を追加できる  
- 変更ではなく追加なので #00000000 に対して 255 の alpha を設定しても透明のまま

```kotlin
MaterialColors.compositeARGBWithAlpha(color, 127 /* Int alpha */)
```
[Xcode]iOSプロジェクトでのMakefileとMintfileのサンプル

# Makefile

```Makefile:Makefile
PRODUCT_NAME := HogeProject
GITHUB_TOKEN := hogehogehogehogehogehogehogehogehogehogehogehoge

.PHONY: bootstrap
bootstrap:
	brew update
	brew install libxml2
	brew install mint
	mint bootstrap
	bundle install

.PHONY: update
update:
	mint bootstrap
	bundle update
	mint run SwiftGen swiftgen
	mint run XcodeGen xcodegen
	bundle exec pod update
	mint run mono0926/LicensePlist --output-path ./${PROJECT_NAME}/Settings.bundle --github-token ${GITHUB_TOKEN}

.PHONY: project
project:
	mint run SwiftGen swiftgen
	mint run XcodeGen xcodegen
	bundle exec pod install
	mint run mono0926/LicensePlist --output-path ./${PROJECT_NAME}/Settings.bundle --github-token ${GITHUB_TOKEN}

```

# Mintfile

```Mintfile:Mintfile
yonaskolb/XcodeGen@2.16.0
mono0926/LicensePlist@2.16.0
SwiftGen/SwiftGen@6.2.0
realm/SwiftLint@0.39.2
```

# 感想

アドバイスください
node.jsやVue CLI インストール時パスがわからなくなったり、変になった時の対処法 

#node.js と Vue CLI インストール時にパスが通らなくて沼にハマった話

node.js をインストールした後、Vue CLIをインストールしようとしたら、うまくインストールされなかった。
→パスの変更をしたら、npmコマンドが使えなくなり困った。
その時の対処法です。

ちなみにパスがうまくいかなくなった原因はVue CLIがインストール出来ない時に
パスの変更をしたこと。
[gulpインストール後にgulp: command not foundのエラー](https://qiita.com/baby-0105/items/18715f1b2df5c4594e8a)
上記記事を参照。パスの変更に役立つ（私のようにパスを理解していないものはこのように変更すると沼にハマるので注意）


##変更してしまったパスの確認と元に戻す方法
参考記事:https://teratail.com/questions/179666

上記記事のように

```
echo $PATH
```
 で現在のパスを確認し

「/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:」が PATH に含まれていなければ、以下のコマンドを実行で解決した


```
echo export PATH='/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH' >> ~/.bash_profile
source ~/.bash_profile
```

echo $PATHって偉大だなー
FortranからPythonを無理やり実行する

#Fortranなんてやってられるか！！！

大学の講義でFortranやっているんですけど、めちゃめちゃめんどくさい。こんなことやってないで、モダンに書きたい(Swift大好き人間)。この前、弊学ロボット系の教授が「授業でFortranやっているんですけど、使いますか？」っていう質問に「少なくともうちの研究室ではFortranはもう使わないよwww」って答えていたし。じゃ、少なくとも私のこれからの進路では使わないなぁ...

でも、Fortranの講義の課題では.f90ファイルを提出しなければならない。じゃあ、Fortranから好きな言語を呼び出せれば良いのでは？？？？

というわけで、試しにPythonのコードをFortranのコードから呼び出してみる。
#コード
これはsystem(シェルをFortranから叩けるやつ)を用いて無理やり同階層にあるPythonを実行しています。

```fortran:callpython.f90
program callpython
  call system("python called_python.py")
end program callpython
```


```python:called_python.py
#!/usr/bin/env python
print "message from python code!!"
```

実行方法は通常の.f90と同じく

```
$ gfortran callpython.f90
$ ./a.out 
```

出力結果はこれ

```
$ message from python code!!
```

#次は...

値の受け渡しができたらいいですね
Vuetifyのv-btnのアルファベットが大文字になるのはなぜ？

# Vuetifyのv-btnのアルファベットが大文字になるのはなぜ？

## マテリアルデザインの仕様である

[Button anatomy - Material Design](https://material.io/components/buttons#anatomy)
[Button Text button - Material Design](https://material.io/components/buttons#text-button)

マテリアルデザインでは基本的にボタンのテキストにはアッパーケースのアルファベットを用います。
こちらを元にVuetifyではcssで`text-transform`でアルファベットを大文字に変えています。

![スクリーンショット 2020-07-16 12.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206542/b980296b-d7f3-9428-20cd-d7b5d9289815.png)


## 解決法1. CSS

[How to make the global text not uppercase/capitalize - GitHub](https://github.com/vuetifyjs/vuetify/issues/1443)

特定のコンポーネント全体に適用したい場合は`style`に下記を指定して上書きする。

```vue

<style scoped>
*{ text-transform: none !important; }
</style>
```

私のおすすめはVuetifyの`v-btn`をそのまま使わずに`SubmitButton.vue`のようなファイルを作り、
そのコンポーネント内にスタイルを当てる方法をおすすめします。

## 解決法2. Vuetifyのclassの指定

[Text and typography Text transform - Vuetify ](https://vuetifyjs.com/ja/styles/text-and-typography/#text-transform)

下記が利用例になります。
ご覧の通り大文字化を防ぐスタイルが当てられているのではなく、**先頭大文字にするスタイルが当てられている**点に注意してください。

```vue
<!-- 表示: 「Submit」 -->
<v-btn class="text-capitalize">Submit</v-btn>

<!-- 表示: 「Submit Low Text」 -->
<v-btn class="text-capitalize">Submit low text</v-btn>

<!-- 表示: 「Submit TextTest」 -->
<v-btn class="text-capitalize">Submit testTest</v-btn>

<!-- 表示: 「Submitボタン」 -->
<v-btn class="text-capitalize">submitボタン</v-btn>
```
【インデックス】

##インデックス検索

テーブルからデータを検索して引っ張ってくる際に任意のカラムの検索速度を向上させる方法がインデックスです。

nameやemailなどしょっちゅう検索されるカラムに関しては設定しておくことでパフォーマンスを向上させることができます。

以下にインデックスを設定する方法を記述していきます。


<img width="640" alt="index.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/3003a5e4-e095-8d7a-37ce-31ada4218900.png">


上の画像のようにマイグレーションファイルを作成して、そこにインデックスに追加させたいカラムを記述していきます。

今回の場合であれば、scoresというテーブルのnameカラムにインデックスを設定したいので、add_index :scores, :nameとすれば設定できます。


またインデックスを複数設定したい場合は

<img width="584" alt="index2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673286/c880f4ec-fc3a-041e-634a-4b46fe5b7d3d.png">

このように配列形式で記述をします。
今回の場合であれば、nameとemailカラムにインデックスを設定したことになります。

記述後にマイグレートして変更を反映させれば設定完了です。
UiPath：比較（.CompareTo()メソッド）の話

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

開発を進めていくと、条件分岐で処理の流れを制御しますね？この場合、下図にあるように、「条件分岐」アクテイビティとか、「フロー条件分岐」アクテイビティ中の**Condition**に条件を書いていくわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/b1f3ea58-71ef-e09b-3c3b-866b3f1013e7.png)

まぁ、比較に関して言うと、一般的に以下の状態があるわけでして。。。

|状態|別表現|記述|
|:-----------------|:-----------------|:------------------:|
|AはBより大きい|大（だい）なり|A>B|
|AはB以上|大なりイコール|A>=B|
|AはBと一致|イコール|A=B|
|AはB以下|小なりイコール|A<=B|
|AはBより小さい|小（しょう）なり|A<B|
|AはBと不一致|不一致|A!=B|

####こんな書き方で、True状態、False状態を判断していくわけですね。

一方、.Netの多くの型には**.CompareTo()**ってメソッドがあり、これはAとBとの状態を、Int32の値として返却してくれる訳です。

参考：[Int32.CompareTo メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.int32.compareto?view=netcore-3.1)

**.CompareTo()**メソッドでの記述は、その状態を返却するだけなので、実際にはその状態を表した返却値を評価しなければならない訳で。それが「>」とか「<=」と違ってパッと見て分かりにくい！（私見）
ちょっと書いてみると、、、

|A.CompareTo(B)|返却値|意味合い|記述|
|:-----------------|:----------------:|:-----------------:|:-----------------|
|AはBより大きい|1|A>B|A.CompareTo(B).Equals(1)
|AはBと一致|0|A=B|A.CompareTo(B).Equals(0)
|AはBより小さい|-1|A<B|A.CompareTo(B).Equals(-1)

しかも、「大なりイコール」などのイコール系、不一致なんてのは、**補集合**の考えを使っていかないとならないわけで、ちょっとした**パニック**になる訳です（私見）。

※ちょっとした自分の備忘録ですな。最早。。。


|A.CompareTo(B)|返却値|意味合い|記述|
|:-----------------|:----------------:|:-----------------:|:-----------------|
|AはBより大きい|1|A>B|A.CompareTo(B).Equals(1)
|AはB以上(AはBより小さくない)|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|A>=B|Not A.CompareTo(B).Equals(-1)
|AはBと一致|0|A=B|A.CompareTo(B).Equals(0)
|AはB以下(AはBより大きくない)||A<=B|Not A.CompareTo(B).Equals(1)
|AはBより小さい|-1|A<B|A.CompareTo(B).Equals(-1)
|AはBと不一致(AはBと一致しない)||A!=B|Not A.CompareTo(B).Equals(0)

実際にUiPathで簡単なシーケンスを組んで、ログからExcelにまとめて見ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/e4ea0c9d-bc9c-7013-a03a-24c798bebbd6.png)

まとまった表になって、ちょっとは分かりやすくなりました？(^・^)

##おわりに
いかがでした？
.CompareTo()での返却値を.Equels()で評価して。。。況してNotを使わなければってとこが、未だに理解しにくく、いっそ等号、不等号で記述しちゃおうか。。。と思っています。実は、.CompareTo()を使うときは、未だに「Ａは、Ｂよりぃ？？？」って声に出しつつ記述していて、決して人には聞かれたくない、見られたくない比較の実装ですね(^・^)
是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！

2020/7/16 公開早々、誤字がありました。
AuroraからS3へのデータの保存時にAuroraがVPC内にあった時の設定方法

# はじめに
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.SaveIntoS3.html

Aurora to S3でAuroraがVPC内にある場合の設定方法で少しハマったので(やり方は書いてるけどいまいち分かりづらかった)、ここにやり方を残しておきます。

このコマンド送る時のやり方ですね。

```
SELECT * FROM {table_name} INTO OUTFILE S3 's3-{region}://{backet_name}/{prefix}'
```

# VPCエンドポイントを作成しよう
VPCサービス内のメニューにある`エンドポイント`で作業します。

`エンドポイントの作成`を押して新規作成します。

```
サービスカテゴリ: AWSサービス
サービス名: com.amazonaws.ap-northeast-1.s3
VPC: ※後述
ルートテーブルの設定: 全部チェック
ポリシー: ※後述
```

## VPC設定
AuroraのVPCを入力します。選択できないので、文字列として入力しなければなりません。（なんでやろ？）

### AuroraのVPC確認方法
RDSサービス内で確認可能です。
接続したいクラスター内のインスタンスから「接続とセキュリティ」から確認してください。

## ポリシー
ポリシーについてはここでは記載しません。
初期はフルオープンですが、とりあえずの確認はそれでやってあとで絞る方が良いです。
ミスって作った時に面倒くさくなってきます。
テーブル間でデータをinsertする方法


# 想定
稼働中のテーブルからバックアップ用のテーブルへデータをinsertして保存する時

# 方法

```sql
insert into [新しいテーブル] 
select * from [古いテーブル] 
where ....
```

これでいけそうですが、大抵はidカラムがあってnot nullと設定しているはず。
それで重複エラーが出るかもしれないのでそれぞれにカラムを明記した方が問題なく起動できます。
カラムが多いと書き出すのに面倒です:cry:

```sql
insert into [新しいテーブル]
(`col1`,`col2`,`col3`,`col4`,`col5`)
select `col1`,`col2`,`col3`,`col4`,`col5` from [古いテーブル] 
where "2020-07-16 07:45:00" <= created_at and created_at <= "2020-07-16 11:29:59";
```
競技プログラミング練習記 No.45【ABC117練習】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[ABC117](https://atcoder.jp/contests/abc117)を解きました。
4完です！

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A |  1min |-|  5ms|
| B |  4min |-|  6ms|
| C | 20min |-| 28ms|
| D | 38min |XOR| 29ms|


# まとめ
先にまとめを載せます。これ自体は最後に書いてます。

`std::accumulate()` はもらったイテレータの範囲の要素を`+`演算子で計算する関数です。
（私はきょう知りました。）

XORは数値を2進数でみて、桁ごとに処理すると解けることがあります。

全体で5WAしてしまいました。悔しい。
全完できたのはうれしいです。


## A - Entrance Examination

```c++
  double t, x;
  cin >> t >> x;
  printf("%.4f\n", t / x);
```

問題文より

>世界Bで (X×t) 時間進むと、世界Aでは t 時間進みます。
>世界Bで T 時間勉強したとき、世界Aでは何時間進んでいるでしょうか。

とあるので、`X × t = T` ですね。
`t`を求めたいので、`t`についての方程式として解いて、 `T / X` が答えになります。



## B - Polygon

``` c++
  int n;
  cin >> n;
  vector<int> l(n);
  for(int i = 0; i < n; ++i)
  {
    cin >> l[i];
  }
  sort(l.begin(), l.end());
  int sum = accumulate(l.begin(), l.end(), 0);
  cout << (l.back() * 2 < sum ? "Yes" : "No");
```

問題文中の定理
> 定理 : 一番長い辺が他の N−1 辺の長さの合計よりも真に短い場合に限り、条件を満たす N 角形が描ける。

より、「辺の総和から最長辺を引いたもの」と「最長辺」の長さを比較します。
コードでは`sum` が「辺の総和」で`l.back()`が「最長辺」です。
比較の式をいじっていますが、`l.back() * 2 < sum` で答えの判定ができます。

`std::accumulate()` はもらったイテレータの範囲の要素を`+`演算子で計算する関数です。
数値以外にも、文字列など`+`演算子が使える型には適用可能です。

## C - Streamline

``` c++
  int n, m;
  cin >> n >> m;
  if (n >= m)
  {
    cout << 0;
    return;
  }

  vector<ll> x(m);
  for(int i = 0; i < m; ++i)
  {
    cin >> x[i];
  }

  sort(x.begin(), x.end());
  vector<ll> dist(m - 1);
  for(int i = 0; i < m - 1; ++i)
  {
    dist[i] = x[i + 1] - x[i];
  }
  sort(dist.begin(), dist.end());
  cout << accumulate(dist.begin(), next(dist.begin(), m - n), 0);
```

各座標同士の距離を求めると、全体で動かすべき距離がわかりますね。
この距離が大きくなる座標にコマを置くことで全体の距離を最小化できます。
つまり、求めた距離をソートして、大きいものから`N`要素を削除し、残った要素を足せば答えになります。

削除と書きましたがコードでは削除はしていなくて、前から`M-N`要素の総和をとっています。


## D - XXOR

``` c++
  ll n, k, a_input;
  cin >> n >> k;

  int digit_size = (int)(log(k) / log(2) + 1.0);
  if (k == 0) digit_size = 0;
  vector<ll> digit(digit_size, 0);

  vector<ll> a(n);
  for(int i = 0; i < n; ++i)
  {
    cin >> a_input;
    a[i] = a_input;
    if (digit_size == 0) continue;
    int d = 0;
    while(a_input > 0)
    {
      digit[d] += (a_input & 1);
      a_input >>= 1;
      d++;
    }
  }

  ll num = 0;
  for(int i = digit_size - 1; i >= 0; --i)
  {
    ll d = ((digit[i] * 2 <= n ? 1LL : 0LL) << i);
    if (num + d <= k) num += d;
  }

  ll ans = 0;
  for(int i = 0; i < n; ++i)
  {
    ans += (a[i] ^ num);
  }
  cout << ans;
```

XORの問題ですね。
XORは数値を2進数でみて、桁ごとに処理すると解けることがあります。
なぜなら、XORの計算には桁の繰り上がりがないため桁ごとに独立しているためです。
（繰り上がりがあると他の桁に影響してしまいます。）

そしてこの問題も入力値を桁ごとに見ます。

求める答えはXORではなく`+`演算による総和なので、各桁が`1`になっている要素数を数えてみます。
（XORでは要素数はあまり関係ありませんが、`+`演算では関係あります。）

例えば入力要素が5個のとき、1桁目が`1`になっている要素が3個あるとします。
この時、整数Xの1桁目が`0`になっていると、総和を求めるとき、1桁目は`1`が3個足されます。
逆に、整数Xの1桁目が`1`になっていると、XORの計算で反転して、総和の1桁目は`1`が2個になります。
この2つを比べてみると、整数Xの1桁目が`0`の時のほうが総和は大きくなりますね。
つまり、答えを最大化するなら整数Xの1桁目は`0`であることがわかります。

これを一般化します。

各桁ごとに`1`になっている数を数えて、
・要素数の半分以上が`1`であれば整数Xの同じ桁は`0`
・要素数の半分以上が`0`であれば整数Xの同じ桁は`1`
となります。

あとはbit演算で整数Xを作れば答えを求められます。コードでは`num`変数です。
問題文より、整数Xは`K`以下であることに注意してください。


以上です。ありがとうございました。
[Teams] 無料版Teamsの会社名を変更する

昨今、テレワークでTeamsを使う機会が増えたと思います。

Teamsでは「アプリを追加」して外部アプリケーションと連携することが可能ですが、いきなり会社のTeamsで試すのは心配、という場合には、[無料版Teamsへサインアップ](https://support.microsoft.com/ja-jp/office/%E7%84%A1%E6%96%99%E7%89%88%E3%81%AE-teams-%E3%81%B8%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%82%92%E8%A1%8C%E3%81%86-70aaf044-b872-4c32-ac47-362ab29ebbb1)して検証することも可能です。

試しにサインアップしてみると、カスタムアプリもアップロードできるし、アプリの数が多い!!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/1e8fbfdd-549f-773d-5a97-5a722f1978e7.png)

本記事は、サインアップ時に入力する会社名についての話です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/7c94f09b-94c1-cd1b-4d75-f079e72af9b1.png)

実際の会社名を入れた場合、本番環境とテスト環境の区別が付かない問題が発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/80a69c69-8343-b1cf-4fc2-347b6d4d4b19.png)

サインアップすると最初に会社名(テナント名)と同名のチームが作成され、これは変更することができますが、チーム名なのでテナントの切り替えには反映されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/c5ab44f7-cfe3-5741-5d8b-df333f505b1e.png)

# 会社名(テナント名)の変更方法

会社名(テナント名)をAzureポータルから変更することができました。Teamsにサインアップしたアカウントで、 https://portal.azure.com/ にログインします。

Azure Active Directoryメニューを選択します。Azureサービスのメニューか、チュートリアルなどが表示されている場合はそこからでもメニューに移動できます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/e81df16c-40f4-d007-7e02-741e8c27900e.png)|
|:-:|

Azure Active Directoryが表示されたら、「プロパティ」を選択します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/65b058c1-a3c0-f515-750f-a63e4dca0caf.png)|
|:-:|

テナントの名前を変更して保存します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/8aaf337b-c87e-b89a-82fd-5aec07d9d400.png)|
|:-:|

Teamsに戻ると、会社名が変更されて見分けやすくなりました。反映にはかなり時間がかかる場合がありますが、待っていると反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/3257abd2-f81f-69b4-a4ef-57a7995b1e7d.png)

# 参考資料

- [無料版の Teams へのサインアップを行う](https://support.microsoft.com/ja-jp/office/%E7%84%A1%E6%96%99%E7%89%88%E3%81%AE-teams-%E3%81%B8%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%82%92%E8%A1%8C%E3%81%86-70aaf044-b872-4c32-ac47-362ab29ebbb1)
- [Qiita Team: Microsoft Teamsと連携を行えるようになりました](https://teams.qiita.com/guide/federation-microsoft-teams/)
ngrokを使ってMAMPでホスティングしているローカルサイトを公開

WFHが続いていて、今まで、開発中のサイトをLAN内でデザイナーチェックとかしてもらっていたのも、遠隔でできないといけないので、ngrok（無料版）を使ってやってみました。
今まで勝手に「MAMPで、しかもWordPressだと無理！」と思ってたけど、簡単にできました・・・。わざわざWordPressのホスト名書き換えたりとかの作業もいらず、普段の作業の中に上手く溶け込ませることができそうです。実際の公開サイトの方への影響も極力抑えるように意識しました。

## 前提

- MAMPを使ってhttps有効にして、`https://mysite.local`というホスト名で開発中
- WordPressのインストール先 `{DocumentRoot}/wp`


## 手順

### ngrokのインストール

[ここ](https://ngrok.com/download)からダウンロードしてきたバイナリファイルを、PATHの通ったディレクトリに配置。今回は、`~/bin/`に配置しました。

実行できるか確認

```shell
ngrok --version
ngrok version 2.3.35
```

ついでに、`authtoken`も登録しておきました。（いらないかも？）

```shell
ngrok authtoken xxxxxxxxxxxxxxxxx
```

### 設定

[この記事](https://ngrok.com/docs#wordpress)の通りなのですが・・・この方式なら、WordPress側の設定を書き換えなくて良いので楽ですね。

1. [Relative URL](http://wordpress.org/plugins/relative-url/)プラグインのインストール＆有効化（実際の公開サイトに影響を与えないためには、ローカルでだけ有効化しておくのが良さそう）
2. wp-config.phpに下記を追記

```wp-config.php
define('WP_SITEURL', 'https://'.$_SERVER['HTTP_HOST'].'/wp');
define('WP_HOME', 'https://'.$_SERVER['HTTP_HOST']);
```

`WP_SITEURL`に、`/wp`を付けていますが、WordPressのインストール先ディレクトリがそうだからです。そこは適宜変更してください。

なお、弊社では弊社開発の [drone-deploy](https://github.com/karappo/drone-deploy) を使っているので、リモートにデプロイされたときは無効になるよう、正確には下記のように書くのが吉。

```wp-config.php
//DEP_REMOTE_RM /*
define('WP_SITEURL', 'https://'.$_SERVER['HTTP_HOST'].'/wp');
define('WP_HOME', 'https://'.$_SERVER['HTTP_HOST']);
// */
```

#### DB上のドメイン書き換え

画像などのDB上にドメイン付きで保存されたファイルパスなどを書き換えておかないとリンク切れになるので、必要があれば下記を実行しておきましょう。

```shell-session
wp search-replace '//xxxxx.local' '//xxxxxx.ngrok.io'
```

### 公開

```shell
ngrok http -host-header=rewrite https://mysite.local
```

以上で、生成されたURLでリモートで作業しているデザイナーさんに確認してもらえます。
[Xcode] XcodeGenにした場合にagvtoolでバージョン管理できなくなったので対応

# XcodeGenを導入したらagvtoolでバージョンが変わらなくなった

> [Xcode] agvtoolでバージョン管理 - Qiita
https://qiita.com/valmet/items/78d662ec587b349e49c1

上記の記事を参考に見返してみると

> PROJECT > Build Setting > Versioning > Versioning System で Apple Generic を選択

なるほど

# project.ymlで設定する

```yml
targets:
  PROJECT_NAME:
    type: application
    platform: iOS
    deploymentTarget: "11.0"
    sources:
      - path: PROJECT_NAME
    settings:
      base:
        VERSIONING_SYSTEM: Apple Generic # これを入れる！
```

# xcconfigでplistを設定しているとなんだかうまく行かない

xcconfigファイルを使ってplistを設定しているとうまくいかないっぽい

```xcconfig:HOGE.xcconfig
INFOPLIST_FILE: PROJECT_NAME/info.plist
```

↓


```yml
targets:
  PROJECT_NAME:
    type: application
    platform: iOS
    deploymentTarget: "11.0"
    sources:
      - path: PROJECT_NAME
    settings:
      base:
        VERSIONING_SYSTEM: Apple Generic
        INFOPLIST_FILE: PROJECT_NAME/info.plist # XcodeGenで設定するとうまくいく
```

# xcodeprojの差分を見てもよくわからない

xcodeprojの差分的には特に変化ないんですが、agvtoolでバージョン管理できるようになりました。
理由がわかるかたいたら教えて下さい...🙇‍♂️
Vuex store リファクタリング

# この記事の目的

この記事では、**storeを使用した際に肥大化する恐れのあるファイルをどうすれば避けれれるのか**をメインに記述していきます。
**そもそもVuexとは？ということに関しては前回の記事で書いてますのでそちらを参考に。**
> https://qiita.com/ron-Qiita/items/27e6271739db95d2223f


## ファイルディレクトリー(リファクタリング前)
```
src --- components
     |
     -- views
     |
     -- *store*
           |
           --- index.js
```

初期状態では、このようなファイルディレクトリー構造になっていると思います。

## ファイルディレクトリー(リファクタリング後)
```
src --- components
     |
     -- views
     |
     -- *store*
           |
           --- modules
           |      |
           |      --- count.js
           |      |
           |      --- message.js
           --- index.js
```

このように、使用する機能ベースごとにファイルを分割することで、index.jsは完結にすることができ、コードの可読性を向上させることができます。

### store / index.js

```javascript

import Vue from 'vue'
import Vuex from 'vuex'
import count from './modules/count' //* リファクタリング
import message from './modules/message' //* リファクタリング

Vue.use(Vuex)

export default new Vuex.Store({
  state: {  },
  // * stateの値をメソッドにする
  getters: {  },
  // * stateの値を変更する 同期的処理
  mutations: {  },
  // * 非同期処理
  actions: {  },
  modules: {
    namespaced: true,
    count //count.jsを使用する
    message // message.js を使用する
  }
})
```

上記のように親であるindex.jsには処理自体は記載せず、importすることを指定することで、
肥大化を防ぐことができます。

それでは実際にmodulesのフォルダーの中身を見ていきます。

### store / modules / count.js

```javascript

// ! カウントアップ
const state = {
	count: 2
}

const getters = {
	doubleCount: state => state.count * 2,
	tripleCount: state => state.count * 3,
}

const mutations = {
	increment(state, number) {
		state.count += number;
	},
	decrement(state, number) {
		state.count -= number;
	},
}

const actions = {
	increment({ commit }, number) {
		commit('increment', number);
	},
	decrement({ commit }, number) {
		commit('decrement', number);
	},
}
export default {
	state,
	getters,
	mutations,
	actions,
}
```

### store / modules / message.js

```javascript

const state = {
	message: "",
}

const getters = {
	message: state => state.message
}

const mutations = {
	updateMessage(state, newMessage){
		state.message = newMessage;
	}
}

const actions = {
	updateMessage({ commit }, newMessage){
		commit('updateMessage', newMessage)
	}
}

export default {
	state,
	getters,
	mutations,
	actions
}
```

双方とも簡単な記述になります。初心者ですのでお手柔らかに...笑

まずは、変数として、

```
state
getters
mutations
actions
```
四つを宣言し、その中に処理を記述します。
それを

```
export default {}
```
で外部でimportできるような環境設定をします。

これで完成です！

こうすれば、modulesフォルダーから処理が紐づくファイルを探すだけで、
どこに書いてあるかわかりますよね！

一箇所に書いてしまうと、コードを書いた人以外が見るととても見にくいものになってしまうので、注意が必要です。
mbed オンラインコンパイラーでandとorを記述してヒヤリした件

#ひやりハット事件発生
　mbed オンラインコンパイラーで通っていたものが、
　ローカルのmdkでコンパイルしたところエラーが発生 and とかor とか使えないとエラーがでました。

#私はPascal使いでありC使い
Pascalの論路演算子　and　orを使います。
C     の論路演算子　&   |を使います。
このandと&  or と| の間違いはコンパイラに基本お任せにしていました。


#問題は
mbedのオンラインコンパイラーはand とorでエラーがでません。
 

#検証
mbed オンラインコンパイラーで以下のコードを実行します。

```
     uint8_t AndData1  = TestData1 and 0x01;
     uint8_t AndData0  = TestData1 and 0x00;
     uint8_t OrData1   = TestData0 or  0x01;
     uint8_t OrData0   = TestData0 or  0x00;
     

     PC.printf("And Data0: %2x \n\r",AndData0 );
     PC.printf("And Data1: %2x \n\r",AndData1 );
     PC.printf("Or  Data0: %2x \n\r",OrData0 );
     PC.printf("Or  Data1: %2x \n\r",OrData1 );

     TestData1 = 0xff;
     TestData0 = 0x00;
     AndData1  = TestData1 & 0x01;
     AndData0  = TestData1 & 0x00;
     OrData1   = TestData0 | 0x01;
     OrData0   = TestData0 | 0x00;

     PC.printf("And Data0: %2x \n\r",AndData0 );
     PC.printf("And Data1: %2x \n\r",AndData1 );
     PC.printf("Or  Data0: %2x \n\r",OrData0 );
     PC.printf("Or  Data1: %2x \n\r",OrData1 );

```

結果は以下

```
And Data0:  0
And Data1:  1
Or  Data0:  0
Or  Data1:  1
And Data0:  0
And Data1:  1
Or  Data0:  0
Or  Data1:  1
```

#結論
オンラインコンパイラ―はand と orが使える。
<font color="Red">**&をandと記述しても吐き出しは問題ない**。</font>
<font color="Red">**|をorと記述しても吐き出しは問題ない**。</font>
**ってことで問題無し**
【jqueryで簡単】商品一覧で、商品画像や商品名の高さを揃える

商品一つずつを囲ってるから、高さ指定しただけじゃ商品によって高さとりすぎたり商品名はみ出したりする。
ので、jqueryで動的に値をとってcss付加します。



```
let itemimg_array = [];
$('.itemimg').each(function() {
  itemimg_array.push($(this).outerHeight());
});
let itemimgMaxH = Math.max.apply(null, itemimg_array);
$('.itemimg').css('height', itemimgMaxH);
```

1. 空の配列を作る。
2. each関数で商品画像のheightをすべてとって配列に格納する
3. `Math.max.apply`で、配列の中で一番大きい数字を取得
4. .itemimgにその数字をcssで付加

やってることは綺麗じゃないかもだけど・・・
めっちゃ読み込み遅いと、がくつくかもしれないけど。
【AWS】【Terraform】The container {container_name} did not have a container port {port_number} defined.

# 状況

`Fargate`でnginxコンテナを起動してトップページが表示されるか確認したい

Error文 : `The container test did not have a container port 80 defined.`

Terraformのコード上ではportMappingは80番portで記入されており問題なし。

# コンソールで実態確認

![スクリーンショット 2020-07-16 11.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630802/a9e9f05e-818a-dc6a-4846-832ba9d718ef.png)
ポートマッピングが反映されていない。と思ったら上の`CPUユニット数も反映されていない`。これか！

# 結論
`container_definition.json`にコンテナに割り当てる、`"cpu", "memory"`の記述がなかった。

`Fargateでは必須`の模様
<img width="733" alt="スクリーンショット 2020-07-16 11.31.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630802/f5bd3d60-80a3-3f1f-d618-8a267d6227d8.png">

[公式リファレンス　AWS:ECS:TaskDefinition](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html)

```json

container_definitions/service.json

[
  {
    "name": "nginx",
    "image": "nginx:latest",
    "cpu": 256, # 追加
    "memory": 512, # 追加
    "essential": true,
    "network_mode": "awsvpc",
    "portMappings": [
      {
        "containerPort": 80,
        "protocol": "tcp"
      }
    ]
  }
]
```

反映されましたね
![スクリーンショット 2020-07-16 11.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630802/26e34183-8e07-4c73-2082-8345fd5156ac.png)
AWSの料金引き落としがコケたときのMyチェック手順


クレカの利用上限額に達するなどでAWSの利用料金の支払に失敗していたときのチェックリストです。

## 本当に支払いに失敗しているか確認

注文と請求書画面を確認しましょう。
https://console.aws.amazon.com/billing/home?#/paymenthistory

**お支払い期限(Payments Due)**に表示されているものが未払いの請求書、**注文と請求書の履歴(Order and invoice history)**に表示されているものが支払い済みの請求書です（そういう日本語訳にしてほしかった...!）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/e5d0ed5c-c780-9de6-1fb7-befff92f583b.png)

## 支払免除になっていないか確認

決済に失敗した場合に即時支払免除（キャンセル）になる請求があります。ドメインの更新です。
その場合、請求書(Bills) > 合計(Estimated Total)の中にキャンセルされた支払いが表示されています。

以上です。
配列要素をグループ化したディクショナリの作成

# はじめに
- テーブルビューやコレクションビューで、グループ化した表示はよく使います
- その場合、データソースとして二次元配列などを利用すると思います
- が、データソースが一次元配列だった場合は、少しデータの加工が必要ですよね

# 検証環境
- Xcode 11.5
- Swift 5.2

# 利用する機能
## Dictionary(grouping: by:)
- ディクショナリのイニシャライザ
- `grouping`
    - 元データとなる配列
    - `by` で指定した key ごとに、部分配列として分割される
- `by`
    - グループ化したディクショナリの key となる値を返す関数
    - 引数は、配列の各要素

# コード例
- 配列 `[Product]` を、 `Product` の要素である `category`（`Product.Category` 型）ごとにグループ化するサンプル
- 変換後のディクショナリは `[Product.Category: [Product]]` 型

```swift:ArrayGrouping.playground
import Foundation

struct Product: CustomStringConvertible {
    var description: String {
        "(\(self.name), $\(self.price), \(self.category))"
    }
    
    var name: String
    var price: Int
    var category: Category
    
    enum Category: String {
        case food
        case drink
        case other
    }
}

// Array of Product
var products: [Product] = [
    Product(name: "Fried Potato", price: 24, category: .food),
    Product(name: "Water", price: 12, category: .drink),
    Product(name: "Dish", price: 40, category: .other),
    Product(name: "Chai", price: 5, category: .drink),
    Product(name: "Fork", price: 56, category: .other),
    Product(name: "Bread", price: 35, category: .food),
    Product(name: "Noodle", price: 80, category: .food),
    Product(name: "Coffee", price: 98, category: .drink),
]

print(
    """

    Elements of Array
    ===========================================
    """
)
products.forEach { print($0) }

// Grouping by Category
var groupedProducts: [Product.Category: [Product]] = Dictionary(
    grouping: products,
    by: { $0.category }
)

print(
    """
    
    Grouping by Category
    ===========================================
    """
)
groupedProducts.forEach {
    print(
        """
        \($0.key.rawValue)
            \($0.value)
        """
    )
}
```

```zsh:出力結果

Elements of Array
===========================================
(Fried Potato, $24, food)
(Water, $12, drink)
(Dish, $40, other)
(Chai, $5, drink)
(Fork, $56, other)
(Bread, $35, food)
(Noodle, $80, food)
(Coffee, $98, drink)

Grouping by Category
===========================================
food
    [(Fried Potato, $24, food), (Bread, $35, food), (Noodle, $80, food)]
other
    [(Dish, $40, other), (Fork, $56, other)]
drink
    [(Water, $12, drink), (Chai, $5, drink), (Coffee, $98, drink)]
```

# まとめ
- 配列要素を任意のグループにまとめられるので、とても便利ですね
- 今回のサンプルは [GitHub: aokiplayer/swift-sandbox/ArrayGrouping](https://github.com/aokiplayer/swift-sandbox/tree/master/ArrayGrouping) に置きました
- なお、この記事は[私のブログ記事](https://yagamo-style.com/posts/arraygrouping/)からの転載です
TkinterでButtonを押したままにする機能を作ってみる

私自身Tkinterを最近使い始めたばかりなので、もしかしたら簡単にできるかもしれませんが
Buttonを押したまま固定する機能がどこを探しても見つかりませんでした。
もしやり方を知っている方が居れば教えていただけますでしょうか。

やり方が見つからかったため、強引に実装してみました。
かなり邪道なやり方なので、参考にならないかもしれませんが、下記に記します。

#####やりたい事
ボタンを使って、8bitのバイナリを編集するGUIを作りたい。

#####問題点
Tkinter ButtonでPushしたままにできない？
ButtonをDisableにはできる。
Buttonのラベル(表面上の絵)は変えられる
しかしButtonのreliefは変えられない？

#####解決策　及び　作った結果
![PushButton.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/f6ccdab0-0b39-eeb9-b901-580401ed1aa1.png)

生成されたボタンを破棄して、再度pushしたままのreliefで全部作りなおしてみました。

```Python:BinEditor.py
import sys
import tkinter as tk

class BinEditFrame(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.val = 0x00
        self.bits = []
        for i in range(8):
            btn = tk.Button(self,text=str(i), relief='raised', command=self.callback(i))
            btn.pack(sid='right')
            self.bits.append(btn)
        print("start")

    def callback(self, i):
        def push():
            self.val ^= (1<<i)
            print(self.val)

            #All Button Delete
            for bit in self.bits:
                bit.destroy()
            self.bits.clear()

            #All Button ReCreate
            for j in range(8):
                if (self.val & (1<<j) > 0):
                    btn = tk.Button(self,text=str(j), relief='sunken',
                                    command=self.callback(j) )
                else:
                    btn = tk.Button(self,text=str(j), relief='raised',
                                    command=self.callback(j) )
                btn.pack(sid='right')
                self.bits.append(btn)
        return push
        

if __name__ == "__main__":
    print("BinEditor")
    win = tk.Tk()
    be = BinEditFrame(win)
    be.pack()
    win.mainloop()
git fetch ができなかった時の対処法

# example

```
[~]$ git fetch --all
Fetching origin
error: Unable to append to .git/logs/refs/remotes/origin/master: ????????
From github.com:
 ! aa04681..aab3be0  master     -> origin/master  (unable to update local ref)
error: Unable to append to .git/logs/refs/remotes/origin/branch2: ????????
 ! [new branch]      branch2 -> branch2  (unable to update local ref)
error: Unable to append to .git/logs/refs/remotes/origin/branch3: ????????
 ! [new branch]      branch3 -> origin/branch3 (unable to update local ref)
error: Unable to append to .git/logs/refs/remotes/origin/branch4: ????????
 ! [new branch]      branch4 -> origin/branch4  (unable to update local ref)
error: Could not fetch origin
```

とfetchしてremote内のブランチを取得しようとしたところエラーが発生しました。

対処法を備忘録として残しておくとです。

# method

考えうる原因は2つです
1. .git が書き込み権限が付与されていない
2. .git の管理者権限がrootとかになっている

R/W権限の問題は少しの間だけ `sudo chmod 777 ./.git` にしてみるといいかも。

管理者権限は

```
sudo chown -Rc $UID .git/
```
にして .git 配下の管理者を変更したところ、正常にfetchできました。

# 参考になったリンク
- [git pullやgit fetchをしようとしたらエラーが出るとき] (https://qiita.com/naga1460/items/aa55bbf36a356bd08383)
- [Git commit problem: Unable to append to .git/](https://stackoverflow.com/questions/6692292/git-commit-problem-unable-to-append-to-git/15344989)
【iOS】HealthKit Frameworkについて

# はじめに
今回はiOSのヘルスケアについて調べた内容を備忘録として記載しました。  
これはまた使用したときに改めて書き直したいですね。

今回の記事ははてなブログに投稿したのをそのままQiitaにもアップしています。

→[ハイノDiary](https://hai-haino.hatenablog.com/entry/2020/07/15/161700)

# HealthKit Frameworkとは？
iOSアプリのヘルスケアのデータをアプリ間で共有するためのフレームワーク。  
データとユニットのタイプを事前定義されたリストに制限し、すべてのアプリがデータの意味と使用方法を理解できるようにする。  
つまり、洋視されたデータタイプまたはユニットしか共有できない。

## HealthKitデータの種類

### 特性データ
- ユーザーの誕生日：dateOfBirth()、血液型：bloodType()、生物学的性別：biologicalSex()、肌のタイプ：fitzpatrickSkinType()など、通常は変化しないアイテムを表す。
- このデータを使用するアプリはHealthKitストアから特性データを読み取れるが保存はできない。
- ヘルスケアアプリを使用してデータの入力または変更をする。

### サンプルデータ
- ユーザーの健康データのほとんどは、特定の時点のデータを表すサンプルに保存される。
- すべてのサンプルクラスは、HKSampleクラスのサブクラスであるHKObjectクラスのサブクラス。

### トレーニングデータ	
- フィットネスや運動に関する情報はHKWorkoutサンプルとして保存される。
- オブジェクトは、サンプルを保存したアプリやデバイスに関する情報が含まれる。

### ソースデータ
- 各サンプルには、そのソースに関する情報が格納される。

### 削除されたオブジェクト
- インスタンスが一時的HealthKitストアから削除されたアイテムのUUIDを格納するために使用される。
- 削除されたオブジェクトを使用して、ユーザーまたは別のアプリによってオブジェクトが削除されたときに応答できる。

## オブジェクトとサンプルのプロパティ			
このHKObjectクラスは、すべてのHealthKitサンプルタイプのスーパークラスで、すべてのHKObjectサブクラスは不変。各オブジェクトには次のプロパティがある。		
			
### UUID		
- その特定のエントリの一意の識別子。	

### メタデータ
- エントリに関する追加情報を含むディレクトリ	。
- 事前定義キーとカスタムキーの両方を含めることができる。
  - 事前定義キーにより、アプリ間のデータ共有が容易になる。
  - カスタムキーにより、特定のHealthKitオブジェクトタイプを拡張し、アプリ固有のデータをエントリに追加する。

### ソースリビジョン
- データをHealthKitに直接保存するデバイス、またはアプリ。
- HealthKitは、オブジェクトがHealthKitストアに保存されるときに、各オブジェクトのソースとバージョンを自動的に記録する。
- このプロパティは、ストアから取得したオブジェクトでのみ使用できる。

### 端末		
- このサンプルに格納されているデータを生成したハードウェアデバイス	。

### タイプ
- 睡眠分析サンプル、身長サンプル、歩数サンプルなどのサンプルタイプ。

### 開始日
- サンプルの開始時間。

### 終了日
- サンプルの終了時間。
- サンプルが単一の時点を表す場合、終了時刻は開始時刻と等しくなければならない。
- サンプルが時間間隔で収集されたデータを表す場合、終了時刻は開始時刻の後に発生する必要がある。

### カテゴリーサンプル
- 有限のカテゴリセットに分類できるデータ。
  - HKCategorySample

### 数量サンプル
- 数値として保存できるデータ。

### 相関
- 1つ以上のサンプルを含む複合データ。

### トレーニング
- ランニング、水泳、遊びなどの身体活動を表すデータ。
- 多くの場合、ワークアウトにはタイプ、持続時間、距離、およびエネルギー消費特性がある。
- ワークアウトを多数の細かいサンプルに関連付けることもできる。

# おわりに
間違いなどがございましたら是非とも教えてください。

# 参照
- [https://developer.apple.com/documentation/healthkit/about_the_healthkit_framework:title]
command line やPowershellでAutomateC.exe & Automate.exeの実行

メモ用

Command LineでBlue Prism AutomateC.exeの実行について

下記のようにスクリプトを書き、Batchファイルを作成する。
Batchファイルを起動すると、指定されたプロセス/スケジュールが実行される。

プロセスの実行を指定するスクリプト

```ruby:qiita.rb
start "" "C:\Program Files\Blue Prism Limited\Blue Prism Automate\AutomateC.exe" /run "process name" /user #username #password
```

スケジュールの実行を指定するスクリプト

```ruby:qiita.rb
start "" "C:\Program Files\Blue Prism Limited\Blue Prism Automate\AutomateC.exe" /dbconname "ConnetionName" /user #username #password /startschedule /schedule "Schedule Name"
```


PowershellでAutomateC.exe & Automate.exeの実行

```ruby:qiita.rb
& $automatec /dbconname $DBConnection /resource $Resource /port 8180 /sso /run "Login" /startp "<inputs><input name='Login Locally' type='flag' value='False' /><input name='Domain' type='text' value='<YourAD_Name>' /><input name='Credential Name' type='text' value='$Credentials' /> </inputs>"
```
【Kotlin】mutableMap型のファイル保存と復元

#はじめに
よく使われるmutableMap型をリストにしたものをファイルに保存し復元するプログラムを書いていきます。
様々な要素をコレクション化できるmutableMapとそれをリストで管理するMutableListを使うと下記の様な使い方が出来ます。

```kotlin.kt
    var map= mutableMapOf<String,Any>()
    var mapList: MutableList<MutableMap<String,Any>> = mutableListOf()
    map = mapOf("name" to "hogehoge")
    mapList.add(map)
````

mutableMap型はデバッグの時に**toString()**でキー＝値の文字列に変換出来ますが逆が出来ません。（多分）
それが複数存在するMutableList丸ごとテキストにすることも出来ません。（できましたね・・・）
そこで**JSON**形式に相互変換出来る**Gson**ライブラリを使って変換します。

#準備
build.gradle(app)に

```
    implementation 'com.google.code.gson:gson:2.8.6'
```

を追加してGsonを有効にします。
#ファイルへの保存

```write.kt
    fun mapToFile(filename : String){
        var map= mutableMapOf<String,Any>()
        val writeFile = File(context?.filesDir, filename)
        val bw = writeFile.bufferedWriter()
        for (i in 0..mapList.size-1){
            map= mapList[i]
            val str = Gson().toJson(map)
            bw.write(str)
            bw.newLine()
        }
        bw.close()
    }
```

指摘がありましたので簡潔に書いてみました。

```write.kt
    fun dataToFile(filename : String){
        val writeFile = File(context?.filesDir, filename)
        val bw = writeFile.bufferedWriter()
        bw.write(Gson().toJson(mapList))
        bw.close()
    }
```

MainActivity内だとcontext?ではなくthisに置き換えて下さい。
書き込めたかどうかの確認は**AndroidStudio**の右側**デバイスファイルエクスプローラー**からdata/data/[アプリケーション名]/file/以下のディレクトリにファイルがあれば成功です。

#ファイルから復元

```read.kt
    fun mapFromFile(filename : String){
        mapList.clear()
        val readFile = File(context?.filesDir, filename)
        var map= mutableMapOf<String,Any>()
        if(!readFile.exists()) return
        val br = readFile.bufferedReader()
        var str : String? = null
        while (true){
            str = br.readLine()
            if (str == null) break
            map= Gson().fromJson<MutableMap<String,Any>>(str, MutableMap::class.java) as MutableMap<String,Any>
            mapList.add(map)
        }
        br.close()
```

これでファイルから1行ずつ読み込んで元の型に戻ります。

~~こっちも完結に書きたいのですが何故か書けません。~~
sdkei様よりアドバイスを頂きました。

```read.kt
fun mapFromFile(filename : String){
    mapList.clear()
    val readFile = File(context?.filesDir, filename)
    if(!readFile.exists()) return
    val br = readFile.bufferedReader()
    val str : String =  br.readText()
    mapList.addAll(Gson().fromJson<MutableList<MutableMap<String,Any>>>(str, MutableList::class.java))
    br.close()
}
```

mapListを拡張するアドバイスも頂きました。

```read.kt
fun <T> MutableList<T>.toJson(): String = Gson().toJson(this)
fun <T> MutableList<T>.fromJson(json: String) {
    this.clear()
    Gson().fromJson<MutableList<T>>(json, this::class.java).also {
        this.addAll(it)
    }
}
fun dataToFile(filename : String){
    val writeFile = File(context?.filesDir, filename)
    val bw = writeFile.bufferedWriter()
    bw.write(mapList.toJson())
    bw.close()
}
fun mapFromFile(filename : String){
    mapList.clear()
    val readFile = File(context?.filesDir, filename)
    if(!readFile.exists()) return
    val br = readFile.bufferedReader()
    val str : String =  br.readText()
    mapList.fromJson(str)
    br.close()
}
```
TravisCIでジョブ間データ受け渡し

FlutterアプリのCIとしてTravisCIを使いはじめました。
その際に、ビルド番号をAndroid/iOSのビルドで共通化したかったので調べたことをメモ。

## やりたいこと

以下のステージがあったとして、`prepare`ステージで作成したファイルを後続のステージで読み込みたい。

```
stages:
  - prepare
  - build
```

## 調査
公式は以下にあるようにS3とかSCP使って永続化してねって言っています。
https://docs.travis-ci.com/user/build-stages/#data-persistence-between-stages-and-jobs

S3に`TRAVIS_BUILD_NUMBER `を使って取得できるようにしたら行けるのかなっと思いましたが、ちょっとS3は使えないので却下。
SCPもアクセスできる端末ないので却下でした。

## workspaces(Beta #2020/7/16)
探していると、`Workspaces`って機能があるよと。(https://stackoverflow.com/questions/53931069/pass-information-between-stages-in-travis-ci)

[Using Workspaces](https://docs.travis-ci.com/user/using-workspaces/)

使い方はかんたん。
保存する側のJobと使用する側のJobに`workspaces`要素を追加するだけ。

```
jobs:
  include:
    - stage: prepare
      os: linux
      workspaces:
        create:
          name: hoge # <- 任意のキー、使用する際に使う
          paths: hogehoge.txt
      script:
        - echo "prepare" > hogehoge.txt
    - stage: test
      os: linux
      workspaces:
        use: hoge
      script:
        - cat hogehoge.txt
    - stage: build
      os: linux
      workspaces:
        use: hoge
      script:
        - cat hogehoge.txt

```

## 注意
Linux同士のJobはこれで大丈夫だが、Linux->Macだとディレクトリ構成が異なるので**使用できない**。
TravisコミュニティでもIssuesが上がっている。
https://travis-ci.community/t/workspaces-do-not-work-nicely-with-cross-platform-builds/4461

以下のPRで対応中のようです。
https://github.com/travis-ci/travis-build/pull/1923

### 原因
Linux側のHOME(/home/travis/)とMac側のHOME(/Users/travis/)が異なるので、復元時にMacにLinuxのHOMEが作れなくて失敗する。
`workspaces.create.paths`を絶対パスに正規化してしまう様子。

### 回避策(2020/7/16時点)
とりあえずマージされるまではこの方法でいけたのでメモ(Linux->Macのみ)
Linux/Macで共通に使用できる`/tmp`ディレクトリを使う。


```

jobs:
  include:
    - stage: prepare
      os: linux
      workspaces:
        create:
          name: hoge # <- 任意のキー、使用する際に使う
          paths: /tmp/hogehoge.txt
      script:
        - echo "prepare" > hogehoge.txt
        - cp hogehoge.txt /tmp/hogehoge.txt
    - stage: build
      os: linux
      workspaces:
        use: hoge
      script:
        - cat /tmp/hogehoge.txt
    - stage: build
      os: osx
      workspaces:
        use: hoge
      script:
        - cat /tmp/hogehoge.txt

```
CentOS8 に systemd-nspawn用 CentOS8 コンテナを作成する

```
NEW_MACHINE='centos8'
yum --releasever=8 \
    --nogpg \
    --installroot=/var/lib/machines/${NEW_MACHINE} \
    --disablerepo='*' \
    --enablerepo=BaseOS \
    install systemd passwd yum sudo

sudo systemd-nspawn -D /var/lib/machines/${NEW_MACHINE}
passwd
useradd -m -r user
passwd user
usermod -G wheel user
exit

# 起動確認
sudo systemd-nspawn -bD /var/lib/machines/${NEW_MACHINE}
Ctrl+]
Ctrl+]
Ctrl+]

# unit file 
systemctl enable systemd-nspawn@${NEW_MACHINE}.service

(echo '[Service]'
 echo 'ExecStart='
 echo 'ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --machine=%I'
) | SYSTEMD_EDITOR=tee systemctl edit systemd-nspawn@${NEW_MACHINE}.service

cat /usr/lib/systemd/system/systemd-nspawn@.service
cat /etc/systemd/system/machines.target.wants/systemd-nspawn@${NEW_MACHINE}.service
cat /etc/systemd/system/systemd-nspawn@${NEW_MACHINE}.service.d/override.conf

machinectl start ${NEW_MACHINE}
machinectl login ${NEW_MACHINE}
```
swiper ver.6.0.x へのバージョンアップに対応する

※IE11への対応を個別でしなければならなくなったので忘れないうちに書いておく。

:warning:追記 swiper7.x.x ではまた仕様が変わりましたので、以下の書き方が利用できません。
使用後、また記事を作成します。

## 2020年7月3日に Swiper 6.0.0がリリース
前と違って、オプションのような機能（effect-fadeやpaginationなど）は

```javascript:index.js
import Swiper  from 'swiper'
```
だけでは動かず、個別で入れないといけなくなりました。
https://github.com/nolimits4web/swiper/blob/master/CHANGELOG.md

ただし動かす時の書き方が変わっただけで、インストール（npmやyarn）は変わってません。

### 以下バージョン6以上だと必要な対応

↓このように入力。
個別の機能はここに入ってるものになる。JSとSCSS,LESSが一緒に入ってます。
https://swiperjs.com/api/#styles
https://github.com/nolimits4web/swiper/tree/master/src/components

```javascript:index.js
import { Autoplay, Pagination, Swiper } from 'swiper'
Swiper.use([Autoplay, Pagination])
```

あとの表示するための書き方は以前と同じでOK

```javascript:index.js
new Swiper('.swiper-container', {
      loop: true,
      slidesPerView: 1,
      centeredSlides: true,
      autoplay: {
        delay: 5000,
        disableOnInteraction: false,
      },
      speed: 2000,
      pagination: {
        el: '.swiper-pagination',
        type: 'bullets',
        clickable: true,
      },
    })
```

htmlのほうは以前のままで大丈夫です。
今回から描き方が変更になるのはJSとSCSS（またはLESSなど）です。

SCSSのほうも書いておきます。
パスはそれぞれの環境に合わせて変更してください。

```scss:_swiper.scss
@use './node_modules/swiper/swiper';
@use './node_modules/swiper/components/pagination/pagination';
```

基本JSとSCSS（or LESS)は一緒に追加することを忘れないように。

---

今回からIE11の対応がなくなった？みたい（IE11で閲覧したときに動かなかった）なので、polyfillを入れます。
IE非対応の時はやらなくてOKです。

```javascript:index.js
import 'core-js/features/number/is-nan' // swiper入れる前に入れときますか
import 'custom-event-polyfill'

import { Autoplay, Pagination, Swiper } from 'swiper'
Swiper.use([Autoplay, Pagination])
```

---
追記（2021.06.09追記）
縦向きのスライダーはIEではどうしても動かないみたいなので、
5.4.5 の古いバージョンを利用してください。

```javascript:index.js
import Swiper from 'swiper'

new Swiper('.swiper-container', {
      direction: 'vertical', // スライダーを縦向きに
})
```
---

以上覚書でした。
その都度なにかあれば書き足したいです。
Rails標準ライブラリのnet/httpを使ってAPI通信をする

# 本記事について（お断り）

この記事は、しがないプログラミング初心者がお勉強よろしくプログラミング・技術に触れるべく、行ったことの備忘録として書き綴ったものです。至らぬ点、誤解を招く表現など、ご指摘がありましたら甘んじて受け入れます🙇‍♂️

# 外部APIとの通信

プロダクトに機能を追加する際、外部APIに通信する必要が出てきた。APIという言葉そのものをよく理解していなかったものの、以下のQiitaの記事がとても分かりやすくまとめてくれていたので、参考に載せておきます。ありがとうございました。
[WebAPIについての説明](https://qiita.com/busyoumono99/items/9b5ffd35dd521bafce47)

# net/httpを使う

API通信を行う時、HTTPClientやrest-clientなどの優秀なgemライブラリがあるようです。どれを使うか迷いましたが、せっかくRailsに標準でライブラリがあるので、まずはそれを使ってみようと思います。

# コード

今回行ったのは、外部APIにGETリクエストを送り、レスポンスを受け取るだけの実装です。

```ruby:
require 'net/http'
require 'uri'

uri = URI.parse('https://example.com')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

header = { 'Authorization' => 'Bearer password' }
uri.query = URI.encode_www_form { q: test, hoge: fuga }

response = http.get(uri.request_uri, header)
```

まずは初めの３行でクライアントの用意を行なっています。

```ruby:
uri = URI.parse('https://example.com')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
```

`use_ssl = true`は**httpsを使う時は必ずtrue**にしておかないといけないそうなので、忘れないように設定します。
[use_ssl=(bool)](https://docs.ruby-lang.org/ja/latest/class/Net=3a=3aHTTP.html#I_USE_SSL--3D)

次の２行で、リクエスト内容を設定してます。

```ruby:
header = { 'Authorization' => 'Bearer token' }
```

ヘッダーに認証情報を埋め込むための変数を作成してます。今回のAPI通信ではBearer認証を求められていたのですが、これを知らなくてレスポンスが＜401 Unauthorized＞ばかり帰ってきてて詰まりました。

```ruby:
uri.query = URI.encode_www_form { q: test, hoge: fuga }
```

クエリパラメータを作成してます。`URI.encode_www_form`にハッシュを渡すことで、`q=test&hoge=fuga`のようにクエリパラメータとして使える文字列に変換してくれます。

最後に、getメソッドでリクエストを送り、結果を受け取ります。

```ruby:
response = http.get(uri.request_uri, header)
```

getにはパスと先ほど準備したヘッダー情報を与えています。

[get(path, header = nil, dest = nil) -> Net::HTTPResponse](https://docs.ruby-lang.org/ja/latest/class/Net=3a=3aHTTP.html#I_GET)

```ruby:
# => <Net::HTTPOK 200 OK readbody=true>
```

これで期待していたインスタンスを受け取ることができました！

# 参考

[Ruby 2.7.0 リファレンスマニュアル   ライブラリ一覧   net/httpライブラリ   Net::HTTPクラス](https://docs.ruby-lang.org/ja/latest/class/Net=3a=3aHTTP.html#I_GET)
[net/httpライブラリを使って、RubyでHTTP通信してみた](https://qiita.com/katu_/items/a116c261c8616fd01fca)