OmniAICreator/Qiita-1.07M huggingface dataset:
かんたん慣性スクロール TweenMax

## TweenMaxと同ライブラリのScrollPluginを使ってページ全体を慣性スクロールさせる方法のメモです。
おしゃれサイトによくあるマウスホイールを動かすとゆっくり画面のスクロールが終わるやつの簡単な実装です。

```js
import gsap from "gsap";
import { ScrollToPlugin } from "gsap/all";
gsap.registerPlugin(ScrollToPlugin);

function smoothScroll(toBottom) {
  let direction = "-=100";
  if (toBottom) {
    direction = "+=100";
  }
  gsap.to(window, {
    scrollTo: { y: direction, autoKill: true },
    duration: 1,
  });
}

let startY;
function touchstart(e) {
  startY = e.changedTouches[0].pageY;
}
function touchmove(e) {
  e.preventDefault();
  const moveY = e.changedTouches[0].pageY;
  if (moveY < startY) {
    smoothScroll(true);
  } else {
    smoothScroll(false);
  }
}
function mousemove(e) {
  e.preventDefault();
  if (0 < e.deltaY) {
    smoothScroll(true);
  } else {
    smoothScroll(false);
  }
}
document.addEventListener("touchstart", touchstart, { passive: false });
document.addEventListener("touchmove", touchmove, { passive: false });
document.addEventListener("mousewheel", mousemove, { passive: false });
```

