OmniAICreator/Qiita-1.07M huggingface dataset:
nodebrewを利用したnodeのインストール

Homebrewを使ってインストール。

```sh
$ brew install nodebrew
```

* バージョン確認

```sh
$ nodebrew -v
```

* セットアップコマンド。出力されたパスを通す。

```sh
$ nodebrew setup

# Fetching nodebrew...
# Installed nodebrew in $HOME/.nodebrew
# 
# ========================================
# Export a path to nodebrew:
# 
# export PATH=$HOME/.nodebrew/current/bin:$PATH <= コイツを記述
# ========================================
```

```sh
$ vi ~/.bash_profile
```

* インストール可能なバージョンの確認

```sh
$ nodebrew ls-remote
```

* stableをインストール。`install`コマンドと比較して`install-binary`の方が速いらしい。

```sh
$ nodebrew install-binary stable
```

* インストールしたバージョンの確認。及び実行するバージョンを指定。

```sh
$ nodebrew ls
# v14.16.0
# 
# current: none
```

```sh
$ nodebrew use v14.16.0
```

* バージョンの確認。

```sh
$ nodebrew ls
# v14.16.0
# 
# current: v14.16.0
```

```sh
$ node -v
```

以上
【学習メモ】Databaseの基礎知識 (AWS)

#データベースの種類
大きく二種類に分けます。
・Relational Database
・Non-Relational Database

##Relational Database（SQL）
データ間に関係性がある。データ操作はSQLで行う。
構造化されたデータに適用。例えば、顧客データ、会計データ。

・SQLのメリット：
①調べやすい：データ間に関係性があるから。
②データの一致性：ACID特性

・SQLのデメリット：
①データは行で保存しているので、列のデータを調べたいとき、行から調べるので、I/Oが多い。
②データの一致性を維持するための費用が高い。
③データの構造が決められたため、データの拡張性が弱い。
④検索機能が弱い。
　例えば）
　”＊houkaは頑張＊”を検索するとき、
　”houkaは頑張り屋。”の検索結果しか出ない。
　”houkaと記事を読んでいるあなたは頑張り屋。”の検索結果は出てこない。



##Non-Relational Database　（NoSQL）
SQLはメリットがあるので、NoSQLはその不足を補うものです。
SQLと対立の関係ではない。

・構造化されていない、あるいは、半構造化のデータに適用。

・NoSQLの特徴：
　①柔軟性
　②スケーラビリティ：関係性のあるデータに縛れられず、スケーラビリティが簡単に行える。
　③高性能
　④高機能


#NoSQL　データベースのタイプ

![type of NoSQL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/9a061284-b526-40ee-7c9f-64c889bc2a6e.png)

reference: https://aws.amazon.com/jp/nosql/

#増大するデータ量への対応
効率的なデータ蓄積
↓
ストリームデータ処理
↓
大量データの解析手法

https://aws.amazon.com/jp/streaming-data/
Rspec 結合テストコードにてセレクトボックスがある場合の記述方法

#テックキャンプではカリキュラム外であったために自分で調査
※セレクトボックスの結合テストのみの解説なので、それ以外は省略

# 実行コマンド
# bundle exec rspec spec/system/users_spec.rb
##アプリ名/spec/system/users_spec.rb
```ruby


require 'rails_helper'

RSpec.describe 'ユーザー新規登録', type: :system do
  before do
    @user = FactoryBot.build(:user)
  end

  context 'ユーザー新規登録ができるとき' do
    it '正しい情報を入力すればユーザー新規登録ができてトップページに移動する' do
      fill_in 'nickname', with: @user.nickname
#⇐この行----------------------------------------------------------
      select '男性', from: 'user[seibetu_id]'    
#---------------------------------------------------------------
    end
  end
end

```


##アプリ名/spec/factories/users.rb

```ruby

FactoryBot.define do
  factory :user do
    nickname              { Faker::Name.initials(number: 10) }
    seibetu_id            { 2 }
  end
end
```
#アプリ名/app/models/seibetu.rb
```ruby
class Seibetu < ActiveHash::Base
  self.data = [
    { id: 1, name: '--' },
    { id: 2, name: '男性' },
    { id: 3, name: '女性' },
    { id: 4, name: 'ゲイ' },
    { id: 5, name: 'レズ' },
    { id: 6, name: '性別は答えたくない' }
  ]

  include ActiveHash::Associations
  has_many :users
  has_many :loves
end
```

#Gemfile

```ruby

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails'
  gem 'faker'
end

group :development do

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers'
end
gridの使い方　グリッドcssを理解しよう(グリッドエリア)

# はじめに
最近知ったGridのエリアを使ったレイアウトがとても簡単で今まで使っていたflexboxよりも使いやすかったので、使い方をまとめてみました。

# グリッド線
はじめにgrid線について、
gridでは

- Y軸が「row」
- X軸が「column」

のように表します。

# 作成
それでは実際に作ってみます。今回は聖杯レイアウトという形を作っていきます。
形は下のようになります。

```html
---------------------------------------------------------------
| footer                                                      |
---------------------------------------------------------------
| left              | center                 | right          |
---------------------------------------------------------------
| footer                                                      |
---------------------------------------------------------------
```
# html

今回はhtmlをこのようにしておきます。

```erb
<div class="oya">
   <div class="grid-header">上</div>
   <div class="grid-left">左</div>
   <div class="grid-center">中央</div>
   <div class="grid-right">右</div>
   <div class="grid-footer">下</div>
</div>
```

# css
それではgridを使っていきます。
まず親要素にdisplay:grid;を指定します。
次にx軸とy軸のサイズを指定。今回は全て100pxにします。
grid-template-rows:　   (行)
grid-template-columns;  (列)

```css
.oya {
     display:grid;
     grid-template-rows:100px 100px 100px;
     grid-template-columns:100px 100px 100px;
}
```
次にgrid-area: ;を用いて子要素に名前をつけます。

```css
.oya {
     display:grid;
     grid-template-rows:100px 100px 100px;
     grid-template-columns:100px 100px 100px;
}

.grid-header {
  grid-area: header;
}

.grid-left {
  grid-area: left;
}

.grid-center {
  grid-area: center;
}

.grid-right {
  grid-area: right;
}

.grid-footer {
  grid-area: footer;
}
```

最後に親要素で表を作りましょう。
grid-template-areas:;を用いて視覚的に作成できます。

```css
.oya {
     display:grid;
     grid-template-rows:100px 100px 100px;
     grid-template-columns:100px 100px 100px;
　　　grid-template-areas:
     header header header
     left   center right
     footer footer footer;
}

.grid-header {
  grid-area: header;
}

.grid-left {
  grid-area: left;
}

.grid-center {
  grid-area: center;
}

.grid-right {
  grid-area: right;
}

.grid-footer {
  grid-area: footer;
}
```

# 完成
完成です。flexboxと比べて、非常に視覚的でわかりやすいものになっているので皆さんもぜひ使ってみてください！
新規Djangoプロジェクトの開始時に役立つこと

pythonのwebフレームワークである``Django``

プロジェクト自体は、``django-admin startproject <project-name>``で始められる。

プロジェクトをローンチして、つらつらと開発し始めてもいいんですが、本番環境を見据えて**予め色々やった方がいいこと**をまとめて行こうと思います。

（現在、Djangoを本番環境に移行している最中で、<b>最初からこうしておけばよかった...</b>と思うのでツラツラと書き連ねて行こうと思います。）

## 1. 開発前に全体を考える
プロジェクト全体の構想をある程度練る。アカウント機能はいるのか。機能A、機能B...など。それらに伴い、それぞれの**Application**を大きくしすぎない（views.pyなどが冗長になり、みづらい。アカウント機能と、サービスAが同じアプリにいるのは見栄えがよくない）

## 2.settings.pyを切り分ける
``manage.py``自体は、

```python:manage.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    #os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'zissyu_navi.settings.production')
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<project_name>.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()
```
のようにあり、この

```python
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<project_name>.settings")
```

の箇所で、参照する``settings.py``を指定している。

一つの``settings.py``に、``DEBUG=True``や``DEBUG=False``としてもいいが、毎度書き換えるのは面倒臭いし、ミスの原因になる。そのため、開発環境用と、本番環境用にそもそも、分けてしまう。

そうすることで、``python manage.py runserver``時に、``manage.py``の箇所を変えるだけで良い。例えば、``python dev.py runserver``や``python production.py``など。

なお、ファイル構成を

```
- settings
    - base.py
    - dev.py
    - production.py
