OmniAICreator/Qiita-1.07M huggingface dataset:
【IFTTT】RSSエラー備忘録 Twitter Facebook Weibo

#動機
Twitter to Weibo が機能しない。iftttトリガーがうまく反応しない。起動しない。

<font color="red">Applet Failed.</font>
アプレットが失敗しました。

<font color="red">Action skipped</font>
アクションをスキップしました.

<font color="red">Action skipped after 5 action errors</font>
5つのアクションエラーの後にスキップされたアクション

![スクリーンショット 2019-12-06 08.07.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/287a2edb-b8c8-e34a-a606-5c44e515c4f0.png)

<font color="red">There was a problem with the Sina Weibo service.</font>
Sina Weiboサービスに問題がありました。

![スクリーンショット 2019-12-06 08.09.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/5d521f6e-1a20-73bc-8091-e22cee562128.png)


<font color="red">Could not connect Facebook Pages right now. Please try again later.</font>
現在、Facebookページに接続できませんでした。後でもう一度やり直してください。

<img width="687" alt="スクリーンショット 2019-12-11 07.42.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/210e1484-32bc-6624-9635-3656e922665e.png">

dlvr.it
<img width="611" alt="スクリーンショット 2019-12-11 07.57.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/581a392b-23b5-aea7-5bcf-ccb330c246a5.png">


Select a Facebook Page or Group
We were unable to locate any pages associated with your social media account that can be connected to dlvr.it.

This may mean this social media account doesn’t have the necessary posting permissions. You may want to log into a different social media account with the necessary management permissions.

Socials not eligible for posting


Facebookページまたはグループを選択してください
dlvr.itに接続できるソーシャルメディアアカウントに関連付けられているページを見つけることができませんでした。

これは、このソーシャルメディアアカウントに必要な投稿権限がないことを意味する場合があります。必要な管理権限を持つ別のソーシャルメディアアカウントにログインすることもできます。

投稿対象外のソーシャル

**RSS→Facebook<font color="blue">成功 2019</font> IFFFT Zapier dlvrit**
**facebookに「ページ」を作成したら出来た。**


#試したこと

- This connection usually runs within a few seconds.Check now.
この接続は通常、数秒以内に実行されます. → 今すぐ確認してください。
テストする。
- トリガーの数を減らす[1]
- トリガーをすべて削除する
- 連携先のアプリ認証を削除する・確認する
![スクリーンショット 2019-12-06 09.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/1d1deb6a-784f-e5d1-001d-c825314d368f.png)

- 接続を逆にして試す  Weibo to Twitter ←<font color="blue">成功</font>
- What's happening? やInclude 内容を減らす

- TwitterのRSSフィードを取得する「TwitRSS.me」「FetchRSS」「Queryfeed」「Twitter Great RSS」を試す[2]
- FeedlyというRSSを読み込む機能を試す。

