OmniAICreator/Qiita-1.07M huggingface dataset:
pythonによる紳士達の性癖分析：データフレーム編

### 配列→データフレームへの移行
- [前の記事](https://qiita.com/we-yu/items/7d7c60dc5e302e728e85)で生成したTagMatrix.csvは二次元配列ベースだった。
 - それでダメということはないが、せっかくpythonを使っているのなら「データフレーム」に移行してみよう。
- 二次元配列生成した後、同一の内容を保持してデータフレームを生成する。

#### 前回までのコードに付け足す
- 前回作成したコードの末尾へ以下の処理を付け足す。

```py
# :
# (前略)
# :
# 頻出の組み合わせを出力
for rq in ranq :
    print(rq["val"], rq["x"], rq["y"])

# 配列→DataFrame化
list_df = pd.DataFrame( columns=tags )

# enumerateでiを進めながらxを使用できる。
for i, x in enumerate(tags):
    # TagMatrixから一行作り、DataFrameに追加することを繰り返す。
    tmp_se = pd.Series( tagMatrix[x], index=list_df.columns, name=tags[i] )
    list_df = list_df.append( tmp_se )
print( list_df.head() )

# 行（横軸）の抽出
print(list_df.iloc[3:6, :])
# 列（縦軸）の抽出
print(list_df.iloc[:, 3:6].head())
# タグを指定しての列の抽出
tgtLine = ['陵辱', '逆転無し']
print(list_df[tgtLine].head())

# 縦軸で平均算出
print(list_df.mean(axis = 0))
# 横軸で合計値算出
print(list_df.sum(axis = 1))

# 平均
list_df.to_csv("FromDM.csv")
```
- 基本的には「二次元配列から一行取得→データフレームへ一行append」の流れになるかと思われる。
- 今回は数学的な行列ではないので算術系の処理はあまり重要でもないだろうが、平均値や合算値を出すことも可能。頭の片隅には置いといた方がよさそう。
 - 簡単にCSV出力できるのは便利かと思う。
 - 関数一つで上半分にしたりできるのだろうか？
- 二次元配列から出力したCSV・データフレームから出力したCSVでdiffを取る。
- ヘッダの空白欄がnullか'-'かの違いはあるが、それ以外は結果が一致していることを確認。
![image](https://qiita-image-store.s3.amazonaws.com/0/135051/6a47c1bd-0522-6e0b-7a21-b89c4ff146d6.png)
### 参考記事
- https://qiita.com/567000/items/d8a29bb7404f68d90dd4
- https://note.nkmk.me/python-pandas-assign-append/
- https://stats.biopapyrus.jp/python/dataframe.html
実験：AWSのリージョンによるレイテンシの違い

お手軽に地球の裏にサーバ建てられるとかえもいなので実験してみました。

## 手法
東京リージョン、サンパウロリージョンにEC2を利用しサーバを構築する。
連続pingにて自宅～リージョン間のレイテンシを測定する。
※自宅は神奈川

## 結果

自宅～東京リージョン

    パケット数: 送信 = 100、受信 = 100、損失 = 0 (0% の損失)、
    ラウンド トリップの概算時間 (ミリ秒):
    最小 = 10ms、最大 = 43ms、平均 = 12ms

自宅～サンパウロリージョン

    パケット数: 送信 = 100、受信 = 100、損失 = 0 (0% の損失)、
    ラウンド トリップの概算時間 (ミリ秒):
    最小 = 287ms、最大 = 362ms、平均 = 289ms


## やってみたいこと

サンパウロのデータに日本から低レイテンシでアクセスできるシステムを作る。


#### 本日は以上！！！
mapActionsの第２引数のオブジェクトのメンバーに関数を指定すると何が嬉しいのか？

その関数とは以下のように書いてある
>[Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params. You can dispatch action and do any other things in this function. specially, You need to pass anthor params from the mapped function.](https://github.com/vuejs/vuex/blob/caa663d69608fc36d1a88746df28961437d38786/src/helpers.js#L88)

コードで表すと

```js
import { mapActions } from 'vuex';

export default {
  // 省略
  methods: {
    ...mapActions({
      // Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params
      submit(dispatch, name, email) {
　　　　　　　　　　　　　　　　// do any other things in this function
        if (!this.termsOfServiceChecked) {
          alert('利用規約に同意してください');
          return;
        }

        // specially, You need to pass anthor params from the mapped function
        dispatch('registerUser', { name, email });
      }
    }
  }
}
```
以下のような書き方もできるが、マッピングが増えてくると`registerUser`はマッピングしたものかが分かりづらくなりコードが読みにくくなる印象がある。

```js

import { mapActions } from 'vuex';

export default {
  // 省略
  methods: {
    ...mapActions(['registerUser']),
    submit(name, email) {
      if (!this.termsOfServiceChecked) {
        alert('利用規約に同意してください');
        return;
      }

      this.registerUser({ name, email});
    }
  }
}
```
以下のようにマッピングしたメソッド呼ぶ前に、バリデーションなど事前にしておきたい処理がなければ、
mapActionsの第２引数のオブジェクトのメンバーは関数がいいかもしれないと思いました。

```vue

<template>
<button @click="fetch">
</template>

<script>
import { mapActions } from 'vuex';

export default {
  methods: {
    ...mapActions(['fetch'])
  }
}
</script>

```
Solaris11.4 の Dtrace で特定ディレクトリのwriteとreadの回数・サイズの合計を取得する


# 特定のディレクトリに対する write と read の統計情報を取得する例

Solaris11.4 の Dtrace 新機能である fileops プロバイダーを利用して特定のディレクトリに対する read と write の回数とサイズの合計を取得する例です。

```dtrace:write-read-sum.d
#!/usr/sbin/dtrace -qs
fileops:::write,fileops:::read
/args[0]->fi_dirname == "/var/tmp" /
{

  @op_cnt[probename] = count();
  @op_size[probename] = sum(args[4]);

}
dtrace:::END
{
 printa("Count: %16s %@16d\n", @op_cnt);
 printa("Size : %16s %@16d\n", @op_size);
}
```

上記をファイル保存して、実行権を与えて実行します。
Control+C を押すと終了して、結果が出力されます。

```
# chmod +x write-read-sum.d
#  ./write-read-sum.d 
^C
Count:             read              389
Count:            write              878
Size :             read         25427969
Size :            write         61833363

```

### write,read の引数

fileopsの read,write のプローブを使用していますが、これらの引数は以下の通りです。

**write** 
開いているファイルに書き込みが行われたときに起動するプローブ。
args[0]は、ファイルに対応する fileinfo_t 構造体をポイントしています。
args[1]は、オペレーションの待ち時間が格納されます。
args[2]は、ファイルオフセットが格納されます。
args[3]は、要求されたバイト数が格納されます。
args[4]は、実際に書き込まれた実際のバイト数が格納されます。


**read** 
開いているファイルから読み込みが行われたときに起動するプローブ。
args[0]は、ファイルに対応する fileinfo_t 構造体をポイントしています。
args[1]は、オペレーションの待ち時間が格納されます。
args[2]は、ファイルオフセットが格納されます。
args[3]は、要求されたバイト数が格納されます。
args[4]は、実際に読み取られたバイト数が格納されます。


### fileinfo_t 構造体 

```c
typedef struct fileinfo {
         string fi_name;                 /* 名前 (basename of fi_pathname) */
         string fi_dirname;              /* ディレクトリ (dirname of fi_pathname) */
         string fi_pathname;             /* フルパス */
         offset_t fi_offset;             /* ファイル内のオフセット */
         string fi_fs;                   /* ファイルシステム */
         string fi_mount;                /* ファイルシステムのマウントポイント */
} fileinfo_t;
```
doing tox for OpenStack keystone on conda python 3.7 environment

# 목표
the goal

다음과 같이 centos, conda python 3.7 환경에서 keystone 코드를 tox로 테스트 해 봅니다.
is to test OpenStack keystone with tox on conda python 3.7

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/bd82d8b1-ddf2-170d-5fb4-05025603cb30.png)

miniconda를 install합니다.
let's start with installing miniconda

# 절차
procedures

먼저 conda를 설치합니다.
first, let's install miniconda3

```
wget -L https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
sh ./Miniconda3-latest-Linux-x86_64.sh
....
source ./miniconda3/bin/activate base
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/2796763d-c43f-80c3-f126-9df6ffff208e.png)

keystone 프로젝트를 위한 python환경을 설치합니다.
and create a python3 environment for keystone project

```
conda create -n keystone -c conda-forge git python=3
conda activate keystone
cd $CONDA_PREFIX
mkdir projects && cd projects
git clone http://github.com/openstack/keystone -b stable/rocky --depth 1
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/b74aee82-1efc-8ddf-6870-8387e076b029.png)

tox가 가상환경을 만들어 dependency를 인스톨하는데 필요한 소스코드도 설치합니다.
let's install source dependencies for tox virtualenv

```
yum install python36-devel openldap-devel
```

conda의 python 버전이 3.7이므로 tox.ini를 열어서 py35로 되어있는 것을 py37로 고칩니다.
fix py35 to py37 in tox.ini as python version of conda environment is 3.7

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/c5732005-311a-0fbf-6a75-9c37ced03071.png)

