OmniAICreator/Qiita-1.07M huggingface dataset:
Thymeleafの使い方を簡単にまとめ

### １．はじめに
　Thymeleafは画面側のテンプレートエンジンとしてよく使うので、この前にjspを使う場合も多いけど、二つの使い方は全然違いますと思い、今日はThymeleafの使い方を簡単にまとめてみます。
### ２．まとめ

- 式の構文 

 - SpEL 式  ${value}  
 -  [[${value}]]   
       SpEL を使いましたら、オブジェクトの中身をそのままアクセスできます。

    ```
      <p><span th:text="${object.property}"></span></p>
    ```
  
 - *{value}  
   指定されたオブジェクトを基に、プロパティをアクセス  
 
    ```
      <div th:object="${session. user}" >
         <p>Name: <span th: text=" *{firstName}" >Sebastian</span>. </p>
         <p>Surname: <span th: text=" *{lastName}" >Pepper</span>. </p>
         <p>Nationality: <span th: text=" *{nationality}" >Saturn</span>. </p>
      </div>
    ```  
       
 - #{...}  
      通常は静的画面の場合、propertiesファイルに定義された中身をhtmlに埋め込みたいの際、以下の通り、やりまし ょう。  
    /WEB-INF/templates/app.htmlを新規して、ソースを埋め込み

    ```
      <p th: text=" #{app.welcome}" >This text will not be show! </p>
    ```
      後は、WEB-INF/templates/app.propertiesを作って、テキストを埋め込み

    ```
      app.welcome=this messages is from app.properties！
    ```

     上記の通り、やりましたら、"This text will not be show!"の代わりに"this messages is from app.properties！"を表示されることになります。  

- th:とは
     Thymeleafが特有のth:属性名です。  
 - テキストの置換  
   usernameの値をtdタグの間に埋め込みます。

    ```
      <td class="text" th:text="${username}" ></td> 
    ```

 - リンクURL  
  通常は **< a >** タグの href 属性などに指定する

    ```
      <a th:href="@{/login}" class="login">登録</a>
    ```
 - divテンプレートの導入  
  普通にh:include，th:replaceを使います。例えば、ヘッダファイルを作って、別のHTMLに導入する場合  
/WEBINF/templates/heater. html :

    ```
      <div th: fragment="header" >
         welcome to my homepage!
      </div>
    ```
HTMLへ導入するの例は以下の通りです。
   
    ```
       <div th: replace=" /templates/header : : header" ></div>
    ```
 - th: onclick:  
  クリックのイベント

    ```
      <button   th:onclick="'doClick()'"></button>
    ```

th:の機能がいろいろありますので、以下の例はご参考しましょう。


     <script th:src="@{/resources/js/jquery/jquery.json-2.4.min.js}"
     <input  id="msg" type="hidden" th:value="${msg}" />
     <a th:remove="${status}!=0?all:none" >削除</a>
     <span th:style="'display:' + @{(${sitrue} ? 'none' : 'inline-block')} + ''"></span>
       ．．．


- 演算子
 - 条件演算子  
   条件演算子を使うと、trueの場合はvalue1を設定します、逆に、falseの場合はvalue2を設定します。

    ```
      <p th:text="true  ? 'value1': 'value2'"></p>
    ```
 - 論理演算子  
 　論理演算を行う

    ```
     <p th:text="true && false || true and not true or !false"></p>
    ```

 - 算術演算子  
   算術演算を行う
    ```
      <P th:text="(100 + 5 - 2 * 15 / 10) % 3"></P>
    ```

### ３．最後に

  最後まで読んで頂いてとても嬉しいです！
  ありがとうございました！