```

とすることで、共通する部分（base.py）を開発環境・本番環境用ファイルで``import``することで違う点を明確にできる。（``image``ディレクトリやメールサーバー設定など。）

## 3. ``.env``を最初から作っておく
環境の切り分けは後々聞いてくる。だったら、はなからやる。

## 4. docker、docker-composeで開発する
DBやwebサーバーなど、本番環境と同様の環境を構築すると良い。
特に、DBの違いはデプロイ時の障害になりがち。

## 5. test.pyを使う
開発して終わりでなく、動くことを担保する。testプログラムを上手に書ける大人でありたい。

## 6. ``templates``や``static``ディレクトリは上手にまとめる。
以下の構成を考えてみます。

```
- project
    - appA
    - appB
    - manage.py
    - template
        - base.html
        - appA_main.html
        - appA_sub.html
        - appA_landing.html
        - appA_form.html
        - appB_main.html
        - appB_sub.html
        - appB_landing.html
        - appB_form.html
```

``templates``ディレクトリが冗長になり、プロジェクトが大きなると、管理が面倒です。
下記のように、アプリごとの親ディレクトリを作るべきです。

```
- project
    - appA
    - appB
    - manage.py
    - template
        - base.html
        - appA
            - main.html
            - sub.html
            - landing.html
            - form.html
        - appB
            - main.html
            - sub.html
            - landing.html
            - form.html
```


## 7. Classベース開発
``views.py``などで、関数形式だと書きやすい反面、保守性がさがり、読みづらいコードになります。せっかくDjangoにある``Class``（TemplateView,View,FormView,ListViewなど）を使って開発しましょう。慣れるまで、大変ですが、短いコードで書けます。


とりあえず、思いつく限り書きました。今後また思うところがあれば改善していきます。
ぜひ、コメントください。

# 最終更新日
- 2021/2/27
- 2021/08/08
PR-500KIでポート開放のメニューが表示されない

ドコモ光でplalaを利用している自宅にてポート開放を行なおうとすると、メニューの一部が表示されなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/9c90622b-23bd-2a70-d11f-262cef7e468b.png)
このままではIPの固定とポート開放が出来ないのでどうにかこの非表示になっている設定を開放しようとしたところ、裏メニューから設定できるらしい。
https://qiita.com/mukatomo0920/items/236e8f2e79e3004d2062
だが、ここでは裏メニューの1ブロックというところにIPv4設定というものがあるらしいが、私の環境ではそうではなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/283dbacc-7e3e-6523-3334-f6b3e786712a.png)
これを押下しても自分のIPv4アドレスくらいしか表示されず、詳細設定は出来ない。
どうやらこれはplalaでIPoEの有効化を申し込むと起こる現象らしい。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14233409219
これを無効化するにはplalaマイメニューから無効化処理を行う必要がある。
https://www.plala.or.jp/ipv6/
自分の状況がどうなっているかを確認するにはここから行える。
https://www.plala.or.jp/ipv6/kaitsu/

自分は今無効化処理を申し込んだので、この後正常にポート開放が出来たのかはまた後ほど追記する。

5 * * * * curl -u mydns111111:pass https://ipv4.mydns.jp/login.html
そうだ、SQLの勉強をしよう21

#はじめに
SQLに備わっている様々な機能についても理解を深めた一日でした。

##トランザクション
トランザクションとは、いくつかの命令を一つにまとめて、
処理の途中で中断した場合、
その処理を無かったことにしてくれる機能のことです。

ざっくり言うと、いくつかの処理をひとまとまりにしてくれるということです。

##記述方法

```sql

BEGIN;
処理1
処理2
COMMIT;
```
配信済みの通知を削除する

通知で埋もれてしまうようなアプリってあると思います。自分のもそうでした。
履歴のように通知に残しておくものもあると思いますが、不要なのを削除してあげると気が利いてるアプリだなと思います

通知を出すときに指定したidentifierを指定して、以下のAPIを一発叩けば消すことができます。

```swift
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: ["identifier"])
```
ラズパイでMotion使ってたら「watchdog timeout」エラーが発生する

### 発生事象

ラズパイで監視カメラでも作ろうとMotionを入れて動かしていたら、急に

```
[0] Thread 1 - Watchdog timeout, trying to do a graceful restart
```
というエラーを吐いてフリーズしてしまうようになった。ストリーミングサーバも起動しないし、カメラも赤く光ったまま固まってしまう始末…。再起動したり色々しても解消しない…。

### 解決方法（オチ）

カメラの物理的な接触異常が原因でした。
カメラ本体は特に大きく動かしたわけじゃないし、てっきりソフト的な原因かと思いこんでたので無駄に時間を食う羽目になりました。エラーの文字列に惑わされぬよう、ちゃんとカメラ本体の切り分けもやりましょう…。

### 参考ページ
[ラズパイ専用カメラのインストール方法](https://osoyoo.com/2017/05/17/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E5%B0%82%E7%94%A8%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95/)
キャディプログラミングコンテスト2021(AtCoder Beginner Contest 193) 参戦記

# キャディプログラミングコンテスト2021(AtCoder Beginner Contest 193) 参戦記

## [ABC193A - Discount](https://atcoder.jp/contests/abc193/tasks/abc193_a)

2分で突破. 書くだけ.

```python
A, B = map(int, input().split())

print(100 - (B / A) * 100)
```

## [ABC193B - Play Snuke](https://atcoder.jp/contests/abc193/tasks/abc193_b)

3分半で突破. 各店舗ごとに売り切れ前にたどり着けるか判定し、売り切れ前にたどり着けた中で一番安いのを出力するだけ.

```python
INF = 10 ** 18

N = int(input())

result = INF
for _ in range(N):
    A, P, X = map(int, input().split())
    if X - A > 0:
        result = min(result, P)
if result == INF:
    print(-1)
else:
    print(result)
```

## [ABC193C - Unexpressed](https://atcoder.jp/contests/abc193/tasks/abc193_c)

8分で突破. 入出力例2でa<sup>b</sup>で表せるものが少ないことが分かるので、全列挙すればいいなと思いました. 最低2乗なので、Nの二乗根まで回せば OK で計算量的にも問題なし.

```python
N = int(input())

s = set()
for i in range(2, int(N ** 0.5) + 1):
    for j in range(2, N + 1):
        t = i ** j
        if t > N:
            break
        s.add(t)
print(N - len(s))
```

## [ABC193D - Poker](https://atcoder.jp/contests/abc193/tasks/abc193_d)

18分半で突破. 81パターンしかないので、何も難しいことはなく、全部計算すれば OK.

```python
def f(cards):
    c = {}
    for i in range(1, 10):
        c[i] = 0
    for i in cards:
        c[i] += 1
    result = 0
    for k in c:
        result += k * pow(10, c[k])
    return result


K = int(input())
S = input()
T = input()

all = {}
for i in range(1, 10):
    all[i] = K

s = list(map(int, S[:4]))
t = list(map(int, T[:4]))

for i in s:
    all[i] -= 1
for i in t:
    all[i] -= 1

x = 9 * K - 8

result = 0
for i in range(1, 10):
    if all[i] == 0:
        continue
    a = all[i] / x
    all[i] -= 1
    k = f(s + [i])
    for j in range(1, 10):
        if all[j] == 0:
            continue
        b = all[j] / (x - 1)
        l = f(t + [j])
        if k > l:
            result += a * b
    all[i] += 1
print(result)
```
Gitコマンドの前に特定の処理を挟む方法

# はじめに
Gitを使ってる際に、コミット前に静的チェックを実施するためにあれこれ調べたので、記事にまとめました。

# この記事で得られること
- Gitコマンドの前に特定の処理を挟む方法

# 最終的な成果物
package.jsonに下記を指定することで、git commit前に静的チェック(lint)を実行できる。

```package.json
  "husky": {
    "hooks": {
      "pre-commit": "npm run lint"
    }
  },
