OmniAICreator/Qiita-1.07M huggingface dataset:
Unityで最初から自動アタッチされてる状態にする　例

InspectorでReset選択時に自動アタッチ


```c#:InfoGetter.cs
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

    /// <summary>
    /// お知らせ表示
    /// </summary>
    public class InfoGetter : MonoBehaviour
    {
        [Header("表示するオブジェクト")]
        [SerializeField]
        private GameObject prefab = null;
        [Header("表示させる場所の親")]
        [SerializeField]
        private Transform InstantiateParent = null;//Instantiateで複製したオブジェクトの親

        void Start()
        {
           CommonValues.Message.Reverse();
            for (int i = 0; i < CommonValues.Message.Count; i++)
            {
                GameObject item = GameObject.Instantiate(prefab, InstantiateParent);

                var text1 = item.FindChild("InfoText").GetComponent<Text>();
                text1.text = CommonValues.Message[i];

            }
        }

#if UNITY_EDITOR
        /// <summary>
        /// InspectorからReset選択時に自動アタッチ
        /// </summary>
        private void Reset()
        {
            //指定フォルダのprefabを全取得
            var guids_prefab = AssetDatabase.FindAssets("t:prefab", new string[] { "Assets/Prefabs" });

            for (int i = 0; i < guids_prefab.Length; i++)
            {
                //アタッチさせたいオブジェクト名を拡張子付きで書く
                prefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Prefabs/Info.prefab");

            }
            // ヒエラルキー上のすべてのオブジェクトを取得
            Object[] allGameObject = Resources.FindObjectsOfTypeAll(typeof(GameObject));
            // 取得したオブジェクトの名前を表示
            foreach (GameObject obj in allGameObject)
            {
                Debug.Log(obj.name);
                //アタッチさせたいオブジェクト名を書く
                if (obj.name == "InfoContent")
                {
                    InstantiateParent = obj.transform;

                }
            }
        }
    
#endif
}


```

これで、gitであらぶってアタッチ抜けが起きても戻せる！
Google Coral Edge TPUの正確な機能 

####Edge TPU 広い応用範囲
エッジで推論を行うために設計された Google の専用 ASIC。

Edge TPU は予測メンテナンスや異常検出、マシンビジョン、ロボット工学、音声認識など、増え続ける産業ユースケースに使用できます。 また、製造、オンプレミス、ヘルスケア、小売、スマート スペース、交通機関などにも使用できます。

####エンドツーエンドの AI インフラストラクチャ
Edge TPU は Cloud TPU と Google Cloud サービスを補完し、エンドツーエンド（クラウドツーエッジ、ハードウェア + ソフトウェア）のインフラストラクチャを提供することにより、お客様の AI ベース ソリューションのデプロイが簡単になります。

####小さく低消費電力のフットプリントで高いパフォーマンスを実現
高パフォーマンス、小フットプリント、低消費電力の Edge TPU は、高品質な AI をエッジに広くデプロイできます。

####AI のハードウェア、ソフトウェア、アルゴリズムの共同設計
Edge TPU は単なるハードウェア ソリューションではなく、カスタム ハードウェアやオープン ソフトウェア、最先端の AI アルゴリズムを組み合わせて、エッジ向けの高品質でデプロイしやすい AI ソリューションを提供します。

AI ソリューションをデプロイするためのオープンでエンドツーエンドのインフラストラクチャ
Edge TPU は、Coral のさまざまなプロトタイピング プロダクトと製品版プロダクトを使用して、エッジでの高品質な ML 推論のデプロイを可能にします。

エッジの ML 向け Coral プラットフォームにより、Google の Cloud TPU と Cloud IoT が強化され、エンドツーエンド（クラウドツーエッジ、ハードウェア + ソフトウェア）のインフラストラクチャを提供することにより、お客様の AI ベース ソリューションのデプロイが簡単になります。Coral プラットフォームはオープンソースの TensorFlow Lite プログラミング環境のほか、完全なデベロッパー ツールキットを提供するので、各自のモデルをコンパイルするか、Edge TPU のために複数の Google AI モデルを保持して AI とハードウェアの両面における Google の専門知識を組み合わせることができます。

Edge TPU は、エッジで AI を実行するための CPU、GPU、FPGA などの ASIC ソリューションを補完します。


Google CoralのグローバルディストリビューターGravitylinkは、Google Coralのシリアル製品を提供できます。大量販売または大量販売には、ボリュームディスカウントが適用されます.(store.gravitylink.com/global)
IntelliJ IDEAでメイン・メニューを消してしまった

#IntelliJ IDEAでメイン・メニューを消してしまった

自分の検索方法やヘルプの探し方が悪かったのか、あまりピンとくる方法がなかったので記載。

表示＞外観からメイン・メニューを消した、解除してしまった。
<img width="384" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583188/c00e7241-142b-c801-e97d-a3fce14cbeb8.png">

####解決方法
Ctrl+Alt+S で設定を開く
キーマップ＞メイン・メニュー＞表示＞外観
メイン・メニューにショートカットキーを設定
今回自分はAlt+Vを指定

<img width="737" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583188/6cfc3ae9-45ce-3b97-62fc-e77d0868fde1.png">

メイン・メニューを消してしまっても他のIDEやMSソフトはショートカットキー等が検索で引っかかるものなんだけど、IDEAはそうじゃなかったので・・・
nodebrewからnodenv with anyenvに乗り換える

## 概要

ディレクトリごとにnodeのバージョンを変えたい状況になって、
nodebrewだと難しそうだからnodenvに乗り換えるついでにanyenv入れちゃおうって話。

## nodebrewのアンインストール

- `brew uninstall nodebrew`
- `.nodebrew`フォルダを削除する。
- PATHからnodebrewを削除する。

### 参考

