OmniAICreator/Qiita-1.07M huggingface dataset:
さぁ、UnityのTilemapを始めよう！ 3/8 ~Spriteの設定編~

「[さぁ、UnityのTilemapを始めよう！](https://qiita.com/RyotaMurohoshi/items/5c3cdd24b7e09bfd8ed3)」 シリーズ、全8回の内の3回目です。

前回「[第2回 とにかくまずは触ってみよう編](https://qiita.com/RyotaMurohoshi/items/f386e81b5e2ea1ffe57d)」では、あらかじめ設定済みのSpriteを使ってTilemapを作成しました。自分のプロジェクトでTilemapを使うには、Spriteの設定を自分で行う必要があります。今回は「Spriteの設定編」と題して、Spriteの設定で重要な項目を説明します。

前回は、「[第2回 とにかくまずは触ってみよう編](https://qiita.com/RyotaMurohoshi/items/f386e81b5e2ea1ffe57d)」です。

# Spriteとその設定の概要

まずはSpriteとその設定の概要を紹介します。

Tilemapでは、セルに直接Spriteを置くのではなく、Tileアセットを配置します。そして、TileアセットがSpriteを参照します。

Tilemapが適切に表示されるために、Spriteに対してもいくつか設定が必要です。適切に設定しないと、セルとセルの間に隙間ができたり、ノイズが発生したりしてしまいます。

# Spriteの分割

まずはSpriteを分割します。

`2d-techdemos`の中にある「`dungeon.png`」ように、一枚の画像の中に複数のTile用のSpriteを含んでいる場合、適切に分割する必要があります。

![dungeon.png](https://qiita-image-store.s3.amazonaws.com/0/4125/f74a44c2-049f-15c9-a190-e906658a0ccd.png)

Spriteの分割は、SpriteEditorを使って行います。次の公式ドキュメントを参考に分割してください。

https://docs.unity3d.com/2017.4/Documentation/Manual/SpriteEditor.html

# Pixels Per Unitの設定

次にPixels Per Unitの設定を行います。

Tilemap用のSpriteの設定の中で、大事な設定のひとつが`Pixels Per Unit`です。`Pixels Per Unit`は、Spriteがシーンで描画される際の大きさを調整する値です。この値は、Unity上での長さ1に相当するピクセル数となります。もし`Pixels Per Unit`を適切に設定しないでTilemapを作成すると、タイルとタイルの間に余分なスペースが空いてしまったり、タイルとタイルがオーバーラップしてしまったりします。

`Pixels Per Unit`は次図の赤枠で囲んだところから行います。

![editor_pixels_per_unit.png](https://qiita-image-store.s3.amazonaws.com/0/4125/eef4d9f8-9633-39f9-9b74-ad4e7bf09712.png)

一辺16ピクセルのSpriteを使うのであれば`Pixels Per Unit`を16に、一辺32ピクセルのSpriteを使うのであれば`Pixels Per Unit`を32に設定してください。「`dungeon.png`」は一辺が64ピクセルの画像です。この中に、一辺16ピクセルのSpriteが15個含まれています。ひとつのセルに表示するSpriteは、一辺16ピクセルなので、`Pixels Per Unit`を16と設定してください。

# SpriteAtlasの作成

次にSpriteAtlasの作成を行います。

`2d-techdemos`の中にある「`dungeon.png`」ような一枚の画像を複数のSpriteに分割し、これをTilemapに使ったとします。そうすると、Editorでの実行中やビルド成果物での実行中に、次の図のようにノイズが乗ってしまうことがあります。

![noise_no_atlas.png](https://qiita-image-store.s3.amazonaws.com/0/4125/e2952312-ac0e-5ffe-6665-2f6a5442fe3b.png)

このノイズはSprite Atlasを作成すれば抑制することができます。実際に`2d-techdemos`ではSpriteに対してSprite Atlasが作られています。次のリンクを参考にSprite Atlasを作成してみてください。

https://docs.unity3d.com/Manual/SpriteAtlas.html

# 次回とシリーズ一覧

次回は、「[第4回 Tile について編](https://qiita.com/RyotaMurohoshi/items/4f88763e620a8d329163)」です。

* [第1回 概要編](https://qiita.com/RyotaMurohoshi/items/5c3cdd24b7e09bfd8ed3)
* [第2回 とにかくまずは触ってみよう編](https://qiita.com/RyotaMurohoshi/items/f386e81b5e2ea1ffe57d)
* [第3回 Spriteの設定編](https://qiita.com/RyotaMurohoshi/items/718e2cceec3b6da28224)
* [第4回 Tile について編](https://qiita.com/RyotaMurohoshi/items/4f88763e620a8d329163)
* [第5回 Tilemap関連のコンポーネント編](https://qiita.com/RyotaMurohoshi/items/ae46343828634a2d3321)
* [第6回 Tileの描画編](https://qiita.com/RyotaMurohoshi/items/fc473a2dd54441e9b94e)
* [第7回 TilemapとCollider編](https://qiita.com/RyotaMurohoshi/items/8d1e7dfb4a1b2aca0463)
* [第8回 関連リンクとまとめ編](https://qiita.com/RyotaMurohoshi/items/eddbb74e07e79f6c2185)
[Vue.js]算出プロパティとclass属性へのバインディングを使ってバリデーションチェックを実装

##はじめに
薄い内容ですがタイトル通りのことをやってみます。
バリデーションチェックを実装したいというよりも、そのあとの画面表示も含めてやりたいという思い。
通常のWEBアプリケーションであれば、エラー文言を赤字にすることが多いので、そういうスタイルも含めてってことです。
Vue.jsは初心者なので全体像を掴めていない中での実装となります。

##実装内容
- テキスト入力欄を１つ設けて数値を入れられるようにする
- 入力値が０〜９以外の場合に入力欄の横に赤字でエラー文言を表示する


```index.html
<html>
...

<div id="app">
    <input type="number" v-model.number="num">
    <span v-bind:class="hasErrorClass" v-show="hasError">0〜9の数字を入力してください</span>
</div>

...
</html>
```

```main.js
var vm = new Vue({
    el: '#app',
    data: {
        num: 0,
        hasError: false
    },
    computed: {
        hasErrorClass : function(){
            this.hasError = (this.num < 0 || this.num > 9) ? true : false;
            return {
                hasError: this.hasError
            }
        }
    }
});
```

```style.css
.hasError {
    color: red;
}
```

##解説
1. プロパティnumはv-modelで双方向バインディングし、入力の都度算出プロパティでチェックできるようにします。
2. 算出プロパティhasErrorClassでは入力値（num）がエラーかどうか判定し、その値で結果としてclass属性を返すようにします。また、エラーがない場合にエラー文言を表示したくないので、その判定(v-show)のためのフラグをプロパティhasErrorに設定しておきます。
3. html側ではv-bind:class="hasErrorClass"とすることで、判定結果がtrue（エラーあり）ならclass属性付加、false（エラーなし）なら付加無しとなります。
4. あとは付加されたclass属性に対してスタイル（赤字）を定義するだけです。 

##おわりに
Vue.jsはまだまだ勉強中なのでこれからも学んだことを１つ１つアウトプットしようかと思います。
VMWareのCentOS7仮想マシンをHyper-Vに移行する。

## 概要

自宅PCにWindows10 Proのライセンスを手に入れてから、とりあえずVirtualBoxで作成していたCentOS7の仮想マシンをHyper-Vに移行してみました。（[参考](https://qiita.com/sankaku/items/26d72c1cf794fc1a3eb3)）

VMWareでも同じこと試してみようかと思いまして、個人利用フリーのVMWare Workstation Playerで作成したCentOS7仮想マシンをHyper-Vに移行してみることにしました。

（※Hyper-Vを動かしているのと同じ環境でVMWare Workstation Playerを動かそうとしたのですが、Hyper-Vが有効になっている環境ではVMWare Workstation Playerが素直に動かないようです。
VMWare Workstation Playerで変換元仮想マシンを作る際はHyper-Vを無効にしました。
変換元仮想マシン作成後に再度Hyper-Vを有効にしています。）

## 環境情報

- 変換元仮想マシンの作成情報
 - 仮想化ソフトウェア: VMWare Workstation 15 Player
 - ゲストOS: CentOS 7.5

- 変換ソフト: StarWind V2V Converter （[公式](https://www.starwindsoftware.com/starwind-v2v-converter)）

- ホストOS: Windows10 バージョン1803

## VMDKファイルをVHDXファイルに変換

フリーソフトの「StarWind V2V Converter」を使用してみたところ、特にエラーもなく変換できました。GUIで直感的に作業が出来るので楽です。
以下は今回試した例です。
(※ちなみにWindows 7上で変換を試してみたらエラーになりました。Hyper-VをONにしているWindows 10で実施するのが確実かと思われます。)

- Select location of image to convert
 - Local file を選択します。

- Source image
 - File nameに「VMWare Workstation 15 Player」で作成した仮想OS「CentOS 7.5」のVMDKファイルを選択します。

（※今回はテスト用に作成した仮想環境なのでVMDKファイルは1ファイルでしたが、スナップショットとかとっているとVMDKファイルが複数できていたりして(VMWare Esxiの経験上)混乱すると思いますが、VMware vCenter Converter Standaloneでエクスポートしたり、スナップショットを削除したりすればVMDKファイルは1ファイル(ディスク数が複数ならそれと同数)になります。）

- Select location of destination image
 - Local file を選択します。

- Select destination image format
 - VHD/VHDX を選択します。

- Select option for VHD/VHDX image format
 - VHDX growable image を選択します。

- Set destination file name
 - File name にVHDXファイルの出力先を指定します。

---

以降はVirtualBoxで作成されたVDIファイルをVHDファイルに変換したときと同じでした。（[参考](https://qiita.com/sankaku/items/26d72c1cf794fc1a3eb3)）

内容は同じですが、一応記します。

---

## Hyper-Vで仮想マシンを作成

「Hyper-Vマネージャー」から該当サーバーを右クリックして「新規」>「仮想マシン」を選択します。

- 名前と場所の指定

| 項目 | 設定値 | 備考 |
|:---|:---|:---|
| 名前 | fromVmware | なんでもOK |

- 世代の指定
 - 第１世代

- 起動メモリ
 - （自由に設定してください。私はデフォルトの1024MBかつ動的メモリ使用としました。）

- ネットワークの構成

| 項目 | 設定値 | 備考 |
|:---|:---|:---|
| 接続 | nat | なんでもOK<br>（私は別途作成したnatを使用しました。[参考](https://qiita.com/sankaku/items/3bbb7eb21b8deed4f30d)）（※ちなみにCentOS6を変換する場合はレガシーネットワークを使用する必要がありました。） |

- 仮想ハードディスクの接続
 - 既存の仮想ハードディスクを使用する。

| 項目 | 設定値 | 備考 |
|:---|:---|:---|
| 場所 | (「StarWind V2V Converter」で作成したVHDXファイルのフルパスを指定します。)|  |

「要約」画面を確認したら「完了」ボタンを押下します。

## CentOS7の初期RAMディスク再作成

上記で作成した仮想マシンをそのまま起動すると初期RAMディスクを正常に読めずに起動失敗します。
レスキューモードで起動して、dracutコマンドで初期RAMディスクを再作成します。
（※ちなみにCentOS6の変換の場合は初期RAMディスク再作成は不要でした。）


### レスキューモード起動

CentOS7起動時のカーネル選択画面でrescue「CentOS Linux (0-rescue-省略) 7 (Core)」を選択して起動します。

### 初期RAM再作成

「端末」を起動して以下コマンドを実行します。

```:commannd
$ su -
# cd /boot/
# dracut -force
# shutdown -r now
```

## 起動後

通常のカーネルを選択して起動します。

起動後は動作やログを確認しつつ不具合をつぶして行きます。とりあえず私はVMWareで作成したネットワークアダプタに関する設定は全て削除してHyper-Vで追加したネットワークアダプタ用の設定を入れなおしました。
ハッシュをシンボルで定義し、引数として使うときの注意点

Rubyでハッシュをシンボルで定義し、それを引数にして使うときに少し困ったことがあったので記録しておきます。
まずハッシュを定義します。

```ruby
movie = {title: "example", genre: "something"}
```

次に単純にmovieの情報をputsする関数を定義します。
引数はハッシュとキーとします。

```ruby
def movie_info(movie, input)
  puts movie[:input]
end
```

そしてinputにユーザーからの値を代入してmovie_infoを実行します。

```ruby
input = gets.chomp
movie_info(movie, input)
```
これでinputにtitleかgenreを入力すればハッシュのバリューが出てくるとおもっていたのですが、例えばここにtitleを入力しても返ってくる値は空白、つまりnilでした。

なぜだろうと思って色々試行錯誤したのですが、どうやらmovie[:input]の「:」のあとの部分は変数として扱わないようです。つまりここの部分ではmovieハッシュのキーがinputの値を指しているということです。

正しく表示しようとすると、このように変更します。

```ruby
input = gets.chomp #変更前
input = gets.chomp.to_sym #変更後
```
これでinputの中身がシンボルの形で代入されます。
そしてmovie_infoの中身も変えます。

```ruby
puts movie[:input] #変更前
puts movie[input] #変更後
```

これでinputの部分は変数として扱われてシンボル化されたinputの中身（titleかgenre）が入り、正しく値が表示されます。
Microsoft IMEのオンオフのキーバインドを変える

 
ソースコードのコメントは、日本語で入れる派です。
やっぱり母国語のほうが、ぱっとみてすぐわかるし、海外メンバーがJOINする予定皆無だし。

Windowsの標準日本語入力IMEの「半角/全角・漢字」の切り替えキーって遠くないですか？
Windows環境で開発しているときの悩みの種は、さっと日本語でコメント入れているためのIMEの切り替え。半角/全角ボタンを押そうとすると、左手がホームポジションからずれてしまって、元の位置に戻るまでのタイムロスが大きい。

え？Macだから、手元で切り替えられるし、って？
ということで、プチネタですが、Mac風にスペースの左右でオンオフ切り替えるための設定について。

# キーバインドの変更内容

標準では、「半角/全角・漢字」ボタンを押すたびにIMEオンオフが切り替わる設定になっていますが、それを以下のように変更します。

* スペースキーの左側の「無変換」ボタンを押すと[IMEオフ(半角英数)]
* スペースキーの右側の「変換」ボタンを押すと[IMEオン(全角かな)]

# 変更方法
ちょっと大雑把ですが(Windows 10の場合)、

* IMEのプロパティを開き、「詳細設定」の「編集操作」の**キー設定　Microsoft IMEとなっている欄**の**「変更」ボタン**を押す。
* 一番左側の「キー」が**「変換」行**の**「入力/変換済み文字なし」のセル**をクリックして、「変更」ボタンを押す。
* 表示された選択肢の中から**IME-オフ**を選択して、「OK」ボタンを押す。
* 同様に、**「無変換」行**の**「入力/変換済み文字なし」**に**IME-オン**を割り当てる。



これで親指でいつでもIMEオンオフを切り替えられます。
なんでwebアプリ開発者はIPv6に対応させないの？対応した結果アクセス結果の3割はIPv6経由だったけど

webアプリ開発をしていますが、自分のwebアプリケーションをIPv6アクセスに対応させました。

##どれくらいのアクセスがIPv6になったの？

 Google Analytcisのカスタムディメンション機能とjavascriptを使って実際どのくらいのアクセスがIpv6でアクセスしてくるか見てみました。
そうすると、**全体で約3割がIPv6アクセス**でした。(1日6000くらいのユーザー数は最低でもいるので毎日そんなに比率はブレません）
また、**スマートフォンであっても、PCでも比率はほぼ同じです。**
知らぬ間にスマートフォンもIPv6アクセスが増えているようです。

##IPv6のメリットは？
IPv6に対応してもユーザーメリットないんじゃね？ってよく聞きますけど、例えば家にフレッツ光引いてるユーザーがいて、wi-fi経由でスマホにてアクセスしている場合、網終端装置のつまりによりIPv4アクセスだと重い可能性があります。
その場合、IPv4にしかwebアプリが対応していないと、IPoE対応のルーターを入れていない限り遅いはずです。ここにいるようなリテラシーが高い人はIPoEを導入しているでしょうが、一般の人はあまり導入していないと思っています。そんな場合でもIPv6でサービスを提供していれば、IPv6のアクセスは混んでいないので早いのでは？と考えています。
（私の家の環境では、IPoE非対応のルーターでもGoogleはIPv6経由なのかサクサク、それ以外のサービスが遅いとか起きていました）
一応そうすればカスタマーエクスペリエンスは向上するのでは？と考えています。

##導入大変なんじゃないの？
サーバー側でIPv6に対応する設定とネームサーバーの設定を入れるだけで対応できました。
cakephp2系でアプリケーション作っていますが、アプリ側の対応はほぼ不要でした。
（唯一対応が必要だったのが、書き込み元IPを記録するデーターベースの対応文字数を拡大すること...でした）

##みんななんで対応しないの？
別に設定大変じゃないしなぜみなさん対応しないんでしょう...?
それとも私は何か重大な見落とし(＝デメリットに気づいていない）しているのでしょうか...?
VoyagerからPHPmyadminで作ったテーブルにアクセスする

#やりたいこと
VoyagerからPHPmyadminで作ったテーブルにアクセスしたい。
PHPmyadminからテーブルを作った時点で、Voyagerのデータベース一覧には表示されるのだが、
編集をするとエラーがでる。

```
 Syntax error or access violation: 1064 
```

Voyagerから作ったテーブルと何が違うのかを追跡して、設定を合わせたらうまくいったのでメモ。

#「id」カラムの追加
![2018-12-01_23h18_55.png](https://qiita-image-store.s3.amazonaws.com/0/315775/b4dffd2f-e3c6-038d-03a3-ffda527f9a22.png)

上記の設定でidカラムを追加

#テーブルの設定
![2018-12-01_23h14_12.png](https://qiita-image-store.s3.amazonaws.com/0/315775/7463273a-c68b-f041-4445-d5e3403f2570.png)

- PHPmayadmin > 操作　> 照合順序　を 画像のものに設定
- AUTO_INCREMENT を　5 に設定

#カラム名の注意点

- カラム名は数字で始めるのはNG
PHPmyadminでは受け付けてくれるが、voyagerでは不正な値としてはねられてしまう。

- 長すぎるカラム名はNG。1行全体で8kBが限界。


#参考URL

https://php1st.com/931
勉強会で知ったPlay with kubernetes

会社のコンテナ勉強会で知ったのでメモしておく。

## Play with Kubernetesとは

Kubernetesについてどんなものか触ってみたいという人向けに公開されているもの。
ブラウザだけでkubernetesがどんなものか触ってみることができる。

URLは[こちら](https://labs.play-with-k8s.com/)

![ログイン画面](https://docs.google.com/drawings/d/e/2PACX-1vQM3gLxYXqVxMdKv-AOBMBF0_Cy776cLRHpS_gHDpKZ90Ij5EWDf3nw-Kmj00ZXXBG4eSVQq8JdYEta/pub?w=495&h=447)


githubかdockerのアカウントがあればログインできる。

![ログイン後](https://docs.google.com/drawings/d/e/2PACX-1vT1DdevwUnpXigfEIae0Tnoc2RX7Btl-7TTNtOUvnTveq1PSyKDJclH3KqR_-XFQsUg6USq53jyjLrZ/pub?w=1440&h=1080)

ログイン後の画面。4時間自由に使えるようです。

まだこれだけしかやってませんが、今後時間を見つけて使ってみたい。
ParaViewのPythonスクリプトでカメラの回転

この記事は[オープンCAE Advent Calendar 2018](https://qiita.com/advent-calendar/2018/opencae-ac2018)の1日目の記事です。

# はじめに
ParaViewのPythonスクリプトでモデルを回転させるときのメモ。

# ParaViewのモデル回転
ParaViewのPythonでモデルを回転させるときのコードは次のように書ける。

```python
camera = GetActiveCamera() #今選択しているビューのカメラを取得
camera.Azimuth(90) # スクリーン座標系のY軸周り![Azimuth.png]
Render() # 再描画
```
Azimuthでの回転のイメージは次のようになる。

![Azimuthのイメージ](https://qiita-image-store.s3.amazonaws.com/0/130772/0a3fedb8-996e-a409-bf11-8f997fb1b3da.png)

注意点としては、画面に表示されているモデル座標系ではないことである。

Azimuth以外にも以下のカメラ操作がある。これらの操作はvtkRenderingCorePython.vtkCameraのメソッドになる。

- Zoom
- Roll
- Elevation
- Azimuth
- Pitch
- Yaw

Zoomは拡大縮小の比率を引数に与え、その他は角度(°)を与える。

各回転に関するイメージ図を次に示す。

![カメラ回転のイメージ](https://qiita-image-store.s3.amazonaws.com/0/130772/5783b99d-af14-01c3-19d8-f36e4e74414a.png)

#まとめ

ParaViewではカメラの座標値などを直接指定することもできるが、回転させて画像を自動出力させるのであれば、これらのメソッドを使った方が簡単に書ける。
5分でできる！？ AMIをつかってEC2にredmineを作成しよう！

# はじめに
[InfratopAdventCalendar](https://qiita.com/advent-calendar/2018/infratop)の2日目を担当します。@tatsukichiです。


## それではやっていきます
皆さんはタスク管理にどのようなツールを使っていますか？
今回は、自分で立てたEC2インスタンスに
Railsで作成されているredmineを使ってタスク管理をしていきましょうというエントリーです。

個人で使うのもよし。チームで使うのもよし。
数多くのプラグインがあるredmineを使って、自分のタスクスタイルにあった管理ツールをAWSのサービスEC2を使って**5分**で作成していきましょう！
※今回は、redmineを作成し管理ユーザでログインするまでをゴールとしています。

### 手順
行うことは大きく３つだけ。
- AMIを使ってインスタンスを作成
- アクセスしてみる
- 管理ユーザでログインしてみる


## AMIを使ってインスタンスを作成
AMIを使用し、インスタンスを作成するにあたり簡単に解説を挟んでいますが、必要なければ読み飛ばしてください。

### AMIとは
そもそもAMIとは、*Amazon Machine Image*のそれぞれの頭文字をとった名前です。
- OS
- アプリケーションサーバ
- アプリケーション
- etc.
これらの情報をひとまとめにしたEC2のテンプレートのようなものです。

AMIは、redmineのように既に存在しているものもありますが、オリジナルで作成することも可能です。
例えば、インスタンスを複製したいときなどにAMIを使用することで容易にインスタンスのコピーを作成することができます。

AMIの中には有料のものも存在しますが、redmineの使用量は無料となってます。


### インスタンスの作成
それでは早速、redmineのAMIを使用してEC2インスタンスを作成していきましょう。

まずは、インスタンスを作成する画面でAMIを選択していきます。
1. AWS Marketplaceを選択します
AWS MarketplaceはAWSが用意したAMIが表示されます。
2. 「redmine」と検索します。
3. Bitnamiのredmineを選択します。
![AMI.png](https://qiita-image-store.s3.amazonaws.com/0/184333/b7b01215-1008-9a76-7877-b269ba192bda.png)

次に、インスタンスタイプを選択します。
redmineの使用人数等にもよりますが、今回は無料枠でも使用可能な**t2.micro**を使用していきます。

以下の部分を選択します。
![t2_micro.png](https://qiita-image-store.s3.amazonaws.com/0/184333/b0aae6f3-2ef1-8475-0814-ec94a2cc819e.png)

ここまでできたら、確認と作成をクリックしインスタンスを作成します。

鍵はもちろん、既存のものでも新しく作成しても問題ありません。


## アクセスしてみる
それではインスタンスが作成されましたら、**パブリックIP**にアクセスしてみましょう。

![スクリーンショット 2018-12-01 22.46.23.png](https://qiita-image-store.s3.amazonaws.com/0/184333/c13dab47-cff6-dd2a-1d0b-540c6949b004.png)

#### あれ、もうできた。

そうです。
たったこれだけであなただけのredmineが作成できました。
さて、何分かかりましたか？

### 管理ユーザでログインしてみる
ここまでは誰でもできてしまいそうな内容ですが、ここからは知らないと苦労しますので
一緒にやってみましょう。

redmineは動いているみたいだけど。。。
そうです。ログインできないんです。

ログインするには以下の手順でパスワードを見つける必要があります。
1. EC2インスタンス起動時のシステムログをみる
![sys_log.png](https://qiita-image-store.s3.amazonaws.com/0/184333/cccce113-a594-b0ff-bd5b-9de042647629.png)
2. 管理ユーザのパスワードをみつける
![pass.png](https://qiita-image-store.s3.amazonaws.com/0/184333/8ceaaf0e-c5ab-2b98-8bfb-9d716bbf4ba9.png)

以下の情報を入力してログインしてみましょう。

ログインID　: user
パスワード　: [白塗りの部分]
![login.png](https://qiita-image-store.s3.amazonaws.com/0/184333/6858c99a-aed8-d95d-352f-0b73207b58b5.png)


## 最後に
これで今回作成したredmineはあなたのものになりました。
便利なプラグインやイケてるテーマなどもありますので、好みにあったものを使用して楽しんでみてください。

ありがとうございました。
chshでパスワードを聞かれるのはイヤ

## 解決策
以下のコマンドを実行するだけ。

```
sudo sed --in-place -e '/auth.*required.*pam_shells.so/s/required/sufficient/g' /etc/pam.d/chsh
```

## 解説
`/etc/pam.d/chsh`ファイル内の

```
auth       required   pam_shells.so
```

の部分を

```
auth       sufficient   pam_shells.so
```

に変えてやればよい。テキストエディタ等でファイルを変更してもいいがコマンド一発で一発に済ますことのできる置換コマンドsedを使う。([vim標準機能の折りたたみを駆使して、.vimrcを整理しよう - Qiita](https://qiita.com/gigamori/items/1a4bf45b4cd4fe1c2a00#sed))

> パターンにマッチした行のみ、文字列1を文字列2に置換する
>
> ```
> sed -e '/パターン/s/文字列1/文字列2/g' infile > outfile
> ```

ちなみに、`--in-place`は上書きオプション

## 参照
[command line - chsh always asking a password , and get `PAM: Authentication failure` - Ask Ubuntu](https://askubuntu.com/a/812426/807051)
[vim標準機能の折りたたみを駆使して、.vimrcを整理しよう - Qiita](https://qiita.com/gigamori/items/1a4bf45b4cd4fe1c2a00#sed)
SpresenseのGPSがQZSSのL1Sに対応したらしいので使ってみる

# Spresenseとは？

Spresenseとは、Sonyが発売した小型マイコンボードです。
https://developer.sony.com/ja/develop/spresense/

特徴は、

- GPS機能搭載（アンテナもメインボードに搭載、複数の衛星タイプに対応）
- ハイレゾオーディオ
- マルチコアプロセッサで強い
- 省電力・小型

といったところです。
開発はArduino互換と、独自の組み込みOSを使うのとの2とおりです。

とくにこの大きさで低消費電力で、簡単に扱えて
これだけ多機能なマイコンボードは少なく、色々と使えそうなボードです。
私は、今年8月のMaker Faire Tokyoで購入して、遊んでいます。

# QZSSのL1Sとは

QZSSは準天頂衛星のことで、日本が打ち上げた「みちびき」シリーズのことを指します。
準天頂衛星「みちびき」は、GPSと互換の測位信号を、日本近辺でなるべく天頂に近い位置から配信することで、特に都市部などでの測位精度をあげることが大きな役割となっています。

しかし、それだけではGPSの理論精度に、より近い精度で測位が可能になるだけです。
実は準天頂衛星には、L1Sや、L6といった、GPSを補完するための信号を送る仕組みが搭載されています。

http://qzss.go.jp/overview/services/sv05_slas.html

今回注目するL1Sは、L1C/Aという通常のGPS・QZSSで使っている電波の周波数帯と同じ周波数帯で、電離層遅延の補正信号などを送信するものです。
そのため、これまでのGPS受信機と同じ無線受信機で、受信後のデータの処理さえ行ってあげれば利用することができ、既存のGPS受信機の設計の軽微な変更で利用可能になるという利点があります。

Spresenseの最近のアップデートで、このL1S信号の処理ができるようになったということで、実際に使ってみました。

# 使ってみる

https://developer.sony.com/ja/develop/spresense/developer-tools/get-started-using-arduino-ide/set-up-the-arduino-ide
こちらを参考にして、まずはArduino開発環境を整えます。
Spresenseの開発キットに関しては、最新のものを利用してください。　

さて、GNSS（全球衛星測位システム、まぁつまりGPSとかのことをまとめてこういう言い方をします）のサンプルスケッチを見てみましょう。
https://github.com/sonydevworld/spresense-arduino-compatible/blob/master/Arduino15/packages/SPRESENSE/hardware/spresense/1.0.0/libraries/GNSS/examples/gnss/gnss.ino

129～130行目に利用する衛星の設定があります。みちびきのGPS互換信号とL1S信号を使うように設定しています。GPSは、デフォルトで使うようになっています。

```
    Gnss.select(QZ_L1CA);  // Michibiki complement
    Gnss.select(QZ_L1S);   // Michibiki augmentation(Valid only in Japan)
```

https://github.com/sonydevworld/spresense-arduino-compatible/blob/master/Arduino15/packages/SPRESENSE/hardware/spresense/1.0.0/libraries/GNSS/GNSS.h
また、こちらをみると、

```
enum SpSatelliteType {
    GPS       = (1U << 0),
    GLONASS   = (1U << 1),
    SBAS      = (1U << 2),
    QZ_L1CA   = (1U << 3),
    QZ_L1S    = (1U << 5),
    UNKNOWN   = 0,
};
``` 

とあり、GLONASSなどにも対応していることがわかります。
今回は、上記のサンプルコードを用いてGPS・QZSS・QZSS L1Sを組み合わせて測位を試してみました。

# 結果を見てみる

シリアルから取得した結果の地理座標部分だけをCSVにして、Google Mapsのマイマップ機能を使って地図上に表示します。

マイマップ機能で新規の地図を作成すると、CSVからのインポートができます、
GoogleDriveなどに保存したCSVファイルなどからインポートすることができます。

実際にやってみた結果が、以下のような図になります。

[SpresenseGPS検証](https://www.google.com/maps/d/viewer?mid=1oD-JYCR2dHh9-GWph-AnNdQTVMX6icJB&hl=ja&usp=sharing)

これは、いくつかの場所で静止状態で測位を続けたときの座標群を表示していますが、
かなり大きなずれがあることがわかります。
六本木ヒルズの周辺なので、やはりビル群による電波の反射などがあり精度がでにくいのではないかと思いました。

# まとめ

あまり芳しくない結果になってしまいましたが、やはりGPS的な仕組みにとって、都市部は難しいフィールドだということでしょうか。
ともあれ、ログを確認したところではちゃんとL1Sの信号も拾っていますし、設定を代えて試したところGLONASSも拾えていることがわかったので、
今後より本格的な検証をしていこうと思います。
8946 Take#２８

#問題

http://www.hackerschool.jp/hack/take28.php

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/de3cca59-cc54-090c-d6ff-d4e9dd7746e2.png)

#解いてみた

- zipファイルをダウンロードして、解凍するとexeファイルがありました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/69847501-1387-9155-9da1-3d7e07406973.png)

- とりあえず実行してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f88013b1-ba21-298e-ff90-669e903bec94.png)

- パスワードを求められますが、それがわからないんです。
- こういうときはBintext使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/deece34f-69d8-a4bb-4f52-75036e603c50.png)

- 難読化されてなかったので、普通に読めました。
- パスワードをgetしているあとの「geTX5bZt」が怪しいので入れてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/5b350684-aaa1-ef99-de47-266af86df88e.png)
M5Stackをメトロノームにする

これは [CPS Lab Advent Calendar 2018](https://adventar.org/calendars/3058) 1日目の記事である．
2日目の記事は [JavaScript だけで BLE に入門する - たこつぼ](http://takorras.hatenablog.com/entry/2018/12/02/195325) ．

# 概要
**M5Stack Basicでメトロノーム**(設定したBPMに沿って音を鳴らす)を作成した．

**Q.動機は？**

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">my new gear... <a href="https://t.co/8C00zsSOb0">pic.twitter.com/8C00zsSOb0</a></p>&mdash; Rone@G2R&#39;DuαlCore&#39; (@Rone_Loreto) <a href="https://twitter.com/Rone_Loreto/status/1068010218800304129?ref_src=twsrc%5Etfw">2018年11月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**A. もしかめを極めるため．**

## BPMとは
曲のテンポのことで，**BPM=1分間における四分音符の数** で表される．

## BPMの計算を考える
BPM = 1分間における四分音符の数 = **60秒あたりの四分音符の数** である．
更に言い換えると **60000ミリ秒(ms)あたりの四分音符の数** である．すなわち，

`1分間あたりの四分音符の数 → 60秒あたりの四分音符の数 → 60000ミリ秒(ms)あたりの四分音符の数`

これより， **「四分音符の長さ = (60000[Hz] / 設定したいBPM) / 4」** と分かる．

### [ex: BPM120の場合]
BPM120の場合，四分音符は `60秒で四分音符120回 → 60000msで四分120回` であるので，
四分音符1回辺りの秒数(ms)は

> 60000 ÷ 120 = 150

よって，150msで四分音符1回．

# 実装した機能
- **BPMの変更**
Aボタン(左)で遅く，Bボタン(真ん中)で速くできる．

- **メトロノームの スタート / ストップ**
Cボタン(右)を押すごとにスタートとストップができる．

# デモ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">メトロノーム (Metronome) <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/p1pRbeopF2">pic.twitter.com/p1pRbeopF2</a></p>&mdash; Rone@G2R&#39;DuαlCore&#39; (@Rone_Loreto) <a href="https://twitter.com/Rone_Loreto/status/1068858563886370817?ref_src=twsrc%5Etfw">2018年12月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# ソースコード

```cpp
#include <M5Stack.h>

// メトロノーム音を設定
#define C4 262

// テンポ変数 デフォルト120
int bpm = 120;

// 音符変数の宣言
float note; // 8分音符

// ステート変数の宣言
int runstate = 0;

void PrintBPM()
{
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.println(bpm);
}

void SelectBPM()
{
  if (M5.BtnA.wasPressed())
  {
    --bpm;
    PrintBPM();
    M5.update();
  }
  else if (M5.BtnB.wasPressed())
  {
    ++bpm;
    PrintBPM();
    M5.update();
  }
}

void AdjustBPM()
{
  // 音の長さをBPMに合わせる
  note = (60000 / bpm) / 4;
}

void MetronomePlay()
{
  AdjustBPM();
  M5.Speaker.tone(C4, note);
  delay(note);
  M5.Speaker.mute();
  delay(note * 3);
}

void CheckRunState()
{
  if (M5.BtnC.wasPressed())
  {
    switch (runstate)
    {
    case 0:
      runstate = 1;
      break;

    case 1:
      runstate = 0;
      break;
    }
  }
  M5.update();
}

void setup()
{
  M5.begin();
  M5.Lcd.setTextColor(GREEN, BLACK);
  M5.Lcd.setTextSize(10);
  PrintBPM();
}

void loop()
{
  SelectBPM();
  CheckRunState();
  if (runstate == 1)
  {
    MetronomePlay();
  }
}
```

＊汚い部分が多いコードなので，
**「このように書き換えできそう？」** などあればどしどし教えていただけると幸いである．

# 今後の予定
- ディスプレイ表示の修正
    - **BPMの表示位置を中心にする** 
- **メトロノーム動作中でもBPMをスムーズに変更できるようにする**
    - 現状のコードでは引っかかったような変動をするため
- **BPM変更のボタン長押し対応**
    - 長押ししている間，続けてBPM変更がされるようにする(100msごとに1BPM変動，のようなイメージ)

モチベが保たれている近日中にブラッシュアップ予定．
commonmarker 0.18.x で使う commonmarker-rouge は 1.5.x でないと

きちんとした記事を書く余裕がないので，伝えたいことだけを最小限の記述で。（質問は歓迎）

Ruby で Markdown テキストを扱うのに [commonmarker](https://github.com/gjtorikian/commonmarker) って gem を使いますよね。

で，Markdown テキスト中にコードブロックがあってシンタックスハイライトもやりたい，となると，[commonmarker-rouge](https://github.com/sandfoxme/commonmarker-rouge) という gem を併用することに。
簡単に使えて，多数の言語に対応しているので，便利。

ここまでが前置き。

# commonmarker のバージョンが上がって正常に動かなくなった

commonmarker 0.17.13 を使っていたのですが，0.18.1 が出たので `bundle update` したら正常に動かなくなった。

正常な場合，

```rb
gem 'commonmarker', '0.17.13'
require 'commonmarker'
gem 'commonmarker-rouge', '1.4.0'
require 'commonmarker/rouge'

source = "```rb\nx\n```"

puts CommonMarker::Rouge.render_html(source)
```

で，

```html
<div class="highlighter-rouge language-rb"><span class="n">x</span>
</div>
```

が出力される。

ところが commonmarker のバージョンを上げて

```rb
gem 'commonmarker', '0.18.1'
```

とすると，なんと出力が

```html
<!-- raw HTML omitted -->
```

になってしまう。
そんな殺生な〜

なんかどうも，commonmarker の 0.18 でのセキュリティー上の理由による仕様変更に commonmarker-rouge が対応してなかったのが原因だったぽい。

# 解決

当初 commonmarker 側に

[Code block vanishes in latest with commonmarker-rouge · Issue #85 · gjtorikian/commonmarker](https://github.com/gjtorikian/commonmarker/issues/85)

という issue を（超デタラメ英語で）立てたのですが，どうもこれは commonmarker-rouge 側でどうにかすべきものだったようなので，

[Code block vanishes with commonmarker 0.18.x · Issue #4 · sandfoxme/commonmarker-rouge](https://github.com/sandfoxme/commonmarker-rouge/issues/4)

という（英語力的に）やる気のない issue を立てたところ，なんかすぐに直してくれました。

結果，両者を最新の

```rb
gem 'commonmarker', '0.18.2'
gem 'commonmarker-rouge', '1.5.0'
```

のようにしたところ，問題なく変換されました。
vim初心者から中級者へ！ ～vimの面白さに気づくとき～

最近やっとvimの面白さに気づき始めてきたところです。
ぎりぎり中級者に上がれたのでは・・・ということでどんなことをしてきたのかをまとめます。
vimやってみたいけど、vimの良さがいまいちわかっていないし、kとかjで移動ってわかりにくい、と思っている方にこそ読んでいただければと思います。
もしかすると「vimいいじゃん！」ってなるかもです。

#先にまとめです
- vimの練習にはコーディングが一番！
- ブラインドタッチ必須は本当でした…



#vimの良さに気づく前のレベル
- サーバーにはいったときに仕方なくvim(vi)を使う。
- 使うのは、`i`と`Esc`と`:wq`。移動は←→↑↓キー連打。
- 困ったら`:q!`でなかったことに。ただしいつも`!`の位置が分からなくなる。
- ブラインドタッチは自己流。なので、打ち間違いが多数発生。

#vimに興味を持ったけど挫折した
かなり前にvimに興味を持ったのですが、移動が`h`、`j`、`k`、`l`という点で挫折しました。
全然なれなくて挫折しました。
また、vimでメモを取るようにしていたのですが、`i`を押してあとは書いていくだけの作業になってしまうので、普通のエディタに書くのと変わらないなと思っていました。

#一念発起
(きっかけは忘れたのですが)vimできるようになりたいな、という思いからvimを頑張ろうと決意しました。
一度挫折したことは覚えていましたが、これだけ多くの人がvimが好きなわけで、私が知らないことがたくさんあるはず！と思いました。


#初心者になるために①　ググる
`vim 勉強` や `vim 学習` や `vim 初心者` でググりました。
 そこで見つけた、たくさんの方々の記事に大変お世話になりました。
ありがとうございました！！！

一部ですが載せさせていただきます。
http://geektrainee.hatenablog.jp/entry/2015/01/18/224443
http://tech.innovation.co.jp/2016/07/20/vim.html
https://qiita.com/hachi8833/items/7beeee825c11f7437f54

ここから先は、このような記事の内容を参考にして進めていきました。

#初心者になるために②　vimtutor
vimのチュートリアルである、`vimtutor`をやりました。
`vimtutor`と打つだけで始められます。
(KaoriYaさん版の場合は、vimを起動してから`:Tutorial`とコマンドを実行します)

量はそれなりにあるのですが、移動のやり方から、一通りテキストを編集できるようになるところまで含まれています。
これまで`i`と`Esc`しか使ってこなかった私からすると、いろいろなコマンドがあることに衝撃を受けました。
想像以上にいろいろできることを感じ、ちょっとずつ「便利なのではないか・・・?」と思い始めます。

#初心者になるために③　ドットインストール
ドットインストールの「vim入門」をやりました。
私の場合はvimtutorを先にやったのですが、ドットインストールが先でも問題ないのではと思っています。
vimtutorで仕入れた知識で足りていなかったところを補いました。

ここまでで、何とかvimを使って操作ができるようになりました。
そしてここからは中級者への道へと進みます。

#中級者になるために①　コーディングをvimで
コードをvimで書き始めます。
これが個人的にとてもよかった！
最初に書いたように、メモを取るだけだと、`i`を押してあとは普通に入力していくことになるのでvimの面白みがあんまりわかっていませんでした。
しかし、コードを書いてみると、「これできるのめっちゃ便利！」が増えていきます。
必然的にvimのコマンドも覚えていきます。
さらに必然的に「これってどうやるんだろう?」という感じで新しいコマンドも調べて覚えていきます。

#中級者になるために②　vimチートシートを手書きで作る
チートシートを手書きで作ってみました。
(個人的に「書く」ことで覚えられるタイプというのもあるのですが)定着につながったと思います。
また、いろいろなチートシートをググって、知らなかったコマンドを見つけるのも楽しかったです。
`zf`(選択範囲を折りたたむ)はこれで見つけました。

#中級者になるために③　vimrc
チュートリアルをやったり、コードを書き始めたときはあえてvimのカスタマイズをしていませんでした。
まずは基本を知りたいと思っていたからです。
また、最初にたくさんの方のvimrcを見ましたが、設定の内容を見てもいまいち便利さがわかっていなかったというのもあります。
ですが、ここまでくると「挿入モードからの`Esc`が面倒くさい」とか「`:noh`が面倒くさい」というのがわかってきます。
ということで、vimのカスタマイズを行いました。
とくに便利と思ったのは上にも書いた2つです。

```
" インサートモードで jj で ESC
inoremap jj <Esc>
" Escの2回押しでハイライト消去
nnoremap <Esc><Esc> :nohlsearch<CR><ESC>
```

#中級者になるために④　実践vimを読む
良書と噂の実践vimを読みます。
だいぶ操作も分かってきているため、かなりすらすらと感動しながら読めます。
この本を読んで「なるほど！」と思えた時に、「中級者になれたかな‥?」と思いました。


#ブラインドタッチ
いろんな記事に「vimをするならブラインドタッチは必須」とありました。
ブラインドタッチできていなかったのですが、はやる思いを止められず、vimの世界へ飛び込みました。
そしてvimをやればやるほどブラインドタッチができないのがもどかしくてしょうがなくなりました。
コマンドは覚えていてもそのキーがさくっと押せないのがものすごくもどかしいです。
そしてブラインドタッチを練習し始めてちょっとたつと、vimでの編集速度もあがりました。


以上です。
こんな感じでvimを使ってきました。
これからもガンガン使っていこうと思います！
１週間でポートフォリオを作ってみた(AWS, flask,BEM, flocss)

# はじめに
P&Dのアドベントカレンダーも15日目です。もうすぐクリスマスですね。僕はiPhoneXRが欲しいなと思っているので、この記事をサンタ🎅🎅が見てくれてたら嬉しいな🌲🌲。
技術的アドバイスがあれば、この記事にコメントいただけると助かります。
それでもいいよーというかたは 次の開発環境の章にお進みください。
ちなみに僕が作ったポートフォリオは[こちら](http://portfolio-env.253hnm7hnp.ap-northeast-1.elasticbeanstalk.com)で、そのソースコードは[こちら](https://github.com/Ko1103/portfolio)です。

# 開発環境
まず、僕は一学生ですので、ポートフォリオをじっくり作り時間がありません。ですので、簡単に、きれいに、迅速に真似できるような環境だと思います。なお、今回はJavaScriptによるアニメーションなどは一切行なっていません。また、pythonを利用するので、pyenvとvirtualenvの環境および利用方法はあらかじめ準備しておいてください。
ちなみにpyenvの環境をMacで整える人は[こちら](https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)を参考にしてもらえるといいと思いますw。

## BEM, flocss
BEMとはscssの記法です。flocssはBEMを利用しながらwebページ全体のデザインを作りやすくします的な？
flocssの公式は[こちら](https://github.com/hiloki/flocss)です。

## gulp
タスクランナーです。細々したタスクをgulpファイルを用意してあげれば、コマンドを叩くだけで簡単に面倒な処理をやってくれます。ここではscssのコンパイル(scssファイルをコンパイルしてcssにする)に利用しました。
今では、webpackの方が主流なのかもしれませんが、僕は時間がなかったので使ったことのある物を利用することにしました。gulpの公式HPは[こちら](https://gulpjs.com)です。

## flask
pythonの軽量webフレームワークです。今回の記事では5行程度しか書いてないのでpython知らねーよという人も使えると思います。

## AWS
今回のデプロイ先です。AWS Elastic BeanstalkというCLIがあり、AWSの方に[flaskでのデプロイまでのチュートリアル](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create-deploy-python-flask.html)があったので、それに従いながらデプロイしました。

# フォルダ構成
flaskを利用するので、cssやhtmlファイルを所定のフォルダ内に作成する必要があります。

- application.py
- templates
    - index.html
- static
    - css
        - style.css
        - style.scss
        - foundation
            - _base.scss
            - _reset.scss
        - layout
            - _footer.scss
            - _main.scss
        - object
            - component
                - _header.scss
            - project
                - _hero.scss
                - _joining.scss
                - _skills.scss
            - utility
                - _margin.scss
                - _padding.scss
    - image
    - script
        - script.js

なお、画像とscriptに関しては省略します。

# 仮想環境
今回はAWSでも利用してあったのでvirtualenvで作成しました。

# フロント
html,cssだけで構成しました。スマホ画面への対応をやっています。フロント開発の流れとしては、必要なファイルを揃え、htmlとcssを編集するだけでしょうね。

# サーバー
flaskでサーバーを立ち上げるのは簡単です。今回の場合、DBはないので、ただrouteに一致するhtmlのファイルを返すだけで終わりです。

```application.py
from flask import Flask, render_template
application = Flask(__name__)

@application.route('/')
def main():
    return render_template('index.html')
```

# 僕が１週間かかった最大のエラー
という題名にしたことを今でも後悔するほど、本当のお粗末なエラーでした。
デプロイには成功しているのに、server internal errorというメッセージがずっと飛んでいました。
最終的にはflaskのapplication.pyのapplicationという変数をもともとappという変数で宣言していて、それがエラーの原因でした。公式のDocumentはきちんと読みましょうねー。

# 感想
正直、これであればweb開発の基礎を一通り触ってみた人にとってはちょうどいい開発になると思います。
vimで作られるファイルへの対処法 .swp .un~ .*~

vimを使っていると勝手に作成されてしまうファイルがあります。

- swpファイル (*.swp)
- ~ファイル (*.*~)
- un~ファイル (*.un~)

それぞれvimファイルがある場所に作られるため、邪魔に思うこともあります。
それぞれの内容と対処法です。

#それぞれのファイルの説明

###swpファイル
vimがクラッシュしてしまうときに備えて作成されているファイルです。
vimでの編集作業前に作られ、編集作業後に自動的に削除されます。
このファイルがあれば、万が一vimが強制終了してしまってもデータを復元できます。

###~ファイル
拡張子に~(チルダ)がついたファイル。
バックアップファイルです。
ファイルが保存される前に、編集前のファイルから作られます。
このファイルを使うことで編集前のファイルに戻すことができます。

###un~ファイル
拡張子が、un~のファイル。
undoファイルです。
ファイルを閉じて開いた後でもundoができるようにするためのものです。

対処法は2つです。
すべてのファイルで2つの方法をとることができます。

#①ファイルの出力先を変更する
それぞれのファイルの出力先を変更することができます。
普段は見ないところに置いておけば、邪魔にもならずいざというときに使うこともできます。
vimrcに以下の設定をします。

```vim
" swpファイル出力先
set directory=<ファイルパス>
" バックアップファイル出力先
set backupdir=<ファイルパス>
" undoファイル出力先
set undodir=<ファイルパス>
```

#②ファイルを出力しないようにする
いざ復元したい、というときには困りますが、設定をすることでファイルの出力自体をさせないこともできます。
(undoファイルに関しては引き継がなくてよいということもあるかもしれないですね)
vimrcに以下の設定をします。

```vim
" swpファイル出力無効
set noswapfile
" バックアップファイル出力無効
set nobackup
" undoファイル出力無効
set noundofile
```

このほか、Gitで構成管理をしている場合は`.gitignore`に書くということもできます。


###参考
http://nanasi.jp/articles/howto/file/seemingly-unneeded-file.html#id9
http://momoiro-tj.hateblo.jp/entry/2016/04/11/190000
8946 Take#２１

#問題

http://www.hackerschool.jp/hack/take21.php

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17681/b8a035c4-9f36-3292-d0a9-df791df6da52.png)

#解いてみた

- まずはソースを見てみます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17681/bb6ef3f5-73e6-f70c-bc10-05a4258a08f3.png)

- コメントにパスワード風のものが書かれているので入力してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/8425eeda-0fa3-c474-6e2d-efa7b3848cc5.png)

- さすがに違いますね。
- 0～eまでしかないのでHEXぽいなということで変換してみます。
- Cyberchef
    - https://gchq.github.io/CyberChef/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6cde2f09-7ec9-41f4-3011-59825a61cc38.png)

- 「残念。これはパスワードではありません。」罠なのか、実はこれが正解なのかわからないので、一応入力してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/9e0ec9f4-13e0-5d30-4933-6ba9c2f185a5.png)

- やはり違いました。
- 特にほかに手立てがないのでwireshark使ってパケット見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/d5026654-b400-55c3-4247-1154870b8ff7.png)

- うれしいことにリクエストヘッダにパスワードが書いています。
- ここに追加するとかできるんですね。
- ということで正解は「8946passTake21」です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/e3a6a173-80f4-ef2d-4196-c21b73d492ec.png)
kerasのdockerfile

# docker 使い方
環境構築が一瞬でできる。
docker　imageというものを指定するとdocker imageで指定された環境ができる。


# docker fileの書き方
```docker:dockerfile
#tensorflow のGPUイメージを取ってくる
FROM tensorflow/tensorflow:latest-gpu-py3 

LABEL maintainer="username" 

 RUN pip --no-cache-dir install \ 
         keras 
```


opencvを入れる場合はこちら

```docker:dockerfile
FROM tensorflow/tensorflow:latest-gpu-py3
LABEL maintainer="username"

RUN apt-get update && apt-get install -y --no-install-recommends \
        libsm6 \
        libxext6 \
        libgtk2.0-dev \
        language-pack-ja-base \
        language-pack-ja \
        libblas-dev \
        liblapack-dev \
        && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN pip --no-cache-dir install \
	torch torchvision \
	pydensecrf \
        opencv-python \
        imageio \
        scikit-image \ 
        keras \
        gputil \
        hyperdash \
        scipy \
        tqdm \
        jupyter_contrib_nbextensions \
        jupyter_nbextensions_configurator\
        pydot \
        staintools==0.1.1\
        pulp \
        tqdm
```

## docker を動かしてみる
 
docker imageのビルド

```bin:bash
 docker build -t tesor-keras dockerfileの場所
```

dockerのコンテナを動かす

```
docker run オプション　　　ドッカーイメージの名前
```

```
docker run --runtime=nvidia --rm -it -p 8888:8888 --name root -v $(pwd):/workdir -w /workdir tensor-keras
```

--runtime=nvidia:GPUを使う場合使用,
--rm :stopしたときにコンテナも終了, 
-p:ポートを8888で開放,
--name:コンテナの名前,
-v:現在のディレクトリを/workdirにマウント

表示されたurlに飛ぶとtensorflow-gpu+kerasが入った環境ができる！
brew upgrade ruby-buildしてもrbenvで欲しいバージョンが出ない時対策。あと構築時のメモ

##結論
これでいけました。

```bash
$ cd ~/.rbenv
$ git pull
```

公式のReadmeにも書いてました。
https://github.com/rbenv/rbenv

いろんな記事に下記コマンドでいけるって書いてたけど
私の環境では欲しいバージョンが表示されませんでした。

```bash
$ brew upgrade ruby-build
```

##他のメモ
いつもDockerで環境構築することが多いので、
ローカルに直接構築する習慣がなく、
いざやろうとすると時間がかかってしまいました。。

なので、
他の注意点もメモに残しとこうと思います。

###bundle installでこける

大体bundle installでコケたら

```
$ gem install [コケた原因のgem名]　
```
でそのgemが落とせるか試せって出たり、

```
fatal error: 'vm_core.h' file not found
```
それを叩いても上記みたいなのが出たりするんですが、


```
$ bundle update [コケた原因のgem名]　
```
上記コマンドで解決できることが多い。


理由は下記記事が詳しい。
https://qiita.com/lasershow/items/1a048d03ddaaba98171e


つまり、雑に言うとこんな感じです。

```bash

$ bundle install
# gemfile.lockを元にgemをインストールする

$ bundle update
# gemfileを元にgemをインストールする
```

なので、
とりあえずbundle installでコケてたらupdateも試してみましょう。


###bundleコマンドやrailsコマンドがrubyのバージョン違いで実行できない
rbenvで使いたいrubyのバージョンを指定したあと、
適宜下記コマンドを使う

```bash
$ gem install bundle
$ gem install rails
#rbenvで初めて使うrubyのバージョンへ変更した場合、毎回必要
```
参考
https://qiita.com/4geru/items/1354bb1d5b2df715a5e2

###rbenv参考記事
・公式
https://github.com/rbenv/rbenv

・qiita
https://qiita.com/_am_/items/c1dbeb11f40bbbac8fd9


##終わり
rbenv久々に使ったけど、普通に便利ですね！
バージョンすぐ切り替えれるし、特定のディレクトリだけにすることもできるし！

rubyはローカルでやって、
mysqlとかDB関連だけdockerでやるってのもありかもしれません。


何か間違ってることや、
もっといい方法があればご指摘いただけると嬉しいです。
ROS catkin buildの簡単な使い方

# Catkin buildの使い方

**Q これはなんですか？** 

**A これはROS Catkin buildの使い方の簡単な説明です.**

そして，```catkin build```の公式ドキュメントは[こちら](https://catkin-tools.readthedocs.io/en/latest/index.html)です．
さらに，自分用のメモでもあります．

## [Catkin build](https://catkin-tools.readthedocs.io/en/latest/index.html)とは?

```catkin build```とはROSのパッケージをビルドするための新しいコマンドです．

```catkin build```が新しいコマンドということは当然，古いコマンドもあるわけです．

古いコマンドは```catkin_make```というコマンドで，このコマンドは並列ビルドができなかったり

catkin_ws/srcにいないとコマンドが有効でなかったりしました．

そこで，```catkin_make```に代わる新しいコマンドが開発されました．このコマンドは```catkin_make```では

できなかった種々のことができるようになりました．

もちろん，デフォルトで並列ビルドで，どのディレクトリにいても```catkin buid```を実行することが可能です．



注意点として，```catkin_make```でビルドしたパッケージは```catkin build```ではビルドできないということがあります．そのため，```catkin build```に移行する場合は，一旦,srcデレクトリをどこかへ退避して，

```catkin build```の流儀でcatkin_wsを作り直す必要があります．



では，その使用方法を見ていきましょう．



## インストール

```catkin build```はデフォルトではROSに含まれていません．そこで，下記のコマンドでインストールしましょう．



```
sudo apt install python-catkin-tools
```

**ROS NoeticからはPythonのバージョンが２系から３系に上がったので，下記のコマンドを使用してください．**

```
sudo apt-get install python3-catkin-tools
```


## ワークスペースの初期化

```catkin_make```では，一般的にcatkin_wsと名付けられるワークスペースの初期化に```catkin_init_workspace```というコマンドを用いていましたが，```catkin build```では，そのような初期化コマンドは必要なく```catkin build```を実行したときに，ワークスペースが初期化されていなければ自動的に初期化が実行されます．

具体的には，ワークスペースの作成から初期化までは下記のコマンドを用いて行います．

```sh
source /opt/ros/melodic/setup.bash
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin build
source devel/setup.bash
```



陽に初期化を行う場合は下記のコマンドを使用して行うことができます．

```sh
source /opt/ros/melodic/setup.bash
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin init
```
## パッケージのビルド
### 全体をビルド
catkin_makeの`catkin_make`コマンドに相当するもので
ワークスペースにある全てのパッケージをビルドします．
ワークスペース内ならどこの階層にいてもいいので
下記のコマンドを打つだけです．どこにいてもいいと言うのが`catkin_make`と違って便利なところです．

```
catkin build
```
### 一部のパッケージをビルド
毎回，全てのパッケージをビルドするのは時間もかかりますし，ムダも多くなります．そこで，特定のパッケージだけビルドを行いたいということもあると思います．その場合は下記のコマンドを利用します．

```
catkin build package_name
```

`catkin build`の後ろにビルドしたいパッケージ名を付け加えるだけでした．とても簡単ですね．

また，いちいち，パッケージの名前なんか，覚えてられないよ．
とにかく今いるところをビルドしたいんだ！ということも多いかと思います．そのような場合は，下記のコマンドを使用してください．

```
catkin build --this
````
なんのことは無い，引数に`--this`をつけるだけです．
これが最も使用頻度が高いコマンドになるのではないでしょうか．

## パッケージの追加

特筆すべきことは無く，```catkin_ws/src```以下にパッケージを入れるだけです．

ココらへんは```catkin_make```と変化ありません．

```catkin list```と打つと，パッケージ一覧が表示されます．

## パッケージの作成

`catkin_create_pkg`と同様にコマンドでパッケージの雛形を作成可能です．

`cakin_ws/src`以下で下記のコマンドを叩きましょう．

じゃないとコマンドを叩いた場所にパッケージが作成されます．

一番簡単な例は下記のようになります．

```
catkin create pkg great_pkg
```

色々引数で指定することもできます．

```
catkin create pkg great_pkg -l BSD -m harumo11 s_harumo@todo.com --catkin-deps roscpp rospy std_msgs
```

ここではライセンス，メンテナーの名前とアドレスおよび依存パッケージを指定しています．`-m`のオプションは引数を２つ取ることに注意しましょう．

他に指定できるオプションについては[公式](https://catkin-tools.readthedocs.io/en/latest/verbs/catkin_create.html)をみてください．

あと，みんなこの設定忘れてるけど，パッケージの名前は小文字と`_`しか使ってはいけない．
## パッケージのパスの読み込み

```roslaunch```などのコマンドでパッケージ名をタブ補完するためには，各パッケージにパスが通っている必要があります．```catkin build```したあとに下記のコマンドを打つことによって各パッケージのパスが新しく追加されたり更新されたりします．

```sh
cd ~/catkin_ws/
source devel/setup.bash
```



## ワークスペースの掃除

catkin_ws/src以外のディレクトリを消したいという場合に```catkin clean```コマンドは便利です．develやlogsディレクトリが無くなります．
[cocoa][swift]BUKURO.swift 2018-04 を振り返る

<p>2018年4月4日（水）の夜間、東京都豊島区の<a href="http://co-forest.com/">池袋コワーキングスペース OpenOffice FOREST</a>におきまして、「BUKURO.swift 2018-04」を開催致しました。</p>

<p>BUKURO.swiftも浸透して来たようで、先月と同様に多くの方が申し込まれました。<br />
初めて参加される方に、どうやってBUKURO.swiftを知ったのか伺ったところ、会社でmacOSプログラミングで悩んでいたところ、同僚から紹介されたとのこと。<br />
ありがとうございます。<br />
これからもアプリケーション・プログラマの方々が役立つ勉強会になるよう精進いたします！
そして、今回の発表はどれもプログラマの好奇心をくすぐるものでした。<br />
よし、自分も頑張ろう！という気持ちにさせていただきました！</p>

<p>今年に入ってconnpassグループは最も申込者が多いグループに一本化したのですが、NPO法人を解散して任意団体としてスタートするのと、勉強会メンバーも任意団体MOSAの準備チームとしてイベントを主催していくことになったのと、MOXSSGとThe Bash in Tokyoを共催することになり、MOSAのconnpassグループを活性化する必要があるでしょう、ということで、一時的にCocoa勉強会 関東とMOSAのconnpassグループの両方で申し込みページを用意することになりました。</p>

# 勉強会について
<ul>
<li>Cocoa勉強会 関東 Swift分科会 です。</li>
<li>ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催してます。</li>
<li>macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
<li>プログラムに関する知識や経験を共有を目的としています。</li>
<li>会の活動内容や発表資料、サンプルコードは公開を前提としています。</li>
<li>申し込みは、connpassから。<br /><a href="https://cocoa-kanto.connpass.com/">https://cocoa-kanto.connpass.com/</a></li>
</ul>

# 概要
<ul>
<li>発表資料は<a href="https://cocoa-kanto.connpass.com/event/80016/">connpassページ</a>からどうぞ！</li>
<li>会場の様子は、ハッシュタグ『#cocoaswift #cocoastudy #bukuroswift』でtweetしています。</li>
</ul>

# 矩形の移動
<p>NSMatrixが非推奨になっているそうです。そこで、代替機能として、同じ大きさの矩形を整列させるための支援コードの発表です！</p>

# Swiftの文字列
<p>以前、Cocoa勉強会 関東で発表されましたが、その後の状況の変化を加味した発表でした。<br />
自分自身も、その後、経験を積み、前回と比較して理解度も上がり、プログラマの好奇心をくすぐる内容に楽しまさせていただきました。<br />
SwiftのStringがUnicodeに高い割合で準拠しているのは知っていたのですが、例えば、文字をどういう用語で扱っているのか説明できずもどかしかったのですが、拡張書記素クラスタ（CodePoint）というのですね。そして、例えば、RubyはUnicodeスカラーで、JavaはUTF-16、PythonはUTF-8で扱うため、得られる文字列長が異なるとか、macOSのファイルシステムでの文字列がModified NFDとなっている理由。それから得られる日本語としての恩恵。文字の比較でUnicodeの一貫性のなさからNFDで比較すればいいという訳でない事。<br />
曖昧に理解していた事が再確認できて、とても有益でした。</p>

# 個人製作Unityゲームのデモ
<p>Unityを使った2Dと3DのWebGLアプリのデモです。十分遊べる完成度に驚かされました。やりますね！</p>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://cocoa-kanto.connpass.com/event/80016/">BUKURO.swift 2018-04</a><br />
<a href="https://mosa.connpass.com/event/80018/">BUKURO.swift 2018-04</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
8946 Take#58

#問題

http://www.hackerschool.jp/hack/take58.php

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17681/0a805f3f-beba-c6a7-59d9-15221f8aa437.png)

#解いてみた

- かな入力っぽいですね。
- かな入力なんて使ったことないので、これを英字に戻すのは一苦労です。
- 変換サイトを探してみるとありました。
    - みかか変換ツール
        - https://tools.m-bsys.com/original_tooles/mikaka.php
    - みかかっていうのはNTTを指すインターネットスラングらしい。初めて知った。
        - https://ja.wikipedia.org/wiki/%E3%81%BF%E3%81%8B%E3%81%8B

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17681/76eed9a1-2f2f-ac43-8db6-554586243c4f.png)

- この長い英字を入力すればいいですね。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17681/58d836f6-d0d9-f021-eeaf-29f71a41fcd4.png)

- 違いましたよ。
- ローマ字になってました。
- 「宮城の県庁所在地をみかか方式で。」とのこと。
- 宮城の県庁所在地は仙台市なので。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17681/94c22f88-fe5b-6d1e-1524-acf3cf4b6856.png)

- といみしちにとくに

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17681/0ee9a7e7-55e6-7dc3-201c-6903062e9c36.png)

- 市はいらんのか？
- shiの3文字減らして「といみしちに」

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/17681/52cfc40d-fd53-b3e4-8f27-e85d1352500c.png)
vim で markdown を書いているときに prettier で整形する (プラグイン使わずに)

この記事は [ACCESS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/access)、第 1 日目の記事です。
どうも、いつも元気な @pankona です。今年もぼちぼちアドカレやっていきます！

## 何の話か

さて今日は、vim を使って markdown を書いているときに、prettier を使って整形するやり方 (プラグインを使わずに) をシェアしたいと思います。
ちなみに、neovim でも同じやり方で導入可能です。

## やれるようになること

- vim で markdown を書いているときに、保存と同時に自動的に prettier による整形をかける
  - 全体にかけるのはイヤだ？であればちょっと設定を変えて指定した範囲だけを対象にすることもできるぞ

## 導入方法

- prettier をインストールし、実行バイナリへパスを通しておく。
  - prettier のインストール手順は [公式ウェブページのインストール手順](https://prettier.io/docs/en/install.html) を参照しておくれ。すまない。
- 次に、vimrc (neovim の場合は init.vim) に以下を追記する。

```VimL
" [markdown] configure formatprg
autocmd FileType markdown set formatprg=prettier\ --parser\ markdown

" [markdown] format on save
autocmd! BufWritePre *.md call s:mdfmt()
function s:mdfmt()
    let l:curw = winsaveview()
    silent! exe "normal! a \<bs>\<esc>" | undojoin |
        \ exe "normal gggqG"
    call winrestview(l:curw)
endfunction
```

書いている内容を軽く解説すると、

- これは「開いているファイルが markdown であるとき、保存したときに自動で全体に prettier による整形をかける」という内容
- 全体にかけるのではなくて指定した部分だけ整形したい、みたいなときは、冒頭二行だけ書く
  - `gq[モーション]` で、指定の箇所だけ整形することができる。この例では保存時に `gggqG` を実行し、全体に整形を適用している
  - もしくは Visual Block で範囲指定した状態で `gq`、みたいな使い方でも良い
  - 後述の「表に対する整形機能」は非常に強力 (と私は感じる) ので、表の整形にだけ使う、みたいのでもいいと思うよ！

## 実際の整形例

たとえば以下のような気合の入ったガタガタな markdown も...

```Markdown
# prettier test



* test

    - hogehoge




| table  | table              |
  | -- | --- |
  | abc  | abcdef               |
 | ghi jklmn | op  |


text text


text     text          text          text
```

保存一発で、以下のようになります。

```Markdown
# prettier test

- test

  - hogehoge

| table     | table  |
| --------- | ------ |
| abc       | abcdef |
| ghi jklmn | op     |

text text

text text text text
```

この例で整形された点は、

- 2 つ以上の改行が入っているところは 1 つに
- リストを書くときのマーカーをハイフンに統一
- リストの段を下げるときのスペースを 2 個に統一
- 英単語の前後のスペースは一個に統一
- **表をキレイに**

といったところでしょうか。なかなか良い気がします！
特に最後の **表をキレイに** みたいのはとても嬉しい気がしますけどどうですか。
この機能のためだけでも prettier を導入する甲斐があるんじゃないかと思ったりします。

## 留意する点

prettier での markdown 整形はちょっと好みの分かれそうな振る舞いがあって、

- リスト (箇条書き) を書くときのマーカーがハイフンで統一される (アスタリスクは使えない)
- リストの段を下げるとき、スペース 2 個に統一される (4 個とかにできない)
- 英単語の前後にはスペース 1 個挿入される

このへんは好みが分かれるかもしれないな、と思いました。

このへんはもしかしたら設定で変えられるのかもしれませんが、やり方を見つけられませんでした。
もしかしたら変えられないのかもしれない？ (2018 年 12 月現在)

## vim plugin ？

本稿で記載している機能と同等以上のことを実現するための vim plugin ([prettier/vim-prettier](https://github.com/prettier/vim-prettier)) が存在しています。
本稿が vim plugin を用いた手法を紹介していない理由は、

- たまたま近所に vim plugin を絶対に入れない同僚がいたので、そういう vim plugin がキライなミニマリストな方には需要があるかもしれません。
- 一応、 vim plugin を入れるよりもちょっとだけ導入が素早い可能性があります (vim plugin のインストールを省略できるという意味で) 。

## おわりに

vim で markdown を書いているときに prettier で整形する方法を紹介しました。いかがでしたでしょうか。
特に表の整形はホントに便利で感極まること請け合いです。ぜひお試しあれ！
見てくれた方の vim ライフ (あるいは markdown ライフ) が少しでも良いものになれば幸いです。

明日の [ACCESS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/access) は @soebosi の登板です。お楽しみに！
フォームオブジェクトでバリデーション　初心者→中級者へのSTEP2/25

#フォームオブジェクトでバリデーション　

*はじめに*
[前回の記事](https://qiita.com/kamohicokamo/items/f47ce6e72d41ec971c94)ではController, Model, View, Databaseでのバリデーション（データの検証）の役割を説明しました。
今回はControllerにおいて、その役割をどう果たすかの具体例です。
Controllerでの入力値を検証するフォームオブジェクトについて説明してみます。

##フォームオブジェクト
先に言っとくと、これはRailsの仕様や機能ではなく、デザインパターンの一つです。(一応Railsも推奨しているパターンです。)

フォームオブジェクトのメリットですが、

- DBに関連しないフォームでもActiveRecordと同じバリデーションが使える。
- Model,Controllerに分散されがちなロジックをform object内に集められる。

個人的には前回の記事で書いたバリデーションの役割分担をできて、コードもスッキリするって感じかな...

早速書いてきます。

##コード##
###Userコントローラー###
```users_controller.rb
class UsersController < ApplicationController
  def new
    @user = FormUserNew.new
  end

  def create
    @user = FormUserNew.new(user_params)
    if @user.save
      redirect_to '/'
    else
      render :new
    end
  end


  private
    def user_params
      params.require(:user).permit(:name, :email)
    end
end
```
いつもならここはUser.newですがUserモデルのオブジェクトではなく、新しく作ったフォームオブジェクトの`FormUserNew`を用います。

###Userモデル###
```user.rb
class User < ApplicationRecord
#今回入力値の検証ということでmodelには何も書きません。
end

```

###User#newのview###
```new.haml
= form_with(model: @user, local: true) do |f|
  = f.label :name
  = f.text_field :name
  = f.label :email
  = f.text_field :email
  =f.submit '送信'
```
ここには変化はありません。

###フォームオブジェクト###
```app/forms/form_user_new.rb
class FormUserNew 
  include ActiveModel::Model

  attr_accessor :name, :email

  validates :email, presence: true
  validates :name, presence: true

  def to_model
    User.new(name: name, email: email)
  end

  def save
    return false if invalid?
    to_model.save
  end
end
```
まず最初にフォームオブジェクトを生み出すフォームクラスなるものは`app/forms/`に置いてください。（Rails推奨）

`include ActiveModel::Model`によりいつも通りにここでもバリデーションが使えます。
`name`,`email`共に空では受け付けないようになっています。
saveメソッドを行う時にバリデーションしてます。

```app/forms/form_user_new.rb
 def to_model
   User.new(name: name, email: email)
 end
```
上の部分では`form_with`ではモデルに関連したパスを生成するので、ここでフォームオブジェクトをモデル化する時にUserモデルに変換してます。そもそも`to_model`はActiveModel内のメソッドです。本来はオブジェクトのクラスのモデルを返しますが、今回それをオーバーライドしてます。


このFromUserNewクラスによって入力されたパラメーターはUserモデルとしてsaveする前にFromUserNewオブジェクトとしてバリデーションがかかり、保存できません。なので`User.rb`に何のバリデーションも記載してないけど、name,emailが空だと保存できません。


##まとめ##
バリデーションルールが複雑になってくると、modelだけにルールを書くのはよろしくないかと思いまして、フォームオブジェクトでも検証できればコードは綺麗になるかなと。それにフォームオブジェクトでは入力値としての検証！modelではロジック的な検証！と分担できてスッキリします。こゆのって大規模開発になってこないとありがたみってわかないのかもね。明日はモデルの方に移ってカステムバリデートを掘り下げていくンゴ。

##参考にしたの

Rails: Form Objectと`#to_model`を使ってバリデーションをモデルから分離する（翻訳）
https://techracho.bpsinc.jp/hachi8833/2018_03_02/51350

form objectを使ってみよう
https://tech.medpeer.co.jp/entry/2017/05/09/070758

RailsのFormクラスについて
https://woshidan.hatenablog.com/entry/2018/04/01/221741
2018年のAR開発における振り返り

この記事は[AR Advent Calendar 2018](https://adventar.org/calendars/2956#list-2018-12-01)の一日目の記事です。

今年もあと残り一ヶ月となってしまいました⛄
去年の1月にGraffityにジョインしてから怒涛の一年でした・・・

そんな2018年の締めくくりを兼ねて今年起きたAR開発における振り返りを雑多にまとめようと思います。

## ARKit
![ARKit-logo-icon.jpg](https://qiita-image-store.s3.amazonaws.com/0/243926/78e3aad1-369b-3032-e31a-5c5830a64fd5.jpeg)

- AppleがiOS向けに公開しているAR開発のためのフレームワーク
- 2017年9月にARKit 1.0が公開
- iOS11以降に対応している端末で動作する(iPhone SE, iPhone 6s以降)

### ARKit1.5のリリース
- 不規則な形の平面が認識できるように
- 平面認識が垂直面も認識できるように
- 画像認識が強化。アンカー(ARImageAnchor)の検出ができるように
- 解像度が50%向上。カメラがオートフォーカスに対応

[参考]
https://www.apple.com/jp/newsroom/2018/03/ios-11-3-is-available-today/


### ARKit2.0のリリース
- ARWorldMapを使って共有体験ができるように
- 環境マッピングに対応、周囲の映り込みが表現できるように
- ARReferenceObjectやARKitScannerにより物体認識ができるように
- 舌のトラッキングができるように

[参考]
[ARKit 2.0の何が凄いのか](https://qiita.com/k-boy/items/d935b76fed67e11b9fb2)

## ARCore
![01_l.png](https://qiita-image-store.s3.amazonaws.com/0/243926/a35bf7f0-9541-9150-77ff-d8a5ba3b7741.png)
- Googleが提供しているAR開発のためのフレームワーク
- AndroidだけではなくiOSでも動作するAPIも提供

### ARCore正式版(v1.0)のリリース
![porsche_l (1).png](https://qiita-image-store.s3.amazonaws.com/0/243926/a22974b2-b3cf-6e10-fb6f-9b2a13f29ee8.png)
- 6DoFや平面認識
- 環境光を推定し、ARオブジェクトの色味を反映
- 垂直方向の壁は認識できない
- 相対座標の共有

### ARCore 1.2.0
- Vertical plane detection
    - 壁を認識できるようになった
- Cloud Anchors API
    - アンカーをCloudAnchorに変換し共有することでiOS/Android関係なくAR空間を共有することができる
　https://japan.cnet.com/article/35118915/
- Augmented Images API
    - 画像認識して位置をトラッキング

### ARCore 1.5
- gITF形式でロードが可能
- 「Sceneform」のオブジェクトをカスタマイズ可能
- ポイントクラウドで各ドットにID割当
- 対応デバイスの追加
    - [ARCore対応端末一覧](https://qiita.com/namiwavess/items/088605ffdd9062d57bd8)

## ARグラス
### Magic Leap One
https://www.youtube.com/watch?v=5iTLN3AuBws#action=share
![00.jpg](https://qiita-image-store.s3.amazonaws.com/0/243926/26fd996c-1d8f-f661-b753-8a6be0f56e48.jpeg)

### Meta2

https://www.youtube.com/watch?v=_x9462x6A0k#action=share
![53effc95568a3bd1e5335fd258871bcb.jpg](https://qiita-image-store.s3.amazonaws.com/0/243926/17fc0a02-25c5-d456-f7aa-f02d368a13ef.jpeg)

https://vrjour.jp/arglasses/#Apple_Glass


### その他開発ツール
- 8th Wall
    - 「8th Wall Web」や「8th Wall ARCamera」を公開
- Vuforia
- Kudan
- Amazon Sumerian

## まとめ
2018年はARKitやARCoreを始め多くのSDKが「垂直面の平面検出」や「画像のトラッキング」などが可能になり、最低限のマーカーレスのAR開発を行うための環境が整ったと言えそうです。

また、ARCoreの「Cloud Anchor API」やARKitの「WorldMap」などといったAR空間の共有体験のためのAPIも公開されました。2019年はますますARCloudの世界の実現に向けて各APIがアップデートされていく年になってくると思います。

ARグラスにおいては「Magic Leap One」や「Meta 2」が一般向けに発売されましたが、2020年発売予定と噂される「Apple Glass」やそれに対してARグラスで再起を図るであろう「Google Glass」の動きも気になる年になりそうですね👓


明日は@mcz9mmさんです！よろしくおねがいします！