```


# 環境/前提
![<LABEL>-<MESSAGE>](https://img.shields.io/badge/node-14.15.0-<COLOR>) ![<LABEL>-<MESSAGE>](https://img.shields.io/badge/npm-6.14.8-<COLOR>) ![<LABEL>-<MESSAGE>](https://img.shields.io/badge/git-2.29.2-<COLOR>)

- 上記ライブラリがインストールされていること。

# Gitのコマンドを検知する仕組み
最初に、Gitのコマンドを検知する仕組みについて紹介します。

Gitには、Gitの特定アクションを検知してカスタムスクリプトを叩く仕組みである「Gitフック」が提供されています。
この「Gitフック」を利用することで、gitコマンド実行時に処理を割り込ませることができます。

https://git-scm.com/book/ja/v2/Git-のカスタマイズ-Git-フック 

Gフックの例

| フック | タイミング |
|:--|:--|
| pre-commit |コミットメッセージが入力される前に実行  |
| prepare-commit-msg | コミットメッセージエディターが起動する直前、デフォルトメッセージが生成された直後に実行 |
| post-commit | コミットプロセスが全て完了した後 |

# Gフックを利用したnpmパッケージ
Gフックを利用して、特定処理を挟むサポートをしてくれるパッケージは主に下記があります。
・GHooks(https://github.com/ghooks-org/ghooks)
・Husky(https://github.com/typicode/husky#readme)
・Pre-Commit(https://github.com/observing/pre-commit)

パッケージを比較してみると、Huskyが最も人気がありアップデート頻度も高いので、Huskyで実装していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/ce0e5a31-5529-d41b-e5aa-d77851464bed.png)
https://www.npmtrends.com/git-hooks-vs-husky-vs-pre-commit

# 手順
## huskeyのインストール

下記コマンドを実行し、huskeyをインストールする。

```
npm install husky --save-dev
```

参考
https://typicode.github.io/husky/#/?id=manual

## package.jsonに、Gフックとコマンドを設定

下記のように、package.jsonに"husky"の設定を追記すればOKです。

例：git commit前にnpm run lintを実行する。

```package.json
  "husky": {
    "hooks": {
      "pre-commit": "npm run lint"
    }
  },
```


# まとめ

huskyを使えば、簡単に任意のコマンドをGitの特定アクション前後に挟むことができます。
モダンJavascript基礎  分割代入を学んでコードの可読性を上げよう！

## はじめに
今回はES2015(ES6)で追加された分割代入について学んだことをまとめていこうと思います！
わかりにくいところや間違っているところがあったら、ご指摘お願いします！

## 分割代入とは
まず分割代入について説明していきます。分割代入を簡単に説明すると,

**オブジェクトからプロパティを取り出して変数に代入するもの**

です。

ちょっとイメージが湧きにくいですよね。コードで解説していきます。

```javascript

const myProfile = {
  name: "田中",
  age: 20,
};
```
このようなオブジェクトがあるとします。そしてこのオブジェクトを使った変数を定義します。

```javascript

const myProfile = {
  name: "田中",
  age: 20,
};

const message1 = `私の名前は${myProfile.name}です。年齢は${myProfile.age}です。`;
```
この変数message1の中身をconsole.logで見てみると
![console.log](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048562/0db0d15a-1f4e-78b3-4cf9-39e38628909c.png)
このようになります。

これでも別にいいのですが、もっとオブジェクトの変数名が長かったり、設定項目が多かったりすると、冗長で読みづらいコードになってしまいます。

そんな時こそ**分割代入**の出番です！！

```javascript
const myProfile = {
  name: "田中",
  age: 20,
};
//分割代入構文↓
const {name,age} = myProfile;
```
この式で何をしているのかというとmyProfileというオブジェクトからname,ageというプロパティを取り出しています。左辺が取り出したプロパティで、右辺が取り出されたオブジェクトになります。

記述する順番に気をつけてください〜。
 
```javascript
const myProfile = {
  name: "田中",
  age: 20,
};
const {name,age} = myProfile;
const message1 = `私の名前は${name}です。年齢は${age}です。`;
```
コードがすっきりしましたね。console.logで変数message1の中身も見てみましょう。
![console.log](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048562/d2589ff6-85a2-b1e6-b904-8fa83ea03b19.png)
さっきと同じ結果になりました。このように分割代入を使えば、コードの可読性が上がるので、ぜひ使っていきましょう！
## 配列に分割代入を使う場合
オブジェクトだけでなく、配列にも分割代入は使うことができます。

```javascript
const myProfile = ['田中', 20];
const message1 = `私の名前は${myProfile[0]}です。年齢は${myProfile[1]}です。`;
```
このようなコードに分割代入を利用すると

```javascript
const myProfile = ['田中', 20];
const [name,age] = myProfile;
const message1 = `私の名前は${name}です。年齢は${age}です。`;
```
ここまで読みやすくなります！！
配列の場合、分割代入で最初に指定した変数に配列の0番目の要素が入り、２番目に指定した変数に配列の1番目の要素が入ります。配列は変数の順番が大事になってくるので気をつけてください。
##最後に
分割代入はよく出てきますし、意味を知ってないと理解できないと思うので、しっかり勉強していきましょう！！！
[Fetch.ai]AEAのQuickStartをやってみた

## [Fetch.ai]AEAのQuickStartをやってみた

https://docs.fetch.ai/aea/quickstart/

AEAs とは Autonomous Economic Agents (AEAs)の略 = 自律型エージェント

### aea をインストール

System Requirements を確認すること。

fetchai_aea_agent direcotory を作成して、aea をインストールする。

```
mkdir fetchai_aea_agent
cd fetchai_aea_agent
pipenv install 'aea[all]'
pipenv shell
aea init
```

```
(fetchai_aea_agent) ➜  fetchai_aea_agent git:(develop) ✗ aea init
Please enter the author handle you would like to use: 
Do you have a Registry account? [y/N]: 
Create a new account on the Registry now:
Email: 
Password: 
Please make sure that passwords are equal.
Confirm password: 
Do you want to subscribe for developer news? [y/N]: y
Please visit `https://aea-registry.fetch.ai/mailing-list` to subscribe for developer news
Successfully registered and logged in:
    _     _____     _    
   / \   | ____|   / \   
  / _ \  |  _|    / _ \  
 / ___ \ | |___  / ___ \ 
/_/   \_\|_____|/_/   \_\
                         
v0.10.1

AEA configurations successfully initialized: {'author': ''}
(fetchai_aea_agent) ➜  fetchai_aea_agent git:(develop) ✗ 
```

### agent の作成


```
aea create aea_agent
cd aea_agent
```

directory 構造は以下に記載がある

https://docs.fetch.ai/aea/package-imports/


### Skill

Skill については以下に記載がある

https://docs.fetch.ai/aea/skill/

Skill や Protocol は以下から探せる

https://aea-registry.fetch.ai/


#### Echo skill を追加

```
aea add skill fetchai/echo:0.14.0
aea add protocol fetchai/default:0.12.0
```


### AEA を実行

```
aea run
```


### AEA へメッセージ送信


まず、別のTerminalで同一Directoryに移動する



```
aea interact
```

でinteractive tool を実行する

そのコマンドが実行されているところで、以下のコマンドを実行する。

```
echo 'recipient_aea,sender_aea,fetchai/default:0.12.0,\x08\x01\x12\x011*\x07\n\x05hello,' >> input_file
```

AEA側でメッセージが受信できている。

```
info: [aea_agent] Echo Behaviour: act method called.
info: [aea_agent] Echo Handler: message=Message(sender=aea_agent_interact,to=aea_agent,content=b"echo 'recipient_aea,sender_aea,fetchai/default:0.12.0,\x08\x01\x12\x011*\x07\n\x05helloworld,' >> input_file",dialogue_reference=('e1be93a7101d01683dfb323606b341c49b4138512ca406791eccfffbc9733b68', ''),message_id=1,performative=bytes,target=0), sender=aea_agent_interact
```

ref. 

https://docs.fetch.ai/aea/quickstart/

https://github.com/tys-hiroshi/fetchai_aea_agent
Python+OpenCVでイラスト塗り絵化プログラムの作成

# はじめに
塗り絵をやりたくなったが、塗り絵を買いにいくのがめんどくさかったので、自分で作ってみた。
画像処理はopencvを利用した。
色鉛筆は100均に買いに行った。

# 完成物
### 元画像
![FREE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/1776b4e2-8344-7881-0ba8-3caa6c8639dc.jpeg)

### 塗り絵化
![free3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679107/5c64a321-695d-197f-f99f-64be8b40d5af.jpeg)

# 準備
### opencvのインストール
コマンドラインに下記コマンドを入力
```pip install opencv-python```

# 塗り絵化アルゴリズム
1. 画像入力
2. グレースケール化
3. 膨張処理
4. ２と３の差分取得
5. 白黒反転

目的としては、画像のエッジを取得したいだけなので、エッジ抽出フィルタとかを使ってもできるかもしれない。
有名所で言えば、ソーベルフィルタ・ラプラシアンフィルタ・キャニーフィルタなど。
試していないから、気が向いたら今度やってみてもいいかも。

今回は、エッジが強く出過ぎるのを避けるために、エッジフィルタは利用しなかった。
画像を少し膨張させて、元の画像と差分を取ることで、エッジを抽出した。
差分を取ると、エッジが白・ベタ塗りが黒、で出力されるので、最後に白黒反転させて完成。

# 実際利用したコード
```toNurie.py
import numpy as np
import cv2

