OmniAICreator/Qiita-1.07M huggingface dataset:
複数のHTTP APIを効率的にコールしたい(springで)

##前提
* サイトのコンテンツをAPIから取得することを考える。サイトの1ページは複数のコンテンツから構成され、それぞれのコンテンツをAPIで取得する。
* springで開発する


##問題意識
何も考えずに実装すると、各APIを順次呼び出して全て材料が揃ってからレンダリング、ということになるが、この場合、各APIの処理時間(接続、API側処理、データ転送など)の合計+レンダリング時間がレスポンスタイムとなり、APIをコールすればコールするほどレスポンスが悪化することになる。

##改善案
###Spring Webのリアクティブ実装であるSpring WebFluxを一部使用する
[Spring WebFlux](https://spring.pleiades.io/spring-framework/docs/current/spring-framework-reference/web-reactive.html#webflux)は、リアクティブなサービスを開発するためのものであるが、その一部である[WebClient](https://spring.pleiades.io/spring-framework/docs/current/spring-framework-reference/web-reactive.html#webflux-client)を使用する。
WebClientはHTTP通信を非同期で行うことのできるクライアントで、今回のように、APIをコールして待っている時間の方が長い。。。という場合に有効と考えた。

##例

```java

package com.example.demo;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.reactive.function.client.WebClient;

import reactor.core.publisher.Mono;

@Controller
public class TestController {

	@GetMapping("/testAsync")
	public void testAsync(HttpServletResponse res) throws IOException {
		//HTTPアクセスを非同期的に実行する
		Mono<String> m1 = WebClient.create("http://127.0.0.1:8080/slow").get().retrieve().bodyToMono(String.class);
		Mono<String> m2 = WebClient.create("http://127.0.0.1:8080/slow").get().retrieve().bodyToMono(String.class);
		Mono<String> m3 = WebClient.create("http://127.0.0.1:8080/slow").get().retrieve().bodyToMono(String.class);
		Mono<String> m4 = WebClient.create("http://127.0.0.1:8080/slow").get().retrieve().bodyToMono(String.class);
		String s = Mono.zip(m1, m2, m3, m4).map(tuple4 -> {
			String t1 = tuple4.getT1();
			String t2 = tuple4.getT2();
			String t3 = tuple4.getT3();
			String t4 = tuple4.getT4();
			return t1+t2+t3+t4;
		}).block();//この時点で並列で実行される
		res.getWriter().print(s);
	}

	@GetMapping("/testSync")
	public void testSync(HttpServletResponse res) throws IOException {
		//HTTPアクセスを同期的に実行する
		String s1 = WebClient.create("http://127.0.0.1:8080/slow").get().retrieve().bodyToMono(String.class).block();
		String s2 = WebClient.create("http://127.0.0.1:8080/slow").get().retrieve().bodyToMono(String.class).block();
		String s3 = WebClient.create("http://127.0.0.1:8080/slow").get().retrieve().bodyToMono(String.class).block();
		String s4 = WebClient.create("http://127.0.0.1:8080/slow").get().retrieve().bodyToMono(String.class).block();
		res.getWriter().print(s1+s2+s3+s4);
	}

	@GetMapping("/slow")
	public void slowFunction(HttpServletResponse res) throws InterruptedException, IOException {
		//とても時間がかかる処理。。。
		Thread.sleep(2000);
		res.getWriter().print("slow...");
	}
}

```

上記で/testAsyncと/testSyncにアクセスしてレスポンスタイムを比べると、非同期でアクセスすることの利点がよくわかる。
ホスト再起動後、ブラウザに接続できず

### ホスト再起動後、ブラウザに接続できなくなった。

CentOS／7ー3でphpのアプリ作成中、いつもは表示されるはずの
ブラウザに接続できず、以下のエラー文が表示された。
「このサイトにアクセスできません　192.168.33.14 で接続が拒否されました。」

ホスト再起動時、firewalldが起動してしまい、接続を疎外していた。

### firewalldの状態確認

```
systemctl status firewalld.service
```

### firewalld の停止

```
systemctl stop firewalld.service
```


停止後、ブラウザへの接続可能になった。
サクッとdockerで試すときのコマンドたち

docker作り込んでるときは覚えてるだけど、久しぶりにhelperとかない環境でいつもググってしまうのでメモ。


```
docker pull golang # イメージ取得
docker run -itd golang # コンテナ起動
docker attach {コンテナID} # シェル的なもので接続
# 上のコマンドでREPL(対話環境)になってしまう場合(nodeのベースイメージなど)は、以下のコマンドでシェルを起動できる
docker exec -it {コンテナID} /bin/bash
docker stop {コンテナID} # コンテナ停止
```

コンテナ名はdocker run後に`docker ps`で取得可能
アドミニストレーター認定の準備: 設定とオブジェクト ⇒ ユーザ設定の練習

１．「ユーザの設定」セクションは、アドミニストレーター認定試験の何パーセントを占めていますか?
２．アドミニストレーター認定試験の「ユーザの設定」セクションの主なトピックはどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/bdbd84e9-1647-c28c-b163-9ee682f01fa7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/24aadbe2-e4f5-426b-9b91-104d338f1821.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/b5babd13-d8e3-dd65-2b30-1d22e10939fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/8ad29b8d-6630-c07f-3d6b-510917384525.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/f6efcaab-9aad-b63f-db38-5d61e984ea52.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/51526b93-663d-ac7f-8b4d-90d91735904b.png)
iPhone/iPadのLiDAR/ARKitで何ができるのか

## はじめに

AppleのiPad Pro(2020), iPhone12 Proに搭載されたLiDAR機能について調べる機会があったので記事としてまとめました。誤りなどあればご指摘お願いします。
※2021年4月中旬時点の情報となります。

## TL;DR

* 【前提】LiDARの機能を使うためにはARKitを使うことになる
* 機能は主に以下
  * 点群データの収集
      * 3次元座標データ(XYZ)と色情報(RGB)
      * 点群データをもとに空間の認識、可視化が可能
  * オブジェクトオクルージョン
      * オクルージョン：遮蔽を表現する手法

## LiDAR(Light Detection and Ranging)とは

* 物体との距離を測るセンサのこと
* ***物体に光を照射し反射して戻ってくるまでの時間で距離を計算する***dToF(Direct ToF)方式と反射した光の位相差から距離を求めるiToF(Indirect ToF)方式がある
  * iPhoneではdToF方式
* 事例としては車の自動運転技術や3Dの測量技術、森林や山など自然を把握するためなど様々な用途に使われている

## ARKitとは

* iOSデバイスのカメラ機能とモーション機能を統合し、Appやゲームの中で拡張現実体験を生み出すためのフレームワーク
* 2021年4月現在バージョン4.0
  * 3.5から一部LiDARが利用できるようになった
  * 4.0からLiDARで深度を測れるようになった
* 主な機能
  * 平面（水平、垂直）の検出
  * 3.5で***Scene Geometry***により壁、床、天井などを判別可能になった
  * LiDARで高速に検出可能
* ポジショントラッキング
  * どこにあるか、どこを向いているか
  * ★LiDARにより効果がありそうな部分
* モーションキャプチャ
  * 人の骨格を推定し、動きを認識
  * ★LiDARにより効果がありそうな部分
* オクルージョン
  * 遮蔽の判定（物の前後関係など）
  * ★LiDARにより効果がありそうな部分
* 現実空間のサイズ、距離の測定
  * 座標、明るさ、当たり判定など
* 環境マッピング
* 顔認識
* 2D画像認識
* etc

## LiDARが搭載されているApple端末？
iPad Pro 11インチ（第2世代）、iPad Pro 12.9インチ（第4世代）、iPhone 12 Pro、iPhone 12 Pro Max）
※ 参考URLの情報にもあるがiPad ProのLiDARのほうが性能がよいらしい。CPUも関係あるのか？


## 参考URL
* https://tech.aptpod.co.jp/entry/2020/12/22/100000
* https://ar-sync.com/blog/ipadpro-lidar.html
* https://gaprot.jp/2020/04/27/lidar-arkit3-5/
画像認識 OCRエンジン

