OmniAICreator/Qiita-1.07M huggingface dataset:
【iPhone】連絡先を移行する/インポートする方法まとめ

たまーに聞かれる内容。ググればそれっぽい内容でてくるけどばすっとくる内容があまりない。かも。
ITにあまり詳しくない人に「この記事見てね」と言えるような記事にしたく記載してます。
### 結論
- iCloudを利用した同期
- OutlookやGmailの連絡先を利用した同期

※なお、引用元等は最新情報を参照してください。
## iCloudを利用した同期
#### 必要なもの
- Apple ID×1

#### 仮定状況
- 今のiPhone(old-iPhone)の連絡先を別のiPhone(new-iPhone)に移行したい。
- new-iPhoneの初期化は行いたいくない。
- できればold-iPhoneとnew-iPhoneどちらも同じ連絡先が入っている状態にしたい。

### 手順
1. old-iPhoneで「連絡先」アプリを開き、確かに移行したい連絡先があることを確認する
2. old-iPhoneへApple IDでサインインする。
![Apple IDサインイン方法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/71431720-0c22-37a0-f387-1ca6e9f3e5d5.png)
 引用元(参考)：https://support.apple.com/ja-jp/HT204053
3. 「設定」>「Apple ID」(上の画像の「iPhoneにサインイン」と記載があった場所をタップ)
![choose_Apple ID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/a36b74ba-b3a4-abb7-05e9-6fa7754459f6.png)

4. 「iCloud」を選択
![contacts_off.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/0732bedc-daf3-fc9d-d5c6-610d9e44944c.png)

5.「連絡先」（の同期）をONにする
![integrate_contacts.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/6dee1c68-ac10-5975-6176-4f18e945b32c.png)
→すでにiPhone上にある連絡先とiCloudの連絡先をどっちもiPhoneに入れるか聞かれるので「結合」を選択

6. 1-5の手順をnew-iPhoneでも実施する。
7. これでold-iPhone,new-iPhoneのどちらにも同じ連絡先が入ったはず。

#### Q. わかったけど、これは、、え？iCloud上に連絡先があるの?
えーと。今のところはそうです。
ちなみにiPhoneからiCloudの連絡先をOFFにすると...このように同期した連絡先をiPhoneに残すか聞かれます。
![leave_contacts.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/7bd6f1e6-f17c-22d7-4c65-d104e6051580.png)
まぁ大体は「残す」で良いと思います。

これで、最終的にiCloudで同期していないけど、iCloudで同期していた時の連絡先が入ってきます。

#### Q. いや、iCloud上にあるかわからんやん！！消えたらどうすんの？？
えー、iCloudにサインインして「連絡先」確認してください。
https://www.icloud.com/contacts/
あるはずです...。なければ手順等確認してみてください。



## OutlookやGmailの連絡先を利用した同期
#### 必要なもの
- GmailとかOutlookとかのメールアカウント
- 上記アカウントのログイン情報(ID,パスワード)
※本手順での「iPhone」は新しく利用したいnew-iPhoneの想定。

### 手順
1. iPhoneの「設定」>「連絡先」を選択
![01_設定_連絡先.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/d339f068-4e4c-32ed-0d6f-cef2d327b84f.png)


2. 「アカウント」を選択
![05_連絡先_アカウント.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/543325a6-ab3d-f901-cc10-1ceeb44bb1cc.png)


3. ①「アカウントを追加」して移行したい連絡先が入っているメールアカウントでログイン
②追加されたアカウントを選択（画像では"Gmail"）
![10_アカウントを追加_選択.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/873f431b-2e2d-7d3a-daa8-54d7f4116ec5.png)


4. 連絡先(の同期)をONにする 
**iCloudでの同期と異なり、何も聞かれずにONにできちゃいます。**
タップする前にご確認ください。
↓↓↓OFFの状態
![15_連絡先OFF状態-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/b2bb897f-5c32-d04d-ae9d-14c03d7b4b5a.png)

↓↓↓ONの状態
![20_連絡先ON状態-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/40a3589f-2260-9ff6-96f6-1eff18b5a96a.png)

5.連絡先同期完了です。
6. 一応「連絡先」のアプリで確認してみてください。

#### Q.これ、連絡先同期OFFにしたら全部消えます？

消えます。画像のようなポップが出てきますが、削除しか選択肢がないです。
![25_連絡先ONからOFFにするとき-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/c215c70d-4df8-96fd-c1d9-1dfd936fb184.png)


とりあえず以上です。ご参考まで。
Macのターミナルでタイマー作成（繰り返し機能も）

## 背景
Macでタイマー使おうと思ったら標準で無く、App Storeにある海外製の無料のを入れるのも..と思いシェルスクリプトで作成
ちなみに今回１回で終わりでなく、ループして一定の時間で繰り返し教えてほしかった

## 完成図
最低限でざっと作ってこんな感じ
ざっくり時間が分かれば十分で、指定時間が過ぎると標準サウンドのGlassを2回鳴らすようにしました
![Screen Shot 2020-10-30 at 16.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148042/a559d052-2d73-f334-3cf2-1b78c154760e.png)

## コマンドとコード
適当な場所にスクリプトを置いて、下記で実行（※9分ごとに音を鳴らす例）
オプションで「-l」をつけるとループで実行します（getoptsの仕様なのか、オプションを「9」の後につけるとダメでした）

```
sh min_timer.sh -l 9
```

``` shell:min_timer.sh
#!bin/bash

## オプション（ループ指定）解析
loop='FALSE'
while getopts l OPT
do
  case $OPT in
    'l' ) loop='TRUE' ;;
  esac
done
shift  $(($OPTIND - 1))

## タイマー指定時間
minutes=$1

while :
do
  clear
  ## 開始時間と終了時間を表示
  echo "***** `date +%H:%M` -> `date -v+${minutes}M +%H:%M`\n"

  for i in `seq 1  ${minutes}`
  do
    ## 残り時間を表示（毎分）
    num=$(($minutes - $i + 1))
    echo "残り${num}分"
    sleep 60
  done

  ## アラーム（下記の場所に他の標準サウンドもありました）※-vオプションで音量調整できます
  afplay /System/Library/Sounds/Glass.aiff
  afplay /System/Library/Sounds/Glass.aiff

  ## ループor終了
  if [ "${loop}" = 'FALSE' ];then
    exit 0
  fi
done
```

## 最後に
今回ちょっと所用でざっと作りましたが、ひと手間加えたらポモドーロテクニックとかでも使えるかもと思いました（25分と5分で繰り返すようにするとか）
また、afplayは音楽ファイルを再生してるだけなので、いい感じのを用意したら気分が上がると思います:smiley:
S3へのEndpointが設定されているVPCでECS(Fargate)を使う場合の注意点

# はじめに
先日、S3に向けたVPC Endpointが設定されているVPCにてECS(Fargate)を実行しようとした際、少々ハマったので備忘録です。
# 起こった事象
S3に向けたVPC Endpointが設定されているVPCにてECS(Fargate)を実行しようとしたところ、下記のようなErrorが発生してFargateの起動が失敗した。

```
CannotPullContainerError: error pulling image configuration: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message>.....
```
どうやら、何らかの理由でECRからのコンテナイメージの取得に失敗している模様。
## 確認したこと
該当のSubnetからIGW(Internet Gate Way)へのRouteがあることは確認済み。
# 事象が起こった原因
調べてみると、FargateがECRにあるContainer imageを取得するために`prod-***REGION***-starport-layer-bucket`と言うS3 Bucketにアクセスしている模様。これがECRの実体なのか。
参考: https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-setting-up-s3-gateway
# 解決策
VPC EndpointのPolicyの`Resource`セクションに、ECRが使用しているS3 BucketのARNを追記。

```sample.json
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "***SID***",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::***BUCKET***",
                "arn:aws:s3:::prod-ap-northeast-1-starport-layer-bucket/*"
            ]
        }
    ]
}
```
これでFargateを起動すると、無事コンテナイメージが読み込まれて起動が成功した。
# 最後に
ECRへのアクセスに関連するような設定が何一つ見当たらなかったので、少々手こずった。ことS3に関してはAWSの他のサービスでもバックエンドで利用しているものが多そうだし、特別な理由がない限りVPC EndpointのPolicyを利用してアクセスコントロールを行うのは**アンチパターン**な気がする。他にも、例えば`Yum`で`Amazon Linux`系のRepositoryを利用する場合にもうまく接続できなかったりする。
Instagramのストーリーにシェアしてみよう！

