OmniAICreator/Qiita-1.07M huggingface dataset:
Nuxt.js で JSON ファイルを読み込んで v-for で展開する例 ( load by "require" JSON assets static file and use asyncData ) ( #Vue #Nuxt )

assets/users.json

```json
[
  {
    "id" : 1,
    "name": "Alice"
  },
  {
    "id" : 2,
    "name": "Bob"
  },
  {
    "id" : 3,
    "name": "Carol"
  }
]

```

pages/assets-json.vue

```vue

<template>
  <div>
    <h1>
      assset API
    </h1>
    <h2>Users</h2>
    <ul>
      <li v-for="user in users" :key="user.id">
        {{ user.id }} - {{ user.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  asyncData() {
    const users = require(`~/assets/users.json`)
    return {
      users
    }
  }
}
</script>

```


http://localhost:3000/assets-json


![image](https://user-images.githubusercontent.com/13635059/80936476-4e24ae80-8e0c-11ea-90f6-b3e209ad00bf.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3135











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Pyside2でGUI作成＜幼稚園レベル＞

##はじめに
Pyside2を勉強していて一番最初に引っかかる`QApplication`や`QWindow`について、何となく理解できたのでまとめてみました。

##今回作るもの

###完成図
非常に簡素なWindowです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560169/d28d6106-4ce7-298e-ad4f-8e2660b6da9a.png)
###コード

```.py
import sys
from PySide2.QtWidgets import *

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = QWidget()
    main_window.resize(600,200)
    main_window.show()
    sys.exit(app.exec_()) 
```

##解説

```.py
from PySide2.QtWidgets import *
```
`QtWidgets`をインポートしています。`QtWidgets`の中には、Windowのベースとなる`QWidget`や、ボタン`QPushbutton`を作成するようなクラスが含まれています。

```.py
from PySide2.QtWidgets import QApplication,QWidget
```
*(ワイルドカード）を使わずに上記のように、クラスを指定してimpotすることもできます。

```.py
import sys
```
`sys.argv()`を利用する為、sysモジュールもインポートします。`sys.argv()`については後で説明します。

```.py
if __name__ == '__main__':
```
`if __name__ == '__main__`はネットに説明がたくさんあるので割愛。

```.py
    app = QApplication(sys.argv)
```
`QApplication`を変数`app`に格納します。
`QApplication`とはGUIを乗せるための基礎のようなものです。


```.py
    main_window = QWidget()
```
`QWidget`を、変数`main_window`に格納しています。
`QWidget`はボタンやラベルを配置するwindowになります。
`QApplication`と`QWindow`の関係はこんなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560169/e8e88610-facd-0065-750a-ae120f6290ea.png)

```.py
    main_window.resize(600,200)
```
Windowサイズを指定します。数値を変更するとサイズが変わります。
色や形を変更したりもできるようです。

```.py
    main_window.show
```
作成した`main_window`=`QWindow()`を表示します。

```.py
    sys.exit(app.exec_()) 
```
`app.exec_()`＝`QApplication.exec_()`は、Windowを表示させ続けるループを作成しています。
ループしないと、表示されたWindowはプログラム終了と同時に消滅します。
`sys.exit_()`はプログラムを終了させるコマンドです。`app.exec_()`の終了を待っています。
`app.exec_()`の終了時に、`0`を受け取ってプログラムそのものを終了させます。
`sys.exit_()`を記述しなかった場合は、`app.exec_()`を終了させた後に続きのプログラムが実行されます。

##追記
Pyside勉強するなら、PysideよりもPyQtで検索したほうが情報量が多い。
PyQtとPysideの違いについてはこちらのページが参考になる。
https://qiita.com/nullpo24/items/c70e02c26ef5cade9480
ゼロから始めるLeetCode Day15 「283. Move Zeroes」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day14 「136. Single Number」](https://qiita.com/KueharX/items/fd12c8b8938798afcc8a)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

# 問題

[283. Move Zeroes](https://leetcode.com/problems/move-zeroes/)

難易度はeasy。
今回もTop 100 Liked Questionsからの抜粋です。

問題としては、配列が与えられ、その中の全ての要素を舐めていき、もし値が`0`だった場合、その`0`を末尾に挿入します。なお、その際に0以外の値の要素の順序はそのまま保たなければなりません、という問題です。

>Example:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

# 解法

二通りの考えが思い浮かんだのでその片方を実装してみました。
片方は0を動かす考え方、そしてもう一方は0以外の数値を動かす、という方法です。
まずは前者を実装してみました。

```Python
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for i in range(1,len(nums)+1):
            if nums[-i] == 0:
                nums.pop(-i)
                nums.append(0)
# Runtime: 52 ms, faster than 54.28% of Python3 online submissions for Move Zeroes.
# Memory Usage: 15 MB, less than 5.97% of Python3 online submissions for Move Zeroes.
```

popとappendで要素の削除と末尾への挿入を行っています。

対して後者は以下のように実装しました。

```Python
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        h = -1
        for i in range(len(nums)):
            if nums[i] != 0:
                h += 1
                nums[h], nums[i] = nums[i], nums[h]
# Runtime: 52 ms, faster than 54.28% of Python3 online submissions for Move Zeroes.
# Memory Usage: 15 MB, less than 5.97% of Python3 online submissions for Move Zeroes.
```

まず、`h`に-1を代入し、`i`に要素数を代入します。そして仮に`nums[i]`が0ではない場合、hに1を足し、`nums[h]`に`nums[i]`を`nums[h]`を`nums[i]`に代入することで入れ替えることがきます。
結果的にこれを全てのように対して行うことで全ての0以外の値が順番を乱すことなく先頭にソートされます。

今回は二つの手順で考えてみました。
もっと良い考え方があれば追記します。
AWS Transit Gateway Network ManagerのRoute Analyzerを試す

## Route Analyzer とは
2020/5/4 に発表された、AWS Transit Gateway Network Manager の新機能です。

**Announcing Route Analyzer in AWS Transit Gateway Network Manager**
https://aws.amazon.com/jp/about-aws/whats-new/2020/05/announcing-route-analyzer-in-aws-transit-gateway-network-manager/

Route Analyzer により、実際のトラフィックの送信を行う前に Transit Gateway で接続された
ネットワーク内の特定の送信元と送信先間のルーティング構成を検証できます。
これによりトラフィック障害の原因となっているルート関連の問題を簡単に確認できるようになります。

## やってみる
### 前提
東京リージョンとバージニアリージョンの Transit Gateway 間で Inter-Region Peering を構成します。
Route Analyzer でそれぞれの Transit Gateway にアタッチされた VPC 間の接続性を確認します。

ここでは詳細を割愛しますが、事前に以下の準備が必要です。

* 両リージョンで Transit Gateway を作成し、自リージョン内のVPCをアタッチ
* Network Manager でグローバルネットワークを作成し、両リージョンの Transit Gateway を登録
* 東京から Peering Connection のアタッチメントを作成し、バージニア北部の Transit Gateway を指定
    * バージニア北部側で Peering Connection のリクエストを承認する

Peering Connection の指定例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/98b646d0-3207-4fa1-bc96-c03b904271ee.png)
Network Manager の地域マップを確認すると、2つのリージョン間で Transit Gateway のピアリングが
確立されていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/05fb5d0e-0b7a-88cd-0513-2cb702dc50ec.png)

Route Analyzer を試すため、ここではあえてルートテーブルの編集はまだ行いません。

### Route Analyzer の実行
Network Manager のルートアナライザータブを選択します。
送信元には東京リージョンの Transit Gateway、VPC のアタッチメント、
および VP C内のプライベートIP を指定します。
同様に送信先にはバージニア北部リージョンの Transit Gateway、VPC のアタッチメント、
および VPC 内のプライベートIP を設定し、ルート分析を実行 をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/b56db10d-844d-219f-945a-42c21e835b61.png)
結果が表示され、ステータスから接続ができなていないことがわかります。
前提の手順では Inter-Region Peering を構成後にルートテーブルの編集を行っていないため
想定どおりの結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/29fbe6ef-34c7-58ec-a8ea-866f957f27c9.png)

