OmniAICreator/Qiita-1.07M huggingface dataset:
TailwindCSSでフォーム作ってみた

#フォーム作成
Tailwindの練習としてフォームを作成してみました。
結果としては下記のような感じです
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906968/ec1ef357-735e-f354-c551-52a7f555d2e3.gif)

フォーカスすると下のボーダにだけ色がつくデザインにしてみました。




```html
    <div class="mt-8">
        <form class="w-10/12 mx-auto md:max-w-md">
            <div class="mb-8">
                <label for="name" class="text-sm block">お名前</label>
                <input type="text" id="name" class="w-full py-2 border-b focus:outline-none focus:border-b-2 focus:border-indigo-500 placeholder-gray-500 placeholder-opacity-50" placeholder="山田太郎">
            </div>
            <div class="mb-8">
                <label for="email" class="text-sm block">Eメール</label>
                <input type="email" id="email" class="w-full py-2 border-b focus:outline-none focus:border-b-2 focus:border-indigo-500 placeholder-gray-500 placeholder-opacity-50" placeholder="Eメール">
            </div>
            <div class="mb-8">
                <label for="address" class="text-sm block">住所</label>
                <input type="text" id="address" class="w-full py-2 border-b focus:outline-none focus:border-b-2 focus:border-indigo-500 placeholder-gray-500 placeholder-opacity-50" placeholder="住所">
            </div>
            <div class="mb-8">
                <label for="phone_number" class="text-sm block">電話番号</label>
                <input type="tel" id="phone_number" class="w-full py-2 border-b focus:outline-none focus:border-b-2 focus:border-indigo-500 placeholder-gray-500 placeholder-opacity-50" placeholder="電話番号">
            </div>
            <div class="mb-8">
                <label for="other">その他</label>
                <textarea  id="other" cols="30" rows="8" class="w-full py-2 border-b focus:outline-none focus:border-b-2 focus:border-indigo-500 placeholder-gray-500 placeholder-opacity-50" placeholder="その他"></textarea>
            </div>
        </form>
    </div>
```

focus:outline-noneをつけるとfocus時の周りの線を消すことができます。
LaravelでJavascriptが読み込めない時に解決した方法

# 概要
LaravelでJavascript使ってみようとした時に詰まったので備忘録として記載します。
もしJSファイルにコードを記載しても反応しない場合に試していただければと思います。

## 前提
・Laravel-mix使用（LaravelではLaravel-mixを使って動作させるのが基本と教わった）

・jsファイルが二箇所あるので注意
app/public/js
app/resources/js
→読み込むのはapp/public/jsの方になる
→ソースはresourcesに配置し、laravel-mixを通してpublicに出力させるように管理するとよい

・注意
viewファイルに直接scriptタグでは書かない
app/public/jsのファイルに直接コードを書き込まない

## 大まかな手順

①resources/js/配下にjsファイルを作る（ファイル名は何でもいいが、例ではmemo.jsにする）
②webpack.mix.jsに「resources/js/memo.js」を「public/js」へコピーする記述を追記する
③ターミナルで$ npm run devとコマンドをたたく
④viewのヘッダーにjsを読み込む記述をする

## ①jsファイル作成
resources/js/配下にjsファイルを作る
（今回は例としてボタンをクリックしたらアラートが出るような記述をします）

```memo.js

function btnChk(){
    alert("処理中です");
};
window.buttonClick = buttonClick;
```

## ②webpack.mix.jsを編集

mixの部分に下記の記述を足す
`.copy('resources/js/memo.js', 'public/js')`

```webpack.mix.js
const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.js('resources/js/app.js', 'public/js')
   .copy('resources/js/memo.js', 'public/js')
   .sass('resources/sass/app.scss', 'public/css');

```

## ③npm実行
実行することで「resources/js/memo.js」が「public/js」配下にコピーされる

```
$ npm run dev
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/5a012379-f1ab-0eaa-26b2-77dfa2e73e1b.png" width=50%>

## ④viewのヘッダーにjsを読み込む記述をする

ヘッダー部分に下記の記述を追記する。
`<script src="{{ mix('js/memo.js') }}" defer></script>`

```layout.blade.php
<!doctype html>
<html lang="ja">
  <head>

       === 中略　＝＝＝

    <!-- Scripts -->
    <script src="{{ mix('js/memo.js') }}" defer></script>

  </head>

  <body>
    <input type="button" value="button" onclick="btnChk()">
  </body>

```

## 確認

実際にボタンをクリックしてみて機能していればOK
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308656/dc39e889-110b-2cb2-5d30-bda978f21957.png" width=50%>


以上となります。
自分はネットの先輩方に教えていただきながらこれで解決しました。
Azure Functions にカスタム ドメインを設定する

# はじめに
Azure Functions にカスタム ドメインを設定する方法を説明します。
設定方法は、Azure App Service ほとんど同様の方法で設定できます。
特に、ここでは、カスタムの Zone APEX ドメインを設定する方法を説明します。(ex.) example.com

# 対象ドメインへの DNS レコードの追加

まず、Azure Portal から、Azure Functions へ移動し、[設定] - [カスタム ドメイン] を選択します。
以下の 2 項目をコピーしておきます。

- [IP アドレス]
- [カスタム ドメインの検証 ID]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/1364ac04-4298-fe7f-5ece-243c12daa2bd.png)

次に、対象ドメインを購入したドメイン レジストラーの管理ページへ移動し、対象ドメインの DNS レコードに以下の 2 つのレコードを設定、登録します。

- レコード タイプ: A
    - ホスト名: @
    - 値: 先の手順でコピーしておいた IP アドレス
- レコード タイプ: TXT
    - ホスト名: asuid
    - 値: 先の手順でコピーしておいたカスタム ドメインの検証 ID

# カスタム ドメインの検証と追加

DNS レコードが正しく設定されたかは、以下のコマンドから確認できます。

```dosbatch:cmd

>nslookup -q=A <対象ドメイン>
>nslookup -q=TXT asuid.<対象ドメイン>

```

DNS レコードが正しく設定されていることが確認できたら、Azure Portal から、Azure Functions へ移動し、[設定] - [カスタム ドメイン] - [カスタム ドメインの追加] を選択します。
[カスタム ドメイン] に対象のドメインを設定し、[検証] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/c266724c-35fd-41f7-d09a-4fd2c870ff68.png)
ここで、「従量課金ベースの関数アプリでは、レコードがサポートされていません。」と表示されますが、[ホスト名レコード タイプ] から、"CNAME (www.example.com または任意のサブドメイン)" を選択し、[カスタム ドメインの追加] を選択します。

ただしくカスタム ドメインが追加されれば、一覧にカスタム ドメインが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/f04a5417-a9b1-dcf8-c000-542b1e42151e.png)


# 参考サイト

- [チュートリアル:既存のカスタム DNS 名を Azure App Service にマップする](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-web-tutorial-custom-domain)
プロンプトの色を変える（zsh）

#はじめに
Catalinaになってzshになってることにいまさら気付いた。
zsh では PROMPTで設定するらしいけど、PS1の設定で出来たので、その方法を記載します。
青か水色で迷ったけど、水色にしました。

#環境

- MacBookPro
- Catalina
- zsh

```
%vim .zshrc   
```

```
PS1="%B%F{cyan}%n@%c%#%f%b"
```

```
%source .zshrc
```
Panelプラグインの雛形

【[rviz2プラグインの作り方 トップページへ](https://qiita.com/Kotakku/items/d3510c1ca505b4c0aa1e)】


``` tool_template.hpp
#ifndef SAMPLE_RVIZ_PLUGINS_PANEL_TEMPLATE_HPP
#define SAMPLE_RVIZ_PLUGINS_PANEL_TEMPLATE_HPP

#ifndef Q_MOC_RUN
#include <rclcpp/rclcpp.hpp>
#include <rviz_common/panel.hpp>
#include <QtWidgets>
#endif

namespace sample_rviz_plugins
{

class PanelTemplate : public rviz_common::Panel
{
    Q_OBJECT
public:
    PanelTemplate(QWidget *parent = nullptr);

    virtual void onInitialize();
    virtual void load(const rviz_common::Config &config);
    virtual void save(rviz_common::Config config) const;

protected:
    QHBoxLayout *layout_;
    // QPushButton* button_;
};

}

#endif // SAMPLE_RVIZ_PLUGINS_PANEL_TEMPLATE_HPP
```

``` tool_template.cpp
#include "panel_template.hpp"

#include <rviz_common/config.hpp>

// #include <QVBoxLayout>
// #include <QHBoxLayout>
// #include <QSignalMapper>
// #include <rviz_common/display_context.hpp>

