OmniAICreator/Qiita-1.07M huggingface dataset:
IFTTTのリッチ通知から任意のiOSショートカットを起動する

# はじめに

iOSのショートカットは、ショートカットのURLスキームを使って外部から任意のショートカットを起動することができます。
ここでは、リッチ通知から任意のショートカットを起動する方法について説明します。

# 前提

* iOSショートカットアプリが必要です。
    * また、通知から起動する任意のショートカットを事前に作成する必要があります。
* IFTTTから通知を受信するために、IFTTTアプリのインストールが必要です。

# ショートカットのURLスキームの仕様

[URLスキームを使用してショートカットを実行する](https://support.apple.com/ja-jp/guide/shortcuts/apd624386f42/ios)のドキュメントに記載されていますが、以下のURLスキームを開くことで任意のショートカットを起動することができます。


```
shortcuts://run-shortcut?name=Make%20PDF&input=text&text=soup
```

nameにショートカット名を指定するのですが、URLエンコードが必要です。
また、inputパラメータの値にtextを指定することで、textパラメータの値をショートカットに渡すことができます。
その他、inputパラメータの値にclipboardを指定することもできますが、詳しくは上記のドキュメントをご参照ください。
ただし、ここでは、inputパラメータやtextパラメータの指定はなしで説明します。

# IFTTT側のリッチ通知の設定

ここでは、IFTTTのアクションの作り方については詳しく説明しません。他の記事をご参照ください。

まずは、IFTTTの```This```のアクションは適当にWebhooksなどを指定します。
次に、```That```ですが、```Notifications```を選択後、```Send a rich notification from the IFTTT app```を選択します。

選択後、通知で表示するタイトルやメッセージ内容を適当に設定します。
ここで重要な項目は```Link URL```です。
この項目に起動したいショートカットのURLスキームを指定します。

例えば、```天気```という名称のショートカットを起動する場合は、

```
shortcuts://run-shortcut?name=%E5%A4%A9%E6%B0%97
```

を```Link URL```に指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110575/4e9194af-49d4-1031-6ff1-d7cc79f780a6.png)


上記を設定後、Saveボタンを押下したら完了です。



# リッチ通知からのショートカットの起動

通知を受信したら自動でショートカットが起動されてほしいとも思うかもしれませんが、残念ながら（セキュリティ上）自動でショートカットは起動されません。
ショートカットを起動するには、受信した通知をタップする必要があります。
通知をタップ後に、URLスキームで指定した名称のショートカットが起動します。


# おわりに

ショートカット自体は、通知を実際にタップしないと起動されないため、若干煩わしいですね。
また、リッチ通知からショートカット起動して何がうれしいのかはまだよく分かっておりませんが、アイデア次第で色々活用方法はあるのではないでしょうか。
例えば、技術本の新刊情報を通知で知らせて、通知をタップしたらAmazonの購入サイトに遷移すると良いかなとも思います。
今後良い活用方法を模索したいと思います。
WindowsユーザーがMacを使いこなす方法まとめ（基本操作編）

# はじめに
WindowsユーザーがMacを使いやすくするために変更した設定や操作方法などのメモ

まずはキーボードやウィンドウなどの基本操作のまとめ


環境

+ Windows 10
+ Mac 10.15.2 Catalina

# キーボードの設定
## ショートカットキーを押しやすくする設定
__使い慣れたCtrlの位置をCommandに変えたい！__
1. アップルメニュー → 「システム環境設定」 をクリック
2. 「キーボード」 → 「修飾キー」 をクリック
3. 以下の図のように割り当てを変更する
CapsLockキーをCommandに割り当て、CommandキーをCapsLockに設定を変更する
<img width="413" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264248/c2413ae7-b052-2c1c-5eb6-bdd0566fadf7.png">


## 日本語入力中に英字を入力する設定
__日本語入力中にShiftを押しながらアルファベットの半角英字を入力したい！__
1. アップルメニュー → 「システム環境設定」 をクリック
2. 「入力ソース」 をクリック
3. 「Windows風のキー操作」をチェックON
この設定をすることで「Shiftキーの動作」が「英字モードに入る」に固定される。
他にどんな操作がWindows風になるのかは不明。
＃などの記号はShift+＃でも半角にならない…

## ファンクションキーの特殊機能とFnを入れ替える設定
__デスクトップ表示するための Fn+F11 のファンクションキーを省略したい！__
1. アップルメニュー → 「システム環境設定」 をクリック
2. 「キーボード」 をクリック
3. 「F1、F2などのキーを標準のファンクションキーとして使用」をチェックON

