OmniAICreator/Qiita-1.07M huggingface dataset:
iPhoneからlocalhostで開発中のサイトを確認する方法

# はじめに
本記事は Mac + iPhone という環境を想定しています。
Win + Android も基本的なところは共通しています。

# 確認事項
## PCとスマホが同じネットワーク化にいることを確認する
WiFiの場合、 **基本的には** 同じSSIDで接続していれば同じネットワークです。

## ファイアウォールの設定をOFFにする
`[システム環境設定]>[セキュリティとプライバシー]>[ファイアウォール]`
![スクリーンショット 2019-12-04 11.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209400/364f54a0-af54-fc1a-9557-ba43a6a0544f.png)

## localhostを立ち上げる
コマンドラインから開発中のディレクトリでhttpサーバーを立ち上げます。

Python2の場合

```zsh
$ python -m SimpleHTTPServer
```

python3の場合

```zsh
$ python3 -m http.server
```

実行例

```zsh
$ python3 -m http.server                                                                                                      
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
```
オプションでポート番号を指定しない場合は上のように8000番を使用します。
PCからの確認はブラウザで `localhost:8000` にアクセスするだけです。

参照： [開発用ローカルサーバを立ち上げる方法](https://qiita.com/higuma/items/b23ca9d96dac49999ab9)

## スマホからアクセスする
### 方法①：ngrokでホスティングする（こっちの方が簡単）

[brew](https://brew.sh/index_ja)でngrokをインストールします。

```sh
$ brew install ngrok
```

インストールできたら、上の手順でローカルホストを立ち上げます。
そこで使用しているポート番号を指定してngrokでのホスティングを開始します。

```sh
$ ngrok http 8000
```

こんな感じで立ち上がります。

```sh
ngrok by @inconshreveable                                                                             (Ctrl+C to quit)

Session Status                online
Session Expires               1 hour, 59 minutes
Update                        update available (version 2.3.38, Ctrl-U to update)
Version                       2.3.35
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://b885d499a91a.ngrok.io -> http://localhost:3000
Forwarding                    https://b885d499a91a.ngrok.io -> http://localhost:3000

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00
```

`https://b885d499a91a.ngrok.io` このように発行されたURLにアクセスするとページが開けます。
スマホの場合キャッシュのクリアが面倒なので、ブラウザをプライベートモードにすることを強くお勧めします。

### 方法②：ローカルネットワークのIPアドレスで接続する
#### MacのIPアドレスを表示する
`[システム環境設定]>[ネットワーク]>[詳細]>[TCP/IP]`
`IPv4アドレス: 192.168.11.43` がローカルネットワークにおけるこの端末のアドレスになります。
通常ローカルのIPv4アドレスは `192.168.XX.XX` のような形をしています。
このアドレスは固定ではないため、ネットワークに繋ぐたびにその時のアドレスを確認するようにしてください。

![スクリーンショット 2019-12-04 11.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209400/fcc740e2-2b3d-8cf3-faa1-cb920b1cf250.png)

または `ifconfig` で確認する場合は

```zsh
$ ifconfig en0 inet                                                                                                            
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	inet ⭐️192.168.11.43⭐️ netmask 0xffffff00 broadcast 192.168.11.255
```

#### iPhoneのブラウザからアクセス
`[ローカルIPアドレス] : [ポート番号]` で表示することができます。

<img width="375" alt="IMG_15B724277D94-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209400/17b86bbd-1016-91d7-e9d3-c96986203f86.jpeg">


スマホの場合キャッシュのクリアが面倒なので、ブラウザーのプライベートモードで確認すると捗ります。

## アクセスできない場合の確認事項
- httpサーバーを立ち上げるディレクトリは正しいですか？
- ファイアウォールはOFFになっていますか？
- PCとスマホは同じネットワーク下にいますか？
- MacのIPアドレスやポート番号は最新ですか？
MultipartResolverを設定してSpringでファイルアップロードを行えるようにする

# Springでファイルアップロードができるようになるまで
[Spring MVCでJava Config](https://qiita.com/HiroyaEnd/items/17175e947911d84c1b3b)の続編を少しだけ書いてみました。
前回Java Configで設定した内容に加えて、今回はSpringのファイルアップロード設定を行ってアップロードができるようにしていきます。


## 設定方法
設定クラスにMultipartResolverをBean登録していきます。
登録時にメモリサイズ、アップロードサイズの上限値を同時に設定することができます。
FWのマイグレーションとしてこの設定を行う場合は、元々の設定値を調べて設定することで同様の挙動を再現することができます。

```java
	private static final int MAX_UPLOAD_SIZE = 1024 * 1024; //1MB
	
	private static final int MAX_IN_MEMORY_SIZE = 1024 * 256; //256KB

	@Bean
	public MultipartResolver multipartResolver() {
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
		multipartResolver.setMaxUploadSize(MAX_UPLOAD_SIZE);
		multipartResolver.setMaxInMemorySize(MAX_IN_MEMORY_SIZE);
		return multipartResolver;
	}
```

## 使用方法
ファイルアップロード対象のプロパティは型をMultipartFileとして定義します。

```java
    /**
     * アップロードするファイル
     */
    private MultipartFile file = null;
```

あとは上記のプロパティにgetter,setterを付与し、Viewと連携してファイルをアップロードすることで実際にファイル操作することが可能となります。


手順としては上記のように簡単に設定して行えるようにできます。
はじめて設定した時は時間がかかった記憶があるので、誰かのお役に立てたら嬉しく思います！
スタートアップ起業家が上場企業でエンジニアをやってみて

この記事はうるる  [Advent Calendar 2019](https://adventar.org/calendars/4548)4日目の記事です。

#はじめに

どうもこんにちは！
私はスタートアップの会社を経営しています。投資家から調達した資金がなくなって、上場企業のうるるで週４日開発をし、週一日と土日で自社の会社もやっています。

この記事では上場企業うるるの開発スタイルとスタートアップの開発文化（特にシード、アーリー）を照らし合わせて紹介していきます。 技術的なことは一切ないので、読み物としてお楽しみください♡


#優しいコードレビュー

上場企業ではコードレビューをしっかりしていただけます。懇切丁寧にコメントが入り、分からないところは聞けばすぐにおしえていただけます。何ならモブプロもやってもらえます。

スタートアップではそうではありません。
そもそもエンジニアが少ないため、レビューする人はいません（笑）
リリースまで時間がないので、実装を急かされます。結果、エンジニアが書いたコードがそのまま本番にあがります。

一度、弊社でもエンジニアが増えてコードレビューをしたところ、実装の方法でケンカになりました笑　生きるか死ぬかのシード期では、リリース直後は全員睡眠不足。寝てなさすぎてみんな殺伐としております。

優しいコードレビューは愛だと思います！

#毎日、ヤクルト飲んでる

うるるでは、社員の福利厚生でヤクルト製品が一日一本無料で飲めます。業務委託の私も無料で飲めます。なんて健康的なんでしょうか！！！

スタートアップではそうではありません。
基本、エナジードリンク飲んでます。やることが膨大にあって、リソースも足りないため睡眠時間を削って仕事します。その結果、カフェインを大量に摂取!。コーヒーも一日中飲んでます。
リリースの直前には、投資家からレッドブルの差し入れもあります。死ぬ気で働けってことでしょうね（笑）
それくらい、エナジードリンク大好きです♡


# 責任が明確。やることがきまっている

うるるでは、私はサーバーサイドエンジニアです。たまにフロントエンドのVue.jsやるけど、本番化の作業はしなくていいし、雑務も一切しなくてよいです。分業制ってステキですね。

スタートアップはそうではありません。
エンジニアはサーバーサイドもフロントエンドも、サーバー構築からリリースまで全部やります。加えて、マーケティングもやるし、何なら自分でFreeに経費入力して税理士と決算のも話しています。

# 基本、毎日平和！
上場企業は、毎日平和です。朝来てコード書いて、一日が終了します。トラブルなんて皆無。チームはみんな仲良しです。飲み会もしょっちゅうあります。

スタートアップはそうではありません。何かしらトラブルが起こります。
人が足りない、お金がない、サービスが伸びてない、など、トラブルは一つどころか複数一気に襲ってきます。人とお金のトラブルはかなり精神的にも参ります。創業期は特にそうで、寝ているとき以外戦場です。

マジで天国と地獄くらいの差があります。


# 勉強する機会いっぱいある
うるるでは、毎週エンジニアの勉強会があります。それ以外の勉強会も定期的に開催されています。技術書は気に入ったものは会社が買ってくれますし、たくさんの技術書が読み放題です。この環境にいたら間違いなくエンジニアとして成長します。

スタートアップはそうではありません。最新の技術より、確実に動くもの、時には枯れた技術も使います。
とにかく早く作れるもの、動くものを優先するから、学習コストがかからないものを選択しがちです。社外の勉強会に参加する暇なんて、全然ないくらい働いています。


# 最後にスタートアップの良いところも書いておこう

スタートアップがクソみたいに書いちゃったので、エンジニア視点でスタートアップのよいところも伝えておきます。

- ゼロイチが得意になる
    - アイデアからサービス化するのが得意になります
    - プロトタイプならサクッと作れるようになります
- 幅広い知識が身につきます
    - サーバーサイド、フロントエンド、サーバーの設定まで広く薄く理解できます
- 設計得意になります
    - DB設計やクラス設計など、いかにスピーディーに実装するかが得意になります
- やりきり力付きます
    - 何が何でもリリースさせる力が身につきます
- マネジメント視点が身につきます
    - ビジネスサイドの視点やプロダクトマネージャーの視点が身につきます
    - コード以外の問題（人材や組織）などの問題に対応できます
    - ストレス耐性、めっちゃつきます


コードが汚かろうが、死にそうになりそうが、確実にリリースまで持っていく。そういう野武士みたいなエンジニアになれます。
（そうしないと、資金がつきて会社が死にます笑）

#違いのまとめ
0から1を作るのがスタートアップ。新しいものを一気に創るからこそ、カオスでストレスフルで属人的な組織です。反面、1を10や100にするのが上場企業。既に出来上がったものをリスクなく、安定的に、組織だって運用する組織です。

どちらが良い、悪いということでもなく、自分が好むライフスタイルで働けるのは良いことですね！
うるるがすごいなーと思うのは、私のような偏った人も働く機会をくれて、事業にも理解をしていただいているところです。おかげさまで昼休みは自分の事業をやらせてもらってますし、週の中で仕事の調整もさせてもらっています。　ストレスも減ったからか自社の事業もうまく進んできました。（なので弊社の投資家、関係者のみなさま、ご安心下さいw）


エンジニアのみなさま、うるる、ホワイト企業で超オススメです。毎日ヤクルト無料です！
採用ページはこちら https://www.uluru.biz/recruit




# あとがき
Advent Calendar 4日目でした。
明日5日目は KANEさんによる記事を乞うご期待！
https://adventar.org/calendars/4548
.m3u8 ファイルから .mp4 ファイルを生成する方法

動画を保存して、mp4に変換する機会があったので軽いメモです。
※Win環境です
※ほぼ自分用メモなので、かなりザックリしています

## 動画を保存する
動画を保存するために、Chrome拡張機能をインストールします。
今回は「Douga Getter」を使用させて頂きました。
https://www.douga-getter.com/

「Douga Getter」を使うと、.m3u8ファイルと.tsとして、動画を保存する事ができます。

## m3u8をmp4に変換する
次に「ffmpeg」を使って .m3u8 ファイルから .mp4 ファイルを生成・保存します。
まずは「ffmpeg」をダウンロードします。
https://ffmpeg.zeranoe.com/builds/

ダウンロードができたら、分かりやすくするため、ffmpeg.exeを先程保存した.m3u8ファイルを保存しているフォルダにペーストします。
そしたら以下のコマンドをパワーシェルで実行して、mp4ファイルを作成します。

`.\ffmpeg -allowed_extensions ALL -i 【m3u8ファイル名】.m3u8 -movflags faststart -c copy 【mp4ファイル名】.mp4`

これを実行すると、mp4ファイルが作成されます。
sweet alert  


laravelの開発でsweet alertを使ったので忘れないように記述。

```
| updateProfile(e){ 
|
|                 let file = e.target.files[0]; 
|                 let reader = new FileReader();|
|                 let limit = 1024 * 1024 * 2; 
|                 if(file['size'] > limit){ 
|                     swal({ 
|                         type: 'error', 
|                         title: 'Oops...', 
|                         text: 'You are uploading a large file', 
|                     }) 
|                     return false; |
|                 } 
|                 reader.onloadend = (file) => { 
|                     this.form.photo = reader.result; |
|                 } |
|                 reader.readAsDataURL(file); |
|             } |
|         } |
```
データの更新をするときに画像ファイルが大きすぎた時にアラートを発火する。

sweet alertの具体例は下のcodepen

<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="js,result" data-user="ningen11108yu" data-slug-hash="yLyyzEw" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="sweetalert demo">
  <span>See the Pen <a href="https://codepen.io/ningen11108yu/pen/yLyyzEw">
  sweetalert demo</a> by clown1108yu (<a href="https://codepen.io/ningen11108yu">@ningen11108yu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

他にも
http://d.bsnws.net/p/sweetalert%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%87%E3%83%A2/
jqGridで表示ページを設定する

# jqGridで初期表示ページを設定する方法

##指定方法

jqGridで表示ページ指定を行うには以下で指定する
　$("#grid").trigger("reloadGrid",[{page:2}]);

##サンプル

HTML

```HTML
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
　・・・
</head>
<body>
　<form>
　　<div class="grid-div">
    　<table id="grid"></table>
      <div id="pager"></div>
    </div>
　</form>
</body>
</html>
```

Javascript

```Javascript
   //jqgrid生成(listはデータ)
   $("#grid").jqGrid({
        data : list,
        datatype : "local",
        colNames : ['Column1', Column2],
        colModel : [
            {name:'column1', index:'column1', width:80, align:'left'},
            {name:'column2', index:'column2', width:80, align:'right'},
        ],
        rowNum : 10,
        rowList : [10, 30, 50],
        pager : 'pager',
        multiselect: true,
        height:500
    });
    //初期表示時に2ページ目を表示する
    $("#grid").trigger("reloadGrid",[{page:2}]);
```
Rを使って綺麗なグラフを書いてみよう

#はじめに
先日Rを使って綺麗なグラフを描けることを知ったのでシェアします。

使ったデータはこちら↓
https://github.com/rfordatascience/tidytuesday
色んなデータがあるので、データで遊んでみたい人はぜひ使ってみてください！

#今回作ったもの
今回は2019-01-08「IMDbが発表した1990年〜2018年のテレビ番組の評価」を使用しました。
どれ程評価があったのかを点の大きさで示し、テレビ番組のシリーズで点を繋げてみました。
これだとあまりggplot2のすごさが伝わっていない気がします…。
![30A8A420-2EF4-4976-89C6-BE641A7FB525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501835/5cb43bc1-4f28-335a-8098-45cda60bb836.png)

tidytuesdayのデータを使って他の皆さんが作ったものの方が凄いのでこちらを見てみてください↓
https://mobile.twitter.com/hashtag/tidytuesday%21?lang=en

#やり方
##①tidyverseがライブラリに存在するか確認
tidyverseがなければエラーが出るので、install.packages("tidyverse")でインストールします。

```R:
library(tidyverse)
```
これでggplot2が使えるようになります。

##②データをRStudioに読み込む
githubから自分のパソコンにクローンしてからデータを読み込む。

```R:
setwd("~/research/tidytuesday/data/2019/2019-01-08")
library(readr)
IMDb_Economist_tv_ratings <- read_csv("IMDb_Economist_tv_ratings.csv")
View(IMDb_Economist_tv_ratings)
```

##③グラフを作る
今回作ったグラフは下記のコマンドで作成できます。

```R:
ggplot(IMDb_Economist_tv_ratings %>% filter(av_rating>6.5), aes(date, av_rating, col=log(share))) + geom_point(aes(size=share)) + geom_path(aes(group=title, alpha=3)) + scale_color_viridis_c()
```

#感想
ggplot2にはまだまだ面白そうな機能があるので遊んでみたいです。

#参考Webサイト
ggplot2の使い方
https://rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf
Ubuntu 環境構築 マルチブートトラブル編

[Ubuntuディープラーニング環境構築（インストール準備)](https://qiita.com/aiiika/items/4ae527e915015b334fd9)
[Ubuntuディープラーニング環境構築（インストール編)](https://qiita.com/aiiika/items/cd4d35e89652b49fbffc)
[Ubuntuディープラーニング環境構築（マルチブート)](https://qiita.com/aiiika/items/7f623840b31767ff9f48)
###Windows update後、起動できなくなった
他、UEFI起動のマシンではインストールしたUbuntuが起動できなくなるトラブルが少なくありません。
Ubuntu専用マシンならば、そんなことも無いと思いますが私もOfficeやその他のアプリ使用、講習時環境を受講者と合わせる等の理由でWindowsとUbuntuはDualBootできるマシンの方が便利です。
マルチブート編でご紹介したrEFIndのUSB版を極小USBで制作しておくと、常時rEFIndから起動できます。
注意点としては
- SecureBootをDisableとしておかないと起動できない(ASUSは不可でした）
- MBRのマシンではrEFIndは動きません。

http://www.rodsbooks.com/refind/getting.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496711/13b36af5-dc24-12c9-3f6d-69c9f228f13b.png)
この下の方にA USB flash drive image fileへのリンクがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496711/ad9829b9-1079-12e7-2784-9920c4a96341.png)
このファイルをLinuxのddコマンド等でUSBに焼きます。
PCに挿入してマシンをこのUSBから起動出来るようにセットすればOKです。
apple好きやiOSエンジニアが活用したいよく見る情報リソース

Androidも大切だが、iOSアプリなどは特にレギュレーションが変わったり仕様の変更が激しい。
そんな中で随時情報を追いかけるのは大切なことなので個人的に定期的に参考にしている情報リソースのメモです。
そしてapple好き・ガジェット好きとしての趣味も含まれる。そんな方にオススメ。

## [iPhone Mania](https://iphone-mania.jp/)
その名の通りiPhoneマニア
apple関連のニュースや、レギュレーションの変更、リーク情報、iPhoneの便利機能など満載

## [カミアプ](https://www.appps.jp/)
iPhoneの小技やニュースなど

## [gori.me](https://gori.me/)
iPhone/iPad/Macbookの使い方や最新ニュースなど

## [Akiba PC Watch](https://akiba-pc.watch.impress.co.jp/)
秋葉原のショップでapple商品のオトクな入荷情報など
ガジェット好きにはおすすめ

## [ITmedia News](https://www.itmedia.co.jp/news/)
appleに関わらずIT関連の時事ニュース満載

## [GIZMODE](https://www.gizmodo.jp/)
ITmedia同様、appleに関わらずガジェットからITニュースまで幅広く

## [Appleが大好きなんだよ](https://www.youtube.com/channel/UCCD76tKlE45u1YTX0cVh1OQ)
youtubeでは個人的に一番好きかもしれない
PHPやRubyとNode.jsを同一コンテナ内に手っ取り早く管理したい人のためのマルチステージビルド

この記事は Docker Advent Calendar 2019 3日目の記事です。
抜けていたので急遽書きます。

# 背景
PHPやRuby、Node.jsを同一コンテナ内で管理したいときありますよね。
Laravel + VueやRails + React等。

そんなときDockerfileで個別にNode.jsをインストールしている記事を時々見かけます。
そんなあなたにマルチステージビルドがおすすめです！

## DockerfileでPHPコンテナとNode.jsコンテナをマルチステージビルドで構築する例

```dockerfile
FROM node:12.13.0-alpine as node

FROM php:7.3-fpm-alpine

## PDOなどインストールは省略

WORKDIR /var/www/html

# マルチステージビルドでphp-fpmコンテナにnodeとnpmを追加する
COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
RUN ln -s /usr/local/bin/node /usr/local/bin/nodejs \
    && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
    && ln -s /usr/local/lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx
```

Node.jsコンテナからnodeとnpmのバイナリをコピーし、シンボリックリンクを貼るだけ！
簡単でお手軽で早いです！

## 参考

[Nuxt.js2.10とLaravel(6.0)を同一ディレクトリで動かすnuxt-laravelをDockerで環境構築](https://qiita.com/ProjectEuropa/items/6f8c8a70107334bc8605)


明日は[@mei_9961](https://qiita.com/mei_9961/items/ef06913125ecbe537b00)さんの記事です。
Notionのページにアイコンを設定する

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2019](https://qiita.com/advent-calendar/2019/notion) 4日目のエントリです。
3日目は[Notionでプロフィール画像を設定する](https://qiita.com/pictiny/items/2b11d755a1613413edd8)でした。

# ページにアイコンを設定する

Notionはページごとにアイコンを設定できます。
[ページを作成](https://www.notion.so/Create-a-new-page-6c3fe9aad94749099ea4bdfc072e5f97)したとき、タイトルの上部に **Add Icon** というボタンがあります。

<img width="534" alt="Screen Shot 2019-12-04 at 1.23.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/afd1c674-b64e-2e41-a2c5-96679696f492.png">

このボタンを押すと、ランダムな絵文字がアイコンとして設定されます。
アイコンが設定されると、サイドバーや上部でタイトルの横に表示されます。

<img width="620" alt="Screen Shot 2019-12-04 at 1.27.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/29923319-fa24-581e-9295-d3e028b8c798.png">

ランダムで選ばれた絵文字が気に入らなかった場合は、アイコンをもう一度押すと選択することができます。

<img width="508" alt="Screen Shot 2019-12-04 at 1.27.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/add62433-eeac-8b26-0f5e-08c44c23b31a.png">

# まとめ

ページが増えてくると識別が難しくなるので、絵文字を設定していくとよいでしょう！
ちなみに、これらの絵文字はUnicodeなので、表示するOSやフォントによって見た目が変わる点にはご注意ください。
クラウドネイティブ時代のApache Camel

こんにちは、レッドハットの駒澤です。
今年のRed Hat Forumでは、Apache Camelの魅力について紹介しました。
Apache Camel はオープンソースのインテグレーションフレームワークです。2007年に産まれて10年以上、IT環境の変化とともに進化してきました。
クラウドネイティブなアプリケーションが増えてくると、連携の組み合わせもより複雑になっていきます。そのような連携をシンプルに開発する仕組みとして、EIPを実装しています。今回は、最新のサーバーレス技術である、Camel Kもデモを交えて紹介しました。

セッション資料：http://redhat.lookbookhq.com/rhft2019-matome/65-25?lx=ChT-oZ

今回私がテーマにしたかったのが、「企業システムにおけるインテグレーションのあり方」です。
長年蓄積されたIT資産は、もはや全体を把握することも難しいくらい複雑になっていますが、少し大きな視点でシステムを見つめ直すと解決策が見えてくるのではないかと思います。
そこで私は、「企業システムをシルクロードのような経済圏として見てみませんか？」という大胆な問いかけをしてみました。

<img width="865" alt="silkroad.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207945/4511f219-7e4d-d571-ce5b-dd6ee906049a.png">


デジタル化が進んだ現代では、ものづくりの業界から「デジタルツイン」という言葉が生まれ、現実世界と仮想世界の融合が進んできました。
その考え方は、組織の活動にも浸透してきており、「組織のデジタルツイン」が次に目指すべきシステム像になると考えています。
それが進むと、組織を変えようと思ったら同時にシステムも変え、またシステムを変えれば組織も柔軟に変えることができる、コンウェイの法則、逆コンウェイの法則が成り立つと思うんですね。これまではシステムがガチガチで組織と一体化していなかったし、ERPのようにむしろシステムに組織を合わせようという、本末転倒な現象も起こっていました。

<img width="866" alt="digitaltwin.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207945/c18f8912-8669-e5f0-0837-75fd6a336562.png">

究極は、まるで業務で人間がコミュニケーションをとるように、システムもコミュニケーションをとれれば良いと思うのです。
コミュニケーションには、同期的なコミュニケーション （対面や電話で１対１に会話する）と、非同期的なコミュニケーション（メールで複数に送ったり、チームでまとめて会議したい場合など）があるので、システムも自然と2つのコミュニケーション方法がとられるはずです。
そのコミュニケーション手段がまさにインテグレーションで解決すべき問題領域です。

Apache Camelとは？という解説をこのセッションで行いましたが、今回のブログでは技術的な説明は省略します。
ポイントはまさに人間のコミュニケーションに必要な、文法、マナー、言葉づかいが整理されており、システムのコミュニケーションを取りやすくする仕組みだということです。

<img width="863" alt="camel.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207945/f7146077-6322-b4dd-1730-63e711bc1b17.png">

ドメインに分けられたシステム群は独自の言語と文化を持つ国家のような動きをしていくことで、自律的に進化を遂げていきます。国家間のコミュニケーションは自然と独自性を吸収した標準化が必要となり、そこでApache Camelは活躍します。
またシステムのインテグレーション機能はデータの永続性を求めない（各サブシステムが永続性を担保する）ので、サーバーレスアーキテクチャーにも向いています。
そこでApache Camel のサーバーレス版である、Camel Kが今後大きく期待される技術となっています。

<img width="864" alt="microservice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207945/9410b7fa-fa89-209d-e8cd-d1c9ca839dac.png">
（引用：赤帽エンジニアブログ「マイクロサービスとメッセージングのなぜ（前編）」https://rheb.hatenablog.com/entry/microservices_messaging）

Apache Camelは、非常に将来性があるオープンソースソフトウェアであり、コミュニティも活発です。
JCUG (Japan Camel User Group) も毎月読書会をやっていますので、ぜひ皆さん参加してコミュニティを盛り上げていきましょう。
時系列データベースの比較

IoT(Internet of Things) システムでは、各種センサーから、秒以下の周期で取得された、大量の時系列データを取り扱います。このようなデータを保持するシステムとして、時系列データベースは求められています。そこで、代表的な時系列データベースの InfluxDB, TimescaleDB, Azure Cosmos DB, GridDB について、調査して比較しました。

# 調査項目
時系列データベースの調査項目は以下の通りです。

|調査項目 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|調査内容|
|-----|--------|
|対応プログラム言語|アプリケーションからデータベースを操作可能なプログラム言語|
|クエリ言語|データベースに対する問い合わせ言語。主にSQLの調査|
|データ圧縮|時系列データの圧縮機能の有無|
|データ自動集計|サマリなどデータを自動的に集計する機能の有無|
|期限解放機能|一定の期間を過ぎたデータを自動的に削除する機能の有無|
|時系列分析関数|サンプリング機能などの時系列データ特有の関数|
|インデックス|使用可能なインデックスの種類及び特徴|
|トランザクション|トランザクションの特性。ACID特性など。|
|ストアドプロシジャ|ストアドプロシージャ/ファンクションの有無、記述言語|
|トリガー|データベーストリガーの有無|
|dockerコンテナ|dockerコンテナイメージが提供されているかどうか|
|性能拡張|スケールアウトを中心にどのように性能拡張するのかを調査。主にシャーディング機能の調査。|
|高可用性|障害発生時に継続動作するためのメカニズムについて調査。主にレプリケーション機能の調査。|
|運用|運用時に必要なバックアップや監視ツールについて調査|
|通信暗号化|DBサーバとクライアント間の通信暗号化機能の有無|
|DB格納領域の暗号化|DBファイルなどの格納領域の暗号化機能の有無|
|認証機能|ユーザーを識別するような認証機能の有無|
|権限管理|DBオブジェクトに対する権限付与する機能の有無|
|DB監査|操作の履歴である監査証跡（ログ）機能の有無|

# 調査結果比較

以下は、調査結果を比較した表です。

|調査項目 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|InfluxDB<br>(OSS)|InfluxDB<br>(製品版)|Timescale<br>DB(OSS)|Timescale<br>DB(製品版)|CosmosDB|GridDB<br>(OSS)|GridDB<br>(製品版)|
|-----|:------:|:------:|:------:|:------:|:------:|:------:|:------:|
|費用|〇|Ｘ|〇|Ｘ|Ｘ|〇|Ｘ|
|対応プログラム言語|〇|〇|〇|〇|△|〇|〇|
|クエリ言語|△|△|〇|〇|〇|〇|〇|
|データ圧縮|〇|〇|〇|〇|Ｘ|〇|〇|
|データ自動集計|〇|〇|〇|〇|△|Ｘ|Ｘ|
|期限解放機能|〇|〇|△|〇|〇|〇|〇|
|時系列分析関数|◎|◎|〇|〇|△|〇|〇|
|インデックス|〇|〇|〇|〇|〇|〇|〇|
|トランザクション|Ｘ|Ｘ|〇|〇|〇|△|△|
|ストアドプロシジャ|Ｘ|Ｘ|◎|◎|△|Ｘ|Ｘ|
|トリガー|Ｘ|Ｘ|〇|〇|△|〇|〇|〇|〇|
|dockerコンテナ|〇|Ｘ|〇|Ｘ|△|〇|△|
|性能拡張|Ｘ|〇|△|〇|〇|◎|◎|
|高可用性|Ｘ|〇|〇|〇|◎|◎|◎|
|運用|△|△|〇|〇|◎|Ｘ|〇|
|通信暗号化|〇|〇|〇|〇|〇|Ｘ|〇|
|DB格納領域の暗号化|Ｘ|Ｘ|〇|〇|〇|Ｘ|Ｘ|
|認証機能|△|△|〇|〇|〇|△|〇|
|権限管理|△|△|〇|〇|〇|△|△*1|
|DB監査|Ｘ|Ｘ|〇|〇|〇|Ｘ|Ｘ|
*1 : 2021年度下期に強化予定

詳細の調査結果は以下に掲載しています。
- [InfluxDBの調査](https://qiita.com/kanegoon/items/d5ae5f1ec8810d5092a4)
- [TimescaleDBの調査](https://qiita.com/kanegoon/items/cfba6d5ef554210da7c1)
- [Azure Cosmos DBの調査](https://qiita.com/kanegoon/items/63402b017ef0c578b7d8)
- [GridDBの調査](https://qiita.com/kanegoon/items/f7a664d5754719b44e67)

# まとめ
時系列データに特化した機能をフル活用したい場合、InfluxDB か GridDB、時系列機能とそれ以外の機能(RDBMS)をバランス良く使いたい場合、TimescaleDB、マネージドサービスを求める場合、Azure Cosmos DB という選択肢が考えられます。ただし、Azure Cosmos DB が時系列データを上手く扱えるのかについては疑問があります。
また、無償でレプリケーションやシャーディングなどの機能を求める場合、TimescaleDB か GridDB を選択することになります。
日本国内でのサポートを重視するのであれば、製品版の GridDB しかありません。

掲載内容は、(株)東芝 デジタルイノベーションテクノロジーセンター及びソフトウェア技術センターの見解です。コメント等は広くご意見を頂ければ幸いです。

また、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。
文系大学生が０から１年機械学習をやってみて

今回は文系大学生が０から１年機械学習をやってみたことについて書いていきます。


##今までの経歴
文系大学の商学部に通っていて、去年の12月に機械学習の勉強をはじめました。
また、3年を終えた時点で今年の４月からですが１年休学をしています。

##１年機械学習をやってみた感想
感想としては色々ありますが、
・コードをただ書く以外のビジネスの知見が多く求められる
・将来機械学習をできるからと言って安泰ではない
という２つがとても大きかったです。

###コードをただ書く以外のビジネスの知見が多く求められる
機械学習というのはあくまで予測を行うというところがゴールであるので、「どのような予測を行うか」「何を用いて予測するか」の策定にとても時間がかかります。これらを決めるためには、その分野のドメイン知識が必要になることも多いです（例えば広告を出すときにはどの変数が重要など）。
また、実際に予測ができるかどうかをやってみないと分からないことも多々あり、会社の利益を考慮ながらやるやらないを決めていくということも重要です。これらを考慮するとアプリ開発などの他のエンジニア領域以上にビジネスの知見が必要になるんだなということをとても大きく感じています。

###将来機械学習をできるからと言って安泰ではない
自分は機械学習を始めるときに機械学習ができればある程度は将来安泰だろうという考えを持っていました。しかし、実際にやってみると
####・技術革新（特にAutoMLによるモデル作成の自動化）による今の技術の陳腐化
→特にただモデルを作るだけの作業は減っていく可能性大
####・機械学習のためのデータ整備のコストの高さ
####・高い精度を出すことの難しさ（特に画像予測系）
という点を考慮すると、機械学習エンジニアの需要が世間で言われているほどは大きく伸びない可能性も十分にあるのではないかなということを痛感しています。
ここからは動機や一年やってみた感想について書いていきます。

##経歴における意思決定ポイントと、その時何を考えたか？
実際に自分が機械学習をやりたいと考えた理由は主に４つあります。
###1.実際に新しいことをやるのが好きだったから
なんかAIとか機械学習とかもてはやされているし、これからのものの先端行くのがかっこよくない？っていう感じです笑

###2.実際にこれからの需要がどんどん大きくなっていくと考えたから
世間ではこれからどんどん機械学習などの普及が進んでいくと考えられています。その中で機械学習エンジニアという職種もどんどん大きくなっていくだろうなというように考えています。

###3.自分の適性に合っていると判断したから
自分は勉強は苦ではなく行うことができます、また、勉強が苦ではなく需要が大きくなるという点で言うとエンジニアも選択肢にありますが、実際に英語や数学などの今まで自分が培ってきたものを活かせるのが機械学習だったためこちらを選びました。

###4.実際に色々な分野への応用が効くから
この当時の自分の考えとして、機械学習には画像系や自然言語系やデータ分析系など様々なものがあります。また、まだこの当時はビジネス系の職種と悩んでいました。そのため実際にビジネス系の職種に行ったとしても応用が効くだろうなという観点でも機械学習を学ぼうと考えました。

##今年一年の活動

この一年でどのような事に取り組んだのか？
機械学習をメインに行なっていました。
細かい内容については以下のリンクを読んでいただけたらなと思います。
https://qiita.com/HayatoYamaguchi/items/1c20595c5e6dac4530dc

他にも10月の半ばほどからアプリ開発にも取り組んでいて、railsを使った社内アプリの開発に携わっています。実際にこれを行った理由としては、機械学習１本で行くのが怖くなったというところが深層心理として大きかったのではないかなと自分は分析しています。そのため実際にここから分析の基盤などの勉強をしようかなと考えていました。しかし、データラーニングギルドの皆さんに質問を投げて色々返信をいただく中で「まずは一つの強い武器を持つほうが中途半端にいろいろできるよりもはるかに価値がある」というような結論に達したため、確かにこれから大きく機械学習エンジニアの需要が伸びない可能性もありますが、中途半端にやるよりも一旦機械学習というところをもっとガッツリやっていこうかなと考えています。

##なぜそのようなことに取り組んだのか？
機械学習を始めた以外のことを書いていきます
###kaggle、signateを始めた理由
実際に機械学習の勉強内容のアウトプットとしてとても良さそうだったということと、もし賞などを取ることができれば実際に自分のスキルの証明になると考えたからです。
###アプリ制作を行ってみた理由
理由は２つあります。一つ目に、実際にアプリ開発にも興味がありやってみたかったからです。２つ目に、正直その当時は自分が機械学習１本でやるのが怖かったのです。そのため、アプリに機械学習を組み込んだりするところまで自分でできるようになりたいという思いが当時はありました。実際にやってみてgitの使い方などの基本的なことを学べたので良かったかなと思っています。


##これから今後どのようにしていく予定か？
実際に12月からは新しい自社開発系の会社で働いていきます。まずはレコメンドエンジンを作る仕事に携わることになりそうです。キャリアでは機械学習という軸足を作ることに重点を置きながら勉強していきたいと思います。


##来年はどんな活動をする予定か？
実際にやってみたいところとして、エンジニア系のことは
1.機械学習の論文を書いて学会に提出
2.多少インフラも触る
をやりたいと考えています。上記のことをやりたいと考えている理由としては、単純にやってみたいからというところが大きいです。また、まだ就職先も決まってないのでまずは就活頑張るという方向になりそうです笑
機械学習という軸足が中途半端にならないように気をつけながら色々なことに挑戦していきたいと思います。
object detection の検出結果表示のクラス名を小さくする

# 環境
macOS mojave
python 3.6

# 困っていたこと
object detection では検出結果を画像に表示してくれるが、自前の画像で検出させた時に、クラス名が小さすぎて読めなかった。
tutorialの画像では見やすい大きさで表示されている。
https://github.com/tensorflow/models/tree/master/research/object_detection

# 解決策
以下のファイルに検出結果を描画するコードが書かれている。
object_detection/utils/visualization_utils.py

2019/12/04 時点では208行目でfontサイズが指定されている。

```python
  try:
    font = ImageFont.truetype('arial.ttf', 24)
  except IOError:
    font = ImageFont.load_default()
```
コードを以下のように変更。

```python
  try:
    font = ImageFont.truetype('/Library/Fonts/arial.ttf', 8)
  except IOError:
    font = ImageFont.load_default()
```
小さい文字サイズにすることができた。　
fontサイズだけでなく、fontの種類のパスも指定し直さないとうまく文字サイズが変わらなかった。
CentOS8で、PHP8のインストール。


こんにちは。
BitByteの伊井です。

今日は、CentOS8上で、PHP8をソースからビルドして
インストールする方法をご紹介します。

まず、CentOS8環境を、Vagrantでも、普通にクラウドでも良いので、
用意します。

そして、おもむろに以下のコマンドを実行していきます。

dnf install update
dnf install git sqlite
dnf groupinstall "Development Tools"

groupinstall〜〜で、PHPビルドに必要なライブラリを、
まとめてCentOS上にインストールしてくれます。


次に、PHP8のソースを取ってきましょう。

cd ~
git clone https://github.com/php/php-src.git
cd php-src

その後、以下のコマンドを実行します。

./buildconf

そして、configureコマンドを実行します。

./configure --prefix=/opt/php/php8 --enable-opcache --with-zlib 
--enable-zip --enable-json --enable-sockets --without-pear

この際に、ライブラリが足りなかったりすると、そこで止まって、
失敗してしまいます。
手順で必要なライブラリのインストールコマンドは冒頭で記載しましたが、
sqliteなどでエラーが出る可能性があります。何とか成功させてください。

configureコマンドに成功すると、以下のような表示がされ、正常終了します。
+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE.  By continuing this installation |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.


次に、CentOS環境で有効なCPUのコア数を表示します。
nproc

nprocで表示された数値を、-jオプションに付けて、makeコマンドを
実行します。ここでは、コア数1を想定します。
make -j1

ビルドが完了すると、以下のような表示がされて、正常終了します。
Build complete.
Don't forget to run 'make test'.


次に、
make test

を実行します。
もしかすると、errorコード1などとなり、英語で何かしらの問題が
あるかもしれませんなどと、表示されるかもしれませんが、あくまで
開発バージョンですので、無視して完了しましょう。


最後に、インストールを行います。
make install


バージョンを確認しましょう。
/opt/php/php8/bin/php -v

PHP 8.0.0-dev (cli) (built: Apr  5 2019 11:19:45) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
It starts to get interesting.

PHP8がインストールされています。

インストール時には、OPcacheは、無効となっています。
/opt/php/php8/libに、iniファイルを作成して、１行追加します。

cd /opt/php/php8/lib
touch php.ini

zend_extension=opcache.so


PHP8では、JITの効果が先立って、体験できます。
ここでは、割愛しますが、プログラムをネイティブコードに変換し、
それをキャッシュして再利用するというプログラム実行が高速化される機能となっています。

JITを有効にするには、以下のようなコマンドで実行する必要があります。
/opt/php/php8/bin/php -d opcache.enable_cli=1 （オプション）PHPファイルパス

このあたりは、ネットに転がっていると思いますので、時間があればJITに関しても、色々と
研究してみてください。

それでは、長文失礼しました。
俺のVScode

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/%E4%BF%BA%E3%81%AEVScode/)をご覧ください😀

# Settings Sync（VSCode設定）

## ダウンロード

`shift` + `option` + `D`
Download Public Gist を選んでGist IDを入力

## アップロード

`shift` + `option` + `U`


# ショートカットコマンド

## 1行削除

`Ctrl + Shift + K`

## 1つ前に開いていたウィンドウへ戻る

`control` + `tab`


## マークダウンのプレビュー表示

`command` + `K` → `V`

## 別のワークスペースを別ウィンドウで立ち上げ

1. `control` + `R`
2. 開きたいフォルダを選択しながら `control` + `Enter`

## ズーム

### 拡大

`command` + `shift` + `-`

### 縮小

`command` + `-`

### リセット

表示 → 外観 → ズームのリセット

## AとBを比較（diffを取る）

### ファイルとして保存されていない場合

1. Aをコピー
2. `⌘ + N` で新規ウィンドウ開いてペースト
3. Bをコピー
4. `⌘ + K → C` でクリップボードとアクティブファイルを比較
    - または `⇧ + ⌘ + P` で `compare` と入力して `File:Compare Active File with Clipboard` を選択

## settings.jsonを開く

`command` + `,`

ショートカットキー設定した。
[参考](https://qiita.com/Naturalclar/items/4682ff7c8deb8d8dfcff)
Ubuntu ディープラーニング　環境構築（windowsから空き領域をつくる）

[Ubuntuディープラーニング環境構築（インストール準備)](https://qiita.com/aiiika/items/4ae527e915015b334fd9)
[Ubuntuディープラーニング環境構築（インストール編)](https://qiita.com/aiiika/items/cd4d35e89652b49fbffc)
[Ubuntuディープラーニング環境構築（マルチブート)](https://qiita.com/aiiika/items/7f623840b31767ff9f48)
###Windowsから空き領域をもらおう
初めてUbuntuのインストールを試すのであれば、要らなくなったPCにインストールしてみるのが良いと思います。
XP時代のPCはたくさん余っていてると思いますが、最新のデイストリビュージョンに対してはさすがに力不足....
使っているPCを壊すわけには行かない....場合はWindows領域に空きを作って試しにインストール実行してみてください。
但し、Windowsの自動update後起動しなくなったとか、いろいろトラブルもありますので、あくまで自己責任でお願いします。
###WindowsのことはWindowsに処理してもらった方がトラブルが少ないです。
早速ですが、Windowsのスタートボタンを右クリックして「ディスクの管理」に行きましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496711/9c0fe5ec-3868-0d31-339b-35e654a94051.png)
私のPCはいろいろインストールしているので、すごいことになっていますが、Windowsだけを使っている人はUEFI領域、リカバリー領域等を除くとCディスクだけ（またはデータ用に+Dデイスク）になっていると思います。
容量を空ける（＝使っていない領域をUbuntu用に頂く！）ディスクを右クリックして、ボリュームの縮小を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496711/cb863f9b-d0f1-9908-b69c-15d7d585f01a.png)
メモリーが少ない場合は、swap領域も作成しますので、最低40GBほどは空き領域を作ってみてください。
お試しのあと、無駄になるならこの領域をフォーマットそてWindowsから使えるようにすることも出来ます。
マンガでわかる Prototype

![D222A724-481E-4E59-90DA-5D7B03F94C9C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/0cade450-0419-a1f1-6ded-68b6cdd27e42.png)
めもりーちゃんはちょうぜつソルジャー DNA を持っているので闇の組織のクローンソルジャーのプロトタイプに選ばれてしまったのです。がんばれオブジェクト指向警察!

闇の組織が最強の部隊を作るときはだいたい、ソルジャー適性を持つとわかっている DNA をコピーする (なぜか後天的に獲得した能力も付いてくる) のが王道ですね。遺伝子操作をインスタンスごとにいちいち `new` からやるのは、手間と時間がかかりすぎるし、個体差が出てしまうリスクもあります。すでにいい感じに出来上がってる塩基配列からクローンを量産するのが悪の科学の基本です。

同じ特性のオブジェクトをたくさん作って、使用後 (いったいどんな薬物を!?) の状態変化はやりっぱなし放置、どうせ使わなくなったら最後は使い捨てて GC されるんだから、というようなシチュエーションで、このパターンはすごく活躍できます。 (いけない、だんだん人道的に欝入ってきました)

現実には、大量投げっぱなしといえば、たとえばシューティングゲームの弾丸です。テスト用の事前条件環境も、いい感じに構築済みのものをプロトタイプとしたクローンにしておければ、前のテストのものを使い捨てて、副作用の影響なしに次のテストに臨めます。

あ、そういえば、活躍するクローンは必ずミュータブルで、互いに異なるインスタンスだという点、地味に効いてくるポイントです。

だってもしオブジェクトがイミュータブルなら、クローンなんてする必要なくて、定数としてオブジェクトを共有すればいいでしょ。まったく同じものでメモリを埋めるなんてもったいない。

でも、いくらメモリがもったいないからって、ミュータブルなオブジェクトを共有するのはもっとダメですね。ひとつのインスタンスが剣も盾も装備して、ちょんまげまで乗っちゃう。ちょんまげは失敗だから破棄したくてもできないし、そんな影分身がみんな同じ動きをするなんて...

ええと、何が言いたいかというと、共有してるから状態が変わっちゃダメな JavaScript の `prototype` は、デザインパターンでいう Prototype とはまったく関係がない、というかむしろ、真逆の特徴を持っているのでくれぐれも混同しないでくださいね、ということです。
jenkinsでAmazon ECR上のイメージを使う

## はじめに
こんにちは、SREエンジニアやっています。@hayaosatoです。
今回はjenkinsでのCI/CDの際に自作のDockerイメージを利用したい機会があると思います。
jenkinsの[Dockerプラグイン](https://wiki.jenkins.io/display/JENKINS/Docker+Plugin)を利用してDockerfileをビルドさせて実行することも出来るのですが、配布されたイメージを利用したイメージを使いたいなど、レジストリ上のイメージを利用したいケースがあると思います。
そのようなケースに対応できるよう、jenkinsでレジストリから取得したイメージを使う方法をECRに特化して書いていこうと思います。

## Dockerfileからのビルド
一応、独自のイメージを利用するケースとしてDockerfileからのビルド方法について書いていきます。
Jenkinsのdockerプラグインでは、 `agent`にdockerfileを指定することができ、デフォルトではアプリのルートディレクトリのDockerfileで作成されます。

```groovy
pipeline {
    agent { dockerfile true }
    stages {
        stage('Test') {
            steps {
                sh "echo 'hoge'"
            }
        }
    }
}
```


## コンテナレジストリ上のイメージ
さて、本題のコンテナレジストリ(ECR)上のイメージを利用する方法ですが、以下の通りになります。

```groovy
pipeline{
    agent any
    stages{
        stage('Hoge') {
            steps{
                script{
                    docker.withRegistry("https://${AWSアカウントID}.dkr.ecr.${ECRのリージョン}.amazonaws.com") {
                        sh("`aws ecr get-login --no-include-email --region ${リージョン}`")
                        docker.image('my-custom-image').inside {
                          sh("echo 'hoge'")
                        }
                    }
                }
            }
        }
    }
}
```
前提として、JenkinsでのコンテナレジストリはデフォルトでDockerHubを利用するようになっています。
Dockerプラグインの`withRegistry`というレジストリを指定して作業することのできる機能があるのですが、
これを利用することでDockerHub以外のレジストリを利用することができます。
今回はECRを利用するので`withRegistry`の引数にレジストリのURLを入れるのですが、ここではリポジトリのURIでは無いので注意してください。
また、docker loginも必要になってきますので、コマンドでloginを行います。
すると、DockerHubでのイメージの利用と同様に`docker.image`を利用することができるようになります。

## 最後に
今回はJenkinsでECR上のコンテナイメージを利用する方法を書きました。
Jenkinsおじさん、ぜひ試してみてください。

## 参考
- [Using Docker with Pipeline](https://jenkins.io/doc/book/pipeline/docker/)
PHP基礎 Part6

# 概要
PHPの独学で学んだことをアウトプットしていく

# 前回の内容
[PHP基礎 Part5]
[PHP基礎 Part5]:https://qiita.com/k__aizawa/items/c3f089f5474381e4bd37

## 関数
関数とは、ある処理を一纏めにして実行する為のもの
予め用意されている「組み込み関数」と、自分で定義する「ユーザー定義関数」に分けられる

### 組み込み関数
strlen関数は文字列の文字数を値として返す関数
関数の中に入れる値のことを__「引数」__と呼ぶ

```php:sample.php
<?php
  echo strlen("function");
  // 結果:8
?>

```
count関数は配列の要素数を数える関数である

```php:sample.php
<?php
  $fruits = array("りんご", "みかん", "マスカット");
  echo count($fruits);
  // 結果:3
?>

```
rand関数は引数の間の数値をランダムに出力する関数である

```php:sample.php
<?php
  echo rand(1, 10);
  // 結果:(1〜10の間の数値がランダムに出力される)
?>

```

### ユーザー定義関数
自分で関数を定義して、作成することも可能
関数を作成する際は、__「function 関数名()」__が基本的な書き方となる
ユーザー定義関数でも、引数を設定することが可能で、
関数内で使う引数のことを__「仮引数」__と呼ぶ

```php:sample.php
<?php
  function total($price, $tax){
    echo $price * tax;
}
  total(100, 1.1);
  // 結果:110
?>
```
### 戻り値(返り値)
関数を利用する際、関数の処理結果を返すことができる

```php:sample.php
<?php
  function sum($score1, $score2){
    return $score1 + $score2;
}
  $totalScore = sum(68, 43);
  echo $totalScore;
  // 結果:111
?>
```
DefinitelyTypedの@types/*のコミットログを追うためのメモ

npmからpublish時間をみてDefinitelyTypedのリポジトリpullしてフォルダと期間を指定しつつgit logする。

----

@types/node の 12.0.4 から　12.0.8 への変更を確認。

- $ `npm v @types/node time`

```
  .
  .
  .
  '12.0.4': '2019-05-30T18:06:44.939Z',
  '11.13.13': '2019-05-30T18:07:48.165Z',
  '10.14.8': '2019-05-30T18:08:09.634Z',
  '9.6.49': '2019-05-30T18:08:31.698Z',
  '8.10.49': '2019-05-30T18:08:45.630Z',
  '12.0.5': '2019-06-05T22:06:25.272Z',
  '12.0.6': '2019-06-06T18:27:35.303Z',
  '12.0.7': '2019-06-06T23:14:30.808Z',
  '12.0.8': '2019-06-11T19:12:14.629Z',
  '11.13.14': '2019-06-11T19:13:06.490Z',
  '10.14.9': '2019-06-11T19:13:22.578Z' }
```

- DefinitelyTypedをpullしてフォルダに移動
- $ `git log --after '2019-05-30T18:06:44.939Z' --before '2019-06-11T19:12:14.629Z' types/node`

```
commit d12324cc224261369eb89926989418806ee64bfd
Author: Marc-Antoine Ouimet <ouimetmarcantoine@gmail.com>
Date:   Tue Jun 11 15:09:08 2019 -0400

    [node] Allow setting encoding for Dirent readdir (#36092)
    
    * Allow setting encoding for Dirent readdir
    
    * Update promisified version of readdir

commit 022dbd5d9115992722c50043b930b2dbafa94b43
Author: FUJI Goro <gfuji@cpan.org>
Date:   Fri Jun 7 08:11:59 2019 +0900

    @types/node: add doc to Buffer#slice and Buffer#subarray (and fix the type of Buffer#subarray) (#35998)
    
    * add doc to Buffer#slice and Buffer#subarray
    
    * add tests for Buffer#subarray()

commit c474cdf5d7ed2ead9b6f0434e5c7eb5aa70a0439
Author: Michael Lumish <mlumish@google.com>
Date:   Thu Jun 6 11:25:00 2019 -0700

    Add type definition for Http2Stream#id property (#35982)

commit 4d8103200e39e7dab486fdee83da875b81c64866
Author: Ghostium <Ghostium@users.noreply.github.com>
Date:   Wed Jun 5 20:06:37 2019 +0200

    [node] Add TLSv1.3 (#35960)
```
Dockerコンテナ作成時にError response from daemonが発生する

## エラー内容

Dockerコンテナ作成時に下記エラーが発生し、作成できない

```
Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:297: copying bootstrap data to pipe caused \"write init-p: broken pipe\"": unknown.
```

## 環境
Ubuntu14.04
docker-ce 18.06.3

## 原因
Ubuntuカーネルのバージョンが低い(3x kernel)ため、
Docker（18.06.3）に対応できない

## 対応
１．UbuntuのOSバージョンアップ（稼働中はお勧めしない）
２．Dockerのダウングレード

→２で対応
指定したDockerバージョンは「18.06.1~ce~3-0~ubuntu」
手順は[こちら](https://qiita.com/RyoMa_0923/items/16f51f7fee02e82f9109)を参考
一致不一致と生産性

この記事は ウェブクルー Advent Calendar 2019の　4日目の記事です。
昨日は@piwiさんの「わたし定時で帰ります」でした。

# はじめに
私は、今年の4月から人事部に異動し、採用・教育などを担当している者です。
社歴は8年目で、7年間は当社のセールス担当としてフロントに立っておりました。
事業部にいた経験を活かして、4月からはどういう人を採用し、どうすればいち早く活躍して頂けるか。を考えて動いているところです。
まだまだ勉強不足な点や、道半ばなことも多いですが、課題に向き合いながら、何とか頑張っている所です。

# 人事部からの発信ということで
いつもとは少し毛色が違うかもしれませんのでご了承下さい。
今回は、私がキャリアコンサルタントという資格を取得した時に
**何となくわかっていたようなことを概念として理解し、自覚することの重要性**や
**内省の素晴らしさ**
を学び、体感したことから、生産性という所に少し発展をさせて書いていこうと思います。

#当社のタイムリーなトピックス
いきなりなのですが、実は当社
2019年11月「テレワーク先駆者百選」に選出されました！！
▼ニュースリリース
[令和元年度「テレワーク先駆者百選」](https://www.webcrew.co.jp/news/detail/20191112_02.html)
働き方改革として注目されているテレワーク、当社でも約2年前から取り組んでおりまして社員も積極的に活用し、様々な効果や実績も生まれ、この度選出頂いた次第でございます。
もちろん、課題はまだまだありますが、リモートワークにつきものなのが”生産性”がどうなのか。
という所もあると思うので、今回トピックスとして入れてみました。

### 当社のリモートワークの歴史
当社のリモートワークについて少しだけ。
リモートワークを導入し始めたのは約2年前。
ちょうど2017年のクリスマス・イブに、
@razgriz_rayさんが書いた記事↓↓が運用開始直後のことです。
[会社でリモートワークを導入してみた話](https://qiita.com/razgriz_ray/items/3e44c16c03a7714b19c2)
・コミュニケーションカルチャー
・制度と風土
このあたりは@razgriz_rayさんが書いてあることを、今も社員一人一人が継続的に守れているため、運用出来ている所が大きいかと思います。
リモートワークに関する社内アンケートでも、エンジニアからは大変好評で、余計な雑音や無駄話を挟む必要がなくなり、生産性が上がったという声が大多数です。
導入当初は週1回だった利用頻度が今年4月より、週2回まで、に増えました。

ちなみに、2019年4月～9月までのエンジニアの**リモートワーク取得経験者はシステムDIVを100とすると83％の取得率**でした。
担当案件や時期によっては、社内にいた方が良いこともありますので、83%の人全員が半年間毎週、週2回、取得しているわけではありません。
ただ、私の肌感覚で、83％の方々、少なくとも月に数回（4回くらい？）はリモートワークを利用して業務をしているかなぁ。という印象です。

社員の皆さま、皆でこの働き方を守り、育て、大いに活用しましょう。

## 働き方と生産性
さて、今回テレワーク百選に選ばれたことで、対外的にもテレワーク推奨企業となりました。
世間的にも柔軟な働き方が推奨され、会社に来ること≠働いているという時代ではないと私は思います。
それ故”生産性”については、様々な観点から議論され、一人一人が考えるべき事項だと思います。今回は人がどういう心理状態の時に生産性が上がるのかについてです。

#自己一致と不一致
来談者中心療法を提唱したカール・ロジャーズの自己理論なのですが、これがまさに私が
“何となくわかっていたけど概念として理解し、自覚して、とてもすっきり”したものでした。
自分が実際にしてきたorしている（経験）と、自分はどうありたいか（自己概念）が、
一致しない時、人は不適応を起こすと考えたものです。
![Screenshot_2019-12-03 PCA pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538726/15a0a1dc-0c09-9514-04a7-db4cdcd9f20b.png)

引用：http://sara-ch.com/PCA.pdf

自己一致とは、自分がどうありたいかと、経験していることが一致していること
不一致とは、自分がどうありたいかと、経験していることが不一致なこと

過去の私は、“自分がどうありたいか”がずっとわからなかったために苦しんでいたのだ、と気づいたことが大きかったのです。
この自己概念というのも、美化しすぎて歪曲することもあります。“こうありたい”と“こうあるべき”は違います。
“こうあるべき”で考えてる人がもしかしたら多いのではないかと、思うことも多々あります。
自分の欠点も受け止めつつ、こうありたいと描くのは実はなかなか難しいです。
円の輪郭を明確にすることは難しく、またその形は変化するものだと自覚する必用もあります。

###自己一致
自己一致の完全一致はほぼあり得ないです。これを認識することも大事です。
私はこの考え方を認識したことで、今している経験が、不一致のようでも、自己概念と重なる所は本当にないかな。と探す思考性が身に付きました。
そして、今まで経験したことを振り返ると、当時は不一致そのものだと思っていたことが、今では武器になっていたこともあります。
つまり、今は「何事も経験が出来るありがたさ」を素直に感じ、とても生きやすくなったと思います。
###自覚すること
一致の割合が多ければ精神状態は安定し、自らのありたい方向に向かって主体的に動く力が湧きます。
不一致の度合いが多いと精神状態は不安定で、緊張し、消極的・受動的な行動になります。
こんなこと、あえて言われなくても何となくわかっていたことかもしれません。ただ、私はこういう状態なのだと認識すること。
この認識する所から内省の第一歩が始まったと私は体感しました。
認識すると、行動が変わります。それこそが最大の内省による効果のようです。

###一致不一致と生産性
言わずもがなですが、主体的に動く時の生産性と、受動的に動く時の生産性は全く違います。
「目標を持つべき」「もっと成長しよう」そんな言葉の意味はわかるものの、
そう言われてもねぇ。どこに向かってどうすりゃいいのさ。それが出来たら苦労しないぜ。
と内心どこかで思っていました。

ただ、先にも述べたように、一致の度合いを増やせば自然と主体的に。上っ面の上昇志向ではなく、
何となくでも目指すべき所が見えてきた時、初めてその言葉の意味が理解出来たと思いました。

#まとめ
つらつらと書きましたが、こちら、頭ではわかっていても、自分の経験を振り返り、考え、全て“自分の場合”にして考え直さないとなかなかしっくりこないものです。

2019年も最後の月となり、どんな年だったかな。来年は何をしようかな。と考える人も多いと思います。是非、今年は誰かと今までを振り返り、今後のキャリアについて語り、自己一致の割合が増える人が一人でも増えたらいいなと思っております。
私で良ければお話聞きたいので、是非お声掛け下さい^^

#最後に
明日は @verdoyant さんです。よろしくお願いいたします！
ADX2ブロック再生のデータの作り方

# はじめに
ADX2のブロック再生を使って、インタラクティブミュージックをやる際のテクニック集（備忘録）です。

ADX2に限らず、インタラクティブミュージックで横の遷移をする場合のテクニックでもあるかも。

# アタック、リリースを調整する
DAWで波形を切って、
ブロックに並べても、ブロック切り替わるタイミングで「うっ」とちょっと繋がりが悪い感じがする場合があります。

おそらく、ブロックの制御タイミングが、ADX2のオーディオサーバー周期単位で行われるため、
オーディオサーバー周期が例えば16msecとかだと、その範囲でジッター的にずれてしまう可能性があります。
（ずれが目立つテンポがあるような気もします）

波形のサンプル単位で接続は行われないので、波形を切った部分がノイズになりやすい。

あと、一瞬２つが鳴ってしまうクロスフェードな部分だけ、音圧があがってしまう場合も違和感になる。

立ち上がりの遅い楽器（弦楽器）とかのステムならアタックを長めにした方が切り替え時になじんだりしている気もします。

# データの分割部分
波形を分割する部分はなるべく音が無いところが望ましい。

例えば、
- 歌声のようなものを切る場合、歌の途中はなるべく切らない方が良い。
- シンバルやオルゴールのようなテールの長い音を切らない。

アタックやリリースをフェードする場合で、不自然になる。
サンプル頭から音がある場合は、アタックは0にしておいた方が良い場合もある。（音による）

# 遷移時再生トラックを使う
アタックがどうしても必要な場合や、遷移した初回だけ鳴らしたい音とかでごまかす。

# 残響でごまかす
手間はかかるのですが、若干ドライな音にして、ADX2側のリバーブをうっすらかけてあげるとか。（音も変わってしまうので、どこでも使えるテクニックではないですが）

# ブロックの長さより波形の長さを長めにする
これも、手間がかかるのですが、ブロックの再生する長さってブロックより長めにできるので、
音のテールが不自然に消えてしまうような場合は、長めの波形に差し替えてあげると少し自然にできたりするかもです。

# ブロック分割での遷移の場合
ブロックエンドだと、テールのばしができるけど、ブロック分割での遷移の場合は、リリースを少し長めにするとか。　でも、これも万能ではなくて、分割後に次のアタックがあるようなデータだと不自然になる場合も。　
「遷移時トラック」を用意して、他の音を重ねて誤魔化すみたいな方法もあったり。
五億年ぶりに JavaScript を書いてみたら Observable や Promise や async, await のことが何もわからなくなっていたので次の五億年後に忘れてても思い出せるようにここに記す

# Observable とは

* Observer パターンの Subject
* subscriber へ値を publish する処理が本体で、subscriber が subscribe すると処理が実行される
* サーバーにリクエストを出して受け取ったレスポンスを publish する処理を Observable で実装し、レスポンスを扱う処理を subscriber で実装したりする

```js
// Observable の作成
const observable = new Observable(subscriber => {
  // subscriber に値 1 を publish する
  subscriber.next(1);
  subscriber.next(2);
  subscriber.next(3);
  setTimeout(() => {
    subscriber.next(4);
    // subscriber に処理の終了を通知する
    subscriber.complete();
  }, 1000);
});

console.log('just before subscribe');
// subscriber の定義
observable.subscribe({
  // Observable から publish した値を処理する
  next(x) { console.log('got value ' + x); },
  // エラーハンドリング
  error(err) { console.error('something wrong occurred: ' + err); },
  // 終了時の処理
  complete() { console.log('done'); }
});
console.log('just after subscribe');
```

# Promise とは

* 非同期で実行される処理のオブジェクト
* 非同期で実行される処理が本体で、then あるいは catch メソッドで成功時あるいは失敗時の返り値を処理することができる

```js
// Promise の作成
const promise = new Promise((resolve, reject) => {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', 'http://example.com');
  // resolve で成功時のコールバック関数を実行する
  xhr.onload = () => resolve(xhr.responseText);
  // reject で失敗時のコールバック関数を実行する
  xhr.onerror = () => reject(xhr.statusText);
  xhr.send();
});
// Promise の利用
promise
  // then で成功時のコールバック関数を定義する
  .then((res) => { console.log(res); })
  // catch で失敗時のコールバック関数を定義する
  .catch((e) => { console.log('ERROR: ' + e); });
```

# async, await とは

* Promise を扱うためのシンタックスシュガー
* `async function` として定義された関数を実行すると Promise を返す
  * トップレベル関数で非同期関数の定義ができて便利
* `await promise()` として Promise を実行すると Promise の終了まで処理を待つ
  * 実行したい Promise が複数あったとき then でチェーンするよりも読みやすい

```js
// async を使わずに Promise を返す関数を定義する
function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}

// async を使うと Promise を返す関数の定義が簡単
async function asyncCall() {
  console.log('calling');
  // await を使って Promise の実行を待つ
  const result = await resolveAfter2Seconds();
  console.log(result);
  // expected output: 'resolved'
}

asyncCall();
```

# 参考資料

* https://rxjs-dev.firebaseapp.com/guide/observable
* https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise
* https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
com.automator.runner.xpc is not allowed to send keystrokes

In Mac Automator when you want to use keystrokes in AppleScript like:

    on run {input, parameters}
	    tell application "System Events" to keystroke input
    end run

You may got an error said "com.automator.runner.xpc is not allowed to send keystrokes".

I found a lots of questions in stackoverflow and can't get an right answer.

#####In short:

**You have to add the application which you want to run the script to `Accessibility`.**

For example, if you want to run the script in Chrome, then add Chrome to your `Accessibility`, even not need to add Automator.
Android StudioでAndroidの画面をキャプチャ/録画しよう

# はじめに
アプリ開発の際、端末のキャプチャや録画したい時、
Android Studioで簡単にできる方法があったので紹介します。

## キャプチャの方法
まず、USBデバックを有効にし、
端末のキャプチャしたい画面を表示しておきます。
そして、下記に画像に表示されいている、
Android StudioのLogcatにあるカメラのアイコンをクリックします。
はい、キャプチャできました!
めっちゃ簡単ですね！
![スクリーンショット 2019-11-28 17.56.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472891/2cd6c391-0797-8619-a1e6-7630ca0186aa.png)

## 録画方法
次に、録画の方法を紹介します。
録画はMP4形式で最大3分間録画できます。
先ほどの画像のカメラアイコンの下にある、動画アイコンをクリックします。
クリックすると、録画オプションが設定できます。
![スクリーンショット 2019-12-03 18.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472891/48468b2e-af0d-57f3-2041-3ec7d4ebb23a.png)

・Bit Rate：ビットレートを設定できます。
・Resolution：幅と高さをピクセル単位の16の倍数で設定します。
　　　　　　　デフォルトだとデバイスの解像度です。
・Show Taps：画面内のどこをタップしたか視覚的に表示してくれます。
音声は録音できないため、Show Tapsをオンにするとわかりやすいかも！

Start Recordingをクリックすると録画が始まり、
Stop Recordingをクリックすると停止します。

# 最後に
Android Studioには便利な機能がたくさんありますね！

参考にしたサイト
[キャプチャ](https://developer.android.com/studio/debug/am-screenshot)
[録画](https://developer.android.com/studio/debug/am-video?utm_source=android-studio)
C10K問題とNode.js

# C10K問題(クライアント1万台問題)
- アクセスするクライアント数が1万を超えると、サーバーのスレッド（並列処理の単位）数が増え、サーバーのメモリーなどのリソースが不足してしまう問題
- 処理能力に余裕があっても、クライアントの数が多くなると効率が悪化しサーバがパンクする
- プロセッサの処理能力には余裕があっても、サーバの台数を増やさなければいけなくなってしまう

### 回避方法
- サーバーサイドではイベント駆動方式を利用しているNode.jsなどを使用する
    - イベント駆動により大量のリクエストを同時に処理できるスケーラビリティを備えている 
    - ノンブロッキングI/Oモデルにより、C10K問題に対応する

# Node.jsとは
> スケーラブルなネットワークアプリケーションを構築するために設計された非同期型のイベント駆動のJavaScript環境
[Node.js](https://nodejs.org/ja/)

- それぞれの意味
    - スケーラブル : 拡張性が高い
    - 非同期 : 各要求(request)の処理が完了するのを待たずに、それ以降の処理を行う方式
    - イベント駆動 : イベントと呼ばれるアプリや端末上で起きた出来事に対して処理を行うプログラムの実行形式
- 特徴
    - サーバーサイドで使用できる
    - ノンブロッキングI/Oモデルを採用しており、I/Oの処理を待たずに次の処理を始めることができるので、大量のデータ処理が可能
        - ノンブロッキング : ある処理を行いながら、ほかの処理も同時進行で行えること
        - I/O : Input/Outputの略で、入出力の意


## 参照
- [C10K問題とは](https://yohei-a.hatenablog.jp/entry/20120504/1336157667)
- [C10K問題 - Wikipedia](https://ja.wikipedia.org/wiki/C10K%E5%95%8F%E9%A1%8C)
- [C10k problem (C10K問題)](https://techinfoofmicrosofttech.osscons.jp/index.php?C10k%20problem%20%28C10K%E5%95%8F%E9%A1%8C%29)
- [スタバ方式で「C10K問題」を解消](https://tech.nikkeibp.co.jp/it/article/COLUMN/20120725/411441/)
- [まつもとゆきひろ コードの未来（日経BP Next ICT選書）](https://books.google.co.jp/books?id=6cOjDwAAQBAJ&pg=PT200&lpg=PT200&dq=C10K%E5%95%8F%E9%A1%8C%E3%80%80%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%AB&source=bl&ots=GYheiNxNjl&sig=ACfU3U3KyWbI1XbSZlGG95_3JDQnHjxODg&hl=ja&sa=X&ved=2ahUKEwjYifjv45rmAhUIHXAKHcfkBfsQ6AEwBHoECAkQAQ#v=onepage&q=C10K%E5%95%8F%E9%A1%8C%E3%80%80%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%AB&f=false)
MySQLの起動、停止、再起動コマンド

#MySQLの状態確認
```
service mysql status
```
または

```
/etc/init.d/mysqld status
```
#MySQLの起動
```
mysql.server start
```
または

```
/etc/init.d/mysqld start
```
#MySQLの停止
```
mysql.server stop
```
または

```
/etc/init.d/mysqld stop
```
#MySQLの再起動
```
mysql.server restart
```
または

```
/etc/init.d/mysqld restart
```
#MySQLログイン
```
mysql -u root 
```
2つのEntityでのやり取りで簡単そうなのに意外と難しかったやつメモ

##難しいというか長かった
完全に備忘録です

モデルが2個あって
PKがかぶってるデータを排除して
のこったデータをリストとして保持する

```.java
package test;

public class Models {
	class Model1 {
		private String id;
		private String name;

		public String getId() {
			return id;
		}

		public void setId(String id) {
			this.id = id;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}
	}

	class Model2 {
		private String id;
		private String name;

		public String getId() {
			return id;
		}

		public void setId(String id) {
			this.id = id;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}
	}
}

```

```.java
package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import test.Models.Model1;
import test.Models.Model2;

/**
 * test
 *
 * @author me
 *
 */
public class Test2 {

	/**
	 * main
	 * @param args
	 */
	public static void main(String[] args) {
		distinct();
	}

	/**
	 * モデルからPKかぶりを排除するやつ
	 */
	private static void distinct() {
		Models models = new Models();
		List<Model1> list1 = Collections.synchronizedList(new ArrayList<Model1>());
		List<Model2> list2 = Collections.synchronizedList(new ArrayList<Model2>());
		Models.Model1 model1 = models.new Model1();
		model1.setId("1");
		model1.setName("asdasdasdas");
		list1.add(model1);
		Models.Model1 model11 = models.new Model1();
		model11.setId("2");
		model11.setName("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
		list1.add(model11);
		Models.Model2 model2 = models.new Model2();
		model2.setId("1");
		list2.add(model2);
		Models.Model2 model22 = models.new Model2();
		model22.setId("2");
		list2.add(model22);
		Models.Model2 model222 = models.new Model2();
		model222.setId("3");
		list2.add(model222);

		/** -----本機能----- */
		// list2とPKがかぶっているものを排除したlist1のPKリスト
		List<String> uniKeyList = list1.stream().map(data1 -> data1.getId())
				.filter(key1 -> list2.stream().map(data2 -> data2.getId()).anyMatch(key2 -> key1.equals(key2)))
				.collect(Collectors.toList());
		// list1をuniKeyListで検索
		List<Model1> uniData = list1.stream()
				.filter(data -> uniKeyList.stream().anyMatch(key -> data.getId().equals(key)))
				.collect(Collectors.toList());
		System.out.println(uniData);

	}

}

```

まずかぶりのないPKだけのリストを作り

もとのモデルのリストから、検索して

かぶりPKのデータをなくす、というステップを踏みました

絶対無駄が多い...もっとスマートにできるはずなのでは
忘備録-Swiftのオプショナル型

趣味でIOSアプリ開発をかじっていた自分が、改めてSwiftを勉強し始めた際に、曖昧に理解していたところや知らなかったところをメモしています。

## 参考文献

この記事は以下の書籍の情報を参考にして執筆しました。

- [詳解 Swift 第5版](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3Swift-%E7%AC%AC5%E7%89%88-%E8%8D%BB%E5%8E%9F-%E5%89%9B%E5%BF%97/dp/481560407X)

##if-let文
if-letでunwrapするときに複数の変数を指定できる

```swift
var hoge: String? = "hoge"
var fuga: String? = "fuga"
if let h = hoge, let f = fuga {
    print("nilじゃないよ")
}
```
##guard文
guardの後に宣言した条件を満たさない場合、else節の処理を実行

```swift
func hogehoge() {
    //let hoge: String? = "hoge"
    let hoge: String? = nil
    guard hoge == nil else{
        //guardの条件じゃ無いなら下記の文が実行される。この場合nilじゃ無いなら実行
        print(hoge!)
        return
    }
    print(hoge)    //nil
    return
}
hogehoge()
```
##nil合体演算子
ある変数がnilだった場合に別の値をセットしたいとき

```swift
let hoge: String? = nil
print(hoge ?? "hogehoge")    //hogeの値がnilなら"hogehoge"を使う
```
##有値オプショナル型

```swift
let hoge: String! = "hoge"
let fuga: String? = "fuga"
let message1:String = hoge
let message2:String = fuga    // error unwrapしないといけない
```
有値オプショナル型はコンパイラが値の評価の時に特別扱いするだけで、オプショナル型と変わらない。

```swift
let message3:String! = fuga
let message4:String? = hoge
```
##失敗のあるイニシャライザ
初期化に失敗した場合return nilをして処理を修了できる。

```swift
struct Hoge {
    var hoge: String
    init?(hoge: String?) {
        guard let h = hoge else{
        return nil
        }
    self.hoge = h
    }
}
let fuga = Hoge(hoge: nil)
if let f = fuga{
  print(fuga!.hoge)
} else {
  print(fuga)    // nil
}
```