namespace sample_rviz_plugins
{

PanelTemplate::PanelTemplate(QWidget *parent)
    : rviz_common::Panel(parent)
{
}

void PanelTemplate::onInitialize()
{
}

void PanelTemplate::save(rviz_common::Config config) const
{
    rviz_common::Panel::save(config);
}

void PanelTemplate::load(const rviz_common::Config &config)
{
    rviz_common::Panel::load(config);
}

}

#include <pluginlib/class_list_macros.hpp>
PLUGINLIB_EXPORT_CLASS(sample_rviz_plugins::PanelTemplate, rviz_common::Panel)
```
Javaで簡単なATMアプリを作ってJunit5でテストする

<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313771/22767188-82ae-7b87-03a7-b28ea90bee01.png">

##環境
ProductName:	macOS
ProductVersion:	11.2.3
os: Bigsur
IDE:  IntelliJ

#目的

- Junit5の学習
- テストコードの書き方を学ぶ

##方法

作成した銀行アプリの機能をJunit5を使ってテストをする


##ファイルの構造
```
.
├── JUNIT_PROJECT.iml
└── bin
    └── co
       └── atm
           ├── Atm.class
           └── AtmTest.class

```

###atmアプリ


```java:Atm.java
package co.atm;

import java.util.Scanner;

public class Atm {
  public static void main(String[] args) {

    //Create an object of the class
    Atm atm = new Atm();
    //クラスのオブジェクトでメソッドをよぶ
    //10,000預ける
    atm.deposit(10000);
    //5,000引き出す
    atm.withdraw(5000);
    //残高を表示
    atm.display();
  }

  Scanner in = new Scanner(System.in);
  float balance; //口座の残高

  public Atm() {
    balance = 0;
    System.out.println("銀行口座のインスタンスを作成 ");
  }

  //預金
  void deposit(float amount) {
    balance += amount;
    System.out.println("預けた金額： " + amount);
  }

  //引き出し
  void withdraw(float amount) {
    balance -= amount;
    System.out.println("引き出した額： " + amount);
  }

  //表示
  void display() {
    System.out.println("引き出し可能な残高： " + balance);
  }

}
```


###テスト内容

- despositメソッドをつかった場合正しく値が加算されていること
- Withdrawメソッドを使った場合の正しく値が減算されていること

###テストコード

```java:AtmTest.java
package co.atm;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class AtmTest {
  @Test
  //1000円を入金し、その後5000円を入金することを確認する。
  public void testDeposit() {
    //準備
    Atm atm = new Atm();
    atm.deposit(1000);
    atm.deposit(5000);

    //期待値
    Float expectedResult = 6000f;

    //assertEqualsで実際の値を取得
    assertEquals(expectedResult, (Float) atm.balance);
  }

  @Test
  //1000円を入金し、その後1000円を引き出すことを確認する。
  public void testWithdraw() {
    //準備
    Atm atm = new Atm();
    atm.deposit(1000);
    atm.withdraw(1000);

    //期待値
    Float expectedResult = 0f;

    //assertEqualsで実際の値を取得
    assertEquals((Float) expectedResult, (Float) atm.balance);
  }
}
```

##テスト結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313771/956a8597-2e9d-544b-d819-0b2af28dfc16.png)
Cloud9用のEC2インスタンスを’’終了’’した話(Railsチュートリアルの環境再構築)

#はじめに
Railsチュートリアル第２章完了後に失敗した話。
環境を再構築し、ローカルWebサーバ起動を行い、アプリ動作を確認するまで。

#開発環境
* MacOS Catalina 10.15.7
* Safari 13.1.3
* AWS Cloud9
* Rails 5.1.6
* Ruby 2.6.3
* Heroku 7.47.6

#事象
EC2インスタンスを**終了**してしまった。**停止**ではなく**終了**。
特にバックアップ的なものは取っておらず、Cloud9は残っているものの、新規に作成したEC2インスタンスとは紐付けできず。

#解決策
一瞬「やっちまった。全部作り直しか」と思ったが、
よくよく考えるとGithubにコードをコミットしてあるじゃないかと気づく。
そこで以下の手順での再構築を検討。

1．Cloud9の新規作成

Railsチュートリアル第１章で行った手順どおりに新規でCloud9構築。
まずは新規で真っ新なCloud9の環境を作成。
![スクリーンショット 2021-02-27 21.14.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948417/3c1ec2db-0bf0-2d1e-e1f4-6149e362f6f9.png)
次にinstall、updateコマンドのドキュメント除外設定を追加し、Railsをインストール。

```
$ printf "install: --no-document \nupdate:  --no-document\n" >> ~/.gemrc
$ gem install rails -v 5.1.6
```

2．Githubよりクローン
Cloud9にRailsチュートリアル第２章で作成したtoy_appのソースコードをクローン。
URLにはGibhubリポジトリのURLを。

```
$ git clone "URL"
```
クローンが完了し無事にソースコード の復元に成功。
![スクリーンショット 2021-03-06 0.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948417/15cec644-522f-1981-0163-f73b116d860a.png)

3．Gemインストール
Railsチュートリアル第１章のリスト1.5にある内容でGemfileを書き換え。
その後、**bundle install**を実行。

```
$ bundle install
```

4．DBマイグレーション実行
このまま**rails server**を行いアプリ起動すると「ActiveRecord::PendingMigrationError」が発生する。**rails db:migrate**を先に実行しDBを更新しておく。

```
$ rails db:migrate
```

5．ローカルWebサーバにてアプリ起動
**rails server**でサーバ起動しアプリ動作を確認。無事に動作することを確認。
![スクリーンショット 2021-03-06 18.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948417/f3b9ba1b-17fe-29ef-f5ac-81d7c099a77f.png)

#まとめ
改めてGitの有り難さを実感することになった。
GitのクローンはSubversionのチェックアウトとはその内容が異なる。
Gitサーバのデータをほぼ全てコピーしてくるため、仮にサーバ側のデータが失われたとしても、クライアントにあるクローンを戻せばほぼ復元できるそうだ。Gitいいね。
WindowsUpdate ちょっと待て

現在、印刷すると再移動がかかるという恐ろしく面倒なアップデートが来ています
絶対にwindowsupdateを行わないように！

万が一誤って適用した場合は、
KB500802
をアンインストールすれば9割方直ります

ダメだった場合は、再アンインストールでなんとかなりました
※再アンインストール・・・一度インストールしてから再度アンインストール

原因はwin32kfull.sysのアップデートとkyoceraのドライバが競合を起こしている部分のようです
Toolプラグインの雛形

【[rviz2プラグインの作り方 トップページへ](https://qiita.com/Kotakku/items/d3510c1ca505b4c0aa1e)】


``` tool_template.hpp
#ifndef SAMPLE_RVIZ_PLUGINS_TOOL_TEMPLATE_HPP
#define SAMPLE_RVIZ_PLUGINS_TOOL_TEMPLATE_HPP

#include <rviz_common/tool.hpp>

namespace sample_rviz_plugins
{

class ToolTemplate : public rviz_common::Tool
{
public:
    ToolTemplate();
    virtual ~ToolTemplate();
    virtual void onInitialize();
    virtual void activate();
    virtual void deactivate();

protected:
private:
};

}
#endif // SAMPLE_RVIZ_PLUGINS_TOOL_TEMPLATE_HPP
```

``` tool_template.cpp
#include <rclcpp/rclcpp.hpp>
#include <rviz_common/tool.hpp>

#include "tool_template.hpp"

namespace sample_rviz_plugins
{

ToolTemplate::ToolTemplate()
    : rviz_common::Tool()
{
}

ToolTemplate::~ToolTemplate()
{
}

void ToolTemplate::onInitialize()
{
}

void ToolTemplate::activate()
{
}

void ToolTemplate::deactivate()
{
}

}

#include <pluginlib/class_list_macros.hpp>
PLUGINLIB_EXPORT_CLASS( sample_rviz_plugins::ToolTemplate, rviz_common::Tool )
```
Kotlinのクラスコンストラクターの変数にvalがある時とない時と何が違うか

Kotlinのクラス定義を見るとクラスコンストラクター内の変数の前に`val`と`var`がある時とない時がある。
例えば、下のようなクラス定義がある。

```kotlin

class Person(val name: String, var age: Int) {}

class Person(name: String, age: Int) {}

```

### `val`と`var`がある場合

`val`と`var`がある場合では、クラスコンストラクター内の変数がクラスプロパティーとなり、クラス内で定義されているメソッドなら、誰でもその変数を使えることができる。publicのプロパティーな場合ならば、クラスインスタンスからもアクセスできる。
例、

```kotlin
class Person(val name: String, var age: Int) {
    fun selfIntroduce() {
        println("$name is $age years old.")
    }
}

