OmniAICreator/Qiita-1.07M huggingface dataset:
Leetcode 30 天挑戰, Week 3 Day 3, Number of Islands, in Swift

演算法及資料結構： `Path Finding` `Depth First Search` `Matrix`

## 題目

- 挑戰頁面 - <https://leetcode.com/explore/featured/card/30-day-leetcoding-challenge/530/week-3/3302/>
- 題目原頁面 - [200. Number of Islands](https://leetcode.com/problems/number-of-islands/solution/) 

## 想法

單用 path finding 只能找出 1 的區塊無法走訪所有的元素，所以還是必須要有雙層 for loop 來協助逐項走訪。雖然每個元素可能會被走訪到多次，但是在這樣的做法中這也沒有辦法，算是必要之惡。

簡要說明如下，其他在程式碼裡面以註解輔助說明。

- for loop
  - 逐一走訪，如果是探訪過或是是 0 的元素就跳過
- Path finding 的部分
  - 上下左右（順序可以自己指定）探索下一個是 1 還是 0 ， 1 就遞迴重複同樣的動作， 0 就停止遞迴。
  - 一個方向發現沒有沒有路走之後，就繼續檢查下一個方向有沒有路可以走，直到四個方向都探索過。
  - 逐步說明可以參考這個影片 https://www.youtube.com/watch?v=W9F8fDQj7Ok
- 記錄有探訪過的位置
  - 用一個二維陣列來記錄已經拜訪過的位置

## 程式碼

``` swift
class Solution {
    func numIslands(_ grid: [[Character]]) -> Int {
        if grid.isEmpty || grid[0].isEmpty { return 0 }
        var count = 0
        var seen = [[Bool]](repeating: [Bool](repeating: false, count: grid[0].count), count: grid.count)
        
        for row in 0..<grid.count {
            for column in 0..<grid[0].count {
                // 如果沒走過的話才去探索
                if !seen[row][column] {
                    seen[row][column] = true
                    // 如果是 1 才繼續往深探索
                    if grid[row][column] == "1" {
                        count += 1
                        findLand(grid, &seen, row, column)
                    }
                }
            }
        }
        
        return count
    }
    
    func findLand(_ grid: [[Character]], _ seen: inout [[Bool]], _ row: Int, _ column: Int) {
        seen[row][column] = true
        
        // 如果發現 0 則不繼續執行，結束遞迴
        if grid[row][column] == "0" {
            return
        }
        
        // 檢查右邊的元素。如果 column 加 1 後沒有超過範圍以及 column 加 1 後的元素還沒拜訪過才進入遞迴。
        if column + 1 < grid[0].count && !seen[row][column + 1] {
            findLand(grid, &seen, row, column + 1)
        }
        
        // 檢查下面的元素。如果 row 加 1 後沒有超過範圍以及 row 加 1 後的元素還沒拜訪過才進入遞迴。
        if row + 1 < grid.count && !seen[row + 1][column] {
            findLand(grid, &seen, row + 1, column)
        }
        
        // 檢查左邊的元素。如果 column 減 1 後沒有超過範圍以及 column 減 1 後的元素還沒拜訪過才進入遞迴。
        if column - 1 >= 0 && !seen[row][column - 1] {
            findLand(grid, &seen, row, column - 1)
        }
        
        // 檢查上面的元素。如果 row 減 1 後沒有超過範圍以及 row 減 1 後的元素還沒拜訪過才進入遞迴。
        if row - 1 >= 0 && !seen[row - 1][column] {
            findLand(grid, &seen, row - 1, column)
        }
    }
}
```

## 複雜度分析

令 m 為二維陣列的寬度 (每一行的 item 數)，n 為二維陣列的高度（總共有幾行）

- 時間複雜度： O(m * n)
  - 雖然 path finding 或稱 dfs 有自己的時間複雜度，但是 m * n 會是最高階所以保留他
- 空間複雜度： O(m * n)
  - 用來記錄有走過的位置

## 執行結果

``` text
Runtime: 172 ms (beats 98.77%)
Memory Usage: 21.6 MB
```

## 自己用的測試案例

``` text
[["1","1","1"],["0","1","0"],["1","1","1"]]
[["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]]
[["1","1","1","0"],["0","0","1","0"],["0","0","0","1"]]
[["1","1","1","0"],["0","0","1","0"],["0","0","1","1"]]
[]
[[]]
```

## 後記

解完之後，雖然看到很多人的解法都是把 grid 複製（^）之後，走訪過後的元素改成 0 標示成已經走訪，但是個人在這題覺得把「水」和「走訪過」用同一個方式表現不是很好的習慣，所以後來還是決定留著原本的寫法。

*^: Swift 無法直接對 parameter 傳進來的值變動，所以一定要複製一個。*
Ruby on Railsのチュートリアル ~第5章レイアウトを作成する~

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

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

# 第5章レイアウトを作成する
## まとめ
- HTML5を使ってheaderやfooter、logoやbodyといったコンテンツのレイアウトを定義しました
- Railsのパーシャルは効率化のために使われ、別ファイルにマークアップを切り出すことができます
- CSSは、CSSクラスとidを使ってレイアウトやデザインを調整します
- Bootstrapフレームワークを使うと、いい感じのデザインを素早く実装できる
- SassとAsset Pipelineは、(開発効率のために切り分けられた) CSSの冗長な部分を圧縮し、本番環境に最適化した結果を出力する
- Railsのルーティングでは自由にルールを定義することができ、また、その際に名前付きルートも使えるようになる
- 統合テストは、ブラウザによるページ間の遷移を効率的にシミュレートする

## 所感
- パーシャル初めて知った、確かにキレイになった。HTMLやCSSも早く慣れたい
- ルーティング改めてわかりやすいなと思った。どのリクエストをどのURLに送るとどのコントローラのメソッドを呼び出してくれるか

## 途中参考にしたページ
・HTMLでアンカータグを使う方法【初心者向け】
https://techacademy.jp/magazine/5796

・スタブ【テスト】 (stub)
https://wa3.i-3-i.info/word14933.html
スタブ：テスト対象から呼び出される代用品
ドライバ：テスト対象を呼び出す代用品

・よく使うcurlコマンドのオプション
https://qiita.com/ryuichi1208/items/e4e1b27ff7d54a66dcd9
curl -o app/assets/images/rails.png -OL railstutorial.jp/rails.png
-OLでURL先のファイルをリダイレクト有効でダウンロード
それを-oのファイルに出力

・CSSがもっと効率的に書ける！LESSの使用方法について。
https://www.qam-web.com/?p=11278
動的スタイルシート言語（CSSの拡張メタ言語）
これで書いたものをコンパイルするとCSSになる

・これからはcssはSassで書こう。
https://qiita.com/m0nch1/items/b01c966dd2273e3f6abe
構文的にイケてるスタイルシート。LESSの別バージョン

・タイポグラフィとは？基本ルールと作り方 37の要点
https://saruwakakun.com/design/tips/typography2
要するに文字のデザイン

・【CSS初心者入門】hoverとは何？使い方も解説！
https://web-camp.io/magazine/archives/10923
リンクにカーソルが乗った時のデザイン

・【Rails入門】yieldとcontent_forを使ってページ毎にタイトルを変更
https://www.sejuku.net/blog/75657
共通レイアウトで個別レイアウトを展開するのがyield
共通レイアウトの一機能をくくり出すのがパーシャル？

・Sprocketsの仕組み
https://qiita.com/ttaka66/items/991a52081a92cb6c2738
アセットファイルにアクセスするためのパスを管理する(アセットパス)

・bootstrapで原因不明のエラー（File to import not found or unreadable: bootstrap-sprockets）
http://www.eggineer.info/entry/2018/01/31/165612
なんか知らんけど「custom.css」というファイルができていた、消したらエラー解消

・Sassの記法(SCSS構文)
https://qiita.com/takeshisakuma/items/1c40c42f61c6e751c0e3

・LESS変数一覧
https://getbootstrap.com/docs/3.4/customize/

・yieldについて
https://qiita.com/sanstktkrsyhsk/items/e7d27c6717b430302967
他のviewにあるものを引っ張ってくる

・AWS 別名（エイリアス）と初期リージョン
https://qiita.com/qt6hy/items/3539bc2fc7caef0d0755
AWSのアカウントエイリアスとデフォルトのリージョンを変更

・URLとURIの違いとは？ パーツの構造・名称・意味も大解説！
https://webtan.impress.co.jp/e/2010/03/09/7539
URIが場所/名前を識別する大カテゴリ、URLは小カテゴリでいわゆる「http://~」

## 使用したコマンド
git checkout -b filling-in-layout
curl -o app/assets/images/rails.png -OL railstutorial.jp/rails.png

curl -o app/assets/images/kitten.png -OL cdn.learnenough.com/kitten.jpg

bundle install
touch app/assets/stylesheets/custom.scss

touch app/views/layouts/_shim.html.erb
touch app/views/layouts/_header.html.erb
touch app/views/layouts/_footer.html.erb
touch app/views/layouts/_rails_default.erb

ls app/assets

rails generate integration_test site_layout
rails test:integration
rails t

touch test/helpers/application_helper_test.rb
rails t

rails generate controller Users new

git add -A
git commit -am "Finish layout and routes"
git checkout master
git merge filling-in-layout

rails test
Rails忘れがちな自分用メモ(主にprogate)

基本、手書きでノートにメモしているので、検索用メモ
量が増えたら、細分化します。

##params
params[:name]/params[:email]/params[:image]
入力された値を受け取るためのメソッドです。

##postとgeet

post▷このデータあげます▷DBにデータを保存する時
get▷そのページください▷見たいページに飛ぶ時

##authenticate_user

before_action :authenticate_user
　↑全てのアクションに対して
before_action :authenticate_user, {only: [:index, :show, :edit, :update]}
　↑onlyアクション限定

##forbid_login_user
ログインユーザーが存在する場合、投稿一覧ページにリダイレクトするようにします。

##ensure_correct_user
正しいユーザーかを確かめる
App Previewsのメモ

# 参考リンク
概要
https://developer.apple.com/jp/app-store/app-previews/
シミュレータの動画撮影方法
https://stackoverflow.com/questions/25797990/capture-ios-simulator-video-for-app-preview
iMovieでの編集方法
https://developer.apple.com/jp/support/imovie/
必要なサイズ
https://help.apple.com/app-store-connect/#/devd1093d90d

# 動画の録画
実機の場合は公式を参考に
https://developer.apple.com/jp/support/app-previews/

シミュレータの場合はこんな感じ

```
xcrun simctl io booted recordVideo file-name.mov
```
必要に応じてQuickTimePlayerでトリムする。

# iMovieで編集
公式とかYoutubeで使い方覚えながら編集する。
**サイズを調整したい場合は先頭にローンチスクリーンとかの静止画を入れる。**

フリーズフレームとタイトルをよく使う。トランジションも。

# 無音化
音が無いままアップロードするとエラーになる。
[こちら](https://qiita.com/geese_saikyou/items/8fd98a4876c6eba5afc8#%E7%84%A1%E9%9F%B3%E5%8C%96)を参考にさせていただきました。

```bash

ffmpeg -i src.mov -f lavfi -i aevalsrc=0 -c:v copy -map 0:0 -map 1:0 -shortest -ac 2 -strict -2 dst.mov
```
検索フォームをインスタっぽくしよう！（Jquery）

# はじめに

こんにちは。チーム開発に夢中になっていたため久しぶりの投稿です！
今回は検索フォームをインスタっぽくJSで動かす方法をご紹介します！
実装はとっても簡単なので是非真似してみてください！

# 完成イメージ

![exhoop_200418_search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487789/afcd9a8b-7839-c7e4-218a-cdbc47bf40a6.gif)


# 実装内容

1. フォームを選択すると×ボタンが表示される
2. ×ボタンを押すと入力されている文字をクリアする
3. フォーム外をクリックすると×ボタンが非表示になる


# 手順

## 1. ビューを作成


```_search-form.html.haml
.header
(省略)
  = form_with(url: search_videos_path, local: true, method: :get) do |f|
    .header__search
      .field
        -# class: "header__search__input"を使って動きをつける
        = f.text_field :keyword, placeholder: "Search", class: "header__search__input", autocomplete: "off"
        -# class: "header__search__reset"を使って動きをつける, ×ボタンはFontAwesomeを使用
        = icon('fa', 'times-circle', class: 'header__search__reset')
      .field
        -# 送信ボタンは隠しEnterで検索させる
        = f.submit "Search", class: "header__search__btn", style: "display: none"
```


## 2. レイアウトを調整

```search-form.scss

.header {
  (略)
  &__search {
    line-height: 60px;
    color: white;
    // フォームと×ボタンを横並びに
    display: flex;
    // 親要素として起点に
    position: relative;
    &__input {
      width: 200px;
      height: 28px;
      padding: 0 10px;
      border: solid 0px;
      border-radius: 3px;
      background-color: rgb(20, 20, 20);
      color: white;
      margin-bottom: 20px;
      // フォームを選択したときに出る青い枠を消す
      &:focus {
          outline: none;
      }
    }
    &__reset {
      // 親要素に対して配置を調整
      position: absolute;
      top: 24px;
      right: 5px;
      width: 20px;
      height: 20px;
      color: grey;
      font-size: 13px;
      cursor: pointer;
    }
  }
}

```


## 3. Jqueyで動きをつける

```search-form.js

$(function(){
  // フォームを選択すると×ボタンが表示される
  $(".header__search__reset").hide();
  $(".header__search__input").on("click", function(){
    $(".header__search__reset").show();
  });

  // ×ボタンを押すと入力されている文字をクリアする
  $('.header__search__reset').click(function(){
    $(this).parent().find('input').val('');
  });

  // フォーム外をクリックすると×ボタンが非表示になる
  $(document).on("click touchend", function() {
    if (!$(event.target).closest(".header__search__input").length){
      $(".header__search__reset").hide();
    }
  });
});


```
テストも兼ねた自己紹介

## 自己紹介
はじめまして。
keroringahaku(けろりん画伯)
と申します。

自筆の絵が本当に下手くそでみんなから画伯と呼ばれています・・・。

現在、社会人2年目(♂)です。
職業は社畜SEです。
主な言語は
・Java

触ったことあるものは
・Git
・Jenkins

その他、ごまごまと…。

このご時世のおかげで家にいる時間が長くなったため、
趣味というか、お勉強も兼ねて色々してみたいと思います。
まずは、仮想サーバー構築かなと思っていますが、知識皆無です。

備忘録的な形で残して行きたいと思っています。
温かい目で見ていただけると嬉しいです。

よろしくお願いいたします。
Azureアイコンセットを挿入するPowerPointアドインの紹介

# Azureアイコンセットを挿入するPowerPointアドインの紹介

## はじめに

下記リンクにあるMicrosoftが提供しているAzureアイコンセットを挿入するPowerPointアドインを作成したので、紹介します。

https://www.microsoft.com/en-us/download/details.aspx?id=41937

---

## 機能

以下の図にあるようにAzureアイコンセット上から挿入したいアイコンを検索し、フォーム上から挿入する機能を提供します。

![azure_demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441666/e212ccfa-fc6d-8208-61d1-aae19e6bc23a.png)

---

## インストール

* 以下のリンクから、ダウンロード

https://github.com/11ohina017/OhinaWork

* ダウンロードしたZIPファイルを解凍

* pptxフォルダ配下の以下のスクリプトをダブルクリック

`installPowerPointAddin.vbs`

インストール後にPowerPointを起動すると、リボンタブにOhinaWorkというタブが追加されます。

## ライセンス

当ソフトはフリーソフトウェアですが、 同梱されているAzureのアイコンについては著作権はMicrosoft社が所持しており、 ライセンスはMITライセンスとなります。

```
The MIT License (MIT)
Copyright (c) Microsoft Corporation

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
```

## おわりに

reveal.jsやmarpのようOSSを利用できず、PowerPointで資料を作成することを強いられるエンジニアの助けになれば幸いです。

## 関連

https://qiita.com/11ohina017/items/36786ae5f55dfded8566

https://software.opensquare.net/relaxtools/support-2/campaign/
Docker内で特定のマイグレーションファイルのみ先にマイグレーションする方法

この記事の続きです。
https://qiita.com/shota0701nemoto/items/06a88f9cd65a716098fe


##したいこと
Docker内でマイグレーションする際マイグレーションファイルにエラーがあったため、特定のマイグレーションファイルのみ先にマイグレーションしたい。

#####現状
Docker内で作成したデータベースでマイグレーションファイルの順番に間違いがあり、マイグレーションができない状態です。

#####原因・理由

・migration時に外部キー元のテーブルがないため。

※既存のrailsアプリにDockerを導入しようとしているため、一度にマイグレーションをせざるをえない状況になっています。


##行ったこと、調べたこと

ターミナルでdocker-compose run web bin/rake db:migrateを実行したところ次のエラーが表示される。

```
PG::UndefinedTable: ERROR:  relation "gyms" does not exist
```


下記記事の通り、先に実行するべきマイグレーションIDを指定してマイグレーションを実行する必要がある。
https://qiita.com/hrnEaSwzbOLaWj6/items/a23db1e630bafb18fe27

```
PG::UndefinedTable: ERROR:  relation "gyms" does not exist
```


##解決方法


Docker内でマイグレーションされてるファイル、されてないファイルを確認。

```
$  docker-compose run web bin/rake db:migrate:status  
```

Docker内で先にマイグレーションしたいファイルを指定して、マイグレーションする。

```
docker-compose run web bin/rake db:migrate:up VERSION=マイグレーションID
```
または

```
docker-compose run web rake db:migrate:up VERSION=マイグレーションID
```


Docker内なのでコマンドの先頭に```docker-compose run web```をつける必要があります。


また、特定の環境内でmigrateなどをしたい際には、

```
#test環境でマイグレーションファイルの状況を確認
docker-compose run web bin/rake db:migrate:status RAILS_ENV=test
```


```
#test環境でマイグレーションファイルを指定して確認。
docker-compose run web bin/rake db:migrate:up VERSION=20200316144757 RAILS_ENV=test
```
【第3回】pythonで某Authenticator的なツールを作ってみた

# メニューをつけた。
- 機能はしないがメニューをつけた。
- 機能を追加していく。というか最低限の機能。

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tkinter as tk
import pyotp
import sqlite3
import os
if(os.path.exists('gauth.db')):
    pass
else:
    # データベースに接続する
    conn = sqlite3.connect('gauth.db')
    c = conn.cursor()
    # テーブルの作成
    c.execute(
        '''CREATE TABLE gauth(id integer primary key AUTOINCREMENT, name text, private_key text)''')
    # データの挿入
    c.execute(
        "INSERT INTO gauth VALUES (1, 'user1', 'SV6LSO55UOWQBYS7RFHVTY7KTUZSGRYN')")
    c.execute("INSERT INTO gauth VALUES (2, 'user2', 'qwertgfdsazxcvb')")
    c.execute("INSERT INTO gauth VALUES (3, 'user3', 'vfrtgbnhyqweraa')")
    # 挿入した結果を保存（コミット）する
    conn.commit()
    # データベースへのアクセスが終わったら close する
    conn.close()
# tkinterでwindowの作成とタイトルを作る
# windowサイズの指定
root = tk.Tk()
root.title(u"g_authentication_tool")
root.geometry("300x200")
# メニューバー
menubar = tk.Menu(root)
filemenu = tk.Menu(menubar)
filemenu.add_command(label="新規登録")
filemenu.add_command(label="登録削除")
filemenu.add_command(label="閉じる")

menubar.add_cascade(label="ファイル", menu=filemenu)

root.config(menu=menubar)
# データベースに接続する
conn = sqlite3.connect('gauth.db')
c = conn.cursor()
for a in c.execute("select * from gauth"):
    totp = pyotp.TOTP(a[2])  # 鍵的な値
    totp.now()
    # 表示用ラベル
    Static1 = tk.Label(text=a[1])
    Static1.pack(side='left')

    Static2 = tk.Label(text=totp.now())
    Static2.pack(side='left')
    # 挿入した結果を保存（コミット）する
    conn.commit()
# データベースへのアクセスが終わったら close する
conn.close()
root.mainloop()

```
## 今後やっていくこと
- メニューの機能動作部分
- ソースの整理
【Swift】構造体(Struct)とクラスの違いについて

# クラスと構造体って何が違うの！？
って思ったので、簡単に答えを笑

結論からざっくりいうと、

クラス：テンプレがあり、一部分をいじっていっぱい複製できる
構造体：オリジナルなもの。他の構造体やクラスに流用できないし、継承もできない

つまり、**構造体は継承ができないクラス**ですね

# クラスと構造体の使い所はどうちがうの？？
前述の通り、構造体は継承が使えないので、

汎用的に使いたいけど、同ファイル内だけでよい（継承は不要）時に構造体、
それ以外の時にクラスを使うって感じですかね？

# 関連記事
- [【Swift】オブジェクト指向におけるクラスについて](https://qiita.com/Julio_dev/items/8e65aa54f7b4aa4f30fe)
- [継承について]()

# 参考記事
[Swift さくっと確認したい基礎文法 [Struct(構造体)]](https://qiita.com/yuinchirn/items/98b568d595650eca3334)
npmとnpx。なにが違う？

npxコマンドが出てきて、なにこれってなったのでこれを読んでいる。良い記事。
https://www.freecodecamp.org/news/npm-vs-npx-whats-the-difference/

## npm
Node.jsで外部パッケージをインストールして使うためのマネージャ。
package.jsonを読み込んで、npmのレポジトリに取りに行く。

ローカルインストールした場合、必ず`./node_modules/.bin/`配下にコマンドがインストールされる。
ちなみにGlobalにインストールした場合、Linuxだと`/usr/local/bin/`配下になる。

CLIツールを落としてきたときに、使うためにはpackage.jsonのscriptsに定義を書かないといけない。
これが面倒くさい。

## npx
npmのバージョン`5.2.0`以降はnpxがプリインストールされているそう。
手で入れる場合は`npm install -g npx`を実行する。

npxでコマンドを実行したいときは、package.jsonに書かないでも、`npx コマンド名`打つだけで実行してくれる。
このとき、npxは勝手にインストールされてるパスを調べて「コマンド名」が存在するかチェックして実行してくれる。

### 未インストールのパッケージにあるコマンドをインストールしないで試してみたい時
npxがすごいのはここ。
github gistにあげているパッケージがあるとして、以下のコマンドを打つと、インストールなしで実行できる。
`npx https://gist.github.com/Tynael/0861d31ea17796c9a5b4a0162eb3c1e8`
これでDiskの容量は節約できるし、グローバル汚染もしない。
ただし、著者も注意しているようにマルウェアを実行しないように注意する。
なぜReLUみたいな非線形関数が必要なのか？


* この記事は，PyTorch公式チュートリアル，["DEEP LEARNING WITH PYTORCH"](https://pytorch.org/tutorials/beginner/nlp/deep_learning_tutorial.html#sphx-glr-beginner-nlp-deep-learning-tutorial-py)の"Non-Linearities"から抜粋して要約したもの．


# なぜReLUみたいな非線形関数が必要なのか？

* 次の２つのアフィン変換があったとする

```math

\begin{align}
f(x) &= Ax + b \\
g(x) &= Cx + d 
\end{align}

```

* これらの合成，$f(g(x))$を計算するとどうなるか？

```math

\begin{align}
f(g(x)) &= A(Cx + d) + b \\
& = ACx + (Ad +b)
\end{align}

```
* ここで，$AC$は行列．$Ad+b$はベクトル
    * つまり，アフィン変換の合成が１つのアフィン変換で書けたことになる
        * ニューラルネットを作るときに大量のアフィン変換の合成を行うわけだが，このやり方だと，それらの操作は１つのアフィン変換と同じ効果しかもたらさない
            * 非線形関数をアフィンレイヤの間に導入すれば，このようなことは起きない

# なぜReLUを使うのか

* よく使われる非線形関数に，$tanh(x)$, $\sigma(x)$, $ReLU(x)$がある
    * 非線形関数はこの他にいくらでもあるが，これらを使う理由は**勾配の計算が簡単だから**
        * シグモイドの微分：
            * $\frac{d\sigma}{dx} = \sigma(x)(1-\sigma(x))$
* ReLUがよく使われる理由の一つが，**$\sigma(x)$は引数xの絶対値が大きくなると勾配が急速に消失する**から
    * 勾配が消失すると学習が困難になる
親から子にデータを渡す方法

```Parent.vue
<template>
<!-- ⑴子コンポーネントのタグに、v-bindで送りたいものに名前をつける
       　今回はテキトーに'送りたいものbox(okuritaimonobox)'としました
     ⑵=""のなかに、送りたいデータのプロパティ名をつける
       　今回は'送りたいものネーム(okuritaimononame)'としました -->
<children v-bind:okuritaionobox="okurimononame" />
</template>

<script>
data(){
 return {
     okurimononame:'これを送りたい'
    }
  }
</script>
```

```Children.vue
<script>
 export default {
//子コンポーネントではpropsというデータの受け口を作り、親コンポーネントのv-bindでつけた名前で受け取る
  // 今回は送りたいものボックス(okuritaimonobox)
  props:['okuritaimonobox'],
  computed:{
//okuritaimonoboxの中のデータはこのインスタンス内のデータとして普通に'this'と書いてOK
   return this.okurimononame
 // 結果 : これを送りたい
  }
 }!
</script>
```
初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（Label操作）

# 背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。

その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『Kubernetes実践入門』のサンプルコード](https://github.com/kubernetes-practical-guide/examples)
[Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方](https://gihyo.jp/book/2019/978-4-297-10438-2)
![](http://image.gihyo.co.jp/assets/images/cover/2019/9784297104382.jpg)


## 実際の学びについて

書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。
***この章の勉強は本当に書籍の写経が主になるかもしれません・・・***


# 勉強開始


### Label を操作、ReplicaSet が Pod を管理している方法と管理対象から外す方法を知る

```text:dive-mattermost-previewのReplicaSetが持つLabelセレクタを取得
$ kubectl get rs $(kubectl get rs | grep dive-mattermost|awk '{print $1}') -o template --template='{{.spec.selector.matchLabels}}'
map[app:dive-mattermost-preview pod-template-hash:6b76f7944]
```
> awk の `awk '{print $1}'` についてはシェル構文

```text:dive-mattermost-previewの１つ目のPodが持つラベルを取得
kubectl get po $(kubectl get po| grep dive-mattermost|head -n 1|awk '{print $1}') -o template --template='{{.metadata.labels}}'
map[app:dive-mattermost-preview pod-template-hash:6b76f7944]
```

```text:labelを「task：inspect-fault」に変更
$ kubectl edit po $(kubectl get po | grep dive-mattermost| head -n 1|awk '{print $1}')
pod/dive-mattermost-preview-6b76f7944-8fhr4 edited
```

```text:taskラベルが追加されてることを確認
$ kubectl get po dive-mattermost-preview-6b76f7944-8fhr4 -o template --template='{{.metadata.labels}}'
map[pod-template-hash:6b76f7944 task:inspect-fault]
```

### 起動している Pod が変更されていること

```text:現在のPodの状況を確認
$ kubectl get po | grep -e NAME -e dive-
NAME                                      READY   STATUS    RESTARTS   AGE
dive-mattermost-preview-6b76f7944-8fhr4   1/1     Running   0          39h
dive-mattermost-preview-6b76f7944-gdbmc   1/1     Running   0          9m37s
dive-mattermost-preview-6b76f7944-qn28g   1/1     Running   0          39h
```

```text:labelを「app：dive-mattermost-preview」を追加
$ kubectl edit po dive-mattermost-preview-6b76f7944-8fhr4
pod/dive-mattermost-preview-6b76f7944-8fhr4 edited
```

```text:appラベルが追加されてることを確認
$ kubectl get po dive-mattermost-preview-6b76f7944-8fhr4 -o template --template='{{.metadata.labels}}'
map[app:dive-mattermost-preview pod-template-hash:6b76f7944 task:inspect-fault][
```

### 起動している Pod が変更されていること

```text:現在のPodの状況を確認
$ kubectl get po | grep -e dive -e NAME
NAME                                      READY   STATUS    RESTARTS   AGE
dive-mattermost-preview-6b76f7944-8fhr4   1/1     Running   0          39h
dive-mattermost-preview-6b76f7944-qn28g   1/1     Running   0          39h
```


## 次は 3.2.2 章をやっていきます。

- 「OwnerReference」について学びたいと思います

# 最後に

今回は Label を変更することで Pod があっち行ったり、こっち来たり、を体験させて教えてくれる内容だったので体感することで記憶にも残り、すごく良かった***写経***だっと思います
ベクトルの公式の成分計算

「一般相対性理論を一歩一歩数式で理解する」という本を読んでいたら、最初の方に次の公式が書いてあった。$A, B, C, D$をベクトルとして、次が成り立つ。

$$
(A\times B)\cdot(C\times D) 
= (A\cdot C)(B\cdot D)-(A\cdot D)(B\cdot C)
$$

この公式を[エディントンのイプシロン](https://ja.wikipedia.org/wiki/エディントンのイプシロン)の公式$\epsilon_{ijk}\epsilon_{ilm}=\delta_{jl}\delta_{km}-\delta_{jm}\delta_{kl}$を使って示してみる。

$A, B, C, D$の成分を$a_i, b_i, c_i, d_i$とする。

```math
\begin{align}
(A\times B)\cdot(C\times D)&
= \epsilon_{ijk}a_jb_k\epsilon_{ilm}c_ld_m\\
&= \epsilon_{ijk}\epsilon_{ilm}a_jb_kc_ld_m \\
&= (\delta_{jl}\delta_{km}-\delta_{jm}\delta_{kl})a_jb_kc_ld_m \\
&= a_jb_kc_jd_k - a_jb_kc_kd_j \\
&= a_jc_jb_kd_k - a_jd_jb_kc_k \\
&= (A\cdot C)(B\cdot D)-(A\cdot D)(B\cdot C)
\end{align}
```

以上で示せる。なお、$\Sigma$記号を省略した。
振り返ると、最初の公式とエディントンのイプシロンの公式はほぼ同じ形をしていた。

## 最初の公式の系

$ $最初の公式において$A=C,B=D$とすると$|A\times B|^2=|A|^2|B|^2-(A\cdot B)^2$となる。

これで証明できているが、あえて成分で計算してみる。

```math
\begin{align}
|A\times B|^2&=\epsilon_{ijk}\epsilon_{ilm}a_jb_ka_lb_m \\
&= (\delta_{jl}\delta_{km}-\delta_{jm}\delta_{kl})a_jb_ka_lb_m \\
&= a_ja_jb_kb_k - a_jb_ja_kb_k \\
&=|A|^2|B|^2-(A\cdot B)^2
\end{align}
```

以上のようになる。

この記事で紹介した以外にも、ベクトルの外積や内積についての公式は、$\Sigma$記号を省略して成分計算をすることで、簡単に証明できるものがけっこうある。
AtomのFuzzy Finderでgitignoreで指定されているファイルを検索できるようにする方法

# 結論

`~/.atom/config.cson`の`allowPendingPaneItems`を`false`にする。
私の場合はなかったので追記しました。

```~/.atom/config.cson
  core:
    allowPendingPaneItems: false
```


# 調べたこと

`allowPendingPaneItems`が`true` もしくはconfig.cson未入力だと、fuzzy-finderの検索結果に`.gitignore`で指定されているファイルは表示されないみたいです。


>This package also will also not show Git ignored files when the core.excludeVcsIgnoredPaths is enabled.

[fuzzy-finder](https://github.com/atom/fuzzy-finder)　READMEより
javascriptの基礎

# onload呼び出し

ページ表示するときにjavascriptを実行したい時に

```js
document.addEventListener("DOMContentLoaded", function () {
  console.log("hello, world!");
});
```
```js
const func = () => {
  console.log("hello, world!");
};
func();
```

# DOMの作成

`<body>` 内に `<div class="container">container</div>` を作りたい時に

```js
const divContainer = document.createElement("div");
divContainer.classList.add("container");
divContainer.textContent = "container";
document.body.appendChild(divContainer);
```

# DOMの取得

html の `class="container"` 要素を取得したい時に

```js
const container = document.querySelector(".container");
const containers = document.querySelectorAll(".container");
```

# イベントの追加

html の `class="button"` にクリックイベントを付けたい時に

```js
const button = document.querySelector(".button");
button.addEventListener("click", function() {
  console.log("click!");
});

const buttons = document.querySelectorAll(".button");
buttons.forEach(button => {
  button.addEventListener("click", function() {
    console.log("click!");
  });
});
```
【Swift】オブジェクト指向におけるクラスについて

# はじめに
オブジェクト指向におけるクラスやインスタンスについて人に説明できるレベルで理解できていなかったので、今回記事にアウトプットしていこうと思います！

内容はかなり初歩的ですので、初心者の方は参考にしてみてください！

# そもそもオブジェクト指向って何？
オブジェクト指向とは、その名の通り「**モノを作るようにプログラムを組む**」ことです。
モノを作る際には、まず**設計図**が必要です。その設計図に当たるのが**クラス**です。
そして、その設計図（クラス）を基に実体を作ることを**インスタンス化**と言います。

そのため、オブジェクト指向プログラミングにおいては、

>**Point1**
1. クラス（設計図）の作成
2. インスタンス化(設計図をもとに実体の作成）
 

の手順が必要になってきます。


# クラスについて
先ほど述べましたがクラスとは、設計図です。
この設計図には、**プロパティ**と**メソッド**と言われるものがあります。
それぞれざっくり説明すると

>**Point2**
プロパティ：モノのパーツ（使用するデータのこと）
メソッド：モノの動作

て感じです笑
実際にコードで見てみましょう！

```swift

class person {

    //プロパティ：を形成するパーツ（データ）
    var name : String!
    var age : Int!
    var alcohol : Bool!

    //メソッド：ageが20歳以上ならお酒を勧めるセリフをリターンする関数
    func drink_order() -> String{
        if self.age > 19{
            return "\(self.name!)さん、お酒はいかがですか？"
        }else{
            return "\(self.name!)さんは未成年なのでソフトドリンクからお選びください。"
        }
    }
}
```

# インスタンス化
では、このpersonの設計図（class）をもとにpersonを作成してみます!(**インスタンス化**)

```swift
//インスタンス化
var adultMan = person()

//adultManのプロパティにデータを入れていきます。 
//インスタンス名.プロパティでデータを入れることができます！
adultMan.name = "MR.A"
adultMan.age = 24

//インスタンス内のメソッドdrink_order()を実行します
print(adultMan.drink_order())
```

```text:出力
MR.Aさん、お酒はいかがですか？
```

しかし、１つのプロパティごとに*インスタンス名.プロパティ*でデータを入れていると入れ忘れなどが起きてしまうかもしれません！

そんな問題を解決してくれるのが**イニシャライザ**です！

# イニシャライザを使ってみる
イニシャライザとは、クラスを初期化するメソッドです。もう少し具体的に説明しますと、

初期化には、

- スタート地点に**戻る**パターン
- スタート地点に**進む**パターン

の２パターンがあります。

1つ目の「スタート地点に**戻る**パターン」はその言葉通りに、クラスのプロパティに何か値が入っていた場合に、それらを初期化するということです。

２つ目の「スタート地点に**進む**パターン」は「は？進む？」って思うかもしれませんが、
これはつまり、「**最初の状態を整えること**」ということです！
なので、クラスなどを作成したあとは、最初の状態を整えるという目的でイニシャライザが用いられる場合が多いです！

では、今度はさっきにpersonクラスにイニシャライザを加えてみます！

```swift
class person {

    //プロパティ：を形成するパーツ（データ）
    var name : String!
    var age : Int!
    var alcohol : Bool!

    //メソッド：ageが20歳以上ならお酒を勧めるセリフをリターンする関数
    func drink_order() -> String{
        if self.age > 19{
            return "\(self.name!)さん、お酒はいかがですか？"
        }else{
            return "\(self.name!)さんは未成年なのでソフトドリンクからお選びください。"
        }
    }

   //イニシャライザ
   init(name:String,age:Int,alcohol:Bool) {
        self.name = name
        self.age = age
        self.alcohol = alcohol
    }
  }
}

//インスタンス化
//イニシャライザがある場合は、引数を単文で入れていく（xcodeでは自動で引数が出てくるので便利）
var Student = person(name: "工藤新一", age: 16, alcohol: true)
print(Student.drink_order())
```

```text:出力
工藤新一さんは未成年なのでソフトドリンクからお選びください。
```

便利になりましたね！

>**Point3**
・イニシャライザは初期化のメソッド（特に初期状態を整える目的で用いられる）
・init(引数：型){} で定義
・クラス内のメソッドからプロパティにアクセスする場合は、self.プロパティ名

また、イニシャライザも奥が深くあらゆるパターンがあるので、より掘り下げて勉強したい方はこちらを参考にしてください！

[イニシャライザ](https://tea-leaves.jp/swift/content/%E3%82%A4%E3%83%8B%E3%82%B7%E3%83%A3%E3%83%A9%E3%82%A4%E3%82%B6)

# 終わりに
今回は、オブジェクト指向の簡単な説明と、クラスについてをメインに記事を書きました！
とても初歩的なことですが、わかったつもりになってちゃんと理解できていなかった部分なので、これからもしっかり基礎の勉強を固めたていきたいと思います！


クラスやオブジェクト指向に関する記事は多くありますが、この記事が少しでもお役に立てたら幸いです😊
dockerイメージから特定のファイルを出力する

設定ファイルのデフォルトを抜き出したい時とか。

```shell
docker run -it --rm $IMAGE cat $DOCKERFILEPATH > $LOCALFILEPATH
```

## 例

```shell
% docker run -it --rm busybox cat /proc/version > busybox_ver.txt
Linux version 4.19.76-linuxkit (root@d203b39a3d78) (gcc version 8.3.0 (Alpine 8.3.0)) #1 SMP Thu Oct 17 19:31:58 UTC 2019
```

`| tee` で渡すと出力見れる。

起きているDockerコンテナからファイルを出したいとき（コピー）はこちら

```shell
docker cp $DOCKERID:$CONTAINERFILEPATH $HOSTFILEPATH
```
Wordの高度な活用法 VBAで全角スペースの前だけに改行を入れる

#Wordの置換
秋田大学 大学院医学系研究科・医学部 感染症 ウィルスについて
http://www.med.akita-u.ac.jp/~doubutu/kansensho/virus17/virus.html
コロナウィルスの構造の古い記事を見つけたところ、少し表示がおかしいので、Wordにテキストを貼り付けてみると、コロナの項目が特に全角のスペースの前で改行するべきところがしていないと考えられた。
そこで、Wordで改行を挿入して整理してみるサンプルとして利用させていただき、なおかつコロナウィルスの基本的な知見を得るために読み込みこととした。

```text
（５）構造と性状によるウイルスの分類
```


この部分の行頭にカーソルを置く。
#全角スペースの検索条件は？
ところで、全角のスペースだけ検索するにはどうすればいいのだろうか。
Word 2013で不要なスペース（空白）を一括削除したい - 世の中は不思議なことだらけ
https://snow-white.cocolog-nifty.com/first/2014/09/word-2013-df5d.html
>半角だけの場合は「検索オプション」で、「あいまい検索」のチェックを外した後、「半角と全角を区別する」にチェックを付けて、「検索する文字列」に、Space キー や Shift ＋ Space キー押して、置換してみてください。

つまり全角スペースだけ、または半角スペースだけを表す`^w`に類似した記号はないのである。

##全角の前に改行を入れるには
置換を使う。
検索する文字列は`□`全角スペース
置換後の文字れは、改行は`^13`を使い、全角スペースを続ける。
`"^13□"`
これが置換後の文字列になる。

※□は全角のスペースが見づらいので記号を使っていますが、実際は全角のスペースです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/b4cf69ab-7f03-5c4d-ab2f-d28ca519367e.png)
画像で見ると見えないですが。

```vb
Sub InsertReturnBefore2ByteSpace()
' For Word VBA
' 機能：改行を失ったらしいHTMLドキュメントからテキスト形式でコピーし、全角の前に改行を挿入する
' 補足：特に全角を使用する日本語のような言語で有効。コードは全角のスペースがわかりづらいので記号□で代用している
' 範囲：途中から文末まで
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
  .Text = "□" ' 見づらいため□に変えていますが、実際のコードでは□を全角のスペースに置き換えてください。この下も同様
  .Replacement.Text = "^13□" '置換後の文字列
  .Forward = True '検索を連続して進める。
  .Wrap = wdFindStop ' ここはマクロの記録をwdFindからwdStopに書き換える。そうすると途中から検索しても文末で止まる
  .Format = False
  .MatchCase = False
  .MatchWholeWord = False
  .MatchByte = True '全角と半角を区別する
  .CorrectHangulEndings = False
  .HanjaPhoneticHangul = False
  .MatchAllWordForms = False
  .MatchSoundsLike = False
  .MatchWildcards = False
  .MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Exit Sub
End Sub
```

#意外なことに全角スペースは
Rubyもそのまま
https://qiita.com/QUANON/items/76c1171d7e8a2bd568d4
ちなみに全角スペースにもマッチは`\s`と似ていますね。
MiFESもそのまま
https://www.megasoft.co.jp/mifes/seiki/meta.html
RegExpでも\u3000しかない
http://www.tohoho-web.com/js/regexp.htm

というか、全角スペースは日本語（と東アジア言語？くらいで）特別に分ける必要性が英語ではないからなんでしょうねえ。
ちなみに英語は Full-Width Spaceといいます。
Mtachbyteは2byte(s)必要だったため、(1)byteの文字にマッチ（適合）という意味になります。現在ではユニコードだとマルチバイトなのでこの区別の意味が分かりづらくなっているかも。
やはり海外勢には評判が悪い。全角（２バイト）って立場ないですね。
http://kaigainohannoublog.blog55.fc2.com/blog-entry-3064.html
https://specaid.net/tips/9-tips-for-tech-specs.html
こうした場合に全角スペースを探す場合も今回の方法が使えます。

#本題に戻ると
元の原稿は今度はいろいろなところに半角スペースが入っています。
これは上記サイトと同じ方法で削除できます。
このように単純にHTMLから印刷するだけでは非常に読みづらい場合などはHTMLからの保存、スクショを取る一方で、Wordにテキストを貼り付け、整理するほうが読みやすいし、用紙を節約できます。また、一度成功した方法をVBAとして保存しておくと、次も使うことができます。
python multiprocessing の使い方

python でマルチプロセスの実装方法を調べたので初歩的ですがメモします。多くの記事はプロセス間でのデータの渡し方(shared memory, pipe, queue, etc...)などで、自分が知りたかったことはより基本的なことでした。

やりたかったこと。

- データは共有しない複数の計算を並行して動かしたい
- 結果を書き込むファイルパスは衝突が起きないように実装する
- 終わるまでまつ。

というものです。終了の待ち方のきれいな書き方をまだ習得できてませんが、とりあえず。

### 使い方

Threading と同じAPIで実装できるようです。
- multipeocessing.Process  を利用する
- 関数と関数に渡す引数を設定する。可変長引数はargs、辞書型はkwargs で渡せる。
- start() で開始、join() で終了を待つ

以下のように実装してみました。

```python

from multiprocessing import Process
from time import sleep
from os import getpid, getppid

def f1(name):
    """ 引数を渡せる """
    print("Hello {} pid={} ppid={}   sleep 3 sec".format(name, getpid(), getppid()))
    sleep(5)
    print("Good morning", name)


def f2(*args, **kwargs):
    """可変長引数、辞書型の引数を渡せる"""
    print("args=", args, " kwargs=",kwargs)
    print("Hello", kwargs["name"], " pid", getpid(), getppid())
    print("Sleeping... {}s".format(kwargs["tlen"]))
    sleep(kwargs["tlen"])
    print("Good morning", kwargs["name"])


if __name__ == "__main__":
    # サブプロセスを作成します
    print(__name__, " pid", getpid())
    p1 = Process(target=f1, args=("Bob",))
    p2 = Process(target=f2, args=("Bob",), kwargs={"name": "Alice", "tlen":10})
    # サブプロセスを開始します
    p1.start()
    p2.start()
    print("Processes started.")
    # サブプロセスが終了するまで待ちます。
    p1.join()
    p2.join()
    print("Processes joined.")
```


### 動作確認

Process で起動したプロセスがmainとは別のプロセス番号になっていること、親プロセスが呼び出し元のプロセス番号になっていることも確認できます。

```
pid 9576
Hello Bob pid=9577 ppid=9576   sleep 3 sec
Good morning Bob
args= ('Bob',)  kwargs= {'name': 'Alice', 'tlen': 10}
Hello Alice  pid 9578 9576
Sleeping... 10s
Good morning Alice
Processes started.
Processes joined.
```

一応、```top```の画面で、左端にあるプロセス番号が確かにプロセスが存在していたのを確認できました。![コメント 2020-04-18 135253.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/b65e8127-7f01-b497-9efc-fb8f54063133.jpeg)


### 参考

より高度な内容は以下を参照。^^;)

- https://qiita.com/y518gaku/items/db3b0ced6d62b616f961
- https://www.yoheim.net/blog.php?q=20170601

他にもたくさんの記事がありました。

この方法だとjoin　でblock されるようなので、どうしたら良いかな。勉強します！！
(2020/04/18)

追記: 2020/04/18
あと仕様書を読むといろいろ書いてあります。terminate()で強制終了、kill signal を送れるとか。
https://docs.python.org/ja/3/library/multiprocessing.html

勢いに乗って続きを書きました。
[python multiprocessing の使い方（続き）Pool編](https://qiita.com/xtkd/items/61f124cdc7979f4d63b2)
Anypoint PlatformにSalesforceのSAML認証でログインしよう！

# はじめに
　検証のきっかけは、Anypoint PlatformユーザがSAML認証をした際のプロビジョニングでビジネスグループやロールが設定できるか検証するために、まずはトライアル環境でSAML認証の環境を構築できるか検証しました。
　今回の検証範囲は、外部グループマッピング機能を除いたSAML認証までを説明します。
　認証システム（Idp）は、Salesforceを利用し、Anypoint Platform間のSSOを構築します。

# SAML認証の設定手順
SAML認証の設定の流れは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/437e7d51-ac7f-f611-09ea-30b03e1ab511.png)
[SSO 用の SAML の設定](https://docs.mulesoft.com/jp/access-management/managing-users)

## 接続アプリケーションの作成（説明１）
Idpの接続アプリケーションの設定は以下の通りです。
<img width="500" alt="接続アプリケーション設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/f1af58c5-e51a-c073-2399-50449731cf0e.png">


## AnpointPlatformのIdentity Providerの設定（説明２）
Anypoint PlatformのIdentity Providerの設定は以下の通りです。
![IdentitProvider.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/3b8b531b-57ff-8da0-ab61-3afd0e6fbc27.png)



# 動作確認
ブラウザから下記URLをアクセスするとSalesforceログイン後AnypointPlatformホーム画面が表示されます。
Sp-InitiatedのSSO URL
https://anypoint.mulesoft.com/accounts/login/{Anypoint PlatformのDomain Name}
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/929bb3f6-a798-2754-1568-86227bcd2d1d.png)



### プロビジョニングされたユーザの確認
SAML認証時にプロビジョニングされたユーザを確認できます。
![IdentitProvider002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/7a3ad02a-9907-c721-6a7f-fe1b1d5175ce.png)

### トラブルシューティング（その１）
事象：エラーメッセージ「アクセス権がありません。」が表示される。
対応：Salesforceユーザに接続アプリケーションの権限を割り当てると解消されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/33fd90d6-c513-51cb-338c-25cd37c70292.png)

### トラブルシューティング（その２）
事象：エラーメッセージ「Unauthorized」が表示される。
対応：接続アプリケーションとIdentity Provider の設定を下記の表の項目と同じにすると解消されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/3fff3c36-59c0-69e6-0b56-606e30e6af23.png)
[SAML Chrome Panel（SAML応答とトレースするツール）](https://chrome.google.com/webstore/detail/saml-chrome-panel/paijfdbeoenhembfhkhllainmocckace)
[Anypoint Platform Single Sign-On (SSO) using SAML Troubleshooting Guide](
https://help.mulesoft.com/s/article/Anypoint-Platform-Single-Sign-On-SSO-using-SAML-Troubleshooting-Guide)

# まとめ
　ここまで、画面設定の流れ、動作確認、トラブルシューティングを説明してきました。
　作業手順が確立していれば、SAML認証を利用した検証が必要な場合に、環境がササっと準備できるとプロフェッショナル感がフワッと出そうですね！！
　MuleSoft ライフをエンジョイしてください。では！！
SQL LIMITによるページネイションの課題

## はじめに

アプリケーションの機能としてページネーションの機能を簡単に実現する方法としてSQLのLIMIT句を利用した方法がある。
しかしこの方法での実現は大規模なデータを取り扱うアプリケーションにおいてはパフォーマンスが悪くなる。

## LIMIT句の仕様
LIMIT句を利用する場合は`SELECT * FROM table LIMIT X,Y`といった使い方をする。
上記構文の意味としてはX件目のデータからY件取得するという意味になる。
この時SQL実行処理としてはX+Y件の取得を行った後、はじめのX件を捨てるという挙動になる。

## LIMIT句の仕様から考察されること
`X`で指定した数が多くなるほど速度が遅くなる。
例えば`X=0,Y=100`のケースと`X=20000,Y=100`のケースでは後者の方が取得するデータ量が増えるため速度が遅くなる。

## 解決策例
WHERE句をつかって取得するデータ量を減らす方法がある。

例：`X=20000,Y=100`のケースと同じ結果を返す場合
`SELECT * FROM table WHERE id > 20000 LIMIT Y`

取得する対象をidが`20001`以降のデータに絞った上でLIMIT句で取得する件数を指定する。
ただしこの方法は20000番目のデータが`id=20000`となっていることが前提となる。そのため取得するデータがidで連番に登録されていない場合には使えない。


（以下時間があるときに他の方法も調べる）
【チーム開発】チーム振り返りでわかったこと

# はじめに
最近チーム開発で「失敗したことを振り返りしましょう」とよく言われてます。
といっても、何故か出てこない。なんとなく自分も言いにくい。
その傾向を見ると、過去に失敗した本人は「自分の失敗」と思っているため、
責められると勘違いして、かえって言いづらいのでは？と思います。
(不思議なことに他人のであれば結構出てくるんですよね)
とある本の中に書いてあった失敗の戦略という項目を見てみました。
「本人の失敗」として責めないやり方が書いてありました(とおもってます)

# チームで開発するということ
会社やその組織の文化によって違いがあるので、「これ」といった明確的な答えはないですが
今までの経験で一番やりやすかったチームはいかなる失敗も寛容に受け止め、それをどう生かすかどうかを考え
られる信頼関係なのかなと思ってます。

そしてこの本に「失敗の戦略」というものを参考に備忘録として書いておきます。
信頼関係があれば本人の失敗に対して「こいつのせいで失敗した」なんてレッテル貼りをしないからね。

# 失敗の戦略というもの
かなり難しいことが書かれているが自分なりに内容を解釈すると、失敗したひとや報告した人に報酬を与えてる(いかなる失敗も責めず・攻撃せず寛容に受け止めようと自分は解釈)ということ。
また、二度と同じ失敗を起こさないよう(本人が失敗しないよう意識する。ということではない)原因を追求し対処するということだということです。

| ヘッダーラベル | (1)失敗に気づく | (2)失敗を分析する | (3)失敗を進展させる |
| :--: | :--: | :--: | :--: |
|避けることのできる失敗から学ぶための戦略|どうすべきかわからないときに、安心してマネージャーや同期に相談できるようにする。問題に気づいたらインセンティブを与える。学習を練習という価値を持つ「誤報」（問題が起きた可能性があったが結果的に異常なしとわかった場合に）インセンティブを与える|プロセスの改善のために伝統的な手法を使ったり磨いたりあする。|ちょっとした試みを即してプロセスの実効性を確かめる技術や顧客の好みが変わっていく場合は特に力を入れる|
|複雑な失敗から学ぶための戦略|ミスや問題を安心して報告できるようにする。脆弱性を発見できるシステムにインセンティブを与える。大小に関わらず失敗を早く報告したらインセンティブを与える。|職能の枠を超えたチームを収集し何が起きたかのさまざまな観点から確認をする|危険を未然に防ぐ仕組みをプロセスを導入するため、本来の仕事を離れて試みを行い、失敗の新たなパターンを認識する。|
|知的な失敗から学ぶための戦略|安心して試みを行えるようにする。成功しないことに早く気づいたことに対してインセンティブを与える。失敗に終わったプロジェクトを早く報告することに対してインセンティブを与える。|科学的方法を使って、データを体系的に分析をする。傾向やパターンをさっと評価し中身がない意見を述べないようにする。さまざまな意見を取り入れる。|さまざま手法を使って、より頻繁に試みを行う。テスト（試験的な実施）にあたっては、成功の証明としてではなく失敗がどのように生まれるかを認識する試みを行う。|

# まとめ
振り返りと言ってもただ実施しただければ意味なく、事前の「信頼関係の積み重ね」がとても重要。それあった上での振り返りが重要だと改めて理解。お互い人間だし。振り返りは重要だかその前の「信頼関係」はもっと重要だということですね。

# 参考書籍
[チームが機能するとはどういうことか――「学習力」と「実行力」を高める実践アプローチ](https://www.amazon.co.jp/dp/4862761828/)
【Laravel】画像を編集してDBとローカルに登録する

##`やりたいこと`##

- laravelでユーザーが画像を登録する際に自動的にリサイズして保存される
- データベースとローカルファイルに同時に保存する
- シンボリックリンクを張り画像表示できるようにする
- Intervention Imageを使う

##`前提`##
- データベースは作成済み
- Userモデルは定義済み

##`進めかた`##
- Intervention Imageのインストール
- Controllerの作成
- viewの作成
- シンボリックリンクを張る

Intervention Imageをインストールする
-
コマンドでプロジェクトディレクトリに移動してから

```php
$ composer require intervention/image
```
Laravel構成ファイルconfig/app.phpを開き、次の行を追加します。

```php:config/app.php
'providers' => [
    // ~~~~ 省略 ~~~~
    Intervention\Image\ImageServiceProvider::class
]
```

```php:config/app.php
'aliases' => [
    // ~~~~ 省略 ~~~~
    'Image' => Intervention\Image\Facades\Image::class
]
```
詳しくは[Intervention Image](http://image.intervention.io/)で。
Controllerの作成
-

```php:UserController.php
//useを忘れずに
use Intervention\Image\Facades\Image;


 public function add(Request $request){
        return view('user.add');
    }
    public function create(Request $request){
        //Userモデルに記載した$rulesでvalidateする
        $this->validate($request, User::$rules);
        $user = new User;
        //フォームから送られてきたプロパティをすべて取得し$formに代入
        $form = $request->all();
        //全てのプロパティを取得すると必要のない_tokenプロパティまで取得してしまうのでunsetメソッドで削除
        unset($form['_token']);
        //Userモデルをインスタンス化した$userにfill($form)でデータベースに保存
        $user->fill($form)->save();
　　　　//ファイルのプロパティを取得し$imageに代入
        $image = $request->file('user_image');
        $width = 500;
        //$imageを幅500×縦自動で画像のアスペクト比を保ちながらリサイズしてローカルファイルに保存
        Image::make($image)->resize($width, null,function($constraint){$constraint->aspectRatio();})
        ->save( public_path('/storage/images/'.$form['user_image']));
        //ファイル名をユーザーID.jpgにしてデータベースに上書き
        $user->fill(['user_image'=>$user->id.'.jpg'])->save();
　　　　　
        return redirect('/user');
        
    }

```
Viewの作成
-
```php:user.blade.php
<div class="container-fluid">
    //ファイルを登録する時はenctype="multipart/form-datを忘れずに
    <form action="{{ url('/') }}/user/add" method="post"  class="form-horizontal" enctype="multipart/form-data">
    @csrf
        <div class="form-group">
            {{Form::label('user_image','画像:',['class'=>'control-label col-sm-3'])}}
            <div class="col-sm-6">
                {{Form::file('user_image', old('user_image') ,['class'=>'form-control input-lg'])}}
            </div>
        </div>
        <button type="submit" class="btn btn-primary btn-lg  center-block" >登録</button>
    </form>

```

シンボリックリンクを張る
-
laravelでは基本的にファイルなどは非公開の場所に保存されます（storage/app/public)。
ブラウザからアクセスできるのは基本的に（デフォルトでは）/publicディレクトリです。
そこでWEBに公開できる場所に（ブラウザからアクセスできる）ショートカットできる機能を作成する必要があります。
詳しくは[ドキュメント](https://readouble.com/laravel/6.x/ja/filesystem.html)で。


コマンドでプロジェクトディレクトリに移動してから

```php
$ php artisan storage:link
```

以上です
AppSheetで作った在庫管理アプリに、製品一覧へ新しい製品が追加されたらメールで通知する機能を追加してみる。

# はじめに
前回修正した在庫管理アプリに、製品一覧に新しい製品が追加されたらメールで通知する機能を追加してみる。

前回：AppSheetのサンプルアプリから作った在庫管理アプリを日本語化してみる
https://qiita.com/Gerbera/items/09a889ffcb4ade005ee9

前々回：AppSheetを使って爆速で在庫管理アプリをスマホで動かしてみる。
https://qiita.com/Gerbera/items/dc66e689306061191ebe


#どうやって実現するか
ワークフロー機能を使うと「何が」「どうなったら」「どうする」というトリガーを使った処理を作ることができます。
今回は、「製品一覧が」「追加されたら」「メールで通知する」という処理を作ります。

# 追加してみる
## 環境
- Chrome 80
- Windows 10 1909


## 必要な物
- Googleアカウント（他のでもいいけどとりあえず）
- iOSデバイスかAndroidデバイス


## 費用
無料


## かかる時間
ゆっくり15分


## 設定手順
とりあえずワークフロー設定の画面まで遷移しましょう。
BEHAVIUOR　→　Workflow　→　Add New Workflow Rule
![コメント 2020-04-18 110013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/fd88b624-5539-75c1-b314-c0acb80c6789.png)

ワークフローの名前をそれらしいものに変えます。
「New Workflow Rule」を「製品一覧に追加されたらメールで通知する」に変更
![コメント 2020-04-18 132834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/811782f3-9b9a-5f93-9fad-7e9ea80f2ec3.png)

「何が」「どうなったら」の部分に、「製品一覧に」「製品が追加されたら」を設定します。
1. 「WHEN THIS HAPPENS...」をクリック
2. 「WHEN THIS HAPPENS...」の「Target data」を「Product」に設定
3. 「WHEN THIS HAPPENS...」の「Update event」を「ADDS_ONLY」に設定
![コメント 2020-04-18 133257.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/bc59033e-562f-9b16-1766-150ea169c08f.png)

「どうする」の部分に、「メールを送信する」を設定します。
1. 「DO THIS」をクリック
2. 「1: ACTION 1」をクリック
3. 「Reaction」を「Email」に設定
4. 「Workflow Action Name」を「メール送信」に変更
5. 「To」の＋ボタンをクリックして出てきたテキストボックスに、メールを受け取りたいアドレスを設定
![コメント 2020-04-18 133454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/39f53431-2a8d-0b22-3397-f094f06dad1d.png)

メールの文面も設定します。
1. 「EMAIL CONTENT」をクリック
2. 「Email Subject」に、メールの件名を設定します。「製品リスト追加されたよ」とか。
3. 「Email Body」に、メールの本文を設定します。特になければ設定なしにするとAppSheetデフォルトの本文でメールが作られます。
![コメント 2020-04-18 133740.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/2e8e8c95-93f9-35aa-3133-90382fc5e3a6.png)

これで最低限の設定ができました！
右上のSAVEを押して保存して試してみよう。


## テスト手順
製品一覧に、製品を追加します。
カテゴリや在庫はなんでもよいです。
![コメント 2020-04-18 133929.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/c884099a-761a-84f1-32e4-153563c6721c.png)
![コメント 2020-04-18 133959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/f0a72118-57e0-ae7d-79bd-1b251cc33427.png)


メールが来た！
![コメント 2020-04-18 132504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129423/91890a01-5638-8ecb-828a-86ef1eb46aa5.png)


## 終わりに
「何が」「どうなったら」「どうする」が出来るとアプリで出来る事が一気に広がる。
ワークフローの設定もわかりやすくて、とっつきやすく設定しやすい。
分かりやすいからこそ、日本語化されていないのが悔やまれる。
Appsheetの公式フェイスブックに「日本語化の予定ありますか？」って聞いてもスルーされているの泣ける。
次回は、レポート機能（ルーチン処理）やアクション機能（好きな場所にアクションボタンを設置できる）を使ってみようと思う。

**公式ー日本語化してくれー！**
**Appsheet Please make it Japanese!!!**

## ノーコード開発もくもく会のおしらせ
毎月1回ぐらい、「Play (No) Codes!」というグループ名でノーコード開発もくもく会をしています。
基本オンライン＋オフラインで実施しているので、よければ参加ください！
https://playnocodes.connpass.com/
Google ドライブファイルストリームでls

GoogleDriveのドライブファイルストリームが便利で、大学のアカウントのものはこっちに乗り換えたのだが、WSLではlsが使えない。当然、bashなどのタブ補完も使えない。が、ディレクトリ名を手打ちすればcdはできるし、ファイル名を指定すればファイルにアクセスすることもできる。

```sh
$ ls
ls: reading directory '.': Function not implemented
```

なので、メッセージ通り、'reading directory'の機能が未実装ということらしい。そのうち実装してくれそうな気もするけど、とりあえず代用案。

```sh
alias lsg='/mnt/c/Windows/System32/cmd.exe /C dir'
```
これで、

```sh
$ lsg
 ドライブ G のボリューム ラベルは Google Drive File Stream です
 ボリューム シリアル番号は 1983-1116 です

 G:\ のディレクトリ

2020/04/18  12:04    <DIR>          共有ドライブ
2020/04/18  12:04    <DIR>          マイドライブ
               0 個のファイル                   0 バイト
               2 個のディレクトリ  246,865,571,840 バイトの空き領域
```

という感じで、DOSのdirコマンドを呼ぶことができる(表示がおもいっきりダ(略)けど)。

とりあえずサマリとか要らなくてファイル(ディレクトリ)名だけわかればいい場合は、`dir`に`/B`オプションを付けて、

```sh
$ /mnt/c/Windows/System32/cmd.exe /C "dir  /B"
共有ドライブ
マイドライブ
```

とするのもあり。

前後のサマリは固定形式なので、

```sh
$ /mnt/c/Windows/System32/cmd.exe /C dir | tail -n +6 | head -n -2
2020/04/18  12:04    <DIR>          共有ドライブ
2020/04/18  12:04    <DIR>          マイドライブ
$
```

となるから、

```sh
alias lsg='/mnt/c/Windows/System32/cmd.exe /C dir | tail -n +6 | head -n -2'
```
でいいか。

この他、例えば mv a b なんかも利かないので、汎用的に

```sh
alias cmd='/mnt/c/Windows/System32/cmd.exe /C $*'
```

とかしておくと、mvの代わりに

```sh
cmd ren a b
```

で代用できたりはする。かなりイマイチだけど、とりあえずはなんとか使えそう。
GASを使ってGoogle Todoリストの内容をslackに通知する

# やりたいこと
タスクをGoogle Todoリストに入力していたのですが、入力だけしてTodoリストの確認を忘れることが多くありました。
そこでGASを使って、通知するようにしました。
具体的には一時間おきにTodoリストをチェックし、当日締め切りのタスクをSlackに通知しています。
※Todoリストの機能でできる可能性はありますが、今回は勉強を兼ねてGASで作りました

少々見苦しい書き方もありますが、備忘録として書いておきます。
処理の流れとしては以下です。
① 通知メッセージの作成
② Slack通知

## ①通知メッセージの作成 
```JS
function createTodoMessage() {
  // マイタスクのデータ取得
  const tasks = Tasks.Tasks.list("XXX").items;

  // 期限切れのタスクを抽出
  var expiredTasks = [];
  for(var i = 0; i < tasks.length; i++){
    var task = tasks[i];
    if (task.due !== undefined) {
      const taskTime = task.due.toString().slice(0,10).replace(/\-/g,'');
      const now = new Date();
      const tomorrow = now.getFullYear() * 10000 + (now.getMonth() + 1) * 100 + now.getDate() + 1;
      if(Number(taskTime) < tomorrow) expiredTasks.push(tasks[i]);
    };
  }
  // 期限切れタスクがなければnullを返す
  if(expiredTasks.length == 0){
    return null;
  }

  // タスクのtitleをつなげる
  var message = '';
  expiredTasks.forEach(function (task, i) {
    const index = i + 1;
    message += "task" + index +": " +  task.getTitle() + " ,\n"
  });
  return message;  
}
```
（補足）

 * 全体的にこちらのページを参考にさせていただきました。https://www.virment.com/use-google-tasks-from-script/ 
 * 最初にタスクの抽出をしています。"XXX"に個人のGoogle tasksのIDをいれると自分のTodoリストと紐付けられます。  
 * タスクに設定された日が当日以前のものを抽出して、メッセージを作成してます。

## ②slack通知
``` JS
function sendHttpPost(message){
  const url = "XXX";
  const postData = {
        'text': message,    
  };
  
  const options = {
     'method' : 'POST',
     'payload' : JSON.stringify(postData)
  };
  const response = UrlFetchApp.fetch(url, options);

    Logger.log(response)  
}
```
（補足）

* ポスト部分は公式のページを参考にしました。https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
* 最初の"XXX"にslackのWebhook URLを貼り付けます。

## 定時実行の設定
上記の関数をmyFunctionから呼び出し、myFunctionを一時間おきに実行するようトリガーを設定しました。

```JS
function myFunction(){
  const message = createTodoMessage();
  Logger.log(message);
  if(message !== null){
    sendHttpPost(message);
  }
}
```

# まとめ
Google Todoリストから情報を抜き出し、当日までのタスクを一定時間ごとにSlackに通知するようにしました。
タスクが完了したら、google Todoリスト側で完了することで通知が止まります。
【JavaScript】超基礎、コールバック関数コードの追い方

#はじめに
今回、JavaScriptの基礎的な項目を一通り学んでみて、不安な要素の復習をしてみた際に、JavaScriptをはじめて学んだ際に躓いたというか、理解の難しかった要素であるコールバック関数をひとつずつコードを追っていくことで、自身の理解を深めるとともに、自身と同様にJavaScriptを学びはじめた方の参考になれば幸いでございます。

#目次
1.コールバック関数とは？
2.理解に必要な要素
3.コールバック関数の追い方

#1.コールバック関数とは？
コールバック関数を端的に説明すると『引数として渡される関数のこと』です。
このコールバック関数を説明するのに、理解しておくべき要素を以下に用意してみたので、見ていきましょう！

#2.理解に必要な要素
##・引数
引数とは…『関数を実行する時に関数に渡す値』
関数定義のなかの”（）”で引数として使う変数を作れます。
各関数のなかでは以下のように使われます。

```js:allow_kansuu.js
const hello =() => {
  consle.log('hello');
};
```
```js:kansuu_sengen.js
function hello() {
  console.log('hello');
}
```
```js:kansuu_shiki.js
const hello = function() {
  console.log('hello');
```

##・関数式
関数式とは…『変数に関数を代入したもの』

```js:kansu_shiki.js
const kansu_shiki = function() {
  console.log('kansu_shiki');
};
kansu_shiki();
```
この関数式では、定義した変数kansu_shikiにfunction関数を直接代入することで、後ろのkansu_shiki();で関数を実行することができるようになっています。

##・高階位関数
高階位関数とは…『関数の引数に関数を受け取ることができる関数』だそうですが、すでによくわかりませんネ、、
実際にコードで順を追って見てみましょう！

①まず、高階位関数の定義（コールバック関数を実行する関数）
引数にcallbackを受け取ることで高階位関数となり、その引数のなかで関数を受け取って、callback();で関数を実行することができます。

```js:koukaii_kansu.js
function koukaii_kansu(callback) {
  callback();
}
```

②高階位関数に渡す関数を定義（コールバック関数として実行される関数）

```js:koukaii_kansu.js
function hello() {
  console.log('hello');
}
```

③高階位関数を実行(hello関数を引数にしてkoukaii_kansuを実行する)

```js:koukaii_kansu.js
koukaii_kansu(hello);
```

①から③を実行すると、
③のkoukaii_kansuが実行されて、①の引数callbackに対して、③の引数になっているhelloという関数が渡ります。
そして、①の引数callbackは②のhelloが入って関数となるので、callback();で実行することができます。
コードの流れを追うのが難しいですが、コールバック関数の理解には欠かせない要素となっているので、覚えておきましょう！

#3.コールバック関数の追い方
それではここからが本題です。
実際に、コールバック関数のコードの追い方を見ていきましょう！

```js:callback_kansu.js
function hello(callback) {
  callback('hello');
}

hello(function(message) => {
  console.log(message);
});
```
①helloを実行した時の関数messageがcallback関数に入ります。
②callbackは関数になるので、中のcallback();で実行することが可能となります。
③実行した時に、callback();内の文字列に'hello'という引数が入っているので、定義元のfunction(message)に渡って、出力するとconsole.log(message)にはhelloが入ってきます。

コードが複雑になってくると、どこがどうなっているかわからなくなってしまうコールバック関数ですが、このように基本的な追い方を抑えて冷静に対処していきましょう！



#参考記事
[【JavaScript】初心者、コールバックを仕組みから理解する](https://tsuyopon.xyz/2018/09/04/callback-beginner/)

#最後に
自分自身、まだまだ勉強中の身なのでほとんど指導していただいている方の解説の参考にお世話になってしまいました、、
また、理解が深まった段階でこの記事もアップデートして行ければなと思います。
何かしらの参考になれば幸いでございます。
git cloneができないのはどうして？

この投稿では、次の手順でエラーが解決できることがありますよ。

- git cloneが出来ない理由
- git cloneがうまくいかなかった背景
- エラーの日本語訳
- エラーの解決法（手順１、２）
- 簡単にできるようになります。

## Git cloneが出来ない理由
「clone先のディレクトリに、同じ名前のファイルがあるからです。」


## Git cloneをしてみた。けど出来なかった背景

git clone　をするときに、

ターミナルに下記のコードを入力しました。
（****や＋＋＋＋は伏せ字です。）

```
git clone https://github.com/******/+++++++.git
```

そうしたら、

こんな返答が返ってきました。

```
fatal: destination path '++++++++++' already exists and is not an empty directory.
```

## このエラーは何なの？

上記エラーの意味は・・・
致命的：宛先パス '++++++++++'はすでに存在し、空のディレクトリではありません。

という意味です。
ちなみに、これはgoogle翻訳で翻訳したものです。

## Git cloneをできるようにする方法


このエラーは
「cloneするときに、選んだ場所に同じ名前のファイルがあるので、clone出来ません！」という意味です。

### このエラーを解決する【手順１】
cloneする先の同じ名前のファイルの名前を変えましょう。

例えば「hello」というファイルの場合、

- hello2
- hello3

なんかに変えてやれば大丈夫。

私の場合は原本のファイルの場合が多いので

- hello0

という表記にしちゃいます。

### このエラーを解決する【手順２】
もう問題解決できていますので、ターミナルに入力するだけです。
＊＊＊＊や＋＋＋＋＋は指定したいURLを入力してください。
```
git clone https://github.com/******/+++++++.git
```

一番最初のgit cloneをすれば、ちゃんとできるようになります。
原因は、ファイルの名前がカブっててダメじゃん！というだけの内容でした～。
three.jsのテクスチャがIE11で表示されないとき

いっつもIE11でテクスチャが表示されないのでメモ

# TextureLoaderが対応していない
この場合がほとんどで、`THREE.TextureLoader` が対応していない。
IE11の場合のみ古い方法で読み込むと表示される

```
THREE.ImageUtils.loadTexture(path)
```

:blush: