OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルリストを指定サイズ以下になるようにグルーピングする

言葉で説明すると分かりにくい。
例えば、あるディレクトリに画像ファイルが100個あるとき、ファイルサイズの合計が10MB以下になるように複数のグループに分けたいときに使うクラスメソッドです。

なんでこんなことをしたいかというと、Google Cloud Vision API に画像からテキストを抽出する OCR 機能があり、この API は複数ファイルを処理できますが最大で 10MB までしか受け付けてくれません。
ファイルが100個あって繰り返しAPIを呼び出すときにうまく分割しながら送るためにこのグルーピングが必要になります。


```ruby
MAX_POST_SIZE = 10 * 1024 * 1024 # 10MB

files = ['/path/to/1.png', '/path/to/2.png', '/path/to.3.png', ... ];
files_grouped = File.group_into_chunk(files, MAX_POST_SIZE)
files_grouped.each do |files|
  # ここで files を Vision API に送る
end
```


```ruby
class File
  # ファイルリストを `chunk_size` 以下のファイルサイズになるように分割する
  # File.group_into_chunk(paths, 10 * 1024 * 1024).each do |files|
  #   # files => ファイルサイズの合計が10MB以下になるように分割されたファイルリスト
  # end
  def self.group_into_chunk(files, chunk_size)
    files.inject([]) do |groups, file|
      group = groups.last
      if group.nil? || group.sum { |f| File.size(f) } + File.size(file) > chunk_size then
        group = []
        groups.push group
      end
      group.push file 
      groups
    end
  end
end
```
Python使いでも、R使いでもないけど、KEGGに色つけしたいの！

助けて。Python使いでも、R使いでもないけど、KEGGのパスウェイ(pathway)に色つけしたいの。
でもウェブサイトをボタンでポチポチやらなずに、なるべくCUIでやりたいの！

そんなワガママなあなたに朗報です。

Pathviewの作者が `pathview.sh` を提供しています。
(有名じゃないはKEGGのライセンスの関係もあって本家が宣伝を控えているからかも）

詳しくはこちらをご覧ください。
https://pathview.uncc.edu/api_tutorial

```bash
./pathviewapi.sh --gene_data gse16873.d3.txt --cpd_data sim.cpd.data2.csv --pathway_id 00010 
```
って入力すると、

```
THIS MAY TAKE A WHILE, PLEASE BE PATIENT WHILE API IS RUNNING...
###########
Date: Fri, 10 May 2019 06:46:10 GMT

{"download link":"https://pathview.uncc.edu/ホニャララ.zip"}
```

みたいな感じでダウンロードリンクが作成されます。

ヒント程度の情報ですが、役に立つ人には役に立つ情報かと思います！

私はRubyを使ってますが、このスクリプトを見つけて小躍りしたい気持ちになってこのエントリーを書きました。

この記事は以上です。
goodLink


[bootstrap]
http://www.venezia-works.com/bst/index.html

https://myenigma.hatenablog.com/entry/2015/06/16/221238

[restApi]
https://ishiis.net/2016/09/08/spring-boot-rest-api/

[sphynks]
https://sky-joker.github.io/github_sphinx_example/#docs

Grails 3.0先取り!? Spring Boot入門ハンズオン #jggug_boot 
https://www.slideshare.net/makingx/grails-30-spring-boot

techNote
http://javatechnology.net/tag/java/page/3/

・頻出
http://java.sevendays-study.com/

・streamApi
https://www.casleyconsulting.co.jp/blog/engineer/191/

・mybatis
https://www.casleyconsulting.co.jp/blog/engineer/211/

・解体新書
https://app.box.com/s/fw0agia98f7ea6x3xnjc08apy90b30ua

[junit mock]
https://techblog.gmo-ap.jp/2017/03/13/mock%E3%81%A7%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E3%81%97%E3%82%88%E3%81%86%EF%BC%81/

・Progate的な練習サイト
http://www.coderesume.com/modules/quiz/?quiz=j00012

- terasoluna
http://terasolunaorg.github.io/guideline/5.0.1.RELEASE/ja/Security/Authentication.html#authenticationprovider

- JDBC,JPA,MyBatisそれぞれのアクセス方法
http://blog.enjoyxstudy.com/entry/2016/12/26/000000
VirtualBoxのVMをライブ/オンライン/無停止バックアップするスクリプト

# VirtualBoxを止めずにバックアップをとりたい！

以前からしっくりくるツールが見つからなかったので作ってみました。

miyanaga@vbox-live-backup
https://github.com/miyanaga/vbox-live-backup

シンプルなスクリプトなのでご自由にアレンジしてお使いください！ 活用例などコメントいただけると励みになります。

![vbox-live-backup.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/d726bc12-1493-787c-6567-6a4afc72fb3b.gif)

# 使い方

簡単なシェルスクリプトです。macOS/VirtualBox 6.0で動作確認してます。

# VM1台の無停止バックアップ

    $ ./vbox-backup-vm.sh "VMの名称" "バックアップ先フォルダ"

指定ディレクトリに、タイムスタンプ付きファイル名でOVFエクスポートされます。

# VMすべての無停止バックアップ

    $ ./vbox-backup-all.sh "バックアップ先フォルダ"

# 仕組み

VMが停止中の場合は直接エクスポートできるので、エクスポート(`VBoxManage export`)を実行して終了します。

稼働中のVMは直接エクスポートできないので、次の処理を行います。

1. VMのスナップショットをとる `VBoxManage snapshot take`
2. スナップショットからクローンVMを作る `VBoxManage clone`
3. クローンVMの状態を破棄する `VBoxManage discardstate`
4. クローンVMをエクスポートする `VBoxManage export`
5. クローンVMとスナップショットを破棄する `VBoxManage snapshot delete` `VBoxManage unregistervm`

ソースコードはこんな感じです。

```bash
#!/bin/sh

VM=${1%\n}
BACKUPDIR=${2%/}

SERIAL=`date "+%Y%m%d%H%M%S"`
SNAPSHOT="$VM-backup-$SERIAL"
BACKUPFILE="$BACKUPDIR/$SNAPSHOT.ova"

alias vbox="VBoxManage"

RUNNING=`vbox showvminfo "$VM" --machinereadable | grep -c 'VMState="running"'`

if [ $RUNNING -ne 1 ]; then
  echo "Try to export VM $VM to $BACKUPFILE"
  vbox export "$VM" -o "$BACKUPFILE" \
    --ovf10 --manifest
  exit
fi

echo "Take snapshot of $VM as $SNAPSHOT"
vbox snapshot "$VM" take "$SNAPSHOT" --live && \
\
echo "Clone snapshot of $VM to temporary VM $SNAPSHOT on $CLONEDIR" && \
vbox clonevm "$VM" --snapshot "$SNAPSHOT" \
  --mode machine --options keepallmacs \
  --name "$SNAPSHOT" --basefolder "$CLONEDIR" --register && \
\
echo "Discard state of temporary VM $SNAPSHOT" && \
vbox discardstate "$SNAPSHOT" && \
\
echo "Export temporary VM $SNAPSHOT to $BACKUPFILE" && \
vbox export "$SNAPSHOT" -o "$BACKUPFILE" \
  --ovf10 --manifest && \

echo "Delete temporary VM $SNAPSHOT"
vbox unregistervm "$SNAPSHOT" --delete

echo "Delete snapshot $SNAPSHOT"
vbox snapshot "$VM" delete "$SNAPSHOT"

echo "Delete clone directory $CLONEDIR"
rm -rf "$CLONEDIR"
```

# 注意点など

* 冒頭の動画は[Tiny Core Linux](https://distro.ibiblio.org/tinycorelinux/)のとても小さいディスクイメージでの動作なのであっという間に終わってますが、通常はそれなりに時間がかかります。
* バックアップ用の一時VMは、バックアップ先に指定したディレクトリに作りますが、一時的に元のVMと同じ容量を食います。
* VM本体をSSD、バックアップをHDDというような運用がいいと思います。
* バックアップファイルはタイムスタンプで別名になるのでどんどん増えていきます。ファイル名を固定にアレンジしたり、世代管理は別途ご用意ください。
* OVFのバージョンなど細かなオプションについても外部からは指定できないのでソースコードを変更ください。
* 以前のバージョンのVirtualBoxでも動く…かもです。
Texで図を並べる際、図の位置を調整する方法(raisebox)

TeX の minipage を使ったりして図を並べると、図のサイズが違う場合などに高さが揃わないことがあります。
そのような場合、図と図の間隔を調整したり(\hspace)、図のサイズを合わせたりすることで、位置のズレを修正することができますが、
論文を書いているときに、上の方法で修正できない事があったので、(\raisebox)を使った位置合わせの仕方を説明します。

#raiseboxによる位置合わせ
外枠が欲しい時は \fbox、要らない場合は \mbox として、{\includegraphics}の前に記述します。
```
\mbox{\raisebox{-30mm}{\includegraphics[width=35mm]{aaaa.jpg}}}
```
{-30mm}の値を変えることで、図の高さを調整できる。
＊\fbox、\mbox は無くてもいいそうです。

具体的な使用例は以下のようになります。
```
\begin{figure}[htbp]
\begin{minipage}{0.45\hsize}
\begin{center}
\mbox{\raisebox{-30mm}{\includegraphics[width=35mm]{aaaa.eps}}}
\caption{aaaa}
\label{aaaa}
\end{center}
\end{minipage}
```

#おわりに
今回はTexで minipage を使用する際の位置ずれの対処方法について説明しました。
最後まで読んでいただきありがとうございました。
Windows Subsystem for Linuxを導入してWindows上のLinuxからAzure CLIを叩く

# はじめに
Windows環境のBashからAzure CLIを叩くまでの導入手順を紹介していきます。
※Build 2019でWSL2のアナウンスがされていますが社内共有用の手順として作成しています。

# WSLのインストール
## 機能の有効化
手元のデバイス側で Linux Subsystem の有効化を行います。
スタートアップボタンを右クリック時に表示される項目の「アプリと機能」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/1770c5b6-8cc8-554c-179f-dc30f1d21031.png)

そこから右側の「プログラムと機能」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/ba18c95c-4eee-513a-4fe0-2257e251516f.png)

左側の一覧から「Windows機能の有効化または無効化」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/63e27a48-17fc-ddbe-a566-52f44688477c.png)

Windows Subsystem for Linux にチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/4d662e98-8520-3dcf-0d6e-bafa56f40fa0.png)

チェックを入れるとインストールが開始され、完了後に再起動を行います。

## ストアからOSをインストール
Microsoft Store から Ubuntu を検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/6415436d-8bc9-4db1-3061-e5712e222e22.png)

以下の画面から今回は「Ubuntu 18.04LTS」を導入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/f6fb38b2-2209-3308-5a69-7ae8f023ce5b.png)

入手を押すとインストール作業が開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/e5e65600-6cdd-25e6-d1bc-832fa969f776.png)

スタートもしくはストア画面からUbuntuを起動してインストールの完了を待ちます。
インストールが完了するとユーザ名とパスワードの設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/bc9033a9-11ba-634d-771b-c82834f3f36c.png)

# 初期設定
## リポジトリの変更
初期設定は海外サーバへリポジトリを取りに行く仕様となっています。
以下のコマンドから日本のサーバに切り替えを行います。

```
sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list
```

## パッケージの更新
Linuxのアップデートはこまめにアップデートしましょう。

```
sudo apt update
sudo apt upgrade
```

# Azure CLIのインストール (Ubuntu)
基本はこちらの[公式ドキュメント](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-apt?view=azure-cli-latest)に沿った内容になります。

##パッケージの取得
インストールプロセス実行に必要なパッケージを取得します。

```
sudo apt-get update
sudo apt-get install curl apt-transport-https lsb-release gpg
```

##署名キーのダウンロード及びインストール
Microsoftの署名キーをダウンロードしてインストールします。

```
curl -sL https://packages.microsoft.com/keys/microsoft.asc | \
    gpg --dearmor | \
    sudo tee /etc/apt/trusted.gpg.d/microsoft.asc.gpg > /dev/null
```

## Azure CLIソフトウェアリポジトリの追加

``` 
AZ_REPO=$(lsb_release -cs)
echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | \
    sudo tee /etc/apt/sources.list.d/azure-cli.list
```

## azure-cliのインストール
リポジトリ情報の更新とパッケージのインストールをします。

``` 
sudo apt-get update
sudo apt-get install azure-cli
```

## 動作確認
Azure CLIのコマンドを利用して動作確認を行います。

```
az login
```

以下の実行結果が表示され既定のブラウザでログイン画面へ遷移されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321336/a633ad12-ab23-769c-a752-5f074f70ef12.png)

# 参考記事
[Windows Subsystem for Linuxをインストールしてみよう！](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)
[apt での Azure CLI のインストール](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-apt?view=azure-cli-latest)
Installing mysql2 0.5.2 with native extensions の際に Failed to build gem native extension. となる時の対処法

##環境
AWS 
database=mysql
ruby on rails

##対処法
Bundle install 時に mysql.h がないため、mysql2のインストールでエラーが発生している。
以下のコマンド叩いてmysql.hをインストールしよう

1 以下コマンドでmysql.hをインストールする
```
$yum install mysql-devel
```
2 実行結果
```
 You need to be root to perform this command.
```
権限がないと言われた

3 以下コマンドで強制的にインストール
```
$sudo !! 
```
これで mysql-devel がインストールされる

4  念願のインストール
```
$bundle install
```

参考
https://qiita.com/dayone80/items/8add812d97f0e58a3b28
Rundeckで登録したジョブを月初に自動実行したい

タイトルのことをやりたくて、
Rundeckのcron設定で詰まったので、
解決方法のメモです。

##手順
まずはスケジュール設定を行います。
Edit JobのSchedule to run repeatedly?でCrontabを選択すると、
ジョブ繰り返し実行のスケジュール設定を行うことが出来ます。

Crontab形式での指定は、通常のCrontabの設定とは異なり
Rundeckで拡張されています。

具体的にどうなっているかというと、
[Seconds][Minute][Hour][DayOfMonth][Month][DayOfWeek][Year]
秒 分 時 日 月 曜 年

秒と年が追加されています。


月初の1時0分なのでcronの要領で、
0 0 1 1 * * *
と入力します。

これをrundeck上で確認すると、
> 0 0 1 ? * * *

###なぜ...

調べてみると、

>疑問符は特定の値がないことを示す。
>この文字を入力できる 2つのフィールドの一方に何か指定する必要があるが、
>もう一方には指定する必要がない場合適用される。

ということらしいので、
Rindeckが*のすべての曜日選択を毎日と解釈されて、
>Schedule : at 1:00 every day

となってしまうらしい...。

解決させるには、
>0 0 1 1 * ? *

に変更。

確認すると、
>Schedule : at 1:00 day 1

Rundeckのcronは特殊で戸惑いましたが、
解決出来ました。

##参考
https://qiita.com/komeda-shinji/items/7a7aea43a35a89db5025#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C
Doma-Gen(1系)の使用方法

### 概要

Doma(1系)の資産を自動生成するためにDoma-Gen(1系)の使用を方法を記載する。

Domaとは？

> [S2Dao](http://s2dao.seasar.org/ja/index.html)のスタイル（DAOパターンや2 Way SQL）を踏襲したJava6（JDBC4.0）対応のO/Rマッパー

Doma-Genとは？

>  Doma用のエンティティクラスやDaoインタフェースのJavaコードを生成するツール

公式は[こちら](http://doma.seasar.org/extension/doma_gen.html)

### 環境

- Doma-Gen(1系)
- Eclipse
- Ant

### 手順

資産をダウンロード後、Eclipseを用いてAnt実行する。

#### １．ダウンロード

<http://doma.seasar.org/downloads.html>から`doma-gen-1.35.0`をダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127161/10f5ed2a-2faf-8ea3-2006-190c60aed940.png)

#### ２．プロジェクトをインポート

Eclipseを開いてダウンロードした資産をインポートする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127161/7b502416-2aac-4199-74c1-dab5dbfbb5b7.png)

#### ３．設定ファイルの修正

`doma-gen-build.xml`を修正する。

- DB設定
  - dialectNameからpasswordまで
- 生成される資産の設定
  - entityPackageNameからsqlTestClassNameまで

```xml
	<property name="dialectName" value="{dialectName}"/>
	<property name="driverClassName" value="{driverClassName}"/>
	<property name="url" value="{url}" />
	<property name="user" value="{user}"/>
	<property name="password" value="{password}"/>
	<property name="entityPackageName" value="example.entity"/>
	<property name="daoPackageName" value="example.dao"/>
	<property name="configClassName" value="example.AppConfig"/>
	<property name="sqlTestClassName" value="example.SqlTest"/>
```

JDBCドライバをダウンロードしてきてパスを通す。

例）PostgreSQLの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127161/2630b86e-1f40-1c79-a957-37a630d02b41.png)

#### ４．Antの実行

`doma-gen-build.xml`を右クリック＞実行＞２Antビルドで実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127161/3bb6ef5c-4926-5c4e-e284-60d29afdd82a.png)

量が多いと時間がかかるがこれで自動生成(Entity、Dao、SQL)が完了！

### 備考

中身を知りたい場合は`Gen.Java`をのぞくと◎
React ContextのdefaultValueのちょっとかしこい(かもしれない)使い方

## はじめに

React Context APIはReact.useContextにより格段に使いやくなりました。ところで、React.createContextにはdefaultValueを指定します。ここに何を指定すればよいでしょうか？しばしば `null` を指定している例を見ます。

## よくある例

```javascript
import { createContext, useContext } from 'React';
const MyContext = createContext(null);
export const MyProvider = MyContext.Provider;
export const useMyValueFoo = () => {
  const value = useContext(MyContext);
  if (!value) {
    throw new Error('You probably forgot to put <MyProvider>.');
  }
  return value.foo;
};
```

contextの値にオブジェクトを期待する場合は、ちゃんとProviderで値が設定されているか、つまりdefaultValueのnullのままになっていないかチェックして開発者向けにエラーを表示するテクニックです。

## 提案

形が決まっているオブジェクト限定ですが、defaultValueにエラーを表示するオブジェクトを指定しておいてはどうでしょうか。上記の例が次のようなコードになります。

```javascript
import { createContext, useContext } from 'React';
const warningObject = {
  get foo() {
    throw new Error('You probably forgot to put <MyProvider>.');
  },
};
const MyContext = createContext(warningObject);
export const MyProvider = MyContext.Provider;
export const useMyValueFoo = () => {
  const value = useContext(MyContext);
  return value.foo;
};
```

カスタムフックの実装からboilerplateが減ってスッキリしたと思いませんか。

## おわりに

自分がライブラリを実装しているときに思いついた方法なのですが、まだあまり他では見たことはありません。ぜひ試してみてください。一つの難点は、この方法は型定義とは少し相性が良くないかもしれません。
BotKit 4.xでのライブラリ仕様変更について

こんにちは、おかきょー言います。


最近、Botkit でのライブラリの仕様変更により、 これまでに掲載されているQiita での方法では実装すると、

```bash
TypeError: Botkit.slackbot() is not a function
```

とエラーが返されました。調べてみると、バージョンが4.0に変更してから、記述方法が変わっていることがわかりました。 
この記事では、どのように変化したかについてまとめてみたいと思います。

この記事は、こちらの記事を参照しました.
https://botkit.ai/docs/v4/advanced.html#how-to-upgrade-from-07-to-40


## 変更後の仕様について
この仕様変更については主に以下の点で変更がありました。

- ライブラリが **TypeScript** で開発されている
- **async, await** といった非同期処理で実装されていること
- プラットフォームに依存しないライブラリに変更したこと

## コードでの変化

### ボットをインストールときの変更点

Botkit では、それまでBotkit のライブラリ内にSlack、Facebook 等で利用できるライブラリが定義されていました。しかし、4.0以降では作りたいボットに応じて、`botbuilder-adapter-xxx` が必要です。そのため、Slackbot を利用する時は、

```bash
npm install --save botbuilder-adapter-slack
```

を先にインストールしないといけません。

- 0.7 以前の書き方

```javascript

var Botkit = require('botkit');
var controller = new Botkit.slackbot(options);
```

- 4.0 以降の書き方

```javascript
const { Botkit } = require('botkit');
const { SlackAdapter } = require('botbuilder-adapter-slack');

const adapter = new SlackAdapter({

    //認証には、BotTokenだけでなく、verificationToken,
   //あるいは clientSingleSecretToken のいづれかが必要です。

    verificationToken:process.env.SLACK_VERIFY,
    botToken: process.env.SLACK_TOKEN
});

let controller = new Botkit({
    adapter: adapter
});
```
### 構文上での変更点
コードを記述する際、これまでと異なり、**async, await** を利用した書き方に変化しています。

- 0.7 以前での書き方

```javascript

controller.hears('foo', 'message_received', function(bot, message) { 
    bot.reply(message,'bar');
});
```

- 4.0 以降の書き方

```javascript
controller.hears('foo', 'message', async(bot, message) => { 
    await bot.reply(message,'bar');
});
```

### direct_message,mension での使い方
Botkitでは、 0.7以前では、direct_message, mention に対して事前に含まれていましたが、これらを利用する際は、`botbuilder-adapter-slack` からそれらが使えるようになるミドルウェアを読み込む必要があります。

-0.7 以前

```javascript
controller.hears('foo', 'direct_message', function(bot, message) { 
    bot.reply(message,'bar');
});

```
-4.0 以降

```javascript
const { SlackAdapter,SlackMessageTypeMiddleware} = require('botbuilder-adapter-slack');

adapter.use(new SlackMessageTypeMiddleware())

(省略)

controller.hears('foo', 'message', async(bot, message) => { 
    await bot.reply(message,'bar');
});


```

以上の方を参考にして、Slack Bot を開発するといいです。
対話形式のコマンドを自動化するexpectの使い方

## 動作環境
- macOS High Sierra 10.13.6
- iterm2 Build 3.2.8

## expect is 何?
expectはコマンド内で発生する対話形式の入力を自動化できるコマンド｡
つまり､sshなどでpasswordやyes/noの入力が必要になったときに自動的に入力してくれるチョー便利なやつ｡

## 使い方

```shell
$ expect -c "
  spawn [自動化したいコマンド]
  expect [表示される返答]
  send [返答で入力する文字]
  interact または expect eof
"
```

## 実行例

```shell
PW="hogehoge"
expect -c "
set timeout 120
spawn jarsigner  -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore /hoge/fuga/keystore hogehoge.apk RELEASEKEY
expect \"パスワードを入力してください:\"
send -- \"${PW}\n\"
expect eof
"
```
## 使用する際の注意事項
`expect`と`send`で使用する文字列は`""`で囲むため`\`でエスケープさせる｡
`interact`は自動で入力されるが､実行はされないため､ターミナルから実行する場合はこちらを使用する｡
`expect`は自動で入力後､次のコマンドまで自動で実行されるため､cronやjenkinsから実行する場合はこちらを使用する｡
`expect`のデフォルトタイムアウトは10秒のため､10秒を超える処理を行う場合はうまく動かないため､`set timeout`で設定を行う
AWS Lambda and the Serverless Framework - Hands On Learning! 受けてみた①

##はじめに
今回は、 Udemy で Stephane Maarek 氏 が提供する[「 AWS Lambda and the Serverless Framework - Hands On Learning! 」](https://www.udemy.com/aws-lambda-serverless/)というコースを受講しました。
こちらのコースを3部構成で紹介していきますので、よろしくお願いします。

今回：セクション 1~3(part7)
次回：セクション 3(part8)~5
最後：セクション 6~8

※ Udemy コースで紹介される AWS の UI/UX の内容が2017年時点のものなので、現時点の AWS UI/UX の内容と違う部分がありますが。お気になさらず。

##セクション 1~3(part7)
今回のセクションでは、Lambda の特徴とその利用方法について紹介します。

###AWS Lambda について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/c36e93b6-7d29-3341-e3f8-5cacb49c0def.png)
 Lambda は EC2 と異なり、以下の4つの特徴があります。

- サーバレス環境を構築可能
- 実行時間を制限可能（短時間の利用が可能）
- オンデマンドで実行可能
- オートスケーリングが可能


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/1738a311-85c3-6eba-d97f-8698d3013fea.png)
Lambda では、全部で8種類の言語を利用することができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/bcd35167-bf5c-bd5a-f7fe-339831117fef.png)
Lambda と合わせて使う主な AWS サービスは、図の9つのサービスです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/eb3940cf-6a05-3c53-924f-ad9df71e4db3.png)
例えば、  S3 と DynamoDB を合わせて利用することで、サムネイルの作成が実行可能となります。

###Lambda を利用する前の準備
今回のセクションでは、Lambda を使用する前に以下の準備を行います。

 - AWS アカウントの作成
 - Code のダウンロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/4000f112-1a0a-6d75-7dfd-2b007b488bfd.png)
コードについては、図のリンク先から取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/df780d72-8e12-11b1-ac28-1a3468feed01.png)
リンク先に飛んだら、本セクションで使用するコードをダウンロードします。


###Start Deploy
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/c28a4be7-d1b6-67f2-dc44-cdecae681bb1.png)
それでは実際に Lambda をデプロイし、試してみましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/137b514c-febc-1834-2eb0-1bd728c24db2.png)
AWS コンソール画面より Lambda を選択し「関数の作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/699ecf71-3e90-9822-d3ef-89a89b0cd6c1.png)
Serverless Application Repository を選択し、「 hello-world-python 」と入力。
関連するサンプルの Lambda アプリが表示されるので、選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/f1affe6e-92b0-0235-e3ea-dfd47c5bdf01.png)
任意のパラメータ名を入力したら、デプロイをクリックしましょう。
以上で、デプロイは完了です。

使わなくなった Lambda 関数は、「アクション」→「削除」で削除できます。

##おわりに
セクション1~3(part7)についての紹介は以上です。
次回は、セクション3(part8)~5 の内容について紹介していきます。
Sketchpacksのウィンドウ表示について

ワイヤーフレーム作成ツールとしてSketchを使用しており、そのプラグイン管理としてSketchpacksを利用しています。
しかし、Sketchpacksのウィンドウがすぐ閉じてしまい、DockにあるSketchpacksのアイコンをクリックしてもウィンドウが開かない現象が起きました。

解決するまでに少し時間がかかってしまったので、備忘として書きます。


# 起きた事象
【手順】
1. https://sketchpacks.com/ から、Sketchpacksをインストール
2. Sketchpacksを開く<img width="723" alt="スクリーンショット 2019-05-09 19.29.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248775/8e2ba5e7-2269-e6a4-170f-e3f5b7d316f0.png">
3. Chromeやデスクトップなど、他のウィンドウに遷移する
4. DockにあるSketchpacksのアイコンをクリックしてもウィンドウが開かなくなる・・・

どうやって再度Sketchpacksの画面を開けばいいのか・・・。
# Sketchpacksの画面の開き方
調べたら、以下情報を見つけました。
https://github.com/sketchpacks/bug-reports/issues/21

> When it launches, it runs in the background and ends up in the OS toolbar in the top right.

OSのtoolbarにあるということで確認したところ、Sketchpacksのアイコンがありました！
<img width="738" alt="スクリーンショット 2019-05-10 13.57.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248775/9a7615d6-69d2-9c2d-5ce4-93c40d18b4ee.png">

アプリケーションのアイコンではなく、OSのtoolbarにあるアイコンをクリックしないと表示されないみたいですね。

以上、終わり。
gulp 4 + Babel 7 導入

最新版の gulp (4.0.2) と Babel (7.4.4) と gulp-babel (8.0.0) を導入した備忘録

※gulpをglobal環境にインストールしたくなかったので少し我流になっています。

# 最も正しい導入の手順

公式のドキュメントに勝るものなし

gulp.jsのQuick Start
https://gulpjs.com/docs/en/getting-started/quick-start

gulp-babelのREADME.md
https://github.com/babel/gulp-babel

# 実際に行った導入手順

## 準備編

- nodeのインストール
- npm init

このときのバージョンは↓

```
$ node -v
v12.2.0
$ npm -v
6.9.0
```

## gulpのインストール

公式クイックスタートに書いてある`npm install -g gulp-cli`は省略（global汚したくないマン）

```
$ npm install --save-dev gulp
```

ローカルのgulpのバージョン見るときはnpx（npm 5.2.0から標準搭載）を使ってこう↓

```
$ npx gulp -v
CLI version: 2.2.0
Local version: 4.0.2
```

もしnpxが無い場合は下の好きな方で↓

```
$ $(npm bin)/gulp -v
$ ./node_modules/.bin/gulp -v
```

## Babelのインストール

ついでに[gulp-babel](https://github.com/babel/gulp-babel)もインストール

```
$ npm install --save-dev gulp-babel @babel/core @babel/preset-env
```

この時点で全体のバージョンは↓

```
$ npm list --depth=0
gb-test@1.0.0 /Users/semi/gb-test
├── @babel/core@7.4.4
├── @babel/preset-env@7.4.4
├── gulp@4.0.2
└── gulp-babel@8.0.0
```

## gulpの設定

gulpfile.jsを作成
srcディレクトリ内のjsファイルを全てbabelにトランスパイルしてもらって、distディレクトリに出力する設定にしました。

```JavaScript:gulpfile.js
const gulp = require('gulp');
const babel = require('gulp-babel');

gulp.task('babel', () => {
	return gulp.src('src/*.js')
		.pipe(babel({
			presets: ['@babel/preset-env']
		}))
        .pipe(gulp.dest('dist'));
});
```

（ほぼ[gulp-babelのドキュメント](https://github.com/babel/gulp-babel#usage)通りですが、5行目の`return`が無いとgulpに`Did you forget to signal async completion?`と煽られるので追加しています。）


## gulpの実行
この状態で`gulp babel`と実行してもglobalにgulp-cliをインストールしていないため怒られます。
そこでnpxを使ってローカルのgulpを呼びます。

```
$ npx gulp babel
```

でgulpfile.jsに書いた"babel"タスクを実行します。


## gulpの実行（npm scriptsから）

`npm run ~`の形でgulpを呼びたいときは

```json:package.json
...
  "scripts": {
    "gulp": "gulp"
  },
...
```

と書いておけば`npm run gulp`でローカルのgulpが呼び出せます。

```
$ npm run gulp babel
```

でgulpfile.jsに書いた"babel"タスクを実行します。


## おまけ：ファイルの変更を監視して自動でバベる
gulpfile.jsに以下を追記

```JavaScript:gulpfile.js
...
gulp.task('watch', () => {
    gulp.watch('src/*.js', gulp.series('babel'));
});
```

```
$ npx gulp watch
```

もしくは

```
$ npm run gulp watch
```

で監視を開始します。
kintoneにHEICファイルを添付させないためのJS

kintoneシステム管理の「JavaScript / CSSでカスタマイズ」に下記のJSを添付すればOKです。

```javascript
(function(){
    kintone.events.on("app.record.edit.show", function(event){
        document.querySelectorAll('.input-file-filelist-list-cybozu').forEach(function(fileInput){
            fileInput.addEventListener('DOMNodeInserted', function(e){
                var fileName = e.target.querySelector('.plupload_file_name').textContent;
                var delButton = e.target.querySelector('.plupload_file_action button');
                if (fileName.match(/.*\.HEIC$/i) != null) { // 拡張子がHEICを含む場合
                    alert('.HEICファイルはサポート対象外です。JPEGなどの画像データに変換してから添付して下さい');
                    setTimeout(function(){
                        delButton.click();
                    }, 500)
                    
                }
            });
        });
    });
})();
```
【Unity】初心者がインターフェースの使い方とZenjectを学ぶために利用したリンク集

[Unityにおける疎結合設計](https://www.slideshare.net/UnityTechnologiesJapan002/unite-2018-tokyounity-ui)

[インターフェース完全に理解した](https://niconare.nicovideo.jp/watch/kn3404)

[GetComponentを使うときはインターフェースを使おう](https://qiita.com/Akira_Kido_N/items/7cd18944173cd4cd7229)

[Unity開発で使える設計の話＋Zenjectの紹介](https://www.slideshare.net/torisoup/unityzenject)

[インタフェースの命名パターンから知るインタフェースの役割](https://qiita.com/muniel/items/669a82ef9cb336985bd8)

[Zenjectはいいぞ](https://notargs.hateblo.jp)

[2018/10/02 (Tue) キッズスター開発合宿 / CAFU v3 Zenject](https://www.youtube.com/watch?v=mO2BN6foSMg)

[Zenject入門その1　疎結合とDI Container](https://qiita.com/toRisouP/items/b3d3c43db40857ca4ad4)

[【Unity】Zenjectに学ぶDependency Injection](https://qiita.com/akihiro_0228/items/d6fe2bfea5306900624d)



[Zenject公式](https://github.com/modesttree/zenject)
[Zenject READMEの日本語訳](https://qiita.com/rookx/items/3510467a2b57d3e39bc1)
[ZenjectのCheatSheet日本語訳](https://qiita.com/Sansuusetto/items/5a12fbc48026d4ca0b9d)
[Extenject - Extensions and bug fixes to Zenject](https://github.com/svermeulen/Extenject#zenautoinjector)
【jquery】年月を取得して、今日の年月をURLに追加する

#【jquery】年月を取得して、今日の年月をURLに追加する
##まえがき
ヘッダー内に毎月更新するページ（毎月URLが変わる）があり、毎月リンクを手動で変えていたのでめんどくさくなった。
勉強中なのでまとめないと忘れるからまとめた。

##なにがしたい
```html:変えたい場所
<a href="/kirakira/huwahuwa_neko.html" id="headerMonth">毎月更新</a>
```
```html:こうなりたい（2019年5月）
<a href="/kirakira/huwahuwa_201905.html" id="headerMonth">毎月更新</a>
```
href="/kirakira/huwahuwa_**neko**.html" の
**neko**を、今日の**西暦**と**月( + 1桁なら前に0を追加)**にしたいの。

##こうなった

<p class="codepen" data-height="393" data-theme-id="dark" data-default-tab="js,result" data-user="sgtknoko" data-slug-hash="gyZjdV" style="height: 393px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="neko">
  <span>See the Pen <a href="https://codepen.io/sgtknoko/pen/gyZjdV/">
  neko</a> by sgtknoko (<a href="https://codepen.io/sgtknoko">@sgtknoko</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##おわり
初心者でよくわかっていないけど、これくらいならなんとかなるんだなと思いました。
jqueryに頼らずにやるにはどうしたらいいんだろう。
Emacsで編集中のPythonコードを実行

# 今書いているコードを動かしてみたい

愚直に`M-x shell`から起動してもいいけどちょっとめんどい。

# C-c C-c で実行

`C-c C-c`で編集中のコードを実行することができる。`M-x python-shell-send-buffer`と同じ意味らしい。

```:怒られた
Start a Python process first with ‘M-x run-python’ or ‘C-c C-p’.
```

先に`M-x run-python`か`C-c C-p`でPython起動しておけとのこと。
起動した状態で再度実行。

```python:test.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
print('あいう')
```

```:実行結果
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> \202\240\202\242\202\244
```

残念。結果が文字化けしてしまいますね。
CP932で返ってきているが、Emacsが別の文字コードで表示しようとしてしまっている模様。

# 文字化けを解消する

`C-x RET p`または`set-buffer-process-coding-system`で、outputの文字コードを`undecided-dos`に変更。inputは何も入力せずそのまま。

```:実行結果
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> あいう
```

毎回やるのも面倒なので、init.elに以下の記述を追加した。

```elisp:init.el
(setq default-process-coding-system '(undecided-dos . utf-8-unix))
```

# 参考

* [UTF-8 をベースとして利用するための設定 - NTEmacs @ ウィキ - アットウィキ](https://www49.atwiki.jp/ntemacs/pages/16.html)
matplotlibのAxesの枠線の太さを変える

# 例えば、x軸とy軸のみ表示する
![plot_out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341384/e94b85ce-f109-d960-9bd6-9a01f7254fcb.jpeg)

```python:axes_line_width.py
#!/usr/bin/env python3

import numpy as np
import matplotlib.pyplot as plt

# prepare test data
data=np.random.randn(1000)

# plot
fig=plt.figure(figsize=(5,2.5))
ax=fig.add_subplot(111)
ax.hist(data)  # histogram

axis=['top','bottom','left','right']
line_width=[0, 0.5, 0.5, 0]

for a,w in zip(axis, line_width):  # change axis width
    ax.spines[a].set_linewidth(w)

plt.savefig('plot_out.pdf')
```

# 環境
Ubuntu 18.04
Python 3.7.2
matplotlib 3.0.3
seaborn 0.9.0
numpy 1.15.4
Pythonでdictにkeyが存在するか確認したいとき ｀'key' in dic` と ｀dic.get('key')｀ではどちらが早いのか知りたい

# 概要
Pythonのdictにkeyがあるのか確認したいときがあります。

```python
if 'key' in dic:
    pass
```

```python
if dic.get('key') is not None:
    pass
```

あたりを思いつきました。
どちらが早いのか気になったので確認しました。

# 確認

## version
```
% python --version
Python 3.7.1
```

## 検証に使ったコード
```python:dict_has_key.py
import gc
import time

SIZE = 100000

dic = {}

##########################################
del dic
gc.collect()
dic = {}
for i in range(SIZE):
    dic[str(i)] = i

start = time.time()
for i in range(SIZE):
    dic.get('-1')
    dic.get('1')
elapsed_time = time.time() - start
print(f'"すでにあるdictにget": {elapsed_time:.6f}')

del dic
gc.collect()
dic = {}
for i in range(SIZE):
    dic[str(i)] = i

start = time.time()
for i in range(SIZE):
    '-1' in dic
    '1' in dic
elapsed_time = time.time() - start
print(f'"すでにあるdictに in": {elapsed_time:.6f}')

##########################################
del dic
gc.collect()
dic = {}
start = time.time()
for i in range(SIZE):
    dic[str(i)] = i
    dic.get('-1')
    dic.get('1')
elapsed_time = time.time() - start
print(f'"dictに追加しながらget": {elapsed_time:.6f}')

del dic
gc.collect()
dic = {}
start = time.time()
for i in range(SIZE):
    dic[str(i)] = i
    '-1' in dic
    '1' in dic
elapsed_time = time.time() - start
print(f'"dictに追加しながら in": {elapsed_time:.6f}')
```

## 結果

```
% repeat 3 (python ./dict_has_key.py; echo)
"すでにあるdictにget": 0.011132
"すでにあるdictに in": 0.007007
"dictに追加しながらget": 0.040769
"dictに追加しながら in": 0.040812

"すでにあるdictにget": 0.013944
"すでにあるdictに in": 0.009472
"dictに追加しながらget": 0.042927
"dictに追加しながら in": 0.040673

"すでにあるdictにget": 0.010466
"すでにあるdictに in": 0.007062
"dictに追加しながらget": 0.045189
"dictに追加しながら in": 0.037023
```

# まとめ
inの方が早い雰囲気はあるが、dictに追加しながらだとそれほど差がないようす
【Nuxt.js】create-nuxt-appする際、element-uiを追加すると出るreference errorの対処法

Nuxt.jsの新しいプロジェクトを立ち上げる際、UIフレームワークのelement-uiを追加し、`create-nuxt-app`のコマンドを使って行ったのですが、サーバの立ち上げでエラーが発生してしまったのでその対処法を書いておきます。

# create-nuxt-appでプロジェクトを立ち上げる
普段通り`create-nuxt-app`でプロジェクトを立ち上げ、いくつかの質問に答えていきます。

```
$ create-nuxt-app <your-project-name>
```

しばらくすると、インストールが完了し、サーバの起動が促されます。

```
To get started: 

$ cd your-nuxt-app 
$ yarn dev
```

指示されるようにコマンドを叩くと、いつものようにNuxtのトップページが表示されるはずです。

# しかし、サーバが正常に起動しないエラーが発生

ところが、今回同様に実行したところ、サーバが正常に起動しないエラーが発生しました。`HTMLElement is not defined`というreference errorが発生した模様です。

![Screen Shot 2019-05-10 at 14.14.36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117354/52a96a9b-fe4d-a27e-7808-2269365920c6.jpeg)

## 原因はelement-ui.common.js内の記述にあった

調べてみると、原因は/node-modules/element-ui/lib/element-ui.common.jsの記述にありました。どうやらこのpropsで渡されている、`scrollContainer`に問題があるとのこと。

```element-ui.common.js
props: {
    src: String,
    fit: String,
    lazy: Boolean,
    scrollContainer: [String, HTMLElement], //この記述が問題
    alt: String
  },
```

実はこれ、以下のissueでelement ui側ですでに解決しているようです。
https://github.com/ElemeFE/element/pull/15277

ということで、プルリクにあるように、以下のようにelement-ui.common.jsの記述に修正を加えました。

```element-ui.common.js
-     scrollContainer: [String, HTMLElement],
+     scrollContainer: {},
```

すると、無事サーバば正常に起動し、いつものNuxt.jsの画面が表示されました。

![Screen Shot 2019-05-10 at 14.20.33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117354/8b962548-1b64-4aa4-bbd4-931831f4516e.jpeg)

めでたしめでたし。

# 参考
https://cmty.app/nuxt/nuxt.js/issues/c9129
https://github.com/ElemeFE/element/pull/15277/commits/8f87eeeabcb3bf8599d50b9c5a3b112197894b4b
iOS Safariのデバッグに使用するMac SafariのWebインスペクタが表示されない

:::note info
2021.09.26追記
通常Safariでも機能するようになっていました。
まだ使っていないですがiOS15 Safariから拡張機能が追加できるようになり、拡張機能Web Inspectorを追加することで実機のみでの確認もできるようです。
:::

iOS12.2から機能しなくなった模様。
[Safari Technology Preview](https://developer.apple.com/safari/technology-preview/) (Safariの開発プレビュー版)を使えば表示されました。


参考:
https://twitter.com/terrymorse/status/1112827848660705280
【python初学者向け】さくっとMicrosoft Azure Notebooks上でpython書いてみた


# はじめに
Microsoft Azure Notebooks上でのJupyter Notebookの起動が、想像以上に簡単だったので手順をメモしておきます。

# 対象者
- python初学者
    - オンラインで学習中
    - Anacondaより簡単に環境設定を済ませたい
    - 環境設定で挫折した
-  初学者にpythonの学習環境を用意しようとしている人
-  Microsoft Azure Notebookって何？という人

# ゴール
Azure Notebookを立ち上げ、コードセルに足し算を記述、実行できる。


# Microsoft Azure Notebooksとは？
Microsoftが提供しているクラウドサービスであるAzure上でpythonを実行できる、Jupyter Notebookライクなサービスです。
[Azure Notebooks](https://docs.microsoft.com/ja-jp/azure/notebooks/azure-notebooks-overview)


# 実行環境
- Windows 10
- Microsoftアカウント サインイン済
    - ※アカウント未作成の方は、まず[こちら](https://account.microsoft.com/account?lang=ja-jp)から設定を。

# 手順

1. 検索サービスでAzure Notebooksで検索、Microsoft Azure Notebooksをクリック
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/eb6d8974-c61a-a810-16df-564e96326899.png)

2．日本語の案内に従った後、下記画面でSign Inをクリック
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/4542d0d4-50bc-63a8-d842-413dd5877731.png)

3．create one now?をクリック
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/b1ac5407-dbe5-8de7-6323-ade9f555a6dd.png)

4．Project Nameを入力、Createをクリック
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/b3c303f7-1c4f-d4b8-2452-33d733b70457.png)