fun main(args: Array<String>) {
    val person1 = Person("joe", 25)
    person1.selfIntroduce()
}
```

実行結果、

```
joe is 25 years old.
```

### `val`と`var`がない場合

valとvarがない時では、クラスコンストラクター内の変数がただのパラメーターに過ぎず、クラスを初期化する時のみ使える。クラスインスタンスからアクセスできない。

例、

```kotlin
class Person(name: String, age: Int) {
    init {
        println("name is $name")
        println("age is $age")
    }
}

fun main(args: Array<String>) {
    val person2 = Person("marry", 20)
}
```


実行結果、

```
name is marry
age is 20
```

コンストラクターパラメーターがクラス初期化の時に実行されることを利用して、クラスボディーにプロパティーの定義をすると、`val`と`var`がある場合と同じ効果が得られる。
例、

```kotlin
class Person(nameParam: String, ageParam: Int) {
    val name: String
    val age: Int

    init {
        name = nameParam
        age = ageParam
    }

    fun selfIntroduce() {
        println("$name is $age years old.")
    }
}

fun main(args: Array<String>) {
    val person3 = Person("jack", 18)
    person3.selfIntroduce()
}
```

実行結果、

```
jack is 18 years old.
```

クラスプロパティーを定義するだけでなく、クラス初期化する時に他の処理も実行したい時に`val`と`var`がない方がいいだろう。
例、

```kotlin
class Person(nameParam: String, ageParam: Int) {
    val name: String
    val age: Int

    init {
        name = nameParam.capitalize()
        age = if (ageParam > 0) ageParam else 0
    }

    fun selfIntroduce() {
        println("$name is $age years old.")
    }
}

fun main(args: Array<String>) {
    val person4 = Person("alice", -1)
    person4.selfIntroduce()
}
```

実行結果、

```
Alice is 0 years old.
```


## 参考

https://stackoverflow.com/questions/45821929/in-which-situation-val-var-is-necessary-in-kotlin-constructor-parameter
https://www.programiz.com/kotlin-programming/constructors
plugins_description.xmlを用意する

【[rviz2プラグインの作り方 トップページへ](https://qiita.com/Kotakku/items/d3510c1ca505b4c0aa1e)】

rvizのプラグインとして登録するために ```plugins_description.xml``` が必要となります

```例.xml
<library path="sample_rviz_plugins">
  <class name="sample_rviz_plugin/CloseAll" type="sample_rviz_plugins::CloseAllTool" base_class_type="rviz_common::Tool">
    <description>
      close all displays
    </description>
  </class>
  <class name="sample_rviz_plugin/MyArrow" type="sample_rviz_plugins::MyArrow" base_class_type="rviz_common::Display">
    <description>
      description -----------
    </description>
  </class>
  <class name="sample_rviz_plugin/PubTwist" type="sample_rviz_plugins::PubTwist" base_class_type="rviz_common::Panel">
    <description>
      description -----------
    </description>
  </class>
</library>
```

```library path``` : パッケージ名
```name``` : rviz上で表示するプラグイン名、```sample_rviz_plugin/xxx```みたいにしておくとまとめてくれる
```type``` : .hpp/.cpp上でのクラス名、名前空間の中にあるときは名前空間も記述する
```base_class_type``` : プラグインのタイプ、```rviz_common::Display```, ```rviz_common::Panel```, ```rviz_common::Tool```の3種類存在する

```description``` タグにはプラグインの説明を記述しておきます
OLEDLCD(SSD1306)&ESP32で変数表示できない場合のbugfix

##何がやりたかった？
ESP32&DHT11で温度と湿度取得してLCDに表示したい

##エラー内容
***no matching function for call to 'SSD1306Wire::drawString ~~***

##エラーになったコード
```C
#include <Wire.h>
#include "SSD1306.h"//ディスプレイ用ライブラリを読み込み
#include <DHT.h>
#include <HTTPClient.h>


//LCD設定
SSD1306  display(0x3c, 21, 22); //SSD1306インスタンスの作成（I2Cアドレス,SDA,SCL）
//DHT11設定
const int PIN_DHT = 4;
DHT dht(PIN_DHT,DHT11);

void setup() {
  Serial.begin(115200);
  //DHT 設定
  dht.begin();
}

void loop() {

// DHT11から読み込み
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  delay(50);
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
    }
  
  //LCD設定
  display.init();    //ディスプレイを初期化
  display.setFont(ArialMT_Plain_16);    //フォントを設定
  display.drawString(0, 0,"t = " + t);    
  display.drawString(0, 16,"h =" + h);    

  display.display();   //指定された情報を描画

  //データ取得頻度
  delay(1000*15);  //1000ミリ秒＝1
}
```

##原因と対処
SSD1306で変数を表示したい時は***String(変数)***にしないといけない

***before***

```C
 //LCD設定
  display.init();    //ディスプレイを初期化
  display.setFont(ArialMT_Plain_16);    //フォントを設定
  display.drawString(0, 0,"t = " + t);    
  display.drawString(0, 16,"h =" + h);    

  display.display();   //指定された情報を描画
```

***after***

```C
//LCD設定
  display.init();    //ディスプレイを初期化
  display.setFont(ArialMT_Plain_16);    //フォントを設定
  display.drawString(0, 0,"t = " + String(t));    
  display.drawString(0, 16,"h =" + String(h));    

  display.display();   //指定された情報を描画
```

##終わりに
まだまだ座標に関することやフォントについてはマスターしていません。まずは意外とつまづくポイントとして記事に致します。

ちなみに日本語を表示させるには一手間必要になります。もし機会があればそちらも記事に致します。
プラグインにアイコンをつける

【[rviz2プラグインの作り方 トップページへ](https://qiita.com/Kotakku/items/d3510c1ca505b4c0aa1e)】


アイコンの画像ファイルを以下のように配置

```
 plugins/
  ├ src/
  │ ├ aaa.hpp
  │ ├ aaa.cpp
  │ ├ bbb.hpp
  │ └ bbb.cpp
  ├ icon/
  │ └ classes/
  │   ├ aaa.png
  │   └ bbb.png
  ├ CMakeLists.txt
  ├ package.xml
  └ plugins_description.xml
```

```CMakeLists.txt``` に以下を追加

```CMakeLists.txt
install(DIRECTORY icons
  DESTINATION share/${PROJECT_NAME}
)
```
rviz plugin用のpackage.xmlとCMakeLists.txtの書き方

【[rviz2プラグインの作り方 トップページへ](https://qiita.com/Kotakku/items/d3510c1ca505b4c0aa1e)】


```pkg create```で生成されたものに追記する分だけ書いておきます

# package.xml
```package.xml
  <depend>rclcpp</depend>
  <depend>libqt5-widgets</depend>
  <depend>rviz_common</depend>
  <depend>rviz_rendering</depend>
  <depend>rviz_ogre_vendor</depend>
```
この他にプラグイン内でトピックのやりとりをするなら必要なパッケージを追記(例,```<depend>std_msgs<\depend>```)


# CMakeLists.txt
```CMakeLists.txt
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rviz_common REQUIRED)
find_package(rviz_rendering REQUIRED)
find_package(rviz_ogre_vendor REQUIRED)
find_package(pluginlib REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Widgets)
# find_package(std_msgs REQUIRED)
# find_package(geometry_msgs REQUIRED)

include_directories(src ${OGRE_INCLUDE_DIRS} ${OGRE_INCLUDE_DIRS}/Paging)

set(CMAKE_AUTOMOC ON)

add_library(${PROJECT_NAME} SHARED
  # src/aaa.cpp
  # src/bbb.cpp
  # src/ccc.cpp
)

ament_target_dependencies(${PROJECT_NAME} 
  rclcpp 
  rviz_common

  # std_msgs
  # geometry_msgs
)

target_link_libraries(${PROJECT_NAME} Qt5::Widgets)

pluginlib_export_plugin_description_file(rviz_common plugins_description.xml)

install(TARGETS
  ${PROJECT_NAME}
  EXPORT ${PROJECT_NAME}  
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin
  INCLUDES DESTINATION include
)