#1. 画像入力
#2. グレースケール化(グレースケールで入力)
img = cv2.imread('Free.jpg', cv2.IMREAD_GRAYSCALE)

#3. 膨張処理
neiborhood = np.ones((5, 5), dtype=np.uint8)
dilated = cv2.dilate(img, neiborhood24, iterations=1)

#4. ２と３の差分取得
diff = cv2.absdiff(dilated, img)

#5. 白黒反転
result = 255 - diff

#画像出力
cv2.imwrite('output.jpg', result)
```

# 終わりに
好きなアニメシーンの塗り絵ができちゃう！
【Java】AtCoderのABC-193に参加しました。

こんばんは。

2021/2/27に、AtCoderのABC-193に参加しました。
レートは以下の通りとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/bdf51ae4-1f22-de68-c080-79133545630f.png)

https://atcoder.jp/users/ishikawaryou

残念ながらC問題でつまずきました。

順位は5353位でした。C問題が解けた前回よりも良かったです。
レートは184→197に更新！200まであと少し！たぶん次は超えるでしょう。

###A問題

A円の品物がB円で売られていた。何割引か？
まあこれは問題の通りですな。

```java
import java.util.Scanner;

public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
  double a = sc.nextDouble();
  double b = sc.nextDouble();
  System.out.println(((a-b)/a)*100);
}
}
```


###B問題
人気ゲーム機を買いたいが、N箇所の店に売っている。
それぞれ、自宅から徒歩A分のところに、P円でX個の在庫がある。
0.5分ごとに1個ずつ売れてしまう。
一番安く手に入る価格はいくらか？


```java
import java.util.Scanner;