東京リージョン側のTransit Gateway ルートテーブルに静的ルートを追加します。
ここでは CIDR に先ほど Route Analyzer で指定したバージニア北部リージョン側 VPCの
プライベートIPアドレスを、/32 で指定します。
Choose attachment では Peering Connection のアタッチメントを指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c3e20729-73cb-b72a-2e90-2e43539cb5f9.png)
この状態でルート分析を再度実行すると、東京→バージニア北部リージョンの接続に成功します。
Route Analyzer では宛先から送信元に戻るトラフィックの戻りパスも分析することもできます。
戻りパスの接続は失敗していますが、この時点ではまだバージニア北部リージョン側の
Transigt Gateway ルートテーブルの編集は行っていないため、想定通りの結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/8cd203f3-d416-f2d2-8731-1950c1793c8c.png)
同様にバージニア北部側のルートテーブルを編集し、分析を再実行した結果が以下です。
前向きパスと戻りパスの両方で接続が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/1868ba60-e0fc-952d-4fe6-4a66e43faa71.png)

実際にトラフィックを流さずに接続性を確認できますし、設定追加が必要な
ルートテーブルも明示してくれるのでとても便利です。

### 注意点など
Route Analyzer は、セキュリティグループやネットワーク ACL ルールを分析しません。
これらの影響も考慮する場合、VPCフローログを併用して分析、確認する必要があります。

## 参考
**Amazon VPC Document - Route Analyzer**
https://docs.aws.amazon.com/vpc/latest/tgw/route-analyzer.html

以上です。
参考になれば幸いです。
Ruby on Railsのチュートリアル ~第8章 基本的なログイン機構~

# はじめに
webアプリケーションを作るための学習記録
（マッチングアプリを作る予定）

こちらのチュートリアルを片っ端から進めていく
【Ruby on Rails チュートリアル】
https://railstutorial.jp/

# 第8章 基本的なログイン機構
## まとめ
- Railsのsessionメソッドを使うと、あるページから別のページに移動するときの状態を保持できる。一時的な状態の保存にはcookiesも使える
- ログインフォームでは、ユーザーがログインするための新しいセッションが作成できる
- flash.nowメソッドを使うと、描画済みのページにもフラッシュメッセージを表示できる
- テスト駆動開発は、回帰バグを防ぐときに便利
- sessionメソッドを使うと、ユーザーIDなどをブラウザに一時的に保存できる
- ログインの状態に応じて、ページ内で表示するリンクを切り替えることができる
- 統合テストでは、ルーティング、データベースの更新、レイアウトの変更が正しく行われているかを確認できる

## 所感
・ログインの仕組みがわかってよかった
・統合テストの流れが記載されてたのわかりやすかった

1.ログイン用のパスを開く
2.新しいセッションのフォームが正しく表示されたことを確認する
3.わざと無効なparamsハッシュを使ってセッション用パスにPOSTする
4.新しいセッションのフォームが再度表示され、フラッシュメッセージが追加されることを確認する
5.別のページ (Homeページなど) にいったん移動する
6.移動先のページでフラッシュメッセージが表示されていないことを確認する

1.ログイン用のパスを開く
2.セッション用パスに有効な情報をpostする
3.ログイン用リンクが表示されなくなったことを確認する
4.ログアウト用リンクが表示されていることを確認する
5.プロフィール用リンクが表示されていることを確認する

## 途中参考にしたページ
・主要ブラウザCookieの確認方法まとめ
https://qiita.com/pipi0813/items/93e60c605f89f93e49fb#chrome

・HTTPレスポンスヘッダ Expires とは？
https://weblabo.oscasierra.net/http-header-response-expires/

・Rails テスティングガイド
https://railsguides.jp/testing.html
fixtureとはいわゆるサンプルデータを言い換えたもの

・Atomでコメントアウトするときのお手軽裏ワザ
https://qiita.com/Mocacamo/items/429c9fb3ff39745379b6
「Command + /」(Macの場合)

・railsログアウト時のCookiesの状態
https://teratail.com/questions/61259
見れないっぽい

## 使用したコマンド
git checkout -b basic-login

rails generate controller Sessions new
rails routes
rails routes |grep sessions

rails generate integration_test users_login
rails test test/integration/users_login_test.rb

session = {}
session[:user_id] = nil
@current_user ||= User.find_by(id: session[:user_id])
session[:user_id]= User.first.id
@current_user ||= User.find_by(id: session[:user_id])
@current_user ||= User.find_by(id: session[:user_id])

heroku logs --tail
pythonの「for _ in range():」について

**「for _ in range():」**について備忘録。

pythonのfor文と言えば

```sample1.py
for `変数` in `オブジェクト`:
    #処理内容
```

で、変数には「i」,「j」,「k」,「loop」,「iter」などを使うと思います。
一方で、for文ではfor文の内側での処理内容にloop変数を使用しない場合があります。
その時に、for文の変数名に**「_(アンダーバー/アンダースコア, 正式名称はアンダーバー)」**を使うことで、変数名を無駄に使用することなくfor文によるloopが可能です。

```sample2.py
for _ in `オブジェクト`:
    #処理内容
```
例えばこんな感じ。
**コード**

```sample3.py
for _ in range(5):
  print("Atcoder")
```
**出力**

```python:output3
Atcoder
Atcoder
Atcoder
Atcoder
Atcoder
```

loopで繰り返し変数使わないのに指定するの気持ち悪いなあと思っていたので、今後はこれを使おうと思います。
【質問】Slack slash command→Driveでのフォルダ作成の仕方【GAS】

#Slack slash command→Driveでのフォルダ作成
初心者です。
slack slash command で　Drive内でフォルダを作成したいです。
それぞれのFunction （doPost, createFolder)は動くのですが
二つ並べて書いてコマンドを入力してもコメントが反映されるだけで
フォルダが作成されません。

プログラミング初心者なので根本的なところが間違っているのかと思うのですが
ご教授いただければ幸いです。

#現在のコード
function doPost(e) {
  return ContentService.createTextOutput("新しいフォルダを作成しました");}

function createFolder() {
  var folder  = DriveApp.getFolderById("＊＊＊＊＊＊＊＊＊＊＊＊＊＊");
  var args1   = ["new"];
  var args2   = ["01","02","03","04"];
  var folder1 = [];
  
  for (var i = 0; i < args1.length; i++){
    folder1[i] = folder.createFolder(args1[i]);
  }

  for (var i = 0; i < args2.length; i++){
    folder1[0].createFolder(args2[i]);
  }
}
MacでESP-32S＋ADS1115＋感光性センサーモジュールを動かす

MacでESP-32S＋ADS1115＋感光性センサーモジュールを動かした際の備忘録です。

# 用意