```
package.xmlと同様に必要に応じて追記
rviz2のプラグインの作り方

ROS2環境で動作するrviz2のプラグインを自作するために必要なことをまとめる
ROS1で動作するrviz pluginをROS2環境に移植してるうちに勉強したことも備忘録として残しておく

# 更新
2021/03/12 Githubのリポジトリと記事を一通り追加

# 環境
- Ubuntu Desktop 20.04 LTS
- ROS2 Foxy Fitzroy

# 対象者
ROS2のインストールが終わっている人
ネットなどの記事を参考にしながらでもいいのでROS2で動くコードを書ける人

# 解説に使用するコード
[Githubのリポジトリ](https://github.com/Kotakku/sample_rviz_plugins)

# プラグインの種類
- Displayプラグイン
- Panelプラグイン
- Toolプラグイン

# 記事
## 準備
- [rviz plugin用のpackage.xmlとCMakeLists.txtの書き方](https://qiita.com/Kotakku/items/459be36640bb6036e089)
- [plugins_description.xmlを用意する](https://qiita.com/Kotakku/items/4ea5594a61b543a86826)

## Panel
- [Panelプラグインの雛形](https://qiita.com/Kotakku/items/2e8b119bcace3f6d0633)
- [Twistを送るPanel pluginを作る](https://qiita.com/Kotakku/items/01082cfd024a68c0d6ec)

## Tool
- [Toolプラグインの雛形](https://qiita.com/Kotakku/items/c112772fb8163c1d14bb)
- [Pointを送信するTool pluginを作る](https://qiita.com/Kotakku/items/0649fe5d1cd70a677ceb)

## Display
- [Displayプラグインの雛形](https://qiita.com/Kotakku/items/323e27e0db4e99c94aac)
- [Pointを受信するDisplay pluginを作る](https://qiita.com/Kotakku/items/545ba13f982a540f7e8d)
- [Logを受信してOverlay表示するDisplay pluginを作る](https://qiita.com/Kotakku/items/fe483e2238285c6266b0)

## その他
- [プラグインにアイコンをつける](https://qiita.com/Kotakku/items/57b916027f67e7735bce)

# 参考


- [ROS講座](https://qiita.com/srs/items/5f44440afea0eb616b4a)
  (記事にする機能の参考)
aws cli v2.0系でSSO Loginしaws-sdk-goでその情報を使おうとするとエラーになる

# 利用したバージョン

```
# エラーが発生したバージョン
$ aws --version
aws-cli/2.0.48 Python/3.7.2 Darwin/20.3.0 source/x86_64

# 問題なく実行できたバージョン
$ aws --version
aws-cli/2.1.30 Python/3.8.8 Darwin/20.3.0 exe/x86_64 prompt/off

# go.mod
github.com/aws/aws-sdk-go v1.37.28
```


# aws-sdk-goのエラー内容
```
failed to fetch configuration: SSOProviderInvalidToken: the SSO session has expired or is invalid
caused by: expected RFC3339 timestamp: parsing time "2021-03-11T19:47:52UTC" as "2006-01-02T15:04:05Z07:00": cannot parse "UTC" as "Z07:00"
exit status 3
```
# 解消方法

- aws cliのバージョンをv2.0系からv2.1系にアップグレードすると問題なく実行できました。


# 問題のCacheを実際に見てみた

- ファイルの場所は `~/.aws/sso/cache/*.json` のいずれか

aws cli v2.0系の場合

```
{
    "accessToken": "abcdefghijk...",
    "expiresAt": "2021-03-11T19:47:52UTC",　　←ここが問題
    "region": "us-east-1",
    "startUrl": "https://d-1234.awsapps.com/start"
}
```

aws cli v2.1系の場合

```
{
    "accessToken": "abcdefghijk...",
    "expiresAt": "2021-03-11T20:36:54Z",　　　←ここが変わった
    "region": "us-east-1",
    "startUrl": "https://d-1234.awsapps.com/start"
}
```

# 関連URL

https://github.com/aws/aws-sdk-go/issues/3763
Ｗebサーバ無しHTML(JavaScript)でJSONデータを扱う

## はじめに

Webサーバーを立てずに、ローカルHTML(JavaScript)でJSONデータを扱うサンプル作りました。なんちゃってアプリを作りたくなったときの自分用メモです。

## HTML(JavaScript)ソース

ソースgithubに置きました。

https://github.com/zgw426/Handling_JSON_with_no_web_server_HTML-JavaScript-


ファイルは以下の2つです。

- accessJson.html
- link.json.js

`link.json.js`はJSONデータを含む変数のみ記載しています。拡張子を`.json`とすると読み込み時にCORSエラーが発生するため、このような形式にしています。（ネットで見つけた方法）

Webサーバをたてず`accessJson.html`を実行するだけで動作します。

## 動作

ちょっとだけ動作を紹介します。

`accessJson.html`を実行するとこのような画面が表示されます。余談ですが、Webサーバを使ってないのでURLがファイルパスになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/ac9b56e2-c3e3-ace2-394d-1ed8dad40df7.png)

`Divタグに出力`ボタンをクリックするJSONデータの内容が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/4bcf3917-f036-7d52-7c47-5aeb7f9e8224.png)

columnCの値が入力した数値以上のデータのみ表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/0306e6d7-40ee-6a84-b152-f8150699a09f.png)

columnFの重複データをカウントした結果を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/289cd7e6-201a-6f21-926b-de382dbabea7.png)

## おわりに

Webサーバを使わないHTML(JavaScript)でも、JSONデータを扱えるの便利ですね。ちょっとしたアプリなら作れそう。
VC++ のフォルダ選択ダイアログ


# VC++ のフォルダ選択ダイアログ

VisualC++ でダイアログから フォルダを選択しようと思い 調べていたら `SHBrowseForFolder` に関する情報があったので使ってみたが、UIが古い上に インプリも難しい。
`CFileDialog` に似たものはないか調べていたら、、、何のことは無い、とても便利なクラスが用意されていた。

## 1. フォルダ選択ダイアログ  `CFolderPickerDialog`


```C++
    CFolderPickerDialog dlg;
	if( dlg.DoModal() != IDOK )
		return;

    CStringW fileNameW = dlg.GetPathName() ;
```


## 2. おまけ
#### ファイル選択ダイアログのファイルフィルタ
`CFileDialog` でフィルタ条件を 追加した時のサンプル

```C++
	CStringW ffilter ;
	ffilter  = L"all files (*.*)|*.*|" ;
	ffilter += L"text file (*.txt)|*.txt|" ;
	ffilter += L"csv file (*.csv)|*.csv|" ;
	ffilter += L"cpp source (*.cpp)|*.cpp|" ;
	ffilter += L"c  header (*.h)|*.h|" ;

    CFileDialog dlg(TRUE, L"cpp", L"*.cpp", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, ffilter ) ;
	if( dlg.DoModal() != IDOK )
		return ;

    CStringW fileNameW = dlg.GetPathName() ;
```
1つのアプリでFirebaseプロジェクトを複数扱う方法

## はじめに
もし1つのアプリに複数のFirebaseプロジェクトを使いたい場合のご紹介です。
ちなみに今回はAuthで確認しましたが、CloudFirestoreなど他のサービスでも使えると思います。

### コードの書き方
```AuthFragment.kt

// 二つ目以降のgoogle-services.jsonのid,keyを入力します

//setProjectId -> project_id
//setApplicationId -> mobilesdk_app_id
//setApiKey -> current_key

val options = FirebaseOptions.Builder()
            .setProjectId("xxxxxxxxxx")
            .setApplicationId("xxxxxxx")
            .setApiKey("xxxxxxxxxx")
            .build()

Firebase.initialize(context /* Context */, options, "secondary")

val secondary = Firebase.app("secondary")
authSecondary = Firebase.auth(secondary)


// authSecondaryを使って実装すればOkです

authSecondary.signInWithEmailAndPassword()
.addOnCompleteListener { 
 // ログイン処理を書く
}
```

二つ目以降のgoogle-services.jsonをディレクトリーはこんなかんじでもいけるみたいです
`/app/project-demo/google-services.json`


### 参考URL 
https://firebase.google.com/docs/projects/multiprojects?hl=ja
[Vue]404エラーページを作成

#概要
Vue-Routerを利用して存在しないページに遷移した場合の404エラーページを作成します。

作ると言ってもvue-routerに機能として存在するのですぐできます。

#実装
##Vue-router
```router.js

import NotFoundComponent from './components/top/NotFoundComponent'

const router = new VueRouter({
  mode: 'history',
  routes: [
    {
      name: 'notFound',
      path: '*', 
      component: NotFoundComponent 
    }
  ],
)}
```

##NotFoundComponent作成
```NotFoundComponent.vue
<template>
  <div>
    <img
      :src="`/images/404.svg`"
      alt="404">
  </div>
