OmniAICreator/Qiita-1.07M huggingface dataset:
新卒1年目がオレオレツールをHomebrewで公開してみた

# TL;DR
オレオレツールをリプレースしたついでにHomebrewで公開したので公開手順等をまとめておきます。

# 作ったオレオレツール

## toyotter
まだプログラミングの右も左も分からない大学1年生の頃~~講義中Twitterしててもバレないため~~にPythonで作ったターミナルからTwitterの操作ができるオレオレツール([legacy-toyotter](https://github.com/KeisukeToyota/legacy-toyotter))をTwitter APIの仕様変更による対応とGo言語の勉強ついでにリプレースしました。

↓ 作ったもの
[toyotter](https://github.com/KeisukeToyota/toyotter)

`$ toyotter tl`でタイムラインの取得や`$ toyotter tw "Hello world"`でツイートができたりします。

![スクリーンショット 2019-05-13 18.31.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211748/5598af7e-d137-9dec-f259-766ceba9a125.png)


## そもそも作った経緯
CUIベースのTwitterクライアントは別にわざわざ自作しなくても既存のものでいくつかあります。大学1年生の頃最初は橋本商会さんの[tw](http://shokai.org/blog/archives/6513)(Ruby製)を使っていました。ですが、プログラミング始めたてだったこともあり、よくわからずにPCをいじり倒しすぎてGem自体がぶっ壊れる事態となり`tw`が使えなくなってしまいました。そこで使えなくなってしまったならば作ればいいという発想にいたり唯一勉強していたPythonで自作したわけです。これが初めてある程度形にしたアプリケーションになり大変勉強になりました。

そういう経緯もあり、プログラミングを始めたての人にはWebアプリケーションではなくCUIベースの自分がほしいと思うオレオレツールの開発を勧めています。CUIベースのオレオレツール開発の利点として、

1. Webアプリケーションほど時間がかからずサクッと動くものが作れる
2. 基本的に自分しか使わないからエラー処理など気にせずカッチリ作る必要がない
3. Webアプリケーションのように覚えることが少なく小さく使えるものが作れる

などが個人的には利点だと思っています。

# Homebrewでの公開

## tapの作成
Homebrewの本家で公開するのはPR出したりある程度スター数が必要だったり何かとハードルが高いのでtapを作成します。手順は以下の通り

1. Githubで`homebrew-xxxxx`のリポジトリを作る。今回だと`homebrew-toyotter`になる。
2. `$ brew tap <github_name>/homebrew-xxxxx` でtapを作成する。今回だと `$ brew tap keisuketoyota/homebrew-toyotter`になる。<br>
※(私の場合アカウント名は`KeisukeToyota`なので `$ brew tap KeisukeToyota/homebrew-toyotter`のはずですが、自動的に全部小文字に変換されました。)

## インストールスクリプトの作成
先程作った`homebrew-xxxx`のリポジトリにインストールスクリプトを追加します。手順は以下の通り

1. 公開するアプリケーションと同じ名前の`xxxxx.rb`を作成する。今回だと`toyotter.rb`になる。
2. 以下のようにスクリプトを書く。適宜`toyotter`になっているところを書き換えてもらえば動くと思います。

```ruby
require "formula"

HOMEBREW_TOYOTTER_VERSION='0.0.1'

class Toyotter < Formula
  url "https://github.com/KeisukeToyota/toyotter/releases/download/v#{HOMEBREW_TOYOTTER2_VERSION}/toyotter2_#{HOMEBREW_TOYOTTER_VERSION}_Darwin_x86_64.tar.gz"
  homepage "https://github.com/KeisukeToyota/toyotter"
  sha256 "46b958c5e203307e82e3661fbc2a124b71f38228cd4599cc4f950f60fcdfb864"

  version "v#{HOMEBREW_TOYOTTER_VERSION}"
  head 'https://github.com/KeisukeToyota/toyotter.git', :branch => 'master'

  def install
    bin.install 'toyotter'
  end

end
```

3. sha256を書き換える。`$ openssl sha256  toyotter_0.0.1_Darwin_x86_64.tar.gz`でハッシュ値を生成しました。
4. コミットしてプッシュする。

## インストール
### 初期インストール
```shell
$ brew tap <github_name>/homebrew-xxxxx
$ brew install xxxxxx
```

### アップグレード
```shell
$ brew upgrade xxxxxx
```

# おわり
だいたいこんな感じでHomebrewで初めてオレオレツールを公開しました。(特に手順を記録していなかったので間違ってるかもしれないので間違ってたらコメントか編集リクエストください…)

しかし、毎回リリースのたびに各プラットフォームごとにビルドしてタグ付けしてhomebrew用のリポジトリも書き換えてハッシュ値生成してとすごくめんどくさい…

そこで[goreleaser](https://github.com/goreleaser/goreleaser)を利用することでこのめんどくさい手順をほとんど省略できることを知ったのでまた時間があれば`goreleaser`についても紹介しようと思います。

# 参考
- https://qiita.com/saa/items/85ed5e914d424fbf9fd6
- https://qiita.com/sakajunquality/items/48b5138986056eb4b49c
[Dev. Op.] 開発タスクの整理 Epic, Feature, Story, Task, Bug

開発プロジェクトを進めていく上でタスクの整理はとても重要です。（ので今後も追記していきます）

Visualstudio.comを利用していますが、他の類似開発プロジェクト管理サービスでも同じことが言えるで参考にしてください。

開発するモノ＝Tasg（もしくはBug改修項目）、が最小粒度のものとしたときに、それを束ねるStory、さらにそれを束ねるような形でFeature, そしてEpicと区分することによって開発側もプロマネ側も円滑な意思疎通をすることができます。

# 各区分
こうじゃないとダメ！というものはありませんが、基本概念として下記を参考にしてください。

## Epic
巷でマイルストーンと言われるものはEpicと言っていいでしょう。Epicのタイトルは「正式版リリース」という類。

## Feature
直訳すると機能区分みたいなものです。基本1-3回のsprintに分けられる粒度です。Featureのタイトルは「在庫管理機能搭載」という類。

## Story
開発者じゃない人がみてもわかるような機能区分です。1sprintで完了する粒度です。 Storyのタイトルは「在庫管理ができるようになる」という類。

## Task or Bug
こちらは完全に開発マターの作業単位です。タイトルは開発にお任せしますが、見積もりの工数はタスクの積み上げなので、一度の作業で終わる単位に分解することをお勧めします。

# 担当

一般的な開発プロジェクトは下記の構成
- 依頼主（ビジネス側）
- 依頼一次受け・受取窓口（プロマネ）
- 開発（開発＋テスター）

Epicは**全員**が認識するべき項目で、**日付**が決まっています。
**プロマネ**は、Epicにまつわる要件(requirement = Features)を整理し、そのFeaturesをStoryに分解して**全員**と認識をすり合わせます。

それを理解した**開発者**もしくは開発責任者は各Storyに対して必要なTaskを入れ込み、各Taskの工数を見積ます。積みあがった数字をStoryに、Featureに、そしてEpicに追加していきます。

テスト等を通じてあがってきたバグは一旦テスト実行日を1Storyレベルでまとめて**テスター**がBugとして起こします。TaskレベルになっているBugをStoryレベルに開発責任者が仕分けをしてアサインをします。アサインをされたら必ず見積時間を確認するようにします。

# 備考
サービスの場合、リリース番号の管理も同じようなコンセプトもっています。 たとえばVersion 1.2.3.4 となるときは、　2=Epic, 3=Feature, 4=Sotryといった感じに上げていく。リリース時に新しいFeatureはなくてStoryレベルのみの更新であれば 1.2.3.5。Featureレベルの更新も含む場合は1.2.4.0といった具合に。
PowerShellでブレース展開ができなかったのでググった

**注意**
題名の通りPowerShellでブレース展開をしようとしたらエラーがでたのでやり方をググっただけの内容です。
また、私はPowerShellもunixも初心者ですので、間違っている、もっといいやり方があるなどはご指摘お願いいたしますm(_ _)m

---

参考にした以下のページそのままです

- [Powershell equivalent of Bash Brace Expansion for generating lists/arrays - Stack Overflow](https://stackoverflow.com/questions/16222477/powershell-equivalent-of-bash-brace-expansion-for-generating-lists-arrays)

コマンドの解説はコメント欄の@nukie_53 さんを参照してください！

# ブレース展開とは

このように展開してくれるコマンドの書き方

```bash
$ echo {1..9}
1 2 3 4 5 6 7 8 9

$ echo type-{a,b,c}
type-a type-b type-c
```

# ググった内容

```bash:bash
npm i -D @babel/{cli,core,plugin-proposal-optional-chaining}
```

bashだとこの書き方で、`@babel/cli` `@babel/core` `@babel/plugin-proposal-optional-chaining`の3つをnpm installできるようなのですが、PowerShellではエラーになりました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/fe13ef41-d60a-96cf-0a9d-5efbf561b2d5.png)

参考にしたページ通りに書き直す

```powershell:powershell
npm i -D ("cli","core","plugin-proposal-optional-chaining" | % { "@babel/$_" })
```

無事にコマンドが動いて問題なく使えました

![toggle_wrapping_of_cell_contents.gif](https://qiita-image-store.s3.amazonaws.com/0/142910/965b2aa1-47e1-8c4f-eabd-1f73febd384b.gif)

読んでいただいてありがとうございますm(_ _)m

---

参考

- [Brace Expansionが便利 - Qiita](https://qiita.com/__nagamee/items/bec89945f70f5dffe9c5)
- [#24 ブレース展開を使ってみよう | UNIXコマンド入門 [一般ユーザー編] - プログラミングならドットインストール](https://dotinstall.com/lessons/basic_unix_v2/41624)

---

**実行したバージョン**
Windows10 バージョン 1803
Vimのswap（メモ）

vimを使っていて時々、

```terminal
E325: ATTENTION
Found a swap file by the name "~~~~~~~~~"
          owned by: root   dated: Wed Oct  31 14:28:09 2018
         file name: ~~~~~~~~~
          modified: no
         user name: root   host name: ○○○
        process ID: 74234
While opening file "~~~~~~~~~"
             dated: Wed Oct  31 14:32:51 2018
      NEWER than swap file!
```

こんな警告文が出る。

「スワップファイルがありますよ！」って言われている。
これは何なのか。

スワップファイルとはバックアップのようなもの。

変更内容を保存せずに強制終了してしまった場合などに、
その変更を残したファイルを自動で残してくれるらしい。

なんと優しい。

このファイルを開こうとするといくつかの選択肢が提示される。

O,E,R,D,Q,A　のいずれかだ。




O(open)
オリジナルファイル（変更内容が保存されていない状態のファイル）の現在の状態を確認する。
E(edit)
オリジナルファイル（変更内容が保存されていない状態のファイル）を編集する。
R(recover)
ファイルを強制終了前の状態に復元する。
D(delete)
スワップファイルを削除する。
Q(quit)
ファイルを開くのをやめる。
A(abort)
作業を中止する。




基本は、R→Dで強制終了前の段階にもどせばいいんじゃないかな。
異なるデータフレーム間でNan値も含めて値を上書きする

https://teratail.com/questions/80873

NaN値でない値のみ上書きしたい場合は上記質問の通りDataFrame.update()が良い。
NaN値も含めてそっくり上書きしたい場合は、indexとcolumnsを指定すれば良い。

```python

callerA = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'],
                        'A': ['A0', 'A1', np.nan, 'A3', 'A4', 'A5'],
                      'B': ['B0', 'B1', 'B2', 'B3', 'B4', 'B5'],
                      })
callerB = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'],
                        'A': ['A0', 'A1', 'A2', 'A3', 'A4', np.nan]})
callerA.loc[callerB.index, callerB.columns] = callerB

callerA

```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/177689/ded1d8ef-a1ad-6bb9-42ac-487e2902061b.png)

ちゃんとNaN値で更新されている。
Google Colabでまた日本語表示が豆腐不可避な方に

## 1.想定する読者
* 以下の記事を見てgoogle colabの日本語化を済ませたのに、また**2019年年明けから豆腐に悩まされている皆様(筆者含む)。**
  * Colaboratoryでmatplotlibの日本語表示
  * https://qiita.com/unvavo/items/a907cb927bdadc1d8d0c　
* 尚、上記記事には大変お世話になりました。助かりました。

## 2.結論:matplotlibがver.3以上だとfont cacheが「fontlist-v300.json」に変更
* 上記記事にあるようにfont cacheを消しても意味がないです。
* 
``` NG.py
# このコマンドだと豆腐不可避
rm /root/.cache/matplotlib/fontList.json
```

* matplotlibのcacheに-v300と書いてある見慣れないファイル、これが本来消すべきfont cacheです。

``` ls.py
!ls -ll /root/.cache/matplotlib/
-rw-r--r-- 1 root root 46110 Jan 17 17:06 fontList.json
-rw-r--r-- 1 root root 29351 Jan 17 17:06 fontlist-v300.json # これが目標物です
drwxr-xr-x 2 root root  4096 Jan 17 17:06 tex.cache
```

* 執筆時点(2019年1月)でgoogle colabにデフォルトでインストールされているmatplotlibのVersioonは3.0以上になっており、cacheファイルが変更になっています。

``` pipfreeze.py
!pip freeze
~(中略)~
matplotlib==3.0.2 # バージョンが3以上
~(中略)~
``` 
## 3.matplotlib ver.3以降の新たな日本語表示手順
``` success.py
# 日本語フォントをダウンロードする。
!apt-get -y install fonts-ipafont-gothic

# キャッシュを削除する。
# !rm /root/.cache/matplotlib/fontList.json　# 旧cache
!rm /root/.cache/matplotlib/fontlist-v300.json # 消すべきcache

# ランタイムを再起動する。
``` 
* 削除するキャッシュさえ間違わなければ解決できます。

## 4.before-after
* 旧手順。相変わらず豆腐まみれです。
![qiita20190121b.PNG](https://qiita-image-store.s3.amazonaws.com/0/10574/87558622-8129-757b-7648-83d9c4e603f1.png)


* 新手順。豆腐が解消されています。
![qiita20190121a.PNG](https://qiita-image-store.s3.amazonaws.com/0/10574/74f05458-f3b1-dd7e-3a35-411fd6fb0576.png)

以上です。
PHP: 128MBなど巨大なダミーファイルを生成する方法

データ読み込みのテストなどで128MBといった巨大なダミーファイルが必要になることがある。本稿ではPHPで巨大なダミーファイルを作る方法を紹介する。

なお、本稿で紹介するコードの完全版は[GitHub](https://github.com/suin/php-playground/tree/master/CreateFileWithGivenSize)で公開している。

## 指定のファイルサイズでファイルを生成する方法

指定のファイルサイズでファイルを作成するコードは次のようになる。`$filesize`に`128`を代入すると、128バイトのファイルが作られる。ファイルの中身は128文字のヌルバイト(`\000`)で埋められる。

```php
$filesize = 128;
$fp = fopen($filename, 'wb');
ftruncate($fp, $filesize);
fclose($fp);
```

`ftruncate`はファイルを指定サイズにまるめる関数だが、ファイルサイズよりも大きい値を与えると、ヌルバイトで埋めてくれる。


## メガバイトで指定できるようにした実装

バイト数指定だと、テストコードで使うにはコードが読みにくくなるので、メガバイトでファイルサイズを指定できるようにした実装が次の`FileBySizeCreator`クラスである。

```php:FileBySizeCreator.php
<?php

declare(strict_types=1);

final class FileBySizeCreator
{
    /**
     * Create a file with given megabyte size.
     */
    public function createFileWithMegabyte(
        string $filename,
        int $megabyte
    ): void {
        $fp = fopen($filename, 'wb');
        ftruncate($fp, $this->megabyteToByte($megabyte));
        fclose($fp);
    }

    private function megabyteToByte(int $megabyte): int
    {
        return $megabyte * 1024 * 1024;
    }
}
```

使い方はこんなかんじ:

```php
$fileCreator = new FileBySizeCreator();
$fileCreator->createFileWithMegabyte($filename, 128);
```
海外からのアクセス制限をかけている状態でiOSアプリの申請をする方法

## この記事を書いた背景
海外からのアクセス制限をかけているため、iOSアプリの申請時にapple側(米国)でアプリを使用することができず審査に通らないという状況が発生しました。
一度アクセス制限を解除して、申請終了後に再度制限をかけ直す対応を行ったこともあるのですが、毎回その対応するのはめんどくさいので、良い方法がないか調べました。

## アクセス制限を解除しないで審査をしてもらう方法
### 公式の回答
地理情報などによって一部の機能にアクセスできない場合には、動画を撮ってそのリンクを送ってくれとのことです。
全部の機能にアクセスできない場合にはどうすべきなのでしょうか。。
[App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/)
> If we’re not able to access part of your app because it’s geo-locked or otherwise restricted, provide a link to a video of the functionality

### フォーラムでのやり取り
他に良い方法がないか確認するために、[Apple Developer Forums](https://forums.developer.apple.com/welcome)を確認しました。
オーストラリアのユーザーのみを許可しているため、米国からアクセスができずに審査が通らないという話があり、さらに `17.0.0.0/8` がAppleに割り当てられているIPアドレスだからこれを許可すれば良いという話があるが、公式のページから見つからないとのことです。
[GEO Blocking Issue for App Review](https://forums.developer.apple.com/thread/95593)

スタックオーバーフローでも同様のやり取りがされていました
[Which ip addresses does apple use for testing iPhone applications?](https://stackoverflow.com/questions/9199950/which-ip-addresses-does-apple-use-for-testing-iphone-applications)

#### Appleに割り当てられてるIPアドレス
こちらに下記の記述がありました。やはり `17.0.0.0/8` がAppleに割り当てられているIPアドレスのようです。
[If your macOS and iOS clients aren't getting Apple push notifications](https://support.apple.com/en-us/HT203609)
> The APNs servers use load balancing, so your devices don't always connect to the same public IP address for notifications. It's best to let your device access these ports on the entire 17.0.0.0/8 address block, which is assigned to Apple.

### AppleのIPアドレスを許可して再度申請を行ったみた
ホワイトリストに `17.0.0.0/8` を追加して再度申請を行ったところ審査が通りました。(AWSのWAFでアクセス制限をかけてます)
そのため動画を撮るのが手間だという人はこちらのIPアドレスを許可してあげれば良いと思います。

**`17.0.0.0/8` を許可したことによって何か問題がおきても責任は取れませんので、公式のページを確認して自己責任で対応をしてください。
上記リンクのフォーラムに回答しているの私なので、上記のリンクにも書いてあったということは考えないで欲しいです。**

## まとめ
アクセス制限をかけている状態でiOSの申請を行うには
- 動画を撮ってそのリンクを送る
- `17.0.0.0/8` からのアクセスを許可する(自己責任)
- 一度制限を解除する(かけている状態ではないけど)

他に良い方法があればぜひ教えて欲しいです。
あと記事の内容とは関係ないですが、Googleの検索設定を英語にして英語で検索をすると、探している情報がすぐに見つかりました。
SalesforceのREST APIで返ってくる日付時刻文字列をJava8でParse

```java
    private static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSZ");
    // 2019-01-21T01:29:17.000+0000形式
    // Tをシングルクォートで囲まないと「Unknown pattern letter: T」エラー
    // スレッドセーフ http://www.ne.jp/asahi/hishidama/home/tech/java/DateTimeFormatter.html

    public OffsetDateTime getOffsetDateTimeValue(String key) {
        return OffsetDateTime.parse(getStringValue(key), dateTimeFormatter);
    }
```
AWS CodePipelineのデプロイ先にS3を指定できるようになりました


[What's New with AWS](https://aws.amazon.com/new/?nc1=h_ls)に、[AWS CodePipeline Now Supports Deploying to Amazon S3](https://aws.amazon.com/about-aws/whats-new/2019/01/aws-codepipeline-now-supports-deploying-to-amazon-s3/)とありました！ドキュメントは[こちら](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-s3deploy.html)です。やった:raised_hands:、HTMLファイルをS3へのDeployができるようになったと思い、試してみました。**後述しますが、2019年1月21日時点で問題ありです。**

# パイプラインの作成をします
- CodePipelineから[パイプラインの作成]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77333/6b495632-7722-59c3-ce92-2d18d5654882.png)

- パイプラインの設定を入力します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77333/af93a889-6102-49d5-805c-f91fae3fe776.png)

- ソースプロバイダの設定をします
ここではCodeCommitを指定しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77333/85496f59-5089-4cea-88cc-a870cf6400be.png)

- デプロイの設定をします
デプロイ先にS3が選択できるようになってる！デプロイする前にファイルを展開するにはチェックを入れてください。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/77333/5551f1a1-b6d4-2062-68db-042b640321bb.png)

- 最後に設定の確認画面が表示されますので、[パイプラインの作成]をクリックします。このような画面になります。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/77333/c1e6438d-1fc3-2768-d0cf-a39f537664ec.png)

## CodeCommit にpushしてみます
CodeCommitの変更は自動で検出されます。pushされると、In progressになり、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77333/5041c0af-5cdb-38ca-aa87-975b5c46bb70.png)
問題がなければ、DeployがSucceededに変わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77333/07e6a159-ee1d-635c-0db8-917bbbba6701.png)

Deploy先のS3バケットを見てみると、Commitしたファイルがあります！CodeBuildも必要ないので、buildspec.ymlも書いてないし、とっても簡単！
おおお〜、これはよい！

## ここからが問題
ファイルの追加がS3に反映されたことを確認してから、ファイルの削除やフォルダの変更はどうなるんだろうか？と思いテストをしてみました。

結果、問題ありです。

- ファイルの削除
    - CodeCommit上ではファイルは削除されても、S3上ではファイルは削除されず、そのまま。。。

- フォルダ名の変更
    - 新しいフォルダは作成されるが、古いフォルダもそのまま残ってる。まあ、ファイルの削除ができないんだから、そうなるのも当然か。。。

ファイルの削除やファイル名変更をしてくれないのでは、運用では難ありで使えません。  
最初はロールの問題かと思ったけど、作成されているロールを見ると、`Action:[s3:*]`はAllowになってるので問題無し。次にアーティファクトの中身を見たけど、ファイルがZIP化されているだけです。おそらく、ただ単純にS3へファイルのコピーをしているようですね。

**簡単にS3へファイルをDeployできると思ったけど、ちょっと一捻りしないと使えないな、残念**:tired_face:
エンジニアとして長く続けていくにはどうすれば良い？プログラミングを好きになって、嫌いにならないためには？周囲のエンジニアとの難易度調整、精神のバッファはとても重要かもしれない。

エンジニアとして長く続けていくにはどうすれば良い？プログラミングを好きになって、嫌いにならないためには？周囲のエンジニアとの難易度調整、精神のバッファはとても重要かもしれない。

# note

[文系でプログラマーになったけど色々失敗して３年半で会社を辞めた話｜denkigai｜note](https://note.mu/denkigai/n/nafff6bd87802)

# 何がわからないのかがわからない、暗黒状態

「何がわからないかが、だんだんとわかり始める」というのが学習のスタート状態だと思うが、その状態に立つのも難しい環境だったらしい。

自分が一番バカに思えるような環境に飛び込んで成長するというパターンもあるだろうが、あまりにかけ離れたレベルに飛び込んでしまうと、そもそもジャンプすらできないかもしれない。


>自転車に乗れない人間も、自分には何が足りないのか理解できない。「乗れる」というのがどういうことなのか全く分かっていない。だから何を質問すれば良いのかがわからない。

# メンタルはやられると元のようには回復しづらい。

これは僕も別分野で経験がある。あまりに辛いと、プログラミングが大嫌いになってしまうだろうな。いったんトリガーされてしまうと苦しそうだ。



>日々症状は重くなり、コードを読むことはできなくなっていた。キーボードに手を置くと震えてしまい叩けなくなっていた。

# たとえギリギリ耐えられるぐらいのレベルでも、何かのアクシデント、思わぬ自体で一気にオーバーフローする危険がある

精神的なバッファは切実に大事。

>葬儀後、人事と相談して休職に入った。

---

https://twitter.com/YumaInaura

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
iPadでCharles ProxyによるHTTPS通信モニタ

App StoreでCharles Proxy検索、1080円で購入、インストール、起動

Charles Proxyのトップ画面が表示されるのでStatusをInactiveからActiveに変更
VPN設定を追加してよいか聞いてくるのでAllowを選択
CURRENT SESSIONの欄が動き出すのでタップして詳細画面に移動
(Safariで対象Webサイトにアクセス)
CURRENT SESSION画面に対象Webサイトの行が現れるのでタップして詳細画面に移動
Enable SSL Proxyingをタップ
証明書のインストールを求めてくるのでSettingsを選択

開いたSettingsダイアログのSSL Proxyingをタップ
Install SSL Certificateをタップ
「このWebサイトは"設定"を開いて構成プロファイルを表示しようとしています。許可しますか？」と聞いてくるので「許可」を選択
プロファイルをインストールするダイアログが開くので「インストール」をタップ
パスコードを聞いてくるのでパスコードを入力
警告が表示されるので「インストール」をタップ
小さなプロファイル確認ダイアログが表示されるので赤字の「インストール」をタップ
「完了」をタップしてダイアログを閉じる

設定アプリを開き、一般＞情報＞(最下部の)証明書信頼設定にてCharles Proxyの証明を信頼するよう変更
ルート証明書警告ダイアログに対して「続ける」を選択
(Safariで対象Webサイトにアクセス)
Charles ProxyのCURRENT SESSION画面に対象Webサイトの行が青いアイコン付きで増えるのでタップして詳細画面に移動
見たい通信の行をタップして詳細画面に移動
Linuxでサーバのスペックを確認するには

# CPUスペックの確認

```
# 物理 CPU の数
# grep physical.id /proc/cpuinfo | sort -u | wc -l

# CPU ごとのコアの数
# grep cpu.cores /proc/cpuinfo | sort -u

# 論理プロセッサーの数
# grep processor /proc/cpuinfo | wc -l
```

# メモリスペックの確認
## /proc/meminfoを参照する

```
# cat /proc/meminfo
```

## dmidecodeコマンド

```
# メモリの本数
# dmidecode -t memory | grep 'Memory Device' | wc -l
# メモリの容量
# dmidecode -t memory | grep 'Size'
```

# HDDの確認
## lsblkコマンド

```
# lsblk
NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0             2:0    1     4K  0 disk
sda             8:0    0 146.1G  0 disk
|-sda1          8:1    0   500M  0 part /boot
|-sda2          8:2    0     8G  0 part [SWAP]
`-sda3          8:3    0 137.6G  0 part
  `-rhel-root 253:0    0 137.6G  0 lvm  /
sr0            11:0    1  1024M  0 rom
```

## fdiskコマンド

```
# fdisk -l
```

# 参考URL
https://access.redhat.com/ja/solutions/2159401
http://d.hatena.ne.jp/ike-dai/20110706/1309958404
http://takuya-1st.hatenablog.jp/entry/2016/10/02/014712
「文系でプログラマーになったけど色々失敗して３年半で会社を辞めた話」を一瞬でまとめたい



# Note

[文系でプログラマーになったけど色々失敗して３年半で会社を辞めた話｜denkigai｜note](https://note.mu/denkigai/n/nafff6bd87802)

# プログラミング研修があったから、プログラマになったらしい

>「なんで文系なのにプログラマーになったの？」とよく聞かれる。答えは「会社の金でプログラミング研修してくれるって言ったから…」だった。全く知識がなくても数ヶ月の研修さえ受ければプログラマーになれると思っていた。

>同期は１００人ほどで、6割はエンジニア、4割はWebマーケターやデザイナーだった。入社後の研修内容は「Ruby on Railsでinstagramみたいなサービスを作ってみましょう！」くらいのものだった(言語はJavaだった)。

![image](https://user-images.githubusercontent.com/13635059/51452044-a81a7580-1d7b-11e9-89c3-95538407aba8.png)

# 少数精鋭のめちゃくちゃできるエンジニアに囲まれてしまった

>私は調子に乗って「少数精鋭のチームが良いです」などと人事に配属先の要望を出していた（『攻殻機動隊』の影響）。結果、本当に優秀なエンジニアしかいないチームに配属されることになった。地獄の始まりだった。

# 祖父も亡くなられて、精神的打撃の中にいた

>そして畳み掛けるように祖父が亡くなった。実家に向かう鈍行列車の車内は閑散としていたが、私は椅子に座ることができず、ずっとつり革にぶら下がっていた。

# P.S 今はリモートワークで働かれているらしい

>その生活を反省し、フリーランスとなった今はほとんどリモートワークで仕事をしている。朝日で目覚めて、日が昇り切ったら仕事を始め、夕日が沈んだら仕事を止める。そして残りの時間でずっと絵を描いている。

> エンジニアなのかと言われると微妙な立場にいると思う。しかしプログラミングそれ自体は面白いと思うし、今後も一生続けていく。計算機はすごい。

---

https://twitter.com/YumaInaura

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MAMPのMySQLのrootアカウントの初期パスワードは空ではない。

備忘録として残します。
訳あって、xamppではなくmampをWindowsに入れて開発環境を構築することになりました。
xamppと違って初期セットはかなり楽かなと思いきや、rootのパスワード無でログインしようとしたら下記のようにエラー。

``` CMD
C:\MAMP\bin\mysql\bin>mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
```

なんやかんや調べてみたらどうやらxamppと違いrootユーザにもパスワードがちゃんと設定されている（空でない）とのこと。
**パスワードもまた`root`で設定されているようなので、改めてチャレンジ。**
するとちゃんとログインできました。

``` CMD
C:\MAMP\bin\mysql\bin>mysql -u root -proot
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.6.34-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

調べてみるとrootに何も権限がないとか、いろいろ書かれていたが、phpmyadmin上でmysql.userのrootアカウントを見るとちゃんと全ての権限が付与されているため、ちょっと何言ってるかわからない状態になりました。

おまけにWindows版のMampの最新版4.1.0（2019/01/21現在）はPHP.iniを書き換えるとMysqlが次から起動できなくなるし、ほんとなんなんだ。
オリジナル逆求人サイト製作メモ

#はじめに
オリジナルの逆求人サイトを作り始めました。
そこで、挙動を実装するときに気づいた点をメモしていこうと思います。

##気づいた点
オリジナルのWebサイトを作るにあたって、気づいた点をまとめていきます。

・実装したい機能はググれば出てくるし、便利なツールも活用したほうが良い。
プログラミングを学ぶまで、僕はいわゆる「パクる」という行為に嫌悪感を抱いていました。
ですが、プログラミングを学ぶようになって、そして学習をし続けて、「パクる」という行為を活かせば良いということに気が付きました。
プログラミングでは、いちいち自分の手でコードを打ち込んでいては、時間の無駄です。
そんなことをするより、Webや本で良いソースコードを探して、自分なりに分析して、手法や技術を盗む方がよほど効率が良いことに気づいたのが最近のことです。
CSSのデザインもこれに当てはまります。
これに気づくことができたのが、今週の僕の収穫だと考えます。

#参考サイト・使用ツール

[超便利！2019年に注目したい最新CSSツール、リソースガイド100個まとめ](http://photoshopvip.net/113096)
[Liveweave](https://liveweave.com/)
・Atom
・Bootstrap(今週使用予定）

現状ではLiveweaveとAtomしか使用していませんが、良いソフトやアプリを自分で見つけて、活用法を考えます。
GitHubのPrivateリポジトリに引っ越しする

GitHubの無料アカウントでも、Privateリポジトリが使えるようになりました。
https://techcrunch.com/2019/01/07/github-free-users-now-get-unlimited-private-repositories/

今回はAzure DevOpsのPrivateリポジトリをGitHubに引っ越ししてみます。
思った以上に簡単でした。

# 引っ越し元(Azure DevOps)の準備

## アクセストークンの用意
Azure DevOpsの右上のアイコンをクリックして、「Securitiy」を選び...
<img width="250" alt="1" src="https://qiita-image-store.s3.amazonaws.com/0/190739/5966905d-9616-d2f1-3a3b-da5a865da139.png">

Personal Access Tokensの画面に遷移します。
<img width="1163" alt="2" src="https://qiita-image-store.s3.amazonaws.com/0/190739/1160b460-2868-567c-1f14-aebc880fecae.png">

「New Token」ボタンから作成してください。

<img width="395" alt="3" src="https://qiita-image-store.s3.amazonaws.com/0/190739/29b818b4-3dc1-aab0-e710-3679d6c3040e.png">

トークンが作成できました。警告にある通り、ここで<font color="red">**トークン文字列をコピーしてどこかに保存してください**</font>。
トークンは２度と表示されることはないので、コピーし忘れるともう一度作り直す羽目になります。

## Clone URLの取得

サイドメニューの「Repos」タブからリポジトリ画面に遷移し、右上にある「Clone」ボタンをクリックします。
コピーボタンを押してURLを取得します。

<img width="1022" alt="4" src="https://qiita-image-store.s3.amazonaws.com/0/190739/77ec9e92-1c2e-c074-8bde-81bd912125bc.png">

# 引越し先(GitHub)の準備

<img width="240" alt="5" src="https://qiita-image-store.s3.amazonaws.com/0/190739/6362ca5c-6d50-ba63-4512-83b03ac42aea.png">

右上の「＋」ボタンから「Import repository」を選択し...

<img width="558" alt="6" src="https://qiita-image-store.s3.amazonaws.com/0/190739/bc5fef9e-1c01-0b85-1503-a1837a11e46a.png">

Clone URLとリポジトリ名を埋め、<font color="red">**PrivacyをPrivateにします**</font>。


<img width="354" alt="7" src="https://qiita-image-store.s3.amazonaws.com/0/190739/172f8062-a88c-1e17-3b6c-84c80eb1910a.png">
Begin importを押してしばらくするとアカウントを聞いてくるので、
Azure DevOpsのアカウント名とトークン文字列を貼り付けてください。

<img width="562" alt="8" src="https://qiita-image-store.s3.amazonaws.com/0/190739/6eeaa291-c289-d041-aefa-4eccfa292166.png">

やったー成功しました！
リポジトリの引っ越しは、本来であればコンソール画面で呪文をいろいろ入力しないといけないそうですが、
GitHubの場合は移行ツールがあるので助かりました。

# 後かたづけ
引っ越し用に作成したトークンは念のため削除しておきましょう。
システム設計と腐敗度の関係。人を苦しめるコーディング。時限爆弾のコントロール。

システム設計と腐敗度の関係。人を苦しめるコーディング。時限爆弾のコントロール。

# Inspired 

[やめた方が良いコーディング・設計、アンチパターン - Qiita](https://qiita.com/peutes/items/ad046baa2428b522a133)

5分で大事なところをまとめたい。

# 設計と腐敗度の関係

全ては腐るが、腐るスピードが違う。

悪い設計は悪い菌。

>良い設計でも時が経つとコードは腐りやすいし、完璧な設計などなかなか出来ない。これは万人が悩み続ける問題である。しかし、明らかに有害な設計・コードは、その腐る時間が数倍短くなる。

# 腐敗が人を苦しめる

それは自分かもしれない。

人に優しくするには良い設計。

>そのままリリースするとその有害で毒のある設計・コードのせいで第三者が苦しむことを想像して下さい。その問題を第三者に押し付けないで下さい。

# 時限爆弾のコントロール

すべてを理解した上でやるならば、爆発時期を見込んで、退避できるようにしたり、爆発しても問題ないようにしておく。もしくはリスクを承知でやる。

>それをわかった上で、その時限爆弾を埋め込みつつリリースするかどうかを、上長や担当者と話し合い決めるべきです。


---

https://twitter.com/YumaInaura

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Rails】日付・期間を指定した投稿をトップページに自動的に表示する

個人開発のWebアプリ**「[まちかどルート](https://machiroute.herokuapp.com/)」**をもうすぐv5.0正式版にバージョンアップします。

そのv5.0正式版にむけて現在v5.0rc1でテスト中なのが、**投稿にあらかじめ日付・期間を指定しておき、その日付・期間が来たらトップページに自動的に表示される機能**です。

プログラミングに入門して7ヶ月弱。初めての挑戦だったのでメモとして残します。

# データベース
まず、期間の開始日`start_on`と終了日`end_on`というカラムを`Posts`テーブルに作成します。

```
$ rails g migration AddStartToPosts start_on:date
$ rails g migration AddEndToPosts end_on:date
$ rails db:migrate
```
いずれのカラムもdate型にしておきます。

# 入力フォーム

```erb:new.html.erb
期間の開始日
<%= date_field_tag 'post[start_on]', nil %>
期間の終了日
<%= date_field_tag 'post[end_on]', nil %>
```
`date_field_tag`を使うと下の写真のようにカレンダー形式で日付を指定できるので便利です。

![{11AAE812-54BD-4360-9D52-624F342E84C3}.png](https://qiita-image-store.s3.amazonaws.com/0/335872/e9ca7206-d8ea-1653-bc2f-e1b22fe18cd1.png)

# controller

### バリデーション

開始と終了の日付が正しく指定されたかどうかチェックするバリデーションはmodelではなくcontrollerで行っています。

```ruby:posts_controller.rb
def create
(中略)

sabun = (@post.start_on - Date.today).to_i
unless sabun >= 1
  flash[:error] = "開始日は明日以降で！"
  render 'new'
  return
end

sabun = (@post.end_on - @post.start_on).to_i
unless sabun <= 10
  flash[:error] = "期間は最長10日間まで！"
  render 'new'
  return
end
unless sabun >= 0
  flash[:error] = "終了日は開始日以降で！"
  render 'new'
  return
end

(中略)
end
```
開始日は明日以降とするため、上記のようにして今日`Date.today`との日付の差分`sabun`を1日以上にするようバリデーションしています。

ほかにも、指定期間を最長10日間とするため差分を10日以下としたり、終了日は開始日以降とするために差分を0以上となっています。

### 指定期間にマッチする投稿をDBから検索

```ruby:posts_controller.rb
def index
(中略)

special_post_ids = Post.where.not(start_on: nil).pluck(:id)
@special_posts = Post.where(id: special_post_ids).where('start_on <= ?', Date.today).where('end_on >= ?', Date.today)

(中略)
end
```
トップページのviewであるindexに投稿のデータをわたすため、controllerで上記の処理を行います。

まず、すべての投稿の中から期間が指定されている投稿のみidを抽出して`special_post_ids`に格納します。

続いて、そのidをもとに開始日`start_on`と終了日`end_on`の期間内にマッチする投稿データを検索して`@special_posts`に格納する、という流れです。

とくに`where('start_on <= ?', Date.today)`という検索方法を使ったことがなかったので苦労しました。`Date.today`という書式を使うとそこに今日の日付が自動的に代入されて`start_on`や`end_on`との日付を比較しながらDBから探してくれるんですね。とても便利です。

# トップページ

```erb:index.html.erb
<%= render partial: 'special_posts', collection: @special_posts, as: :post %>
```

トップページのviewである`index.html.erb`には上記のコードを書きました。指定期間がマッチする投稿データ`@special_posts`を、部分テンプレート`special_posts`に表示するようにしています。

ちなみに`@special_posts`に格納されたデータをすべて繰り返しレンダリングするうえで`collection`を使っています。`each do`よりもN+1問題に対応できるそうです。

```erb:_special_posts.html.erb
タイトル
  <%= post.title %>
本文
  <%= post.body %>
期間開始日
  <%= post.start_on %>
期間終了日
  <%= post.end_on %>
```

# あとがき

以上が大筋の流れとなります。こう書いてしまうと簡単に思えますけど、じぶんにとっては難しかったです。まだまだ未熟ですね。これからも必要に応じて学んでいきます。
devise インストール時にAn error occurred while installing bcrypt (3.1.12), and Bundler cannot continue. Make sure that `gem install bcrypt -v '3.1.12' --source 'https://rubygems.org/'` succeeds before bundling.　エラーがでる

deviseを以下手順でインストールする際に

```
gem 'devise'
```
```
bundle install
```

以下のエラーが出て進めない。。。

```
An error occurred while installing bcrypt (3.1.12), and Bundler cannot continue.
Make sure that `gem install bcrypt -v '3.1.12' --source 'https://rubygems.org/'` succeeds before
bundling.
```

最近MAC OSをMojaveにアップデートした方だとエラーが発生するそうです！
ターミナルで以下入力して解決できました！！

```
xcode-select --install
```
不要な再帰処理の記録


やめた方が良いコーディング・設計、アンチパターン
https://qiita.com/peutes/items/ad046baa2428b522a133

に、
「不要な再帰処理」
という項目があった。

再起処理の利点と課題を整理する。

#再起処理の利点

論理が簡単に記述できる。

自分で自分を呼んでいて、記述が短くできることがある。

試験で、同じ処理を何度も呼ぶので耐久試験は実施したことになる。

#再起処理の課題

末尾再帰でないと終わるかどうかの判定が難しい。

呼び出しにstackを使うとstack overflowになりやすい。

呼び出しに時間がかかるなら、処理全体に時間がかかる。

呼び出しが同じ処理に再入するなら、再入可能な設計にしていないといけない。

気がついたことを順次追記します。

#参考資料

【Kotlin】トランポリンで再帰を末尾再帰にする
https://qiita.com/wrongwrong/items/8dd52fc53bdb8ba52f23

再帰
https://qiita.com/teratera/items/b52130a34ae983d6062c
Visual Studio 2017でC++のヘッダーファイルとソースファイルを切り替えるショートカットキー

## 説明
・ヘッダーファイルxxxx.h または ソースファイルxxxx.cppを開いてる状態で、Ctrl + K 、Ctrl + O 

## コツ
・Ctrlを押したまま「K」を押し、次に「O」を押す。
deviseインストールの際にAn error occurred while installing bcrypt (3.1.12), and Bundler cannot continue.がでる

devise　を　bundle install　する際に
以下のエラー文が出た時の対処方法

An error occurred while installing bcrypt (3.1.12), and Bundler cannot continue.
Make sure that `gem install bcrypt -v '3.1.12' --source 'https://rubygems.org/'` succeeds before
bundling.

In Gemfile:
  devise was resolved to 4.5.0, which depends on
    bcrypt

MAC OSがMojaveにアップデートしていると起こりやすいそうです。
ターミナルで

xcode-select --install

と入力して、アップデートをして解決。
nilではない場合にのみメソッドを呼び出したい場合について(try, &.)

include?などで対象のオブジェクトがnilの場合にNoMethodErrorを発生させずに、nilではない場合にのみメソッドを実行したり条件分岐させたりしたい場合の処理について調べてつつ色々試したのでメモ。

# 通常

```ruby
sample = nil

if sample.include?("a")
  sample
else
  sample.to_a << "a"
end
#=>NoMethodError: undefined method `include?' for nil:NilClass
#["a"]の入った配列を返すことなくエラーで処理が止まってしまう。
```
実際には違うコードですが、要はinclude?で真の場合と偽の場合で処理を分岐させたかった時にこのエラーが表示されるようになってしまったので、対処法を調べました。

# unless nil?を使う

```ruby
sample = nil

unless sample.nil?
  if sample.include?("a")
    sample
  else
    sample.to_a << "a"
  end
else
  sample.to_a << "a"
end
# =>["a"]
```
冗長すぎる

# tryメソッド（Active Support）

```ruby
sample = nil

if sample.try(:include?, "a")
  sample
else
  sample.to_a << "a"
end
#=>["a"]
```

# &.(Ruby)

```ruby
sample = nil

if sample&.include?("a")
  sample
else
  sample.to_a << "a"
end
#=>["a"]
```


今回はtryと&.で解決しました。なお、nil以外のレシーバに対して呼び出した際に少し違いがあり、メソッドが呼び出せない時にtryはnilを返し、&.はエラーを吐くといった違いがあるようです。（try!にすれば&.と同様にエラーにできます。）

```ruby
#ArrayクラスにStringクラスメソッドを使ってみる。

sample = ["a", "b", "c"]

sample.upcase
#=>NoMethodError: undefined method `upcase' for ["a", "b", "c"]:Array

sample.try(:upcase)
#=> nil

sample&.upcase
#=>NoMethodError: undefined method `upcase' for ["a", "b", "c"]:Array

sample.try!(:upcase)
#=>NoMethodError: undefined method `upcase' for ["a", "b", "c"]:Array
```

try!にすると&.と同じくエラー吐くようにできますので、両者の違いはなくなりつつありますが、調べてみると&.の方が高速なようなので、今回は&.を使用しました。

#　参考
Active Support コア拡張機能(https://railsguides.jp/active_support_core_extensions.html)

https://techracho.bpsinc.jp/hachi8833/2018_03_30/52987
.ssh の自分なりの構造化メモ


# 説明

## ファイル構造

```tree
.
├── config
├── available.d
│   ├── クライアント名1
│   ├── クライアント名2
│   ├── クライアント名3
│   ├── クライアント名4
│   └── クライアント名5
├── site.d
│   ├── クライアント名1 -> /home/xxxxxxxx/.ssh/available.d/クライアント名1
│   ├── クライアント名3 -> /home/xxxxxxxx/.ssh/available.d/クライアント名3
│   └── クライアント名4 -> /home/xxxxxxxx/.ssh/available.d/クライアント名4
├── conf.d
│   ├── for_azure
│   └── for_aws
├── known_hosts
├── xxxxxx.pem
├── id_ed25519
├── id_ed25519.pub
├── id_rsa.pub
└── id_rsa.pub
```

```ssh_config:.ssh/config
Include site.d/*
Include conf.d/*

Host *
    Port 22
    User xxxxxxxx
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    ForwardAgent yes
    TCPKeepAlive yes
    ServerAliveInterval 300
```

```ssh_config:.ssh/available.d/クライアント1

Host client1_dev 1.2.3.4
    Hostname 1.2.3.4
    Port 44422

Host client1_production 1.2.3.5
    Hostname 1.2.3.5
    User ec2-user
    Port 22
```

```ssh_config:.ssh/conf.d/for_aws

# userがec2-userだったらaws向けの設定を適用する
Match user ec2-user
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
```

## ツール類

- `Include`が使えるのは openssh 7.3から。
- `Match`が使えるのは openssh 6.5から。
- 補完が効かない？ `Include`した先のファイルを読めるbash completionを使おう。
    - brewなら `brew install bash-completion@2`

## ポイント

- `available.d`から`site.d`へシンボリックリンクを貼る。不要になったら`unlink`
- configで`Include`ディレクティブをwildcardで読んで、まとめて読み込む
    - SSHの設定は「先勝ち」であることに気をつける
    - 「後勝ち上書き」ではない。
- `Host`のwildcardや、複数併記をうまく用いて、alias的な動きをさせると便利かもしれない
    - 上の例でいけば、`ssh client1_dev`と`ssh 1.2.3.4`のどちらでも、`port 44422`が適用できる
        - 普段は人が見てわかる設定名で運用したいけど、Capistranoの接続はIPで書きたいからこうなった。
    - wildcardは複数使えるので、部分マッチで凝った使い方も可能
        - [こりすぎた例](https://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8).
        - すごすぎる(笑)
- `Match`を用いて設定を出し分ける
    - うまいMatchを考える必要あり
        - Match execで、コマンド実行結果で分岐できる。
        - もはやなんでもできる…

# 参考

- https://qiita.com/oohira/items/7deae31469cfbbd740c1
- https://qiita.com/yangci/items/63174c99366fe54d728a
- https://qiita.com/koyuta/items/bdb9ed8fd8e35aef3295
- https://qiita.com/makiuchi-d/items/9f5405179aafa120b3e6
- https://togakushi.bitbucket.io/build/html/OpenSSH_AdventCalendar2014/05.html
- https://qiita.com/ik-fib/items/12e4fab4478e360a82a1
- https://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8
vue.js component axios 内でdata追加

```

<template>
    <div>





        <h2>//画像をクリックで追加</h2>


        <div v-for="v in imgs">
        <img v-bind:src="v"/>
        </div>
        <h2>// v-on:change でファイルの選択を検知する</h2>
        <input @change="selectedFile" type="file" name="file">




    </div>
</template>

<script>
    export default {
        data() {
            return {
                imgs: [
                    'https://caba-ageha.com/img/sns.png',
                    'https://caba-ageha.com/uploads/80x107/5876e737adbab.jpg'
                ]
            };
        },
        methods: {
            selectedFile: function(e) {

                // 選択された File の情報を保存しておく
                e.preventDefault();
                let files = e.target.files;

                // FormData を利用して File を POST する
                let formData = new FormData();
                formData.append('image',files[0]);
                let config = {
                    headers: {
                        'content-type': 'multipart/form-data'
                    }
                };



                // 1 先にこれを作り
                var vm = this;

                axios
                    .post('/photo/store/', formData, config)
                    .then(function(response) {
                        // response 処理
                        //ここで追加
                        vm.imgs.push("https://caba-ageha.com/uploads/80x107/5876e737adbab.jpg");

                        console.log(response);
                        console.log("アップロード完了");
                    })
                    .catch(function(error) {
                        // error 処理
                        console.log(error);
                        console.log("エラー");
                    })
            }
        }
    }
</script>

```
Trinityのjobをスパコンに投げるスクリプト

このページでは[UGE(Univa Grid Engine)](https://supcom.hgc.jp/japanese/utili_info/manual/uge.html)でjob管理されているPCクラスター(スパコン)にTrinityのjobを投げる方法を掲載しています。

## requirements

[Trinity](https://qiita.com/github-nakasho/items/631449416f3226ade7f6)
[HPC GridRunner](https://github.com/HpcGridRunner/HpcGridRunner.github.io/wiki/Installing-and-configuring-HPC-GridRunner)

## job投入スクリプト

```bash:20190121_01.sh
#!/bin/sh
#$ -S /bin/sh
#$ -cwd
#$ -V
#$ -N SRR504904_1M
#$ -j y
#$ -o ./20190121_01_SRR504904_1M.log
#$ -l s_vmem=12G,mem_req=12G

./20190121_01_SRR504904_1M.sh
```

このスクリプトは、./20190121_01_SRR504904_1M.shに記述されたjobを投げていることを意味します。ここでは特に注意すべき点を記述します。

```bash
#$  -l s_vmem=12G,mem_req=12G
```

この行ではこのjobが使用するメモリ利用量を宣言しています。宣言がない場合、Javaの部分で以下のようなエラーが出ることがあります。

```
Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 bytes
```

## 投入したいTrinityの実行スクリプト

```bash:20190121_01_SRR504904_1M.sh
#!/bin/bash

Trinity --seqType fq \
        --left $HOME/nakasho/data/SRR504904_1M/SRR504904_1M_1.fastq \
        --right $HOME/nakasho/data/SRR504904_1M/SRR504904_1M_2.fastq \
        --max_memory 128G \
        --CPU 24 \
        --output $HOME/nakasho/work/20190121/SRR504904_1M_trinity \
        --grid_exec "$HOME/src/HpcGridRunner-1.0.2/hpc_cmds_GridRunner.pl --grid_conf $HOME/src/HpcGridRunner-1.0.2/hpc_conf/BroadInst_SGE.test.conf -c" \
        --grid_node_CPU 8 \
        --grid_node_max_memory 10G
```

このスクリプトが実際に投入され、実行されるTrinityのスクリプトになります。以下では[Trinityのページ](https://qiita.com/github-nakasho/items/631449416f3226ade7f6)に記述されていない部分を紹介します。

```bash
--grid_exec "$HOME/src/HpcGridRunner-1.0.2/hpc_cmds_GridRunner.pl --grid_conf $HOME/src/HpcGridRunner-1.0.2/hpc_conf/BroadInst_SGE.test.conf -c" \
```

Hpc GridRunnerとそのconfigファイルの記述場所を設定します。現在、私が使用しているスパコンではjob管理システムにUGEが使用されていますが、これはSGEと同様のものです。他にもLSF, PBS, SLURMがサポートされています。

```bash
--grid_node_CPU 8 \
```
1つのノードあたりいくつのCPUを使用するかを指定します。Trinity Phase 2 (assembly of read clusters)においてCPU=grid_node_CPUになります。

```bash
--grid_node_max_memory 10G
```
1つのノードあたりいくらメモリを利用するかを指定します。Trinity Phase 2 (assembly of read clusters)においてmax_memory=grid_node_max_memoryになります。

## HPC GridRunnerとそのコンフィグファイル

HPC GridRunnerを用いることで、Trinityの実行がノード間で通信を行いながらjobを高速で行われるgridが形成されます。ここではそのコンフィグ方法を掲載しています。

```BroadInst_SGE.test.conf
# grid type: 
grid=SGE

# template for a grid submission
cmd=qsub -V -cwd

# note -e error.file -o out.file are set internally, so dont set them in the     above cmd.

##########################################################################################
# settings below configure the Trinity job submission system, not tied to th    e grid itself.
##########################################################################################

# number of grid submissions to be maintained at steady state by the Trinity     submission system 
max_nodes=4

# number of commands that are batched into a single grid submission job.
cmds_per_node=1
```

gridでそのスパコンが使用しているjob管理システムを指定します。Hpc GridRunnerではLSF, SGE, PBS, SLURMが対応しています。
cmdで新たに投げる子タスクを生成しています。
max_nodesはデフォルトでは500になっていますが、今回は4ノードを利用する想定から、4に変更しています。
cmds_per_nodeは単一のグリッド送信ジョブにまとめられたコマンド数を意味します。ここではデフォルトの1を指定しています。
Amazon ECS の DAEMONタイプ

- **REPLICA**
クラスター全体で必要なタスクの実行数を指定する。クラスター全体に対して何個のタスクを実行するか。

- **DAEMON**
ホストの増減に合わせて、タスクの実行数を制御する。EC2のコンテナ1つに対して１つのコンテナ。

Amazon ECS の基本については、[Amazon ECS](https://qiita.com/leomaro7/items/deb114e5ec209a044e5d) で。

サービスタイプを DAEMON にしてみた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/2efb0891-69cd-2233-d560-7fd404363ec9.png)

<br>

必要数：1　実行中の数：1　です。※きちんとタスク(Dockerコンテナ)が実行されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/c0332f0f-9eca-66fa-13f2-954aa7da2c7e.png)

<br>

わざとタスクを停止してみます。
必要数：1　保留中の数：1　から、、、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/04b4b104-052d-c360-365d-e0e4193e3455.png)
必要数：1　実行中のの数：1　にまたなりました。※新しいコンテナが補充されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/66ed6ea2-e112-fc90-84d1-33a7ee907e54.png)

<br>

ECSインスタンスで必要数: 2 にスケールしてみると、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/649a6859-f48a-af23-54b1-f796bb726ea6.png)
必要数：2　保留中の数：2　になりました。　※やはり新しいコンテナが補充されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/f5393013-1b5f-4af4-4ddb-b10ef30b21fe.png)
Command "python setup.py egg_info" failed with error code 1 in C:\Users\"user name"\AppData\Local\Temp\pip-install-8pf3kx27\pandocfilters\

# 問題
Command "python setup.py egg_info" failed with error code 1 in C:\Users\"user name"\AppData\Local\Temp\pip-install-8pf3kx27\pandocfilters\

pythonを入れなおしてjupyterをinstallしようとしたさいに遭遇

# 解決策
pipを使用している場合には

```
pip install --upgrade pip setuptools
```

で解決
Amazon Redshift demo

Amazon Redshift　の概要はこっち↓
[Amazon Redshift](https://qiita.com/leomaro7/items/d72eca73154f0609bf61)

---

Redshift を開き、「クラスターの起動」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/e3d11b25-bd15-c1e8-bfb5-4803aa120b0a.png)



[クラスター識別子]に、my-dw-instance と入力します。これは、クラスターを識別する一意のキーです。
[データベース名]は、dw（デフォルト）
[データベースポート]は、5439（デフォルト）
[マスターユーザー名]と[マスターユーザーのパスワード]に任意のものを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/2eca497f-c5a5-a1c9-42c8-a6d4ae73e274.png)



[ノードのタイプ]には、dc1.large
[クラスターのタイプ]は、Multi Node
[コンピューティングノードの数]は 2
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/24519bf8-1ddf-aa17-56e8-3f81e80da45a.png)



ネットワーキング、セキュリティグループ、IAMロールを作成します。
今回はデフォルトのままにしておきますが、セキュリティグループは 5439 ポートを開放しておいてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/9a71c132-c7f8-2270-fd68-607873c259cd.png)



確認画面が表示されたら、「クラスターの起動」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/c4294f09-6256-e78d-36ce-55dec3fad1e2.png)



早速、SQL Workbench を起動し、接続してみましょう。
手順は、[SQL Workbench/J で JDBC 接続を介してクラスターに接続する](https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/connecting-using-workbench.html) のとおりに実行します。

|項目|入力|
|---|---|
|Driver|[Amazon Redshift JDBC ドライバーをダウンロードします。](https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/configure-jdbc-connection.html#download-jdbc-driver)からダウンロード|
|URL|JDBC URLを指定|
|Username|マスターユーザー名|
|Password|マスターパスワード|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/e78c4f7c-50be-1923-3d3f-111c26e41eda.png)



おい、接続できない。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/bf2df048-57e6-24cc-b2db-324e520c1834.png)
セキュリティグループでは 5439 ポートを開放しているんだけどねー



職場のネットワーク環境では上手くいかなかったので、自宅で試してみた。
ちなみに自宅は mac なので、↓の記事を参考に SQL Workbench をインストールしました。
[Amazon RedShiftにMacのSQL WorkBench Jから接続する方法
](https://qiita.com/sebisawa/items/65145f69b5c0dd3f077e)



test してみる。
![スクリーンショット 2019-01-19 19.45.03.png](https://qiita-image-store.s3.amazonaws.com/0/280929/e88d9f85-8a65-f2a9-5ee0-925dcd08942c.png)
できた！おそらく社内のネットワーク環境だと、FWなどにひかっかってしまうようです。



早速、[ステップ6：Amazon S3のサンプルデータをロードする](https://docs.aws.amazon.com/ja_jp/redshift/latest/gsg/rs-gsg-create-sample-db.html)を参考に実行してみてください。
【rails5】redirect_to @userというコードでなぜuserのトップページに遷移出来るのか？

##redirect_to @userというコードでなぜuserのトップページに遷移出来るのか？

「編集ボタン押下後、ユーザー自身の詳細ページへ遷移する」というコードがあるのですが、なぜこういう風に動くんだろうと気になったので調べてみました。

ご指摘などあれば是非お願い致しますm(__)m

結論

```
redirect_to @user
```

このコードは色んなものが省略されていて、

```
redirect_to user_url(@user.id)の略だった。
```

学んだこと
〇〇〇_urlと〇〇〇_pathはurlヘルパーで、戻り値としてルートURLを返してくれる

戻り値とは？
プログラム中で呼び出された関数やメソッド、サブルーチンなどが処理を終了した際に、呼び出し元に対して渡す値
**アクション内にあるメソッドの処理が終わった後に渡す値**と解釈しました。

urlとpathの違いは？

```
urlは戻り値に絶対パスを返す
例、https://~~/users/:id
```

```
pathは戻り値に相対パスを返す　
例、/users/:id
```

チュートリアルの5.3.2には、
>railsの規約には基本的にリンクには相対パスを使うようにとあるが、redirectのリンクには絶対パスを利用すべき

とある。

なので普段使いはpath、
redirectの時はurlを使う。

今回はredirectに対して使うので、

```
redirect_to user_url(@user.id)
```

となる。

いまいち違いがわからずpathとurlを使っていたので勉強になった！

そして、user_url(@user.id)の戻り値は絶対パス

```
https・・・/users/:id
```

ボタン押下時のpathにはshow_pathを使用しており、ルーティングの中でこれに一致するコントローラーとアクションを確認すると、

```
get 'show' => 'users#show'
```

なのでusersコントローラーのshowアクションを参照する。

つまり、編集ボタンを押すとshowアクションが実行され、ユーザーの詳細ページに遷移する。

そして、

>リンク先のパスとしてモデルオブジェクト(今回の場合は@user)が渡された場合、
>Railsにはオブジェクトを一意に表す値、つまり、idを取得し、URLへ自動的に組み込む仕組みがある。
>そのため、@user.idのidは省略出来る。
>最終的には、redirect_to @userは、redirect_to user_url(@user.id)と等価となります。

なので、redirect_to @userとなります！

[参考にした記事]
(https://qiita.com/Kawanji01/items/96fff507ed2f75403ecb)

めちゃくちゃ勉強になりました。
IFTTTで情報収集の効率を良くした話

#はじめに

最近、情報を収集するためにネットをどう活用すれば良いか、と考えています。
そのために、様々なソフトウェアを試してはいるのですが、一つ一つが独立していて、効率が悪いように思いました。
そこで、IFTTTというサービスを使用し、情報収集の効率を良くした話をここではご紹介します。


#IFTTT（イフト）
IFTTTというWebサービスをご存知でしょうか。
2011年にLinden Tibbets（リンデン・チベット）氏が開発したWebサービスのことで、決して新しいサービスではありません。
そのサービスとは、　IFTTTの名前の由来である、「もし（IF）『This（入力）』ならば（Then）『That（出力）』する」の「This」と「That」というレシピでアプレットを開発者が自由に設計し、サービスとサービス同士を接続できることにあります。
今日利用可能な、IFTTTのサービスは「https://ifttt.com/services」のページでずらりと並べられています。
Webサービス同士の連携はもちろん、AIスピーカー、GoogleHomeなどの機器に連携するアプレットも存在します。

##情報収集の効率化
今回僕が行ったことは、
・情報過多で簡略化だぜ！手放せないIFTTT連携5選 ＋ 情報収集のフロー
https://medium.com/%E3%82%A2%E3%82%BB%E3%83%8A%E3%83%93/%E6%83%85%E5%A0%B1%E9%81%8E%E5%A4%9A%E3%81%A7%E7%B0%A1%E7%95%A5%E5%8C%96%E3%81%A0%E3%81%9C-%E6%89%8B%E6%94%BE%E3%81%9B%E3%81%AA%E3%81%84ifttt%E9%80%A3%E6%90%BA5%E9%81%B8-%E6%83%85%E5%A0%B1%E5%8F%8E%E9%9B%86%E3%81%AE%E3%83%95%E3%83%AD%E3%83%BC-6a88cfb96027

・IFTTTを使ってFeedly+Pocket+Evernoteの情報収集を効率化する方法
http://k-nakashima.net/ifttt/


この二つの記事で紹介されているフローを組み合わせて使用しています。
具体的な流れは、

1.Twitter,Feedly,ブラウザで「お気に入り」「気になる」「いいね」を付けたツイートや記事・Webページのタイトル・リンク、Pocketに保存するアプレットを設定する。
↓
2.Pocketに一時的に送られたデータをEvernoteに送信すると同時に、Gmail,Outlookにも元リンクを送信するアプレットを設定する。

と、このような流れになります。

＃おわりに
IFTTTを使って情報収集を効率化する方法をご紹介しました。
この他にもIFTTTには様々なアプレットが存在するので、皆様是非試してみてください。
TerraformでのAWS環境構築方針検討

大規模なECサイトを構築する際にTerraformを利用したAWS環境自動構築について検討したので、大枠をまとめておきます。
CloudFormationではなく、Terraformを利用した理由は変更時にパラメータ差異まで表示してくれるところが良かったからです。（CloudFormationのVerが上がったら解消されそうですが。。）
TerraformでAWS環境構築される方の参考になれば幸いです。
※でもまだ最適ではないと思います。。

#自動構築の目的
・障害の早期復旧に利用する
・システム再構築やDRにも対応可とするため

#構築方針
・インフラ部分のAWSリソースはTerraformで自動構築（コーディング）する
　※利用するAWSリソースはEC2、S3、RDS、EFS、DirectConnect、Route53など一般的（？）に利用されるものが主
・（Terraform未経験の）複数人でコーディングする

#環境
・本番環境、検証環境、接続試験環境、性能試験環境、開発環境がある
・アカウントは本番環境（本番アカウント）とそれ以外（検証アカウント）で分割している
・本番アカウントで３つのVPC（サービス用、運用、CI）に分割
・検証アカウントで２つのVPC（サービス用、運用）に分割

#Terraformの利用ポイント１ Moduleの積極的な利用
HashiCorpが用意してくれているAWS環境を作成するモジュール（Terraform Registry）を利用。
HashiCorpに用意されたモジュールが無いAWSリソースはモジュールを自作。

これでコーディングメンバーはモジュールにパラメータを埋め込むだけで利用できる。

例外でRDSのパラメータグループなどモジュール利用不可なリソースもある。

＜Terraform Registry＞
https://registry.terraform.io/

#Terraformの利用ポイント２　WorkSpace機能
WorkSpace機能を利用すると本番環境と似た検証環境がある場合、
変数を変えるだけで同じコードを利用してAWS構築が可能となり、
うまく使えばコーディング量が少なくなる。
今回は本番環境、検証環境、接続試験環境、性能試験環境、開発環境（の一部）をWorkSpaceを利用して構築した。
が、、利用してみて環境差異が多い場合は利用することで逆に開発効率が落ちる。(考えなければいけないことが増える)
今更やり直せないが、同一の環境のみで利用することを推奨する。

＜WorkSpace＞
https://qiita.com/gamisan9999/items/168ff29be70572de7602


#課題
・テスト
AWSSpec利用してみたかった。
現状はコードと詳細設計書を見比べることをテストとする方針としているが、改善したいところ。

#運用
構築完了後の運用設計は検討中。
理想は毎週自動でTerraformを再実行することだが、Terraformの仕様でNACLやSGの変更に制限があり、
べき等性を保てないと考えている。（provider: aws v1.39利用）
（ルールIDの小さいNACLをTerraformで追加すると大きなIDのNACLが再作成される動きとなり、一時的に全断状態になる。
バグな気もするが、現状は仕様らしい。）

自動化不可なAWSリソースがある。ダイレクトコネクトなど承認が必要なリソースは自動化不可。
こちらの運用回避も検討する。
Docker + Posgre + SQLAlchemyで位置情報を使うまで

## 動作環境
* Postgresql -> 11

## 事前準備
### 使用するpythonパッケージたち
```
sqlalchemy  = "1.2.16"
geoalchemy2 = "0.5.0"
psycopg2    = "2.7.6.1"
```


### PosgreのDockerfileを準備する

```Dockerfile
FROM postgres:11

ENV POSTGIS_MAJOR 2.5
ENV POSTGIS_VERSION 2.5.1+dfsg-1.pgdg90+1

RUN apt-get update \
      && apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
      && apt-get install -y --no-install-recommends \
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION \
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts=$POSTGIS_VERSION \
           postgis=$POSTGIS_VERSION \
      && rm -rf /var/lib/apt/lists/*
```

* 後々苦労することになったPostGISライブラリもapt-getで導入しておく


### Posgre初回起動時に走らせるinit.shの設定
* docker-composeを使用している場合は以下のファイルを作成しvolumeでゲストOSと共有する
    * 一例(docker/db/conf/以下に下のスクリプトを置いておく)  
    `- ./docker/db/conf:/docker-entrypoint-initdb.d`

```1_init.sh
#!/bin/bash
set -e

# Geometryのためのモジュールインストール
psql -U root -d <DATABASE> -c "
    CREATE EXTENSION IF NOT EXISTS postgis;
    CREATE EXTENSION IF NOT EXISTS postgis_topology;
    CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
    CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder;
"

# ユーザの作成
psql -U root -d <DATABASE> << "EOSQL"
CREATE USER test;
alter role test with password 'test';
GRANT ALL PRIVILEGES ON DATABASE <DATABASE> TO test;
EOSQL
```

* モジュールインストールとユーザ作成を同時にするとpermission deniedで怒られる
    * 理由は調べてない


### SQLAlchemyのORM作成
* この辺に関しては他にも沢山記事があるので触りだけ  

```
DATABASE = 'postgres://%s:%s@%s/%s' % (
    os.getenv("POSGRE_USER", <DB_USERNAME>),
    os.getenv("POSGRE_PASSWORD", <DB_PASSWORD>),
    "%s:%s" % (os.getenv("POSGRE_HOST", <DB_CONTAINER_NAME>), os.getenv("POSGRE_PORT", "5432")),
    os.getenv("POSGRE_DATABASE", <DATABASE>)
)
```


### Modelの作成
* 上記設定でようやくGeometry型が使えるようになるはず  

```models.py
from datetime import datetime

from sqlalchemy import Column, Integer, String, Float, DateTime
from geoalchemy2 import Geometry

from setting import Base


class Place(Base):
    __tablename__ = '***'

    id = Column("id", String(255), unique=True, primary_key=True, nullable=False)
    geometry = Column("geometry", Geometry(geometry_type='POINT', dimension=2, srid=4326), nullable=False)
    created_at = Column("created_at", DateTime, default=datetime.now)
    updated_at = Column("updated_at", DateTime, default=datetime.now, onupdate=datetime.now)
```

### まとめ
* あまりに右往左往しすぎて作業ログがまともにない。笑
* 位置情報扱うのめんどくさい…笑
php-master-changes 2019-01-20

今日はドキュメントの更新があった！

# 2019-01-20
## TysonAndre: [ci skip] Fix typos in UPGRADING
- https://github.com/php/php-src/commit/58a2ced0529ecfb89cb78a8f3ae0585cdf3c8ada
- UPGRADING の typo を修正

## weltling: Update NEWS [ci skip]
- https://github.com/php/php-src/commit/d978590c745c23940e29d05d612f673ea45f1d91
- [7.2~]
- ldap のバグ [#77440](https://bugs.php.net/bug.php?id=77440) がよう分からんが直ってる気がする、とのことで修正を NEWS へ追記