購入したもの
[ESP32 ESP-32S Aideepen 2個セット ESP-32ワイヤレスWiFi Bluetooth 2.4GHz CP2102マイクロUSBデュアルコアESP32-WROOM-32開発ボード](https://www.amazon.co.jp/gp/product/B07MH58JS2/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)
[HiLetgo 2個セット ADS1115 4チャンネル 16ビット I2C ADC モジュール ゲインアンプ Arduino Rpiと互換](https://www.amazon.co.jp/gp/product/B01D0WSCNG/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)
[HiLetgo 5個セット 感光性センサーモジュール 光抵抗体モジュール 4ピン [並行輸入品]](https://www.amazon.co.jp/gp/product/B010GX9DHQ/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)

# 前提
以下記事のように、ESP-32Sにコードを書き込める状態になっていることを前提とする。
> [MacでESP-32Sにコードを書き込む](https://qiita.com/seigot/items/ec7898411bd49fba7767)

# ADS1X15のライブラリをインストール

Arduino IDEから「ツール」→「ライブラリを管理」→「ads」で検索し「Adafruit ADS1X15」をインストール。

# 接続

以下を参考にします。

<img width="485" alt="スクリーンショット 2020-05-05 13.37.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/5d754a36-e581-d898-e1e9-734a25c341eb.png">

以下の通り接続します。

- ESP32 - 感光性センサーモジュール
3.3V - VCC
GND - GND

- ESP32 - ADS1115
VIN(5.0V) - VCC
GND - GND
D22(SCL) - SCL
D21(SDA) - SDA

- 感光性センサーモジュール - ADS1115
A0 - A0  # AnalogOut

![IMG_3633.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/33575b2d-d038-4957-643b-e09f5da79c69.jpeg)

# コードを書き込んで確認

確認用に、以下を引用させて頂きます。
> [ESP32とADS1115で電圧計測](https://otomizu.work/2019/10/22/esp32-ads1115/)

```c:sample
#include <Wire.h>
#include <Adafruit_ADS1015.h>
 
Adafruit_ADS1115 ads;
 
void setup(void) 
{
  Serial.begin(115200);
  ads.begin();
}
 
void loop(void) 
{
  int16_t adc0, adc1, adc2, adc3;
 
  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.println(" ");
 
  delay(1000);
}
```

スケッチ→マイコンボードに書き込みを行い、
シリアルモニタにセンサーの値が出力されればOK
<img width="355" alt="スクリーンショット 2020-05-05 14.17.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/7e8b47af-23ea-502f-e2c7-ea09ad292e29.png">

# 参考
[ESP32とADS1115で電圧計測](https://otomizu.work/2019/10/22/esp32-ads1115/)
[1-3.ESP-WROOM-32(D)](https://kit.socinno.com/1_3_b/)
[MacでESP-32Sにコードを書き込む](https://qiita.com/seigot/items/ec7898411bd49fba7767)
[MacでESP-32S＋感光性センサーモジュールを動かす](https://qiita.com/seigot/items/336213dce4cd6a61f025)
Nuxt.js のassets で静的画像ファイルを利用する  ( #nuxt #vue )

`assets/image.png` に画像ファイルを配置する
template の `img` タグで利用する

これだけ。

assets-image.vue

```vue
<template>
  <div>
    <h1>
      assset Image
    </h1>
    <img src="~/assets/image.jpg">
  </div>
</template>

<script>
export default {
}
</script>

```


![image](https://user-images.githubusercontent.com/13635059/80935856-81b20980-8e09-11ea-892b-0acc929c6982.png)


Viewのパスの例

http://localhost:3000/assets-image


画像パスの例

http://localhost:3000/_nuxt/assets/image.jpg

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3134











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GNU/Linuxにgoenvでgolangをセットアップする

## goenvのインストールと設定

git cloneでインストールします。

``` bash
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
```

環境変数などの設定を行います。ログインシェルやシステムによって[多少異なります](https://github.com/syndbg/goenv/blob/master/INSTALL.md#basic-github-checkout)。以下はDebian系でbashの場合です。

``` bash
$ vi ~/.bashrc
```

``` bash
# goenv

export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
eval "$(goenv init -)"
export PATH="$GOROOT/bin:$PATH"
export PATH="$PATH:$GOPATH/bin"
```

編集後、一度ログアウトします。

※面倒なGOPATHの設定はgoenvに任せます。デフォルトで`~/go`がgo関連のファイルが置かれるパスになります。`~/go`ディレクトリは自動的に作成されます。

## goenvによるgolangのセットアップ

以下のコマンドでセットアップを行います。

```
$ goenv install 1.13.0
$ goenv global 1.13.0
$ go version
go version go1.13 linux/amd64
```

※GOPATHで悩まなくて済むよう、GOのバージョンは1.13以降がよいと思います。先程の`~/go`とは関係なく、自分の好きなパスにソースコードを置くことができます。
Debian 10 (Buster) でswapを無効化する

Intel NUC (NUC8I7BEH)にDebianを標準構成でインストールした際に、swapの削除でハマりました。swapを無効化したいのは、メモリがたくさんあるからとか、SSDを消耗させたくないというのもありますが、kubernetesがswapありだと動作しないからです。

## swapの停止

```bash
$ sudo swapoff -a # swapの停止
$ sudo vi /etc/fstab # swapのエントリを削除
```

## swapパーティションの削除

しかし、UEFI + systemd なシステムではパーティション情報を読み込んで、スワップを自動的に設定してしまいます。GNOME Diskでswapパーティションを削除する必要があります。

## resume機能の無効化

swapパーティションを削除すると、ブート時にresume用のパーティションを探すために30秒のタイムアウトが発生します。これを回避するためにブート時のカーネルパラメータで`noresume`を指定します。

```bash
$ sudo vi /etc/default/grub
```

以下の行に`noresume`を追加します。`splash`はお好みで。

```bash
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash noresume" # noresumeを追加
```

設定を反映させるためにrootで`update-grub`コマンドを実行します。

```
[root] $ update-grub
```
macのEclipseで補完機能を使う

今回はJavaの勉強を始めようとEclipseをMacに入れた時には補完機能が使えなかったため記録

Eclipseにデフォルトで設定されている補完機能は、contorol + スペース なのだがMacでは使えず、、、

調べた結果記事はいっぱいあったのですぐに解決。
一応やり方を載せとく


Eclipseの環境設定 → 一般 → キー → コンテンツ・アシストで検索 すると下記のように
<img width="924" alt="スクリーンショット 2020-05-05 13.56.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558198/f68b2972-61a4-83e5-e58f-983c0879e864.png">

今回は、シフト + スペース　で設定したかったため
バインディングと書かれているところに、シフト + スペース と記入。

これで補完機能使えるようになっている。
他にもやり方があると思うが参考に！！
Laravel ログイン機能実装

#laravel6系での環境構築からログイン機能実装でつまずいた所

参考にさせていただいた記事

Laradockでの環境構築
https://qiita.com/mukae_tech/items/24709085948a6d707da3

https://atuweb.net/202003f_laravel-ui-composer-error/

##Laravel 6 の場合
まずは結果から

```
$ composer require laravel/ui:1.2.0
```
もしここで `composer require laravel/ui` でバージョン指定しないと６系の場合は７系にしろと怒られます。



#####エラー内容

```
 - Conclusion: don't install laravel/framework v6.18.11
    - laravel/ui 2.x-dev requires illuminate/filesystem ^7.0 -> satisfiable by illuminate/filesystem[7.x-dev, v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.2.0, v7.2.1, v7.2.2, v7.3.0, v7.4.0, v7.5.0, v7.5.1, v7.5.2, v7.6.0, v7.6.1, v7.6.2, v7.7.0, v7.7.1, v7.8.0, v7.8.1, v7.9.0, v7.9.1, v7.9.2].
```

必要であれば`composer update`

やっとこれでlaravel/uiが使えます。

```
$ php artisan ui vue --auth
```

```
$ npm install
```

```
$ npm run dev
```

またここで怒られてますね。
#####エラー内容

```
Module build failed (from ./node_modules/css-loader/index.js): ModuleBuildError: Module build failed (from ./node_modules/sass-loader/dist/cjs.js): ValidationError: Invalid options object. Sass Loader has been initialized using an options object that does not match the API schema.
```

`sass-loader`の6系でのバージョンの問題である可能性があるので対策としては


```
$ npm uninstall --save-dev sass-loader
```

```
$ npm install --save-dev sass-loader@7.1.0
```

もう一度

```
$ npm run dev
```

```
 DONE  Compiled successfully in 10764ms                                                                                                                                                                                             4:37:32 AM

       Asset     Size   Chunks             Chunk Names
/css/app.css  177 KiB  /js/app  [emitted]  /js/app
  /js/app.js  1.4 MiB  /js/app  [emitted]  /js/app
```

おわり
AWS Amplify のエラー対処 Could not find a declaration file for module 'graphql/language/ast'.

# 発生した問題
ビルド実行時に下記のエラーが出る

```
1:30 Could not find a declaration file for module 'graphql/language/ast'. 

  Try `npm install @types/graphql` if it exists or add a new declaration (.d.ts) file co
ntaining `declare module 'graphql/language/ast';`
  > 1 | import { DocumentNode } from 'graphql/language/ast';
      |                              ^
    2 | export interface GraphQLOptions {
    3 |     query: string | DocumentNode;
    4 |     variables?: object;

 ERROR  Build failed with errors.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! front@0.1.0 build: `vue-cli-service build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the front@0.1.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
```

# 対処１
下記のコマンドを実行し、ビルドしたがダメだった

```
npm install @types/graphql
```

# 対処2
@types を抜いてインストールし、ビルドすると成功した。

```
npm install graphql
```
動的計画法の勉強①

動的計画法というアルゴリズム(?)を勉強しました。![3F2E6842-BA7D-42BB-AFD2-7E162E5BCA6E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632018/a57bf35f-7043-8b92-e75a-816ef6aecfa4.jpeg)

まずは、簡単な方→![ADA10812-D03C-4049-9B32-BF00B2EC3AB3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632018/cd479474-568d-2582-65c5-474df8491fca.jpeg)
![48EEE6C8-EE6A-46DD-94F8-2417FE85F8F4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632018/5b53dff2-e235-fb05-71da-140f1506dacc.jpeg)

そしてムズいほう→![825840D7-AE0F-4699-B1CB-6AC67C487421.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632018/7720321f-064d-68d4-9986-7f1f2b42e561.jpeg)
![BD03E4D9-B32C-4844-95F1-1E62391CE71A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632018/f8f767bc-66dc-8d58-5fa6-d901f09b4c62.jpeg)


最初の方は貰うDP、後の方は配るDPで書きました。動的計画法は簡単に言うと、1つずつの重みを順番に比べていって全てのパターンを埋める、という方法ですね！まぁ全探索なのでオーダーなかなか大きいですが、やり方を知ってるのと知らないのでは大きいと思います！！続きも頑張ります！！
Rustで特定のテストを走らせる方法

いつもいつもどうやってやるんだったか思い出せません。

ということでメモ。

[How to run a specific unit test in Rust](https://users.rust-lang.org/t/how-to-run-a-specific-unit-test-in-rust/25077)を読んでもなおハマりました。

このテストだけ実行したいのだけど、このテストだけってどうやって呼び出すんだったかいな・・・・えーとディレクトリ名が・・・

とかやってるあなた向けです。

# 今北産業

```bash
cargo test --all func_name_of_test
```

ポイントは```--all```です。とりあえずこれだけ覚えとけばいいような気がします。

## 欠点

- func_name_of_test1
- func_name_of_test2
- func_name_of_test3

というテストがあったとき全部実行されます。大変うざいです。
これは名前をきちんと指定するしかないですね。


すべてのcrateのテストを実行するので出力も多くなります。

```

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/xxxx

```

が大量に出てきます。
(消す方法知ってる人は教えて下さい。)


# なんでハマったか

基本は

```bash
cargo test func_name_of_test
```
です。

ただこれ、crateがたくさん入ってるようなコードベースだと、上手く行かないようです。

# exactは?

```bash
cargo test --all -- --exact func_name_of_test
```

ではダメで

```bash
cargo test --all -- --exact foo::tests::func_name_of_test
```

みたいにフルで指定しないといけないようです。
Docker内でPython-GUIアプリを作成する(PySimpleGUI)

# この記事で学べること

- Dockerを利用したPySimpleGUIの開発環境の構築【PySimpleGUI】
- Dockerを利用したGUIの開発環境の構築【Docker & X11 & VcXsrv】

# 前提条件

- Docker 及び Docker-compose が導入済みであること
- Python 及び Docker の基本的な利用ができること
- X11の概要をしっているとなお良い

自分はDockerToolboxを利用していますが、Docker Desktopでもできるはず（未検証）

# ホスト側の設定とコンテナの準備

## ホスト側の設定（VcXsrvの導入）

ホスト側でコンテナのWindowを表示するために、VcXsrvを導入する。
[VcXsrv：ダウンロードリンク](https://sourceforge.net/projects/vcxsrv/)

ここでセキュリティのエラーを回避するためにコンテナが起動しているVM等のIPアドレスを取得する。
取得したIPアドレスをVcXsrvがインストールされているフォルダの「x0.hosts」へ追記する。

通常インストール先：C:\Program Files\VcXsrv

インストールしたらXLanuchをデフォルトの設定で起動する。
タスクバーで起動していればOK！

## コンテナの準備

DockerfileとDocker-compose.ymlを作成する。

```Dockefile:Docekrfile
# 最低限必要な部分だけ抜粋
FROM python:3.8.2

RUN pip install pysimplegui
```
pip installでPySimpleGUIをインストールしているだけ。
ユーザーやフォルダ、他の依存関係等々の設定は自分で足すこと。

```yml:Docker-compose.yml
version: "3.2"
services:
  python-gui:
    build: .
    restart: always
    tty: true
    volumes:
      - ホスト側フォルダ:コンテナ側フォルダ
    environment:
      - DISPLAY=ホストIPアドレス:0.0
```
X11の設定を環境変数でしている。
ここでのホストIPアドレスは、DockerNatのIPアドレスやVirtualBoxネットワークのIPアドレスになる。
（当たり前だけどコンテナと繋がっているネットワークじゃないとダメ）

[Qiita参考記事：Docker for WindowsでGUI(sshでX11転送しない方法)](https://qiita.com/kfjt/items/369c48686c849c0042a9)

ここまでできたらコンテナを起動して、準備完了

```sh
docker-compose up -d --build
```

# PySImpleGUIの利用

作成したコードを実行すれば、ホスト側にWindowが作成されるはず。

以下のようなエラーが出た場合はX11の設定がうまく行ってないので、再度設定を見直す。

```:ErrorMessage
省略　: couldn't connect to display "ホストIPアドレス:0.0"
```
---
環境構築メインの記事なので、コードの作成方法は下記記事を参照してください。

公式のドキュメントがしっかりしていて良い。

- [PySimpleGUI](https://pysimplegui.readthedocs.io/en/latest/)
    - 全体の説明や各要素の説明などがある。
- [PySimpleGUI Cookbook](https://pysimplegui.readthedocs.io/en/latest/cookbook/)
    - コードのサンプル集で解説もある。
- [Github：PySimpleGUI DemoPrograms]()
    - 公式Githubの中にコード例が色々あって参考になる

日本語で参考になった記事も上げておく

- [Qiita記事：Tkinterを使うのであればPySimpleGUIを使ってみたらという話](https://qiita.com/dario_okazaki/items/656de21cab5c81cabe59) 
    - 概要から簡単な例まで丁寧でわかりやすい記事、記事末に日本語資料の解説記事リンクあり。
- [Qiita記事：PySimpleGUIの基本的な使用方法](https://qiita.com/KatsunoriNakamura/items/376da645e52f7ef7f9ef)
    - 各要素の解説をしているPDFのテキスト。

# 追記
コンテナで作成したアプリケーションをWindows向けにEXE化する方法も記事にしました。
[PythonのWindows用EXE化をDockerコンテナで実現する方法](https://qiita.com/torun225/items/9756983b6907b5a7c54e)
Ansibleのpingモジュールについて

Ansibleにpingモジュールというのがありますが、これはLinuxのコマンドと仕様が違うようだったので、コミュニティに聞いたりして調べたのでQiitaに残します。

## pingモジュールとは

公式は[こちら](https://docs.ansible.com/ansible/latest/modules/ping_module.html)です。
公式にもありますが、pingモジュールにはコマンドで使うような指定したアドレスとの疎通確認には使えません。

`対象サーバでAnsibleが使用出来るか`を確認する為のモジュールのようで、
Pythonが入ってるか見てくれるようです。

## 実行結果

これだけだと記事として微妙かなと思ったので、実行したらどうなるかコードを書いてみました。debugモジュールで何が出力されるか確認。


```
- hosts: webservers
  tasks:

  - name: ping
    ping:
    register: result

  - name: debug
    debug: 
      msg: "{{ result }}"
```

実行結果です。

```
ansible-playbook -i inventory playbook.yml                                                               

PLAY [webservers] ************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************
ok: [**.***.***.***]

TASK [ping] ******************************************************************************************************************
ok: [**.***.***.***]

TASK [debug] *****************************************************************************************************************
ok: [**.***.***.***] => {
    "msg": {
        "changed": false,
        "failed": false,
        "ping": "pong"
    }
}

PLAY RECAP *******************************************************************************************************************
**.***.***.***             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

pingにpongが格納されてますね。これが成功ということみたいです。遊び心？

## 終わりに
pingモジュールはこれの他にもnet_pingなど、色んな種類のpingモジュールがあるようですが、どれもlinuxコマンドのようなpingではありませんでした。

どうしてもやりたければcommandモジュールかshellモジュールを使うしかないようです。
homebrewを使った各種インストール

# homebrewの導入
```bash:bash
$ ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)”
```

# PHPインストール
```bash:bash
$ brew install php@7.4
$ brew link --force php@7.4
```



# Mysqlインストール
```bash:bash
$ brew install mysql
```

# Gitインストール
```bash:bash
$ brew install git
$ brew link --overwrite git
```
MacでESP-32S＋感光性センサーモジュールを動かす

MacでESP-32S＋感光性センサーモジュールを動かした際の備忘録です。

# 用意

購入したもの
[ESP32 ESP-32S Aideepen 2個セット ESP-32ワイヤレスWiFi Bluetooth 2.4GHz CP2102マイクロUSBデュアルコアESP32-WROOM-32開発ボード](https://www.amazon.co.jp/gp/product/B07MH58JS2/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)
[HiLetgo 5個セット 感光性センサーモジュール 光抵抗体モジュール 4ピン [並行輸入品]](https://www.amazon.co.jp/gp/product/B010GX9DHQ/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)

# 前提
以下記事のように、ESP-32Sにコードを書き込める状態になっていることを前提とする。
> [MacでESP-32Sにコードを書き込む](https://qiita.com/seigot/items/ec7898411bd49fba7767)

# ピンを接続する

以下を参考にしました。

> [https://kit.socinno.com/1_3_b/](https://kit.socinno.com/1_3_b/)
> 図B.ESP-WROOM-32(30pin)

<img width="485" alt="スクリーンショット 2020-05-05 13.37.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/6430f65a-8aab-19b6-af7d-70e69eeebab7.png">


ESP32 - 感光性センサーモジュール
3.3V - VCC
GND - GND
VP - A0   # AnalogOut 0

![IMG_3632.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/4a719a9a-4d4d-9cf7-297d-c2806d39145d.jpeg)

# 動作確認

```c:sample
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(115200);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.println(sensorValue);
  delay(1);        // delay in between reads for stability
}
```

スケッチ→マイコンボードに書き込むとした後、
シリアルモニタに値が出力されていればOK

<img width="354" alt="スクリーンショット 2020-05-05 13.37.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/3218e85c-d1a6-ce8e-f961-7b1631e39329.png">

# 参考
[MacでESP-32Sにコードを書き込む](https://qiita.com/seigot/items/ec7898411bd49fba7767)
[https://kit.socinno.com/1_3_b/](https://kit.socinno.com/1_3_b/)
[ESP32のアナログ入力（ADC）可能なピン](https://qiita.com/klme_u6/items/e29e4b57fd149488d1c3)
[ESP-32でアナログ入力を使うときの注意点](https://qiita.com/klme_u6/items/e29e4b57fd149488d1c3)
その分数は整数と等価か？

# はじめに

1.23や34.5などの数値は小数ですよね。整数ではありません。
1.0や34.0も小数ですが、まあ整数ともいえるのかもしれません。

1/3などの分数も、整数ではありません。
3/3の分数は、整数ともいえそうです。

ここでは整数をこのように定義します。
"1や34などの他、1.0や3.0のように小数点以下が0である数と、分子・分母が共に同じ数である分数"

この記事では、分数や小数でありながら整数でもあるリテラルを判別する方法について考察していきます。

# そもそも、分数の表現方法とは

純粋な整数や小数は以下のように、変数に数値を入力するだけで済みます。

```Python

a = 123
b = 123.4
print(a)
print(b)

# 123
# 123.4
```

一方で分数はというと、上記と同様に"1/4"などと記述すると計算処理が自動的に行われてしまうため、表現できません。
そこでPythonの標準ライブラリ fractionsを利用します。

```Python
from fractions import Fraction

f = Fraction(1, 3)
print(f)

# 1/3
```


# 小数の判別ならかんたん

## is_integer() メソッドを使って小数を判別してみる

小数に対しては、is_integer()メソッドを使うことで判定できます。

```Python
n = 1.23
print(n.is_integer())
# False

m = 1.00
print(m.is_integer())
# True

```

## is_integer()メソッドを使って分数を判別してみる

しかし、fractionsを用いた分数表現には利用できません。

```Python

from fractions import Fraction

f = Fraction(1, 3)
print(f.is_integer())

# AttributeError: 'Fraction' object has no attribute 'is_integer'
```

# 分数を小数に変換してis_integer()を適用する

分数にis_integer()メソッドが使えないのならどうすればよいのか。
分数として定義されたリテラルを小数（float型）に直してやれば、is_integer()メソッドは問題なく利用できるはずです。

分数として定義されたリテラルを、~~1.0で割ってやることで小数に変換します。~~
コメント欄にてご指摘いただきまして、
`float(hoge)`というアプローチにより、直感的に分かりやすいよう変更しました。

この操作を挟むことで、is_integer()メソッドによる判定が可能になりました。

```Python
from fractions import Fraction

f = Fraction(1, 3)
g = float(f)

x = Fraction(3, 3)
y = float(x)

print(g)
print(y)
# 0.3333333333333333
# 1.0

print(g.is_integer())
print(y.is_integer())
# False
# True

```

# おまけ：is_integer()メソッドがなかったらどうする？

is_integerの存在を知らなかった当時の私が考えた、遠回りな判定方法も紹介しておきます。

**小数点以下を切り上げした数と、小数点以下を切り下げした数が一致していれば整数と判断する**
という考えに基づいてアプローチします。

例えば1.1という数について、小数点以下を切り上げればこれは2になります。
逆に小数点以下切り下げであれば1です。
数が一致しないので、これは整数ではないと。

1.0であれば、小数点以下切り上げでも切り下げでも同じ1となるので、これは整数であると、そういう理屈です。

小数点切り上げにはmathライブラリのceil()メソッド、
切り下げには同じくmathライブラリのfloor()メソッドを使うことで、このように判別が可能になりました。
下記の関数は、1.23のような小数に対しても有効です。

```Python
from fractions import Fraction
import math


def isInteger(n):

    nx = math.ceil(n)
    ny = math.floor(n)

    return (nx == ny)


n = Fraction(1, 3)
m = Fraction(3, 3)

print(isInteger(n))
print(isInteger(m))
# False
# True

```
（mac os）vagrantでubuntu仮想環境を構築しssh接続



前提条件
・mac
・virtual box, vagrantがインストールされていること

1.ディレクトリを作成&&移動

```
mkdir -p ~/vagrant/ubuntu64_18 && cd ~/vagrant/ubuntu64_18
```

2.コンソールから Vagrant を実行して Ubuntu仮想環境を作成(所要時間10分程度)

```
vagrant box add ubuntu/bionic64 --box-version 20181129.0.0

//下記メッセージが表示されれば成功
==> box: Successfully added box 'ubuntu/bionic64' (v20181129.0.0) for 'virtualbox'!
```

3.vagrantを起動

```
vagrant init ubuntu/bionic64

vagrant　up
```

4.立ち上げたubuntuにssh接続

```
vagrant ssh

//接続成功
vagrant@ubuntu-bionic:~$
```

5.vagrantを終了

```
//ubuntuからログアウト
vagrant@ubuntu-bionic:~$ exit

//vagrantの電源をきる
vagrant halt

（起動したい場合はvagrant up再び起動）
```

補足

・ubuntuの日本語化

```
sudo locale-gen ja_JP.UTF-8
echo export LANG=ja_JP.UTF-8 >> ~/.profile
source ~/.profile

//日本標準時間
sudo timedatectl set-timezone Asia/Tokyo

//dateで確認
vagrant@ubuntu-bionic:~$ date
2020年  5月  4日 月曜日 13:15:50 JST
```
VSCodeのGo言語拡張から学ぶGOROOT

## はじめに
[A Tour of Go](https://go-tour-jp.appspot.com/list)をやるためにローカルにGoをインストールしたのですが、環境変数設定やPathを通していないのにVSCodeで**デバッグなしで実行**が選べた為、不思議に思い拡張のソースコードを読んで疑問を解決したので一応の共有です。

## 結論
デフォルトインストールディレクトリの`/usr/local/go/bin/go`を直接見ていたので環境変数設定やPathを通してなくても実行できた。

## 調査環境
- Ubuntu 20.04LTS
- go version go1.14.2 linux/amd64

## 調査内容
環境変数設定やPathを通していないのに実行できるということは、どこかでインストールディレクトリを見ているという予想ができるので拡張の中身をそれっぽい文字列で検索してみる

```bash
jh1ovv@ThinkPad-X1:~$ pwd
/home/jh1ovv
jh1ovv@ThinkPad-X1:~$ cd .vscode/extensions/
jh1ovv@ThinkPad-X1:~/.vscode/extensions$ find ms-vscode.go-0.14.1/ -type f | xargs grep bin/go
ms-vscode.go-0.14.1/out/src/goPath.js:        const defaultPathForGo = process.platform === 'win32' ? 'C:\\Go\\bin\\go.exe' : '/usr/local/go/bin/go';
```

```js:/home/jh1ovv/.vscode/extensions/ms-vscode.go-0.14.1/out/src/goPath.js
...
	// Check GOROOT (go, gofmt, godoc would be found here)
	const pathFromGoRoot = getBinPathFromEnvVar(binname, process.env['GOROOT'], true);
	if (pathFromGoRoot) {
		binPathCache[toolName] = pathFromGoRoot;
		return pathFromGoRoot;
	}

	// Finally search PATH parts
	const pathFromPath = getBinPathFromEnvVar(binname, envPath, false);
	if (pathFromPath) {
		binPathCache[toolName] = pathFromPath;
		return pathFromPath;
	}

	// Check default path for go
	if (toolName === 'go') {
		const defaultPathForGo = process.platform === 'win32' ? 'C:\\Go\\bin\\go.exe' : '/usr/local/go/bin/go';
		if (executableFileExists(defaultPathForGo)) {
			binPathCache[toolName] = defaultPathForGo;
			return defaultPathForGo;
		}
		return;
	}
...
```
デフォルトインストールディレクトリの`/usr/local/go/bin/go`を直接見ていた

## おわりに
複数プロジェクトなどで複数バージョンを使う場合はどうやっても何かしらのPATHを設定しないといけないので、完全に小ネタです。
【Ruby・初心者】ハッシュとは自分用

##ハッシュとは？

小さなデータの集まり。

番号ではなくキー（テキスト）と呼ばれるデータを扱うことによって管理できる。→配列との違い。配列はインデックスと呼ばれる番号を指定して管理する。
ハッシュは複数のデータをまとめて扱う。

###見方

キー、ハッシュの順です。

```
hash_sample = ["キー" => "ハッシュ","キー" => "ハッシュ","キー" => "ハッシュ","キー" => "ハッシュ",]
#こんな感じで省略可能↓
hash_sample = [キー:"ハッシュ",キー:"ハッシュ",キー:"ハッシュ",キー:"ハッシュ",キー:"ハッシュ",キー:"ハッシュ"]
```

##ハッシュの機能
###番号ではなくキー（テキスト）を指定してデータを取り出せる。

例

```
hash_sample = ["ああ"、"いい"、"うう"]   #ああ、いい、ううがキー
puts hash_sample["ああ"]    =>"ああ"        #ああを直接指定して取り出せる。
```


###キーを変数で定義しても取り出せる。
例

```
hash_sample = ["ああ"、"いい"、"うう"]   #ああ、いい、ううがキー
n = いい 
puts hash_sample[n]     =>"いい"       #いいを取り出せる。
```

###lengthメソッドを使ってデータの個数を指定できる。

```
hash_sample = ["ああ"、"いい"、"うう"]   #ああ、いい、ううがキー
puts hash_sample.length     =>3     #hash_sampleのデータの個数を出力できる。
```


###簡単にデータの追加、データの更新、データの削除ができる。

####追加

```
enemies = {"ザコ" => "スライム", "中ボス" => "ドラゴン", "ラスボス" => "魔王"}
enemies["ザコ2"] = "メタルモンスター"  #ハッシュを追加
p enemies      <=  {"ザコ" => "スライム", "中ボス" => "ドラゴン", "ラスボス" => "魔王","ザコ2" => "メタルモンスター"}
```

####更新


```
enemies = {"ザコ" => "スライム", "中ボス" => "ドラゴン", "ラスボス" => "魔王"}
enemies["中ボス"] = "レッドドラゴン"　　#ハッシュを更新
puts enemies.length  =>  {"ザコ" => "スライム", "中ボス" => "レッドドラゴン", "ラスボス" => "魔王"}
```

####削除

削除の場合は[]ではなく()でくくる。 
```
enemies = {"ザコ" => "スライム", "中ボス" => "ドラゴン", "ラスボス" => "魔王"}
enemies.delete("ザコ")            ##ハッシュを削除
p enemies      => {"中ボス" => "ドラゴン", "ラスボス" => "魔王"}
```

##ハッシュの使い所

###データベースとやり取りするデータの処理
横（レコード）を取り出したい際はハッシュで処理すると楽。
縦列を取り出したい際には配列が楽。

| Left align       |       Right align |    Center align    |
|:-----------------|------------------:|:------------------:|
| This             |              This |        This        |
| column           |            column |       column       |
| will             |              will |        will        |
| be               |                be |         be         |
| left             |             right |       center       |
| aligned          |           aligned |      aligned       |


###APIとやり取りするデータの処理



##ハッシュをループ処理で取り出す方法

###ハッシュの場合はeach_valueメソッドを使う。

```
skills = {"職業" => "戦士", "体力" => 100, "魔法力" => 200, "ゴールド" => 380}
skills.each_value do |skill|
    puts "#{skill}" 
end
```


###each_valueメソッドで変数を複数指定した場合

```
skills = {"職業" => "戦士", "体力" => 100, "魔法力" => 200, "ゴールド" => 380}
skills.each_value do |skill,n|
    puts "#{skill}は#{n}です"
end
```

###each_valueメソッドでハッシュの値の合計を計算して出力する場合

```
points = {"国語" => 70, "算数" => 35, "英語" => 52}
sum = 0
points.each_value do |point|
    sum += point
end
puts sum
```


##ハッシュをソート（整列）させる

###値でソートさせる


```
apples = [310, 322, 292, 288, 300, 346]
p apples.sort    
```


###値を逆順にソートさせる

```
apples = [310, 322, 292, 288, 300, 346]
p apples.sort.reverse
```


###ソートの順番について
ハッシュの先頭のアルファベット、数字で決まる。
漢字が含まれている場合あらかじめ決められている順番になる。



###キーでソートする場合には.to_hメソッドを使う。

to_hメソッド・・・配列をハッシュに変換するメソッド。

```
math = {"えんどう" => 99, "あだち" => 40, "いいだ" => 12}
p math.sort.to_h
```

###値（ハッシュ）でソートする

aがキー、bがハッシュでbを選んでいる。

```
math = {"あだち" => 40, "いいだ" => 12, "えんどう" => 99}
p math.sort_by {|a,b| b }
```


##シンボルの使い方

シンボルとはコロン:をつけて""なしで表示されているもの。記述が簡単になる。
AtCoder備忘録(Python3)

AtCoder Beginners Selectionに取り組んだ時の備忘録

↓各桁の和を求める
　参考：https://www.suzu6.net/posts/30/

```python
def digitSum(n):
    # 数値を文字列に変換
    s = str(n)
    # １文字ずつ数値化し配列にする。
    array = list(map(int, s))
    # 合計値を返す
    return sum(array)
```

↓スペース区切りで複数回入力しリスト(l)に格納する

```Python
l = list(map(int, input().split()))
```

↓スペース区切りで複数回整数を入力し各変数に格納する

```python
n, a, b=(int(x) for x in input().split())
```

↓リスト(l)の各要素を２で割る

```Python
l = list(map(lambda x: x / 2, l))
```

↓リスト(l)を降順に並び替える

```python
l_sorted = sorted(l, reverse=True)
````
ハイパーリンクを別タグで開く

備忘録として、残します。
webに関しては初心者なので「知っているよ！」という人はご了承願いします。
# HTML内でタグにハイパーリンクを指定した後に別タグで開かせる方法
aタグでtarget属性に"_blank"を指定でブラウザで別タグで開くことが可能
※同じタブ内で開かせたい場合は、"_self"を指定する。

```
<li><a href="URL絶対パス" target="_blank"></a></li>
```

参考教材：
Udemy
[HTML/CSS/JavaScript] フロントエンドエンジニアになりたい人の Webプログラミング入門
Shibboleth便利ツール

#背景
ShibbolethにはHandlerの一部としていくつかブラウザベースの便利ツールが用意されている。

参考：[Shibboleth Wiki - Handler](https://wiki.shibboleth.net/confluence/display/SP3/Handler)

#環境
- Windows Server 2016
- Apache 2.4
- Shibboleth 3.x

#前提
Apache + Shibbolethの設定はできているものとする。
関連記事：[Apache + OneLogin SSO with Shibboleth](https://qiita.com/hiro-jp/items/096bbaf647a9e4a3ae18)

Apacheのhttpd.confにおいてHandlerのロケーションは次のように設定されているものとする。

```httpd.conf
<Location /Shibboleth.sso>
  SetHandler shib
</Location>
```

※httpd.confのLocationとは：ドメイン上のリソースの相対パス。ドメインが`localhost`である場合、ロケーション`/`は、`http://localhost/`を表す。ロケーションが`/login/`であれば、`http://localhost/login/`を表す。上記のコードは、`http://localhost/Shibboleth.sso`に対して'shib'というハンドラをセットするという意味。

なお、以下でもホスト名はとりあえず`localhost`とする。

#Metadata Generation Handler
Linux環境では、`/etc/shibboleth/metagen.sh`によってmetadataを生成できるらしいが、Windows版にはない。環境によらず、`http://localhost/Shibboleth.sso/Metadata`にGETリクエストを送ると、SPの設定に基づくMetadata（のサンプル）をダウンロードできる。

参考：[Shibboleth Wiki - Metadata Generation Handler](https://wiki.shibboleth.net/confluence/display/SP3/Metadata+Generation+Handler)

#Status Handler
`https://localhost/Shibboleth.sso/Status`にGETリクエストを送ると、SPの各種ステータスをXML形式で返す。
有効になっているハンドラや、証明書の情報などが載っている。秘密にすべき情報が載る場合があるので、管理者以外は見られないようにすべきとShibboleth Wikiには書いてある。

参考：[Shibboleth Wiki - Status Handler](https://wiki.shibboleth.net/confluence/display/SP3/Status+Handler)

#Session Handler
`http://localhost/Shibboleth.sso/Session`にGETリクエストを送ると、デバッグ用のShibboleth Session情報を返す。

```
Miscellaneous
Session Expiration (barring inactivity): 479 minute(s)
Client Address: ::1
SSO Protocol: urn:oasis:name:tc:SAML:2.0:protocol
Identity Provider: https://app.onelogin.com/saml/metadata/e5ca0b3b-d8e7-4551-8884-64b59e16c482
Authentication Time: 2020-05-05T03:59:06Z
Authentication Context Class: urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
Authentication Context Decl: (none)

>Attributes
givenName: 1 value(s)
sn: 1 value(s)
xusername: 1 value(s)
```

有効なセッションが無い場合は次の表示になる。

```
A valid session was not found.
```

参考：[Shibboleth Wiki - Session Handler](https://wiki.shibboleth.net/confluence/display/SP3/Session+Handler)
【Swift】00:00:00表示　pickerを用いたカウントダウンタイマーの実装

##【はじめに】　
ラベルに00:00:00と表示するカウントダウンタイマーで、pickerを用いた実装方法をまとめてみました。
参考になれば幸いです。


##【目次】
・デザイン

・picker画面詳細
・timer画面詳細
・参考サイト
・最後に

##【デザイン】
<img width="353" alt="スクリーンショット 2020-05-05 12.33.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588319/2d746cc3-d38c-4314-7647-dba499c865ea.png">
<img width="351" alt="スクリーンショット 2020-05-05 13.00.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588319/0255c038-d320-acfa-7da7-a6cf4ba06388.png">






   


##【合計する関数】
```swift

func total() {
        timeTotal = timeList[0][timePicker.selectedRow(inComponent: 0)] * 60 * 60 + timeList[0][timePicker.selectedRow(inComponent: 1)] * 60 + timeList[0][timePicker.selectedRow(inComponent: 2)]
```
pickerのそれぞれの列で選ばれた値[timePicker.selectedRow(inComponent: 0or1or2)]を合計する（秒に換算する）メソットです。
時間は  * 60  * 60
分は    * 60 
と秒に置き換えて合計する。

```swift

timer.getTime = timeTotal
```
合計した値を遷移先に渡す

##【timer画面詳細】
```swift
@IBAction func StartButton(_ sender: Any) {
     //タイマーが有効なら　何もしない
     if timer.isValid == true {
                return
            }
        
             runTimer()
    }
```

　スタートボタンを押したあとでもう一度押すと-2秒や-4秒となるのを防ぐため
タイマーが有効の時はボタンを押しても何も起こらないようにする。

runTimer()　ではじめて押した時はタイマー起動

```swift

@objc func updateTimer() -> Int {
       
        count += 1
        //時間　＝　pickerで設定する時間　ー　count
        let remainCount = getTime! - count
        timerLabel.text = timeString(time: TimeInterval(remainCount))
```

受け取った値(getTime)から1秒ごとに増えるcountを引いてカウントダウンを行う。

受け取った値のまま表示させると2分だと120と秒数が表示される。
その値を00:00:00表式でラベルに表示できるように変更する。

```swift
 func timeString(time: TimeInterval) -> String {
          let hour = Int(time) / 3600
          let minutes = Int(time) / 60 % 60
          let second = Int(time) % 60
          
          return String(format: "%02d:%02d:%02d", hour, minutes, second)
      }
```


00:00:00表式でラベルに表示するメソット

TimeIntervalは[apple公式サイト](https://developer.apple.com/documentation/foundation/timeinterval)によると
「値は常に秒単位で指定します。10,000年の範囲でサブミリ秒の精度を実現します。」とのこと。

時間はTimeIntervalを　3600を割る
分はTimeIntervalを　　60で割り６０で割った余り
秒はTimeIntervalを　　60で割った余り
となる。


##【参考サイト】
[【Swift】コードを使った二つの画面遷移の方法]
(https://qiita.com/zlia_7/items/e99b77372d8c0f38d98b)
[【swift5】カウントダウンタイマーの実装]
(https://qiita.com/sventouz/items/e419ef5a9955ce06d043)

##【最後に】
もっと詳細が知りたい方や指摘して頂ける方などお気軽にコメントください。
たくさんのフィードバックを頂けると幸いです。
【Java】 String型の正しい比較

#String型比較を深堀してみる
String型の値の比較について、整理しました。

##等比較の方法
###1. ==
　・プリミティブ型では値の比較を行う。
　・オブジェクト型ではオブジェクトの参照値を比較し、オブジェクトが同一か判断する。

###2. equals()
　オブジェクト型でのみ使用可能で、オブジェクトの内容比較を行い、オブジェクトが同値か判断する。
　※Objectクラスにequalsが定義されている。
　　Stringクラスではoverrideしている。

つまり、Strng型は参照型のオブジェクトだから、equalsを使えばOKですね。

##検証（==だと本当に比較できないのか）

```java:StringSample.java
    String str1 = "A";
    String str2 = "A";
    String str3 = new String("A");
    System.out.println(str1.hashCode());
    System.out.println(str2.hashCode());
    if(str1 == str2) {
        System.out.println("TRUE");
    }else {
        System.out.println("FALSE");
    }
    if(str1 == str3) {
        System.out.println("TRUE");
    }else {
        System.out.println("FALSE");
    }
```
##結果
```
100
100
TRUE
```
TRUEになった。String型は==でも比較していいのか。

#調査
String型は初期化された際にヒープ領域に値が作られるが、同じ値を使用する場合は使いまわすらしい。

※newされた場合は新しく領域が作られる。

#図解してみた
![String比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621352/fa5db5b3-2fcd-f23b-75d6-ad4879731ba4.png)



メモリ節約のため、newせずに値"A"が一致する領域（アドレス=100）を使いまわす。
※参照値：参照先のメモリアドレス

##Stringの値を変更した場合の動作
![String比較2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621352/95fb14b4-b37a-da5d-032f-12603a84fc4e.png)

変数の値を書き換えると参照元の値（アドレス=100）が変更されるのではなく、"B"の新しい領域をnewして参照先を変更するんですね。（参照先アドレスを100→200に変更）
※Stringはイミュータブルのため、参照先の値を変更できない。

#Stringオブジェクトのequalsはなにをやっているか

```java:String.class
    private final char value[];

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;                //自オブジェクトのvalue
                char v2[] = anotherString.value;  //比較先オブジェクトのvalue
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])           //Stirngをcharに分解して値比較
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
```
Stringオブジェクトをchar[]に分解して1つずつ値を比較している。

#結論
Stringオブジェクトはメモリ節約のために同じ値の場合は異なるローカル変数でも参照値（参照先アドレス）が同一になる可能性があるが、保証はされていないので、equalsで比較するべし。
Gitとは

# Gitとは

アプリ開発を行う際にgitと言うものを使いますがそもそもgitってなんだろうと思ったので自分用にまとめました。

以下はwikiに掲載されている情報です

>''gitは、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。
gitでは、各ユーザのワーキングディレクトリに、全履歴を含んだリポジトリの完全な複製が作られる。したがって、ネットワークにアクセスできないなどの理由で中心リポジトリにアクセスできない環境でも、履歴の調査や変更の記録といったほとんどの作業を行うことができる。これが「分散型」と呼ばれる理由である。 / wiki''


もしgitが存在してなかったら、ファイルを編集前に戻したいと思ったときにコピーして他のファイルで管理していくと思います。
でも、それだとめんどくさいしいろいろミスが起こったりなどありそうですよね。
その問題を解決するために作られたのがgitなのです。

**つまりgitとは元のファイルのコピーを手元においておけて自由に編集できるものなのです。**

# 参考資料
https://www.sejuku.net/blog/5756
[Tips]LinuxでiPhoneをwebカメラとして使う方法

#はじめに
iPhoneをwebカメラとして使うソフトウェアはたくさんあるけれど、Linux向けにリリースされているものが少ない。唯一Linuxに対応していたDroidcamというソフトウェアもAndroidのみ...と思っていたらつい最近にios版がリリースされていた。
https://apps.apple.com/us/app/droidcam-wireless-webcam/id1510258102

#インストール
動作環境 Ubuntu 18.04
https://www.dev47apps.com/droidcam/linuxx/
ここに丁寧に書かれています。

iosの方もアプリをインストールするだけ。

#使う。
Wifiにつなぐとローカルipとポートが振られます。
<img width="375" alt="355290.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555310/756711f9-20c7-6548-05b5-985f6b34a346.jpeg">

これをPC側で入力してあげるだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555310/da7257be-f480-7009-e14c-8d9ab1d987a2.png)

zoomで認識できました。
![355309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555310/13783e7e-38fb-e3f2-1b9f-84dea99591b0.jpeg)

#おわり
v4l2loopbackやらffmpegやらでもっとスマートにできそうですが、こっちのほうが圧倒的に簡単なので紹介しました。
これで内蔵カメラがないThinkpad X230でもビデオ通話ができる♡
matlab R2020a (academic license) を ubuntu18.04にインストール

## インストール

アカウントを作ってダウンロード。
`sudo sh install`でインストールGUIが出るので
推奨されたパッケージをインストールしようとすると、以下のような`Missing File esd.mathworks.com`というメッセージが表示されてしまった。

![エラーメッセージ](https://www.mathworks.com/matlabcentral/answers/uploaded_files/279877/image.png)

[MATLAB ANSWERSのページ](https://jp.mathworks.com/matlabcentral/answers/94381-why-does-the-matlab-installer-fail-with-an-error-related-to-a-lxe_win64-or-enc-file)に書いてあった「simulinkとmatlabだけインストール」するというヒントに従えばインストールできた。


## launcherから起動できるようにする。

`-desktop`のオプションを付けるのがミソ。
https://jp.mathworks.com/matlabcentral/answers/472134-gtk-message-10-32-31-466-failed-to-load-module-canberra-gtk-module
のエラーを解決するために、Execのところで`env`コマンドで環境変数を設定しています。

```matlab:/usr/share/applications/matlab.desktop
[Desktop Entry]
Name=matlab
Comment=This is matlab
Exec=env GTK_PATH=/usr/lib/x86_64-linux-gnu/gtk-2.0 LIBOVERLAY_SCROLLBAR=0 GIO_EXTRA_MODULES=/usr/lib/x86_64-linux-gnu/gio/modules matlab -desktop >>/tmp/matlab_log.txt & 2>&1 
Icon=/usr/local/MATLAB/R2020a/bin/glnxa64/cef_resources/matlab_icon.png
Path=
Terminal=false
Type=Application
Categories=Development;
StartupNotify=false
Version=R2020a
```
Djangoの基本備忘録

Djangoを始めて必要な設定やコマンドなどの備忘録


##プロジェクト作成
```
django-admin startproject [project-name] .
```

##settingsの変更
```[project-name]/settings.py
TIME_ZONE = 'Asia/Tokyo'
LANGUAGE_CODE = 'ja'
#静的ファイルを公開する場合
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
#公開ホストの追加
ALLOWED_HOSTS = ['127.0.0.1', [host]]
## 例
ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']
```

## データべース作成
```
python manage.py migrate
```

## Webサーバー起動
```
python manage.py runserver [host]:[port]
```

## 新しいアプリケーションの作成
```
python manage.py startapp [app-name]
```

## 設定に新しいアプリケーションを追加
```[project-name]/settings.py

INSTALLED_APPS = [
    ...
    'blog.apps.BlogConfig', # 追加したアプリのAppクラス名
]
```

## Modelからテーブルを作成するためのマイグレーション作成
```
python manage.py makemigrations [app-name]
```

## マイグレーション実行
```
python manage.py migrate [app-name]
```

## 管理画面へのアクセス
```
http://[host]:[port]/admin
```

## Superユーザーの作成
```
python manage.py createsuperuser
```

## .gitignore
ベースは、https://www.gitignore.io を使用

```.gitignore
# Created by https://www.gitignore.io/api/django
# Edit at https://www.gitignore.io/?templates=django

### Django ###
*.log
*.pot
*.pyc
__pycache__/
local_settings.py
db.sqlite3
db.sqlite3-journal
media

# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/
# in your Git repository. Update and uncomment the following line accordingly.
# <django-project-name>/staticfiles/

### Django.Python Stack ###
# Byte-compiled / optimized / DLL files
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/

# Translations
*.mo

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# Mr Developer
.mr.developer.cfg
.project
.pydevproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

## ここからカスタマイズ
# My pipenv
myvenv/

#VS code
.vscode/
## ここまでカスタマイズ

# End of https://www.gitignore.io/api/django
```