OmniAICreator/Qiita-1.07M huggingface dataset:
Linux ではコマンドを使って新型コロナウイルスの世界の感染状況を把握できるらしいけど Windows ではどうやるの？（あるいは PowerShell でも curl っぽいことをしたい）

こんなツイートを見かけました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Linuxコマンド「curl」を使って新型コロナウイルスの世界の感染状況を把握できます。Ubuntuでは最初にcurlコマンドをインストールします。<br>$ sudo apt install curl<br>次のように実行します。（：は半角に置き換え）<br>$ curl https：//corona-stats.online<br>$ curl https：//corona-stats.online/Japan <a href="https://t.co/xY6op824Ha">pic.twitter.com/xY6op824Ha</a></p>&mdash; 日経Linux | ラズパイマガジン (@nikkei_Linux) <a href="https://twitter.com/nikkei_Linux/status/1244537560656838657?ref_src=twsrc%5Etfw">March 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

`curl` コマンドで感染状況が確認できるWebサイトがあるようです。せっかくなので Windows でも似たようなことをやってみましょう。[^1]

[^1]: あるいは PowerShell で curl っぽいことをする備忘録です（いつも忘れる）

## PowerShell でもやってみた

PowerShell には curl がご用意されていないため、代わりに `Invoke-WebRequest` コマンドレットを使います[^2]：

[^2]: [official curl binary builds for Microsoft Windows](https://curl.haxx.se/windows/) はご用意できました。また、後述のように Windows 10 v1803 からは標準で `curl.exe` がインストールされています。なお、PowerShell における `curl` と `wget` は `Invoke-WebRequest` コマンドレットのエイリアスです。

```Powershell
(Invoke-WebRequest https://corona-stats.online/Japan -UserAgent curl).Content
```

![スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/7692a3de-d3fd-2fdf-743c-82d48350a180.png)

また、以下のバッチファイルをパスが通ったディレクトリ配置すると、`durl <URL>` でコンテンツを取得することができるようになります：

```durl.bat
@echo off
powershell -Command " (Invoke-WebRequest %* -UserAgent curl).Content"
```

### Windows 10 v1803 以降の場合

`curl.exe` がインストールされているので直接実行できたりしますが、PowerShell の<del>色々とややこしい</del>脳の筋トレに役立つエンコード周りを考慮に入れなければいけないので個人的にはおすすめしません。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/767c6cef-c225-d920-69c9-3c396e7ce3d0.png)

#### 2020-04-07 追記