# キーボードショートカットの対応表
やりたいこと | Windows | Mac
|---|---|---|
エクスプローラ（Finder）表示|Win+E|⌘+Alt+Space（検索）
開いているウィンドウを閉じる|Alt+Space → x|⌘+w
アプリを閉じる|Alt+F4|⌘+q
開いているウィンドウ一覧表示|Windows+Tab|F3(※1) or [Multi\-Touch ジェスチャ](#リンク)
デスクトップ表示|Windows+D|Fn+F11(※1) or [Multi\-Touch ジェスチャ](#リンク)
画面スクリーンショット（キャプチャー）|PrintScreen|Command+Shift+4 → 矩形選択 → デスクトップに画像が自動保存
絵文字を入力||⌘+Ctrl+Space
⌘ を入力||"コマンド"と打って変換

※1:[Fnキー入れ替え設定](#ファンクションキーの特殊機能とfnを入れ替える設定)している場合は逆になります
（例）F3 なら Fn+F3の同時押し、Fn+F11 なら F11のみ

# ウィンドウ操作の対応表
やりたいこと| Windows | Mac
|---|---|---|
２つのウィンドウを並べて表示|ウィンドウを画面端にD&D|緑色のボタンを長押し <br> <img width="65" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264248/8277714f-848c-de5c-942f-fa6389ab834f.png"><img width="250" alt="スクリーンショット 2020-02-01 13.01.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264248/49d9fe40-6d56-0d0a-c8bc-d8b4f5f461e8.png">


# おわりに
操作に悩んだら随時追加していきます。
おすすめがあったらぜひ教えてください。

# リンク
- [Mac のキーボードショートカット \- Apple サポート](https://support.apple.com/ja-jp/HT201236)
- [Mac で Multi\-Touch ジェスチャを使う \- Apple サポート](https://support.apple.com/ja-jp/HT204895)
【未経験エンジニア2日目(復習①)】URLの.htmlの削除

# URLの.htmlの削除

## やったこと
・URLの.htmlの削除

## 学んだこと
###hraccessの存在
###RewriteRule
　ディレクトリー内のURLを正規表現を用いて定義をすることができる
###RewriteCond
　RewriteRuleの条件を絞るこむために記載される（RewriteRuleの直前に記載される）　

## 実際のコード


```.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
```

参考サイト

<a href="https://webjo.jp/notes-hide/">.phpや.htmlなどの拡張子をURL表示させない方法</a>
<a href="http://www-creators.com/archives/248">.htaccess でのリダイレクト(転送)設定の書き方</a>
bash ブレース展開

## ブレース展開
- {}でくくった部分の任意の英数文字を生成する。
- 階層が深い場合のファイル操作とかに便利。


### ファイル一括作成
```bash
$ touch test{1..5}　　 #ファイル一括作成
$ ls
test1	test2	test3	test4	test5

$ rm -rf test{1..5}   #ファイル一括削除
$ ls
```

##ファイル名変更

```bash
$ ls
test.dat
$ mv test{.dat,.log} #mv test.dat test.log
$ ls
test.log

#階層が深いときのバックアップ退避
$ cp foo/bar/hoge{,.bk}
```
Windows10 Homeクリーンインストール　～Docker事始め～

#はじめに
環境構築のメモ。
Windowsクリーンインストール~Docker-composeまで。

##環境
- Windows10 Home 64bit

##準備
[このサイト](https://www.microsoft.com/ja-jp/software-download/windows10)からMediaCreationToolをダウンロードしてUSBメモリ等に焼く。
SDカードでも可。

#セットアップ
HDDの領域をすべて削除して統合する。
ユーザフォルダ名を指定したいので、ローカルアカウントを作成する。
Windows Insider ProgramをSlowに設定する。(2020/1/7現在 OSビルド19041.1)

#Chocolately
アプリケーションを一括管理したいのでChocolatelyを使用する。

- Chocolatelyのインストール

```powershell:PowerShell
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

- アプリケーションの一括インストール

```powershell:PowerShell
cinst -y vscode adobereader chrome-remote-desktop-chrome sakuraeditor musicbee steam spotify itunes discord skype git mp3tag winmerge mpc-be eac
```

#WSL2
- WSLの有効化

```powershell:PowerShell
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

- Ubuntu 18.04 LTSインストール

- WSL→WSL2への変換

```powershell:PowerShell
wsl --set-version Ubuntu 2
wsl --set-default-version 2

wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

#DockerCE
- 依存関係のパッケージをインストール

```bash:Ubuntu
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
```

- GPGキーのダウンロード

```bash:Ubuntu
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

- Repositoryの設定

```bash:Ubuntu
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
```

- DockerCEのインストール

```bash:Ubuntu
$ sudo apt-get update
$ sudo apt-get install -y docker-ce docker-ce-cli containerd.io
```

- Dockerの起動

```bash:Ubuntu
$ sudo service docker start
$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.
.
.
.
For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

#Docker-composeのインストール

```bash:Ubuntu
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version

docker-compose version 1.25.1, build a82fef07
```
Q2.A1セルにHello Worldと書き込むには？

Q1ではExcelVBAの始め方を取り扱いました。(開発タブを表示して、VBEを開くまで)
Q2ではあるセルに文字列を書き込むマクロを作ってみます。

今回はプログラミングにおけるはじめの一歩のド定番である
Hello Worldを書き込むことにします。
書き込むセルはA1セルと指定します。


早速ですが、VBEを立ち上げてモジュールを以下のように追加しましょう。


![Q2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/a53f88eb-9193-cf6c-5b01-dafbad2c9534.png)


この追加したモジュールの中にコードを書き込んでいきます。










以下のように書き込んでみましょう。


![Q2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/f4600a17-268e-3122-2908-7e2fd6c65244.png)


Sub マクロ名()　～　End　Subまでがひとつのマクロとなります。
マクロ名は基本的には何でも構いません。わかりやすい名前を付けてみましょう。
(この記事はQ2なのに、Q1になってたり、アンサーのスペル間違っているのはご愛嬌)


はい、以上で完成ですが、実行する前にひとつ注意点があります。
マクロを実行するにはマクロ有効ブックという形式で保存する必要があります。


やり方はとても簡単で、名前をつけて保存から以下のようのファイルの形式を
マクロ有効ブックに指定してあげるだけでOKです。


![Q2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/2669a651-2d27-9aea-4bfb-ad319ab79e20.png)




それでは、実行してみましょう。
開発タブ　→　マクロ　→　自分が作ったマクロ名　を選択してみてください。


![Q2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/f31b33f2-0e64-141f-d421-1d1df99c96bd.png)





すると、↓このようにA1セルにHello Worldと書き込むことができました。



![Q2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/e6da083c-ec67-9f97-a141-f75c72293a06.png)
Pythonで日付から曜日を取得する際に`locale.Error: unsupported locale setting`が出た時の対処法

# Pythonで日付から曜日を取得したい
 
以下のようなイメージ
`2019-01-07 00:00:00`⇒火曜日

## 実行環境
* Windows10 Pro
* Python 3.7.4

## やったこと

こちらの記事を参考になりそうだったので、ほぼコピペして実行。  
[Pythonで日付から曜日や月を文字列（日本語や英語など）で取得](https://note.nkmk.me/python-datetime-day-locale-function/)

localeモジュールでロケールを変更すれば取得できるらしい。

>```python:time_test.py
>import datetime
>import locale
>
>dt = datetime.datetime(2018, 1, 1)
>print(dt)
># 2018-01-01 00:00:00
>
>print(dt.strftime('%A, %a, %B, %b'))
># Monday, Mon, January, Jan
>locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
>print(locale.getlocale(locale.LC_TIME))
># ('ja_JP', 'UTF-8')
>print(dt.strftime('%A, %a, %B, %b'))
># 月曜日, 月, 1月,  1
>```

上記のような参考コードがあったので実行したところエラーに…

```PowerShell
2018-01-01 00:00:00
Monday, Mon, January, Jan
Traceback (most recent call last):
  File ".\time_test.py", line 11, in <module>
    locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
  File "C:\Users\XXXXX\AppData\Local\Programs\Python\Python37\lib\locale.py", line 604, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
```

`locale.Error: unsupported locale setting`とあるので`setlocale`で指定する言語と地域が間違ってる感じがする。

## エラー対応  
`setlocale`で渡す引数をちゃんと確認してみる。  
[locale --- Pythonドキュメント](https://docs.python.org/ja/3/library/locale.html)
まずは以下のようなコードを書けと書いてある。
>```python
>import locale
>locale.setlocale(locale.LC_ALL, '')
>```

`locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')`の部分を上記の書き方に変更してみると…

```python:time_test.py
import datetime
import locale

dt = datetime.datetime(2018, 1, 1)
print(dt)
# 2018-01-01 00:00:00

print(dt.strftime('%A, %a, %B, %b'))
# Monday, Mon, January, Jan

#locale.setlocale(locale.LC_TIME, 'ja-JP')
locale.setlocale(locale.LC_ALL, '')
print(locale.getlocale(locale.LC_TIME))


print(dt.strftime('%A, %a, %B, %b'))
# 月曜日, 月, 1月,  1
```

出力結果

```powershell
2018-01-01 00:00:00
Monday, Mon, January, Jan
('Japanese_Japan', '932')
月曜日, 月, 1月, 1
```

取得したい曜日が表示できました。

`print(locale.getlocale(locale.LC_TIME))`で出力結果が`('Japanese_Japan', '932')`となっているので、原因は`ja_JP`で指定していたことだろうと推測。

`locale.setlocale(locale.LC_ALL, '')`を
`locale.setlocale(locale.LC_TIME, 'Japanese_Japan.UTF-8')`に変更しても日本語の結果が得られそうだったので実行。

```powershell
('Japanese_Japan', 'utf8')
月曜日, 月, 1月, 1
```
想定通りの結果が取得できました。
JavaScript: オブジェクトのプロパティを削除する方法(イミュータブル)

JavaScriptでオブジェクトのプロパティをイミュータブルなやりかたで削除する方法です。

イミュータブルな削除というのは、あるオブジェクトのプロパティを削除するとき、そのオブジェクトを変更するのではなく、削除対象のプロパティが取り除かれたオブジェクトを新たに作ることです。

## やりかた

destructuring assignment構文を使います。

例えば、`a`,`b`,`c`の3つのプロパティを持ったオブジェクトから、`a`を削除したい場合、

```javascript
const obj1 = { a: 1, b: 2, c: 3 }
```

destructuring assignment構文に、取り除く`a`プロパティと、残すそれ以外のプロパティを入れる変数`obj2`を`...`を伴って書きます:

```javascript
const {a, ...obj2} = obj1
```

すると、`obj1`は変更されず、`obj1`から`a`が取り除かれた`obj2`ができます:

```javascript
console.log(obj1, obj2)
//=> { a: 1, b: 2, c: 3 } { b: 2, c: 3 } 😎✅
```
【Rails】２つのテーブルを結合しつつ、欲しいカラムだけを抜き出してJSONで返すサンプルコード

## はじめに
Railsで２つのテーブルを結合しつつ、欲しいカラムだけを抜き出してJSONにして返すサンプルコードです。

このコードで出来たJSONはネストされておらず、シンプルなので扱いやすいです。

## 環境
```yaml
OS: macOS Catalina 10.15.1
Ruby: 2.6.5
Rails: 6.0.2.1
```

## 前提

- **UserモデルとPostモデル**がある
- User１に対してPostが多の関係
- それぞれのテーブル名は**usersとposts**
- 以下のように関連付け済み

```ruby:user.rb
class User < ActiveRecord::Base
  has_many :posts
end
```

```ruby:post.rb
class Post < ApplicationRecord
  belongs_to :user
end
```

## 欲しいデータ

各テーブルのカラムは以下のように多数あり、
**「不要なデータは取得したくない！」**
という状況を想定し、`#欲しい`を付けたカラムだけを抜き出した**JSON**が欲しいとします。

```shell
- usersテーブル
    - id
    - name #欲しい
    - email
    - ...

- postsテーブル
    - id #欲しい
    - name #欲しい
    - description #欲しい
    - user_id #欲しい
    - date
    - ...
    
```

これは以下コードで実現可能です。

## 結論

```ruby:posts_controller.rb
  def posts_needed
    posts_needed = Post.joins(:user)
    .select("
      posts.id,
      posts.name,
      description, #ここはusersテーブルと名前が被らない
      user_id, #ここはusersテーブルと名前が被らない
      users.name AS user_name #別名を付けられる
      ")
    render json: posts_needed
  end
```

### 【ポイント】
- `Post.joins(:user)`で**posts**テーブルと**users**テーブルを結合

- `.select("カラム1, カラム2, ...")`で欲しいカラムを指定

- **元のカラム名が被る場合**は`posts.name`や`users.name`のように`テーブル名.カラム名`として指定しないと、両方取り出すのは不可

- `テーブル名.カラム名 AS 任意名`で出力されるカラム名を指定可能

- テーブル名は**複数形**

## 出力

```json:出力（JSON）
[
    {
        "id": 1,
        "name": "投稿名1",
        "description": "投稿詳細1",
        "user_id": 2,
        "user_name": "Brutus"
    },
    {
        "id": 2,
        "name": "投稿名2",
        "description": "投稿詳細2",
        "user_id": 3,
        "user_name": "Omae Dattanoka"
    },
...
]
```

ネストされたものより**シンプルで扱いやすいJSON**に仕上がりました:relaxed:

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [Rails における内部結合、外部結合まとめ - Qiita](https://qiita.com/yuyasat/items/c2ad37b5a24a58ee3d30)
急にiOSアプリ開発（未経験）の仕事が来たのでパッケージマネージャ何がいいねんに立ち向かう

## 背景
タイトルの通りですが、業務でやったことのないiOSアプリ開発の仕事が急に来た。
直近の課題の1つにパッケージマネージャ何使えばいいんだ問題があったのでわからないなりに調べてみた結果と所感をまとめた個人の備忘録です。
間違ってたら優しく指摘ください！（個人ブログも参考にしたので情報古いところあるかも）

## 候補
- CocoaPods
- Carthage
- Swift Package Manager

## CocoaPods
### 特徴
- 中央集権的なパッケージマネージャ
- [Specs](https://github.com/CocoaPods/Specs)と呼ばれる巨大なリポジトリの中に全てのパッケージ情報を詰め込んでいる（ので中央集権的）
- podコマンドによりパッケージの登録・更新が可能
- OSSで開発されている。Ruby製（なのでgemでMacへインストールする）
- [公式ページ](https://cocoapods.org/)の検索が非常に優秀でライブラリを探しやすいとのこと

### メリット
- Webサイトでライブラリを探せる
- Dynamic FrameworksとStatic Librariesの両方に対応（Dynamic Frameworkはアプリ起動時に結合されるもの、Static Frameworkはアプリビルド時に結合されるものらしい）
- 依存するライブラリがさらに依存しているライブラリも解決してくれる
- 依存関係の定義ファイルを見ればどのライブラリにアプリが依存しているか一目でわかる
- 依存ライブラリのアップデートをコマンド1つで検知できる
- pod tryでライブラリのリポジトリ中のサンプルプログラムをすぐに試せる
- 公式で簡単に依存関係を管理できるアプリを出している
- ほぼすべてのライブラリがCocoaPodsをサポートしている

### デメリット
- CocoaPodsを入れてから初めて依存関係をインストールとき、長時間待つ必要がある。それは前述の巨大なリポジトリをすべてMacに入れるため。また、pod updateするときも同じだけ待つ必要がある
- 依存ライブラリが使えるようにするために、CocoaPodsは勝手にプロジェクトをいじる。それによって問題が起きてしまう場合が多い
- プロジェクトをビルドするとき全ての依存ライブラリをビルドするのでビルド時間が長い

## Carthage
### 特徴
- 非中央集権的パッケージマネージャ
- CocoaPodsとは違いパッケージが1リポジトリで管理されていなく、別々のリポジトリで個別に管理
- 依存に追加したいgithubのリポジトリを指定してパッケージをインストールする
- Swift製のOSS

### メリット
- Dynamic FrameworksとStatic Librariesの両方に対応
- 依存するライブラリがさらに依存しているライブラリも解決してくれる
- 依存関係の定義ファイルを見ればどのライブラリにアプリが依存しているか一目でわかる
- 依存ライブラリのアップデートをコマンド1つで検知できる
- 1度しかライブラリのビルドをしないのでCocoaPodsに比べてビルド時間が速い
- CocoaPodsのように勝手にプロジェクトがいじられることがないので安心

### デメリット
- 依存関係を追加するためのステップが多いのでミスしがち
- すべてのライブラリがCarthageをサポートしているわけではない

## Swift Package Manager
### 特徴
- Apple公式で出したパッケージマネージャ
- 対応しているライブラリが少なく、バックエンド用途のライブラリが多いらしい

### メリット
- 今後スタンダードになっていくであろうパッケージマネージャらしい
- 依存するライブラリがさらに依存しているライブラリも解決してくれる
- 依存関係の定義ファイルを見ればどのライブラリにアプリが依存しているか一目でわかる

### デメリット
- watchOS、tvOSなどサポートしていないOSがある
- 決まったフォルダ構成に従うことを強制される
- 対応するライブラリがまだ少ない

## 所感
対応しているライブラリがまだまだ少なそうな「Swift Package Manager」は現時点で避けたい。
依存関係の追加が楽だが勝手にプロジェクトをいじられて大変な思いをしそうなCocoaPodsをとるか、やや追加が面倒かつ対応してないライブラリもあるがプロジェクトをいじられない心理的安全性を保てるCarthageをとるかでいうと、個人的にはCarthageに軍配。
ただでさえ初めてのネイティブ開発で依存関係追加の手間を惜しんで、CocoaPodsが何かを壊してXcodeとにらめっこ...は避けたいため。（ある程度形ができたら引き継ぐ予定のメンバーもネイティブ知らない人ばかりなので...）
SQLAlchemy(automap) + GraphQLでN+1問題を解決する

何も考えずにgrapheneを使いSQLAlchemy(automap)でGraphQLを使うとN+1問題に遭遇すると思います。
回避しようとGraphQLのSchemaでresolveでいちいち書いたりするのは非常に生産性が悪く、また対応漏れを防ぐのが難しいと思います。
それを定義せずに回避する組み合わせがあったので書いてみます。

# 欲しい物
- 既に存在するRDBMSから自動でModelを生成できる
- Grapheneのスキーマにバインドできる
- relationshipで関係するリレーションを取得するときにN+1問題を起こさない

# 環境

- Python 3.7.6

### requirements
- Flask==1.1.1
- Flask-GraphQL==2.0.1
- SQLAlchemy==1.3.11
- graphene==2.1.8
- **SQLAlchemy-bulk-lazy-loader==0.9.9**


# 解決法
 
**SQLAlchemy-bulk-lazy-loader** を使いましょう。

### 1. ライブラリの読み込み

automapをする前に読み込んでおきます。
記述すると、SQLAlchemyのModelに定義するrelationshipに lazy='bulk' パラメータを指定することができます。

```python
# 1:N問題回避
from sqlalchemy_bulk_lazy_loader import BulkLazyLoader
BulkLazyLoader.register_loader()
```

### 2. automapで生成されるrelationshipへのキーワードを変更

そのままautomapしてもN+1問題は解決されません。
automapでrelationshipに渡すパラメータを変更できるよう、automap_baseが返すオブジェクトのprepareメソッドに渡すハンドラを先に定義しておきます。

```python
from sqlalchemy.ext.automap import automap_base, generate_relationship

def _generate_relationship(base, direction, return_fn, attrname, local_cls, referred_cls, **kw):
    kw['lazy'] = 'bulk'
    return generate_relationship(base, direction, return_fn, attrname, local_cls, referred_cls, **kw)
```

### 3. automap_baseのprepareを呼ぶ

1. 2. のコードを含め、全コードは下記のようになります。

```python
import urllib.parse
from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.automap import automap_base, generate_relationship

# 1:N問題回避
from sqlalchemy_bulk_lazy_loader import BulkLazyLoader


def _generate_relationship(base, direction, return_fn, attrname, local_cls, referred_cls, **kw):
    kw['lazy'] = 'bulk'
    return generate_relationship(base, direction, return_fn, attrname, local_cls, referred_cls, **kw)


BulkLazyLoader.register_loader()

# DBへの接続作るよ
dsn = 'Driver=hogehoge'
engine = create_engine('hogehoge+pyodbc:///?odbc_connect=%s' % urllib.parse.quote_plus(dsn))
db_session = scoped_session(sessionmaker(bind=engine))

# automapするテーブルを制限するよ
metadata = MetaData()
metadata.reflect(engine, only=('employee', 'department'))
Base = automap_base(metadata=metadata)

# 先程定義した_generate_relationshipを指定してね
Base.prepare(generate_relationship=_generate_relationship)

Employee = Base.classes.employee
Department = Base.classes.department
Base.query = db_session.query_property()
```

### 4. N+1問題が解消される

GraphQL例

```graphql
{
  department {
    edges {
      node {
         employees {
           name
         }
      }
    }
  }
}
```

発行されるSQL(プリペアドステートメント付き)

```sql
SELECT id, name from department
```

```sql
SELECT id, name from employee where id in (?, ?, ?, ?, ?, ?, ?, ?)
```

BulkLazyLoaderを使わないと関連するemployee全てのレコードに対してクエリが発行されます。

```sql
SELECT id, name from employee where id = ?;
SELECT id, name from employee where id = ?;
SELECT id, name from employee where id = ?;
SELECT id, name from employee where id = ?;
SELECT id, name from employee where id = ?;
SELECT id, name from employee where id = ?;
SELECT id, name from employee where id = ?;
SELECT id, name from employee where id = ?;
```


# まとめ

BulkLazyLoader最高。
SQLAlchemyを使ったGraphQL開発はなかなか情報がなくて辛いです。
Dockerでalpineイメージ使用時に発生したstandard_init_linux.go:211: exec user process caused "no such file or directory" を解決

# alpineイメージ使用時に発生するstandard_init_linux.go:211: exec user process caused "no such file or directory" を解決
Docker X Rails6 X MySQL8で環境構築する際に、初めてalpineイメージを使用するとエラーに出会いました。
alpineはLinuxディストリビューションの１つで、CentOSやUbuntuよりも軽量なためDockerイメージのサイズを小さくすることができます。

## 各種設定
```:Dockerfile
FROM ruby:2.7.0-alpine
ENV LANG C.UTF-8

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN apk update -qq && apk add --no-cache yarn build-base tzdata libxml2-dev mariadb-dev libxslt-dev alpine-sdk mysql-dev nodejs vim g++
RUN bundle install
run yarn install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
```

```yml:docker-copose.yml
~~省略
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
~~省略
```

```sh:entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```

(他, `Gemfile`,`Gemfile.lock`)

##エラー発生
```
$ docker-compose run web rails new .
```

を実行すると

```
standard_init_linux.go:211: exec user process caused "no such file or directory
```

というエラーが発生し、`rails new`は実行できませんでした。

## 原因
alpineのシェルは`bash`ではなく`ash`だった。

## 解決
`docker-compose.yml`と`entrypoint.sh`を編集します。

```yml:docker-compose.yml
  web:
    build: .
    # bash → ashに変更
    command: ash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
```

```sh:entrypoint.sh
#!/bin/sh ←bashからshへ
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```

編集後、再度

```
$ docker-compose run web rails new .
```
すれば実行できました。

##参考
- [dockerでalpine linux ベースのcontainerに入って、shellを使いたいとき。](https://qiita.com/yutachaos/items/56dd7ea09d7e2b0d9173)

- [Rails on DockerのQuickstartをalpine linuxでやってみる](https://qiita.com/at-946/items/c69a512ea47941747b18)

- [Docker: standard_init_linux.go:211: exec user process caused “no such file or directory”](https://stackoverflow.com/questions/56832363/docker-standard-init-linux-go211-exec-user-process-caused-no-such-file-or-di)
herokuへデプロイ後、We're sorry, but something went wrong.

#We're sorry, but something went wrong.
herokuへデプロイ後にブラウザで表示されるました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/a567c114-d89a-b7a8-0517-5aa7d037922e.png)

#原因
色々調べたところ
###・データベースの変更が更新されていない。
###・モデルにアクセスする処理を行っているのに、heroku上のデータベースをリセットを行っていない。

これは、デプロイ自体はできているみたい。
このパターンが多いみたいです。
僕もそうでした。


#解決法
```
＄heroku run rake db:migrate
```
↑これで、heroku上のデータベースを更新

いけました。。一安心です
令和で事業成功する鍵

計算機による開発事業は、映画(movie)、漫画動画(cartoon film)を模擬するとよいかもしれない。従来は、建築の事業を模擬して試みがあった。



#建築と映画の共通点と違い
を記録する。


### 建築の設計者と映画の原作者
建築の設計者は、映画の原作・脚本の作家に近い。
映画監督は、その場その場で原作、脚本にない動き、言葉を追加することがある。
実写の映画と、漫画動画で作業範囲はかなり違うが

建築設計者＝原作者＋脚本家＋監督

### 施工者と役者
実写の映画の役者は、漫画動画では人間ではなく、多くの作家の共同作業からなる。

### 道具類
建築現場では、建機をはじめ、多くの道具類を用いる。
映画では、撮像機、録音機、照明、編集機などを用いる。

漫画動画では、人による作画のほか、3D画像生成装置類を用いる。

#ソフトウェア・システム開発との比較

###人名
ソフトウェア・システムの大きな違いは、設計者・原作者・脚本家・監督などに相当する人の名前を記載していない点が大きい。

多くの事業で、人名を記載しないため、いつまでもプログラマの地位が向上しないのかもしれない。

C言語、Linux, Rubyなど、個人名が明確なシステムは、現在でも幅広く利用されていることを思い起こすとよい。

令和で事業成功する鍵は、ソフトウェア・システムに関わった人の名前を公表することだろう。

いくつかの企業では、引き抜きに合うから、人名を公開したくないかもしれない。

最低限公共のシステムの開発では、参加した人の人名を公開する場合には、
公開した人の比率に応じて、最大限１割後払いで報奨金を出すようにするのはどうだろう。例えば、その報奨金は、公開した人だけに配ることを前提として。

人名が公開されると知れば、対象業務を知らずに、ただ詳細設計書に書いて合ったことをプログラミングしただけですという無駄な作業は圧倒的に減るかもしれない。

### 道具類

ソフトウェア開発では、道具類も合わせて開発することがある。

建築でも映画の現場でも、特別な場合には、その特別な条件に合った道具類をその事業向けに作ることがある。世界最高の建物を建てるときとか、新たな特殊効果を用いて撮影効果を高めようとしているときとか。

ソフトウェアでは、もっと道具類への投資や内製に資源を割り当てるとよいかもしれない。

公共事業では、使用した道具類は公開することを前提にするのはどうだろう。
使用した道具類を非公開にした比率に応じて、最終支払額を減らすとか。

例えば、道具類を半分非公開にしたら5%減額、全部非公開だと10%減額など。



### 資金
ソフトウェア、システムでは、個々の人名を公開してこなかったため、
作成するシステムの見積もりが不可能に近いのかもしれない。

誰に頼めば、どれくらいの費用で、どれくらいの期間でできそうかわからない。
質の低い人に頼んだ場合で見積もって、もっと質の低い人しか集まらず、
終わらない事業や、できあがらない事業になってしまうかもしれない。

#事業(project)成功(success)鍵(key)
まとめの準備として、



#参考資料(reference)

設計で気を付けること
https://qiita.com/aoi_erimiya/items/fe30b7b9d6baceec1c25

やめた方が良いコーディング・設計、アンチパターン
https://qiita.com/peutes/items/ad046baa2428b522a133

##自己参照(self reference)

「平成のうちにやめたかった『ITの7つの無意味な習慣』」に付け加えたかったこと。
https://qiita.com/kaizen_nagoya/items/e6f9c2e0afbf8ab4181c

#文書履歴(document history)
ver. 0.01 初稿 20100108
ver. 0.02 参考資料追記 20100109
before_actionについて

before_actionとは
各アクションが実行される前に必ず実行する処理を定義する所
全アクションで実行する処理を書くのにも使用する。

全てのコントローラーで共通する処理を書く時はapplicationコントローラーにまとめる事ができる。
なぜかと言うと各アクションのビューはapplication.html.erbの<%=yield%>に代入されて表示されている
その為常にapplication.html.erbは全てのアクションで呼び出されている。

```
before_action :メソッド名, {only:[:アクション名]}
```

onlyとつける事でそのアクションの実行前に実行されるようにできる
Switch構文とWhile構文を学習しました

#前回のあらすじ
・if構文を使って、変数がうるう年か判定するプログラムを組んだぞ

#今日やったこと
・Switch構文について学んだ
Switch構文とは、条件となる変数の値によって、最適な場所へぴょんぴょんジャンプして上から下へと処理を行うもの。

```
case n:
 total +=n;
/*ここにbreak;を挿入すれば下の処理に移動しない*/
case m:
 total +=m;
```

・While構文について学んだ
While構文とは、条件をチェックして、その条件が成立する間は、繰り返しぐるぐるっと処理を行う構文
（今回の教科書『新人プログラマのためのjQuery Webアプリケーション開発講座』)

#困ったこと
・難しいことをやっているからか、プログラミングを知らない人に説明できるほどの理解はできなかった
でも、自分では何が行われているのか理解できた。

#感想
構文の勉強は地道だなと感じた。今の学習がものづくりに活かせる日は来るのだろうか…

#次回の目標
次はfor構文の使い方を理解するぞい
gitのbranch名,tag名をpythonで取得する

# はじめに

機械学習系でmodelと中間生成ファイル，精度などの結果を同時に管理したいとき，Githubでbranchを切ってコードを管理するだけでなく，S3などのストレージを用いて管理したい欲が深いです。


## 既存のツール

既存のツールで同様の課題を解決したかったら，[mlflow](https://github.com/mlflow/mlflow)を使うのが良さそうです．

ただ，mlflowでversion管理するにせよ，[flask](https://github.com/pallets/flask)などで自作管理アプリを開発するにせよ，gitのbranch名とS3のobject名は統一した方がいいという気持ちがありました．

また，過去に切ったreleaseタグにcheckoutして当時の推定値を再現したい欲もあります．

ということで現在のbranchと，remoteのreleaseタグを全取得するPythonコードを書きました．

```Python
import subprocess
import pandas as pd


def get_current_branch(repository_dir='./') -> str:
    '''現在のbranch名を取得
    Args:
        repository_dir(str): リポジトリのあるディレクトリ
    Return:
        str
    '''
    cmd = "cd %s && git rev-parse --abbrev-ref HEAD" % repository_dir
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    proc.wait()
    stdout_data = proc.stdout.read()
    # stderr_data = proc.stderr.read()
    current_branch = stdout_data.decode('utf-8').replace('\n','')
    return current_branch


def get_remote_tags(repository='./') -> pd.core.frame.DataFrame:
    '''リモートのタグを取得する
    Args:
        repository(str): リポジトリのあるディレクトリ or リポジトリのURL(例: https://github.com/mlflow/mlflow )
    Returns:
        pd.core.frame.DataFrame
    Note:
        タグではなくbranchを取得したい場合は, cmdの'--tags'を'-h'に変更すれば良いです．
    '''
    if repository.startswith('https://github.com/'):
        cmd = "git ls-remote --tags %s" % repository
    else:
        cmd = "cd %s && git ls-remote --tags" % repository
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    proc.wait()
    stdout_data = proc.stdout.read()
    # stderr_data = proc.stderr.read()
    if stdout_data:
        tag_df = pd.DataFrame([r.split('\t') for r in stdout_data.decode('utf-8').split('\n')], columns=['hash', 'tag_name'])
        return tag_df.dropna(how='any')
    else:
        print('cannot find tags.')
        return pd.DataFrame(columns=['hash', 'tag_name'])
```
まだ相対パスで消耗してるの？

タイトル、煽りでスイマセン。

今回は↓これ↓の話です。

```react:hoge.js
import SomeComponent from ../../../components/hoge/fuga
```

相対パスのimportです。
"../../"の数がいちいちわからなくなるのって私だけですかね？
また、ファイルを別のフォルダに打ちしたときなんかにエラーが出ることもあったりして、
相対パス、書き換えるの面倒くさいですよね。

今回はそんな悩みを絶対パスにして解決してしまおうという記事です。
題して、「絶対パスでReactを書こう！」
（よく考えたら題してないな）

内容に間違い等がございましたら、ご意見・ご指摘のほど宜しくお願いいたします。

#前提：やり方は意外に簡単だよ！という話
調べたら色んなやり方が出てきましたが、一番手っ取り早い方法をご紹介します。
以下は概要。

- webpack.config.jsonは使いません。
- .babelrcは作りません。
- ts.config.jsonを使います。
- typescriptじゃなくてもOKです。

素のjavascirpt(typescriptじゃないという意味で素)でもts.config.jsonが使えるというのは、私も今回初めて知りました。
以下の記事が大変参考になったので貼っておきます。感謝！
https://qiita.com/terrierscript/items/a9826bc58d550d1b2764
また公式ドキュメントも先に貼っておきますのでお急ぎの方はこちらをご参照ください。
https://create-react-app.dev/docs/importing-a-component/#absolute-imports

では早速、方法をご紹介していきます。

#step① tsconfig.jsonを作る
プロジェクトのroot(package.jsonなどがある場所)にts.config.jsonを作成します。
npx typescript --initして下記のように設定してください。
（下記はhttps://create-react-app.dev/より引用。）

```react:tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "src"
  },
  "include": ["src"]
}
```

自分は下記のように設定を加えています。

```tsconfig.json
{
  "compilerOptions": {
    "incremental": true,
    "target": "es5",
    "module": "esnext",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "jsx": "react",
    "isolatedModules": true,
    "strict": true,
    "baseUrl": "src",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "skipLibCheck": true,
    "allowSyntheticDefaultImports": true,
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "noEmit": true
  },
  "include": ["src"],
  "exclude": ["node_modules", "build", "scripts", "functions"]
}
```
なおts.config.jsonの書き方については、下記を参考にさせていただきました。
https://usefuledge.com/pb_00009_tscconfig_json.html
自分はこの辺りの設定にあまり詳しくないので、「ここがおかしい」とか「こうした方がいいよ」というのがございましたら、ぜひぜひコメント欄にお願いいたします。

ちなみに"allowJs": true”というやーつは、名前の通り「TypeScriptやなくても許してやりまっか〜」という意味なので、JSに段階的にTSを導入していきたい方は加えておくといいかもしれません。

#step② TypeScriptを入れる
素のJSでtsconfig.jsonを作成すると、TypeScriptじゃないのにtsconfigがあるよ！
というような趣旨のエラーがでるので、その案内に従ってTypeScriptを入れてください。
具体的に書くと、
”It looks like you're trying to use TypeScript but do not have typescript installed.Please install typescript by running yarn add typescript”
とお叱りを受けるので、npm install --save-dev typescriptでおkということです。
とはいえ、拡張子をtsxにしたり、全部anyにして無理やりTypeScript化する必要はありません。
ただインストールするだけです。
(ts入れて使わないならjsconfig.jsonで良くね？という話は冒頭でご紹介した記事を御覧ください。)

#結果：絶対パスで書けるようになる
例

```react:hoge.js
import AbsoluteImportComponent from components/hoge/fuga
import RelativeImportComponent from ../components/hoge/hoge
```
絶対パスで書けるようになります！意外と簡単でしたね。
絶対パスでしか書けなくなるのではなく、どうやら両方いけるみたいです。

#まとめ
絶対パスを使うとimportがむっちゃすっきりするよ、という話でした。
最後まで読んでいただいてありがとうございました！
[VSCode]MarkdownをPDFで出力してレポートを書く

# 目的 #
VSCodeの拡張機能を使用して、Markdownで作成したレポートをPDFで出力する方法を調べたので、忘れないようにメモっておきます。

単にMarkdownPDFを使うだけの、拡張機能の紹介記事です。

# 環境 #
- OS : macOS 10.14.6
- VSCode : 1.41.1
- MarkdownPDF : 1.4.1

# この記事でわかること #

- MarkdownPDFの存在を知ることができます

以上、これだけです。ごめんなさい!!

# MarkdownPDF #
VSCodeの拡張機能で、MarkdownをPDFとして出力することができます。

![スクリーンショット 2020-01-07 20.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227731/88b8faec-7b6f-f564-504f-94232d911c6e.png)


# インストール方法 #

通常のVSCodeの拡張機能のインストール方法と同じです。

![スクリーンショット 2020-01-07 20.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227731/a7daa2d0-ecc8-e986-05cd-8da6931ba638.png)


# 基本的な使い方 #

1. Markdownのファイルを作成します。<br>
 (Markdownプレビュー機能を使うと便利です!!)
2. ctrl + shift + pでコマンドパレットを開きます。
3. コマンドパレットにmarkdownと入力し"Markdown PDF:Export(pdf)"を選択します。

これにより、カレントディレクトリに変換されたPDFファイルが作成されます。

![スクリーンショット 2020-01-07 20.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227731/548a8b95-2414-84ee-700b-a407f9ce732e.png)

# まとめ #
VSCodeの拡張機能でMarkdownファイルをpdfに変換する方法を紹介しました。

常日頃、簡単な報告書をWordなどで作成することの面倒くささを感じており、簡単にできる方法を探していました。
今回紹介した方法で、やりたいことの実現に近づき、幸せ度数がわずかにあがりました。

# 今後やりたいこと #
- ある程度形式の決まっているレポートであれば、自動で生成するようにしたい。Wordと違ってMarkdownはテキストファイルなので、比較的簡単にできそう
- レポートのバージョン管理。これも、テキストなので簡単にできそうです。
sassを使用する場合のフォルダ構成例

sass使用時のフォルダ構成の理解が浅いと感じたため、構成例を１つ以下に記述し、今後の開発時の参考資料とする。

##sassを使用する場合のフォルダ構成例
![1.png](https://i.gyazo.com/dc77656f4a83de144c25d0477ba90253.png)

###index.html
htmlを記述するファイル。
ここに記述した物が実際にブラウザに表示される。

###style.css
htmlファイルでこのファイルを読み込むことでスタイルを適用させる。
style.cssファイルを直接編集するのではなく、sassコマンドを実行することでstyle.cssファイルを作成・更新する。

###stylesheetsフォルダ
全てのscssファイルを管理するフォルダ。
新しくscssファイルを作る場合も全てこのフォルダの下層に作る。

###style.scss
下層のscssファイルから **@import "URI ファイル名"**のような形で呼び出し統合するファイル。
**例：**`@import "./reset.scss"`

###_reset.scss
ブラウザに標準搭載されているcssを打ち消すためのcssファイル。
上記cssが実装するデザインに干渉することを防ぐ役割がある。

###configフォルダ
プロジェクトの設定ファイルや、scssで使用する変数を定義するファイルなどを管理するフォルダ。

###mixinフォルダ
mixinフォルダは、scss内で使用するmixinファイルを管理するフォルダ。

######mixinとは？
`@mixin スタイル名`で定義したスタイルを
`@include スタイル名`で、変数のように呼び出せるというもの。

###modulesフォルダ
ヘッダー、フッターのようないくつかの要素ごとに作成したscssを管理するフォルダ。
モジュールを使うことでまとまったCSSを独立したものとして管理することができる。

###venderフォルダ
あらかじめCSSが書かれたライブラリファイルを管理するフォルダ。
ライブラリを効率よく利用することで、コーディングのスピードが格段に上がるらしい。

###overrideフォルダ
overrideフォルダは、vendorフォルダに格納してある外部のライブラリを上書きするためのscssファイルを管理するフォルダ。


##現時点での理解
・mixin　・vender　・override　に関する理解が浅く
どのように有効活用していいかわからない状態。

個人アプリの開発を通じて、理解を深めていきたい。
【DS】「For Each Text Part」について

【アルゴリズム】
<img width="168" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/45d9b0a5-76a1-545e-ad89-46728feffbb5.png">

【ポイント】
<img width="642" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/5d2fa24c-508f-e3f2-886e-c5cd1a579ebe.png">

デリミタで"\r\n"を入れると行単位でshot text に入る
pip installしたはずなのにImport errorを解決する方法

```
$ pip install tweepy --user
Requirement already satisfied: tweepy in /home/ubuntu/.local/lib/python3.7/site-packages (3.8.0)
Requirement already satisfied: six>=1.10.0 in /usr/lib/python3/dist-packages (from tweepy) (1.11.0)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /home/ubuntu/.local/lib/python3.7/site-packages (from tweepy) (1.3.0)
Requirement already satisfied: PySocks>=1.5.7 in /home/ubuntu/.local/lib/python3.7/site-packages (from tweepy) (1.7.1)
Requirement already satisfied: requests>=2.11.1 in /usr/lib/python3/dist-packages (from tweepy) (2.18.4)
Requirement already satisfied: oauthlib>=3.0.0 in /home/ubuntu/.local/lib/python3.7/site-packages (from requests-oauthlib>=0.7.0->tweepy) (3.1.0)
```

してるのに

```

$ python3 followback_unfollow.py
Traceback (most recent call last):
  File "followback_unfollow.py", line 3, in <module>
    import tweepy
ModuleNotFoundError: No module named 'tweepy'
ubuntu@ip-192-168-1-89:~/my-app$ 

```

解決するには

```
$ export PYTHONPATH=$PYTHONPATH:/home/ubuntu/.local/lib/python3.7/site-packages
```

して

```
$ source ~/.bashrc
```

する。

```
$ python3 followback_unfollow.py
Works!!!
```

##### 参考

[pip installしたはずなのにImport errorと言われた場合](https://qiita.com/musaprg/items/efccb436f8d79b25074b)
[pipでインストールしたパッケージの場所を調べる](https://qiita.com/t-fuku/items/83c721ed7107ffe5d8ff)
【備忘録】airflowで"no module named 'postgresql'"と出てしまう問題

# タイトルの問題について

いくつか解決策がありますが、まず確かめて欲しいのはこれをしているかどうかです。

```
pip install psycopg2 
```

これがないと基本的にPostgreSQLは動きません。

ですが、これでも動かない場合があります。

# psycopg2入れたのに"no module named 'postgresql'"と言われてしまう問題

ええって感じですが、これもちゃんと解決策があります。
これはどういうわけかCelery関係で発生するバグで、
CeleryExecutorを使っていなければ発生はしません。

対処方法としては以下の通りです。
result_backendにairflowのメタデータDBを設定するかと思いますが、
その欄について以下のように`db+`というprefixをつける必要があります。

```
result_backend = db+postgresql://airflow:password@hostname/airflow 
```

こうすることでしっかり動きます。

またCelery関係の記事を書きますのでよろしくお願いします！
2018年ネットワークスペシャリスト試験

2018年ネットワークスペシャリスト試験
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30.html#30aki

自分は受けていない。

 <この項は書きかけです。順次追記します。>



令和元(2019)年ネットワークスペシャリスト試験略号一覧

https://qiita.com/kaizen_nagoya/items/24c7f2ea3fe0b4ce434b

２年分の略号一覧を作成しかけてわかったことがある。

1) IPAのWebに略号一覧を掲載すればよい項目

PC
DB
LAN

2) 問題文中にフルスペルを書くとよい項目

３年に１度くらいしか登場しない用語で、問題の本質にかかわる用語

3) 問題文の最終頁または先頭頁に一覧を掲載するとよい項目

毎年は登場しないし、問題の本質にかかわらない用語



この資料は書きかけです。順次追記します。

# 一覧作業欄

午前II
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_2/2018h30a_koudo_am1_qs.pdf

p.3, M/M/1
p.6, CSMA/CD
p.6, LAN
p.7, DMZ
, PC
, DB
, SNMP
, OS
, HTML
P.10, fP
P.11, ITLL
, IT
p.13, UML
, KPI
p.15, IoT

午前II
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_2/2018h30a_nw_am2_qs.pdf

p.3, CCK
, CDM
, OFDM
, TDM
, CA
, QoS
p4, MTU, Maximum transmission Unit
, MAC
, IS
, TCP
, FCS
, AS, Autonomous system
, BGP
, IS-IS
, OSPF
, RIP
p.5, DNS
p.6, IPv4
, ICMP
, IGMP
, RTP
, SDP
, LDAP
, DSE
, UDP
, X.500
p.7, TTL
, GHz
, IEEE
, ONF, Open Network Foundation
, SDN, Software Defined Network
p.8, URL
, https
, XML
, URI
, http
, ftp
, jp
, SYN
, ping
p.9 , EAP
, MD5
,TLS
, TTLS
p.10, IPsec
, ESP
, IKE
, HMAC-SHA1
, AH
, RADIUS
p.11, NIC, network interface card
, CPU
p.12 , MTBF
, MTTR

午後I
p.2. VPN
, Saas
, PC
, L2SW
, L3SW
, DMZ
p.3, FW
, URL
, ID
p.4. SD-WAN
p.5 , SDN, Software defined network
, RSS, Really Simple syndication
p.6, API
p.7, ping
, SYSLOG
, STP, spacing tree protocol
, VRRP, virtual redundancy protocol
,802.1D,
,802.1Q,
p.9, RFC
, RFC792
p10, SNMP
, MIB
p.11 BPDU, bridge protocol data unit
p.13 , RFC3301
CE, customer edge

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
今年の素数 

今年の素数をpython で調べてみました。

```python
def is_prime(n):
    if n == 1:
        return None
    elif n == 2: 
        return True
    elif n >=3 :
        num_max = int(math.sqrt(n))
        for i in range(2, num_max+1):
            if n % i == 0:
                return False
        return True       
import math
year = 2020
for month in range(1,13):
    day_max = -1
    if month in [2]:
        if year % 400 == 0:
            day_max = 29
        elif year % 100 == 0:
            day_max = 28
        elif year % 4 == 0:
            day_max = 29
        else:
            day_max = 28
    elif month in [4,6,9,11]:
        day_max = 30
    else:
        day_max = 31
    
    for d in range(1,day_max+1):
        serial = year * 10000 + month * 100 + d
        if is_prime(serial):
            print(serial)
```

20200109
20200111
20200121
20200123
20200223
20200309
20200429
20200511
20200529
20200613
20200619
20200703
20200711
20200721
20200723
20200729
20200801
20200813
20200903
20201021
20201029
20201101
20201113
20201227
20201231

今年は、25回あるようです。
※for d in range(1,day_max+1)　の+1を忘れていたので、修正しました。
HVML事始め的なもの１（ロボホンに色々喋らせてみる）

## HVMLとは
HVML(Hyper Void Markup Language)とはXML1.0をベースとしたマークアップ言語である。
ロボホンとの対話（ロボホンの発話、音声認識の操作）を実現する為に必要となる。

## ロボホンに発話させるには

発話内容は\<speech>タグに記載する。
サンプルコードの場合は「お話ししてく、ありがとう！・・・」の発話をする。

```
<action index="1">
  <speech>お話してくれて、ありがとう！これから、僕にいろんなことを教えてね！！</speech>
  <behavior id="assign" type="normal" />
</action>
```
### \<speech>タグ

|項目|説明|
|:---:|:--:|
|書式|\<speech>~\</speech>|
|親要素|\<action>|
|子要素|\<emotion>,\<wait>|
|属性|なし|

### 注意点
* 体感的に`、`は1拍、`。`は2拍ほどの間が空く
* 現実的に発音不可の言葉は問題箇所の発話がおかしくなる。（例：「んん」）
  * 「んん」の場合は音が途切れるような感じになります
* 一つのspeechタグの上限は明確に決まっていないが、60秒を目安にしゃべれるように文章を区切る
* speechタグ内の改行はエラーになる
  * ドキュメントによると問題ないとの記載があるのですが、検証環境ではエラーになったので…

## 連続した発話の設定
同じtopic id内の会話は\<action>タグのindexで管理する。  
サンプルコードの場合は、「今日の晩ご飯は・・・」の次に「楽しみだね」を発話する。
indexは整数で`欠番なし`に設定していく。

```
<action index="1">
  <speech>今日の晩ご飯は、カレーみたいだよ。</speech>
  <behavior id="assign" type="normal" />
</action>
<action index="2">
  <speech>楽しみだね。</speech>
  <behavior id="assign" type="normal" />
</action>
```

#### \<action>タグ

|項目|説明|
|:---:|:--:|
|書式|\<action index="・・・">~\</action>|
|親要素|\<topic>,\<case>|
|子要素|\<speech>,\<behavior>,\<control>,\<memory>|
|属性|index(必須)|

## 感情の変更
ロボホンの感情の調整は\<emotion>タグで行う。

typeで設定する感情は以下の3つ。

* happiness
* sadness
* anger
  * ロボホンデフォルトの感情は`happiness,level 1`

levelは1~4で設定する。（デフォルトは`1`）

```
<action index="1">
  <speech><emotion type="happiness" level="2">今日の晩ご飯はカレーみたいだよ。</emotion></speech>
  <behavior id="assign" type="normal" />
</action>
```

### \<emotion>タグ

|項目|説明|
|:---:|:--:|
|書式|\<emotion type="・・・">~\</emotion>|
|親要素|\<speech>|
|子要素|なし|
|属性|type(必須),level|

## モーションの追加
発話中のモーションを明示的に指定する場合は、\<behavior>タグのidを設定する。

```
<action index="1">
  <speech><emotion type="happiness" level="2">全ての人たちに、</emotion></speech>
  <behavior id="0x060027" type="normal" />
</action>
<action index="2">
  <speech>愛される可愛さ、ロボホンです。</speech>
  <behavior id="assign" type="normal" />
</action>
```

### \<behavior>タグ

|項目|説明|
|:---:|:--:|
|書式|\<behavior type="・・・" id="・・・"/>|
|親要素|\<action>|
|子要素|なし|
|属性|type(必須),id(必須)|

### 注意点
* 設定のコツとして、speechタグを短く設定すると調整がしやすくなる  
 長い文書と短いモーションが組み合わさると、少し動いた後にspeechタグが終わるまで動作がないため、不自然になる
* デフォルトidの`assign`は首を動かす仕草や特定の単語で動作をするようになる  
（例：「サッカー」でボールを蹴る仕草）  
明示的に指定した場合、このような動作を一切しなくなる

## 参考資料
* [RoBoHoN DEVELOPERS](https://robohon.com/sdk/develop-list.php)
#Ruby + #AWS S3  / publish presigned url ( temporary access URL ) / example codes

# Code

```rb
# https://www.rubydoc.info/github/aws/aws-sdk-ruby/Aws%2FS3%2FObject:presigned_url

require 'aws-sdk-s3'

credentials = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
s3_resource = Aws::S3::Resource::new(region: ENV['AWS_REGION'], credentials: credentials) # e.g ap-northeast-1

# If no bucket then create
# s3_bucket.create

s3_bucket = s3_resource.bucket(ENV['AWS_BUCKET'])
# <Aws::S3::Bucket:0x00007fd7145b34f0 @arn=nil, @client=#<Aws::S3::Client>, @data=nil, @name="yumainaura", @waiter_block_warned=false>

object = s3_bucket.object("path/to/file_#{Time.now.to_i}.txt")
# #<Aws::S3::Object:0x00007fd7139fb8b0
#  @bucket_name="yumainaura",
#  @client=#<Aws::S3::Client>,
#  @data=nil,
#  @key="path/to/file_1578302095.txt",
#  @waiter_block_warned=false>

object.put(body: 'ABC')

presigned_url = object.presigned_url(:get, expires_in: 10)
# => "https://yumainaura.s3.ap-northeast-1.amazonaws.com/path/to/file_1578302095.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA4INFFTNLCQ6PIZOP%2F20200106%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20200106T091516Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=f413cb0d564b69422f58b988cd2cbe39f4ca6b52e7a5e2975d1e22094706d3a0"

p presigned_url

```

# Browser

access to text file 

![image](https://user-images.githubusercontent.com/13635059/71808288-c7a3ce80-30b0-11ea-98bb-390154086894.png)

10 seconds later

![image](https://user-images.githubusercontent.com/13635059/71808291-c83c6500-30b0-11ea-8efb-eaa1a59f627a.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Ruby + #AWS S3 /  パブリックに一時アクセス可能な「resigned URL」を発行するコード例

# Ref

【AWS S3】S3 Presigned URLの仕組みを調べてみた - Qiita
https://qiita.com/tmiki/items/87697d3d3d5330c6fc08

# Code

```rb
# https://www.rubydoc.info/github/aws/aws-sdk-ruby/Aws%2FS3%2FObject:presigned_url

require 'aws-sdk-s3'

credentials = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
s3_resource = Aws::S3::Resource::new(region: ENV['AWS_REGION'], credentials: credentials) # e.g ap-northeast-1

# If no bucket then create
# s3_bucket.create

s3_bucket = s3_resource.bucket(ENV['AWS_BUCKET'])
# <Aws::S3::Bucket:0x00007fd7145b34f0 @arn=nil, @client=#<Aws::S3::Client>, @data=nil, @name="yumainaura", @waiter_block_warned=false>

object = s3_bucket.object("path/to/file_#{Time.now.to_i}.txt")
# #<Aws::S3::Object:0x00007fd7139fb8b0
#  @bucket_name="yumainaura",
#  @client=#<Aws::S3::Client>,
#  @data=nil,
#  @key="path/to/file_1578302095.txt",
#  @waiter_block_warned=false>

object.put(body: 'ABC')

presigned_url = object.presigned_url(:get, expires_in: 10)
# => "https://yumainaura.s3.ap-northeast-1.amazonaws.com/path/to/file_1578302095.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA4INFFTNLCQ6PIZOP%2F20200106%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20200106T091516Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=f413cb0d564b69422f58b988cd2cbe39f4ca6b52e7a5e2975d1e22094706d3a0"

p presigned_url

```

# Browser

access to text file 

![image](https://user-images.githubusercontent.com/13635059/71808288-c7a3ce80-30b0-11ea-98bb-390154086894.png)

10 seconds later

![image](https://user-images.githubusercontent.com/13635059/71808291-c83c6500-30b0-11ea-8efb-eaa1a59f627a.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[AWS] EC2からRDS(MySQL)へ接続する方法

# 参考記事
[Amazon RDS編～EC2インスタンスからDBインスタンスへの接続～
](https://recipe.kc-cloud.jp/archives/397)

# EC2からデータベースの中身をみるには
1. EC2へssh接続する
2. 接続するコマンドを入力する  
3. 設定したパスワードを入力する

のたった三つの手順です。

# 接続するコマンドとは
こちらです

```
mysql -h エンドポイント -P 3306 -u ユーザー名 -p データベース名
```

# 各パラメータの確認方法
### エンドポイント
1. AWSへログイン
2. サービスから「RDS」を選択
3. "データベース"から接続したいデータベースを選択
4. 【接続とセキュリティ欄】にて**エンドポイント**を確認

### ユーザー名
1~3まではエンドポイントと同じ
4. 【設定】にて**ユーザー名**を確認

### データベース名
エンドポイントやユーザー名を確認した際の**データベース名**です

# 以上です
qiita初投稿でした。至らない点があると思いますが、ご指摘いただけたらと思います。
また、この記事がどなたかのお役に立てれば幸いです。
railsでdeviseを使う手順

ユーザー登録の際に使える、deviseという便利なツール。
よく使うことが多いので、簡単な手順をまとめました。


## gemを入れる
まずはgemを入れます

```gemfile
gem 'devise'
```
```
$ bundle install
```


## deviseをインストールする
次にアプリケーション内にdeviseを読み込みます

```
$ rails g devise:install
```

## deviseを使って、モデルを作成
今回はユーザーモデルを作ってみます

```
$ rails g model devise user
```
必要な追加カラム等があれば、マイグレーションファイルを編集します

```.rb
t.string :email,              null: false, default: ""
t.string :encrypted_password, null: false, default: ""
#以下のように追加
t.string :name,              null: false, default: ""
```

その後、application_controllerを編集し、カラム追加を許可してもらいます

```.rb
before_action :configure_permitted_parameters, if: :devise_controller?

def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end
#[:name]のところが、追加したいカラム名。複数指定の場合はカンマ区切りで記入
```

## 必要なビューをダウンロード
新規登録ページやログインページなどのビューをダウンロードします

```
＄ rails g devise:views
```

## 特殊な処理が必要な場合はdevise用のコントローラーを生成する

```
＄ rails g devise controller users 
```
coc.nvim に pycodestyle をあてる

pycodestyle と coc-nvim は既にインストールされているものとします。

## インストール

```
:CocInstall coc-python
```

### ◯ 補足

extention の一覧を表示する。

```
:CocList extensions
```

extention をアンインストールする。

```
:CocUninstall coc-python
```

* [Using coc extensions - neoclide/coc.nvim](https://github.com/neoclide/coc.nvim/wiki/Using-coc-extensions)



## 設定

coc-python をインストールするだけではダメで、設定が必要になります。そのままだと pep8 がインストールされてないよ、と言われ、古い方の pep8 をインストールしようとしてきます。それは困るので少し設定をします。

![Screen Shot 2020-01-07 at 19.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254825/1b78e959-51b9-19c1-8718-433dff259f24.png)

* [Python: pep8 は pycodestyle になったし pep257 は pydocstyle になった - CUBE SUGER CONTAINER](https://blog.amedama.jp/entry/2017/06/13/222556)



### Step 1.

```
:CocConfig
```

### Step 2.

`"python.linting.pep8Path"` に "pycodestyle" へのパスを記述します。

```
{
  "python.linting.pep8Path": "/Users/user/project/venv/bin/pycodestyle"
}
```

### ◯ 補足

`:set filetype?` で確認したものを追記しています。

* [Find what filetype is loaded in vim - Stackoverflow](https://stackoverflow.com/questions/2779379/find-what-filetype-is-loaded-in-vim/2779390)

## 設定ファイルを置く場所

場所は大きく "the user level" と "the project level" の２種類に分けられます。詳細は以下を参照してください。

* [configuration - pycodestyle](http://pycodestyle.pycqa.org/en/latest/intro.html#configuration)

"the project level" の場合、設定ファイルを置く場所は workspaceFolders に置く必要があります。workspaceFolders は以下のコマンドで確認が可能です。

```
:CocList folders
```

* [Using workspaceFolders - neoclide/coc.nvim](https://github.com/neoclide/coc.nvim/wiki/Using-workspaceFolders)

例えば上記のコマンドの実行結果が `/Users/user/project/` であった場合 `setup.cfg` を置く場所は以下のようになります。

```
/Users/user/project/setup.cfg
```
rails db:migrateでエラー（StandardError: An error has occurred, this and all later migrations canceled:）

＄rails db:migrate、または、＄rails db:migrateを行った後のエラー。

```
== 20200107095832 CreateMicroposts: migrating =================================
-- create_table(:microposts)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: table "microposts" already exists: CREATE TABLE "microposts" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "content" text, "user_id" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)
・
・以下つづく
・
```

#原因
**『この前に行ったコマンドのmigrationで何らかの手違いがあると思います。おそらく、migration処理の途中からエラーが起きていて、テーブルは生成されているが、テーブルを生成したmigrationは未実行のまま。といった状態なのかな？と思います。』**




#解決策

```
$ rails db:migrate:reset
```
↑データベースのリセットを行った後。

```
$ rails db:migrate
```
↑もう一度マイグレーション

直った！

これでオッケーかと！

このコマンドで、マイグレーションを順に実行し、データベースに変更を加えていくんですね。
データベースを削除し、新しくmigrationファイルを修正して、もう一度migrationを行いたい場合に使うコマンドです。
画像がないときにJavaScriptでかんたんな単色なアイコンを作る

<img width="231" alt="スクリーンショット 2020-01-07 19.22.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/16efd04f-eab0-8603-8e9f-814ffc1f52e9.png">

なんか画像が欲しいってなったとき

1. 白い画面にアクセス  
[about:blank](about:blank)にChromeでアクセスをして綺麗なDOMにアクセスします。


2. スクリプトを貼り付けます

```javascript

document.getElementsByTagName("body")[0].insertAdjacentElement("afterbegin", document.createElement("canvas"))


const width = 50;
const height = 50;
const canvas = document.getElementsByTagName("canvas")[0]

// 色を指定して
canvas.width = width
canvas.height = height
const icon = new ImageData(width, height)
icon.data.fill(33)

ctx = canvas.getContext("2d")
ctx.putImageData(icon, 0, 0)

```
javascriptのquerySelectorAllで取得したNodelistをforEachでループしたときに、インデックスも取得する方法

querySelectorAllで配列に似た？NodeListというオブジェクトを取得できます

NodeListは、forEachループが使えます

ループするときに要素だけでなく、インデックス、それとNodeList自身も取得できます

ループ時のインデックス取得はよくあるので、簡単に取得できてよかった

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

[こちらを参考にしました](https://developer.mozilla.org/ja/docs/Web/API/NodeList/forEach)