``tox -e py37``

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/9f29e0c5-fa14-17af-7e74-59a349343488.png)

아이고, 17개 실패했습니다.
oops, 17 tests failed.

어디가 실패했는 지 살펴봅니다.
let's find out what is wrong.

``tox -e py37 > result.txt``

sqlite의 migration테이블이 없다는군요.
it says 'no such table'

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/6730bbcd-572e-2990-8ed0-b899a29f1001.png)

그럼 마이그레이션을 하지 않는 테스트를 시험해 봅니다. 예를 들면 test_cli 유닛테스트같은 것을요.

then, let's try again only with tests not to use migration things like test_cli unit test.


``tox -e py37 -- keystone.tests.unit.test_cli``

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/bd82d8b1-ddf2-170d-5fb4-05025603cb30.png)

넵. 필요한 테스트를 수행했습니다.
yep, we did it. good job 👏👏👏
OpenCVを利用してfindContoursで輪郭を取得するサンプルをColaboratoryでサクッと動かして確認する

##はじめに
###対象読者
- OpenCVを使った画像処理をしてみたい人
- サンプルを動かしながら確認したい人
- 画像の輪郭を取得したいけど、どうやったらいいかよくわからんっていう人

###このページの目的
- OpenCVを実際に動かしながら使ってみる。
- 画像から輪郭を取得してあれこれ処理をする前準備ができるようになること