#Instagramのストーリーにシェアしてみよう！#

#今回学べること#
- 日時の取得
- ViewをUIImageに変換
- インスタのストーリに画像をシェアする。
- iPhponeに特定のアプリがあるかを確認する。

#完成はこんな感じのイメージ！#
|アプリ側|Instagramのストーリー|
|:--:|:--:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279165/e7ae8e68-36d1-6cfb-5eb8-03b5b1862cad.png" width="300">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279165/addd9858-4a92-4d40-1f42-0470ffb1a209.jpeg" width="300">|
ViewにImageとLabelを表示させて、そのViewをimageに変換してInstagramのストーリに渡す処理をしています。

#日時の取得#
今回は、表示した時に値が変更されたことを確認しやすいように日付を表示するようにしました。Labelにユーザー名等の変数を加えるとよりインスタ映えしやすいデザインになります。

```swift:ViewController.swift
@IBOutlet weak var dateLable: UILabel!   //StoryboardのLabelと接続
//------------------------------------------------------
//super.viewDidLoad()の中に記述
let format = DateFormatter()
format.timeStyle = .medium
format.dateStyle = .long
format.locale = Locale(identifier: "ja_JP")
let date = Date()
 dateLable.text = format.string(from: date)
```
#ViewをUIImageに変換#
Storyboardで作成したViewを@IBOutleを利用してViewControllerに接続しましょう！
接続したらUIViewをextensionして以下のコードを追加して変換したいタイミングでimage = の部分を呼び出してみよう。

```swift:ViewController.swift
@IBOutlet weak var screensShotView: UIView!   //StoryboardのViewと接続
//------------------------------------------------------
//UIVIewのextensionとして以下のコードを追加しておきましょう。
//view.asImage()でいつでもViewをImageに変換することができます。
extension UIView {
    //UIViewをUIImageに変換するコード
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

//view.asImage()でUIImageに変換できます。ボタンが押されるタイミングで呼び出すのが良いでしょう。
let image = screensShotView.asImage()
```

#インスタのストーリに画像をシェアする#
インスタグラムの詳しいスキーム一覧は、[公式ドキュメント](https://developers.facebook.com/docs/instagram/sharing-to-stories/)より確認してください。

```swift:ViewController.swift
private func setupOpenInstagram() {
        let image = screensShotView.asImage()
        let items: [[String: Any]] = [[
            "com.instagram.sharedSticker.stickerImage": image,
            "com.instagram.sharedSticker.backgroundTopColor": "#000000",
            "com.instagram.sharedSticker.backgroundBottomColor": "#FFFFFF"
        ]]
        UIPasteboard.general.setItems(items, options: [:])
        guard let shareInstagramStoryURL = "instagram-stories://share".convertURL else { return }
        UIApplication.shared.open(shareInstagramStoryURL, options: [:], completionHandler: nil)
    }
```


素材は、イラスト屋さんの画像を利用しています。
https://www.irasutoya.com/2019/04/blog-post_34.html

特定のアプリのスキームキーがあるか確認する。
https://qiita.com/nagaoyuriko/items/67c5e262f6e88cd88885
Notice: Undefined variableエラーの対処法

最近よく`Undefined variable`が出るようになりました。
`Undefined variable`は、変数に値がないという意味だそうです。
解決方法は簡単で、`isset`を加えてあげるだけです！

```
if($変数名)
{
   //処理内容
}

↓

if(isset($変数名)) 
{
　　//処理内容
}
```

参考元はこちら（https://hacknote.jp/archives/21606/）
CognosAnalytics のレポートをCSV形式で実行したときにカンマ区切りでダウンロードする方法

cognos analytics で作成したリスト表をカンマ区切りでダウンロードして利用したいと思ってダウンロードしてみるとTab区切りになってしまいます。これはCognosAnalyticsのデフォルトがTab区切りになっているからです。
カンマ区切りのファイルが必要だったのでCSVファイルを指定したのに、これではtsvだよ・・・と思いながらいちいち変換をしないといけなかったりします。このような手間を省くためにCSV形式で実行するときの区切り文字の設定を変更したいときに以下の方法を利用できます。

まず、特になにも設定しない状態で、普通にCognosで以下のようなリスト表を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/267b5e4c-3872-8152-18e8-d1906c41c477.png)
この表をCSVデータとしてダウンロードしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/3c6acb3c-c4f2-4751-37c1-5aa3240b0765.png)
以下の通りカンマではなく、タブで区切られたファイルになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/7ab10ae9-465e-2c02-7eb5-da6d30a483e2.png)

これでは用途として困るので、カンマ区切りでファイル出力させるためには以下の設定を行います。

管理コンソールから「設定」タブを開き、「ディスパッチャとサービス」を選択して、使用中のディスパッチャーをクリックします。サービスの一覧から、「ReportService」の詳細をクリックしてプロパティ画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/c196e8ca-d999-9443-2c55-33ab6f8e6607.png)

レポートプロパティーの設定の「設定」タブで、カテゴリーを「環境」とし、編集をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/da665c49-68a6-3ad9-65e9-b323d22f2212.png)
親エントリーから取得した設定をオーバーライドにチェックを入れると、以下のようにパラメーターを追加できるようになります。カンマ区切りの設定をするために以下の通り設定しOKボタンを押します。
パラメーター：RSVP.CSV.DELIMITER
値：,（カンマ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/688c7d35-9a83-84bf-d2ca-d8061473ab8f.png)
残りの画面も全てOKで抜けて終了します。

もう一度先程のレポートでCSV形式で実行してみます。
ダウンロードされたファイルを確認すると以下のようにカンマ区切りファイルになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/96ff59af-d0f9-b12e-adbf-7e8b3acb737c.png)


参考情報はこちらです
https://www.ibm.com/support/pages/modify-properties-csv-output-format-cognos-analytics-11

以上
【Android/Java】リスナ設定(ボタン設置)における記述型式を把握する

## はじめに
Androidアプリ開発で出てくる様々なListener。
javaファイルでの書き方が大きく２パターンあり、混乱したので備忘録として記しておく。

今回のサンプルはボタンを押すと、メッセージが表示されるアプリです。
※尚、ボタンはボタンでも、ActionBarにボタン(オプションメニュー)を設置する方法は全く違うのでこちらを参照してみてください。
https://qiita.com/kilalabu/items/62a39e63ee2c6d4293bd

