OmniAICreator/Qiita-1.07M huggingface dataset:
Apache POIを使ってExcelを操作

#概要
本記事は、Excelに対して何らかの機械的な操作を行いたい、でもマクロを書くのはめんどくさいという場合の選択肢としてJavaの**Apache POI**を使う際の非常にベーシックな実装方法を紹介します。
システムの開発の現場では、多くの設計書がExcelで書かれていることがあり、一度に大量のテーブル定義書や画面項目定義を確認する際に困るシチュエーション等があるかと思います。
そんな時にVBA(マクロ)以外の方法として、普段慣れ親しんでいるJavaで簡単にツールを作れるのが、「Apache POI」のライブラリとなります。

##Apache POIとは
Apache POI（アパッチ・ポイまたはピーオーアイ）はApacheソフトウェア財団のプロジェクトで、WordやExcelといったMicrosoft Office形式のファイルを読み書きできる100% Javaライブラリとして提供されている。
https://ja.wikipedia.org/wiki/Apache_POI

#初期設定
Mavenのプロジェクトを作成しpom.xmlファイルのdependencyに「**poi**」と「**poi-ooxml**」を追加します。(下記を参照)
「poi-ooxml」も追加しておくことでOOXML形式のファイルも使用できます。つまり、POIを利用して、拡張子が「xlsx」「docx」といった2007形式のファイルの読み書きが可能となります。

```xml:pom.xml
<dependencies>
  <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>[バージョンを指定]</version>
  </dependency>
  <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>[バージョンを指定]</version>
  </dependency>
</dependencies>
```
最新だと、バージョンは"**4.0.1**"のようです。(2019/2/1時点)
https://mvnrepository.com/artifact/org.apache.poi/poi/4.0.1
https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml/4.0.1

#基本実装
##Excelファイルの読み取り
###ファイルを開く
```java
Workbook workbook = WorkbookFactory.create(new File("ファイルパス"));
```
###シートを開く
```java
// シート名がわかっている場合
Sheet sheet = workbook.getSheet("シート名");

// 取得したいシートが何番目かわかっている場合
// シート番号はゼロベース
Sheet sheet = workbook.getSheetAt(0);

// 全シートを繰り返し処理する場合
Iterator<Sheet> sheets = workbook.sheetIterator();
while(sheets.hasNext()) {
  Sheet sheet = sheets.next();
}

// シート名を取得
String sheetName = inputSheet.getSheetName();
```
###セルの値を取得
```java
// 行を取得
// 行番号はゼロベース
Row row = sheet.getRow("行番号");

// セルを取得
// 列番号はゼロベース
Cell cell = row.getCell("列番号");

// セルの型を取得
int cellType = cell.getCellType();

// 型に応じたgetterで値を取得
// String
cell.getStringCellValue();
// Boolean
cell.getBooleanCellValue()
// Formula
cell.getCellFormula();
// Numeric
cell.getNumericCellValue();
// etc
```

##Excelファイルの作成、出力
###ファイルを作成
```java
// Excel2003までのファイルフォーマット
Workbook outputWorkbook = new HSSFWorkbook();

// Excel2007におけるOOXML(Office Open XML)形式のファイルフォーマット
Workbook outputWorkbook = new XSSFWorkbook();
```

###シートを作成
```java
Sheet outputSheet = outputWorkbook.createSheet();
```

###セルに値を設定
```java
// 行を作成
// 行番号はゼロベース
Row outputRow = outputSheet.createRow("行番号");

// セルを作成
// 列番号はゼロベース
Cell outputCell = outputRow.createCell("列番号");

// セルに値を設定
outputCell.setCellValue("設定したい値");
```

###ファイルへの出力
```java
// 出力用のストリームを用意
FileOutputStream out = new FileOutputStream("出力ファイルパス");
// ファイルへ出力
outputWorkbook.write(out);
```

#参考
今回、個人的に作ったツールは以下となります。
かなり雑な実装ですが、大量のExcelファイルから必要な部分を切り取ってを一つのファイルにマージするという処理を行なっています。
https://github.com/yhayashi30/ExcelMergeTool
シンプルなJavaアプリを実行するdockerイメージを作成

# やること

Dockerについて理解するために、非常に簡易なアプリケーションのdockerイメージを作って動かしてみる。  
具体的には、"Hello world!" を1秒に1回出すようなアプリケーションを動作させる。
ビルド〜実行まですべてコンテナ上で行うことを目指す。
  
Javaのソースコードは以下のよう。  
https://github.com/nannany/very-simple-application

# 環境

Windows10 HOME 上で実行した。  
Windows上にDockerの動作環境を作成するにあたっては、Docker Toolboxを使用した。  
詳細は以下の記事参照。  
https://qiita.com/idani/items/fb7681d79eeb48c05144

# dockerイメージを作る流れ

Dockerfileを書く→docker buildコマンドを実行
でdockerイメージは作成される。

dockerイメージ作成のざっくりとした流れは以下の図のような感じ。  
意識すべき登場人物としては、

* 自身のローカル端末
* ビルドコンテキスト
* dockerイメージ

dockerビルドコマンド実行時に、どのパス配下のファイルをビルドコンテキストに追加するかを決める。
このとき、ビルドコンテキストに持っていきたくないファイルは`.dockerignore`ファイルに記述する。  
 
また、Dockerfile内のCOPY命令で、ビルドコンテキスト内の何をイメージに持っていくか決める。

![ビルドコンテキスト.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/44325a12-e954-dc7f-5c27-2d37a4ba4fcd.jpeg)



# 使用するDockerfile

全体としては以下のよう。

```
FROM ubuntu:disco

COPY . .
RUN apt-get update && apt-get install -y \
    maven \
    openjdk-8-jre \
 && cd simple \
 && mvn package
CMD ["java","-jar","simple/target/simple-1.0-SNAPSHOT.jar"]
```


まずはベースイメージを選ぶために、`FROM`を記述する。  
ここでは、適当に`ubuntu:disco`を選択する。  
 
次に、ビルドコンテキストからイメージにファイルをコピーするために、`COPY . .`と記述する。  
 
その次に、ソースのビルド、Javaの実行に必要なパッケージ（mavenとopenjdk）をインストールし、mavenのjar作成コマンドを実行する。

```
RUN apt-get update && apt-get install -y \
    maven \
    openjdk-8-jre \
 && cd simple \
 && mvn package
```

書き方は下記をまねて、レイヤの数の最小化、apt-get updateとinstallを同時にやることを意識した。
http://docs.docker.jp/engine/articles/dockerfile_best-practice.html

最後に、コンテナが起動した後に`java -jar simple/target/simple-1.0-SNAPSHOT.jar`が実行されるように、以下のように記述した。

```
CMD ["java","-jar","simple/target/simple-1.0-SNAPSHOT.jar"]
```

# ビルド時に実行するdockerコマンド

イメージを作成する際に実行するdockerコマンドは、

```
docker build -t simple-application -f Dockerfile.cmd .
```

`-t simple-application` にて、イメージの名称をsimple-applicationにしている。  
`-f Dockerfile.cmd` にて、イメージの作成に際して使用するDockerfileを、上記のコマンドを実行しているパスにあるDockerfile.cmdとしている。（デフォルトは、コマンドを実行しているパスにあるDockerfileが選択される）  
最後の`.`は、コマンドを実行しているパス配下がビルドコンテキストに追加されますよ、ということを意味している。


# 動かす

上記で作成したイメージを、以下のコマンドで動作させてみる。

```
docker run simple-application-cmd
```

以下のように表示され、うまくいった。

![hello.gif](https://qiita-image-store.s3.amazonaws.com/0/105281/5078e373-2175-1157-1596-21a0e12d1eb1.gif)


# maven入りのイメージ

上では`ubuntu:disco`をベースイメージに指定して、RUNでmavenとJavaをイメージにインストールした。  
しかし、もともとmavenとJavaが入っているベースイメージが存在しているので、それを使用したDockerfileが以下。（なぜかテストでエラったのでそこはとばした）

```
FROM maven:3-jdk-8

COPY . .
RUN cd simple && mvn package -Dmaven.test.skip=true
CMD ["java","-jar","simple/target/simple-1.0-SNAPSHOT.jar"]
```
子テーマのstyleが優先されない場合の対処法

本記事は備忘録として書きました。
初歩的な内容となっています。
しかし「子テーマ　優先されない」などとググっても、そのものズバリと書いてあるサイトを見つけられませんでした。
何かのお役に立てれば幸いに存じます。


子テーマのstyleが適用されず明示的な記述をしたい場合下記のような記述をお勧めしているサイトをよく見かけます。

```php:functions.php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
  wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );//親テーマのスタイル
  wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/custom-style.css', array('parent-style')//子テーマのスタイル
);
```

それでもテーマによって（？）、
親テーマ → 子テーマ → 親テーマ
と、親テーマのstyleが再度読み込まれ、子テーマのスタイルが優先されない場合があります。(下図）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122812/8c980d03-647f-0ea6-8b2f-cd83e918e9fd.png)
custom-style.css が読み込まれた後に id='baskerville_style-css' で親スタイルが再度読み込まれ上書きされています。

だったら、さらに明示的に baskerville_style-css を先に読み込ませ、子テーマの custom-style.css を後に読み込ませればいいのだと思い、下記のように記述しました。

```php:functions.php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
  wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
  wp_enqueue_style( 'baskerville_style', get_template_directory_uri() . '/style.css' );
  wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/custom-style.css', array('parent-style')
);
```

結果は子テーマが一番後に読み込まれ、優先されるようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122812/61358d70-a7e1-2679-2711-afb8382b1d49.png)
KtorのAutoReloadを有効にする。

おはようございます。@naokiurです。
よろしくお願い致します。

2019年も引き続き、
個人的にKotlin/Ktorに興味を持っている毎日です。

AutoReload、便利ですよね。
[公式](https://ktor.io/servers/autoreload.html)に習い、設定したいと思います。

# 環境
* MacBook Pro (Retina 13-inch、Early 2015)
* macOS High Sierra 10.13.6
* Java 1.8.0_191
* IntelliJ IDEA CE 2018.3.4

# 実施したこと
* application.confを修正した。

# 結果
* AutoReloadが有効になった。

# AutoReloadの設定
実施方法は2つあります。

* `embeddedServer`に記載する
* `application.conf`に記載する

自分の今回のコードでは、 `embeddedServer`でサーバを起動しておらず、
`application.conf`に設定を記載し、
`io.ktor.server.netty.EngineMain`を実行することで、
サーバを起動しておりました。

そのため、
「`application.conf`に記載する」方法を取りました。

```application.conf
ktor {
    deployment {
        port = 8080
        watch = [ out/production ] // ← 追記する
    }

    application {
        modules = [ jp.ne.naokiur.api.ExecutorKt.api ]
    }
}
```

`application.conf`内の `watch`キーに、
今回のコードのコンパイル出力フォルダを設定します。
IntelliJのデフォルトになっているため、
`out/production`を設定しました。

これによって、
コンパイル出力フォルダに変更があった場合、
AutoReloadするようになりました。

サーバ起動時、以下のようなログが出力されます。
`16:36:19.876 [main] DEBUG Application - Watching /絶対パス/out/production/classes/〜 for changes.`

# ただし
`コンパイル出力フォルダに変更があった場合`なので、
`gradle build`や、
IntelliJのcmd + F9で `Build Project`を実施する必要があります。


# 勘違いしたところ
熟読しなかった自分のせいなのですが、
公式に `watch = [ module1, module2 ]`と書いてあったため、
最初、今回のコードのモジュール名である、 `api`を設定してしまいました。

これでは有効にならず、
AutoReloadが有効になっていない旨の、
以下のようなログが出力されてしまいました。
`16:20:24.636 [main] INFO Application - No ktor.deployment.watch patterns match classpath entries, automatic reload is not active`

そのあたりのことは、ちゃんと公式にかかれていました…。

> `file:///path/to/project/build/classes/myproject.jar`というクラスパスならば、
> `to/project`だとマッチします。
> しかしパッケージ名のような `com.mydomain`ではマッチしません。


# 今後
DBアクセスを実施したいと思っています。

# 参考にさせて頂きました
* https://ktor.io/servers/autoreload.html
Scalaでクラスを使う

#はじめに
Scalaを勉強し始めたので、学んだ内容を整理していきます。
参考書として [基礎からわかるScala](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B-Scala-%E9%AE%AB%E5%B3%B6-%E5%85%89%E8%B2%B4/dp/4863542267) を使っています。

今回は、「クラス」について学びました。

#1. インスタンス化
###書き方
val オブジェクト名 = new クラス名(引数)

###サンプル
```ClassSample.scala
val obj = new Sample(argument)
```


#2. コンストラクタ
基本コンストラクタと補助コンストラクタの2つがある。


##2-1. 基本コンストラクタ
クラスの定義ブロック内に記載された内容が上から順に実行される。

###サンプル
```CLassSample.scala

object ClassSample extends App{
  val explanation = new Explanation();
}

class Explanation {
  println("Scalaの基本コンストラクタは、");
  println("ブロック内に記載された内容が");
  println("上から順に実行されます。");
}
```

###実行結果
>Scalaの基本コンストラクタは、
>ブロック内に記載された内容が
>上から順に実行されます。


##2-2. 補助コンストラクタ
引数の異なるコンストラクタを定義したい場合に利用する。
thisをつけることで、既存のコンストラクタを呼び出すことができる。

あくまでも補助であり、基本コンストラクタが複数種類になる訳ではないので注意。
(C#はオーバーロードすることで、コンストラクタを複数種類書けるので、個人的に混同しがち)

###サンプル
```ClassSample.scala
object ClassSample extends App{
  val greeting = new Greeting("Hey", "Jack")
  val defaultGreeting = new Greeting("Bob")
  val conditionalGreeting = new Greeting(true, "Tom")
}

class Greeting(val greetingWord: String, val name: String) {
  println(greetingWord + ", " + name);

  def this(name:String) = this("Nice to meet you", name)
  def this(isFriend: Boolean, name:String)
        = this( if (isFriend) "What's up" else "Hello", name)
}
```

###実行結果
>Hey, Jack
>Nice to meet you, Bob
>What's up, Tom

#3. メソッド
###書き方
def メソッド名(引数の宣言): 戻り値の宣言 = { 処理の記述 }

###サンプル
```ClassSample.scala
object ClassSample extends App{
  val methodSample = new MethodSample()
  val message = methodSample.GetMessage("Michael")
  println(message)
}

class MethodSample {
  def GetMessage(name:String): String =
  {
    return "This is message for " + name;
  }
}
```

###実行結果
>This is message for Michael

#4. 補足知識
##4-1. オブジェクト
classキーワードの代わりにobjectキーワードを用いることで、シングルトンオブジェクトとして活用することが可能になる。

###サンプル
```ClassSample.scala
object ClassSample extends App{
  println(ObjectSample.GetMessage("Oliver"))
}

object ObjectSample {
  def GetMessage(name:String): String =
  {
    return "This is message for " + name;
  }
}
```

###実行結果
>This is message for Oliver
WARN tar EISDIR: illegal operation on a directory

### はじめに
Qiita初投稿です。
備忘のためと誰かの役に立てばいいなと思ったので投稿します。

### 環境
* MacOS Mojave
* npm 6.5.0

### 現象
```
sudo npm install -g <package>
```
でタイトルのエラー

### 解決策
https://npm.community/t/global-installs-sudo-npm-i-g-fail-on-mac-after-6-5-upgrade-works-fine-after-6-4-1-downgrade/4082

要はsudoつけなくていいよってことみたいです。
嬉しいけどびっくりしました。
Bash の戻り値判定を様々なパターンで記述する

# 概要

関数やコマンドの戻り値を判定して、条件分岐させたいときにいくつか書き方が考えられるのでまとめてみる。

# 1. $? を使った典型的な if-then 

```bash
hogehoge
if [ $? -ne 0 ]; then
  # エラー処理
fi
```

- 直感的でわかりやすい
- ちょっと冗長
- `set -e` しているときに `hogehoge` が失敗すると、エラー処理までたどり着かない

# 2. $? を使わずに if-then

```bash
if ! hogehoge; then
  # エラー処理
fi
```

- 1. よりも 1 行削れる
- その分直感的に欠ける?

# 3. if を使わずに OR 演算子で判定

```bash
hogehoge || {
  # エラー処理
}
```

- `||` は左辺のコマンドが異常終了 (戻り値が 0 以外) した際に右辺を評価する。波括弧 `{ }` でくくることで評価の対象を複数行で書くことができる
- 見た目が無名関数っぽくてかっこいい
- でも慣れていない人にとっては読み辛いかも

# まとめ

多少の冗長性は犠牲にしてでも、慣れ親しんだ・読みやすい記法に倒したほうが (特に Bash においては) バグを生みにくいのではないかと個人的には感じる。
PythonTexで図を生成しGrid出力する

# 概要

PythonTexを使うと、texの文書中にpythonのコードを埋め込むことができます。ここではtex文書中で図の作成とその表示・出力を行います。
特に図を連続出力したい場合にPythonTexがその実力を発揮するため、
複数の図を作成し、グリッドにして表示させます。

# 画像のGrid表示

今回は自動で出力した図をgridで表示するために``minipage``環境を利用します。``PythonTex``を使わず、愚直に書くと以下のようなコードです。
たくさんの図を出力する際は非常に面倒ですね...

```tex
\begin{figure}[ht]
  \begin{minipage}[ht]{0.48\textwidth} 
    \centering 
    \includegraphics[width= 6 cm]{sin.png} 
    \caption{sin curve} 
    \label{sin} 
   \end{minipage} 
   \hfill
 \begin{minipage}[ht]{0.48\textwidth} 
...
 \end{minipage} 
\end{figure}
```


# 実行コード

特別なものとして``pythontex``を指定します。
PythonTexの環境構築は[こちらの記事](https://texwiki.texjp.org/?PythonTeX)が参考になります。

``pycode``環境に``python``のコードを埋め込み、
``\py{}``で呼び出すことでtex文書中に生成したtexコードを出力させます。

```tex
\documentclass{article}
\usepackage[dvipdfmx]{graphicx}
\usepackage{mediabb}
\usepackage{pythontex}
\begin{document}

\begin{pycode}
import matplotlib.pyplot as plt
import numpy as np

## 図の作成
def draw_func(x, y, name):
  plt.figure(figsize=(10, 7))
  plt.plot(x, y)
  plt.savefig('{}.png'.format(name))

def sin():
  x = np.arange(-3, 3, 0.01)
  y = np.sin(x)
  draw_func(x, y, 'sin')
  
def cos():
  x = np.arange(-3, 3, 0.01)
  y = np.cos(x)
  draw_func(x, y, 'cos')

def exp():
  x = np.arange(-3, 3, 0.01)
  y = np.exp(x)
  draw_func(x, y, 'exp')

def square():
  x = np.arange(-3, 3, 0.01)
  y = np.square(x)
  draw_func(x, y, 'square')

# ファイル名、caption, labelの指定
images = [ \
  ('sin.png', 'sin curve', 'sin'), \
  ('cos.png', 'cos curve', 'cos'), \
  ('exp.png', 'exp curve', 'exp'), \
  ('square.png', 'square curve', 'square'), \
  ]

def insert_grid_images(): # 2*N grid
  # 図の生成
  sin()
  cos()
  exp()
  square()

　# Gridで表示するためにfigure環境にminipageを作る
  head = r"\begin{figure}[ht]"
　
　# 反復部分
  content = ""
  for i in images:
    tmp = r"\
    \begin{minipage}[ht]{0.48\textwidth} \
      \centering \
      \includegraphics[width= 6 cm]{FILENAME} \
      \caption{CAPTION} \
      \label{LABEL} \
    \end{minipage} \
    \hfill"
    property = {
      "FILENAME" : i[0],
      "CAPTION" : i[1],
      "LABEL" : i[2],  
    }
    # ファイル名、caption, labelを置換
    for key, value in property.items():
      tmp = tmp.replace(key, value)

    content += tmp

  foot = r"\end{figure}"

　# 生成した文字列を返す
  return head+content+foot
\end{pycode}  


sin curve(Figure \ref{sin}), % 引用も可能
cos curve(Figure \ref{cos}), 
exp curve(Figure \ref{exp}), 
square curve(Figure \ref{square})

% ここでinsert_grid_images()を実行し、texのコードを出力する
\py{insert_grid_images()}


\end{document}

```

# 完成図

生成した図が 正しくgridで表示されています。tex本文中での引用もうまくいっています。

<img width="500" alt="スクリーンショット 2019-02-03 17.04.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/350253/3136fb25-5591-dbcc-73b2-97f7d4180d0b.png">



# 参考
[Tex Wiki PythonTex](https://texwiki.texjp.org/?PythonTeX)
[TECH ACADEMY Pythonで複数箇所の文字列を置換する方法](https://techacademy.jp/magazine/18035)

# リソース
こちらのリポジトリに実行コードがあります。

https://github.com/YutoOhno/PythonTex-GridImage
TensorFlow2.0でFizzBuzz書いてみた

# 初めに
以前に[TensorFlowでFizzBuzz書いてみた](https://qiita.com/shoji9x9/items/72b659953a271a303f35)という記事を書きました。その際、
> TensorFlow2.0はDefine by Runになるそうですが、そうするとデバッグも楽になるのかなぁ。

と書きましたが、TensorFlow2.0 PreviewをGoogle Colabで試せるようになりましたので、TensorFlow2.0でFizzBuzzを書いてみました。Google Colabって何？という方は[Google Colabの使い方まとめ](https://qiita.com/shoji9x9/items/0ff0f6f603df18d631ab)をご覧下さい。

# 想定読者
* TensorFlow2.0がどんな感じか知りたい方
* FizzBuzzを愛する方

# 参考にさせて頂いたページ
* [TensorFlow 2.0 Previewを最速で試すColaboratory](https://qiita.com/tomo_makes/items/9c22f306f1b781e8a7c2)
* [公式チュートリアル](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/guide/eager.ipynb#scrollTo=H08f9ss9qEft)

# FizzBuzz
実は公式チュートリアルにFizzBuzzがサンプルとして載っていますので、それを引用します。

``` Python
def fizzbuzz(max_num):
  #from IPython.core.debugger import Pdb; Pdb().set_trace()    
  counter = tf.constant(0)
  max_num = tf.convert_to_tensor(max_num)
  for num in range(1, max_num.numpy() + 1):
    num = tf.constant(num)
    if int(num % 3) == 0 and int(num % 5) == 0:
      print('FizzBuzz')
    elif int(num % 3) == 0:
      print('Fizz')
    elif int(num % 5) == 0:
      print('Buzz')
    else:
      print(num.numpy())
    counter += 1
```

[以前](https://qiita.com/shoji9x9/items/72b659953a271a303f35#%E3%81%9D%E3%81%97%E3%81%A6tensorflow%E3%81%A7fizzbuzz%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%BF%E3%81%9F)と比べてかなりシンプルになりました。いくつか調べた結果を書いてみます。

* tf.convert_to_tensorは以前から存在したAPIです。`max_num = tf.convert_to_tensor(max_num)`なんてする必要はないのですが、その後のTensorの扱い方を理解するためにintをTensorに変換しているのだと思います
* それが表れているのが`range(1, max_num.numpy() + 1)`です。以前のTensorは`<tf.Tensor 'Const_11:0' shape=() dtype=int32>`という情報を持っていましたが、TensorFlow2.0では`<tf.Tensor: id=610, shape=(), dtype=int32, numpy=0>`という情報を持っており、numpyの部分が増えています。`.numpy()`によりその値を取得していると思われます。ちなみに`.numpy()`を使わずに`range(1, max_num + 1)`としても問題なく動きました
* `if int(num % 3) == 0`と書けるようになりました。前回はこれを`tf.cond(tf.equal(tf.mod(num, 3), 0)`と書いていましたので、より直感的に書けるようになりました。`tf.mod`はTensorFlow2.0にはいないように見えますが、`tf.cond`や`tf.equal`は依然あるようです（需要があるのかわかりませんが）
* `from IPython.core.debugger import Pdb; Pdb().set_trace()`を使ってこれらを調べました

呼び出しと実行結果はこちらです。

```Python
fizzbuzz(15)
```

```Python
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
```

`tf.Session()`や`tf.global_variables_initializer()`がなくなりました。こちらもシンプルになりましたね！

# 最後に
これだけ見ているとTensorFlow2.0は直感的な記述が可能になった気がします。公式チュートリアルを実行しながら引き続き勉強しようと思います。
first commit が古い順でファイルの一覧を取得する

```bash
$ git ls-files *.php | xargs -n1 -I{} git log --reverse -1 --format='%cd {}' --date=short {} | sort
```
1 ファイルごとに git log するので、ファイル数が多いと重い。以下のように出力される。


```
  :
2015-10-07 src/.../a.php
2016-10-07 src/.../b.php
2017-10-07 src/.../c.php
  :
```

日付が不要なときは `--format` の `%cd ` (committer date) を消せば OK。

そもそもの動機としては会社で、first commit が古い --> 技術的負債がたまっている可能性あり? --> リファクタのしがいがあるかも、という考えに至ったため。
負債の程度は first commit date だけでなく、コミットの総数や修正行数なども判断材料として使えそうだけど、ただでさえ重い処理に拍車がかかりそうなので一旦見送り…。
docker for Windowsでfirewall絡みのエラーが出た時の対処

## 概要
docker for WindowsでWindowsのディレクトリをコンテナ内のディレクトリとしてマウントしようとすると、以下のようなエラーが発生したので、その対処をまとめます。

```
A firewall is blocking file Sharing between Windows and the containers. 
```

## エラー
![](https://camo.qiitausercontent.com/a4a837d02a7849bf6bee64524ffa0dd11bd12f20/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3235363639362f32663330366332322d363564372d346438342d373138632d6231336530313231633234632e706e67)

## 原因
インストールしていたセキュリティソフトKasperskyでWindows⇔コンテナ間の通信が許可されていなかった。

## 対処
KasperskyでWindows⇔コンテナ間の通信を許可します。

左下の歯車ボタンをクリックして設定画面を開く。
<img width="579" alt="2019-02-03 (2).png" src="https://qiita-image-store.s3.amazonaws.com/0/113263/ac93b8bd-22c3-7e29-ca11-a66b9cd152e8.png">

「プロテクション」＞「ファイアウォール」を選択する。
<img width="579" alt="2019-02-03 (3).png" src="https://qiita-image-store.s3.amazonaws.com/0/113263/e4627ac7-d388-7ca1-0e82-e2575e1e8fd3.png">

「パケットルールの設定」を選択する。
<img width="579" alt="2019-02-03 (4).png" src="https://qiita-image-store.s3.amazonaws.com/0/113263/e17dedfd-1eda-1689-3a07-2459ef3107a4.png">

以下のようなパケットルールを追加する。
デフォルトであればWindows⇔コンテナ間の通信は以下のような内容です。
<img width="493" alt="2019-02-03 (6).png" src="https://qiita-image-store.s3.amazonaws.com/0/113263/a23588fc-cbb5-19d7-7d2c-5e344beebd4a.png">

これでマウントできると思います。

## 感想
Windowsで開発環境構築するの大変だなあ。

## 参考
[Windows10 で、Dockerで環境作る際の　ESETのファイアーウォール設定](https://qiita.com/Naritoshi/items/09b3abf706caff237303)
php-master-changes 2019-02-02

今日は session_cache_expire() の引数型指定の修正、テストの修正があった！

# 2019-02-02
## nikic: Make session_cache_expire() arg an integer
- https://github.com/php/php-src/commit/4f187b8fbc4704b43c57de09ee68e4562910ec8e
- [session_cache_expire()](http://php.net/manual/ja/function.session-cache-expire.php) の引数の型を int に変更
- 現在の設定値も int で返すし、なんで API として string とることになってるのかイミフだった

## nikic: Try to fix serialization_miscTypes_001.phpt
- https://github.com/php/php-src/commit/76f8a908bb18aee92b8f3d523b74b06c9d12cb6b
- テストの修正
- `@TRUE123,` が `"TRUE123",` になってるので、[先月末](https://qiita.com/sj-i/items/c1450c066a29e1d36b2f#nikic-remove-bareword-fallback-for-constants)に未定義定数がその名前通りの文字列として解釈されるのを削除したのに関連してテストも修正、というやつかな
UEFIブートのWindowsマシンにUbuntuをCSMモードでインストールしてはいけない

## TL;DR
デュアルブートにしたいとき、UEFIブートのWindowsマシンにUbuntuをCSMモード（レガシーモード）でインストールしてはいけない。
そういう風に書いてるブログとか多いけど信用すんな。

## なぜこれを書いてるか
WinマシンにUbuntuをデュアルブートで入れたくなり、↑みたいなブログなどを参考にやってみたらハマった。

### 対象
- 元のマシン
    - PC：Dynabook T85/CG
    - OS：Windows10 Pro
- 入れようとしたOS：Ubuntu 18.04.1 LTS

### やってしまったこと（問題ある操作）
- UbuntuのisoをダウンロードしてUSBに入れ、ライブUSB作成
- HDDにインストール領域を確保
- UEFI設定画面で
    - セキュアブートをOFF
    - 起動モードをCSMモードに（UEFIモードをOFF）
- USBから起動してUbuntuをHDDの空き領域にインストール

## 発生した症状
UbuntuのGRUBがWinを認識してくれず、ブート時にWinを起動できなかった。
逆に、起動モードをUEFIモードにするとUbuntuは無視されてWindowsが起動するようになった。

## 何が問題か
英語サイトをひたすらぐぐって読む限り。UEFIモードのOSとレガシーモード（CSMモード）のOSを混在させるのはトラブルの元。
UEFIブートのWinにUbuntuを入れる場合はUbuntuもUEFIブートで入れるべき。
つまりライブUSBを作るとき、UEFIブートするUSBを作るべき。
その上で、

- セキュアブート：OFF
- 起動モード：UEFIモード

でUSBから起動する。

### UEFIブートのライブUSBの作り方
[Rufus](https://rufus.ie/)を使う。
Rufusの画面でisoを選択後、パーティション構成で__GPT__を選択。MBRにしてはいけない。

## どうやって問題を修正したか
[boot-repair-disk](https://sourceforge.net/p/boot-repair-cd/home/jp/)を使った。
こいつのisoをRufusを使ってUEFIブートするUSBを作成、このUSBから起動して `boot-repair` でブートローダを修復した。

## さらなる問題
Dynabookのブートデバイスの設定が特殊で、`F2`でUEFI設定画面が起動するがそれとは別に`F12`でブートデバイスの選択が直接できる。
cf. http://dynabook.com/assistpc/faq/pcdata2/017650.htm
前者でいくらやってもUSBから起動できず、後者でやっとうまくいった。
あとUSB2.0コネクタからは起動できず、USB3.0のコネクタからなら起動できた。
オフラインリアルタイムどう書く E30 の実装例( ruby )

問題の名前 : 面白いセルの合計
問題 : http://nabetani.sakura.ne.jp/hena/orde30sumt/
実装リンク集 : https://qiita.com/Nabetani/items/725e09cc5913a8569c04

次回のイベントは 3/9
see https://yhpg.doorkeeper.jp/events/86766

で。

```ruby:ruby2.6
require "json"

class Cells
  def initialize(ws)
    @ws = ws.dup
    @cache={}
  end

  def at(y,x)
    key = (x<<32)+y
    @cache[key] ||= _at(y,x)
  end

  def interesting?(y,x)
    !( 0<y && at(y,x)==at(y,x-1) && at(y,x)==at(y,x+1) )
  end

  def _at(y,x)
    return x+1 if y<=0
    left0 = x*@ws[y]
    right0 = left0 + @ws[y]

    left = left0 / @ws[y-1]
    right = (right0-1) / @ws[y-1]

    (left..right).select{ |xx|
      interesting?(y-1,xx)
    }.sum{ |xx| 
      at(y-1,xx)
    } % 1000
  end
end

def solve( src )
  wss, ms = src.split("/")
  ws = wss.split(",").map(&:to_i)
  Cells.new(ws).at(ws.size-1, ms.to_i-1).to_s
end

if $0==__FILE__
  data = JSON.parse(DATA.read, symbolize_names: true)
  data[:test_data].map{ | number:, src:, expected: |
    actual = solve( src )
    okay = actual == expected
    puts [ number, (okay ? "ok" : "**NG**"), actual, expected ].join(" ")
    okay
  }.all?.yield_self{ |x| puts( x ? "okay" : "SOMETHING WRONG" ) }
end

__END__
{"event_id":"E30","event_url":"https://yhpg.doorkeeper.jp/events/84247","test_data":[
  {"number":0,"src":"4,6,1,5/3","expected":"14"},
  {"number":1,"src":"1/1","expected":"1"},
  {"number":2,"src":"6/1","expected":"1"},
  {"number":51,"src":"408,412,30,930,372,822,632,948,855,503,8,618,138,695,897,852/377","expected":"212"}
]}
```

毎度のことながらテストデータの大半は省略。

普通にメモ化つき再帰なんだけど、それ以外にいい作戦は思いついていない。

つい `yield_self` のままにしたけど、 ruby 2.6 なので ~~`itself`~~ `then` にすべきだったね。

過去問に [上と左の合計]( http://nabetani.sakura.ne.jp/hena/ord22irrpas/ ) という類題がある。過去問のほうが難しそうな感じ。
Enumで定義したものを多言語対応させたい

#普通の多言語対応
多言語対応というと一般的には、リソースファイルを定義してそこから呼び出すという手段がとられると思います。

例えばProperties内のResources.resxで次のように定義したとします。

![Resource.png](https://qiita-image-store.s3.amazonaws.com/0/234220/6ea35e72-5ffc-7121-c2e5-215ce1a7d47c.png)


```C#:property.cs
// 日本語用リソースだと”4逓倍”、英語用だと”Multiple 4”
string str = Properties.Resources.Multi4 
```

各言語ごとにリソースファイル用意しておいて、切り替えることでstrに格納される文字列を変えることができるんですね。

一方でEnumでリソースを呼び出そうにも、宣言時には呼び出せません。

```
enum CountType
{
  Multi4,
  Multi2,
  Multi1
}
```

# 解決策
そこで拡張メソッドを使ってリソースファイルから各言語での表記を呼び出します。

```C#
public static string GetName(this CountType e)
{
  switch (e)
  {
     case CountType.Multi4:
       return Properties.Resources.Multi4;
     case CountType.Multi2:
       return Properties.Resources.Multi2;
     case CountType.Multi1:
       return Properties.Resources.Multi1;
     default:
       return "Undefined";
  }
}
```

使う際はGetName()メソッドを呼び出します。

```C#
foreach (CountType type in Enum.GetValues(typeof(CountType)))
{
  Combobox.Items.Add(type.GetName());
}
```
これで日本語表記できるようになりました。

![Combobox.png](https://qiita-image-store.s3.amazonaws.com/0/234220/7b45fa6b-3c4f-a38a-da00-9be4be8290f5.png)


#環境
Visual Studio 2017 Community
.Net Framework 4.6
C#

#参考文献
[WPF アプリの国際化 (多言語対応) と、実行中の動的な言語切り替え](http://grabacr.net/archives/1647)
[WPF Runtime Localization](https://www.codeproject.com/Articles/22967/WPF-Runtime-Localization)
Rで簡単統計分析　チートシート

##はじめに
stataで統計分析をやった。
同じことを自宅でRを使ってやるための備忘録。
必要なものだけ取り上げている。

##コマンド集

- 数値のインポート
x <- c(1,2,3,4,5)

- 記述統計量
ave()
mean()
max()
min()
median()
var(x,y)

- 二標本 t 検定
t.test()

- 回帰分析
 result <- lm(y ~ x)  # 回帰分析を行う
 summary(result)


##さいごに
- 久しぶりに触ったけど、ちょっとわかるようになっていて嬉しい。
- おそらくデータのインポートが難しそう。エクセルから入れてみたいな。
- 毎日続けられるレベルで頑張ることって大切
- Rstudioってstataでいうとeditみたいな感じ？　そのまま打ち込んで実行と、プログラム作るのに分けるのの違いみたいな？

参考URL 統計解析フリーソフト R の備忘録頁 ver.3.1
http://cse.naro.affrc.go.jp/takezawa/r-tips/r.html
S3へのアウトプット

こんにちは。AWS lambdaのAPIでS3のアウトプットについて簡単ながら書いていきます。

内容は言語はNode.jsで書いてますが、どの言語でもエッセンスは関係ない基礎的なところかなと思います。
参考文献:
https://www.amazon.co.jp/AWS%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-Peter-Sbarski/dp/4798155160/ref=sr_1_1?ie=UTF8&qid=1549178089&sr=8-1&keywords=%E3%82%B5%E3%83%BC%E3%83%90%E3%83%AC%E3%82%B9%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3


ではAWS LambdaのAPIで「バケット1」から、バケット内のファイルをアウトプットしましょう！！

例

            Outputs: [    
                    Key: "任意のファイル名"+ '.mp4等、ファイルの種類'
            ]

でlanbdaの中でアウトプットを作ることが出来ます。

ファイルだけじゃなくてフォルダを作りたい！という方は
ファイル名の前に

            Outputs: [    
                    Key: "任意のフォルダ名" + "/" + "任意のファイル名" + '.mp4等、ファイルの種類'
            ]

のように "/" を付けるとフォルダが出来上がって、ファイルが格納されている状態になっちゃいます。


複数のファイルをアウトプットに入れたい場合は

            Outputs: [    
                    {Key: "任意のフォルダ名" + "/" + "任意のファイル名" + '.mp4等、ファイルの種類'},
                    {.............},
                    {.............}・・・
            ]

と続けていけばいいです。

ここで、フォルダ名を同一のものにすると、同一フォルダに複数ファイルが格納された状態になります。


以上です。
読んでくださってありがとうございました！
[iOS] アプリの画面の方向を固定させる方法メモ


# 環境

* macOS Mojave 10.14.3
* Xcode 10.1

# アプリの画面の向きを決める方法
Xcodeのアプリの設定でできます。チェックボックスのチェックを入れるだけ。


1. 左サイドバーのプロジェクト名を選択
2. 「TARGETS」にありプロジェクト名を選択
3. 「General」タブを選択
4. 「Deployment Info」にある「Device Orientation」にあるチェックボックスのチェックをつけたり外したりする。

![スクリーンショット 2019-02-03 16.17.52.png](https://qiita-image-store.s3.amazonaws.com/0/110339/6e958580-9f8e-c063-8a2f-a8d3203c8b4b.png)

 
#　参考

* [【Swift】回転を防ぐ！アプリ画面を縦や横に固定させる方法](http://pippi-pro.com/swift-prevent-rotation)
VBAでUTF-8 BOMなしのファイルを出力する関数。

# VBAでUTF8(BOMなし)のファイルを出力する関数


* 関数名
   * WriteToUTF8NoBomFile

* 処理概要
   * UTF8(BOMなし)のファイルを出力する。

* 入力
   * 出力先パス: OutputPath、
   * 出力データ: OutputLines()
      * 配列で与える。
      * 1要素が1行に対応する。

* 入力(オプショナル)
   * 改行コード: LineSeparator
      * CRLF or LF。デフォルトはLF。
   * 上書きオプション: OverWrite
      * デフォルトはTrue

* 処理の説明
   * BOMありのUTF8のストリームを作成し、3バイト(BOMの部分)を削ったものをBOMなしのUTF8のファイルとして出力する。

* 作成動機
   * 検索すると色々コードが上がっているが、自分にとって使いやすいものがなかった。
   * まるっと忘れたときに、すぐ使える形で残しておくため。

* 参考サイト
   * [Stackoverflow](https://stackoverflow.com/questions/31435662/vba-save-a-file-with-utf-8-without-bom)
      * このコードは、上記のものをちょっと変えたもの。

* コード

   *  UTF8(BOMなし)のファイルを出力する関数

```vb
Sub WriteToUTF8NoBomFile(ByRef OutputPath As String, ByRef OutputLines() As String, _
                        Optional InLineSeparator As String = "LF", _
                        Optional InOverWrite As Boolean = True)

   ' ADODBの設定パラメータ
   Const SaveCreateNotExist = 1
   Const SaveCreateOverWrite = 2
   Const TypeBinary = 1
   Const TypeText = 2
   Const lineSeparatorLF = 10
   Const lineSeparatorCRLF = -1
   Const WriteLine = 1
   Const notWriteLine = 0

   Dim objStreamUTF8: Set objStreamUTF8 = CreateObject("ADODB.Stream")  ' UTF8(BOM)ありのストリーム
   Dim objStreamUTF8NoBOM: Set objStreamUTF8NoBOM = CreateObject("ADODB.Stream")  ' UTF8(BOM)なしのストリーム

   Dim lineSeprator As Long  ' 改行コードを格納する変数
   Dim overWrite As Long  ' 上書きフラグを格納する変数
   Dim line As Variant  ' For Each用の一時変数

   ' 改行コードの設定
   If InLineSeparator = "CRLF" Then
      lineSeprator = lineSeparatorCRLF
   ElseIf InLineSeparator = "LF" Then
      lineSeprator = lineSeparatorLF
   Else
      MsgBox "改行コード(InLineSeparator)は CRLF か LF のみ使用可能です。"
      End
   End If

   ' 上書きするかどうかの設定
   If InOverWrite Then
      overWrite = SaveCreateOverWrite
   Else
      overWrite = SaveCreateNotExist
      If Dir(OutputPath) <> "" Then
            MsgBox "上書きしないオプションが設定されましたが、出力先パスは存在します。"
            End
      End If
   End If

   With objStreamUTF8
      .Charset = "UTF-8"
      .LineSeparator = lineSeprator
      .Open

      For Each line In OutputLines
            .WriteText line, WriteLine
      Next

      .Position = 3
   End With

   With objStreamUTF8NoBOM
      .Type = TypeBinary
      .Open
      objStreamUTF8.CopyTo objStreamUTF8NoBOM
      .SaveToFile OutputPath, overWrite
   End With

   objStreamUTF8.Close
   objStreamUTF8NoBOM.Close

End Sub

```


   * 使用例

```vb
Sub TestUTF8Write()

Dim Data(1 To 3) As String
Dim i As Long
Dim Path As String

' 出力先パス作成
Path = ThisWorkbook.Path & "\" & "sample-utf8-no-bom.txt"

' 出力用テストデータ作成
For i = 1 To 3
   Data(i) = i & "行目"
Next

' UTF8(BOMなし)ファイルを出力
Call WriteToUTF8NoBomFile(Path, Data())

End Sub
```
OpenCV入門(python)-(1)

ETロボコンでopenCVを利用する機会が出そうだったので、画像処理について学習した事をここにまとめておきます
(実際にETロボコンで使用する際はC++でコードを書くことになりそうですが・・・)

あと書いていたらかなり多くなってしまったので２つに分けようかと思っています


# 画像処理とは

- 画像→画素の集まり(RGB値)

- 画像処理→画像を解析しやすくする、情報を抽出しやすくする 

- 画像処理の例
    - グレースケール化  
    - 平滑化→画像を滑らかにする  
    - Canny エッジ(輪郭)の検出  

# [OpenCV](https://opencv.org/)とは

- open source(一部特許があるものもある。)

- マルチプラットフォーム、C++, Python, java, matlab

- 機能としては画像、動画の読み込みや表示を行ったりもできる

- カメラモデル、機械学習用のライブラリもある

- 画像の座標は基本的に左上に原点。下へy軸、右へx軸をとる  

- pythonでは、numpy array にy、x、colorの順に格納される（openCV独自の配列の設定）
  - colorというのは、RGB値(もしくはHSV値)を並べた16bitの値のことを言う

- C++の方が速いが、コードが長くなる。Pythonの方がコードが短くかけるが、書き方次第でC++よりは遅い。ほかのライブラリとの連携は強い
  - ただし、Python+openCVは情報が少ない



## 色空間とグレースケール

### RGB

- R(red),G(green),B(blue)それぞれの値で一つの座標を決めることで色を決定する。値の範囲はそれぞれ0～255

- openCVでは、RGB値は(B,G,R)の順番で数値を並べる  

### HSV

- H:色相　
  - 値の範囲は0～359。角度によって色の種類を表す

- S:彩度
  - 値の範囲は0～100。Hで決められた色がどのくらい含まれているか。0に行くほど白に近い

- V:明度
  - 値の範囲は0～100。色の明るさを表す。0は黒を示す。100は明るく白に近づく

- HSVのメリットは色が表しやすい
  - openCVでは各値を以下の範囲で表現する
    - H 0～179 (0-359を２で割った値と考える）
    - S 0～255
    - V 0～255

### グレースケール

- 演算量を抑えるためによく使われる。２値化にも長けている。RGB値を以下の式でグレースケールに変換できる  
  - Gray = 0.2989 R + 0.5870 G + 0.1140 B

- RGB, HSVと違い一つのパラメータのみで演算が可能なので、演算にも相性が良い

# 画像処理のライブラリ

基本的に使用頻度の高そうなものから説明。以下のimport文は省略してあるので、使用する際はこの　import文を使用すること

~~~
import cv2
~~~

### 基本的な画像の読み出し関連全般

画像を読み出す際の、RGB,HSV,グレースケールでの読み出し方を以下に示す

~~~

# 画像をRGB表現で読み出し
img = cv2.imread("sample.jpg")　# 「sample.jpg」はファイルパス

# 画像を読み出し、HSV表現にコンバート
img = cv2.imread("sample.jpg")　# 「sample.jpg」はファイルパス
img_hsv = cv2.cvtColor(img,  cv2.COLOR_RGB2HSV ) # RGBからHSVへ変換

# 画像をグレースケールで読み出し
img = cv2.imread("sample.jpg",0)　# 「sample.jpg」はファイルパス

# 画像の大きさ(おまけ)
img.shape # 画像のデータ概要(y,x,color)が入っている

~~~

### 基本的な画像の書き出し関連全般

同ディレクトリにグレースケール化した画像を書き出すサンプルを以下に示す。

~~~
img = cv2.imread("sample.jpg",0)　# 「sample.jpg」はファイルパス

# 「sample.jpg」をグレースケール化した「sample_gray.jpg」を作成
cv2.imwrite("sample_gray.jpg",img)  
~~~

### 画像のリサイズ

~~~
img = cv2.imread("sample.jpg")　# 「sample.jpg」はファイルパス
size = (300,200) # (幅、高さ)
img_resize = cv2.resize(img, size) # sizeの大きさでリサイズ
~~~


# 画像の２値化

画像の２値化とは、画像を白と黒だけで表現する事を意味する。この２値化を行う際、白か黒かを判断する閾値が必要になる。その閾値をユーザが設定する場合としない場合があるので、その2つに分けて説明する。

## 閾値をユーザが設定する場合
~~~
img = cv2.imread("sample.jpg")　# 「sample.jpg」はファイルパス
threshold = 100　# 閾値。閾値以上の値は255にする
ret,img_th = cv2.threshold(img, threshold,255, cv2.THRESH_BINARY)
~~~

## 閾値をユーザが設定しない場合

閾値をユーザが設定しない場合はいくつかパターンがあるので別に説明します。

### 大津の２値化

分離度が最も大きくなるときの閾値を求める。ヒストグラムも関わってくるので説明は割愛。

こちらを参考のこと→https://algorithm.joho.info/image-processing/otsu-thresholding/

~~~
img = cv2.imread("sample.jpg")　# 「sample.jpg」はファイルパス

ret2,img_o = cv2.threshold(img,0,255,cv2.THRESH_OTSU) # ret2に閾値が入る
~~~

### 適応的二値化処理

- ある一定範囲内でそれぞれ閾値を設定する。よって相対的に明るいものは白と判断される。以下の場合は周囲3近傍で閾値を決定

~~~
img = cv2.imread("sample.jpg")　# 「sample.jpg」はファイルパス

img_ada = cv2.adaptiveThreshold(img,
255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, 1) 
~~~
富田林市産学官交流会　講演リンク集

#概要
- 日時：2019/2/14 16:00-17:30
- 会場：[富田林市市民会館](http://rainbowhall.jp/access)
- [交流会のHP](http://www.city.tondabayashi.lg.jp/soshiki/36/19224.html)
- [交流会のチラシ](http://www.city.tondabayashi.lg.jp/uploaded/attachment/56794.pdf)

#講演タイトル
- 中小企業のICT/IoT/ロボット/AI導入についての勘所

#ICTの動向
- [経済産業省　資料　２０１７．３](http://www.chusho.meti.go.jp/koukai/kenkyukai/smartsme/2017/170329smartsme05.pdf)

#IoTの実例集
- [スマートIoT推進フォーラム](https://smartiot-forum.jp/iot-val-team/iot-case)
- [ロボット革命イニシアチブ協議会]（https://www.jmfrri.gr.jp/info/rri/380.html ）
- [日立システムズ](https://www.hitachi-systems.com/ind/fs/pioneer/report/report01/)
- [東芝のIoT](https://www.toshiba.co.jp/iot/usecase/index_j.htm?utm_source=google&utm_medium=cpc&utm_campaign=search)
- [FANUC](https://www.fanuc.co.jp/ja/product/video/field.html)
- [三菱電機](http://www.mitsubishielectric.co.jp/news/2017/1107-a.html)
- [ファナック・三菱電機・DMG森精機](https://www.nikkei.com/article/DGXMZO33095290Y8A710C1000000/)

# 精密プレス工業　カウンタ　動画
- [精密プレス工業](https://www.youtube.com/channel/UC-Mg3os-eI3AKRDs0ffMPYQ)
- [打点カウンタ：基本動作](https://www.youtube.com/watch?v=N-AbjdU-BFw)
- [レーザー加工機：タイマ](https://www.youtube.com/watch?v=euLpMJSWL28)
- [スポット溶接：実際の映像](https://www.youtube.com/watch?v=QtY1P7T86Oo)

# ロボット技術
- [カワダロボティクス株式会社](https://www.kawadarobot.co.jp/nextage/)
- [DENSO WAVE](https://www.denso-wave.com/ja/robot/)
- [ロボット学会：年表](http://rraj.rsj-web.org)

#人工知能
- [人工知能学会](https://www.ai-gakkai.or.jp/whatsai/AIhistory.html)
- [IBM BlueMIX：画像認識デモ](https://www.ibm.com/watson/services/visual-recognition/demo/#demo)

#現場で勉強会
- [スクラッチ](https://scratch.mit.edu)
- [マイクロビット](https://microbit.org/ja/guide/)
- [自作プログラム：ロトくじ乱数発生器](https://qiita.com/tmdoi/items/811c3ec9f639180aaf27)

#関連リンク
-[AIDOR|TEQS i-RooBO](https://teqs.jp/acceleration)
PyMC3でsample_posterior_predictiveが使えない

# Abstract
PyMCでMCMCをやるときに、時々遭遇するこのエラー。
度々調べて、もう調べたくないのでメモ。

```bash
AttributeError: 'module' object has no attribute 'sample_posterior_predictive'
```

# やること

```bash
pip install -U pymc3
```

とりあえず、普通にこれで使えるようになります。
もしバージョンをあげたくないなら、

```python 
# pm.sample_posterior_predictive(trace, sample=1000, model=model) 
pm.sample_ppc(trace, sample, model=model)
```
でいけます。

ただし、注意が必要です。本当は、sample_ppcは廃止なので
本当はsample_posterior_predictiveでかける方が良いです。

https://docs.pymc.io/api/inference.html?highlight=sample_ppc

# Ref
- https://discourse.pymc.io/t/issues-with-sample-posterior-predictive/1798
- https://docs.pymc.io/notebooks/posterior_predictive.html
dequeでlistのようにある範囲の値を取得したい時

# 0. 筆者環境

Windows 10 64bit
Python 3.6.7 64bit

# 1. 問題点・実例

dequeを使用した際に、listのようにsliceで値を取得しようとしたらslice自体使えない模様。
末尾からx個の値を取得したい等、必要な時はあると思われるため、下記にまとめた。


# 2. 対処法

### itertoolsのisliceを用いる方法

```Python3
import collections
import itertools

# dequeに1-1000の値を格納
dq = collections.deque(range(1000))
# yにdqの900-1000個の値を格納
y = list(itertools.islice(dq, 900, 1000))
```

### リスト内包表記を用いる方法

```Python3
import collections
import itertools

# dequeに1-1000の値を格納
dq = collections.deque(range(1000))
# yにdqの900-1000個の値を格納
y = [dq[i] for i in range(900, 1000)]
```

どっちが早いかは場合によって変わるため、計測しながら使う。
ガウス関数のFFTについて考察

ガウス関数は正規分布の書き方だと，平均$x_0$と分散$\sigma$を用いて

```math
f(x)=\frac{1}{\sqrt{2\pi}\sigma}\exp \Bigl({-\frac{(x-x_0)^2}{2 \sigma^2}} \Bigr)
```
となります．今回はこのガウス関数のフーリエ変換について，理論式を計算した結果とFFT(高速フーリエ変換)の結果を比較します．

#目次
・理論式によるフーリエ変換
・FFTによるフーリエ変換
・両者の比較
・FFT実行のためのコード(Python)

##理論式によるフーリエ変換
計算過程は省略しますが，ガウス関数のフーリエ変換$F$はまたガウス関数になります．

```math
\begin{eqnarray}
F(k)
&=& \frac{1}{\sqrt{2\pi}}\int_{-\infty}^{\infty}f(x)e^{-ikx}dx \\
&=& \sigma e^{-\frac{\sigma^2k^2}{2}}e^{-ikx_0} \\ \\
\end{eqnarray}
```

振幅スペクトル$|F|=\sigma e^{-\frac{\sigma^2k^2}{2}}$と，
位相(偏角の主値)${\rm Arg}(F)={\rm Arg}(e^{-ikx_0})$を$k \geq 0$で描画します．
<img src="https://qiita-image-store.s3.amazonaws.com/0/336657/74b2607d-efe1-a4c4-4f4a-fc3b63d260e3.png" width=60%>

上が振幅スペクトル，下が位相($/\pi$)です．フーリエ変換と言えば振幅スペクトルの事を指すことが多い気がします．位相は$-kx_0$と書けますが，今回は$[-\pi \ \pi]$の主値を採用しているので，端を越えると下にジャンプします．また，**振幅スペクトルが落ち込んだ先の位相情報は，意味が無いので無視**します．

(ところでこのグラフは横軸が波数なので，そのまま角周波数に読み替えることが出来ますが，振動数で読むためには$2\pi$で割る必要があることに注意．)

##FFTによるフーリエ変換
FFTの実行方法の説明は他に譲るとして，ここでは理論式とFFTの結果が一致するのかを検証します．自分はPythonのNumPyモジュールで実行しました(参考コードを最後に記載しておきます)．
先程と同様の関数をFFTした結果から得られる，振幅スペクトルと位相のグラフを示します．
<img src="https://qiita-image-store.s3.amazonaws.com/0/336657/d94b3a7c-fc9e-901b-57c8-bbc1131c8a88.png" width=60%>
スペクトルの最大値が先程と違いますが，概形は似たものになりました．ちなみにデータ数を多めに取らないと，きれいな結果になりませんでした．

##両者の比較
二つの結果が一致しているのか検証します．
振幅スペクトルは比を，位相は差を取って比較しました．
理論値とFFTで得た値をそれぞれ下付き添字1,2で表しています．
<img src="https://qiita-image-store.s3.amazonaws.com/0/336657/8a5f9d9b-8450-498d-c02b-78a7066f2cef.png" width=60%>

$k \leq 4$では比が一定，差が0という結果になりました．FFTで求まる振幅スペクトルの最大値は異なっていますが，全体が定数倍されているだけなので，定性的には問題無いと言えそうです．
というわけで，ガウス関数のフーリエ変換の理論式とFFTの結果を比較し，一致することが確認できました．

####FFT実行のためのコード(Python)
参考までに，今回FFTを実行するにあたって用いたコードを掲載しておきます．


```python
import numpy as np
from matplotlib import pyplot as plt
import matplotlib as mpl

sigma = 1.0
dx = 0.01
x0 = 5
x = np.arange(0, 1000, dx)
N = len(x)

def y(x):
    return 1 / (np.sqrt(2 * np.pi) * sigma) \
           * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))

fourier = np.fft.fft(y(x))
fourier_abs = np.abs(fourier)
fourier_phase = np.arctan2(np.real(fourier), np.imag(fourier))
omega = np.linspace(0, 1/dx, N) * 2 * np.pi

fig = plt.figure()

ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)

ax1.plot(k, np.abs(fourier), linewidth=1, color='black')
ax1.set_ylabel('Amplitude')

ax2.plot(k, np.arctan2(np.real(fourier), np.imag(fourier)) / np.pi, linewidth=1, color='black')
ax2.set_xlabel('k')
ax2.set_ylabel('Phase[rad]')

ax1.set_xlim([0.0, 6.0])
ax2.set_xlim([0.0, 6.0])

mpl.rcParams['axes.xmargin'] = 0
mpl.rcParams['axes.ymargin'] = 0

plt.show()
DockerでRadicaleなうに使っていいよ。


#Radicaleとは何か？
それは、```A Free and Open-Source CalDAV and CardDAV Server```です。
https://radicale.org

つまり、スマホやタブレットに登録しているカレンダーやリマインダー、そして連絡先などの情報を自分のサーバーに保管して管理できるということです。

自宅でDockerを実運用し始めている人にとっては、個人情報のセルフ管理は必ず検討する事のひとつでしょう。

その一例をRadicaleで示したいと思います。

#以下、簡単なイメージの説明です。
```
docker pull takeyamajp/radicale
```
https://hub.docker.com/r/takeyamajp/radicale

This container is really easy to use and works out-of-the-box.

```
docker run -d -e SSL=false -p 5232:80 -v ~/.var/lib/radicale/collections:/radicale takeyamajp/radicale
```

When your server is launched, you can check that everything's OK by going to http://localhost:5232/ with your browser!

If you want to use this container with the SSL connection, you have to run it behind a reverse proxy server including a valid SSL certificate.

```Dockerfile
FROM centos:centos7

...

ENV TIMEZONE Asia/Tokyo

ENV SSL true

ENV LOG true  
ENV LOG_LEVEL INFO

ENV USER user  
ENV PASSWORD password

VOLUME /radicale

EXPOSE 80  
EXPOSE 443
```

##このイメージについて
CentOS 7 の公式イメージをベースに作成しています。
https://hub.docker.com/_/centos

変数の値はコンテナを再作成しなくても変更できます。
例えば、コンテナをstopしてログ出力レベルやパスワードを変更してから再startする事で新しい値が反映されます。

##アクセスログ
アクセスログはDocker logsに出力されます。

アクセスログの出力レベルを変更したい場合は`LOG_LEVEL`の値を変更してください。
`DEBUG`が最も細かく沢山の情報が出力されます。
それに対して`CRITICAL`は最も緊急性が高い少量の情報だけが出力されます。

- CRITICAL
- ERROR
- WARNING
- INFO
- DEBUG

あと、あまりお勧めしませんが、`LOG`の値を`false`（`true`以外の値）に変更すると、ログ出力をストップする事ができます。


##タイムゾーン
日本で使用する場合は気にしなくて大丈夫です。

もし、海外で使用する場合は`TIMEZONE`の値を変更してください。
CentOSで使用可能な値をそのまま設定できます。

wikipedia : List of tz database time zones
https://en.m.wikipedia.org/wiki/List_of_tz_database_time_zones

##SSL通信
動作確認など、このコンテナを単体で使用する場合は、SSL通信は利用出来ないため`SSL`の値を`false`（`true`以外の値）に変更してhttpでアクセスしてください。

Dockerを実運用しようとしている人なら、必ず独自ドメインを保有して、SSL証明書を設定したリバースプロキシをフロントエンドに設置している事でしょう。
このコンテナは、そのリバースプロキシのバックエンドとして動作する事を想定しています。

##アカウント
アカウント情報を`USER`と`PASSWORD`に設定してください。

管理画面にログインするときに、このアカウント情報が必要になります。

スマホやタブレットに登録するときにも、このアカウント情報が必要になります。

##データの永続化
全てのデーターはボリューム`/radicale`に保存されます。
必ず永続化してDockerホスト側に保存してください。

データーは別の環境に移動させてもユーザー名を一致させれば読み込む事ができます。

#以下、簡単な使い方です。
コンテナを起動したら、まず管理画面からカレンダーやリマインダー、そして連絡先などを作成します。

`SSL`を`true`で起動した場合は、ブラウザーから`https://コンテナにアクセス可能なホスト名`にアクセスしてください。

`SSL`を`false`で起動した場合は、ブラウザーから`http://コンテナにアクセス可能なホスト名`にアクセスしてください。

ログインに使用するアカウントは`USER`と`PASSWORD`の値になります。

これでスマホやタブレットに登録する準備ができました。

端末にCalDavやCardDavを登録する方法は、個別に調べてください。
登録に使用するURLは、上記の管理画面のURLと同じになります。

—
以上です。
それでは良いRadicaleライフを。
Notice: Undefined index: HTTP_REFERER のエラー解決法

##環境


```
 XAMPP7.2.6 
``` 


##概要

以下のコードを書いました。
コード内容は、テキストファイル読み込みコードです。

```php.file_write.rb
<?php

$data[] = date('Y/m/d H:i:s');
$data[] = $_SERVER['SCRIPT_NAME'];
$data[] = $_SERVER['HTTP_USER_AGENT'];
$data[] = $_SERVER['HTTP_REFERER'];
$file = @fopen('access.log', 'ab') or (die('ファイルを開けませんでした!'));

fwrite($file, implode("\t", $data) . "\n");

flock($file, LOCK_UN);
fclose($file);
print 'アクセスログを記録しました。' ?>
```
　　　

そしたら、以下のエラーが出ました。

```

Notice: Undefined index: HTTP_REFERER in /opt/lampp/htdocs/dokusyuphp/file_write.php on line 6
ファイルを開けませんでした!

```


##エラーの原因　
　　 HTTP_REFERERの値が定義されていないことが原因でした
。
##解決法

6行目のHTTP_REFERERの値を定義しました。

値は、このコードでは不要なのでnullにしました。

前

```
$data[] = $_SERVER['HTTP_REFERER'];
```

後

```
$data[] = isset($_SERVER['HTTP_REFERER'])? $_SERVER['HTTP_REFERER'] : NULL;
```

##参考記事

https://php1st.com/574
https://dev.w.ezic.info/1387.html
Androidアプリをコマンドラインからビルドする

「Android Studio、結構メモリを食うので、貧弱なパソコンでアプリを開発するのは無理。」
**そんな時代、もう終わりです。**

アプリはコマンドラインからでもビルドすることができます。

# Gradleの便利さ
以前も、コマンドラインからビルドすることはできましたが、Gradleを採用していなかったため
いろいろなコマンドを実行し、コンパイル、ビルド、APKの生成・署名を行う必要があって
非常にめんどくさい処理でした。

そして、Googleがリリースした新しいIDE「Android Studio」では、新しいビルドシステムが導入されて効率がアップしました。
その恩恵はコマンドラインでも受けることができます。

# ビルドは「gradle assembleXXX」！
いきなりの見出しでびっくりしたかもしれませんが、これだけでビルドできます。
Gradleは、[Gradle公式サイト](https://gradle.org/install/)を参考に導入します。
Windowsでも、Macでも、Linuxでもコマンド操作は基本的に同じです。

まずコンソールを起動し、ビルドしたいプロジェクトのフォルダへ行きます。

そこで試しに

```
gradle
```
と一度入力して実行してみます。
問題なければ

```
> Task :help

Welcome to Gradle 4.10.2.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

For troubleshooting, visit https://help.gradle.org

BUILD SUCCESSFUL in 1m 16s
1 actionable task: 1 executed
```
と出力して終了します。
もし、SDKのディレクトリがおかしいというエラーが出た場合は```local.properties```の、sdk.dirを確認します。

## ビルドタイプ：リリース
リリース用にAPKを生成する場合は```gradle assembleRelease```を実行します。

## ビルドタイプ：デバッグ
デバッグ用にAPKを生成する場合は```gradle assembleDebug```を実行します。

## その他タスク
その他、デバイスにAPKをインストールするタスクもあります。
詳細は```gradle tasks```か```gradle tasks --all```を実行します。
PSequel から Homestead 上の PostgreSQL に接続するときの設定

[PSequel](http://www.psequel.com/) から [Homestead](https://readouble.com/laravel/5.7/ja/homestead.html) 上の [PostgreSQL](https://www.postgresql.jp/) に接続します。


## 動作環境
- Mac OS X 10.14.2
- psql (PostgreSQL) 10.6 (Ubuntu 10.6-0ubuntu0.18.04.1)
- Homestead v8.0.2
- PSequel Version 1 (1.5.3)


## PSequel の接続設定

Homestead では標準で PostgreSQL が使用できるので、特別な設定は必要ありません。

Host: localhost
User: homestead
Password: secret
Database: homestead
Port: 54320

<img width="912" alt="psequel_setting.png" src="https://qiita-image-store.s3.amazonaws.com/0/127532/c18fac3f-a1d7-0225-4264-81fa80eade39.png">


## 接続エラーが出る場合の対処

ポート番号の設定を「Port: 5432」としてしまうと、以下のエラーが出ます。

<img width="600" alt="psequel_error.png" src="https://qiita-image-store.s3.amazonaws.com/0/127532/a142ea23-025d-f2be-6b83-c813c61c1f94.png">

```
PostgreSQL　Error
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host "localhost" (::
```

ホスト OS（Mac OS）から Homestead 上のデータベースにアクセスするには、以下のポート番号を使用する必要があります。

MySQL: 33060 → Forwards To 3306
Postgres: 54320 → Forwards To 5432

Laravel Homestead > Connecting To Databases
https://laravel.com/docs/5.7/homestead#connecting-to-databases
vue-cli3でbuildした時にTypeError: Cannot read property 'minify' of undefined

# 概要
vue-cli3で生成したばかりのプロジェクトでbuildが出来なかったので調べた所、直近出現したバグだったので日本語でも残しておこうと思います。

## 解決策
` terser@3.4.0 ` のバグなので

```package.json
"resolutions": {
  "terser": "3.14.1"
}
```
と記述して

```
npm install
```
または

```
npm i -D terser@3.14.1
```

とかでバージョンを下げれば大丈夫:thumbsup:

## 参考
https://github.com/vuejs/vue-cli/issues/3407#issuecomment-459985313
Paraphrase の言語システム - 値とワードについて

# はじめに
　Paraphrase は Forth 系であるため、現在一般的に使用されているプログラミング言語とは異なる言語文化に属しています。この文書では、Paraphrase の言語システムのうち値とワードについて説明をします。

# トークン
　Paraphrase の文法は単純であり、基本的に空白などホワイトスペースで区切られた文字列をトークンとして取り扱います。「基本的に」と書いたのは、ダブルクォーテーションもしくはシングルクォーテーションで囲まれた文字列に対しては、文字列中の空白で分離することはないためです。

　例えば、以下のような入力は

    123 "456 789" "hello world" show

Paraphrase の言語処理系によって、

    123
    "456 789"
    "hello world"
    show

という 4 つのトークンに分解されます。

　一般的な言語では、空白は読みやすさの向上などに活用されます。例えば x>0 を x > 0 などと書いたりしても意味は変化しません。しかし、Paraphrase では、x>0 と x > 0 では異なった入力として解釈されます。これはトークン単位で値やワードとして解釈されるからです（ワードについては後で説明します）。x>0 という入力は、「x>0」というひとつのトークンとして解釈されますが、x > 0 という入力は「x」「>」「0」という 3 つのトークンとして解釈されます。

# 値
　トークンは、まず、値として解釈できるか調査されます。値には、

* 整数
* 浮動小数点
* 多倍長整数
* 多倍長浮動小数点
* 文字列
* シンボル

があります。これらの値として解釈できるトークンであると解釈されると、値として取り扱われます。入力された値をどのように取り扱うかは、処理系のモードにより変化します。モードについては別の文書で詳しく説明したく思いますが、起動直後はインタプリタモードとなっています。このモードでは、入力された値はデータスタックに積まれます。例えば、1 2 3 と入力すると、スタックの様子は次のようになります：

          +-----+
    TOS-->|  3  |
          |  2  |
          |  1  |
    DS:--------------

　上の図は、スタックの様子を示したものです。TOS というのは Top Of Stack の略でスタックの一番上の値を指します。スタックから値を取り出す場合は、原則的には、この TOS で示されている値から順次下向きに取り出されていきます。DS は Data Stack の略です。

## 数値に対する接頭詞と接尾詞
　整数に関しては、int, long, big-ing が存在します。10 進数と解釈され、かつ、浮動小数点を表すピリオドが含まれない場合は整数として解釈を試みます。基本的には int 型(符号あり 32 ビット整数）として格納されますが、それに収まりきらない場合は long（符号あり 64 ビット整数）としての解釈を試み、それでも収まらない場合は big-int として解釈されます。

　しかし、場合によっては long 型の 1 や big-int 型の 0 を入力したい場合があります。型変換を用いることもできますが、接尾詞を用いると直接これらの値を入力できます。数字列の最後に小文字または大文字の L （エル）を付けると long 型の整数値であることを示します。同様に LL という接尾詞を付けると big-int 型の値であることを示します（show というのは現在のスタックの様子を表示するワードです）：

```Paraphrase
 > 1L 0LL show
      +----------+
TOS-->| bigInt 0 |
      |  long 1  |
DS:------------------
 ok.
 >
```

　浮動小数点においても同様で、接尾詞 f または d を用いると、それぞれ float（32 ビット浮動小数点値）および double（64 ビット浮動小数点値）を表します。注意する点としては、これらの接尾詞は小文字である必要があります。

```Paraphrase
 > 1.0f 1.0d show
      +-----------------+
TOS-->| double 1.000000 |
      | float 1.000000  |
DS:-------------------------
 ok.
 >
```

　最後は 16 進数を示す接頭詞 0x です。C 等でで使われる方法ですが、Paraphrase でも使用可能です：

```Paraphrase
 > 0xFF show
      +---------+
TOS-->| int 255 |
DS:-----------------
 ok.
 >
```

# ワード
　値以外のトークン＝値として解釈されないトークンは、ワード名の候補として解釈されます。ワードは他の言語における関数やサブルーチンのようなものです。Paraphrase は Forth と同様、+ という記号は演算子ではなく、+ というワードです。このワードはスタック上にある 2 つの値を取り出し、それらの和をスタックに積むワードです。例えば、インタプリタモードにて

```Paraphrase
 > 2 3 +
```

と入力すると（注：左端の「>」はプロンプトですので入力の必要はありません）、

          +-----+                              
    TOS-->|  3  |      ワード + を実行すると…         +-----+ 
          |  2  |             --->           TOS-->|  5  |
    DS:-------------                         DS:-------------

となり、スタック上に 2+3 の計算結果である 5 が積まれている状態となります。

　ワードは、必ずしもスタックに変化を与えるとは限りません。これは、他のプログラム言語において、引数を必要としない関数や戻り値を返さない関数が存在するのと同様です。スタック上の値を必要としないワードや、スタックに何も積まないワードも存在します。

このように、他の言語ではキーワードや演算子として取り扱われているものもワードとして準備されているのが Forth 系の特徴です（Lisp みたいですね）。

　ワード（単語）は「辞書」と呼ばれるデータベースに格納されており、原則として、ワード名が入力されると、同名のワードがユーザー辞書に存在するかを調査し、見つからない場合はエラーとして報告します。
何故Go言語を私は使いたいのか？  良い点と悪い点を雑にまとめる

## 前書き
選択肢は多いし、自分がやりたいことを実現するには"どちらが適切か"を踏まえると、
言語を選ぶことはなかなか難しいものです。

Go言語で開発をやろうと思った時に、何故Go言語でやりたいのか、
また、どういう点でイケてないと思っているのかを
思考の整理のためにまとめた記事になります。

この記事は、ベストなプログラミング言語だと主張する記事ではありません。
ご自身でで確かな情報に基づいて言語の調査をする際の助けになれば幸いです。

## 良い点

### 1. パフォーマンス

-  Ruby, pythonなどと比較すると良い

### 2. デプロイの容易さ

- 多くの場合、単一ファイルで良い。  

### 3. 多くの標準ライブラリ

- net, encoding, html, os, etc...

### 4. 周辺ツールの充実

- Gofmtによるコードフォーマットの強制

### 5. シンプルな言語仕様

- 学習コストが比較的少ない

### 6. スレッドモデルによる並列処理

- イベントモデルは辛い (主観)

### 7. コンパイルによるバグの見つけやすさ

- go vetでコードの静的解析を行うことができる(標準ツール)

### 8. コンパイルの速さ

- C++, javaと比較 するとコンパイルが早い

### 9. 移植性が良い

- 内部エンコーディングは`utf-8`

### 10. Googleが作ってる安心感


## 悪い点

### 1. シンプルな言語実装だが、ハマりどころが少ないわけではない [^1]　 [^2]

- nilインターフェースがnilじゃない 
- 変数のシャドーイングの挙動 etc...

### 2. シンプルすぎてプログラミング言語として色々不足を感じる(主観)

- 例外がない
- 継承がない
- Genericsがない(次のverで追加？)　etc...

### 3. 学んだ所で言語として特に新しい発見があまりない [^3]

- 1970年代で止まった言語に見える
- 40年間のプログラミング言語の研究を排除した最新の言語
- Goはブルーカラー（普通）の開発者のための言語
  - ただし開発者には２パターンいる
    - できるだけ簡単かつ迅速に作業を進めたいという開発者
    - 最新の「革新的」言語を追いかけている開発者


[^1]: なぜGo言語は設計が悪いのか – Go愛好者の見地から https://postd.cc/why-go-is-a-poorly-designed-language/
[^2]: 7 common mistakes in Go and when to avoid them by Steve Francia (Docker)　https://www.youtube.com/watch?v=29LLRKIL_TI
[^3]: Why Everyone Hates Go (https://npf.io/2014/10/why-everyone-hates-go/) (かなり古い)