### ４．参考
以下を参考にさせていただきました。ありがとうございました。
[Spring Boot总结(9)---Thymeleaf用法大全](https://www.jianshu.com/p/f79a98173677)
[Spring Boot で Thymeleaf 使い方メモ](https://qiita.com/opengl-8080/items/eb3bf3b5301bae398cc2)
【WinActor】リストの内容を柔軟に選択する方法

このようなリストから、あらかじめ指定しておいた項目を選択する方法を紹介します。
![リスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398977/5a0cab2f-3b80-0b09-4230-a7f172116c55.png)

■用意する変数
・リスト内容格納用CSVファイルパス
・検索単語
・検索結果行
・検索結果列

１．初期設定
・リスト内容格納用CSVファイルパス：保存したいファイル名のフルパス※拡張子は不要
・検索単語：リストから設定したい項目(完全一致)

２．リストの内容取得
使用ノード：04_自動記録アクション\リスト一括取得(IE)
ウィンドウ識別名：対象の画面
対象コントロール指定：対象のリスト
ファイル名：リスト内容格納用CSVファイルパス

これでリスト内容格納用CSVファイルパスで指定したファイルに、リストの内容が取得できます。

３．取得したリストから検索
使用ノード：18_Excel関連\12_書式\Excel操作(検索一致)
検索タイプ：文字列
ファイル名：リスト内容格納用CSVファイルパス
検索単語：検索単語
開始セル：A1
終了セル：A100 ※ここはリスト項目以上の数を設定してください
結果(行)：検索結果行
結果(列)：検索結果列
※検索結果列は使用しませんが、変数を指定しないとエラーになるため設定しています

４．検索結果判定
使用ノード：条件分岐
条件：検索結果行が空白以外

５．リストから選択
使用ノード：04_自動記録アクション\リスト選択(IE)
ウィンドウ識別名：対象の画面
対象コントロール指定：対象のリスト
選択内容：検索単語
ラジオボックスは値を選択

これで検索単語(選択したいリスト項目)が選択されます。
指定する項目を変えてみるとより成果が分かりやすいと思います。
この方法だと、仕様変更により、リストの内容に追加・変更・削除があっても柔軟に対応できます。
ただし、指定した項目が完全一致している必要があります。

以上が、リストの内容を柔軟に選択する方法でした。
jupyter でファイルをダウンロードしようとすると「失敗 - アクセスできません」

jupyter lab でファイルをダウンロードしようとすると，「失敗 - アクセスできません」となり，ダウンロードリンクからアクセスしたり，jupyter lab のログを見ると「403 forbidden」や「Blocking request from unknown origin」となっている時の解決方法です。

~~ちなみに safari ならダウンロードできるという情報もありますので，safari 環境がある方は safari を使う方が早いかもしれません。~~
実際に safari であればダウンロードを問題なく行えました！
ただし，ダウンロードリンクについては safari でも機能しませんのでご注意を。

---
(2020/1/24 追記)

* notebook 6.0.3 で改善されていることを確認しました！
    * ファイルツリーから右クリックでのダウンロードが chrome でできることを確認
* ダウンロードリンクは機能しないことを確認しました (chrome 環境にて)

---
(2019/7/25 追記)

* notebook 6.0.0 でも chrome でダウンロードできない現象を確認しました
* safari ではダウンロードが問題なく行えることを確認しました
* ダウンロードリンクについては safari でも機能しないことを確認しました

---


# TL;DR
```bash:pipenvユーザ
$ pipenv install notebook==5.7.5  # 古いバージョンに落とす
$ pipenv install notebook>=6.0.3  # 新しいバージョンに更新する
# $ pipenv install notebook\>=6.0.3  # 私の環境ではエスケープ文字が必要だった
```

```bash:pipユーザ
$ pip install notebook==5.7.5  # 古いバージョンに落とす
$ pip install notebook>=6.0.3  # 新しいバージョンに更新する
```

---
起動時のオプションで `--NotebookApp.disable_check_xsrf=True` を渡すとこのエラーを回避できる可能性があります。

検証し次第，記事を更新したいと思います。

---

# 環境
* notebook 5.7.6 以降 (5.7.6, 5.7.7, 5.7.8, 6.0.0)
* chrome 75.0 など

# 詳細
jupyter lab のログを確認すると以下のようになっていました。

```:log
[W <time> LabApp] Blocking request with no referer
[W <time> LabApp] 403 GET <file_path> (<client ip>): Blocking request from unknown origin
[W <time> LabApp] 403 GET <file_path> (<client ip>) 8.51ms referer=None
```

次を実行すると notebook 5.7.8 がインストールされているのがわかります。

```bash
$ pipenv run pip freeze | grep notebook
notebook==5.7.8
```

そこでisuueを参考に冒頭のコマンドを実行して jupyter lab を再起動したところ無事解消しました。

```bash
$ pipenv install notebook==5.7.5                                                                                                                                                             
```

---
(2020/2/10 追記)

更新しても解消することを確認しました。

```bash
$ pipenv install notebook>=6.0.3                                                                                                                                                             
```
---

めでたしめでたし

# 参考

- [jupyterlab/jupyterlab: Cannot download files after JL update](https://github.com/jupyterlab/jupyterlab/issues/6149)
- [jupyter/notebook: Download file functionality is broken in notebook packages version 5.7.6+ (5.7.7, 5.7.8)](https://github.com/jupyter/notebook/issues/4541)
Rails6 のちょい足しな新機能を試す50（scaffold 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第50段。 今回は、 `scaffold` 編です。
Rails 6 では、 belongs_to な関係のあるモデルがあるアプリを scaffold で作った場合に、 belongs_to で指定される親モデルの表示のされ方が変わりました。
...ってなんだか良くわかりませんね。

実際にやってみた方がわかりやすいです。

Ruby 2.6.3, Rails 6.0.0.rc1, Rails 5.2.3 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# rails プロジェクトを作る

```
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
```

# scaffold を使う

scaffold で Author と Book の CRUD を作成します。Book は、 Author に属します。

```
$ bin/rails g scaffold Author name
$ bin/rails g scaffold Book title author:references
```

# seed データを作る

Author と Book のデータを1つずつ作成します。

```db/seeds.rb
author = Author.create(name: 'Dave Thomas')
Book.create(title: 'Programming Ruby', author: author)
```

# データベースを作る

データベースを作って seed データを登録します。

```shell
$ bin/rails db:create db:migrate db:seed
```

# rails server を実行して Book のデータを表示する

rails server を実行します。

```shell
$ bin/rails s
```

http://localhost:3000/books と http://localhost:3000/books/1 で一覧画面と詳細画面を表示します。

# Rails 5 では

一覧画面でも詳細画面でも、Author はAuthorオブジェクト( `Author#to_s` )を表示します。

## 一覧画面
![rails5index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/6445a444-e9cc-c5a6-8a97-f15464a72e09.png)

## 詳細画面
![rails5show.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/0b40fa13-0a92-107e-863e-a812d734bf43.png)

# Rails 6 では

一覧画面でも詳細画面でも、Author は ID ( `Author#id` ) の 1 を表示します。

## 一覧画面
![rails6index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/ef5a090a-53b7-9994-d0d1-1e0edd210ad7.png)

## 詳細画面
![rails6show.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/ad7ebd79-9a30-f0c5-8a09-b4eec8978388.png)

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try050_scaffold


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Issue #29200 scaffold an object with a reference displays an object memory address to user](https://github.com/rails/rails/pull/29204)
社内勉強会 機械学習入門（2.「Jupyter Notebook」を使ってみよう）

## 新規にNotebookを作る
右のほうにある[New]をクリックし、Python3を選びます。
![2019-07-10_10h08_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101846/e7367710-122e-aeba-0c5c-f9433086c22f.png)
![2019-07-10_11h38_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101846/0259dd3d-aae6-f89c-2d0b-27fc6c787244.png)

## 簡単なコードを書いてみる
![2019-07-10_11h38_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101846/da1ee982-a286-30af-4876-6125e85f2cad.png)

## グラフ表示するコードを書いてみる
* 新しくセルを挿入してみましょう。
![2019-07-10_11h45_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101846/84b7729e-a37c-bee8-e042-f8705474fc97.png)

* 新しいセルに以下のコードを書いて、Runしてみましょう。

```python:グラフを表示するコード
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 10, 0.1)
y = np.sin(x)
plt.plot(x,y)
plt.show()
```
最初は以下のようなエラーになると思います。
これは、仮想環境に「numpy」と「matplotlib」のライブラリがインストールされていないからです。
![2019-07-10_12h12_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101846/ce1af22d-cff7-bc9d-042f-5e35d1272908.png)

* ライブラリをインストールしてみよう。<br>
「Jupyter Notebook」上でライブラリをインストールする場合は、次のように「!」を先頭に付けてください。<br>
```!pip install numpy```

インストールが成功すると以下のように表示されます。
![2019-07-10_12h18_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101846/b10a727a-be3e-206a-c297-f61be4aa47cc.png)

同じように「matplotlib」もインストールしてください。（こっちは、ちょっと時間が掛かります。）
```!pip install matplotlib```

※もちろん、コマンドプロンプトからライブラリをインストールしてもOKです。（「!」はいらないので注意）
![2019-07-10_15h14_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101846/44fb93db-c0aa-9312-ad65-b74e383f1515.png)

* ライブラリのインストールが成功したら、もう一度グラフ表示のコードを実行してみよう。

以下のようなグラフが表示されたらOKです。
![2019-07-10_12h22_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101846/72f88bd3-3c42-2432-7fad-41374dfee659.png)

* 【補足】今回インストールしたライブラリについて

| ライブラリ | 読み方 | 説明 |
|:--|:--|:--|
| numpy | ナムパイ | 学術計算をするためのライブラリ。ベクトルや行列など、機械学習で必要となる形式のデータを簡単に扱うことができる。 |
| matplotlib | マットプロットリブ | グラフ描写ライブラリ。折れ線グラフ、ヒストグラムなど、様々なグラフを簡単に描写することできる。 |

次回は、「3.機械学習って何ですか？」です。
[社内勉強会 機械学習入門（3.機械学習って何ですか？）](https://qiita.com/masami310/items/b173d5cd5295c7f385dc)
Rでデシル分析してみる

デシル分析とは，データを10分割して，ランク1とランク10の違いについて把握することに利用できます．

例えば，売上上位の10%と下位10%の店舗ごとの違いを把握できます．
コードはまとめられていないですが，備忘録がてら投稿します．

# デシル分析

#ライブラリのインポート
```R
library(dplyr)
library()
```


まず，データを売上が高い順に並び替えます．

```R

#データ選択
desiru = df3
desiru2 =desiru[order(desiru$売上, decreasing=T),] 
```

次にデシルランクを付与します．

```R
desiru2$decile_rank <- cut(desiru2$売上,unique(quantile(desiru2$売上,(0:10)/10,na.rm=TRUE)),label=FALSE,include.lowest=TRUE)
```

# ランクごとの平均を求める

```R
#デシルランク1と10だけ選択
desiru4 = desiru2 %>% dplyr::filter(decile_rank == "1" | decile_rank == "10")
desiru4
```

# デシルランクごとの平均値を求める
```

desiru2 %>%
  dplyr::group_by(decile_rank) %>%
  dplyr::summarise_each(dplyr::funs(mean))

desiru4$decile_rank = as.character(desiru4$decile_rank)
ggpairs(desiru4[,c(8,10:13)],aes_string(colour="decile_rank", alpha=0.5))+theme_bw(base_family = "HiraKakuProN-W3")
```

[参考サイト](http://kaeken.hatenablog.com/entry/2019/02/17/185052)
【Laravel】Factory以外でFakerを使う

# Testの場合
traitを読み込む

```PHP
/* 略 */
class SampleTest extends TestCase {
    use WithFaker;
/* 略 */
```
`$this->faker`が使えるようになる

# Test以外の場合

### インポートする

```PHP
use Faker\Factory as FakerFactory;
```
### インスタンスを作る

```PHP
$faker = FakerFactory::create('ja_JP');
```
または

```PHP
$faker = $this->app->make(FakerFactory::class);
```
`$app`とか`$this->app`が存在しない場合は

```PHP
$faker = resolve(FakerFactory::class);
```
参考 https://readouble.com/laravel/5.5/ja/container.html

おわり
独自ルール:GitLab上でのROS2のドキュメント

[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)

ROS2のnode libraryを作成し，内部の誰かに使ってもらうときのドキュメンテーションについて．

# 概要
内部の誰かが自分のプロジェクト(プログラム)を使用する時，主に以下の状況が考えられる．

1. ROS2の勉強のため
2. カスタマイズ・改変のため
3. libraryを利用するため

1,2の場合，ソースを見ることになるが3の場合別にソースを見る必要はない．使えればよい．
ここでは，そのような人に向けたドキュメントの雛形を考える．
言わずもがな当研究室の独自ルールであるが，一般的なより良いお話があれば参考にしたいです．

# 必要な情報一覧

- パッケージ名
    - package.xmlやCMakeLists.txtなどで必要
- node名とインクルードファイル
    - std::make_sharedで実体化するのに必要
- parameter
    - parameter利用のために必要
    - yaml形式で表現するのが楽
- 提供するservice名と必要なsrvのクラス名，インクルードファイル
    - service利用のために必要
- 提供するpublish名と必要なmsgのクラス名，インクルードファイル
    - publish利用のために必要
- 必要な他のnodeとインクルードファイル
    - 当該nodeの情報一覧へのリンクとして表現
- 内部で使用するclient/subscribeは，そのサービスを提供するnodeを知っておいて起動する必要があるので必要

# ドキュメント
内部GitLabのwikisに書くのがよろし．
例えば「Info_for_user」のページを作成する．

「#や##」と「\[\](#...)」によってジャンプできるようにしている．
注意としては，\[...\](#...)の#以降について．

- 大文字は小文字に
- スペースはハイフン(-)に
- ピリオドなどは削除
- 二つ以上の-はひとつの-に

例えば
\# QValues.srv

は\[QValues.srv\](\#qvaluessrv)となる．

## GitLabでの目次
[[_TOC_]]で目次をつくってくれる．

```
[[_TOC_]]

----

# "パッケージ名1"
## "ノード名1"
...

## "ノード名2"
* #include "package_name/hoge.hpp"
* "namespace::クラス名"
* param info
    * [yaml]("リンク")
* service info
    * "サービス名"
        * 意味・概要
        * ["srvファイル名"](#"srvファイル名")
* client info
    * "使用するサービス名"
        * ["提供を確認しているnode1"]("Info for userの当該node1へのリンク")
        * ["提供を確認しているnode2"]("Info for userの当該node2へのリンク")
        *  ...
* publish info
    * "トピック名"
        * 意味・概要
        * ["msgファイル名"](#"msgファイル名")
* subscribe info
    * "使用するトピック名"
        * ["提供を確認しているnode1"]("Info for userの当該node1へのリンク")
        * ["提供を確認しているnode2"]("Info for userの当該node2へのリンク")
        *  ...
* rclcpp::executorの種類
    * SingleThreadedExecutor
        * OK/NG
    * MultiThreadedExecutor
        * OK/NG

# パッケージ名2  メッセージ専用なら以下のようにsrvとmsgで分けたり．
## "srvファイル"
* #include "srv_package_name/add_two_ints.hpp" //ディレクトリなどは適当．．．
* request
    * uint32 a
        * 意味・概要
    * uint32 b
        * 意味・概要
* response
    * uint sum
        * 意味・概要

## "msgファイル"
* #include "msg_package_name/two_ints.hpp" //ディレクトリなどは適当．．．
* topic
    * uint32 a
        * 意味・概要
    * uint32 b
        * 意味・概要

# その他
```
Visual Studio Code Remote - WSL extensionの導入

# はじめに
この記事はVisual Studio Codeの拡張機能"Visual Studio Remote- WSL extension"を導入した際のメモです．

## Visual Studio Remote - WSL extension
Windows上で走らせているVisual Studio Codeから，Windows Subsystem for Linux (WSL)を使うことができるようになる拡張機能です．詳細については下記をご参照ください．
https://code.visualstudio.com/docs/remote/wsl

## 実施環境
OS:
- Name: Microsoft Windows 10 Pro
- Version: 10.0.17763 build 17763

WSL:
- Distribution ID: Ubuntu
- Description: Ubuntu 18.04.2 LTS
- Release: 18.04
- Codename: bionic

### WSLの導入や環境の整備
WSLはすでに導入しています．さらに，WSL上にAnacondaを導入して，自然言語処理の環境を構築（juman, juman++, KNP, pyknp）しています．詳細は過去記事をご参照ください．
https://qiita.com/mocha-N/items/aa397a5bfec758cfebd0

## 動機など
これまでpythonを使った処理は，Windowsマシンに直接導入したpython (Anaconda)と，WSL上に導入したpythonを状況に応じて使い分けていました．しかし，いちいち使い分けるのに煩わしさを感じておりました．最近，ラップトップを新調したのを機に，python系の処理はすべてWSL上で行うことにしました．さらに，pythonを含めたWSL上の処理もWindows側で行っている処理もひとつの開発環境（Visual Studio Code）で行いたかったため，Visual Studio Code Remote - WSL extensionを導入しました．

# 導入の方法と経緯
以下のステップで導入しました．基本的には[公式で紹介されている方法](https://code.visualstudio.com/docs/remote/wsl#_getting-started)です．

1. Remote - WSL extensionのインストール
2. プロジェクトフォルダを開いて初期設定
3. コードの実行

WSLやVisual Studio Codeのインストール，Remote - WSLの導入はすでに行っていますので省略します．詳細は[公式ホームページ](https://code.visualstudio.com/docs/remote/wsl#_getting-started)や[過去記事](https://qiita.com/mocha-N/items/aa397a5bfec758cfebd0)をご覧ください．

## Remote - WSL extensionのインストール
公式ホームページの通りです．
https://code.visualstudio.com/docs/remote/wsl#_getting-started

私の環境では，VS Codeを起動した直後のWelcomeページ（Help -> Welcome）で，Customizeの欄をクリック→左側に現れる検索バーに「Remote - wsl」と入力し，インストールしました．

お試しなので.gitattributesの設定は行っていません．

## プロジェクトフォルダを開いて初期設定を行う
こちらも公式ホームページの通りです．
https://code.visualstudio.com/docs/remote/wsl#_getting-started

`code .`を実行して新しいウィンドウが立ち上がり，しばらくすると使えるようになります．ウィンドウ左下の角に「WSL」というインジケーターが表示されるはずです．
なお，pythonのコードを開いた場合，python extensionの導入もおすすめされます．ついでに導入しておきました．

### pythonコードの実行
terminalを立ち上げて（ctrl + @），コードの場所まで移動して以下のように実行しました．

```
$ python3 my_script.py
```

# おわりに
PyCharmでも同様のことができるようですが，お金がかかるようなので諦めました．
https://pleiades.io/help/pycharm/using-wsl-as-a-remote-interpreter.html

以上です．
HAL APIタイマで1秒周期から500ms周期にできなかった話

##環境

* Terasic DE0-Nano
* Quartus Prime 18.1 Lite Edition
* [Altima NIOS II による開発　セクション１](https://www.altima.jp/members/japanese/download/nios2_sw_sc1_v10.pdf)のページ７にある通りコード中にHAL APIタイマを実装した。

##1秒周期から500ms周期にすると割り込みが入らずに１回で終わる
alt_ticks_per_second()\*0.5として、500ms周期のタイマを期待したが、1回きりの実行で終わってしまう。
Debugモードでalt_ticks_per_second()の値を見ると、1が返っていた。どうやら1×0.5=0.5 →0となっていたためらしい。
Platform editorでtimer_0のTimeoutの設定が「1s」であるからalt_ticks_per_second()が1であるらしい。
Timeoutの設定を1msとすると、alt_ticks_per_second()が1000に変化したので、alt_ticks_per_second()*0.5として期待の動作になった。


##余談
この件の最中、Debugモードがおかしくなった。
具体的には、ファイルcrt0.sのmovui r2, NIOS2_DCACHE_SIZEでブレークしてしまい、
Continueしても画面が変化せず、main()に進まない。
結局、NiosII Debug画面のBreakPointViewのRemove All BreakPointと、Clean Projectをして正常動作になった。
原因不明で腑に落ちないけども。
Rails console でも FactoryBot のメソッド呼び出しを簡単にする

Ruby on Rails + FactoryBot で開発をおこなっていると、Rails console を使ってサクッとデータを作成して REPL で検証したくなることがあります。この時 `FactoryBot.create()` や `FactoryBot.build()` と書かなければならず、普段テストで書いている `create()` や `build()` に比べると若干の面倒さが目立ってしまいます。

僕は怠惰なので以下のような hook を `.pryrc` に書いてこの問題を解決してみました。

```ruby
# -*- mode: ruby -*-
Pry.hooks.add_hook(:before_session, "use FactoryBot shorthand") do |output, binding, pry|
  Object.include FactoryBot::Syntax::Methods
end
```

これでいつでも `create(:user)` や `build(:user)` でユーザーを作成することができます。

なお、みなさんご想像の通りトップレベルに世界の開発者が想像もしないようなメソッドを生やすので世界が壊れるかもしれません :innocent:
npm install がエラーになった時



```
npm install
```

↓


```
npm ERR! Cannot read property 'match' of undefined

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2019-07-09T07_33_15_926Z-debug.log
root@3c99a0cc0099:/usr/src/app/react_app#
```




### 解決方法
**papackage-lock.jsonを消す。**
↓
再度コマンドを試したらできました。

package.jsonとpackage-lock.jsonの内容が合ってないとこうなるみたいです。





参考：
『先日、npm でエラーが発生してビルドに失敗しました。』
https://www.nekoni.net/Blog/Article/npm-err-cannot-read-property-match-of-undefined
踏み台サーバ利用のssh自動ログインTeratermMacro 

AS400の担当を外れ、Linux、UNIXシステムの運用担当にアサインされて早2か月。
いろいろ不満が出てきました。で作ったのが以下マクロ。
Linuxはノウハウがネット上に転がっているからいいよね。

##はじめに

IDを入力するのは**面倒くさい。**
パスワード管理ソフトからパスワードをペーストすることも**面倒くさい。**
宛先ホストのホスト名やIPアドレス入力も**面倒くさい。**
踏み台サーバを利用していて、ssh接続コマンドの投入も**面倒くさい。**
鍵ファイルをいちいち配置するのも**面倒くさい。**
気の利いたTeratermマクロを、ググりながら作るのも**面倒くさい。**
新しい接続先ができる都度新たな自動ログインマクロを作るのも**面倒くさい。**
~~パスワードの平文保管禁止のルールがあって**面倒くさい。**~~

**といった、面倒くさい諸々を、以下写経頂くだけであらかた解決します！**

##前提環境

windowsから2段階でssh接続（標準ポート番号使用）、踏み台サーバ利用


##本体

まずは、本体。定義のところは記入してください。

```ttl:#auto_login_sub.ttl
;#################################################################
;定義・ID/PWの読み込み
;#################################################################
;ログの吐かれるパスを記入します、Teratermにデフォルトのログ設定済だとそちらが優先されますが、ログファイルにホスト名も載るのでこちらの利用がおすすめ。
LOGPATH = '\\hogehoge\logs\'

;踏み台サーバのホスト名またはIPを記入します
FUMIDAI_HOSTNAME = ''

;自分のIDを記入します
USERNAME = ''

;パスワード保管ファイルのパスを記入します
PASSFILE = '\\hogehoge\IDPW.dat'

getpassword PASSFILE USERNAME PASSWORD

strsplit param1 '_' 3
TGT_HOSTNAME = groupmatchstr2

;#################################################################
;ログイン、接続処理
;#################################################################
:login_step
msg = FUMIDAI_HOSTNAME
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg USERNAME
strconcat msg ' /passwd='
strconcat msg PASSWORD
connect msg

settitle"自動ログインマクロ" 

;#################################################################
;操作ログの自動保存処理
;#################################################################

getdate datestr 
strcopy datestr 1 4 yearstr 
strcopy datestr 6 2 monthstr 
strcopy datestr 9 2 daystr 
gettime timestr 
strcopy timestr 1 2 hourstr 
strcopy timestr 4 2 minutestr 
strcopy timestr 7 2 secondstr 

strconcat LOGPATH yearstr 
strconcat LOGPATH monthstr 
strconcat LOGPATH daystr 
strconcat LOGPATH '_'
strconcat LOGPATH hourstr 
strconcat LOGPATH minutestr 
strconcat LOGPATH secondstr 
strconcat LOGPATH '_'
strconcat LOGPATH groupmatchstr1
strconcat LOGPATH '_'
strconcat LOGPATH groupmatchstr2
strconcat LOGPATH '.txt'

logopen LOGPATH 0 0

wait ' ~]$'
logoncommand = 'ssh '
strconcat logoncommand USERNAME
strconcat logoncommand '@'
strconcat logoncommand TGT_HOSTNAME
strconcat logoncommand ' ; exit'
sendln logoncommand

wait 'password:' 'Password:' 'Are you sure you want to continue connecting (yes/no)?'
if result <= 2 then
 sendln PASSWORD
else
 sendln 'yes'
 wait 'password:' 'Password:'
 sendln PASSWORD
endif
```
##パスワード登録ツール

続いて、パスワード登録ツール。


```ttl:#setpassword.ttl
;パスワード保管ファイルのパスを記入します
PASSFILE = '\\hogehoge\IDPW.dat'

inputbox 'ユーザ名' 'データ入力画面'
USERNAME = inputstr

:try_password
passwordbox 'パスワード' 'データ入力画面'
PASSWORD = inputstr
passwordbox 'パスワード（確認用）' 'データ入力画面'
strcompare PASSWORD inputstr
if result = 0 then
 goto save
else
 messagebox "新パスワードが一致しません。再入力してください。" "エラー"
 goto try_password
endif

:save
setpassword PASSFILE USERNAME PASSWORD
messagebox "IDとPWが正常に保管されました。" "成功！"
```

##接続対象ホスト毎に作るマクロ

実際に叩く（ダブルクリックする）マクロがこちら。
ファイル名にホスト名、IPアドレスを入れてください。
これを、管理対象のサーバの数だけ生成しておきます。

```ttl:hostname_hostipaddr_.ttl
include '#auto_login_sub.ttl'
```


細かいエラーハンドリングはさすがに面倒見きれません。ご容赦を。

初回、#setpassword.ttlを叩いてパスワード登録してから使ってくらはい。

ほなね。
【Rails / erb】form_tagをform_forに書き換える

初めまして！
Rails初学者が初めてQiitaで書きます！

###form_forってどうやって書いたらいいの？
---
アプリを作成する際に苦戦したので備忘録として記事を残しておきます。

```ruby:form_for基本形
<%= form_for (modelobject, option) do |f| %>
 フォームコントロールの設定
<% end %>
```
これ書いたらformが作成されると思っていましたが、うまくいきません。
###まずはビューの部分を記述する
---
```ruby:new.html.erb
<div class="contents row">
 <%= form_for @post do |form| %>
//@postにフォームコントロール内で入力する値を入れる//
  <h5>タイトル</h5>
   <%= form.text_field :content, placeholder: 'content' %>
  //ブログのタイトルを入力する為のtext_field
  <h5>本文</h5>
   <%= form.text_field :content, placeholder: 'content' %>
　　//ブログの本文を入力する為のtext_filed
  <%= form.submit "SENT" %>
　//送信ボタン
 <% end %>
</div>
```
###次にcontrollerを編集する
---
```ruby:posts_controller.rb
class PostsController < ApplicationController

  before_action :move_to_index, except: [:index, :show]
  def new
    @post = Post.new
    //新規作成された値は@postに入れる
  end
  //~省略~
```
これでform_for内で入力した値は@postに渡されます！
新規作成のフォームは完成したので次は編集する時のフォームの書き方。

###編集のビュー部分の作成
---
```ruby:edit.html.erb
<div class="contents row">
  <%=form_for @post, url => {action: 'update'} do |form|%>
  //form_forのupdateアクションを明示する為にaction:を指定
　　<h5>タイトル</h5>
     <%= form.text_field :title, placeholder: 'title:最大文字数20文字まで' %>
   <h5>本文</H5>
     <%= form_text_field :content. placeholder 'content'%>
   <%= form.submit "SENT" %>
 <% end %>
</div>
```

###次にcontrollerを編集する
---
```ruby:posts_controller.rb
class PostsController < ApplicationController
  before_action :set_post, only: [:edit, :show]
  //共通のアクションはcallbackする為、before_action内に設定
〜省略〜
  def show
  end

  def edit
  end

  private

  def set_post
    @post = Post.find(params[:id])
  end

  def post_params
    params.require(:post).permit(:content, :title)
  end
end
```
以上でform_forでフォームの新規作成と編集ができるようになりました！

###最後に
---
######筆者について

TEXH::EXPERT渋谷校の夜間クラスで4月からRuby・Railsの学習をしています。
記載内容に不備・不足があればご指摘いただけると幸いです。
至らぬ点ばかりですので、改善点がありましたらどんどんご指摘下さい！
Hello Docker するだけの Docker Image を作る

Docker 触ったことない人向け。
Dockerfile を書く心理的障壁を下げることを目的とする記事です。

docker コマンドがインストール済であることを前提としています。
インストールがまだの人はこちらをご参照の上、インストールお願いします。https://docs.docker.com/get-started/

# Dockerfile

今回、実行環境は Ubuntu を使うことにします。
Version は xenial を使うことにします。

Ubuntu の Version およびサポート期間などは以下を参照。
https://www.ubuntulinux.jp/ubuntu

Dockerfile から参照する Ubuntu の Docker Image
https://hub.docker.com/_/ubuntu

```yaml:Dockerfile
FROM ubuntu:xenial

RUN echo "Now building..."

CMD echo "Hello Docker"
```

# Docker Image 作成

`docker build <image name> <dir path>` コマンドを実行。
`<dir path>` には Image に固める file が配置されているパスを指定します。


```sh
$ cd <Dockerfile が配置されているディレクトリ>

$ docker build -t hellodocker .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu:xenial
 ---> 7e87e2b3bf7a
Step 2/3 : RUN echo "Now building..."
 ---> Using cache
 ---> 5045cdd6bdcd
Step 3/3 : CMD echo "Hello Docker"
 ---> Using cache
 ---> 87c1c9ff264e
Successfully built 87c1c9ff264e
Successfully tagged hellodocker:latest
```

# Hello Docker

`docker run <image name>` コマンドを実行。

```sh
$ docker run hellodocker
Hello Docker
```

以下のようにすると `docker run` 時に起動したコンテナの bash セッションを生成することができます。

```sh
$ docker run -it hellodocker /bin/bash
root@b48d469b6a68:/# 
```

# 参考

https://qiita.com/nl0_blu/items/1de829288db2670276e8
goofys で sftp ユーザの chroot を s3 バケット配下のディレクトリにできなかった備忘

goofys でマウントした s3bucket

```
#df -h
Filesystem        Size  Used Avail Use% Mounted on
[bucket name]  1.0P     0  1.0P   0% /data/s3bucket
```

goofys でマウントした s3bucket と
sftp ユーザが接続直後にアクセスするディレクトリ

```
# pwd
/data

# tree
.
|-- chroot ← sftp ログインユーザ用のオーナーにしたシンボリックリンクを用意
|   `-- SFTP_USER -> /data/s3bucket/SFTP_USER
`-- s3bucket ← goofys で s3Bucket をマウントする先
    `-- SFTP_USER

# ls -la chroot/
lrwxrwxrwx 1 SFTP_USER SFTP_USER 24 Jul 10 10:44 SFTP_USER -> /data/s3bucket/SFTP_USER
```

SFTP のユーザと chroot 先の設定

```
# cat /etc/ssh/sshd_config
〜省略〜
AllowUsers SFTP_USER
〜省略〜
Match Group supplier
  ChrootDirectory /data/chroot/%u
〜省略〜
```
sftp 鍵認証用に Linux ユーザ home 配下 .ssh/authorized_keys へ公開鍵を追加

ローカルから SFTP サーバへ接続

```
# sftp -oIdentityFile=~/.ssh/[id_rsa秘密鍵] [SFTP_USER]@[SFTPサーバ]
packet_write_wait: Connection to [SFTPサーバ] port 22: Broken pipe
Connection closed
```

このときの sftp サーバの message と secure ログ

```
# tail -f /var/log/messages
systemd: Created slice User Slice of [SFTP_USER].
systemd: Starting User Slice of [SFTP_USER].
systemd-logind: New session 18 of user [SFTP_USER].
systemd: Started Session 18 of user [SFTP_USER].
systemd: Starting Session 18 of user [SFTP_USER].
systemd-logind: Removed session 18.
systemd: Removed slice User Slice of [SFTP_USER].
systemd: Stopping User Slice of [SFTP_USER].

# tail -f /var/log/secure
Accepted publickey for [SFTP_USER] from [SFTP SERVER] port <省略> ssh2: RSA <省略>
pam_unix(sshd:session): session opened for user [SFTP_USER] by (uid=0)
fatal: bad ownership or modes for chroot directory "/data/chroot/[SFTP_USER]" [postauth]
pam_unix(sshd:session): session closed for user [SFTP_USER]
```

bad ownership or modes for chroot directory

シンボリックリンクの権限では sftp を騙せないんですね。。。

その後わかったこと

```
Cent os 6 では uid gid ともに 500 番台から 7 では 1000 番台から。
そのため s3fs でも 7 では usermod grpmod で id を 6 に合わせる必要がある。

sftp の chroot 先は root:root の 755 の必要あり。

これが制限となり共通グループがあっても 775 ではないため、書き込みと削除が出来ない。
```
[Salesforce]バッチスケジュールに追加

スケジュールに追加

追加方法は２つある

設定->開発->Apexクラスを選択。
画面内のApexをスケジュールをクリック。

![apex_schedule01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/6e4cdd72-b3b2-3352-929e-4ca0cc0b54a0.jpeg)

この中で毎月や毎日、などを選択できる。
終了日も設定出来るので、ずっと動作するさせるものに関しては長めに設定しておく。

![apex_schedule02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/884a3c2f-5c98-d24c-0d8a-9e1d7ff0302d.jpeg)

コードで実行
設定画面から追加での最大のデメリットは実行時間が毎時0分のみ、と、分の指定ができないところ。
これをさせようと思うとコードからジョブに追加してやる必要がある。

以下が追加させるコード

System.schedule('ジョブ名','0 0 * * * ?', new Schedule_sample());
第二引数に指定しているものは、クーロン式、というもので、ここで時間指定をしている。
これは、左から、秒、分、時、日、月、曜日、年となっている。
(年は省略化)

例）

‘0 0 13 * * ?’：毎日13時に実行
‘0 0 10 ? * MON-FRI’：月～金の10時に実行
‘0 0 * * * ?’：毎時0分に実行
‘0 30 * * * ?’：毎時30分に実行
秒のみの指定は怖くて試してません。

この実行式を開発者コンソールの匿名実行から実行することでジョブに追加させられる。

![apex_schedule03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/684932b2-afa8-87c1-b10e-d1188333bc36.jpeg)

コードを書いて、実行ボタンをクリック。

![apex_schedule04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/663eecf5-d9a2-a4d2-07f8-8fb53f562a3f.jpeg)

テスト
テストコードはスケジューラに対して実行する。

Schedule_sample_Test.apxc

@isTest
public class Schedule_sample_Test {
  public static String CRON_EXP = '0 0 0 15 3 ? 2022';
  
  static testmethod void test() {
      //データ準備
  
      Test.startTest();
      String jobId = System.schedule('ScheduleApexClassTest', CRON_EXP, new Batch_sample());
      Test.stopTest();
      
      //バッチ後のデータ確認
  }
}

指定するクーロン式はなんでもよくて、Test.stopTest();の後にすぐにスケジュールが実行される。
TFSのエージェント追加ではまる...

# 参考サイト
◆Team Foundation Server のXAMLでない方のビルド定義の作成・実行を１から解説する
　https://redwarrior.hateblo.jp/entry/2018/08/09/090000
　　※もっと早くこのサイトを見ていたら。。。

◆Windowsの不要な「サービス」を削除する方法〈アンインストール失敗！？〉 
　https://money-affairs.com/delete-unnecessary-service/
　　※"sc delete"

# 気をつけないと...
□エージェントの作業フォルダのパス
　⇒　以外とHDD容量消費するから、別ドライブにしておくこと
□登録失敗時の後始末
　⇒　Windowsサービス消さないと...前述のサイト見て
Windows EventLogにDistributedCOMのエラーを見て見ぬふりをやめてみた

#さて、問題
イベントログに１分ごとエラーが発生している。
DB管理者から離れたが、別の調査でもう我慢できなくなった。

```
アプリケーション固有 のアクセス許可の設定では、CLSID 
{2DC39BD2-9CFF-405D-A2FE-D246C976278C}
 および APPID 
{DB336D8E-32E5-42B9-B14B-58AAA87CEB06}
 の COM サーバー アプリケーションに対するローカルアクティブ化のアクセス許可を、
アプリケーション コンテナー 利用不可 SID (利用不可) で実行中のアドレス LocalHost (LRPC 使用) の
ユーザー NT SERVICE\SQLSERVERAGENT SID (S-1-5-80-344959196-2060754871-2302487193-2804545603) に与えることはできません。
このセキュリティ アクセス許可は、コンポーネント サービス管理ツールを使って変更できます。
```

#対応
下記の参照の手順は
1. Click Start -> Run -> Type -> dcomcnfg, expand Component Services -> Computers -> My Computer -> DCOM Config.
2. Click View -> Detail -> Now you will get Application Name and Application ID in right side.
3. Scroll down and find the application ID {AD65A69D-3831-40D7-9629-9B0B50A93843} -> Right Click -> Properties and select the Security tab.
3. Click Customize under "Launch & Activation Permission" -> click Edit -> Add in the account NT AUTHORITY\SYSTEM and set local launch and local activation.
4. Restart the application Service linked to this Application ID or restart the server and monitor

整理すると、
[dcomcnfg]でコンポーネントサービスを開いて、[DCOM構成]で[アプリケーション]を探し、イベントログに出る[ユーザ権限]を追加する
エラーが止まった。あースッキリした。

#参照
https://social.technet.microsoft.com/Forums/windows/en-US/dfc465bc-7bbd-483e-b98b-2ba56fa98313/the-applicationspecific-permission-settings-do-not-grant-local-launch-permission-for-the-com-server?forum=configmgrgeneral
PINRemoteImageのキャッシュに保存された画像をロードする方法

# 動機
PINRemoteImageManagerでキャッシュした画像を`UIActivityViewController`を使ってシェアしたかった。
そのときにどうやってキャッシュしたUIImageを取得するかわからなかったため。

# 方法
PINRemoteImageManagerの`downloadImage`メソッドを使う
用意されたメソッドを使うだけだが意外と調べても出てこなかったのでメモ。

```swift
guard let url = url else { return }
_ = PINRemoteImageManager.shared().downloadImage(with: url) { (result) in
  // resultはPINRemoteImageManagerResult型でimageプロパティから画像が取得できる
  var activityItems: [Any] = [result.image]
}

```

## こそっとリファレンスを見てみる
#### Summary
> Download or retrieve from cache the image found at the url. 
> All completions are called on an arbitrary callback queue unless called on the main thread and the result is in the memory cache (this is an optimization to allow synchronous results for the UI when an object is cached in memory).

日本語訳
> URLで見つかったイメージをダウンロードするか、キャッシュから取得します。
> すべての補完は、メイン・スレッドで呼び出され、その結果がmemory cache(これは、オブジェクトがメモリにキャッシュされたときのUIの同期結果を可能にする最適化です。)にない限り、任意のcallbackで呼び出されます。

キャッシュがあればキャッシュから取得、無ければダウンロードしてくれる便利メソッドでした。
Pinterest様様ですね。


#### Declaration
```swift
downloadImageWithURL:(nonnull NSURL *)url
          completion:(nullable PINRemoteImageManagerImageCompletion)completion;```
Cisco ASA/ColdFusion/sftp トラブルシュートメモ 7/10版

ただのメモです。

# 環境

```
内部サーバ === Cisco ASA === (Internet) === SFTPサーバ
```

毎晩動かしてるバッチで、内部サーバからSFTPサーバへアクセスし、ファイルをダウンロードしている。
バッチはColdFusionでできている。


# トラブル

ある日、SFTPサーバへの接続でタイムアウトするようになった。


# 調べたこと/試したこと

## 手動でsftp :ok: 

バッチではなく、手動でsftpを動かして見た。
問題なし。なぜ。。。？


## ASAのService Policy Rule :question: 

ASAのService Policy Ruleで、ssh接続に制限をかけていたので外してみた。
Outsideインターフェースなので意味なさそう。

外したら、ログイン時ではなく、ファイルダウンロード時にタイムアウトするようになった。
不思議だ。:confused: 

## ASAでセッションを確認

ASAにssh接続し、`enable`後`show conn all`すると、セッション情報が出てきます。

flags UIO状態で、200件超溜まっていました。
カウントは`show conn count`

flgasの意味
https://networkengineering.stackexchange.com/questions/45099/asa-conn-flags-explain

> The Conn Flags UIO means: Three-way handshake (U) is completed and the inside host (192.168.1.3) initiated the traffic (we know that because there is no Flag B at all). inside host (192.168.1.3) has received data from and sent data to outside host (10.23.232.217) on TCP port 443 (IO)

## 内部サーバで`netstat -an`

sftp接続がたくさん出てきた。 :exclamation: 

# 推測

バッチがsftpを切断しないので、どこかの制限に引っかかっている？
Lightning Componentでレコードタイプ毎に動的にページ作成

メモ。

ヘルパーでレコードタイプ取得して、Apexでそのレコードタイプのページレイアウトのメタデータを取得してリストに突っ込んでコンポーネントで表示。

とりあえず、レイアウトのメタデータを取得して画面に表示できたのでそのときのコードをメモ。

```javascript:testHelper.js
handleInit : function( component, event, helper ) {
	var recordTypeId = component.get( "v.pageReference" ).state.recordTypeId;
	var action = component.get( "c.getLayoutMetadata" );
    // 実際はここで recordTypeId を action に set する
	action.setCallback( this, function( data ) {
		component.set("v.sectionList", data.getReturnValue());) );
    });
    $A.enqueueAction(action);
}
```

```java:OpportunityController.cls
@AuraEnabled
public static List<List<List<String>>> getLayoutMetadata() {
    //実際はここで recordTypeId を受け取って名前が一致するレイアウトをクエリで取得する
    List<String> componentNameList = new List<String>{'Opportunity-testLayout'};

    List<Metadata.Metadata> components = Metadata.Operations.retrieve(Metadata.MetadataType.Layout, componentNameList);
    Metadata.Layout layout = (Metadata.Layout)components[0];
    List<List<List<String>>> sectionList = new List<List<List<String>>>();
    for ( Metadata.LayoutSection s : layout.layoutSections ) {
        if ( s.LayoutColumns == null  ) {
            continue;
        }
        List<List<String>> columnList = new List<List<String>>();
        for ( Metadata.LayoutColumn c : s.LayoutColumns ) {
            if ( c.LayoutItems == null  ) {
                continue;
            }
            List<String> itemList = new List<String>();
            for ( Metadata.layoutItem i : c.LayoutItems ) {
                if(i.field != null) {
                    itemList.add( i.field );
                }
            }
            columnList.add( itemList );
        }
        sectionList.add( columnList );   
    }
    return sectionList;
}
```

```html:test.cmp
<aura:component implements="flexipage:availableForRecordHome,force:hasRecordId,lightning:actionOverride,lightning:hasPageReference" 
                access="global"
                controller="OpportunityController">
    <aura:attribute name="recordId" type="Id" />
    <aura:attribute name="sectionList" type="List" />

    <aura:handler name="init" action="{!c.doInit}" value="{!this}" />

	<aura:iteration aura:id="sectionId" items="{!v.sectionList}" var="columnList" indexVar="index"></aura:iteration>
	    <div class="slds-grid slds-gutters">
	        <div class="slds-size_5-of-12">
	            <aura:iteration aura:id="itemId1" items="{!columnList[0]}" var="item" indexVar="index">
	                <lightning:inputField aura:id="{!item}" fieldName="{!item}"/>
	            </aura:iteration>
	        </div>
	        <div class="slds-size_1-of-12">
	        </div>
	        <div class="slds-size_5-of-12">
	            <aura:iteration aura:id="itemId2" items="{!columnList[1]}" var="item" indexVar="index">
	                <lightning:inputField aura:id="{!item}" fieldName="{!item}"/>
	            </aura:iteration>
	        </div>
	    </div>
	</aura:iteration>
</aura:component>
```

クラスでField以外のメタデータ情報を持っておけばセクションをきれいにわけたり、1列表示と2列表示を区別したりもできそう。
AWSで利用するSSL証明書管理をIAMからACMに変更するべき理由

# はじめに
自分が担当しているシステムでELBに登録しているSSL証明書をIAM管理からACM管理に変更しました。
AWS機能を利用してSSL証明書を管理する方法は２つあります。
IAMを利用する方法とACMを利用する方法です。
なぜ今までIAMで管理していたのか、ACMにすると何が良いのかを纏めておきます。

# 基本知識まとめ
まず基本情報についてざっと纏めます。

## SSL証明書の種類
DV証明書：ドメイン証明書。ドメイン名が正しいかどうかを認証。
OV証明書：ドメイン名に加え、会社名も証明。
EV証明書：DV、OVよりも厳格な審査がある。

セキュリティレベルの高さはEV→OV→DVの順です。DVがセキュリティレベルが一番低く簡単に認証を受けられます。

参考　今さら聞けないSSL証明書とは、DV、OV、EVとは、常時SSLについて
https://shared-blog.kddi-web.com/network/244/

## IAMの基本情報
正式名称：AWS Identity and Access Management
ローンチ日：2010/9/2
機能概要：AWS リソースへのアクセスを安全にコンソールするためのウェブサービス

参考　AWS Identity and Access Management　ユーザーガイド
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction.html

## ACMの基本情報
正式名称：AWS Certificate Manager
ローンチ日：2016/1/21（東京リージョンローンチ日は2016/5/16）
機能概要：AWS ベースのウェブサイトとアプリケーション用のパブリック SSL/TLS 証明書の複雑な作成と管理を処理
証明書のインポート機能ローンチ日：2016年10月あたり

参考　AWS Certificate Manager　ユーザーガイド
https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/import-certificate.html

# 今までIAMで管理していた理由
ローンチ日を見るとACMは2016年と比較的最近リリースされています。
システム構築時はIAM一択であったことがわかりました。
さらに2016年10月にACMで外部の証明書インポート機能がリリースされたことにより、
IAMを選択する理由はほぼなくなりました。

ELB作成時のSSL証明書選択画面からもACM推奨であることが明記されています。
<img width="384" alt="ALBのSSL証明書選択画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/4099e521-3403-094c-b3f7-cf49b3e6690a.png">

# ACMのすごいところ
自分が感じたACMのメリットを並べてみます。（もっとあった気が。。）
・無料でDV証明書を作成できる（これは驚きました）
・ACMで作成したDV証明書は自動更新される

# まとめ
外部に公開しているシステムだとOV証明書必須の場合が多いかと思いますが、
社内利用のみのシステムであればDV証明書でも問題ないのではないでしょうか。
IAM管理されているDV証明書があったらぜひACMへの移行を検討してみてください。
※2015年以前に構築され、SSL証明書を利用しているシステムは同様の状況になっていることがあるのでは
【編集中】「このワークステーションとプライマリドメインとの信頼関係に失敗しました。」多発...

# TODO
- [ ]  解決方法や現状を追記!!

※多分、ドメインコントローラ降格でうまくいったはずなんだけど、この記載だとよくわからないから、一旦確認して追記するようにする。


# 参考サイト
◆セキュアチャネル破損からの復旧方法まとめ
　https://www.globalmarry.info/it/repair-from-securechannel-fail/
　　※"Test-ComputerSecureChannel -credential Administrator -repair"
　　※このサイトにある、「DC 間でセキュアチャネルが破損しているときに複製が失敗する仕組み」が今発生していると思われる...
　　※"klist purge"
　　※"netdom resetpwd /s:server2 /ud:mydomain\administrator /pd:*"

◆ドメイン コントローラー降格手順 (Windows Server 2012)
　https://blogs.technet.microsoft.com/jpntsblog/2013/11/17/windows-server-2012/
◆Netdom.exe を使用して Windows Server ドメイン コントローラの コンピュータ アカウント パスワードをリセットする方法
　https://support.microsoft.com/ja-jp/help/325850/how-to-use-netdom-exe-to-reset-machine-account-passwords-of-a-windows

◆検証用ドメインコントローラでよく使うバッチ記述５選（おまけ２個）
　https://www.globalmarry.info/it/bat-at-dc/
　　※役立ちそうなコマンドならんでいたから、後で見る

◆[Windows] 2018年5月の更新以降リモートデスクトップ接続ができない
　http://faq.mypage.otsuka-shokai.co.jp/app/answers/detail/a_id/294798/~/%5Bwindows%5D-2018年5月の更新以降リモートデスクトップ接続ができない
　　※「認証エラーが発生しました。要求された関数はサポートされていません」というエラーも多発して困っているんですよね…

◆ある日の AD トラブルと修復 take3
　http://www.gulf.or.jp/~too/win/ad_trouble3.html
　　※"repadmin"

◆ソース：kerberos　イベントID　4　ファイルサーバーへのアクセスが拒否される
　https://social.technet.microsoft.com/Forums/ja-JP/862fa078-1735-4a0f-9598-1c0f86dbe1b9/12477125401247365306kerberos1228812452125051253112488id12288412288?forum=activedirectoryja
　　※これもイベントビューアで多発している...
　　※DNS設定に問題がある場合はここのサイトをチェック
　　　"setspn"

# 問題解決に向けて...
□イベントビューアを見て状況確認
　⇒　ドメインコントローラを降格させてどうなるか!?　Coming Soon...
覚書 BlenderでVoxelとRigfyをFBXでエクスポートしてUnityに取り込む

完全な覚書

前提条件
・MagicaVoxelですでにモデルは作った
・Rigfyのボーンをモデルに合わせた


### 自分の場合は別のアーマチュアにモデルが紐づいている状態、これを新しいBornHmdに紐づける

<img width="2340" alt="190710-0001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/1113cea5-7f15-0dd4-5b24-5ac2ed95ffe5.png">

### モデルを選択し、オブジェクトモードで複製
<img width="1822" alt="190710-0002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/1fdc3701-e435-bad9-b9e4-6b7f375f7b9c.png">

### 複製が出来上がったがまだ旧アーマチュアと紐づいている
![190710-0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/52f94e50-efcf-5a79-366f-d68bfddf3356.png)

### 旧アーマチュアと親子関係を解消
<img width="1844" alt="190710-0004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/ad8d8646-0abc-d45d-ef1c-bac4bc81b3ae.png">

### これで外れた
![190710-0005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/2f5ed4b4-893b-32da-ba11-99ee79307d11.png)

### 名前とかをわかりやすく（必要ならば）
![190710-0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/cfc89455-1b17-9811-67be-f4c63477dec8.png)

### オブジェクトモードでモデル>ボーンの順番で選択

shiftを押しながら選択すると複数選択できる、順番が大切
![190710-0007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/b4816288-e7df-3256-c5cf-5f1c32be74cd.png)

### 新しいアーマチュアと親子関係になる
<img width="1868" alt="190710-0008.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/50cbf563-1b22-dce8-ffe6-acc3decc01cc.png">

すぐにこの画面が出るので自動ウェイトを選択する
<img width="1868" alt="190710-0009.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/816d1a8c-86da-3987-e0a7-66114272998d.png">

### BornHmdの子として登録された
![190710-0010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/f7922f7c-4dbf-78ba-2140-3d6dc64b8e4b.png)

## ポーズモードに変更し、ボーンにウェイトが乗っているか確認
<img width="1660" alt="190710-0011.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/83f48db7-5d57-d819-327f-60aa1e266b66.png">

### FBXでエクスポート
<img width="1008" alt="190710-0012.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/331187d6-2d4f-af11-5081-c9de03c94364.png">

### 設定周り
![190710-0013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/c7939550-eace-1870-d433-518936e4df96.png)
![190710-0014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/fbb37736-38a6-d317-a4e7-0d13f3eb037e.png)
![190710-0015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/b5eb1c76-c9e0-a728-62be-21cfbcbacd62.png)
![190710-0016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/03096b26-ae03-d930-2e30-1076d0d389a4.png)

### Unityに持っていく
![190710-0019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/b87a19b5-5de4-0c8e-67a8-61ba090b938e.png)

ボーンやアーマチュアがエクスポートされない場合はJoinを試してみる.
オブジェクトモードでモデル>ボーンの順番で選択し、Join(Cntl + j)

<img width="2114" alt="190710-0017.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42874/f45e9f72-427a-5e39-8aae-d17bb315c42c.png">

ちょっと最近暇つぶしに昔の資産を引っ張りだしていたりする
【Vue.js】テンプレートがコンパイルできない【Error】

vue-cliでvue-routerの学習をしようとしたらエラーが出てしばらくハマったので、解決法を載せます。

【条件】
`vue --version:　3.9.2`

【出力エラー】

```
[Vue warn]: You are using the runtime-only build of Vue where the
template compiler is not available. Either pre-compile the templates
into render functions, or use the compiler-included build.
```

##エラーが出た経緯

vue-cliでvue-routerを取り入れ、こんな感じにいじりました。

```vue:App.vue
<template>
  <div id="app">   
      <router-link to="/top">トップ</router-link> |
      <router-link to="/users">ユーザー</router-link>
    <router-view/>
  </div>
</template>
```
```javascript:router.js
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/top',
      component: {
        template: '<div>トップページです</div>'
      }
    },
    {
      path: '/users',
      component: {
        template: '<div>ユーザーページです</div>'
      }
    },
  ]
})
```
「トップ」と「ユーザー」をクリックするとページが切り替わる、という簡単なコードです。
これでいけるはずなのですが、先ほどのエラーが出ました。

##解決法
vue-cliで生成されたディレクトリ直下に『vue.config.js』というファイルを作成。
そこにこのコードをうちます。

```javascript:vue.config.js
module.exports = {
  configureWebpack: {
    resolve: {
      alias: {
        'vue$': 'vue/dist/vue.esm.js'
      }
    }
  }
}
```
そして、npmサーバーをもう一回立ち上げます。
**もう一回立ち上げないとずっとエラーのままですので注意してください。**(ここでかなりハマりました)

###原因
簡単に説明すると、templeteオプションはブラウザにJITコンパイルされる時にrender関数へ変換されます。
その為に必要なファイルがvue-cliのデフォルトの状態では入っていないので、完全ビルドをする必要があります。
（完全ビルドよりも最初の設定の方が30%軽量らしく、初期設定では入っていないようです。）
ちょっと古いですが、こちらの記事が大変参考になりました。
[Vue2.x系のハマりどころ templateとコンパイラを完全解説するよ](https://aloerina01.github.io/javascript/vue/2017/03/08/1.html)

---
以上です。
学習を始めようとした時にいきなりこういうエラーにハマるのは挫折の原因になりかねないので、記述しておきます。
補足、修正などありましたらご教授お願いします。
最後まで読んでいただきありがとうございます。
今までMacのGitで経験した環境トラブル集

# 今までMacのGitで経験した環境トラブル集
職場に新メンバーが加わった時とかに、Gitで色々なトラブルが起きました。
今回は、私が遭遇したトラブルをまとめてみました。
随時更新していこうと思います。

# リモートリポジトリのパスワード関係

## リモートリポジトリのパスワード入力を間違えていた。
基本的なことなのですが、入力を間違ているというパターンが意外とあります。

## 間違って入力したパスワードを、MacのKeyChainが記憶してしまっていた。
上記の件と関係するのですが、間違って入力したリモートリポジトリのパスワードを、KeyChainがキャッシュしてしまい、パスワード入力ができなくなってしまうというパターンがありました。

これは、KeyChainのキャッシュを削除すれば、パスワード入力ができるようになります。

# プロキシ関係
Proxy配下のGitを作業していると、何かとトラブルが起きます。

## Bashの環境変数に, `http_proxy` , `https_proxy` , `no_proxy` の設定ができていなかった。
コンソールで `export` コマンドを実行して満足して、 `.bashrc` にちゃんと追加できていなかったというパターンです。
基本的なことですが、意外とこれをやる人が多いです。

`.bashrc` か `.bash_profile` に環境変数 `http_proxy` , `https_proxy` , `no_proxy` を設定しましょう。

`.bashrc` に設定すれば、自動で `.bash_profile` にも読み込まれますので、 `.bashrc` に書けば十分です。

## `https_proxy` のスキームを勘違いして `https://` にしていた。
`http_proxy` と `https_proxy` は基本的には同じ値を入れることになるのですが、それを勘違いして、 `https_proxy` の方だけURLの先頭を `https://` に変更している人がいました。

## プロキシのURLにユーザー名・パスワードを追加するのを忘れていた。
認証プロキシの場合、プロキシに対するユーザー名とパスワードを設定する必要があります。そのため、環境変数の値はこんな風になります。

```
http://（ユーザー名）:（パスワード）@（ホスト）:（ポート）
```

## `git config --global` に `http.proxy` , `https.proxy`  の設定ができていなかった。
どうやら環境変数だけでは不足で、 `git config --global` にも設定が必要のようです。

## `git config --local` で `http.proxy` , `https.proxy`  の設定を上書きしていた。
`git config --local` を使えば、リポジトリ毎にGitの設定ができますが、この設定は `git config --global` よりも優先されるため、ここに `http.proxy` , `https.proxy` を間違った値で設定すると、うまく接続できなくなります。

## Gitのバージョンが古くて `no_proxy` に対応していなかった。
同一LAN内のリモートリポジトリに接続する場合、プロキシの設定が邪魔をします。
そのため、 `no_proxy` で、プロキシ設定から除外したいドメインを指定する必要があります。

Gitのバージョンが古くて、この `no_proxy` に対応していなかったということがありました。

## `no_proxy` の値にスペースが混入していた。

```
export no_proxy=localhost, 127.0.0.1
```

のようにスペースが入ってしまっていたパターンがありました。

```
export no_proxy=localhost,127.0.0.1
```

のようにスペースをなくす必要があります。

## メインシェルをZshに変えた際に、Zshの環境変数に, `http_proxy`, `https_proxy`, `no_proxy` を設定することを忘れていた。

環境変数というのはどうやらシェル毎に持っているものらしく、シェルがBashではないなら、 `.bashrc` の設定は継承されないようです。

Zshの場合は `.zshrc` に設定します。私は `.zshrc` から `.bashrc` を呼ぶようにしました。
(macOS 小ネタ) ダイアログをキーボードからキャンセルできるように設定する

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/6c2c4455-9ffd-8277-721a-24d470addd59.png)

Mac を使っていてこういうダイアログが出たとき、`Enter` を押せば「ゴミ箱を空にする」を実行できるが、「キャンセル」するにはマウスカーソルを動かしてボタンをクリックするしかない。どうしてこうなった。

この挙動はキーボードの設定から変更できる。

「システム環境設定」>「キーボード」>「ショートカット」で、「フルキーボードアクセス」を「すべてのコントロール」に設定する。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/bc3e18a3-c8f1-c89e-2fa6-0d008635c3dd.png)

[2020.07 追記]： macOS Mojave 以降ではこの項目が消えており、代わりに「コントロール間のフォーカス移動をキーボードで操作」というチェックボックスが表示される。[^mojave]

[^mojave]: [Mac のアクセシビリティショートカット \- Apple サポート](https://support.apple.com/ja-jp/HT204434)

こうしておくと、ダイアログを `Esc` でキャンセルできるようになる。

また、 `Tab` キーでボタンを選択して **`Space` で**そのボタンを押せるようになるが、`Tab` でボタンが選択できるからといって**間違えて `Enter` を押してしまう**と、どちらを選択していたとしても問答無用で実行 (ゴミ箱を空にする) されてしまうので、`Tab` で選択する機能は使わないほうが良いかもしれない。
#Ruby / #Rails - FactoryBot でエイリアスを呼び出すみたいに、元の定義をコピー・継承して別名を作る

#Ruby / # Rails-Copy and inherit the original definition to create an alias, just like calling an alias in FactoryBot


Factoryの中にFactoryを書くだけで良いらしい。こいつは使える！

```rb
factory :user do
  name { 'SomeName' }

  factory :alice do
      name { 'Alice' }
  end

  factory :bob do
      name { 'Bob' } 
  end
end
```

```rb
FactoryBot.create :user
FactoryBot.create :alice
FactoryBot.create :bob
```

[FactoryGirlチートシート - Qiita](https://qiita.com/morrr/items/f1d3ac46b029ccddd017)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2259








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DockerのWindowsコンテナについて

調べていたら、Windowsプログラムを実行できるWindowsコンテナというものがあるらしいので調べたメモです。

# 対応ホストOS

- Windows Server 2016
- Windows 10 Anniversary Update以降

# コンテナの種類

Windows ServerコンテナとHyper-Vコンテナの2種類がある

| | Windows Serverコンテナ | Hyper-Vコンテナ |
|:------|:-------|:-----|
| 形態| ホスト上のプロセス | Hyper-VのゲストOS上のプロセス |
| OS | Windows Nano Server／Server Core | Windows Nano Server／Server Core |
| 起動 | 早い | 遅い |

# インストール方法

Windows Server 2016にWindowsコンテナ機能をインストールする
https://www.atmarkit.co.jp/ait/articles/1610/26/news042.html

# 使い道

なんでしょう...。Nano Server上にMSSQLをインストールできないため、IIS+ASP.NETの実行環境の仮想化などかと思います。アプリケーション仮想化みたいな用途では使えなさそうです。

DockerfileのRUNコマンドはPowerShellで書くようです。

WindowsコンテナでWordPressを動かすまでに気づいたWindowsコンテナを使い始める時の注意点
https://qiita.com/ko-he-8/items/3bc233eca2a32abc6c63

# 参考

「Windows Serverコンテナ」「Hyper-Vコンテナ」「Linuxコンテナ」「Docker」の違いとは？
https://www.atmarkit.co.jp/ait/articles/1611/04/news028.html

Windowsコンテナについて
https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/about/index

コンテナー テクノロジ: Docker、Windows とトレンド
https://www.microsoft.com/ja-jp/cloud-platform/Windows-Server-blog-Containers.aspx