OmniAICreator/Qiita-1.07M huggingface dataset:
UIViewControllerでUITableViewのStatic Cellsを使う

## はじめに
iOSアプリを作りながら勉強している大学生です。
自分が躓き、自分なりに解決策を見つけられたので書き起こしました。
素人なので、わかりにくい場合はご容赦ください🙏

## Static Cellsとは
Static Cellsとは、セルを静的に扱うUITableViewのコンテントモードのことです。
<img width="375" alt="IMG_3859.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/189574/37fee7a1-ba62-820b-7c3e-4e2e96b3b57b.png">
よくみるのは、設定画面のUITableViewではないでしょうか。

## Static cellsはUIViewControllerでは使えない
UITableViewControllerを親要素としないとエラーを吐いてしまう。
<img width="264" alt="スクリーンショット 2018-10-09 9.53.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/189574/c9aa430c-b867-61d6-cf8c-17fa3a82e1de.png">

## Container Viewを使って解決
TableViewだとレイアウトの幅があまりない…　でも、Static cellsはUIViewControllerでは使えない…
そんなときは、Container Viewを使ってUIViewControllerを配下に持たせればうまくいきます。
イメージはこんな感じです〜↓↓↓
（Container ViewとUITableViewControllerは「Embed」で結びます。）
<img width="554" alt="スクリーンショット 2018-10-09 10.04.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/189574/31d5345d-bcbc-d685-04d9-7ca6e0685827.png">
UIViewControllerの上にContainer Viewを置き、Container Viewの中にUITableViewControllerを入れてやるって感じです。

## 他のViewと組み合わせる
Segment Buttonと組み合わせて、画面を作ってみました。
<img width="375" alt="iOS の画像.png" src="https://qiita-image-store.s3.amazonaws.com/0/189574/c3bc970f-0230-ca27-4d7b-f315711fe2f3.png">
<img width="375" alt="iOS の画像 (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/189574/c8193fdd-8585-ba0a-0821-13ce30c709cf.png">

Static Cellsを使うとiOSっぽい（？）デザインで簡単に画面が作れるような気がしました。
TableViewすごく便利！