- RSSからFacebookページへ自動投稿「dlvr.it」[3]
- [Integromat](https://www.integromat.com/)
- [Shareable Tweets](https://chrome.google.com/webstore/detail/shareable-tweets/gmdhfohiimofdkgfibdamlamdbehooba)

#結果
Not working. Failed...


#参考
[1] [IFTTTの起動のタイミングって？ | 5丁目通信（仮称）](https://www.5cho-me.com/archives/160397)
[2] [TwitterのツイートをRSSフィードで取得する方法！TLを変換して読む！](https://applica.info/twitter-rss)
[3] [RSSフィードからFacebookページへ自動投稿してくれるWebサービス「dlvr.it」](http://bashalog.c-brains.jp/14/05/13-110000.php)
intra-martでHello world

#概要
intra-martという製品をご存知ですか？
企業での業務システムで利用されているシステム共通基盤でjava/javascriptでの開発フレームワークとしての利用がほとんどですが、ローコード開発も可能となってきていて、色々面白くいじることができます。
[intra-martとは？](https://www.intra-mart.jp/)

#ローコード開発基盤とは
ソースコードを書かない／最小限のソースコードでソフトウェアを開発するためのITツールです。
intra-martでは、
・画面を作成するための「FormaDesigner」
・一覧を作成するための「ViewCreator」
・処理を作成するための「LogicDesigner」
のようなものが用意されています。
2019年春に公開されたバージョンからは、新たな画面開発ツールである「BloomMaker」も追加され、ローコード開発の領域がどんどん増えています。

#Hello world
ローコード開発の例として、「Hello world」と記載されたページを作成して公開してみます。
画面作成方法としてはFormaDesignerを利用することもできますが、ここでは処理を作成するためのLogicDesignerで作成してみます。

##表示する画面の要素を作成する。
LogicDesignerの処理作成画面であるフロー定義画面を開きます。
![q1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322795/21d8f606-cdd8-e555-38d6-eee9b68b7ab3.png)


今回はhello worldと表示したいため、その文字列の定数を用意します。
![q2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322795/ba055904-191f-2d9d-e6c4-078f4c04f996.png)


フロー定義の出力値として「body」を用意（これが画面表示時のbody句となる）します。
![q3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322795/6862f33d-4e36-e81c-1824-a4fa3766e812.png)


今回は特に処理がないため、開始と終了を線で結びます。
![q4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322795/b05fc389-520c-a546-ee2a-679e562cfc33.png)

終了の箱のマッピング定義にて、出力値のbodyに定数のhello worldの文字列を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322795/b7d4ddee-6622-e188-23cc-f48be3988991.png)


これで、body句として「hello world」を返却する処理が作成できました。
この処理をWEBで公開するための設定を行います。
ルーティング定義にて、先ほど作成した処理に対して公開するための設定を行います。
![q5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322795/18e4200f-e116-735c-d50a-b9f508170ce0.png)

ルーティング定義では、作成した処理に対する公開設定を行えます。
レスポンス種別としてはjsonで返却などのパターンがありますが、ここでHTMLとして返却を選択することで、処理の返却値をHTMLとして出力することが可能となります。
このルーティング定義に対して権限設定を行い、指定したURLにアクセスすると、hello worldと書かれたページが表示されます。
![q6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322795/4dc4a0c5-1a43-af36-27ca-b6957ba25913.png)

#最後に
今回は簡単なページ作成でしたが、基礎となるテンプレートファイルを読み込んで、業務処理の結果をそのテンプレートに埋め込んで画面として公開するなど、様々な使い方ができます。
intra-martのローコード開発はWEB画面上で手軽に作成することが可能なので、試しに色々作ってみると楽しいです。

…画面コピーみたら、フロー定義名とか「hellow」って感じでつづり間違ってますね
チームでふりかえる4つの成長指標

この記事は[ふりかえり Advent Calendar 2019 の6日目の記事](https://adventar.org/calendars/4250)です。

あなたが担当するプロダクトは1年間でどの程度成長しましたか？

人と同じでプロダクトも定期的に成長をふりかえることは重要です。
また、プロダクトの成長には大きく外部品質（ユーザ価値など）と内部品質（メンテナンス性など）の2つがあり、これらのバランスを取ることも重要です。

そのため、4つの視点で成長を定期的にふりかえってみましょう。

## 4つの成長指標

### プロダクトの成長

- ユーザメリットのあるプロダクトの成長
- 例
    - 機能追加
    - UI/UX改善

### システムの成長

- メンテナンス性の向上などシステムの成長
- 例
    - 自動テスト追加
    - リファクタリング

### チームの成長

- チームとしてアウトプットを向上させるための成長
- 例
    - PRレビュー体制の見直し
    - モブプロによりスキルトランスファー

### 個人の成長

- チームのアウトプットを向上させるための個人の成長
- 例
    - TDDの学習、実践
    - ライブラリの検証

## ふりかえりのポイント

- 成長がない時はなぜないのか。改善する必要があればどういう改善ができるか。を話し合います。
- プロダクトの成長とシステムの成長は出来るだけリリースしたものにします。
    - 成長が誰から見ても明らかになるようにリリースしたものだけにすることをお勧めします。
    - リリースがないときに成長がないことに不安を感じますが、それを現実と受け止めてリリースを目指します。
RPA導入はボトムアップ型とトップダウン型アプローチのどちらがいいのか

ここ2～3年もてはやされているRPA導入についてよく議論されるのが、「**現場主導のボトムアップアプローチ**」がよいのか、「**経営主導のトップダウンアプローチ**」がよいのか、ということである。欧米だと実はこういう議論にはならないようであるが、日本ではこのような議論が起こる背景がいくつかあるので、その背景とともに見ていくことにしたい。

# 日本で流行ったボトムアップ型アプローチ
日本では2017年頃からRPAブームに一気に火が付いた。某企業での過労死問題などが大々的に報道されたこともあり働き方改革を進めなければいけないという機運が一気に高まった。また、少子化や採用のミスマッチの問題も頻繁に取り上げられるようになった。

働き方改革を実施するための対策が現場に求められた中で、これを実現するためのデジタルツールの1つとして「RPA」が選ばれた。日本においては現場主導で身の回りの業務をそのまま置き換える形でRPAが導入されることが多く、現場の決済ですぐに進められることもあり、欧米 (大企業の7割程度)に比べて浸透のスピードが高い (**大企業の9割程度**) といわれている。

一方、[日経コンピュータの特集](https://tech.nikkeibp.co.jp/atcl/nxt/column/18/01042/102400006/)からも明らかなとおり、まだ**大きな成果が出ている企業は2割以下**と、とても少ない。いまのRPAの広がり方だけでは出せる成果に限界があることがうかがわれる。

# 欧米ではトップダウン型があたりまえ
欧米では昔からグローバルでの競争にさらされ、トップの経営判断が生死をわけることが多かった。そのため、1990年代にはビジネスプロセス・リエンジニアリング (BPR) が流行りだしてトップダウンで企業内での業務の整理が行われるようになった。その土壌があったため、RPAの導入もトップダウンでBPRとのセットで実施されることが多いようだ。ビジネスプロセスには、企業内にそのオーナーとなる担当者が明確になっており、複数部門にまたがるプロセスはその担当者が決定権限を持っている。したがって、その担当者と一緒にRPAを導入すればよいことになる。


# 日本においてはどちらがよいのか？
では、日本企業においてはどちらの導入方法が適しているのであろうか。筆者がいくつかのRPA導入企業の事例を聞いた結果によると、実はどの企業も「**トップダウン型とボトムアップ型のハイブリッドが必要**」と話をしていた。日本では戦後からバブル崩壊までの約半世紀の間、**単一事業でずっと成長できてしまった企業が多い**という背景がある。トップダウンで重大な経営判断をしなくても現場のカイゼンに任せておけばよかったために、トップダウンの事業改革、BPRというものは行われた来なかったのである。

そのため、業務のやり方も部門ごとに標準化されておらず欧米型のRPA導入をいきなり適用しても無理なのである。初期フェーズではそれぞれの部門でのボトムアップ型導入により、それまで行われていなかった業務のデジタル化をまず体験することが必要であった。

しかし、お試しでRPAがある程度広まってきた今となっては、第2段階として欧米型の本格的なRPA展開を目指す必要があるだろう。つまり、日本においてはまずボトムアップ、次にトップダウンといったハイブリッド型のアップローチが必要になってくるようである。

以下にそれぞれの手法の特徴をあげておく。

**ボトムアップ型のメリット**

* 現場判断で進められるため、スピード感をもって導入ができる。
* 現場の意見が取り入れられやすい。 

**ボトムアップ型のデメリット**

* 身の回りの心理的負荷が高い業務から適用してしまうが、そのような業務は複雑でRPA導入に向かないことが多く、頓挫する可能性が高くなってしまう。
* 全体で見たときに大きく効率化されるべき業務が適用業務に選ばれないことが多く、身の回りの業務をそのままRPA化してしまい、小さくまとまってしまうことが多い。
* リソースや人材は部門ごとに個別最適されたままとなり、大きなことができない。

**トップダウン型のメリット**

* 組織全体で見たときにメスを入れるべき領域を経営判断できる。
* 社内でのリソースの再配分が可能となり、大きな取り組みが可能となる。
* 経営企画、IT部門、現場で仮想組織 (CoE)を作って、組織内の様々な見識をあわせた推進が可能となる。

**トップダウン型のデメリット**

* 現場の意見が取り入れられないことがあり、現場とのギャップが生じることがある。
* 最初はなかなか火がつかない。導入スピードは遅くなりがちである。


# 参考記事

* [【RPA】2種類の適用業務 - 「効率化できた業務」「人手では無理だった業務」](https://qiita.com/spaces/items/afdd0c52a825ae7378bb)
* [RPA は導入しないほうがいいのか?](https://qiita.com/spaces/items/f2cd75a3fe75d8be150a)
* [RPAの失敗事例よくある話とその対策](https://qiita.com/spaces/items/9cbb905ce8818120bfd8)
* [RPAに適した業務、適さない業務](https://qiita.com/spaces/items/056922dc7f53310a1cee)
#Rails like "not where" "without_xxx" method in scope ? 

I found but it was a method of enumerize

https://github.com/brainspec/enumerize

![image](https://user-images.githubusercontent.com/13635059/70185884-05b67700-172e-11ea-8044-45b068f56f78.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
コンストラクタ

初学者ですが、個人的な勉強のためにまとめてみました

##コンストラクタ

・コンストラクタは、生成されたインスタンスがほかのインスタンスから使われる前に、事前準備を整える「前処理」をするためのメソッドの一種

####3つのルール

①メソッド名を**クラス名**と同じにすること
②**戻り値型**は記述できない
③**new**と一緒にしか使えない（インスタンス生成時以外は呼び出しができない）

####非公開なコンストラクタ

・privateを使うことで、コンストラクタを非公開にすることができる（ほかのクラスがnewを使いインスタンス化できない）

（例）非公開なコンストラクタを使ったクラス定義

```Sample.java

public class Sample {
	private Sample() {
	}

	public static Sample getInstance() {
		return new Sample();
	}
}

```

・非公開なコンストラクタは外部のクラスでインスタンスを作成させないようにしているが、インスタンスを取得する方法が2つある（らしい。自分はまだ理解できていない）
　①staticフィールドにオブジェクトを保持する
　②staticメソッドでオブジェクトをリターンする

・非公開のコンストラクタを含むクラスを継承することはできない

####デフォルトコンストラクタ

・コンストラクタ定義を省略した場合、コンパイラがコンパイル時に自動的に追加する引数なしのコンストラクタを**デフォルトコンストラクタ**という
・デフォルトコンストラクタは、**引数なし、処理なし**のコンストラクタ

####コンストラクタのオーバーロード

・コンストラクタは自由に定義できることから、**オーバーロード**して複数定義することも可能
・**this()**を使うことで同じクラスのコンストラクタを呼び出すことができる
　
　★**this()使い方**
　　・**コンストラクタ内**でthis( )を使うことで、同じクラスで定義されている他のコンストラクタを呼び出すことができる
　　・引数（引数の数、型、順番）が一致していないと呼び出せない
H97M-Plus上のNVMe SSDが起動ディクスとして認識されない

自作PCの容量が不足してきたため、交換するついでにSATA接続のSSDからNVMe接続のSSDに変えてみることにしました。しかしWindows10のインストールは出来たのですが、OS起動に失敗します。ネット上にH97M-Plus上での成功例はあるはずなのに。。。

相性問題なのかと思いましたが、私の場合はファームウェア(UEFI)アップデートで無事解決しました。そもそもNVMe接続が対応していなかったようです。
他問題でもUEFIのファームウェアアップデートで解決するかもしれませんので、更新履歴は細かく見てみましょう。

#### 参考（構成）

||マザーボード|NVMe SSD|ファームウェア|
|:--|:--------|:--------|:--------|
|型番|H97M-Plus|CT1000P1SSD8JP|UEFI|
|注釈||既存のM2スロットではなくPCIeスロット使用（変換するためAIF-06Aを使う）|v.0317からv.3602にアップデート(v.2501の[リリースノート](https://www.asus.com/us/supportonly/h97mplus/helpdesk_bios/)より「Support NVMe」)|
gossセットアップ

本記事は[goss advent calender 2019](https://qiita.com/advent-calendar/2019/goss)参加記事です。

通常のセットアップは一行
-------------------------

```
curl -fsSL https://goss.rocks/install | sh
```
(https://github.com/aelsabbahy/goss)

またgoss開発元のシェルを使わずに手動インストールする場合は以下

```
curl -L https://github.com/aelsabbahy/goss/releases/download/_VERSION_/goss-linux-amd64 -o /usr/local/bin/goss
chmod +rx /usr/local/bin/goss
```

基本的にバイナリ一つで動く
------------
インストールとして/usr/local/binに配置しようとしていますが、これも必須ではなく
ダウンロードしたバイナリに実行権限さえ付けて起動すればgossは実行可能です。

そのため、/tmpなどにテストシナリオのYAMLファイルと一緒に配置してテストを実行し
終わったら消すといった運用も可能です。

筆者は全て試しているわけではありませんが、主にRHEL系のOSでは何も依存ライブラリやパッケージ等を必要としないでgossは動いているのは確認しています。
(恐らくDebian、ubuntuでも同じです)

また設定ファイル等は持たず、DBとの連動もありません。非常にシンプルです。

なぜバイナリ一つで動くのか
---------------------
ここからは幾分推測混じりです。

公式のSourceを見れば一目瞭然ですがgossはGoで書かれています。
(https://github.com/aelsabbahy/goss)

そのため必要な機能は全てバイナリにビルド済みの状態で提供されます。

この辺りは10数個ほどgemを使って動くRubyで書かれたserverspecと異なる点です。

またバイナリ一つの収めたのはgoss作者がシンプルさを追求してそのようにしたのではないか？と筆者は考えています。
別途configファイルを用意したり、他のソフトと連動させると便利にはなる反面セットアップが複雑化し、導入を断念されたりそれに関する問い合わせが増えるためです。

もちろん手厚くマニュアルを書く、というのも良いのですが、読まなくてもわかるというのはそういったベクトルと逆の方向の親切さだと思います。

gossを周りに勧める理由の一つでもあります。
Hugo でパンくずリストを表示してみた

Hugo でパンくずリストを表示してみたので、メモ。https://maku77.github.io/hugo/template/breadcrumbs.html を参考にしています。

## パンくずリストのコード

*layout/partials/breadcrumb.html* に、以下のように書きます。

```html
{{- define "breadcrumb" }}
    {{- if .node.Parent }}
        {{- template "breadcrumb" (dict "node" .node.Parent "start" .start) }}
    {{- else if not .node.IsHome }}
        {{- template "breadcrumb" (dict "node" .node.Site.Home "start" .start) }}
    {{- end }}

    {{- if eq .node .start }}
<li class="breadcrumb-item active" aria-current="page">{{ .node.LinkTitle }}</li>
    {{- else }}
<li class="breadcrumb-item"><a href="{{ .node.Permalink }}">{{ .node.LinkTitle }}</a></li>
    {{- end }}
{{- end }}
```

表示したい箇所で、以下のように書きます。

```html
<nav aria-label="breadcrumb">
  <ol class="breadcrumb">
    {{- template "breadcrumb" (dict "node" . "start" .) }}
  </ol>
</nav>
```

### スタイル設定
スタイル設定は、bootstrap4系の装飾をそのまま使っています。 詳しくは https://getbootstrap.com/docs/4.0/components/breadcrumb/ 参照。

### 実際の活用例
自動計算サイトで試しました。https://calculator.jp/science/chi-squared/ をごらんください。

![パンくずリストを表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31643/d66ca5cc-194b-6d94-f95d-16006baa1371.png)
Rustのserde_jsonで値を編集する

# 目的
serde_json::Valueの値を色々と加工してみたくなったので試してみました。

# プログラム
```rust:Cargo.toml
[package]
name = "json"
version = "0.1.0"
edition = "2018"

[dependencies]
serde_json = "*"
```

```rust:main.rs
#[macro_use]
extern crate serde_json;

fn main() {
    // 値の変更
    let mut p = json!({"a": 1});
    *p.get_mut("a").unwrap() = serde_json::to_value(p["a"].as_i64().unwrap() * 2).unwrap();
    assert_eq!(p, json!({"a": 2}));

    // 配列に追加
    let mut p = json!([]);
    let a = json!({"a": 1});
    let b = json!({"b": 2});
    p.as_array_mut().unwrap().push(a);
    p.as_array_mut().unwrap().push(b);
    assert_eq!(p, json!([{"a": 1}, {"b": 2}]));

    // 属性を追加
    let mut p = json!({});
    p.as_object_mut().unwrap().insert("a".to_string(), serde_json::to_value(1).unwrap());
    p.as_object_mut().unwrap().insert("b".to_string(), serde_json::to_value(2).unwrap());
    assert_eq!(p, json!({"a": 1, "b": 2}));

    // ループで値変更
    let mut p = json!([{"value": 1}, {"value": 2}]);
    for item in p.as_array_mut().unwrap_or(&mut vec![]) {
        *item.get_mut("value").unwrap() = serde_json::to_value(item["value"].as_i64().unwrap() * 2).unwrap();
    }
    assert_eq!(p, json!([{"value": 2}, {"value": 4}]));
}

```
1on1のBeforeとAfter

# はじめに

この記事は [1on1 Advent Calendar 2019](https://adventar.org/calendars/4254) の6日目の記事です。  
1on1は色々なやり方があり、今回のアドベントカレンダーでも様々な手法が紹介されていてとても参考になります。この記事では少し視点を変えて、1on1の本編ではなく実施する前と実施した後にスポットを当てて、私が取り組んでいる事例を紹介します。  

なお、前提として私が普段行っている1on1の状況を整理しておきます。

- 1on1の形式：マネジャー（私）の担当部署における、上司と部下で行う1on1
- 対象者の属性：新人から同世代のベテランまでのエンジニア
- 対象人数：9人
- 実施頻度：月に1回（ただし、別途目標管理面談を実施しており、上司と部下の面談機会は2週間に1回）
- 1人の実施時間：30分

普段毎日接しているとはいえ1対1で接する貴重な機会であり、1on1は次回以降にも継続します。そのため、1on1の本編はもちろん、実施するまでの準備や実施した後のアクションも重要だと考えています。

# Before

1on1を実施する当日や前日に30分〜1時間ほど時間を取って準備します。

### 前回何を話したかを確認する

前回の1on1の記録（後述）を確認しておきます。もちろん、前回の話題を次も取り上げるかどうかは状況次第ですが、もし前回の1on1で重要なアクションを決めていたなら、上司としてそのアクションの状況を確認すべきです。普段の業務で既に状況を把握していたとしても、1on1で決めたことを改めて1on1で振り返る習慣ができれば、信頼関係と1on1の継続的価値が高まると思います。

### 何を話すかテーマをピックアップする

前回の1on1から直近までに起きた様々なことを思い出しながら話題となりそうな、例えば次のようなテーマをピックアップします。

- 個人目標の内容と取り組み状況
- 直近の業務の状況
- 普段の生活、健康状態など
- 上司としてフィードバックしておくこと

相手の言っていることに対して「えっと、どの件だっけ？」と言っていたらあっという間に貴重な時間は過ぎてしまうので、多忙なときでも必ず事前に思い出す時間を確保して重要なトピックスをピックアップします。

### 話すことを絞る／優先度順に並べる

1回で話せる時間は限られていますし、相手が話したい別のテーマもあるかもしれません。そのため、前述の前回話したこととピックアップしたテーマを整理し、話題の優先順位を決めます。話したいことがたくさんあったとしても、なるべく決めた時間で終わるようにしています。毎回同じ時間で終わることによって、その時間内に集中して話をするリズムが生まれます。  
また、たくさん話したからと言って相手が全部受け入れられるとは限りません。1回にたくさんの種類のことを話題にすると、1つずつの記憶は薄まってしまいます。どうしても伝えたい重要なことがあるなら、なおさらそれを最優先にして絞り込みます。
なお、どうしても時間が足りないと感じた時は、そのテーマは本当に1on1で話すべきことかを考えてみても良いかもしれません。例えば、業務の問題点や勤務態度などは、1on1ではなくきちんと時間を取って上司として指導すべきことかもしれません。

### 進め方や話し方の確認

他の投稿者も紹介されていますが、あらかじめ1on1の進め方をテンプレ化している場合、事前にそれをおさらいしておきます。
私は『 [ヤフーの1on1―――部下を成長させるコミュニケーションの技法](https://www.amazon.co.jp/dp/4478069786/) 』に紹介されている流れをベースに、毎回の1on1で振り返った後の改善点などを注意事項としてメモしています（後述）。特に、前回の1on1で改善すべきと感じたポイントは必ずおさらいしておきます。

# After

1on1を実施した当日、遅くともその週のうちに話したことをまとめて、ふりかえりを行います。1on1自体が続けて何人も実施するものではないと思いますが、実施後にまとめる時間のことも考えて、多くても午前中2人、午後2人ぐらいのペースで数日に分けて実施しています。それとは別に、10分ほどふりかえりの時間も取っています。

### 話したことをまとめる

1on1の実施中は話をすることに集中しほとんどメモを取らないようにしているため、終わったあとで話したことを箇条書きで記録します。終わった直後にキーワードレベルでサッとメモしておき、その日のうちに箇条書きにまとめ直します。プライベートな話題などもあって基本的には口外しない前提なので、自分があとでわかれば良いレベルのメモです。

### 決めたことを本人と共有する

話したことのうち、今後の業務の取り組みなどについて2人で決めたことは、チャットで本人へ共有しています。話したことを行動に移してほしいという期待と、内容の認識合わせ、そして前述したように次回の1on1で改めて話題にする場合もあるための共有でもあります。

### ふりかえり

1on1の内容とは別に自分自身の1on1の進め方や話し方についてふりかえりを行っています。以下のような簡易的なふりかえりシートを作って1on1中に起きたことに対する気づきなどを洗い出し、それに対する改善アクションを考えます。  
ポイントとしては1on1は上司と部下の1対1の対話なので、「気づき」の部分はあくまで相手ベースで起きたこと、気づいたことを書くことです。例えば、「メモを取らず相手を見て話すべきと気づいた」ではなく、相手に視点を置いて「メモを取っている間に○○さんの集中が切れてしまったように見えた」という気づきを書き出して、改善アクションとして「メモを取らずに相手に集中して話す」というアクションを決めます。

例）1on1ふりかえりシート

| 日付  |  気づき | クライアント（相手） |  改善アクション  |
|:----:|:---------|:--------:|:---------|
|  xx/xx  | メモを取っている間に○○さんの集中が切れてしまったように見えた。 |  ○○さん   |  メモを取らずに相手に集中して話す。  |

# おわりに

1on1のBeforeとAfterについて紹介しましたが、もちろん本編と切り離して考えるものではないので、本編次第で変わる部分もあります。きっちり準備しても、ざっくばらんに世間話をすることもありますし、特にふりかえることが無い場合もあります。あくまで一例として参考になれば幸いです。
AWSでJupyterHub (Python)

# 概要

全体概要は，[AWSでJupyterHub (概要) ](https://qiita.com/ryouka0122/items/af5004d17e0ac934e550)にあるので，参照してください．

12月って，なにかと色々あって大変ですよね？

今回は，JupyterHubを動かすPython周りについて記事にしていきます．
前回同様，ターミナルでの作業は，基本的に`ec2-user`で行っていきます．
引き続き，権限周りは雑だと思いますので，参考にする際は注意してください．

# おしながき
* Pythonのインストール
* Anacondaのインストール
* Anacondaのセットアップ



# Python
最近，人気度の高いプログラミング言語です．
Python自体については，ここではあまり触れないことにします．

「標準パッケージが豊富なので，"ちょっと試したい"というときにサクッと作って動かせる」「サードパーティーのパッケージが豊富」「Pythonの構文が自分好み」という点でPythonが好きです．

# Pythonのセットアップ
Pythonには2系と3系があり，「これから始める」という場合，特別な理由がない限り3系（最新版）を使いましょう．
今回も，3系で行こうと思います．
まず，PythonをEC2に入れていきますが，現在の状態を確認します．
ターミナルでEC2に接続して，おもむろに以下のコマンドを実行します．

```
python -V
```

私の環境では， `Python 2.7.16` と返ってきました．
つまりPythonは2系ということになります．3系にしたいので，新たにインストールしていきます．
インストールするには次のコマンドになります．相も変わらず`yum`です，便利ですね．

```
sudo yum install python3
```

インストール前にパッケージがあるか確認する場合は，`install`を`search`に変えるだけです．
インストールは`yum`に任せて，出力された最終行が`Complete!`って出ればインストール完了です．

先ほどと同じように，Pythonのバージョンを確認しましょう．対象はPython3なので，コマンドを`python3`に変えてあります．

```
python3 -V
```

インストールが正常に終了していれば， Python3のバージョンが返ってきます．
私の環境では，`Python 3.7.4`となりました．

これで，Python3のインストールは完了です．

# Anacondaのインストール
Pythonはパッケージのバージョン管理が苦手のようです．
mavenやgradleのように，pythonにも専用ツールが存在します．
pyenvなどのツールもあるようですが，`Jupyter notebook`，`JupyterLab`，`JupyterHub`については，Anacondaを使うと便利のようです．

Anacondaをインストールするのに，`root`で行っていくのでまず，`root`に切り替えておきます．

```
sudo su -
```

インストール用のファイルをまず落としてきます．次のコマンドになります．2019年10月時点で最新のものがあったのでそれを使います．

```
wget https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh
```

次に，落としてきたshファイルを実行します．

```
sh Anaconda3-2019.10-Linux-x86_64.sh
```

インストールするときに3つ質問されます．
`ライセンスの同意`，`インストール先ディレクトリの指定`，`condaの初期化`です．
1つ目と3つ目は特に問題ないのですが，2つ目は今回の目的が「ほかのユーザでもAnacondaが使えること」なので間違えると使えなくなります．
質問に答えると，インストールが始まります．


## 質問１：ライセンスの同意

```
Do you accept the license terms? [yes|no]
[no] >>> 
```
これについては，`yes`以外の回答がないと思いますので，`yes`と入力します．

## 質問2：インストール先ディレクトリ

```
Anaconda3 will now be installed into this location:
/root/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/root/anaconda3] >>> 
```
インストール先ディレクトリについては，ここで間違えると`root`ユーザしか使えなくなってしまいます．(`root`ユーザのホームディレクトリにインストールすため)
今回は，ほかのユーザも使えるようにしたいため`/opt/anaconda3`と入力します．

### インストール時の注意
インストール先ディレクトリを指定して，「いざインストール！」っというときに，「`Unpacking payload ...`と出力してから一向に進まない」「プログレスバーが0%から進まない」などがあります．
インストール時に利用するメモリが足りない可能性があります．
足りないメモリはインスタンスタイプを一時的にアップグレードさせてから再実行してみましょう．
※私は`t2.micro`から`t3a.micro`にしたら通りました．

## 質問３：condaの初期化
```
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[no] >>>
```
Anacondaもインストールしたての時は，すぐに準備できていないので初期化が必要になります．
今回は，個別にやっていくので`no`と答えておきます．

## 確認

`/opt/anaconda3/bin/conda` と打ち込んで，ヘルプ情報が出力されていれば，インストールは完了です．


# まとめ
今回は，ターミナルでぺちぺちとコマンドを打ってPythonとAnacondaのインストールとセットアップをしました．
次回はこれをベースにJupyterHubを組み立てていきます．
エラー「LocalBridge.exe - 正しくないイメージ」

Windows10をどこかで更新した拍子にタイトルの表記のあるエラーウィンドウが出続ける事象が発生．
「新しいOfficeをはじめよう」もしくは英語表記「Office」というアプリが普段使っているアプリと競合して起こしているらしい．

[参照元](https://www.pa-solution.net/daj/bs/faq/Detail.aspx?id=e58584b64366a426e45326959757a782b706a36566e796a435a6f613338446e68613778773364737a4733413d&kindId=-7&category=1585&categoryNot=0&word=%e6%96%b0%e3%81%97%e3%81%84Office%e3%82%92%e3%81%af%e3%81%98%e3%82%81%e3%82%88%e3%81%86&listNo=0&cntPerPage=20&page=1&totalCount=17&type=1&search=7&sort=99&order=2&attributeSearch=&dispNodeId=1585)

ということで，上記アプリを検索して，アンインストール．無事解決．
mockmockでAmazon Kinesis Data Streamsにデータを送るプロジェクトを作成する

この記事は、[mockmockアドベントカレンダー](https://qiita.com/advent-calendar/2019/mockmock)6日目の記事です。

昨日は@cheekykorkindによる「[mockmockでAzure IoT Hubにデータを送るプロジェクトを作成する](https://qiita.com/cheekykorkind/items/2f8cffc9263044b30d99)」でした。

今回はIoTシステムでよく使われるAmazon Kinesis Data Streamsにデータを送るプロジェクトを作成してみます。

## Data Streamの作成
Kinesisの画面に行き、DataStreamを作成します。
今回は東京リージョンにシャード数１で作成します。
<img width="710" alt="スクリーンショット 2019-11-17 11.33.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/821b21a9-5ad7-a793-8411-703610394d22.png">

ストリームARNをコピーしておきましょう。
<img width="1204" alt="スクリーンショット_2019-11-17_15_54_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/05eb74af-1a9e-04ba-a7b7-20fe62fdd327.png">

## IAMユーザーの作成
mockがDataStreamにデータをputできるよう、IAMユーザーのアクセスキー情報を与える必要があります。

### ポリシーの作成
まず、ポリシーを作成します。ビジュアルエディタを使ってみます。

|項目|設定値|
|:--|:--|
|サービス|Kinesis|
|アクション|PutRecord|
|リソース|[DataStreamのARN]|
|リクエスト条件|設定なし|

<img width="1248" alt="スクリーンショット 2019-11-17 16.06.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/2f45d671-c1ac-9e2e-5957-a09548456147.png">

名前もつけておきます。
<img width="1222" alt="スクリーンショット 2019-11-17 16.07.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/bda28ee1-59f5-656b-1873-ec2dddcf0f54.png">

### IAMユーザーの作成
IAMユーザーを作成します。
アクセスキー情報を取得できるよう、「プログラムによるアクセス」にチェックを入れておきます。

<img width="991" alt="スクリーンショット 2019-11-17 16.07.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/098e7e09-33fe-5054-2559-233ba84bd3b3.png">

「既存のポリシーを直接アタッチ」を選択し、先ほど作成したポリシーをアタッチします。

<img width="1009" alt="スクリーンショット 2019-11-17 16.08.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/818908c0-bb90-1c06-7e7e-a1fe4dc1fa22.png">

その後、タグ設定画面、確認画面はそのまま通り過ぎ、作成完了画面に行きます。
アクセスキー情報をCSVでダウンロードしておきましょう。

<img width="998" alt="スクリーンショット_2019-11-17_16_08_43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/ee331e6c-efb4-9f24-d694-1cd94813a34e.png">

## プロジェクトの作成

|項目|設定値|
|:--|:--|
|プロジェクト名|[任意]|
|キャパシティ|[任意]|
|サーバータイプ|[AWS] Kinesis Data Streams|
|IAMユーザーアクセスキー|[先ほど作成したIAMユーザーのアクセスキー情報CSV]|
|AWSリージョン|ap-northeast-1|
|ストリーム名|example-stream|

<img width="835" alt="スクリーンショット 2019-11-17 16.30.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/e1c1aa06-26df-6304-54e5-c3f15ec9744e.png">

なお、IAMユーザーアクセスキーはjsonも受け付けられるようになっていますが、
これはAWS CLIでアクセスキー情報を取得したときのためです。
AWS CLIで取得するやり方は[公式ドキュメント](https:<img width="710" alt="スクリーンショット 2019-11-17 11.33.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/727fdc6a-5b17-cdb7-7b9f-f646cc751c1c.png">
//console.mock-mock.com/docs/guides/kinesis_streams)を参照してください。

## 補足
mockステータスの設定項目には、HTTPのときのPathやMQTTのときのTopicのようなものはありません。
プロジェクト以外の設定項目の違いはそれぐらいです。

<img width="818" alt="スクリーンショット 2019-11-17 16.11.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/81a0ebfe-c6b9-af54-8be4-d554ed161fde.png">

## まとめ
データを受け取るDataStreamを作り、
そこにデータをputできるIAMユーザーのアクセスキーをmockmockに渡すだけでプロジェクトが作成できます。
簡単ですね！

明日は@cheekykorkindです。
SORACOM Beamにデータを送信するときの設定方法についてです！
libnsl.so.1が無い場合

## 参考

* [GNU C Library 2.26 released [LWN.net]](https://lwn.net/Articles/729774/)
    *  glibc-2.26から含まれなくなったっぽい。
* [glibc: install the obsolete libnsl - Patchwork](https://patchwork.ozlabs.org/patch/885206/)
* [glibc アップデート方法 まとめ - Qiita](https://qiita.com/miyagaw61/items/e7e0ea017189c13fd50f)

`--enable-obsolete-nsl`

![スクリーンショット_2019-12-06_10-45-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/4e9c0618-4a29-b7cc-c142-9ba2e727dfde.png)

| distro | libc |
|:--|:--|
| CentOS 6 | 2.12 |
| CentOS 7 | 2.17 |
| Amazon Linux | 2.17 |
| Ubuntu 13.04 | 2.17 |
| Debian 8 | 2.19 |
| Ubuntu 14.04 | 2.19 |
| Ubuntu 16.04 | 2.23 |
| Debian 9 | 2.24 |

| distro | libc |
|:--|:--|
| Amazon Linux 2 | 2.26 |
| Ubuntu 18.04 | 2.27 |
| CentOS 8 | 2.28 |
| Debian 10 | 2.28 |
| Ubuntu 19.10 | 2.30 |

## なぜ libnsl.so.1 が無いのか

* ビルド時に古い glibc を使用しているため。
* CentOS8から`libnsl`で配布されるようになった。
    * CentOS7まではglibcに含まれていた。
    * CentOS7でビルドしたものは問題がなかった。

## 解決方法

### 昔作ったバイナリを使うしかない場合

```sh:CentOS8の場合
# libnsl 2.25が入る
yum install -y libnsl
```

### リビルドできる場合

* libnsl-devel は存在しない。
    * glibc-devel を `--enable-obsolete-nsl`つけてビルドすれば行けるかと思ったが、ビルドが通らなかった・・・

```sh
yum install -y dnf-utils
yumdownloader --source glibc
yum install -y --enablerepo=PowerTools glibc-static libstdc++-static texinfo
yum install -y audit-libs-devel gd-devel libcap-devel python3 python3-devel
rpm -ivh glibc*.src.rpm
cd /root/rpmbuild/SPECS/
sed -i.bak -e 's/--prefix=%{_prefix}/--prefix=%{_prefix} --enable-obsolete-nsl/' glibc.spec
rpmbuild -bb glibc.spec
```

* PowerTools リポジトリの`libnsl2-devel`も良いのかも？(自分の場合は解決につながらなかった。)

```sh
yum install --enablerepo=PowerTools libnsl2-devel
```

* libnsl.so.2 にリンクされるようになる。

## /lib64/libnsl.so.1

そのため、CentOS8でコンパイルした古いアプリケーションが(名前解決出来ずに)微動だにしない問題を経験した。

なお libnsl.so.1 は CentOS8だと `libnsl` パッケージで配布されている。


## その他

* https://github.com/thkukuk/libnsl/

をビルドすると libnsl.so.1 ではなく `libnsl.so.2` が出来上がるので解決には至らなかった。
PythonでOjiChannel

advent calendar6日目にして途絶えそうだったので3週目
## これは
ojichatのslackbotが生息するOjiChannelをつくったのでそのログ
先駆者さん(参考文献4.)がいらっしゃるが、golangあまりわからんマンなのでpython版として無理やりやる

## 前提条件
- 環境
    - Python 3.7.4
    - Docker version 19.03.2, build 6a30dfc
- 要求
    - SlackBotの導入
        - 多くのわかりやすい記事があるので割愛
        - APIトークンの取得まで
- モチベーション
    - slackで誰も返事してくれないときは、おじさんの絡みでもありがたいかもしれない

## 参考文献

1. [lins05/slackbot](https://github.com/lins05/slackbot)
2. [greymd/ojichat](https://github.com/greymd/ojichat)
3. [PythonのslackbotライブラリでSlackボットを作る](https://qiita.com/sukesuke/items/1ac92251def87357fdf6)
4. [最近流行りのojichatをslackbotにした](https://qiita.com/Minatoo/items/9ff8bbc2d1ae16c5def1)

## できるもの
![oji_demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176375/b0de0a1a-b9f1-88e6-98a9-09446f3369d5.png)

## 本編
### インストール
#### lins05/slackbot

```
$ pip3 install slackbot
```
#### greymd/ojichat
>おじさんで環境を汚したくない、Goの実行環境を持っていないなどの状況でもお手軽におじさんになるために、Dockerコンテナでもojichatを用意してある ( greymd/ojichat )。
https://github.com/greymd/ojichat

汚したくないので

```
$ docker pull greymd/ojichat
```

### slackbot実行のための用意
```
ojichannel
├── plugins
│   ├── __init__.py
│   └── ojibot.py
├── run.py
└── slackbot_settings.py
```
```python:run.py
from slackbot.bot import Bot

def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    print('start slackbot')
    main()
```
```python:slackbot_settings.py
# botアカウントのトークン
API_TOKEN = "hoge"

# デフォルトの返答
DEFAULT_REPLY = "fuga"

# プラグインスクリプトを置いてあるサブディレクトリ名のリスト
PLUGINS = ['plugins']
```

```python:ojibot.py
import subprocess
from slackbot.bot import listen_to

@listen_to('(.*)')
def greet_by_oji(message, something):
    user_info = message.user
    f_name = user_info["profile"]["first_name"]
    sp = subprocess.run( ["docker", "run", "--rm", "-i", "greymd/ojichat:latest", f_name], encoding='utf-8', stdout=subprocess.PIPE)
    # おじさんはチャンネルにポストする
    message.send(sp.stdout)
    # おじさんはスレッドにリプライする
    message.reply(sp.stdout, in_thread=True)
```

### 実行
```
$ python3 run.py
```
すべての発言に対してdocker runが動くのはよくなさそうだけど遊びアプリということで
## おわり
Slack自治厨ちゃん、オハヨー❗😃✋😄ｵｼﾞｻﾝは今日から栃木ヘ〜😃☀ (^_^)💗😚
Hack U SFC 2019でSNS作った

# はじめに
[SFCアドベントカレンダー](https://qiita.com/advent-calendar/2019/sfc)の6日目を担当するしゅんた[@____reiwa___](https://twitter.com/____reiwa___)です！
今、この記事を書いてるのは12/6ですが、なんか書くって書いておいてずっとなに書こうか迷っていたので **~~だいぶやばいです~~ 間に合いました(記事完成したのは朝7:00)。**

# Hack U SFCとは
今年の秋学期のインターネットの授業履修者（履修者じゃなくても参加可能）を対象にした、Yahooが開催しているハッカソンです。
https://hacku.yahoo.co.jp/sfc2019/
今回はこちらのハッカソンで炎上を防止するSNSを作成し、見事最優秀賞を頂くことができました🎉

# 作成したもの
炎上を防ぐSNSです。作成したものは、TwitterのようなSNSで、投稿にいいね、わるいねの評価を与えれる仕組みを作成しました。
わるいねをすると、対象の投稿の評価とその投稿をしたユーザの評価を下げ、評価が一定程度落ちてしまうと、タイムラインから消えます。
また、逆にいいねするとそれぞれの評価があがり、タイムラインによく表示されるようになります。

この仕組みによって、**皆がみたくない投稿を見えなくすること**ができます。

以下が投稿の評価の仕組みです。
![スクリーンショット 2019-12-06 5.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113524/9c8629c7-5681-e813-1aff-4281049e1759.png)

#### 面白かったりして伸びる投稿の例(画面内の数字が評価です)
![スクリーンショット 2019-12-06 6.24.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113524/5435f317-d958-4912-8e9b-a4080af41622.png)

#### 他人の気分を損ねるなどして、表示されなくなる投稿の例(画面内の数字が評価です)
![スクリーンショット 2019-12-06 6.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113524/b11cbe5f-de1a-8989-d4ca-dc3b0884e9c9.png)


# 実装

### 開発環境
![スクリーンショット 2019-12-06 5.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113524/a27f75ba-4a45-2d59-3ddc-fbf1186f9b5d.png)

バックエンドはrails+mysqlで開発し、フロントエンドはnuxt.jsを使用しました。
また、最終的にはアプリ化をしたかったためcordvaを使用して、スマホアプリとして動かしました。

###### 作成した機能

- フォロー中のユーザだけを見れるタイムライン
- すべてのゆーざの投稿を見れるタイムライン
- 通知(フォロー、リプライ)
- 投稿
- いいね/わるいねきのう
- 基本的なプロフィール設定機能(名前、bio、プロフィール画像)
- メール、パスワード変更等

などと、一般的なSNSのベースとなるものをすべて実装しました。

### ここがよかった
- 6人チームでやった割にはあまり作業をしてない人/してる人で結構皆にタスクを割り当てられたところ
- ちゃんと自分たちが作ったものの利点、欠点まで言えたところ(見えなくなるツイートのせいでコミュニティーの多様化が起きない？という欠点を発見できたところ）
- あとはもちろん優秀賞頂けたところです！！

### (おまけ)ここがやばかった
- ソースコードをOSSにしようと試みたとき、不注意でFirebaseのAPIkeyが漏れた（なのでいまはprivateにして修正してから公開します)
- **主にgitをいじってるのは3人ぐらいだけど、なんか皆めんどくさくてmasterブランチで作業してた**~~(楽しかった)~~
- 前日は徹夜。と言うか最後の2,3日はほぼ徹夜。一ヶ月開発期間あるんだから余裕もとう....




# 終わりに
以上、簡単になりましたが、今回のハッカソンで作成したものの紹介でした！
来年インターネット(某ネットの父は引退するそうですが、あるのかな？）を履修する人で参加するチャンスがあったらぜひぜひ参加してみてください！！！
当日使用した[スライドはこちら](https://www.slideshare.net/kino___ma/neopanopticon-hacku-sfc-2019-201816573)
また、このプロジェクトの[githubレポジトリ](https://github.com/akakou/neo-panopticon)を公開します。(まだprivateですが数日以内には公開する予定です！！！！）

あ、そういえば今回の景品として、m5stackを頂いたので、何かに使ってみたいです....
swiftmailerで特定ドメイン以外送らないようにする

SwiftMailerでのメール送信を利用していると、環境によっては特定ドメインだけ送るとか送らないとかそういったことをやりたいことがありました。
例えば、ステージング環境でメール送信がされるときは自社ドメイン以外はキャンセルするとかですね。

## 対処法

プラグインを自作しましょう。

```php
<?php

class FilterDomainPlugin implements \Swift_Events_SendListener
{
    public function beforeSendPerformed(Swift_Events_SendEvent $evt)
    {
        foreach($evt->getMessage()->getTo() as $email => $name) {
            if () { // 判定を入れる
                $evt->cancelBubble();
            }
        }
    }

    public function sendPerformed(Swift_Events_SendEvent $evt)
    {
    }
}
```

このようなプラグインを作ることでキャンセルができるようになります。

登録は以下のようにすればおっけー。

```php
$transport->registerPlugin(new FilterDomainPlugin());
```

Laravelの場合は

```php
Mail::getSwiftMailer()->registerPlugin(new FilterDomainPlugin());
```

から可能です。
Dockerのコンテナを全部停止するappを作る

こんにちは、こんばんは、おはようございます。
[K.S.ロジャース](https://www.wantedly.com/companies/ks-rogers)の島袋です。

複数の開発を並行、もしくはスワップ処理的に行っていると下記のようなエラーに遭遇したことはありませんでしょうか？

```sh
Bind for 0.0.0.0:3000 failed: port is already allocated
```

そうです。別々のdockerコンテナが同じポートで競合して起動できない！って状態です。
同時進行案件数が2つ、3つであれば調査は簡単です。しかし、10件、20件（そんなにコンテナ立てないだろうけど…）とコンテナが増えるほど探すのが面倒になったりしませんか？

そこで、Mac限定でありますが、シェルスクリプトを **できるだけ** 書かずにコンテナを全部止めてくれるアプリケーションを作ろうと思います。
（コマンドで一発じゃん…ってツッコミはなしでお願いします）

## Automater
Macには `Automater` というアプリを作れるアプリがあります。
正確には名前のまんまあらゆることを自動化するためのアプリです。Windowsで言えばマクロにあたるものです。
今回はこれを使って作成します。

### アプリの新規作成
まずはAutomaterを起動してアプリケーションを新規作成します。
<img width="1089" alt="Monosnap 2019-12-06 04-01-18.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103383/b12ecc51-5ced-ddb1-2001-10dcfbf6aa93.jpeg">

### 実行中のコンテナ名を取得
アクションから `シェルスクリプトを実行` を選びます。シェルは無難に `bash` を選択し、下記のスクリプトを入力。dockerのディレクトリに関しては各自の環境に合わせてください。

```sh
/usr/local/bin/docker ps --format "{{.Names}}"
```

さっそくシェルスクリプトを書いちゃいましたが、気にせず次に行きましょう。

### 変数に格納
プログラミングがお仕事の人には当たり前ですが、直前の結果を変数に格納します。
アクションから `変数の値を設定` を選びましょう。直前のスクリプトの結果を格納できます。変数名はお好きにどうぞ。

### 確認ダイアログを出す
Automaterを使う最大の理由がこのアクションです。
JSのダイアログのように、コンテナ停止前にユーザーに確認をとります。もちろんここでキャンセルを押せば処理は止まります。

<img width="710" alt="docker-container-all-stop.app（アプリケーション） 2019-12-06 04-17-41.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103383/a2e87e7f-7ea2-d6e4-387d-89016847e17b.jpeg">

ここで `変数が空であるか` の条件分岐を行うのが理想ですが、 **できるだけ** シェルスクリプトを書かない方針なので文言表記で逃げます。

### コンテナを停止
最後に停止させるための設定を行いましょう。アクションから `シェルスクリプトを実行` を選びます。はい、シェルスクリプトを書きます。

```sh
CONTAINERS="$(/usr/local/bin/docker ps -q)"
if [ -n "$CONTAINERS" ]; then
	/usr/local/bin/docker stop $CONTAINERS
fi
```

2個目のシェルスクリプトですが、 **できるだけ** 書かないという目標はほぼほぼ達成できたと考えましょう。
あとは任意の場所を指定して保存するとアプリケーションが作成されています。

## 実行
あとは他のアプリと同じようにランチャーで呼び出すなり、ダブルクリックなりで起動してしまえば下記のようなダイアログが出て、 `停止` をクリックを押して起動中のコンテナを全て停止することができます。

<img width="415" alt="Monosnap 2019-12-06 04-27-42.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103383/c378a8da-ff7b-9728-9206-55b398234428.jpeg">

## まとめ
正直最後のコマンドをワンライナーにしてしまえば良いと言えば良いのですが、アプリケーションにする利点の一つに非エンジニアでも手軽に同じような結果を得られるところにあるかと思います。
例えば、デザイナーさんにdockerの環境を導入して上げたい場合にネックになるのが、コマンドによる起動・停止・再起動になります。そこで今回のようにそれぞれのアプリケーションを作成して渡してしまえば解決できます。

ちなみにワンライナーだとこうなります。

```sh
docker stop $(docker ps -q)
```

初めてAutomaterを使ってみましたが、Automaterはチーム全体の効率化に繋がるかもと思いました。今後機会があれば業務でも使ってみたいと思います。（Mac限定がネックですが…）

## あとづけ
ちなみに弊社、Tech系以外にも会社ブログも掲載してますので、気になった方は是非どうぞ。
https://www.wantedly.com/companies/ks-rogers
[雑記]iPhoneからPeercast Gatewayで外配信をする方法

### 手順
Peercast Gateway（以下pcgwと表記）
[http://pcgw.pgw.jp](http://pcgw.pgw.jp)

1. App Storeから好きなRTMP対応のエンコーダアプリをインストール（現在のオススメはMediaLink Live）

1. Safari等のブラウザからpcgwにログインして普通にリレーを建てる

1. 以下、MediaLink Liveの利用を想定して解説する

1. 起動 → 右上の歯車アイコン → Manage Destinations → Add Destinations → RTMP Serverの順に移動

1. Custom RTMP/RTMPS の画面で以下の内容を入力
Name： 任意の名前
Server URL： pcgw指定のrtmp:~で始まるメディアURLを入力
Stream Key： pcgw指定のストリームキーを入力
Username： 空欄
Password： 空欄

1. 右上のDoneをタップして設定を保存
1. 右上の歯車 → ENCODERの欄からビットレート等を設定（Key Frame Intervalは2秒？）
1. 設定が終わったら最初の画面に戻って左上のGo Liveをタップして、手順5の設定を選んだら配信開始

### その他
- MediaLink Liveは無課金だと配信画面の右下にアプリのロゴが表示されるっぽい
- NabiLiveってアプリだとビットレートや解像度が固定になるっぽいのと広告がうざいが、配信画面にロゴが表示されないのと、同ビットレート・解像度のMediaLink Liveと比べて画質が綺麗な気がする
- AndroidからでもRTMP対応のエンコーダアプリがあれば配信できるけど、iOSの場合と同様で配信できないアプリもある（キーフレーム間隔が関係してる？？）
- iPhoneからMediaLink LiveやNabiliveで配信する場合は配信中にレス読みができないので別途レス読み用の端末を用意する必要がある（脱獄とかをした場合はしらん）
- 他に良いエンコーダアプリやレスが読めない問題を解決する方法があったら教えて下さい
- [こういうもの（動画リンク）](https://www.youtube.com/watch?v=GPIXsVgCE_I)を使えばHDMI出力を備えたビデオカメラやアクションカムからも配信できるかも（未検証）

追記（2020/4/12）
iPhone11シリーズでStreamlabsを使えば広角レンズを使って配信することができる。しかしリスナーが配信を視聴する際、PCRPlayerで再生する場合はオプション→詳細設定→「GPU動画再生支援(DXVA2)を有効にする」のチェックをはずす（無効にする）必要があるので、配信の際はリスナーに注意喚起が必要になる。しかしその反面、画面にテキストや画像やウィジェットを表示できたり、スクリーンキャプチャ（画面取り込み）で配信ができたりと非常に多機能。こちらもMedialLnk Liveと同様で無課金の場合は画面にロゴが表示される。
VBA - LSetで遊ぶ

#LSetできること
LSetステートメントの基本的な使い方は固定長の文字列変数に左詰めで文字列をセットすることです。…が実はLSetを使うとユーザー定義型の変数に別のユーザー定義型の値を代入することができます。実際公式ドキュメントには以下のような記述があります。(推奨はされていません。)
>ユーザー定義型の変数を別の変数にコピーする場合、要素に指定されているデータ型は考慮されず、一方の変数のバイナリ データがもう一方の変数のメモリ領域にコピーされます。

例えばVBAのDouble型のサイズは8バイトで内部的にはIEEE754という規格に基づいているようなので，3.1415という浮動小数点数を表すバイナリデータは
$${\rm 40, 09, 21, CA, C0, 83, 12, 6F}$$
になります。バイトオーダーはリトルエンディアンなので内部的にはこの8バイトを右から順に並んでいることになります。
一方，固定長配列は連続したメモリ領域にその要素が配置されるので上記の8バイトのデータを右から入れた長さ8のByteの配列を考えると，これはバイナリデータとしてみれば3.1415と同じ内部表現を持っているはずです。
したがって，公式ドキュメントによれば，上記のバイトの配列を要素に持つユーザ定義型をDoubleを要素にもつユーザ定義型にLSetで代入すれば，後者のDoubleには3.1415が入ることになります。自由度は劣りますがWIN32 APIのRtlMoveMemoryみたいなことができるわけですね。

#実験用コード

```visualbasic
Option Explicit

Public Type AType
    value As Double
End Type

Public Type BType
    value(7) As Byte
End Type

Public Sub test()

    Dim a As AType
    Dim b As BType
    
    b.value(0) = &H6F
    b.value(1) = &H12
    b.value(2) = &H83
    b.value(3) = &HC0
    b.value(4) = &HCA
    b.value(5) = &H21
    b.value(6) = &H9
    b.value(7) = &H40
    
    LSet a = b
    Debug.Print a.value '3.1415
    
End Sub

```
OpenMX3.9をMacBook proでmakeする(macportsでScaLAPACK+openMPI)

#OpenMX3.9がmake出来ない
[OpenMXのサイト](http://openmx-square.org/)
hikaruriがトポロジカル不変量の計算コードでcontributeしたOpenMX3.9がリリースされました。
早速自分のMacBookProでも使おうと思い、ver. 3.7と3.8と同じmakefileでmakeしようとした所、どうやら上手くいかない。原因は今回のバージョンからScaLAPACKが必要らしく導入する必要があるらしい。
[MKL](https://kygraphy.com/ja/c-cpp/intel-mkl-on-mac-2/)を入れるのが一番簡単で確実らしいが、MPICHにしか対応してないようだ。
MacPorts+OpenMPIを使って(手軽に)導入したときの方法をメモ。
#環境
Mojave 10.14.4
MacPorts 2.6.2
gcc 8.3.0
openmpi-gcc8 @4.0.1_0+fortran

#ScaLAPACKを導入
デフォルトだとMPICHを指定するようなので、variantsを指定するのを忘れないように

```
port install scalapack +gcc8 +openblas +openmpi
```
Buildする場所で失敗(わざと失敗させる)。
[Mac portでのOpenMPIを使ったScaLAPACKのインストール](https://github.com/t-sakashita/rokko/issues/338)
にあるように、MPIの部分でインストールに失敗するので、パッチを充てる必要がアリ。パッチファイルをダウンロードして、インストール中のscalapack-2.0.2のディレクトリを探す。パッチコマンドをscalapack-2.0.2の上で実行。

```
patch -p0 < ~/scalapack-2.0.2-patch.txt 
```
そしてもう一回

```
port install scalapack +gcc8 +openblas +openmpi
```
を実行してScaLAPACKが入ります。

追記(2020/3/17)
ld64が必要になる場合もある
https://github.com/wistaria/MateriAppsInstaller/issues/66

#OpenMXのmake
openmx3.9のmakefileのLIBに-lscalapackを付け加えると無事にmakeが通ります。

```
CC = mpicc -O3 -fopenmp -I/opt/local/include -I/usr/include
FC = mpif90 -O3 -fopenmp -I/opt/local/include -I/usr/include
LIB = -L/opt/local/lib -lfftw3 -llapack -lblas -lgfortran -lmpi_mpifh -lscalapack
```

#終わりに
1. OpenMXのInstallのサポートページが欲しい
1. 単列版も出して欲しい
1. 自分のコードを使って欲しい
BigQuery で Google Analytics 的な session をカウントしてみる #1

## 何をやる？

Google Analytics のセッションの定義( https://support.google.com/analytics/answer/2731565?hl=ja )である、

- (定義1) ユーザーが何も操作を行わないまま 30 分が経過するまで持続
- (定義2) ユーザーの操作が行われたら有効期限はその時点から30分後にリセットされる
- (定義3) 1日の終わりによる期限切れ

の感じの session のカウントを BigQuery でやってみようという企画。

今回の ```#1``` では定義1,2を行います。

## 準備

### schema.json

```
[
  {"name": "datetime", "type": "TIMESTAMP", "mode": "required"},
  {"name": "user_id", "type": "string", "mode": "required"}
]
```

## data.json

```
{"datetime":"2019-11-30T00:00:00","user_id":"a"}
{"datetime":"2019-11-30T00:29:59","user_id":"a"}
{"datetime":"2019-11-30T01:00:00","user_id":"a"}
{"datetime":"2019-11-30T01:30:00","user_id":"a"}
{"datetime":"2019-11-30T00:00:00","user_id":"b"}
{"datetime":"2019-11-30T00:00:10","user_id":"b"}
{"datetime":"2019-11-30T00:30:09","user_id":"b"}
```

## テーブル作成&データロード

```
bq load --source_format=NEWLINE_DELIMITED_JSON YOURPROJECT:YOURDATASET.access_log ./data.json ./schema.json
```

## SQL を書いていってみる

同一ユーザーの一つ前の access が 1800 秒以上前ならば、新しいセッションというフラグをたてる。
という Query を書いてみます。以下の様になります。

```
  -- #3
SELECT
  user_id,
  ((datetime - prev_seconds) / (1000*1000) )as duration_sec,
  IFNULL(datetime - prev_seconds >= 30 * 60 * 1000 * 1000, TRUE) AS start_of_session,
  datetime,
  prev_seconds
FROM (
    -- #2
  SELECT
    user_id,
    datetime,
    LAG(datetime, 1) OVER(PARTITION BY user_id ORDER BY datetime) AS prev_seconds
  FROM (
      -- #1
    SELECT
      *
    FROM
      [YOURPROJECT:YOURDATASET.access_log] ) AS activity_log)
```

そしてこの Query の結果は、

<img width="714" alt="Screen Shot 2019-12-06 at 2.47.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18869/db69b54c-b766-393a-700a-56a75dbd0143.png">

こんな感じになり、無事 start_of_session = true というフラグがつきました。

## 次回

次回は定義3をやります。
Linux標準教科書メモ1 その2

## Linuxが生まれるまで
AT&Tのベル研究所Linuxの元となったUNIXが誕生しました。UNIXはソースコードを配布していたので多くのユーザーが自由に改造できました。しかし、多くのUNIXが作成され、まとまりがなくなったのでAT&Tがライセンス契約をしてUNIXの管理を始めました。

UNIXの多くは高いライセンス料を支払う必要がありました。そんな中、1991年にLinus TorvaldsがUNIXに非常に似たOSであるLinuxを開発しました。Linuxはフリーソフトウェアライセンスとして配布され、多くのユーザーに開発、使用されるようになりました。

## Linuxの特徴
OSは「カーネル」と「ユーザランド」の二つの領域に分けることができます。

### カーネル
OSの中核となるシステムで、ハードウェアと直接やりとりをする中心的な機能を受け持つ部分です。カーネルはハードウェアの違いを吸収して、プログラムがどのようなハードウェア上でも動作するようにする役割がある。
ハードウェアはキーボードやマウス、通信回線などを指し、デバイスドライバというプログラムが各ハードウェアの違いを吸収してくれる役割がある。

### ユーザランド
OS中のカーネル以外を指し、ファイルシステムやファイル操作コマンド、シェルなどのソフトウェアのことです。
Linuxはコマンドで操作することができ、ユーザランド上で動作している。

### シェル
Linuxにはシェルという対話型のコマンド入力環境が用意されています。入力されたコマンド受付、実行、ユーザに結果を返します。

## ディストリビューション
Linuxはそのままインストールして使用するのは非常に困難なものだったため、使用する上で必要なプログラムをまとめたものがLinuxディストリビューションです。
代表的なものでUbuntuやRed Hutなどがあります。

### パッケージ
Linuxに追加機能を提供するものです。Linux上で応用ソフトウェアを実行する場合、元となるソースコードをダウンロードして変換する必要があります。しかしこれではとても手間がかかってしまうので、最初からソースコードを変換してまとめたものが**パッケージ**です。

### パッケージマネージャ
応用ソフトウェアを導入するには、その動作を補助してくれる他の応用ソフトウェアも一緒に導入する必要があることがあります。これを依存関係といい、各応用ソフトウェアを正しい順番と場所に保存する必要がありました。あるいは更新されたプログラムがあれば、古いバージョンは削除する必要が出てきます。これらの作業を簡単にしてくれるのが**パッケージマネージャ**です。
初学者がDocker on Railsで開発したアプリをAWS EC2にデプロイする際につまづいたこと

# はじめに
私はプログラミングを半年弱ほど独学している者です。
今回、Rails + Dockerで開発したアプリケーションをAWS EC2にデプロイするところでつまづき、まる一週間を浪費してしまいました。
この記事が、同じようにつまづいている方の一助となれれば幸いです。

また、今回作成したアプリケーションのソースコードは以下のURLからご覧いただけますので、良いコードではございませんが参考にできそうな部分があれば、参考にしてみてください。

https://github.com/aiirononeko/GoodCoffeeByGoodBarista

# ①production環境で動作する設定にしていなかった
基本中の基本すぎて笑えてきます...笑
いや、笑えません...。
実際production環境で動作するように設定をしておらず、この一週間を溶かしたと言っても過言ではありません。
一番最初にデプロイしたときは、productiond環境で立ち上がってすらおらず、RDSとの連携ができなくてつまづいてました。

Docker on Railsで開発したアプリケーションをproduction環境で立ち上げる方法は以下の記事を参考にさせていただきました。
config/environments/production.rbの設定項目から、docker-compose.ymlの記述方法まで必要なことはこれだけでした。

[railsをproductionモードで起動する[Rails 5.2]](https://qiita.com/hiroky_814/items/daeb57a360ded478aea6)

# ②全体の構成が想像もつかなかった
今回私は、EC2とRDSを使用した最もシンプルな形でデプロイをしました。
しかし最初は、全体像が想像できず、最初の一歩を踏み出すのにかなり時間がかかりました。
というのも、「DBコンテナがあるのにDBサーバーであるRDSは必要なのか？」とか、「NginxはEC2に直接インストールするのか、ローカルと同じようにNginxコンテナで動かせばいいのか？」とか、初心者ならではの疑問だらけでした。
この疑問に対して、参考にさせていただいた記事が以下の通りです。

[無料！かつ最短？で Ruby on Rails on Docker on AWS のアプリを公開するぞ。] (https://qiita.com/at-946/items/1e8acea19cc0b9f31b98)


# ③RDSとの連携がうまく行かなかった
上記のサイト（[無料！かつ最短？で Ruby on Rails on Docker on AWS のアプリを公開するぞ。](https://qiita.com/at-946/items/1e8acea19cc0b9f31b98)）に沿って進めていく中で、コンテナを起動する項目でつまづきました。
つまづいた内容としては、
docker-compose run web rails db:create
docker-compose run web rails db:migrate
上記のコマンドではRDSとの通信が正常に行われず、ソケット通信でエラーが発生してしまいました。
具体的には、mysql.sockがないよ〜！というエラー内容でした。

こちらのエラーを解消してくれたのがrakeコマンドでした。
上記のコマンドを、
docker-compose run web rake db:create
docker-compose run web rake db:migrate
にするだけでうまいことRDSのMySQLと連携してくれて、無事にデータベースを作成することができたのです。

### railsコマンドとrakeコマンドの違いとは
これについては下記の記事に詳しいです。

[binって何？railsとrakeって何？（前編）](http://song-of-life.hatenablog.com/entry/2017/04/28/111445)
[binって何？railsとrakeって何？（後編）](http://song-of-life.hatenablog.com/entry/2017/04/28/111445)

個人的にはどこかで聞いたことがあったけど、そういえばそうだったなあくらいの知識でした。
でも、今回使用したのがrails5.2だったので、rakeはrailsに統合されてるからrailsでもよかったんじゃ...？と思えてきました。
bin/を付けなかったからでしょうか？
これについては知識が不足しているので、個人的に解決しておくべき課題です。

# おわりに
なんとかデプロイできてよかったです。
デプロイできた時には思わず叫びました笑
今後はRoute53を使用した独自ドメインの設定から、HTTPSに対応させたりなんなりしていきたいです。
アプリ自体もまだまだ実装し切れていないところばかりなので、就職活動をしながらガシガシ実装していきます。
とりあえず直近で、circleCIでの自動ビルド＆自動テストと、capistoranoでの自動デプロイを実現したいです。
laravel+vue+vuetify設定#1

# Laravel
laravelは最近6系が主流になってきましたが、一番使われているのは5系だと思います。
自分も職場の現場では5.8を使っているため、5.8をインストールしていくことを前提に書いていきます。

## Install
laravelの正式文書に書いているがおさらいで必要な部分だけ書きます。

### laravel installer設置
```
composer global require laravel/installer
```

### バージョン指定laravelのInstall
```
composer create-project --prefer-dist laravel/laravel blog "5.8.*"
```

## 設定

### 権限設定

```
#storageフォルダー
chmod -R 777 ./storage
#cacheフォルダー
chmod -R 777 ./bootstrap/cache
```

### 必要なモジュール設定

#### php

```
composer install
```

#### javascript

```
npm install
```

### laravel key作成
```
$ php artisan key:generate
Application key set successfully.
```

## おさらい
ここまで行って動作するかを確認するため、サーバーを立てます

```
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```

http://127.0.0.1:8000
ブラウザに入力しLaravelの初期画面が表示されたら、まずはlaraelの初期設定は完了！
次はlaravelのfront部分を担当するフレームワークにvuejsを設定していく内容を書きたいと思います。
CentOSのApacheで、ActiveDirectory連携のベーシック認証ができなくなった

# はじめに
普段はDebian系のOSを使っているのですが、久しぶりにCentOSを使う必要があり、SELinuxにやられたので書きます。

`getenforce 0`をしてSELinuxを無効化すればいいよ、的な記事が世の中にはたくさんあるみたいですが、SELenuxの無効化はしません。


# 今回起きたこと
閲覧を特定の人に制限するために、ApacheでActiveDirectory(LDAP認証)と連携してベーシック認証をおこなうページを作成しました。
だいたい以下のような感じの構成で順調に動いていました。ADは同じLAN内の別サーバです。

**環境**
- CentOS 7.7
- Apache2.4
- mod_auth_ldap

ある日、社員さんから「認証ができなくなった」と報告がありました。確認すると、ベーシック認証のダイアログは表示されますが、認証はできず `500 Internal Server Error` と表示されてしまいます。

# 調査

## Apacheのログの確認
とりあえず、ログを見てみます。特に何もありません。

## PHPのプログラムの確認
次に、Apacheでのベーシック認証は完了しているものの、PHPのプログラムのロジックに問題があるのでは考えてPHPのプログラムを確認してみました。
[ログの出力レベルの設定](https://qiita.com/iwason/items/8dc9f62b4118186cf2df)をして確認しましたが、プログラムには問題なさそうです。

## LDAPモジュールのエラーの確認
次に、LDAPモジュールのデバッグオプションを有効にしてみました。Apacheの設定ファイルに以下を追加します。

```
LDAPLibraryDebug 7
```

<br>
以下のようなログが表示されました。正しく通信できてないぽいですね。

```
ldap_create
ldap_simple_bind
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP <ip_address>
ldap_new_socket: 16
ldap_prepare_socket: 16
ldap_connect_to_host: Trying <ip_address>
ldap_pvt_connect: fd: 16 tm: 10 async: 0
ldap_ndelay_on: 16
attempting to connect: 
connect errno: 13
```

<br>
「ldap connect errno: 13」とGoogleで検索すると、[StackOverflowののページ](https://stackoverflow.com/questions/28684736/php-ldap-connection-cant-contact-ldap-server) が出てきました。ページに記載があるように、以下のコマンドを実行してみると、無事解決しました。

```
setsebool -P httpd_can_network_connect on
```

httpd_can_network_connectは、Apacheプロセスで動作するHTTPスクリプト・モジュールから外部への通信についてのポリシーのようです。


# おわりに
別の社員さんに確認すると、OSのアップデートをしたとのことでした。OSのアップデートで設定が書き換わるなどしたのかもしれません。

CentOSで困ったときは、まずはSELinuxを疑ってみるのが良いかもしれません。
nuxt+storybookの環境構築に成功しました

(成功しただけで知見にまとめねばと思える、このフロントエンドのディストピア感はなんだ…)


これです
https://github.com/hikaruna/nuxt-storybook-example

以上
といってはあれなので

## コンセプト
### nuxtとstorybookをきれいに共存させるのは面倒(ってか無理)だから別パッケージにしよう
はい。もうむりですわ。
頑張って調整して動かしたところで

- なんでテスト(デモ)環境のための設定うんぬんで、本番環境の設定をいじってしまっているの？
- 動いたとして、それ、本当に正しく動いているの？たまたまうごいているんじゃないの？

となります。
そもそもnuxtもstorybookもまともなパッケージ構造をしていない(私はそう思っているが認識が間違ってたら教えてください)ので、ちゃんとしたものなど作れるわけがない

- nuxtがだめな点: vueをpeerDependencyにしていない
- storybook(今回は@storybook/vue)がだめな点: 最終的にreactなど全く関係ないものをpeerDependencyに入れている

もうめちゃくちゃである。

#### なので
せめて本番環境(nuxt)だけは守りきろう。nuxtはnuxt単体で使ってnuxtにすべてを捧げる文には問題ない。
よってパッケージ構造を storybook-project -> nuxt-project とすることを思い至った。

### npm-registyに上げるのは面倒だからyarn-link(npm-link)で済ませよう
storybook-project -> nuxt-project というパッケージ構成にするとして、わざわざそのためだけにnpmにpublishするわけにもいかない。
最近ではgithubがnpm-registyやってくれているのでだいぶマシなんですが、それでも手元で確認したいだけのために、remoteにpublishしたくない。

そういうときにための仕組みがnpmには用意されています。

yarn-link(npm-link)、ローカルで開発するとき便利ですよー。
https://docs.npmjs.com/cli/link.html

### yarn-link(npm-link)をいちいちやるのは面倒だからDockerで環境を作ってしまおう
yarn-link(npm-link)って要するにnode_modulesのなかにsymlink貼るだけなので、その後でyarn-installし直したりしたら消えちゃうので、毎回貼り直さないといけない。
など、気にしている時点で、脳みそのカロリーがもったいないので最初からDockerで作ってしまおう

## 構築手順(Dockerは一旦抜きで)

```console
[app/] $ mkdir nuxt-project
[app/] $ cd nuxt-project
[app/nuxt-project] $ echo '{ "name": "nuxt-project", "version": "0.0.1" }' > package.json
[app/nuxt-project] $ yarn add nuxt
[app/nuxt-project] $ mkdir pages
[app/nuxt-project] $ vi pages/index.vue
```

via: [nuxt#スクラッチで始める](https://ja.nuxtjs.org/guide/installation#%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%83%E3%83%81%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B)

```console
[app/] $ mkdir storybook-project
[app/] $ cd storybook-project
[app/storybook-project] $ echo '{}' > package.json
[app/storybook-project] $ yarn add vue
[app/storybook-project] $ yarn add -D vue-loader vue-template-compiler @babel/core babel-loader babel-preset-vue
```

via: [storybook/vue#マニュアルセットアップ](https://storybook.js.org/docs/guides/guide-vue/#manual-setup)(←ただこれは設定ファイル名とstory.jsファイル配置が不整合で動かない、不備ドキュメントなのでそこだけ注意! (この記事執筆時点では))

```console
[app/nuxt-project] $ yarn link
```

```console
[app/storybook-project] $ yarn link nuxt-project
```

## 動かし方

### nuxt dev server

```console
[app/nuxt-project] $ npx nuxt
```

### storybook server

```console
[app/storybook-project] $ npx start-storybook
```

## まとめ
どうでしょう、下手に何も工夫しなくても、公式ガイドの最小インストール手順でそのまま動いた。

## Dockerを交えた環境構築手順

最初に貼った私のexampleプロジェクトのとおりです。