[コメント](https://qiita.com/yokra9/items/1e7cee82bd172f8fac7a#comment-d6a474544bcddd440346)にて @7cc さんがエンコード周りの解説を書いてくださっています。感謝！

## 参考リンク

* [Invoke-WebRequest](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7)
* [PowerShell: ◆Split演算子](https://mtgpowershell.blogspot.com/2010/11/split.html)
* [「tar」「curl」がWindows 10に、“WSL”も強化 ～Insider Preview Build 17063](https://forest.watch.impress.co.jp/docs/news/1097996.html)
* [Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)](https://www.vwnet.jp/Windows/PowerShell/CharCode.htm)
* [PowerShell でも tail -f がしたいし grep もしたい](https://qiita.com/yokra9/items/d95abda8a795d4e19e0e)
【Unity】EditorWindowのUpdate()とOnInspectorUpdate()の使い分け 


# 前提
- EditorWindowでポーリングがしたかった
 - 特定のファイルを監視し、変化があったら何かする
- EditorWindow.Update() は呼び出し間隔が良くわからない
 - Called multiple times per second on all visible windows. って。。。
- EditorWindow.OnInspectorUpdate() は10fpsって明言されてるぞ
 - あれ？呼び出されない条件がある。。。

# 調べてみた
- というわけで、調べてみた

```TestWin.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class TestWin : EditorWindow {
    [MenuItem("Window/TestWin")]
    static void Init()
    {
        TestWin window = (TestWin)EditorWindow.GetWindow(typeof(TestWin));
        window.Show();
    }
    private double[] ilog;
    void DumpFps(string label)
    {
        if (ilog == null || ilog.Length <= 1)
        {
            ilog = new double[10];
        }
        if (ilog.Length > 1)
        {
            double total = 0;
            ilog[ilog.Length - 1] = EditorApplication.timeSinceStartup;
            for (var i = 0; i < ilog.Length - 1; i++)
            {
                total += ilog[i + 1] - ilog[i];
                ilog[i] = ilog[i + 1];
            }
            Debug.LogFormat("{0}:{1}:{2}", System.DateTimeOffset.Now.ToString(), label, 1 / (total / (ilog.Length - 1)));
        }
    }
    private bool _onIns = true;
    private bool _onUpdate = false;

    private void OnGUI()
    {
        _onIns = GUILayout.Toggle(_onIns, "OnInspectorUpdate");
        _onIns = !GUILayout.Toggle(!_onIns, "Update");
        _onUpdate = !_onIns;
    }
    /// <summary>
    /// およそ6.5FPSで安定(2017.4.37)
    /// バックグラウンドになると止まる
    /// 画面がロックされていても止まる
    /// </summary>
    private void OnInspectorUpdate()
    {
        if (_onIns) DumpFps("OnInspectorUpdate");
    }

    /// <summary>
    /// 環境で可変。150だったり250だったり
    /// バックグラウンドになると10前後に落ちる
    /// 画面がロックされていても反応する
    /// </summary>
    void Update () {
        if (_onUpdate) DumpFps("Update");
    }
}
```
- これを、Assets/Editor以下に作成して、Window/TestWinで起動

# 結果

||FPS|特徴|確認したVer|
|:-----------:|:-----------:|:-----------:|:-----------:|
|Update()|150-250|常に動く。フォアグランド状態では激しく動く|2017.4.37|
|Update()|10|バックグラウンドや、画面ロックの場合FPSが下がる|2017.4.37|
|OnInspectorUpdate()|6.5|フォアグランド以外では停止する|2017.4.37|

# 結論
- 私の用途だと、Update()が良い
 - ただ、250fpsはちょっと多すぎなので、EditorApplication.timeSinceStartupを利用して1fpsにしてポーリングすることにした

# 参考
- [Unity - Scripting API: EditorWindow.OnInspectorUpdate()](https://docs.unity3d.com/ScriptReference/EditorWindow.OnInspectorUpdate.html)
- [Unity - Scripting API: EditorWindow.Update()](https://docs.unity3d.com/ScriptReference/EditorWindow.Update.html)
fontawesomeをサクッと組み込むためのライブラリ「wonderful.js」を作ってみた


## :dog2: ... ステータス（α版）

（機能追加後に随時更新していこうと思っています！が一旦Launchします！）


## :book: 背景

チェックボックスやラジオボタンを手軽に（おしゃれに）組み込めないか考えた時に、

以下の選択肢に遭遇しました。

- iCheck.js
    - → Jquery依存だったりする
- CSSでおしゃれに自作 <https://deshinon.com/2019/03/02/sugoi-checkbox-animation/>
    - → コピペといえど大変..

（他にもっと簡単な方法があれば教えて下さい....orz）

fontawesomeはアイコン組み込むのになにかと使用されている方が多いのではと思います。

ちょうど、free版にもチェックボックスのアイコンも存在するので組み合わせて使ってお手軽に実装と行こうではないかと考え立ちました。

ちなみに、checkboxの疑似要素(before)を使ってCSSのみでfontawesomeを組み込む方法も紹介されていたのですが、アイコンサイズとラベルのサイズを調整するのが面倒だったりします。

なので、「jQueryにも依存しない、fontawesomeを手軽に組み込めるJSライブラリー」が欲しいということで作成に至りました！

名前は、awesome = イケてる に対して、 wonderful = 素晴らしい という発想からの、イメージは犬! :dog2: =3

## :book: レポジトリ

こちらに公開しました！
[<img width="5%" src="https://github.com/tutttuwi/wonderful/blob/master/src/img/readme-image-dog.png?raw=true"> wonderful.js](https://github.com/tutttuwi/wonderful)　｜ [DOC](https://tutttuwi.github.io/wonderful/dist/)

## :book: 使い方

### 1. fontawesomeを使用する準備をしてください

- 以下のような形でfontawesomeをimport

```html
  <link rel="stylesheet"
  href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/all.min.css"
  integrity="sha256-UzFD2WYH2U1dQpKDjjZK72VtPeWP50NoJjd26rnAdUI="
  crossorigin="anonymous"/>
```

### 2. レポジトリから**wonderful.js** をダウンロードして、アプリにimportしてください

（bodyタグの最下部が望ましいです）

```html
<script type="text/javascript" src="wonderful.js"></script>
```

以上！

デフォルト設定だけで以下のようなデザインに仕上がります

ちょっと貧相ですが、使いたいアイコン、色に変更可能です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/f7a5c5ef-7a44-4d66-a540-7de11aeafd0d.png)

## :book: 設定（Configuration）

### Checkbox

|設定|デフォルト|説明|
|---|---|---|
|targetClass|undefined|カスタマイズしたい要素に付与するクラス名を指定する|
|isStack|false|アイコンを重ねて表示したい場合に`true`を設定する|
|bfFontClass|far fa-square (if:isStack = true then far 'fa-square')|アイコンのクラスを設定|
|bfFontClassStacked|far fa-square fa-stack-1x|重ねて表示するアイコンのクラスを設定|
|bfColor|black|アイコンの色を設定|
|bfColorStacked|black|重ねて表示するアイコンの色を設定|
|bfSize|1.5rem|アイコンのサイズを設定|
|bfSizeStacked|1.5rem|重ねて表示するアイコンのサイズを設定|
|bfMarginRight|8px|ラベルとの距離を調整するために設定|
|afFontClass|far fa-square (if:isStack = true then far 'fa-square')|アイコンのクラスを設定|
|afFontClassStacked|far fa-square fa-stack-1x|重ねて表示するアイコンのクラスを設定|
|afColor|black|アイコンの色を設定|
|afColorStacked|black|重ねて表示するアイコンの色を設定|
|afSize|1.5rem|アイコンのサイズを設定|
|afSizeStacked|1.5rem|重ねて表示するアイコンのサイズを設定|
|afMarginRight|8px|ラベルとの距離を調整するために設定|
|labelSize|1rem|ラベルの文字サイズを設定|

※bf*,af* はcheck前後の設定を表しています。

## :book: Other Sample

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/87f3f9f3-18df-f430-791f-58a0c9d31f47.png)

## :eyes: TBI（今後の展開）

- Webpackでjavascriptの環境作ってんですが、Typescript化したい
- Checkboxやinputboxにも対応させる
- 使いやすいようにリファクタリングする
【Vue.js】ドラッグ&ドロップができる「Vue.Draggable」を使ってみた

<h2>はじめに</h2>
以下の学習教材でVueDraggableを利用したので、使い方に関して簡単にまとめておきます。

<a href="https://www.techpit.jp/p/vue-js-vuex-trello">Vue.js/Vuexを使ってTrello風アプリを作成しよう！</a>
<h2>使い方</h2>
<h3>Vue CLIで使う</h3>
npmでインストール。
<pre>$ npm i -S vuedraggable
$ yarn add vuedraggable # yarnの場合</pre>
呼び出し方。(インポートしてコンポーネントとして使う。)
<pre>&lt;template&gt;
  &lt;draggable&gt;
    &lt;!-- ★ここにドラッグ&amp;ドロップさせたいコンポーネントを挿入 --&gt;
  &lt;/draggable&gt;
&lt;/template&gt;
&lt;script&gt;
import draggable from 'vuedraggable'

export default {
 components: {
    draggable,
  },
}
&lt;/script&gt;</pre>
<code>group</code>属性を使うことで他のコンポーネントへドラッグ&amp;ドロップさせる、または他のコンポーネントからのドラッグ&amp;ドロップを受け付けることが可能。
(その際は、互いのコンポーネントを同じ<code>name</code>にする。)
<pre>&lt;draggable group="name"&gt;
  &lt;!-- ★ここにドラッグ&amp;ドロップさせたいコンポーネントを挿入 --&gt;
&lt;/draggable&gt;</pre>
<h2>実践編</h2>
<a href="https://qiita.com/taiju59/items/7feac501bd24f0a50a7f">やさしめ Vue.js チュートリアル(1) ~ Vue CLI でプロジェクト作成と Linter の設定</a>

こちらのチュートリアルを参考にVueDraggableの実装までしてみました。

yarnでインストール
<pre>$ yarn add vuedraggable
$ npm i -g yarn # yarnコマンドが打てない場合はまずはこちらでyarnを導入</pre>
App.vueを編集
<div>
<pre>- &lt;template v-else&gt;
<span style="color: #ff0000;">+</span> &lt;draggable v-else&gt;
 &lt;VsRow v-for="todo in todos" :key="todo.id" vs-w="10"&gt;
   &lt;TaskCard :id="todo.id" :text="todo.text" @remove-task="remove" /&gt;
  &lt;/VsRow&gt;
- &lt;/template&gt;
<span style="color: #ff0000;">+</span> &lt;/draggable&gt;

~省略~

  &lt;script&gt;
  import TaskCard from "@/components/TaskCard.vue";
<span style="color: #ff0000;">+</span> import draggable from 'vuedraggable'
  
  export default {
    name: "App",
    components: {
      TaskCard,
<span style="color: #ff0000;">+</span>     draggable
    },

~省略~</pre>
</div>
動作確認

<img class="alignnone size-full wp-image-872" src="https://chobimusic.com/wp-content/uploads/2020/03/draggable.jpg" alt="" width="337" height="471" />

⇓

<img class="alignnone size-full wp-image-873" src="https://chobimusic.com/wp-content/uploads/2020/03/draggable2.jpg" alt="" width="327" height="471" />

動きました◎
<h2>参考サイト</h2>
以下のサイトがとても参考になります。

<a href="https://www.kabanoki.net/1712/">Vue.jsでドラッグ＆ドロップするなら「Vue.Draggable」がおすすめ</a>
今更ながら SwiftUI の公式チュートリアルをやってみた。

# はじめに
リリースされてから結構立つのにも関わらず、今更ながら触って、今までのStoryBoard との書き方の違いを感じました。
なので、個人的なメモとなります。

※趣味で、XCODE動かしている感じです。
※マシンは、８年前なので、そろそろ新しいの欲しい ＞＜

#SwiftUI について
説明は不要なので省きますが、iOS13 対応から新しい方式が追加されました。
従来はStoryBoardを使用するか、コードでバリバリ記載するかでしたが、
こいつは・・・どちらかというとコードをバリバリ記載していくタイプですね。

#チュートリアル
以下、公式チュートリアルです。

[公式チュートリアル](https://developer.apple.com/tutorials/swiftui/creating-and-combining-views)


#個人的に感じた変更点

## 1. SwiftUI View を使う

プロジェクトを新規に作成したら、ContentView.swift などが自動生成されています。
ContentView.swift には、画面に表示するもの（テキストとか、リストとか）を記載していきます。

記載形式は、struct で記載していきます。
画面のプレビューは、右側に表示されており、BUILD出来る状態なら、Resume をクリックすると表示されます。
また、ライブビューとして、変更したものが即反映されるのを確認できます。
※多分重いものだとマシンスペック要りそう。

デフォルトは
struct ContentView: View {} だけど、 「View」を変更して、表示方法を変更できる。
※チュートリアルだと UIViewRepresentable を使用している。

## 2. VStack
 コンテンツを縦に表示する。

## 3. HStack
 コンテンツを横に表示する。

## 4. Spacer()
  コンテンツの間に入れたり、最終行に入れることにより、スペースを作成する。

## 5. 他のファイル参照
初期は、ContentView.swift しかないが、新たにSwiftUI View を作成した場合、何も記載せずにそれを参照することができる。
※同じプロジェクト内の身と思われる。
※Swift 4 辺りとの仕様と同じ。

## 6. 画像の追加
Assets.xcassets という青色のフォルダが作成されているので、それをクリックすると、何もない画面が表示される。
そこに画像をドロップ＆ドロップすると画像が追加できる。
画像を使用する場合は、「.Image(ファイル名(拡張子不要))」と記載する。

# おわりに

以上でしょうか。
触った感じの内容でした。

うーーん、、、ちょっと作りたいものを考慮すると結構、難しいのかもしれない。
※Cameraを使用したいがそれをどのように参照するようにするかだが・・・まだ調べないといけないね。
  Storyboardのタイプは見つけたけど、SwiftUIはないので！！
vim: インサートモードで行頭や行末へ移動する方法 ~ 初心者 ~

# vim: インサートモードで行頭や行末へ移動する方法 ~ 初心者 ~

前回紹介した [Vim: インサートモードで行の途中からでも次の行に新規挿入する方法 ~ 初心者 ~](https://qiita.com/locona_0810/items/3e9a7e832cc7f1b6e208) で、
他にも色々と設定してみようと思ったのでその紹介を致します。

## 1.おさらい
インサートモードのプリフィックスキー<C-o>には一度だけノーマルモードのコマンドを入力できるという意味があります。
これを使って今回も設定していきます。

### 2.基本コマンド

```vimrc:インサートモード
<C-o>^  "行頭へ移動
<C-o>$  "行末へ移動
```

### 3.キーバインドの変更

```:.vimrc 
"行頭へ移動
inoremap <C-a> <C-o>^
"行末へ移動
inoremap <C-s> <C-o>$
```

今回は```<C-a>``` と ```<C-s>```にキーバインディングしてみました。

デフォルトだと <C-s>は動作しないので,
もし<C-s>を使いたいときは次の記事を参考にしてみてください

参考サイト
http://d.hatena.ne.jp/ksmemo/20110214/p1
コロナ対策の在宅勤務で急遽使うことになったMicrosoft Teams , SharePoint , OneDriveのそれぞれの役割まとめ

最近はコロナのニュースで気がまいりますね。
私の勤め先でも在宅勤務を行うこととなり、急遽Microsoft Office 365関連のライセンスで利用できる、Microsoft Teamsの利用を開始しました。

Teamsを使っていると、どうやらOneDriveやらSharePointやらの用語？機能？サービス？が登場してきて、何が何やら混乱してしまったので、簡単ではありますがそれぞれのサービスの役割などについて、調べた内容をメモ代りにまとめてみます。

## 各サービスの機能概要

|サービス|機能概要|
|:--|:--|
|SharePoint|・チームサイトを作りその中に共同編集用のドキュメントを管理できる。<br>・ドキュメントやライブラリ、サイトごとに細かい権限設定が可能。<br>・実はドキュメントだけでなく、チームで共有する情報を管理する情報Webサイトを簡単に作成できる。|
|OneDrive|・オンラインストレージサービス（Dropboxみたいなサービス）<br>・指定したユーザーにファイルやフォルダを共有可能。|
|Teams|・チャットを中心としたトータルコミュニケーションサービス。<br>・チャットの他にも複数人との通話や複数人とのビデオ会議が可能。|

## そもそも

冒頭にも述べている通り、Teamsを使い始めたことがきっかけで、SharePointやOneDriveが気になるようになりました。
それはなぜか？
Teamsでチャットをしていると、資料（ファイル）を添付してやりとりすることがあります。
そこで気になったのが

- ファイル添付で`OneDrive`から添付
- コンピュータからアップロード

の２つの挙動の違いについてです。

- ファイル添付で`OneDrive`から添付の場合
    - 自分のOneDriveのストレージ領域に保管されているファイルを利用する
    - OneDriveの ファイルを選択 -> [共有] の機能を利用して共有相手を指定する動きと同じことをファイル添付で実現している

という動きをしているのだろうなー。という感覚でいたのですが、では`コンピュータからアップロード`を選んだ時は、アップロードしたファイルは一体どこにいってしまうの？と疑問に思いました。

`コンピュータからアップロード`を選んでTeamsのチャットで共有したファイルを、`オンラインで開く`とすると、以下のURLにアクセスしてファイルをダウンロードしようとしました。
https://{}-my.sharepoint.com/personal/{}/Documents/Microsoft%20Teams%20チャット%20ファイル/{ファイル名}
このドメイン部分が`sharepoint.com`となっていたため、SharePoint？となったのです。

ただ、アップロードしたファイルが格納されているのは、実は私のOneDriveの中だったので、実はSharePointという存在をそこまで意識する必要はなかったのかもしれません。
実際コンピュータからアップロードすると、自分のOneDriveに`Microsoft Teams チャット ファイル`というフォルダが勝手に作成され、そこの中に共有したファイルがアップされていました。

Microsoftのサービスはいっぱいあってなかなかわかりづらいですが、ファイルは全部OneDriveに入ると。いうことですね。
【Salesforce】package.xmlのサンプル（レポート編）

未整理公開フォルダの書き方は忘れやすいので備忘として記載。

``` package.xml
  <types>
    <!-- 未整理公開フォルダのレポート -->
    <members>unfiled$public/レポートの一意名</members>
    <!-- 公開フォルダのレポート（未整理でない） -->
    <members>レポートフォルダの一意名/レポートの一意名</members>
    <name>Report</name>
  </types>
```

## 参考
■Report | メタデータ API 開発者ガイド
https://developer.salesforce.com/docs/atlas.ja-jp.api_meta.meta/api_meta/meta_report.htm
GoogleFontasのUIが変わったので使い方をチェック

表題の通り、GoogleFontsのUIが変わったので、今まで使ってたCDNのリンクを探すための備忘録です。

###1 使いたいフォントをクリック
![スクリーンショット 2020-03-31 19.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394234/ea81fe0c-f70b-334e-56d2-42d046eb5f27.png)

###2 フォントの太さを選んだら、右上の■をクリック
![スクリーンショット 2020-03-31 19.45.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394234/2db35650-86b2-8fb7-6ec9-8301dff4f9e7.png)

###3 タブ「Embed」をクリックすると、いつものURLが見つかる！！
![スクリーンショット 2020-03-31 19.47.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394234/14635a12-e3bc-2c4f-56d9-2aab36cc6a3e.png)

本日は以上です。
Pythonのdatetimeとタイムゾーンについて

タイムゾーンを意識してdatetimeを扱う際色々混乱してしまったので、自分用にまとめておきます。

## Naive,Aware

Pythonの日時オブジェクトは以下の2種類に分類される。ざっくりとした差は`タイムゾーン情報の有無`。

* Naiveオブジェクト
    * タイムゾーン情報を持たない

* Awareオブジェクト
    * タイムゾーン情報(tzinfo属性)を持つ
    * tzinfo属性には[tzinfo](https://docs.python.org/ja/3/library/datetime.html#datetime.tzinfo)のサブクラスのインスタンスを設定出来る
        * [dateitme.timezone](https://docs.python.org/ja/3/library/datetime.html#datetime.timezone)がtzinfoのサブクラスなので、このクラスのオブジェクトを設定することが出来る
        * 例えば、`datetime.timezone(timedelta(hours=+9), 'JST')`としてオブジェクトを生成するとこれはJSTのタイムゾーンを表すオブジェクト

したがって、何らかのプログラムでタイムゾーンを意識した処理を行いたい場合、Awareオブジェクトを使う必要がある。

## オブジェクト

以下4つのメインオブジェクトがある。

* date: 年月日
* time: 時分秒
* datetime: 日付と時刻
* timedelta: 時間間隔

それぞれオブジェクトの生成の仕方によって、NaiveだったりAwareだったりする。
例えば、

```python
>>> print('Python %s on %s' % (sys.version, sys.platform))
Python 3.7.4 (default, Oct 10 2019, 12:40:25) 
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin

>>> import datetime
>>> aware_dt = datetime.datetime.now(tz=datetime.timezone.utc)
>>> aware_dt
datetime.datetime(2020, 4, 4, 5, 49, 51, 291393, tzinfo=datetime.timezone.utc)
>>> naive_dt = datetime.datetime.utcnow()
>>> naive_dt
datetime.datetime(2020, 4, 4, 5, 50, 8, 499521)
>>> aware_dt.tzinfo
datetime.timezone.utc
>>> print(naive_dt.tzinfo)
<class 'NoneType'>
```

のように、utc現在時刻をオブジェクトとして生成するときも、タイムゾーンを指定する方法とそうでない方法がある。

## datetimeオブジェクトにまつわるメソッド

### strptime

日付を表現した文字列をdatetime型にするメソッド。

```python
>>> str_dt = '2020-3-01 10:11:12'
>>> strp_dt = datetime.datetime.strptime(str_dt, "%Y-%m-%d %H:%M:%S")
>>> strp_dt
datetime.datetime(2020, 3, 1, 10, 11, 12)
>>> print(type(strp_dt.tzinfo))
<class 'NoneType'>
```

生成したオブジェクトにタイムゾーン属性は含まれない。
ただし、変換前の文字列にタイムゾーンが含まれていて、フォーマットも適切に設定すると

```python
>>> str_dt_utc = '2020-3-01 10:11:12+00:00'
>>> strp_dt_utc = datetime.datetime.strptime(str_dt_utc, "%Y-%m-%d %H:%M:%S%z")
>>> strp_dt_utc
datetime.datetime(2020, 3, 1, 10, 11, 12, tzinfo=datetime.timezone.utc)
>>> str_dt_jst = '2020-3-01 10:11:12+09:00'
>>> strp_dt_jst = datetime.datetime.strptime(str_dt_jst, "%Y-%m-%d %H:%M:%S%z")
>>> strp_dt_jst
datetime.datetime(2020, 3, 1, 10, 11, 12, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400)))
```

のようにタイムゾーン属性も設定されてdatetimeオブジェクトが生成される模様。

### astimezone

あるdatetimeオブジェクトを指定したタイムゾーン情報に合わせて変換するメソッド。

```python
>>> strp_dt.astimezone(datetime.timezone.utc)
datetime.datetime(2020, 3, 1, 1, 11, 12, tzinfo=datetime.timezone.utc)
```

JSTとUTCの時差である-9時間が反映され、tzinfoが付加されたdatetimeのオブジェクトが返却された。（これはローカルのタイムゾーンとの比較によるもの？）

### replace

あるdatetimeオブジェクトのタイムゾーンを指定したタイムゾーンに変換するメソッド。

```python
>>> strp_dt.replace(tzinfo=datetime.timezone.utc)
datetime.datetime(2020, 3, 1, 10, 11, 12, tzinfo=datetime.timezone.utc)
```

astimezoneと比較すると、tzinfoだけが変換されていることに注意。

timezoneオブジェクトの生成については、素直に`datetime.timezone(timedelta(hours=+9), 'JST')`のように生成する方法や、サードパーティ製のモジュール(pytz,dateutil)を使ったりと、色々な方式がある。
Neural Network Console Challengeに参加してみた　その３

#1 教師データができたので学習準備をする
データセットはその2で作成したものを使用し、ネットワークはCNNとして、Neural Network Console(以下NNC)にサンプルとして含まれる　をロードする。INPUTレイヤーの設定を入力画像に合わせて(3,160,160)に設定、出力部分を画像分類となるようSoftmax、CategoricalCrossEntropyに変更する。
#2 学習を始める
NNCでTrain　Startし、しばし待つ。
クラウド版は有料なのでローカル環境で行う。
GPUはRTX 2070SUPERなのでそこそこのスピードで動いてくれるはず。

#3 評価をする
今回7つの分類で行っているので、ランダムで分類したとしても正解率は14.2%ぐらいになるはず。これを大幅に超えていれば良しとしよう。NNCでは推論後、EVALUATIONタブのConfusionMatrixからAccuracyから確認できる。

#4 大まかなネットワーク構造を試行錯誤する。
CNNの検討
Resnetの検討
ImageAugmentationの追加
ImageAugmentationの追加

いくらかやってみたが、CNN＋ImageAugmentation＋ImageAugmentationが好成績。Accuracy　
0.55を超えるものが出てきた。Resnetも18から50まで試してみたが重い割には精度が出ない。
教師データの数が少ないことも影響しているのだろうか。またGPUメモリーをたくさん必要とするため
Batchサイズを小さくせざるを得ず、このあたりの影響も気にかかる。

#5 構造自動探索機能を使う
NNCの構造自動探索機能にはいくつかの機能があるが、今回は演算量を無視し、エラー最小化を目指して最適化の指示を出してみる。具体的にはNetwork Feature + Gaussian ProcessとErrorを選択する。あとは放置。


#6 参考にしたもの
[NNCチュートリアル：Exif情報を利用し簡単にオリジナルデータセットを用いた実験を行う](https://www.youtube.com/watch?v=tV306SWDhvw)
[Deep Learning入門：Attention（注意）](https://www.youtube.com/watch?v=g5DSLeJozdw)
[NNCチュートリアル：Image Augmentationレイヤーによる画像データの水増し](https://www.youtube.com/watch?v=DrQoTVQP_RI)
[Deep Learning精度向上テクニック：Data Augmentation](https://www.youtube.com/watch?v=fWxKm9ar620)
[NNCチュートリアル：構造自動探索機能を試す](https://www.youtube.com/watch?v=TVplLM-MRvA)
[Windows版チュートリアル：5分で構築するCNN (Convolutional Neural Networks)](https://www.youtube.com/watch?v=Vj7yfyiux0w)
Neural Network Console Challengeに参加してみた　その２

#1 振り出しからやり直し
課題のJPGに記録される焦点距離から、教師データを簡単に作っていう目論見は失敗。テーマ設定からやり直しである。申込時には『画像内人物をNNCで学習させ画角/焦点距離による画像分類を作り出す』を選んでいるが、これを含めて４つのテーマはいずれも画像の分類問題であるから、このための教師データを作る必要がある。

#2教師データを作る
##Neural Network Consoleのデータセット作成機能を使う
Neurarl Network Console（以下NNC)には画像分類向けにフォルダ別に分類したファイルから、NNCで使用できる教師データの作成機能がついている。その１でPythonスクリプトでやった画像ファイルのサイズ変更、EXCELで行った画像のファイル名と分類番号が対になったCSVファイルをTrainデータとTestデータに分けて指定した割合で作成をプログラムなしで作ってくれる。その１ではJPGファイルから焦点距離の情報を取り出す必要があり、その取り出しはNNCではできないので、併せてサイズ変更、CSVファイルの作成スクリプトを作ったが、分類問題なら出番はない。しかし、人間がアノテーションを作る必要がある。NNCのデータセット作成機能を使うためには画像を見て、分類を決めて、分類別に特定のフォルダにコピーするという行為。多分、1000～2000ぐらいは手動で分類しなければならない。ひどく苦痛だ
##テーマを再度決める
選択できるテーマは
１『人物画像をNNCで学習させ新しいオノマトペ（擬音語/擬声語/擬態語）の画像カテゴリ分類を作り出す』
２『画像内人物をNNCで学習させ画角/焦点距離による画像分類を作り出す』
３『NNCで画像を学習し人の感情によって分類』
４上記以外のチャレンジテーマを自由に設定しての応募も可（ただし画像分る問題に限る）
の４つ。10,100ならともかく1000，2000ともなると分類していくのはかなり難しい（個人的に）。分類の基準が曖昧な１，３は分類しているうちに分類にぶれが出てくることが予想される。２は具体的な例として「正面向き/バストアップ/全身/背面」が挙げられており、これならばなんとかなりそう。テーマの画角、焦点距離による画像分類を作り出すの部分が少し引っかかるが、無理ならば４として応募することにする。
##分類を決める
分類は下記を参考にした。動画向けだけど気にしない。
[動画ビギナー必見!】撮影サイズと構図の基本 〜人物編〜](https://pixta.jp/channel/?p=16140)
画像内に一人だけで顔が写っている画像に対して、
・フルショット　（足先まで）
・ニーショット　（膝まで）
・ウエストショット（腰まで）
・バストショット（胸まで）
・アップショット（顔ないし首まで）
・それ以外（顔の一部ないし全く写っていない）
複数人写っているものは
・複数人
として、7つに分類することとした。
##分類する
やることは単純である。画像を目視で確認して、先に決めた分類通りフォルダに移動していく。課題のファイルは10000枚の画像ファイルだが、全てが異なる被写体、異なるシチュエーションではなく、ファイル名順に分類していくと似た画像が連続するので、ファイルサイズ順に行うことにした。
###分類ぶんるいブンルイ3日かかった
##分類結果を確認してみる
一日1，2時間かけて3000枚を分類。ひたすら苦痛だった。分類したファイル数を確認してみると複数人の分類が1400枚ぐらいある。偏るのはしょうがないが、半分近くが一つの分るではあまりよくなさそうなので、900枚ほど外すことにする。約2100枚。
##NNCでデータセットを作る
分類したデータを使って、NNCでデータセットを作る。とりあえず160×160の解像度、TrainとTestは80%、20%で作成。これでやっと学習が開始できる。
Neural Network Console Challengeに参加してみた　その１


#1 Neural Network Console Challengeに参加する
10000枚ものオリジナルのデータはなかなか触れることはなく、興味本位で参加してみたので、その記録。幸い最近自宅PCのGPUをRadeon9800XT以来使い続けたATI/AMDをやめ、Geforce RTX2070Superに変えたので自宅PCだけでなんとかなるかとの目算もあった。
#2 テーマを決める
さっくり申し込みを行おうとするが、肝心のデータを見る前に早速テーマ選定を求められる。
アノテーションが面倒なのは苦痛だったので、軽い気持ちで簡単にEXIFからデータが得られそうな「焦点距離」というキーワードのはいった『画像内人物をNNCで学習させ画角/焦点距離による画像分類を作り出す』を選ぶ。画像分類である以上、教師データの分類はしなければならないが、まず焦点距離による分類を行いこれを参考にして分類をつけていけば作業の手間はかなり減るはず。面倒なのはいやなのだ。
いや、もっと簡単に焦点距離の範囲で分類し、それに適当な名前をつければ課題終了ではなどと思う。
#3アノテーションをつける準備
早速10000枚のデータをダウンロードする。
##画像ファイルからEXIFからデータを取り出してみる
教師データとして配布された画像ファイルのEXIFから焦点距離を取り出す。pythonで適当にスクリプトを書き、焦点距離を含むファイル数を確認すると、10000枚のファイル全てに記録されているわけではなく、2000枚程度は記録無し。差し引き最大で8000枚が使えることになる。
##画像ファイルの解像度変換を考えてみる
画像ファイルはおおむね長辺640ドットのJPG形式。しかし、アスペクト比は一定ではなくいろいろなサイズが混在しており解像度を調整する必要がある。しかし、画像から焦点距離を推論する場合、アスペクト比の異なる画像を一律、同じ解像度にすると縦長ないし横長になって悪影響を及ぼさないか、と頭によぎる。結論として、アスペクト比を維持したまま長辺が160ドットになるよう縮小し、足りない上下ないし、左右にグレーの帯をつけることにする。
##Pythonでスクリプトを書く
処理対象の画像ファイルに対して、解像度変換とEXIFデータの取り出し、パス＋ファイル名,焦点距離の形式でCSVファイルを作成するスクリプトを書いて、実行。
##NNCで学習を行うためのファイル作成。
とりあえず2000枚で試してみることにして、Trainに1800枚Testに200枚を当てる。
作成したファイルを開き、まずランダムに並び替え。ファイル名順だと同一被写体、同一シチュエーションの画像が近接するのでできるだけいろいろなデータが得られるようにこの処置。Train用として上から1800枚を切り取り、別ファイルに貼り付け、1行目にNNC指定ののヘッダ(x,y)をはりつけ、CSV形式で保管。同じ行為をTest用として200件で実施。Excelで作ったCSVファイルは条件によりUTF-8（BOM付き）となってしまい、NNCでの処理時にエラーが出るので、メモ帳で再度開きUTF-8として上書き保存。
#4NNCで実際に学習してみる
4層ほどのCNNを作って画像から焦点距離を推測できるかを試してみる。
小一時間待って、結果を見てみるとどうもいまいち。改めて画像を一枚ずつ見てみる。
これ、トリミングされてるやん。
画像ファイルのEXIFに記録される焦点距離はカメラないし、RAWファイルを現像しJPGにするときに現像ソフトが記録する。EXIFは撮影時の条件を記録しているだけなので、現像時あるいは現像後にトリミングされても焦点距離は変化しない(多分)。つまり、トリミングされた画像では、画像内に焦点距離を表す情報は含まれておらず、学習できないのでは？

焦点距離の説明
https://www.rentio.jp/matome/2018/04/beginner-guide-focal-length/


#5振り出しに戻る
画像分類を行う手間や労力をすくするため焦点距離を使うこと、焦点距離別に分類して適当な名前をつけることを考えたが、画像と画像に記録された焦点距離に関係が薄いことがわかり振り出しに戻る。
【Python】組込み型のlistとdequeで実行時間に差が出るケース

※誤った記載ありましたら是非マサカリください（編集リクエストでもぜひ）。

# list 型と deque 型

Python の組込み型である list 型と deque 型の挙動を見ていく。

以下は一定長のリストおよびキューを生成し、その要素をで取り出していくコード。
順に1万件、10万件、100万件の長さで実行する。

```python
import time
from collections import deque


for count in [10000, 100000, 1000000]:
    # オブジェクトの初期化
    l = ['a'] * count
    q = deque(l)

    # list 型の操作
    time1 = time.time()
    while len(l) > 0:
        l.pop(0)

    # deque 型 の操作
    time2 = time.time()
    while len(q) > 0:
        q.popleft()
    time3 = time.time()

    print('count:', count)
    print(f'list  finished: {time2 - time1} sec.')
    print(f'deque finished: {time3 - time2} sec.')
    print()
```

なお 第1要素と末尾要素を取り出す操作は list 型と deque 型でそれぞれ以下の関数。

```python
from collections import deque

# 初期化
l = [1, 2, 3]
q = deque(l)

# 第1要素を取り出す操作
l.pop(0)  # => 1
d.popleft()  # => 1

# 末尾要素を取り出す操作
l.pop(-1)  # => 3
d.pop()  # => 3
```

## 実行結果

手元の実行環境では以下の結果となった。

```
count: 10000
list  finished: 0.006018161773681641 sec.
deque finished: 0.0003972053527832031 sec.

count: 100000
list  finished: 0.9306132793426514 sec.
deque finished: 0.003919839859008789 sec.

count: 1000000
list  finished: 133.8608682155609 sec.
deque finished: 0.04343390464782715 sec.
```

件数が100万件のケースでは list 型の操作は2分以上かかった。

# なぜこうなるのか

公式ドキュメントから該当部分を引用する。
deque オブジェクトに対して `append` や `pop` といった操作が可能だが、list オブジェクトのそれらとはどういった違いがあるのか言及されている。

> list オブジェクトでも同様の操作を実現できますが、これは高速な固定長の操作に特化されており、内部のデータ表現形式のサイズと位置を両方変えるような pop(0) や insert(0, v) などの操作ではメモリ移動のために O(n) のコストを必要とします。

これに対して deque オブジェクトでは `O(1)` の計算コストで済んでいるとのこと。

# まとめ

データ長が頻繁に変化するデータ構造としてリストは不向き。

ちなみに データの取り出しを先頭要素（`list.pop(0)`）ではなく末尾要素に対して行うコード（`list.pop(-1)`）は以下。
この場合は リストの長さに拠らない `O(1)` の処理時間で済むため、実行時間の差はほとんど生じない。

※上記との差分箇所に `# here` を記載

```python
import time
from collections import deque


for count in [10000, 100000, 1000000]:
    # オブジェクトの初期化
    l = ['a'] * count
    q = deque(l)

    # list 型の操作
    time1 = time.time()
    while len(l) > 0:
        l.pop(-1)  # here1

    # deque 型 の操作
    time2 = time.time()
    while len(q) > 0:
        q.pop()  # here2
    time3 = time.time()

    print('count:', count)
    print(f'list  finished: {time2 - time1} sec.')
    print(f'deque finished: {time3 - time2} sec.')
    print()
```

↓実行結果

```
count: 10000
list  finished: 0.0006232261657714844 sec.
deque finished: 0.0005576610565185547 sec.

count: 100000
list  finished: 0.005739688873291016 sec.
deque finished: 0.004764080047607422 sec.

count: 1000000
list  finished: 0.05780482292175293 sec.
deque finished: 0.05013251304626465 sec.
```
vscode remote-sshで[Failed to set up socket for dynamic port forward to remote port 35653: Socket closed. Is the remote port correct?]的なエラーが出た場合

# vscode remote ssh

[Remote - SSH][1]

すごく便利で、通常のsshd設定ではこける事無くサクッと繋がる

# 謎のエラー

## Show Log
![Screen Shot 2020-03-31 at 19.27.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/abd84a23-4486-21d2-6907-ec8b5108b256.png)

こんな感じで表示される

> Failed to set up socket for dynamic port forward to remote port 35653: Socket closed. Is the remote port correct?

## sshd側のログ sudo tail -f /var/log/auth.log

> refused local port forward: originator 127.0.0.1 port 65256, target 127.0.0.1 port 35653

# 原因

sshをガチガチにしようとして、この辺を`no`にしてないか確認

```:/etc/ssh/sshd_config
AllowTcpForwarding no
AllowStreamLocalForwarding no
```


[1]: https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh
GASでWebアプリ｢映画鑑賞記録｣を作る② ／ ExcelファイルをWebアプリに変換する（後編）

#補足
　前回、設定ファイルとCSSについてUPしませんでしたので、それらのファイルについてもUPします。

- Config.gs
- css.html

　なんと言う事はないのですが、これで同じ画面が表示できると思います。:sweat_smile: :sweat_drops:

#### Config.gs
```javascript
// ファイル（スプレッドシート）のID
var ViewingRecordID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';       //「映画鑑賞記録」のファイルID
```
#### css.html
```css
<style>
  table#resultList {
    width: 1100px;
  }
  div.container-fluid {
    text-align: -webkit-center;
  }
  /*スクロール用*/
  thead.scrollHead,tbody.scrollBody {
    display: block;
  }
  tbody.scrollBody {
    overflow-y: scroll;
    height: 810px;
  }
  .head01 {
    width: 55px;
    text-align: center;
  }
  .head02 {
    width: 500px;
    text-align: center;
  }
  .head03 {
    width: 80px;
    text-align: center;
  }
  .head04 {
    width: 355px;
    text-align: center;
  }
  .col01 {
    width: 55px;
    display: table-cell;
    text-align: center;
    vertical-align: middle;
  }
  .col02 {
    width: 500px;
    display: table-cell;
    text-align: left;
    vertical-align: middle;
  }
  .col03 {
    width: 80px;
    display: table-cell;
    text-align: center;
    vertical-align: middle;
  }
  .col04 {
    width: 355px;
    display: table-cell;
    text-align: left;
    vertical-align: middle;
  }
</style>
```

**◆前の記事** [GASでWebアプリ｢映画鑑賞記録｣を作る①](https://qiita.com/pump33/items/ae0c1d5578861a85a4a4)
**◆次の記事** [GASでWebアプリ｢映画鑑賞記録｣を作る③](https://qiita.com/pump33/items/bc6919068b9eba2f2ea7)

**◆索引** [GASでWebアプリ｢映画鑑賞記録｣を作る《索引》](https://qiita.com/pump33/items/8ded0e6fd3c336e705f4)
【超初心者向け】RubyをインストールしたらRubyで遊んでみよう！！その１

※本記事はRubyがインストールされた前提の記事です。

Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。


##環境
Ruby 2.5.1
MacOS Mojave Ver.10.14.6




##インタラクティブRuby(irbコマンド)
ターミナルから直接Rubyのプログラムを動かす「対話シェル」機能を起動させます。irbは「interactive Ruby」の略です。この機能は本来の手順である
【コードを記述】▶︎【ファイルを実行】ではなく、
【コードを常に読み込み】▶︎【実行】してくれる為Rubyの簡単な動作確認などに重宝します。

##　操作法
MacOSの場合、Terminalを立ち上げてirbと入力し、enterキーを押します。

```irb:Terminal
irb(main):001:0>
```

このような画面になったら「対話シェル」が起動しています。次に"Hello World"と入力してください。

```irb
irb(main):001:0> "Hello World"
=> "Hello World"
```
と表示されていれば成功です。お疲れ様でした。
【Salesforce】標準プロファイルの英語名一覧

package.xmlを作成する場合などで、英語名のプロファイルを記載する必要があります。

|(プロファイル)|(Profile)|
|---|---|
|システム管理者|Admin|
|契約 管理者|ContractManager|
|マーケティングユーザ|MarketingProfile|
|参照のみ|ReadOnly|
|ソリューション管理者|SolutionManager|
|標準ユーザ|Standard|
|標準 Platform ユーザ|StandardAul|
AWS EC2のインスタンスをt2からt3に変える

# 最初に
割と新しいインスタンスはただ単にインスタンスタイプを変えるだけで大丈夫だと思うのですが、古いとENAに対応していないということがあり得ます。
今回変更したかったのはまさにそういうものでした。
OSはCentOS7系でしたが、若干古かったのでENA対応していませんでした。
なので、ENAの対応から始まります。

ENAについては
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/enhanced-networking-ena.html

# ENA対応確認
```
modinfo ena
```
未対応の場合

```
modinfo: ERROR: Module ena not found.
```
が出ると思われる

# update
CentOSならyumでアップデートしてENA対応できるので

```
sudo yum update
```
今回古いインスタンスだからかupdateで失敗しました。そういう場合はrepoの情報のmirrorをコメントアウト、baseurlを有効にすればいけるはず。


# インスタンス再起動
```
aws ec2 reboot-instances --instance-ids {InstanceID}
```

# ENA対応確認
``` 
modinfo ena
```
さっきとは違って色々表示されるはず。

# ENA有効化
ENAを有効化するためにインスタンスを止める必要があります。

```
# インスタンスを停止
aws ec2 stop-instances --instance-ids {InstanceID}
# ENAが有効か確認
aws ec2 describe-instances --instance-ids {InstanceID} --query "Reservations[].Instances[].EnaSupport"
```
現時点では有効化されていないので、多分[]が返ってきます。


```
# ENA有効化
aws ec2 modify-instance-attribute --instance-id {InstanceID} --ena-support
# ENAが有効か確認
aws ec2 describe-instances --instance-ids {InstanceID} --query "Reservations[].Instances[].EnaSupport"
```
ここの確認で

```
[
    true
]
```
が返ってきたらOK

# t3に変更
最後にt3に変更します

```
# 変更して
aws ec2 modify-instance-attribute --instance-id {InstanceID} --attribute instanceType --value t3.{InstanceSize}
# 起動
aws ec2 start-instances --instance-ids {InstanceID}
```

無事に変更できたようです。
Ajax通信　覚書

#　序文
　Ajax通信の簡単な覚書のつもりで作成しました。初心者が初心者にもわかりやすいように書いたものなので拙い点は多々あるはずですが、ご容赦ください。

#　使用言語
1.JavaScript
2.C#

#　サンプル
```js                                                                             
      function (method, url, param) {
        let defer = $.Deferred();        
        $.ajax({
            type: method,
            url: url,
            data: param,
            success: function (data) {
                
                    let json = JSON.parse(data);
                    defer.resolve(json);
                    return;
                                
            },
            error: function () {
                alert("通信に失敗しました。");
                defer.reject(false);
            }

        });
```
　
#　処理の概要
1.サーバにjson型のデータを、指定したHttpメソッドで、指定したURLに送信。
2.成功したときと失敗したときで処理が分岐する。
　（ア）成功時
　　　　・レスポンスされたデータをjson型に変換。
　（イ）失敗時
　　　　・「通信に失敗しました。」というメッセージ付きの警告が出る。

#　単語の解説
- type: Httpメソッド(POST or GET)
- url: 処理を担当するメソッド（表記は「../コントローラ名/メソッド名」）
- data: サーバに送るデータ（json型で送る場合の表記は「json = {'データの名前':データの値（変数など）, 'データの名前':データの値（変数など）,....}」）
- success: サーバへの通信が成功した後に起こる処理を記述する。ここでの「data」はサーバからレスポンスされたデータを指す。
- error: サーバへの通信が失敗した後に起こる処理を記述する。

#　終わりに
　大雑把な説明しかしていないので、他の記事やサイトも参考にしていくとよいかと思われます。
二次元配列 と 配列内の配列

####前置き
ある日ある時、パズルゲームを作っている時に二重配列を使いたくなって使いました。
他のある日、また二重配列を使いたくなって使いました。
また別のある日、その二つの二重配列を見返しました。

あれぇれぇ～？　この二つ種類違うぞぉ？　おっかしいなぁ～？( ﾟДﾟ)

####ここから本編

```C#:array1
//C#
//ある日あるときの配列
 int[][] bingo = { new int[] { 0, 1, 2 }, new int[] { 3, 4, 5 }, new int[] { 6, 7, 8 }, new int[] { 0, 3, 6 }, new int[] { 1, 4, 7 }, new int[] { 2, 5, 8 }, new int[] { 0, 4, 8 }, new int[] { 2, 4, 6 } };

//他のある日の配列
int[,] day = new int[2,3];
```


前者の配列は、要素数が一定でないときにも対応できる。
けど、後者の配列は要素数が一定でないときは対応できない。
後者のやつが二次元配列で、前者はあくまでも配列内の配列って扱いなのかな。
配列を定義するだけなら後者でよさそう。(*'ω'*)

```C#:array2
//C#
//要素数が一定でないときの配列の使い方
//要素数が3個の配列(中身{0,1,2})と2個の配列(中身{3,4})を、同じ配列に入れている
 int[][] arr1 = { new int[] { 0, 1, 2 }, new int[] { 3, 4 }};


//要素数が一定な時の配列の使い方
//前者と同じように中身を定義することもできる(定義していないと全部中身は0になる)
int[,] arr2 = new int[2,3]{ { 0, 1, 2 } { 3, 4, 5} };
```

ふむふむ、それならば、ある日ある時のビンゴ配列は、要素数が同じだから後者の配列でもよかった……。

ど、どうせ中身定義しなきゃいけなかったわけだし？ゲーム内ではちゃんと動いたわけだし？過去のことを思っちゃダメ。未来のことも思っちゃダメ。今を精一杯生きようじゃないか。(*´ω｀)
【Salesforce】データローダに5桁のポート番号を設定する方法

## 課題
データローダの設定画面では、Proxy portを4桁までしか入力できない。

<img width="408" alt="port.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611228/bd1b8bb0-8595-b67c-83d4-965fbff22bec.png">

## 解決策
データローダの設定ファイルを編集することで、5桁のポート番号を設定することができる。
※要データローダの再起動

``` configs/config.properties
sfdc.proxyPort=12345
```

## 参考
■Proxy Port が 5 桁の場合、データローダの設定画面からポートの設定ができない
https://help.salesforce.com/articleView?id=000335276&language=ja&type=1&mode=1
ファイルを探して、指定パターンに対して置換を行うコマンド

macosでの実行コマンドとなる。

>>find . -type f -name "*_pipeline.py" -exec sed -i "" "s/.set_image_pull_policy('Always')/.set_image_pull_policy('Always').set_retry(3)/g" {} +

linuxの場合-i後ろの""はいらないです。
Rails ウィザード形式導入について 1

#はじめに
Qiitaサボっておりましたが、学習は継続してしっかりやっております！
むしろチーム開発を通じて、アプリ開発が楽しくてたまらない状態です！
しかし、サボりっぱなしは気持ちよくないので、リスタートさせてください（泣）

上述の通り、チーム開発でフリマサイトを開発致しました。
その際、ユーザーの新規登録画面でウィザード形式を導入致しましたので、内容を整理します。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。

#ウィザード形式とは
- 世に出ているアプリ等でも見かける画面が切り替わりながらユーザー等の登録を行うもの
- ウィザード形式とは、対話するように順番に操作が進んでいくインターフェースのこと

#なぜウィザード形式が必要なのか
- 使いやすくなる
- UXのクオリティが高まる

私自身も「使いやすい」、「何がどこにあるのか」が分かり易いアプリは、いい印象です。
え？　そんなところをクリックできたのか！
マイページに飛んで、また入力か。

それらを回避できるイメージです！

#前提条件
- 今回はuser情報に併せて、destination（住所）情報をウィザード形式で入力できる
- deviseは導入済み
- deviseのデフォルト状態での新規登録・ログイン機能は実装済み
 

###では早速！

###destinationsモデルの設定
- destinations（住所）情報の実装をするので、マイグレファイルを設定します！

```db/migrate/20XXXXX.rb
class CreateDestinations < ActiveRecord::Migration[5.2]
  def change
    create_table :destinations do |t|
      t.integer :post_code
      t.text :destination
      t.references :user
      t.timestamps
    end
  end
end
```


###バリデーション、アソシエーションの設定

- まずはdestinationの方から！

```app/models/destination.rb
class Destination < ApplicationRecord
  belongs_to :user, optional: true
  validates :post_code, :destination ,presence: true
end
```

- 続いて、userの方も！

```app/models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  validates :name, :age ,presence: true
  has_one :destination
end
```

#deviseのカスタマイズ

### deviseのコントローラの作成
- 編集(ウィザード形式実装のため）できるようにする為に、必要となります。

```Terminal
% rails g devise:controllers users
```

しかし、このままでは、devise管理化のコントローラーが呼ばれてしまいます。

呼びたいのはDevise::RegistrationsControllerを継承した**Users::RegistrationsController**です！

```
% rails routes 
```
で確認してくださーい！

例えばですが、controller#Actionのdevise/registrations#newです。


###ルーティングの設定
- どのコントローラを参照するのか設定

```config/routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: {
    registrations: 'users/registrations',
  }
  root to: "top#index"
end
```
ここでもう一度

```
% rails routes 
```
で確認してくださーい！

rails routesをすると、参照するコントローラが変更されていることが確認できます。

例えばですが、
controller#Actionのdevise/registrations#new
↓
**controller#Actionのusers/registrations#new**
になっているかと思います！



今行ったことは、Devise::RegistrationsControllerを継承した**Users::RegistrationsController**を作成したイメージです。

続きは次回！

#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
PhpStormでPSR-12に準拠させる


Preferences -> Editor -> Code Style -> PHP
までいき、Set from...をクリックすると、その中にPSR-12がある。
<img width="1057" alt="PhpStormでPSR-12に準拠させる.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607661/cf666879-df59-adf5-37dc-1944dca76f4e.png">
そこから選べばOK。

あとはReformat Code(Option + Command + L)でコードを修正。
JavaScript : ページの最下部に来た時にイベントを起こす

スクロールがページの一番下に到達したことをJavaScriptで拾うには以下のようにする。

```JavaScript
$(window).on('scroll', function () {
  var doch = $(document).innerHeight(); //ページ全体の高さ
  var winh = $(window).innerHeight(); //ウィンドウの高さ
  var bottom = doch - winh; //ページ全体の高さ - ウィンドウの高さ = ページの最下部位置
  if (bottom <= $(window).scrollTop()) {
    //一番下までスクロールした時に実行
    console.log("最底辺！");
  }
});
```

一番下まで行かずとも「ページの80%」で動作させたいなら、5行目の if 文を以下のようにする。

```javascript
if (bottom * 0.8 <= $(window).scrollTop()) {
```
everydayrailsで Selenium::WebDriver::Error::WebDriverError: がでた (geckodrive)

macosです。

追記: すいません。この記事ではfirefoxを使えるようにしたのですが、chromeを使うべきだそうです。
# 「ドライバのダウンロード」

Unable to find Mozilla geckodriver.　
というエラー文が出ていたので、（実際に出たエラー文cpし忘れたのでこれじゃないかもしれませんがほぼこれです）　**geckodriver** をダウンロードする。

ダウンロードは
https://github.com/mozilla/geckodriver/releases
このURLからした。

macos,linux,winなどいくつか種類があるので自分のPCにあったのを選ぶ。


# 「ドライバをPATHに置く」

とりあえず初心者でPATHの設定が初めてだったのでディレクトリをDesktopに作成し、そこにブラウザでダウンロードしたgeckodriveを入れといた。

実際にPATHを通す

ターミナルで一応
`$ echo $PATH`
でPATHを確認（しなくていいけど）すると

`/いつも通り出てくるデフォルトのPATH/`
になってる

`$ export PATH=$PATH:/Users/ユーザー名/Desktop/geckodriverを入れたディレクトリ名`
でPATHを追加

もう一回
`$ echo $PATH`
で確認してみると

`/いつも通り出てくるデフォルトのPATH/Users/ユーザー名/Desktop/geckodriveを入れたディレクトリ名`
になってた。

これでPATHは通せたと思います。（違ったらすいません）


# bin/rspec spec/features/tasks_spec.rb　でテストしてみる

Could not find Firefox binary (os=macosx).

Firefoxが見つからないというエラー

`$ brew cask install --appdir="/Applications" firefox`

でHomebrewからダウンロード

これで
`$ bin/rspec spec/features/tasks_spec.rb`
が成功しました

# /usr/local/bin に保存する

上記の環境変数PATHを通すやり方では、ターミナルを消したときこの設定も消えてしまうので

/usr/local/bin という場所に保存する

/usr/local/bin
はユーザが追加のパッケージをインストールした場合の実行ファイルを保存する場所らしい。


デフォルトでは存在しないので /usr/local/bin をsudoコマンドを使い作る

`sudo mkdir /usr/local/bin`

使えるようにしたいファイルを作成したPATHへ移動させる

`sudo mv 移動させたいファイル名 /usr/local/bin/新しいファイル名`

保存できたか確認する

 `which 確認したいファイル名`

出力結果は

`/usr/local/bin/geckodriver`

なので保存できた

# ターミナルを一回消して bin/rspec spec/features/tasks_spec.rb

通ったのでとりあえずオッケー。


環境変数PATHに関しては
https://reffect.co.jp/windows/full_understanding_mac
を参考にしました。ありがとうございました。

間違っている箇所など見つけた場合コメントしていただけたら幸いです。
Houdiniにグラデーションピッカーを実装する方法

# はじめに

先日、[PySide勉強会](https://eventregist.com/e/PySideStudy)であんどうさんが発表したSubstance DesignerのようなグラデーションピッカーをHoudiniに実装する方法を紹介します。
[あんどうさんのグラデーションピッカーの紹介、解説記事](https://fereria.github.io/reincarnation_tech/11_PySide/02_Tips/05_gradation_picker/)

実際に使うと下図のようにランプパラメータにピッカーで拾ったグラデーションが適用されます。
下図はネットワークエディタに画像を読み込んでますが、画面内であればどこでも色を取得出来ます。
![](https://paper-attachments.dropbox.com/s_399E1AD18FADE07F306941CFC1CB3B17F73ADCE900B5444A36536A08313EA327_1585639949941_HeightGradation.gif)

# 実装方法
1. 下記URLからコードをダウンロードします。  
    https://snippets.cacher.io/snippet/2c7496d1dbbdc093033c
2. ダウンロードした**gradationPicker.py**をHoudiniがPythonを読み込めるフォルダに移します。  
    分からない場合は`%HOMEDRIVE%%HOMEPATH%\Documents\houdiniバージョン\scripts\python`にコピーすると自動で認識されます(フォルダが無い場合は作成します)。
3. ここからHDAに実装する場合とすでに存在してるノードのパラメータに実装する場合で少し異なります。

- **HDAに実装する場合**
    HDAの**Type Properties** > **Scriptsタブ**にアクセスし、**Event Handler**を**Python Module**に変更します。
    そうすると右側のPythonコード欄がアクティブになるので、そこに下記の__ランプパラメータにグラデーションを適用するコード__を入力します。


- **存在してるノードのパラメータに実装する場合**
    Houdiniメニューの**Windows** > **Python Source Editor**をクリックし、Python Source Editorを起動し、コード入力欄に下記の**ランプパラメータにグラデーションを適用するコード**を入力します。


## ランプパラメータにグラデーションを適用するコード

```Python
# -*- coding: utf-8 -*-

import hou
from PySide2.QtCore import Qt

from gradationPicker import ColorPick

class _GCProtector(object):
    widgets = []

def rampColorPicker(parm, threshold=0.05):
    def setRampColor(colors):
        # 引数のcolorsは[グラデーションの位置, 色]が入ったリスト
        curveKeys = []
        curveValues = []
        # 二次元のリストをcurveKeys、curveValuesの二つに分ける
        for pos, color in colors:
            curveKeys.append(pos)
            # PySideの色空間がsRGBで、Houdiniはリニアなので、2.2乗して変換
            curveValues.append([(ch / 255.0) ** 2.2 for ch in color])
        linears = [hou.rampBasis.Linear] * len(colors)
        ramp = hou.Ramp(linears, curveKeys, curveValues)
        parm.set(ramp)

    picker = ColorPick()
    # フォーカスが移らないように最前面に表示
    picker.setWindowFlags(Qt.WindowStaysOnTopHint)
    # どれぐらい色の差を識別するかのしきい値を設定
    picker.threshold = threshold
    # ピッカーのメインウィンドウをスクリーン全体に表示する
    picker.showFullScreen()
    # マウスを離した時に関数を実行する
    picker.getGradation.connect(setRampColor)
    # 普通に表示するとメモリを開放してすぐに消えてしまうのを回避する処理
    _GCProtector.widgets.append(picker)
```


４. 最後にこのコードを実行する用のボタンを作成します。
５. 作成したボタンのCallback Script欄に下記コードを入力します。

- **HDAの場合**
`hou.phm().rampColorPicker(kwargs['node'].parm('ramp'), threshold=0.05)`


- **すでに存在するノードの場合**
`hou.session.rampColorPicker(kwargs['node'].parm('ramp'), threshold=0.05)`
![](https://paper-attachments.dropbox.com/s_399E1AD18FADE07F306941CFC1CB3B17F73ADCE900B5444A36536A08313EA327_1585640913816_ButtonSetting.png)
※`parm('ramp')`の箇所は対象とするランプパラメータの名前に変更して下さい。
thresholdの値は数値が低いほど、精度が上がりますが、その分キーが増えます。


ボタンにアイコンを設定したい場合はButton Icon欄にBUTTONS_secondary_colorsと入力するとそれっぽいアイコンが付きます。

これでボタンを押すとグラデーションピッカーモードになるので、ドラッグして色をピックしてみて下さい。

# 最後に

以上グラデーションピッカーをHoudiniに実装する方法でした。
PySideは色んな事が出来て、楽しいですね。
ちなみにグラデーションピッカーを改変する事で下記のようなランプパラメータのカーブを手書きで書く機能を作ることも出来ます。

![](https://paper-attachments.dropbox.com/s_399E1AD18FADE07F306941CFC1CB3B17F73ADCE900B5444A36536A08313EA327_1585641005192_DrawCurve.gif)
はじめに

##Qiitaを始めた理由
簡単に言えば、メモ代わり。
メモを書くだけで他の方にも評価されたりするって結構便利じゃないか。(^▽^)/

……すいませんそれだけじゃないです。後輩がブログやってると聞いて、なんか負けたくなかったんです。

##主に投稿すること
**1. Unityについて**
　サークルでUnityを使っていて分からないところが多々ある。(後輩にすら知識で負けた)
　そのたびに調べてたけど、面倒なので自分の使う分だけまとめてみよう！(≧▽≦)
　自分の書いた文の方が、自分で構成を練っている分読みやすいと感じるからね。

**2. C#について**
　理由は至極単純なもので、UnityでC#を使っているから。
　もしも、明日からC#禁止令なるものが出たら、掌を返して別の言語の話を書きなぐる！( ;∀;)　

**3. 競技プログラミングについて**
　AtCoderは楽しいぞい！
　C#で競技プログラミングの記事を書いている人は少ないから、需要があまりないのかもしれない。
　関係ねえ！私は書くぞ！　だってこれメモ代わりなんだもん。( ｀ー´)ノ
 


######追記：
適切なタグの使い方を紹介していただいた方がいます。ありがとうございました。<(_ _)>
リモートブランチをローカルに持ってくる

##既存プロジェクトにアサインされたときすでに存在するリモートブランチをローカルにもってきたい

```
git checkout -b dev origin/dev
```

dev の部分はローカルのブランチ(自分で命名)
origin/dev　の部分はリモートのブランチ

```
git branch -a
```
でリモートのブランチを確認できます

q で抜けれます。
新しいJavadocのタグ @apiNote @implSpec @impleNote

# 初めに

javadocを眺めていたらふと見たことが無い`@apiNote`というタグを見つけました。
少し調べてみると `@apiNote` `@implSpec` `@impleNote` というタグがJava 8から追加されているようです。

公式ドキュメントなどを探しても記載がないため少し調べてみました。

# 概要

これらのタグはLambda式の仕様策定の副産物で生まれたそうです。
2013年4月にJDK Javadoc maker が更新され使えるようになったとのこと。

ただし、これらのタグはJDKドキュメントで使用する以外に普及させる計画が無いそうです。
そのため公式ドキュメントにも記載がされていないということのようです。

# 各タグの詳細
それぞれのタグで記載されている内容を見ていきます。

## `@apiNote`

APIに関する解説、根拠、または例を記載します。
通常javadocに記載するAPI仕様の補足的な記載をします。

[Object#isNull](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Objects.html#isNull-java.lang.Object-)
APIの注が`@apiNote`で記載されている箇所です。

## `@implSpec`

デフォルトメソッドの仕様を記載します。
もしくはオーバーライドして実装するべきメソッドの詳細を記載します。

[ConcurrentMap#replaceAll](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/ConcurrentMap.html#replaceAll-java.util.function.BiFunction-) 
「実装要件」が`@implSpec`で記載されている箇所です。

[Clock](https://docs.oracle.com/javase/jp/8/docs/api/java/time/Clock.html) 
クラス説明の中の「実装要件」が`@implSpec`で記載されている箇所です。

## `@implNote`

提供される実装の有益な情報や補足、注意するべき内容を記載します。

[ConcurrentMap#forEach](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html#forEach-java.util.function.BiConsumer-)
[Clock](https://docs.oracle.com/javase/jp/8/docs/api/java/time/Clock.html)
「実装上の注意」が`@implNote`で記載されている箇所です

# 使用上の注意

これらのタグはデフォルトではjavadocコメントとして生成されません。
コマンドラインで出力する場合には以下の引数を与える必要があるようです。

```
-tag "apiNote:a:API Note:"
-tag "implSpec:a:Implementation Requirements:"
-tag "implNote:a:Implementation Note:"
```


## 参考記事

https://blog.codefx.org/java/new-javadoc-tags/
[Microsoft] 空フォルダを全削除するPowerShellスクリプト - Remove empty folders recursively. 

robocopy /purgeは、ファイルは消してくれるけれどディレクトリは消してくれません。
アプリをアンインストールするとAppDataの下に空フォルダが残ります。
それらを一括して消したいとき用のスクリプトです。

深さ優先で消してますので、消し残しありません。

**4/3 追記**
初出時は、隠しディレクトリ/ファイルを消せていませんでした。

# スクリプト本体

```powershell
Function Remove-EmptyFolder {
    [cmdletbinding()]
    Param(
        [parameter(mandatory=$true)][String]$Path
    )

    Process {
        (Get-ChildItem -Force $Path | ? { $_.PSIsContainer -eq $true }) | % { Remove-EmptyFolder $_.FullName }
                
        $dir = Get-Item -Force $Path
       
        if ($dir.PsIsContainer -and $dir.GetFileSystemInfos().Count -eq 0) {
            Remove-Item -Force $dir
        }
    }
}
```

`notepad $profile` としてファイルを開いてコピペしてあげれば、PowerShell起動時に読み込まれるようになります。


# 使い方

```powershell
Remove-EmptyFolder フォルダのパス
```
「コード・コマンドを、クリックでクリップボードにコピーできるサイト」まとめ

# はじめに

正式にいつからかは把握してませんが、
最近Qiitaのコードブロックをクリックでコピーできるようになりました。

```
右上のボタンを押すと、このコードがコピーされる
```

このUIは、**公式ページなどによくある形式** で親しみを感じますが、
具体的なサイトをすぐに思い出せなかったので、一覧を記載します。

**他にも知っている人は、是非、編集リクエストをください:bow:**

# 一覧

 - [docker hub](https://hub.docker.com/_/node)
 - [npm](https://www.npmjs.com/package/vue)
 - [bootstrap](https://getbootstrap.com/docs/4.4/components/alerts/)
 - [Material Design Lite](https://getmdl.io/components/index.html#badges-section)
 - [bulma](https://bulma.io/documentation/form/general/)
 - [Semantic UI](https://semantic-ui.com/elements/button.html)
 - [mvn repository](https://mvnrepository.com/artifact/org.springframework/spring-core/5.2.2.RELEASE)
 - [Font Awesome](https://fontawesome.com/icons/flag?style=solid)
 - [AtCoder](https://atcoder.jp/contests/abc086/submissions/12542803)
 - [doc.rust-jp.rs](https://doc.rust-jp.rs/book/second-edition/ch01-02-hello-world.html)  
 - [TypeScript Deep Dive](https://basarat.gitbook.io/typescript/getting-started)
 - [scrapbox](https://scrapbox.io/ProgrammingExperience/Scrapbox%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)
 - [Jest](https://jestjs.io/docs/ja/getting-started)

# 番外編

コードブロックのクリックが **コピー以外のアクション** のサイト

 - [Material Design Lite](https://getmdl.io/components/index.html#badges-section)  
click to copy の他に Open in CodePen
 - [doc.rust-jp.rs](https://doc.rust-jp.rs/book/second-edition/ch01-02-hello-world.html)  
「Copy to clipboard」の他に「Run this code」、「Show hidden lines」付き
 - [Python Doc](https://docs.python.org/ja/3/library/functions.html#bin)  
Hide the prompts and output
 - [CofeeScript](https://coffeescript.org/#functions)  
実行ボタン付き

# さいごに

コピーした後のエフェクトの違いを見るのも面白い。

`<CODE>` タグに、クリックでコピーできる属性が、HTMLの仕様に入ると、
うれしい人が多いんじゃないかと思う。
Git コマンド長すぎてめんどくさい問題を解決する方法

Git を扱う際に、`checkout`、`branch`、`commit`、`status` などを使用しますが、これが長くて打つのだるいなぁと思ったことはないでしょうか。そんなめんどくささは「Git エイリアス」を使うと解決することが出来ます。

#Git エイリアスとは
* Git コマンドを別名で実行(入力)できるもの
* コマンドを短縮化できるので入力が非常に楽になるもの

というくらいの理解で OK でしょう。

#設定方法
設定方法は超シンプルで、コマンドで実行する方法と `.git/config` ファイルへ書き込むする方法があります。

##コマンドで設定する方法
以下のコマンドを実行するのみです。

```
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
```

このような設定をすることで、例えば次のコマンドは同じ意味になります。

>(設定前) git checkout
(設定後) git co

##Config ファイルを書く方法
`./git/congig` ファイルを開き、以下の様に記載します。

```
[alias]
co = checkout
br = branch
ci = commit
st = status
```

#エイリアスを確認する方法
ファイルを直接開いて確認するのは面倒なので、以下 Config コマンドで確認することが出来ます。

```
git config --get-regexp alias
```

例えば、上述4つの Config コマンドを実行したあとで、`git config get` を実行すると以下のような形になります。

```
C:\Users\komiyasa>git config --get-regexp alias
alias.co checkout
alias.br branch
alias.ci commit
alias.st status
```

簡単にショートカットのような Alias を設定することができました。

#参考
[Git の基本 - Git エイリアス](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)
[gitで登録したaliasコマンド一の覧や内容をイイ感じに確認できるようにしてみた](https://qiita.com/ktty1220/items/d1daf4357ed5f5ceae69)
エラーが出たAn error occurred while installing pg (1.2.3), and Bundler cannot continue. Make sure that `gem install pg -v '1.2.3' --source 'https://rubygems.org/'` succeeds before bundling.

```
An error occurred while installing pg (1.2.3), and Bundler cannot continue.
Make sure that `gem install pg -v '1.2.3' --source 'https://rubygems.org/'` succeeds before bundling.
```

解決

```
brew install postgresql
```

## 参考


https://qiita.com/masanarih0ri/items/5ad2f7e11c8c94170d6b
リストを特定の長さごとに分割し余った要素も含めてサブリスト化する方法

#やりたいこと
```
["a", "b", ... ,"z"]
```
↑の様なリストがある時、aからe、fからjのように5文字ごとに分割したい。また、最後に余るzに関しても、リストに含めたい。

つまり、

```
["aからe", "fからj", ..., "z"]
```

のようなサブリストに分割したいと考えています。

#方法
　文字列をすべてキューに入れ、5個ごとに取り出します。また、空でないキューのみを取り出すことで、最後に余った要素以降は無視します。


#コード

```python:split.py
import queue

#aからzの文字リストを作成
chars = [chr(ord('a') + i) for i in range(26)]

#キューを作成
q = queue.Queue()

#キューに文字リストを挿入
for s in chars:
    q.put(s)

#分割した文字を格納する用のリスト
subList = []

#文字リストを分割
while not q.empty():

    #分割したリストを一時保存
    splittedList = []  
    
    #5個ごとに区切る
    for i in range(5):
        if not q.empty():
            splittedList.append(q.get())
    
    #サブリストに格納
    subList.append(splittedList)

#出力
print(subList)
```
#結果

```
>python split.py
[['a', 'b', 'c', 'd', 'e'], ['f', 'g', 'h', 'i', 'j'], ['k', 'l', 'm', 'n', 'o'], ['p', 'q', 'r', 's', 't'], ['u', 'v', 'w', 'x', 'y'], ['z']]
```

#追記（2020/03/31)
@shiracamusさんからコメントを頂きました。
ありがとうございました。