public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
  int n = sc.nextInt();
  int a[] = new int[n];
  int p[] = new int[n];
  int x[] = new int[n];
  int min = 1000000000;
  char flg = '0';
  for(int i=0;i<n;i++){
  a[i] = sc.nextInt();
  p[i] = sc.nextInt();
  x[i] = sc.nextInt();
    if((x[i]-a[i])>0){
        flg = '1';
        if(p[i]<min){
          min = p[i];
        }    
    }
  }
  if(flg=='0'){
  System.out.println(-1);
  }else{
  System.out.println(min);
  }
  
}
}
```

###C問題
正解を導くロジックにはなってもタイムアウトでだめでした。

###感想
今回は残念な結果ではありますが、また次に向けて頑張ります。
今週はPM関連の試験があり、そちらの注力してプログラミングの練習を休んでいましたので、また次回に向けて練習を積んでいきます。
レート200を直近の目標にして頑張ります。

これからもコツコツ取り組んで、茶色を目指したいと思います！
同じく灰色レベルで頑張っている方、お互い頑張りましょう！
Vimeoでオートプレイのローディング中にunloadを使用する

#現象

vimeoのAPIには、再生中のプレイヤーを初期化させる`unload`というメソッドがある。
しかし、これは、オートプレイなどでプレイヤーがローディングしている間には呼び出すことができない。（再生されている状態では可能）


https://github.com/vimeo/player.js/#unload-promisevoid-error

#解決策
`on`イベント内にコールバックとして記述することで、ローディング後に再生が始まった瞬間に初期化することができる。

```.php
player.on('play', function() {
  if (条件式)
      player.unload();
}
```

#引用
https://github.com/vimeo/player.js
PythonからGPUデバイスが使用可能かチェックする

# TL;DR
Pythonの処理からデバイス番号を指定して，指定したGPUが使えるかどうかをチェックする方法です．
ここで使えるとは，デバイスが存在することを指します．

# GPUデバイスが使用可能かチェックする
NVIDIAからライブラリ等が提供されているわけではないので，nvidia-smiコマンドを叩いた結果から確認します．
（ライブラリがあった場合はご教授お願い致します）

以下のようにします．

```python
"""
GPUデバイスが使用可能か確認する
"""
import subprocess


def check_gpu_device(device: int) -> bool:
    """
    GPUデバイスが使用可能か確認する
    Args:
        device: デバイス番号
    """
    output = subprocess.check_output(["nvidia-smi", "-L"])
    lines = output.decode().split('\n')
    for line in lines:
        if line == "":
            continue
        gpu_device_id = line.split(":")[0]
        if gpu_device_id == f"GPU {device}":
            return True
    return False
```

-Lオプションを付けることで1行1デバイスで列挙できるので，Pythonから扱いやすくなります．
（--query-gpuでもOKです）

# まとめ
PythonからGPUデバイスが使用可能かチェックする処理を紹介しました．
基本的には自分が使っているPCのデバイス番号は把握しているかと思いますが，何かしらのアプリケーションの形で提供している場合には使えるかと思います．
ご参考になれば幸いです．
vueアプリを起動すると "You are using the runtime-only build of Vue where the template compiler is not available"というエラーが発生

環境
vue 2.6.12


##エラー内容
```
You are using the runtime-only build of Vue where the template compiler is not available. 
Either pre-compile the templates into render functions, or use the compiler-included build.
```

##解決方法
1. プロジェクトディレクトリ直下に vue.config.jsを作成
2. module.exports = { runtimeCompiler: true, }　を追加

```vue.config.js
module.exports = {
  runtimeCompiler: true,
}
```

[参考]("https://github.com/vuejs/vue-cli/issues/2754#issuecomment-493290698"参考)
[Rust] WSL2 Ubuntuでcargo build時にspurious network errorが出る

# 環境
WSL2 Ubuntu20.04
cargo 1.50.0 (f04e7fab7 2021-02-04)
rustc 1.50.0 (cb75ad5db 2021-02-10)
# エラーが出た場面
Rustのチュートリアルの「数当てゲームをプログラムする (https://doc.rust-jp.rs/book-ja/ch02-00-guessing-game-tutorial.html) 」で、Cargo.tomlのdependenciesに

```toml
[dependencies]

rand = "0.3.14"
```

と追記し、cargo buildを実行した際に発生。

```
$ cargo build
    Updating crates.io index
warning: spurious network error (2 tries remaining): failed to mmap. Could not write data: Permission denied; class=Os (2)
warning: spurious network error (1 tries remaining): failed to mmap. Could not write data: Permission denied; class=Os (2)
error: failed to get `rand` as a dependency of package `guessing_game v0.1.0 (/path/to/guessing_game)`

Caused by:
  failed to load source for dependency `rand`

Caused by:
  Unable to update registry `https://github.com/rust-lang/crates.io-index`

Caused by:
  failed to fetch `https://github.com/rust-lang/crates.io-index`

Caused by:
  failed to mmap. Could not write data: Permission denied; class=Os (2)
```

# 解決方法
~/.cargo/config内に、以下の内容を追記
ファイルが無ければ作成して記述する。

```config
[net]
git-fetch-with-cli = true
```

# git-fetch-with-cliとは
リファレンスにはこう記載されている。
> If this is true, then Cargo will use the git executable to fetch registry indexes and git dependencies. If false, then it uses a built-in git library.
Setting this to true can be helpful if you have special authentication requirements that Cargo does not support. See Git Authentication for more information about setting up git authentication.

要は、デフォルトのfalse状態だと組み込みのgitライブラリを使用してレジストリとgitの依存関係を取得するけど、trueにするとライブラリではなくgitの実行ファイルを直接叩いて行うよ、的なことを言っているみたいです。

# 参考資料
https://webbibouroku.com/Blog/Article/cargo-install-error

https://doc.rust-lang.org/cargo/reference/config.html
Swiperでスライドがちょっとずれる

## 事象

スライドの左側に次のスライド、あるいは次のスライドとの間のマージンが微妙に見えている。
あるいはcenteredSlidesを指定している場合に、スライドが中央からちょっとずれる。

## 解決方法

swiper-slideにbox-sizing: border-box;を設定する。
スライドにborderを設定している場合、ね。
AppSyncコンソールからクエリ変数の利用する

# 概要

Amplifyのワークショップを行った際のメモ

# ゴール

Amplifyコンソールから`クエリ変数`を利用し、コメントを投稿するGraphQLリクエストを実行する

# 背景

Amplifyの学習で公式のワークショップで学習をする機会がありました。

https://amplify-sns.workshop.aws/ja/

# 事前準備

今回は、事前にaws_consoleというユーザを作成しています。

# 該当範囲

`MVPを作ろう！-POST機能: BACK-END(1)`

https://amplify-sns.workshop.aws/ja/30_mock/20_post_back_end.html

AWSマネジメントコンソールを開き、初めてのクエリ実行としてコメントの投稿を行います。

基本的には、AppSyncのクエリ操作は、Explorerから以下の操作を行うことでリクエスト可能です。

1. `▶︎ createPost` を押下し開く
2. `▼ createPost` に値を入力する

# 前提条件

ここまで `amplify add api` が実行済みなので、`src/graphql/mutations.js` が生成されています。

# TODO

1. 自動生成されたファイルの内容を確認する
2. リクエストの内容をAppSyncコンソールに貼り付ける
3. 実行する

## 1. 自動生成されたファイルの内容を確認する

`src/graphql/mutations.js`内には下記のような箇所が見当たります。

```javascript
export const createPost = /* GraphQL */ `
  mutation CreatePost(
    ~省略~
  ) {
    createTimeline(input: $input, condition: $condition) {
      ~省略~
    }
  }
`;
```

生成されている上記のコードを利用してGraphQLリクエストが実行可能です。

## 2. リクエストの内容をAppSyncコンソールに貼り付ける

1. (上記の) `mutation CreatePost (~略~) {~略~}` をコピーし、AppSyncのクエリに貼り付ける
2. クエリ変数の欄に `$input` 内の `変数:値` を記載する

まずは、下記の内容をクエリとして貼り付けます。

```graphql
mutation CreatePost($input: CreatePostInput!, $condition: ModelPostConditionInput) {
  createPost(condition: $condition, input: $input) {
    type
    id
    content
    owner
    timestamp
  }
}
```

次に、下記の内容をクエリ変数の欄に貼り付けます。

(timestampは`10`などでも問題ありませんが、`date +%s` で出力し、貼り付けて利用してください。)

```graphql
{
  "input": {"content": "HelloWorld", "timestamp": 1614426783, "type": "post" }
}
```

## 3. 実行する

実行すると、以下の画像のようになります。

![appsync.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159719/8df0692b-66cb-180d-aa56-096ab8cc8562.png)

Queryの操作について下記の記事が参考になったので載せておきます。
https://qiita.com/shunp/items/d85fc47b33e1b3a88167#comments

## 4. 確認

### Subscription

1. AWSマネジメントコンソールを計2枚開く
2. onCreatePostを実行する
3. mutationでcreatePostを実行する

#### 1. AWSマネジメントコンソールを計2枚開く

一方(左)は先程のcreatePostです。
他方(右)はSubscriptionであるonCreatePostです。

以下を貼り付けます。

```
subscription OnCreatePost {
  onCreatePost {
    type
    id
    content
    owner
    timestamp
  }
}
```

#### 2. onCreatePostを実行する

(画像:右)のSubscriptionであるonCreatePostを実行すると、
`1個のミューテーションにサブスクライブしました`
と表示され、ボタンの ▶︎ が ■ に変わります。

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159719/44b2329d-0de6-7387-8567-59e6c8aaaa3b.png)

#### 3. mutationでcreatePostを実行する

(画像:左)のcreatePostを実行すると、onCreatePostがPostされたメッセージを受け取ります。

![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159719/28f78c39-2c98-f44d-25f3-f90819cbf13b.png)
【Qiita電子工作部】ニトリのLED時計をハックしてNTP時計にしてみる（LED基板解析編）

## [ESP32でニトリLED時計ホルツMのLED基板を点灯させる。（その1）](https://qiita.com/riraosan/items/b38e11ea974d6900a515#todo)
元記事は[こちら（リンク）](https://qiita.com/riraosan/items/b38e11ea974d6900a515#todo)。この記事は元ネタからの派生記事となります。

### ニトリLED時計のLED基板を解析する。

前回こんな感じでニトリLED時計を分解しました。
LED基板があるので、それを調べてみたいと思います。
<img width="300" alt="nitori led clcok M" src="https://github.com/riraosan/riraosan.github.io/blob/master/image/IMG_1236.jpeg?raw=true">

### 結論から示しますと。。

早速、調べたところ、次のことがわかりました。

- [7セグLED](https://ja.wikipedia.org/wiki/7%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4)は[アノードコモン](http://www.my-craft.jp/img/aboutled/led_kyokusei_7segu4.JPG)でした。
- 12個のポートと各デジット＆各セグメントの関係は次の画像の通りでした。
<img width="300" alt="nitori led clcok M" src="https://github.com/riraosan/riraosan.github.io/blob/master/image/IMG_1252.jpeg?raw=true">

時間がないので、手書きを写真で撮るという方法が良いですね。物覚えが悪い私には記憶力強化にとても良い。:v:
LED1,LED2,LED3,LED4と書いているところはDIGIT１...と書いたほうが良いのかな。
1,8,9,12番ポートが共通（コモン）で各セグメントが画像の右下のようになっていると。コモンはアノードということで、電池的には＋極ですね。

### 調べ方について

適当に１２個のポートにコネクタをくっつけて、ブレッドボードに挿してからLi-ion電池で５Vを印加してみました。
2,3,4,5,6,7,10,11ポートに、ジャンパワイヤ（＋極）を接触させていきます。そうすると、各セグメントが光るわけです。めんどくさいですねー。

<img width="300" alt="nitori led clcok M" src="https://github.com/riraosan/riraosan.github.io/blob/master/image/IMG_1248.jpeg?raw=true">
ブレッドボードにフラットケーブルを挿してみる。
<img width="300" alt="nitori led clcok M" src="https://github.com/riraosan/riraosan.github.io/blob/master/image/IMG_1247.jpeg?raw=true">
リチウムイオン電池とブレッドボードを繋いで、電池の３．７Vから昇圧された５Vを印加しました。電流は何mA流れてんのかな？よくわかりません。だいたい数mAぐらいだと思いますが。
<img width="300" alt="nitori led clcok M" src="https://github.com/riraosan/riraosan.github.io/blob/master/image/IMG_1251.jpeg?raw=true">
何も光っていません。抵抗は12番ポートに接続しています。
<img width="300" alt="nitori led clcok M" src="https://github.com/riraosan/riraosan.github.io/blob/master/image/IMG_1249.jpeg?raw=true">
LED基板が上下逆になっているのですが、左から４番目の桁のセグメント(g)が点灯しました。

### マイコンから簡単に点灯させるにはどうしたらいいんだろうか？

時間が土日しか無いので、なるべく労力をかけずに７セグメントLEDを点灯させたいと思います。色々調べると便利なLEDドライバが見つかりました。
[TM1637](https://akizukidenshi.com/catalog/g/gI-13224/)を使おうかなと思います。秋月電子、行ってみたいなぁ。
データシートを眺めてみると、2線式で、一つはクロック、一つはデータ？ということでマイコン２ポートで制御できそうです。明度もコントロール出来るとのこと。ホンマでっか？:rolling_eyes:
![TM1637](https://akizukidenshi.com/img/goods/C/I-13224.jpg)
>中国タイタンマイクロエレクトロニクス社のキースキャニング機能付きの7セグメント用LEDドライバーICです。Arduinoのサンプルがインターネットで入手できるため扱いやすいです。

次は、[TM1637ドライバをgithubからダウンロード](https://github.com/avishorp/TM1637)して、[ESP32で動かしてみますかねー。](https://qiita.com/riraosan/items/dc52ce7e3cadd3a12f1a)

---
（2021-03-10）
TM1637がまだ届きません。。

（2021-02-27）
アマゾンで注文して配送中です。チャイナから送られてくるはずなので、気長に待っときましょうか。
【Rails】JSが読み込まれない時の対処法

railsアプリにて、JSの書き方は間違っていないはずなんだけど動かない！っていうことがありました。

# 原因
DOMが読み込まれる前に、JSが実行されて探しているDOMが見つからずにエラーとなっていた。


# 方法
実行したい処理を間に書いて下さい。
変数にDOMを指定する処理も全てこの中に書くようにして下さい。
そうすると、DOMが全て読み込まれてから実行されます。

```javascript
document.addEventListener( 'DOMContentLoaded', function(){
    // 実行したい処理
}, false );
```
Lodashを使って配列の差分を取得する

## はじめに

開発しているアプリでGoogleカレンダーの予定を同期した際にデータベースに保存するようにしています。しかし、カレンダー側で削除した予定がデータベースには残っていて、表示されてしまっていました。
削除済みの予定をデータベースから削除する際に、データベースに保存している予定とGoogleカレンダーから取得した予定の差分を取得したいと思いました。
そこで、[Lodash](https://lodash.com/)を利用すると配列の差分を簡単に取得することができます。

## 準備

### インストール

npmの場合

```
$ npm i -g npm
$ npm i --save lodash
```

yarnの場合

```
$ yarn add lodash
```

### インポート

```
import _ from "lodash";
```

## 使い方
[_.differenceWith](https://lodash.com/docs/4.17.15#differenceWith)の第一引数に対象の配列、第二引数に比較対象の配列、第三引数にコンパレーターを指定します。

```
console.log(dbEvents)
// →[ { id: "idOfEvent1"}, { id: "idOfEvent2"} ]

console.log(calendarEvents)
// →[ { id: "idOfEvent1" }, ]

const diff = _.differenceWith(dbEvents, calendarEvent, (objValue, othValue) => {
  // 第一引数のidと第二引数のidが一致した場合はtrueを返す
  if (objValue.id === othValue.id) {
    return true;
  }
});

console.log("Diff is", diff);
// → Diff is [ { id: "idOfEvent2" } ]
```

<br>
- Miyata Koki -
[O:inc.](https://o-inc.jp/)でAmplify×React×React Nativeを使用して開発しています。大学のゼミでは統計学をPythonで行っています。
インターンやゼミで学んだ情報を発信していくので、フォロバするのでぜひこちらのアカウントのフォローお願いします！
Qiita初心者の本音

昨日初投稿したのですが、スマフォで投稿したからか、かなり書きにくかったです。
Markdown方式で投稿しましょうとの事ですが、それ以前に上のカテゴリタグ(?)の＋ーがよく分からないのです。折角リクエストして下さったのに分からなさすぎてて恥ずかしい。
ググってもよく分からないのでこれは質問していいものか…もうちょっと調べてから伺います。
Emacs で Julia の開発環境を整える

Julia では REPL を使って実行結果を見ながらコードを書くケースが多いかと思います。
ログが残るように Jupyter Notebook を使ったり、エディタで `.jl` ファイルに書き込んだりすると思いますが、私の場合 Emacs をメインで使っているため、現状の私的最適な Emacs での Julia 開発環境をまとめます。

## Language Server のインストール
補完や関数定義を参照するために Language Server のパッケージを追加します。

https://github.com/julia-vscode/LanguageServer.jl

Julia REPL

```sh
$ julia
```

`]` をタイプして Package モードに移行し、LaunguageServer のパッケージを追加します。

```jlcon
(@v1.7) pkg> add LanguageServer
```

下記コマンドを実行して Language Server を起動できるようになります。

```
$ julia -e "using LanguageServer, LanguageServer.SymbolServer; runserver()"
```

## Emacs で下記3つのパッケージをインストールする

- `eglot`
    - Emacs で LSP を利用するためのクライアント

https://github.com/joaotavora/eglot



- `julia-mode`
    - Julia のコードを書くときのマイナーモード

https://github.com/JuliaEditorSupport/julia-emacs

- `julia-repl`
    - Emacs から Julia REPL を利用するためのパッケージ

https://github.com/tpapp/julia-repl


下記設定を追加します。

```el:init.el
;; αなどの文字幅が曖昧な文字を多用するため
(set-language-environment "UTF-8")