この記事の内容をさらに改善したものをアップしました。
[かんたん慣性スクロール ver.2 GSAP ScrollSmoother.js ぽいのを実現するメモ](https://qiita.com/TAAARRRO/items/aa3d9e45bdfb9e7ca634)
python初学者の備忘録　代数演算子について

#### [←目次へ](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# 代数演算子とは
`基本`

+ 変数に対して加減乗除の計算に使用する
+ 以下の演算子がある
 
| 演算子| 式 |説明 |
|:-:|:-:|:-:|
| +a | +a | 整数 |
| -a | -a | 負数 |
| + | a + b | 足し算 |
| - | a - b | 引き算 |
| * | a * b| 掛け算 |
| / | a / b | 割り算 |
| % | a % b | a/bの余り |
| ** | a ** b | aのb乗 |
| // | a // b | 割り算(切り捨て) |

:::note info
演算子の優先順位
「+a」,「-a」>「**」>「*」,「/」 > 「//」>「％」>「+」,「-」
:::
文字をhoverすると画像が表示されるようにする



```index.vue
<template>
 <div>
  <p>
   <a href="#" class="Art__viewer">Test
    <span><img src="~@/assets/images/Main/****.jpg" alt=""></span>
   </a>
  </p>
 </div>
</template>

<style>
.Art__viewer:hover {
  position: relative;
    text-decoration: none;
}
.Art__viewer span {
  display: none;
    position: absolute;
    top: -200px;
    left: 150px;
}
.Art__viewer:hover span {
    border: none;
    display: block;
    width: 210px;
}
</style>
```

参考：
https://www.cmons.me/entry/2015/08/21/005115
ansibleのドキュメントの読み方

## TL;DR
公式ドキュメントをちゃんと読むと色々理解できるが、そもそも公式ドキュメントをちゃんと読まないことが多いので、改めて読むことで理解が深められるよってことを伝えたい


## はじめ方

使い方を調べるとき、ググったり、qiitaなどで調べたりして、公式ドキュメントをちゃんと読まないことがありますよね。
ものによっては公式ドキュメントがなかったり、内容が薄いものもありますが、あるものは読んだ方が理解が深まったりします。

まず、公式ドキュメントはこちらです
「https://docs.ansible.com/ansible/latest/」
今回は最新バージョンで見てみましょう。


そして、以下がどう解釈されるか確認してみましょう。state?path?

```
- name: Ensure the tarball dir exists at {{ hogedir }}
  file:
    path: "{{ hogedir }}"
    state: directory
```

以下の中からfileを選択します
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/index.html

するとこんな感じで表示されると思います
![スクリーンショット 2021-09-17 18.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87607/7be5098d-32d5-bb33-c8e2-59ea55bb6989.png)

読んでみると「directory」を選択すると、　サブディレクトリも含めて、作成してくれるらしいですね。

## まとめ

こんな感じで結構書いてあるのでこんな感じ調べてみると、バージョンにあった書き方などできるのではないでしょうか。
ご参考程度にしてもらえればと思います。
[Heroku]エラー：Your account has MFA enabled

1. 状況
2. 原因
3. 対処法



#1.　状況

OS : Big sur

Railsで制作中のアプリを
プッシュしようとしたところ
ログアウト状態でした。

そこでログインしようとコマンド入力。

```ruby:ターミナル
% heroku login --interactive
```

ここでメールアドレス、パスワードを入力。
するとエラーが表示されました。

```ruby:ターミナル
 ›   Error: Your account has MFA enabled; API requests using basic authentication with email and password are not supported. Please generate an 
 ›   authorization token for API access. 
 ›
 ›   Error ID: vaas_enrolled

```

#2. 原因

二段階認証を設定していた為に
セキュリティレベルが上がって
コマンドでのログインができなくなっていたようです。

#3. 対処法

サイトから会員情報にアクセスし
登録されている二段階認証の情報を
ゴミ箱マークで削除してしまいます。

再度、ログインコマンドを使用したところ
無事にログインすることができました。


今回は以上です。

お読みくださりありがとうございました。
fakerを使って投稿に対してのダミーコメントを作ってみた

現在投稿系のアプリを作成しており、1投稿に対してコメントを複数つけるようにしました。
そこでコメントが少ない場合なら良いのですが増えてきたときにコメントを見るために下までスクロールしないといけなくなります。
自分がユーザーでも面倒くさいので他の方法を考えました。

<h1>2つ考えてみました</h1>
1つ目の方法は
（クリックしてコメントを表示）みたいなボタンを作ってボタンがクリックされたら表示する。という動作です
これはjavascriptを使って実装できると思いました。
普段は@commentを(display:none)で消しておいて、onclickでshowさせるみたいにできるはずです。

以下のサイトが参考になると思います。

https://into-the-program.com/display-block-none/

2つ目の方法は
gem 'kaminari' を実装して、設定した数だけ表示して他の要素はページを切り替えることで見れるようにすることです

↓こんな感じ

![スクリーンショット 2021-09-17 17.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1541345/c4fd5c36-b565-3a7c-22ea-5bd87db7269b.png)

<strong>こっちが簡単かなと思ったのでkaminariでやっていこうと思います</strong>

kaminariを使ったのpaginationの実装の仕方は今回は省きます。
こちらの記事を参考にさせて頂きました！

https://qiita.com/you8/items/df68aaee3010e282d1ae

<h1>いざ実装!</h1>
まずはkaminariを導入します
投稿の詳細画面でコメントを表示させ、1ページに付き3件のコメントを表示させたいと思います

```ruby:posts_controller.rb
   def show
    @comments = Comment.all.order(created_at: :desc).page(params[:page]).per(3)
   end
```

orderで投稿が新しい順に表示します。
3件の指定は __.per__ に渡している数字です

ひとまず機能はできたのですが、ちゃんと動くか分かりません。
動作を確認するためには大量のコメントデータを作る必要があるのですが、1つ1つ作っても良いのですがめちゃくちゃ面倒なのでgemを使います

ダミーデータを作るには、__「faker」__というgemを使うとすぐに実装できます

https://qiita.com/ginokinh/items/3f825326841dad6bd11e

今回はコメントのダミーだけ作りたいので、コメントする投稿は1種類でコメントするuserと内容だけをダミーにしたいと思います。

ダミーのユーザーは下のコードで作りました。
nicknameを見ればわかると思いますが、そうですドラゴンボールのキャラをランダムで作りました笑
他にもポケモンやワンピースなどでも作ることができます！

```
20.times do |n|
  User.create!(
    nickname: Faker::JapaneseMedia::DragonBall.unique.character,
    email: Faker::Internet.unique.email,
    password: "3150test",
    password_confirmation: "3150test"
  )
end
```

ダミーの投稿に関しては、
commentsテーブルのカラムがuser_id, post_id, contentを入れています。
ここでどれか指定を忘れていると適用する時にエラーになるので気をつけて下さい

user_idは先ほど作成したダミーを使うので
user_id: rand(1..20)

post_idは固定するので試したい投稿のidを入れて下さい

contentんはランダムで適当なものを作るので
content: Faker::Lorem.sentence

```
 10.times do |n|
    Comment.create!(
      user_id: rand(1..20),
      post_id: 4,
      content: Faker::Lorem.sentence
    )
  end
```

こんな感じで作ることができます！
![スクリーンショット 2021-09-17 18.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1541345/f57b3c90-b70f-1883-a678-5a4fcf25758f.png)


<h1>まとめ</h1>
今回は調べても出てこないようなものだったのでそもそもが実装する必要がないものかもしれません笑
でも自分が試したいものを作れたので満足です！
ちゃんとpaginationも動いてくれたし、超サイヤ人2の悟空にもコメントもらえました！
もし同じようなことを考えている人がいたら活用してやってください！
ありがとうございました！
DNS_PROBE_FINISHED_NXDOMAINになったら

# DNS_PROBE_FINISHED_NXDOMAINになったら

## 状況
google domainsでドメインを購入
DNSにRoute53を使っている

## 対処方法
```
whois <domain>
```
で

```
Name Server:
```

の値と

Route53などのNSレコードが同じ値か確認する
違ったらレジストラのネームサーバを正しいものに変更する

## 原因
google domainsの管理画面に

```
このドメインの全ての設定は無効になっており、変更できません。有効にするには、デフォルトのGoogle Domainsネームサーバを復元してください
```

という文章と
`Google Domainsのネームサーバーの復元`

というボタンが出ていて、メンバーが押してしまったので設定が消えてしまった。

## 参考
[Route 53 を使用中のドメインの DNS サービスにする - Amazon Route 53](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/migrate-dns-domain-in-use.html#migrate-dns-change-name-servers-with-provider)
Cannyの非極大値抑制

# 1.非極大値抑制(Non-Maximum Suppression)

非極大値抑制とは、画素点の局所最大値を求めることである。CanyのSobel演算子の検出されたエッジは太すぎます，私たちはそれらの差分値が十分でない画素点を抑制する必要がある，最大の差分値だけを残して、"エッジを痩せる"目的を達成します。

差分方向に沿って，前と後ろの差分を比べる，差分が足りないピクセルポイントは、エッジの遷移点となり得る，非エッジピクセルを削除，局所最大値以外のすべての差分値を0に抑える,最後に細い線を残しました。  

# 2.非極大値抑制の実現
 
## 2.1 基本的なアルゴリズムは：

> * 現在のピクセルの差分強度と正負の差分方向の2つのピクセルを比較します
> * 現在の画素の差分強度が他の2つの画素と比較して最大である場合、この画素点はエッジポイントとして保持され、そうでないと画素点は抑制される。 

## 2.2 四つの差分方向の限界

Canny演算子の論文では、最大値以外の抑制は、0、90、45、135の4つの差分方向にのみ行われます，各ピクセルの点差の方向は近くの程度によってこの四つの方向で代替されます。この場合、非最大値抑制比較した隣の2つの画素は：

    1）  0：左と右   
    2） 45：右上と左下  
    3） 90：上と下      
    4）135：左上と右下 

このようにするメリットは簡単ですが、このような簡略化された方法は最高の効果を達成することができません，自然画像の中のエッジの差分方向は必ずしもこの四つの方向に沿っているとは限らないからです。そのためには補間が必要です，ピクセルポイントの中で、その位置の差分方向の両側のピクセル値が一番よく合うことを探します。 

## 2.3 |gy|>|gx|場合

> gyはC点Y方向の差分値、gxはC点X方向の差分値です

|gy|>|gx|なら、この点の差動方向がY軸方向に近いことを示していますので、g2とg4はCの上下にあります：

![nm1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234182/564c0056-2570-91c8-3777-738a300582de.jpeg)

Cは中心位置を表します，斜めの直線は差分方向を表します（非極大値抑制は差分方向の極大値である），左の図はgyとgxの方向が同じであることを示しています，右の図はgyとgxの方向が反対です（注意原点は左上にあります），重みは：

    weight = |gx|/|gy|，


 したがって、この場合、内挿表現は：  

    dTemp1 = weight * g1 + (1-weight) * g2;   
    dTemp2 = weight * g3 + (1-weight) * g4;


## 2.4 |gy|<|gx|場合
 この点の差分方向はX軸方向に近く、g 2とg 4は水平方向にあると説明します。

![nm2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234182/c2f0fc0a-e5ad-772d-419c-8eea4bf1a17f.jpeg)  
 
Cは中心の位置を表し、斜めの直線は差分方向を表します。（非極大値抑制は差分方向の極大値である），左の図はgyとgxの方向が反対で、右の図はgyとgxの方向が同じです（注意原点は左上にあります），重みは：  

    weight = |gy|/|gx|，  

 したがって、この場合、内挿表現は：

    dTemp1 = weight * g1 + (1-weight) * g2;   
    dTemp2 = weight * g3 + (1-weight) * g4;


## 2.5 極大値を取得
 次の作業は比較的簡単であり、中心位置CにおけるdTempの差分幅値と二つの補間点における差分幅値dTemp 1とdTemp 2とを比較し、極値点であるかどうかを決定し、コードは以下の通りである：

```java
  if(dTemp>=dTemp1 && dTemp>=dTemp2) {   
    // C点は境界点です   
  }   
  else {   
    // C点は境界点ではあり得ないので、抑制が必要です  
  }
```

***
extend Activesupport::Concernについて

concernsに定義するモジュールでよく書かれているがいまいち何をしているのかよくわかっていなかったので調べました。

### 結論
単純に言えば、`モジュールでのクラスメソッドの定義やそれをincludeする側でクラスメソッドとして追加する方法、クラスレベルでのメソッド呼び出しの容易な方法を提供してくれるもの`だと理解しました。


### 具体例
具体例は以下のページと同じものです。
https://api.rubyonrails.org/v6.1.4/classes/ActiveSupport/Concern.html

例えば、モジュールがincludeされたときに特定の処理を呼び出したり、モジュールのメソッドをクラスメソッドとして追加したい時、通常以下のように書きます。

```ruby
module M
  # https://docs.ruby-lang.org/ja/latest/method/Module/i/included.html
  def self.included(mod)
    # includeする側(例えばクラス)の特異メソッドとしてClassMethodsを追加する -> クラスメソッドとして呼び出せる
    mod.extend ClassMethods
    mod.class_eval do
      before_action :xxx
    end
  end
  
  module ClassMethods
    # クラスメソッドを定義
  end
end
```

ActiveSupport::Concernを利用すると以下のように書けます。

```ruby
module M
  extend ActiveSupport::Concern
  
  included do
    before_action :xxx
  end
  
  class_methods do
    # クラスメソッドを定義
  end
end
```
ActiveSupport::Concern内のicludedやclass_methodsなどのメソッドが面倒な記述を肩代わりしてくれ、簡潔に書けるようになります。
(extendしているのでMのクラスメソッドのように扱える)

　　
また、モジュール間の依存関係もいい感じに整理して書けるようにしてくれます。

例えば以下の場合、HostクラスはBarモジュールをincludeしたいが、BarモジュールはFooモジュールに依存しているので、FooモジュールもHostがincludeしなければならない。

```ruby
module Foo
  def self.included(base)
    base.class_eval do
      def self.method_injected_by_foo
        ...
      end
    end
  end
end

module Bar
  def self.included(base)
    base.method_injected_by_foo
  end
end

class Host
  include Foo # Hostが直接関係のないモジュールまでincludeしている
  include Bar
end
```

Barだけincludeしようとするとエラーになる。

```ruby
class Host
  # include Foo
  include Bar
end

==>  undefined method `method_injected_by_foo' for Host:Class (NoMethodError)
```

ActiveSupport::Concernを使うと依存関係の記述を綺麗に整理できます。

```ruby
module Foo
  extend ActiveSupport::Concern
  included do
    def self.method_injected_by_foo
      ...
    end
  end
end

module Bar
  extend ActiveSupport::Concern
  include Foo

  included do
    self.method_injected_by_foo
  end
end

class Host
  include Bar
end
```


## 参考
ActiveSupport::Concernが具体的に提供してくれるもの。(ソースコード)
https://github.com/rails/rails/blob/83217025a171593547d1268651b446d3533e2019/activesupport/lib/active_support/concern.rb#L110
Djangoでカスタムコマンドを作る

# 概要
Djangoでカスタムコマンドを作成して実行してみる

## カスタムコマンドの環境を作成する

1. アプリケーションのディレクトリに`management`フォルダを作成
1. `management`フォルダに`commands`フォルダを作成
1. 好きなコマンド名を考える
1. `commands`フォルダに`好きなコマンド名.py`ファイルを作成

## コマンドを実行される処理を記述
`好きなコマンド名.py`ファイルの中身

```python:management/commands/好きなコマンド名.py
from django.core.management.base import BaseCommand


class Command(BaseCommand):
    def handle(self, *args, **options):
        self.stdout.write(self.style.SUCCESS('カスタムコマンドを実行したよ'))
```

## 動作確認

```shell
$ python manage.py 好きなコマンド名
カスタムコマンドを実行したよ
```

こんな感じで簡単にカスタムコマンドを作成できます。
動作確認やcronと合わせて定期的に処理を実行させるなど使えると思います。
AndroidStudioでプロキシの設定に苦心した話

## 状況
新しいプロジェクトを始めようとしたときに、
`Received status code 407 from server: Proxy Authentication Required Disable Gradle 'offline mode' and sync project`
とのこと。
Androidのプロキシ設定から無事に接続確認を取れたのに、うまくいかない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/1c56b017-c385-a3a9-a553-0c5ac0fdca3a.png)

## 解決策
ユーザフォルダ/.gradle/gradle.propertiesの設定が抜けているので、記入してから再度ビルド。
今までは問題なかったのに、なんで急にこうなったかは謎。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/871942dd-5a47-8054-dd4a-7989e1673e0b.png)


## 参考
https://qiita.com/offwhite/items/82b9ac5a751142c2d58e
pythonのbottleでちょっとしたAPIサーバを作る

ちょっとしたAPIサーバがほしいとき、pythonで手軽に作ることができます。

```requirements.txt
bottle==0.12.18
```


```app.py
# -*- coding:utf-8 -*-
from bottle import (get, HTTPResponse, default_app)
from wsgiref.simple_server import WSGIServer, make_server
from socketserver import ThreadingMixIn
import json


class ThreadingWSGIServer(ThreadingMixIn, WSGIServer):
    """
    マルチスレッドなWSGIServer
    """
    pass

@get('/active')
def is_active():
    return 'OK'

@get('/testget')
def test_get():
    dummy_response = {
        'value': 'test'
    }

    # json形式で返す
    res = HTTPResponse(status=200, body=json.dumps(dummy_response))
    res.set_header('Content-Type', 'application/json')
    res.set_header('Access-Control-Allow-Origin', '*')
    return res

if __name__ == "__main__":
    app = default_app()
    server = make_server('0.0.0.0', 80, app, ThreadingWSGIServer)
    server.serve_forever()
```

Dockerfile

```
# docker build
FROM ubuntu:20.04

# python install
RUN apt-get update
RUN apt-get install -y python3 python3-pip

# Install python module
COPY requirements.txt /tmp/requirements.txt

RUN python3 -m pip install -r \
  /tmp/requirements.txt && \
  rm -rf /root/.cache

COPY app.py /var/app/

WORKDIR /var/app/

CMD ["python3", "/var/app/app.py"]
```


手順

```
docker build -t test-api .
docker run --rm -itd -p 8888:80 test-api
```

アクセスしてみる

```
curl http://localhost:8888/active
curl http://localhost:8888/testget
```
【エラー】TypeError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': Value is not of type 'long'.（執筆途中）

# はじめに
Dicomデータをsagittal, coronal表示させる時にタイトルのエラーが出たので記録する。
# エラーについて
：の右側を読むと、「long型じゃありません」とのこと。つまり、該当箇所の変数の型が本来ならlong型のところそうなってないみたい。
左側の”TypeError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D'”については初めて見るエラーだったので詳しく調べてみることにする。
#CanvasRenderingContext2D.getImageData()
getImageDataというのは、Canvas2D APIのCanvasRenderingContext2Dというメソッドにある関数である。
この関数は、canvasで指定された部分の基礎となるピクセルデータを表すImageDataオブジェクトを返す。
この関数は引数に抽出するImageDataのx座標、y座標、幅、高さを持つことができます。
[MDN Web Docs: CanvasRenderingContext2D.getImageData()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/getImageData)

この関数に表示させたいImageDataの各座標を渡して、ImageDataを出力するイメージになる。
#エラー全体
上記のことを踏まえると今回出ているこのエラーは、getImageData()に渡している引数がlong型になっていないということになるのか...?
実際にこのエラー分をまるまるコピペしてググってみたところ、

* ローカル環境で参照する場合はセキュリティ機構の使用によりエラーが発生する
* Webサーバーを配置してhttpでアクセスする必要がある。

後者の方は、実際にhttpアクセスで読み込んだデータを表示しているシステムを参考にしているの考えにくいと感じた。

#最後に
かなり雑な調べ方になってしまったが、エラーの概要は掴むことができた。
渡ってきたデータをlong型に変換する方法、実際にサーバーを立ててデータを読んでみる方法、両方とも試してみてどうだったのか、後日記載することにする。

#追記(2021/10/8)
##new Int16Array()
Int16Array()は型付き配列のコンストラクターで16ビット符号付きの配列を作成する。
[MDN Web Docs: Int16Array()コンストラクター](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Int16Array/Int16Array)

```JavaScript
var int16 = new Int16Array(2);
int16[0] = 45;

console.log(int16[0]); //45
console.log(int16[0].length); //2
```
上記のコードより、Int16Arrayは簡単に説明すると配列を生成するものである。

* 1行目： int16という配列を生成する
 * 配列の中身は[0, 0]
* 2行目： 配列の0番目に45を代入する

今回エラーの発生箇所を調べると、

```JavaScript
let plane = new Int16Array(this.xSize * this.ySize)
```
というようにplaneはInt16Arrayに渡した計算結果によって配列を生成している。
DICOMデータは一枚だけでなく複数のDICOMデータを読み込むのでnewをしてインスタンス化している。
今回のエラーは渡している引数がlong型になっていないというエラーなのでここで変数が配列に定義されているのでここがエラーの原因だと考えている。

##typeof
typeofは方を文字列で返す演算子である。
[MDN Web Docs: typeof](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/typeof)

```JavaScript
console.log(typeof 45); //"number"
console.log(typeof 'blue'); //"string"
console.log(typeof true); //"boolean"
```

#追記(2021/11/12)
正常処理(axial画像を選択して表示させるまでの流れ)を追う。
要素の最後を求める時

◼️ famiry = ["suzuki", "takurou", "gou",・・・・ "qiita"]
  例えば上記の様な配列があったとする。最後の要素だけを取り出す時、suzuki 君から順に最後まで数えてqiita君の順番が９８番だった時、puts famiry[98] と書き出力するのはそごくめんどくさい。

◼️ こんな時、こんな問題を解決するのが [配列の要素数 -1]を使うこと。
書き方：　famiry[famiry.lenght -1 ]
　　　　　puts famiry


上記の様な書き方を行うことで全体の要素数から最後の値ふだけを出力できる。そして、数えるみたいなめんどいことはやらなくておくなる。

今日の投稿は以上です。

wagaでした！
Vue.js 基本的なディレクティブ　v-bind編

#はじめに
Vue .jsを学習し始めたのでアウトプットしていきます

#ディレクティブとは
v-on で始まる特別な属性のこと　
Vue.jsになんらかなの指示を行う仕組み

#マスタッシュ構文とは
{{ 変数名 }} とすることで、Vueに定義したdataの変数をコンポーネントやテンプレートに埋め込むことができる。


#v-bind
マスタッシュ構文はtextコンテンツのための記法、属性には使用できない
属性へのデータバインディングにはv-bindディレクティブを使用

```
<input type="text" value="{{プロパティ名}}"/>　←❌
<input type="text" v-bind:value="プロパティ名"/>　← ⭕️
```

#例
````html:&#x20;index.html
<div id="app">
  <input type="text" v-bind:value="message"/>
</div>
```

```js:&#x20;app.js
var app = new Vue({
  el: '#app',
  data: {
  	message: 'Hello Vue.js!'
  }
})
```

上記のように記述すると
![スクリーンショット 2021-09-17 17.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268606/e732acbc-af9d-14a4-055e-7936d137d81e.png)
と表示される。
v-bindはこんな感じで使ってください！
エディタ vim nano gedit

ubuntu linux におけるエディタ vim, nano, gedit に関する情報

#### vim
http://penguinitis.g1.xrea.com/computer/linux/vim.html

#### nano
https://news.mynavi.jp/article/liunx_win-23/

#### gedit
http://polymer.apphy.u-fukui.ac.jp/~densan/2019/PC/gedit-usage.html
よく使う

### githubで個別ファイルのダウンロード

- 個別ファイルのURLをDownGitへコピペ
 - https://downgit.github.io/#/home
 

### OpenCV 顔検出Haar-cascade検出器の読み込み
1. OpenCVライブらいから読み込み
    1. cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt2.xml')
2. ローカル環境から読み込み
    2. 検出器をダウンロードし、ローカル環境へ保存
    2.  cascade = cv2.CascadeClassifier('ローカル環境のパス/haarcascades/haarcascade_frontalface_alt2.xml')


### Pythonクラスの情報確認
1. dir(class)
2. class._____doc_____
3. class._____dict_____
Djangoメール送信

# 概要
Django3のdjango.core.mailモジュールを使ってsmtpでメールを送信します。

## プロジェクトのsettings.pyへ設定
末尾に下記を記載(例はGmail)

```python:settings.py
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'アドレス@gmail.com'
EMAIL_HOST_PASSWORD = 'パスワード'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
```

## アプリケーションのveiws.pyでメール送信処理を記載
例えば、トップページが表示されたらメールを送信するには下記のとおり。

```python:app/views.py
from django.shortcuts import render
from django.views.generic import View
from django.core.mail import send_mail


class IndexView(View):
    def get(self, request, *args, **kwargs):
        subject = 'ここはメールの件名です'
        message = 'ここには\n\nメールの本文をお願いします。'
        from_mail = 'smtp.test@test.com'
        recipient = ['送信先メールアドレス']
        send_mail(subject, message, from_mail, recipient)
        return render(request, 'app/index.html', {
            'data': 'Hello',
        })
```

あとは好きなところにメール送信処理を記述すればOK
カスタムコマンドを作成して、そこでメール送信することも可能。
cronなどで定期実行して、定期的にユーザーにメール配信することも可能。
kivy-iosのインストールでtoolchain build kivy python が途中までコンパイルできるのにエラーが出る時

#URLリンク切れかも
その場合、以下のディレクトリのファイルをいじる。
"作業ディレクトリ/lib/python3.x/site-packages/kivy-ios/recipes/freetype/\_\_init__.py"の８行目URLを
"http://download.savannah.gnu.org/releases/freetype/freetype-{version}.tar.bz2"
から
"http://download.savannah.gnu.org/releases/freetype/freetype-old/freetype-{version}.tar.bz2"
に変更すればコンパイルできる。

#アーキテクチャがarm64かも(m1 mac)
armになっていると、コンパイルが通らない。
homebrewのパッケージインストールからx86_64に切り替えてやり直す。（環境をどちらか一方に固定する場合）

armとx86_64環境を切り替えて使用したい場合は、下記リンクのようにするといいかもしれない。

https://zenn.dev/_lambda314/articles/63b851221a7016
エラー：No route matches [GET] "/new_user_session_path"

##環境
MacOS　BigSur Ver11.5.2
Ruby 3.0.2
Rails 6.1.4.1

##状況
Railsアプリを実装中、下記のエラー発生

```
No route matches [GET] "/new_user_session_path"
```

一見問題なさそう

```app/views/layouts/_header.html.slim
li
  = link_to 'ログイン', 'new_user_session_path'
```

pathを確認したけど間違ってない

```
$ rails routes
...
new_user_password_path	GET	/users/password/new(.:format)	devise/passwords#new
...
```

##解決方法
#####原因：pathを””で囲っていた…
初歩的なミスすぎて自分で自分に引きました


```app/views/layouts/_header.html.slim
li
  = link_to 'ログイン', new_user_session_path
```

##参考
https://railsdoc.com/page/link_to
Ruby on Ralis でデータベースにあるテーブルの中身を指定して取得してviewに表示する方法

データベースのテーブルの中身を指定して取得。

テーブル名:lists
カラム名:title

```
  def index
    @lists = List.find_by(title:"リスト")
    @lists_number = List.find_by(number:46)
    end
```
あとはviewに記述すれば表示されます。

```
<%= @lists.title %>
<%= @lists_number.title %>
```
Mysqlエラー：ERROR! The server quit without updating PID file 

##環境

```
$ mysql --version
mysql  Ver 8.0.26 for macos11.3 on x86_64 (Homebrew)
```

##状況
Mysql起動時に下記の権限エラー

```
$ mysql.server start

Starting MySQL
./usr/local/Cellar/mysql/8.0.25_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/XXXXXXMacBook-Pro.local.err: Permission denied
/usr/local/Cellar/mysql/8.0.25_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/XXXXXXMacBook-Pro.local.err: Permission denied
/usr/local/Cellar/mysql/8.0.25_1/bin/mysqld_safe: line 199: /usr/local/var/mysql/XXXXXXMacBook-Pro.local.err: Permission denied
/usr/local/Cellar/mysql/8.0.25_1/bin/mysqld_safe: line 144: /usr/local/var/mysql/XXXXXXMacBook-Pro.local.err: Permission denied
ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXXXXMacBook-Pro.local.pid).
```

様々な記事を参考に試したが解決できず…
・PC再起動
・Mysql再起動
・権限付与

##解決方法
最終手段としてMysqlを再インストールすることにした
HomebrewでのMysqlの再インストールが丁寧に説明されていて分かりやすかった
→無事にMysql起動できた！

https://qiita.com/akiko-pusu/items/aef52b723da2cb5dc596

##参考
エラー解消で試したこと

https://qiita.com/makuramoto1/items/52159370d00bef708595

https://qiita.com/masa_stone22/items/38a286a89c309de7d44e
Carbon 生成の罠

#はじめに

何度か php の carbon を利用している際に気付かずに起こしていた事象を、備忘録として記載します。

#null を入れて生成

ユーザーの入力等をカーボンに変換する際は、

```
new Carbon($input)
Carbon::parse($input)
```

とすることが多いと思いますが、この`$input`が空文字、null、空配列、falseなどの場合、生成されるインスタンスの日時は実行時点の日時になります。
入力をCrbonに変換してDBに登録、といった実装を注意せずに行うと、
　`null`等を入れて生成
　　　↓
　実行時点での日付で登録
といったコンボがエラーが起きずに発生し、後で入力していないのに日付が入っているといった事態になります。

#対策

`is_null()`を用いて`null`かどうかを判定するのも良いですが、空文字、空配列、false の回避も考えると、`empty()`の方が広範な判定を行うことができます。

大まかな構文としては以下の通りです。

```
$datetime = empty($input) ? null : Carbon::parse($input);
```
Discovery Premiumやってみた　〜Append mode編〜

Watson DiscoveryのPremiumプランで提供されているコンテンツ・マイニングに関する記事です。
今回は Append mode についてです。

Discoveryのドキュメントにはあまり詳細が書かれていないのでやってみました。
https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-contentminerapp

個人的にはとても便利な機能だと思っています！

# Append modeとは
この部分です。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/49825c3d-1fc9-09e8-a8e7-1107e1d5176f.png">

これを使うと、複数のファセットを同時に分析することができます。

# やってみた
##　前提
* Discovery Premiumにコンテント・マイニング用のプロジェクトを作成しデータ投入済み。
* サンプルデータは、国土交通省から提供されている自動車の「不具合情報検索」（https://carinf.mlit.go.jp/jidosha/carinf/opn/index.html） からのデータを加工して作成したものを使用。

データ構造のイメージ

| 受付日 | 住所 | ・・・ | 内容 |
|:-:|:-:|:-:|:-:|
| 2011年1月1日  | 東京  | ・・・  | 走行中に〇〇が折損し、走行不能になった  |
|   |   |   |   |

## Append modeを使った分析の準備
前述した通りまずは「Apped mode」にチェックを入れておきます。
後は、分析したいファセットを次々と選択していくだけです。

以下は、「性別」「申告方法」「住所」「車名」という順に選択した結果です。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/a0526730-5d91-2698-08cb-6b1b683c17a9.png">

次に、ファセットの特定の値で絞り込んだ時に、他のファセットも同時に絞り込みを実施する設定をします。
以下のように「＜」マークをクリックすると色々なアイコンが表示されます。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/77f4a485-a281-499c-9855-a4b9fd75341f.png">
そこから、ピンのマーク（Filter）をクリックして「Enabled」にします。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/bc5c3fa2-d3f8-da14-c057-65da61adf4c4.png">
便宜上、選択モードも「Single」に設定しておきます。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/aaae86a3-a106-716b-94fc-8484b84e733c.png">

さて、FilterをEnableにするとファセット項目の左にピンがつきます。
「＞」をクリックするとアイコン表示が消えます。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/30bc14ec-23c7-c161-5f07-eb313c870140.png">

他のファセットについても同様にFilterをEnabledにします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/d4c64961-d52d-6dd0-f46f-4a260464cddf.png">

## Append modeを使った分析
さて、分析をしてみます。

「性別」ファセットの「男性」をクリックします。
すると、自動的に他のファセットの内容が更新されます。
男性は申告方法として「HP」(Homepage）が多いようですね。
特に他の項目との相関はなさそうです。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/34e386b9-80c2-0e06-c57a-2de16ec48561.png">

次に「女性」をクリックしてみます。
相関はそれほど大きくありませんが、申告方法として「フリーダイアル」「24時間電話」「電話」の次に「HP」ですね。
他と比べて、女性は電話で申告することが多少特徴的のようです。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/f8e84cfc-b085-653b-d537-57adee33c561.png">

折角なので、「法人」についてもみてみましょう。
法人の場合は、「文書」「FAX」「来訪」の相関が高く出ていますね。
「文書」「FAX」「来訪」で申告するのは他と比べて、法人が特徴的だということがわかります。
同時に、「車名」では「UDトラックス」「日野」「ニッサンディーゼル」「いすゞ」の相関が高いですね。
他と比べて、トラックに関する不具合の報告は「法人」に偏っていることがわかります。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148302/36bf166c-24de-7e41-b75b-7042d818d4b5.png">

# まとめ
といった感じで、Append modeを使うと複数のファセットを同時にフィルターしながら分析ができるのでとても便利です。

# お断り
このサイトの掲載内容は私自身の見解であり、必ずしも所属会社の立場、戦略、意見を代表するものではありません。 記事は執筆時点の情報を元に書いているため、必ずしも最新情報であるとはかぎりません。 記事の内容の正確性には責任を負いません。自己責任で実行してください。
Localstack の initScripts が完了してから 他のコンテナを起動したい @docker-compose

# これは
CI等 で LocalStack を使ってテストしたいが、`docker-entrypoint-initaws.d` に置いた init スクリプトの実行は終わってからテスト実行したい。
そんな人にオススメの適当な方法です。

# ざっくりどうするか
1. docker-compose の healthcheck を書く
localstack の http://localhost:4566/health に `initScripts: initialized` があるかどうかを判定するようにする

2. depends_on の condition を使う
service_healthy かどうかを判定する

これだけです。

# サンプルコード
このケースは init.sh で cloudformation を実行したあとに app を起動したいケースを想定して書いてます。

~~~sh:./localstack/init/00_init.sh
#!/bin/sh
cd /
awslocal cloudformation create-stack \
  --endpoint-url http://localhost:4566 \
  --stack-name test\
  --template-body file://aws-cloud-formation/cf.yaml
~~~

~~~yaml:docker-compose.yml
version: '3.8'
services:
  app:
    build:
      dockerfile: Dockerfile
      context: .
    depends_on:
      # IDE に Array is required と怒られるかもしれませんがちゃんと動きます
      localstack:
        condition: service_healthy

  localstack:
    image: localstack/localstack
    volumes:
      - ./aws-cloud-formation:/aws-cloud-formation
      - ./localstack/init:/docker-entrypoint-initaws.d
    ports:
      - 4566:4566
      - 4571:4571
    healthcheck:
      # init スクリプトが完了する前に app が起動しないよう ヘルスチェックする
      test: ["CMD-SHELL", "curl http://localhost:4566/health | grep '\"initScripts\": \"initialized\"'"]
      interval: 2s
      start_period: 20s
      retries: 30
      timeout: 30s
~~~

# まとめ
色々方法はあるようですが、割と手軽にできたかと思います。
タイミングによってうまく行かないことがある(unhealthyだったからappは起動しない)ので、
もう少し調査が必要そうですが、こうすれば大丈夫！/これで問題ないよ！など知見のある方コメント頂けますとです。


# 追記
そもそも現行の docker-compose では depends_on にこの形式はサポートされてない・・・？
3大クラウドウェブアプリの脅威に対する機能の比較

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/5d6dd1ff-139b-7a6c-ecd1-7a59116e9683.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/35e6b39e-0e51-0aa5-81b1-3b3f3dc50365.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/eb2ef957-3f15-ab80-1e0e-e4fe931185cd.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/5cb03ca5-111a-adfc-a672-b48dfdeb4233.png)

###参考URL
https://qiita.com/enurinri/items/dece9d9020bf93315046
https://www.youtube.com/watch?v=FbnneJ17TA0
https://www.topgate.co.jp/google-cloud-security-application
https://cloud.google.com/free/docs/aws-azure-gcp-service-comparison
https://qiita.com/leomaro7/items/604db3c021233ac2eaf0
https://qiita.com/enurinri/items/dece9d9020bf93315046
https://qiita.com/Catetin0310/items/74249f333d9fbfccd543
Laravel8 hasManyThroughの使い方

Lrravelの学習中、hasManyThroughを使う機会があったので備忘録としてここに残す。

#使用例
例えばあるユーザーが書いた記事にされているブックマークを取得したい場合、関係性は以下になる。

User→Article→Bookmark

ここではそれぞれ、Userを始点、Articleを中継先、Bookmarkを取得先とし、以下の記述となる。

```php:
//Userモデル内
    public function getBookmarked()
    {
        return $this->hasManyThrough(
            'App\Models\Bookmark',  //取得先
            'App\Models\Article',   //中継先
            'author_id',    //始点と中継先をつなぐ外部キー
            'article_id',   //中継先と取得先をつなぐ外部キー
            'id',   //始点の主キー(省略可)
            'id'    //中継先の主キー（省略可）
        );
    }
```
第5、第6引数は主キー名が'id'なら省略出来る。よってこれらの引数を入れるのは主キー名を変えている場合のみ。
***
初心者のため、内容に相違あればコメント下さい。
Windows 環境での docker-compose ビルドの際、Dockerfile の読込に失敗する

結構ハマったが、エラーメッセージでヒットするページが無かったので残しておく。

# 環境
- Windows10 Pro 64bit

# エラー内容
例として `docker-compose.yml` 及び `Dockerfile` は最低限の内容。

```yaml:docker-compose.yml
version: '3'
services:
  app:
    build: ./Dockerfile
```

```Dockerfile:Dockerfile
FROM php:7.4-apache
```

```
C:\dev\tutorial-docker>docker-compose up -d
Creating network "tutorial-docker_default" with the default driver
Building app
[+] Building 0.1s (1/2)
 => ERROR [internal] load build definition from Dockerfile                                                         0.0s
 => => transferring dockerfile: 90B                                                                                0.0s
------
 > [internal] load build definition from Dockerfile:
------
failed to solve with frontend dockerfile.v0: failed to read dockerfile: error from sender: walk \\?\C:\dev\tutorial-docker\Dockerfile: The system cannot find the path specified.
ERROR: Service 'app' failed to build : Build failed
```

# 解決
以下のように `docker-compose.yml` を修正する。

```yaml:docker-compose.yml
version: '3'
services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
```

```
C:\dev\tutorial-docker>docker-compose up -d
Building app
[+] Building 0.4s (5/5) FINISHED
~
Creating tutorial-docker_app_1 ... done
```

正常にビルドされた。

# 参考
[https://qiita.com/sam8helloworld/items/e7fffa9afc82aea68a7a](https://qiita.com/sam8helloworld/items/e7fffa9afc82aea68a7a)
問題解決能力を鍛える！ アルゴリズムとデータ構造 Pythonで書きました（Code5.3）

# Topic
- pythonで動的計画法の緩和のchminを実装する．

## chminの実装方法
C++で実装すると．．．

```C++
template<class T> void chmin(T& a, T b){
    if (a > b){
        a = b;
    }
}
```

これを自力で，pythonに直してみる．

```Python
def chmin(a,b):
    if a > b :
        a = b
```

うまくいかない．
多分，参照型がうまくいってないのかもしれない．
（原因がわからないので，わかる方はコメントお願いします）

## 色々漁ってたどり着いた方法がこちら↓

```Python
def chmin(dp,i,x):
    if dp[i] > x:
        dp[i] = x
```
つまり，dpも渡してしまおう作戦．dp渡してiで配列のインデックスを指定する感じ．

問題解決能力を鍛える！ アルゴリズムとデータ構造のCode5.3をpythonで書き換えるとこんな感じ．

```Python
def chmin(dp,i,x):
    if dp[i] > x:
        dp[i] = x

    

n = int(input())
h = list(map(int,input().split()))
dp = [float("inf")]*len(h)

dp[0] = 0

for i in range(1,len(h)):
    chmin(dp,i, dp[i-1]+abs(h[i]-h[i-1]))
    if i > 1:
        chmin(dp,i,dp[i-2]+abs(h[i]-h[i-2]))

print(dp)
    
```

では今日はこの辺で．
読んでいただいてありがとうございました😃
エラー：Could not find 'spring' (= 2.1.1) among 167 total gem(s) (Gem::MissingSpecError) 

##環境
MacOS　BigSur Ver11.5.2
Ruby 3.0.2
Rails 6.1.4.1

##状況
RailsアプリをHerokuへデプロイした際に下記のエラーが発生

```
Could not find 'spring' (= 2.1.1) among 167 total gem(s) (Gem::MissingSpecError) 
```

##原因
どうやらこのgemが悪さをしているらしい

```ruby:Gemfile
group :development do
 （略）
  gem 'spring'
  gem 'spring-commands-rspec'
end
```

##疑問点
developmentだけのgemなのになぜデプロイ時にエラーが出るのか謎

##解決策
この２つのgemをコメントアウト

```ruby:Gemfile
group :development do
 （略）
  # gem 'spring'
  # gem 'spring-commands-rspec'
end
```

bundle installも忘れずに！
デプロイし直すと正常にデプロイ完了！

##参考
https://yumishin.com/spring-spec-error/
【RHEL】vimコマンドがないとき【Linux素人】

vimコマンドを打つと「あ、んなもんねぇよ」って突き返されました。

```
[root@####### ~]# vim /etc/ssh/sshd_config
-bash: vim: command not found
```
bash で
#VIMコマンドの導入

```bash:
yum -y install vim-enhanced
```
Dataikuはデータサイエンティスト向けプラットフォーム？

この質問に対する答えは「YES」です。2013年設立される当時、Dataikuはデータサイエンティストが作ったデータサイエンティスト向けのプラットフォームでした。しかし、データサイエンティスト向けの様々な機能を提供しながらも、視覚的GUIを好むアナリスト向けのツールでもあります。2021年実施した、「Dataiku Product Days」にてデータサイエンス本部長Conor Jensen氏が「Dataikuはデータサイエンティストにとってどのような利点があるか」について詳しく説明しています。
 
[2021年Dataiku Product Days セッション：「データチームは機械学習でどのようにデータから価値を創出するか？」を視聴(英語)](https://content.dataiku.com/turn-data-into-value-with-ml?hsCtaTracking=d074b3b8-22b3-452e-9c13-cc130a099f4e%7Cfe1ff2f2-630f-4ffd-af2a-cbd65f66d541)
 
## 利点１：Dataikuでコーディングが可能
Dataikuでは、PyCharm、Sublime、RStudioやVSCode等、好きな開発環境（IDE）を利用し、プロジェクトやプラットフォーム全体と作業内容を共有することが可能です。[Dataikuのユーザがコーディング可能な範囲はとても広く](https://www.dataiku.com/ja/%e8%a3%bd%e5%93%81/%e6%8a%80%e8%a1%93%e5%b0%82%e9%96%80%e5%ae%b6%e5%90%91%e3%81%91-dataiku/)、GUIツールが不要であれば、ユーザが好むパッケージやライブラリーを使い、ほぼ全てのデータ変換とパイプライン作業をプログラミングすることが可能です。とはいえ、いくつかの作業では用意されているGUIツールを利用した方がより効率的でしょう。
 
![giphy (2)-Jun-01-2021-03-25-39-81-PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/dc0fd3ec-d35d-d755-62fa-c38a3f0ae2d2.gif)


又、ユーザのコーディングスキルを補完するツールとしてDataikuを利用することもできます。必要な部分だけをコーディングし、残りはプラットフォームに処理を任せることが可能です。
 
## 利点２：コラボレーションとコミュニケーション
 
エンタープライズ企業で働くデータサイエンティストには、毎日新しく覚えないと行けないことが山ほどあります。しかし、組織内にはプロジェクトに役立つスキルや知識を持つ人がもっといるかもしれません。ユーザはデータサイエンスのプロジェクトを成功に導くために、ビジネス側の人々と協力するための手段が必要です。さらに、彼らがプロジェクトに直接参加し、実作業を担当してもらうことがより理想的です。
 
例えばビジネスチームに、データを統合・整理してもらうことを考えてみましょう。彼らには各データの正しい形が分かり、データソースやデータが持つ文脈も知っています。また、ビジネスインサイトを導出するためにどのようなデータ変換が必要かについても理解しています。組織内でプロジェクトについて彼らと会話する窓口を設けて、彼らに直接プロジェクトに参加してもらえると、プロジェクトの成功率はより高まるでしょう。

## 利点3：簡単にデータサイエンスプロジェクトを本番環境に移行可能 

Dataikuでは、[ユーザが作成したプロジェクトを簡単に本番環境に移行することが可能](https://www.dataiku.com/ja/stories/models/)です。Dataikuでプロジェクトを作成するアーキテクチャは、プロジェクトを移行する際と同様のフレームワークとなっています。これによって、より簡単にバッチ処理、又はリアルタイムでの本番環境への移行が可能です。さらに、コーディング言語による移行作業が不要なため、作ったプロジェクトが移行作業によって壊れる等、問題が発生するリスクも低くなります。もし何か問題が発生したとしても、ITチームではパイプライン、ロジック、プロジェクト履歴が一眼で把握可能なので、より早く修正を行うことが可能です。

## 利点4：コンピューティングリソースにアクセス可能

Dataikuでは、データの格納場所やアーキテクチャーによらず、データ処理やモデルのトレーニングに必要はコンピューティングリソースにアクセスすることが可能です。分析作業はオンプレミスでも、クラウドでも、Sparkのような分散エンジンでも、Kubernetesのようなコンテナ技術上でも行うことが可能です。Dataikuにはプッシュダウン機能が内装されており、メモリ上で処理が難しい負荷の大きい作業でも、データが保存されているSQLデータベースやクラウド上のKubernetesクラスター等で処理を行うことが可能です。これによって、現行のインフラを最大限に活用し、より多くのデータをより早く処理することが可能です。

![Group-277-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/c8e06856-21f6-bdcc-6898-9f433a276bff.png)


## 利点5：セーフガードとアラート機能

データサイエンティストとしては、何かしらの問題が発生した場合、IT担当者から直ぐに連絡を受けたいのが当然です。Dataikuでは、何かプロジェクトに影響する問題が発生した場合、アラートが上がるようにガードレールを設定することが可能です。これによって、問題が発生した際に、事前に作成したマトリックスやチェックリストを確認することで問題を早期に把握することが可能です。データサイエンティストにとっては、問題解決までの時間を短縮し、より効率的に対応が可能な嬉しい機能です。

上述した利点は、Dataikuが持つ数ある利点の中の刻一部です。Dataikuはデータサイエンティストや技術専門家向けの充実した機能を複数用意いますので、是非試してみてください！

[**データサイエンティストやコーディングユーザ向けのDataikuデモビデオの視聴はこちら**](https://content.dataiku.com/japan_ondemand_demos/xssswyjaqq1yp6sfbphb)
テクニカルユーザ向けのデモを確認して、どのように自由かつ手間を省いた作業ができるかをご覧ください。


原文：*[Is Dataiku for Data Scientists?](https://blog.dataiku.com/is-dataiku-for-data-scientists)*
Workato：他のコネクターで設定したスキーマをコピーして利用するには

# はじめに
Workatoには、サンプルとなるJSONテキストインポートして自動的にWorkatoのスキーマを生成する機能があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/626cb53c-75e0-2d50-9843-3e253fb493e1.png)


また、Workatoのスキーマは生成方法（自動・手動）にかかわらずJSON形式で管理されており、直接編集することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/53cae589-8133-44d1-1c6b-5ad3e98042d7.png)

しかし、このJSONテキストを他のコネクターへインポートして利用することは出来ません。「Use JSON」をクリックしてインポートしようとすると、以下のようにエラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/492c21a1-0f3b-790c-afe3-6390be349ec1.png)

では、上記を利用して他コネクターのWorkatoスキーマを生成することは出来ないのかといえばそういうことは無く、「Use JSON」とは別の手順で対応が可能です。

# 手順
## １．スキーマのコピー元となるコネクターの「Edit schema」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/600ad815-2399-f754-4b58-addeb57d4bc9.png)


## ２．コピー先となるコネクターのスキーマの「add fields manually」をクリックし、手動でWorkatoスキーマを生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/9280b59f-0e80-36c7-e2ac-40edeb12f066.png)

スキーマ生成時に追加するフィールドの名称等は適当に入力して構いません。必須項目以外はそのままとします。設定後、「Add field」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/5dfab052-75f8-c76b-e99b-c42a7c3be5fa.png)

## ３．「Edit Schema」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0c922012-80bb-f564-c181-91edcba83d3d.png)

## ４．エディタにコピーしたJSONテキストを貼付し、「Update」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0724be87-87e6-2133-4b90-86efd2d77ad9.png)

## ５．コピー元のスキーマと同じ内容が反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d3709cf3-4fa6-dd4f-e583-6c0b73c41107.png)
Ubuntu20.04のcron

## cronファイルの作成

```bash
$ sudo cp /etc/crontab /etc/cron.d/cron_test
```

## cron_testファイルの設定
1分ごとにコマンドを実行する設定
※これはDjangoのカスタムコマンドを仮想環境に入って実行して抜ける一連のコマンドです。

```text:cron_test
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

*/1 *   * * *   ubuntu  source /home/ubuntu/djangotest4/.venv/bin/activate && python /home/ubuntu/djangotest4/manage.py cmd_a && deactivate
```

### 記法
\*[space]\*[tab]\*[space]\*[space]\*[tab]user[tab]command

## cronの再起動
cron関連のファイルを変更したら実行しよう

```bash
$ sudo service cron restart
```

## cronの状態を確認

```bash
$ sudo service cron status
```

## cronの実行履歴を確認

```bash
$  sudo journalctl -r -u cron.service
```
【AWS】VPCを構築する

こんにちは、普段オンプレミス環境でのサーバ構築を行ってる海里です。
仕事の案件で、初めてAWSを触れることになりました。

しかし、AWSにてRHELサーバを初めて立てたとき、SSH接続ができなくて
かなり苦戦したので忘備録として記述します。(ここに行き着くのに丸3日かかりました。)
誰の助けも借りることができないので自力でやらざる負えなかったので、むしろ褒めてほしい()


#VPCの構築
###VPCを作成
[VPCを作成]をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/28451b9a-7ddc-e02b-574e-a5dd5404da38.png)

必要な設定を入力し、[VPCを作成]をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/71b5bd1b-9517-0bc4-06d0-bf193562a9d0.png)


###サブネットを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/a3d38418-f061-6b08-3271-d036cf301103.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/2d3247a1-10d4-b70a-4ddf-3f9bb6f955f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/ffe846d0-cc57-4159-df3d-1b98562f8fe0.png)


###インターネットゲートウェイを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/bfd33ebb-0b2e-0208-7a09-b5177c5dbb32.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/08d4cc51-79ee-61e7-62a3-5488baa01572.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/afec9097-8365-731a-68b3-8b066f86f2ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/589a23c1-57a8-2a92-e76c-a9726b7d1198.png)


ルートテーブルを作成する
　ルートタブにインターネットゲートウェイを紐づける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/20e6a229-03cb-8447-c03a-8e29b09cdee9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/f700a540-a5c8-1e83-9df1-63b5de273587.png)

　サブネットの関連付けタブでサブネットを関連付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/bda4e04c-596a-6a21-929f-514a57c39abd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425858/cc601f65-1180-4894-4654-24979a7ccfe1.png)
Gitlab Gitローカルサーバ構築 ubuntu 18.04

