OmniAICreator/Qiita-1.07M huggingface dataset:
【Docker】コンテナ再作成の際、削除したものと同じコンテナ名で再作成しようとしたら叱られた時の応急処置【already in use by container】

#【事象】
テスト環境で運用しているコンテナを作成する際、下記のようなメッセージが出た。
流れとしては、古いコンテナ(test1)を停止削除し、再度、同じコンテナ名(test1)で再作成した際、叱られた。
作成時コンテナ名を変えればOKなメッセージですが、運用しているテスト環境は、コンテナ名をサブドメインにしてブラウザアクセス等もテストしている環境のため、命名規則を破るわけにはいかない。

激おこメッセージ

```
ubuntu@HOST Server:~$ docker run -d -h test1 --name test1 -p 22 CountainerImage:Tag
docker: Error response from daemon: Conflict. The container name "/test1" is already in use by container 4f8893e6568ae9376e652a61ea2c64145c3cd3891aaacc092da83b4a68541c33. You have to remove (or rename) that container to be able to reuse that name..
See 'docker run --help'.

```
めっちゃConflictしている...。
コンテナ名は既に使われてるから、既存のものを別名にするかどうにかしなさいとのこと。
#【解決】
応急処置ですが、コンテナがマウントしているファイルシステムをmvし、再度同じコンテナ名で作成したら無事作成できました。

```
・ファイルシステムをmvしてみる。
ubuntu@HOST Server:~$ sudo mv /var/lib/docker/containers/4f8893e6568ae9376e652a61ea2c64145c3cd3891aaacc092da83b4a68541c33 /var/tmp/
・同じコンテナ名で再作成
ubuntu@HOST Server:~$ docker run -d -h test1 --name test1 -p 22 CountainerImage:Tag
→キマった
```
#【解決の前に確認したこと】
応急処置的な解決の前に確認したことは、3つです。
1.SwarmOverLayNetworkからの分離を確認
2.OS側でのmountのprocを確認
3.凡ミス確認
今回怖かったのは、ネットワーク分離もdocker stopもdocker rmもやったうえでこのメッセージが吐かれてしまったこと。
デーモンが掴んじゃってるんだろうけど、`実は根元のホストも再起動`したうえでのこのメッセージだったのです...。