[Nodebrew本体を削除する方法 - Qiita](https://qiita.com/tonkotsuboy_com/items/f5d17f0b9698554a7716)

## anyenvのインストール

```
# homebrew
brew install anyenv

# .bash_profile
anyenv init
echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
exec $SHELL -l

# initialize manifest
anyenv install --init
```

### 参考

- [GitHub - anyenv/anyenv: All in one for **env](https://github.com/anyenv/anyenv)
- [anyenv + macOS環境構築 - Qiita](https://qiita.com/rinpa/items/81766cd6a7b23dea9f3c)

## nodeのインストール

```
# install nodenv
anyenv install nodenv

# install node
nodenv install [version]
```

### エラー発生

`nodenv: default-packages file not found`と出た。
下記コマンドを実行して再度インストールで解決。

```
echo yarn >> $NODENV_ROOT/default-packages
```

### 参考

[nodenv install時にdefault-packages file not foundが出た時のメモ \| 7me](https://7me.oji.0j0.jp/2019/12/21/nodenv-default-packages-file-not-found/)

## 利用バージョンの設定

localでバージョンを指定するとそのディレクトリより下の階層では設定したバージョンが自動的に利用される。尊い。

```
# global
nodenv global [version]

# local
nodenv local [version]
```

## 追記(2020/02/12) npmのグローバルインストールへの対応

この状態だとnpmでグローバルインストールしたモジュールにpathが通っておらずエラーが出た。
↓の参考サイトの手順で解決。

### 参考

[Mac上でanyenvのnodenvで管理しているnpmで入れたモジュールにパスを通す](https://qiita.com/USI/items/20c713ca6b9e5b8b2bea#npm%E3%81%A7%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)

## おわりに

ディレクトリごとにいちいちnodeのバージョンを切り替える必要がなくなって嬉しい！
R言語のFW ShinyをDockerでサクッと構築する

# 概要

タイトルまんま

## ディレクトリ構成

```
r-shiny-docker
├── apps
│   ├── appdir
│   │   ├── server.R
│   │   └── ui.R
│   └── index.html
└── docker-compose.yml
```

## docker-compose.yml

```docker-compose.yml
version: "3"
services: 
  shiny:
    image: rocker/shiny:3.4.4
    ports: 
      - 3838:3838
    volumes: 
      - "./apps:/srv/shiny-server"
```

## server.R

```server.R
#
# This is the server logic of a Shiny web application. You can run the 
# application by clicking 'Run App' above.
#
# Find out more about building applications with Shiny here:
# 
#    http://shiny.rstudio.com/
#

library(shiny)

# Define server logic required to draw a histogram
shinyServer(function(input, output) {
   
  output$distPlot <- renderPlot({
    
    # generate bins based on input$bins from ui.R
    x    <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
    
  })
})
```


## ui.R

```ui.R
#
# This is the user-interface definition of a Shiny web application. You can
# run the application by clicking 'Run App' above.
#
# Find out more about building applications with Shiny here:
# 
#    http://shiny.rstudio.com/
#

library(shiny)

# Define UI for application that draws a histogram
shinyUI(fluidPage(
  
  # Application title
  titlePanel("Old Faithful Geyser Data"),
  
  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
       sliderInput("bins",
                   "Number of bins:",
                   min = 1,
                   max = 50,
                   value = 30)
    ),
    
    # Show a plot of the generated distribution
    mainPanel(
       plotOutput("distPlot")
    )
  )
))
```

## index.html

```index.html
hello
```

## 接続

[http://localhost:3838/](http://localhost:3838/)で
[![Image from Gyazo](https://i.gyazo.com/e78f4c6d39d49e17e0e958ea7853c298.png)](https://gyazo.com/e78f4c6d39d49e17e0e958ea7853c298)

[http://localhost:3838/appdir/](http://localhost:3838/appdir/)で
[![Image from Gyazo](https://i.gyazo.com/47ccbdadd5680c6a859ec807f5699dd6.png)](https://gyazo.com/47ccbdadd5680c6a859ec807f5699dd6)

## 参考

- (rocker-org/shiny)[https://github.com/rocker-org/shiny]
Vue.js で console.log はできないのか？

# エラー内容
Vue-CLIで`console.log`をしようとしたところ以下のエラーがでました。

```
Module Error (from ./node_modules/eslint-loader/index.js):
error: Unexpected console statement (no-console) at src/components/About.vue:11:5:
   9 | export default {
  10 |   deactivated() {
> 11 |     console.log("deactivated");
     |     ^
  12 |   }
  13 | };
  14 | </script>
```


JSで頻発する`console.log`が使えないって本当？ と思い調べてみると、Vue-CLIの初期設定では無効になっているそうです。

なるほど。以下`console.log`を有効化する手順を残します。

# 解決策
## 【手順１】 package.json に追記
`package.json`の"rules"のなかに１行追加します(コメントアウトで記しています)。

```jsonc:package.json
{
  "name": "udemy-vuejs",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "core-js": "^3.4.4",
    "vue": "^2.6.10"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^4.1.0",
    "@vue/cli-plugin-eslint": "^4.1.0",
    "@vue/cli-service": "^4.1.0",
    "babel-eslint": "^10.0.3",
    "eslint": "^5.16.0",
    "eslint-plugin-vue": "^5.0.0",
    "vue-template-compiler": "^2.6.10"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "rules": {
      "no-console": 0 // ← この行を追加する！！
    },
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },
  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]
}
```

## 【手順２】 サーバーを立ち上げ直す
サーバーを起動している場合は`control + c`で抜けてから、通常通り以下のコマンドで再度起動します。

```
$ npm run serve
``` 

再起動しないとうまく動作しませんでした。ここまでセットで行いましょう。

# 参考
・[Vue CLIでconsole.logを有効化する方法](https://qiita.com/saio-th/items/111f6f5cc62f421cf045)

主に以上の記事を参考にさせていただきました。ありがとうございます。

# さいごに
私自身Vue.js初心者で、エラー文から探すのに戸惑ったことと、再起動も必要というところもセットでわかると良いなと思ったため残しておきます。これから学習される方の参考になれば幸いです。
物理・数学・プログラムのページについて

<h2>概要</h2>
普段私のブログで発信していますがあまりアクセスが全くないのでQiitaに書くことにしました。
ちなみに<a href="https://campbel.love/">ここ</a>が私のブログサイトです。
Qiitaなので、プログラム、シミュレーションなども載せたいと思っています。(実はこれが一番やりたい)

間違いなど見つけましたらお手数ですがコメントをお願いいたします。


<h2>物理のページ</h2>
<a href="https://qiita.com/campbel2525/items/b05e676e19e2922f2336">電磁気まとめ</a>
<a href="https://qiita.com/campbel2525/items/0a449765c6f210224753">ローレンツゲージにおけるマクスウェルの方程式</a>
<a href="https://qiita.com/campbel2525/items/d8902eb6666457a30fd4">相対論的なマクスウェルの方程式</a>

<h2>数学のページ</h2>
<a href="https://qiita.com/campbel2525/items/e53bfd2144512d978356">ベクトル解析公式集</a>
<a href="https://qiita.com/campbel2525/items/a0d9634a22758951c20c">微分積分公式集</a>
<a href="https://qiita.com/campbel2525/items/3d22e34391dca48cae0e">ラプラス変換公式集
</a>


<h2>プログラムのページ</h2>
<a href="https://qiita.com/campbel2525/items/6a5ee8c84e84bb618371">javascript知見</a>
<a href="https://qiita.com/campbel2525/items/64d1debfe5b19b459d9d">letsencrypt(レッツエンクリプト)の知見</a>


<h2>エンジニア研修のページ</h2>
<a href="https://qiita.com/campbel2525/items/c3c36788f8b9f85c6dd6">初めてのプログラミング(エンジニア研修1)</a>
<a href="https://qiita.com/campbel2525/items/0f9adbdbe1fe24f3d188">初めてのプログラミング(エンジニア研修1)</a>


<h2>その他ページ</h2>

<h2>書くきっかけ</h2>
自分のブログサイトからの引用です。

はじめまして！
campbelです。
キャンベルと読みます。

以前私は物理学者を目指していました。
アインシュタインが特殊相対性理論を発表したのが26歳の時でした。20歳だった時
、「俺もノーベル賞とれるっしょ！！！」となったわけです。そこからは物理学・数学をひたすら勉強しました。


物理学はとても楽しい学問ではありますが、物理学・数学に抵抗ある人が多いです。
私自身も物理学を完璧に理解していわけではありませんが、私なりに物理学・数学を分かりやすくまとめてみたいと思います。

物理学・数学を好きになる人、研究者になる人が一人でも増えることを願っています。

またプログラムにつては、私はほぼ独学でプログラムを学びました。その時につまづいた所やわからなかったところをまとめていきたいと思います。
サーバーの設置、db、python、php、ts、html、css、js、スマホのアプリなど一通りできます。

<h2>参考文献</h2>
・エマンの物理学
このサイトはものすごくおすすめです。私が物理を好きになったきっかけのサイトです。
エマンさんは「初心者レベル」と言っていますが、全然そんなことはなくおそらく大学院レベルのこともお話しされています。
また本もめちゃくちゃ分かりやすいです。
参考文献として載せるにはやはり本書出ないとダメなので本の購入おすすめです。

・よくわかる〜シリーズ
私が参考書の中で一番好きなシリーズです。相対性理論がないのが残念です。
確か琉球大学の先生が書いています。一時期、琉球大学の大学院に行くか悩みました。今でも少し狙っています。！！( ^ω^ )
systemctl restart network 代替えコマンド 

8系のLinuxOSからsystemctl restart networkが使用できなくなったため、
SSH接続中にインターフェースのアップダウンを同時にできる方法ないか調べたところ
ぱっと出てこなかったので備忘録

nmcli c down ens192 ;nmcli c up ens192

■参考
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_ip_networking_with_nmcli
【HTML,CSS,JavaScript】動画をパララックスする

写真をパララックスにするプラグインの紹介などは結構あったのですが、動画は意外となかったのでメモ。
動画の埋め込み自体あんまり使うことないんですが、どうしてもやらなきゃいけない＆時間かけられない時にさくっと実装できます。

#動画をパララックスさせたい

１） 下記リンク先 backgroundVideo にアクセス、distフォルダ内のjsのどちらかを読み込ませる。
https://github.com/linnett/backgroundVideo

２） 任意のクラスをVIDEOタグにつけて、以下のようなJavaScriptの記述をする。

```index.html
<video class="bv-video"></video>

<script>
new BackgroundVideo('.bv-video', {
  src: [
    //動画保存先のパス
    'MY/EXAMPLE/PATH/SAMPLE.mp4',
    'MY/EXAMPLE/PATH/SAMPLE.webm'
  ]
});
</script>
```

３）　高さを上書きしたい場合は、 .bv-video-wrap クラスに !important をつけて高さを上書きする。

```style.css
.bv-video-wrap {
   height: 500px !important;
}
```
相対論的なマクスウェルの方程式

<h2>シリーズ</h2>
<a href="https://qiita.com/campbel2525/items/004270f9f89818b08e12">物理・数学・プログラムのページについて
</a>

<h2>概要</h2>
<p>
今回は<a href="https://qiita.com/campbel2525/items/0a449765c6f210224753">ローレンツゲージにおけるマクスウェルの方程式</a>で導出したマクスウェルの方程式を「アインシュタインの縮約記法」
を使用すると簡潔にかけるのでやってみたいと思います。
相対論的なマクスウェルの方程式と呼びましょう。
</p>

<h2>結果</h2>

```math
    \boldsymbol{A} = \left(\frac{\phi}{c}, A_x, A_y, A_z \right)        \tag{電磁ポテンシャル}
```

```math
    \boldsymbol{i} = \left(\rho c, i_x, i_y, i_z \right)        \tag{4元電流密度}
```

```math
    \Box A^\mu - ∂^\mu \left(∂_\nu A^\nu \right)
    = - \mu_0 i^\nu        \tag{相対論的なマクスウェルの方程式}
```

```math
    ∂_\nu i^\nu = 0        \tag{相対論的な電荷の保存則}
```

```math
    ∂_\nu A^\nu = 0        \tag{相対論的なローレンツ条件}
```


<h2>証明</h2>
<p><a>ローレンツゲージにおけるマクスウェルの方程式</a>の(7)式、(8)式からスタートする。再度式番号は振り直す。</p>

```math
    \left( \triangle - \frac{1}{c^2} \frac{∂^2}{∂t^2} \right) \boldsymbol{A} -

    \mathbf{grad} \left( \mathbf{div} \boldsymbol{A} + \frac{1}{c^2} \frac{∂ \phi}{∂t} \right) = - \mu_0 \boldsymbol{i}        \tag{1}
```

```math
    \triangle \phi\ + \mathbf{div} \frac{∂ \boldsymbol{A}}{∂t} = - \frac{\rho}{\varepsilon_0}        \tag{2}
```




<p>まず(2)式を(1)式に近づけることから始める。</p>
(i)左辺に$ \frac{1}{c^2} \frac{∂^2 \phi}{∂t^2} $を足して引く。

```math
    \left( \triangle - \frac{1}{c^2} \frac{∂^2}{∂t^2} \right) \phi
    +
    \mathbf{div} \frac{∂ \boldsymbol{A}}{∂t}
    +
    \frac{1}{c^2} \frac{∂^2 \phi}{∂t^2}
    =
    - \frac{\rho}{\varepsilon_0}
```

(ii)左辺の第二項以降を$\frac{∂}{∂t}$でくくる。

```math
    \left( \triangle - \frac{1}{c^2} \frac{∂^2}{∂t^2} \right) \phi
    +
    \frac{∂}{∂t} \left( \mathbf{div} \boldsymbol{A} + \frac{1}{c^2} \frac{∂ \phi}{∂t} \right)
    =
    - \frac{\rho}{\varepsilon_0}
```

(iii)両辺をcで割る。

```math
    \left( \triangle - \frac{1}{c^2} \frac{∂^2}{∂t^2} \right) \frac{\phi}{c}
    +
    \frac{1}{c} \frac{∂}{∂t} \left( \mathbf{div} \boldsymbol{A} + \frac{1}{c} \frac{∂}{∂t} \frac{\phi}{c} \right)
    =
    - \frac{1}{c} \frac{\rho}{\varepsilon_0}
```

(iiii)ここで、<a>ローレンツゲージにおけるマクスウェルの方程式</a>の出てきたものと(5)式を導入すると

```math
    \boldsymbol{A} = \left(\frac{\phi}{c}, A_x, A_y, A_z \right)        \tag{3: 電磁ポテンシャル}
```

```math
    \boldsymbol{i} = \left(\rho c, i_x, i_y, i_z \right)        \tag{4: 4元電流密度}
```

```math
    \frac{∂ }{∂w} = \frac{1}{c} \frac{∂ }{∂t}        \tag{5}
```

```math
    \left( \triangle - \frac{∂^2}{∂w^2} \right) A^0
    +
    \frac{∂}{∂w} \left( \mathbf{div} \boldsymbol{A} + \frac{∂}{∂w} A^0 \right)
    =
    - \mu_0 i^0        \tag{6}
```

となる。(6)式と(1)式は同じような形をしている。なので、「アインシュタインの縮約記法」を用いると

```math
    \Box A^\mu - ∂^\mu \left(∂_\nu A^\nu \right)
    = - \mu_0 i^\nu        \tag{14: 相対論的なマクスウェルの方程式}
```
なる。終わり。



<h2>相対論的な電荷の保存則</h2>
電荷の保存則も簡単にかける。

```math
    ∂_\nu i^\nu = 0        \tag{15: 相対論的な電荷の保存則}
```

<h2>相対論的なローレンツ条件</h2>
ローレンツ条件も簡単にかける。

```math
    ∂_\nu A^\nu = 0        \tag{16: 相対論的なローレンツ条件}
```
電磁気まとめ

<h2>シリーズ</h2>
<a href="https://qiita.com/campbel2525/items/004270f9f89818b08e12">物理・数学・プログラムのページについて
</a>

<h2>ローレンツゲージにおけるマクスウェルの方程式</h2>
証明は<a href="https://qiita.com/campbel2525/items/0a449765c6f210224753">ここ</a>

```math
    \boldsymbol{A} = \left(\frac{\phi}{c}, A_x, A_y, A_z \right)        \tag{電磁ポテンシャル}
```

```math
    \boldsymbol{i} = \left(\rho c, i_x, i_y, i_z \right)        \tag{4元電流密度}
```

```math
    \Box \boldsymbol{A} = - \mu_0 \boldsymbol{i}        \tag{ローレンツゲージにおけるマクスウェルの方程式}
```

```math
    \mathbf{div} \boldsymbol{A} + \frac{1}{c^2} \frac{∂ \phi}{∂t} = 0       \tag{ローレンツ条件}
```

<h2>相対論的なマクスウェルの方程式</h2>
証明は<a href="https://qiita.com/campbel2525/items/d8902eb6666457a30fd4">ここ</a>

```math
    \boldsymbol{A} = \left(\frac{\phi}{c}, A_x, A_y, A_z \right)        \tag{電磁ポテンシャル}
```

```math
    \boldsymbol{i} = \left(\rho c, i_x, i_y, i_z \right)        \tag{4元電流密度}
```

```math
    \Box A^\mu - ∂^\mu \left(∂_\nu A^\nu \right)
    = - \mu_0 i^\nu        \tag{相対論的なマクスウェルの方程式}
```

```math
    ∂_\nu i^\nu = 0        \tag{相対論的な電荷の保存則}
```

```math
    ∂_\nu A^\nu = 0        \tag{相対論的なローレンツ条件}
```


<h2>ゲージ変換</h2>

```math
    \boldsymbol{A}^{’} = \boldsymbol{A} + \mathbf{grad} \chi
```

```math
    \phi^{’} = \phi - \frac{∂ \chi}{∂t}
```

 <h2>電磁気でよく使用するベクトル公式</h2>

```math
    \mathbf{rot} (\mathbf{rot} \boldsymbol{X}) = \mathbf{grad} (\mathbf{div} \boldsymbol{X}) - \triangle \boldsymbol{X}
```
```math
    \mathbf{rot} \cdot\mathbf{grad} \phi = \boldsymbol{0}
```
```math
        \mathbf{div} \cdot\mathbf{rot} \boldsymbol{X} = 0
```
Linked Serverを使ってSQLServerからPostgresに接続する

# 概要

Postgresを主DBとして使用している環境で、
都合によってSQLServer経由でPostgresに接続したくなった。

以下のような接続である
Client -> SQL Server -> Postgres

これを SQLServerの `Linked Server` を使って実現した

直接関連しないものもあるが、構築した環境のその他情報

- PostgresはRDS Aurora を利用
- 外部からPostgresに接続するには踏み台(Linux)ServerへのSSHトンネルが必要
- SQLServerはexpress edition
- SQLServerは任意の場所にあって、クライアントから接続できる

# 設定手順

## 事前準備

事前に SQLServerを配置するインスタンスに `SQLServer` と `SSMS` をインストールして使えるようにしておく。

# Postgres ODBC Driverのインストール

[posrgres12ならココからdownload](https://ftp.postgresql.org/pub/odbc/versions/msi/psqlodbc_12_01_0000.zip)

流れにそってSQLServerを配置するインスタンスにインストールしておく

## SQLServerにLinked Server設定

`SSMS` でクエリエディタを開き、以下の例のように記述し、実行
※中でpostgresへの接続設定があるので書き換えてください
※今回はsshトンネル経由の例なので、postgres serverがlocalhostやらport12345やらになってます

```sql
DECLARE @name NVARCHAR(4000);
DECLARE @provider NVARCHAR(4000);
DECLARE @provstr NVARCHAR(4000);
DECLARE @db_name NVARCHAR(4000);

-- destination postgres database
SET @name = N'test'; -- リンクServerの名前。任意につける。後にselectとかする時に必要
SET @provider = N'MSDASQL';
SET @provstr = 'Driver={PostgreSQL UNICODE};Server=localhost;Port=12345;Database=test_db;UID=test_user;Password=test_user_password;Network=dbmssocn;'
SET @db_name = N'test_db';  -- postgres db name

-- create linked server
EXEC MASTER.dbo.sp_addlinkedserver @server = @name
,@srvproduct = N'PostgreSQL'
,@provider = @provider
,@provstr = @provstr
,@catalog = @db_name

-- set up Extended properties of the Linked Server
EXEC MASTER.dbo.sp_serveroption @server = @name
,@optname = 'data access'
,@optvalue = 'true'
EXEC MASTER.dbo.sp_serveroption @server = @name
,@optname = 'use remote collation'
,@optvalue = 'true'
EXEC MASTER.dbo.sp_serveroption @server = @name
,@optname = 'rpc'
,@optvalue = 'true'
EXEC MASTER.dbo.sp_serveroption @server = @name
,@optname = 'rpc out'
,@optvalue = 'true'
GO
```

うまく設定できれば以下のように `SSMS` からテーブル情報等を見ることができる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60056/e73ce093-4996-881b-ba03-3fc0ed64274c.png)



# SQLServerからPostgres Tableへクエリの発行

SQLServerから普通にselectを発行すると、SQLServerだけに参照ロックがかかる。
これは嫌。
`T-SQL` の `OPENQUERY` を使ってSQLを発行すると参照ロックがかからないらしい。

```sql
select * from OPENQUERY(
  hoge, -- link server name
  'select * from xxxxxxxxx'
)
```
WindowsOSでAngularプロジェクト作成

### node.jsをインストール
インストールされた確認
`node -v`
### npm(Node package manager)をインストール
node.jsインストールする時同時にインストールされるし、インストールされた確認
`npm -v`
### angularフレームワークをインストール
`npm install -g @angular/cli`
### angularプロジェクトを作成
`ng new your-project-name`
### プロジェクト ディレクトリに移動
`cd your-project-name`
### ローカルマシン上で アプリを実行する
`ng serve` 

### ウェブブラウザに次のアドレスを入力
`http://localhost:4200/`
Pepper SDK入門(14) Chat Editor

これまでAnimation Editor、Trajectory Editorと続けて、エディターの勉強を行ってきました。今回は、Chat Editorについて確認していきたいと思います。
#Chat Editor
Chat EditorはChat topicファイルの編集をサポートしてくれるツールです。AndroidStudioでChat Editorを利用するためには、PepperSDKをインストールする必要があります。PepperSDKインストールの手順は、[Pepper SDK入門(1) Pepper SDKプラグインのインストール](https://qiita.com/kskrin/items/65de908992c2a0e2751d)を参照してください。
##1.Chat Topicについて
ユーザーの発話への応答方法を簡単に記述できるQiChat Languageという言語があり、これでChat Topicを作成することでPepperと容易に会話することが出来るようになります。
###Chat Topicの言語設定について
Pepperはいくつもの言語を理解し会話することが可能ですが、同様にしてChat Topicも複数の言語を利用して作成することが可能です。ただし初めて作成するChat Topicは、デフォルトのものになっており言語の選択はできません。同じ名前のChat Topicを作成する際に、既存のものと区別するため言語の種類が選択できるようになります。よって様々な言語のChat Topicを作る前に、まずはデフォルトのものを一つ作成しましょう。
##2.新しいChat Topicの作成
**〈手順〉**
1.AndroidStudioで、FileメニューのNewからChat Topicを選びます。
2.ファイル名を入力しましょう。
<a href="http://1.bp.blogspot.com/-yO_baNyXNCk/XJmLNBUFnDI/AAAAAAAAAXY/Jz9pefJt4NIKqtWSCWCSfJruu08-POHzgCK4BGAYYCw/s1600/WS000000.JPG" imageanchor="1"><img border="0" height="388" src="https://1.bp.blogspot.com/-yO_baNyXNCk/XJmLNBUFnDI/AAAAAAAAAXY/Jz9pefJt4NIKqtWSCWCSfJruu08-POHzgCK4BGAYYCw/s640/WS000000.JPG" width="640" /></a>
3.Createボタンをクリックします。すると、新しいChat Topicファイルがresディレクトリのrawフォルダに追加され、Chat Editorが表示されるはずです。
<a href="http://1.bp.blogspot.com/-Hr1iEinxDec/XJmLtUMglDI/AAAAAAAAAXk/e93Ngydc_LoVv4iF4DooSznAu4k6Ek8mwCK4BGAYYCw/s1600/WS000001.JPG" imageanchor="1"><img border="0" src="https://1.bp.blogspot.com/-Hr1iEinxDec/XJmLtUMglDI/AAAAAAAAAXk/e93Ngydc_LoVv4iF4DooSznAu4k6Ek8mwCK4BGAYYCw/s1600/WS000001.JPG" /></a>
4.Chat EditorでChat Topicの内容を書き換えます。テスト用の記述がされているため、コメントを外すことで動作確認することも可能です。
<a href="http://1.bp.blogspot.com/-q8nwTyzEz0A/XJms3wP2jYI/AAAAAAAAAYo/ql0LB07IGNM41nxq9-FTHxS1pHv7dUuJwCK4BGAYYCw/s1600/WS000000.JPG" imageanchor="1"><img border="0" height="161" src="https://1.bp.blogspot.com/-q8nwTyzEz0A/XJms3wP2jYI/AAAAAAAAAYo/ql0LB07IGNM41nxq9-FTHxS1pHv7dUuJwCK4BGAYYCw/s640/WS000000.JPG" width="640" /></a>
##3.任意の言語でのChat Topicの作成
**〈手順〉**
1.AndroidStudioで、FileメニューのNewからChat Topicを選びます。
2.既存のChat Topicと同じファイル名を入力し、言語と地域を選びます。
<a href="http://4.bp.blogspot.com/-jDJ-3IvdNb0/XJmuFnGC2pI/AAAAAAAAAZA/BwO0cRA5GLkv56E6VIEHAy-gO-WFuiBXgCK4BGAYYCw/s1600/WS000000.JPG" imageanchor="1"><img border="0" height="384" src="https://4.bp.blogspot.com/-jDJ-3IvdNb0/XJmuFnGC2pI/AAAAAAAAAZA/BwO0cRA5GLkv56E6VIEHAy-gO-WFuiBXgCK4BGAYYCw/s640/WS000000.JPG" width="640" /></a>
3.Createボタンをクリックします。すると、新しいChat Topicファイルがresディレクトリのrawフォルダに追加され、Chat Editorが表示されるはずです。
<a href="http://3.bp.blogspot.com/-JGG1_ZDcWmo/XJmuH654g_I/AAAAAAAAAZI/z4EikUaw61YZ6HhFkNHio3NMwm-4qEIOQCK4BGAYYCw/s1600/WS000001.JPG" imageanchor="1"><img border="0" src="https://3.bp.blogspot.com/-JGG1_ZDcWmo/XJmuH654g_I/AAAAAAAAAZI/z4EikUaw61YZ6HhFkNHio3NMwm-4qEIOQCK4BGAYYCw/s400/WS000001.JPG" /></a>
4.Chat EditorでChat Topicの内容を書き換えます。テスト用の記述がされているため、コメントを外すことで動作確認することも可能です。
<a href="http://4.bp.blogspot.com/-t4Nvo8zW-Is/XJmuJ66lVII/AAAAAAAAAZQ/qvDEPqnvs8Ur_z5dlG00ufvDgf4ra0fsgCK4BGAYYCw/s1600/WS000002.JPG" imageanchor="1"><img border="0" height="177" src="https://4.bp.blogspot.com/-t4Nvo8zW-Is/XJmuJ66lVII/AAAAAAAAAZQ/qvDEPqnvs8Ur_z5dlG00ufvDgf4ra0fsgCK4BGAYYCw/s640/WS000002.JPG" width="640" /></a>
TwitterのREST APIで取得したツイートの日付をPHPで日本標準時に変換

よく忘れるので。
タイムゾーンは`Asia/Tokyo`であることが前提。

```php
date( 'Y-m-d H:i:s', strtotime($tweet['created_at']) );
```

これで
**Mon Feb 10 05:12:03 +0000 2020** が
**2020-02-10 14:12:03** になる。
GitHub Actionsで動かすRubocopを高速化する

# TL;DR
Rubocopはキャッシュファイルを生成し、2回目以降は差分スキャンをおこないます。GiuHub Actionsのキャッシュ機能で、キャッシュファイルを保持すると実行時間を大きく削減できます。
# Rubocopのキャッシュ
Rubocopはスキャンを高速化するため、実行後にホームディレクトリの`.cache`以下にキャッシュファイルを生成します。ルールに変更がない場合、2回目以降のスキャンでは変更されたファイルのみ検査します。
GitHub Actionsは環境が毎回クリアされるため、GitHub Actiosのキャッシュ機能を使って、Rubocopのキャッシュファイルを流用できるようにします。

# 設定例（抜粋）
```yaml:.github/workflows/rails.yml
    - name: Cache rubocop
      uses: actions/cache@v1
      with:
        path: ~/.cache/rubocop_cache
        key: ${{ runner.os }}-rubocop-${{ github.head_ref }}
        restore-keys: |
          ${{ runner.os }}-rubocop-
          ${{ runner.os }}-rubocop-${{ github.base_ref }}
          ${{ runner.os }}-rubocop-${{ hashFiles('**/.rubocop.yml') }}
    - name: Rubocop
      run: bundle exec rubocop --parallel
```
# 設定内容
Rubocopの前に指定します。キャッシュのキーワードを何にするかという問題がありますが、プルリクエストをトリガーに動かしているので、"ソースブランチ名">"ターゲットブランチ名">"rubocop.ymlのハッシュ"という順番で指定しています。
なるべくキャッシュを有効に使いたいところですが、キャッシュ生成時と現在のコード差分が大きくなると、結局スキャンするファイル数が増えてしまいます。
そこで、通常はソースブランチ名をキーにキャッシュし、はじめて実行するブランチの場合は、ターゲットブランチのキャッシュを使い回します。ターゲットブランチのキャッシュもない場合は、`.rubocop.yml`のハッシュをキーにしたキャッシュを使います。
これにより、ブランチ単位で違うキャッシュを使って、効率的にテストできます。

## --parallelオプション
本筋とは関係ありませんが、rubocopに`--parallel`オプションを付与すると並列実行されます。
GitHub Actionsが実行される環境は2vCPUなので速くなります。

# 効果
差分がないコードで実行してみました。

## 設定前
1分27秒かかっています
<img width="970" alt="87秒.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19807/2f4fb5e3-4d0f-6f19-5ed3-5a8c04a3eef0.png">
## 設定後
3秒で終わってます
<img width="979" alt="3秒.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19807/f139db8c-b213-2fb4-27db-920d403bb973.png">
51歳から（現52）のプログラミング 備忘 Support Library API追加

#Support Library APIの追加
ネイティブのActionBarはAPIレベル21以降。Support Library の Toolbar ならAPIレベル7以降をサポートできる。

Projectのbuild.gradleファイル内にGoogle Mavenリポジトリを組み込む

```java:
allprojects{
   repositories{
      google()
      // もし、gradle versionが4.1以下なら、代わりに以下を使う
      // maven{
      // url 'https://maven.google.com'
      // }
}}
```
次に、サポートライブラリを使用するモジュールごとに、build.gradle内のdependenciesブロックにライブラリ（v4 core-utils）を追加

```java:build.gradle
dependencies{
   ...
   implementation "com.android.support:support-core-utils:28.0.0"
   // implementation "com.android.support:appcompat-v7:28.0.0"
   // versionを省略記載するとバグるかも
```

サポートライブラリを使用して、既存アプリの以前のバージョンまで広げる場合、manifestの<uses-sdk>タグに以前のバージョン番号を設定する。これでアプリがAndroid APIレベル14以降を搭載するデバイスにインスツールできるようになる。

```java:manifest
<uses-sdk
   android:minSdkVertion="14"
   android:targetSdkVersion="23" />
```
でも、これよりもbuild.gradle内でminSdkVersionの設定のほうが優先されるよ

```java:build.gradle
apply plugin:'com.android.application'
android{
   ...
   defaultConfig{
      minSdkVersion 16
      ...
   }
   ...
}
```
サポートライブラリを複数追加する場合、指定したライブラリで必要となる最新のSDKバージョンを最小SDKバージョンとして設定する必要あり。

例）V14 preferenceサポートライブラリと、V17 Leanbackライブラリの両方をアプリに組み込む場合、最小SDKバージョンを17以上にする。
Pythonの仮想環境を設定

## virtual environment作成
##### MacOS と Linux
`python3 -m venv your_env_name`
##### Windows
`python -m venv your_env_name`

## virtual environment利用
##### MacOS と Linux
`source your_env_name/bin/activate`
##### Windows
`.\your_env_name\Scripts\activate`
## virtual environment終了
`deactivate`
curlコマンドをrequestに変換してくれるサイト

便利だったのでメモ
https://curl.trillworks.com/


仮に下記のようなcurlがあったとして

```
curl -X POST 'https://example.com/' \
-H 'Content-Type: application/json' \
-d '{"key1": "value1", "key2": "value2"}'
```
これを入れると下記に変換される

```python
import requests

headers = {
    'Content-Type': 'application/json',
}

data = '{"key1": "value1", "key2": "value2"}'

response = requests.post('https://example.com/login', headers=headers, data=data)

```
CentOS6のSambaでSMB2を有効にしてパスなし参照フォルダを設定した手順

以下をやりましたので記事とします。

* CentOS 6系で
* samba 3.6を使って
* SMB2も有効にした(元々はSMB1だった)

最近は古いサーバの延命的なSomethingもやっていて、この記事もその一環のネタです。
CentOS６は[Wiki](https://wiki.centos.org/About/Product)によると 2020-11-30 にEOLとなりますが、古い社内共有サーバの1台がCentOS6で稼働していまして、それでも `クライアント側はセキュリティ面などからSMB1は利用不可としたい` という要望がありました。


# 設定値

/etc/samba/smb.confを以下の様に変更しました。

```
[global]
         max protocol = SMB2

         security = user
         map to guest = Bad User
```

## 設定のポイント

* `max protocol = SMB2`
    * これに関してはすぐに記事が見つかり、設定を入れたのですがクライアントはSMB1で接続してしまい、一向に効果がありませんでした
* `security = user`
    * デフォルトの値ですが重要です。弊社の既存環境では `security = share` が設定されており、これはdeplicatedなパラメータです。`security = share`の目的はパスワードなしで共有フォルダを参照させるためでしたが、これを行うとSMB1しか動作しない様で大ハマりしました
* `map to guest = Bad User`
    * `security = user` をしつつ、フォルダをパスワードなしで誰でも参照させたい場合に必要です。後述する記事に当たるまで全く対応方法がわからず困りました

# その他

## 環境
具体的には以下の環境です。

* CentOS release 6.10 (Final)
* samba-common-3.6.23-53.el6_10.x86_64

## 参考記事
以下の記事で `map to guest = Bad User` を知り大変助かりました。
* [ubuntuforum.org - (Samba) Warning: security=share is deprecated](https://ubuntuforums.org/showthread.php?t=1962617)

## SMBのバージョンを調べる方法
クライアント側にWiresharkを入れて、 `smb or smb2` のフィルタで見れば一発です。
もう少し具体的にいうと
1.  クライアントから `Negotiate Protocol Request` の `Requested Dialects` で話せるSMB一覧を送る
2.  サーバ側から `Negotiate Protocol Response` が来て
　　　* SMB1の場合 `Selected Index` フィールドが `NT LM 0.12` の様になりました
　　　* SMB2の場合 `Dialect: SMB 2.0.2` の様になりました

### SMB1しかできないパケキャプ結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120707/3e38c3c1-f09f-d079-a53d-957e236517a5.png)


### SMB2に成功したパケキャプ結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120707/f3ec2601-b5e3-e7c8-3084-d1faea3ce91a.png)



以上、もうすぐ役目を終えるCentOS6のSambaの設定でした。個人としても大変お世話になったCentOS6の長きにわたる活躍に敬意を表します。
Apacheでリバースプロキシでリクエストを転送する際に、フォワードプロキシを踏ませる

# TL;DR

* 外部サイトにアクセスする際に、プロキシを踏まなければならない
* でも、使うソフトウェアがプロキシに対応していない
* Apacheでリバースプロキシを立てて、対象のソフトウェアの代わりにApacheにプロキシを踏んでもらおう
* 透過型プロキシとか言わない

そんな、なんとかしてプロキシ環境から外に出たいお話。


# 環境
Ubuntu Linux 18.04 LTSで行います。

```shell
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.4 LTS
Release:	18.04
Codename:	bionic
```

このサーバーのIPアドレスは、`192.168.33.10`とします。

Apacheのインストール＆バージョン。

```shell
$ sudo apt install apache2


$ /usr/sbin/apache2 -v
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2019-09-16T12:58:48
```

mod_ssl、それからmod_proxyを導入します。HTTPSの時にフォワードプロキシを踏むことを考えて、mod_proxy_connectも導入しておきます。

```shell
$ sudo a2enmod ssl proxy_http proxy_connect
```

デフォルトのHTTPサイトの有効化。

```shell
$ sudo a2ensite default-ssl
```

とりあえず、Apacheを再起動。

```shell
$ sudo systemctl restart apache2
```

この環境で始めていきます。


# 設定する

プロキシ先のターゲットとするサイトは、以下としましょう。

* HTTP … `http://wttr.in/tokyo`
* HTTPS … `https://www.google.com`

パターンは、以下の3つで構築します。

* HTTP（8080） → フォワードプロキシ → HTTP（ターゲット）
* HTTP（18080） → フォワードプロキシ → HTTPS（ターゲット）
* HTTPS（8443） → フォワードプロキシ → HTTPS（ターゲット）

最後の2つは中間者なんとかっぽい気がしないでもないですが、バリエーションとしてできることは覚えておきましょう。

参照するドキュメントは、こちら。

* [mod_proxy](https://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html)
* [ProxyRemote](https://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxyremote)
* [SSLProxyEngine](http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslproxyengine)

最小構成で設定します。


## HTTP（8080） → フォワードプロキシ → HTTP（ターゲット）

設定。

```
Listen 8080

<VirtualHost *:8080>
	ProxyPass / http://wttr.in/tokyo
	ProxyPassReverse / http://wttr.in/tokyo

	ProxyRemote * http://[your-proxy-host]:[your-proxy-port]
</VirtualHost>
```

フォワードプロキシを踏ませる場合には、`ProxyRemote`ディレクティブを使うのがポイントです。

確認。

```shell
$ curl -I 192.168.33.10:8080?lang=ja
```


## HTTP（18080） → フォワードプロキシ → HTTPS（ターゲット）

設定。

```
Listen 18080

<VirtualHost *:18080>
	SSLProxyEngine on

	ProxyPass / https://www.google.com
	ProxyPassReverse / https://www.google.com

	ProxyRemote * http://[your-proxy-host]:[your-proxy-port]
</VirtualHost>
```

プロキシ先がHTTPSの場合は、`SSLProxyEngine`ディレクティブが必要です。

確認。

```shell
$ curl -I 192.168.33.10:18080
```

なお、今回の構成では、ターゲットのSSL証明書をApacheが理解できることが前提になっています。


## HTTPS（8443） → フォワードプロキシ → HTTPS（ターゲット）

設定。

```
Listen 8443

<VirtualHost *:8443>
	SSLEngine on

	SSLCertificateFile	/etc/ssl/certs/ssl-cert-snakeoil.pem
	SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

	SSLProxyEngine on

	ProxyPass / https://www.google.com
	ProxyPassReverse / https://www.google.com

	ProxyRemote * http://[your-proxy-host]:[your-proxy-port]
</VirtualHost>
```

Apache自体もHTTPSにしつつ、プロキシ先もHTTPSなので`SSLEngine`、`SSLProxyEngine`の両方が必要です。

確認。

```shell
$ curl -I -k https://192.168.33.10:8443
```

Apache自体の証明書は自己署名証明書なので、`curl`のオプションに`-k`が必要です。


# まとめ

これで、本来のサイトに直接アクセスしようとするのではなく、Apacheを経由して、Apacheにフォワードプロキシを踏んでもらうことで、プロキシに対応していないソフトウェアでもプロキシを踏ませられるようになる、と。

もちろん、クライアントソフトウェアから見た時のアクセス先の変更は、なんらかの方法で必要ですが。
【Python】リスト(配列)内要素の操作【ソート】

#はじめに
リストを扱う上で重要な**ソート**の方法をまとめました。
基本的に以下のようなコードでコードと出力結果を記載します。

```ex.py
code = 'コード'
print(code)
# code(出力結果)
```

#リストを昇順または降順にソートするsort(),sorted()
Pythonでリストを昇順または降順にソートするには`sort()`と`sorted()`の2つの方法がある。文字列やタプルをソートしたい場合は`sorted()`を使う。

###・sort():元のリストをソート
**※元のリスト自体が書き換えられる破壊的処理。**

```sort().py
org_list = [3, 1, 4, 5, 2]

org_list.sort()
print(org_list)
# [1, 2, 3, 4, 5]

#sort()が返すのはNoneなので注意。
print(org_list.sort())
# None

#デフォルトは昇順。降順にソートしたい場合は引数reverseをTrueとする。
org_list.sort(reverse=True)
print(org_list)
# [5, 4, 3, 2, 1]
```

###sorted(): ソートした新たなリストを生成
 **※引数にソートしたいリストを指定するとソートされたリストを返す。元のリストは変更されない非破壊的処理。**

```sorted().py
org_list = [3, 1, 4, 5, 2]

new_list = sorted(org_list)
print(org_list)
# [3, 1, 4, 5, 2]
print(new_list)
# [1, 2, 3, 4, 5]

#デフォルトは昇順。降順にソートしたい場合は引数reverseをTrueとする
new_list_reverse = sorted(org_list, reverse=True)
print(org_list)
# [3, 1, 4, 5, 2]
print(new_list_reverse)
# [5, 4, 3, 2, 1]
```

###sorted()を用いた文字列のソート
sorted()関数の引数に文字列を指定すると、ソートされた文字列の一文字ずつが要素として格納された**リスト**が返される。

```sorted()_.py
org_str = 'cebad'
print(org_str)
# cebad

new_str_list = sorted(org_str)
print(new_str_list)
# ['a', 'b', 'c', 'd', 'e']

#文字列のリストを連結して一つの文字列にするにはjoin()メソッドを使う。
new_str = ''.join(new_str_list)
print(new_str)
# abcde

#まとめて書いてもOK。降順にソートしたい場合は引数reverseをTrueとする。
new_str_reverse = ''.join(sorted(org_str, reverse=True))
print(new_str_reverse)
# edcba
```

#リストや文字列を逆順に並べ替えるreverse(), reversed()
Pythonでリストの要素を逆順に並べ替えるには`reverse()`, `reversed()`およびスライスを使った方法がある。文字列やタプルを逆順に並べ替えたい場合は`reversed()`かスライスを使う。

###・reverse(): 元のリストを逆順に並べ替え
**※元のリスト自体が書き換えられる破壊的処理。**

```sort().py
org_list = [1, 2, 3, 4, 5]

org_list.reverse()
print(org_list)
# [5, 4, 3, 2, 1]

#reverse()が返すのはNoneなので注意。
print(org_list.reverse())
# None
```

###・reversed(): 逆順に取り出すイテレータを生成
**※reversed()は要素を逆順に取り出すイテレータを返す。元のリストは変更されない非破壊的処理。**

```sort().py
org_list = [1, 2, 3, 4, 5]

reverse_iterator = reversed(org_list)
print(org_list)
# [1, 2, 3, 4, 5]

#reversed()はリストではなくイテレータを返すので注意。list()でイテレータをリストに変換する。
new_list = list(reversed(org_list))
print(new_list)
# [5, 4, 3, 2, 1]
```

###・スライスによって逆順に並べ替え

```ex.py
org_list = [1, 2, 3, 4, 5]
new_list = org_list[::-1]
print(new_list)
# [5, 4, 3, 2, 1]

org_str = 'abcde'
new_str = org_str[::-1]
print(new_str)
# edcba
```


#最後に
他にも何か方法が解法があれば教えてもらえると嬉しいです。
Slack に 1MB 以下の BOM 付き CSV をアップロードすると BOM が消える

　UTF-8 の CSV を Excel でも文字化けを起こさず開くために、BOM (`\uFEFF`) を付けた CSV を hubot で Slack にアップロードするものを開発していました。

　アップロードされたファイルをダウンロードして Excel で開くと、なぜか文字化け。調べてみると、なんと BOM が消滅していることに気づきました。
　しかし、必ず起こるわけではなく、別の CSV では消えていません。

　数時間悩み調べた末、解決方法はまだ分かっていないものの、原因は判明しました。
　検索しても同じ現象で悩んでいる人が見つからなかったので、備忘録も兼ねて投稿しておこうと思います。


## 結論: スニペットに変換されると消える

　Slack は、テキストベースのファイルをアップロードすると、どうやら 1MB 以下のものはスニペット表示をするようです。

　まず、1024KB の BOM 付き CSV ファイルをアップロードしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55696/bb151c5e-d9e4-6745-8c56-f9d251e0be0e.png)
　スニペットとして表示されます。これを少し行を増やして 1025KB にし、1MB を超えると……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55696/148a4acb-0574-2ad6-d857-85b12c30f083.png)
　意図通り、ファイルとしてアップロードされました。
　そしてそれぞれをダウンロードしてみると、前者のスニペット表示された方は BOM が消滅してしまいました。。。


## ビミョーな回避策
　あまりちゃんとした方法ではないのですが、なぜか 1MB 以下でもスニペットに変換されずにファイルとしてアップロードできる方法を見つけました。
　その方法とは「ファイルの先頭に BOM を 2 つ書く」です。これでなぜかうまくいきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55696/4f62635c-8347-6c08-dcb2-bbf5867424f1.png)
　上記とおり、エクスプローラ上で 919KB の BOM を 2 つ書いた CSV をアップロードしたら、1MB 以下でもファイルとしてアップロードできました。もちろん、テキストでその CSV を開くと 2 つ目の余分な BOM があるのでかなり気持ちが悪いのですが……。

　なぜなんでしょうか？　最初の `\uFEFF` は BOM として処理されて、ファイルの最初は実質 2 つ目の `\uFEFF` ということになり、普通の文字コードじゃないからバイナリファイルか何かと解釈されたんでしょうか？　となると、最初の BOM の後は他のものでもいいのかもしれません。


### 他に試したこと
[アップロードのオプション](https://api.slack.com/methods/files.upload) で、`filetype` に binary とか指定してみてアップロードしましたが、それはダメでした。


## お願い
　どなたか、Slack で 1MB 以下の CSV ファイルをアップロードしてもスニペットにされないまともな方法をご存知でしたら教えて下さい！！
kintone_アクションボタンを自作してみた件

#kintoneのアクションボタンを作ってみた

kintoneにはアクションボタンという必要項目だけをコピーして、
新しいレコードを作成する便利機能がありますが、年度や月度をプラス１したいなぁ～
と思ったときに、、、うん。できないね。
じゃあ作るしかないかぁ～(;´Д｀)といった流れで作ってみました。

##さっそくJS書いていく
※なんとなくsessionStorageを使えばできるだろ。くらいの考えでsessionStorageを使っています。

```ruby:action.js

const APP_ID = 123; /* アプリの番号 */
let _s_storage = window.sessionStorage;

(function() {
    'use strict';
    kintone.events.on("app.record.detail.show", function(e) {
        /* まずsessionStorageを綺麗にする */
        _s_storage.clear();

        /* ボタン増殖バグ回避 */
        if (document.getElementById("actionBtn") !== null) {
            return event;
        }

        /* ヘッダー要素 */
        const header = kintone.app.record.getHeaderMenuSpaceElement()

        /* ボタン作成 */
        const actionbtn = document.createElement("button"); 
        actionBtn.id = "actionBtn";
        actionBtn.innerHTML = "来年度";
        actionbtn.onclick = function() {
            /* クリックイベント */

            /* +1した年度を格納する */
            const year = Number(e.record["年度"].value) + 1;
            _s_storage.setItem("年度", year);

            /* レコード作成画面を開く */
            window.open("https://{ドメイン}.cybozu.com/k/" + APP_ID + "/edit", "_blank");

            /* リロードしてsessionStorageの中身を削除 */
            location.reload();
        };

        /* ヘッダーにボタン要素を付加 */
        header.appendChild(actionBtn);
    });
})();

/* 別アプリにコピーしたい場合は以下をコピー先のアプリに反映する。 */
let _s_storage = window.sessionStorage;
(function() {
    'use strict';
    kintone.events.on("app.record.create.show", function(e) {
        if (!_s_storage.getItem("年度")) {
            const record = e.record;
            record["年度"].value = _s_storage.getItem("年度");
        
            /* キャンセルした時の処理 */
            const cancelBtn = document.getElementsByClassName("gaia-ui-actionmenu-cancel");
            cancelBtn[0].addEventListener("click", function() {
                window.close();
            }, false);

            /* 反映したあとはsessionStorageの中身を削除 */
            _s_storage.clear();
        }
        return e;
    });
})();
```

これでいい感じに動きました。
同じような悩みがある方は、是非ご参考程度に使ってやってくださいm(__)m
Unix timestampとDate time間の変換 #PowerAutomate


Unix timestampとdate timeを変換する処理をPower Automateで結構利用するので、備忘録として残しておきます。

# Date time → Unix timestamp
入力がDate time (yyyy-mm-dd等)でUnix timestamp (秒単位)にしたい場合には

```
div(sub(ticks('ここにDate time'),ticks('1970-01-01')), 10000000)
```

例えばConvert time zoneの結果を使う場合には、

```
div(sub(ticks(body('Convert_time_zone')),ticks('1970-01-01')), 10000000)
```

ticks関数は西暦を100ナノ秒単位で返す関数なので、これを利用して、1970-01-01におけるナノ秒との差分を求めて、その後ナノ秒→秒にするために割り算する


# Unix timestamp → Date timeの変換

入力が秒単位のUnix timestampで、これをDate timeに直す場合には、

```
addseconds('1970-1-1', ここにUnix timestamp (数値), 'yyyy-MM-dd HH:mm')
```

もとの数式は ```addSeconds('<timestamp>', <seconds>, '<format>'?)``` この書式なので、1970-01-01にUnix timeを足せば、Date timeに指定のフォーマットで変換できる

# 動作確認
実際Convert time zoneでutcNow()をJSTに変換したあとにUnix timestampに変換し、その結果を再変換してみると以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/22aa6da4-8b94-0609-e731-91f8bb099c49.png)

# Reference
Ticks関数: https://docs.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#ticks

addSeconds関数: https://docs.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#addSeconds
基本情報技術者試験の勉強計画　第17週（2/10週）

## 目標と結果
### 目標
・休みすぎない
・午後問題の挑戦
・わからないところをそのままにしない
・一日最低３０分
### 結果
・30分はできなかった
・テキストを少し見るくらいになってしまう日もあったが毎日続けることはできた
・午後問題も見てみたがわかりずらいところが多かった
## 振り返り
### keep
・毎日続けること
### problm
・高い目標を作ること
### try
・理解できそうなところを見つける
現場で役立つシステム設計の原則～第3章～を読んで。

## はじめに

以下の書籍のの第3章の引用+個人の考えです。
[現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法](https://www.amazon.co.jp/dp/B073GSDBGT)

## 業務アプリケーションのコードの見通しが悪くなる原因

> ロジックを持たないデータクラスを使ってデータの受け渡しをするとコードの重複が起きます。データクラスを参照できる場所であれば、どのクラスにでも、ロジックを書けてしまうからです。

-> APIで受け取ったレスポンスボディーをコンポーネント内でロジックを書くと、別コンポーネントでも同様のロジックが書かれる。

## 共通機能ライブラリが失敗する理由

### 汎用化のため使いづらい

> 汎用的に使えるように、引数にフラグやオプションが増え、使い方が分かりづらくなる。

### 用途ごとに細分化した共通関数
 
> 用途ごとに細かく分けると共通ライブラリのメソッド数が膨れ上がり、微妙な違いを理解してメソッドを使い分けるのが大変。

-> lodash。ファイルサイズめっちゃ大きい。クラスのメソッド内で使うのはアリ。

## データクラスでの設計スタイルが広く使われる理由

- 1995年の業務アプリケーションはCOBOL、C、C++が主流だった
- Javaになっても従来の業務アプリケーションの方法を採用。

## オブジェクト指向らしいクラス設計

> - メソッドをロジックの置き場所にする
- ロジックをデータを持つクラス移動する
- 使う側のクラスにロジックを書き始めたら設計を見直す
- メソッドを短くしてロジックの移動をやりやすくする
- メソッドでは必ずインスタンス変数を使う
- クラスが肥大化したら小さく分ける
- パッケージを使ってクラスを整理する

上記のことは書籍読んでると「当たり前のことだよね」と読み進めることができるのですが、既存のアプリケーションコードを見直すとできてない箇所が多いです。
そのコードをみた人が既存の設計を踏襲し、どんどん見辛いコードが増殖する状況に・・・:scream_cat:

[割れ窓理論 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%89%B2%E3%82%8C%E7%AA%93%E7%90%86%E8%AB%96)

## ドメインオブジェクト

> 関連する業務データと業務ロジックを1つにまとめたオブジェクト

-> `業務データ`と`業務ロジック`を持つ。
-> メールアドレスや、名前など小さい単位で作る。
-> 小さなドメインオブジェクトを組み合わせて、より大きな関心ごとを表現する。

詳細な設計については第4章。

### 業務ロジックとは？

-> 業務上の会話で出てくるもの。
-> 例えばPostのドメインオブジェクトの場合、新しい記事を表示したい場合isNewのようなロジックが思いつく。フロントで受け取りやすいようにレスポンスボディを加工するようなロジックは業務ロジックではない。

## 三層 + ドメインモデル

> ![3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510204/93519acc-239d-14d5-4e44-671958954937.png)
> 引用：現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法
> 三層＋ドメインモデルで関心事をわかりやすく分離する

-> 業務ロジックをプレゼンテーション層・アプリケーション層・データソース層に書かない。

|名前 |役割 |
|---|---|
|プレゼンテーション層 |UIなど外部との入出力を受け持つ |
|アプリケーション層 |業務機能のマクロな手順の記述 |
|データソース層 |データベースとの入出力を受け持つ |
|ドメインモデル層 |業務データと関連する業務ロジックを表現したドメインオブジェクトの集合  |
htmlspecialchars関数についてのメモ

###htmlspecialchars関数とは

・HTMLの特殊タグをエスケープ（変換）する関数。
ユーザーからの入力を受け取る際、XSS等悪意のあるスクリプト挿入などの攻撃を避ける。

`例） & → '&amp;'
　　 < → '&lt;'
　 　> → '&gt;'
　 　" → '&quot;' ENT_NOQUOTEを設定していない時
　 　' → '&#039;' ENT_QUOTES設定時`


```php:qiita.php
<?php 
$sample = htmlspecialchars("<script>window.location='http://yahooooooooo.coooo.jp';</script>", ENT_QUOTES, 'utf-8');
echo $sample;
//&lt;script&gt;window.location=&#039;http://yahooooooooo.coooo.jp&#039;;&lt;/script&gt; 
//ブラウザ上で右クリックでページのソースを表示するとエスケープされているのがわかる。
?>
```
・htnlspecialcharsを使用するタイミングはDBの内容を画面に呼び出す直前にする。
・DBに保存するタイミングで使用すると変換された文字列がDBに保存されてしまい、DBの内容を「HTMLへ出力する」以外の用途に使う場合に支障が出る可能性がある。

####打つのが面倒なので関数化
```php:qiita.php
<?php 
function h($str){
    echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

$sample = h("<script>window.location='http://yahooooooooo.coooo.jp';</script>");
echo $sample;
//&lt;script&gt;window.location=&#039;http://yahooooooooo.coooo.jp&#039;;&lt;/script&gt; 
?>
```
#####入力フォーム等改行がある入力を受け取る場合
```php:qiita.php
function hbr($str){
    echo nl2br(h($str));
}
```
を追加してみた。

関数化の際、echoかreturnのどちらが適しているのかが気になっている点です。ご指摘ありましたらお願いいたします。
macOS でスクリーンショットを撮る方法

# はじめに
この記事ではMacでスクリーンショットを撮る方法について書いています。
MacではOS標準のアプリケーションやショートカットキーを利用してスクリーンショット（取り込み）やスクリーンのキャプチャ（収録）を行うことができます。この記事はApple サポートの「[Mac でスクリーンショットを撮る](https://support.apple.com/ja-jp/HT201361)」を引用した上で加筆してます。

## この記事が対象にしている環境
macOS Mojave （バージョン 10.14以降） 
macOS Catalina （バージョン 10.15以降）

## ショートカットキーで取り込む

### 表示されている画面すべてを取り込む方法

![mac-key-combo-diagram-shift-command-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64170/a48766bc-cf74-0ea2-cadd-6f16644a65b8.png)

1. スクリーンショットを撮るには、「shift」「command」「3」の3つのキーを同時に長押しします。 
2. 画面の隅にサムネールが表示されたら、そのサムネールをクリックして、スクリーンショットを編集します。または、しばらくすると、スクリーンショットがデスクトップに保存されます。

### 画面の一部を取り込む方法

![mac-key-combo-diagram-shift-command-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64170/60bf0286-0f5d-28ad-493c-200e7e45ff63.png)

1. 「shift」「command」「4」の3つのキーを同時に長押しします。
2. 十字型のカーソル  をドラッグして、画面の取り込みたい部分をドラッグして範囲選択します。選択範囲を移動するには、スペースバーを押しながらドラッグします。スクリーンショットの撮影をキャンセルするには、「esc」(Escape) キーを押します。
3. スクリーンショットを撮るには、マウスまたはトラックパッドのボタンから指を放します。 
画面の隅にサムネールが表示されたら、そのサムネールをクリックして、スクリーンショットを編集します。または、しばらくすると、スクリーンショットがデスクトップに保存されます。

### ウインドウまたはメニューを取り込む方法

![mac-key-combo-diagram-shift-command-4-space.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64170/6488e4c1-6ffd-7488-6fd5-36e8e7965662.png)

1. 取り込みたいウインドウまたはメニューを開きます。
2. 「shift」「command」「4」の3つのキーとスペースバーを同時に長押しします。ポインタの形状がカメラのアイコン  に変わります。スクリーンショットの撮影をキャンセルするには、「esc」(Escape) キーを押します。（TIPS：画面の一部を取り込む方法「shift」「command」「4」の3つのキーを同時に長押し後にキーを離した後、スペースバーを押すことでも同じモードになります。）
3. ウインドウまたはメニューをクリックして取り込みます。ウインドウの影をスクリーンショットに含めない場合は、「option」キーを押しながらクリックします。
4. 画面の隅にサムネールが表示されたら、そのサムネールをクリックして、スクリーンショットを編集します。または、しばらくすると、スクリーンショットがデスクトップに保存されます。

#### ショートカット利用時にクリップボードへコピーする

- スクリーンショットをクリップボードにコピーするには、「control」キーを長押ししながらスクリーンショットを撮ってください。
- クリップボードに入れたスクリーンショットは、どこにでもペーストできます。
- ユニバーサルクリップボードを使えば、別の Apple 製デバイスにペーストできます。

## アプリケーションを利用して取り込む

1. Launchpadの「その他」もしくはFinderのアプリケーションから「ユーティリティ」を選択すると中に『スクリーンショット』があるのでアプリケーションを起動します。（TIPS：「shift」「command」「5」の3つのキーを同時に長押しすることで起動することもできます。）
<img width="1680" alt="スクリーンショット_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64170/f65e16a1-b38c-884c-d565-3a69ed2cdc79.png">
2. 『スクリーンショット』アプリが起動したあとは画面のアイコンに従うことでスクリーンショットならびに動画としてキャプチャを収録することも可能です。
3. 『スクリーンショット』アプリを利用すると保存先を変更したりタイマーを利用することで途中の操作過程のポップアップなどのキャプチャなどを行うことも可能になります。
<img width="537" alt="スクリーンショット_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64170/7317cc5e-15c1-6cd0-cc5d-13b44bbcd9c5.png">
[第2回] 典型問題を学ぶ - 数理最適化を学ぶ勉強資料

#:straight_ruler: はじめに


数理最適化を初めて学ぶ勉強資料の2回目です。
1回目は以下からご覧下さい。

[第1回] 最適化とは？ - 数理最適化を学ぶ勉強資料
https://qiita.com/ttlabo/private/e6970c6e85cce9ff4e34


#:straight_ruler: 典型問題とは

数理最適化問題として様々な問題が考えられますが、数理最適化においては、一般に典型問題(または標準問題)と呼ばれるいわゆる教科書のような問題または代表的な問題を分類し、それをまとめたものがあります。
これらを典型問題(または標準問題)と呼びます。

参考テキストでは、7クラス24問題に分けて説明されています。

:one: グラフ・ネットワーク問題クラス
　・最小全域木問題
　・最大安定集合問題
　・最大カット問題
　・最短路問題
　・最大流問題
　・最小費用流問題

:two: 経路問題クラス
　・運搬経路(配送最適化)問題
　・巡回セールスマン問題
　・中国人郵便配達問題

:three: 集合被覆・分割問題クラス
　・集合被覆問題
　・集合分割問題
　・組合せオークション問題

:four: スケジューリング問題クラス
　・ジョブショップ問題
　・勤務スケジューリング問題

:five: 切り出し・詰め込み問題クラス
　・ナップサック問題
　・ピンパッキング問題
　・n次元パッキング問題

:six: 配置問題クラス
　・施設配置問題
　・容量制約なし施設配置問題

:seven: 割当・マッチング問題クラス
　・2次割当問題
　・一般化割当問題
　・最大マッチング問題
　・重みマッチング問題
　・安定マッチング問題


上記の分類分けのうち、いくつかを具体的に説明します。

**ロジスティクス・ネットワーク設計問題**
工場や倉庫などの拠点の配置/削減、生産ライン能力、生産量、在庫量、輸送量などを決定する問題。物流最適化問題の中で最も費用対効果が大きい。
輸送量だけに着目すると輸送最適化問題となる。

**配送最適化(運搬経路)問題**
複数のオーダーを複数の車両(ビークル)を使って配送する問題。オーダーとは、決められた荷物を配送元から配送先へ運ぶオペレーション。オーダーには、配送元の出荷可能時間帯や配送先に入庫可能時間帯などの制約条件が付く場合もある。難しい問題のため、近似解で解かれることが多い。

**船舶スケジューリング問題**
車両の代わりに船舶を用いた配送最適化問題。入港制限など海上独特の制約もあるが、構造としては配送最適化問題と同じ。

**クルースケジューリング問題(勤務スケジューリング問題)**
トラック、鉄道、航空機などの乗務員のスケジュールやアルバイト・パート、看護師の勤務シフトを求める問題。

**最小費用流問題**
各時刻の需要を満たすように、船舶や車両を用いて物資が余っているところから不足しているところへ最小の費用で運ぶ問題。使用済みのレンタカーや空きパレットなどを需要地に戻す問題等。

**安全在庫問題**
需要のばらつきに備えて、在庫費用と品切れリスクのバランスを取る問題。調達先を複数にして災害などを考慮するようなモデルもある。

**ロットサイズ決定問題**
段取り費用が発生するなど、製品をまとめて作成すると効率が良い場合に、在庫費用とトレードオフでどれだけまとめて作るかを決定する問題。

**ジョブショップ問題(フローショップ問題)**
ジョブを機械に割り当てる問題。処理順序が決まっている場合は、フローショップ問題という。

**パッキング問題**
コンテナなどの入れ物に荷物を効率よく詰め込む問題。切り出し(カッティング=資源の分割)と詰め込み問題(パッキング=入れ物に荷物を詰める)は表裏一体であり、問題としては同じ。

**収益管理問題**
時間経過により陳腐化する商品に対し、価格を操作し(上げて)収益を最大化する問題。航空運賃やホテルの宿泊費など。


最適化問題に取り組むには、これらの典型問題を知り、それぞれの特徴や解法を応用することで、手元の問題をより的確に解決することができます。

#:straight_ruler: 終わりに

次回は第3回目、いよいよPythonで最適化問題の例題を解いていきます。
引き続きお読み頂けたら幸いです。

当記事については、著者も最適化の入門者です。誤解・誤植等至る所にあると思いますので、お気軽にご意見やご指摘などお寄せ下さい。

#:straight_ruler: 出典

本記事では、数理最適化モデルについて参考テキスト「Pythonによる問題解決シリーズ　データ分析ライブラリーを用いた最適化モデルの作り方」を情報元にしています。テキストの詳細は以下です。

■参考テキスト
「Pythonによる問題解決シリーズ　データ分析ライブラリーを用いた最適化モデルの作り方」
　斉藤努[著] ／ 近代科学社[出版]

![001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/dbc42d25-b38d-3065-996e-c06ef846cd6e.jpeg)
FTP情報でWordPressにログイン

営業「WEBサイトの修正の案件なんだからFTPの情報だけもらっとけばいいですよね。
あ、ワードプレスってやつで作ってるらしいっス

クライアント「今のサイトWordPressで作ってもらってんけどな、作ってもらったとこがとんでもうて連絡つかへんもんで、管理者のアカウントとかわかれへんねん。サーバーはうちが借りてるからFTPとかはわかんねんけどな、どうにかならへんかな？

あります

ってことでFTP情報から
WordPressの管理画面にアクセスできるようになっときましょう

Step1　使ってるテーマを調べる
---
ブラウザのサイトのソースコードで```themes/```を検索すればすぐにわかります

Step2　強制ログインのコードを追加
---

テーマのfunctions.phpに下記のコードを追加
以下``何かパスワード``のところは適当なパスワードを

```php
if($_GET['force_login']==='何かパスワード'){
  wp_set_auth_cookie(get_users(['role'=>'administrator'])[0]->ID);
}
```

Step3　強制ログイン
---
サイトのURLに``?force_login=何かパスワード``をつけてアクセスすると
管理者としてログインした状態になる

そのままにしてると危険なコードなので用が済んだら
テーマのfunctions.phpに追加したコードは忘れず削除
Amazon ECS - EC2クラスターの作成（AWS CLI）

AWS CLIを利用しての作成手順メモです。コンソール画面と照らしあわせて確認していくとイメージがつきやすいです。
Amazon ECS のサービスは利用はしていません。
最後に環境を削除する場合ですが、ECSクラスターを削除してもECSインスタンスは起動したままとなりますので、ご注意ください。ECSからECSクラスターの削除とEC2からECSインスタンスの削除をしてください。



#1.ECSクラスターの作成#

```
aws ecs create-cluster --cluster-name MyCluster
```



#2.ECSインスタンスの起動と確認#

リージョンは、ap-northeast-1 で作成しますので AMI IDは `ami-067f3b20190d6bf4f` を指定。
IAMロールは、`ecsInstanceRole` を指定。

コンテナインスタンスはデフォルトのクラスターで起動されます。先程作成した「MyCluster」のクラスターを起動させるようにします。

```
#!/bin/bash
echo ECS_CLUSTER=MyCluster >> /etc/ecs/ecs.config
```

その他詳細については下記ページを参考。
[Amazon ECS コンテナインスタンスの起動](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/launch_container_instance.html)

起動したECS インスタンスが、【1.クラスターの作成】で作成したECSクラスターにあるかと詳細情報を確認しておく。

```
aws ecs list-container-instances --cluster MyCluster

aws ecs describe-container-instances --cluster MyCluster --container-instances container_instance_ID
```



#3.タスク定義の作成と実行#

task作業フォルダを作成しておく。

```
mkdir task
cd task
```

タスク定義を作成する。

```json
sleep360.json
{
  "containerDefinitions": [
    {
      "name": "sleep",
      "image": "busybox",
      "cpu": 10,
      "command": [
        "sleep",
        "360"
      ],
      "memory": 10,
      "essential": true
    }
  ],
  "family": "sleep360"
}
```

```
aws ecs register-task-definition --cli-input-json file://$HOME/task/sleep360.json
```

作成済のタスク定義を確認する。

```
aws ecs list-task-definitions
```

タスクを実行する。

```
aws ecs run-task --cluster MyCluster --task-definition sleep360:1 --count 1
```

実行されているタスクを確認する。

```
aws ecs describe-tasks --cluster MyCluster --task task_ID
```



#リンク#
[Amazon ECS](https://qiita.com/leomaro7/items/deb114e5ec209a044e5d)