OmniAICreator/Qiita-1.07M huggingface dataset:
【超初心者向け】Android入門 Button編

# はじめに
前回Android入門 TextView編をやったので今回はButtonに関して解説していきたいと思います。

# 記事の対象
- Androidアプリ開発初心者
- Androidをこよなく愛す人
- 前回の記事を読んだ方

# Buttonとは

その名の通りボタンです。
押して何かしらのアクションを起こすものですね。

# 1. activity_main.xmlにButtonを追加する。

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:text="Click!"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/textView" />

</androidx.constraintlayout.widget.ConstraintLayout>
```

Buttonの中に書いてあることは最初は無視でいいです。
簡単に説明すると、Buttonがどのくらいの大きさで(layout:width, layout_height)、上にどれだけ余白をつけて(layout_marginTop)、ボタンのテキストはどうするか(text)、　どの位置に配置するか(layout_constraintHogetHoge)です。

興味がある方は色々試してみてくださいねー！

# 2. MainActivity.ktでButtonを定義する

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val textView = findViewById<TextView>(R.id.textView)

        textView.text = "こんにちは、世界"

        val button = findViewById<Button>(R.id.button)
    }
}
```

前回の続きからなので、textViewが定義されたままですね。

その下にボタンでボタンを定義していきましょう

勘がいい方はお気づきかと思いますが、findViewByIdメソッドがxml上で定義したidを元にViewを見つけてくれるんですね！

# 3.クリックリスナーを定義する

クリックリスナーというのはボタンをクリックした時にどんな動作をさせるかというものです。
今回はボタンをクリックしたらtextViewの文字がClicked!になるようにしましょう。

先ほどのval button = ~~の下に以下の一文を加えてください

```kotlin

button.setOnClickListener {
    textView.text = "Clicked!"
}
```

# 4.実行

さぁ実行してみましょう！
どうでしょう？

ボタンをクリックしたらこんにちは、世界がClicked!になりましたね。


# 5.まとめ

今回はButtonの解説をしていきました。

上記の通りにやっても動かない等あれば気軽にコメントやTwitterのDMに質問ください！
【超初心者向け】Android入門 TextView編

# はじめに
前回Android入門 Hello World編を書いたので、今回はHello World以外の出力をしてみたいと思います。

# 記事の対象
- Android入門者
- Android開発してみたい人
- 前回の記事を読んだ方

# TextViewとは
TextViewはテキスト表示するためのViewです。

前回の続きから書いていきましょう。

# 1. activity_main.xmlを確認

![スクリーンショット 2020-10-20 20.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/e73a0011-6b35-7383-3370-6caa85bc3aa0.png)

左側のディレクトリ構成を確認します。
app/res/layoutの中にactivity_main.xmlがあることがわかりますね。
基本的にレイアウトファイルはapp/res/layout下に配置していきます。

# 2. xmlを見てみる
上記の画像の右上のタブが今はDesignが指定されていますが、これをSplitにします。
![スクリーンショット 2020-10-20 20.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/94745e23-ecc9-840a-9e27-2e781830f59c.png)

この画面になっていると思います。

このTextViewの中にIDを付与してきます。

```xml:activity_main.xml
<TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
```

# 3. MainActivityを見てみる
app/java/{package_name}を見てみるとMainActivity.ktがあることがわかります。

![スクリーンショット 2020-10-20 20.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/d166a3ff-6fc7-0eda-b888-a3242ab86a5f.png)

こんな感じですね。
このonCreateメソッドの中で、Viewをいじっていきます。

```kotlin:MainActivity.kt
package com.example.helloworld

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val textView = findViewById<TextView>(R.id.textView)
        
        textView.text = "こんにちは、世界"
    }
}
```

```kotlin
val textView = findViewById<TextView>(R.id.textView)
```
この一文でxmlで定義したTextViewをActivity側で認識させます。

```kotlin
textView.text = "こんにちは、世界"
```

この一文で認識したTextViewに新しい文を追加します。

# 4. 実行

さぁ、実行してみましょう！
スタートボタンを押すとどうでしょう。
![スクリーンショット 2020-10-20 21.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/69c1887b-f1ef-f658-daf5-e037d9df99b0.png)

Hello Worldがこんにちは、世界に変わってますね。

# まとめ
今回はTextViewを使って新しい文を表示させました。

動的に新しい文を表示させたい場合はこんな感じにすればOKですね。
【超初心者向け】Android入門  Hello World編

# はじめに
今回は超初心者向け、AndroidでHello worldを出力するだけの記事です。

# 記事の対象
- Androidアプリ開発をしたことがない人
- Androidに挑戦してみたい人
- Hello World大好きな人

# 環境構築