5．左上の＋Newタブから、Notebookをクリック
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/11a33b59-58d3-6182-8151-fd56ba51e5f5.png)

6．Notebook Nameを入力、Pythonのバージョンを選択、Createをクリック
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/6f55d75e-5c56-a801-407b-070f51744510.png)

7．作成したNotebookをクリック
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/08c8949d-84ab-8e40-ee29-858ec932c4e8.png)

8. 完成！
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/f5498813-b3c9-1ab0-a193-57daece2caf7.png)

9. 足し算できる！
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/399a3bc5-f4ec-61b4-ffed-53f160d981dc.png)

# まとめ
Microsoftアカウントの設定が済んでいれば、たったこれだけのステップで環境が立ち上がります。
簡単なのでぜひお試しを！
Rails ターミナル操作一覧

ターミナル操作を一覧する
初なので見易さは特に重視していない。

■DBを作成したい時

rails g model テーブル名(単数形)
→モデルファイルが作成される
→ファイルを編集して、カラムを追加する

rake db:migrate
→DBができる

rails g migration 


これから知識が増えるとともに更新します
ipython /  django-admin shell  / manage.py shell などで対話モードのコマンド入力履歴を表示する  ( #python #django tips )

# Answer

```
sqlite3 ~/.ipython/profile_default/history.sqlite --batch 'SELECT source_raw FROM history'
```

( django shell の場合は ipython を使う設定になっている場合  )

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
sortした辞書型を、辞書型に戻す方法

# はじめに
辞書型をソートした場合としなかった場合で関数の戻り値の型が変わってしまうという問題に当たったのでその解決策を書いておきます。

＊この記事は、python3.6の環境なので辞書型の順序が保持されない事により想定する挙動の保証ができません。順序付き辞書は、python3.7以降から機能として実装されているのでそちらをお使いください。よってこの記事は、辞書型の順序の有無を確認してプログラムを行うべきという教訓になる記事として読んでください。＊

# 解決策
Python 3.6.1

```python:dic_sort.py
#PEP8に準拠
dic = {'A': 50, 'B': 20, 'C': 80, 'D': 10, 'E': 100}
list = sorted(dic.items(), key=lambda x: x[1], reverse=True)
dic.clear()
dic.update(list)

print(list)
print(dic)
```
結果

```terminal:terminal
[('E', 100), ('C', 80), ('A', 50), ('B', 20), ('D', 10)]
{'E': 100, 'C': 80, 'A': 50, 'B': 20, 'D': 10}
```

# 解説
updateメソッドは(key,value)のリストを引数にできるので、dicをソートした戻り値が入っている変数listをclearされたdicに追加することでソートされた順のまま辞書型に戻すことができました。
注意点としては、(key,value)のリストを追加してもソートされた順が反映されるわけではありませんので、clearを行う必要があります。

# 参考にさせていただいたサイト
note.nkmk.me https://note.nkmk.me/python-dict-add-update/
お世話になったサイトをまとめました - PHP

進級制作にてお世話になったサイトを用途に合わせてまとめました

---

PHP 編

---

##１．用途別参考サイト

### 1-1 配列を作成、操作したい
#### [PHPで配列（array）を使う方法【初心者向け】| TechAcademyマガジン](https://techacademy.jp/magazine/4915)
#### [[PHP] 配列・連想配列の初期化、結合、追加](https://qiita.com/shuntaro_tamura/items/784cfd61f355516dfff0)

### 1-2 全角文字 ⇔ 半角文字 をしたい
#### [全角数字を半角数字に変換・全角ハイフンも…[php]](http://kreisel.fam.cx/webmaster/clog/2013-08-29-1.html)

### 1-3 文字列の一部分を取得したい
#### [文字列の一部分を取得 - substr()、mb_substr()](https://webkaru.net/php/function-substr/)

### 1-4 文字を指定した文字数目に挿入したい
#### [特定文字を指定文字数目に挿入したい](https://qiita.com/kure/items/710142e03088123cb56e)

### 1-5 日時曜日を取得、操作したい
#### [PHPで日付関数を使いこなす（date, strtotime）](https://qiita.com/shuntaro_tamura/items/b7908e6db527e1543837)
#### [phpで現在日時を取得する方法！｜CodeCampus](https://blog.codecamp.jp/php-datetime)
#### [指定日の日付を取得 date() strtotime() mktime() PHPサンプルコード](https://wepicks.net/phpsample-date-targetday/)
#### [【PHP】指定時間前や指定時間後の日時を求める - ysklog](http://ysklog.net/php/2094.html)
#### [【PHP入門】dateで曜日を取得する方法](https://www.sejuku.net/blog/21382#i-3)
#### [PHPでの日付取得方法！ 詳細まとめました](https://eng-entrance.com/php-date)

### 1-6 文字列(数列)を日付に変換したい
#### [PHP で文字列（数列）を日付に変換する方法 - by Takumi Hirashima](https://hirashimatakumi.com/blog/3689.html)

### 1-7 変数の型を知りたい
#### [ＰＨＰリファレンス(gettype())](http://www.php-ref.com/basic/04_gettype.html)

### 1-8 会員登録機能を作りたい
#### [新規会員登録機能を作成する（3/3）[メール認証][本登録]](https://noumenon-th.net/programming/2016/02/28/registration3/)

### 1-9 パスワードを暗号化、複合したい
#### [パスワードのハッシュ化～PHP|IT工房｜Webデザイン入門](https://itstudio.co/2015/02/02/3531/)
#### [PHP: password_verify - Manual](http://php.net/manual/ja/function.password-verify.php)

### 1-10 トークンを使いたい
#### [クロスサイトリクエストフォージェリ（CSRF）[トークン]](https://noumenon-th.net/programming/2016/02/03/csrf/)

### 1-11 ページ数を表示させたい
#### [PHPでページング処理を行う方法とは【メンターが回答】| TechAcademyマガジン](https://techacademy.jp/magazine/18333)

### 1-12 ディレクトリがあるか判定したい
#### [PHP: file_exists - Manual](http://php.net/manual/ja/function.file-exists.php)

### 1-13 PHP ⇒ jQuery 値を受け渡したい
#### [PHPからjQueryに値を渡す](https://wiki.rookie-inc.com/development/language/php/tips/pass-arg-php2jquery)

## ２．基本的なことでお世話になったサイト

#### 2-1 [PHP - PHPの条件式　if elseif 以上以下の指定ができません](https://teratail.com/questions/115401)
#### 2-2 [PHPのswitch文による条件分岐を使いこなす方法](https://www.flatflag.nir87.com/switch-622)
#### 2-3 [foreach文でキーと値を取り出す - 繰り返し処理 - PHP入門](https://www.javadrive.jp/php/for/index9.html)
#### 2-4 [エスケープシーケンス - 文字列 - PHP入門](https://www.javadrive.jp/php/string/index4.html)
#### 2-5 [【PHP】PHP_EOL - Qiita](https://qiita.com/kazu56/items/bc77582313918fe2a3b1)

---

end
vim 操作, 設定メモ

##vim option
```root/.vimrc
set number // 行を表示
set tabstop=4 // タブの空白数
set hidden // :b,:eでバッファ移動をできるようになる
set fileencoding=utf-8 // 書き込みエンコーディングをutf-8に変更
set fileencodings=utf-8 // 読み込みエンコーディングをutf-8に変更
set noswapfile // .swpを生成しなくなる
set cursorline // カーソルがある行に下線を引いてくれる。見やすくて良い
set hlsearch // 検索文字に色づけしてくれる

inoremap { {}<Left> // {を入力したとき}を補完
inoremap {<Enter> {}<Left><CR><ESC><S-o> // {+改行 の時便利
inoremap S<Enter> System.out.println(""); // S+EnterでSystem~~~が保管。便利。

syntax on // いい感じに文字に色づけしてくれる。
```

##vim normal mode
```
: // command mode
i // insertion mode
v // visual mode
dd // 一行カット
yy // 一行コピーする
p // 貼り付け
u // undo
ctrl+r // redo
```
##vim command mode
```
b index // indexのバッファに移動
ls // バッファのリストを確認
e filename // 新しいファイルを開く
split(sp) filename// 縦に分割してファイルを開く
w(!)// 上書き
q(!)// 終了 
!shellcommand // shellcomannd を実行
set enc? // エンコーディングを確認


//操作イメージ
:split newfile.txt
```

##vim insertion mode
```
esc // normal mode
Ctrl+n // 入力途中でやると候補補完してくれる。
```

##vim visual mode
```
↑ ↓ → ← // 各方向に範囲を広げる
d // 指定範囲をカット
y // 指定範囲をコピー(ヤンク)
v // normal mode
```
Windowsでデスクトップアイコンを表示しない

デスクトップ右クリック→表示(V)→デスクトップアイコンの表示
で、デスクトップアイコンを消す(非表示)ことができる。

自分のPCをスクリーンで表示しなければならないときに、
一気に掃除できて便利(笑)。
macでEclipseのPackage Explorerの開き方



##step1:   Window-> Show View -> other

![スクリーンショット 2019-05-10 13.05.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181748/52c8ed09-d3b4-0e26-95cc-6c9e51917800.png)


##step2:   Java-> Package Explorer

![スクリーンショット 2019-05-10 13.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181748/2dda8490-17aa-13c4-f9ba-eae0af45227d.png)
#python のインタラクティブモードでのコマンド履歴を全て表示する ( readline )

# Answer

`$ cat ~/.python_history`

# or

`$ python`

```
import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))
```

[how do you see the entire command history in interactive python? - Stack Overflow](https://stackoverflow.com/questions/6558765/how-do-you-see-the-entire-command-history-in-interactive-python)


# ipython

```
$ sqlite3 ~/.ipython/profile_default/history.sqlite --batch 'SELECT source_raw FROM history'
```

インタラクティブモード内でマジックコマンドも利用可能


```
%history
```

```
%history -g
```


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Cloudformationで Error occurred while GetObject. S3 Error Code: NoSuchKey のエラー

# エラー内容

```bash
Error occurred while GetObject. S3 Error Code: NoSuchKey. S3 Error Message: The specified key does not exist. (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: f03b3b04-72c8-11e9-92ee-3de9176356be)
```

# 原因
**[条件関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)の記述が間違っていた。**


## 正

```bash
IsProductionOrStaging: !Or [!Equals [!Ref AlisAppId, "production"], !Equals [!Ref AlisAppId, "staging"]]
```

## 誤

```bash
IsProductionOrStaging: !Or [{!Ref AlisAppId, "production"}, {!Ref AlisAppId, "staging"}]
```

# 所感
このエラーからは原因がさっぱりわかりませんねぇ..。
51歳からのプログラム　備忘録　Data missing toArray()

**Data missing**

```php
$user=User::where('id',1)->first();
$user_array=$user->toArray();
```
`$user_array=$user->toArray()`　のように、モデルを配列に置き換えた時に、`Data missing`エラーが出た。

色々と試したり確認していたら、users_tableの、`created_at`と`updated_at`のデータを削除してしまっていたことが原因のよう。

created_atやupdated_atのデータがないと、toArray()できないのかな？
とりあえず、備忘として。
SSH 接続期限切れしないようにサーバ設定

#SSH サーバーのconfigファイルを開く

```
vi /etc/ssh/sshd_config
```

#下記２行をコメントアウト　ない場合は追加

```
ClientAliveInterval 60
ClientAliveCountMax 3
```

`ClientAliveInterval`はサーバーがクライアントに向かって つながっているか確かめるメッセージを送って それがタイムアウトになる時間を秒数で設定します。デフォルトは0で、0だとメッセージを送りません。

`ClientAliveCountMax`は、タイムアウトになった際に試してみる回数です。 3であれば、ClientAliveIntervalが60の場合、 合計で60x3の180秒待つことになります。 デフォルトは3です。

# 設定しましたらSSHサーバー再起動

### CentOS7の場合は
`systemctl restart sshd.service`

### CentOS6の場合は
`service sshd restart`
docker-compose up -dをしたら Cannot start service (xxx): driver failed programming external connectivity on endpoint (xxx) というエラーが出てnginxが起動しない時の対処法

新規プロジェクトの開発にあたりdockerで環境構築する際に```docker-compose up -d```をしたら下記エラーが出てnginxが立ち上がりませんでした。

```
WARNING: Image for service nginx was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating redis ... done
Creating mysql ... done
Creating app   ... done
Creating nginx ... error
ERROR: for nginx  Cannot start service nginx: driver failed programming external connectivity on endpoint nginx 
(xxxxx): Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE)
```

エラーの原因はエラーメッセージの通りで、port80ですでにコンテナが起動しているからです。

Macでは、デフォルトでApacheが入っていてそれがPort80で立ち上がってるらしく、それを止めることで解決します。

```$ sudo lsof -i -P | grep "LISTEN"```

私の場合は下記のように出ました。

```
Password:
httpd        99           root    4u  IPv6 0x4405ecbd1691af79      0t0    TCP *:80 (LISTEN)
cupsd       244           root    7u  IPv6 0x4405ecbd1691a9b9      0t0    TCP *:631 (LISTEN)
cupsd       244           root    8u  IPv4 0x4405ecbd143300b9      0t0    TCP *:631 (LISTEN)
httpd       340           _www    4u  IPv6 0x4405ecbd1691af79      0t0    TCP *:80 (LISTEN)
Sketch      364           RURI    6u  IPv4 0x4405ecbd14331d39      0t0    TCP *:49155 (LISTEN)
Sketch      364           RURI   18u  IPv6 0x4405ecbd1691a3f9      0t0    TCP *:49155 (LISTEN)
plugin_ho   612           RURI   36u  IPv4 0x4405ecbd2004e6b9      0t0    TCP localhost:54000 (LISTEN)
Adobe\x20   953           RURI   12u  IPv4 0x4405ecbd2412c6b9      0t0    TCP localhost:15292 (LISTEN)
node      70724           RURI   23u  IPv6 0x4405ecbd31e3b2b9      0t0    TCP *:8081 (LISTEN)
Dropbox   71694           RURI  130u  IPv6 0x4405ecbd3045baf9      0t0    TCP *:17500 (LISTEN)
Dropbox   71694           RURI  132u  IPv4 0x4405ecbd32fa7a39      0t0    TCP *:17500 (LISTEN)
Dropbox   71694           RURI  162u  IPv4 0x4405ecbd32d7ea39      0t0    TCP localhost:17600 (LISTEN)
Dropbox   71694           RURI  166u  IPv4 0x4405ecbd32cf10b9      0t0    TCP localhost:17603 (LISTEN)
com.docke 74463           RURI   18u  IPv4 0x4405ecbd2fc140b9      0t0    TCP *:16379 (LISTEN)
com.docke 74463           RURI   20u  IPv4 0x4405ecbd33662a39      0t0    TCP *:8080 (LISTEN)
com.docke 74463           RURI   21u  IPv6 0x4405ecbd3045c0b9      0t0    TCP localhost:8080 (LISTEN)
com.docke 74463           RURI   24u  IPv6 0x4405ecbd1691c0b9      0t0    TCP localhost:16379 (LISTEN)
com.docke 74463           RURI   25u  IPv4 0x4405ecbd336b06b9      0t0    TCP *:3306 (LISTEN)
com.docke 74463           RURI   26u  IPv6 0x4405ecbd1691b539      0t0    TCP localhost:3306 (LISTEN)
```

httpdがport80を使ってしまっているので、Macで起動しているApacheを止めましょう。

```$ sudo apachectl stop
```

これで再度
```docker-compose up -d```をしたらnginxが起動しました。

```
redis is up-to-date
mysql is up-to-date
app is up-to-date
Starting nginx ... done
```
docker-compose up -d をしたらport is already allocatedのエラーが出た

```$ docker-compose up -d ```
をしたら port is already allocated と出ました。

```
Starting mysql ... 
Starting redis ... error

ERROR: for redis  Cannot start service redis: driver failed programming external coStarting mysql ... error
006): Bind for 0.0.0.0:16379 failed: port is already allocated

ERROR: for mysql  Cannot start service mysql: driver failed programming external connectivity on endpoint mysql (xxxxxxxxx): Bind for 0.0.0.0:3306 failed: port is already allocated
```

つまりもうそのportは割り振っているというエラーです。

私の場合は```3306```と```16379```なので、まず最初に
```$ sudo lsof -i:3306```を実行します。

```
COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 74463 RURI   24u  IPv4 0x4405ecbd32cc16b9      0t0  TCP *:mysql (LISTEN)
com.docke 74463 RURI   25u  IPv6 0x4405ecbd32387879      0t0  TCP localhost:mysql (LISTEN)
```
と出てくるので```74463```をkillします。

```$ sudo kill 74463```



同様に```16379```も実行します。


再度```docker-compose up -d```を実行すると解決します。

```
Starting mysql ... done
Starting redis ... done
Creating app   ... done
Creating nginx ... done
```
追加で記述したcssがherokuで反映されない場合の解決　５時間ハマりました

bootstrap3のデザインに追加するために`style.css`を記述したのですが、それがherokuに反映されなかった。

そこで、調べてみると、
`rails assets:precompile RAILS_ENV=production`
をコンソール上で打ち込めば解決するとあったが、


```
Gem::LoadError: Specified 'postgresql' for database adapter, but the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).
```


```
Gem::LoadError: pg is not part of the bundle. Add it to your Gemfile.
```

というエラーが出て５時間ググっても解決できずハマりました。

しかし、１晩寝てから　
`rails assets:precompile`
と「RAILS_ENV=production」を省いてコンソールで打ち込むと無事解決しました^^



追記：heroku上のドロップダウンメニューが表示されない問題が残っていることが判明しました。
やはり、上記の`rails assets:precompile RAILS_ENV=production`のエラーを解決する必要があるのかもしれません、、、
TWA(Trusted Web Activity) で任意のページを表示させる

# はじめに
TWA ではアプリ起動時に表示するページを AndroidManifest.xml に定義します。
まあだいたいトップページを指定していると思います。

ふつーに起動した場合にはソレで問題ないのですが、たとえばプッシュ通知からアプリを起動した場合には別のページ（キャンペーンページとか）を表示したい、なんていう要望が必ず出てきます。

そんなときの対応方法メモです。

TWA の詳しい実装方法などは [コチラ](https://qiita.com/zprodev/items/181c1c8f19bc0beb1183#3-%E3%82%A2%E3%83%97%E3%83%AA%E5%81%B4%E3%81%AEtwa%E8%A8%AD%E5%AE%9A) がわかりやすいです。

# 環境
macOS High Sierra - 10.13.6
Android Studio - 3.4

# 方法

とても簡単です。

#### LauncherActivity を継承したクラスを作成します

```kotlin:MainActivity.kt
class MainActivity : LauncherActivity() {
}
```

#### getLaunchingUrl() をオーバーライドします

```kotlin:MainActivity.kt
class MainActivity : LauncherActivity() {
    override fun getLaunchingUrl(): Uri {
        return super.getLaunchingUrl()
    }
}
```

#### intent から URL を受け取れるようにし、URL が渡されていた場合はそちらを return するようにします

```kotlin:MainActivity.kt
class MainActivity : LauncherActivity() {
    companion object {
        val EXTRA_PARAM_URL = "url"
    }

    override fun getLaunchingUrl(): Uri {
        val url = intent.getStringExtra(EXTRA_PARAM_URL)
        if (url != null) {
            return Uri.parse(url)
        }
        return super.getLaunchingUrl()
    }
}
```

以上で任意のページを表示させる準備が整いました。

あとはプッシュのパラメータから取得した URL を PendingIntent にセットすれば完了です。

```kotlin:MyFirebaseMessagingService.kt
class MyFirebaseMessagingService : FirebaseMessagingService() {
    ...
    override fun onMessageReceived(remoteMessage: RemoteMessage?) {
        if (remoteMessage != null) {
            ...
            val notifyIntent = Intent(context, MainActivity::class.java)
            notifyIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
            notifyIntent.putExtras(intent)
                .putExtra(MainActivity.EXTRA_PARAM_URL, [プッシュから取得したURL])
            val requestId = System.currentTimeMillis().toInt()
            val pendingIntent = PendingIntent.getActivity(context, requestId, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT)
            ...
        }
    }
}
```

# 参考
[【実践】Google Play Store でPWA配信 (TWA)](https://qiita.com/zprodev/items/181c1c8f19bc0beb1183#3-%E3%82%A2%E3%83%97%E3%83%AA%E5%81%B4%E3%81%AEtwa%E8%A8%AD%E5%AE%9A)
[TWAの挙動をPWAに寄せていく（起動編）](https://qiita.com/zprodev/items/747d875b2f290eb76ecd)