近年、多くの会社が業務の省力化、高速化、生産性工場に貢献できる画像認識AI（人工知能）モデルを研究開発し、OCRなどの技術を活用ししていますが、OCRとは何でしょうか？今からご紹介していきます！
**[画像認識](https://kaopiz.com/ja-ai-image-recognition/)**とは、簡単に言うと、画像の中に何が映っているのか、コンピューターや機械などが認識する技術です。画像認識の技術は主に物体、顔、文字の認識ができます。文字認識が終わったら、ExcelやWord等で再利用できるように「元の文書と同じ形」での出力できるフォーマットに変換して出力することができます。
**[OCR](https://kaopiz.com/ja-news-ai-ocr-technology-introduction/)**はこれから、人間に変わって文字を読み取る効率的手段として、使用されることが多くなっていきますのですが、最近では、文書や伝票の電子化（ファイリング）が不可欠となってきています。柔軟で高精度の高いOCRなら、「データ入力」や「文書管理」など、様々な企業の活動でサポートできます。
OCR（Optical Character Recognition：光学文字認識）とは、画像の中から文字を見つけ出してデジタル化（文字データ化）するための技術です。 しかしながら、書類のフォーマット（文字の形、文字間隔、文字位置など）が固定されない場合、文字を認識できないケースがあるため、実用に適さない場合があります。
**OCRの活用事例**：
名刺管理：交換してきた名刺の情報を簡単に読み取り、一括管理するシステム
運転免許情報読取：行政機関向けの運転免許の情報をスキャンPDFから読み取り、DB化するシステム
採点システム：中学生試験レポートから生徒名、生徒番号などを読み取り、採点システムへ正確に取り込む機能
【Rails6】ルーティングのrootメソッドの疑問について調べた

※2022年から技術系の記事は[個人ブログ](https://yamaday0u.net/category/programmer/)に投稿しております。ぜひこちらもご覧ください→[yamaday0u Blog](https://yamaday0u.net/category/programmer/)

Railsを学習しているとルーティングのrootパスの書き方について疑問に思うことがあります。
いろいろな学習教材や技術ブログの記事を見ていると、以下のどちらかの書き方をしています。

```config/route.rb
root to:'pages#index'
root 'pages#index'
```

この`to:`があるのとないのとでは何か違いがあるのか。
Railsを学び始めてから半年間モヤモヤしていたので調べました！

## 結論：機能的な違いはない！
[Railsドキュメント](https://railsdoc.com/routes#root)で確かめてみると、rootパスの書き方は実は3つありました。

```config/route.rb
# 1
root controller: 'pages', action: 'index'

# 2
root to:'pages#index'

# 3
root 'pages#index'
```

上記はいずれもpagesコントローラのindexアクションをルートパスに指定する記述です。

`#1`はおそらく最も厳格な書き方（あるいはRailsの昔の書き方？）です。
`:controller`と`:action`でコントローラとアクションを明示的に指定します。

`#2`は`:to`を使って`#1`を短縮した形で指定します。

`#3`は`:to`すら省略してrootパスを指定します。

つまり、**`:to`の有無によってrootパスを指定するという機能について違いは生じない**ということですね！

## rootメソッドのオプション
Railsのrootメソッドには、パスを指定するオプションが以下のように2つあります。

|オプション|機能|
|:--|:--|
|:controller, :action|コントローラとアクションを指定。必ずセットで指定|
|:to|:controllerと:actionの短縮形。#でコントローラとアクションを区切る|

先述の通り、`:to`オプションすら省略できてしまうので、記述量を減らすことに重点を置いているなら`#3`の書き方を採用すると良さそうですね。

## 参考資料
[Railsドキュメント　ルーティング(routes)](https://railsdoc.com/routes#root)
mglearn citibike datasetを使ってみる

mglearn citibikeというデータセットがある。

https://github.com/amueller/mglearn/blob/master/data/citibike.csv

scikit-learnからロードできる。。

<pre>
import mglearn
citibike = mglearn.datasets.load_citibike()
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

plt.figure(figsize=(24, 8), dpi=50)
xticks = pd.date_range(start=citibike.index.min(), end=citibike.index.max(),
                       freq='D')
plt.xticks(xticks, xticks.strftime("%a %m-%d"), rotation=90, ha="left")
plt.plot(citibike, linewidth=1)
plt.xlabel("Date")
plt.ylabel("Rentals")
</pre>

![ダウンロード (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163445/3284e280-f5ef-e4da-8134-0cc782b91638.png)

ついでに、季節変動を取り除いてみる。。

<pre>
import statsmodels.api as sm
res = sm.tsa.seasonal_decompose(citibike, freq=7)

plt.rcParams["figure.figsize"] = (14, 6)
plt.figure(figsize=(24, 8), dpi=50)
res.plot()
</pre>

![ダウンロード (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163445/c10e58b4-8138-0670-ceb0-625b294eb152.png)

https://github.com/RuoAndo/time-series-analysis-with-Python/blob/master/andreas/4.ipynb
Blender 3Dモデルの取り込み　

Rigging/Rigifyにチェックを入れる
![FC3FEF6C-2961-46F3-A165-1ADD2205FDE3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/138a69c0-0d3e-5f1b-18ea-882c4774cc47.jpeg)

Shift + S でワールド原点を選択する
![0F1BE3F9-AB9B-497D-9128-1866BB447B0B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/f6ca2b67-8143-7eee-d81c-e63aa2432dd0.jpeg)

Shift + A でアーマチェアのHumanを選択する
![5E702D6E-D70B-4F2C-8206-58F61A6C9F19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/0eafc9b4-e0ec-22a7-cf7c-17ad8c7cf05e.jpeg)

編集モードに切り替え、ボーンとモデルを合わせる
![3F3505AC-E05B-418C-B57A-86A821D808D6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/e5910be9-f7e8-4788-2e05-e232e88059e7.jpeg)

モデルを選択し、上部の透明アイコンを押す
![AADA9249-D678-428B-82A1-1C08B1F74BDC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/d1f6c5b4-bc1d-8448-e452-6f1105346c7b.jpeg)

ボーンとモデルをShift + クリックで選択し、自動のウェイトでを選択する
![CBC25AB8-80BC-4B80-93F8-D24961D3414C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/5d5f05fe-b61e-46d3-9254-d4f277c7eb1e.jpeg)

ファイルからFBXを選択し、ダウンロードする
![42BD7338-CFBD-45A8-9EEE-79E46895F3C2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/bcb611bb-0870-1c31-d577-fbceb48c04bb.jpeg)

ダウンロードにファイルが作成される
![F5680D9C-DF60-433F-A414-C142654152C7_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/9fb4c756-f438-3bc1-b09b-be9eb906ff3b.jpeg)

fbxをunityのprojectにドラッグすると追加できる
![B08CD47C-CBA0-4408-8318-08F56A0B429E_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/240dcf58-ab7f-663b-3fa4-0b582e018a43.jpeg)

モデルのRig→Humanoidに切り替え、Applyを押す
![C2EF4BC8-5F3D-4692-A6A6-E44CA1B1011A_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/b1c8af6e-1dc0-6a9a-472a-715e8fa70628.jpeg)

ヒエラルキーにモデルを作成し、cameraは表示を消しておく
![CF017663-D883-4D01-821D-BCC8F0259813_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/e5b0056b-55e4-7db4-ea8f-6080b65c755e.jpeg)

AnimatorCOntrollerを作成し、オブジェクトのCOntrollerにアタッチする
![6FFE831B-48B1-4377-B14D-488BE2261F3D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/5b281e2d-7ae2-0178-16c5-58e8670fcc70.jpeg)

AnimatorでEmptyを選択し作成する
![029A7158-5BF7-43D6-9ADA-8A155B79D5B4_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/9af35b6f-4177-ba46-888c-72a379563940.jpeg)

（アセットストアからアニメーション用のモデルをインポートした際にエラーが出たらApi部分を.Net4xに変更すると消える）
![BCBC3CCC-D2A6-42C9-BE3D-8B688C2D8795.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/5dbeb3ff-bf44-9c40-6152-b29f222fd7de.jpeg)

アニメーションのモーション部分にAnimationCripをアタッチする
![9E980221-A023-42D4-9936-22388473E1FD.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/d49a2af8-0a8d-fa12-34eb-9ba54bb02177.jpeg)
soxコマンド覚書き

使おうとする度に忘れて調べているので、自分の為に載せておきます。

#### オーディオ情報の表示
soxiコマンドを使う

```
% soxi input.mp3

Input File     : 'input.mp3'
Channels       : 1
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:09:02.33 = 23916797 samples = 40674.8 CDDA sectors
File Size      : 21.7M
Bit Rate       : 320k
Sample Encoding: MPEG audio (layer I, II or III)
```

#### オーディオ形式の変換
拡張子で指定すればOK

```
% sox input.wav output.flac
```

#### チャンネル数やサンプリングレートの変換
モノラル、16kHzにする場合

```
% sox input.flac output.flac channels 1 rate 16k
```

#### 音量調整
音量をいい塩梅にしてくれる

```
% sox input.flac output.flac norm
```
オーバーライド

# オーバーライド
親クラスにあるメソッドと同じメソッドを子クラスで定義すると、メソッドを上乗せすることができます。
これを「`オーバーライド`」と呼びます。
オーバーライドをすることで、子クラスのインスタンスは親クラスのメソッドではなく、子クラスで定義したメソッドを呼び出すようになります。

```py:script.py
from fruit import Fruit

fruit1 = Fruit('りんご', 200)
fruit1.weight = 100

print(fruit1.info())
```
```py:fruit_price.py
class FruitPrice:
    def __init__(self, name, price):
        self.name = name
        self.price = price
   
    def info(self):
        return self.name + 'は' + str(self.price) + '円です'
```
```py:fruit.py
from fruit_price import FruitPrice

class Fruit(FruitPrice):
    def info(self):
        return self.name + 'は' + str(self.price) + '円で' + str(self.weight) + 'gです'
```
```text:出力結果
りんごは200円で100gです
```
上記のように、子クラスのインスタンスは子クラスで定義したメソッドを優先して呼び出すようになっています。
なので、親クラスである`FruitPrice`の`info`メソッドではなく、子クラスである`Fruit`の`info`メソッドが呼び出されました。
よって、親クラスと子クラスで同名のメソッドがある場合は、メソッドが上乗せされます。

###同様に\_\_init\_\_もオーバーライドすることができる
```py:script.py
from fruit import Fruit

fruit1 = Fruit('りんご', 200, 100)
# fruit1.weight = 100 この行を削除し、Fruitの引数に追加

print(fruit1.info())
```
```py:fruit_price.py
class FruitPrice:
    def __init__(self, name, price):
        self.name = name
        self.price = price
   
    def info(self):
        return self.name + 'は' + str(self.price) + '円です'
```
```py:fruit.py
from fruit_price import FruitPrice

class Fruit(FruitPrice):
    def __init__(self, name, price, weight):   # 子クラスに__init__メソッドを定義
        self.name = name
        self.price = price
        self.weight = weight   # weightが自動で追加されるように記述を追加

    def info(self):
        return self.name + 'は' + str(self.price) + '円で' + str(self.weight) + 'gです'
```
```text:出力結果
りんごは200円で100gです
```
上記のように記述することで、\_\_init\_\_もオーバーライドすることができました。
しかし現状だと\_\_init\_\_メソッド内の`self.name = name`と`self.price = price`が重複してしまっています。そこで、重複している部分をまとめるために「**`super()`**」を用います。

### super()
オーバーライドしたメソッドの中で`super()`を用いることで、親クラスを呼び出すことができます。
「`super().メソッド名()`」と記述することで親クラス内に定義されたインスタンスメソッドをそのままそのまま利用することができます。

```py:script.py
from fruit import Fruit

fruit1 = Fruit('りんご', 200, 100)

print(fruit1.info())
```
```py:fruit_price.py
class FruitPrice:
    def __init__(self, name, price):
        self.name = name
        self.price = price
   
    def info(self):
        return self.name + 'は' + str(self.price) + '円です'
```
```py:fruit.py
from fruit_price import FruitPrice

class Fruit(FruitPrice):
    def __init__(self, name, price, weight):
      # self.name = name   
      # self.price = price
        super().__init__(name, price)   # 重複しているため、上２行を削除し、super()を用いてまとめた
        self.weight = weight 

    def info(self):
        return self.name + 'は' + str(self.price) + '円で' + str(self.weight) + 'gです'
```
```text:出力結果
りんごは200円で100gです
```
上記のように記述することで、重複していた記述をまとめることができました。
よって、「`super().__init__(name, price)`」は、下記の親クラスの\_\_init\_\_メソッドを利用していることがわかりました。

```py:fruit_price.py
def __init__(self, name, price):
    self.name = name
    self.price = price
```
styled-componetsのメディアクエリ共通化

styled-componentsのメディアクエリ共通化方法を探していましたが、どれも自分にはしっくりこなかったので自作しました。

## styled-componentsのメディアクエリ共通化の選択肢（しっくりこなかったやつ）
* react-responsive
* styled-media-query

## styled-componentsのメディアクエリ定数を自作
以下の記事を参考に定数を自作しました。

https://dev.to/cagatayunal/how-to-use-css-media-query-breakpoint-in-styled-components-9of


```ts
// src/styles/const/size
const mediaDeclaration = "@media screen and";
const breakPoint = {
  sm: 480,
  md: 768,
  lg: 1024,
};
export const mediaQuery = {
  xs: `${mediaDeclaration} (min-width: ${breakPoint.sm}px)`,
  sm: `${mediaDeclaration} (min-width: ${breakPoint.md}px)`,
  lg: `${mediaDeclaration} (min-width: ${breakPoint.lg}px)`,
};
```

```ts
// src/components/atoms/Button
import styled from "styled-components"
import { mediaQuery } from "../../styles/const/size"

//jsx省略

//style
const Button = styled.button`
  background-color: black;
  ${mediaQuery.lg} {
    background-color: blue;
  }
`;
[Rails6]Formオブジェクト＋複数タグ機能での更新を実装

# はじめに
タグ機能実装中に、Formオブジェクトが絡んだタグの更新にとても苦戦したことと、しっくりくる記事が少なかったこともあったので執筆します。完全自作かつ非効率な実装方法かもしれませんがどうぞお付き合いください。
なお、もっとこうしたら簡単だよ！みたいなコメントをくださると嬉しいです。

#タグの更新で苦戦した部分
まず、今回苦戦したポイントとして、「**Formオブジェクトはレコードとしては存在していない**」というところです（あと、複数タグという点）。通常、なにかしらの更新をする際にはfindメソッドあるいはfind_byメソッドをつかって、欲しいデータを持ってくることができたはずです。
Formオブジェクト（例：item_address.rb）は実際にレコードがあるわけではないので、以下のようにはできません。

```ruby
@item_address=ItemAdress.find(id:params[:id])
```

#解決策
じゃあ、どうすればいいのか。
答えは、newメソッドを使います。「レコードとして存在しない」は言い換えれば「指定する必要もない」ということで持ってくる必要はないので、だったらそのときに作ればよくね？って話です。
（ここまで意味が不明だと思いますが、お付き合いください）

Formオブジェクトについてしっかりとした理解があれば、以下のコードを見れば理解できると思います。


```tweets_contoroller.rb
  def edit
    @tweets_tag=TweetAddress.new(title:@tweet.title,content:@tweet.content)
  end
  
```

まずはeditアクションに着目してみましょう。たしかに、newメソッドを使用しています。でも、これでしっかり欲しいデータが詰まったインスタンスが生成されます。実はFormオブジェクト自体はnewで作成されますが、Formオブジェクトの中身には、@tweetというbefore_actionでparams[:id]からfindメソッドで指定したインスタンスがデータとして入っているので、結果として指定したいFormオブジェクトが出来上がっているわけです。

あとは、@tweets_tagを使えば編集ページは表現できます。


# updateアクションの実装

引き続いて、編集ページで新たにタグが入力されたとします。そのとき、updateアクションはどのように記載すべきでしょうか。

これについては、コードを見た方が早いので以下を見てください。

```tweets_controller.rb
#省略

def update
    @tweets_tag=TweetsTag.new(update_params)
    tag_list=params[:tweets_tag][:name].split(",")
    
    if @tweets_tag.valid?
      @tweets_tag.update(tag_list)
      redirect_to tweet_path(@tweet)
    else
      render :edit
    end
  end
```

```tweets_tag.rb
#省略

 def update(tag_list)
    
  
    #tweetの更新
    @tweet = Tweet.where(id: tweet_id)
    tweet = @tweet.update(title: title,content: content)
    @old_relations=TweetTagRelation.where(practice_id:practice_id)
    #この時点で一旦中間テーブルのデータ消す
    @old_relations.each do |relation|
      relation.delete
    end  
    
    #tagの更新
    tag_list.each do |tag_name|
      @ptag = Tag.where(name: Tag_name).first_or_initialize
      @Tag.save
      #再度1個づつ中間テーブルへ登録
      new_relation=TweetTagRelation.new(tweet_id:tweet_id,ptag_id:@tag.id)
      new_relation.save
    end
 end  
```

ここでも、editアクション同様にnewメソッドとストロングパラメータを使って、インスタンスを持ってきていますね。
updateでのポイントは、自らでupdateメソッドを実装しないといけないところですね.流れとしては、tweetとtagをそれぞれ更新すると同時に、新たな中間テーブルのレコードを作成するようにするupdateメソッドをtweet_tag.rbに記載します。本当は既存の中間テーブルのレコードを消さずに更新できればもっと効率が上がるのですが、とりあえず今回は実装完了を目標としていますのでそこは割愛します。

なお、入力されたタグはparamsの中では1つの文字列として認識されますので、複数タグを入力するときは「,」で区切ってもらい、受け取った後にsplitメソッドで分割することに注意してください。

```ruby
tag_list=params[:tweets_tag][:name].split(",")
```

# おわりに
私自身も実装にかなり時間がかかってしまったのですが、終わってみるととてもシンプルでした。Formオブジェトパターンが関わると見慣れない記述方法も出てくるので、焦ってしまいがちですが、一呼吸おいてから考えてみるととてもシンプルで、Railsのすごさを感じれました！！！！
いろいろなコンプレックスから社会人2年目でJavaSilverをとった話

# TL;DR

- 文系卒プログラマとして情報系の資格だったり学位のないことへのコンプレックス
- 業務で使う言語への理解度の低さへの焦り
- 資格という目に見える結果を手に入れることで自信を持たす
- メンタルも落ち着いたし全体的にかなり勉強になったのでもし同じような境遇の人がいれば取得はおすすめ、割と簡単

# はじめに

はじめまして、TKといいます。
今年の4月で社会人2年目になる、文系大学卒のWebプログラマです。
今回はいろいろなコンプレックスからJavaSilverをとりましたので、いろいろ雑記程度に書いていきます。

# なんでJavaSilverをとろうと思ったか

4月になり、社会人2年目になってふとこんなことを思うようになりました。
**「業務は1年やってきたけど、プログラマとしての無免許感強いな、、、」**
自分は文系大学卒パッション入社エンジニアで、入社まで個人的にコードを書いたりスクール的なところで勉強はしていたものの、ちゃんと勉強をしてきた証だったり学位だったり資格がなく、なんとなくやっているといえばなんとなくやっちゃってるという感じです。
多分気にならない人は気にならないと思う（ぶっちゃけ成果を出せたり圧倒的な実装力があれば問題ないような業界の気はするので）のですが、自分はここがすごい気になり、また自分の同期が情報系の学校を出ていて学位だったり資格を持っていたりすることもあり、なんとなくコンプレックス的なものになっていました。
また自分の中の課題として、言語への理解（Javaに限らず）があんまりできていないな、と感じることがよくありました（実装とかで変な躓きをする）。
去年はまず業務に慣れることが先行しすぎてここら辺については手が回りませんでしたが、2年目となりちょっと落ち着いたのでここらへんを自分の中で解決しようとなり、JavaSilverの資格勉強を始めることとしました。

# 勉強について

勉強についてはどのJavaSilverの合格記を見ても出てくる黒本を使って勉強しました。
黒本の使い方としては

1. 一旦巻末の総合問題①を解き切ってみる
2. 自分がどの程度問題を解けるかを認識
3. 各テーマごとの問題を解説できるまで解く（ついでに手元でコードを書いて動かす）
4. 総合問題①を90%くらいまで解けるようにする（各問題でなぜ答えがこうなるかを書きながら）
5. 試験前日に総合問題②を解く

が個人的にはおすすめです。
3番に記載した**「各テーマごとの問題を解説できるまで解く（ついでに手元でコードを書いて動かす）」**が個人的には結構大事かと思っています。
単純に答えを暗記する、試験を合格するためには不要ですが、コードを書かないと試験外での効果がないと思っています。
実施に使ってみてこの記述はやっぱりダメなんだな、この場合でもエラーが起きるかなど手で理解するのが個人的には意味があると思ってます。
（Javaに慣れるという意味でもついでのAtCoderの過去問も解いたりして、ちょっとコードに慣れる練習もついでにしました）
ちなみに勉強期間としては上の方法で大体2ヶ月程度かかりました。

# 試験について

試験についてはいろいろな記事があるのでそれを参考にすれば問題ないと思います。
ちょろっとだけ書いておくと

- ピアソンVueへの登録はOracleのアカウントからになっていた（案内があるので特に問題はないはず）
- 試験にはパスポートと免許証のように個人を確認できるものだけを持っていけばいい（バウチャーなどは不要、受験票もなし）
- 試験は3時間あるが終わった段階で帰れる（自分は1時間で帰れました）

みたいなところは他の記事には書いていないことかなと思います。
受験料が高かったり結構厳しそうな試験に見えますが、受験後すぐ退出できたりするのはゆるいんだな、という印象でした。
ちなみに合否判定は終了後即出ます。自分は合格できましたが、ここで不合格がすぐ出ると結構きそうだなと思いました。

# 受験後の自分の中で変わったこと、感想

受験後ですが、結構自分の中では変化があったと思います。
まずメンタル的な部分ですが、一個資格を取れただけですが少し自信がついてコンプレックスも落ち着きました。
何も資格なり持っていないのが自分の中でネガティブな要素だったっぽいです。
技術面で言うと、前よりJavaのソースコードがしっかり読めるようになったと思います。
以前のレベル感が低かった（interfaceとかについてはボヤッとした理解だったり）のもあるのですが、コードを追っていく中で躓くことが減った気がします。
また資格勉強中の期間に業務でJavaで作られているAPIの修正があったのですが、以前修正の時は1日程度かかっていたのが0.5日くらいまで減ったのも自分の中では結構大きな進歩と感じました（というか今までが何もわからなさすぎたというのが正しい気もする、、、）。

# 終わりに

文系大卒なりで情報系を学んでこなく、同期などにコンプレックスを持っている方って結構多いんじゃないかと個人的には思っています。
そういった方が資格を取ってみるというのは一つ自分を進歩させるいい手段だと思います。
おそらく資格なんか意味ないよ、といってくる人もいるとは思いますが、それはあくまで他の方の基準かなと自分は思います。
自分の中で一つ形になるものを持つことは結構心理的に安心できるんじゃないかと思います、少なくとも自分はそうです。
何かしらWebアプリなどを作るというのも手段としてはありますが、資格は何をすべきかが定まっていて、制作活動より楽なので個人的にはすごくおすすめです。
なので同じような境遇の方は資格を取ってみてもいいのかな、と思います。
Express(Node.js)で対応していないメソッドに対して405を返す

# はじめに
ExpressでAPIを実装する際に、ルーティングとしては定義されているが、メソッドが対応していない場合に405エラーを正しく返す方法を考えます。

# APIの実装
APIの実装を下記のように行います。
この場合、`http://localhost:3000/api/user`にGETを行うと`getHandler`が実行されますが、同URLにPOSTを行うと404エラーとなってしまいます。

```javascript
const express = require('express');
const app = express();

app.get('/api/user', getHandler);

const port = 3000;

app.listen(port, () => {
    console.log(`server started on port ${port}`);
}); 
```

# 405エラーを正しく返す
405エラーを返すだけの関数`methodNotAllowed`を実装して、下記のように`all`のハンドラーとして指定します。
こうするとGETの場合は`getHandler`が実行され、それ以外のメソッドの場合は405エラーを返すようになります。

```javascript
const express = require('express');
const app = express();

const methodNotAllowed = (req, res, next) => res.status(405).send();

app.route('/api/user')
.get(getHandler)
.all(methodNotAllowed);

const port = 3000;

app.listen(port, () => {
    console.log(`server started on port ${port}`);
}); 
```
Tang-NanoでBasicを動かす

#目的
　Tang-Nanoと言うボードが去年(2019)の終わりごろに売り出されていた。一年近く立ってからやっと気が付いた。
　規模は１０００ＬＵＴ程度、xilinxのxc6lx9の1/10位かな。
　これで何か実用的なものを作れないかな。
　◆◆◆　そうだ、Basicの動くパソコンを作ろう　◆◆◆
　Basicが動くのがパソコンって訳でもないし、
　パソコン擬きだからって、実用的とも言えないけどもね。

#経緯
　Tang-NanoでTD4何て言う、Toy-CPUは動かせた。でもロジック使用率は１／１０程度。
　もう少し実用的？なものを作れないかと、google様にお伺いを。
　OLDパソコンって言っても常識的には、８０８０コアを入れるだけでアップアップじゃないのって思ったが、
　「[Ｌｉｇｈｔ８０８０](https://github.com/jaruiz/light8080)」なんてのが有るじゃありませんか。
　僅かなＬＵＴで構成出来て、Basic(altair 4K Basicらしい)も動作するなんて、素晴らしい。
　仕掛けとしては、ロジックをマイクロコード化する事により、ロジックをシュリンクしている。
　但し弊害として、動作速度の低下とＲＯＭエリアが別途必要となる。
　でも動作速度低下は、８０８０が８０ＭＨｚで動作すれば大丈夫だろう(何が)。
　ＲＯＭについては、ＧＷ１ＮにはＦｌａｓｈが利用可能なので、リソースを圧迫しない。
　主要スペック:　LUT4 1152, Flip-Flop 864, BSRAM(bits) 72K, USER Flash(bits)  96K
　こりゃ行けるぞと。

#シリアル通信
　Basicの入出力にはシリアル通信を使うのが簡便。しかーし、
　ＧＷ１Ｎ本体の所為では無いが、Tang-Nanoのシリアルは問題を抱えている。
　通信に使用しているCH552Tは、そのままでは通信に使えない下記の致命傷が有る。
　　1.CH552Tのフォームウェアが通信に対応していない。
　　2.通信に使用するピンがConfigピンとバッティング。
　解決策は有るが、下記の作業が必要となる。
　　「[Tang NanoのFPGAとPC間でUART通信をする](https://qiita.com/ciniml/items/05ac7fd2515ceed3f88d)」
　コストダウンの所為だろうが、敷居を高くしている事は否めない。ちと微妙。
　　※なんせCH552Tは安いものね、Driverの使用はグレーな気がするが。
　上記の対策を行った「[通信テストプログラム test_rs](https://github.com/hi631/tang-nano/tree/master/test_rs)」をGithubに上げている。
　入力をエコーバックするだけだが、まず通信テストを行ってほしい。(115200bps)

#Ｆｌａｓｈ書き込み
　FPGAの通常の動作確認はＲＡＭへの書き込みだが、今回はFlashへの書き込みも必要となる。
　　Programer2の起動 -> SRAM ProgramをダブルクリックでDevice config... が表示される。
　　Access ModeをEnvedded...にし、OperationをEmbFlash Erase,Programに設定。
　　User Flash...を有効にし、File nameをいれてsaveすると、次回のProgramはFlashに書かれる。
　　　※再度Device config...を表示すると、User Flash...は忘れているようなので要注意。
![Image34-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/29dab4bb-1f9d-f1f7-b2a1-3065daa7038a.jpeg)
　Flashへの書き込みには***.fiファイルが必要となるので、basicのbinをfi形式に変換している。
　fi形式はFlashのダンプファイルから類推したが、多分合っているのだろう。

#Ｌｉｇｈｔ８０８０
　マイクロプログラムが正しく格納されていれば、一般のＣＰＵコアと変わりはない。そこで、
　まず、マイクロプログラムをＲＡＭ上に展開。
　始めにリセットにより、マイクロプログラムが先頭から読まれることを確認する。
　次にループするプログラムで、ＣＰＵとしての動作を確認する。
　上手く言ったらマイクロプログラムを、Flashに追いやって、ＲＡＭ領域を開ける。
　　※Flashの使い方がちと怪しい。動いているから問題は無いだろうが。
　動作した「[Tango-Nano 4KBASIC](https://github.com/hi631/tang-nano/tree/master/l80soc)」をGithubに上げている。
　この構成で、３４２ＬＵＴとなっている。ＬＵＴより最大８ＫＢのＲＡＭの方がネックかな。
　それでも、Basicのプログラムエリアが4KB取れている。
　残ったLUTにロジックを追加すれば、なんか計測装置が出来そうな。
　　※LCD.Displayを追加してみたが、スクロールなんかの処理が結構面倒で、
　　　RAMを2KB,LUTを400も使ったので、之はお蔵入り。
![Image34-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/76c235fb-6daf-4029-eb05-e91393425104.jpeg)

#感想
　以外に出来るもんだと感心。まあ、Light8080のおかげだろうが。
　時間と知恵が有れば、Z80に拡張したいが、多分無理だろうな。
　だだ、Tang-Nanoはライセンスの有り方が先行き不安なので、これ以上は利用しない予定。
　値段安くて、コンパイル早いから、使いやすいんだけどもね。多分日本を相手にしていないのだろう。
　アマチュアとしてはサポート無くても使える体制を望みたいものだ。まあ、販売元の自由だろうが。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。
pythonでS3をモック化できるStubberを使って単体テスト

# 記事について

pythonでS3をモック化する際に、以前はpython標準のMockを使っていたけど、boto3に標準のStubberという便利なモジュールが用意されているので、使用してみた。

なお、コードは、実際に動かしたものを公開用に修正したもので、動作確認はしておりません。ご了承ください。

# 環境

* python３系
* boto3

# テストコードを書いてみる

## S3からオブジェクトをGETする

### 対象コード

```python
import boto3
    func_get():
        s3 = boto3.resource('s3')
        bucket = 'bucket'
        key = '/key/object.json'
        obj = s3.Object(bucket, key)

        res = obj.get()

        return res
```

### テストコード

#### 正常系

```python
from botocore.stub import Stubber
from botocore.exceptions import ClientError
from unittest import TestCase
from unittest import mock
import boto3
import contextlib

class TestGetGehirnFiles(TestCase):
    def test_get_files_OK(self):
        s3 = boto3.resource('s3')
        stubber = Stubber(s3.meta.client)
        # Bodyの中:botocore.response.StreamingBody = ファイルストリーム
        body = open('./test_body.json')
        res = {"ResponseMetadata": {"HTTPStatusCode": 200}, 'Body': body}
        stubber.add_response('get_object', res)
        stubber.activate()

        # ここではcontextlibで書いてるけど、Mock対象が一つの場合にはcontextlibを使用する必要はない。
        with contextlib.ExitStack() as stack:
            stack.enter_context(mock.patch('boto3.resource', return_value=s3))
 
            
            ex_body = open('./test_body.json')
            expectation = {"ResponseMetadata": {"HTTPStatusCode": 200}, 'Body': ex_body}

            res = func_get()

            self.assertDictEqual(expectation, res)
            body.close()
            ex_body.close()
```

#### 異常系

##### 例外を返す

```python
- body = open('./test_body.json')
- res = {"ResponseMetadata": {"HTTPStatusCode": 200}, 'Body': body}
- stubber.add_response('get_object', res)

+ stubber.add_client_error('get_object', service_error_code='AccessDenied')

```

#### 複数回の呼び出しのレスポンスを定義する場合

ファーストインファーストアウトで定義できるので、例えば、例外を2回返した後に正常レスポンスを返す場合、以下のように記載する

```python
s3 = boto3.resource('s3')
stubber = Stubber(s3.meta.client)
stubber.add_client_error('get_object', service_error_code='AccessDenied')
stubber.add_client_error('get_object', service_error_code='AccessDenied')
stubber.add_response('get_object', xxx)
stubber.activate()
```

## S3にオブジェクトをPUTする

基本的にGetと同じなので、省略。以下だけ変更すれば良い

```python
- stubber.add_response('get_object', res)
+ stubber.add_response('put_object', res)
```

## 参考ページ

* [Stubber Reference](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/stubber.html)
* [github issues](https://github.com/boto/botocore/issues/2069)
* [Stubber クラスを用いた boto3 を使うメソッドのテストコード実装例](https://zenn.dev/515hikaru/articles/testing-boto3-with-stubber)
Flexboxを使ってスイス国旗を本格的に作ってみた

Flexboxを使って国旗を作る
今回はスイス国旗

![スクリーンショット (34).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/4cd5fdfe-c829-e5e0-5ef8-43cef364433c.png)


目標：Flexboxの基礎を理解するため
テキストエディターはVSCode.
↓下記のFlexboxチートシートを参考
[Css Flexboxのチートシート] (https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet)

～codeを書き始める前の準備～
・構成を考える！　何をどんな風に、どうやって作るのか？
　最初にある程度決めておくと後が楽になります。
　例　スイスの国旗を調べる
　　　```<div>```は何個必要なのか？
　　　```class```属性名はどうしようか？
　　　

・紙とペンで実際に枠を書いてみる（添付画像参照）
ここまで出来たらcodeを書いていきます♪ ※head部分は省略

```html
<div class="switzland5">
      <div class="switzland4">
          <div class="swit10 land13">しかく１</div>
          <div class="swit11 land13">しかく２</div> 
          <div class="swit10 land13">しかく３</div>
      </div>
    </div>
```

```css
.switzland5 {
    width: 700px;
    height: 500px;
    /* background-color: green; */
    border: 1px solid black;
    margin: 50px auto;  
  }

  .switzland4 {
    width: 450px;
    height: 300px;
    border: 1px solid black;
    margin: 50px auto;  
  }

.swit10 {
  width: 21%;
  height: 80px;
  background-color: white;
}

.swit11 {
  width: 21%;
  height: 200px;
  background-color: white;
}
```
上記の状態を一旦ブラウザで確認

![スクリーンショット (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/ee445369-4a65-d613-bb8a-59c1bc1cd609.png)

次に、```display: flex;``` を付けてみる。

```css
.switzland5 {
    width: 700px;
    height: 500px;
    /* background-color: green; */
    border: 1px solid black;
    margin: 50px auto;  
  
    display: flex; ※
    align-items: center;　※
  }
  .switzland4 {
    width: 450px;
    height: 300px;
    background-color: red;
    border: 1px solid black;
    margin: 50px auto;  
  
    display: flex;　※
    justify-content: center;　※
    align-items: center;　※
  }
```

![スクリーンショット (31).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/c3e3d7d5-2c2e-f3cd-9c53-5a1f1ca2a55b.png)

スイス国旗の完成！　でもこれだと解りづらいので色を変更してみます　

```css
.swit10 {
  width: 21%;
  height: 80px;
  background-color: pink; ※
}

.swit11 {
  width: 21%;
  height: 200px;
  background-color: orange; ※
}
```
ブラウザで確認します　↓

![スクリーンショット (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311071/b708da21-0300-4429-6e30-848cbba4ca1a.png)


##　まとめ
モノを作るときの発想の転換が非常に大事だと解った。
スイス国旗の場合、赤い部分を```Flexbox```するのか、白い部分を```Flexbox```するのか
組み立てる以前の考え方で完成度合いがかわってくる。
また、発想が身についてないから不向きか？と言われたらそうでもないみたいです。
「経験で発想は身に付く」とのことでしたので、発想の転換に乏しい私からしたら
ひたすら鍛錬（codeを書く）する方法しかないなと感じてます。



今回は以上です
ありがとうございます！
【Golang】brew switch を使わずGoのバージョンを切り替える

## はじめに
`brew switch`が廃止されて使えなくなったため、手動でバージョンを切り替えたときの作業手順です。
1.15から1.14に切り替えをします。

#### 前提
- Goは以下のように`/usr/local/Cellar/go`配下にインストールされているものとします

```
/usr/local/Cellar/go
　├ 1.14.15
　└ 1.15.7_1
```

## 変更前のバージョンを確認
以下コマンドを実行し、切り替え前のバージョン（`1.15.7`）を確認。

```
$ go version
go version go1.15.7 darwin/amd64
```

## 切り替え作業
ここからバージョン切り替えの作業となります。

#### シンボリックリンク作成
GOROOTの設定先となるシンボリックリンクを作成し、

```
$ ln -nfs /usr/local/Cellar/go/1.14.15 ~/goroot
```

以下コマンドを実行して`/usr/local/bin/`配下の向き先を上記で作成したシンボリックリンクに向けます。

```
$ ln -nfs ~/goroot/bin/go /usr/local/bin/go
$ ln -nfs ~/goroot/bin/gofmt /usr/local/bin/gofmt
$ ln -nfs ~/goroot/bin/godoc /usr/local/bin/godoc
```

#### 環境変数にGOROOTを追加
`.zhrc`に環境変数`GOROOT`を追加します。
（bashを使っている人は`.bashrc`）

```
$ vi ~/.zshrc
```

以下の1行を追加して、

```
export GOROOT=$HOME/goroot/libexec
```

追加した内容を反映。

```
$ source ~/.zshrc
```

## 切り替え後のバージョンを確認
バージョンが`1.14.15`に切り替わっていることを確認。

```
$ go version
go version go1.14.15 darwin/amd64
```

## おわりに
以上でバージョン切り替え完了です。
次回以降はgorootのシンボリックリンクの貼り替えのみで切り替わります。

※1.15に戻す場合

```
$ ln -nfs /usr/local/Cellar/go/1.15.7_1 ~/goroot
$ go version
go version go1.15.7 darwin/amd64
```

## 2021.07.05 追記
GOPATHが通っていない場合も上記手順でPATHを通すことができます。
PyTorch | Tensor操作

## view()
we only retain gradients of leaf variables. 
**Once you do tensor.view(-1), this returns a new tensor which is not a leaf variable anymore (and has a grad_fn).**
https://github.com/pytorch/pytorch/issues/19778

## permute() 

## index_add_(dim, index, tensor) → Tensor
Accumulate the elements of tensor into the self tensor by adding to the indices in the order given in index. For example, if dim == 0 and index[i] == j, then the ith row of tensor is added to the jth row of self.
The dimth dimension of tensor must have the same size as the length of index (which must be a vector), and all other dimensions must match self, or an error will be raised.
>x = torch.ones(5, 3)
t = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=torch.float)
index = torch.tensor([0, 4, 2])
x.index_add_(0, index, t)
tensor([[  2.,   3.,   4.],
        [  1.,   1.,   1.],
        [  8.,   9.,  10.],
        [  1.,   1.,   1.],
        [  5.,   6.,   7.]])

## Sum over various subsets of a tensor


## index
### c++
https://pytorch.org/cppdocs/notes/tensor_indexing.html
instead of using the []-operator similar to the Python API syntax, in the C++ API the indexing methods are:

    torch::Tensor::index (link)
    torch::Tensor::index_put_ (link)

It’s also important to note that index types such as None / Ellipsis / Slice live in the torch::indexing namespace, and it’s recommended to put using namespace torch::indexing before any indexing code for convenient use of those index types.

[]-indexing should work for a CUDA tensor.（？）
https://discuss.pytorch.org/t/c-aten-command-for-accessing-gpu-tensors/36010/2

##device
###c++
std::cout << tensor.device() << std::endl;
PHPの設定を瞬殺で把握するコマンド

PHPの設定を瞬殺で把握できるコマンドの覚書き。

## コマンド

Linux, Windowsそれぞれ書きました。

### Linuxの場合

```
$ php -i | grep -i extension_dir
```


### Windowsの場合

```
> php -i | findstr /I extension_dir
```

## 補足事項

上記のコマンドは、extension_dirを探す内容になっているので、見つけたい設定項目に置き換えて実行すること。

~~PHPの-rオプションによって、スクリプトから実行が可能。~~
→ @error_401 さんのコメントにより、-iオプションに修正しました。
このオプションによって、PHPの情報（設定値）を取得できます。

いずれも、大文字小文字は区別しない内容にしています（Linux: -i オプション、Windows: /I オプション）

php.iniから探す、だと、デフォルト値が表示されなかったり、コメントアウトが表示されてしまったりするので、、
上記のコマンドだと、それらがないので必要な情報が瞬時に把握できて、便利。

## もともと書いてたほう

以下のコマンドでも確認可能（もともと書いてたほうもメモとして残しておきます）

### Linuxの場合

```
$ php -r "phpinfo();" | grep -i extension_dir
```

### Windowsの場合

```
$ php -r "phpinfo();" | findstr /I extension_dir
```

## 参考

* [コマンドラインオプション | php.net](https://www.php.net/manual/ja/features.commandline.options.php)
* [【 grep 】コマンド――特定の文字を含む行を抽出する | atmarkit.co.jp](https://www.atmarkit.co.jp/ait/articles/1604/07/news018.html)
* [Windowsのfindstrで正規表現を検索する | atmarkit.co.jp](https://www.atmarkit.co.jp/ait/articles/0412/18/news018.html)
* [Download Composer | getcomposer.org](https://getcomposer.org/download/)
アドミニストレーター認定の準備: 設定とオブジェクト ⇒ 組織の設定の学習

１．「組織の設定」セクションは、アドミニストレーター認定試験の何パーセントを占めていますか?
２．アドミニストレーター認定試験の「組織の設定」セクションの主なトピックはどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/2e31d1fd-3ae6-e84a-ec4f-d79e480a06d7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/c3de2e9a-203f-24c1-54cf-23d46157acf2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/d67fe4df-110f-fb0e-4906-6834b1f9cfa3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/4e0e57ee-2ca7-2b7f-b132-723bf844b35d.png)
複数のCSVファイルをマージ&ソートするバッチファイル

＜スクリプトの流れ＞

1. 全てのCSVファイルの2行目以降（more +1）の空白行以外（findstr "."）をマージし、
一時ファイル（temp.txt）に出力
1. CSVファイルの一つからヘッダ（タイトル）行のみ取り出して all.csv に出力
 + タイトル行が1024バイトを超えている場合に備えて、変数サイズに1024バイト制限のあるSETコマンドは使わず、echoコマンドからファイルに直接出力する
 + ファイル名に空白スペースが含まれている場合に備えて、［usebackq］オプションでファイルセットのファイル名（%%a）を二重引用符で囲めるようにする
 + タイトル行に空白スペースが含まれている場合に備えて、［delims］オプションで空白スペースを区切り文字にしない
1. 一時ファイル（temp.txt）の中身を降順にソート（sort /r）して all.csv に追記
1. 一時ファイル（temp.txt）を削除する


※ CSVファイルと同じフォルダに入れて実行する

```bat:CSV_Merge_Sort.bat
@echo off

set temp_file=temp.txt
set merge_file=all.csv

REM 1.
for %%a in (*.csv) do (
    type "%%a" | more +1 | findstr "." >> %temp_file%
)

REM 2.
for %%a in (*.csv) do (
    for /f "usebackq delims=" %%b in ("%%a") do (
        echo %%b> %merge_file%
        goto :label
    )
)
:label

REM 3.
sort /r < %temp_file% >> %merge_file%

REM 4.
del /q %temp_file%
```
カラーバーを自作する

# はじめに
こういうカラーバーをデータ要らずで描きたい
![sample_cbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/f968cf0d-afe3-7572-264c-1d2fc807fb0d.png)

# 方法
忙しい人向けコード全部はこちら：

```python
import matplotlib.pyplot as plt
import matplotlib.colors

cm = plt.cm.get_cmap("magma")
norm = matplotlib.colors.Normalize(vmin=0, vmax=100)
fig = plt.figure()
cax = fig.add_axes([0,0,1,0.2])
fig.colorbar(plt.cm.ScalarMappable(norm, cm), cax=cax, orientation="horizontal")
plt.show()
```

# 解説
(1) カラーマップを定義する（今回は`"magma"`を選択）

```python
cm = plt.cm.get_cmap("magma")
```

(2) 正規化幅を決める（今回は0から100を選択）

```python
norm = matplotlib.colors.Normalize(vmin=0, vmax=100)
```

(3) `figure` と `cax` を定義する

```python
fig = plt.figure()
cax = fig.add_axes([0,0,1,0.2]) # [x, y, width, height]
```

(4) `ScalarMappable`を自作して `fig.colorbar` に与える

```python
fig.colorbar(plt.cm.ScalarMappable(norm, cm), cax=cax, orientation="horizontal")
```
通常，この第一引数には `ax.imshow` などで描画された Artist を mappable オブジェクトとして渡すことでカラーバーに用いられるカラーマップと値の対応が判断される。
ここでは，そのような mappable オブジェクトを自作することで，思い通りのカラーバーを得ている。

# おわりに
例えばデータの値に応じて `ax.plot` の色を変えた場合など， mappable オブジェクトが自動生成されない際に便利だと思います。
sketchupでruby その7

#概要

sketchupでrubyやってみた。
add_curve使ってみた。

#写真

![cos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/351b62fc-b0a1-abe2-b480-4790bade264d.png)


#サンプルコード

```
def cos
   xya = 1
   zza = xya * 8
   xys = 42
   zzs = 22
   cxy = 0
   czz = 0
   p = []
   while cxy < 360
      x = Math.cos(cxy * Math::PI / 180) * xys
      y = Math.sin(cxy * Math::PI / 180) * xys
      z = Math.sin(czz * Math::PI / 180) * zzs
      p[p.length] = [x, y, z]
      cxy += xya
      czz += zza
      if (czz >= 360)
         czz = 0
      end
   end
   p[p.length] = p[0]
   model = Sketchup.active_model
   entities = model.active_entities
   entities.add_curve(p)
end



```

以上。
JavaScript勉強メモ6章

# JavaScript勉強メモ6章

## 6. 長整数  
数値型では扱えない大きな整数を扱える仕組み。  

- 長整数リテラル：  
数値の後ろにnをつけたら長整数だよ  

    ```js
    let num = 854n;
    console.log(num);
    >>854n

    let num2 = BigInt(1024);/*オブジェクトのコンストラクタでもかけるよ*/
    console.log(num2);
    >>1024n
    ```

    長整数を使うと、数値リテラルで扱えない(安全でない)大きな数値も演算できるよ

     ```js
     let num = 9007199254740991n;/*numに安全な最大数を長整数として入れる*/
     cosole.log(num+2n);
     >>9007199254740993n/*ちゃんと計算される*/
     ```

- 長整数リテラルで利用可能な演算子  
（長整数に+とか-とか**とか使えるの？）  

    - 算術演算子

    ```js
    console.log(8n / 7n);/*8n÷7n*/
    >> 1n/*答えは整数、小数点以下は切り捨て*/
    console.log(34n % 8n);/*34n÷8nの余り*/
    >> 2n
    console.log(9n ** 3n);/*9nの3n乗*/
    >> 729n
    ```
- ビット演算子、シフト演算子  
    - ビット演算子：  
    2つの数値の関係(2進数にして同じ位の桁を比べる)から新しい数値をつくるよ  
    例) 論理積(&)：  
    k桁目がどっちも1なら新しい数値のk桁目も1。それ以外ならk桁目は0。
        
        ```js
        console.log(3n & 4n);
        >>0n
        ```
        解説  
        3と4を二進数で表現して、それぞれの桁の関係を調べる。

        |3 = |0 1 1|    |
        |----|-----|----|
        |4 = |1 0 0|    |
        |    |0 0 0| = 0|

        他のも似たルールです。調べてみてください。  
    シフト演算子：  
    ある数値を2進数で表現したとき、指定した数だけ桁をずらして新しい数値を作るよ  
    
    - 等価演算子：
    イコールとノットイコールのこと。書き方が変だから覚えてね。

        ```js
        console.log(48n == 54n);
        >>false/*48nと54nはイコールじゃないよ*/
        console.log(48n != 54n);
        >>true/*48nと54nはノットイコールだよ*/
        ```

    - 関係演算子：
    大なり(>)とか小なり(<)のことだよ

    - インクリメント演算子とデクリメント演算子：  
    1足したり1引いたりするよ

        ```js
        let num = 1;
        num++;/*numに1足してね*/
        console.log(num);
        >>2/*numは今2だよ*/
        --num;/*numから1引いてね*/
        console.log(num)
        >>1
        ```

    - 単項マイナス演算子：  
    -2とかのマイナス(-)のこと

        ```js
        console.log(-5n);
        >>-5n
        ```

- 長整数リテラルを数値に型変換する  
長整数リテラルと数値リテラルは別物。一緒に計算できない。

    ```js
    let bugnum = 10n;/*bignumに10n入れるよ*/
    let num = Number(bignum);/*numに"bignumをNumber関数に入れた結果"をいれるよ*/
    console.log(num);
    >>10/*numの中身は数値の10だよ*/
    ```
    次に数値を長整数にする。(BigInt関数)

    ```js
    let num = 10;
    let bignum = BigInt(num);/*bignumに"numをBigInt関数に入れた結果"を入れるよ*/
    console.log(bignum);
    >>10n/*numの中身は長整数の10nだよ*/
    ```

6章おしまい！
[初心者向け]スマホアプリUIツールFigmaのシンプルな使い方

##対象
シンプルなデザインの簡単な画面設計、モックを作りたい方

##はじめに
スマホアプリのモックを作る際、FigmaというUIツールが使いやすかったので、シンプルな方法での使い方を簡単に共有します！


公式サイト：https://www.figma.com/
こちらのTry Figma for freeからサインアップ、
ブラウザからも使用出来ますが、アプリの方が操作が軽かったです。

##基本操作

左上の矢印のマークから、
選択、フレーム、図形、ペン、テキストツールとなってます。
それぞれ動かして確認してみてください。

まだ作業スペースに何も入っていないので、まずはフレームを作ります。矢印アイコンの右隣にあるアイコンを選択すると右側にフレームの選択肢が出てきます。適宜なものを選んで作成します。
![スクリーンショット 2021-04-19 10.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682827/04ee5c36-1ef6-64bb-64cb-7a5a37f58251.png)



##アセット
図形などを駆使して、自ら作成していくことも可能ですが、効率よくいい感じに作成するのにおすすめはアセットを使用することです。

下記サイトにまとまって掲載されているので是非使ってみてください。
迷ったら一番上のMaterial Design 2.0 Theming kitを使用すればokです！

>
【Figma】入れておくと便利なアセットまとめ
https://note.com/abcmisuzu/n/n8e70f02b954f
Figmaには公式で運営しているアセットストアがあり、そこから使いたいデータに飛びWEB上のファイルを使えるようになります。
一部有料ですがほとんどが無料、保存も必要なくリンクをクリックするだけで本当にあっさりアセットが手に入るので上手く活用できそうです。

##作成後にやること
・画面遷移
右側のPrototypeメニューを開いた状態にすると、作業画面でフレームやパーツから矢印を引っ張れるようになるので、それを遷移先につなげます。
右上の▷を押すとモックを動かせます。

・共有
右上にあるshareボタンからcopy linkを押すと、urlを入手できるので、そちらを共有するとできます。

・スマホアプリ
Figmaスマホアプリを入れると、手元のスマートフォンから確認できます。

##最後に
上記のことを押さえると簡単にアプリっぽいデザインのモックが作れるので、是非試してみてください。
パーツ作成を応用すると、自らアセットを作成できるので応用したい方は別の記事も参考にしてください。

###参考文献
[初心者向け！実例で学ぶデザインツールFigmaの使い方](https://yososhi.com/archives/figma-for-beginner/)
[【Figma】入れておくと便利なアセットまとめ](https://note.com/abcmisuzu/n/n8e70f02b954f)

###会社の紹介
私は現在、[株式会社ダイアログ](https://www.dialog-inc.com/)という物流×ITの会社に勤務しております。
様々な職種を募集しているので、[Wantedly](https://www.wantedly.com/companies/company_3244501)のページをご覧ください。
なぜchar型の値はint型で扱えるのか

# なぜchar型の値はint型で扱えるのか
山本道子著「JavaプログラマSilverSE11」試験番号1Z0-815の使用を想定

Java Silver SE11の勉強をしているときにぶつかった問題

### 問題
```
1.    public class Main {
2.        public static void main(String[] args) {
3.            int[] ary = new int[3];
4.            ary[0] = 'a';
5.            ary[1] = 1.0F;
6.            ary[2] = 2.0;
7.        }
8.    }
```
上記コードをコンパイル、実行した結果はどうなるか？という問題で

答えは「5行目、6行目でコンパイルエラー」というもの。

## え？？4行目は？？？
## 'a'はchar型じゃないの？
となったが、どうやらchar型で表現できるものはint型でも表現ができるらしく

char型→int型への暗黙の型変換が行われているらしい。

# なぜ型変換が可能なのか
char型が扱っているのは「文字リテラル」ではなく「Unicode(UTF-16)」であり

各文字に対応した16進数の値が設定されている。

文字ではなく数値のためint型でも扱うことができる。

例えば問題にあった 'a' であればUnicodeは「0061」となり、

これを10進数に計算しなおすと「97( (16 * 6) + 1 )」と計算されるため、

ary[0]を表示させると「97」と表示される。

## 例

```
 public class castTest {
     public static void main(String[] args) {
         int i = 'a';
         System.out.println(i);
     }
 }
```
出力:97

となった。

# まとめ
テキストの回答を読んでも「？」となったため自分で調べてみたが、

なるほどと納得のいく理由だった。
AngularMaterialのMatPaginatorを日本語化する

## CustomPaginatorを作成する

MatPaginatorIntlを継承してCustomPaginatorを作成する。

```TypeScript
import { MatPaginatorIntl } from '@angular/material/paginator';

export function CustomPaginator(): any {
  const customPaginatorIntl = new MatPaginatorIntl();

  // Label
  customPaginatorIntl.itemsPerPageLabel = '1 ページあたりの行数: ';
  customPaginatorIntl.getRangeLabel = (page: number, pageSize: number, length: number): string => {
    length = Math.max(length, 0);
    const startIndex = page * pageSize;
    const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;
    return `全 ${length} 件中 ${startIndex + 1} ～ ${endIndex} 件目`;
  };
  return customPaginatorIntl;
}
```

## AppModuleでprovideする

作成したCustomPaginatorをapp.module.ts等でprovideする

```TypeScript
providers: [
  { provide: MatPaginatorIntl, useValue: CustomPaginator() }
]
```
【超初心者必見】gitの使い方をマスターする②

この記事は【超初心者必見】gitの使い方をマスターする①の続きです。
https://qiita.com/ryu110/items/c8c6deecddd66dad6b11

【超初心者必見】gitの使い方をマスターする③
https://qiita.com/ryu110/items/1e82209fdc7ba8968101

⑦履歴管理

git logで履歴を確認することが出来ましたが、もっと便利なコマンドもあります。

commitメッセージだけを参照する。

```
git log --oneline
```
変更された場所を詳細に確認する。
これはどこがどのように変更されたのかを詳細に確認できます

```
git log -p
```
どのファイルが何箇所変更されたか確認する。

```
git log --stat
```
⑧git statusを使う。
まず、前回の記事で書いたように、書き換えたファイルにもう一度追加してみる。

```
vim index.html
```

その後に、statusを確認する。
これは現在どの状態にいるのか確認する時に使う。
今回だと、git add .から行って、その後に、git commitをするか、
もしくは、git checkout -- file名を入力して変更を破棄するかというメッセージがでてくる。

```
git status
```
もし変更を破棄したいならば、今回ならばindex.htmlの変更を破棄したいので、下記のように記述する。

```
git checkout -- index.html
```
これでもう一度確認してみる。

```
cat index.html
```
もしくは

```
type index.html
```

変更したファイルの中で何を変更したか確認する方法。
差分が確認できる。
ただしこれは、まだステージングエリア(git add file名などで移動させたもの)にあげてないもののみ見れる。

```
git diff
```
ステージングエリアにあげたものの差分を確認する。

```
git diff --cached
```

⑨複数のファイルを一気にステージングエリアに移動する方法。
ピリオドは階層を表しています。
今いるファイルのひとつ前からの階層全てをステージングエリアに移動させます。

```
git add .
```
逆に指定したファイルをステージングエリアに移動させたくない場合。まずはgitignoreのファイルを作成する。

```
vim .gitignore
```

その後に、コードを書き込める画面になるので
下記を入力する。そしてEscを押して、:wqでエンターを押します。
今回は*.logを入力しましたがこの意味は.logとついたファイル名全てをステージングには移動させないということです。

```
*.log
```

got commitをした後に少しだけ変更を加えたい場合。

まずはコードに少し変更を加える。前回も行ったようにvimを使って変更を加えてみる。

```
vim index.html
```

少し文字を追加などした後に、Escを押して:weで保存する。
次にこの変更を前回のコミットに追加する。
下記のコマンドを入力すると前回のコミットメッセージが出てくるので、変更したい場合は変更し、そのままでいいなら、そのままで保存する。
これを行うことで、不要なコミットを防ぐことができる。git logなどの管理もしやすくなる。

```
git commit —amend
```

複数回git commitをした後に、複数コミットした内容がある場合に、新しい変更でgit addをしてステージングエリアに移動した後に、やっぱり今回の変更が気に食わない場合。
まず、git logで前回までの履歴を確認する。

```
git log
```

次に,現在の作業ディレクトリもステージングエリアも一気に戻したい場合。オプションでhardをつける。
HEADは直前のコミットに戻したい場合に加える。


```
git reset —-hard HEAD 
```

逆に2、3個前のコミットに戻したい場合。
git logで戻りたいコミットのidをコピーして加えます。

```
git reset —hard HEAD r56ft7vyb7g8(idを最低7桁以上加えれば良い)
```
もし取り消してしまったコミットを戻したい場合。
これは1つ前のコミット内容しか戻せない。

```
git reset —-hard ORIG_HEAD
```
UnrealEngineのshippingビルドでログを出す

UnrealEngineのshippingビルドでログを出す方法をメモしておきます。
UE4.26.2、UE5.3.2で確認しています。
基本的にはWindowsビルドでの内容です。

# ログを出す方法

* Engineをソースコードビルドしてプロジェクトに適用する
* [プロジェクト名].Target.csに以下を追加する

```csharp
if (Configuration == UnrealTargetConfiguration.Shipping)
{
	BuildEnvironment = TargetBuildEnvironment.Unique; // UE5.3.2では不要
	bUseLoggingInShipping = true;
}
```

* ビルドしたexeを実行するときに-logオプションをつける 
 * => コマンドプロンプトが新たに起動してログが出力される

## 参照サイト

[ue4 shipping (exe version) output log log - Programmer Sought](https://www.programmersought.com/article/91875507558/)など

## Androidでログ出しをする方法

Androidでは上記のTarget.csの変更に追加して、以下のようにEngineコードに(USE_LOGGING_IN_SHIPPING==1)を追加すれば良いみたいです。

```cpp:Engine\Source\Runtime\Core\Private\Android\AndroidPlatformMisc.cpp
void FAndroidMisc::LocalPrint(const TCHAR *Message)
{
	// Builds for distribution should not have logging in them:
	// http://developer.android.com/tools/publishing/preparing.html#publishing-configure
#if !UE_BUILD_SHIPPING || ENABLE_PGO_PROFILE || (USE_LOGGING_IN_SHIPPING==1) 
```

UE5.3.2のMetaQuest3で動作確認しました。
アプリを起動するだけでログが出力されるようになっていました。

参照サイト：

https://developers.meta.com/horizon/blog/developer-perspective-ue4-logging-and-console-commands-for-mobile-vr/

## ビルド時のコマンドライン引数でログ出しを制御する方法

[[UE5] パッケージビルド時のコマンドライン引数で .Target.cs の処理を分岐する｜株式会社ヒストリア](https://historia.co.jp/archives/37811/)

# ログをファイルに出力する方法

以下のようなオプションをつけてビルドしたexeを実行する。

```
LOG=[出力したいログファイル名]
```

ログは以下のようなフォルダに出力され、ローテートされる。

```
C:\Users\[ユーザ名]\AppData\Local\[プロジェクト名]\Saved\Logs
```

## 参照サイト

[コマンドライン引数 | Unreal Engine 4.27 ドキュメント](https://docs.unrealengine.com/4.27/ja/ProductionPipelines/CommandLineArguments/)

# ログのローテーション

BaseEngine.iniでは以下のような設定になっていてプロジェクトのDefaultEngine.iniで設定を上書き可能

```ini:Engine/Config/BaseEngine.ini
[LogFiles]
PurgeLogsDays=5 # => 5日より前のログは削除
MaxLogFilesOnDisk=10 => 過去ログは最大10個まで
LogTimes=True # => ログ出力と合わせて時間をプリント
```

# BlueprintのPrintStringの内容をログに出す方法

UE4.26.2ではそのままではBlueprintのPrintStringの内容がログには出てこない。
出力するためには以下のようにEngine側のコードを変更してビルドする必要がある。
※ #if、#endifをコメントアウトするとビルドでエラーになったのでこの修正方法にした。

```cpp:Engine/Source/Runtime/Engine/Private/KismetSystemLibrary.cpp
void UKismetSystemLibrary::PrintString(const UObject* WorldContextObject, const FString& InString, bool bPrintToScreen, bool bPrintToLog, FLinearColor TextColor, float Duration)
{
#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) // Do not Print in Shipping or Test
...
#else // <= ====== 追加 ====== 
	UE_LOG(LogBlueprintUserMessages, Log, TEXT("%s"), *InString); // <= ====== 追加 ====== 
#endif
```

## 参照サイト

[[UE4] Shippingのデバッグ - Qiita](https://qiita.com/donbutsu17/items/76ea5c5531aa4da77f9d)