</template>
<script>
<style scoped>
img{
  width: 100%;
}
@media (max-width: 1000px){
div{
  background: #DEF2FF;
  width: 100vw;
  height: 80vh;
}
}
</style>
```

templateも画像で済ませているので、めちゃくちゃ手を抜いてます。笑
時間ある時に凝ったものを作ろうと思います。

![スクリーンショット 2021-03-11 21.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643906/755c15f9-a3d2-ea2d-019d-2f0870a3dc9b.png)

ただ画像がそれっぽければそれっぽい。笑


#まとめ
機能として404エラーページ簡単に実装できるので便利ですね。
Pythonあるある。dir()関数のネーミングが変。

#dir()関数のネーミングが変な件

シンプルには、`dir`というと、（パソコンというか、プログラミングというか、その世界で馴染んでいる）**ディレクトリ絡み**でしょう。
しかし、`dir()`は、ちょっと、意味が違うのでは？

#stackoverflowでのやりとり

https://stackoverflow.com/questions/1842414/why-is-dir-named-dir-in-python
より引用

- - -
質問（抜粋）：　:tada:
何をするものかは理解していますが、**なぜdirと呼ばれるのかについては混乱しています。**この名前は、オブジェクトから属性を取得することとどのような関係があるのでしょうか？

回答：
これは、オブジェクトのすべての属性のディレクトリを提供します。
これは、ファイルシステムで使われるディレクトリではなく、標準的な使い方である、**名前やデータのリストです。**

回答フォロー（なんと、Guido van Rossum　登場！:tada: :tada: )：
確かDOSのDIRコマンドにちなんで名づけたはずだ。

↑↑ **適当な回答！元の人の回答は、英語として普通の使い方と回答しているのに。。。DOSのDIRを持ち込んでしまっている。。。**

回答フォローのフォロー：
実際に作った人が回答してくれると、思わず**笑ってしまいます。**
- - -


#念のため

https://en.wiktionary.org/wiki/directory より

directoryとは、

>1. A list of names, addresses etc, of specific classes of people or organizations, often in alphabetical order or in some classification.
2. (computing) A structured listing of the names and characteristics of the files on a storage device.
3. (computing) A virtual container in a computer's file system, in which files and other directories may be stored. The files and subdirectories in a directory are usually related.


#まとめ
特にありません。
[Python] 先頭/末尾の文字・空白を除去する方法

# 概要
1: 先頭の文字を除去
2: 末尾の文字を除去
3: 空白を除去

※ 文字列の除去に関して使用する機会があったので、備忘録として記載
（ 正規表現やスライスを使いこなせるようになると、もっと表現の幅が広がりそうなので少しづつ学んでいきたい。)

# 検証環境
OS：18.04.5 LTS
Python：3.6.9

# 方法

## 1: 先頭の文字を除去
### lstrip()
<strong>型）文字列.lstrip()</strong>

```python
# lstrip()を使用
word = "リトルグリーメン"

word = repr(word.lstrip("リ"))
print(word)

# 結果
'トルグリーメン'
```

## 2: 末尾の文字を除去
### rstrip()
* rstrip(right strip)は、文字列の右側から探索し、一番初めに該当した文字を除去する。<br>
<strong>型）文字列.rstrip()</strong>

```python
# rstrip()を使用
word = "リトルグリーメン"

word = repr(word.rstrip("ン"))
print(word)

# 結果
'リトルグリーメ'
```

### スライス
* 負の値を指定してあげることで、末尾から指定した数値分除去できる。<br>
<strong>型）変数名[:-数値]</strong>

```python
# スライスを使用
word = "リトルグリーメン"

word = repr(word[:-2])

# 結果
'リトルグリー'
```

## 3: 空白を除去

### strip()

* 文字列内に空白が入っていた場合、除去する。

```python
# strip()を使用
word = "　リトルグリーメン　"

word = repr(word.strip())
print(word)

# 結果
'リトルグリーメン'
```
未経験エンジニアがRailsでポートフォリオ作りました！

# 自己紹介
(2021年3月時点)未経験からWEBエンジニアを目指しています。
ポートフォリオとして、RailsにてWEBアプリを作りました。

# アプリ概要
大好きなゴルフをテーマに、スコアを競ったり、メッセージや画像を投稿して楽しんだりと、ゴルフ版SNSのようなものをつくりました。是非使ってみてください！
・アプリURL:  [sologol.work](https://sologol.work/)
・github:    [tomo-IR](https://github.com/tomo-IR/golfscore)

![sologol_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693502/8c692b3a-1f54-cfba-d2a7-b22fcaa171c8.jpeg)

□ 特徴
・リーダーボード(スコアのランキング)機能を使って、知らない方同士とスコアを競い合うことが出来る。
・ フォローしているユーザーのラウンド情報をタイムラインで知ることが出来る。
・ゴルフ版SNSとして、ゴルフ仲間を作ることができる。
・各ゴルフ場の掲示板で、ゴルフ場の口コミ等、生の情報を得られる。
・スコア解析機能で、過去のスコアを解析することができる。
# 制作に至った背景

現在のコロナ禍において、ゴルフ業界は外出自粛によって経営的に大打撃を受けています。 そんなゴルフ業界の打開策として、３密を生まない「お一人様ゴルフ」なるものを始めるゴルフ場も増えてきています。 ただ、ゴルフは気の合う仲間と複数人でプレーするのが楽しいものです。なかなか1人でラウンドしようとは思わないという方も多いかと思います。 ゴルフを愛する者としては、このままの経営悪化状況が続き、ゴルフ場が減ってしまうことはとても悲しいことです。少しでもお一人様ゴルフをする方が増えて、 ゴルフ業界にとっての危機的状況からの脱却への一助となればと思い、制作に至りました。

# 工夫した点

・**APIからゴルフ場情報の取得とDBへの登録**
  スコア等の諸々のデータとゴルフ場名を紐付けしようとすると、ゴルフ場名に一意性がなければ成立しない。そこで、楽天ゴルフ場詳細APIを使用してゴルフ場情報を取得し、gem wheneverを使用して週に一回情報の自動更新する機能を実装した。 

・**スコア入力のし易さ**
スコア入力画面は、ゴルフ場にてスマートフォンからの入力を想定し、大きなボタンで入力のし易さに配慮した。

・**スコア非公開機能**
自分のゴルフスコアを公開せず、スコア解析機能のみ使用したい方のために、スコア非公開機能を実装した。

・**画像表示速度の高速化**
AWS CloudFrontと、gem mini_magickを使用して、画像の表示を高速化し、ユーザーにストレスを与えないように配慮。



# 機能一覧
### メッセージ投稿関係
・各ゴルフ場の掲示板へのメッセージ投稿(非同期通信)
・メッセージ削除機能(非同期通信)
・各メッセージへのいいね機能(非同期通信)
・いいねしたユーザー一覧表示機能
・画像投稿機能(carrierwave、非同期通信)

### ゴルフ場情報関係
・楽天GORAゴルフ場検索API (version:2017-06-23より取得)
・ゴルフ場キーワード検索機能(日本全国全てのゴルフ場)
・gem wheneverによる週一回の自動更新機能

### ユーザー関係
・ユーザー登録・編集・削除（deviseのgemを使用)
・登録不要のワンクリックでゲストログイン可能
・プロフィール画像の登録・編集（carrierwave使用）
・ユーザーのフォロー・フォロー解除
・フォロー中のユーザーとフォロワーの一覧表示
・フォローしているユーザーの最近のラウンド情報をタイムライン表示

### ゴルフスコア関係
・スコア入力、集計機能
・リーダーボード機能（同一プレー日、同一ゴルフ場でのスコアランキング表示）
・スコア非公開機能
・プレイ終了後スコア編集機能
・スコア解析機能（期間絞り込み機能）

### その他
・レスポンシブ対応
・テスト（20 examples）
# 使用技術
### フロントエンド
html
Scss
JavaScript（ES6、一部jQuery）
bootstrap
### バックエンド
Ruby 2.6.6
Rails 6.0.3.5
### データベース
MySQL 2 8.0.23
### テスト
RSpec 3.9
FactoryBot 4.11
### 開発環境
RuboCop 1.10.0
bullet 6.1.3
### 本番環境
AWS(VPC、EC2、RDS、S3、Route53、IAM、CloudFron)
HTTPS化(ACM, ALB) *【Web サーバー】 Nginx *【アプリケーションサーバー】 Puma
### その他
whenever(ゴルフ場情報自動更新タスク定期実行)
# DB設計

## ER図
![er.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693502/f3bbfa2c-1ad6-39d4-cd4d-96b4552078df.png)
## 各テーブルの概要
|  テーブル名  |  概要  |
| ---- | ---- |
|  user  |  プレイヤー情報  |
|  golfcourse  |  ゴルフ場情報（APIから取得）  |
|  message  |  各ゴルフ場掲示板のメッセージ |
|  score  |  ゴルフスコア |
|  like  |  メッセージへのいいね |
|  relationship  |  プレイヤーのフォロー情報  |


# インフラ構成図

![Untitled Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693502/3c5c7fa3-f8f4-c349-b84a-37e566165dee.jpeg)
【備忘録】メールの原理について

最近では各種チャットツールの普及により触れる機会が減少傾向にあるメール

しかし、B2C, B2Bの場面では未だ多用されているため、メールの原理について学びまとめる

# そもそもメールのやり取りって？

メールのやり取りというのはメールというテキストデータ(厳密には異なる)を送信者から受信者へと通信している
コンピュータ間のデータ通信においては通信プロトコルに従ってやりとりを行わなければいけない
メールにも適切な通信プロトコルがあり，メール送信時にはSMTP，受信時にはPOPまたはIMAPと呼ばれるプロトコルが使用されている

メールに関するプロトコルもTCP/IPに含まれておりポート番号によって，どのプロトコルによる通信かを判別する

# メール送受信の原理
1. 送信者が送信したメールが送信メールサーバーに届く
2. DNSサーバーがメールアドレスのドメイン名からIPアドレスを割り出す
3. 配送先のメールサーバーにメールを転送する
4. 受信者が受信サーバーからメールを受け取る

## 1. 送信者が送信したメールが送信メールサーバーに届く
SMTPサーバーが送信に関する役割を担う
メーラーからのメールをSMTPサーバーが受け取る

## 2. DNSサーバーがメールアドレスのドメイン名からIPアドレスを割り出す
### DNS(Domain Name System)
インターネット上のドメイン名を管理するシステム

DNSサーバーはSMTPサーバーに依頼された際に相手側のSMTPサーバーのIPアドレスを割り出す
メールアドレスのドメイン部分の情報をもとにIPアドレスを導き出す

## 3. 配送先のメールサーバーにメールを転送する
DNSサーバーを利用して割り出した相手側のIPアドレスのSMTPサーバーにメールを転送する

## 4. 受信者が受信サーバーからメールを受け取る

POP3とIMAPはメールの受信に利用されるプロトコル

### POP3(Pos Office Protocol)
メールサーバーにメールが届いた後に届けられた端末にメールをダウンロードする
受信者はメーラーからPOP3サーバーのメールボックスへアクセスしてメールを受け取る
POP3を利用するとサーバーに接続できないオフラインの状態でもメールを見ることができる

### IMAP(Internet Message Access Protocol)
サーバー上でメールを管理する
どの端末からでも同じ内容のメールを閲覧することができる

#参考
- https://blastmail.jp/blog/mail-delivery/send-and-receive-mail
- https://www.kagoya.jp/howto/rentalserver/mailserver/
- https://www.pi-pe.co.jp/solution/article/mail/40/
Docker machineのインストールがすんなり出来なかった件（Docker for Macユーザ向け）

#はじめに
新しく貸与されたMacにDocker for Macをインストールしたら、Docker machineが入ってなかったので、インストールしようとしたらエラーが出た。

```
zsh: permission denied: /usr/local/bin/docker-machine
```

#環境
MacOSはCatalinaです。

#パーミッションを変更
権限がないみたいなので、権限を変更します。

##変更前の状態を確認する

```
% ls -la  /usr/local | grep bin 
drwxr-xr-x  26 root  wheel  832  3 11 20:04 bin
```

#変更する

```
% sudo chmod 777 /usr/local/bin 
Password:
% ls -la  /usr/local | grep bin 
drwxrwxrwx  26 root  wheel  832  3 11 20:04 bin
```

#インストールする

※バージョンが更新されるので、実際にインストールする際のコマンドは下記のページを確認して下さい。

https://github.com/docker/machine/releases/

```
% curl -L https://github.com/docker/machine/releases/download/v0.16.2/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && chmod +x /usr/local/bin/docker-machine
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   634    0   634    0     0    795      0 --:--:-- --:--:-- --:--:--   794
100 38.5M  100 38.5M    0     0   736k      0  0:00:53  0:00:53 --:--:--  518k
%
```
Complete!!とか出ないんですね...。


#インストールされたか確認する

```
% docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS
```

#パーミッションをもとに戻す

```
% sudo chmod 755 /usr/local/bin 
Password:
@~ % ls -la  /usr/local | grep bin 
drwxr-xr-x  27 root  wheel  864  3 11 20:30 bin
```
ちゃんと権限が変更前とおなじになりました。
インストールした分、容量がちょっと増えてますね
パーミッションを変えるときって、なんかドキドキすします。
git push --force-with-leaseでpushを強制する

#目次
- はじめに
- 使用環境
- git push を強制するオプション「-f, --force」
- ブランチ更新日付が新しい時だけ強制する「--force-with-lease」
- 終わりに


#はじめに
Railsチュートリアルローカル環境にて進めており、一区切りついたのでpushしようとしたら以下のようなエラーが出ました。色々試しましたが、どうにもpushできず、恐らくmacOSをバージョンアップしたことによる何らかのエラーで、GitHubにcommitすら反映されていませんでした。









```
$ git push origin master
To https://github.com/xxx/xxx.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/xxx/xxx.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```