Gitlab による ローカルGitサーバ を ubuntu 18.04 上に構築しましたので、下記にメモを残します。

#### 参考サイト

https://www.yokoweb.net/2018/05/04/ubuntu-18_04-server-gitlab-install

https://about.gitlab.com/install/#ubuntu?version=ce

https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab

https://www.usagi1975.com/08feb172229/

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

```
sudo apt install curl openssh-server ca-certificates
```

```
sudo apt install postfix
```

※postfix の設定は Local only

```
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
```

※会社内など proxy 環境では上記 curl が失敗する可能性があります。
　error:1408F10B:SSL routines:ssl3_get_record:wrong version number
　その場合は script.deb.sh をダウンロードしてから bash で直接実行


```
sudo apt install gitlab-ce
```

The repository is setup! You can now install packages.
と表示されればリポジトリ登録完了

```
sudo apt install gitlab-ce
```

Thank you for installing GitLab!
と表示されればインストール完了

#### セッティング

```
sudo vim /etc/gitlab/gitlab.rb
```

下記2行を変更

external_url 'http://(ローカルアドレス)(:アクセスポート番号)'
※デフォルトだと 80 なので、例えば 9010 など、アクセスするポート番号をローカルで決めて設定

gitlab_rails['time_zone'] = 'Asia/Tokyo'