## 用語の確認
イベント ・・・ 画面に対して行う操作のこと (例：クリックする）
イベントハンドラ ・・・ そのイベントに対して行う処理のこと　（例：クリックされたらテキストを表示する）
リスナ ・・・ イベントの検知をしてくれるもの　（例：ボタン）
 
## コード
レイアウトは適当です。

```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/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ボタン"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/text" />

</androidx.constraintlayout.widget.ConstraintLayout>
```
#
### パターン１：　イベント＆イベントハンドラとリスナを分けて記述
```java:MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // リスナ設定（イベント検知ボタンを設置）
        Button button1 = findViewById(R.id.btn);
        button1.setOnClickListener(new TestListener());
    }

    // リスナクラスの作成(ボタンをクリック+テキスト表示）
    private class TestListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            TextView textView = findViewById(R.id.text);
            textView.setText("button1をクリックしました");
        }
    }
}
```
### パターン2：　イベント＆イベントハンドラ&リスナをまとめて記述
```java:MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 全てまとめて記述
        Button button2 = findViewById(R.id.btn);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TextView textView = findViewById(R.id.text);
                textView.setText("button2をクリックしました");
            }
        });
    }
}
```

## 最後に
Buttonにおいては
・setOnClickListener
・View.OnClickListener
・onClick
という流れが決まっているので1セットとして認識すること。

## 追記(2020/11/1)
２つ紹介しましたがView.OnClickListenerにおいては基本無名クラスでセットするみたいです。
ですのでパターン１は構造を理解するための参考にしていただければと！
[Rails] 画面遷移させない方法

#はじめに
Railsのみでいいね機能やコメント機能をつくる時、画面を遷移させない方法を見つけるのに苦労したため同じような悩みを持つ方のために投稿します。

#バージョン
```
ruby 2.6.3
Rails 5.2.4.3
```

#ズバリ
```ruby
redirect_to request.referer
```
ずばり、この1行をコントローラーの最後に記述しましょう。
そうすればボタン押した後も画面遷移しないはず！

redirect_toについて詳しく知りたい方は[こちら](https://pikawaka.com/rails/redirect_to)の資料がおすすめ。
【Laravel】Google Maps Embed APIの導入

- Google Maps Embed API を使って、ローカルアプリに地図を埋め込んだ時のメモ。

# デモ
<img src='https://gyazo.com/e44251e8945176993e5c9e15eaa4ead3/raw' width=60%>

# APIとは？
- Application Programming Interfaceの略。
- 別プログラムの機能を呼び出すための命令や関数のこと。

## webアプリへの API導入手順

|手順|概要|
|:--:|:--|
|①| APIキーを取得|
|②| **.env** ファイルに、環境変数を定義|
|③| **config/services.php** で設定<br>（※ 外部サービスのアカウント情報を設定するためのファイル）|
|④| ビューにて、config/services.php経由で、環境変数を取得|

# Google Maps Embed API
- [Google Maps Platform](https://cloud.google.com/maps-platform/)
- [ Maps Embed API の公式ガイド](https://developers.google.com/maps/documentation/embed/guide)
- 有料サービスだけど、200ドル/月までは無料なので、ローカルで動かす程度ならタダ。

## ① APIキーの取得
参：[Google Maps Embed APIキーの取得方法](https://developers.google.com/maps/documentation/android-sdk/get-api-key?hl=ja)

1. [Google Developers Console](https://console.developers.google.com/)へアクセスし、「新しいプロジェクト」からプロジェクトを作成（プロジェクト名は適当でok）。
  <img src='https://gyazo.com/7653876e54451a6adbd0f5ee343e874f/raw' width = 90%>
1. 「 Maps Embed API」 と検索。
  <img src='https://gyazo.com/b8b1b391f9f9d4ad1a7f293b5eac0163/raw' width=90%>  
「有効にする」をクリック。
  <img src='https://gyazo.com/866f11362a402773a6709334da9d45d5/raw' width=90%>
1. メニューボタン →  「 APIとサービス 」 → 「認証情報」をクリック。
  <img src ='https://gyazo.com/6e5bda106818d0597db047a0c694c91d/raw' width = 90%>
1. 「認証情報を作成」から、「APIキー」 をクリックすると、発行され、表示してくれる。コピーしとく。
  <img src ='https://gyazo.com/eb6dc10e335f7646ba3262e416ecf890/raw' width=90%>  
1. APIが不正に使用されないように「キーを制限」する。
  - 「アプリケーションの制限」は「HTTPリファラー」
  - 「ウェブサイトの制限」は、「項目を追加」から、URLを入力。  
  （※ 開発環境なら、入力しない or  `http：//localhost`でok。本番環境の場合は、必ずURLを制限すること！！）
  - 「APIの制限」もローカルなら指定してもしなくてもok。
  <img src='https://gyazo.com/44aff14ef10c474b9e10dbfdbb5df3de/raw' width = 55%> <img src='https://gyazo.com/0a6bed9ba703e3fc9e492c833724044b/raw' width = 40%>
1. APIキーをアプリ側に設定： とりあえず、動作確認のため、Bladeに直接APIキーを埋め込んでみる。。

```php:ビューへのAPIキー記述（※動作確認のため、直接書いてみる）
// 'q'パラメーターが渡せてないエラー （ Google Maps Platform rejected your request. Invalid request. Missing the 'q' parameter. ）
<iframe id='map' src='https://www.google.com/maps/embed/v1/place?key=取得したAPIキー;q={{ $shop->address }}'
  width='100%' height='320' frameborder='0'></iframe>
// ok!!!（'q'パラメーターを渡す部分「;」 → 「&」 に変更）
<iframe id='map' src='https://www.google.com/maps/embed/v1/place?key=取得したAPIキー&q={{ $shop->address }}'
  width='50%' height='300' frameborder='0'></iframe>
```
- 動作確認できたので、環境変数にAPIキーを設定していく。

## ② 環境変数の定義

```php:環境変数の定義（.envファイル）
GOOGLE_MAP_API="取得したAPIキー"
```

## ③ config/services.php での設定

```php:config/services.php（外部サービスの情報を設定するファイル）で読み込む
'google-map' => [
  'apikey' => env('GOOGLE_MAP_API'),
],
```

## ④ ビューに表示させる
- ビュー → config/services.php → 環境変数（.env ファイル） → APIキー  → Google Map を呼び出すイメージ。

```php:Bladeビュー
<iframe id='map' src='https://www.google.com/maps/embed/v1/place?key={{ config("services.google-map.apikey") }}&q={{ $shop->address }}'
  width='50%' height='300' frameborder='0'></iframe>
```
- **iframeタグ**： 指定ページに、他ページを埋め込むためのタグ
  - HTML のインラインのフレーム要素。
  - frameborder属性： 周りの境界線（1：アリ、0：なし）
- src属性の構成は、https://www.google.co.jp/maps/ 部分は、Google Map のアドレス。続けて、APIのキー、地図検索パラメーターを渡してる。
if ~ .length != 0 空の値を探す

## 空の値

課題として出品されている商品を一覧で表示するという機能を実装しているときのこと
if文で、ある条件式を書いていた

それは、

####インスタンス変数が空であるとき、代わりにダミーの商品を表示せよ

というもの

if文やね
これは楽勝やろと意気揚々と取り組み始めた
記述し終わり、挙動を確認したが…

#####ダミーの商品が表示されない！

```ruby:items_controller.rb

 def index
    @items = Item.order('created_at DESC')
  end
```


```ruby:index.html.erb

####################↓DBに保存されている商品を表示する↓####################
<ul class='item-lists'>
    <% if @items %>
      <% @items.each do |item| %>
        <li class='list' >
          <%= link_to item_path(item.user_id) do %>
            <div class='item-img-content'>
            </div>
            <div class='item-info'>
              <h3 class='item-name'>
                <%= item.name %>
              </h3>
              <div class='item-price'>
                <span><%= item.price %>円<br>(税込み)</span>
                <div class='star-btn'>
                  <%= image_tag "star.png", class:"star-icon" %>
                  <span class='star-count'>0</span>
                </div>
              </div>
            </div>
          <% end %>
        </li>
      <% end %>

####################↓以下はダミー商品↓####################
    <% else %>
        <li class='list'>
          <%= link_to '#' do %>
          <%= image_tag "https://s3-ap-northeast-1.amazonaws.com/mercarimaster/uploads/captured_image/content/10/a004.png", class: "item-img" %>
          <div class='item-info'>
            <h3 class='item-name'>
              商品の出品
            </h3>
            <div class='item-price'>
              <span>0円<br>(税込み)</span>
              <div class='star-btn'>
                <%= image_tag "star.png", class:"star-icon" %>
                <span class='star-count'>0</span>
              </div>
            </div>
          </div>
          <% end %>
        </li>
    <% end %>
    </ul>
  </div>
```
「要はDBが空なら、インスタンス変数も空になるなるんやろ？」
という考えのもと動いていた

その時の自分は

####「インスタンス変数が空の時」

という言葉にひたすら拘っていた記憶がある
それさえ抑えれば…！という、今思えば謎すぎる確信があった


## 確信は時に思考停止と同義になる

そうして1時間がすぎ、自分の中でようやくある疑念が浮かんだ
「…もしかしてテーブルが空だからって生成したものの中身も空になるとは限らないんじゃ？」
そしてparamsの中身が

####配列になっていることを思い出した

空の値も入れられる上に、中身が完全に空でも配列が存在する時点で空であると認識されることはない


空の値であることを証明しなきゃならないのに空にならないとか詰んでるやん

と思い講師の方に助けを求めた
返ってきた答えは

「インスタンス変数の中身が空であることでfalseを返したいのに配列が生成されてしまう、ということなら、配列の要素の数が0かどうかで判断してみては？」

というものだった

つまり、こう！

```ruby:index.html.erb
<ul class='item-lists'>
    <% if @items.length != 0 %> #←ココ！
      <% @items.each do |item| %>
        <li class='list' >
          <%= link_to item_path(item.user_id) do %>
#以下略
```

## 解釈を知る
つまり、

###DBが空だろうがインスタンス変数の中身は配列になるのでその中身が空かどうかで判断してしまおう

というもの
.lengthで配列の数を渡し、!= 0 を指定することによって
0でない時trueが返されるというものになる

全く頭になかったものを提示されただけに、透き通るような爽やかな理解があった
同時に、「気づけたのでは？」と思う悔しさもあった

# 教訓

今回得た教訓は、一つの考えに拘らない
もっと俯瞰的に物事をみるということ
現在の日付から週末、月末を計算するヘルパーを作成

#はじめに#
Laravelで自作アプリ(タスク管理アプリ)を開発する中で、現在日付から今週末、今月末の日付を計算する必要が出てきたので、ヘルパー関数として実装してみました。

#関数を作成#
\$date_typeを引数とし、引数によって返す日付を変えています。
1 :現在の日付
2 :週末(日曜日)
3 :月末

1, 3については割合簡単に実装できましたが、2は少しややこしいことになっています。

```helpers.php
<?php

// 引数$date_typeから現在の日付/週末/月末の値を返す。
// $date_type = 1 :現在の日付
//              2 :週末(日曜日)
//              3 :月末
function limit_date(int $date_type) {
    $now = new DateTimeImmutable(); // 現在の日付
    switch ($date_type) {
        case 1: // 現在の日付
            return (string)$now->format('Y/m/d');
            break;
        case 2: // 週末(日曜日)
            return (string)next_weekend($now)->format('Y/m/d');
            break;
        case 3: // 月末
            return (string)$now->format('Y/m/t');
            break;
        default:
            return "ERROR_DATE_TYPE";
    }
}

// 日付から次の週末(日曜日)を返す関数
// 日付の曜日が日曜日の場合、現在の日付を返す。
function next_weekend(DateTimeImmutable $now) {
    $w = (int)$now->format('w');        // 日～土を0～6として返す。
    // 月～土の場合6～1に変換。
    if ( $w != 0 ) {
        $w = 7 - $w;
    }
    $weekend = $now->add(new DateInterval('P' . ($w)  . 'D'));
    return $weekend;
}

```

#概要#
初めに現在時刻を持つDateTimeImmutableオブジェクトを生成しています。

```php
$now = new DateTimeImmutable()
```

日付に関するクラスはDateTimeなど他にもありましたが、参考記事によればDateTimeImmutableクラスを使うのが良いらしいです。

参考:
https://qiita.com/ndxbn/items/55a9bb057da954be322c

その後、DateTimeImmutableクラスのformatメソッドで日付情報をreturnしています。その際、string型にキャストしています。

```php
return (string)$now->format('Y/m/d');
```

もしかしたら必要ないかもしれませんが、自分がC出身なのもあり、良く分からないオブジェクトをそのまま返すより、型は指定してやった方が安心します。

#実装#
Laravelのヘルパーとして、composerを利用した方法で実装しました。

まずcomposer.json内の"autoload"オブジェクトに"files"配列を追加します。内容はヘルパー関数を書いたファイルのアドレスです。今回はapp/helpers。
(jsonのオブジェクトと配列の違いがイマイチ分かってない)

```composer.json
～～～～～～～～～～
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "files": [ 
            "app/helpers.php"
        ]
    },
～～～～～～～～～～
```

その後、ターミナルで以下のコマンドを実行します。

```console
composer dump-autoload
```

実行後、アプリケーション内で自作のヘルパー関数が利用可能になっています。
コマンドにより内部でどういう処理がされているかが良く分かりませんでしたが、メッセージを見る限りヘルパーファイルをライブラリにリンクしてるんでしょうか。
教えてエロい人

参考:
https://qiita.com/kazuhei/items/40d08b7356de8af5f427

#ソースのミソについて#

串カツに合いそう


ではなく、個人的にハマった部分、面白いと思った部分についてです。
まずはこちら。

```php
return (string)$now->format('Y/m/t');
```

formatメソッドの引数に'Y/m/t'と入力することで、月末の日付を出力できます。
php公式ドキュメントによれば、tは「指定した月の日数」を示すそうです。
おかげで閏年を考慮せずに月末の日付を出力できました。

一方で困ったのは週末の日付を取り出す部分。
曜日についてはformatメソッドの引数に'w'を設定することで取り出せます。

```php
(int)$now->format('w');
```
format('w')の出力は日曜日～土曜日に対し0～6が出力されるので、現在の日付に(7 - format('w') )の日を加えた日付が今週末日付となります。
日曜日の場合は丸1週間先を示すので少し不自然。というわけで専用に関数を作成して出力を調整しています。
これで日曜日の場合は現在日付と同日を返すようになりました。

参考:
https://php-archive.net/php/php-weekend/

#('w')#
かわいい
KMEANSのＣ言語実装

# KMEANSのＣ言語実装を作りました

ソースはこちら
https://github.com/ikuo0/ml-kmeans/blob/main/kmeans.cpp

KMEANS については下記URLがわかり易かったです
https://qiita.com/g-k/items/0d5d22a12a4507ecbf11
http://tech.nitoyon.com/ja/blog/2009/04/09/kmeans-visualise/

## コンパイル
ほぼＣ言語ですがC++の都合良い所は使いたいので g++ でコンパイルします。

```
g++ kmeans.cpp -o kmeans -O2 -Wall
```

## 使い方
TSVファイルのみ対応しています。
　列区切りは ￥ｔ
　行区切りは ￥ｎ
となります。

```
コマンド
./kmeans -fileName [TSVファイル名] -clusters [クラスター数] -maxIter [イテレーション最大回数] -tol [終了しきい値]

例
./kmeans -fileName seeds_xdata.txt -clusters 3 -maxIter 300 -tol 1e-5
```

出力は実行ディレクトリと同じディレクトリに出力されます
中心値のファイル名は kmeans_means.txt 
トレーニングデータの推定結果のファイル名は kmeans_predict.txt 
となります。

## プログラムの工夫１ - 行列と転置行列を同時に用意する
https://github.com/ikuo0/ml-kmeans/blob/main/kmeans.cpp#L917

```clang
    TypeMatrix X;
    TypeMatrix Xt;
```

メモリアクセスは飛び地よりも隣接へのアクセスが速いので計算の参照順序を考慮し X と Xt の都合の良い方を使い分けます。

## プログラムの工夫２ - エラーインターフェースの統一
エラー構造体
https://github.com/ikuo0/ml-kmeans/blob/main/kmeans.cpp#L23

```clang
typedef struct {
    int errorCode;
    const char* errorMessage;
} Error;
```

エラーの受け取り方例
https://github.com/ikuo0/ml-kmeans/blob/main/kmeans.cpp#L926

```clang
ArgumentParse(&err, &args, argc, argv);
```

第一引数は絶対にエラー構造体を指定します、エラーは isError で検査します。冗長ですが戻り値だったりポインタ渡しだったりexitだったりとエラー検査構文に統一性の無い状態よりマシと考えました。

以上です
GitHubのブランチ名とそのローカルのブランチ名を変更する。2023年12月版 (ブランチ名 masterからmainに変更する場合等)

2023年12月25日 追記
ブランチ名の変更方法が変わりました。

![masterブランチ名の変更1_文字.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/b5484701-c521-409d-9288-725766852804.png)

リポジトリのトップ画面で
左上のタブバー(Code Issues Pull requests Actions Projects Wiki Security Insights Settings)の下にある
リポジトリ名の更に下にある
masterを押します。
そうするとその下にプルダウンメニューが開きます。
その中にあるView all branchesを押します。
ブランチの一覧が表示されます。

![masterブランチ名の変更2_文字.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/861b7081-e990-9ba8-332e-c3dc9933094f.png)

その中にある三点リーダー(...)を押します。ゴミ箱アイコンの横です。
そうすると「Rename branch」がありますので、押します。
名前を変更して「Rename branch」を押します。
ブラウザをリロードしたり、リポジトリのトップ画面に戻ると
ブランチ名が変更されているのが確認できます。


Default branchを変更した後に、リポジトリのトップ画面に戻ると。

```
The default branch has been renamed!
master is now named main

If you have a local clone, you can update it by running the following commands.

git branch -m master main
git fetch origin
git branch -u main main
git remote set-head origin -a

```
と表示され、ローカル環境へのサポートもしてくれます。

追記終了



2023/02/15 追記


# 手順 2023年以降

**リモートのリポジトリ名を変えてからローカルのリポジトリ名を変える。**

2023年現在
github上で直接デフォルトのブランチ名を変えられるシステムになっています。

## Settingsタブに移動した画面

画像の番号順に
1. Settingsを押す。
1. Branchesを押す。
1. ３の鉛筆アイコンを押すと小ウィンドウが開く。
1. デフォルトブランチ名を **main** に変更をする。
1. 「Rename branch」ボタンで決定する。

![2023master_main01記号.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/2e31d9f2-d526-c03b-9578-43e23362ddb9.png)



![2023master_main02記号2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/810356fa-9cbb-c6b4-d089-0472c106fdad.png)

## Codeタブに移動した画面

![2023master_main04記号.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/df6919d7-c1f2-65e9-1c1a-ee4cf72073e7.png)

1. Codeタブに移動する。
1. ローカル側も合わせるようにとgithub上で指示が出る。

```terminal
# ローカルでmasterからmainに変更
git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a

```

これらのコマンドをローカル側で実行する。

追記終了



# 手順 2022年以前

**ローカルのリポジトリ名を変えてからリモートのリポジトリ名を変える。**

# ローカルのブランチ名をmainに変更
`git branch -m master main`

# リモートのブランチ名をmainに変更





ローカルで変えたブランチをリモートへpush

`git push -u origin main`

githubリポジトリ画面へ移動。
自分の場合は
`https://github.com/masakinihirota?tab=repositories`

目的のリポジトリを選択

さっきpushしたので、リモートリポジトリにはmasterとmainの2つ出来ているはずです。

![mastermainO.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/8b478418-4733-2e9d-7c42-69b32e70916d.png)

Settings＞Branches＞Default branchでmainに変更後UPDATEボタンを押して、確認ボタンがポップアップされるので押します。

![settingO.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/e95318c6-c495-c3f8-afc0-8f451b29a122.png)


![BranchO.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/1273cd1d-8db8-cccf-3666-d426a343a37d.png)

リポジトリトップ画面に戻り、ブランチ名からView all branchesボタンを押します。

![viewO.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/2e3fc1fe-01e1-3722-f94e-1bbe79f1931b.png)

masterを消去します。（赤いゴミ箱アイコンを押す）
ブラウザをリロードするとmasterブランチが消えているのが確認できます。
CocInstallをproxy下でやったら詰まった話

# まえがき
この記事はneovimでproxy下でCocInstallを実行しようとしたら変な詰まり方をしたのでそのための覚え書きです。
一部の変態以外は対象にならないと思います。
また、今回の話は認証無しproxyの話です。

# 自己紹介
Arch + neovimでの作業を愛してる高専生、isso0424です。
普段は言語問わずバックエンド書いてます。
Twitter: [@kousou4129](https://twitter.com/kousou4129)
GitHub: [isso0424](https://github.com/isso0424)

# proxy下で起こった問題
Proxy下でgoの環境構築をするために[coc-go](https://github.com/josa42/coc-go)をインストールしようとしたら、タイムアウトした。

# 解決法
## 1.CocConfigでコンフィグを開く
これは、環境毎の`coc-settings.json`を編集すればよい。

## 2.proxy設定を追記する
`coc-settings.json`の一番浅い部分に以下の通りに追記する。

```json
"http.proxy": "http://address:port"
```
## 3.CocInstallを行う
proxy設定が反映されたら、CocInstallを実行して終了。

# 苦戦した部分
## KDE
システム側でproxyを設定した
- 見てくれなかった

## yarn
手元にあったyarnにproxyを設定してみた
- 読んでくれない

## npm
内部でnpmを使ってそうだったのでnpmのproxyを設定した
- 読んでくれない

# まとめ
- Cocのproxyの設定は`coc-settings.json`へ
- パッケージマネージャに言っても聞いてくれない
- もちろんシステムでもだめ
ASP.NET Core Blazor - Blazor WebAssembly と Blazor Server の違いは？ ５つのポイント

ASP.NET Core Blazor についての記事となります。

Blazor は "WebAsssembly" と "Server" いずれかを選択する事になりますが、

それぞれの選択ポイントについて紹介します。


## Blazor WebAssembly と Blazor Server それぞれの特徴

### Blazor WebAssembly 

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/80ff4aae-bf35-e441-a5f1-ad27484fa566.png)
> 出典元:
> https://docs.microsoft.com/ja-jp/aspnet/core/blazor/hosting-models?view=aspnetcore-3.1:title]




### Blazor Server

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/c1b13799-1e98-d4b7-46e5-5256222d2f05.png)
> 出典元:
> https://docs.microsoft.com/ja-jp/aspnet/core/blazor/hosting-models?view=aspnetcore-3.1



## 選ぶポイント

### 1. アクセス高負荷時のスケーラビリティを考慮するか？

#### Blazor WebAssembly はスケーラビリティの相性が良いです

#### Blazor Server は スケーラビリティの相性が悪いです

Blazor WebAssembly は 配布するためのサーバがあれば、運用ができサーバレスアプリとしても構築できます。

Blazor Server は SignalR 通信が必要となりますので、常に接続するためにサーバが必要となります。

また、スケーラビリティを行いサーバのインスタンスが増減した場合、初期接続したサーバと SignalR 通信を行う必要があるため、

スケーラビリティに対応する際には、 Signal R の通信制御も同時に行う必要があるため、導入コスト、運用コストのいずれもコストが発生します。


### 2. 初回アクセス時の読み込み速度をどの程度優先するか？

#### Blazor WebAssembly は ページの初期読み込みが遅いです

#### Blazor Server は ページの初期読み込みが早いです

Blazor Server は都度サーバサイドと通信するので、初期読み込み時に必要なリソースは最小限で済み、初期読み込みが早く、Blazor WebAssembly は、初期読み込み時に必要なリソースを全て読み込むため、初期表示が遅くなります。

但し、一度読み込んだ後は、Blazor WebAssembly の方が、サーバからリソースの取得の取得を行わないため、高速に動作します。


### 3. Internet Explorer 11 をサポートする必要があるか？ 

#### Blazor WebAssembly はサポートしていません

#### Blazor Server は IE 11 をサポートしています


"Microsoft Internet Explorer" (11バージョン) をサポートしているか？もお客様の状況によっては重要なポイントかもしれません。

但し、IE 11 は非常にレガシーなブラウザなので、"Blazor の採用タイミングで IE11 から脱却する" 提案をおすすめします。 

https://docs.microsoft.com/ja-jp/aspnet/core/blazor/supported-platforms?view=aspnetcore-3.1



### 4. シンクライアント対応にしたいか？

#### Blazor WebAssembly はシンクライアントに非対応です

#### Blazor Server に シンクライアントに対応しています

Blazor Server はシンクライアントをサポートしてます。Blazor WebAssembly がサポートされていないブラウザーや、リソースが制限されたデバイスでも動作します。


### 5. オフラインで動作させたいタイミングがあるか？

#### Blazor WebAssembly はオフラインでも動作できます

#### Blazor Server は オフラインでは動作できません

Blazor WebAssembly は PWA（Progressive Web Apps）に対応しており、オフラインで動作することが出来ます。

例えば、インターネット環境がない (閉じたネットワークで作業) 環境で一時的に作業し、インターネット環境に繋いだ時に、作業内容を一括で登録するような場面でご活用頂けます。



## 開発全般に関するご相談はお任せください！

インフラジスティックス・ジャパンでは、各プラットフォームの特別技術トレーニングの提供や、開発全般のご支援を行っています。

「古い技術やサポート終了のプラットフォームから脱却する必要があるが、その移行先のプラットフォームやフレームワークの検討が進まない、知見がない」

「新しい開発テクノロジーを採用したいが、自社内にエキスパートがいない。日本語リソースも少ないし、開発を進められるか不安」

「自社のメンバーで開発を進めたいが、これまで開発フェーズを外部ベンダーに頼ってきたため、ツールや技術に対する理解が乏しい」

「UIを刷新したい。UIデザインやUI/UXに関する検討の進め方が分からない。外部のデザイン会社に頼むと、開発が難しくなるのではないか、危惧している」

といったご相談を承っています。

### お問い合わせはこちらから

お問い合わせフォームをご用意しております。ぜひお気軽にご連絡ください。

https://jp.infragistics.com/about-us/contact-us
contributionsが100を超えたので、作業メモ/備忘録/まとめ系記事のテンプレートを整備してみる

# はじめに
## 概要
* 自分はQiitaで作業メモ/備忘録/まとめ系の記事を書くことが多いです。
* ほぼ自分専用のつもりで記事を書いていました。
    * いつの間にかContributionsが100を超えていたのをきっかけに、Qiitaに残す以上は人から見られることも意識するべきとおもい、テンプレを作ろうと思いました。
        * ちなみに、自分の記事は1記事あたり2-5 LGTMレベルで記事の質は高くないですｗ
* プログラムは1ヶ月前に書いた自分のコードは人のコードになると言いますが、記事も同じで、1ヶ月前の自分の記事は意外と読みにくいものです。
    * 備忘録といえどもテンプレートを整備して、時間が経って読み返しても読みやすいような記事になりやすいように、テンプレートを整理してみました。


## 対象読者
* Qiitaの記事の構造に迷っている方
* 備忘録、自分用のメモをよく残す方

## 関連記事
* [Qiitaで良い記事を書く技術](https://qiita.com/t12u/items/8c28484100dfd3a6351b)
* [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)

## スタート(前提条件)
* 基本的になし。Qiitaのアカウントを持っていることぐらいです

## ゴール(達成できること)
* 備忘録系の記事の構造が少し良くなるかもしれません

## スコープ外(ふれないもの)
* 日本語的なわかりやすさ、てにおは、文章構造などの改善には触れません

## 開発環境
* OS/ブラウザには依存しません

---

# 本編
## 全体像/結論
* 自分の約50の記事を読み返して、構造化したところ後述のテンプレートに落ち着きました
    * 個人的には、トップレベルを「はじめに」「本編」「補足」とするのが収まりがよくなりました。
* 本稿の記事は、このテンプレートに従っています

## 本稿で使われているテンプレート
* コピペ用にテンプレートとその項目で何を書くかの箇条書きをセットにしています

### テンプレート

``` .md

# はじめに
## 概要
* 全体像/結論/TL;DR/概要相当
* きっかけ/モチベーション/何がしたいのか

## 対象読者
* どんな人に役に立つのか

## 関連記事
* 自身の兄弟記事
* 参考文献の先行記事

## スタート(前提条件)
* 本稿の内容を実施する前にしておくこと

## ゴール(達成できること)
* これを読むと何を達成できるのか

## スコープ外(ふれないもの)
* 対象外とするもの

## 開発環境
* OS/ツール/サービスのバージョンなど(再現できるように)

---

# 本編
## 全体像/結論
* 全体をを先に伝えてわかりやすくする

<!-- 必要な分繰り返し ここから -->
## ○○
* step/partなど大分類別に記載　構造化して書く

### イメージ
* スクリーンショットやイメージ図を書く

<!-- 必要な分繰り返し ここまで -->

## 所感
* 思ったこと、考えたこと

---

# 補足
## 備考
* 注意事項やうまくいかなかったことなど書く
 
## 参考文献
*  公式URLや外部記事

## 追記
* yyyy/mm/dd 追記した情報を記載

```

## 強調したい部分の工夫
Qiitaではhtmlも一部使えるため、下記のような強調を入れることも良いかと思います。

* <font color='red'>赤文字</font>
* <b>太文字</b>
* <ins>アンダーバー</ins>

### テンプレート

``` html
<font color='red'>重要な部分には赤文字を</font>。
<b>重要な部分は太文字に</b>。
<ins>アンダーバー</ins>
```

## 所感
* 記事の構造もですが、日本的なわかりやすさなどにも気を配らないとだめですね(当たり前ですがw)
    * 他の方の記事を読むと、難しい漢字は"ひらく"(漢字ではなくひらがなにする)べきなどもあり勉強になりました

---

# 補足
## 備考
* 伝える記事の内容によって、構造が変わるのは自然かと思います
    * 使えそうな部分をご自身のスタイルに合わせてカスタマイズして取り入れて貰えれば幸いです
 
## 参考文献
*  公式：[良い記事を書くためのガイドライン公式](https://help.qiita.com/ja/articles/qiita-article-guideline)

## 追記
* 2020/10/30 初稿
[Rails]HerokuでCloudFrontでWebフォントを読み込むための設定

# はじめに
Railsアプリを作っていてクラウドフロントに静的ファイルを配置して高速化することができます。
ただWebフォントのファイルなどはCORS(オリジン間リソース共有、 Cross-Origin Resource Sharing)の問題のため適切に設定しないとWebフォントが読み込めません。
`config.action_controller.asset_host = 'https://d1adsfkajflajflj.cloudfront.net'` 

過去の記事を参照すると、CloudFrontのEdit画面で隠れていて見つけにくかったので、記録を残しておきます。


# AWS Console
結論,公式ドキュメントにもWebの記事にもしっかり書いてあるのですが、`Use Leagacy cache settings` の項目を洗濯するとWhitelist Headersを設定することができました。
Whitelist Headersの項目で`AllowedOrigin `をAddして保存します。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/no-access-control-allow-origin-error/
![スクリーンショット 2020-10-30 14.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/814/e312992f-e9a4-d48f-3f1d-40479e9ae139.png)

※ キャッシュが聞いているので,本番サーバなどで試している場合はAssetsのfont使っているところなどを再度precompileして新しいファイル名にします。

## 参考記事
Cloudfront CachedオブジェクトにAccess-Control-Allow-Originを設定する 
http://www.366service.com/jp/qa/e9d300384bb16161a2f010337ac5128f

S3+CloudFrontでWebフォントを利用する（FireFox対応） - Qiita 
https://qiita.com/Oakbow/items/dae3d383d87d7d0c6344

CloudFront の「No 'Access-Control-Allow-Origin' header is present」エラーを解決する 
https://aws.amazon.com/jp/premiumsupport/knowledge-center/no-access-control-allow-origin-error/
【Windows10】WSLでRubyを実行するまで


* 以下を実行。それぞれ何してるかは割愛します。

```
sudo apt-get update
sudo apt install git
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
sudo apt install build-essential
sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev
rbenv install --list
rbenv install 2.7.2
```
TypeScriptの列挙型の値

TypeScriptの勉強をしようと[TypeScript: Handbook](https://www.typescriptlang.org/docs/handbook/basic-types.html)を見ながらいろいろ試していてハマりそうだなと思ったのでメモ。

# 列挙型

以下のような形式のデータ型を列挙型と呼ぶ。

```
enum Meta {
  Hoge,
  Fuga,
  Foo
}
```

# メンバーの番号付け

列挙型の値を`console.log`で出力してみると、0から始まる番号であることがわかる。

```
enum Meta {
  Hoge,
  Fuga,
  Foo
}

console.log(Meta.Hoge); // 0
console.log(Meta.Fuga); // 1
console.log(Meta.Foo);  // 2
```

この番号は手動で設定することも可能である。

```
enum Meta {
  Hoge = 10,
  Fuga = 20,
  Foo  = 30
}

console.log(Meta.Hoge); // 10
console.log(Meta.Fuga); // 20
console.log(Meta.Foo);  // 30
```

# 途中だけ番号を付けると…？

上記の挙動を見ていながらふと思ったのでさっくり試してみた。

## 1つ目だけ設定する

-> 2つ目以降は1つ目のインクリメントされた値になる。

```
enum Meta {
  Hoge = 10,
  Fuga,
  Foo
}

console.log(Meta.Hoge); // 10
console.log(Meta.Fuga); // 11
console.log(Meta.Foo);  // 12
```

## 途中だけ設定する

-> 1つ目は0から、設定された値以降はインクリメントされた値になる。

```
enum Meta {
  Hoge,
  Fuga = 20,
  Foo
}

console.log(Meta.Hoge); // 0
console.log(Meta.Fuga); // 20
console.log(Meta.Foo);  // 21
```

## 最後だけ設定する

-> 1つ目は0から、最後の値は設定した値になる。

```
enum Meta {
  Hoge,
  Fuga,
  Foo = 30
}

console.log(Meta.Hoge); // 0
console.log(Meta.Fuga); // 1
console.log(Meta.Foo);  // 30
```

## 一部分を欠落させて設定する

-> 設定した値からインクリメントしていき、次の設定された値でインクリメントはリセットされる。

```
enum Meta {
  Hoge = 10,
  Fuga,
  Foo  = 30
}

console.log(Meta.Hoge); // 10
console.log(Meta.Fuga); // 11
console.log(Meta.Foo);  // 30
```

## インクリメントされうる値を手動で

以下のようにコードを記述しました。 

```
enum Meta {
  Hoge = 10,
  Fuga, 　　  // 本来11になるはずだけどFooで設定済み
  Foo  = 11
}
```

さてここで問題、Meta.Fugaの値はどうなるでしょう？
答えは以下。

```
console.log(Meta.Hoge); // 10
console.log(Meta.Fuga); // 11
console.log(Meta.Foo);  // 11
```

FugaとFooが一致していまいました。
そんなわけあるまいと比較した結果が以下です。

```
console.log(Meta.Fuga === Meta.Foo); // true
```

# まとめ

以上により、TypeScriptを書く際は以下を気を付けたいと思います。

- 頻繁に変更が加えられるような箇所で数値の手動設定は危険
    - 手動設定する場合はかなり神経質に実施する
    - 可能なら手動設定がいらない方式とする
[ETロボコン] 次のコンテストに向けて技術的備忘録その２(アーキテクチャ編)

# はじめに
[前回の続き](https://qiita.com/Haaamaaaaa/items/68e59b8e6dc4d092c701)です．今回はアーキテクチャの設計意図を残せればなと思ってまとめます．
図がビミョーな感じもしますが，次に向けて改善もしてく予定なので優しいコメント待ってます．

## アーキテクチャ全体設計

トシキングのアーキテクチャ全体をパッケージ図で示すとこうなります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/e8da2bd3-e81a-a74e-7265-5a10ad2c7903.png", width=50%>

それぞれの責務として


|パッケージ  |責務  |
|---|---|
|Ev3StateMnager  |走行体の3状態：ゲーム前・ゲーム中・ゲーム終了を管理する  |
|GameStateManager  |コンテスト内の3競技：走行競技・ブロックビンゴ競技・ガレージ競技を管理する|
|BehaviorModel  |競技を攻略するのに必要な動作モデルを定義してGameStateManagerから指定できるようにする  |
|DeterminationModel  |競技を攻略するのに必要な判定モデルを定義してGameStateManagerから指定できるようにする  |
|Ev3DeviceDriver  |ev3apiを使用して，センサやモータからのI/Oを処理する  |

となりました．
次に詳細設計と分け方の意図を一緒に説明していきます．

## アーキテクチャ詳細設計
図全体を載せたら文字かつぶれて見えなくなってしまったのでシステムへの要求パッケージとEV3への要求パッケージに分けます[^omoi]

[^omoi]: Qiitaさんベクタ画像対応してなかった・・・

まず```Ev3StateMnager・GameStateManager```パッケージは，システムへの要求を実現するために作っています．なので，例えばコンテストの機体がEV3から他のものに変わってもEv3StateManagerを変更すれば他への影響は出にくいと考えています。また，```GameStateManager```も同様に競技の内容が変わったとしても，新たに```TemplateGameState```を継承して作ればうまく機能すると考えています．ただし，実装をしているうちに動作と判別モデルをまとめた```RunSectionParam```構造体については，```GameStateManager```にいるのはふさわしくないため，別途新しいパッケージが必要です．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/f82f6fe9-f9ca-43c8-83c8-784900551607.png">

振る舞いとしては，下の図のように```RunSectionParam```の配列を定義し空なら次の競技状態に遷移します．

![走行体のステートマシン図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/66a2de61-c53d-e85e-a8f2-1a9a3f51c30e.png)

次に，```BehaviorModel・DeterminationModel・Ev3DeviceDriver```パッケージでは，EV3への要求を実現するために作っています．```BehaviorModel・DeterminationModel```においては，システムからの要求単位が```RunSectionParam```構造体の単位なので，各モデルに```RunSectionParam```を引数とした```Interface```クラスを導入しました．これにより，```Template```から個々にモデルを作ることができ，かつ各モデルのテストも簡単に行うことができます．改善点としては，```Ev3DeviceDriver```にセンサとモータのI/O処理を押し込めたため，両モデルで使用されている```WheelDeviceDriver```が肥大化しているところです．また，新しいモデルを追加する際に，

- enum型のBehavior/DeterminationListに動作・判定を定義
- Templateを継承してモデルを定義
- Interfaceの条件に追加

と工程が多いため，この手間をなくせるような設計が作れたらなと思っています．

![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/9f0391d0-8383-8c31-91a8-a9cce051dd76.png)

実装は[GitHub](https://github.com/EniwaSentaiToshiking/2020-base)に上がってます．


# さいごに
UMLでクラス図を設計しながらコードを書いて実装していると理想の設計と現実の実装で阿鼻叫喚することが多いのでおすすめです．
まだまだ，UMLモデリングとプログラミングを紐づけて開発するのは難しいですが，案外楽しいのでこれからも続けていこうかと
個人的には，実装で詰まったときは大体設計のせいで，設計で詰まったときは大体アルゴリズムを理解できてないときだとこの頃感じてます．
あと多重度は慣れてないから許して・・・
ちなみに何度も繰り返して学んでいくのは計算論的思考らしいので，UMLモデリングとプログラミングの中から見つけていきたいなぁ
【Rails】link_toメソッドの文字列の表示を省略させる方法

#環境
macOS 10.15.5
Rails 5.2.4.2
Docker 19.03.12

#link_toメソッドの文字列の表示を省略させる方法
こちらの画像をご覧ください。投稿一覧画面に表示された投稿の本文ですが本文全てがそのまま一覧画面にも表示されてしまっているため、このようにすごく見栄えが悪くなってしまっています。
![スクリーンショット 2020-10-30 14.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/a058c7af-0710-74bb-ad6e-41057a63d563.png)

これを以下のようにスッキリさせます。
![スクリーンショット 2020-10-30 14.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/68b88687-c941-af2c-491d-6fd3d4895744.png)

##truncateメソッドを使う
省略する前のコードが下記になります。

```html:index.html.erb
<%= link_to(post.content, "/posts/#{post.id}") %>
```
このコードに```truncateメソッド```を書き加えます。

```html:index.html.erb
<%= link_to post.content.truncate(40), "/posts/#{post.id}" %>
```
このように書き換えることでlink_toメソッドの文字列の表示を省略させることができます！この(40)は何文字に達したときに「...」表示に切り替えるかという意味になります^_^
【HTTP】ヘッダー名は大文字小文字を区別しない！｜すずとも初耳学#2

# すずとも初耳学とは
すずともが、プログラミングをするにあたって

- 知らなかったこと
- これ便利だなぁーって思ったこと
- 覚えておきたいこと

などを、「すずとも初耳学」としていろいろ記事書けたらなーと思います。
自分が驚いたことはきっと他の人も驚く(んじゃないかなぁ)っていうスタンスです。

# HTTP ヘッダー名は大文字小文字を区別しない！

これ以上も、これ以下もありません(o^―^o)

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers
によると、

>HTTP ヘッダーは、大文字小文字を区別しないヘッダー名とそれに続くコロン (:)、 値で構成されます。値の前にあるホワイトスペースは無視されます。

って書いてありますね。

なので、
`Content-Type`も
`content-type`も
`CONTENT-TYPE`も
`cONTENT-tYPE`も
`CoNtEnT-TyPe`もいいってことになります。

多分。
【Swift 】Segmented Controlを使おう

UISegmentedControlの使い方を調べたので記事にしました。

|実装環境|バージョン|
|:--|:--|
|Swift|5|
|Xcode|12.0|

##Segmented Controlとは

Segmented Controlを直訳すると、
<b>部分に分かれた制御装置（コントロール）</b>

Apple公式ドキュメントを見てみましょう！
![スクリーンショット 2020-10-30 13.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/d00154b9-f582-8a6a-97b0-5b74df825248.png)
>とても簡潔に意訳すると、
<b>水平に操作できる複数置かれた個別のボタン</b>です。



##簡単に使ってみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/2c873bd6-6718-560d-9e5c-06ea9f496578.png)![スクリーンショット 2020-10-30 13.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/39764f06-e835-61bb-4f43-4c051344fbf2.png)

Segmented ControlのAttributes Inspectorを選択、

<code>Selected Tint</code>でボタン選択時の色を設定
<code>Segments</code>でボタンの数を設定
<code>Title</code>でボタンのタイトルを設定

##選択されたボタンのタイトルを取得する
```swift:
 @IBAction func segmentedControl(_ sender: UISegmentedControl) {
        print(sender.titleForSegment(at: sender.selectedSegmentIndex)!)
    }
```

##viewload時に選択されているボタンを変えたい時
```swift:
class ViewController: UIViewController {
    
    @IBOutlet weak var segmentedControl: UISegmentedControl!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        segmentedControl.selectedSegmentIndex = 1
    }
```
SegmentIndexは左から０、１、２、、、で増えていきます。
今回は、
<code> segmentedControl.selectedSegmentIndex = 1</code>
で、<code>1</code>を代入しているので起動後はこんな感じに表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678954/5ad422dd-89af-0228-a200-e15bd55b5e98.png)
<hr>

Segmented controlは文字ではなくてもimageでも設定できるみたいなので興味があれば試してみてください。

参考：<a href="https://developer.apple.com/documentation/uikit/uisegmentedcontrol">Apple公式ドキュメント(UISegmentedControl)</a>
python簡易Webサーバーをdockerコンテナー構築

## Base Docker Image
今回は、「centos/sysctct」 imageをBaseにした。

#### 1. docker images 確認
```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos/systemd      latest              05d3c1e2d0c1        7 weeks ago         202MB
```
#### 2. docker images 起動
```
$ docker run -d 05d3c1e2d0c
0bdf202c5dcbad38df131860681ca5aa604b46ded37837b3a6c18f56665a6871
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0bdf202c5dcb        05d3c1e2d0c1        "/usr/sbin/init"    8 seconds ago       Up 7 seconds                            sleepy_tu
```
#### 3. コンテナへログイン

```
$ docker exec -it 0bdf202c5dcb bash
[root@0bdf202c5dcb /]#
```

#### 4. 各種設定等

確認

```
[root@0bdf202c5dcb ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

[root@0bdf202c5dcb ~]# uname -a
Linux 0bdf202c5dcb 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```
Draw.ioで作成した図をPowerPointにコピペする

## TL;DR

こちらの記事 「[Draw.ioで作成した図をWordに挿入する](https://qiita.com/jumd/items/f3011816a7d54fa29b62)」 の補足版。
前回にうまくやれたにもかかわらず２回目に同じことをしようとして沼にハマったので、自分用のメモでもあります。

:::note warn
ゴールはPowerPointへコピー＆ペーストではありますが、途中過程で **Wordが必要** です。ご注意ください。
:::


## 目的とゴール

プレゼン用資料作成などでPowerPoint（パワポ）にdraw.ioで設計した図などを転載する場合は多いと思います。
画像としてキャプチャをコピペしてもよいのですが、文言や微妙な位置修正などする場合、パワポでいじれるオブジェクトにしたいと思いますが、単純にコピー＆ペーストしてもうまく行きません。

ここでは以下、パワポでいじれるオブジェクトにするやり方を解説します。Macで確認しましたが Windows は時間があったら確認してみますのでまずはご容赦を。


サンプルとして次のような図を用いてみました（A4サイズ）。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98745/35ca5354-66f0-bfde-5993-09e2e9ca3ba3.png" width="480">

## 手順

[元記事](https://qiita.com/jumd/items/f3011816a7d54fa29b62)では、SVGにしたあと、inkspaceを使ってemfへ変換していたが、現在はSVGから加工ができる。[^aboutversion]

 1. draw.io で SVG でエクスポート
 2. Word でその SVG を埋め込む
 3. Word 上で「グループ解除」する
 4. PowerPoint へコピー＆ペーストする

[^aboutversion]: Word for Mac/PowerPoint for Mac バージョン16.42(20101102) で確認


### 1. draw.io で SVG でエクスポート

draw.io の File メニューから ”Export as" で SVG出力する。オプションは特に指定しなくて大丈夫。
注意点として、[Exportの前に次のことをやっていると日本語で体裁が崩れない](https://qiita.com/jumd/items/f3011816a7d54fa29b62#drawio-%E3%81%A7%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%A8%E4%B8%8A%E6%89%8B%E3%81%8F%E5%A4%89%E6%8F%9B%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)。

- プロパティのtext のFormatted Text optionのチェックを外す（全部選択してから一括で外せる）
- プロパティのtext のWord Wrap optionのチェックを外す（デフォルトでOFFにはなっている）

<table>
<tr><th>Fomrmatted Text<br>チェックON</th><th>Fomrmatted Text<br>チェックOFF</th></tr>
<td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98745/ac320f2c-c425-ff40-afc8-7428ea404fb7.png" width="160"></td><td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98745/2f0d7d4c-8216-d946-6ec3-e4cd13da65d2.png" width="144"></td>
</table>

### 2. Word でその SVG を埋め込む

Wordを立ち上げる。
適当な新規ドキュメントで良いので、1で出力したものを「挿入」→「写真」→「図をファイルから挿入」で埋め込こむ。
（ここはパワポでも同じことができますが、この次の工程がパワポではできないのです）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98745/c5f2827e-fdf6-9e53-b52e-0c1208315cdd.png" width="480">


### 3. Word 上で「グループ解除」する

2で挿入したSVG画像をコンテクストメニューから「グループ」→「グループ解除」する。

※これが肝！ パワポでも同じメニューが出ますが、ちゃんと処理してくれないのです！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98745/6018dd9f-1a18-9823-d933-77727e02b7b5.png" width="400">

### 4. PowerPoint へコピー＆ペーストする

グループ解除された画像は、Office上で扱えるオブジェクトとなる。
これらグループ画像を（まとめて）を PowerPoint へコピー＆ペーストする。
細かい体裁がととのえられていない所などを修正。

 - 何回かグループ解除をすると、全てばらけます。ただ、アイコンや矢印も分解されてしまうので、適宜再グループ化や（矢印とかの）置き換えが必要になるでしょう。
 - なお残念ながらアイコンのグラデーションなどはベタ塗りになってしまいます。
     - 結果的にアイコンを加工することになるとおもうので、公には用いるのは避けたほうがよいかもですね。
 - draw.io側でA4サイズに収まるように描いたとしても、ペーストすると少し大きくなってしまいます。

【編集イメージ】
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98745/333a84f4-f31b-a56c-d3bf-384c1563c7b3.png" width="480">


（以上）
フューチャーショップ→コマースクリエイター商品画像移行スクリプト

フューチャーショップ→コマースクリエイターへの移行時に商品画像は自分で取ってきてftpで登録する必要がある。このスクリプトは画像をダウンロードする部分。

1. 運用メニュー→商品管理→以前からのユーザー画面用→商品画像登録用ファイルをダウンロード(goodsImage_xxxxxxx.csv)。
2. 下記のシェルスクリプトに食わせる(Linux, Mac, Windows WSL)。
3. ディレクトリを含まない形でzipで圧縮→ftpでアップロード

```bash
#!/bin/bash

#
# フューチャーショップーの商品CSVからコマースクリエイター用画像を作る
#
# CSV: 運用メニュー→商品管理→以前からのユーザー画面用→商品画像登録用ファイルダウンロード
#



CSV=$1

if [ -z "${CSV}" ];then
    echo "usage:  $0 goodsImage_xxxxxxx.csv"
    exit
else
    mkdir -p dst
fi


while read line
do
    ID=`echo "${line}" | nkf | awk -F, '{print $1}'`
    IMG1=`echo "${line}" | nkf | grep "http" | awk -F, '{print $15}'`
    IMG2=`echo "${line}" | nkf | grep "http" | awk -F, '{print $16}'`
    IMG3=`echo "${line}" | nkf | grep "http" | awk -F, '{print $17}'`

    if [ -n "${IMG1}" ];then
        EXT=`echo "${IMG1}" | sed 's/^.*\.\([^\.]*\)$/\1/'`
        curl -so dst/${ID}-01.${EXT} ${IMG1}
        echo -n "."
    fi

    if [ -n "${IMG2}" ];then
        EXT=`echo "${IMG2}" | sed 's/^.*\.\([^\.]*\)$/\1/'`
        curl -so dst/${ID}-02.${EXT} ${IMG2}
        echo -n "."
    fi

    if [ -n "${IMG3}" ];then
        EXT=`echo "${IMG3}" | sed 's/^.*\.\([^\.]*\)$/\1/'`
        curl -so dst/${ID}-03.${EXT} ${IMG3}
        echo -n "."
    fi

    sleep 1

done < ${CSV}

echo "done"

```