#使用環境
macOS BigSur 11.2.2
ruby 2.6.6
Rails 6.0.3
git version 2.30.1
Visual Studio Code(エディタ)


#git push を強制するオプション「-f, --force」
調べてみると、無理やりリモートの履歴を上書きするには、git push は「-f」オプションで強制できるみたいで、

```
// git pushを強制するオプション (２つは同義)
git push -f origin master
git push --force origin master
```


#ブランチ更新日付が新しい時だけ強制する「--force-with-lease」
--force-with-lease とは、pushの際、ローカルrefとリモートrefを比較しローカルが最新か確認。最新でなければ、pushは失敗するというもの。


git push --force と似ていますが、ローカル側の履歴がリモートの履歴よりも新しいときだけ強制するみたいです。


幸い今回開発しているのは自分一人だけで、macOSのバージョンアップ前に一度しかpushしていなかったので、以下を実行して強制pushを試みました。


```
$ git push --force-with-lease origin master
```


すると無事pushが成功してGitHubにも反映されていました！めでたし。



#終わりに
色々調べてみると、上記の強制pushコマンドはチーム開発では、使う際には充分気をつけた方がいいみたいですね。
【Rails】変数やパラメータのnullチェック。例外処理の実装方法

パラメータや変数を他の場所から受け取って処理をする場合は、冒頭でデータが渡されているかのチェック（nullチェック）を行う。

データに入力値がないとエラーになる処理がある場合は必ず記述する。


##nullチェックの方法

```rb:
if 変数.blank?
 raise "エラーメッセージ"
end
```


<br>
**実例**
nullチェック対象の変数が複数ある場合は`||`でつなげる。

```rb:
def test
  id = params[:id]
  name = params[:name]
  
  if id.blnak? || name.blank?
    raise "id or name missing"
  end
  
  処理

end
```

<br>
▼ブラウザの表示

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/8e485fa8-93bb-7c02-c9f4-e616f2e0bfc5.png)|
|:--|
[AtCoder]AtCoder Beginner Contest 131

# はじめに
* AtCoder Beginner Contestの過去問の解法及び提出したソースコードをまとめています。
* 基本的に自分が振り返ることを目的としておりますが、誤りや気になった点、その他質問等もお待ちしておりますので遠慮なくお願いします。

# コンテストページ
https://atcoder.jp/contests/abc131