###その他
- 画像処理を仕事で色々使ってみたなかで調べたことや詰まったことを整理しながら書いてみます。
- 参考URLは都度書きます。
- [サンプルはgithubにおいてます](https://github.com/hmorikawa19/how2use-opencv)

##アジェンダ
1.Colaboratoryの使い方
2.OpenCVの使い方

## 1.Colaboratoryの使い方
[colaboratory](https://colab.research.google.com)
上記にアクセス（Googleアカウントにログインする必要あり）するだけで、Jupyter Notebookが使えてしまいます。
（無料！）

### 基本的なコマンド
多分知っておいたほうがいいのが下記のコマンドです
```%cd
!pip```

ほんとに簡単に使えてしまうので、とりあえずアクセスしてみるのが早いと思います。
あとは、こちらの記事がとても分かりやすかったのでリンクさせてもらいます。

[【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)

## 2.OpenCVの使い方
### まずは、画像の読み込みから
```python

# -------------------------------------------------------------------
# まずは画像の読み込みと表示
# -------------------------------------------------------------------

img = cv2.imread('s.jpg')
# opencvではBGRで読み込みされるため、matplotlibようにRGBに変換
# cv2.imshowならBGRで表示できる
im_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# opencvなら、cv2.imshowで表示できる
plt.imshow(im_rgb)
plt.show()
```

### 読み込んだ画像を処理して輪郭を取得します

```python

# -------------------------------------------------------------------
# 輪郭の取得
# -------------------------------------------------------------------
# 輪郭を取得するため、グレースケール化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 黒白反転→輪郭を取得するために背景を白くする。外側が黒だと輪郭を取得しないため
gray = cv2.bitwise_not(gray, gray)

# 輪郭を取得しやすくするために二値化
ret,thresh = cv2.threshold(gray,80,255,0)


# 輪郭の頂点の数が最大のものを最大の輪郭として採用している
def index_emax(cnt):
    max_num = 0
    max_i = -1
    for i in range(len(cnt)):
        cnt_num=len(cnt[i])
        # print(cnt_num)
        if cnt_num > max_num:
            max_num = cnt_num
            max_i = i
    return max_i


# 輪郭の取得
img_c, cnt, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
n = index_emax(cnt)


if n != -1 and len(cnt) > 0:
    for i in range(len(cnt)):
        # 凸包の作成
        hull = cv2.convexHull(cnt[i])
        x,y,w,h = cv2.boundingRect(hull)
　      # 輪郭の描画
        cv2.drawContours(img, [hull], 0, (0,255,0), 2)

im_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(im_rgb)

```
findContoursで輪郭を取得するのですが、入力画像を『8UC1 format』にする必要があります。
要は、グレースケールのことです。

今回、グレースケールにしたものを二値化しているのは、差をはっきりさせて輪郭を取得しやすくしたかったからです。
どういった輪郭を取得したいか？という目的で、画像の前処理がいろいろ変わってくることになります。

そのあたりは今後色々書いていきたいと思っています。



パラメータなど細かく色々調べたい方はこちらも確認してください。
[画像の輪郭取得について(OpenCVチュートリアル)](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_contours_begin/py_contours_begin.html)


[サンプルはgithubにおいてます](https://github.com/hmorikawa19/how2use-opencv)
Claboでサクッと動かせるので、実際に動かしてみてください。
サンプルの画像もgithubに置いてあります。
いくつかの現場を経験して感じる仕事上でのコミュニケーション能力とは何かという問いについての僕の現時点の答え

### はじめに :sleeping: 
こんばんは。
急に寒くなったからなのか体調を崩しかけていますが、一度決めたことはやろうと思うので今日も何かしらアウトプットしようと思っています。
今日は、そうですね、dockerを本番環境にdeployするという部分をやるつもりだったのですが、docker cloudという仕組みについて自分でしっくりこずに、awsで作業する前にそのへんを調べていました。が、いまいち記事を書くレベルまで行かずにそのテーマはかけません。
結局dockerを使うのに適した環境、ソフトウェア規模ってどういったものなんでしょうか？
開発環境で動いてたもの（環境やパッケージ全てまるっと）は本番へそのままデプロイで使用できる、というのは素敵な匂いがする、というのはあるのですが。
まだ言い切れるほど、学べてないですね。反省。

### この記事で話すこと  :map: 
新卒でエンジニア未経験から入って、最初は他人と話すことが苦手なあまり面接練習で泣いて自社の担当者の胃をキリキリさせていた人間が、人に慣れるためと量販でコミュニケーションを培い、SESというシステムをつかって複数の現場の人と一緒にプロダクトを作ってきた中で得た「仕事上でのコミュニケーション能力とは何か」という問いに対しての自分なりの答えを出そうとした話。（ ~~要はdokerの進捗悪いから別の話題にした話ともいう~~ ）

### 【結論のようなもの】「仕事上でのコミュニケーション能力とは何か」　:dancer: 
自分なりの答え「仕事上での目的を達成するために、周りの最善を引き出すように努め、自分ができる最善を尽くす力のこと。」

具体的には
 :recycle:  相手の話をよく聞く
 :recycle: その上で、仕事上での目的を達成するために周りを巻き込む
 :recycle: 対話を通じて誘導する
 :recycle: 達成するために必要な要素を集める
 :recycle: 周りの最善を引き出すように努める
 :recycle: 自分ができる最善を尽くす
 :recycle: そのために誠実であること
あたりでしょうか。

### なぜそう思うか  :feet:  
この記事を読んでる人がいるかどうか、興味があるかどうかもわかりませんが、少しなぜそう思うかを言語化してみようと思います。
自分は個人的に一般的に言われる「コミュニケーション」という概念及び行動に対し苦手意識をもっています。
コミュニケーションが出来れば何でもOKみたいな風潮は良く解りませんし（苦手だからそう反発してしまうのかもしれません）、相手の顔や声、雰囲気で気持ちを察してくれ、というのがうまく対応できません。
考えても解らないので、自分が今理解している事実のみから精一杯考えて正しいと思えることを周りのことは考えずに発言することが多いです。
ただ、感謝の気持ちは伝えるようにしています。
「感謝」と「謝罪」は人間として誠実であるために必要なことです。これがなかったら今までの現場で色々大変な事にあっていたと思います。
・・・・
という価値観の人間なので、こと「仕事」について切り取ってしかコミュニケーション能力については話ができませんが、その点でいうと「目的/目標（例えばリリース）」に向けて必要な事を進めるための努力すべてが、「コミュニケーション能力」なのかなと思います。ただ言葉を発することではなく（言葉や会話はただの空気振動ですから）、遅れてしまいそうなリリース時期をずらすというお伺いをうまく立てるという能力でもなく（止むを得ない場合は必要な能力ですが、時期をずらすということは当人の力不足からくるものがあるかと思うのでここでは触れません。）、
ただ、目的の為にできる自他への努力のことを指してるんじゃないかと思います。

この手は人の数だけ正解があると思うので、
他の人がどういう答えを持ってるかはいつか知りたい気持ちがあります。

### 最後に :cat: 

寒くなってきたので、暖かくして過ごしたいと思います。
Happy coding! :sleeping: :waxing_gibbous_moon:
LoopBack4 現状の制限事項メモ

LoopBack4はまだ開発中なので、いくつかの機能が期待と違う動きになる模様。おかしいなと思って調べた結果をまとめる。いずれは解決するかもしれないので、定期的に見に行く。
(11月の対応事項には上がっていないので、解決は時間がかかりそう)

#REST API
* Patchは部分的な更新をサポートしない。
    * Requiredのプロパティが抜けていると422 Validation Errorが返ってしまい、部分的な更新ができない。
   * Issue: https://github.com/strongloop/loopback-next/issues/1722

#Relation
* hasManyのリレーションが正しく表現されない
  * hasManyで所有する側のプロパティにオブジェクト型が作られ、その中に直接配列が格納されてしまうようになる。所有される側のIDとは無関係になっている。
  * Issue: https://github.com/strongloop/loopback-next/issues/1944
Linux  ~環境変数について~

記事を移転させました。
[【投稿】Linux  ~環境変数について~](https://pick-up-tech.com/blog/linux-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
artisan コマンドで独自クラスのスケルトンをつくる 

# まえがき

Laravelを使ったことがある人は
```artisan make:〇〇``` 
コマンドでControllerやMiddleware作ったことがあると思いますが、開発をしていると〇〇Serviceや〇〇Adapterなど独自のクラスを同じように作りたい場面が出てきます。これはGeneratorCommandというクラスを継承すると簡単につくることができます。今回は〇〇Serviceというクラスを生成するコマンドをつくってみます。

# コマンドクラスを生成

```php artisan make:command ServiceMakeCommand```

コマンドでServiceMakeCommand.phpが生成されます。このクラスにCommandではなくGeneratorCommandを継承させ、処理を書いていきます。

```php:App/Console/CommandsにServiceMakeCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\GeneratorCommand;
use Symfony\Component\Console\Input\InputOption;

class ServiceMakeCommand extends GeneratorCommand
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'make:service {name} {--hogerable : use Hogerable trait}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Create a new service class';

    /**
     * The type of class being generated.
     *
     * @var string
     */
    protected $type = 'Service';

    /**
     * Get the stub file for the generator.
     *
     * @return string
     */
    protected function getStub()
    {
        return $this->option('hogerable')
                ? __DIR__.'/stubs/hogerable-service.stub'
                : __DIR__.'/stubs/service.stub';
    }

    /**
     * Get the default namespace for the class.
     *
     * @param  string  $rootNamespace
     * @return string
     */
    protected function getDefaultNamespace($rootNamespace)
    {
        return $rootNamespace.'\Services';
    }
}


```

これで```php artisan make:service クラス名```でクラスを生成するコマンドができました。今回は--hogerableオプションがある場合はHogerableトレイトをuseしたクラス生成することにしました。

次にstubという生成するクラスの骨組みを書いたファイルを用意します。

```php:app/Console/Commands/stubs/service.stub
<?php

namespace DummyNamespace;

use App\Services\BaseService;

class DummyClass extends BaseService
{

}
```
```php:app/Console/Commands/stubs/hogerable-service.stub

<?php

namespace DummyNamespace;

use App\Services\BaseService;
use App\Services\Hogerable;

class DummyClass extends BaseService
{
    use Hogerable;
}
```

最後にapp/Console/Kernel.phpにServiceMakeCommandを登録しましょう。

```php artisan make:service FooService```

```php:app/Services/FooService.php
<?php

namespace App\Services;

use App\Services\BaseService;

class FooService extends BaseService
{

}
```

```php artisan make:service BarService --hogerable```

```php:app/Services/BarService.php
<?php

namespace App\Services;

use App\Services\BaseService;
use App\Services\Hogerable;

class BarService extends BaseService
{
    use Hogerable;
}
```

これらが生成されればOKです。
プログラミング初心者が起こした失敗話

# はじめに
はじめまして、**こよみ**です。
自分がプログラミングの勉強をはじめて先月で半年になりました。
しかし、始めてから先月までなかなか上達せず、何度も挫折しそうになりました。
プログラミング初心者の方にはそういう方はとても多いのではないでしょうか？
何故、自分がなかなか上達しなかったのか、何度も挫折してしまったのかをプログラミング初心者やこれからしようと思っている方に向けて自分が犯してしまった、大きく分けて**3つ目のミス**について書いていこうと思います。
文章を書くことがとても苦手なのでその辺はご了承くださいm(*_ _)m

# １つ目のミス
まず、皆さんは何からプログラミングを始めたでしょうか？
私は今流行りのProgateを使ってはじめました。ゲーム感覚でできるし、開発環境のことなんて考えなくのもいいので、プログラミングがどんなものかを知るという意味ではとてもいいツールだと思います。
しかし、私の場合はこれを**やり込んでしまった**のです。
これが1つ目のミスです。
色々な言語を満遍なくやり、勉強をした気になっていました。
やり込むことは悪くは無いと思うのですが、やり方の問題です。なにも考えず、とりあえずやるのではなくノートにメモをしたり、Twitterなどにアウトプットしていく事がとても大切です。アウトプットしていない自分が言うのでは説得力がありませんが、初心者の方でなんらかの媒体でアウトプットしている人は上達スピードが全く違います。どんな事でもいいのでアウトプットしていきましょう。
自分もこれを機にQiitaなどに投稿していきたいと思います。

# 2つ目のミス
2つ目が**参考書やネット記事のチュートリアルをひたすらしてしまった**というミス。
これも先程の話と同じなのですが、参考書をたくさん読んで
**「俺はこんなに勉強したぞー！！！！」**という感覚に陥ってました。
結果、全然身になりませんでした。自分は馬鹿なので記憶力も良くないし、要領もよくない、そんな自分がこんなやり方で上手くいくわけがないのです。
ほんと時間を無駄にしたなと思います。
チュートリアルは1つしたらそれを改造してみるのがいい勉強方法だと思います。
参考書は一周ほどしたら辞書代わりとして使いましょう。
勉強を始めたばかりの時に色々読むのではなく、1つアプリを自分の力で作ってみた段階で読む方が内容がちゃんと理解できるし、何より面白いと思います!!

# 3つ目のミス
3つ目のミスは**いろいろな世界にこんにちは！してしまった**事です。
要するに初心者なのにいろいろな言語に手をつけてしまったということです。1つの言語も理解出来ていない段階で他の言語をやっても理解できる訳ないです。自分の作りたいアプリにはどの言語が向いているのかと探ってるうちに無駄な時間を過ごすことになります。Ruby、PHPやPythonなどこれらの言語なら簡単なアプリならどれを使っても作れるので、とりあえず1つの言語に絞って勉強した方が良いです。
自分の場合はこれに本まで買っていたので、時間だけでなくお金まで飛んでいきました。

# 効率よく成長する
こんな感じでいろんなミスをして時間を無駄にしてきたわけですが、これらを解決でき、爆速で成長できる方法があります。
それは**メンター**をつけることです。
1人で勉強していくことはもちろん出来ます。
しかし、メンターや教えてくれる人がいるだけで成長スピードが全然違います。自分はある会社にインターンに行き5日間一緒にアプリ開発をしたのですが、物凄いスピードで開発を進めることが出来ました。分からない所の解決方法を教えて貰うだけでなく、検索の方法も教えてもらったので、インターンが終わった後の開発もスムーズに進めることが出来ています。1人では1ヶ月ほどかかっていたことも一日でできたりするので、プログラミングをしていて楽しく感じてきます。
プログラミングを始めたての人がインターンを行くのは難しいものがあるので入江さんの**Menta**や迫さんの**SkillHacks**などを使うと分からないことをすぐに聞ける環境を作ることが出来ると思います。
プログラミングスクールや専門学校という選択肢もありますが、正直オススメはしません。理由はここで書くと長くなってしまうので、また、違う記事として書きたいと思います。

# まとめ
1. Progateをやり込みすぎない
2. 参考書やチュートリアルばかりやらない
3. 言語は一つに絞る
4. 学んだ内容をアウトプットする
5. メンターや教えてくれる人をつける

これらを抑えておけばどんどん成長していくのではないでしょうか？

以上、下手くそな文で書いていきましたがどうでしたでしょうか？
自分と同じミスをする人が1人でも減ればいいなと願っております。
あと、プログラミング友達がいないので誰か友達になってください(切実) 
一応Laravelやってます。

早ければ今月末にアプリのβ版をリリースする予定なので良ければ[Twitter](https://twitter.com/koyomivr)のフォローの方<(_ _)>よろしくお願いします。

ここまで読んでいただきありがとうございました。
合成数列の和 (Swift)


|合成数列の和|https://qiita.com/advent-calendar/2018/composite-number|
|:--|:--|
|Python(/Ruby)|https://qiita.com/cielavenir/items/dcbd839b0c66af1bc971|
|Crystal|https://qiita.com/cielavenir/items/1a0dd1a94aca9935f5aa|
|Kuin|https://qiita.com/cielavenir/items/47fd18fc68055d990599|
|Swift|https://qiita.com/cielavenir/items/6cde3b20866c842dc9e2|
|Kotlin|https://qiita.com/cielavenir/items/f58eaa30f90781229a6d|
|Pascal|https://qiita.com/cielavenir/items/35c2fc54ca16b620c9c7|

```swift:composite.swift
func isqrt(_ n: Int) -> Int {
	if n<=0 {return 0}
	if n<4 {return 1}
	var x=0
	var y=n
	while x != y && x+1 != y {x=y;y=(n/y+y)/2}
	return x
}

func isPrime(_ i: Int) -> Bool {
	if i<2 {
		return false
	}
	for j in 2...isqrt(i) {
		if i%j<1 {
			return false
		}
	}
	return true
}
var n=Int(readLine()!)!
var i=4
var s=0
var cnt=0
while cnt<n {
	if !isPrime(i) {
		s+=i
		cnt+=1
	}
	i+=1
}
print(s)
```
Springの「Guides」を全部触ってみる（随時更新）

# Springの「Guides」とは
https://spring.io/guides
いわゆる公式チュートリアル。
さまざまなパターンの"Hello World"が準備されています。

---

# なぜGuidesを触ってみようかと思ったのか
Springは標準機能でさまざまなことを実現できます。
要件定義を行う際に、Springでできることを知っておけば、工数を抑えて開発することが可能なのかなと考えました。（都度ググればいいかもしれませんが）
Springの全量を把握するのは大変だと思うので、まずは公式ガイドを触ってみようかと考えました。

---

# 各Guideの概要や主要なアノテーションおよびクラス
Guideを翻訳して概要と主要なアノテーションの説明をざっくり記載していきます。
索引的に使えればと思います。

---

## Building a RESTful Web Service
https://spring.io/guides/gs/rest-service/
RESTfulなWebサービス。いわゆるAPIを作成するときに参考になるはず。
### @RestController
これを定義したクラスは、ビューではなくドメインオブジェクトを返すコントローラとなる。 
@Controllerと@ResponseBodyをまとめたもの。

### @RequestMapping
メソッドとHTTPリクエストをマッピングする。
/greetingへのHTTPリクエストを受けたらgreetingメソッドを実行する的な。

### @RequestParam
クエリパラメータを該当の引数にバインドする。

---

## Scheduling Tasks
https://spring.io/guides/gs/scheduling-tasks/
定刻起動するバッチ処理。
### @Scheduled
起動する間隔や時刻（cronのイメージ）を設定できる。

### @EnableScheduling
スケジュール処理を有効にする。

---

## Consuming a RESTful Web Service
https://spring.io/guides/gs/consuming-rest/
RESTfulなWebサービスを簡単に呼び出して、結果をオブジェクト化できる。
単体テストをする際にもモックとして使える。
### RestTemplateクラス
APIをGETやPOSTなどで呼び出し、結果をJavaのオブジェクトに変換できたりする。

---

## Building Java Projects with Gradle
Gradleでのビルド方法。割愛。

---

## Building Java Projects with Maven
Gradleでのビルド方法。割愛。

---

## Accessing Relational Data using JDBC with Spring
https://spring.io/guides/gs/relational-data-access/
xmlとか定義を書かずにパッとRDBに接続できる。
接続先を指定しなかった場合、H2(インメモリのDB)を使用する
ざざっとプロトを作成する際に良さそう。


---
随時更新...！
AWS CodeBuildのビルド環境であれこれする

最近質の下がってきた記事に一役買うために、クソ記事を投稿。
CodeBuildの中でJSTを扱おうとして困ったので、いろいろ調べているうちにいろいろカスタマイズできることがわかったので備忘録。

# CodeBuild
AWS [CodeBuild](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/welcome.html)はフルマネージドなビルドサービスで、ビルドサーバーのプロビジョニング、管理、スケーリングが不要。ある程度構築された（dockerなど）ビルド用のイメージを使用して、その中にソースコードをチェックアウトして、すぐにビルド環境を作ることができる。基本的に [buildspec.yml](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html) （ファイル名は指定可能）で、ビルド用イメージのカスタマイズなどが行える。
CircleCIの `circle.yml` と同じようにLinux上でのコマンドでできることは大体できる。（baseのイメージがubuntuなので）CircleCIほどUIなどは高機能ではないが、簡単なことなら楽に実現できる。

# カスタマイズする

まず、ビルドで利用する[Dockerイメージ](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-available.html)を選択する。デフォルトで選択できる、それぞれのDockerイメージのDockerfileは、[こちら](https://github.com/aws/aws-codebuild-docker-images)で公開されている(このDockerイメージもCodeBuildでビルドされるようだ)。これらのイメージはdocker hubにも公開されているため、手軽に同じ環境を使用できる。また、他の場所からイメージをPullしてきて使うこともできる。
イメージのカスタマイズはbuildspecについてのリファレンスを見るとわかるが、ビルドは各段階に分かれている、それぞれの段階で、Linuxのコマンドや、aws cliのコマンドを実行することができるので、buildspeckにコマンドを記載するだけで、様々なカスタマイズが行える。

今回の例では、Githubからソースコードをチェックアウトして、 `docker build` を行い、ECRにイメージをPushする。buildしたイメージにJSTの日時でタグを打つのだが、ビルド環境ではUTCなため、JSTの環境にしてからタグを付けるようにした。

```yaml:buildspeck.yml
version: 0.2
 
phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
      - echo Prepare JST locale
      - apt-get install -y tzdata
      - ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
      - export TAG=`date "+%Y%m%d-%H%M"`
      - echo Prepare tag $TAG
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $IMAGE_REPO_NAME:$TAG .
      - docker tag $IMAGE_REPO_NAME:$TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$TAG
      - echo Writing image definitions file...
      - printf '[{"name":"marquee","imageUri":"%s"}]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json
```
[Source buildspec.yml](https://github.com/tfunato/marquee/blob/master/buildspec.yml)

# その他のカスタマイズ
以下のGithub検索で、いろいろ見つかるかもしれない
https://github.com/search?q=filename%3A%7Bbuildspec.yml%7D&type=Code
【zabbix】ホスト自動登録時にIPアドレスが登録されない

# はじめに
zabbix-agentとzabbixサーバが疎通できたらホスト自動登録されるように設定したのですが、
以下のようになぜかIPだけ「0.0.0.0」の固定値が設定されてしまい苦戦したのですが、
ようやく解消できたので共有します。

![rapture_20181105225754.png](https://qiita-image-store.s3.amazonaws.com/0/298750/24044b03-d848-4cba-8e29-a93b73b2cc62.png)

# zabbix-agentのホスト自動登録
複数のWEBアプリケーションに登録したzabbix-agentのホストをひとつずつ手動でzabbix-serverへ登録するのはめんどくさいということで以下のサイトを参考に自動登録を試みました。

https://qiita.com/qryuu/items/39548aa77ef0e8152630

自動登録には2種類あります。

・アクションの自動登録機能を利用する方法
・ディスカバリ機能を利用する方法

まずは前者を試したのですが、ホスト名やグループ、テンプレートの設定はうまくいってるのになぜかIPだけ「0.0.0.0」の固定値が設定されてしまうという事象が起きました。。。

後者のディスカバリ機能も試してみたのですが、こちらはIPは問題なく設定されたのですが、ホスト名がzabbix-agent.confで指定したホスト名にならず、zabbix-agentのIPが設定されてしまいました。。。

こんなモグラ叩きの状態だったのですが、調べたところ後者のホスト名にIPが設定されてしまうのはどうしようもなさそうだということが分かりました。

なので、アクションの自動登録機能でうまくいかなかった原因を調べました。

すると、どうやらzabbix-agent側の**ListenIP**の設定がおかしいことに気が付きました！

# ListenIPとは
リクエストされたIPについて、どのIPを許可するかということを設定できる項目で、zabbix-agent側は「zabbix-agent.conf」、zabbix-server側は「zabbix-server.conf」で定義できます。

カンマ区切りで複数指定することもできるみたいです。
全てのIPを許可する場合は、「コメントアウト」もしくは「0.0.0.0」を指定すればよいです。

# ListenIPを指定する上での注意点
今回うまくいかなかったのは、「zabbix-agent.conf」の**ListenIPのコメントアウトが外されて、「0.0.0.0」**が指定されてしまっていたためでした。　　

```zabbix-agent.conf
### Option: ListenIP
#       List of comma delimited IP addresses that the agent should listen on.
#       First IP address is sent to Zabbix server if connecting to it to retrieve list of active checks.
#
# Mandatory: no
# Default:
ListenIP=0.0.0.0
```

**全てのIPを許可　= ListenIPのコメントアウト = 「0.0.0.0」**で一見問題なさそうに見えるのですが、自動登録時はListenIPに指定されたIPを参照し、zabbix-server側のホストのIPへ登録されてしまうので、「0.0.0.0」というIPが設定されてしまいます。

以下のようにListenIPをコメントアウトするとうまくいきました。

```zabbix-agent.conf
### Option: ListenIP
#       List of comma delimited IP addresses that the agent should listen on.
#       First IP address is sent to Zabbix server if connecting to it to retrieve list of active checks.
#
# Mandatory: no
# Default:
# ListenIP=0.0.0.0
```
![rapture_20181106004518.png](https://qiita-image-store.s3.amazonaws.com/0/298750/4572025c-a65e-be3d-d5e7-df42bec8cae6.png)

なので、
**ListenIPを指定する際は自動登録に影響するということを頭に入れておきましょう。**
**特に指定する必要がないのであればListenIPはコメントアウトするようにしましょう。**

まあデフォルトはコメントアウトされているので基本いじることはないと思いますが、、、(なんでいじってしまったんだろ・・・)

# さいごに
2020年から個人ブログはじめました！

フリーランスエンジニアになって得た知識と経験をもとに、フリーランスエンジニアに関する情報をはじめ、IT技術情報や業界情報、エンジニアライフハック等のコンテンツを配信していく予定です。

まだまだ記事数は少ないのですが、週単位で更新してますので、もしご興味ございましたら、みていただけると嬉しいです。

https://yacchi-engineer.com/

さいごまでお読みいただき、ありがとうございました。
Java OptionalのJavadocを眺める

# 何
- [前回の知識](https://qiita.com/ystkr/items/4018e4c46c44ea91b47a)を前提にOptionalのJavadocを眺める
- 眺め対象バージョン:Java8
- [Optionalのjavadoc](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html)
- SpaceDog -> Dog -> Animal -> Objectという継承関係です

#### public Optional\<T> filter(Predicate<? super T> predicate)
- filterは"boolean test(T t)"の実装を持つPredicateを引数にとる
- predicateはT型のインスタンスを受け取り、真偽を返す。そのとき、TではなくTの上位クラスが判定に使われても良い
- 具体例）Optional\<SpaceDog>のfilterをする際に、DogやAnimal,Objectをtest対象とするメソッドでも問題ない

#### public T orElseGet(Supplier\<? extends T> other)
- orElseGetは"T get()"の実装を持つSupplierを引数にとる
- otherはT型のインスタンスを返す。そのとき、TではなくTの下位クラスでも良い
- 具体例）Optional\<Dog>のorElseGetをする際に、SpaceDogを返却するメソッドでも問題ない

#### public void ifPresent(Consumer\<? super T> consumer)
- ifPresentは"void accept(T t)"の実装を持つConsumerを引数にとる
- consumerはT型のインスタンスを受け取り、何も返さない。そのとき、TではなくTの上位クラスが使われても良い
- 具体例）Optional\<SpaceDog>をifPresentする際に、DogやAnimal,Objectをaccept対象としても問題ない

#### public \<U> Optional\<U> map(Function\<? super T,? extends U> mapper)
- mapは"U apply(T t)"の実装を持つFunctionを引数にとる
- mapperはT型インスタンスを引数に取り、U型のインスタンスを返す。そのとき、TではなくTの上位クラス、UではなくUの下位クラスが使われても良い（消費側は上位、生産側は下位の解釈をとっても問題にならないルール）
- mapperはT(またはその上位)からU(またはその下位)への変換を行う

#### public \<U> Optional\<U> flatMap(Function\<? super T,Optional\<U>> mapper)
- flatMapは"U apply(T t)"の実装を持つFunctionを引数にとる
- mapperはT型のインスタンスを引数に取り、Optional\<U>型を返す。そのとき、TではなくTの上位クラスが使われても良い
- このときOptional\<U>はOptional\<? extends U>ではないんだなあ（ここは課題）
- 追記)Java9からOptional\<? extends U>に変わったことをコメントで教えてもらいました

``` java
Function<Integer, Optional<SpaceDog>> myConverter = new Function<Integer, Optional<SpaceDog>>() {
    @Override
    public Optional<SpaceDog> apply(Integer t) {
        SpaceDog d = new SpaceDog();
        d.age = t;
        return Optional.of(d);
    }
};

// Java8ではコンパイルエラー、Java9ではOK
Optional<Dog> optDog = optInt.flatMap(myConverter);

```

#### public T orElse(T other)
- orElseはT型のインスタンスを引数にとる
- ここは境界型パラメータなしでそのままなのか
- ジェネリック型でなければサブタイプでも使えるから良いのかな

``` java
	Optional<Dog> opt = Optional.of(new Dog());
	Dog d = opt.orElse(new SpaceDog());
```

- 追記）コメントでいただいた、境界型パラメータのOptionalではorElseが使えないという課題に対して、Optionalにこんなstaticメソッドがあったら、という改善案を考えてみました。

``` java

	/**
	 * OptionalのorElseを境界型パラメータのオプショナル変数でも使用可能にするためのメソッド
	 * 
	 * @param optT Tの生産者(Tの下位クラスを生産しても良い)
	 * @param other 「TかTの下位クラス」という制約を持ったU型
	 * @return T型で返す
	 */
	static <T, U extends T> T orElseEx(Optional<? extends T> optT, U other) { 
		if(optT.isPresent()) {
			return optT.get();
		}
		return other;
	}

//使用例
Optional<? extends Number> optNum = Optional.empty();
Number num2 = MyOptional.orElseEx(optNum, 0.5);
System.out.println(num2); //0.5

```
AIが勝手に犯罪者を見つけてくれる世の中で顔識別の精度はどれほど必要なのか

# 問題

20XX年、警視庁に勤めるあなたのもとに、とあるAI開発会社のセールスマンがやってきてこう言った：

「東京が超監視都市になって久しいものです。今や至る所に監視カメラがあって、東京に居て監視カメラに顔を映さない人など存在しないでしょう。そう、それが犯罪者であってもです。監視カメラが映す**1000万人の市民の顔**を、もっと有効活用しませんか？そしてそれには弊社で作ったこの**犯罪者識別機**を使えばよいのです」

「あらかじめインプットしておいた**100人の指名手配犯の顔**が監視カメラに一度でも映れば、この犯罪者識別機が即座に識別して教えてくれます。あなたたちの仕事は、この識別機が教えてくれた場所に行って指名手配犯を捕まえるだけでよいのです。もう東京に犯罪者は住めなくなりますよ」

「識別機の精度ですか？私共も誤認逮捕だけはごめんですからね、精度にはこだわりましたよ。弊社の技術を駆使して、なんと**99.9%**の精度で正しく識別できるところまで実現しました。これで誤認逮捕はほぼないでしょうね」

**1000万人**の中から指名手配犯**100人**を**99.9%**の精度で自動的に見つけてくれる機械。一見魅力的に思えるが、本当にそうだろうか？

# 回答

犯罪者識別機に「この顔を持つ人物は指名手配犯である」と識別された人が、本当に指名手配犯である確率を計算する。

```math
\frac{100 \cdot \frac{999}{1000}}{100 \cdot \frac{999}{1000} + 9,999,900 \cdot \frac{1}{1000}} = 0.0098912 \dots 
```

つまり、この犯罪者識別機によって犯罪者認定された人は、**99%以上の確率で犯罪者ではない**。とんでもないポンコツを掴まされそうになっていたのだ。

# じゃあどれほどの精度があれば十分なのか

犯罪者識別機が「この顔を持つ人物は指名手配犯である」と識別された人が、本当に指名手配犯である確率が**99.9%**になるための精度を計算する。以下の$p$に関する不等式を解けばよい。

```math
\begin{align}
&\frac{100 p}{100 p + 9,999,900 (1-p)} > 0.999, \\
\therefore \ &p > \frac{9989900100}{9989900101} = 0.99999999999899898898888988991092224246575706773837932867
\end{align}
```

とんでもない精度が求められる。
Ansibleで複数ユーザを一括追加

# Ansibleで複数ユーザを一括追加
Sambaで使用する複数ユーザを一括で追加する。

```:ディレクトリ構成
.
├── group_vars
│   ├── user_groups.yml
│   └── users.yml
├── hosts
├── roles
│   └── useradd
│       └── tasks
│             └── main.yml
└── setup.yml
```
```yml:setup.yml
- hosts: local
  user: vagrant
  roles:
    - setup
  vars_files:
    - group_vars/user_groups.yml
    - group_vars/users.yml
```
追加するユーザ・グループをgroup_varsに記述

```yml:user_groups.yml
user_groups:
  - { name: 'engineer', comment: 'エンジニアグループ' }
```
```yml:users.yml
users:
  - {name: 'user1', group: 'engineer', comment: 'ユーザ1'}
  - {name: 'user2', group: 'engineer', comment: 'ユーザ2'}
  - {name: 'user3', group: 'engineer', comment: 'ユーザ3'}
```
### 複数ユーザを追加
```yml:roles/useradd/tasks/main.yml
- name: グループ作成
  become: True
  group:
    name: "{{ item.name }}"
  with_items:
    - "{{ user_groups }}"

- name: ユーザ作成
  become: True
  user:
    name: "{{ item.name }}"
    shell: /bin/false
  with_items: "{{ users }}"

- name: グループ追加
  become: True
  user:
    name: "{{ item.name }}"
    append: yes
    groups: "{{ item.group }}"
  with_items: "{{ users }}"
```


group_varsに記述したユーザをwith_itemsを利用してループさせることで、一括追加。
今回は、Samba用アカウントなので、`shell: /bin/false`にしてshellを奪う。

[user - Manage user accounts — Ansible Documentation](https://docs.ansible.com/ansible/2.5/modules/user_module.html)
JAVA File操作をしようとした話

```JavaTest.java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class JavaTest {
	public static void main(String args[]) {
		String initPath="C:/test1/test2/test3/sample2.txt";
		String[] patharray=initPath.split("/");
		String fileName=patharray[patharray.length-1];
		String dirName="";
		for(String item:patharray) {
			if(item.equals(patharray[0])) continue;
			dirName=dirName+"/"+item;
			System.out.println(dirName);
			File file = new File(dirName);
			file.mkdir();
		}
		
		String path=dirName;
		String path2=fileName;
		File file = new File(path+"/"+path2);
		try {
			if (file.createNewFile()){
				System.out.println("成功");
			}else{
				System.out.println("失敗");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			FileWriter writer = new FileWriter(path+path2);
			writer.write("testtesttest");
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}
```

はい。initPathのやつを作ってくれます。
ただ、mkdirメソッドの親戚にmkdirsメソッドとかいうやつがいて

```JavaTest.java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class JavaTest {
	public static void main(String args[]) {
		String initPath="C:/test1/test2/test3/sample3.txt";
		String[] patharray=initPath.split("/");
		String fileName=patharray[patharray.length-1];
		String dirName="";
		for(String item:patharray) {
			if(item.equals(patharray[0])) continue;
			if(item.equals(patharray[patharray.length-1])) continue;
			dirName=dirName+"/"+item;
		}
		
		File filemake = new File(dirName);
		filemake.mkdirs();
		String path=dirName;
		String path2=fileName;
		File file = new File(path+"/"+path2);
		try {
			if (file.createNewFile()){
				System.out.println("成功");
			}else{
				System.out.println("失敗");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			FileWriter writer = new FileWriter(path+path2);
			writer.write("testtesttest");
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

```

これに気づいたの結構後でした。
というかそもそもこれがあるならforでぶん回さなくてもいい気がする。
あと記憶だと書き込みついでにディレクトリを作ってくれるものもあったような...
参考URL
https://www.sejuku.net/blog/20527
Swift 4.2からBool型を反転させる"toggle"メソッドが追加された

Swift 4.2からBool型を反転させる"Toggle"が追加されたので、紹介したいと思います。

https://developer.apple.com/documentation/swift/bool/2994863-toggle

どういうものかというと、Bool型の`true`を`false`に、`false`を`true`にするというものです。

具体的に例を挙げてみます。

```Swift:Swift
@IBOutlet func onButtonTapped(_ sender: UIButton) {
    sender.isSelected = !sender.isSelected
}
```

上記のように選択されていないものを選択済みにしたり、その逆で選択されているものを非選択にする、というような時には上記のように書いていました。

Swift 4.2から追加された`toggle()`を使えば以下のように記載することができます。

```Swift:Swift
@IBOutlet func onButtonTapped(_ sender: UIButton) {
    sender.isSelected.toggle()
}
```

上記の通りなのですが、プロパティに代入していましたが、メソッドのように実行する形式でBool型を反転することができるようになりました。

`toggle()`はBool型のメソッドなので、`UIStackView`に内包しているオブジェクトの`isHidden`の切り替えにも使えます。

```Swift:Swift
@IBOutlet func onButtonTapped(_ sender: UIButton) {
    self.leftView.isHidden.toggle()
}
```

`isSewlected`から`isHidden`に変えただけですが、Bool型であれば`toggle()`で切り替えることができます。

`UIStackView`の中のViewを表示・非表示するサンプルコードをリポジトリで公開しています。

▶https://github.com/takashings/ToggleSample.git

<img width="320" src="https://qiita-image-store.s3.amazonaws.com/0/40009/ad9fc09b-1f61-593a-b1fa-21c72d780735.png">

`UIBarButtonItem`をタップするごとに`UIStackView`に内包された左右の`UIView`の表示・非表示を切り替えることができます。

```Swift:Swift
@IBAction func onLeftBarButtonItemTapped(_ sender: UIBarButtonItem) {
    self.leftView.isHidden.toggle()
}
    
@IBAction func onRightBarButtonItemTapped(_ sender: UIBarButtonItem) {
    self.rightView.isHidden.toggle()
}
```
漸化式z_{n+1}=z_n(1-z_n)の証明

$z_0=\frac{1}{2}$と漸化式$z_{n+1}=z_n(1-z_n)$で数列$z_n$を定義します。
この$z_n$について$\lim_{z\rightarrow \infty}z_n=0$を証明します。

## 補題1

### 主張

$z_n$は、全ての$n$について$0< z_n\le \frac{1}{2}$が成り立つ。

### 証明

これを示すために、$0< z_n\le \frac{1}{2}$が成り立つとして、$0<z_{n+1}\le \frac{1}{2}$を示します。
$0< z_{n}\le \frac{1}{2}$とすると$\frac{1}{2}\le 1-z_n<1$ですので、$0< z_n(1-z_n)=z_{n+1}$がわかります。さらに、$z_{n+1}=z_n(1-z_n)\le z_n\le  \frac{1}{2}$となります。

以上で全ての$n$について$0< z_n\le \frac{1}{2}$がわかりました。

## 補題2

### 主張
$z_n$について$n\ge 1$のときに$z_n\le \frac{1}{n}$が成り立つ。

### 証明

まず、$z_1=\frac{1}{4}<1$なので$n=1$のときに主張は成り立ちます。
次に$z_n\le \frac{1}{n}$とすると、

```math
\begin{eqnarray}
z_{n+1}&=& z_n(1-z_n) \\
&\le& z_n(1-z_n)+\frac{z_n^3}{1+z_n} \\
&=& \frac{z_n(1-z_n)(1+z_n)+z_n^3}{1+z_n} \\
&=& \frac{z_n}{1+z_n} \\
&=& 1- \frac{1}{1+z_n} \\
&\le& 1-\frac{1}{1+\frac{1}{n}} \\
&=& \frac{1}{n+1}.
\end{eqnarray}
```

なので$z_{n+1}\le \frac{1}{n+1}$となります。

上記より全ての$n\ge 1$に対して$z_n\le \frac{1}{n}$がわかりました。

## 目標の証明

補題1と補題2より$n< 1$のときに$0\le z_n\le \frac{1}{n}$がわかりました。はさみ打ちの原理より、$z_n$は$0$に収束します。
まとめると以下のようになります。

$z_0 =\frac{1}{2}$とします。$z_n$は漸化式$z_{n+1}=z_n(1-z_n)$を満たすとすると、次が成り立つ。

```math
\lim_{n\rightarrow \infty}z_n = 0
```

# 補足

$f(x)=x(1-x)$のような関数をロジスティック写像と呼び、この写像を反復することで得られる数列は複雑な挙動をすることがあります。今回は0に収束するので単純な挙動です。

$g(x)=\frac{x}{1+x}$のような関数を一次分数変換と呼び、一次分数変換は合成について閉じています。今回は、複雑な動きをする$f(x)$に近い動きをするけど合成に強い$g(x)$を用意して、証明しました。
conohaのドキュメントは一部足りていない

#やりたいこと

####VPSにPHPの実行環境を作る

下記のドキュメント通りなはずなのですが......
https://support.conoha.jp/vps/school/hellovps03/?btn_id=school-hellovps04_school-hellovps03

###Firewallの設定が漏れています。


####やるべきは下記。


ステータスの確認

```
$ systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since 日 2015-12-13 17:52:05 JST; 1h 27min ago
 Main PID: 597 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─597 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

12月 13 17:52:05 x-x-x-x systemd[1]: Started firewalld - dynamic fire....
Hint: Some lines were ellipsized, use -l to show in full.
```

内容の確認

```
$ firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
```

変更


```
$ sudo firewall-cmd --permanent --add-service=http --zone=public
success
```


変更後の確認

```
$ firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources: 
  services: dhcpv6-client http ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
```


###なんだよ〜
SORACOM Button でバスターコールを発令してみた

どうも若松です。

SORACOM LTE-M Button で何作ろうかと悩むのは楽しいですね。
せっかくなので押しがいがあるのを作りたいといろいろ考えていたときに、あるマンガの場面を思い出しました。
###<font color="Red">バスターコール</font>
　　
ワンピースに出てくる、全てを破壊する命令ですね。
このバスターコールを発令するきっかけがボタンなのです。

# AWS式バスターコール
(プロレス技みたいですね)

せっかくLambdaをキックできるので、AWSリソースを破壊してみようと思います。
流石にAWSサービスは多すぎるので、EC2インスタンスの範囲に限定することにしました。

SORACOM Button → AWS IoT → Lambda → EC2Terminate

という構成です。

# Lambda
コードは以下となります。
言語はPython3.6です。

```python:BusterCall
import boto3
import jmespath

def lambda_handler(event, context):

    ec2 = boto3.client('ec2')
    
    instanceids = jmespath.search(
        'Reservations[].Instances[?State.Name!=`terminated`][].InstanceId',
        ec2.describe_instances()
    )

    for instanceid in instanceids:
        ec2.modify_instance_attribute(
            InstanceId=instanceid,
            DisableApiTermination={
                'Value': False
            }
        )

    ec2.terminate_instances(
        InstanceIds=instanceids
    )
    
    print(instanceids)

    return
```

# AWS IoT
以下のように設定を済ませます。
<img width="989" alt="スクリーンショット 2018-11-05 22.38.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/4185200e-25f7-bbe2-27b6-3ffb61f92cd0.png">
<img width="989" alt="スクリーンショット 2018-11-05 22.38.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/95382228-517d-2abb-a2e0-789fb1fc3c8d.png">
# EC2
流石に東京リージョンは怖いので、オレゴンで行います。
インスタンスは何でもいいのでt2.nanoで2台起動しました。
`ENIES LOBBY` には世界政府の旗代わりにTerminateProtectionを設定しておきます。
<img width="881" alt="スクリーンショット_2018-11-05_22_41_15.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/42721729-05eb-ca8e-1791-edf4e8998b4d.png">

# バスターコール発令
全てを焼き尽くします。
TerminateProtectionとて効きません。
無慈悲です。
<img width="884" alt="スクリーンショット_2018-11-05_22_45_00.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/aa883e5d-cc19-0675-ff69-478dbfe58442.png">
<img width="895" alt="スクリーンショット_2018-11-05_22_45_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/94816/ccf4e0f3-44fb-d0fc-6fcc-fec5668340b3.png">

# まとめ
ボタンひとつでインスタンスが消し飛んでいくのは意外と爽快です。

本当はAMIやEIPとかも削除するようにしようかと思ってましたが、キリが無くなりそうなのでやめました。
検証環境とかで全てのインスタンスを燃やし尽くしたいときとか便利ですね(私は怖いので使いません。
【Unity(C#)】別のスクリプトのメソッドを簡単に呼び出す方法

　　
　　
　　

この記事は

**『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』**

の記事です。そのつもりでお読みください。
　　
　　


# Unity(C#)で別のスクリプトのメソッドを簡単に呼び出す方法


まずヒエラルキー上を確認しましょう。

呼び出したいメソッドがAdd Componentされた状態のオブジェクトがありますか？

あれば準備完了です。

ヒエラルキー上に無い場合はスクリプトをAdd ComponentしたらOKです。
　　
　　
　　
####メソッドを呼び出す方法

呼ぶ出される側のクラスの名前は適当に"YobidashitaiClass"ってことにしましょう。
呼び出したいメソッドの名前は適当に"YobidashitaiMethod"ってことにしましょう。

```C#
FindObjectOfType<YobidashitaiClass>().YobidashitaiMethod();
```
　　
　　

めちゃくちゃ簡単ですね。
ただし、処理速度とか難しい話は知りません。

---
2021/11/08 追記

`YobidashitaiClass`の`YobidashitaiMethod`はPublicである必要があります。

```cs
public class YobidashitaiClass : MonoBehaviour
{
    public void YobidashitaiMethod()
    {
        //hoge
    }
}
```
Rails以外の開発環境でも有用なgem

## 概要
ちまたではRubyと言ったらRailsだけど、古めのプロジェクトだとつかってないこともあるよねぇ。
てなわけで、Gem紹介。
API開発だったらRails使わないこともあるかも(RailsAPI?なにそれ美味しいの)。

基本的に、開発用のGemに限ります。KaminariやDeviceなどのラクラク機能追加キットみたいなのは、扱いません。

## Pry関係

まず[Gem公式ページ](https://rubygems.org/)でPryと調べると色々出てくる。
そこから良さげなものをPickupしてきたい。
## 執筆中
### pry-debugger
### pry-rescue
### pry-theme
### pry-stack_explore
### pry-inline
### pry-highlight

## その他

### rake-notes
TODO など書いてある場合、一括して出してくれる。
詳しい使い方は下記参考
[Rails以外でRubyのアノテーションコメントをリストアップする](https://qiita.com/tbpgr/items/75a30656ede42dc632c7)
CSScomb で calc() を使うと「Please check validity of the block starting from line #～ CSScomb Core version: 4.2.0」が発生する原因と解決策

## CSScomb を使っていた
色々なエディタにプラグインがあることとか、簡単に使えて便利だったのもあって、 CSScomb を愛用していた。
そんなある日、あるエラーにぶち当たった。それがこれである。

## 'Please check validity of the block starting from line #21 CSScomb Core version: 4.2.0'

```sh
'Please check validity of the block starting from line #21
CSScomb Core version: 4.2.0'
```

なんだこれは？文法エラーか？とも思った。しかし、そんなはずはない。
私は CSScomb を通す前に文法チェックを挟んでいる。文法エラーが出るなら、そこのはずだ。そもそも、エディタに入っている linter が反応していないということは、コードには問題はないはずだ。

つまり、これは CSScomb のバグだということになる。時刻は22時、まだ風呂も入っていない。正体の見えないバグとの戦いが始まった。

## 問題部分はどこか
まず、CSScomb 以外では文法エラーが発生していないにも関わらず、文法エラーが出ていることから、 CSScomb に組み込まれている、**CSS の構文を解析する処理になんらかの不具合が発生している**と考えた。

そこで私は、ひたすらに探した。CSSパーサを。`babel-polyfill`...コレは違うな。`glob`...コレも違う。`ちくわ大明神`...誰だ今のは。そんなこんなで、とうとう見つけ出した。 CSSComb は、[`gonzales-pe`](https://github.com/tonyganch/gonzales-pe)という CSS パーサを使っているようだ。しかも、このパーサの作者の tonyganch さんは CSScomb の作者じゃないか。びっくり。

そして、このパッケージのコミットログを読むと、[こんなものが見つかった](https://github.com/tonyganch/gonzales-pe/commit/ea0fcdf13bcf0311570a6bae8a4774056c90d5ba)。これを読む限り、どうやらこのコミット以前のバージョンでは、**`calc()`での乗算に対応していなかった**ようだ。私の CSS のコードを見ると、確かに `calc()`内で乗算をしている。恐らくこれが原因だろう。そこで、インストールした CSScomb の中の`package.json`に書いてある`gonzales-pe`のバージョンを最新のものに書き換え、

```diff
"dependencies": {
  "babel-polyfill": "6.23.0",
  "glob": "latest",
-  "gonzales-pe": "^3.4.7",
+  "gonzales-pe": "^4.2.0",
  "minimatch": "3.0.2",
  "minimist": "1.1.x",
  "vow": "0.4.4",
  "vow-fs": "0.3.6"
}
```

`npm update`コマンドを実行した。

```sh
npm update --save --depth=99999
```

すると、`calc()`で乗算を使っていても、うまく CSS がフォーマットされた。

## CSScomb は使うな
いやー、長い戦いだったなぁ、と落ち着き、リラックスがてら[ tonyganch さんのサイト](https://tonyganch.io/)を見ていたら、なんとこんなことが書いてあった。

> My (**deprecated**) projects:
　CSScomb (CSS coding style formatter)
　GPE (CSS parser with support of preprocessors)

で、deprecated！？だから`calc()`の乗算ができない問題も CSScomb だと修正されてなかったのか...。

というわけで、 **CSScomb では、今後発生したバグも修正される見込みが薄い**ため、今から使い始めることはオススメしません。今 CSScomb を使っている人も、**他のパッケージに移行**しましょう。

しかし、私はどうしようか。
[stylefmt](https://github.com/morishitter/stylefmt)か、[postcss-sorting](https://github.com/hudochenkov/postcss-sorting)か、[prettier](https://github.com/prettier/prettier)か...。選択肢がいっぱいありすぎる。悩ましい。

私たちの戦いは、これからだ。
合成数列の和 (Kuin)


|合成数列の和|https://qiita.com/advent-calendar/2018/composite-number|
|:--|:--|
|Python(/Ruby)|https://qiita.com/cielavenir/items/dcbd839b0c66af1bc971|
|Crystal|https://qiita.com/cielavenir/items/1a0dd1a94aca9935f5aa|
|Kuin|https://qiita.com/cielavenir/items/47fd18fc68055d990599|
|Swift|https://qiita.com/cielavenir/items/6cde3b20866c842dc9e2|
|Kotlin|https://qiita.com/cielavenir/items/f58eaa30f90781229a6d|
|Pascal|https://qiita.com/cielavenir/items/35c2fc54ca16b620c9c7|

Rubyから雑に移植したCrystalで枠を得るのははばかられる状況になったので、若干マイナーなところで[Kuin](http://kuina.ch/kuin)。

くいなちゃんはcui版だけで良いのでマルチプラットフォームに早く汁☆

```kuin:composite.kn
func isqrt(n: int): int
	if(n <= 0)
		ret 0
	end if
	if(n < 4)
		ret 1
	end if
	var x: int :: 0
	var y: int :: n
	while(x <> y & x + 1 <> y)
		do x :: y
		do y :: (n / y + y) / 2
	end while
	ret x
end func

func main()
	var n: int :: 0
	var cnt: int :: 0
	var i: int :: 3
	var s: int :: 0
	var _: bool
	do n :: cui@input().toInt(&_)
	while _composite(cnt < n)
		do i :: i + 1
		block _chkprime
			if(i < 2)
				break _chkprime
			end if
			for j(2, @isqrt(i))
				if(i % j < 1)
					break _chkprime
				end if
			end for
			; prime
			skip _composite
		end block
		; composite
		do cnt :: cnt + 1
		do s :: s + i
	end while
	do cui@print(s.toStr())
	do cui@print("\n")
end func
```
Hugo のビルド時に HTML ファイルを圧縮(Minify)する

`hugo` コマンドで静的サイトを生成する時にHTMLファイルを圧縮できます。

## 圧縮の方法

方法はとても簡単で、 `hugo` コマンドにオプションをつけるだけです。

```
hugo --minify
```

これを実行した後、 `cat ./public/index.html` とかで中身を見るとちゃんとHTMLが圧縮されていることが確認できます。

## HTML内のCSSとJavaScriptも圧縮される

ちなみに `<style>` の中に書かれている CSS や `<script>` の中の JavaScript もちゃんと Minify されます。

## 参照

- [hugo Command Options | Hugo](https://gohugo.io/commands/hugo/)

> `--minify` minify any supported output format (HTML, XML etc.)
googletest とテストコードをリンク時にエラー発生

# google test と テストコードをリンク時に発生したエラーを対処した話

## 発生したリンクエラー

libgtest.a とテストコードを以下のようにリンクした。

```
g++  -I./test-code/inc -I./googletest/googletest/include -I./googletest/googlemock/include -coverage -std=c++11 -L./test-target/lib -L./googletest/lib -o bin/google-test-example1 test-code/obj/google-test-example1.o -lpthread -ltest_target -lgtest -lgmock -lgtest_main
```

すると、以下のようなエラーが発生。

```
gtest-all.cc:(.text._ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED2Ev[_ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEED5Ev]+0x24): `pthread_getspecific' に対する定義されていない参照です
```
## 対処

-lpthread を一番後ろに持っていくとうまくいった。[^1]

```
g++  -I./test-code/inc -I./googletest/googletest/include -I./googletest/googlemock/include -coverage -std=c++11 -L./test-target/lib -L./googletest/lib -o bin/google-test-example1 test-code/obj/google-test-example1.o -ltest_target -lgtest -lgmock -lgtest_main -lpthread
```


[^1]: 恥ずかしながらライブラリの記述順序に対する知見がないので勉強したいと思った。
【システム環境設定を行っても解決しない方向け】MacOS Mojave で crontab -e できない

# 背景

iTermから `crontab -e` を実行し、crontab設定を行っても以下のようなエラーが出続ける。

```
crontab: installing new crontab
crontab: tmp/tmp.7391: Operation not permitted
crontab: edits left in /tmp/crontab.bnGaalvOCm
```

* 参考 : [macOS Mojave で crontab -e できない](https://qiita.com/labocho/items/e1d8ae8223f60ad9d4ee)

---

原因が意外なところにあった。MacOS上の以下の設定を正しく行っても問題が解決しない人向けに。

* **システム環境設定**
    * > "セキュリティとプライバシー"
        * > **"アクセシビリティ"**
        * > **"フルディスクアクセス"**

---

# 原因

僕の場合は上記を設定するだけではだめで、 **TMUX** を停止させることで解決した。
もし困っている人がいれば、一度 **TMUX** のプロセスをすべて停止した状態でお試しください。


# 環境

```sh
% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14
BuildVersion:   18A391

% tmux -V
tmux 2.8

% date
月 11  5 22:40:36 JST 2018
```
Unityでより多くの知識を得るためにGame a weekに挑戦します！

Unity歴一週間のわいがUnityのスキルをたくさん得るためにGame a weekに挑戦してみようかなと思いました。C#も初心者でそこそこの基本的な知識しかないためできるかは心配ですができるところまでやってみたいと思います。
まずGame a weekとは？
～～～～～～～～～～～～～～～～～
１．毎週ゲームを一本ずつ作る
　　（月曜日の12:00にプロジェクトを開始し、日曜日の23:59までにゲームを作り終わる
２．毎週ゲームをリリースする
　　（作ったものは例えクソゲーでもWebサイトを通じて配信を行うこと。さらにSNSやブログなどでそれを告知すること
３.作り終わったゲームは修正しない
　　（ゲーム完成後は手を入れてはダメ。どうしても修正したい場合は Game A Week 終了後に行うこと
４.パターン化を避ける
　　（毎週、異なることにチャレンジすること。例えばデジタルゲームを作る代わりにアナログゲームを作る、アクションゲームではなくパズルゲームを作る、など
５.振り返りを行う
　　（作って良かったところ、間違っていたところ、興味深かったところ、などをまとめておきます。作ったゲームは何人かにプレイしてもらい感想を聞くこと。そしてその感想をまとめておくこと
～～～～～～～～～～～～～～～～～
引用先　http://2dgames.jp/2016/02/28/game_a_week/

いつも何か作ると途中で終わってしまうことが多いいのでこのGame a weekを使いたくさんの知識を得たい。毎週作ったゲーム内容と感想や反省点などをここに書き込みます！
また、プログラミングの知識をもっと深めたいので一緒にいろんなプログラミングしてみたい、興味があるという方々いらっしゃったらぜひぜひ　https://discord.gg/nXsrapp
ご参加ください！！！
ES6でのvar、let、constの使い分け

JavaScriptの変数の宣言方法は３つあります。var、let、constです。
JavaScriptの変数の宣言は元々varのみでした。ES6では、letとconstが追加されました。
そこで、var、let、constの使い分けを紹介をしたいと思います。

## var - 変数を宣言する（再定義可）

特徴として、再代入可能で再定義可能です。

```js
var x = 3;
x = 4;
var x = 4;
```

###スコープ
ブロックの中で宣言した変数をブロックの外でも使用できます。

```js
if (true) { var y = 3 }
console.log(y); // 3 

for (var i = 0; i < 10; i++) {
  // do something
}
console.log(i); // -> 10
```

varはスコープの範囲が広く、挙動の予測が難しくなるため、今後varでの変数の宣言は避けるべきです。

## let - 変数を宣言する（再定義不可）

再代入可能な変数を宣言する場合に使用します。varと異なる点は変数名を再定義できません。

```js
let x = 3;
x = 4;
let x = 4; <- error

// if文
let name;
if (mode === "slack") {
  name = "youichi";
} else if (mode === "twitter") {
  name = "@wozozo";
}
```

### スコープ
ブロックの中で宣言した変数はブロックの外では使用できません。

```js
if (true) { let z = 4 }
console.log(z) <- error

for (let i = 0; i < 10; i++) {
  // do something
}
console.log(i); <- error
```

再代入可能な変数を宣言する場合では、影響範囲がvarよりも小さくなるため、varではなくletを使用するべきです。

## const - 再代入不可能な変数を宣言する
constは再代入不可能で再定義不可能な変数を宣言する場合に使用します。

```js
const x = 3;
x = 4; <- error
const x = 4; <- error
```

### スコープ
letと同様に、ブロックの中で宣言した変数はブロックの外では使用できません。

```js
if (true) { const z = 4 }
console.log(z); <- error
```

いずれの３つの宣言方法で、まず使うべきはconstです。変更が必要のないものは「もう変更がない」と宣言することで、他のコードへの影響を小さくします。

## まとめ
- varは使用しない
- 基本的にconstを使用する
- 再代入が必要な場合は、letを使用する

## 参考
[イマドキのJavaScriptの書き方2018 - Qiita](https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9)
[JavaScriptにおけるvar/let/constの使い分け](https://sbfl.net/blog/2016/07/14/javascript-var-let-const/)