変更を反映させる

```
sudo gitlab-ctl reconfigure
```

初期ユーザ root のパスワードは下記にあり。確認しよう

```
sudo cat /etc/gitlab/initial_root_password
```

Password: (初期のランダムパスワードが設定されている)

ブラウザ等でアクセスして確認、ユーザ root、先ほどの Password を入力
あとは GUIベースで設定を変更
以上
【Nuxt.js / Vue.js】グローバル定数を定義して、v-for内の算出プロパティで使用する

#はじめに
ステータス管理をしたいな～となったときに、DBでは大抵数字とかで管理するのではないでしょうか。
1だったら進行中で～2だったら完了で～など各ページのdata内に書いたりしても間違いではないと思いますが、グローバル定数をいい感じで管理したいなと思って実践したのでその備忘録です。
間違いや、もっとこうしたほうがいいよ～とか、こんなやり方もあるよ～など何かありましたらコメントお願いします！

#グローバル定数管理をする

##jsファイルの作成
まずは定数を定義するファイルを`~/plugin`の直下に作成します。今回は`constants.js`とし、以下のようにしました。

```constants.js
const SAMPLE = 'sampleですよ'
const PROJECT_STATE = {
  1: '開始前',
  2: '進行中',
  3: '終了',
}

export default (context, inject) => {
  inject('SAMPLE', SAMPLE)
  inject('PROJECT_STATE', PROJECT_STATE)
}
```