# A問題
各文字が前後の文字と１つも一致してなければGood、そうでない場合Badです。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    cin >> s;
    bool good = true;
    for(int i = 0; i < 3; i++){
        if(s[i] == s[i+1]) good = false;
    }

    if(good) cout << "Good" << endl;
    else cout << "Bad" << endl;
    return 0;
}
```
# B問題
1からNまでの各りんごの味をいれた配列を用意し、その中で味の絶対値がもっとも小さいものを求め味の合計から引いたものが答えになります。

```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,l;
    cin >> n >> l;
    vector<int> a(n);
    for (int i = 0; i < n; i++) a[i] = l + i;
    
    int m = INT32_MAX;
    for (int i = 0; i < n; i++){
        if(abs(a[i]) < abs(m)){
            m = a[i];
        }
    }

    cout << accumulate(a.begin(), a.end(), 0) - m << endl;
    return 0;
}
```
# C問題
本問題は２つの要素から成り立っています。
### １つ目
①一般にX以下の整数でZで割り切れるものの個数はX/Z個です。 
②X以下Y以上の整数でZで割り切れるものの個数は、①からY未満の整数でZで割り切れるものも個数(Y-1)/Zを引いたものになります。

### ２つ目
一般にある範囲の整数のXの倍数でもYの倍数でもないものの数は、その範囲の数の個数からXの倍数の数とYの倍数の数を引き、重複して引いたXとYの最小公倍数の倍数の数の分を足し直したものになります。

これらの要素を組み合わせて本問題を考えると、B以下でCでもDでも割り切れない数の個数とA未満でCでもDでも割り切れない数の個数をそれぞれ求めて、引いてものが個数となります。

```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main()
{
    ll a,b,c,d,cd;
    cin >> a >> b >> c >> d;
    cd = lcm(c,d);

    // B以下でCでもDでも割り切れないものの個数
    ll x = b - (b/c + b/d - b/cd);
    // A未満でCでもDでも割り切れないものの個数
    ll y = (a-1) - ((a-1)/c + (a-1)/d - (a-1)/cd);

    cout << x - y << endl;
    return 0;
}
```
# D問題
締め切りの早いものから順に処理していけばよいです。根拠は公式解説をご参考ください。


```c++
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<pair<int,int>> ab(n);
    for(int i = 0; i < n; i++) cin >> ab[i].first >> ab[i].second;
    sort(ab.begin(), ab.end(), [](auto& lhs, auto& rhs){return lhs.second < rhs.second;});

    int time = 0;
    bool yes = true;
    for(auto& x : ab){
        time += x.first;
        if(x.second < time) {
            yes = false;
            break;
        }
    }

    if(yes) cout << "Yes" << endl;
    else cout << "No" << endl;
    return 0;
}
```
# E問題(未AC)
まだ解いていません。

# F問題(未AC)
まだ解いていません。
Google画像検索が凄すぎ、「？」。(いや、見つけてくれないことが多い！！）

#たまたま試したGoogle画像検索が凄すぎ

以下の記事にて、

[Vision Transformer (ViT)とResNet50の現場力比較。映り込み画像、寄り画像、、、。](https://qiita.com/enoughspacefor/items/57f7cda9dc9e26765795)

深層学習の検出精度を検証するために、２つの画像を重ねた画像を作って使用したのですが、

今回、
それを、画面キャプチャして、
Google画像検索( https://www.google.co.jp/imghp?hl=ja )すると、
しっかり、元のパンダの画像がある記事を見つけました。
天才！ :tada::tada:

↓この画です。
![pan_bana12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/1cd82790-3a52-d7e4-f941-55c8069ea4e5.png)

#Google画像検索結果

バシッと同じ画像を見つけている！！！　:tada:

検索結果↓

- - -

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/e6ef0321-5974-a402-23fa-37d013c64ed3.png)

- - -

（※自分の記事にこの画像をどこから持ってきたか記載がなかったのですが、ということは、著作権フリーのところから持ってきたと思うのですが。。。。そのそもの出どころが？？？、怪しいかも、これは、余談。）


#タイトルに「？」を付けた理由
## 追加で確認してみた
以下に示すとおり、追加で確認した。結果の成功失敗のみ記す。

##追加１
画像は、これ↓。　⇒結果は、失敗！　:no_good::no_good::no_good::no_good::no_good::no_good:
![sugo_test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/f7665618-5f5e-343c-70f9-730df06895b6.png)
※成功した追加５と見比べて下さい。


##追加2
画像は、これ↓。　⇒結果は、成功！　:tada:
![sugo_test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/1f82a233-6ff8-9dc4-2dd8-42d9df49892f.png)


##追加３
画像は、これ↓。　⇒結果は、失敗！　:no_good::no_good:
![sugo_test3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/bfcceab8-0962-ddfc-9978-f24e2bc033ba.png)


##追加４
画像は、これ↓。　⇒結果は、失敗！　:no_good::no_good:
![sugo_test4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/45710008-b1fa-a784-8ea5-83837e0ccf88.png)


##追加５
画像は、これ↓。　⇒結果は、成功！　:tada::tada::tada:

![sugo_test5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/790e147c-1809-ab58-0d37-0e919ca2b6b1.png)
※失敗した追加１と見比べて下さい。

##追加１~５のまとめ
タイトルに「？」を付けたとおり、微妙。基本！、**別画像の重畳には耐えていない**感じがする。重畳の影響が少ない部分で、検出している感じがする。


#まとめ
ちょっと、凄いと思ったので、記事にしました。
**画像出どころ調査！**には、使える。
Reactエンジニアが初めてjQueryを触った所感

## 概要
どうも初めまして、エンジニア歴4年目のとよと言います。
私がエンジニアになったのは、2017年の秋でその頃にはReactなどが出始めで、jQueryをすっとばしてReactを使っておりました。

そして、最近転職し、転職先でjQueryを扱うことになり、「今更jQueryかよ。。。」と思いながらもjQueryを学びながら思った所感をずらずらと書いていきたいと思います。

## 対象者
- jQuery初心者
- ReactやVueをの経験はあるがjQuery未経験者


## jQueryとは
jQueryは、ウェブブラウザ用のJavaScriptコードをより容易に記述できるようにするために設計されたJavaScriptライブラリである。

## メリット
- コード量を短縮できる
- 多くのブラウザに対応している
- 手軽に実装ができる
- 豊富なプラグイン

## 所感
DOMの取得や操作が生のJavaScriptよりは多少楽だと感じたが、メリットはそのぐらいなと感じました。また、jQueryだからできるメリットのようなものは感じられなかったので、ReactやVueの前時代の技術感が否めなかった。


## jQuery未経験者に送る言葉
ReactやVueを扱った事があるエンジニアの方でしたらjQueryのソースを理解することは容易いかと思います。
もし私と同じようにプロジェクトでjQueryを扱っていれば、入門サイト一通り長め、既存のソースを眺めれば、８割方理解出来ると思います。
一部jQuery特有のメソッドがありますが、ググればOK！特に躓くことも無いかと思います。
学習時間としても1日もあれば大丈夫かと思います。

今もjQueryを使用しているプロジェクトはあるが、近年のフロントエンドエンジニアの転職活動に求められるスキルはReactやVueなどのSPAの知識のため転職先で扱うようなら覚えたらいいと思います。

## 学習に使ったサイト
[jQuery入門道場 ~jQueryの使い方~](https://jquery-master.net/start/)
[初心者向けのjQuery入門講座](https://jquerystudy.info/tutorial/intro/ready.html)
[とほほのWWW入門　jQuery入門](http://www.tohoho-web.com/js/jquery/index.htm)
rails g devise installと誤って実行してしまった時は、、

初めまして。プログラミング初学者のkoheiです。

自分が学習中に失敗したこと、勉強になったことを備忘録としても共有させて頂きたいと思います。
よろしくお願いします。

Ruby on RailsでDeviseのgemをインストールする際

```
bundel install
の後は

rails g devise:install
```
とすべきなのですが、誤って

```
rails g devise install
```
と「:」の代わりにスペースを打ち込んでしまいました。
 すると、、以下のようにマイグレーションファイルなどが生成されてしまいました。

```
Running via Spring preloader in process 4050
      invoke  active_record
      create    db/migrate/20210311101210_devise_create_installs.rb
      create    app/models/install.rb
      invoke    test_unit
      create      test/models/install_test.rb
      create      test/fixtures/installs.yml
      insert    app/models/install.rb
       route  devise_for :installs
```
やり直さなければ、とすぐに

```
rails d devise install
```
を実行したのですが、長文のエラーが出てうまくいきません。
原因はRailsのルーティングのファイル（下記）に記述が加えられていたからです。


```ruby
Rails.application.routes.draw do
  devise_for :installs
  root to: "posts#index"
end

```
上記2行目のdevise_for~の記述を削除し、再度
rails d devise install
で無事元に戻りました。

gemをインストールする際、ルーティングに記述が加わることがあると認識できました！
しかし、まずは誤入力をしないように注意していきたいと思います！
BigQuery で JSON_EXTRACT_PATH_TEXT 関数が通るようにする


Redshiftベースのクエリー資産をBigQueryで活かしたいが、書き換えを最小限にしたい。
Redshiftの `JSON_EXTRACT_PATH_TEXT` に近いのは `JSON_VALUE` であったが第2引数をどうしても自動処理できなかった。
仕方ないので1階層だけ拾えればよかったので JavaScript UDF で対処した。

```sql

CREATE TEMPORARY FUNCTION JSON_EXTRACT_PATH_TEXT(json_string STRING, path_elem STRING, null_if_invalid BOOLEAN)
RETURNS STRING
LANGUAGE js
as """
  return JSON.parse(json_string)[path_elem];
""";
```

`JSON_EXTRACT_PATH_TEXT` を完全再現するには最大7つの引数を受け取る（`ANY TYPE` として STRINGでもBOOLでも受け付ける）ようにして、分岐を書かないとイケないのでそこまではしなかった。
こんな感じでRedshift固有の関数をUDFで揃えていけば移行が捗るか？
Rspec ~ インストールから準備まで~

---

備忘録。


#Rspec Install

今回は、Gemfileに記述してRspecのRails用の機能を追加します。

> Gemfileに記述

>```
gem 'rspec-rails', '~> 5.0'  #  (2021/3/11時点で最新)
```

バージョンはお好みで、

[RubyGems.org](https://rubygems.org/)でrspec-railsを検索して、バージョンを確認しましょう。


> ```
$ bundle 
```
>実行してgemをインストール。

#Rspecに必要なもの

>gemのインストールが終わったら、

> ```
$ bin/rails g rspec:install
```

> を実行。

> このgenarateコマンドを実行することで、設定ファイルなどを作成します。

---

1.Rails標準のMinitestを今後使わない。
     &
2.Railsアプリケーションを作成した時、自動でtestディレクトリが作られている場合は、

```
$ rm -r ./test
```
を実行。

もしくは、直接テキストエディタからtestフォルダを消しましょう。

### Rspecを使っていくなら、specディレクトリ下にテストファイルが格納される。

### Minitest用のtestというフォルダは要らないです。

---

# Rspecのフォーマット


```ruby