**:;(∩´﹏`∩);:**

・SwarmOverLayNetworkを確認
　調べたところ、Swarmで構成されたコンテナ群でのトラブルは、コンテナをSwarmOverLayNetworkから切り離しを忘れていた場合、デーモンが掴んでしまって発生することが多いとのこと。
　停止・削除前に紐づいていたネットワークは(test)でした。

```
ネットワークを確認
docker network inspect test | grep test1
→外れてい～る。
```
・OSでマウントがされてる！？
一回再起動しはしたけれど、OS情報でメモリが掴んじゃっているんだろうかという疑問。

```
cat /proc/mount| grep <該当コンテナのファイルシステム>
→いない。
```
・凡ミス？
もしかして停止だけで削除は忘れていた？

```
docker ps -a
いない
```
**(ФДФ)**
#【解決の前にトライしたこと】
ファイルシステムをunmountして解決している人もいたので、真似てみました。

```
・手動でunmount
ubuntu@HOST Server:~$ sudo umount /var/lib/docker/containers/4f8893e6568ae9376e652a61ea2c64145c3cd3891aaacc092da83b4a68541c33
sudo: unable to resolve host HOST Server
umount: /var/lib/docker/containers/4f8893e6568ae9376e652a61ea2c64145c3cd3891aaacc092da83b4a68541c33: not mounted
→そんなファイルシステムはいないといわれる。
```
今回は、ファイルシステムをMVするで応急処置しましたが、もし本当の解決策があれば、コメント下さい～。
#【詳細】
Docker Basics Webinar Q&A: Understanding Union Filesystems, Storage and Volumes 
https://blog.docker.com/2015/10/docker-basics-webinar-qa/
dockerが使うUnionFileSystemを僕なりに解釈した - See the Elephant 
https://namu-r21.hatenablog.com/entry/2016/10/27/013006
【Ruby】array.map(&:method)を理解する

# 概要
Rubyで書かれたコードを見ていると度々`array.map(&:メソッド名)`の形式のイディオムを見かけると思います。そこで、`array.map(&:メソッド名)`がどのような動きをし、またなぜそのような動きをするのかまとめました。

# 何をする？
簡単にいうと以下のように配列の要素１つ１つに`(&:メソッド名)` で与えられたメソッドを呼んでいます。
(以下の例では文字列の`a`と`b`に対して`String#upcase`メソッドを呼んでいます。

```ruby
['a' ,'b'].map(&:upcase) #=> ["A", "B"]
```

# なぜこのような結果になる？

### 引数にある`&`
まず、Rubyが引数内で`&`を見つけるとその値を`プロック(proc)`として扱おうとし、その値(この場合`:upcase`)に対して`to_proc`メソッドを呼びます。

```ruby
class Symbol
  def to_proc
    puts "to_procが呼ばれました！"
  end
end

p [].map(&:upcase) #=> to_procが呼ばれました!
## その後TypeErrorが発生。
```

### `Symbol#to_proc`メソッドとは？
`to_proc`メソッドはその名の通り、渡されたシンボルを手続きオブジェクトの`proc`として返すものです。

```ruby
prc = :upcase.to_proc 
p prc #=> #<Proc:0x00007f99d303e458(&:upcase)>
```
作成した`prc`を文字列に呼んでみます。

```ruby
p prc.call("string") #=> STRING
```

まとめると以下の事を行なっています。

```ruby
:upcase.to_proc.call("string")#=> STRING
```

## 結論
つまり、`array.map(&:メソッド名)`の`(&:メソッド名)`部分は`:メソッド名.to_proc.call`を省略した形という事になります。
以下の例で実際に両者の比較をみてみます。

```ruby
# array.map(&:メソッド名)の記法
['a','b'].map(&:upcase) #=> ["A", "B"]

# 省略しない記法
['a','b'].map do |string|
  :upcase.to_proc.call(string)
end
#=> ["A", "B"]
```

# 参考
[Understanding Ruby's idiom: array.map(&:method)](https://www.brianstorti.com/understanding-ruby-idiom-map-with-symbol/)
https://therealadam.com/2008/05/01/beautiful-multi-line-blocks-in-ruby/
quicklinkで超簡単にページロードを高速化する

GoogleのChrome teamがquiclinkというOSSを公開したので、少し試してみました。
**すごくいい感じ**:grin:だったので紹介します。

:octocat: GitHub
https://github.com/GoogleChromeLabs/quicklink
![68747470733a2f2f692e696d6775722e636f6d2f4e56525a4c48762e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/18114/8902edbd-14f4-2587-5747-a5d181b99ecb.png)

quicklinkは、**画面表示領域のリンクをプリフェッチしてくれる**モジュールです。

遷移が早くなるので**UXの向上が期待できます**！

この記事では、Githubリポジトリ内のデモhtmlを使って挙動を確認するまでを紹介します。

## 基本的な動作

動きとしてはこんな感じらしいです。

- viewportのリンクを検出する
- ブラウザがアイドルするまで待つ
- ユーザが遅いコネクションかどうかをチェックする（またはdata-saverが有効化どうか）
- リンクをプリフェッチする

## 使い方

最も簡単な例だと、quicklinkを読み込んで、関数をコールするだけです。

```html
<script src="dist/quicklink.js"></script>
<script>
quicklink();
</script>
```

まじか。。。簡単すぎる:open_mouth:

もちろん、APIで`timeout`や`priority`など細かい設定をすることも可能です。 詳細は[README](https://github.com/GoogleChromeLabs/quicklink/blob/master/README.md)を参照してください。

## インストール

はい、楽勝ですね。

```
$ npm install --save quicklink
```

## デモを試す

Githubから持ってきたソースに移動して、yarnでnode_modulesを取得します。

```sell-session
$ cd /path/to/quicklink
$ yarn install
yarn install v1.12.3
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
$ npm run -s build
(node:12722) Warning: N-API is an experimental feature and could change at any time.
Build "quicklink" to dist:
        741 B: quicklink.js.gz
        601 B: quicklink.js.br
        737 B: quicklink.mjs.gz
        604 B: quicklink.mjs.br
        797 B: quicklink.umd.js.gz
        661 B: quicklink.umd.js.br
✨  Done in 746.23s.
```

npm start して、serverを起動します。

```shell-session
$ npm start

> quicklink@0.1.1 start /path/to/quicklink
> http-server .

Starting up http-server, serving .
Available on:
  http://127.0.0.1:8080
  http://10.XX.XX.XX:8080
Hit CTRL-C to stop the server
```

デモ用のhtmlにアクセスします。ブラウザを直接叩いても大丈夫です。

```shell-session
$ open http://127.0.0.1:8080/demos/basic.html
```

で、こんな画面が表示されればOKです。
<img width="1033" alt="スクリーンショット 2018-12-12 18.50.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/7609ff1f-6a8b-a987-b527-9bb94cebdbee.png">

画面をスクロールすると、**viewportにLink 3が現れ、そのリンクをプリフェッチしている**ことがわかります。
<img width="1033" alt="プリフェッチ3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/18114/0d2e355a-7544-f96a-3dcc-13ee364c9cca.jpeg">

更にスクロールすると、Link 4もプリフェッチされたのがわかります。**いい感じすぎる。**
<img width="1033" alt="プリフェッチ4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/18114/14d9d8b5-6786-da62-1c6c-4fdbc588be50.jpeg">

Initiatorを見るとわかるのですが、内部的には**ServiceWorkerを使っています**ね。

また、自分でデモを動かして確認するのがめんどくさい人は、[WebPageTest](https://www.webpagetest.org/video/view.php?id=181212_4c294265117680f2636676721cc886613fe2eede&data=1
)で動きを確認することができます。


## まとめ

Google謹製のquicklinkを紹介しました。

使い方も簡単だし、導入コストも低そうなので、これで**あなたのサイトのUXを超簡単に向上させる**ことができそうですね！
RxJSの時間に関するoperatorをまとめる

#前提
Observableについて学ばなければいけません。


## timer
* observableを作る
* 指定された期間で、数字をemitする

```typescript
//１秒後にemitされるobservableを作成
const source = timer(1000)
source.subscrive(val => console.log(val));
```

```typescript
0
```
## interval
* observableを作る
* 指定された時間単位で,連続的に数字をemitする

```typescript
//1秒ごとにemitされるobservableを作成
const source = interval(1000)
source.subscribe(val => console.log(val))
```


```typescript
//unsubscribeするまで無限にemitされる
0,1,2,3,4,5,6.....
```

## auditTime
* 指定された期間の中で値を無視する。
* 期間で区切った時の古い値を出力する

```typescript
//１秒たつと出力さ荒れるobsservable
const source = interval(1000);
//5秒間まつ。最後にemitされた値を出力する
const example = source.pipe(auditTime(5000));
const subscribe = example.subscribe(val => console.log(val));
```

```typescript
4...9...14
```

## debounceTime
* valueの出力を指定された期間分遅らせる
* 期間で区切った時の、古い値を出力

```typescript
//１秒たつと出力さ荒れるobsservable
const source = interval(1000);
//5秒間まつ。最後にemitされた値を出力する
const example = source.pipe(debounceTime(5000));
const subscribe = example.subscribe(val => console.log(val));
```

```typescript
//intervalで５秒たった後に、さらに5秒待って出力される
4...9...14
```


## throttleTime
* 指定された期間の中で値を無視する
* 期間の中で、新しい値を取り出す

```typescript
//１秒たつと出力さ荒れるobsservable
const source = interval(1000);
//5秒間まつ。最後にemitされた値を出力する
const example = source.pipe(throttleTime(5000));
const subscribe = example.subscribe(val => console.log(val));
```

```typescript
 0...6...12
```

## bufferTime
* 指定された期間の中でemitを制御し、その間emitされる値を集めて配列でemitする

```typescript
//0.5秒に一回emitされるobservable
const source = interval(500);
//１秒までに出された値を配列で返すようにする
const subscription = source.pipe( bufferTime(1000));
subscription.subscribe(val => console.log(val));
```

```typescript
[0,1], [2,3], [4,5]....
```
## delay
* 指定された時間分emitされるタイミングを遅らせる

```typescript

const example = of(null);

//格observableにdelayをつけてタイミングを遅らせる
const message = merge(
  example.pipe(mapTo('Hello')),
  example.pipe(
    mapTo('World!'),
    delay(1000)
  ),
  example.pipe(
    mapTo('Goodbye'),
    delay(2000)
  ),
  example.pipe(
    mapTo('World!'),
    delay(3000)
  )
);
const subscribe = message.subscribe(val => console.log(val));
```

```typescript
 'Hello'...'World!'...'Goodbye'...'World!'
```

## timeout
* 指定された期間にemitされない場合にerrorをだす。

```typescript
//５秒後に値がemitされる
const time = time(5000);
//１秒で値が出されなかったらerrorをだす
const source = time.pipe(timeout(1000));
source.subscribe(catchError => console.log("error"));

```

```typescript
"error"
```
KotlinでList<Int>とList<String>にextensionをつけたい時につけるアノテーション(@JvmName)

# 概要
APIから返ってきたレスポンス(Entity)をModelに変換する際、converterをEntityの拡張メソッドで定義している。
1Entityが複数のリストを返してきて、その変換処理を定義しようとしたら少し解決に時間がかかったのでメモ

# まとめ
@JvmNameを使う

# 例

動かなかった例

``` Convert.kt
fun List<String>.toModel(): List<String> {
    return map { "name:"+it } 
}

fun List<Int>.toModel(): List<String> {
    return  { it.toString() }
}
```
この2つのメソッドが同じものを定義しているというエラーが発生し、ビルドに失敗する
↓のように、@JvmNameというアノテーションを付けると正常に動く

``` Convert.kt
@JvmName("StringToModel")
fun List<String>.toModel(): List<String> {
    return map { "name:"+it } 
}

@JvmName("IntToModel")
fun List<Int>.toModel(): List<String> {
    return  { it.toString() }
}
```

KotlinはJavaとの互換性を担保しているため、Kotlinでは区別できているメソッドでもJavaから見たら同じメソッドだと認識されてしまうことがある。
(Javaから見ると、拡張メソッドはstaticメソッドで同じファイルに宣言されている)
@JvmNameは、拡張メソッドに名前をつけてあげることができるアノテーション。
設定してあげると、メソッド名の競合を防ぐ事ができる
Swift UIViewの一部を角丸にしたい

# UIViewの一部を角丸にしたい
この記事は、[TECOTEC Advent Calendar 2018](https://qiita.com/advent-calendar/2018/tecotec) の11日目の記事です。

## ソースコード
開発環境：Xcode:10.1
開発言語：Swift4.2

【UIView.layer.maskedCornersに設定できる値（iOS11以降）】
.layerMinXMinYCorner 左上
.layerMaxXMinYCorner 右上
.layerMinXMaxYCorner 左下
.layerMaxXMaxYCorner 右下

【UIBezierPathのbyRoundingCornersに設定できる値(iOS11未満)】
.topLeft 左上
.topRight 右上
.bottomLeft 左下
.bottomRight 右下
.allCorners 全て

※ autoLayoutを使用しているとiOS11未満の角丸処理がviewDidLoad()だと上手くいかない可能性があるのでviewDidAppear()以降で書くと安全

```sample1.swift
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var yellowView: UIView!
    @IBOutlet weak var blueView: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        /// iOS11以降の角丸処理
        blueView.layer.cornerRadius = 20
        blueView.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMaxXMinYCorner]
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        /// iOS11未満の角丸処理
        let path = UIBezierPath(roundedRect:yellowView.bounds,
                                byRoundingCorners:[.topRight, .bottomRight],
                                cornerRadii: CGSize(width: 20, height: 20))
        let maskLayer = CAShapeLayer()
        maskLayer.path = path.cgPath
        yellowView.layer.mask = maskLayer
    }
}
```

上記ソースを実行するとこんな感じ
![Simulator Screen Shot - iPhone XS Max - 2018-12-12 at 19.24.44.png](https://qiita-image-store.s3.amazonaws.com/0/226381/e2bb3116-0eb6-6bc8-c069-c71de194f9a0.png)


・感想
　iOS11以降の角丸処理簡単になったなあ
【git】リモートレポジトリをクローン後、ローカルにリモートブランチを作成する方法

「everydayrails-rspec-2017」でRspecを勉強する前に
gitで躓いたのでメモします。

# 参考資料
https://github.com/everydayrails/everydayrails-rspec-2017

# リモートリポジトリからクローンする

```terminal
$ git clone https://github.com/everydayrails/everydayrails-rspec-2017.git
```

# ディレクトリ遷移

```terminal
$ cd everydayrails-rspec-2017
```

# ローカルとリモートのブランチを確認

```terminal
$ git branch -a
```
すると、以下のような結果が表示されるはずです。

> \* master
> remotes/origin/01-untested
> remotes/origin/02-setup
> remotes/origin/03-models
> remotes/origin/04-factories
> remotes/origin/05-controllers
> remotes/origin/06-features
> remotes/origin/07-requests
> remotes/origin/08-dry-specs
> remotes/origin/09-test-faster
> remotes/origin/10-testing-the-rest
> remotes/origin/11-tdd
> remotes/origin/HEAD -> origin/master
> remotes/origin/appendix-a-system-tests
> remotes/origin/cucumber
> remotes/origin/fix-geocoder-vcr
> remotes/origin/master
> remotes/origin/system-tests
> remotes/origin/travis-ci

# originの確認

```terminal
$ git remote -v
```
>origin  https://github.com/everydayrails/everydayrails-rspec-2017.git (fetch)
>origin  https://github.com/everydayrails/everydayrails-rspec-2017.git (push)

# リモートブランチをローカルに作成

```terminal
$ git checkout -b my-01-untested origin/01-untested
```

my-01-untested
 => ローカルに作成するブランチの名前

origin/01-untested
 => リモートに存在するブランチ

# ローカルにブランチが作成されていることを確認

```terminal
$ git branch
```

>master
>\* my-01-untested

ちゃんとローカルに作成されていますね！
gnuplotの3Dデータをmatplotlibで描けるように変換しよう

# gnuplot? matplotlib?
pythonを普段使っている僕は, どうしてもgnuplotを使いたくない!（笑）
ですが, 研究室の多くの方はgnuplotを使われている関係で, 3Dのマップデータをもらってもすぐにpythonで図を描けない...

# それなら関数作っちゃおう
ということで, 簡単な関数を作ってみました.
numpyのお勉強になると思います.

# コード
```python
import numpy as np

def translate(file_name):
  data = np.loadtxt(file_name)
  
  x = np.unique(data[:,0])
  y = np.unique(data[:,1])
  z = data[:,2].reshape(len(x),len(y)).T

  return x, y, z

import matplotlib.pyplot as plt

x, y, z = translate("gnuplot用のデータファイル")
plt.pcolormesh(x, y, z)
plt.show()
```

これだけです.

# コードの説明
- numpy.loadtxt()
 
    与えられたファイルの中のデータを, ndarray形式で変換してくれます.

- numpy.unique()

    今回の肝! ndarrayの中にある要素の内容をそのままndarray形式で返してくれます.

例えば

```python
x = np.array([1,3,6,2,0,2,7,8,1,3,5,10])
y = np.unique(x)

print(y) # => array([0,1,2,3,5,6,7,8,10])
```

という風に, 構成要素を抜き出してくれます.

# 最後に
gnuplotもいいけど, matplotlibもいいですよ!
Xamarin.Formsでカードスタイル

# iOSでもカードスタイルが使いたい

Androidだと標準だけどiOSだと標準ではない

最近はXamarinでもWPF並みに色々できるようになって来たのでXAMLだけで表現できるようになってた

### カード表示をするためのContentViewを追加

````csharp
sing System;

using Xamarin.Forms;

namespace hoge.Common
{
    public class Card : ContentView
    {
        public Card()
        {
        }
    }
}
````

これだけ


### カードっぽく見せるためのスタイルを追加

````csharp
<?xml version="1.0" encoding="UTF-8"?>
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms" 
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
                    xmlns:common="clr-namespace:hoge.Common"
                    x:Class="hoge.Asset.Styles">
    
    <ControlTemplate x:Key="CardTemplate">
        <Frame>
            <ContentPresenter />
        </Frame>
    </ControlTemplate>
    
    <Style TargetType="common:Card">
        <Setter Property="ControlTemplate" Value="{StaticResource CardTemplate}" />
    </Style>    
    
</ResourceDictionary>
````

Frameを使えばカードっぽい見た目になるので、ControlTemplateを使ってFrame内にコンテンツを表示するようにする


### Styleを読み込む

````csharp
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:theme="clr-namespace:hoge.Asset"
             x:Class="hoge.App">
    <Application.Resources>
        <theme:Styles />
    </Application.Resources>
</Application>
````

起動時に読み込んじゃう


### 出来上がり

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201603/cbb6daff-d94a-0764-1bbe-015446666f85.png)

カードっぽくなった

でも影の具合を調整するにはカスタムレンダーしかないのかも
https://alexdunn.org/2017/05/01/xamarin-tips-making-your-ios-frame-shadows-more-material/

ちょっと微妙な見た目だけどXAMLだけでも結構色々できるよというサンプルということで

# カードスタイルは良い

テーブルでの表現の代替と考えた場合、表示の柔軟性が良い

カードを使う場合は基本的にスクロールを使うことを許可したデザインになるが、

縦に並べて良し、横に並べて良し　→　レスポンシブにしやすい

表示項目が追加になったらそのまま足せば良い

テーブルを使った場合の色々な悩みから解放される

絶対にスクロールしないで、というデザインの場合はカードは厳しいけど
VSCode: JavaScriptを整形する際、オブジェクトをワンラインで表示したい

VSCodeは軽くて軽快でLightで好きです。
TypeScriptとの相性も、もちろん良いですし。

ですが、ながらく、整形(beautify, prettier, format)した際にオブジェクトも複数行に展開されてしまうのは、なんとかならんのかなぁ感じていました。一行で表示したい。

```statham.js
// 以下のようなimportなどが
import { helloWorld } from './app';
// なにも設定しないと
// 整形した際に、以下のようになってしまう。あんま気持ちよくない
import {
  helloWorld
} from './app';
// 本当は、一行のままにしておきたい
```

調べたら、すぐ解決しました。

```settings.json
"beautify.config": {
        "brace_style": "collapse,preserve-inline"
    },
```

手順としては、「ファイル」->「基本設定」->「設定」より"beautify.config"を検索、それを上記のように編集すれば良い。

[ありがたや](https://github.com/beautify-web/js-beautify/issues/315#issuecomment-397524391)
UbuntuにFuji Xeroxドライバーをインストールする

研究室用

## ドライバのダウンロード
「ubuntu xerox ドライバー」等で検索して公式のホームページを選ぶ。
私の場合はApeosport-V C3376だったので[ここ](https://www.fujixerox.co.jp/download/docuprint/download/p450d/linux_ubun64)からダウンロードした。

## ドライバのインストール
ダウンロードしたdebファイルの場所でターミナルを開き以下のコマンドを入力。この作業は通常のパッケージのときと変わらない。

```
$sudo dpkg -i fxlinux*.deb
```

## プリンタの追加
「設定」→「プリンタ」→「追加」を押すと以下のようなダイアログが出る。
![s_Screenshot from 2018-12-12 19-18-00.png](https://qiita-image-store.s3.amazonaws.com/0/176789/d2e94ba2-a2ac-b93a-6f9c-bbcc6184d666.png)
「ホスト名」のところにプリンタのIPアドレスを入力すれば良い。

## ドライバの指定
ちゃんと指定してやればApeosPort-V C3376が一覧に出てくるので「進む」ボタン。
続いてドライバを指定せよとの指示が出るので、ここで**「FX」→「Fiji xerox for linux」**を選ぶ。
ドライバ一覧には「FX」の他にも「Fuji Xerox」や「Xerox」など紛らわしい名前が表示されるが、先ほどインストールしたドライバは「FX」の中にあるので注意すること。
以上でプリンタの設定は完了です。
やってみるとWindowsやMacよりも簡単でした。
raspberry pi 1でtensorflow lite その4


#概要

raspberry pi 1でtensorflow liteやってみた。
tfliteファイルを作ってみた。
sessionから作ってみた。
データセットは、xor.

#環境

tensorflow 1.12

#モデルを学習してsessionをtfliteファイルに変換する。


```
import tensorflow as tf
import tensorflow.contrib.lite as lite
import numpy as np

X = [[0, 0], [0, 1], [1, 0], [1, 1]]
Y = [[1, 0], [0, 1], [0, 1], [1, 0]]
x = tf.placeholder(tf.float32, shape = [None, 2], name = "input")
y = tf.placeholder(tf.float32, shape = [None, 2], name = "output")
w1 = tf.Variable(tf.random_uniform([2, 2], -1, 1, seed = 0))
w2 = tf.Variable(tf.random_uniform([2, 2], -1, 1, seed = 0))
b1 = tf.Variable(tf.zeros([2]))
b2 = tf.Variable(tf.zeros([2]))
h1 = tf.sigmoid(tf.matmul(x, w1) + b1)
h2 = tf.nn.softmax(tf.matmul(h1, w2) + b2)
cost = -tf.reduce_sum(y * tf.log(h2))
opti = tf.train.GradientDescentOptimizer(0.1).minimize(cost)
with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())
  for i in range(10000):
    sess.run(opti, feed_dict = {
      x: X,
      y: Y
    })
  for i in [[1, 1], [1, 0], [0, 1], [0, 0]]:
    print (i, sess.run(h2, feed_dict = {
      x: [i],
    }))
  converter = lite.TFLiteConverter.from_session(sess, [x], [h2])
  tflite_model = converter.convert()
  open("xor1_model.tflite", "wb").write(tflite_model)
```

#tfliteファイルを用いて、検証する。


```
import numpy as np
import tensorflow as tf
import tensorflow.contrib.lite as lite

interpreter = lite.Interpreter(model_path = "xor1_model.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
print (input_details)
print (output_details)
input_shape = input_details[0]['shape']
input_data = np.array([[0.0, 0.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
input_data = np.array([[1.0, 0.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
input_data = np.array([[0.0, 1.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
input_data = np.array([[1.0, 1.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
```

以上。
Unity→TouchDesigner 画面キャプチャ送信覚書

[@_kiryo](https://twitter.com/_kiryo)です。


###Unity画面送信の基本
UnityとTouchDesignerをつなぐときにはkeijiroさんの下記を拝借します
[keijiroさんgit](https://github.com/keijiro/KlakSpout)

①表示したいカメラにspout(syphon)senderスクリプトを配置
②touchdesignerでsyphon/spout inのオペレーターを置く

これで簡単にTouchで受信できたのですが、解像度ががびがびでした。

###綺麗に受信するチェックポイント

①syphon/spout inのcommonをuseinputにしているか
→custom resolutionではなく、useinputにして、受信したデータに依存するようにする

②spout(syphon)senderをカメラではないオブジェクトにアタッチする
→これがポイントでした。

keijiroさんのドキュメントをよく見れば（英語で）書いてあるのですが、
カメラにsenderをアタッチすると、自分が使っているディスプレイの解像度に依存してしまいます。
そのため、UnityのヒエラルキーにEventManagerなど適当なGameobjectを作って、そこにアタッチします。


###render textureの設定
spout(syphon)senderをカメラ以外に設定すると、source textureという項目が現れます。![aaaaa.png](https://qiita-image-store.s3.amazonaws.com/0/156691/ed0b4598-3baf-0ebe-4ecb-bbc03ccb2b1b.png)
unityには、テクスチャとして画面の情報をリアルタイムで保持するrender textureという機能があるようです。

①unityの画面で、マテリアルを作るときのように、assetファイルに新しくrender textureというファイルを作成します。

②作成したrenderのinspectorを表示させ、解像度をフルHDに設定します。



③表示させたいカメラオブジェクトをみると、カメラコンポーネントのinspectorに、target textureという項目があるので、そこに作成したrender textureを設定します。

Unityを再生した状態で、TouchDesignerも再生し、オペレーターの通信のトグルをonにすると、綺麗な解像度でUnityからの画面を受信することができます。


おしまい
[VR]UnityでVRアプリをつくる 其乃壱

#はじめに
ゆーてもわたしは素人です。
趣味で適当なものを作ったことがあるだけなので、絶賛勉強中です。
この会は何回かにわけてやっていくので、一緒に学んでいきましょう。

#なにをするか
VR、ARのアプリケーションをつくりたいんです。

**「でも、難しいんでしょう？」**

そう確かに、あんな３D空間どうやって作るんだろう？って思いますよね。
現代の科学は進んでるから大丈夫ですよ。
安心してください。

#つかうもの
- Unity
- Sculptris（今回は使わない）
- Blender（今回は使わない）
- Xcode、Android Studio、 etc...

3D描画をするためには色々なツールがございますが、今回はもっとも代表的で王道（？）なUnityを使います。

#Unityって？
ゲーム開発プラットフォームとしては世界で1位のシェアを誇るゲームエンジンです。
Unityのおすすめポイントをご紹介します。

###おすすめ 1:　手軽に3Dを表現
まず強みといえば簡単に3Dを表現できるところです。
3Dの描画はもちろん、オブジェクトの物理計算も勝手にやってくれるので、例えば

`物体に重量をつける　☑️`

これだけで勝手にぴゅーっとボールが落っこちていきます。
これだけだったらノーコーディングです。

###おすすめ 2: 無料
まあエンジニアといえば飛びついてしまいますが、これだけの機能が備わっていると
**「でも、お高いんでしょう？」**
ってなりますよね。
無料なんですよ。もちろん、制限がついているので企業として使う場合は有料ですけどね。

###おすすめ 3: マルチプラットフォーム
個人的にはこれです。吐き出し先が多い！

- iOS
- Android
- Tizen
- Android TV
- Windows
- Windows Phone 8
- Windowsストアアプリ
- macOS
- Linux
- ウェブブラウザ (WebGL、Unity Web Player)
- PlayStation 3
- PlayStation 4
- PlayStation Vita
- Xbox 360
- Xbox One
- Wii U

2018年現在、これだけのプラットフォームへコードを吐き出して対応することができます。
もちろん、端末によって吐き出し後に微妙に調整は必要ですが、それでも大幅に開発コストを落とすことができます。

ということでこんなにすばらしいUnityを使って、VRの世界へ飛び込みましょう。

#準備
以下URLからダウンロードしましょう。
https://unity3d.com/jp/get-unity/download

落としたらインストールしてください。特に難しいことはないのですんなりいくと思います。
（Windowsはどうなるかわかりませんが。。。）

よく考えたら準備これだけだった。

#つくろう！
起動したら、
メニューから、File -> New Projectから新しいプロジェクトを作ります。
必要項目を埋めてください。

|項目|内容|
|:-:|:-:|
|Project Name|適当でOK！|
|Location|保存先。お好きなように|
|Template|VR Lightweight RP|
で、Create Projectをクリック！

なんとなく察したかもしれませんが、テンプレを選んだ時点で大方できてます。
<img width="1552" alt="スクリーンショット 2018-12-12 18.12.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/132494/7b09632c-0db8-d182-f82c-ac0cb4e49aac.png">

##オブジェクトを追加しよう！
メニューから GameObject -> 3D Object -> Sphereを選択してみてください。
球体がどこかに出てきたんじゃないでしょうか。
<img width="788" alt="スクリーンショット 2018-12-12 18.22.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/132494/a2bc3f9e-cdcb-b482-4a08-9d7384ca6751.png">

なんの変哲もない球です。
そう、あなたはこの世界に**「球」**を召喚したのです。

右ペインのInspectotで座標や大きさを変更することができます。好きにいじってみてください。

##オブジェクトに重力をつけてみよう！
今の段階で実行してみましょう。上部にある`「▶︎」`を押すとデバッグ画面が出てきます。
###「The World」
みたいな感じになっているかと思います。

これは、オブジェクトに重力が考慮されていないからです。
何もしないとこのように指定した座標に物体が静止しているだけです。

###ここでオブジェクトに命を吹き込みましょう！
先ほど追加した球体オブジェクトを選択します。
右ペインの一番下に**「Add Component」**というボタンがあるので押してみてください。
ここからオブジェクトにプロパティをつけたり独自のScriptをつけたりなんかができます。

今回は重力をつけたいので、Phisicsの中にある、**「Rigidbody」**を選んでください。
Inspectorの中にComponentとして追加されます。
<img width="304" alt="スクリーンショット 2018-12-12 18.45.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/132494/a2402f62-db3b-e8a9-a44a-4ca3d914e52f.png">

ここに`Use Gravity  ☑️`とありますね。
これでこの球体に重力が与えられました。実行して確認してみましょう！

落ちていきましたか？
床をすり抜けたかもしれませんが、そこはまた別途衝突判定をつけなくちゃいけないので、とりあえずそんなOKです。

#実際にVR世界で体験しよう！
兎にも角にも実際にアプリにしてみないとつまんないですよね。
端末にいれて確認してみましょう！！

メニューのFile -> Buildから好きな吐き出し先を選択して出力してみましょう！
今回はVRってことでiPhone用に吐き出します。
（Xcode用に生成するのでそこそこ時間がかかります。）

完了したらXcodeを立ち上げていつも通りデバッグしてみましょう！

と、いうことで今回は終わりです。
次回は独自Scriptをつけて物体を好きなように動かしてみる講座をやります。
C#でMIDI通信を扱うNext MIDI Projectで受信する

C#でMIDI通信を扱う

Next MIDI Project (MITライセンス)
http://starway.s234.xrea.com/wordpress/

にて、MIDIを受信するサンプル

このコードはCC0ライセンスとして公開

```C#
using System;
using NextMidi.MidiPort.Input.Core;
using NextMidi.MidiPort.Output.Core;
using NextMidi.MidiPort.Input;
using Avenue;
using NextMidi.DataElement;
using System.Threading;

//http://starway.s234.xrea.com/wordpress/
namespace MIDIControllerTestConsole
{
    class Program
    {
        //受信イベント
        static void MidiReceived(object sender, DataEventArgs<MidiEvent> e)
        {
            byte[] data = e.Value.ToNativeEvent(); //MIDI生値に変換
            foreach (var d in data) {
                Console.Write("{0:X2},",d);
            }
            Console.Write("\n");
        }

        static void Main(string[] args)
        {
            //ポートを開く
            var port = new MidiInPort("loopMIDI Port");
            try
            {
                port.Open();
            }
            catch
            {
                Console.WriteLine("ポートが見つかりません");
                return;
            }

            //受信イベント登録
            port.Received += MidiReceived;

            //なにかキーを押すと終了
            while (!Console.KeyAvailable) {
                Console.WriteLine("Keep-Alive");
                Thread.Sleep(1000);
            }
        }
    }
}

```
ノートについて

#ノートってなぜ必要なのだろう。

自分の身の回りにはデジタルガジェットだらけであり、
メモを上で取るということが殆どなくなった、でも必ずノートは常に持ち歩いてる。
なぜだろう？と疑問に思ったので考察してみました。


###ノートの利点

- 皮脂がついても吸収されるので目立たない
- 昼でも反射しなくて見やすい
- ブルーライトダメージがない
- スリープしない
- ずっと見てても電池が減らない
- 軽い
- 解像度が分子レベル

###デメリット
- それ自体発光しないので暗いところでは見えない。
- 筆記用具が必要
- ガジェットと比べて入力に精神力が必要
- 共有できない。
- コピーや検索、書き換えに手間がかかる。

##結論

目が疲れないし指紋汚れも目立た無いかつ軽量なので、
**ずっと見て熟考したり計算したりするには最適、他人と共有したり長期保存したり夜見たりするのは不便。**

なので、これから売れてくるのはちぎれるタイプのメモや安いノートではなくて、
しっかりと書き込んだり見ることに耐えられる少量高品質タイプのノートだと思います。

ちなみに自分のお気に入りのノートはツバメノートとモレスキンです。
ツバメノートは王道なので言わずもがな。
モレスキンは値段の割には紙質が悪いと言われますが、予算が綴じ数の多さとハードカバーに割り振られているんでしょう。またあの紙質だからこそ書き込んだ後適度にクシャッとなってノートの厚みが増すのが醍醐味だと思ってます。
raspberry pi 1でtensorflow lite その3


#概要

raspberry pi 1でtensorflow liteやってみた。
tfliteファイルを作ってみた。
kerasモデルから作ってみた。
データセットは、xor.

#環境

tensorflow 1.12

#kerasモデルを学習してセーブする。

```
import numpy as np 
from tensorflow.contrib.keras.api.keras.models import Sequential, model_from_json
from tensorflow.contrib.keras.api.keras.layers import Dense, Dropout, Activation
from tensorflow.contrib.keras.api.keras.optimizers import SGD
import os.path

X = np.array([[0, 0], [0, 1.0], [1.0, 0], [1.0, 1.0]])
y = np.array([[0.0], [1.0], [1.0], [0.0]])
model = Sequential()
model.add(Dense(8, input_dim = 2))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
sgd = SGD(lr = 0.1)
model.compile(loss = 'binary_crossentropy', optimizer = sgd)
model.save('_model.h5')
model.fit(X, y, batch_size = 1, epochs = 300)
model.summary();
print (model.predict_proba(X))
print ('save model')
model.save('c_model.h5')
json_string = model.to_json()
open(os.path.join('./', 'xor_model.json'), 'w').write(json_string)
yaml_string = model.to_yaml()
open(os.path.join('./', 'xor_model.yaml'), 'w').write(yaml_string)
print ('save weights')
model.save_weights(os.path.join('./', 'xor_model.h5'))
model1 = model_from_json(open(os.path.join('./', 'xor_model.json')).read())
model1.load_weights(os.path.join('./', 'xor_model.h5'))
model1.summary();
model1.compile(loss = 'binary_crossentropy', optimizer = 'sgd')
score = model1.evaluate(X, y, verbose = 0)
print (score)
print (model1.predict_proba(X))
```

#kerasモデルをtfliteファイルに変換する。


```
import tensorflow as tf
import tensorflow.contrib.lite as lite

converter = lite.TFLiteConverter.from_keras_model_file("c_model.h5")
tflite_model = converter.convert()
open("xor_model.tflite", "wb").write(tflite_model)
print ("ok")
```

#tfliteファイルを用いて、検証する。


```
import numpy as np
import tensorflow as tf
import tensorflow.contrib.lite as lite

interpreter = lite.Interpreter(model_path = "xor_model.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
print (input_details)
print (output_details)
input_shape = input_details[0]['shape']
input_data = np.array([[0.0, 0.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
input_data = np.array([[1.0, 0.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
input_data = np.array([[0.0, 1.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
input_data = np.array([[1.0, 1.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
```


以上。
Gitリポジトリを別のGitサーバーに移行する

## やりたいこと

- 既存のGitリポジトリを別のGitサーバーに移行する
- その時、コミット履歴なども移行する


## 前準備
Gitリポジトリを移行する先のリポジトリを作成する
作成し終わったら、GitのURL（末尾が.gitで終わるURL）をコピーしておく

## やってみる

調べてみると、手順が既に存在する

　参考：[Gitレポジトリを移行する方法](https://qiita.com/tanacasino/items/901723e3463bac38f40e)

この通りに実施してみればできたので、詰まったところを説明



```
$ git clone --mirror <SOURCE_REPOSITORY_URL>
$ cd <REPOSITORY>
$ git push --mirror <DESTINATION_REPOSITORY_URL>
```



コマンド自体はこの通りでOK

それぞれのパラメータについて少し説明



### SOURCE_REPOSITORY_URL

移行する対象のリポジトリのURLのこと
末尾が.gitで終わるURL



### REPOSITORY

ここが一番わからなかった

最初のコマンド```git clone ～```を実行した時に、～.gitのフォルダができると思う
そのフォルダのことを指している

例を挙げると以下の通り

```
$ git clone --mirror http://source.git
↑このコマンドを実行したときに「source.git」フォルダができる
$ cd source.git
```



### DESTINATION_REPOSITORY_URL

移行する先のリポジトリのURLのこと
末尾が.gitで終わるURL（前準備で作成したリポジトリのURL）



実際に移行してみたところ、履歴を含めて移行してくれた



※誤り等ありましたらコメントでご指摘ください
※「いいねｂ」していただけると書き手のモチベーションになります
ES6で指定範囲の整数配列を作る

Pythonのrange関数っぽく、指定した範囲の整数の配列を作る方法。

```javascript
> Array.from(Array(10).keys())

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
```

1から10にしたければ、

```javascript
> Array.from(Array(10).keys(), x => x + 1)

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
```

0始まりの配列ならこういう書き方もある。

```javascript
> [...Array(10).keys()]

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
```
AOJ day 21: Instance Chains and Kazunoko

Previously, I wrote about usage of instance chains when parsing Symbols, but it can be quite difficult to see just in that context. Even though the idea of how instance chains works in PureScript is that they are groups of instances that may have overlapping instance heads, it would help to see an easier example at work.

## "Fun type-level literal number arithmetic with instance chains"

In this post, I wrote about an amusing way to work with type-level numeric literals in PureScript:

<https://qiita.com/kimagure/items/b19cdbc1807109fb11cb>

Here, I defined successions of natural numbers, with an instance chain group so that I could catch overflows of my tiny range of zero to ten.

```hs
class Succ (i :: Symbol) (o :: Symbol) | i -> o, o -> i
instance zeroSucc :: Succ "zero" "one"
else instance oneSucc :: Succ "one" "two"
else instance twoSucc :: Succ "two" "three"
-- ...
else instance noSucc ::
  ( Fail (Text "i don't know how to count any bigger than ten or less than zero")
  ) => Succ i o
```

Then I could define addition and subtraction in a fairly simple way by working by the left operand. For the case of addition, this meant that I wanted to add by simply iterating on the case that given `left`, `right`, and `output`, `left` could be decremented by taking the reverse of succession:

```hs
class Add (l :: Symbol) (r :: Symbol) (o :: Symbol) | l -> r o
instance zeroAdd :: Add "zero" r r
else instance succAdd ::
  ( Succ l' l
  , Succ r r'
  , Add l' r' o
  ) => Add l r o
```

And while this is a really silly example, I hope this gives you some ideas on what you might like to try out if you have a type class with some tricky instances.
AOJ day 20: Easy Markdown to Beamer with Pandoc and Nix

This time, we'll take a total break from PureScript to talk about something everyone hates: setting up a way to make slides with latex-beamer.

Luckily, there are two big things I'll do to make this process way less painful: 1) I'll use Markdown and 2) I'll use nix to install the dependencies in a shell, so this is actually reproducible.

## "Easy Markdown to Beamer with Pandoc and Nix"

In this post, I go through how I used the combine function provided for the texlive derivation to stuff in all of the texlive packages I would need:

<https://qiita.com/kimagure/items/9d27015e12d4f22b53db>

With this setup, I no longer spend so much time with Google Slides on making my slides, and instead have more time to focus on and edit the content. Not that it was so bad to use Slides before when I could copy-paste from VSCode to get formatted code, but editing content and getting code laid out in Slides was so arduous before, where an average talk would take me over 10 hours to put together, whereas now I can easily get it done in 1 hour if I know what I want to talk about.
Site24x7でAWSを監視してみた

# Site24x7でAWS環境を監視してみる
サーバー系の監視は他記事で紹介されているので、Site24x7で実際に利用しているAWS監視を紹介します。

# AWS監視追加方法について
1. [管理] -> [監視の追加] -> [Amazon Web Service]を選択します。
<img width="402" alt="AWS監視追加01.png" src="https://qiita-image-store.s3.amazonaws.com/0/255821/9eb2ceab-63f9-2b1b-e055-4564faf8d654.png">

2. アクセスキーを指定
登録方法、「IAMロールに登録」「アクセスキーで登録」の2通りがあります。
今回は「アクセスキーで登録」を選択し、アクセスキーID、シークレットアクセスキーIDを指定します。
※アクセスキーIDとシークレットアクセスキーIDはAWSのポータルから取得します。
<img width="427" alt="AWS監視追加02.png" src="https://qiita-image-store.s3.amazonaws.com/0/255821/c1a26f30-5726-7733-0f23-2470f86ad131.png">

監視オプションがたくさんありますが、監視したいサービスを選択し[AWSリソースのディスカバリ]をクリックします。
<img width="511" alt="AWS監視追加03.png" src="https://qiita-image-store.s3.amazonaws.com/0/255821/5dc5fec6-c3ef-cb7c-38e1-96796ce48407.png">

3. AWSアカウントの追加を確認
追加後、ダッシュボードが表示されます。各サービスの利用状況が一目で把握できます。
サービス利用の履歴も見れたりしていい感じ。
<img width="655" alt="AWS監視追加04.png" src="https://qiita-image-store.s3.amazonaws.com/0/255821/968086e2-1e7a-a077-c38c-50f2f4d3133b.png">

# EC2のレポート
EC2の監視画面はこんな感じ。
<img width="703" alt="AWS監視追加05.png" src="https://qiita-image-store.s3.amazonaws.com/0/255821/6bace2af-766f-17bf-5a53-db5f5753f9ec.png">

可用性とCloudWatchで見れるデータを引っ張ってきている感じ。
<img width="473" alt="AWS監視追加06.png" src="https://qiita-image-store.s3.amazonaws.com/0/255821/338921b3-57b4-34a8-3e91-30165e659558.png">
<img width="398" alt="AWS監視追加07.png" src="https://qiita-image-store.s3.amazonaws.com/0/255821/5c4fb3ec-d478-98ec-347a-ce1c309795d0.png">

# RDSのレポート
RDSインスタンスのレポートもEC2と同じようにCloudWatchの情報を引っ張ってきているみたい。
<img width="538" alt="AWS監視追加08.png" src="https://qiita-image-store.s3.amazonaws.com/0/255821/33d668da-cbda-32a9-de39-139c1c8201b1.png">
<img width="490" alt="AWS監視追加09.png" src="https://qiita-image-store.s3.amazonaws.com/0/255821/28524e09-4840-8206-a61b-e58c9545ba2d.png">


# まとめ
AWSの監視追加はアクセスキー指定するだけで簡単に始められました。
次回は、EC2監視でもう少し詳細なデータを見る方法を紹介したいと思います。
空いた時間でサクッと読む自己流情報収集法

##最初に
IT系の話題は自分から探しに行かないとあっと言う間に置いていかれてしまうので、空いた時間があったら情報を仕入れて脳内アップデートを繰り返しています。
効率よく情報を仕入れる為によく利用しているサイトを紹介してみる。

## 一般ニュース・時事系

* [はてなブックマーク - テクノロジー](http://b.hatena.ne.jp/hotentry/it)
ここを見ていれば技術に関連する一般ニュースを見れる。時間がない時や、とりあえず流し見する時に。

* [グノシー](https://gunosy.com/)
自分好みに内容を取捨選択してくれるが、取得してくる内容の趣味色が強いので閲覧する内容が偏る傾向がある。
技術関連のニュースを検索する用途からは外れ気味（すると余計に技術のニュースを拾ってこなくなる悪循環なのですが…ｗ）

* [ECのミカタ](https://ecnomikata.com/ecnews/)
* [ネットショップ担当者フォーラム](https://netshop.impress.co.jp/)
自分がEC業界で仕事をしているので嫌でも情報は入って来ますが、キャッチアップできない内容もありますので（個人的に）ほぼ必読のサイト。

## 技術系

* [Qiita](https://qiita.com/)
タイムラインはタイトルを見てクリックする派。
自分はQiitaの回し者ではありません。

* [TechCrunch（日本語版）](https://jp.techcrunch.com/)
日本語版は[英語版](https://techcrunch.com/)の主要ニュースを翻訳したものと、日本独自のニュースが流れている。
海外の情報をすぐに仕入れたい場合は英語版を見る。

* [TechFeed](https://techfeed.io/)
* [Geechs Magazine](https://geechs-magazine.com/)
* [日経クロステック](https://tech.nikkeibp.co.jp/)

## 質問系

* [StackOverFlow](https://stackoverflow.com/)
みんな大好きStackOverFlow。開発中に起こる問題の大半はこのサイトを見ればほぼ解決する。
が、大抵の場合は自分の力にならないので極力見ないようにしている。

* [teratail](https://teratail.com/)
日本のStackOverFlowのような存在。同様の理由で極力見ないようにしている。

## その他

### エンジニアイベント系

色々なイベント紹介サイトがあるが、自分はこの2つで事足りている。

* [connpass](https://connpass.com/)
* [techplay](https://techplay.jp/)

### 勉強会系

* [SlideShare](https://www.slideshare.net/)
スライド共有サイト。勉強会のスライドはここに共有されていることが多い。

### 雑誌

* [Software Design](https://gihyo.jp/magazine/SD)
* [WEB+DB PRESS](https://gihyo.jp/magazine/wdpress)
C++ Builder XE4 > マルチモニタ > 現在いるモニタのサイズを知る > this->Monitorのプロパティを使う

```txt:動作環境
C++ Builder XE4
```

- [C++ Builder XE4 > TScreen > マルチモニタ > 二台のモニタでどちらのモニタにいるかを知る](https://qiita.com/7of9/items/08318acb1ab1251639b2)

> - 二台のモニタで実行
>   - 左右に並べた状態
> - サイズが異なる
> - それぞれのサイズに対して画面分割をしたい

上記のサイズを得るため、「どちらのモニタにいるか」を調べようとしていた。

現在いるモニタは`this->Monitor`で取得できることに気づいた。

### 実装

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int wdt = this->Monitor->Width;
	int hgt = this->Monitor->Height;

	String msg = String().sprintf(L"[%d]x[%d]", wdt, hgt);
	Memo1->Lines->Add(msg);
}
//---------------------------------------------------------------------------
```

### 動作例

左右、異なるサイズのモニタでButton1を押下した結果。

![2018-12-12_18h32_09.png](https://qiita-image-store.s3.amazonaws.com/0/32870/980fd222-c3db-0116-5394-0ae8dbb35782.png)

### 参考

- [Vcl.Forms.TMonitor](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/Vcl.Forms.TMonitor)
Alexaで忘年会の締めスキルを作った

# 公開しました

https://www.amazon.co.jp/dp/B07L9WFQ36/ref=sr_1_3?s=digital-skills&ie=UTF8&qid=1544606470&sr=1-3&keywords=%E5%BF%98%E5%B9%B4%E4%BC%9A

## なんで作ったか

スキル開発者への特典で、年末年始をテーマにしたスキルを公開すると
<b>Alexaオリジナルタンブラー</b>を貰えるから。
https://developer.amazon.com/ja/alexa-skills-kit/alexa-developer-skill-promotion

1個スキル公開したら、ついでにTシャツも貰えますね。

この年末年始をテーマって、スキル名に入ってればいいのか、説明に忘年会の文字が含まれていればいいのか
不明ですが、念の為、スキル名にいれたいと思います。

## スキルの使い方

 「アレクサ、忘年会の締めを開いて」
Alexa： 忘年会の締めでは、会社、家族、友達など〜〜、シチュエーションをどうぞ
「部署の忘年会」
Alexa: ちゅーもーーく、〜〜〜

もしくは、

「アレクサ、忘年会の締めで会社の忘年会」
Alexa： 宴もたけなわでは〜〜〜〜

## SSMLで日本語voice選べる

https://developer.amazon.com/ja/docs/custom-skills/speech-synthesis-markup-language-ssml-reference.html#voice

2018/12時点で、TakumiとMizukiが選べます。
基本的には、デフォルトの音声が一番聴きやすいと思いますが、
忘年会の締めの挨拶だと、男性の方が合ってるかなーと思って、大体Takumiを使いました。

```
<voice name="Takumi">
宴もたけなわではありますが、ご指名により、締めのご挨拶をさせていただきます。
<break time="1.0s"/>
この一年を振り返ると、色々なことが〜〜〜〜〜
〜〜〜〜〜
〜〜〜〜〜
それでは、一本締めで締めたいと思います。
<break time="2.5s"/>
お手を拝借、<break time="1.0s"/>
<prosody volume="+6dB"><emphasis level="strong">よーぉーぉーぅ。</emphasis></prosody><prosody volume="+12dB">おお！</prosody>
</voice>
```

一丁締めが正しいようですが、一本締めの方がわかりやすいかと思って、一本締めにしました。

## 申請して怒られたこと

特になし

## まとめ

SSML調整が一番時間かかるし、難しい。
エンジニア3年目で初めてレビューをするようになったので最初にしたこと

この記事は[ラクス Advent Calendar 2018](https://qiita.com/advent-calendar/2018/rakus)の23日目の記事です。
昨日は [@aizoさんの 通信についてちょっと詳しく(物理寄り)](https://qiita.com/aizko/items/1e6bd3b69c9dfad26b4c)でした！
本日はソースコードがない記事ですが、自分が初めて実施したことについての考察等をまとめてみました！

---

## はじめに
この記事を書こうと思ったきっかけは、Webアプリエンジニアとして初めて「レビューしてね」
と言われたときに、「レビューってどういう観点で、どういうコメントをすればいいんだろう？」
となったので、そのときに実践したことを書きます！

## 導入
うちの現場では上長にソースコードや結合テスト仕様書をレビュー依頼する前に、
開発者同士で相互にレビューを行っています。これはスキルセットに関わらず、
該当のソースを改修する人はもれなく対象(レビュアーとしてもレビュイーとしても)です！
上長に見てもらう前に開発者同士でレビューし合うことによって、以下のようなメリットが考えられます！

1. 次工程へ進むコードの質が高められる
1. 他の人の書いたコードを読むことで、新しい知見を得られる
1. 上長の工数を減らせるかもしれない

## メリット
### 1.次工程へ進むコードの質が高められる
上長にレビューをしてもらう前でも、以下のような内容は開発者同士でも確認することができます。

- 仕様に対するロジックがおかしくないか
- 冗長な書き方をしていないか
- わかりずらい命名をしていないか
- (リファクタリングしているのであれば)修正前後でロジックに変化がないか
- 変数やメソッドなど、共通化できる部分はないか
- シンタックスエラー

### 2.他の人の書いたコードを読むことで得られるものがある
これはスキルセットが似通った開発者であっても、そうでなくてもメリットがあります。

#### スキルセットが同じ場合
- 自分では書かないようなコーディング方法、ロジック、命名などがたくさん見れる
- 「こう書いたらもっと良いのでは」などのような議論がソースコードを使ってできる

#### スキルセットが異なる場合
- 自分では書けないコードを読む機会がもらえる (新しい発想・共通化の仕方・知らなかったライブラリ等)
- 先輩が後輩にソースコードを見てアドバイスする経験を得られる

### 3.上長の工数を減らせるかもしれない
上長は忙しい上に、時間当たりの価値が自分より高い場合が多いです。
また、上記のようなことをしておくことで開発者同士でのノウハウが蓄積され、
同じ指摘を防ぐことなどもできます。

## 「レビューしてね」と言われて、まず何をしたか
現場でレビューをしてみようと言われ、実際に取った行動をまとめてみたいと思います。

### 1.マージリクエストの上長のコメントをすべて見る
これは主に以下の理由から、追える限りのすべてのコメントを追いました。

- 影響範囲の大きなソースがPHPで書かれており、自分があまりPHPに精通していない
- 「レビュー = 指摘」のような立場で実施したくなかったので、どんな言い回しをしているのか
- コメントの種類として、どんなものが今まで多い傾向にあるか(命名・インデント・ロジックの不備・エラーハンドリング…等々)

ざざざっと見ただけでも、以下のようなコメントがありました。例として簡略化して箇条書きにしてみます。

> ・比較演算子は、厳密にする('==' → '===')
> ・正規表現が、何を許容したいのかをコメントに書いて欲しい
> ・$tmp(変数)は形式チェックをしてから使用しましょう
> ・この関数の第二引数は保証されていないので、明示的に値を渡してください

などなど、PHPのソースを読みなれていない身としてはいろいろと勉強になり、自分が見るときにも意識するきっかけになりました！

### 2.参考サイトを見て自分のなりのチェックシートを作る
以下のような参考サイトを見つつ、自分なりの手順をメモしてチェックシート代わりに使用していました。以下が参考にしたサイトです。

#### 参考サイト
- [コードレビューをもっとうまくやるための、「12のヒント」](https://qiita.com/kasia-some/items/a6406944bf09b0edbd5c)
- [コードレビューの極意。それは「自分のことは棚に上げる」こと！！](https://qiita.com/jnchito/items/0a0b46106681f41f2f0e)
- [自信が無いエンジニアこそコードレビューをするべき](https://qiita.com/kkoide1332/items/c6ee6f007617114c8f0b)
- [開発現場に学ぶ、円滑なコードレビューに必要な8つの手法 〜手段から準備、実施時期まで徹底解説〜](https://employment.en-japan.com/engineerhub/entry/2018/04/03/110000)

### 3."読みやすさ"とはなんなのかをもう一度意識する
レビューをするにあたって[『リーダブルコード』](https://www.amazon.co.jp/リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Boswell/dp/4873115655)を読み直しました。
久々に読み返しましたが、基本的な大事なことが書かれているので、年に一回、
半年に一回読み直そうと思ういい機会になったと思います。
※こちらの記事も"読みやすさ"についてわかりやすく書いていらっしゃいます。
 [リーダブルコードを3年ぶりに読み返してみて見つけた たった1つの大原則](https://qiita.com/HiromuMasuda0228/items/f80e4ac45b9160c33013)

---

## まとめ
今の現場では、開発者同士でソースコードを見てレビューする、という工程を設けてもらったことで、
レビュー以外の時でも「なぜそう思うのか」を論理付けできるようになったり、違う視点からの考え方を
取り入れられるようになったりと、エンジニアとしてもとても良いスキルアップになったと思います！

シンタックスやロジックのチェックなどはIDEや静的コード解析ツールでもできる部分があると思いますが、
必ずしもそのようなツールがあるわけではないので、ご紹介させていただきました。

みなさんも、エンジニアとして初めてレビューをしてね！と言われたときなど、参考になれば
と思います！

---

明日の投稿は[EichiSandenさん](https://qiita.com/EichiSanden)です！
Ada言語 4日目 配列

#はじめに
今回は、Integer型で1次元配列、2次元配列をやってみました。
for文をまだやっていないので初期化した配列の全てを表示させることはしませんでした。

#ソースと実行結果
```main.adb

with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;

procedure main is

	hairetu1 : array (0 .. 3) of Integer := (2, 3, 5, 7);
	hairetu2 : array (0 .. 1) of Integer;
	nizigenn_hairetu1 : array (0 .. 1, 0 .. 3) of Integer;

begin

	hairetu2(0) := 56;
	hairetu2(1) := 24;

	nizigenn_hairetu1(0, 0) := 1;
	nizigenn_hairetu1(0, 1) := 2;
	nizigenn_hairetu1(0, 2) := 3;
	nizigenn_hairetu1(0, 3) := 4;

	nizigenn_hairetu1(1, 0) := 5;
	nizigenn_hairetu1(1, 1) := 6;
	nizigenn_hairetu1(1, 2) := 7;
	nizigenn_hairetu1(1, 3) := 8;

	Ada.Integer_Text_IO.Put(hairetu1(0), 1);
	Ada.Integer_Text_IO.Put(hairetu1(3), 1);
	Ada.Integer_Text_IO.Put(hairetu2(0), 1);
	Ada.Integer_Text_IO.Put(hairetu2(1), 1);
	Ada.Integer_Text_IO.Put(nizigenn_hairetu1(0, 0), 1);
	Ada.Integer_Text_IO.Put(nizigenn_hairetu1(1, 3), 1);

end main;

```

` 実行結果 : 27562418 `

#今後の予定
ポインタが使えるらしいのでやるしかない。
その前に制御文をやらなければ。

#日記一覧へ
[Ada言語を習得する日記一覧](https://qiita.com/C_Assembly/items/50a0f9d8542679d92ea8)
【Swift】UILabel に UIImage を表示する方法

よくアイコンなどを、ラベルの前や後ろに付けたいという時があると思います。
そんな時に、役立つ NSAttributedString を使った、UILabel に UIImage を表示する方法を紹介しようと思います。

# はじめに
文字の後ろに画像を追加したい際、画像のように UILabel の横に UIImageView を置くことを考えると思います。
しかし、文字が1行で収まる場合は良いかもしれませんが、複数行になった場合は文字のすぐ後ろに画像をつけることができません。
<img width="568" alt="うまくいかない.png" src="https://qiita-image-store.s3.amazonaws.com/0/319662/a0fd7961-5a1a-0b24-10f3-d5fade741796.png">

# 開発環境
- Xcode 9.4
- Swift 4.1

# NSAttributedString を用いて画像を UILabel に表示
NSAttributedString は、フォントや文字色などを変更する時に使いますが、画像も表示することができます。

使い方は簡単

```swift:UIImageをNSAttributedStringにして返す
func converUseImage(image: UIImage) -> NSAttributedString {

        let attachment = NSTextAttachment()

        // 指定 image の追加
        attachment.image = image

        // image を1行分の高さにするための係数
        let k = image.size.height / oneLineHeight

        // y は自分で調整するしかないかもしれません
        attachment.bounds = CGRect(x: 0, y: -5, width: image.size.width/k, height: image.size.height/k)

        return NSAttributedString(attachment: attachment)
}
```

表示したいの画像サイズにより UILabel のレイアウトが崩れてしまうため、bounds の y の値や画像サイズの調整をしなければなりません。今回は、画像の高さがラベル1行分の高さで収まるように k という係数を求め、幅と高さを割っています。
サンプルのように画像の高さを一定になるように調整し y の値を定数にするか、画像サイズから y の値を計算する方法を考える必要があります。

実際の使い方としては、`NSMutableAttributedString()` に　`NSAttributedString()`を追加し、UILabel に代入します。

```swift:ラベルに追加
        let attributedText = NSMutableAttributedString()
        attributedText.append(NSAttributedString(string: "あなたのチームのアイコンはうさぎです。この文章の後ろに表示されている画像がチームのアイコンになります。"))
        // UIImage で画像を作成
        attributedText.append(setImgaeInLabel(image: UIImage(named: "rabbit")!))
        // attributedText に追加
        label.attributedText = attributedText
```


#### 使用例

|高さを1行に揃えた時|高さを大きくした時(yの値も変えています)|
|:---:|:---:|
|<img width="375" alt="sample1.png" src="https://qiita-image-store.s3.amazonaws.com/0/319662/dcfa9137-c2e2-34f3-9629-b0b2dfec0180.png">|<img width="375" alt="sample2.png" src="https://qiita-image-store.s3.amazonaws.com/0/319662/ebb49f5a-e477-b3f5-1f93-96fee9ade8e0.png">|

|間に画像|端に画像|
|:---:|:---:|
|<img width="375" alt="Simulator Screen Shot - iPhone 7 - 2018-12-07 at 16.26.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/319662/95087d9d-646b-1d05-9c47-cadbbe70c97c.png">|<img width="375" alt="sample3.png" src="https://qiita-image-store.s3.amazonaws.com/0/319662/0ef22317-e35f-62f7-c12b-22435a6f8dfa.png">|


# 参考
- [SwiftでNSAttributedStringを使って文字列を装飾する(UILabelに画像を表示する)](https://blog.ch3cooh.jp/entry/20150716/1437017097)
これからエンジニアインターンをはじめる人に伝えたいこと

# まえがき
未経験からエンジニアインターンを始めて1年が経とうとしているので、反省も兼ねて１年前の自分に向けて書くつもりでこれからエンジニアインターンをしようとしている未経験の人に向けたアドバイスをいくつかしたためうようと思います。

多分、以下のことを意識すると成長効率が格段に上がります。

# エンジニアインターンをはじめる前に
まず、エンジニアインターンをはじめる前にしておきたいこと。

## そもそもなんでエンジニアインターンをしたいのかを明確にしておく
正直、惰性でやっていても特に得るものは無いと思います。なんとなくパソコンに詳しくなって、ちょっと簡単なアプリ作れるようになった、くらいかと。
どうせやるなら、

<strong>「エンジニアインターンをすることで、〇〇できる力を身につける！」</storng> 

という確固たる目的意識があったほうが、成長速度は上がります。目標がないと人間は堕落するんや。

## 休学しておく
特に、未経験からはじめるなら休学は絶対したほうが良いです。片手間でやってて得られるものなんてたかが知れてるので。
<strong>特にプログラミングは学習初期が一番きつくて、ブレイクスルーが起きるまでに時間がかかります。</strong>
まとまった時間を確保しないといつまでも理解ができずしんどい時間が長引くので、やるならどかっと時間取れるようにするのが得策です。僕も社長にやるなら休学しなよ、といわれて休学したのですが、大正解だったと思ってます。


## Progateくらいはやっておく
今どき、インターネットでいくらでもプログラミングは学べます。
受験ではないですが、<strong>予習、実践、復習をしないとなかなか知識やスキルが定着しない</strong>ので、特に初期には基礎的な学習を繰り返しやっておくことをおすすめします。
プログラミングが難しいといわれるのは日常的に触れない新しい概念だらけだからであって、一度そのへんを理解しておくとかなり後で楽だと思います。

僕は基礎を理解しないまま実務に突入したので痛い目をみました。連想配列のループとは・・・？みたいな。

<strong>英単語を覚えないまま長文を読まされるのと同じ感じ</strong>といえば効率の悪さが伝わるかな・・・。とにかく基礎知識は大事！

# エンジニアインターンを始めてから
仕事が始まった後の、初期にハマりやすい部分に関して。

## とにかくググる
界隈では腐るほど言われていますが、<strong>エンジニア力≒ググり力です。</strong>
基礎を理解していていれば、ネットに転がっているドキュメントやQAで大抵の問題は解決します。
メンターに聞く前にまずは自分でググる癖をつけよう！
しばらく続けていると、なんとなく「ググり方のコツ」みたいな感覚がつかめてきて、大抵の問題は自力で乗り越えられるような自信がつきはじめます。

## とにかくエラー文を読む
なんかエラーが出てうごかないんだけど・・・みたいなときに、初心者のときほど<strong>原因がわからない！！メンターさん助けて！！原因はよくわからないんですけど！！</strong>みたいになりがち。

ですが、最近の言語は親切なので大抵はちゃんエラー文に原因が書いてあります。これを先程のググり力と組み合わせれば、初期にぶつかるような問題はたいてい解決します。

最初の頃はエラー文がどこに出るのかとか、ソースコードのどこの処理を指しているのかとかすらわからないと思いますが、そのへんを早めに覚えてしまえば後が楽です。


## たくさんのエンジニアと交流してみる
世の中には優秀なエンジニアがたくさんいるので、知識量やスキルが圧倒的な人と話してみるといろいろ学びが多いと思います。
あとは、同世代のエンジニアと交流するとモチベーションも上がっていい刺激になると思います。


# おわりに
１年間エンジニアインターンをしてみて思うのは、本当に奥が深いし果がない分野だなということ。
正直、理解しきれる気がしなくてエンジニアとして就職するのはためらうくらいです（笑）
ですが、論理的思考が身についたり、今では社会にとって欠かせない存在となったWeb、スマホアプリなどに関して理解できるだけでもこの分野の勉強をする価値はあると思います。

というわけで、これからエンジニアインターンをする人は一緒にがんばっていきましょうね〜。
Promiseを返す関数を作る

# 対象

この記事は以下のような人を対象にしています。

- Promiseについて調べても、楽にかけるだのasync/awaitだのといった記事ばかりで、結局、どういう風な関数を作ればよいのかわからない。
- 加えて、[JavaScript Promiseの本](http://azu.github.io/promises-book/)を読んで勉強する時間も気力も無い。

以上

# 概要

Promiseを返す関数を作って使います。

# 関数のサンプル

`arg1`と`arg2`とコールバック関数を引数に取る関数`cf`をPromiseでラップした関数`af`を以下に示します。

```JavaScript
function af(arg1, arg2) {
    return new Promise((resolve, reject) => {
        cf(arg1, arg2, resolve);
    });
}
```

[JavaScript Promiseの本](http://azu.github.io/promises-book/#how-to-write-promise)にXHRを使ったサンプルはあるので、socketioを使ったサンプルを以下に示します。

```JavaScript
/**
* socketio.emitをして、サーバーからresponseSocketNameの応答が来るのを待つ
* @param{String} socketName 送信するsocket名
* @param{Object} data 送信するデータ
* @param{String} responseSocketName 応答のsocket名
*/
function emit(socketName, data, responseSocketName) {
    return new Peomise((resolve, reject) => {
        // socketio.on(responseSocketName, (responseData) => {resolve(responseData);});
        // でもよいけど、結局することが変わらないので省略
        socketio.on(responseSocketName, resolve); 

        socketio.emit(socketName, data);
    });
}
```
# 使用するサンプル

こっちはいろんな人が解説しているので軽く。

```JavaScript
// 先のemit関数を呼び出します。

// 方法1
emit("requiest", {}, "response").then((responseData ) => {
    // 応答があったときの処理
}

// 方法2
const responseData = await emit("requiest", {}, "response");