文字列を返す`SAMPLE`と、ステータスの情報を持った`PROJECT_STATE`の２つを定義してみました。
定義した２つを`inject`することで呼び出すことができます。

###injectとは
Nuxt.jsのプラグインの機能です。
この`inject`を使うことで、Nuxt.jsのアプリケーションで、いろいろな場所から共通で利用したい関数や値を呼び出すことができます。
 
なので題名と反しますが厳密にはグローバル変数を定義している、というわけではないです。ただ**injectしてどこからでもアクセスできるようにした状態**ということです（ややこしい）
今回のようなパターンでは、グローバル変数定義して`import`で読み込むのでもいいのかなと思いますが、それは今度別記事でまとめます（覚えていれば）

##nuxt.config.jsで設定
`nuxt.config.js`に記述を追加して先ほど定義したものを読み込むようにします。
`plugins`に以下のように追加しました。

```nuxt.config.js
  plugins: [
    { src: '~/plugins/constants.js', ssr: false}
  ],
```

##実際に使用する
```.vue
<script>
~~略~~
  computed: {
    sample() {
      return this.$SAMPLE
    }
  }
```

`this.$定数名`で呼ぶことができます。

#v-for内の算出プロパティで使用する
たとえばこんなデータがあるとします。

```.vue
<script>
export default {
  data() {
    return {
      projectList: [
        { projectName: "sample1",
          projectId: "1",
          about: "sample1のプロジェクトです。",
          state: 1
        },
        {
          projectName: "sample2",
          projectId: "2",
          about: "sample2のプロジェクトです。",
          state: 2
        },
        {
          projectName: "sample3",
          projectId: "3",
          about: "sample3のプロジェクトです。",
          state: 3
        }
      ]
    }
  }
 }
```