## 参考サイト
- [[iOS]UITableViewのStatic CellsをUIViewControllerで使いたい！](https://dev.classmethod.jp/smartphone/iphone/uitableviewcontroller-in-containerview-on-uiviewcontroller/)
- [【Swift】UIViewControllerでStatic CellsのTableViewを使う](https://www.poly-rhythm.com/static-cells-on-uiviewcontroller/)
濁点付きの半角カタカナを全角カタカナに変換する

Laravelで構築している検索サイトがあります。
こちら検索時に半角の場合の対応を依頼されたので、mb_convert_kana($keywords, 'K')で対応したが、濁点付きの半角カタカナを全角に変換したら2文字になってしまいます。

## mb_convert_kanaに以下のオプションを付与する事で解決
解決案はそんなに難しくなく、mb_convert_kanaで調べるとオプションがあり、それを使うことで1文字の全角カタカナに変換してくれるようです

mb_convert_kana($keywords, 'KV')
Pythonの処理を高速化するメモ化ツール「KurumiPy」を作った

Pythonでメモ化を簡単に適応することができるツール**「KurumiPy」**を開発して、OSSとしてGitHubに公開しました。

プログラムを再実行してもキャッシュを利用することができます。

https://github.com/FujitsuLaboratories/kurumipy

# そもそもメモ化って何？

フリー百科事典『ウィキペディア（Wikipedia）』（2018年10月5日時点）には以下のように書かれています。

> メモ化（英: Memoization）とは、プログラムの高速化のための最適化技法の一種であり、サブルーチン呼び出しの結果を後で再利用するために保持し、そのサブルーチン（関数）の呼び出し毎の再計算を防ぐ手法である。メモ化は構文解析などでも使われる（必ずしも高速化のためだけとは限らない）。キャッシュはより広範な用語であり、メモ化はキャッシュの限定的な形態を指す用語である。

関数において、同じ入力データ（引数の値）に対して、同じ戻り値になる処理を何回もするのは無駄です。

そこで、1回目の関数の処理の結果をキャッシュ（保存）しておいて、2回目以降は、その関数内の処理はせずに、キャッシュしておいたデータをそのまま返すということをします。

これで、同じ処理を何回もすることを省略することができるため、その分、処理が高速になりますよ！といったものです。

# なぜわざわざKurumiPyを作ったの？

そんなに処理が重くないシステムを開発している場合は、メモ化の必要性は低いです。

しかし最近は、AI！AI！データ分析！データ分析！AI！！データ分析！！と世の中で叫ばれまくっており、今の流行では、Pythonを使って、大量のデータ処理をすることが増えています。

例えば、下図のように、大量のセンサデータを入力として、いくつものデータ処理をするシステムがあるとします。

![KurumiPy 説明図](https://qiita-image-store.s3.amazonaws.com/0/227024/d4556dc8-945d-acb4-07d2-28321ae5cc3e.png)

このような時に、ほんのちょっとプログラムを変更してみて、プログラムを実行して出力結果を見ようとした場合、プログラムを書き換えていないデータ変換処理がある関数についても、再度実行されています。

例えば、上図の「データ変換処理C」の関数内のプログラムを変更して再実行する場合は、「データ前処理」と「データ変換処理A」と「データ変換処理B」の関数の部分については、前に実行した結果を再利用しても、結果は同じです。

このような時に、メモ化によってキャッシュしていたデータを再利用することで、「データ変換処理C」より前の処理を省略することができ、出力結果を素早く出力することができるようになります。

少量のデータの場合は、そこまで必要性はないかもしれませんが、入力データが数Mバイト以上になってくると利用価値が出てきます。

私はとあるシステムを開発していたのですが、そのシステムではデータ処理をして、結果を出力するまでに40秒以上掛かっていました。

しかし、KurumiPyでメモ化を適用することで、結果を出力するまでに掛かる時間が1秒以内になりました。

データ分析処理をするシステムを試行錯誤で開発しているときは、変数の値をちょっとだけ変更して、再実行して結果を見たいということがあります。

そのような時、結果を出力するまでに、毎回何秒も掛かっていたら、大きなストレスになります。

そういう時に、KurumiPyが本領発揮します。

## そもそもDBを利用してキャッシュすれば…

実際、DB（データベース）をうま〜いこと使って、最適化したら、同じ処理を何回もする必要がありません。

だったら、メモ化ツールはいらないじゃん！となるかもしれませんが、仮説検証の開発フェーズやプロトタイプを作るときは、DBをわざわざ用意するのが面倒です。

また、DBを用いたとしても、うま〜いこと最適化することが難しい場合があります。

そういう時に、メモ化が欲しい！となってくるのです。

欲しい！となって来たので、KurumiPyを作ったのです。

# KurumiPyの使い方

サポートしているPythonのバージョンは3.xです。

事前に、依存パッケージの[「fasteners 0.14.1」](https://pypi.org/project/fasteners/)を例えば以下のようにして、インストールしてください。

```bash
pip install fasteners==0.14.1
```

適用したいプロジェクトに、GitHubの[「KurumiPyリポジトリ」](https://github.com/FujitsuLaboratories/kurumipy)にある「memoization」フォルダをコピーし、モジュールをインポートします。

そして、以下のようにして、メモ化を適用した関数の前にデコレータを書きます。

```python
from memoization.memo_decorator import memo

@memo
def your_function(n):
    # ...
```

これだけでメモ化を適用することができます。

メモ化でキャッシュしたファイルは、以下のフォルダに格納されます。そのため、プログラムを再実行した時もキャッシュを利用できます。

**[./memoization/memocache]**

メモ化を適用した関数内のコードや依存する変数の値が変わった時は、関数の処理の振る舞いが基本的に変わるため、自動でキャッシュを破棄する仕組みになっています。

それ以外の時は、上記フォルダにキャッシュがどんどん溜まっていくため、必要があれば、上記フォルダのキャッシュファイルを適宜削除してください。

## 制約事項

* 純粋関数のみ対応
* 適用する関数の引数はstring type, numeric typeのみ対応（list type, dict type, set type, file objectsなどは対応していませんので、適宜string typeに変換処理などしてください。）
* 複数スレッドの相互再帰関数（食事する哲学者の問題）には、対応していません。

## その他設定

Python3.3では、デフォルトでstr, bytes, datetime objectsのハッシュでsaltが有効になっています。

そのような場合は、KurumiPyを適用したPythonのプログラムを実行する前に、以下のようにしてsaltを無効にする必要があります。

```bash
# bashの場合
export PYTHONHASHSEED=0

# Command promptの場合
set PYTHONHASHSEED=0
```

# なぜ「“Kurumi”Py」という名なの？

kurumiは**「クルミ」**が由来です。

本当かどうかはわかりませんが、クルミを食べると記憶力が上がると言われているので、メモ化とマッチしていると考え、「kurumi」にしました。

KurumiPyを利用して、賢く効率良く、開発しましょう！
Google Cloud Buildのビルドステップ定義に日本語を含めるとエラーになる

## 概要

まじすか。

## 前提条件

GCPプロジェクト、```gcloud``` コマンドが利用できる前提です。

## 検証

問題がないケースです。
単純に```bash``` で```echo``` するだけの定義です。

``` yaml:cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args: ['-c', 'echo "hoge!"']
```

```sh
> gcloud builds submit --config=cloudbuild.yaml --no-source
(略)
FETCHSOURCE
BUILD
Already have image (with digest): gcr.io/cloud-builders/docker
hoge!
PUSH
DONE
(略)
```

はい。

日本語を含めてみます。

``` yaml:cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args: ['-c', 'echo "ほげ！"']
```

```sh
> gcloud builds submit --config=cloudbuild.yaml --no-source

ERROR: gcloud crashed (error): bad character range

If you would like to report this issue, please run the following command:
  gcloud feedback

To check gcloud for common problems, please run the following command:
  gcloud info --run-diagnostics
```

```bad character range``` でエラーになります。
まじすか。。。

コメントに含めてもだめでした。

``` yaml:cloudbuild.yaml
# ほげ
steps:
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args: ['-c', 'echo "hoge!"']
```
YAMLファイルだからか？と思ってJSONファイルにしてみましたが、それでもだめでした。

いろいろと試してみましたが、いまのところはcloudbuild.yaml内で日本語が利用できないものと諦めていたほうがよさそうです。

## Issue登録してみた

せっかくなので```gcloud feedback``` コマンドからIssue登録してみました。

``` sh
> gcloud feedback

We appreciate your feedback.

If you have a question, post it on Stack Overflow using the "gcloud" tag at
[http://stackoverflow.com/questions/tagged/gcloud].

For general feedback, use our groups page
[https://groups.google.com/forum/?fromgroups#!forum/google-cloud-dev],
send a mail to [google-cloud-dev@googlegroups.com] or visit the [#gcloud] IRC
channel on freenode.

Which recent gcloud invocation would you like to provide feedback
about? This will open a new browser tab.
 [1] [gcloud builds submit] (crash detected): 6 seconds ago
 [2] [gcloud feedback]: 26 seconds ago
 [3] [gcloud builds submit] (crash detected): 3 minutes ago
 [4] [gcloud builds submit]: 3 minutes ago
 [5] [gcloud builds submit] (crash detected): 10 minutes ago
 [6] None of these
Please enter your numeric choice (1):
```

実行コマンドが選択できるようになっていて、選択するとGoogle Issue TrackerのNew Ussueページが開き、トレースログなどが設定されて、スムーズにIssue登録できました^^

https://issuetracker.google.com/issues/117105234

Issue登録後、Googleの中の人から再現できたよとコメントがありましたが、修正予定はまだないとのことでした。
アウトプットは自己表現であり、自己実現するための手段でもある

本投稿を準備していたら、まさに同じようなことを「[エンジニアは全員技術記事を書くことを習慣化した方がいいぞ](https://qiita.com/HiromuMasuda0228/items/a71dea7ef4d77a30b118)」で書かれていたので、こちらも併せてご覧ください。

# きっかけ

　Qiitaに日々のアウトプットを残すようにしてから、ありがたいことに投稿を見て頂いた方で稀にお仕事の誘いを頂くことがありました。これをきっかけにアウトプットに対する考え方が変わりました。

# なぜ自己表現なのか

　私にとって投稿してきたアウトプットはあくまでも「自分の備忘録」、「困っている人の為になればいいな」という思いで残したものですが、人によっては「その人は何をやってきたのか」、「どんな考え方を持っているのか」と評価しています。なので、立場（視点）によってはそのアウトプットに対する捉え方が異なってきます。
　自己表現というと、「私はこういう人です」、「私はこう思います」などと意識高い系がしそうなことだと思われガチですが、Qiitaのように**日々のアウトプットを積み上げていくことで結果的にそれが自己表現としての役割を果たしくてくれます。**つまり、意識的に自己表現をしなくても結果的に自己表現になることという考え方もできると思います。

# なぜ自己実現なのか

　上記のように日々のアウトプットで自己表現に繋がり、さらに自分がしたいこと（自己実現）にも繋がると思います。
　例えば、好きな技術に関するアウトプットを発信続けたりすると、いつの間にか社内（外）であの人はその技術に関して詳しいと評価してくれます。そうするとその技術に関連したプロジェクトへの参画、助言を求められたりすることがあります。

# まとめ

　結論としては**アウトプットし続けること**に尽きます。正直、日々周りにいる人（チーム内）以外はあなたのことを知らないので、知ってもらうためにもアウトプットするしかない。上記の繰り返しになるが自己表現が苦手な方でも、イケイケ系な投稿しなくても、日々にやったことや困ったことの解決策のアウトプットを積み上げていくことで結果的にそれが評価に繋がり、人生のステップアップにつながっていくのではないかと思います。
jsdoでdeviceorientation

#概要
jsdoでdeviceorientationやってみた。
グラフ表示してみた。

#環境

nexus 7

#サンプルコード

```
var lastOrientation;
function onDeviceOrientationChange(event) {
    lastOrientation.gamma = event.gamma;
    lastOrientation.beta = event.beta;
    lastOrientation.alpha = event.alpha;
}
function deviceOrientationTest(event) {
    window.removeEventListener('deviceorientation', deviceOrientationTest);
    if (event.beta != null && event.gamma != null) 
    {
        window.addEventListener('deviceorientation', onDeviceOrientationChange, false);
    }
}
google.load('visualization', '1.0', {
    'packages' : ['corechart']
});
google.setOnLoadCallback(drawChart);
var i = 0;
function drawChart() {
    lastOrientation = {}; 
    window.addEventListener('deviceorientation', deviceOrientationTest, false);
	var data = new google.visualization.DataTable();
	data.addColumn('number', 'x');
    data.addColumn('number', 'alpha');
    data.addColumn('number', 'beta');
    data.addColumn('number', 'gamma');
    var options = {
        title: 'deviceorientation',
        curveType: 'function',
        seriesType: 'line',
        pointSize: 0,
        width: 800,
        height: 450,
        series: {
            1: {
                pointSize: 5
            }
        }
    };
    var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
    setInterval(function() {
        var alpha = lastOrientation.alpha;
        var beta = lastOrientation.beta;
        var gamma = lastOrientation.gamma;
        data.addRow([i, beta, beta, gamma]);
        chart.draw(data, options);
        i++;
        if (i > 80) data.removeRow(0);    
    }, 128);
}



```

#成果物
http://jsdo.it/ohisama1/ME45

以上。
CakePHP 3.5 to 3.6

## Update

```bash
composer require --update-with-dependencies "cakephp/cakephp:3.6.*"
composer require --dev cakephp/debug_kit "~3.0"
composer require --update-with-dependencies --dev "cakephp/bake:1.8.*"
```

## Note

[3.6 移行ガイド](https://book.cakephp.org/3.0/ja/appendices/3-6-migration-guide.html)
PHP開発環境2018秋

## 前置き
「のぼりーさんのクラウドインフラpodcast Track-26 新原さんとPHPの現場っぽく(https://cloudinfra.audio/track26-b3680a037a34) 」で最近のPHP環境について話していました。
長らくPHPの開発から離れており、知らないことだらけです。
「ほぉ〜。便利そう！次は使ってみたい！」と思ったので備忘用にメモを残しておきます。

## PHPを動かす環境
* dockerコンテナが便利
* リポジトリは「remi」がよく使われているらしい
* docker公式PHP alpineベースのものがあるらしい
* フロントにはH2O(Webサーバ)

## H2Oについて
### いいところ
* デフォルト設定がイケてる
* http2に対応している&早い！
* 設定がシンプル
* デフォルト設定でかなりいい具合にしている。知見が集約されている
* 設定がyamlでシンプルに書ける。nginxよりシンプル
* fast cgiが使える

### 悪いところ
* 特に無い？
* ライブラリの数とか？

H2Oについて、ISUCONなどの文脈で名前は聞いたことあったけど、それ以上の知識はなかったので少しメモ。

## H2O概要
2014年よりDeNAで開発が始まったWebサーバ。元々は自社のゲーム向けWebサーバだったが、今はクラウドに最適化したWebサーバを目指しているらしい。

## 対応OS
「CentOS」「RHEL」「Fedora」「FreeBSD」などに対応しているらしい。

## インストール＆動作方法
ISUCONで話題になったWebサーバー、h2oをUbuntu 18.04で動かしてみる
https://qiita.com/inductor/items/3994809fc00c4f56874f
など。

また今度試してみよう。

## 謝辞
khskさん、sola-msrさん、修正のリクエストをいただきありがとうございました。
【オブジェクト指向】自然言語を基準に設計することの問題点

記事を書く発端として、「オブジェクト指向とは、現実世界を正しく捉えること」とする記事の存在がある。
私はその表現自体を否定するつもりはないが、「現実世界を正しく捉えること」＝「自然言語を基準に設計すること」として捉えている人もいるように見えた。
これは「犬と猫の機能をまとめあげるクラスが必要で、そのクラスの挙動を表現するには動物という単語が適切だ」ではなく、「犬と猫は動物だから、動物というクラスを作る」といったような発想だ。

私自身、大学時代に自然言語処理について研究していたのもあり、自然言語の信用性について懐疑的だ。
そのため自然言語を基準に考えた設計について、持論満載で記載していきたいと思う。

# 自然言語を基準に考えた設計の問題
## 自然言語に単語が存在しているのはたまたまである
まずその概念が存在するから、その単語が存在するのではない。
ある概念を表す表現があったほうが便利だから、それを表現する単語が生まれるだけである。
そういう意味では、その単語が存在しているのはたまたまなのである。

先ほどの例を見てみよう。

```
犬と猫は動物だから、動物というクラスを作る。
```

ここで問題なのは、「動物」という概念は日本語においてある特徴を持つ集合をそう呼称しているだけだという点だ。
この世には「動物」という絶対的な概念が存在するわけではなく、ある特徴を持つ集合を動物と呼んだら便利だから呼んでいるに過ぎないのだ。
つまり、**この設計は『日本語』に依存しており、自然言語における世界観をプログラミングの世界で表している**のだ。

### 言語・文化間での違い

動物だと日本語以外にもあるじゃないかと反論されるかもしれないので、別の例を出そう。

たとえば日本語には成長の度合いによって呼称の異なる出世魚があるが、英語圏にはそれらを区別する単語はない。
これは島国であり漁業が盛んな日本において、魚の成長度合いにより表現を分けたが便利だったからだろう。
このように言語の違いを見ても、**その単語が存在するか否かは文化的なものに起因している**ことがわかる。

逆に言えば自然言語に基づいた設計が正しいのであれば、母国語によって正しい設計が変わってくることを意味する。
この例だと日本人は「イナダ」や「ブリ」でクラスをわけ、英語圏の人は「Yellowtail」クラスを既定するのが正しいということになるわけだ。
果たしてそんな不安定なものを基準に設計することが、本当に正しいのだろうか。

設計は、「どの観点で切り分けるか」によって変わってくる。
そして自然言語における単語は「その観点で切り分けたときに、文化的に便利である」から存在している。
したがって**単語の存在を設計の理由にすることは、文化的なものに依存した設計をしていくことに他ならない**のだ。

## 自然言語における単語は曖昧性を持つため、完全に再現ができない
自然言語というのは言葉が先に生まれて、後付けでその意味が説明されていく。

たとえば「バブみ」という言葉は誰かが「バブみとは○○です」と定義したことで使われるようになったのではない。
あくまである概念に対して「バブみ」という単語を使う人が現れ、他の人はその用例から汎化し意味を推測しているにすぎない。
つまり「バブみ」という単語に対する意味合いは人により異なり、単語の持つ意味は一意に決まらないのだ。
https://matome.naver.jp/odai/2149008444398555201
したがって自然言語における単語の意味は人により異なり、曖昧性を持つわけである。

しかしそれを形式言語であるプログラミング言語に翻訳したときに、その曖昧性を具体化する必要が出てくる。
たとえば「池」「湖」「沼」の違いはしっかりは定義されていない。
人により水たまりに対して「池」と呼ぶか「湖」と呼ぶか「沼」と呼ぶかは異なるのだ。

それをプログラムに落とし込むとしたら、「沼は水深が〇以下で湿度が○以上で○㎢以内の水たまりのことである」と具体的に定義する必要が出てくる。
これは「Aは池である」「Bは沼である」と一意に意味が決まることを意味し、自然言語における単語のもつ曖昧性を再現できない。
したがって、**そもそも自然言語における単語の意味をプログラミング言語で表すこと自体が不可能**なわけだ。

## 自然言語は流動的であり、捉えるのが難しい
自然言語では、どんどん新しい単語が生まれるし、単語の定義は変わることがある。
それはもちろん流行り言葉もそうだが、より基幹的な単語についてもそれは当てはまる。

例えばWikipediaを見ると、ペニスはオスの持つ生殖器とされている。
しかし近年、ペニスを持つメスが発見された。
https://www.huffingtonpost.jp/2017/09/14/ig-nobel_a_23209921/

このことから、「これでオスの定義に『ペニスを持つ』と書いた教科書は、全て過去のものになった」と受賞者は発表したそうだ。
つまりこの発見により、オスやペニスの定義から根本的に覆されたことになる。
https://twitter.com/yusai00/status/1047433528416206850

ではその場合、ペニスクラスとオスクラスの設計も変える必要はあるのだろうか。
「自然言語通りに設計することが正しく捉えること」なのであれば、そうする必要が出てくるだろう。

# おわりに
## プログラム内の概念が自然言語と同一だと思うと議論がややこしくなる
ここまで説明してきた通り、**プログラム内の概念は自然言語と同一にはなりえない**。
しかし自然言語上の単語の意味と同一であると捉えてしまうことで、議論がややこしくなってしまうものと思われる。

例えば『Humanクラス』は『人間』という単語の持つ意味合いと、完全に同一にはなりえない。
『人間』が『動物』であるというのは、自然言語上の概念においての話であって、『Humanクラス』が『Animalクラス』をextendsしているかどうかとは別の話なのだ。
そういう意味でいうと、プログラミングという行為は新しい単語を定義している行為に近いように思う。

もちろん自然言語上の言葉の意味と異なりすぎるのは純粋にコミュニケーションコストが上がるため、避けるべきことである。
しかしどこかで『別物である』と妥協をしない限り、問題を正しく捉えられないのではないだろうか。

## 自然言語で設計を制限するべきではない
自然言語における単語はその言語圏の文化においてそう切り分けることが便利だということでしかない。
したがって適切な設計が自然言語とリンクしている保証はなく、設計は自然言語に制限されるべきではないと考える。

これは「現実世界を正しく捉えること」と相反するものではない。
「現実世界を正しく捉えること」はあくまで自然言語から切り離された観察だからだ。
したがって表現したいものの挙動をしっかり認識し、何を基準に汎化すれば良いのかを自然言語から切り離してフラットに考えた先に最適な設計があるのではないだろうか。
pythonでAPIを叩いた時にSSL認証エラーでハマったときの対処法

API使ってデータ取得しようとした際にハマったのでメモ。

環境はpython3.6.4。
以下ハマったスクリプト。

```python
import json
import urllib.request, urllib.error
 
#リクエストするアドレス
request_url="***********************"
 
#検索開始日付
PARAM_START_DATE="2018-09-01"
 
#検索終了日付
PARAM_END_DATE="2018-09-30"
 
#API-KEYのセット
API_KEY="***********************"
 
headers = {'x-api-key': API_KEY, "Content-Type":"application/json"}
request_json={
"start_date":PARAM_START_DATE,
"end_date":PARAM_END_DATE
}
 
req = urllib.request.Request(url=request_url, headers=headers, data=json.dumps(request_json).encode())
f = urllib.request.urlopen(req)
response = f.read()
f.close()
```

上記スクリプトを流したところSSL認証エラー。

```
urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
```


verify = Falseを設定すれば解決できるようだが、最終的にはお仕事で使う必要があり、あまりやりたくなかったので別の解決策を模索。
参考 → [Python requests で SSLError が起きて毎回ググってるのでまとめた](https://qiita.com/sta/items/6d08151fd9b20fa8b319)

諸々調べた所、上記のエラーはpython2.7.9以降で出現するという記事を見たので、試しにpython2.7.8にバージョンを落として実行してみたところ、今度は以下のエラー。
[SSL証明書が正しくないサイトに対してPythonでアクセスする](https://shinespark.hatenablog.com/entry/2015/12/06/100000)

```
urlopen error [Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
```
バージョン下げればいいとかそういう問題ではない模様。
handshakeについて → [SSL/TLS（SSL3.0～TLS1.2）のハンドシェイクを復習する](https://qiita.com/n-i-e/items/41673fd16d7bd1189a29)

#####解決策
SSLContextを使えば認証方法を設定する事が可能とのことなので試してみる。
公式リファレンス → https://docs.python.jp/3/library/ssl.html#ssl.SSLContext

```python

import json
import urllib.request, urllib.error

#認証方法をTLSv1に指定
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
 
#リクエストするアドレス
request_url="***********************"
 
#検索開始日付
PARAM_START_DATE="2018-09-01"
 
#検索終了日付
PARAM_END_DATE="2018-09-30"
 
#API-KEYのセット
API_KEY="***********************"
 
headers = {'x-api-key': API_KEY, "Content-Type":"application/json"}
request_json={
"start_date":PARAM_START_DATE,
"end_date":PARAM_END_DATE
}
 
req = urllib.request.Request(url=request_url, headers=headers, data=json.dumps(request_json).encode())
#context=TLSv1に指定
f = urllib.request.urlopen(req,context=context)
response = f.read()
f.close()
```

これで動きました。
jsdoでblockly その8

#概要
jsdoでblocklyやってみた。
robot car作って見た。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/317fc3e6-9fc0-40d4-faeb-c7e1fab374da.png)


#サンプルコード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/2836915b-fcb6-d5ba-d98b-52a7fca314d0.png)


#成果物

http://jsdo.it/ohisama1/GFM4/fullscreen

以上。
php-master-changes 2018-10-08

今日は ext/intl での c++11 強制、ext/shmop の README 修正、date() の年出力時のオーバーフロー修正、apache_response_headers() の出力バグ修正、バンドル版 libzip 利用についてのドキュメント修正、$GLOBALS のシリアライズ時警告潰し、curl 7.56 〜 7.61 追加の定数に対応する修正があった！

# 2018-10-08
## weltling: Enforce C++11 in ext/intl
- https://github.com/php/php-src/commit/4acc8500acd134dfab1a2ddb83aeb39fa1033abe
- ext/intl で c++11 を使うように
- 各拡張や SAPI モジュールのビルド時、どの規格のモードでコンパイルするかを決める m4 マクロ PHP_CXX_COMPILE_STDCXX を追加

## petk: Update and refactor shmop extension's README
- https://github.com/php/php-src/commit/c2cbf372356a932fbf269f88a8e711243e2e8946
- ext/shmop の README を修正
- 関数内容についてはもっと詳しいのが [PHP manual にある](http://php.net/manual/ja/book.shmop.php)ので削除、ファイル名と書式をマークダウンへ

## adsr: Fix [#75851](https://bugs.php.net/bug.php?id=75851): Year component overflow with date formats "c", "o", "r" and "y"
- https://github.com/php/php-src/commit/c097acd52e89a3b1d0cb6a181bb4650be9625b6c
- [7.1~]
- [date()](http://php.net/manual/ja/function.date.php) の書式で "c", "o", "r", "y" のように年を出力するものを使う際、年の部分が 32bit int の最大値を超えるようなタイムスタンプを渡すとオーバーフローする問題の修正

## stodorovic: Fix [#76954](https://bugs.php.net/bug.php?id=76954): apache_response_headers removes last character from header name
- https://github.com/php/php-src/commit/47b89bc5314534e4aab4a8d6cda0da9d079366f6
- [7.1~]
- sapi/cgi で、[apache_response_headers()](http://php.net/manual/ja/function.apache-response-headers.php) がヘッダ名を 1 バイト少なく返してしまう問題の修正

## cmb69: [ci skip] Note the required configure changes for bundled libzip
- https://github.com/php/php-src/commit/c5df679ca8b1373e3f2a47aeba5b37da74f993de
- [7.3~]
- UPGRADING へ（非推奨となっている）バンドル版の libzip を使うための configure について追記

## nikic: Fix ref ID handling when serializing $GLOBALS
- https://github.com/php/php-src/commit/d982bbe175b6f4487683f538f2dc8aca4aef4a6b
- [7.3~]
- [`$GLOBALS`](http://php.net/manual/ja/reserved.variables.globals.php) を [serialize()](http://php.net/manual/ja/function.serialize.php) して [unserialize()](http://php.net/manual/ja/function.unserialize.php) する際に 7.3 で警告が出る問題の修正

## adoy: Add constants from curl 7.56 to 7.61
- https://github.com/php/php-src/commit/64881a1e64b47cb612d358f2ebf234defe314e90
- [7.3~]
- ext/curl で curl 7.56 〜 7.61 追加の定数に対応
jsdoでblockly その7

#概要
jsdoでblocklyやってみた。
turtle作って見た。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/dde5dfeb-e415-e15f-876f-2e8cf4bb2095.png)

#サンプルコード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/97393295-e513-83a8-f61c-4116a5543fce.png)


#成果物

http://jsdo.it/ohisama1/iYx9/fullscreen

以上。
オブジェクト指向設計とは?

なんだか最近、皆さんオブジェクト指向設計について語っているので、私も語りたくなってしまい筆を執りました。How はあえて語っていません。また、我流の理解なのでご了承ください。

## オブジェクトとは?

哲学の用語である Subject (主体) と Object (客体) に由来します。

- Subject (主体) … 見るもの。知るもの。
- Object (客体) … 見られるもの。知られるもの。

ある存在 A について考えるとき、別の存在 B を定義し、B が A を観測したとします。この際、B が Subject (主体) であり、「B が A をどのように理解したか?」が Object (客体) となります。

具体例を挙げてみましょう。

「自動車」について考えてみます。
Subject (主体) として「一般的な人」を定義したとすると「一般的な人が自動車をどのようなものだと考えているか?」が Object (客体) になります。つまり、「便利な乗り物である。ハンドル・アクセル・ブレーキ等を操作することで高速で移動することができる」のような感じでしょうか。別の Subject (主体) として「自動車整備工 (エンジニア)」を定義したとすると、また別の Object (客体) が得られます。それはエンジンや車体の深い知識が反映された Object (客体) になるでしょう。

このように、**同じ存在について考えたとしても、どんな Subject (主体) を定義するかによって Object (客体) はまったく違うものになります。**

## オブジェクト指向設計とは?

Object (客体) をもとに現実をモデル化 (=単純化) し、得られたモデルを元にソフトウェアを設計することです。

**Object (客体) をもとに現実をモデル化 (=単純化) する。**

これが胆になります。

現実とはとてもとても複雑なもので、複雑なものを複雑なままソフトウェアにするのは難しいです。そのため、何らかの方法でモデル化 (単純化) する必要があります。例えば、物理が絡むときは数理モデルを作成して現実をシミュレートしたりします。例えば、人間をそのままソフトウェアに設計することは現実的ではないので、ユーザーアカウント等として、名前などの一部の情報だけを設計に組み込むでしょう。このようなモデル化 (単純化) の指針として、Subject (主体) / Object (客体) の考え方を利用するのがオブジェクト指向設計というわけです。

UML で最初にユースケース図があってアクターを定義するのも、まず Subject (主体) を定義しなければ分析が始まらないからですね。

システムの利害関係者を Subject (主体) として定義して Object (客体) を分析することによって、利害関係者のメンタルモデルが設計に反映され、彼らにマッチしたシステムになることが期待できます。また、利害関係者のメンタルモデルを反映した設計であるため、彼らの要求変更についてスムーズに対応できることも期待できます。

畢竟、「ユーザーの視点に立って設計しましょう」ということを難しく言っているだけであると言えます。

## ドメイン駆動設計とは?

オブジェクト指向によるシステム開発の際には、そのシステムに関わるさまざまな利害関係者を Subject (主体) に置き、それぞれの視点からシステムを分析してモデル化 (=単純化) し、設計に反映することになります。

ここで問題になるのは、各々の Subject (主体) の視点に立つことが難しいということです。

専門知識を持つ Subject (主体) の視点に立つためには、彼らの専門知識 (ドメイン) が必要になります。例えば、医療システムについて分析するときに医者の Subject (主体) を定義したとすると、医学その他の専門知識が無ければ Object (客体) を導出できません。魔法のめがねで専門家の頭の中を覗くことができればどんなに素晴らしいでしょうか? しかし、それは不可能です。専門家とコミュニケーションを取りながら、彼らの視点を引き出していく必要があります。

どのようにして、開発者が Subject (主体) の頭の中を理解するか?
どのようにして、開発者が Subject (主体) の視点を理解するか?

これを語った方法論がドメイン駆動設計であると、私は考えています。

## クラスとは?

オブジェクト指向の文脈でよく聞く言葉に「クラス」がありますが、これはあまりオブジェクト指向と関係がありません。

クラスとは数学の集合論に由来する言葉で、ある集合 A を定義したとき、A に属するすべての要素が持つ共通の特徴のことです。ソフトウェアは代数論や集合論の影響を強く受けていて、これらの考えに沿って設計を行うことで効率よく物事を処理できます。

Object (客体) を分析する際も、集合論の考え方を用いて分析を行うと、効率よくソフトウェアに反映させることができるでしょう。
Twitterの最新ツイートをストリーミングで取得する（2018年10月）

# 概要
TwitterのAPIを使用して、ツイートのデータを取得する。
今回はストリームとして最新のツイートを継続的に取得する。

"Filter realtime Tweets"というAPIが用途に合っていそうなので、それを使う。
https://developer.twitter.com/en/docs/tweets/filter-realtime/api-reference/post-statuses-filter

# 手順
## APIキーの発行
Twitterの開発者アカウント（？）に登録した上で、APIを使ったアプリケーションの作成申請（？）が必要。いろいろ入力項目があり面倒だが、申請から登録完了までのタイムラグは無く、すぐに完了する。

ここの手順は割愛する。


## 実装（requests_oauthlib編）
TwitterのAPIに特化したサードパーティライブラリもあったが、まずは汎用的なrequests_oauthlibを使ってみる。

このスクリプトを実行すると、スクリプトは終了せず次々にデータが取得されて標準出力に表示される。

```python
import json
import requests_oauthlib

uri = 'https://stream.twitter.com/1.1/statuses/filter.json'

# 自分の環境用に置き換える 
consumer_key = 'your consumer key'
consumer_secret = 'your consumer secret'
access_token = 'your access token'
access_token_secret = 'your access token secret'


def main():
    session = requests_oauthlib.OAuth1Session(
        consumer_key, consumer_secret, access_token, access_token_secret
    )
    # "Python"が含まれるツイートを取得. 'stream=True'は必須.
    r = session.post(uri, data=dict(track="Python"), stream=True)
    for line in r.iter_lines():
        status = json.loads(line.decode("utf-8"))
        for k, v in status.items():
            print(k, ":", v)
        print("------------------------------")


if __name__ == '__main__':
    main()
```

## TwitterのAPIに特化したライブラリを使う

よく調べていないが、[twitter](https://pypi.org/project/twitter/)というそのままな名前のライブラリが使えそうだった。
ツイートを単純に取得するにはrequests_oauthlibで十分だが、検索条件などを積極的に入れようと思った場合、専用のライブラリを使ったほうが便利なのかもしれない。

[こちらの方の記事](https://qiita.com/yukinoi/items/ca0d8059fe2a8e72a2c0)が参考になりそうでした。

# 参考資料
* [公式ドキュメント](https://developer.twitter.com/en/docs)
オブジェクト指向はもう死んでいる

オブジェクト指向は素晴らしかった。
しかし遥かな以前に単なる buzzword に成り下がり、とっくに死んでいる。
オブジェクト指向を楽しそうに語る全ての人にそれぞれのオブジェクト指向があり、それは必ずどこかが他の誰かにとってのオブジェクト指向とは違う。
私は、我々はオブジェクト指向という単語を使って正確な意思疎通を行う事が不可能であると結論する。

# 色々な物が混じった。
アラン・ケイ氏が最初にオブジェクト指向という言葉を使った時は個々のコンポーネントがメッセージを送受信しながら相互作用で動くシステムのようなものを指していたらしい。
その後に様々な人が好き勝手にオブジェクト指向に意味を付け足したり、その意味を改変したりした。
これはもはや半ば混沌である。

# オブジェクト指向には麻薬成分が含まれていた
オブジェクト指向は、本当に解り始めた後にしばらく最高に楽しい日々が続くドラッグみたいなものだった。
それでも体質的に受け付けない人はそこまで至れないし、数々の面白いテクニックは一緒に使える仲間がいなければ逆にストレスだ。
一度オブジェクト指向の良さを知ってしまえば、世の中のオブジェクト指向をろくに知らないプログラマーと働くことが苦痛になる。
彼らが知らないオブジェクト指向の奥義の数々は、彼らにはトリッキーで理解不能で危険にみえるらしいから彼らはとにかく必死に拒絶する。
私はそのように拒絶された時に怒りを覚える事のほうが多かったが、冷静になって見つめなおしてみると、多人数で働く事を重視する場合には時として彼らが正しい事もままある。

オブジェクト指向にはそんな麻薬みたいな効用が間違いなくある。

# オブジェクト指向を知らないなんて言えない時代
オブジェクト指向をキメてハッピーになった奴らががオブジェクト指向をマンセーしすぎた。

オブジェクト指向を知らない人が素直に知らないと言えない時代がきたと思う。
その時オブジェクト指向を知らない人達は二つに分かれた。
オブジェクト指向なんて嫌いといってひたすら構造化プログラミング以前の世界にしがみつく人達がいた。
オブジェクト指向についてろくに知らないのに知らないなんて言えないから、知ったような顔をしながら使っている人達がいた。
いずれにせよ、彼らも不幸だ。

オブジェクト指向を知るもの同士？
誰かが「それはオブジェクト指向じゃない！これがオブジェクト指向だ！」と言って誰かを責め立てている姿を見たことはないか？

# いいものだけを取り出そう
単にオブジェクト指向とだけ言えば、このように様々な余計なものがついてくる。
これからはかつてオブジェクト指向と呼ばれた混沌の中から、本当にいま表したい部分だけを拾いだしてきて、明示的な言葉で表そう。

例えばそれは <ruby>message-passing<rt>メッセージパッシング</rt></ruby> だったり <ruby>encapsulation<rt>カプセル化</rt></ruby> だったりするかもしれない。
他にも素晴らしい物がオブジェクト指向という混沌の中にはまだたくさんある。

何かが必要な時、ゴミ捨て場の全てのゴミをぶちまける代わりに、まだ使えるスクラップを選び出して使おう。

あと、オブジェクト指向酔いからはそろそろ醒めよう。
オブジェクト指向以外にも、それと類するくらい大事な物が他にもたくさんあるから。

# 追記
[オブジェクト指向がn%理解できる記事まとめ](https://qiita.com/raccy/items/74a6f8b98881726ff82d) にリストして頂いた事で、興味深い記事をいくつも拝読する事ができた。
その結果、もしかしたらこれは <ruby>オブジェクト指向<rt>object oriented</rt></ruby> ではなく <ruby>オブジェクト思想<rt>object philosophy/object ideology</rt></ruby> とでも呼ぶべき思想と思想の熱い闘いなのではないかと思い至った。
例えば Matz は思想家だ。
私は Matz **も**好きだ。
特に何だったかな、「馬鹿野郎！コーディングこそが設計だ！」みたいな表明(うろ覚え)とかはもう共感しか覚えない。[^1]
それでも Matz は唯一神ではなく一人の思想家に過ぎないので常に正しいわけではない。[^2]
まつもとさんもまたこの世に生きるひとつの命に過ぎないという事だろう。

[^1]: 控えめに言って惚れそうなくらいすげえ。
[^2]: 盲信という思考停止はエンジニアにとって命とりだと思う。
javascriptで生成した画像をrails経由でサーバに保存する

# 目的

javascriptで画像を生成し、それをサーバに保存する場合色々ハマったのでメモ

# 流れ

## サーバサイドでblobに変換する形

* html2canvasで画像を生成
* canvasからcanvas.toDataURL()でbase64データを抽出
* javascriptでajaxを用いて送信 or textfieldでbase64を送信
* サーバでbase64からblobに変換

## クライアントサイドでblobに変換する形

「Canvas上のイメージを画像ファイルとして保存する方法」
引用：https://st40.xyz/one-run/article/133/

* CanvasからBase64データを取得
* Base64データからBlobデータに変換
* a要素を使ってファイルダウンロード

# 気をつけないといけないところ

## canvas.toDataURL() はbase64データ

canvas.toDataURL()で取得するデータはbase64の状態。

## carrierwaveはbase64だと保存できない

carrierwaveはbase64だと受け付けないためblobに変換する必要がある。

# html2canvasで画像生成-パターン1-

# base64からblobに変換

## なぜ変換が必要か？

carrierwave経由で画像を保存したいがcarrierwaveはbase64を受け付けない。

# blobに変換させないでbase64でuploadできるようにする

「[rails]base64エンコードされた画像をcarrierwaveに保存する」
https://blog.hello-world.jp.net/ruby/2281/

この記事では

* app/controllers/concerns以下に共通のメソッドを作る
* そのメソッドでbase64でもuploadできるようにする

# html2canvasで画像生成-パターン２-

## ajaxを用いて送信する

「Canvasに描画した画像をjQuery.ajaxでサーバーに保存する : JavaScript」
https://www.findxfine.com/programming/javascript/995557527.html
既にあるcallback形式の関数を互換性を保ちつつPromiseにも対応させる

ES2015でPromiseについで、ES2017でAsync/Awaitが追加され、Promiseが更に使いやすくなってきているのもかかわらず、古くからあるパッケージなどは、対応させるのが大変なのか、一向に対応してくれないものもたくさんあります。

ある日突然callbackからPromiseに変わったらみんな戸惑うので、callbackが無いときにPromiseを返すような処理を書かなくてはなりません。単純に考えてみれば、callbackがある時の処理と、callbackがなくPromiseを返す処理、で倍の量になってしまうのではないかと僕も思っていました。

しかし、実際にそうでしょうか？

その答えはytdl-coreのソースコードを眺めているときでした。

この関数では、引数にcallbackが無いときに、自身をcallback付きで呼び出し、その中でresolve/rejectをするPromiseを返していたのです。

```js
module.exports = function getInfo(link, options, callback) {
  // ~~~
  if (!callback) {
    return new Promise((resolve, reject) => {
      getInfo(link, options, (err, info) => {
        if (err) return reject(err);
        resolve(info);
      });
    });
  }
  // ~~~
```

実際のソースコードは[こちら](https://github.com/fent/node-ytdl-core/blob/952b65f846a09917bda2ca854690491c62429d12/lib/info.js#L32)

これで既存のコードも楽にPromiseに対応できそうです！

よきPromiseライフを
iOSアプリのアイコンサイズの行方

iOSアプリのアイコンはいくつかサイズを用意しないといけないんですが、どのサイズがどこで使用されているか把握してないのでまとめます。

**必要サイズ**

- 20 × 20
- 29 × 29
- 40 × 40
- 58 × 58
- 60 × 60
- 76 × 76
- 80 × 80
- 87 × 87
- 120 × 120
- 152 × 152
- 167 × 167
- 180 × 180
- 1024 × 1024


以上13通りのサイズを用意する必要がある。
iOS iconとかで検索すると一つのサイズから必要サイズを生成してくれるサービスがたくさんあるみたいですね。

---
そしてxcodeの画像を放り込む場所に書いてありましたね。
このサイズはこのOSのどこどこ用って。
Retinaだと2xを使用しますって。
スッキリしました。
GitHub のサイトを操作せずに GitHub にリポジトリーを作る

# What's this?
GitHub に新しいリポジトリを作った時、いつもすぐ消えてしまうあのページの内容のコピーです。[^1]
またこれは git プロトコルを選んでいる時の表示で、HTTPS を選ぶと内容が変化したような気がしないでもないです。

## placeholders
- ${YOUR-NAME} 君の名は。
- ${YOUR-NEW-REPOSITORY-NAME} 新しく作るリポジトリ名。

# …or create a new repository on the command line
```
echo "# ${YOUR-NEW-REPOSITORY-NAME}" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:${YOUR-NAME}/${YOUR-NEW-REPOSITORY-NAME}.git
git push -u origin master
```

# …or push an existing repository from the command line
```
git remote add origin git@github.com:${YOUR-NAME}/${YOUR-NEW-REPOSITORY-NAME}.git
git push -u origin master
```

#…or import code from another repository
You can initialize this repository with code from a Subversion, Mercurial, or TFS project.

[Import code](https://github.com/${YOUR-NAME}/${YOUR-NEW-REPOSITORY-NAME}/import)

[^1]: 故に著作権は原則として GitHub, Inc. に帰属します。
ミニマックス最適とは

###この記事の目的
ミニマックス最適とは確率的最適化の世界では常識のように目にするが（その意味について語られた文献があまりにも少ないので，このワードについてまとめたい．

###ミニマックスとは
[コトバンクの説明](https://kotobank.jp/word/%E3%83%9F%E3%83%8B%E3%83%9E%E3%83%83%E3%82%AF%E3%82%B9-639301)が分かりやすかったのでそちらを引用する．

2,考えられる最大限の損失を最小限に抑えようとするゲームの手。

このことから，機械学習に置き換えると，”考えられる最大の損失関数の値を最小に抑えようとする手法”と言えるかもしれない．（理解が足りなくて間違っているかも．）

###ミニマックス最適とは
推定量$\hat{f}$がminimax最適ならば
$\max _ { \theta \in \Theta } \overline { L } _ { \theta } ( \hat { f } ) = \min_{\check{f}_{推定量}} \max _ { \theta \in \Theta } \overline { L } _ { \theta } ( \hat { f } )$
を満たす．

青本の確率的最適化（ｐ89）によれば
（ミニマックス最適とは）”「関数値と勾配を用いたどのような確率的最適化手法」にたいしても（定数倍を除いて）負けることはない．という性質持ちます．”
とある．

####参考文献
「統計的学習理論チュートリアル: 基礎から応用まで」
http://ibisml.org/archive/ibis2012/ibis2012-suzuki.pdf

###最後に
ちっとも分からない．．． 誰か教えて
NEologdをUbuntuに入れようとしたらMakeエラーが出た。

ど素人がwindowsにMeCabをいれて遊びたいと思ったのだが、思いのほかハマったので記録として残したいと思います。

#はじめに
基本的には、趣味でPHPとpythonを独学でいじくっている、初心者に毛が生えた程度の実力です。
間違いや効率的な方法などありましたら、どんどん教えてください。コードレビューも大歓迎です。
よろしくお願いします。

##環境
windows10 home
Anaconda3-5.3.0


#windowsにMeCab投入
特に難しいことはなく、以下を参考にしながらインストール
[PythonとMeCabで形態素解析(on Windows)](https://qiita.com/unias_day/items/f041b7c46543f38f78f7)

#NEologd辞書を入れる。
NEologdを入れるためにはWindows Subsystem for Linuxがひつようなため、下記を参考にUbuntu環境構築
[Windows Subsystem for Linuxをインストールしてみよう！](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

Ubuntuがはいったら、こちらを参考にしました。
[Windowsでmecab-ipadic-NEologdの導入](https://qiita.com/rinkuro/items/9d17f2dc5a23fa5bfb28)

#問題発生
##MeCabがない！
```
$ cd mecab-ipadic-neologd
$ sudo bin/install-mecab-ipadic-neologd 
```
とやったところで、

```
[install-mecab-ipadic-NEologd] :     mecab => not found
```


これは、再度？UbuntuにMeCabをインストールすることで解決。

##[install-mecab-ipadic-NEologd] :     make is not found. エラー
次は

```
[install-mecab-ipadic-NEologd] :     make is not found. 
```
と出てきた。
調べたところ、

「どうやら、「build-essential」を再インストールしてあげると良いらしい。」とあったので、インストールしてあげる。

```
$ sudo apt install --reinstall build-essential
```

これで、エラーが出なくなり、無事にNEologdをインストールできました。
めでたしめでたし。
間違って発音しがちな業界英語

間違って発音しがちな業界用語を、あえてひらがなで表現します。ひらがななので正確ではないですが、ひらがななのでわかりやすいはずです。

## ASUS: えいすーす

「あすーす」と「えいさす」をよく聞きます。「あさす」はかなり少数派ですが、ASUS は元々「ペガサス」の後ろ四文字から付けた名前<sup>[要出典]</sup>ということらしく、なるほど納得感はあります。もともと日本では正式に「あすーす」だったのですが、2012 年に世界的に「えいすーす」で統一されました。私も未だにどっちかわからなくなります。もう一度改名して世界をさらなる混乱におとしいれて欲しいところです。

## Async: えいしんく

「あしんく」とよく聞きます。非同期処理でよく使われる用語です。「えいしんく」は大げさで「えしんく」ぐらいかも知れません。もっというと「あ」と「え」の中間ぐらいかも知れません。なので「あしんく」でもいいかなと思ってます。

## awk: おーく

たまに「えーだぶりゅけー」と聞きます。[作者が「えーだぶりゅけー」と読んじゃダメよ](https://ja.wikipedia.org/wiki/AWK#cite_note-1)、と言っているのにです。

## CentOS: せんとおーえす

「せんとす」と聞いたことがあります。打ち合わせで何度も口にされていたのですが、大人のスルー力でしのぎました。

## Clang: くらん

たまに「しーらんぐ」と聞きます。

## Delphi: でるふぁい

「でるふぃ」と聞いたことがあります。しかしながら、もう聞くことはあまりないですねー。

## Django: じゃんご

「でぃーじゃんご」と聞いたことがあります。発音しない頭文字系は間違いがちですよね。

## feature: ふぃーちゃー

「ふゅーちゃー」とよく聞きます。Git で作るブランチのアレです。いわゆるガラケーのことを「ふぃーちゃーふぉん」と言いますが、これを「ふゅーちゃーふぉん」と言い間違えていた時期が私にもありました、なんで「未来の電話」なんだろう、と。

## gif: ぎふ

「じふ」でもいいですが、Git を「じっと」とは呼ばないですよね。そういうことです。

## GNU: ぐぬー

「ぐにゅー」とよく聞きます。「ぐにゅー」と聞くたびに、ぐでたまがよぎります。

## GNOME: のーむ

「ぐのーむ」とよく聞きますが、あながち間違いというわけではないようです。逆に「のーむ」では、「えっ」と聞き返されたりするかも知れないので、強い心が必要です（発音する機会があれば、ですが）。

## I<sup>2</sup>S: あいすけあえす

「あいつーえす」とよく聞きます。初見では読めないですよね。

## iPhone: あいふぉーん

よく「あいふぉん」と聞きます。商標的な理由で日本では「あいふぉーん」が正しい発音です。ネイティブだと「あいふぉん」だったり「あいふぉーん」だったりするようです。

## libre: りぶれ

「りばー」とよく聞きます。特に多いのは「りばーおふぃす」でしょうか。最近は libressl なども出てきました。libre の意味も知っておくと納得感がありますよ。

## Linux: りぬっくす

「りなっくす」とよく聞きます。というか私も間違いを承知で「りなっくす」と発音します。Linus が「りぬっくす」と発音している他、[日本 Linux 協会](http://jla.linux.or.jp/)は正式名称が「にほんりぬっくすきょうかい」だったりします。

## nginx: えんじんえっくす

読み間違いは聞いたことはないですが、初見だとまず読めないんじゃないかと思います。

## MIME: まいむ

「えむあいえむいー」と聞いたことがあります。はい、全部大文字ですしね・・・。

## Mojave: もはべ

2018 年登場の macOS です。「もじぇーぶ」だと思ってました。

## OCaml: おーきゃむる

結構長い期間「おーかむる」だと思ってました。

## ogg: おっぐ

「おーじーじー」と聞いたことがあります。まあいいです。

## parser: ぱーざー

私は「ぱーさー」と発音していましたが、できる人は「ぱーざー」と発音しているようです。調べてみたところ、「ぱーさー」はアメリカ英語、「ぱーざー」はイギリス英語でした。ということで、一貫性があればどちらでも良さそうです。

## png: ぴんぐ

たまに「ぴーえぬじー」と聞きます。まあいいんですけど。

## PuTTY: ぱてぃ

「ぷってぃー」とよく聞きます。Windows のリモートログインクライアントです。

## Qt: きゅーと

「きゅーてぃー」とよく聞きます。というか「きゅーと」と発音している人に会ったことがありません（Qt 自体があまり話題にならないのもありますが）。今は Qt Extended という名前に変わった Qtopia は間違えようがなかった良い名前でした。

## Rhino: らいのー

「りの」と聞いたことがあります。業界用語というより一般英語ですが、間違いがちかもしれません。

## sed: せど

「えすいーでぃー」と聞いたことがあります。急に言われるとなんのことなのかわかりません。

## simulator: しみゅれーたー

よく「しゅみれーたー」と聞きます。この間違いは市民権を得ていると言ってよいほど広範囲かつ昔から誤用されています。中でも特に多いのは「しゅみれーしょんげーむ」ですね。私はこの誤用がある文章はその時点で読みません。

## Susie: すーじー

「すしえ」と聞いたことがあります。Windows の有名な画像ビューアです。

## TensorFlow: てんさーふろー

「てんそるふろー」と聞いたことがあります。日本語だと「[テンソル](https://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB)」って言うみたいです。ドイツ語由来でしょうか。また TensolFlow という誤字も見かけます。

## tethering: てざりんぐ

よく「でざりんぐ」と聞きます。意図的にノイズを加える「でぃざりんぐ」と混同した人々が広めてしまったのでしょうか。ググるとそれなりに間違ったページがヒットします。

## TeX: てふ

「てっくす」は間違いです。英語圏だと「てっく」が多いようですが、これは正式な発音 `tɛx` の音素 `x` が多くの英語方言に存在せず、代わりに `k` が用いられ `tɛk` という発音になっているとのことです。

## Vim: びむ

「ぶいあいえむ」とよく聞きます。vi が「ぶいあい」なので間違えやすいかも知れません。

## Yahoo: やふー

「やほー」という人はまだいるでしょうか？ もう[ナイツ](http://www.maseki.co.jp/talent/knights)のネタぐらいですかね？

## yum: やむ

よく「ゆうむ」と聞きます。
abc 082

B
英小文字のみからなる文字列 s, t が与えられます。 あなたは、s の文字を好きな順に並べ替え、文字列 s' を作ります。 また、t の文字を好きな順に並べ替え、文字列 t' を作ります。 このとき、辞書順で s'<t' となるようにできるか判定してください。

```#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
	string s, t;
	cin >> s >> t;
	vector<char>S;
	vector<char>T;
	for (int i = 0; i < s.size(); ++i) {
		S.push_back(s[i]);
	}
	for (int i = 0; i < t.size(); ++i) {
		T.push_back(t[i]);
	}
	sort(S.begin(),S.end());
	sort(T.begin(), T.end(), greater<char>());
	if (S < T)
		cout << "Yes" << endl;
	else {
		cout << "No" << endl;
	}
	return 0;
}
```

```
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
 
int main() {
	string s;
	cin >> s;
	sort(s.begin(), s.end());
	
	string t;
	cin >> t;
	sort(t.begin(), t.end());
	reverse(t.begin(), t.end());
	
	if (s < t) cout << "Yes" << endl;
	else cout << "No" << endl;
}
```
わざわざベクター使う必要なかったっぽい
stringはソートできる。

C
長さ N の正整数の列 a=(a1,a2,…,aN) が与えられます。 あなたの目標は、a のうちいくつかの要素を取り除き、a を 良い数列 にすることです。
ここで、数列 b が 良い数列 であるとは、次の条件が成り立つことです。
b の各要素 x について、b に値 x はちょうど x 個含まれる。
例えば、(3,3,3), (4,2,4,1,4,2,4), () (空の数列) は良い数列です。 一方、(3,3,3,3), (2,4,1,4,2) は良い数列ではありません。
a を良い数列にするために取り除くべき要素の個数の最小値を求めてください。
制約
1≤N≤105
ai は整数である。
1≤ai≤109


```
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
int main() {
	int N;
	int a[100001];
	cin >> N;
	vector<int>v(N);
	for (int i = 0; i < N; ++i) {
		cin >> a[i];
		v[i] = a[i];
	}
	sort(v.begin(), v.end());
	ll sum = 0;
	int count = 1;
	for (int i =0; i < N-1; ++i) {
		if (v[i] == v[i + 1]) {
			count++;
		}
		else {
			if (v[i] > count) {
				sum += count;
			}
			else if (v[i] < count) {
				sum += count - v[i];
			}
			count = 1;
		}
	}
	if (v[N - 1] < count) {
		sum += count - v[N-1];
	}
	else if (v[N - 1] > count) {
		sum += count;
	}
	cout << sum << endl;
	return 0;
}
```
これで通った
SKPhotoBrowser 画像をFB風にスライド表示

# SKPhotoBrowserを利用して 画像をFB風にスライド表示

FB風に画像をスライドショーで表示できるライブラリSKPhotoBrowser
https://github.com/suzuki-0000/SKPhotoBrowser
すでにSwift4.2対応

## UITableViewやUICollectionViewからスライドショーを立ち上げる場合
URLのリストがあれば画像のDLと表示は勝手にやってくれて便利

```swift
    // URLからSKPhotoを生成
    let photos: [SKPhoto] = self.[URLの配列など].enumerated().compactMap { (idx, url) -> SKPhoto? in
        return SKPhoto.photoWithImageURL(url)
    }
    // 初期化
    let browser = SKPhotoBrowser(photos: photos)
    // 初回に表示するインデックス
    browser.initializePageIndex(indexPath.row)
    // 表示
    self.present(browser, animated: true, completion: {})
```

# オプション
シェアボタンを表示しないなど、オプションを指定したい場合は、SKPhotoBrowserOptionsで指定する。
インスタンス生成時に指定するのではなく、別に指定することに注意。

```swift
SKPhotoBrowserOptions.displayToolbar = false                              // all tool bar will be hidden
SKPhotoBrowserOptions.displayCounterLabel = false                         // counter label will be hidden
SKPhotoBrowserOptions.displayBackAndForwardButton = false                 // back / forward button will be hidden
SKPhotoBrowserOptions.displayAction = false                               // action button will be hidden
SKPhotoBrowserOptions.displayHorizontalScrollIndicator = false            // horizontal scroll bar will be hidden
SKPhotoBrowserOptions.displayVerticalScrollIndicator = false              // vertical scroll bar will be hidden
// 初期化
let browser = SKPhotoBrowser(photos: photos)
```

[https://github.com/katafuchix/YahooImageSearchAction](https://github.com/katafuchix/YahooImageSearchAction)
Visual Studio Code (Windows版) のインストール

Visual Studio Code（以後VSCode）のWindows版のインストール手順を以下に記します。

導入環境

* Windows 7 (SP1) Ultima x64

## VSCodeをダウンロードする

VSCodeの以下のダウンロードページにジャンプします。  
[https://code.visualstudio.com/](https://code.visualstudio.com/) 

![vscode_dl1.png](https://qiita-image-store.s3.amazonaws.com/0/299676/eaa0cdcf-f4af-e66b-018b-fc55b96e5d08.png)

ページのDown Load for Windowsのボタンをクリックしても構いませんが、インストール方式などを選択する場合は、ページの最下部まで移動し、好きなインストール方式をダウンロードします。

![vscode_dl2.png](https://qiita-image-store.s3.amazonaws.com/0/299676/548c005a-04fa-f286-41b7-eb9e52171ad4.png)

画面の左下のWindows版では"User Installer"、"System Installer"、".zip"の3種類がありますが、ここでは、User installer版(64 bit)を使うことにします。

>**補足：**  
>.zip版はZipファイルを解凍するだけで使用できますが、アップデートは自動で行われず、ヘルプメニューの更新の確認を行うと、最新バージョンの.zipがダウンロードされるようです。  
>一方、User Installerは(恐らくSystem Installerも)、自動的に上書きアップデートされるようです。  
>(※但し.zip版もUser Installer版もいずれの拡張機能はC:\Users\ユーザー名\\.vscode\extensions\ にインストールされます)

## VSCodeをインストールする

ダウンロードしたインストーラー(ここでは、VSCodeUserSetup-x64-1.27.1.exe)をダブルクリックします。  
続けて、表示されたウィザードで次へをクリックします。

![vscode_install1.png](https://qiita-image-store.s3.amazonaws.com/0/299676/a22641ca-da32-5406-b5dd-f04e28cfe808.png)

同意するを選択し、次へをクリックします。

![vscode_install2.png](https://qiita-image-store.s3.amazonaws.com/0/299676/db97c054-f8cf-6802-218c-0e415137d4cd.png)

デフォルトでは、ユーザーフォルダの奥深くにインストールされて使いづらいため、お好みのフォルダに変更します。

![vscode_install3-1.png](https://qiita-image-store.s3.amazonaws.com/0/299676/6ad5aae7-b18a-47a5-755e-4c4b214894d3.png)

ここでは、binフォルダを作成し、その下VSCode_x64フォルダにインストールすることにしました。

![vscode_install3-2.png](https://qiita-image-store.s3.amazonaws.com/0/299676/cf2972c9-5701-3560-1b9c-2ab43d1791b7.png)

そのまま次をクリックします。

![vscode_install4.png](https://qiita-image-store.s3.amazonaws.com/0/299676/f6c55398-5f76-a8c6-f65b-c598040a34cd.png)

このままPATHへの追加のみチェックが入った状態で次へをクリックしてもいいですが、個人的にコマンドから実行することはないので、チェックを外しました。

![vscode_install5-1.png](https://qiita-image-store.s3.amazonaws.com/0/299676/bfd9bd4e-3fe9-2d3e-0acf-f3047d7b52ee.png)

ファイルやフォルダの右クリックから実行する方が個人的には使いやすいので、ここでは「エクスプローラーのファイルコンテキスト～」「エクスプローラーのフォルダコンテキスト～」の両方にチェックを入れて、次へをクリックします。

![vscode_install5-2.png](https://qiita-image-store.s3.amazonaws.com/0/299676/4c9db89b-771c-793b-d3bf-4ee088e28c1a.png)

設定内容を確認して、いよいよインストールをクリック！

![vscode_install6.png](https://qiita-image-store.s3.amazonaws.com/0/299676/06ffa1ba-5c5a-3463-ab43-e5defab00ec3.png)

そのまま暫く待ちます。

![vscode_install7.png](https://qiita-image-store.s3.amazonaws.com/0/299676/c99b721e-f6f4-114f-3ad0-bb2f20b658dd.png)

インストール完了後に、実行をクリックしてVSCodeを立ち上げます。

![vscode_install8.png](https://qiita-image-store.s3.amazonaws.com/0/299676/48e51a58-f027-db15-85e6-ace942dc2974.png)

以上です！

---

続けてメニューを日本語化したい方は[こちら](https://qiita.com/psychoroid/items/8f37d3b32509d428bab8)をどうぞ。
コマンドやgitのメモ

久しぶりですが、今回はWSLで入れたUbuntuでよく使うコマンドや学んだものをメモしていこうと思います。
まずは元々よく使ってた基本中の基本のコマンド

```
pwd 
　カレントディレクトリのパスを表示
cd 
　ディレクトリの移動(現在のディレクトリは.1つ上は..ホームディレクトリは~)
mkdir 
　新規ディレクトリを作成
touch 
　新規ファイルを作成
rm 
　ファイルやディレクトリを削除(ディレクトリは-rfをつける)
cp name1 name2
　ファイルやディレクトリのコピーを作成
mv　移動元　移動先
　ファイル名の変更、ファイルの移動
```

ファイルの中身の確認や編集をす時

```
vim ファイル名
　vimを開いてファイルを編集できる
less ファイル名
　ファイルの中身を表示
```
この２つはそれぞれにコマンドがたくさんあるので覚えて使えるようにならなければ。
そして最近学んだコマンド

```
ssh ホスト名
　sshを使ってホストに接続
```
これ、いちいちホスト名を入力するのが面倒。それをLinuxでは自分オリジナルのコマンドを作成できます。
~/.bashrcというファイルを編集してalias hoge='ssh hoge'のように追加します。
次に~/.bash_profileというファイルにsource ~/.bashrcを追加
ターミナルを再起動
この手順で自分のコマンドを作成できます。

リモートからホストで作業するのに便利なコマンド

```
nohup xxx &
　このコマンドでターミナルを閉じたりホストからログアウトしてもプログラムが動く
ps aux | grep xxx
　nohupしたあとはこれで動いているプロセスを確認
kill プロセスID
　これでプログラムを止める
```

さて、次は開発に必須のgitについて。基本の使い方

```
git clone hoge

git pull

git status

git add .

git commit -m 'コメント'

git push
```

基本の流れはこれでOK。git branchでブランチを切ったりcheckoutでブランチを移動、merge、fetch、rebaseとこもありますが完全には理解できてないので開発しながら覚えていきたいです。
Powershellでセマフォもどき

まとまった処理単位でsleepを入れる部品です
forやforeachなどのループ処理内にてバックグラウンド処理をしていて、
その戻りが待てないとき、
ある一定の処理数でsleepを入れるために使うセマフォもどき関数なのです

# 定義
```powershell

# カウント変数初期化
$script:counting = 0

# 指定したスクリプトブロック${scriptbl}を${number}回実行するごとに${sleeptime}秒待つ、セマフォもどき関数
function do-some-block-and-sleep ([scriptblock]${scriptbl},${number},${sleeptime}) { 
    $script:counting++
        switch ($script:counting) { 
            {$_ % ${number} -ne 0} {& $scriptbl} 
            {$_ % ${number} -eq 0} {& $scriptbl; sleep ${sleeptime}; $script:counting = 0}  
        }
}
```

# 用例
```powershell
# 例1
# 1〜300までの数字を1つずつechoする処理をセマフォもどきに渡し、100ごとに2秒待つ
for ($i=1;$i -le 300;$i++) {
                          #  "echo $i" を 100回するごとに 3秒休む
    do-some-block-and-sleep  {echo $i} 100 3
}

# 例2 # (これがやりたかった)
Get-ADOrganizationalUnit -Filter 'Name -like "*"'| %{Get-GPInheritance -target $_} | %{$_.gpolinks} |%{$gpoid = $_.Gpoid;$displayname = $_.Displayname;do-some-block-and-sleep {Get-GPOReport -Guid $gpoid -ReportType Html -Path c:\gpohtml\$($displayname).html} 30 5}

```
サーバごとにターミナルの文字色を変える方法

# アクセスするサーバを視認しやすくしたい
サーバサイドの仕事をしているとローカルの開発環境、検証環境、本番環境にアクセスすることがあると思います。

うっかり、「本番環境で作業しちゃった(^^;」みたいなことを極力防ぎたいので.bash_profileにターミナルの文字色を設定する方法を調べました。

## 実装例
.bash_profileに以下を記述

```bash
PS1_COLOR_BEGIN="\[\e[1;31m\]"
PS1_COLOR_END="\[\e[m\]"
PS1_HOST_NAME="ShiroUbuntu" #適宜変更
PS1="$PS1_COLOR_BEGIN[\u@$PS1_HOST_NAME\w]\$$PS1_COLOR_END "
```
変更したら、" source ~/.bash_profile "でリロード

## 解説
ユーザが今どこにログインしているかの情報は端末内のPS1変数によって設定されています。
この変数を変更することでログイン先をもっとユーザにとってわかりやすくすることが出来ます。

"\u"や"\w"は特殊文字です。
ざっとまとめますと

|特殊文字| 意味 |
|:-----------------|:------------------:|
| \s            |        シェルの名前を表示        |
| \u           |       ユーザ名を表示       |
| \w             |        作業ディレクトリの絶対パス        |
| \W               |         作業ディレクトリ名のみ         |

詳しくは[ここ](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/002cngprmpt.html)

また、文字色は"\\[\e[{COLOR_CODE}\\]"の形で設定することで、それ移行の文字色を変える事が出来ます。

カラーコードの一部(0->細文字、1->太文字)

|カラーコード| 色 |
|:---------:|:----------:|
|0;30m | 黒 |
|0;31m | 赤 |
|0;32m | 緑 |
|0;33m | 黄色 |
|0;34m | 青 |
|0;35m | 紫 |
|0;36m | シアン |
|0;37m | 白 |


今回は"PS1_COLOR_BEGIN"という変数に格納しています。
また、色を未設定にするときには"\\[\e[m\\]"にすれば良いです。（"PS1_COLOR_END"に格納しています。)

つまり、上の例では`["ユーザ名"@ShiroUbuntu"作業ディレクトリ"]$ `が赤色で表示されます。

## まとめ
ざっくりとした説明になってしまいましたが、
アクセスするサーバごとの".bash_profile"に設定を用意することで自分がどのサーバにアクセスしているか、もっとわかりやすくなると思います。
特定の背景色のセル抜き出しマクロ

```vb
Sub 特定の背景色のセル抜き出しマクロ()

    
    Dim currentRange As Range
    Dim Rng As Range
    Dim firstAddress As String
    
    Dim copyBookName As String
    copyBookName = ActiveWorkbook.Name
    
    Application.FindFormat.Clear
    Application.FindFormat.Interior.Color = vbYellow
    
    '貼付先のブック作成
    Application.Workbooks.Add
    Dim xWs As Worksheet
    Set xWs = Application.ActiveSheet
    Dim pasteBookName As String
    pasteBookName = ActiveWorkbook.Name
    
    Workbooks(copyBookName).Activate
    Set currentRange = ActiveSheet.UsedRange.Find(What:="*", SearchFormat:=True)
    
    If currentRange Is Nothing Then
        MsgBox "修正箇所はありません"
        Exit Sub
    Else
        
        firstAddress = currentRange.Address
        

        Set Rng = currentRange
        Do
            Set currentRange = ActiveSheet.UsedRange.Find(What:="*", _
                                           After:=currentRange, _
                                           SearchFormat:=True)
            
            endrow = getEndRow(pasteBookName)
            endCol = getEndCol(pasteBookName)
            
            currentRange.Copy Destination:=xWs.Range(xWs.Cells(endrow, endCol))
            'currentRange.Copy Destination:=xWs.Range("A1")
            
            'ループ終了条件
            If currentRange Is Nothing Then Exit Do
            If currentRange.Address = firstAddress Then Exit Do
            
            '現在の該当セルを追加選択
            Set Rng = Union(Rng, currentRange)
        Loop
    End If
    
    
    Workbooks(pasteBookName).Activate
    
    'Dim xWs As Worksheet
    'Dim Rng As Range
    'Set Rng = Application.Selection
    
    'Application.Workbooks.Add
    'Set xWs = Application.ActiveSheet
    
    'Rng.Copy Destination:=xWs.Range("A1")

End Sub
```

```vb
Function getEndRow(bookName As String) As Integer
    
     Dim baseBookName As String
     baseBookName = ActiveWorkbook.Name
    
    Workbooks(bookName).Activate

    With ActiveSheet.UsedRange
        maxRow = .Rows(.Rows.Count).Row
        maxCol = .Columns(.Columns.Count).Column
    End With
    
    Workbooks(baseBookName).Activate

    getEndRow = maxRow
    
End Function
```

```vb
Function getEndCol(bookName As String) As Integer
    
     Dim baseBookName As String
     baseBookName = ActiveWorkbook.Name
    
    Workbooks(bookName).Activate

    With ActiveSheet.UsedRange
        maxRow = .Rows(.Rows.Count).Row
        maxCol = .Columns(.Columns.Count).Column
    End With
    
    Workbooks(baseBookName).Activate

    getEndCol = maxCol
    
End Function
【技術書典】初参加の私がサークル出店者に伝えたい10のこと

今日はじめて技術書典とやらに行ったくらげです。完全に舐めてかかっていたため、10時半の時点であんな状態になるとは思っていなかったです。本当すみません。ごめんなさい。あんなにすごい人とは思っていなかったんです…。（酔ってる状態で書いているので、誤字脱字や不適切な発言等あるかも知れません。その際はあとでこっそり直しにきます）

さて、図々しく技術書典終了後の飲み会まで参加してきたのですが、そこで出店者の方々とお話ししていると、「お客さんの気持ちや反応がわからない」という意見や、こちら側（買い手）とすこし考えがずれているな？と思うことがあったので、ここで買い手側（初参加）から技術書典での意見を述べさせていただければと思います。慣れてない人の目に技術書典はどう映ったのかという視点でいろいろ偉そうに書きます。もちろん、あくまで一個人の意見なのでご参考までに。技術書典に来られる方の数はどんどん増えて言っていますし、そいういう意味では初めて参加する人の意見というのは少し見ておいても良いのではと思います。　あと、本を出されている方々のことは本当に尊敬しています。ほんっとうにありがとうございました。


## 1.サークル情報は早めに出してくれ！！
事前に気になるサークルをチェックしておいたのだけど、前日になって見直してみると欲しいのが増えて…る？　初めての参加だったのでよくわかってなかったのですが、サークル情報を出す締め切りなどはないのですね。買い手としては、いつサークルをチェックするかわからないので、なるべく早く出された方が認知されやすく売りやすいのかなとおもいました。　出店されてる方の中にはチェック数で販売する部数を計算してるという方もいらっしゃったので、そういった目安にもなるのかなと思います。

## 2.恥ずかしがらずツイッター等で大々的に宣伝してくれ！！
気になるワードが入ってる本でも存在自体を知らないと買えないのです！！お願いだから宣伝してくれえええ！！　飲み会でも、恥ずかしくて3日前からツイッターで宣伝し始めたって言ってた人がいたのだけど本当にもったいないよ…会場内だと落ち着いて商品を見れないこともあるから事前に知らないと買いづらいんだよ…

##3.あなたは作者ですか！？売り子ですかー！？？
ツイッターで一方的に知っていたり、ちょっとしたファンだったりする場合、作者さんに一言挨拶したいと思ったりするのだけど、売ってる人が作者なのか売り子なのかがぱっとみわからない…。名刺や名札を目立つところにつけといて欲しいです。聞いて確認すればいいんだろうけどシャイボーイには超えられぬ試練でした。

##4.チェックしたけど買わないことがありますごめんなさい！！
チェックはしておいたけど、現物をみてやっぱり…ってことがあります。これは本当に申し訳ない気持ちになる…理由はだいたい以下の通り。
- 薄すぎる ：値段に見合わないかな…とちょっと買うのを考える…
- 思ってたより高い：自分の中では１冊に2000円はちょっと高い…となってしまいました
- 思ってたより難しそう：自分が使いこなせるレベルにないと判断したら今回は見送りました
- 他でお金使いすぎた：ごめんなさい（後払いシステムは最後の手段だと思ってます）

##5.でも大抵の本は後になってやっぱり買っときゃよかった…って後悔する
何度も表紙を見て迷ったりしたもんだから脳に焼き付いてる。やっぱ買っときゃよかったかな…

## 6.一つのサークルに本が３冊も４冊もあると逆に悩んでしまうことがある
気になる分野だからどれか買いたいと思っても、数が多すぎて悩んで買えない…ということがありました。選択肢の母数が増えると人はストレスを感じるというあれですね。

## 7.買った本が売り切れているとちょっと嬉しい
わっちは買えたぜ！ひゃっはーって心の中で思ってます。嫌な奴だとはわかっている！
逆に悩んでやめた本が売り切れた時の悔しさは底知れない。

## 8.やっぱり本(実物)が欲しい！！
ダウンロード版の方が場所を取らなくていいんだけど、本の方がやっぱり物欲、所有欲が満たされるので好きです。だから本が売り切れてしまうと、ちょっと萎える…。売り切れてしまって買えなかったところは、悔しさで記憶に残っているので次にかけようと心に決めます。

## 9.ポッドキャスト界隈は人気な！
ツイッターで知ってる人より、ポッドキャストで知ってる人の方が会った時の嬉しさが高い気がした。私がラジオ大好きマンというのもあるけど、有名ポッドキャストで紹介してもらえると…売り上げにかなり影響しそうですね。

## 10.なんだかんだ偉そうに言ったけど本当お疲れ様でした！！！これから数ヶ月はあなた方の本でほくほくできます！！
初めての参加でしたが、本当に素晴らしいイベントだと思いました。売る側も買う側もプログラミングを愛するもの同士。こう言った文化が続くといいなと思うし、次は本を出す側でいけたらなと思います。本当にみなさんお疲れ様でした！！！
CentOS 7.4にApache 2.4 (httpd)をインストール

## Install

```
sudo yum install httpd


# Version
httpd -v


sudo systemctl start httpd
ps awux | grep -v grep | grep http

```

## バージョン確認
```
[centos@zzeng-hdp-3 log]$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Jun 27 2018 13:48:59
[centos@zzeng-hdp-3 log]$

[centos@zzeng-hdp-3 log]$ ps awux | grep -v grep | grep http
root     21275  1.0  0.0 226200  5096 ?        Ss   16:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache   21278  0.0  0.0 226200  3000 ?        S    16:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache   21279  0.0  0.0 226200  3000 ?        S    16:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache   21280  0.0  0.0 226200  3000 ?        S    16:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache   21281  0.0  0.0 226200  3000 ?        S    16:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache   21282  0.0  0.0 226200  3000 ?        S    16:09   0:00 /usr/sbin/httpd -DFOREGROUND
[centos@zzeng-hdp-3 log]$
```