(require 'eglot)
(add-hook 'julia-mode-hook 'eglot-ensure)

(require 'julia-mode)
(require 'julia-repl)
(add-hook 'julia-mode-hook 'julia-repl-mode)
(add-to-list 'eglot-server-programs
             '(julia-mode . ("julia" "-e using LanguageServer, LanguageServer.SymbolServer; runserver()")))
```

## 上記環境でできること

カーソル位置の関数のドキュメントの参照できます。
<img width="800" alt="スクリーンショット 2021-02-27 19.44.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32147/96622131-dc25-f927-bcf7-75708f191543.png">

自作関数のドキュメントも同様に参照できます。
<img width="800" alt="スクリーンショット 2021-02-27 19.50.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32147/1f144cad-beef-f381-bb50-019caa492813.png">


Julia REPL でできる `\alpha` などの補完も効きます。
![Kapture 2021-02-27 at 19.49.39.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32147/64e265bf-b0be-b9f8-a295-0225e4d3ff3e.gif)

カーソル行や選択範囲を `C-c C-c` で Julia REPL で実行できます。
![Kapture 2021-02-27 at 19.54.20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32147/8687ccb9-9118-e274-6abd-fcc40e38c879.gif)
github1sを使ってGitHubをVSCode風にする方法

#はじめに
私はプログラミング初心者で、GitHubを閲覧しているときにいつも利用しているVSCodeのようにGitHubを閲覧できたならと感じることがあります。最近だと私はTwitter APIを使っていて、TweepyというPythonライブラリを調べるためにGitHubでどのような機能があるのか調べることが多々あります。その時に表示されるのが下の画像のページです。
↓これとか
![スクリーンショット (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/9c3a9ddd-0324-1b04-1db1-a1a314689a9e.png)
↓これ
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/1de951cb-813d-b225-c310-b66e0248bd1f.png)

このGitHubをもっとエディタのように表示できる機能があればいいなと思ったわけです。
#方法
ではどうやって導入するのか。答えはとてもシンプルです。github1sというツールを使います。github1sとはGitHubのリポジトリコードをVSCode風に表示してくれるツールです。とにもかくにもURLをほんの少しいじってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/c4af65e6-81a5-19df-4af7-ce8878952e4b.png)
↓githubの後ろに"1s"を付け加えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/0e12c955-25ba-2bc0-5dff-e1b39c2e1b11.png)
すると先ほどまで見ていたはずのGitHubがVSCode風に様変わりします。
(ちなみにこの1sというのはone secondという意味らしいです。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/7c4d7b5a-d294-e4a7-d39c-23b94b3a83ad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693681/efb1d76a-fa43-67b4-70ff-a3d2145991c2.png)
こうすることでVSCodeを使っている感覚でGitHubを閲覧することができます。
この記事で取り上げたPythonライブラリ TweepyのGitHubページのリンクを貼っておきます。ぜひ試してみてください
[ここをクリック](https://github.com/Tweepy/Tweepy )

#まとめ
もし普段からVSCodeに使い慣れていて、GitHubを似たように使ってみたいという方はぜひURLの"github.com"を"github1s.com"に書き換えてみてください。
【monaca/iOS】<input type="file" accept="image/*">でカメラがクラッシュする原因


<hr>
<b>問題：input type="file" accept="image/*"で画像を取得するとき、カメラを起動しようとするとクラッシュする

<br
<b>状況：monacaでマークアップ言語とJavaScriptで開発　Cordovaバージョン10.0.0

<b>結論：クラッシュするのは、monacaのカメラプラグインを有効にしていなかったから。

<hr>

monacaでオナ禁アプリを作ったのですが、App Store Connectに申請したところ

<b>Apple『カメラを起動した時にクラッシュするぞ。それ直してから出直してこい』</b>

とリジェクトされてしまいました。該当箇所は

```html
<input type="file" accept="image/*">
```

で画像を取得して表示、ローカルストレージに保存するという機能です。PCだとFinderが呼び出されますが、iOSだとこの画面が出て3つのオプションから選べるという仕様になっています。

![IMG_6171.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159193/c604fd48-404b-4577-4202-331976c9909d.jpeg)

フォトライブラリから画像を選ぶという使い方を想定していたので実機確認でも「写真を撮る」についてはスルーしてしまっていました（アホ）

で、Appleに指摘されたのは、「写真を撮る」をタップするとクラッシュする、ということについて。

確かに、「写真をとる」を押した瞬間クラッシュします。「フォトライブラリ」と「ブラウズ」はちゃんと動くのに、なんでこれだけ？

#目次
[1.カメラ操作プラグインを有効にし忘れている](#1-カメラ操作プラグインを有効にし忘れている)
[2.カメラ操作プラグインを使う際に気をつけること](#2-カメラ操作プラグインを使う際に気をつけること)
[3.まとめ](#3-まとめ)


#1. カメラ操作プラグインを有効にし忘れている

クラッシュの原因はおマヌケな理由で、それは<b>「カメラ操作のプラグインを有効にしていなかったから」</b>でした。そりゃクラッシュします。monacaの「設定」=>「Cordovaプラグインの管理」=>「camera」を有効にすることで、カメラを使えるようになります。

#2. カメラ操作プラグインを使う際に気をつけること

カメラプラグインをオンにしただけでは、別の問題で審査に通らなくなります。

Guideline 4.0 - DesignとGuideline 5.1.1 - Legal - Privacy - Data Collection and Storageに引っかかるためです。

どういうことかというと、カメラプラグインをONにしただけの状態だと、

![attachment.Screenshot-0223-114855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159193/a4b4f667-5f64-29ee-f06e-6d0309bed9d7.png)

こんな風に、モーダルの表示が「need camera access to take pictures」と、デフォルトの文章になっています。このモーダルの文章はユーザーがアクセスの許可を判断するにあたって非常に大切な情報でして、デフォルトのままだと、<b>大事な情報を英語で書くな</b>というのと、<b>ユーザーがデータがどのように使用されるか知ることができない</b>という理由で却下されます。

つまりこのモーダルの文章を書き換える必要があります。

どうやるかというと、<code>config.xml</code>ファイルの <code>&lt;edit-config></code>に以下のような記述があるので、これを書き換えます。
```
<edit-config target="NSCameraUsageDescription" file="*-Info.plist" mode="merge">
    <string>need camera access to take pictures</string>
</edit-config>
```
この```<string></string>```の部分です。

ただし、文章はなんでもいいわけではなくて、<b>カメラを必要とする機能</b>を明記し、<b>ユーザーのデータ（ここでは撮影した画像）をどのように使用するかの例</b>を含める必要があります。

わかりにくいと思うので私のアプリの例を出すと、こんな感じに書いておけばOKです。

![IMG_A60A7509C0A9-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159193/6c31645d-dc4d-16f8-d706-af12a7061beb.jpeg)


もっと綺麗な書き方があるだろ！と思われるかもしれませんが、とりあえずこれで審査は通ります。

#3. まとめ

・カメラを使おうとするとクラッシュするのは、カメラプラグインがOFFになっているから。
・カメラを使う場合は<code>config.xml</code>にてデータの必要性とその使用目的を明記する必要がある。
・僕のアプリを見ていってくれると喜びます。
<hr>
オナ禁アプリ↓
![kinyoku-100px-icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159193/e4e3ef0f-f893-59bd-540b-d3c09d83e2ae.png)
[禁欲エボリューション](https://apps.apple.com/jp/app/禁欲エボリューション/id1553966013)

<hr>
初めて作ったアプリ↓
![mem-100px-icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159193/c4b778ff-7a14-b489-c71e-23fe6f6b7eb8.png)
[文字数制限メモ](https://apps.apple.com/jp/app/文字数制限メモ/id1552651234)
[Ruby on Rails] データベースの削除の仕方

色々あってDBを作り直すことになったので、その備忘録を書いていきます。
とても繊細なdatabase.ymlなどを修正する際にも使えるので覚えておこうと思います。
ちなみに**シークエルプロ**と言うデータベースを視覚化できるアプリを使っています。

   　

##データベースを削除する方法
database.ymlに記載されている、エンコードの設定やデータベース名を誤った状態でデータベースを作成してしまった場合は、一度データベースを削除してから作り直す必要があります。

手順は以下のとおりです。
　
　　

**データベースを削除する**
database.ymlを正しい形に修正する
データベースを再度作成する
　

##①データベースを削除する
データベースを削除するためには**rails db:drop**のコマンドを実行します。


```
% cd ~/projects/データベースを作り直したいアプリケーションのディレクトリ
```

ディレクトリ移動後に**rails db:drop**
このコマンドを実行することで、該当するアプリケーションのデータベースを削除することができます。
　
##②database.ymlなどを修正する
データベースを削除できたら、この段階でdatabase.ymlなどを修正します。

③データベースを再度作成する
そして、rails db:createのコマンドでデータベースを再度作成します。

```
% cd ~/projects/データベースを作り直したいアプリケーションのディレクトリ
```

データベースの削除とマイグレーションファイルの適用を一括で行う方法を学ぼう
データベースの設定は間違っていないものの、再度データベースを作り直し、既存のマイグレーションファイルを適用したい場合があります。その場合は、**rails db:migrate:reset**のコマンドを実行します。
　　


```
% cd ~/projects/データベースを作り直したいアプリケーションのディレクトリ
% rails db:migrate:reset
```



このコマンドを実行することで、以下の操作を一括で行ってくれます。
　

データベースを削除する
データベースを再度生成する
既存のマイグレーションファイルをすべて適用する
ただし、データベースを一度削除するため、保存されているデータなどはすべて削除されます。
　　

極力、データベースを消すほどのミスはしたく無いものです。
【Node.js】promiseの非同期処理について

#プログラミング勉強日記
2021年2月27日
[昨日の記事](https://qiita.com/mzmz__02/items/6b83805bc4917810dfb7)でJavaScriptの非同期処理について扱ったが、今回はNode.jsのpromiseの使い方をまとめる。

#promiseとは
　Node.jsのpromiseは、非同期処理を読みやすいコードで実装できる。
　Node.jsでも使用されるJavaScriptでは、非同期処理のときにコールバック関数を使用する。だが、処理が複雑になるほどコールバック関数が入れ子になってしまい、コードの内容がわかりにくくなる。

#Node.jsでpromiseを使う方法
　まず、promiseをインストールする。

```
$ npm install promise
```

　promiseの書き方は以下のようになる。

```js:文法
// promiseパッケージを読み込む
var 変数 = require('promise');

変数(function (fulfilled, rejected) {
  処理内容
}
```

#参考文献
[非同期処理を覚える！Node.jsのpromiseの使い方【初心者向け】](https://techacademy.jp/magazine/16127)
[Rails] CarrierWaveで画像のプレビュー機能の実装方法

#前提
RailsでCarrierWaveを使って画像投稿機能が実装されていること。
[CarrierWaveの実装方法](https://qiita.com/momo1010/items/2d360aa295d91ba99476)

#画像ファイルにidを追加する
Javascriptで処理するときに使うので、画像ファイルにidを追加します。

```
<%= f.label "ユーザー画像" %>
<%= f.file_field :image, id: :user_img %>
```

#画像を表示させる

画像を表示させるコードを追記します。こちらも、Javascriptで処理するときに使うので、画像ファイルにidをつけておきましょう。
また、画像を選択している時としていない時の表示をif文で分けます。


```
<% if @user.image.present? %>
  <%= image_tag @user.image, id: :img_prev %>
<% else %>
  <%= image_tag "user_default.png", id: :img_prev %>
<% end %>
```

#Javascriptに追記する
jsファイルにJavascriptを追記します。
[jQueryを使えるようにする](https://qiita.com/momo1010/items/c32304dce6f2496bfcf4)

```
document.addEventListener("turbolinks:load", function() {
  $(function() {
    function readURL(input) {
        if (input.files && input.files[0]) {
        var reader = new FileReader();
        reader.onload = function (e) {
    $('#img_prev').attr('src', e.target.result);
        }
        reader.readAsDataURL(input.files[0]);
        }
    }
    $("#user_img").change(function(){
        readURL(this);
    });
  });
})
```

　[参考にしたサイト](https://kurose.me/carrierwave-preview/)
【正規表現】<div>などのタグ文字をデリミタ指定する方法【最短指定】

#初めに
`<何か>`のような始点Aから終点Bまでの文字列を正規表現で指定する方法について述べただけの記事です

#本題
始点（今回は「<」）から終点（今回は「>」）までの文字列を単純に正規表現で表すと

```java:正規表現[不正解]
String regExp = "<.*>";
```

こんな形になると思いますがこれだとうまく動きません。

なぜかというと、.*で指定した文字数は貪欲でマッチしうる文字列（最長文字列）にマッチするためです。
そのため、出現するデリミタが一つだけならばいいですが、２つ以上出た場合に途中の文字列全てにマッチしてしまいます。

そのため、最短でマッチするように指定するためには「+」や「*」の後に「?」をつけてあげると最短の文字列にマッチします。

```java:正規表現[正解]
String regExp = "<.*?>";
```

#最後に
今回はJavaの記述で行いましたが、基本的に正規表現は共通で扱われるので他の言語でも動くはずです。
最短マッチはあまり参考資料がないので（僕がみた中では）ハマると結構時間が取られてしまうかなと思い筆を取りました。

かくいう私も数時間ほど悩んでしまいました、、、

参考になれば幸いです
期間が重なっている回数のカウント方法

はじめに
---
稀によくある、期間の重複チェックのカウント方法。
予約の定員制限オーバーのチェックのときなどに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285246/954ba0ec-fca2-2f69-e861-5ad49c126d0c.png)

データ
---
データは以下の感じで持っている想定。（イメージです。）

```typescript
[
  {
    start: 2021/02/27 12:00,
    end  : 2021/02/27 13:30,
  },
  {
    start: 2021/02/27 12:30,
    end  : 2021/02/27 14:00,
  },
  {
    start: 2021/02/27 13:00,
    end  : 2021/02/27 14:30,
  },
]
```

単純な範囲チェック
---
以下のように単純にすべてのデータに対して重なっているデータ数をカウントしていったが、これは失敗だった。

```typescript
let overlapCount: number[] = [periods.length]
for (let i = 0; i < periods.length; i++) {
  overlapCount[i] = 1;
  for (let j = 0; j < periods.length; j++) {
    if (i != j) {
      if (periods[j].start < periods[i].end && periods[i].start < periods[j].end) {
        overlapCount[i]++;
      }
    }
  }
}
```

以下のようなケースで、3と重なっている期間1,2があるため、合計3回とカウントされてしまったので。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285246/71ac6153-7bcd-7250-e4ec-9e5ab0afa4b2.png)

範囲チェックでカウントするには、重なっている2つの期間を探し、さらにその両方と重なっている期間を探して・・・と再帰的に探す必要があり、かなり面倒そう。

開始と終了だけをカウントする
---
発想を変えて、期間を開始・終了混在の1次元配列に詰めて、時間順にソートし、startがあれば1インクリメント、endがあれば1デクリメントする方法を取った。
startが連続している回数がそのまま重なりの最大数になるはず、という発想。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285246/7029d793-7148-b7f4-65f2-e8e6a2054b52.png)

最終的なソースは以下の通り。typescript。
これでうまくいった。はず。
注意点として、startとendが同じ時間の場合は先にendのほうを処理する（デクリメントする）必要があるので、endが上になるように並べること。
（下記では、先にendだけを配列に突っ込んでいる。）

```typescript
    // create all time array
    let times = []
    for (let i = 0; i < periods.length; i++) {
      times.push({ date: periods[i].end,   type: "end" });
    }
    for (let i = 0; i < periods.length; i++) {
      times.push({ date: periods[i].start, type: "start" });
    }
    // sort by time
    times = times.sort((time1, time2) => {
      if (time1.date > time2.date) { return 1; }
      if (time1.date < time2.date) { return -1; }
      return 0;
    });

    // countup with start, count down with end
    let count = 0;
    let max = 0;
    for (let i = 0; i < times.length; i++) {
      if (times[i].type == "start") { count++; }
      if (times[i].type == "end")   { count--; }
      if (count > max) { max = count; }
    }
    return max;
```
AWS S3とは？

#S3（Simple Storage Service）とは？
S3は、**99.999999999%**の耐久性を実現したストレージサービス。
**料金安く**、保存できるデータ量**無制限**。

**【活用方法】
・AWSサービスの利用ログの保存
・静的Webサイト構築
・ビッグデータの分析のデータソースとしての活用
・自動スケーリング設計されたEC2インスタンスのログ保存**
など、様々な場面で活用されています。

#S3冗長化構成
**結果整合性**採用。
保存したデータは、保存した際に自動的に複数のデータセンターに同期される。
要するに、**「更新したら勝手に全体に反映される」**ということ。

#バケットとオブジェクト
データ保存は、**バケット**を作成して、**オブジェクト**としてデータを保存する。
バケットは**複数個**作成可能で、**バケット単位で参照、作成、削除等のアクセス制限を設定**する。
オブジェクトの最大サイズ **5TB**で、保存できる数に制限はありません。

![twitter_EpIDH0iVEAMUXRs.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/9380b80c-22c5-c479-d43f-4d117d053832.jpeg)


#ストレージオプション
**①標準ストレージ**
指定された１年間に99.999999999%の堅牢性と99.99%の可用性を提供、**２拠点**で同時にデータ損失起きてもデータが維持されるように設定されている。

**②低冗長化ストレージ**指定された１年間に99.99%の堅牢性と99.99%の可用性を提供、**単一の施設でデータ**損失を防ぐように設定されている。コスト削減を目的とする場合選択。

#Webホスティング機能
**静的コンテンツ**に限ってWebサイトとしてホスティングする環境を簡単に設定作成することが可能。
動的なコンテンツは、Webホスティングを使用することはできない。

#ライフサイクル設定
オブジェクトの作成から、上書き・削除までの期間を**ライフサイクル**としてどのように管理するか設定できる機能。

**【管理方法】
・スケジューリングによる削除処理
・Amazon Glacierへのアーカイブ**

![twitter_EpMjSbnUwAEIv6v.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/c205acbe-09e0-7fde-74da-9104840b1d8f.jpeg)


#Amazon Glacier
S3と同様に99.999999999%の耐久性を持ちながら、さらに低下価格で利用できる**アーカイブストレージサービス**。
低価格であるが、データ取り出しに**時間がかかります**。
**長期間保存し、アクセス頻度が低く取り出し時間がかかっても問題のないデータを保存することに適している。**
Linux の基本操作①

##ファイルディレクトリの参照（ls）##

**書式**(そのコマンドが用いられる形式を示す）

＄ls （オプション）　（ファイル）

**オプション**（コマンドにつける事により、その動作を変えられる）

-a...  .で始まる隠しファイル等も全て（all)出力

-l... 長（long)形式で出力。

-t... 最終更新時間（time)によって、ソートして出力

※ドットで始まるファイルは隠しファイルであり、システム設定が書かれているファイル等で使われる。

##コピー（cp)##

**書式**
　＄　cp （オプション）　コピー元　コピー先

実例
　＄cp src-file dst-file→src-fileをdst-fileにコピーする

**オプション**

-i...　処理を行う時、確認を行う。誤っての上書きを防ぐ。

-r... ディレクトリをコピーする。cpコマンドは基本的にファイルをコピーする機能だが、-rをつける事により、ディレクトリない全てのファイル、ディレクトリに対してコピーする。

-p... 元のファイルを保存→新しい内容を作成せず、古い情報を保持したままコピーを作成したい場合に使用


##ファイルの移動（mv）##

ファイルを移動する時に使用するコマンド

**書式**
　＄　mv 移動元ファイル　移動先ファイル

実例
　＄ mv src-file dst-fil →src-fileをdst-fileの下に移動する。


**オプション**

-i... コピーのオプションと同じ

-f... 強制的に処理を実行


##ファイルの削除（rm）##

**書式**
　＄　rm ファイル名

実例
　＄　rm file-delete　→file-dleteというファイルを削除しますという意味

**オプション**

-i... コピー（cp）、移動（ムーブ）と同じ

-f... 強制的に処理を実行

-r... ディレクトリを対象とする。ディレクトリのファイルやディレクトリも削除する。

※Linuxを含むunix系OSでは、一度削除したファイルは復活させることはできないので注意。

rmコマンドではオプションなしではディレクトリを削除できない。

##参考文献##
Linux標準教科書