これを`v-for`で表示し、かつステータスは数字をもとに先ほど記述した`PROJECT_STATE`を参照します。

```.vue
<template>
  <v-app>
    <template v-for="project in projectList">
        <div>
            {{ project.projectName }}
        </div>
        <div>
            {{ projectState(project.state) }}
        </div>
        <div>
            {{ project.about }}
        </div>
    </template>
  </v-app>
</template>

<script>
export default {
  computed: {
    projectState: function() {
      return function(state) {
        return this.$PROJECT_STATE[state]
      }
    }
  }
}
</script>
```

`methods`に書いてもよかったのですが、何度も再描画は避けたいなと思ったので`computed`に書いてみました。

#参考にしたもの
[Vue.jsでのグローバル定数管理を工夫してみた話](https://developers.microad.co.jp/entry/2021/02/08/063000)
[Nuxt.jsで異なるコンポーネントから共通で利用できる関数を定義する（inject編）](https://qiita.com/itouuuuuuuuu/items/bcad408842c7723e7ca3)
[Nuxt.jsのinjectを使ってDIする](https://tech.cydas.com/entry/nuxt-inject)

#さいごに
今回の定数はすべてのページで使用するというわけではないので、普通に別ファイルで定義してimportでもいいのかな、と思いましたが、共通関数とか書くときはこの書き方がいいのかな、と思います。
書き方は他にもいろいろあるので調べてみてください。
まだまだ初心者なのでうまい使い分けが難しいものです。

最後まで読んでいただきありがとうございます！
JSONで受け取ったtimestamp型の値をJavaScriptでサクッとDateに変換

# 概要
APIサイドからJSONを通じてフロント側（JavaScript）でデータを受け取るとき、日付を比較したい時がある。
そんなとき、JSONから受け取ったcreated_atなどの日付データ（timestamp）はそのままJavaScript側では使えない・・。
そこでJSONのtimestampをJavaScriptでDateとして使えるようにしていく。

# やり方

``` hoge.js
// 任意の方法でjsonからtimestamp型の値を受け取る
// ここでは"timestamp"という変数として扱う

console.log(timestamp); // 2021-09-17T06:21:00.101Z
var date = new Date(timestamp);
console.log(date); // Fri Sep 17 2021 15:21:00 GMT+0900 (日本標準時)

```

サクッとできてしまいました。

```hoge.js
//2021年9月17日の0時0分0秒を取得して、先程のdateと比較してみる
var start_of_today = new Date() 
start_of_today.setHours(0,0,0,0)
console.log(start_of_today) // Fri Sep 17 2021 00:00:00 GMT+0900 (日本標準時)

if (date > start_of_today) {
  console.log("今日の0時0分0秒から", date - start_of_today, "ミリ秒経ちました")
  // 今日の0時0分0秒から 55260101 ミリ秒経ちました
}
```

このようにDate同士の比較もできるようになりました



# 参考
https://weblog.west-wind.com/posts/2014/jan/06/javascript-json-date-parsing-and-real-dates
【VSCode】個人的に使う拡張機能を書く（備忘録兼ねる）

## はじめに
アウトプットが苦手な自分が練習の一環として記事を書いてみる。

自分は業務で「Visual Studio Code」略して`VSCode`をよくコードエディタとして使用します。

VSCodeを使うメリットは「無料」「軽量」「Gitが標準で対応している」などありますが、
個人的には**高いカスタマイズ性**が一番のメリットだと思います。

拡張機能が豊富にあるため、自分の用途や好みに合わせて機能を追加することで
自分好みのエディタにすることができます。

今回はそんなVSCodeで個人的に使う拡張機能について備忘録を兼ねて書いていきます。

## Japanese Language Pack for Visual Studio Code
https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja

VSCodeを日本語化してくれます。
デフォルトが英語なので、とりあえず入れておきましょう。

## vscode-icons
https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons

VSCodeのフォルダアイコン、ファイルアイコンを変えてくれます。
サポートされているアイコンの種類が豊富なのでエクスプローラーが見やすくなります。

## indent-rainbow
https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow

インデントを色分けして視認性を上げてくれます。
ネストが深くなってしまった際に役立ちます。
↓参考画像
![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783771/f720058a-2248-dad3-9b18-783038e1cf21.png)

## Rainbow CSV
https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv

csvを色分けして見やすくしてくれます。
更に項目にカーソルを合わせると列番号とヘッダーの項目名を表示してくれたり、
SQLのようなクエリを実行してデータのソートやUpdateを実行できる優れもの。

↓参考画像
![csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783771/d7a59ebd-3a9f-5e39-dbf0-ca460cb4ad35.png)

![csv2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783771/eb6e73e3-231c-e21c-0340-170b094082c8.png)

## Zenkaku
https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku

全角スペースを可視化してくれます。
入力ミスでエラーをなることがあるので入れておくと便利です。
↓参考画像
![zenkaku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783771/e6d12e2c-db11-30df-9ce7-153d84705856.png)

## Git関連

### GitLens

https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

エディタのソース上に「最新のコミット内容表示」をしたり「コミット単位でのファイル比較」ができます。
Gitを使う方はとりあえず入れておいて良いと思います。

### Git Graph

https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph

変更履歴をグラフで表示してくれます。
入れるとソース管理の画面にアイコンが追加されるのでアイコンを押下すると使用できます。


## その他
重要ってわけではないけど、人によってはあると便利かも

### Clipboard Ring

https://marketplace.visualstudio.com/items?itemName=SirTobi.code-clip-ring

クリップボードを複数件、記憶することができます。
デフォルトでは10件までですが、設定で増やしたり減らしたりできます。
ctrl+shift+vで使用できます。

### Markdown All in One

https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one

VSCodeでMarkdownを記述する際の補助をしてくれます。
ショートカットキーの追加やアウトライン表示してくれたり色々便利なのでMarkdownを使う際は入れておきましょう。

### markdownlint

https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint

Markdownの構文チェックを行ってくれます。
「Markdown All in One」と合わせて入れておきましょう。
チェック内容は設定ファイルで変更できるので用途に合わせて設定を変えることができます。

### PlantUML

https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml

VSCodeでPlantUMLを書くことができます。

# まとめ
以上になります。

拡張機能は上手く使うことで作業効率を大きくことができるので、ぜひ活用してみてください。
痒い所に手が届くような機能もたくさんあるので「こんな機能ないかな？」と思ったら調べてみると良いと思います。

参考になれば幸いです。
curl_execの使い方

#とりあえず結果

```curl_exec.php
<?php

$ch = curl_init();

$options = [
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_URL => 'api url',
    CURLOPT_HTTPHEADER => ['X-API-Key: api key'],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 3
];
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$result = json_decode($response, true);

curl_close($ch);

var_dump($statusCode);
var_dump($result);
```

curl_execでapiを叩きたいとの話があったのでまとめました。
Swift で Flood Fill（塗りつぶし）

備忘用メモ

## NOTE

- 実装：dfs
- 問題
  - https://leetcode.com/problems/flood-fill/
  - グリッド内で任意のセルを開始地点にして４方向に隣接したセルを塗りつぶす


## コード

```swift
// sr: row  of graph
// sc: cell of graph
func floodFill(_ image: [[Int]], _ sr: Int, _ sc: Int, _ newColor: Int) -> [[Int]] {
    // ready
    let directions = [
        [ 0, -1], // top
        [ 1,  0], // right
        [ 0,  1], // bottom
        [-1,  0], // left
    ]
    let lenX = image.count
    let lenY = image[0].count
    var visited = [[Bool]](repeating: [Bool](repeating: false, count: lenY), count: lenX)
    let prevColor = image[sr][sc]

    // define dfs
    func dfs(_ graph: inout [[Int]], _ sr: Int, _ sc: Int) {
        if sr < 0 || sr > lenX-1 || sc < 0 || sc > lenY-1 { return } // invalid param
        if graph[sr][sc] != prevColor { return }
        if visited[sr][sc] { return }
        visited[sr][sc] = true
        graph[sr][sc] = newColor
        for dir in directions {
            let x = dir[0], y = dir[1]
            dfs(&graph, sr + x, sc + y)
        }
    }

    // run
    var _image = image
    dfs(&_image, sr, sc)
    return _image
}
```


## ポイント

- 隣接セルへの移動は directions 変数で管理
    - 移動先を変数として定義しておく。この問題では隣接セルが４セルのことを指していたが、たまに８セルのケースもあるのでその場合は directions 変数を変更すればよいだけになる

- 無限ループ回避のために visited 変数で訪問済みかチェック（この問題の場合はなくても問題ないが基本的には必要）