require 'rails_helper'
# Rails特有の設定。


describe[ ✖︎✖︎✖︎ 機能 ], type: [ スペックの種類 ] do
    context: [ 条件 (▲▲▲ の場合) ] do
        [ 事前準備 (contextの中身を確認するのに必要な準備) ]
    end

    it [ 期待値の概要 ( 〇〇しますよ〜 ) ] do
        [ 期待する動作 ]
    end
end
```
---
###他にもFactoryBotなどテスト作成を支援してくれるgemなど色々あるので、調べてみてください！！！

---
LottieとUIViewPropertyAnimatorが干渉するときの対処法

LottieのanimationとUIViewPropertyAnimatorを同じタイミングもしくは続けて実行すると、アニメーションが干渉してLottieの方がうまく表示されない。
どうすればいいかというと、

LottieのAnimationViewとPropertyAnimatiorの対象Viewのview階層を分けて実行してあげると、タイミングが一緒でも両方きれいにアニメーションが表示される。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
【Ruby】配列の中に要素を追加する方法。pushと<<（破壊的処理）

Rubyである配列の後ろに要素を足していく処理は、pushまたは<<で実現できる。

`<<`が初見だったので意味を調べてみたところ、配列への要素追加処理だった。

##.push
pushメソッド使う方法。<<と異なり、**引数を複数とれる**。

```rb:push
x = {a:1, b:2}
y = {c:3, d:4}

arr = []

arr.push(x, y)
=> [{:a=>1, :b=>2}, {:c=>3, :d=>4}]
```


<br>
##<<
pushと異なり引数は１つしか取れないが、つなげて記述することができる。

```rb:<<
x = {a:1, b:2}
y = {c:3, d:4}

arr = []

arr << x << y
=> [{:a=>1, :b=>2}, {:c=>3, :d=>4}]
```

https://docs.ruby-lang.org/ja/latest/method/Array/i/=3c=3c.html

<br>
文字数が少ないので`<<`を使っている人が多いかな。
CentOS7でwordpress環境の構築 -Wordpressのセットアップ編-

# はじめに
さて、 [CentOS7でwordpress環境の構築 -PHPのインストールとミドルウェアのセットアップ編-](https://qiita.com/siba4848/items/8990ada4425e6e4d97e9) が済んだので、いよいよ Wordpress のインストールを行います。


# wordpressのインストール

まずドキュメントルートに移動します。

```
$ cd /var/www/html/
```

Wordpressのインストールに必要な圧縮ファイルをダウンロードします。

```
$ sudo curl -LO http://ja.wordpress.org/latest-ja.tar.gz
```

んでもって、ダウンロードしたファイルを解凍します。
そうするとwordpressというディレクトリが出来上がっています。

```
$ sudo tar zxf latest-ja.tar.gz
$ ls
latest-ja.tar.gz　wordpress
```

このままではwebサイトにアクセスするURLが http://xxx.xxx.xxx.xxx/wordpress/domain/ となってしまう為、展開したファイルをドキュメントルート内に移動します。

```
$ sudo mv wordpress/* .
$ ls
index.php        wp-admin              wp-content         wp-load.php      wp-signup.php
license.txt      wp-blog-header.php    wp-cron.php        wp-login.php     wp-trackback.php
readme.html      wp-comments-post.php  wp-includes        wp-mail.php      xmlrpc.php
wp-activate.php  wp-config-sample.php  wp-links-opml.php  wp-settings.php

※ココに latest-ja.tar.gz と wordpress も出てきます。
```

Apachenのアクセスを許容する為、ドキュメントルートの所有者と所有グループを変更します。
また、wp-config-sample.php というファイルの名前を変更します。

```
$ sudo chown -R apache:apache /var/www/html/
$ sudo mv wp-config-sample.php wp-config.php
```

latest-ja.tar.gz と wordpress は消してしまってOKです。

```
$ sudo rm -rf latest-ja.tar.gz wordpress
```

次に wp-config.php を編集します。
ファイルを開いて日本語の部分は文字化けしている場合は[CentOS7のロケール設定](http://qiita.com/sibatan/items/632d2857c1798bd18743)を参照して日本語設定を行ってください。

```
$ sudo vi wp-config.php

<?php
/**
 * WordPress の基本設定
 *
 * このファイルは、インストール時に wp-config.php 作成ウィザードが利用します。
 * ウィザードを介さずにこのファイルを "wp-config.php" という名前でコピーして
 * 直接編集して値を入力してもかまいません。
 *
 * このファイルは、以下の設定を含みます。
 *
 * * MySQL 設定
 * * 秘密鍵
 * * データベーステーブル接頭辞
 * * ABSPATH
 *
 * @link http://wpdocs.osdn.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86
 *
 * @package WordPress
 */

// 注意:
// Windows の "メモ帳" でこのファイルを編集しないでください !
// 問題なく使えるテキストエディタ
// (http://wpdocs.osdn.jp/%E7%94%A8%E8%AA%9E%E9%9B%86#.E3.83.86.E3.82.AD.E3.82.B9.E3.83.88.E3.82.A8.E3.83.87.E3.82.A3.E3.82.BF 参照)
// を使用し、必ず UTF-8 の BOM なし (UTF-8N) で保存してください。

// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'database_name');　　← ココ

/** MySQL データベースのユーザー名 */
define('DB_USER', 'database_user_name');　← ココ

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'database_user_passwprd');　← ココ

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DB_CHARSET', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

 <<<略>>>
```

設定完了後、このファイルのアクセス権限を編集しておきます。
SElinux が有効の場合、wordpress が使えなくなるので SElinux はココで無効にしておきます。
もし[SELinuxを有効にしてwordpressを運営する場合の設定](https://qiita.com/siba4848/items/72462235c402e9ae0b85#tips)の手順を実施している場合はSElinuxの無効化は必要ありません。


```
$ sudo chmod 400 wp-config.php
$ sudo setenforce 0
```

あとはブラウザで http://XXX.XXX.XXX.XXX/wp-admin/install.php/ にアクセスをすればWordpressのセットアップGUIが開きますので、必要な情報を入力してからインストールを行ってください。

こんな画面が出ればOKですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391107/5eecc2d6-f5d6-725e-c01f-33710a3b130f.png)


以上、【 CentOS7でwordpress環境を構築 】でした。
インタープリタを作る その9

#概要

インタープリタを作ってみた。
fizzbuzzやってみた。


#参考にしたページ

https://github.com/been-jamming/Ben-BASIC

#サンプルコード

```

>>> list
10 for i,1,99
20  let j,0
30  let k,i%15
40  if (k=0)
50   print "fizzbuzz"
60   let j,1
70  end
80  let k,i%5
90  if (k=0) and (j=0)
100   print "buzz"
110   let j,1
120  end
130  let k,i%3
140  if (k=0) and (j=0)
150   print "fizz"
160   let j,1
170  end
180  if (j=0)
190   print i
200  end
210 end
>>>

```


以上。
オープンソースで作ったテキストマイニングシステムのバージョンアップ予告 (NLP4J)

[NLP4J Index](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29) 

# テキスト分析システム

↓にてご紹介しましたテキストマイニングシステムについて、UIとレスポンスを大幅に向上し、英語と日本語の両方に対応したもバージョンをリリース予定です。

https://qiita.com/oyahiroki/items/0e645902148c697c6d0d

# バージョンアップ後のスクリーンショット

※開発中の画面です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/7961ba2c-376a-4986-0744-05340c09bced.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/0b4df257-cd2d-3045-7a32-8d2c610c6c72.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/ea290e40-6fa7-e008-9283-832c5c232eac.png)

大矢裕己


#プロジェクトURL
https://www.nlp4j.org/
<img width="64" alt="NLP4J_N_128.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4f59b21b-4b43-187d-0aac-7b99c0fd4bac.png">


---
[NLP4J Index](https://qiita.com/oyahiroki/items/ba79a759c599d3459d29)