[Android Studioをインストール](https://developer.android.com/studio?hl=ja)するだけです。

# 初めてのAndroidアプリ
## 1. Create New Projectを選択します。
![スクリーンショット 2020-10-20 19.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/0f85cafd-6627-9efe-2a15-88623bdb6002.png)


## 2. Empty Activityを選択しNextを押下
![スクリーンショット 2020-10-20 19.34.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/e3004808-c38a-b216-70b5-1fa8390944d1.png)

## 3. アプリ名を決めます
![スクリーンショット 2020-10-20 19.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/0d8b833b-afd8-aa16-4b86-1fa6e22f73ec.png)


Name: アプリ名(今回はHelloWorldにしました)
Package Name: パッケージ名（無視でいいです）
Save Location: 保存場所
Language: 言語(Kotlin or Java)
Minimum SDK: デフォルトで構いません。

**これらが終わったらFinishを押下します。**

# 4. Androidアプリの雛形が完成します
![スクリーンショット 2020-10-20 19.47.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/c9ea4454-9a2e-f92b-c99a-45aaf733d59f.png)

# 5. Android端末を持っている方
端末によって違いますが、設定->デバイス情報といくと下の方にビルド番号というのがあるので、それを5回ほどタップします。
すると、「開発者オプションが有効になりました」という文言と共に、開発者オプションの設定ができるようになります。

開発者オプションを開き、USBデバッグをONにし、PCと繋げると、、、

![スクリーンショット 2020-10-20 19.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/e94e4e99-bbe0-ba15-c980-1e12fb1f61d0.png)

ここのスマホアイコンのところに自分の端末が表示されます。
**あとはスタートボタン(再生ボタンみたいなやつ)を押すだけ！！**

![Screenshot_20201020-195348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/d7ad7c52-9d85-0789-bf0f-a8866ceede31.png)

Hello Worldが表示されます。

# 6. Android端末を持っていない方
![スクリーンショット 2020-10-20 19.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/c6418b7c-21b4-f4d1-28a9-a62adf52eb74.png)

右から3番目、AVD Managerを開きます。
Create Virtual Deviceをクリックします。
適当な端末を選び、適当なOSバージョンを選びます。
そうすると、PC上で動作してくれる仮想端末が完成します。

**あとはスタートボタン（再生ボタンみたいなやつ）を押すだけ！！**

![スクリーンショット 2020-10-20 19.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411927/b245cbff-eb0c-aee3-203e-6680317324bc.png)

Hello Worldが表示されます。

# 7. 完成
非常に簡単ですね！！
よくわからない環境構築をしなければHello Worldすら表示させてくれないとなると、初心者の方は心が折れそうになります。
ですが、AndroidアプリはAndroid StudioをインストールするだけでHello Worldを表示してくれます。

# まとめ
ここまで記事を書きながら10分でHello Worldを表示させることができました。（インストール時間は除く）

この記事通りにやってもできない方はQiitaのコメントか、TwitterのDMに連絡いただければ解決しますので気軽に相談してください!
駆け出しSwiftエンジニアにオススメしたい脱初心者 良著三選

#『iOSアプリ設計パターン入門』
Swiftのアーキテクチャが学べます。
未経験の面接でここまで語れるとデキるやつ感が出る。Fatにならない設計は大事。
https://peaks.cc/books/iOS_architecture

#RxSwift研究読本シリーズ
めちゃくちゃわかりやすい、Rxの本。
RxSwiftが必要なら必読な本。
https://booth.pm/ja/items/1076262

#プリンシプル オブ プログラミング3年目までに身につけたい一生役立つ101の原理原則
これぐらいは押さえておきましょう的なやつ。鉄板のリーダブルコードもオススメ。
https://www.amazon.co.jp/dp/4798046140/ref=cm_sw_r_tw_dp_x_N7SHFbSTTS6GP
何度も蘇るプロセスを永遠に殺し続ける.sh

正直もっといい方法が絶対にあると思います。
が、備忘録として残します

# 時間を無駄にしたくない人のための要約
- やったこと: PIDを取得して無限ループで永遠にkillする

# やりたいこと
killしてもkillしても蘇る特定のプロセスをkillし続けたい。
プロセスはバックグラウンドで定期的に起動するもよう。
環境: macOS Catalina


# まずはプロセス名を調べる
Applications > Utilitiesからアクティビティモニターを開いて、プロセス名を調べます。
![process_mosaic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329016/0db8201c-3c45-66a6-4773-b0772ec350e1.png)

# やってみる

### 内容の整理
プロセス名がわかったところで、やりたいことを整理します。
やりたいのは

- killしてもすぐ蘇る特定のプロセスをkillし続ける

ということです。
ですので処理としては

- ps aux | grep ProcessName でプロセスが実行されているか確認し、実行されていればkillする

というもので大丈夫そうです。それではスクリプトを書いていきます

### 実装

```shell
#!/bin/bash

while true;
do
    # ProcessNameには殺したいプロセスの名前を入れてください
    TARGETPID=`ps aux | grep ProcessName | grep -v grep | awk '{print $2}'`

    if [ -n "$TARGETPID" ]; then
        `kill -9 ${TARGETPID}`
    fi

    sleep 5
done
```

見ての通りただの無限ループです。(何となく5秒間隔にしてみた)

- ps aux | grep ProcessName でプロセスを確認
- grep -v grep で自分自身の結果は除外
- awk '{print $2}' でPIDのみ抽出
- ↑の結果を一旦変数に格納、空じゃなければkillする

ということをしています。
5秒おきにしてますが、1秒おきとかインターバルおかないとかでも、これぐらいの処理なら別にいいと思います

# Operation Not Permitted

killしようとするとこのメッセージが表示される場合がありました。
そんな場合は一旦sudoでkillを試せばいいかもしれません。(sudo kill or sudo kill -9)

```shell
#PIDには殺したいプロセスのIDを入れてください

sudo kill PID
#もしくは
sudo kill -9 PID
```

それでも無理ならmacのrootユーザーでログインしなおして、そのユーザーで実行すればkillできるのかも......(確認してないので何とも言えない)
UnityのARFoundationのARPlaneManagerを使ってみた

「AR Plane Manager」試してみたりcube置いてみたりした
ノーコーディングでできるけど、色んなところで詰まったのでメモ

**参考にしたページ**
[AR tutrials](http://chuanar.blogspot.com/2020/02/tutorial-6-placing-objects-in-space.html)

**実行結果**
![Screenshot_20201022-163238 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251117/05940e75-ac99-34b6-2309-6f5798521f45.png)
テーブルの平面と床の平面を検出しているような
上側にある灰色は適当に置いたcube

**環境**
・Unity2019.4.12f1(LST)
・Unity Hub 2.4.1
・Windows10
・Pixel3a(Androidバージョン:10)



**手順**
**①ひたすら設定**
![OtameshiAR - MainScene - Android - Unity 2019.4.12f1 Personal _DX11_ 2020_10_22 18_08_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251117/0064aa1a-0d07-1a66-e6c3-8a6ac9c91707.png)

![OtameshiAR - MainScene - Android - Unity 2019.4.12f1 Personal _DX11_ 2020_10_22 17_54_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251117/db132483-c81f-7289-2179-500452e5df73.png)

![ARkeijiban - MainScene - Android - Unity 2019.4.12f1 Personal _DX11_ 2020_11_05 12_13_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251117/e1a183b2-c4c0-bf52-641c-810acdf80a78.png)


![OtameshiAR - MainScene - Android - Unity 2019.4.12f1 Personal _DX11_ 2020_10_22 18_33_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251117/7267dab0-9174-77f1-4a26-9e98c8abbc19.png)



**②Hierarchyに3つ追加**
![OtameshiAR - MainScene - Android - Unity 2019.4.12f1 Personal _DX11_ 2020_10_23 10_33_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251117/13c59b73-d365-0417-33e4-8a0e9507bd71.png)
　・「AR Session Orign」のInspectorに「AR Plane Manager」追加
　・「AR Plane Manager」のPlane PrefabにPrefab化した「AR Defalt Plane」追加
　「AR Defalt Plane」はHierarchyのcreate->XR->AR Defalt Planeにある。Prefab化は、HierarchyからProjetへドラックすればできる。Prefabsフォルダをつくって中に格納するのがいいらしい。

**③ビルド**
「Build Settings」で「Build」ボタン押してもエラーがたくさん出てしまう->エラーメッセージを読むand以下のぺージを参考にした
　　https://teratail.com/questions/187693
　　↓以下解決方法
・「Build Settings」でExportしてAndroidStudioでビルドする
（AndroidStudioでもエラーが出た場合はSDKのバージョンが合ってないっぽい。エラーを読んだ感じ28.0.3が必要らしい(このときP10Liteを使っていた)）
・AndroidStudioのSDK Maneger（🔍で検索すれば開ける）でInstall
![ExportpProject Android Studio 2020_10_23 10_55_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251117/711ffe4f-8e1e-df30-f1e1-2d0e575954f4.png)
エラーに書いてあったURL先で、「license」フォルダをProjectのホームディレクトリに置けば必要なものを自動でInstallしてくれるよと書いてあるので（ホームディレクトリってどこなん？と思いつつも）
・「OtameshiAR」Projectのフォルダ内に「licence」フォルダをコピペ
「license」フォルダは上画像の「Android SDK Location」に書かれているところにあるはず（自分の場合は始めはなかったが、SDKをinstallしたら出来てました）
・AndroidStudioで再ビルド
　（自分の場合はこれでやっとビルドできた）

**④実行**
・Android端末（ARCoreに対応しているやつ　自分はPixel3a）をPCにつなぐ
　Android端末をデバックモードにする、ファイル転送モードにする、USBデバックをONにするを忘れずに
・UnityのBuild Settingsで「Build and run」で実行
　Android端末で実行されるまで気長に待つ

**実行時はまったこと**
・「Build and Run」で「No Android device」といわれる->ケーブルがデータ転送できないタイプだった
・「build and run」で実行できても黄土色の画面のままだった->ARCoreに対応していないAndroid端末(P10Lite)を使っていた

学んだページ(udemy)
[ユニティちゃんが教える！初心者向けUnity講座](https://www.udemy.com/share/101v22B0sccl5URHg=/)
はやぶさ2の軌道を可視化する

# はやぶさ2の軌道データ

先日（2020/10/21），「はやぶさ2」の軌道情報が公開されました．
[打ち上げから地球帰還直前（TCM-3）までの「はやぶさ２」の軌道](https://www.hayabusa2.jaxa.jp/topics/20201021_orbit/)  

上の記事に"hayabusa2_orbit_20201021.txt"というファイルが添付されています．
中身には，2014年の打上げ以降の，時刻・打上げからの起算日・はやぶさ2・地球・リュウグウの座標（太陽中心）などが記載されています．軌道精度は1000kmのため研究等には使えないと思います．

本記事では公開された軌道データを用いて，はやぶさ2やリュウグウの軌道をアニメーションで可視化したいと思います．
（やっていることは，ファイルを読み込んで数値データをグラフ化しているだけです）

ソースコードはgithubで公開しています（Pythonで実装しています）．
[https://github.com/motthi/hayabusa2_orbit](https://github.com/motthi/hayabusa2_orbit)


## 太陽中心座標での軌道
### 往路
![absoluteOrbit.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404252/6f402f47-a9b3-ca44-8a3a-91afad46fb19.gif)

### 復路
![absoluteOrbit_back.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404252/9d74494f-9647-193f-b69d-7b22b26046c4.gif)

## 地球中心座標での軌道
はやぶさ2と地球，リュグウと地球のデータの差を取れば地球から見た軌道も分かります．

### 往路
![relative_e.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404252/4ce0c3e6-0a99-6588-89bf-91700c2b6ddc.gif)

### 復路
![relative_e_b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404252/14259f32-e570-b909-41f7-e872b3786264.gif)

こう見ると地球とリュウグウはかなり接近するんですね．
※リュウグウは「潜在的に危険な小惑星（PHA）」に分類されています．
　参考：[162173 Ryugu (1999 JU3)](https://ssd.jpl.nasa.gov/sbdb.cgi?sstr=162173)


## はやぶさ2の今後
カプセルの地球帰還日は2020/12/6です．探査機本体はその後も運用を続け，2031年に1998 KY26という小惑星に向かう探査ミッション（EAEEAシナリオ）が計画されています．
[Blue Prism]ファイル名として使用できる名前かどうかを判定するオブジェクトを作りました。 #blueprism

# これを書いた理由
「この文字列をファイル名とする」って指定されてきた文字列が「〇〇プロジェクト:議事録」とかだったりすることがあったので（これは「:」がファイル名としてNG）
保存をする前に予めそういう文字列はダメにしておきたかったのです。
# ファイル名として使用できない文字列とは
これを使えばいいらしい。Initialiseの名前空間には「System.IO」を入れる。
[Path.GetInvalidFileNameChars メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.io.path.getinvalidfilenamechars?view=netcore-3.1)
戻り値は、上のリンクのMicrosoft DocのページはC#のことしか書いてないけど「Char[]」って書いてあるから1次元配列で返ってくるので
この配列と入力引数の文字列と比べて、含まれていたらNGにすればいいのかな……。

含まれているかどうかを調べるのはIndexOfAny
[指定された複数の文字の中で、文字列内で見つかった最初の位置を探索する](https://smdn.jp/programming/netfx/string/2_1_comparison/#String.IndexOfAny)
使い方はVBAのInStrとだいたいおなじ。見つからないときに返ってくるのがVBAだと0でこれだと-1っていうくらいの違い。

# これを踏まえて作ったもの
コードステージの
　入力引数は　strIn (Text)
　出力引数は chk (Flag)　ファイル名として使えたらTrue、ダメならFalseが返ります
です。
コードステージのコードのところに書くやつはこれ

```VB.NET
Dim InvalidFileNameChars as Char() = Path.GetInvalidFileNameChars()

If strIn.IndexOfAny(InvalidFileNameChars) < 1 Then
  chk = True
Else
  chk = False
End If
```

# 終わりです
こういうのとか、社内ポータルにログインするとかのちょびっとした単機能でみんなの操作を統一できるものは、オブジェクトで作っておいてみんなで使うのが便利です。
めいめいが作ってたら仕様バラバラになるし、変更があったときの改修箇所がいっぱいになるし、工数の無駄ですもんね。
まあ、日商エレクトロニクスのすごいやつがあるから、いまやたいがいのものはアレで間に合っちゃうのですが……。
もしかしたらこの機能もアレに入ってるかも。（あのすごいやつの内容がすごすぎて全部は見れてない）

日商エレクトロニクスのすごいやつのニュースはこれ
[日商エレ、RPAツール「Blue Prism」で利用可能なロボット製作テンプレートなどを無償公開](https://cloud.watch.impress.co.jp/docs/news/1273209.html)

実物が載っているのは[Blue Prism DX](https://digitalexchange.blueprism.com/dx/search)で、「日商」で検索すると出てきます。マジすごいです。
WordPressでオリジナルテーマのサムネイル の設定の方法

WordPressでオリジナルテーマを作成した際に、特に何も設定をしないとこのような状態になっています。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/d1209a36-65cf-6e73-a924-ff4670329929.png)

自分で使う分にはこれではいいかもしれませんが、お客さんに納品する際にこれではカッコ悪いなぁって思ったので、サムネイルの設定について調べました。

#サムネイル用の画像を準備する
まずはサムネイルに表示する画像をアップします。
それっぽくみえるものでよいと思います。

今回はこちらの画像を準備しました。
![2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/860671cb-8aba-d405-5811-55f523da9b18.jpeg)


#縦横比3:4に調整する
サムネイルの縦横比が3：４なので、切り取りしていきます。
これは自分の使いやすいアプリやソフトを使えばよいかと思います。

サイズは縦450 横600　と指定しました。

わたしは、Figmaで行いました。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/fe870931-216a-fa5e-1385-c3b0f2e62dd1.png)

#画像の名前を変更する。
`screenshot.jpg`に名前を変更してください。
形式は`png`でも問題ありません。


#画像をテーマフォルダーにアップロードする
あとは、ダウンロードするだけですね。


アップロードする箇所は、テーマフォルダ内の同じ階層で大丈夫です。
（index.phpやheader.phpと同じ階層）

![1c93e4c8e6f7231d13384090edaf5628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/4feaeb30-7050-68fd-d9d3-2dc12fd5ad5f.png)

#まとめ
このように無事に変更することができました。
ちょっと手を加えてあげることで納品時のクオリティがあがるので、是非やってみてください。

![516db33c35548363831e22295ad138ed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/ece1f887-2de1-71a9-4111-7b29347eaaaf.png)
[Swift5]少数点第二位や第三位の四捨五入・切り捨て・切り上げを行う方法

## 必要とする関数
四捨五入・切り捨て・切り上げを行う場合は以下の関数を使います。

round() → 四捨五入
 floor() → 切り捨て
 ceil() → 切り上げ

## 使用例

```ViewController.swift
let num = 7.5
 
let numRound = round(num)   
// 8（四捨五入）

let numFloor = floor(num)   
// 7切り捨て）

let numCeil  = ceil(num)    
// 8（切り上げ）
```

## 少数点第二位や第三位の四捨五入・切り捨て・切り上げ

```ViewController.swift
let num = 3.1415
 
let numRound = round(num*10)/10   
// 3.1（小数第2位で四捨五入）

let numFloor = floor(num*100)/100   
// 3.14（小数第3位で切り捨て）

let numCeil =ceil(num*1000)/1000   
// 3.142（小数第4位で切り上げ）
```

以上です。参考にしてください！
geopandasのインポートでOSError: could not find or load spatialindex_c-64.dll

geopandas のインポートでコケた

```
OSError: could not find or load spatialindex_c-64.dll
```
https://github.com/conda-forge/geopandas-feedstock/issues/78
ここによると、チャンネルは混ぜるな危険？ということらしい・・・

私の環境では、Pythonはデフォルトチャンネル、
geopandasをインストールしたのは```conda-forge```だったのが原因らしい。


```
conda install python -c conda-forge
```

これで解決！
ということは逆のパターンもあるのかな・・・
画像をクリックすると詳細画面に遷移する方法

#環境
この記事ではmacOS Catalina10.15.6にインストールしたRuby 2.6.5を使っています。

#目的
レポート一覧画面において、投稿されたレポートの画像をクリックすると詳細が見れるようにする。

#結論： ネストを使用
画像をクリックした際に、詳細画面に遷移させるには、link_toメソッドにネストを用いることで解決できます。```do〜end```で囲む。

```html:index.html.erb
    <%= link_to report_path(report.id) do %>
      <div class="content_post">
        <%= image_tag report.image if report.image.attached? %>
        <p>顧客名：<%= report.name %></p>
        <span class="name">
          <%= report.date %>
        </span>
      </div>
    <% end %>
```

#まとめ
ネストは、ルーティングの設定の際にもどのレポートにコメントを行うのかの指定を出来、非常に役に立つ機能であると思います！
同じような悩みや壁にぶつかっている人の役に立てれば幸いです！
libusbを参照する共有ライブラリでビルドエラーが出た話

# ことの起こり
ubuntuでlibusbを使うプログラムを作成中

```shell
$ gcc -c testUsb.c
$ gcc testUsb.o testUsb -lusb
```

普通はこんな感じでビルドできると思うんですが、
これを実行ファイルではなく共有ライブラリ（.so）にしようと思ったらビルドエラーが出るのですね。

```shell
$ gcc -c testUsb.c
$ gcc -shared -fPIC testUsb.o -o libTestUsb.so -lusb
/usr/bin/ld: testUsb.o: relocation R_X86_64_PC32 against symbol `devInfo' can not be used when making a shared object。 -fPIC を付けて再コンパイルしてください。
/usr/bin/ld: 最終リンクに失敗しました: bad value
collect2: error: ld returned 1 exit status
```

なんですかこれ。初めて見ました。

# 調べてみる
エラーの内容としては「libusb が -fPIC つけてビルドされてないんで、この文脈では使えませんよ。使いたいなら libusb を -fPIC つけてビルドしなおしてください」って意味かな。

いやいや、こんなことで libusb ビルドしなおしとかそりゃないでしょう。

# え？ これで解決？
色々試してみたのだけど、ことごとく失敗だったので（libusb の再ビルドはしない方向で、、）あまりここで細かく書く必要はないと思うのだけど、最終的に解決したのは以下のようにビルド。

```shell
$ gcc -shared -fPIC testUsb.c -o libTestUsb.so -lusb
```

.o ファイルを作らないで、.c ファイルから直接コンパイル＆リンク。
これでエラーが起きずにちゃんと動作する .so ファイルができたのだけど、.o ファイルを生成する場合と何が違うんだっけ。。

普段なんとなくやっちゃってることを正しく理解できてないなぁ、、
今度はこれでなぜうまくいくのかを調べないと。

# 追記
あ、これ、、

```shell
$ gcc -c testUsb.c
$ gcc -shared -fPIC testUsb.o -o libTestUsb.so -lusb
```

こうじゃなくて、、

```shell
$ gcc -fPIC -c testUsb.c
$ gcc -shared testUsb.o -o libTestUsb.so -lusb
```

こうか。コンパイルするときに `-fPIC` つけないといけないのね。
答えが分かってみると当たり前すぎた。。
.gitignore をコマンドで作成する[gibo]

# .gitignore をコマンドで作成する

### 環境
```
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G14033
```

### gibo
[giboのGitHub](https://github.com/simonwhitaker/gibo,"gibo")

インストール例

```
$ brew install gibo
```

使い方例

```
$ gibo dump Node >> .gitignore
```

上記Nodeはboilerplates、下記で自分の要件にあったものを指定し実行

```
$ gibo list
```

悪い例 dumpではboilerplates(テンプレートみたいなもの)を指定しないとこうなる。

```
$ gibo dump >> .gitignore

Fetches gitignore boilerplates from https://github.com/github/gitignore
```

[gitignoreのテンプレート](https://github.com/github/gitignore,"git/gitignore")
おそらくlistの情報と一緒、好きなの選んで指定する。

#####調べた理由
いつもプロジェクト新規作成時にnode_modulesをignoreするのがめんどくさかったから。

```

$ git st
On branch init
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	node_modules/
	package-lock.json
	package.json

nothing added to commit but untracked files present (use "git add" to track)

```

#####コメント
Global環境下に.gitignoreのテンプレートを作成するのも考えたが、
これから要件が異なることがあると考えたこと、ignore対象はしっかりと把握して作業をしたいと考えたため、テンプレートを指定し実行する方法を選択した。
今後の作業を進め、使用感を見極めたいと思う。

### References
[デフォルトの .gitignore を使用する方法](https://qiita.com/sqrtxx/items/1eb5828a7acd821c3706,"デフォルトの .gitignore を使用する方法")
[Mac OSバージョンを確認するコマンド]
(https://qiita.com/masayuki_oguni/items/96b77b72e702b03b8f92,"Mac OSバージョンを確認するコマンド")
npm v7で`npm ci`後にプロジェクト自身の`postinstall`が実行されなくなった

2020-10-20にリリースされたNodeJS 15系から`npm`はV7になっている。
https://nodejs.org/en/download/releases/

TravisCIで特定のバージョンを指定せず `node` 指定していた場合、
2020/12/23時点でがインストールされる。

```
$ node --version
v15.0.1
$ npm --version
7.0.3
$ nvm --version
0.36.0
```
https://travis-ci.com/github/mobilusoss/textlint-browser-runner/jobs/403527216

TravisCIのライフサイクルにおいてインストール時には `npm ci` が用いられる。
このとき、npm v6以前では `npm ci`の完了後、そのプロジェクトの`npm postinstall` が実行されていたが、
v7からはこれが実行されなくなった。
[[BUG] `npm ci` doesn't run `postinstall` script #1905](https://github.com/npm/cli/issues/1905) というチケットが作成されているが、バグではない模様。


もともと `postinstall` はそのプロジェクトがライブラリとして別のプロジェクトにインストールされた際に実行されることを想定して、そのプロジェクト自身の `npm install` (あるいは `npm ci`)が実行された後に実行される挙動が誤っていたと理解している。

----
この挙動が変わったことによってこんな[問題](https://github.com/mobilusoss/textlint-browser-runner/issues/192
)が発生した。
`lerna` で管理していたプロジェクトにおいて

```
 "postinstall": "lerna bootstrap",
```

といった感じで子パッケージの依存モジュールをインストールしていたときに、ルートにある`package.json`に定義してあるモジュールはインストールされるが、子パッケージの`package.json`に記載されている内容はTravisCI上でインストールされない。

そのため後続のテストライフサイクルにおいて実行される、`lerna run test` で各子パッケージの`test`スクリプト実行時に依存モジュールが存在しないので `mocha: not found` となってテストが落ちることになった。

TravisCI上の問題に対しては、`postinstall` ではなく手動で `lerna bootstrap` を[実行する](https://github.com/mobilusoss/textlint-browser-runner/pull/193)ことで解決した。
知らないと恥ずかしい「Chrome」のショートカット一覧（Windows ver.）

##Alt ＋ ←
前のページに戻る

##Ctrl ＋ W
現在開いているタブを閉じる。
W=「Window（≒タブ）」で覚えると◎

##Ctrl + T
新しいタブを開く。
T=「Tab」で覚えると◎

##Ctrl + Tab
タブの移動

##Ctrl ＋ Shift + N
シークレットモードで新規ブラウザ立ち上げ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/e3d502e4-49ca-3f14-e2b5-52e511fde0b7.png)

##Ctrl + L
アドレスバー内のURLを全選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/38263bf0-eb92-6139-a8be-7ac931dfe457.png)

##Windows + p
ディスプレイの表示モードを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/8ff674a4-5465-8327-0602-4bab3cfacc69.png)

##Windows + L
PCをロック
複数のpythonのバージョンを1つの jupyter で扱う

# Overview

* python のバージョンを複数使いたい（venv含む）
* けど、それぞれのバージョンに jupyter 入れるのは効率が悪い
* ので、どれか1つのバージョンに jupyter を入れて kernel だけ選べるようにしたい

ときってあるじゃないですか。

## 具体的に

こういう状況で、

```bash:bash
$ pyenv versions
  system
  3.6.12
* 3.8.6 (set by /Users/kuryu/.pyenv/version)
```

`3.8.6` で jupyter を起動して、 `3.6.12` の kernel を動かすのを目指す。

# まず jupyter を入れる

```bash:bash
$ python -V
Python 3.8.6

$ pip install jupyter
```

# python のバージョンを変更する

```bash:bash
$ pyenv global 3.6.12

$ python -V
Python 3.6.12
```

## 必要なら venv を作成

pyenv 環境にそのまま構築することも可能だけど、今回は venv 作ります。

```bash:bash
$ python -m venv .venv

$ . .venv/bin/activate

(.venv) $ python -V
Python 3.6.12

(.venv) $ pip list
Package    Version
---------- -------
pip        18.1
setuptools 40.6.2
You are using pip version 18.1, however version 20.2.4 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```

## ipykernel を入れる

```bash:bash
(.venv) $ pip install ipykernel

(.venv) $ ipython kernel install --user --name=hoge
```

## 仮想環境を出て

```bash:bash
(.venv) $ deactivate
```

## python のバージョンも戻す

```bash:bash
$ pyenv global 3.8.6

$ python -V
Python 3.8.6
```

# おもむろに jupyter を起動

```bash:bash
$ jupyter notebook
```

## kernel が追加されているので

![スクリーンショット 2020-10-22 19.06.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41925/28fdff4a-6ff7-448a-6edc-a8b6a406a69e.png)

## 実行してバージョンを確認

3.8.6 で起動した jupyter の中で 3.6.12 の kernel を起動できました。

ちなみに、スクショ撮り忘れちゃったんですけど、

```python:jupyter
sys.executable
```

とかやると、ちゃんと venv 環境の python のパスが表示されます。

![スクリーンショット 2020-10-22 19.01.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41925/e115049f-2efc-ee50-d069-9245e4e9f5d5.png)

# kernel が不要になったら

```bash:bash
$ jupyter kernelspec uninstall hoge
```

っていう話なんですけど、まぁまぁややこしいので混乱しないように注意。

# cf.

https://qiita.com/Gattaca/items/80a5d36673ba2b6ef7f0
tkinterで超簡単にGUIアプリを作る

# 前置き
Pythonの人気が上昇してきたためか、Pythonの需要が最近ではとても高まっています。Pythonでは機械学習などの人工知能に関する技術が強いイメージですが、GUIのアプリを作ることも出来ます。
Pythonを始めたばかりでライブラリ？モジュール？という方向けの記事なので、中級者の方には物足りないかもしれませんが、読んでいただけると嬉しいです。

# ファイルの準備

>
tkinter-gui/
├ app.py
├ face.png

上のようにapp.pyを作成して下さい。フォルダ名を自分はtkinter-guiとしましたが、何でも良いです。
face.pngは以下の画像を保存してapp.pyと同じ場所において下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454421/3ccee177-e884-256e-9108-03b0ce27709f.png)
face.png

# コードを書く

```python:app.py
# Tkinterモジュールの読み込み
import tkinter

# ウィンドウの生成
root = tkinter.Tk()
root.attributes("-topmost", True)
root.minsize(width=200, height=200)

# Frameウィジェットの生成
frame = tkinter.Frame(root, width=300, height=300, bg="black")
frame.propagate(False)
frame.pack()

# テキストのLabelウィジェットの生成
label= tkinter.Label(frame, text="Hello! How are you?", fg="white", bg="black", font=("", 16))
label.pack()

# 画像のLabelウィジェットの生成
import os
png = tkinter.PhotoImage(file=os.path.dirname(__file__)+"/face.png")
image = tkinter.Label(frame, image=png, bg="black")
image.pack()

# Entryウィジェットの生成
entry = tkinter.Entry(frame, width=20, bg="gray", fg="white")
entry.insert(0, "happy")
entry.pack()

# クリックイベント関数
def show_text():
    new_label = tkinter.Label(frame, text=entry.get(), fg="white", bg="black", font=("", 32))
    new_label.pack()
    entry.destroy()
    button.destroy()

# Buttonウィジェットの生成
button = tkinter.Button(frame, text="Say", bg="gray", fg="yellow", command=show_text)
button.pack()

# ウィジェットが配置されたウィンドウを表示
root.mainloop()
```

上のコードをapp.pyに書いて下さい。
その後、 app.pyを実行すると以下のようなウィンドウが立ち上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454421/67589f76-36df-cb62-f751-f7a21b1ce2e2.png)

トカゲがあなたの気分を聞いていますね。テキストボックスに入力した後にSayボタンを押して答えてあげましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454421/0f41e1fb-a5de-f908-da20-b8a454a28525.png)

happyと答えることが出来ました。

# 最後に
アプリケーションに必要なのは、

1. ユーザーからの入力をプログラムが受け取る
2. 入力に対してプログラムが何らかの処理をする
3. プログラムはユーザーに出力を返す

この流れです。

今回は、本当に必要最低限なアプリケーションとしての機能のみを実装しました。この上のコードを土台に色々と改変を施せば、電卓アプリなどを作ることも可能です。コードの1行1行が画面上に何を出力しているのかを理解し、自分だけのアプリケーションを作ってみましょう。

今回の記事の内容は、下のサイトでも詳しく説明しています。良かったら見て下さい。

[【Tkinter入門】PythonでGUIアプリを作ってみよう！](https://solo-engineer.tech/python/how-to-use-tkinter/ "【Tkinter入門】PythonでGUIアプリを作ってみよう！")
【スギちゃん風】カスタム投稿タイプの個別投稿ページにはこうやってコメントをつけるんだぜぇ〜

#背景

カスタム投稿タイプの個別投稿ページにコメント機能をつけたいと思ったのですが、
普通の投稿タイプと同様のやり方では表示されない。

そんな悩みを抱えている方のための備忘録になります。

#まずコメント機能どうやってつくるの？？

###comments.phpを作ります

```php
<?php if( comments_open() ){ ?> 　//現在の投稿に対してコメントが許可されいるかの条件分岐
	<div id="comments">
		<?php if( have_comments() ){ ?>  //コメントがある場合ループを開始する
		<ul id="comments-list">
			<?php wp_list_comments(); ?>  //コメントをリストで表示する
		</ul>
		<?php } ?>
		<?php comment_form(); ?>   //コメントフォームを表示する
	</div>
<?php } ?>
```

###表示したい部分に次を記述

```
<?php comments_template(); ?>
``` 

これで簡単なコメント機能は完成です。

#カスタム投稿タイプでコメントをつける

functions.php にあるカスタム投稿タイプの関数内に以下の内容を盛り込む

```php
function create_post_type() {
  #省略
  'supports' => array(
    'title',
    'editor',
    'excerpt',
    'thumbnail',
    'custom-field',
    'comments',  #カスタム投稿タイプでコメントを表示指定
  ),
  #省略
}
add_action( 'init', 'create_post_type', 1);
```

#WPの管理画面を設定

設定 < ディスカッション < 新しいコメントを許可にチェック
個別記事 < 編集 < コメントのプルダウン「ーー変更なしーー」から「許可する」に変更



以上
[Power Automate]設定すると自動的に(Apply to each)に格納されてしまう動的なコンテンツを変数として使う方法

# Power  Automateにおける変数の欠点

Power Automateには「変数を初期化する」というアクションがある。これを使って変数を初期化し、フロー内で使うことができる。

しかし…残念なことに、このアクションはグローバルレベルでしか使うことができない。そのため、スコープの中にまとめて入れておいたり、**アクション内で使用するとアクションが自動的にApply to eachの中に格納されてしまう類の動的なコンテンツを使うことができない。**うっかり保存しようとすると怒られる。

後者がちょっと厄介。変数自体は便利なのに、一部使えない動的なコンテンツがあるのでは能力を発揮しきれない。

# 「変数の設定」を活用しよう

そこで使ってほしいのが「変数の設定」。こちらはグローバルレベルじゃなくても使うことができるので、

```
「変数を初期化する」→「変数の設定」
```

という工程を踏むことで、**アクション内で使用するとアクションが自動的にApply to eachの中に格納されてしまう類の動的なコンテンツ**を使うことができるようになる。

実務で使っているのは文字列型の変数なので、他の種類だと様子が違うかもしれないけど……「変数を初期化する」の中身は空っぽで大丈夫。「変数の設定」の値に文章を入れて、**例のアレ**を設定。

すると、「変数の設定」はApply to eachの中に自動的に格納されるが、保存はできるし、きちんと意図通りにフローは動く。

**例のアレ**に遭遇する機会があるかどうかは業務の内容に左右されるだろうけど、もし「変数に動的なコンテンツを使いたいのにApply to eachの中に勝手に格納されちゃって保存できない！」という状態になったらこの方法を試してほしい。
デバッグ実行時にsudoを付ける方法

# 事象

Visual Studio CodeでPythonをデバッグ実行したときに、**[Errno 13] Permission denied**が発生した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/379539c1-5c2e-033c-dd6d-8356487c8e60.png)

# 原因

対象Pythonコードに管理者権限が必要だったが、Visual Studio Codeのデバッグ実行時にsudoが付いていないため。（あたりまえ）

# 対処方法

launch.jsonに`"sudo": true`を追記すればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/06d48e3c-673e-0c08-b037-88d21730ea02.png)
Loopを使ったCSVファイルの文字コード変換（Shift JISからUTF8）

以下のような連続するファイル名を持つCVSファイルがあるとする：

+ brabra_01.csv
+ brabra_02.csv
+ brabra_03.csv
+ (...)
+ brabra_47.csv

元ファイルの文字コードがShift-JISで、これらをUTF-8に一括変換する。さらにファイルの連続番号のゼロ詰めをなくし、以下のようにリネームする：

+ brabra_1_utf.csv
+ brabra_2_utf.csv
+ brabra_3_utf.csv
+ (...)
+ brabra_47_utf.csv

コードは以下の通り。

```python:ChangeShiftJIS2utf8.ipynb
import csv
import codecs
a = 47
for i in range(a):
    pref = i + 1
    path = "c:/*****/brabra_%02.f.csv"%pref
    path_utf = "C:/****/brabra_%01.f_utf.csv"%pref
    fin = codecs.open(path, "r", "shift_jis")

    fout_utf = codecs.open(path_utf, "w", "utf-8")
    
    for row in fin:
        fout_utf.write(row)
        
    fin.close()
    fout_utf.close()
```
PowerPointのプロパティ(タイトル)を一括で変更しつつPDF出力するPowerShellスクリプト

PowerPointやExcelなどのOffice製品では、プロパティでタイトルを設定することができる。
Office製品だけで完結する資料を作る時にはあまり気にならないが、PDFにエクスポートする時にはプロパティのタイトルがPDFのタイトルとしてタブに表示されるので、最終的にPDFにするなら設定しておいた方が良い。

タイトルはファイル名と同じにしておくのが無難だが、ファイルの数が多いと一つ一つファイルを開いて直していくのは結構しんどい。。
そういうことをしなければいけないシチュエーションがあったのだが、ファイル数が多くて非常に面倒だったので、勉強がてらPowerShellで一括変更するスクリプトを作成してみた。

タイトルの変更後、PDFの出力までついでに実行するようにした。

```powershell
$ppt = New-Object -ComObject PowerPoint.Application
# カレントディレクトリ配下にある拡張子「.pptx」のファイルが対象
Get-ChildItem -Recurse -Filter *.pptx | ForEach-Object {
    $pres = $ppt.Presentations.Open($_.FullName)
    # プロパティのタイトルをファイル名に変更
    $pres.BuiltInDocumentProperties("title") = $pres.Name.substring(0, $pres.Name.length - 5)
    $pres.Save()
    # PDFに出力する 第二引数はファイルタイプ。PDFは32
    $pres.SaveAs($_.FullName.Substring(0, $_.FullName.Length - 5), 32)
    $pres.Close()
}
$ppt.Quit() 
```

処理終了後にPowerPointのウィンドウが残ってしまうのが課題。。
3分アジャイル アジャイルソフトウェア開発（スクラム）

## アジャイルソフトウェア開発宣言

- 個人と対話
- 動くソフトウェア
- 顧客との協調
- 変化への対応

---

## アジャイル開発手法

- スクラム
- XP
- カンバン
- FDD

---

## スクラム

- 自律的なチーム
- 問題の変化に対応
- 比較的厳格なルール

---

## スクラム

- 確約、勇気、集中、公開、尊敬
- 役割（PO、チーム、SM）
- セレモニー（デイリー、プランニング、レビュー、レトロ）

---

## デイリー

- 昨日やったこと
- 今日やること
- 困っていること

---


## 参考

開発手法「カンバン」について
https://tech.opst.co.jp/2019/11/18/%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95%E3%80%8C%E3%82%AB%E3%83%B3%E3%83%90%E3%83%B3%E3%80%8D%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
NASに接続する際のユーザID、パスワードを編集する方法

NASに接続した際にアクセス不可となる場合は、ユーザID・パスワードが未設定または誤って設定されている場合があるので、以下の方法で設定を編集することが可能です。

#### 1.cortanaからweb資格情報を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188280/3b3848bd-b8a6-df86-f050-ac02582f579e.png)

#### 2.Windows資格情報を選択し、該当するNASの設定を編集

参考：https://enjoypclife.net/2018/01/12/windows-10-tips-network-nas-user-account-password-change-delete/
MAMPでSSIを使ってみる

#背景
複数のWEBアプリを作成すると似たような機能がある。再利用を見据えてSSIにてファイル分割を行う

#実施
- "C:\MAMP\conf\apache\httpd.conf"の Directory "C:\MAMP\htdocs" のOptions にIncludesを追加
  AllowOverrideはAllになっていることを確認

~~~conf
<Directory "C:\MAMP\htdocs">
    # Options Indexes FollowSymLinks ExecCGI
    Options Indexes FollowSymLinks ExecCGI Includes
    ----省略---
    AllowOverride All
    ----省略---
</Directory>
~~~


- IfModule mime_moduleにAddTypeとAddOutputFilter INCLUDESを追加

~~~conf
<IfModule mime_module>
    ----省略---
    #AddType text/html .shtml
    #AddOutputFilter INCLUDES .shtml
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml .html .htm .php
</IfModule>

~~~

#参考
[Webサイト制作におけるインクルード化とは？基本と設定方法](https://www.itra.co.jp/webmedia/include.html)
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 SSI](https://qiita.com/FJHoshi/items/c5ff14c79b1ffd85cb14)
[MAMPの設定(SSIや複数のローカルホスト)](https://qiita.com/FJHoshi/items/c5ff14c79b1ffd85cb14)
[もっとhttpd.confの設定](http://www.nina.jp/server/redhat/httpd/httpd_conf.html)
[MIMEタイプの追加(AddType)](https://www.adminweb.jp/apache/docroot/index4.html)
Android で Youtube の動画を再生する[Kotlin]

# つくるもの

YoutubeAPI を使って動画再生するためには、そもそも端末に Youtube アプリが入っている必要があるとかで、Youtube アプリを必要としない Youtube 動画プレイヤーを実装する。

現在は権利フリーの動画しか再生できず、おそらく大半の動画の再生に失敗してしまう。
(どうすればここの問題を解決できるのか知っている方がいれば教えていただきたいです…)

再生できることが確認できている動画
https://www.youtube.com/get_video_info?video_id=rvkxtVkvawc
これが再生できなければ実装側のバグです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/950807dc-7093-763d-1118-b8dbe6ca13c4.png)

# 今回やったこと

できることは [AndroidでYoutubeの動画を再生する](https://qiita.com/TaigaNatto/items/d3ff98961c346098eaf7) とほぼ同じ。
このコードを参考に、下記の内容を追加実装した。

- Kotlin化
- ExoPlayer を中心に各ライブラリの更新
- Youtube動画ID から直接再生

# 方法

ここのソースで動かせる
https://github.com/tktcorporation/ExoPlayerYoutubeSample

そこそこボリューミーになりそうなので、解説は **筆が乗れば or 要望があれば** 追加します…

# 参考
https://qiita.com/TaigaNatto/items/384318fb73b4f4712f6e
https://qiita.com/TaigaNatto/items/d3ff98961c346098eaf7
【iTerm2】コマンドライン上の文字をマウスなしでコピーする

iTerm2ではマウスなしでコマンドライン上の文字列をコピペ出来るんですね！
tmuxを使わないとできないと思っていたので感動しましたよ。
![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634043/2e86f555-491a-ceeb-0fe5-a1131d11815b.gif)

個人的にはホットキーなんかよりよっぽど嬉しい機能です。


# 【通常モード】⌘+Alt+c 
この自由に闊歩できるモード名がどこさがしても見当たらなかったので便宜的に

通常の入力するモード　:入力モード
自由に闊歩できるモード:通常モード
文字を選択出来るモード:選択モード

として説明します。


⌘+Alt+c でコマンドライン内を自由に闊歩出来るようになります。


# 【モード切替】
| コマンド        | モード     |
| --------------- | ---------- |
| ⌘+Alt+C         | 通常モード |
| ⌘+Alt+C         | 入力モード |
| esc or ctrl + [ | 選択モード |
| ⌘+F                | 検索(選択モード)            |

⌘+Alt+C で通常･入力モードを切替られます。
又、.[zshrcをvimキーバインド][2]にしていればhjklやwbでサクサク移動できます。
[2]:https://builder.japan.zdnet.com/os-admin/20372652/

# Tips: ⌘+F
⌘+F　で検索を掛けられるので目的の文字列へ一撃で飛べますね!

というか[iTerm公式ドキュメント][1]にはマウスレスモードとして
⌘+Fで検索すると選択、Tab(Shif+Tab)で選択範囲の拡大が出来る説明がありました。

日本語･英語綯い交ぜの場合や、パスの一部を直感的に拾う場合などは使えそうです。
使いようですね〜

[1]:https://www.iterm2.com/features.html
OracleTextに関する覚書

# 環境構築
本家のサイトからイメージデータをダウンロードした後、自力でビルドして出来たイメージを元にdocker-compose up コマンドでセットアップしただけ
特別な設定はしていない


``` docker-compose.yml
version: '3'
services:
  database:
    image: oracle/database:12.2.0.1-ee
    container_name: oracle
    volumes:
      - ./oradata:/opt/oracle/oradata # persistent oracle database data.
      - ./triple:/triple # persistent oracle database data.
    ports:
      - 1521:1521
      - 8080:8080
      - 5500:5500
    environment:
      - ORACLE_PDB=oracle
      - ORACLE_PWD=Oracle12
      - SEC_CASE_SENSITIVE_LOGON=TRUE
      - SQLNET.ALLOWED_LOGON_VERSION_SERVER=12
```

＃OracleText用のindex作成
OracleText用のindexを作成する

``` 
CREATE INDEX myindex ON emp(sentence) INDEXTYPE IS CTXSYS.CONTEXT
```

# SQLでOracleTextを使ってみる
contains関数を使って特定のカラムに含まれる文字列を検索できる。

```
select count(*) from emp where contains ( triple, '従業者') > 0;
```


# spfileORCLCDB.oraの中身

```
ORCLCDB.__db_cache_size=1107296256
ORCLCDB.__inmemory_ext_roarea=0
ORCLCDB.__inmemory_ext_rwarea=0
ORCLCDB.__java_pool_size=16777216
ORCLCDB.__large_pool_size=33554432
ORCLCDB.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
ORCLCDB.__pga_aggregate_target=536870912
ORCLCDB.__sga_target=1610612736
ORCLCDB.__shared_io_pool_size=83886080
ORCLCDB.__shared_pool_size=352321536
ORCLCDB.__streams_pool_size=0
*.audit_file_dest='/opt/oracle//ORCLCDB/adump'
*.audit_sys_operations=false
*.audit_trail='none'
*.compatible='12.2.0'
*.control_files='/opt/oracle/oradata/ORCLCDB/control01.ctl'
*.db_block_size=8192
*.db_name='ORCLCDB'
*.diagnostic_dest='/opt/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLCDBXDB)'
*.enable_pluggable_database=true
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=512m
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1536m
*.undo_CC"+@tablespace='UNDOTBS1'
 ```
Teamsのダウンロードフォルダを変更....

大学のオンライン講義でMicrosoft Teamsを使用しているのですが、ダウンロードフォルダはwindowsのデフォルト、つまりCドライブ上のダウンロードフォルダから変えることができません。
しかし自分はデータ用のHDDにダウンロードフォルダを別途用意して使っていて、Cドライブの方はほぼほぼ使わず、録画データなどいちいちDドライブに移しており面倒です。
なので、今回は「ジャンクション」という機能を使い、疑似的にTeamsのファイルダウンロードフォルダを変更します。

今回はDドライブ直下にダウンロードという自前のフォルダがあるとして話を進めます。

Cドライブのダウンロードフォルダはデフォルトで 
"C:\Users\ユーザー名\Downloads" です。
このCドライブのダウンロードフォルダを削除してから、コマンドプロンプトを管理者権限で開き、
mklink /j "C:\Users\ユーザー名\Downloads" "D:\ダウンロード" 
と打てば終わりです。
先に削除してから行わないとアクセス拒否されます。

C:\Users\ユーザー名\ にはDownloadsというフォルダが元々ありましたが、削除し、新たにジャンクションを作成したことにより、アイコンに矢印が付いたフォルダができているはずです。

後は何も考えず、Teamsで何かダウンロードしてみてください。
指定先のフォルダにファイルがダウンロードされるはずです。

ちなみにシンボリックリンクでは、ファイルは指定先に行きますが、書き込みごとに上書きされるのか結局、一時ファイルしか生まれませんでした。

Zoomなどは使っていないので知りませんが、これはダウンロードフォルダを変更できないすべてのソフトに対して有効です。
もしもジャンクションを削除することがあるなら、
rmdir "C:\Users\ユーザー名\Downloads" で削除することを忘れずに!
Mcryptについて

# Mcryptとは
・元々McryptはUnix cryptの代替コマンドで、エニグマ暗号に近いアルゴリズムを使用した暗号化ツール
・目的はパスワード・個人情報・顧客情報などの暗号化・復号化

## 非推奨の理由
・１０年近く更新されていない拡張モジュールのため。

## 対処法
・Mcryptを使い続ける
・OpenSSLに移行する


## OpenSSLとは
・暗号化通信プロトコル
・OpenSSL関数にもデータの暗号化・復号化を行う関数が用意されている。
　またOpenSSL関数では秘密鍵・公開鍵によるデータの暗号化・復号化をより手軽に扱うことができる。

## OpenSSLに変更する場合
・事前に openssl_get_cipher_methods() を使って利用可能な暗号化方式を確認

```
var_dump(openssl_get_cipher_methods());
```

#### OpenSSLに変更する場合の参考になる記事
https://qiita.com/Uchikoba/items/7784e1f1eb7bae3b1593

##参考
https://agency-star.co.jp/column/php--with-mcrypt/
https://tech.mktime.com/entry/451
https://qiita.com/Uchikoba/items/7784e1f1eb7bae3b1593
リモートワークを効率的に進めるあれこれ

## はじめに
昨今、様々な企業でリモートワークが当たり前になってきているかなと思います。
僕自身、去年の今頃エンジニアになり、約１年たった今、ようやく仕事にも会社にも慣れたときにリモートワーク推奨となったので戸惑うことが多くありました。
エンジニアは個人の作業が多いといってもやはり色々な人とコミュニケーションを取りつつ仕事を行うと思います。
今回は、そんなリモートワークをより円滑に行うために使っている・使ってみてよかったサービスをまとめてみました。

## ツール系
### SpatialChat
「[SpatialChat](https://spatial.chat/)」はいわゆるバーチャルオフィスです。
主な機能としては

- ビデオチャット
- テキストメッセージ
- 画面共有

面白いのがこのアプリケーションのインターフェースです。バーチャルオフィス内で話をしたい人にアイコンを近づけることで、次第に相手の声が大きく聞こえ、自分の声も相手に聞こえるようになります。（プランによって同時利用できる人数に制限があります。）
どうしても減りがちなチーム間のコミュニケーションをこのバーチャルオフィスを導入することで解決できるかもしれません。

### Remo
「[Remo](https://remo.co/)」 こちらもバーチャルオフィスで、個人的にこちらはオススメ。
SpatialChatと主な機能としては同じです。画面共有しながら開発をしたり、何気ない会話が可能です。
SpatialChatと大きく違う点は、仮想的な部屋が設けられており、大事な話をするときはその部屋に鍵をかけたりできるなど、実際のオフィスのように活用できます。

### Zoom
おそらくみなさん使っているでしょう、[Zoom](https://zoom.us/jp-jp/meetings.html)。
うちの会社でもミーティングや面談、あとは勉強会に使うことが多いです。

### Slack
もうこれは言わずもがなですね。[Slack](https://slack.com/intl/ja-jp/)です。
ただリモートワークが始まる前と後で大きく変化したのはその活用法にあると思っています。
これまでは、業種（フロントエンド、バックエンド,etc）ごとのチャンネルや、開発・運用しているプロジェクトごとにチャンネルがあり、そこで業務連絡をするのが主でした。リモートワークがだいぶ定着してきた今では、業種の壁を超えてそれぞれの趣味について話すチャンネルがたくさんできてきました。会社に出社していたからこそできた何気ない会話がslack場で気軽にできると同時に、プロジェクトや業種が違うことで関わることが少なかった人とも交流を持つことができています。

### Backlog
[Backlog](https://backlog.com/ja/)も多くの方が知ってるかと思います、こちらはプロジェクト管理ツールですね。
これもリモートワークが始まる前から使用していましたが、とても便利な機能が多いです。
ガントチャートやwikiなど、タスク管理に有用な機能が豊富です。さらにSlackと連携することでリアルタイムで更新通知を受け取ることが可能です。リモートワークではチャットのレスポンスの速さが重要になってきますし、管理者であればチームメンバーの作業状況など見えないので、こういったツールで管理できるのはとても便利ですね。

## 集中力アップ術
### ポモドーロ
「ポモドーロ」知ってますか？知ってる人も多いかもしれません。（僕は最近知りました…）
効率的な時間管理術と言われていて、発案自体は１９９０年代とされています。具体的には、’短い作業’と’短い休憩’を１ポモドーロとして、４ポモドーロ繰り返すことで長めの休憩をとるというものです。
僕は実際にリモートワークが始まってから、どうしても作業に集中できないときにポモドーロを知り、実践してみました。調べてみると「25分の作業＋5分休憩」を１ポモドーロとして、４ポモドーロで30分休憩をすることが多いようですが、僕の場合は「３０分の作業＋5分休憩」の30分休憩でやっていて、なかなか集中できていると感じてます。（そんなに変わらないですが）

そしてポモドーロで重要なのは__時間を徹底する__ことにあります。作業が途中でも、集中していたとしてもその決めた時間通りに行動し、その時間内に作業を終わらせようとすることが重要です。


## おわりに
以上リモートワークを円滑に進めるために僕が使ってよかったサービスを５つとポモドーロについて紹介させていただきました。
特にリモートワークではコミュニケーションがおろそかになりがちですので、僕としてはバーチャルオフィスはとてもいいサービスだと感じました。
集中力アップ術に関してみなさんそれぞれの方法があるかもしれないので、ぜひ教えていただければと思います！
モダン開発に対する提言

##モダン開発に対する提言
##モダン開発
###技術に対するセンス
定番である技術をコアにしながらも新しいものにも目配りが効いていること。
（新しい流れに添いつつ、今までの技術に対するリスペクトは必要）
###保守・メンテナンス・運用
保守・メンテナンス・運用に気配りが効いていること。
###設計力
設計力を開発者が持つこと。
必ずしも、お客さんに見せるための従来の設計書とは限らない。
アジャイルとかウォーターフォールだとかに分けることは非常に危険だと思っていて
従来でも開発しながら表にまとめるなど、開発側からのアプローチは
あったと思う。

既存の設計書を自分の中で「使える化」する技術も必要ではないだろうか？
###態度
アジャイルだからとかウォーターフォールだからとかで
突き進んで行くのではなくエンジニアとして冷静なアプローチが必要。
##アンチパターン
・議論しながらとか全て０ベースとかはかなりレベルが高い要求なので
いわゆる寄せ集め的な従来のSierの世界では危険が高すぎると思われる。
進捗の概念がないとか、リーダーすら否定するとか
アジャイルだからって設計書をないがしろにするとか
グダグダになってしまうかも。
縛りが強い状態で空気を読みながらやってるので逆にタガが外れたらグダグダに
なるのは非常に早いようだ。
・空気を読みながらやって行くと　ある現場では社員とできる開発者が仲が良く
あの人軽くみられてるなっていうあたりは一瞬で察知するようになり・・・それに乗っかる方が楽なんで・・・結局エラーとか出さないとかになってしまう。生活の場なので・・・案件が続けばいいだけなので落城間際でも中の人間は全然気がつかなくて変わらない日常が続いているっていうのは珍しくないと思われる。借金だらけの老舗旅館で働いているあの人は太鼓しか叩かないとか・・・数ヶ月でそうなるので・・・
・登場人物が多いので・・・このことが完了しないと次に進めない状態が続いてしまう。
自分大好きな人が多いので・・・自分たちは完璧と思って・・・実は全体的に見ると進まない状態が
起きてしまう。←　アローダイアグラム法を真剣に取り入れることをお勧めします。知っていると使えているとは違います。
アコーディオンパネル使い方

#アコーディオンパネル
![スクリーンショット 2020-10-23 9.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633943/9cd66051-01cd-9105-4161-4c92a3c8f16d.png)

```html:html
<dl class="accordion">
    <dt>A</dt>
    <dd class="dda">ここにAの内容が入る</dd>
    <dt>B</dt>
    <dd class="ddb">ここにBの内容が入る</dd>
    <dt>C</dt>
    <dd class="ddc">ここにCの内容が入る</dd>
  </dl>
```

```css:css
    .accordion{
      width: 500px;
      margin: 50px auto;
      text-align: center;
    }
      dt {
        padding: 16px;
        background: #2894f0;
        border: 2px solid #2894f0;
        color: #ffffff;
        font-size: 24px;
      }
      dd {
        height: 100px;
        padding: 16px;
        border: 2px solid #2894f0;
        border-top: 0;
      }
```

```js:js
$(function() {
      $('dd').hide();
      $('dt').on('click',function() {
        $('.dda').slideDown(400);
      });
    });
```
AWS S3 MacローカルディレクトリのファイルをS3に差分同期する

# 目的

- AWSのS3の任意のバケットにMacローカルのディレクトリの差分だけを同期する方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- S3
    - 下記の方法でバケットを作成した。
        - [AWS S3のバケットの作り方](https://qiita.com/miriwo/items/41e488b79fb58fa7c952)

# 前提条件

- 下記の方法でMacローカルのファイルを同期することがすでにできていること。
    - [AWS S3 Macローカルのディレクトリを任意のバケットに同期する]()

# 詳細

1. 下記コマンドを実行してMacのローカルにディレクトリを作成する。

    ```terminal
    $ mkdir ~/test01
    ```
1. 下記コマンドを実行してMacのローカルにテキストファイルを作成する。

    ```terminal
    $ touch ~/test01/text01.txt
    ```
1. 下記コマンドを実行して既存のバケットの`test01`ディレクトリにtext01.txtを同期する。

    ```terminal
    $ aws s3 sync ~/test01 s3://同期先のバケット名/test01
    ```
1. 下記コマンドを実行してMacのローカルにtext02.txtを作成する。

    ```terminal
    $ touch ~/test01/text02.txt
    ```
1. 下記コマンドを実行して差分ファイルであるtest02.txtを既存のバケットの`test01`ディレクトリにアップロードする。

    ```terminal
    $ aws s3 sync ~/test01 s3://同期先のバケット名/test01
    ```
自動フォロバはTwitter規約違反と思われる

#はじめに
個人的な備忘録です。ざっと書きます。

#TwitterAPIの申請をしたら受理されなかった
##やりたかったこと
Twitterのbotを作りたかった。自動投稿と、せっかくだから自動フォロバを付けようと思った。
##申請時の内容
以下のようなメールがきた。（サイトで入力した内容と同じことを聞かれているので不思議に思った）
>ご利用ありがとうございます。
>
>Twitterプラットフォームでの開発に関心をお寄せいただきありがとうございます。 
>
>お客さまの開発者アカウント申請の審査を完了する前に、お客さまの使用目的についての詳細情報のご提供をお願いします。 
>
>審査で重視されるのは以下のような情報です。
>
>+ Twitter APIを使用する中核的な使用目的、意図、ビジネス上の目的。
>+ ツイート、Twitterアカウント、またはそのコンテンツを分析する場合は、実施する分析の内容と手法または技術について詳しくお教えください。 
>+ ツイート、リツイート、いいねの使用が含まれる場合は、Twitterアカウントまたはそのコンテンツに対してどのような操作を行うのかをお教えください。
>+ TwitterコンテンツをTwitter以外で表示する場合は、お客さまの製品またはサービスで、ツイートおよびTwitterコンテンツがどこにどのように表示されるかを、行レベルの表示か集計表示かを含めてご説明願います。
>上記の詳細情報を記載のうえ、このメールにご返信ください。返信をいただきましたら、審査を続行いたします。ご理解、ご協力いただければ幸いです。 
>
>よろしくお願いいたします。 
>
>Twitter

以下をメールした。
>+ Twitter APIを使用する中核的な使用目的、意図、ビジネス上の目的。
>
>このアカウントの投稿を自動化する目的です。日に2-10ツイートくらいを自動投稿したいです。
>また、自動follow back機能をつけるつもりです。完全な私的使用アカウントです。
>
>+ ツイート、Twitterアカウント、またはそのコンテンツを分析する場合は、実施する分析の内容と手法または技術について詳しくお教えください。 
>
>分析はしません。
>
>+ ツイート、リツイート、いいねの使用が含まれる場合は、Twitterアカウントまたはそのコンテンツに対してどのような操作を行うのかをお教えください。
>
>自動投稿と自動follow backです。他は予定していません。
>
>+ TwitterコンテンツをTwitter以外で表示する場合は、お客さまの製品またはサービスで、ツイートおよびTwitterコンテンツがどこにどのように表示されるかを、行レベルの表示か集計表示かを含めてご説明願います。
>
>twitter以外での表示の意図はありません。
>
>以上よろしくお願いいたします。

すると以下のような返信だった。
>Thanks for applying for access!
>
>It looks like your proposed use case may be in violation of one or more sections of the Developer Agreement and Policy, Automation Rules, and/or the Twitter Rules.
>
>As a next step please review these policies as they relate to your use case. Then, respond to this email with an updated use case that is in full compliance with Twitter policy.
>
>Thank you for your interest in building on Twitter.

~~どうして英語なの最初から英語で質問して~~
~~お願いだからどの規約の違反なのか書いてまじで~~
とりあえず規約を端から読んでいくことにした。
##違反が疑われる規約
上のメールの[Automation Rules](https://help.twitter.com/en/rules-and-policies/twitter-automation "Automation Rules")->II. Activity-Specific Rules->D. Automated actions you take on Tweets or accountsのところに

>Automated following/unfollowing: You may not follow or unfollow Twitter accounts in a bulk, aggressive, or indiscriminate manner. Aggressive following is a violation of the Twitter Rules. Please also review our following rules and best practices to ensure you are in compliance. Note that applications that claim to get users more followers are also prohibited under the Twitter Rules.

ここよく見て欲しいんだけど、
You may not follow ... in a bulk(そんなことはないフォロバは逐一だ）, 
aggressive(フォロバは友愛の証だ), 
or indiscriminate manner
(無差別？　いや、フォローしてきた人だけだから...いや待て、フォローしたらかたっぱしから『無差別に』フォロー返すってのはこれの違反...だと...？)

自動フォロバが規約違反かどうか適当にググってみたけど違反っぽいという論調は一致していた。

##修正した申請
上のものから自動フォロバだけ削った。

##反応
また日本語に戻って返信がきたが、今度は、もっと内容を詳細に書けとのお達しだった。
どうやら規約違反はもうしてないと判断されたようだ。

#まとめ
自動フォロバは規約違反が濃厚。無差別のフォローを自動化しているとみなされるか。
俺はbotが作りたかっただけなんだ。常時張り付いてフォロバするのが面倒なだけだったんだ。
静的 Web サイトホスティングサービス比較

## 前提 & 注意事項

* 商用環境(Prd)での利用実績に基づいた比較です ※GA 前の Static Web Apps は除く
    * 個人開発での比較ではありません
* 個人の感想です
    * 実際に自分が会社の Web サイトのホスティングサービスとして利用した際の経験に基づく比較です
* 最新情報は公式サイトをご確認ください

## 比較

◎: 無料
○: 有料機能
×: 機能としてない

|比較内容|[GitHub Pages](https://pages.github.com/)|[Azure Blob Storage](https://azure.microsoft.com/ja-jp/services/storage/blobs/?WT.mc_id=AZ-MVP-5001601)|[AWS Amplify Console](https://aws.amazon.com/jp/amplify/console/)|[Amazon S3](https://docs.aws.amazon.com/s3/index.html)|[Netlify](https://www.netlify.com/)|[Firebase](https://firebase.google.com/)|[Heroku](https://jp.heroku.com/home)|[Static Web Apps](https://azure.microsoft.com/ja-jp/services/app-service/static/?WT.mc_id=AZ-MVP-5001601)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|カスタムドメイン|◎|[○](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-custom-domain-name?tabs=azure-portal&WT.mc_id=AZ-MVP-5001601)|○|○|◎|○|○<br/>Hobby以降|[◎](https://docs.microsoft.com/ja-jp/azure/static-web-apps/custom-domain/?WT.mc_id=AZ-MVP-5001601)
|Basic認証|×|×|○|×|○<br/>Pro以降|×|×|[◎](https://docs.microsoft.com/ja-jp/azure/static-web-apps/authentication-authorization/?WT.mc_id=AZ-MVP-5001601)
|SSL/TLS|◎|○|○|×|◎|○|○<br/>Hobby以降|◎|
|自動デプロイ|◎|×|○|×|◎|×|◎|◎|

## まとめ

要件に照らし合わせて選定している順番で左から並べました。

Netlify は無料で多くの機能に対応していますが、私が上場企業のサイト運営時に、Netlify 側の実装により大きなトラブルに見舞われたため、私個人の中での選定順位がかなり低いです。ただ、IR などのこの時間この瞬間にこうなっていなければ困る！といった要件がなければ、Netlify は Netlify CMS もあり、よい選択肢かと思います。

そういう意味では、プレビューのため、まだ商用環境(Prd)での利用実績はないですが、[Static Web Apps](https://azure.microsoft.com/ja-jp/services/app-service/static/?WT.mc_id=AZ-MVP-5001601) は今後期待したいサービスです。
lengthメソッドについて

#lengthメソッド

**文字列が持つメソッドです。
length（レングス）メソッドは文字列の文字数を数えてくれるメソッドです。
文字間の空白も数えられます。**

メソッドの使用は、
以下のように値に対してメソッド名「length」を<font color="DeepPink">ドット.</font>で繋ぎ実行します。

```java:【例】irb
# 文字列の文字数を出す
irb(main):001:0> "Hello World".length
=> 11
```

"Hello World".lengthは、1つの式として見ることもできますね。
上の例で=>の後に表示されているのは、「Hello World」の文字数「11」です。
文字自体は、「10」文字ですが、「　」空白も入れての「11」文字になります。

#irbで以下のコードを実行してみましょう
では、実際にlengthメソッドを試してみましょう。

```java:irb
# lengthメソッドで文字数を出す
irb(main):001:0> "good morning".length

# 続けてこのように表示されれば成功
=> 12
```

#まとめ

**メソッドとは、プログラミングにおける何らかの処理をまとめたもの。
lengthメソッドとは、文字列の文字数を数えるメソッドのこと。
⚠︎空白（スペース）も数えられます。**

#####以上。