OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング初心者が「動かない！」から抜けだすための3つの言葉

こちらは[フューチャー Advent Calendar25日目](https://qiita.com/advent-calendar/2018/future)の記事です。
未熟者ながらこのような機会を与えて頂きありがとうございます！
＃12日に急遽交代していただいたピンチヒッター渋川さんの記事は [こちら](https://qiita.com/shibukawa/items/ac823b7e1c435eb1cadf)

[熟練凄腕エンジニア](https://qiita.com/shibukawa)に毎日鍛えていただき、プログラミングをはじめておよそ１年。
今回はハマったときのアドバイスやこうしたらよかったという内容を、プログラミングを始めたばかりの方々にむけ、また自分への戒めとしてまとめました。
経験者であれば当たり前、と思うことも始めたばかりだとわからなかったりするかな、と思いますので、自分と同じように悶々としている方の目に止まり、少しでも元気が出るきっかけになればと思います。

## 伝えたいこと
1. プログラムの中で何が起こっているか知るために、とにかくconsole.logを書くといいよ
2. 質問をする前に理解をまとめるといいよ
3. 自分の理解を普段のレビュアーに聞いてもらうといいよ

### 1. プログラムの中で何が起こっているか知るために、とにかくconsole.logを書くといいよ
[かの有名なエンジニア](https://qiita.com/shibukawa)はこう言いました。「 **プログラミングでつまったときに大事なのは、データがどこで詰まっているかを追うことである** 」と。
実装を進める中でやりたいことがうまくできない場面が私には数多くありましたが、「ここはこうなっているはず」という憶測で進めてしまっていることが多かったです。そういうときに限って自分では気付かず、「この引数の中身はどうなってるの？」と聞かれて初めてハッとなっていました。
そこで私がおすすめなのは、とにかくデータに変化が加わるたびに`console.log` （Javaでは`System.out.print`等）を書いて、処理ごとにデータが期待する形になっているか確かめながら実装することです。この目的は、「プログラムの中で何が起こっているかを把握する」ことにあります。
自分のチームではnode.jsを採用しているため、サーバー側のログもjavascriptで出力することができます。node.jsバンザイ！

```javascript:script.js
rl.question("Do you know ID and password?", (answer) => {
    const list = answer.split(",");
    const id = list[0];
    const pwd = list[1]; 
    //データが期待する形かconsole.logで確認
    console.log("id--->>", id);
    method1(id, (path) => {
        // method1でも処理ごとにconsole.logを出力
        console("after method1----->>", id, path);
        fs.readFile(scriptPath, "utf8", (err, content) =>{
            method2(content, path);
            // method2でも処理ごとにconsole.logを出力
            console("after method2----->>", content);
            fs.writeFile(scriptPath, content ,err => {
                console.log(err);
            });    
        });
    });
    rl.close();
});
```

どこで問題が起きているかが解明できるだけでも大きな前進！あとはそれを知見のある人に相談してみましょう。

### 2. 質問をする前に理解をまとめるといいよ
何がわかっていないのか曖昧なまま質問をしたときは、自分も相手もうまく伝わらずもやもやしてしまっていました。
大先輩からのアドバイスを受け、自分は以下のようなことに気をつけました。

1. 上記のように`console.log`で出力し、どこまでできていて、どこでつまっているのかを確認し、それを材料に状況を説明する（図参照）
2. やりたいこと・できていること・わからないことの３点セットで質問する
3. 答え（実装）を教えてもらったら、どう考えたらその実装になるのかも合わせて聞く（自分で再現する手がかりになるように）

図：（例）ちゃんと実装しているつもりなのに画面に表示されてほしいデータがうまく表示されないとき
![image.png](https://qiita-image-store.s3.amazonaws.com/0/311215/f3b3c6c9-7e24-5fbc-ce92-67f353b164ef.png)

周りのエンジニアの皆さんもそれぞれスマートな聞き方をしながら自分の理解につなげているのを見て、
人への相談というのも立派なアウトプットの一つなのだと感じています。

### 3. 自分の理解を普段のレビュアーに聞いてもらうといいよ
「アウトプットが大事」とよく聞きますが、公の場に出すのは気が引ける…という場合は、近くにいる人の時間を３分だけもらって、これまでの学びをプレゼン風に説明してみてはいかがでしょうか。
私もReactをさわって３ヶ月ほどのとき、当時の理解を図にして偉大な先輩にレビューをもらいました。
普段から教わっている人にさらけ出すのはそれほどハードルが高くなく、指摘をもらって自信にもつながるのでおすすめです。

こんな風に
![image.png](https://qiita-image-store.s3.amazonaws.com/0/311215/17fca286-2208-5a24-1d6d-397dd995e65f.png)


## おわりに
* 投稿がすべりこみになってしまいました…運営のみなさま、ご迷惑をおかけしてしまい大変申し訳ございません。
* 日頃からQiitaでのアウトプットを訓練していれば、ここまで書き進まないこともなかったかもしれません。
* ということで、これからは技術的にふみこんで、自分がわかったことをもっと外に出していこうと思います。
React + Reduxのシンプルな雛形

#概要
私はサーバーサイドのエンジニアですが、片手間にフロントもやってます。
業務でReact＋Reduxを使っているので、構成を参考にしつつシンプルな雛形を作りました。

https://github.com/ryokwkm/react-redux-sample.git

このサンプルはテキストフォームに入力した内容を console.log で出力するシンプルな内容です。
React-Routerを使っている、２ページ構成です。

![スクリーンショット 2018-12-25 18.33.05.png](https://qiita-image-store.s3.amazonaws.com/0/192134/19ad39b6-8fe9-112c-aa5e-3d59f64322a9.png)


#以下の手順で動作します
１．git clone
２．npm install (もしくは yarn install )
３．npm run start (もしくは yarn run start )
４．webpackサーバーが起動するので、コンソール出力されたURLにアクセスする
	例：	http://localhost:8083/


#ディレクトリ構造

```sh:ディレクトリ構造
├── public
│   └── index.html
├── src
│   ├── Handler.jsx
│   ├── actions
│   │   └── index.js
│   ├── compornents
│   │   ├── About.jsx
│   │   └── App.jsx
│   ├── reducers
│   │   └── index.js
│   └── store
│       └── configurte-store.js
├── stylesheets
│   └── index.scss
├── .eslintrc.js
├── README.md
├── package-lock.json
├── package.json
```

##各ファイルの解説
Action, Reducer, Compornentsの各階層ごとにディレクトリを切ってある。

__src/actions/*.js__
__src/compornents/*.jsx__
__src/reducers/*.js__


__src/Handler.jsx__
一番最初に読まれるJS
React-RouterによるRouting、
その他の初期処理を読み込んでいる。

__src/store/configurte-store.js__
Storeの設定を行っている。
Middlewareの読み込みや、Reducerとの紐付け、Redux-Devtoolの設定など。
Middlewareは、redux-thunkのみ使用している。




##使用パッケージ
使用しているパッケージは以下のとおり
es2015など若干古いパッケージを使っているので、適宜最新のものを使うと良いでしょう。

```json:package.json
{
  "name": "react-redux-sample",
  "version": "1.0.0",
  "main": "index.js",
  "author": "ryokwkm <ryokwkm@gmail.com>",
  "license": "MIT",
  "description": "react redux simple code",
  "dependencies": {
    "babel-core": "6.25.0",
    "babel-loader": "7.1.1",
    "babel-preset-es2015": "6.24.1",
    "babel-preset-react": "6.24.1",
    "css-loader": "0.28.4",
    "extract-text-webpack-plugin": "^3.0.2",
    "import-glob-loader": "1.1.0",
    "node-sass": "4.5.3",
    "prop-types": "15.5.10",
    "query-string": "5.0.0",
    "react": "15.6.1",
    "react-dom": "15.6.1",
    "react-redux": "5.0.6",
    "react-router-dom": "4.1.2",
    "redux": "3.7.2",
    "redux-devtools": "3.4.0",
    "redux-devtools-extension": "2.13.2",
    "redux-thunk": "2.2.0",
    "sass-loader": "6.0.6",
    "style-loader": "0.18.2",
    "webpack": "3.3.0",
    "webpack-dev-server": "2.11.3"
  },
  "devDependencies": {
    "eslint": "^3.19.0",
    "eslint-config-airbnb": "^15.0.2",
    "eslint-plugin-import": "^2.14.0",
    "eslint-plugin-jsx-a11y": "^5.1.1",
    "eslint-plugin-react": "^7.1.0"
  },
  "scripts": {
    "start": "./node_modules/.bin/webpack-dev-server"
  }
}
```

#reduxを使った感想
結論としては、大規模なアプリでない場合、Reactだけで十分だと感じました。
Reactは比較的簡単ですが、Reduxは難易度が高いことが主な理由です。

学習も必要な上に、コード量、複雑性が増します。
開発コストは増大するでしょう。

ソースをキレイに分割できるので、管理のしやすさは上がります。
ですが、そこまで大規模でないアプリでしたらReactのみで十分な印象です。

以下の記事ではReduxの開発者のコメントを紹介をしていますが、無理して導入する必要はない旨が書いてあります。
https://techracho.bpsinc.jp/hachi8833/2018_03_13/53183
もしQiitaとWikipediaとScrapBoxが合体した未来的情報共有Webサービスが登場したら？の妄想ポエム

# Qiitaで他の人の記事から「新しい記事を書きたい！」「今すぐ書きたい！」と思ったのがきっかけ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9441fad5-fb2b-6eda-f8c3-da145cc50a8b.png)

# ScrapBoxのイメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d8dc776d-329c-9bf0-29c0-02baa9064489.png)

# 夢想

- 人の記事からリンクを貼って新しい記事を作れる
- Wikipediaのように集合知だが、Qiitaのように著者は存在する
- 人の記事に編集リクエストは遅れるが、編集できない
- ScrapBoxのように爆速である

# サービスアプリケーションの未来は？

神経細胞同士の接続、関連性がモデルと言える方向に進んでいると思う

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/20768873-d5ef-d500-240a-0404843fed1a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4da55e7e-e973-2eea-5153-059d29c1512b.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WindowsでAndroid CTSの実施方法

Android CTSのエラー解析をするにあたり、
Android CTSを動かす必要があったため設定方法のメモ。

[Compatibility Test Suite](https://source.android.com/compatibility/cts)には、
下記のように記載されています。

```
Caution: CTS currently supports 64-bit Linux and Mac OS host machines. CTS will not work on Windows OS.
```
Google翻訳さんは、CTSは現在64ビットのLinuxおよびMac OSホストマシンをサポートしています。 CTSはWindows OSでは機能しません。
と書かれているため、私もMac OSのPCを用意してとは言いませんがLinux PCを使用したいと言うともちろん応えはNO!
Windowsでも頑張れば動くはずだから...と言われました。

てな事でWindowsでCTSを動かすための試行錯誤の共有です。

# 1.Cygwinのインストール
[Cygwin](https://www.cygwin.com/)からCygwinをインストールします。

# 2.JAVAのインストール
[JAVA](https://www.oracle.com/technetwork/java/javase/downloads/index.html)のダウンロードとインストール

# 3.Android Studioのインストール
[Android Studio のインストール](https://developer.android.com/studio/install?hl=ja)を参照

# 4.CTSのダウンロードと解凍
[Compatibility Test Suite Downloads](https://source.android.com/compatibility/cts/downloads)から対象のCTSをダウンロードして任意の場所に解凍する

この状態で実行すると

```
$ ./android-cts/tools/cts-tradefed run cts
```
上手く動きません。

# 5.Cygwinでjavaを使う
Cygwinでjavaが上手く動かないようなのでCygwinでJavaを動かすように設定を行う。
[MSYSやCygwinでjavaを使う](https://qiita.com/SHIMADONBEY/items/1fa0a68719b78f7b08d2)を参照してください。


この状態で実行すると

```
$ ./android-cts/tools/cts-tradefed run cts
$ Unrecognized OS
```
上手く動きません。

# 6.android-cts/tools/cts-tradefedの修正
## 修正1
```
# get OS
HOST=`uname`
if [ "$HOST" == "Linux" ]; then
    OS="linux-x86"
elif [ "$HOST" == "Darwin" ]; then
    OS="darwin-x86"
else
    echo "Unrecognized OS"
    #exit(※Windowではexitするためコメントアウト)
fi
```
##修正2
```
# load any shared libraries for host-side executables
LIB_DIR=${CTS_ROOT}/android-cts/lib
if [ "$HOST" == "Linux" ]; then
    LD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${LD_LIBRARY_PATH}
    export LD_LIBRARY_PATH
elif [ "$HOST" == "Darwin" ]; then
    DYLD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${DYLD_LIBRARY_PATH}
    export DYLD_LIBRARY_PATH
### ここから　Windows(Cygwin上)でもLinuxと同じ設定をしたいためLD_LIBRARY_PATHを設定する
else
    LD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${LD_LIBRARY_PATH}
    export LD_LIBRARY_PATH
### ここまで
fi
```

この状態で実行すると

```
$ ./android-cts/tools/cts-tradefed run cts
$  Root directory doesn't exist C:\cygdrive\c\cygwin64\......
```
上手く動きません。


# 7.CTSの解凍環境の変更
どうもCドライブなどにあると上手く動かないようだ。そのためネットワーク上のフォルダなどに移動する必要がある。
もっとも簡単な方法は解凍したフォルダを共有設定する。
共有設定を行うとフォルダのプロパティでネットワークパスが表示されます。

ネットワーク上で実行すると

```
$ cd \\MyPcName\android-cts-9.0_r5-linux_x86-arm
$ ./android-cts/tools/cts-tradefed run cts
```
やっと動くようです。

# その他
サポートされていないものでどうにか動かす会社より適切な環境を用意してくれる所で働くのが良いと思います。
Gitでブランチやタグなどの追加削除コマンド表

各種コマンドは一定のルールに従ったコマンドで追加削除できますが、自分は心配性なので調べてみました。メモ書きですが、気が向いたら他のアイテム(サブモジュールとか)も追加するかもしれません。

# 読み方・使い方

* `X` と書かれているところは、アイテムの名前(ブランチ名・タグ名など)です。
* 特に断りがなければローカルにあるアイテムを確認します。
* 「アイテム」という呼び方は便宜上ここで呼んでいるだけです。
* ブランチ・タグそれぞれ特有のコマンドは他の記事を探してネ。

# テーブルをどうぞ

|アイテム|追加|削除|リスト|
|---|---|---|---|
|ブランチ|`git branch X`|※1<br/>`git branch -d X`<br/>`git branch -D X`|`git branch`|
|タグ|`git tag X`|`git tag -d X`|`git tag`|

※1: `-d`はブランチがHEADにマージされているか確認しますが、`-D`は確認しません。

# 参考

Gitブランチ関連コマンド by ayakix
https://qiita.com/ayakix/items/55dc4a324a49ff200c2d

git tagの使い方まとめ by growsic
https://qiita.com/growsic/items/ed67e03fda5ab7ef9d08
[Go]structをフィールド名付きで標準出力する

`fmt.Sprinf()`でフォーマットでstructの中身を出力する際に、structのフィールド名も一緒に出力できるオプションがあるのを知ったので書いておく。


```sample.go
package main

import "fmt"

func main() {
	type user struct {
		id   int
		name string
	}

	res := fmt.Sprintf("%+v", user{1, "k-kurikuri"})
	fmt.Println(res) // {id:1 name:kuri}
}
```
Swiftで配置を頑張った話

## 今回はiOSのアプリに挑戦しました

実際にXcodeを使うのが初めてで勉強にチュートリアルでやったぐらいで、本格的に作り始めたのは今日が初めてです。

今回頑張ったのは「配置」です。

僕がよくやるミスで怒られるのは、配置の条件を色々設定しすぎてお互いの条件に干渉していますよ！
ということが起こっています。

###どこでそんなことが起こっているのか？

<img width="265" alt="スクリーンショット 2018-12-25 18.32.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/e1dc68b1-842f-3830-7ae6-39125405e0f7.png">

このAdd New Constraintsというところで楽しくなってたくさんAdd Constraintsをしてしまうのが原因です。

いやXcode触りたてなので色々楽しくていじってしまうんです。

### エラーが出ると赤くなる

<img width="1440" alt="スクリーンショット 2018-12-25 18.35.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/ece20fba-eb3e-7339-f3e4-3ac1801b3432.png">

例えば「OK」のボタンを色々いじっているとこんな感じで赤くエラーが表示されます。

こういったときはbuildもできないので問題を解決することからスタートします

### 簡単にXcodeの修正機能を使うのはものすごく危険
<img width="550" alt="スクリーンショット 2018-12-25 18.37.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/a3f822d2-16ee-ca26-9c50-22c2638a3efc.png">

こんな感じで表示されて自動的に補完してくれるとても便利な機能と最初は思っていました。後々、作りたいものが作れなくなってきて、一からやり直す羽目になりました。

ツールが何をしようとしているのか？英語になっているのでまずはググって翻訳してもらってから、いったい何に怒られているのか？をある程度把握した上で修正することをお勧めします。

##　結局どうしたか？というと

<img width="286" alt="スクリーンショット 2018-12-25 18.40.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/b9fd6d95-c66c-0b67-4486-92527e072654.png">

僕は基準点を一番上のナビゲーションバーに設定してからそこからいくらと相対的な位置関係（次においたものからいくらという意味）に考えて図面みたいに書いてから作成しました。

こんな感じ。![IMG_3112.JPG](https://qiita-image-store.s3.amazonaws.com/0/253981/3274b169-83dc-ab18-06ca-1f9faf2357c4.jpeg)

①実際に作りたいものを軽く図面化
②そこから距離だいたいなんぼというものにしてから
③実機テスト
④距離を修正して①に戻る

という感じでしました。

僕も初心者でプロのエンジニアの方々はどのように作成しているのかわかりませんが、こういった方法でやると結構予想したものが作ることができました！！

##最後に

今回の話はXcodeの使い方の話のようになっていますが、実際は作りたいものを上から配置を決めていくと今回はうまくいって嬉しかったという話です。もし初学者で自分のアプリを作りたいという同じ境遇の方のお役に立てれば幸いです。

おしまい。。。
fluentdでCloudWatchにログを転送する

# EKS上のPodのログをCloudWatchに転送するためのtips
[fluentdのymlファイル](https://github.com/fluent/fluentd-kubernetes-daemonset/blob/master/fluentd-daemonset-cloudwatch-rbac.yaml)が公開されていますが、運用するにあたり一部設定をする必要があるのでそれの共有になります。（[ドキュメント](https://github.com/fluent/fluentd-kubernetes-daemonset)にも記載あります）
以下の２つを設定します。

- nodeのロールにarn:aws:iam::aws:policy/CloudWatchFullAccessを追加
- ymlファイルにFLUENT_UIDを追加

# ymlファイルの修正箇所（抜粋）
```yml:fluentd-daemonset-cloudwatch-rbac.yaml
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:cloudwatch
        env:
          - name: LOG_GROUP_NAME
            value: "your log group name"
          - name: AWS_REGION
            value: "your region"
          - name: FLUENT_UID
            value: "0"
```
ReactNativeでオープンソースなアプリを開発しました

## はじめに
日頃からオープンソースに恩恵を受けてることを強く感じます。
先人たちのお陰でより楽しいソフトウェア開発ができていることに感謝し、僕もその一助になれればと思い、オープンソースで公開することにしました。

## 謝辞
2018年12月25日現在、iOS版はリリースできていません。審査だけ通ってない状態ですので、手が空き次第リリースできます。リリースの際はこの記事をみてくださった人たちに伝わるようにおしらせします。

## アプリについて
CodePicks（コードピックス）と名付けました。
個人開発者やプログラマ・フリーランスの方向けのニュースアプリです。もろ分かりな通り、NewsPicksにインスパイアされてます。

UIも影響を受けていますし、最終的な仕様もNewsPicksのようになれればなと思っています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/72204/a2ce9f5c-f46f-cf3c-834d-fef8e3090ef7.png)

Android版URL:
https://play.google.com/store/apps/details?id=com.codepicks

## 現在の機能と展望について
現在は基本的に`ニュースの閲覧`だけができる状態です。
カテゴリごとに眺めて、気になる記事をWebViewで表示できる感じです。

OSSなので、最低限だけ実装してリリースしました。続きの実装はOSSコミュニティが自走してくれるのが理想ですが、

- 認証機能
- 記事の保存機能（Pick）
- コメント機能

くらいはタイミングを見て僕が実装しようかなという感じです。

## ソースコード
https://github.com/KangYoosam/CodePicks

## 自分の端末でアプリを起動するところまでの流れ
Readmeの通りですが、ここにも書きます。

- ReactNative初心者の方は[公式ドキュメント](https://facebook.github.io/react-native/docs/getting-started.html)をご一読ください。開発マシンは何でも構いませんが、**iOSアプリをビルド・開発するにはMacが必要です。**
- `git clone git@github.com:KangYoosam/CodePicks.git`
- `npm install`: 依存ライブラリをインストールします。
- `react-native run link`: ReactNativeの依存ライブラリへリンクします。
- `cp .env{.example,}` .env.exampleファイルから.envファイルをコピーし、生成します。
- `react-native run-ios`: iOSのSimulatorを起動します。
- `react-native run-android`: Androidのemulatorを起動します。

## 使用しているライブラリ紹介
基本的なの・アーキテクチャに影響があるものだけ書きます。

### [Redux](https://github.com/reduxjs/redux)
状態管理のフレームワーク。
Reduxは学習コストが高いとか複雑になるとか言われているが、個人的にはそうは思わない。ディレクトリ構造もスッキリしてると思う（ソースを参照。ご意見あったらください。）し、使わない手はないくらい便利。

参考:
[You Might Not Need Redux](https://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367)

### [React Navigation](react-navigation)
ルーティングのライブラリ。ルーティングは他にも`react-native-router-flux`とかいくつかあるみたいだけど、一通り使ってみて僕にはこれが一番使いやすかった。
Verion3になってから結構破壊的な変更があったけど非常に良い改善がなされたので許容範囲。

### [react-native-scrollable-tab-view](https://github.com/ptomasroos/react-native-scrollable-tab-view)
一覧画面でカテゴリごとにスクロールを可能にしているライブラリ。

### [Axios](https://github.com/axios/axios)
Promise basedなHTTPクライアントツール。JSで通信するならほぼこれがデファクトスタンダードな気がする。

### [Eslint](https://eslint.org/)
言わずと知れたJSのLinterツール。チーム開発だけじゃなく、1人で開発してても全然助かる。VSCodeとの相性が最強じゃった。

### [NativeBase](https://nativebase.io/)
よく使うUIの雛形がだいたい入ってる。今回のように、細かなUIにこだわらなくて良いケースとかは実装効率が格段に上がる。

### [React Native Elements](https://react-native-training.github.io/react-native-elements/)
NativeBaseに同じく。UI構築に便利。FontAwesomeのようなiconを提供してくれるComponentもあるのでこれがないとやってられない。

## APIについて
APIに関しては[Laravel Nova](https://nova.laravel.com/)を購入・導入しているのでオープンにできない。
今の所は取得系だけだし、用意は難しくないと思ったので一旦置いておいてる。`.env.example`には本番のエンドポイントを書いておいたので、APIは気にせずそのままローカルで動かせます。

## もっと詳しく知りたい人へ
12月27日に東京で勉強会をやります。その際、アプリを発表させてもらってニーズがあったらハンズオン的なのもしようと思います。参加費等無料なのでぜひいらしてください。
https://r-n.connpass.com/event/112874/

急なので、都合が合わない方でどうしても質問とかあれば↓へどうぞ。
https://twitter.com/kangyoosam
会社で昇進？ 新米PM？プロダクトマネージャーってどんな職種？スキルセットは？ 抜粋学習まとめ

# Inspired by

>Teruhisa Fukumoto
>@Terryy
>チャットボット開発の株式会社ZEALSでPythonやRubyのサーバサイドエンジニア兼同プロダクトマネージャーをやっています。

[小さな会社のPMになったあなたへ - Qiita](https://qiita.com/Terryy/items/b3a26517b584cdbec70d)

# そもそもプロダクトマネージャーとは何なのか？ が人が抱く疑問らしい

> 「”PMとは何で、どういった職種や役割なのか”を知りたがっている人が多いのではないか」という仮説

>「PMとは何なのか」というロールへの理解を深める内容が、全ての記事に共通している要素だということです。


# 一概に言えないらしい

>会社のフェーズや業種によってPMの仕事内容に驚くほど違いがあることがわかります。

>調べれば調べるほど「何をすれば良いのか」がわからず、「PMの何たるか」の記事を読み漁ることになるのではないでしょうか。

# プロダクトマネージャーのスキルセット、精神が求められているらしい。

>トレンド入りしたりするのは、「PMのスキルアセット」や「何を大事にしているか」などの、「PMとは何たるか」という記事が多い印象でした。

# 2018年はプロダクトマネージャー元年だったらしい

勝手に命名。

>今年はProduct Manager Conferenceの盛況などもあり、”PM”という職種についての世間の理解がより深まった一年だったのではないかと感じています

# Google検索や本は役立たないらしい

世界がない世界だから、当たり前だよね。

>もちろん、プロダクトの未来像に正解はありません。
>すべては自由です。

# プロダクトマネージャーのやりがいは「世界を変えられる」

>会社が作りたいと思う未来にプロダクトをどう貢献させるか。
>それを決定し会社の、そして世界を変えていくことができるのがPMの醍醐味だと思います。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Check! Azure DevOps Demo Generator でリファレンスプロジェクトを立ち上げる

こんばんは、 @dz_ こと大平かづみです。

Azure DevOps Advent Calendar 2018 の 24日分です。遅れてしまってすみません :sob:

## Prologue - はじめに

さて、 Azure と相性抜群の CI/CD や スクラム/アジャイルのプロジェクト管理ができる Azure DevOps 。機能が豊富すぎてどこから手を付けていいかわからない！というときは、 [Azure DevOps Demo Generator](https://azuredevopsdemogenerator.azurewebsites.net/) でリファレンスプロジェクトを用意できるので、試してみましょう♪

## 所感

使い方は簡単。サインインもしくはサインアップし、organization やプロジェクト名を指定して、テンプレートを選ぶだけです。

選べるテンプレートは結構たくさんあります。下記にリストアップしてみました。

なお、選択したテンプレートによって、 extensions のインストールが求められることがあります。インストールは、選択した organization にのみインストールされるようです。同じ organization の他のプロジェクトへ影響が心配な場合は、別途 oraganization を作成してから試すとよいかもしれません。インストールした extensions は、  _Organization Settings > Extensions_ から確認できますので、心配せずに使ってみるとよいかと思います。

## 選べるテンプレート (2018/12/25時点)

テンプレート選択画面では、 `General`、 `DevOps Labs`、 `Private` という３つのタブがあり、それぞれにテンプレートが列挙されています。一部要約も記載してみましたので、ご参考になれば幸いです。

- General
  - SmartHotel360
      - タグ: `Scrum`, `aspnetore`, `azureappservice`
      - _SmartHotel360_ という E2E のウェブアプリケーションのリファレンスです。_work items_ や _code_、_pipeline_ が含まれます。テンプレートベースはこちら [GitHub - Microsoft/SmartHotel360: SmartHotel360 - Connect(); 2017 keynote demo apps](https://github.com/Microsoft/SmartHotel360) 。
  - MyHealthClinic
      - タグ: `Scrum`, `aspnetcore`, `azureappservice`
      - スクラムベースの、 ASP.NET Core 製のウェブアプリケーションのリファレンスです。Azure App Service へデプロイする _pipeline_ が含まれます。
  - PartsUnlimited
      - タグ: `Scrum`, `aspdotnet`, `azureappservice`
      - _The Phonix Project (Gene Kim 著)_ に基づくスクラムベースの、Phoenix  eCommerce ウェブサイトのリファレンスです。テンプレートベースはこちら [GitHub - Microsoft/PartsUnlimited: .Net Core + SQL Azure app for DevOps Scenarios](https://github.com/Microsoft/PartsUnlimited) 。
  - MyShuttle
      - タグ: `Scrum`, `java`, `application`, `azure web app`, `MySQL`
      - _Java_ と _MySQL_ で構成されたアプリケーションのリファレンスです。 Azure  App Service 上の _Tomcat_ サーバーへデプロイする _pipeline_ が含まれます。詳細はこちら [Deploying a Java-based Tomcat application to Azure \| Azure DevOps Hands-on-Labs](https://www.azuredevopslabs.com/labs/vstsextend/tomcat/) 。
  - CntosoAir
      - タグ: `Agile`, `Node.js`, `User stories`
      - `Node.js` と `CosmosDB` で構成されたアプリケーションのリファレンスです。アジャイルベースの _user stories_ や _features_ 、 _epics_ が用意されたプロジェクトで、CI&CD の _pipeline_ も含まれます。テンプレートベースはこちら [GitHub - Microsoft/ContosoAir: Source code repository for ContosoAir application](https://github.com/Microsoft/ContosoAir) 。
- DevOps Labs
  - Docker
  - AKS
  - GitHub
  - Octopus
  - Selenium
  - DeploymentGroups
  - SonarQube
  - ReleaseGates
  - PHP
  - Python
  - WhiteSource-Bolt
  - AzureFunctions
- Private
  - [Template Builder](https://azuredevopsdemogenerator.azurewebsites.net/Extractor/Index) で自作したテンプレートを指定できます。

## Epilogue - おわりに

ちょっとアドベントカレンダーの〆切に間に合わないので、先に提出します！後ほどもっと調べて追記しようと思います～！
すみません～！！
ansible-playbookでlimitオプションを強制する（無指定の場合失敗させる）

# 背景
ansibleでroleとしては同じだが、地域毎にhostsのsubsetでグルーピングしている状態で
都度都度、対象の地域に `--limit` オプションでしぼってplaybookを実行している。

かつ、地域毎に微妙に違う箇所を変数で受け取っているため
このlimitオプションをつけ忘れると全地域に特定地域の設定で実行されてしまう。

危険だなーとずっと思っていたのだが、この危険な状態を是正する事が出来たのでご紹介。

## inventory-file

`--inventory-file` オプションで指定するファイルには全ホストが地域毎にsubsetで管理されている。
ここに `ungrouped` のものを適当に追加する。

```diff:inventory.diff
+ 127.0.0.1   <- これを追加

[asia]
10.1.1.1
10.1.1.2
10.1.1.3
10.1.1.4
```

## playbook

変更前のplaybookが下記の時

```yaml:playbook
---
- name: configure XXX
  gather_facts: false
  hosts: all
  tasks:
    - name: configure XXX
      略:
```

先頭に `ungrouped` 向けのタスクを追加する

```diff:playbook.diff
---
+ - hosts: ungrouped
+  gather_facts: false
+  connection: local
+  tasks:
+    - name: Safety
+      fail: msg="groupを指定してください"
+
- name: configure XXX
  gather_facts: false
  hosts: all
  tasks:
    - name: configure XXX
      略:
```

これで `limit` を忘れると `ungrouped` が対象に入ってくるので下記のように先頭タスクで失敗させて止める事が出来る。

```bash
$ ansible-playbook -i inventory update_dns.yml

PLAY [ungrouped] **************************************************************************************************************************************************************************************************

TASK [Safety] *****************************************************************************************************************************************************************************************************
fatal: [127.0.0.1]: FAILED! => {"changed": false, "msg": "groupを指定してください"}

PLAY RECAP ********************************************************************************************************************************************************************************************************
127.0.0.1                  : ok=0    changed=0    unreachable=0    failed=1
```

`limit` を指定していれば `ungrouped` は対象がいないためスキップされる。

```bash
$ ansible-playbook -i inventory update_dns.yml -l dev

PLAY [ungrouped] **************************************************************************************************************************************************************************************************
skipping: no hosts matched

PLAY [configure dns lookup] ***************************************************************************************************************************************************************************************

TASK [configure dns lookup] ***************************************************************************************************************************************************************************************
ok: [172.17.0.35]

PLAY RECAP ********************************************************************************************************************************************************************************************************
172.17.0.35                : ok=1    changed=0    unreachable=0    failed=0
```
Azure Bot Service チュートリアル実施ログ

https://docs.microsoft.com/ja-jp/learn/modules/build-chat-bot-with-azure-bot-service/4-deploy-bot

「Azure Bot Service を使用してチャット ボットを構築する」チュートリアルのPage.4の手順#4（4.Azure portal で Web アプリ ボットの [Build](ビルド) ブレードに戻り、[Configure continuous deployment](継続的デプロイの構成) を選択）から#17までだが、サポートされなくなった旨表示され実施できない（以下画面）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/327770/b4b693fb-9cf7-82a7-c82a-fd1ddfdc1e69.png)
この手順を飛ばして次ページに進んでも進行に支障はなかった
nvidia-settingsでGPU温度に応じてFan速度を変える


温度が高いGPUのFanを速く回すと冷えるので，そのスクリプト．

- cron.hourlyで1時間に1回実行．
- nvidia-smiでGPU数と温度を取得
- 温度が70度を超えたら，nvidia-settingsでFanを強制的に100%
- 温度が40度を下回ったら，nvidia-settingsでFan自動調整

これで，80度を超えていたのが60度台になったのでhappy．


まずは

```sh:
sudo nvidia-xconfig -a --cool-bits=4
```

を実行して再起動．

```python:adapt_fan
#!/usr/bin/python3

import os
import subprocess

os.environ['DISPLAY'] = ':0'
os.environ['XAUTHORITY'] = '/run/user/121/gdm/Xauthority'   # hardcoded．要変更


try:
    gpu_temp = subprocess.check_output(["nvidia-smi",
                                        "--query-gpu=temperature.gpu",
                                        "--format=csv,noheader"])
except:
    exit()
    

gpu_temp = [int(t) for t in gpu_temp.split()]


for i, temp in enumerate(gpu_temp):

    if temp > 70:

        try:
            subprocess.check_call(["nvidia-settings", "-a",
                                   "[gpu:{}]/GPUFanControlState=1".format(i)],
                                  stdout = subprocess.DEVNULL)

            subprocess.check_call(["nvidia-settings", "-a",
                                   "[fan:{}]/GPUTargetFanSpeed=100".format(i)],
                                  stdout = subprocess.DEVNULL)
        except:
            pass # exit()


    if temp < 40:

        try:
            subprocess.check_call(["nvidia-settings", "-a",
                                   "[gpu:{}]/GPUFanControlState=0".format(i)],
                                  stdout = subprocess.DEVNULL)
        except:
            pass # exit()
        
```

あとはcronで実行すればOK．

```bash:
sudo install -v adapt_fan /etc/cron.hourly
```
で，1時間に1回実行される．

3分ごとに実行したいならcron.dに以下のファイルを作る．

```bash:/etc/cron.d/adapt_fan_crond
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
*/3 * * * *   root    python3 /etc/cron.hourly/adapt_fan
```
Link > C++ Builder XE4 > プロパティ > Anchorsのコードでの変更 (右と下もアンカー設定) > Chart1->Anchors = TAnchors() << akLeft << akTop << akRight << akBottom;

```txt:動作環境
C++ Builder XE4
```

コンポーネントの配置に関するAnchors。

フォームデザインでの設定変更は知ってはいたが、コードでどうするか分からなかった。

下記を見つけた。
情報感謝です。

https://www.nabeta.tk/cgengo/cbk/vcl_anchors.html
@ [鍋田辞書(なべたじしょ)ホームページ](https://www.nabeta.tk/)

>
```cpp 
  //Memo1をフォームのサイズを変更時、Mimo1の大きさをフォームに大きさに合わせる
  Memo1->Anchors = TAnchors() << akLeft << akTop << akRight << akBottom;
```

### 試した

使用IDEではデフォルトにてAnchorsは左と上のみ。
右と下もAnchorsにする。

```cpp
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	Chart1->Anchors = TAnchors() << akLeft << akTop << akRight << akBottom;

	Panel1->Height *= 2;
}
```

- Chart1はPanel1上に配置

上記にてPanel1のHeight変更にChart1のHeightが追従することを確認できた。
#Ruby バージョンの 2.6.0-rc-1 とか rc-2 って何？ rc とは「リリース候補」という意味らしい。

Release candidate のことらしい。

# 参考

[Ruby 2.6.0-rc2 Released](https://www.ruby-lang.org/ja/news/2018/12/15/ruby-2-6-0-rc2-released/)

>Ruby 2.6.0に向けた二番目のリリース候補である、Ruby 2.6.0-rc2がリリースされました。

[Ruby 2.6.0-rc2 Released](https://www.ruby-lang.org/en/news/2018/12/15/ruby-2-6-0-rc2-released/)

>Ruby 2.6.0-rc2 is the second release candidate of Ruby 2.6.0.

---


[サンプルコードでわかる！Ruby 2.6の主な新機能と変更点 - Qiita](https://qiita.com/jnchito/items/ce11cb7fccdf4b66af24)

[Software release life cycle - Wikipedia](https://en.wikipedia.org/wiki/Software_release_life_cycle#Release_candidate)

---

signed [yumainaura ruby - Google Search](https://www.google.com/search?q=yumainaura+ruby&oq=yumainaura+ruby&aqs=chrome..69i57j69i60l3.2384j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rustのマクロでハマってしまった単純な一例

Rustでマクロの引数の個数を数えてみようと思って以下のように書きました。

# 誤り
```rust
macro_rules! count_args {
    ($($elems: ident),*) => {
        count_args!(0; $($elems),*)
    };

    ($res: expr;) => {
        $res
    };

    ($res: expr; $elem: ident, $($rest: ident),*) => {
        count_args!($res + 1; $($rest),*)
    };
}

fn main() {
    println!("{}", count_args!(x, y, z));
}
```
```
error: no rules expected the token `z`
  --> src\main.rs:16:38
   |
16 |     println!("{}", count_args!(x, y, z));
   |
```
`z`で当てはまるルールがないと言われます。

# 理由
```
($res: expr; $elem: ident, $($rest: ident),*) => {
```
　このルールで`x, y, z`が`x`で`y`で`z`と順番に消費されて`$rest`が0個になると思い込んでました。しかし実際には、`$elem: ident`の次にあるコンマまできっちりマッチングできるかどうか確かめられます。つまり、`$elem: ident,`できっちり見られるので`x,`と`y,`はマッチしますが、最後の`z`は`$elem: ident,`にマッチせず他に当てはまるルールがないのでエラーとなります。

　ちなみに、`count_args!`の呼び出しで`z`の次にコンマを入れて`count_args!(x, y, z,)`にすると、この呼び出しの最後のコンマで`unexpected end of macro invocation`と言われてエラーになります。

# 正答例
以下のように`($res: expr;)`をコンマのない終端のトークンを受け入れられるように`($res: expr; $elem: ident)`と修正するとうまくいきました。もちろん`$res`も`$res + 1`にしています。

```rust
macro_rules! count_args {
    ($($elems: ident),*) => {
        count_args!(0; $($elems),*)
    };

    ($res: expr; $elem: ident) => {
        $res + 1
    };

    ($res: expr; $elem: ident, $($rest: ident),*) => {
        count_args!($res + 1; $($rest),*)
    };
}

fn main() {
    println!("{}", count_args!(x, y, z));
}
```

# 最後に
ルールにセミコロン使ってる時点で気づくべきだった。
itertools.groupbyは事前にソートしておく必要がある & n番目の要素を取得する関数がほしい場合はoperator.itemgetterが便利

受信したメールの受信日付、送信元Adress、件名が以下のような形式でリストに格納されているとします。

```python
received_mails = [
  ("2018-01-01", "alice@example.com", "subject1"),
  ("2018-02-02", "bob@example.com"  , "subject2"),
  ("2018-03-03", "chris@example.com", "subject3"),
  ("2018-04-04", "alice@example.com", "subject4"),
  ("2018-05-05", "bob@example.com"  , "subject5"),
]
```

受信したメールを送信元Adressによって振り分けたい場合、言い換えればSQLでいうところのGROUP-BYのようなことをしたい場合、pythonでは`itertools.groupby`が利用できます。

```python:bad.py
def display_mails(mails):
    return ':'.join(f'[DATE={mail[0]} ADDRESS={mail[1]} SUBJECT={mail[2]}]' for mail in mails)

for address, mails in itertools.groupby(received_mails, lambda mail : mail[1]):
    print(address, display_mails(mails))
```

この結果は次の通りです。要するに送信元Addressによる振り分けができておらず、想定とは違う結果になっています。

```
alice@example.com [DATE=2018-01-01 ADDRESS=alice@example.com SUBJECT=subject1]
bob@example.com [DATE=2018-02-02 ADDRESS=bob@example.com SUBJECT=subject2]
chris@example.com [DATE=2018-03-03 ADDRESS=chris@example.com SUBJECT=subject3]
alice@example.com [DATE=2018-04-04 ADDRESS=alice@example.com SUBJECT=subject4]
bob@example.com [DATE=2018-05-05 ADDRESS=bob@example.com SUBJECT=subject5]
```

そこで[`itertools.groupby`のドキュメント](https://docs.python.jp/3/library/itertools.html#itertools.groupby)を読んでみたところ、`groupby`の対象になるイテレータはソート済みである必要があるとのことでした。

> 同じキーをもつような要素からなる iterable 中のグループに対して、キーとグループを返すようなイテレータを作成します。key は各要素に対するキー値を計算する関数です。キーを指定しない場合や None にした場合、key 関数のデフォルトは恒等関数になり要素をそのまま返します。通常、iterable は同じキー関数でソート済みである必要があります。
> groupby() の操作は Unix の uniq フィルターと似ています。 key 関数の値が変わるたびに休止または新しいグループを生成します (このために通常同じ key 関数でソートしておく必要があるのです)。この動作は SQL の入力順に関係なく共通の要素を集約する GROUP BY とは違います。

今回の例であれば、次のように書き直す必要があるということです。

```python:good.py
get_adress = lambda mail : mail[1]
for address, mails in itertools.groupby(sorted(received_mails, key=get_adress), get_adress):
    print(address, display_mails(mails))
```

この実行結果は以下のようになり、確かに送信元Adressでgroup by処理ができていることがわかります。

```
alice@example.com [DATE=2018-01-01 ADDRESS=alice@example.com SUBJECT=subject1]:[DATE=2018-04-04 ADDRESS=alice@example.com SUBJECT=subject4]
bob@example.com [DATE=2018-02-02 ADDRESS=bob@example.com SUBJECT=subject2]:[DATE=2018-05-05 ADDRESS=bob@example.com SUBJECT=subject5]
chris@example.com [DATE=2018-03-03 ADDRESS=chris@example.com SUBJECT=subject3]
```

***

`good.py`では`get_address`関数を`lambda`を利用して定義しました。これは`def`を使って、以下のように定義することも可能です。

```python
def get_address(mail):
    return mail[1]
```

`lambda`にしろ`def`にしろ「リストやタプルのn番目の値を取得する」関数が欲しいわけで、こうした用途においては`operator.itemgetter`を利用することも可能です。たとえば`good.py`を`operator.itemgetter`で書き換えると、次のようになります。

```python:good.py
get_address = operator.itemgetter(1)
for address, mails in itertools.groupby(sorted(received_mails, key=get_adress), get_adress):
    print(address, display_mails(mails))
```

あるいは他の例を考えてみると、たとえば`received_mails`から件名だけを取り出して、リストに格納したい場合、以下のような3通りの書き方ができるわけです。

```python
subjects = [mail[2] for mail in received_mails]
subjects = list(map(lambda mail : mail[2], received_mails))
subjects = list(map(operator.itemgetter(2), received_mails))
```
ec-cube4 に さくらのメールのSMTPを設定する方法

# ec-cube4にさくらのメールの設定をした
微妙にハマったのでメモ
## ec-cubeをインストールしたディレクトリ以下の .envを編集
vi .env を実行して .envを開いてMAILER_URLを追加

MAILER_URL=smtp://mydomain.sakura.ne.jp:587?encryption=tls&username=mailid@mydomain.sakura.ne.jp&password=mypassword

この設定でメールが届くようになった。

ec-cube4は symfony/swiftmailerを使っているらしい。

最初gmailの設定をしたら うまく行かなかった。ブラウザでgmailの画面を開いたら 信頼性の低いデバイスからのログインをブロックしました。と表示があった。gmailのセキュリティ設定を変更しないと 使いないかのかも。
さくらのメールのアカウントも持っていたので こちらの設定をしてメールが飛ぶようになった。
初めて触るQuantX

# 初めに
はじめまして今日から投稿を始めます。株の知識がちょっとあるだけで実践的なことはやったことはありません。
そんな自分が今日は簡単にQuantXというサービスについて書こうと思います。

# QuantXとは？ 
多くの銘柄の中から自分の好きな銘柄を開発者が作ったアルゴリズムを使用して株価の予測を行ったり、開発者が作ったアルゴリズムを購入できるサービスです。
アルゴリズムの料金は最低５００円から購入できるので学生にも手が届くのではないでしょうか？？
購入できるURLは下に置いておきます。
https://quantx.io/top
#触ってみよう！！
なんとQuantXのアルゴリズムは誰でも開発出来ます！！
と言っても自分は大したこと出来ないのでまず下にサンプルコードを利用したチュートリアルを置いておきます。
https://determined-feynman-fb5a05.netlify.com/ja/
チュートリアルを見終わった人は実際に下のURLから会員登録をしてみて触ってみましょう！
https://factory.quantx.io/
会員登録する前に開発デモが体験できるのでそちらを行ってイメージしてみてもいいかもしれませんね。

![ifke2.png](https://qiita-image-store.s3.amazonaws.com/0/331535/2d0e0050-3599-0641-4f2e-ea230954ac58.png)
![ifke1.png](https://qiita-image-store.s3.amazonaws.com/0/331535/f6d63e9d-d7ca-99f0-9589-3dfe72dfe5d4.png)

実際に自分も他の方々のコードを見たり数値をいじって実装してみましたけどPandasの力が必須となるのでQuantXを利用しようとしている初心者開発者の人はPandasと株の知識は必須となるので学習の優先度はその２つが高いと思います。
また他のQiitaに投稿している人だとtalibで株価を分析したりnumpyを使用している人がいるので多くの技術を学習したほうです。各自で優先順位を付けて学習するのが良さそうですね。
参考にした方の記事
https://qiita.com/Ric418/items/81f6d5d7521305511e15
https://qiita.com/shinseitaro/items/6a699cf795c7254b0c84


# 最後に.....
QuantXを開発しているSmartTradeさんが開催している勉強会があります。
   水曜日18:00~ は開発者向けもくもく会
   金曜日19:00~ は初心者向けワークショップの形式で開催します。
主催者や希望者による簡単なプレゼン発表があったりします。開発者達のプレゼンが聞けるのでいい時間を過ごせると思います。
下のURLで詳細が知れるので飛んでみて確認してみて下さい。
https://python-algo.connpass.com/
まだまだ株についての知識がないのでQuantXで勉強しながら新しく出てくる単語の理解が深まればいいなぁと思いつつ金曜日に開催される初心者向けの勉強会で勉強をしようと思います。
Go profile 基礎について

## 概要
こちらは、https://qiita.com/advent-calendar/2018/gopherdojo の25日目の記事です。
普段は、Rubyでサーバー開発します、たまにStackProfを使ってrubyプログラムのプロファイリングします
Goで触ってみたとき、プロファイラ便利なツールがあるか気になるので、一応調べて書きました。

## Go 環境
 - Go ver1.11.2
 - MacOS

## Go Profileは二つの取り方がある
 - https://golang.org/pkg/runtime/pprof/
   - ファイルに出力してプロファイリングする。一発終わるコマンドで使えそう。
 - https://golang.org/pkg/net/http/pprof/
   - httpサーバー経由でプロファイリングする。Webサービスで使えそう
 
## 環境準備

- `github.com/pkg/profile`をダンロードする

```
go get github.com/pkg/profile
```
- graphvizをインストールする

```
brew install graphviz
```

## `runtime/pprof`

#### Step1: コードにプロファイラを埋め込む
```
package main

import (
    "fmt"

    "github.com/pkg/profile"
)

func fib(n int) int {
    if n < 2 {
        return n
    }
    return fib(n-1) + fib(n-2)
}

func main() {
    defer profile.Start(profile.ProfilePath(".")).Stop()

    fmt.Println("start")
    for i := 0; i < 1000; i++ {
        fib(30)
    }
}
```
#### Step2: ビルドして、実行する

```
go build main.go
./main
2018/12/25 07:45:47 profile: cpu profiling enabled, cpu.pprof
start
2018/12/25 07:45:54 profile: cpu profiling disabled, cpu.pprof
```

#### Step3: 出力されたファイルを解析します。
```
go tool pprof -http=":8081" main cpu.pprof
```
http://localhost:8081/ui/
これでグラフ(flamegraph, graph)でどこにどれくらい時間・リソースがかかったかなどを見やすくすることもできます。

![スクリーンショット 2018-12-25 7.50.09.png](https://qiita-image-store.s3.amazonaws.com/0/49939/3ba47f3f-b7f2-21d9-f7cb-9962ef881f6d.png)
![スクリーンショット 2018-12-25 7.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/49939/bc070114-4e45-a2ba-97ac-d84cb8c09947.png)

## `net/http/pprof`

#### Step1: コードにプロファイラを埋め込む

```
import (
    "fmt"
    "log"
    "net/http"

    _ "net/http/pprof"
)

func fib(n int) int {
    if n < 2 {
        return n
    }
    return fib(n-1) + fib(n-2)
}

func main() {
    go func() {
        log.Println(http.ListenAndServe("localhost:6060", nil))
    }()

    fmt.Println("start")
    for {
        fib(30)
    }
}
```

#### Step2: ビルドして、実行する

```
go build main.go
./main
start
2018/12/25 08:06:14 listen tcp 127.0.0.1:6060: bind: address already in use
```

#### Step3: プロファイルの解析
```
go tool pprof -http=":8081" http://localhost:6060/debug/pprof/profile
```
http://localhost:8081/ui/ で確認`runtime/pprof`と同じくflamegraph, graphなど確認できます。


## 参考
https://www.youtube.com/watch?v=N3PWzBeLX2M
https://github.com/uber/go-torch
https://christina04.hatenablog.com/entry/golang-pprof-basic
https://flaviocopes.com/golang-profiling/

Goはあまり自信がないですが、できる限り調べました。
こうしたほうがいいよ！などありましたら教えてください
#JApanese な #Web開発者 なら #Web書道 で #モチベアップ #Fude #Kanji #Generator

Use this site

http://web-shodo.com/select.html

# Select 横長 width paper

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/da2bb621-6ac0-591b-bdbd-4db076e4d182.png)


# Input e.g `ボーイスカウト精神`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5b66df14-c058-951d-f23d-6e275d55f32a.png)

[Boy Scout Rule | DevIQ](https://deviq.com/boy-scout-rule/)



# input e.g `猫は生産性を倍加する`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/582555c3-0d76-57fc-793b-8ec2d71baa7f.png)

it means "Cat boosts engineering"

[いなうらゆうま💝YouTuber初心者マーク @YumaInaura 稲浦悠馬 on Twitter: "猫はエンジニアの生産性を倍加する！"](https://twitter.com/YumaInaura/status/1077484295684382720)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
STU48が某個人配信プラットフォームで強いって言われてるけど・・・ その２の４

STU48が某個人配信プラットフォームで強いって言われてるけど・・・ その２の１は[こちら](https://qiita.com/iowanman/items/ef5eb399c8710dbcd1dd)
その[２の２](https://qiita.com/iowanman/items/ef5eb399c8710dbcd1dd)
その２の３
STU48イベント中の僕の妄想により観測されたデータを元に集計しています。
注意 このデータは僕の妄想から構成されています。信じるか信じないかはあなた次第

#目的
STU48のイベントがありました。
彼女達に使われたポイントは約119,000,000ポイント（12/9 19:41公式発表）
これを誰がぶっこんだか興味があるので解析します。

具体的には、上位陣に対して無料ギフト（星 カウント コメント）を基にして、以下のような解析をここではします。

1.STU48のファンではなかった方々がどれくらいいるのか
2.上位陣のファンではなかったハズの方々がどれくらいポイントを入れたのか

です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/03640f2d-5612-1f89-a127-bed787518525.png)


#推し数について
推し数とは僕が勝手に定義した数字です。
ここでは、視聴者がイベント前の約一ヶ月間で、STU48メンバーの誰対して最も無料ギフトを投入しているかを調査し、そのポイントの多い順に一推し 2推し ３推し・・・を見つけます。
推し順に、推し数として、1/(4^j) [j=0,1,2,3,...] = 1, 0.25, 0.0625, 0.015625 という評価関数をを推し数としてます。
ただし、一推しに対してですらポイントの合計が、99*5以下の方は無視しています。

このような推し数を持つ視聴者が誰に対して無料ギフトやカウントを行ったのかを調べます。

##計算例
以下のような無料ポイントの行動をイベント前にした視聴者A-Dがいたとします。

||土路生優里 |福田朱里 |由良朱合 |中村舞 |沖侑果  |
|:--: |--: |--: |--: |--: |--: |
|視聴者A | 100000   |  0  |  2000  | 0   |0    |
|視聴者B | 0   |  5000  |  2000  | 0   |1000    |
|視聴者C | 0   |  0  |  0  | 0   |10000   |
|視聴者D | 0   |  0  |  10  | 0   |400    |

計算された推し数は以下のような感じです。

| |土路生優里 |福田朱里 |由良朱合 |中村舞 |沖侑果  |
|:--: |--: |--: |--: |--: |--: |
|視聴者A | 1   |  0  |  0.25  | 0   |0    |
|視聴者B | 0   |  1  |  0.25  | 0   |0.0625   |
|視聴者C | 0   |  0  |  0  | 0   |1  |
|視聴者D | 0   |  0  |  0 | 0   |0    |

事前に計算した、結果を示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/ee72aa90-c555-43a0-6491-d3fb2562ca99.png)
前月度のに最もファンが無料ギフトを使った相手、は今村美月さんでした。おそらく、NO WAY MANのセンターに抜擢されたご祝儀が多かったのだと思います。

仮に視聴者A-Dが門田桃奈さんに無料ギフトを投入したとすると、以下のような結果になります。

| |土路生優里 |福田朱里 |由良朱合 |中村舞 |沖侑果  |
|:--: |--: |--: |--: |--: |--: |
|門田桃奈 | 1   |  1  |  0.5  | 0   |1.00625    |

この表から、イベント中に門田桃奈さんに最もポイントを投げた視聴者が元々だれを推していたか一目瞭然になります。




#計算結果
上位三人の計算結果を示します。緑色は計算対象者、黄色は土路生優里さんの結果の上位の方です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/3471915b-deed-b1e9-18d0-95665849f914.png)

土路生優里さんで特徴的なのはOtherの多さです。Otherは前月にSTU48メンバーに約500ポイント以上を使わなかった視聴者の数です。
僕のように、自分で録画して後から観るとか、イベントでもないと星投げすらしないマンがここに含まれます。この中の何割がSTU48以外のファンかは、調べようと思ったらできるけどやりません（めんどくさい）


#考察
以下の図は上記の表から僕の独断と偏見でピックアップした特徴的な変化です。
主に土路生優里さんと福田朱里さんの比較です。
ファンの行動と心理がすげー読み取れてて、グラフを作りながら「これこれこれこれこれこれ！これを作りたかったんや！」って叫びました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180426/07ff247b-68d5-51bc-c018-9f1e09eee189.png)

下衆く、グラフから読み取れそうなことを記すと、

1.イベント前に今村美月さんのファンは、明らかに土路生優里さんを応援した人数が多い。そして福田朱里さんよりも由良朱合さんを応援した方が多い。
2.岩田陽菜さんファンと薮下楓さんのファンは、土路生優里さんを応援した人が多い
3.瀧野由美子さんのファンは土路生優里さん派と福田朱里さん派がだいたい拮抗
4.森香穂さんのファンは福田朱里さんを最も応援した人数が多い
5.中村舞さんのファンは土路生優里さんを応援して、由良朱合さんと福田朱里さんは拮抗

**ちなみにデータは、上記の理由は何も示してくれません。**

例えば、土路生優里さんが美人だから、が原因かもしれません。
美人だから、STU48をしらない人もイベントやってるから見に来て、土路生優里さん美人だはー って星を投げたかもしれません。

福田朱里は噛めば噛むほど味が出るのかもしれません。
土路生優里ゆりさんにくらべて、大衆受けはしないけど強固な岩盤なファンがいるのかもしれません。


などなど。このデータは下衆い理由を考察するための道具にはなります。


#まとめ
ファン心理の一端が見れて僕は大満足。
ちなみに、この解析も重大なバグが含まれている可能性があります、
信じるか信じないかはあなた次第。
circleciを使って特定のbranchにデプロイ処理をさせる

#はじめに

この記事は[LIFULL Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lifull2) その3、22日目の記事です。

circleciを触る機会がありまして、
この記事の対象としては、circleciのドキュメント読みつつ、
まさに導入を考えている初学者向けです。

#circleciについて
もはや僕から説明する必要がないほど、様々な記事で説明されている内容なので
省略します。
念のため公式サイトを貼ります。
https://circleci.com/

#circleciを使ってやりたいこと
今回、ciを導入してやりたかったことは、
「特定のブランチにpushした時にのみデプロイする処理を行う」というシンプルな内容です。

具体的なデプロイ処理は今回省略します。
(後でcache指定の部分は触れます)

#やったこと

今回の事例としては、あるbranch(deployブランチと仮に置く)にpushした時のみ、
デプロイする処理が動くという内容を書いてました。
以下が再現したconfig.ymlです。

```
# .circleci/config.yml
version: 2
jobs:
  deploy_job:
    # デプロイする処理

workflows:
  version: 2
  deploy:
    jobs:
      - deploy_job:
        filters:
          branches:
            only: deploy
```

このような設定で、deployというbranchにpushされた時のみ、
jobが走るようになります。

他のブランチにも走らせたい場合があると思いますので
branch指定子のリストを渡しておくことももちろんできます。

```
workflows:
  version: 2
  deploy:
    jobs:
      - deploy_job:
        filters:
          branches:
            only:
              - deploy
              - hoge_branch
              - foo_branch
```

複数のjobを特定のbranchで動かす前提だったため、
今回はworkflowsを利用しました。
もちろんjobごとに設定することも可能です。
https://circleci.com/docs/ja/2.0/configuration-reference/#branches

### キャッシュ指定について
上の内容で特定のbranchに処理をすることはできました。
しかしデプロイ処理をcircleciでやる時、毎回bundleやらyarnやらをインストールすると
時間がかかってしまいます。
なので対策としてcacheを指定して時間を短縮しましょう。

以下はbundle installのサンプルコードです。

```
    - restore_cache:
        name: Restore bundle cache
        keys:
        - bundle-cache-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
    - run:
        name: Bundle Install
        command: bundle install --path=vendor/bundle
    - save_cache:
        key: bundle-cache-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
        paths:
        - vendor/bundle
```

#まとめ
今回説明したのは

* 特定のbranchにpushされた際に処理を行う
* cache指定による時間短縮

です。
circleci2.1やGithub Actionsの件もありますし、
サービスに合った効率化を目指していきたいですね。
Google ドキュメント、スライドを PDF として公開 「/export?format=pdf」


Google ドキュメント、スプレッドシートを PDF として公開する場合に、わざわざ PDF でエクスポートしなくてもパラーメータを指定するだけで公開することができます。（2018/12/25 時点で、Google スライドでは利用できません。）よく忘れるので、記録しておきます。

- Google ドキュメント  
`https://docs.google.com/document/d/<ID>`
- 上記の Google ドキュメントを PDF として公開する場合  
`https://docs.google.com/document/d/<ID>/export?format=pdf`
#docker #dockerfile #Linux #Ubuntu  このコマンド何？  `rm -rf /var/lib/apt/lists/*` ?

# Example

```
RUN apt-get install -q -y && rm -rf /var/lib/apt/lists/*
```

# [ubuntuをdocker buildするときaptのキャッシュを削除し容量を小さくする - Qiita](https://qiita.com/tukiyo3/items/34b76ac7b6f2120b1485)

ということらしい。

# /var/lib/apt/lists/ とは

「パッケージインデックスファイル」が入るところらしい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/48297927-631d-7ffe-1b83-12468b11ca13.png)

[apt-get updateは何を行っているのか調べてみた〜パッケージインデックスファイルとは何か〜 - 君は心理学者なのか？](http://karoten512.hatenablog.com/entry/2018/01/09/003330)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
texmaker+jsbook+bibtex

ググるのが下手な学生の備忘録です．
# ぶち当たった問題
修士論文の原稿であるtexファイルをコンパイルしようとした際に，参考文献が不完全になる
# 環境
Windows 7
texmaker
$\LaTeX$
bibtex
jsbook
# 具体的に
参考文献のうち，タイトルしか表示されない（著者とジャーナルの名前，出版年が出力されなかった）．
# 解決策
texmaker上でコンパイルをする際，`LaTex --> bibtex --> LaTeX`の順に行っており，bibtexのコマンドは`bibtex %`にしていた．
今まで使っていた所属している学会用の`.cls`ファイルだと問題なく使えるが，`documentclass`を`jsbook`の際は（というより，日本語原稿では？）`pbibtex %`にすると問題なくコンパイルできるようになるらしい．
#
文章書くのが下手すぎて笑ってしまうのだがこれ以上うまくまとめられないのでこれにて．
駅すぱあとWebサービスを使ってカジュアルゲームを作ってみよう

[ヴァル研究所 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/val) 24日目の記事です。

駅すぱあとを使ったゲームって、考えるだけで難しいですよね。
というわけで、今回はこちらを使って駅名当てゲームを作ってみましょう。
https://github.com/EkispertWebService/GUI-for-Unity

# 基本的な操作

まずはGitHubからソースコードをダウンロードします。
Pushしないので、Cloneじゃなくても大丈夫です。

## Unityで開く

ほとんどuGUIで作ってますので、ちょっと古いUnity使っていても大丈夫です。
また、Proじゃなくても、どのプランでも動作します。

## シーンを開いて設定する

早速、「Assets/EkispertWebService/Scenes/Nandoku.unity」を開いてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/ca2e775b-df4e-9b95-c86f-e667051b717e.png)

おそらくこんな感じになっていると思いますので、ヒエラルキーから**EkispertWebService**を選択してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/cb8bef0c-8e47-b76f-98d1-65341dc1d87e.png)

すると、インスペクターに**EkispertWebService**が表示されますので、この**Key変数**に駅すぱあとWebサービスのアクセスキーを転記します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/9b4f52d0-4240-c056-4804-741445e94d26.png)

また、ついでに書いてあるエンドポイントが古いため、新しいものに書き換えます。

旧：`http://api.ekispert.com/v1/`
<font color=red>新</font>：`http://api.ekispert.jp/v1/`

※エンドポイントは古いままでも動作します。

「駅すぱあとWebサービスのアクセスキーがないよ」という方は、こちらから申請いただくと無料で入手できます。
https://ekiworld.net/service/sier/webservice/free_provision.html

## 不具合を修正する

**NowLoadingMessage**の高さをほぼゼロにしてしまっていたため、表示が崩れます。
そのため、ちょっと高さを広げてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/19315f0d-db34-e0e1-ec01-be26b38b71e7.png)

また、同じく**CorrectMessage**も高さがないため、同様に広げておきます。

## 遊んでみよう

後は**Play**を押せばゲームが出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/973f815d-ab93-d2b3-32c5-2eb259e5db8f.png)

漢字で駅名が表示されますので、オンスクリーンキーボードで駅名を入力していきます。
ちなみに、マウスやタッチパッドだと相当操作性が悪いので(w)、タッチパネルを推奨します。

## まとめ

サクッとサンプルでゲームを作ってみました。
このコードは改変自由なので、タイトルをオリジナルのものに変えてみたり、路線を変えてみたりすると面白いかと思います。

※路線を変更する場合は、ボタンのラベルだけじゃなくて**Nandoku**の路線名リストも書き換えてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/2817acdb-83e4-fa44-a93e-a9f2bed2db58.png)
#Qiita の記事タイトルにハッシュタグを入れる #Twitter 対策のテスト

# 時代はtiktok時代

ハッシュタグで全てを語る。

# 例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/78a7e07b-3f62-00fe-9e43-b2f34349e128.png)

# 記事がツイートされるたびTwitterでハッシュタグがつく

ちょっとだけいいね。

# Qiitaに限らず

なんでも使えるテク。

# ハッシュタグはSNSの共通言語

接続詞をなくして原始の世界に近づく未来予言。









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Linux #Ubuntu #docker #Dockerfile のこれは何？ apt-get install --no-install-recommends

Dockerfileの記述例

```
RUN apt-get update && apt-get install -y --no-install-recommends
```

# 時間対策、余計なもの入れないためのオプションらしい

>デフォルトだと recommends しているだけの必須ではないパッケージも一緒に入って時間がかかるので --no-install-recommends をつけるのが常套手段

[debianパッケージ周りでよく使うコマンドとオプション - sonots:blog](http://blog.livedoor.jp/sonots/archives/50115456.html)

---

[docker yumainaura - Google Search](https://www.google.com/search?q=docker+yumainaura&oq=docker+yumainaura&aqs=chrome..69i57j69i65j0j69i61j69i60j69i61.2401j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ubuntu の VirtualBox Server にコマンドラインで hostonly interface を加える

# VirtualBox Server に CUI で hostonly interface を加える

## 環境

* Ubuntu 18.04
* VirtualBox 5.2.22r126460

## さっそく追加してみる

* VirtualBox を動かしているユーザーに切り替えてください、例えば vbox ユーザーであれば

    ```shell-sesssion
$ sudo vbox
    ```

* hostonlyif は全部消しておきます。hostonlyif と dhcpserver を消す方法は boot2docker に [ホストオンリーアダプターを追加する](https://qiita.com/harasou/items/6c937629f7fc90c603e4#%E5%89%8A%E9%99%A4) を参照。
* コマンドは [How can I configure a DHCP server assigned to a Host-only net in virtualbox](https://superuser.com/questions/429432/how-can-i-configure-a-dhcp-server-assigned-to-a-host-only-net-in-virtualbox) からの丸パクリです。

```shell-session
$ VBoxManage list hostonlyifs
（全部消しているので何も出ない）
$ VBoxManage hostonlyif create
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Interface 'vboxnet0' was successfully created
$ VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1
$ VBoxManage dhcpserver add --ifname vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0 --lowerip 192.168.56.100 --upperip 192.168.56.200
$ VBoxManage dhcpserver modify --ifname vboxnet0 --enable
```

### 考え方

hostonly interface には dhcpserver は **付属しない** ので別々に建てて組み合わせるということみたいです。

## できているか検証

* hostonlyifs の DHCP は **Disabled でただしい** です。

```shell-session
$ VBoxManage list dhcpservers
NetworkName:    HostInterfaceNetworking-vboxnet0
IP:             192.168.56.1
NetworkMask:    255.255.255.0
lowerIPAddress: 192.168.56.100
upperIPAddress: 192.168.56.200
Enabled:        Yes
$ VBoxManage list hostonlyifs
Name:            vboxnet0
GUID:            786f6276-656e-4074-8000-0a0027000000
DHCP:            Disabled
IPAddress:       192.168.56.1
NetworkMask:     255.255.255.0
IPV6Address:
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:00
MediumType:      Ethernet
Wireless:        No
Status:          Down
VBoxNetworkName: HostInterfaceNetworking-vboxnet0
```

## おまけ: CUI で **クリップボードの共有** を **双方向** にする

* GUI でいうところのどこかというと赤枠で囲っている部分です

![vbox_clipboard.png](https://qiita-image-store.s3.amazonaws.com/0/209900/9ccaaac7-2d9d-37a2-1dc3-2dbae7e151a0.png)


1. VirtualBox を動かしているユーザーに切り替えてください、例えば vbox ユーザーであれば

    ```shell-session
$ sudo vbox
    ```
2. 現在の vm 一覧から、例では A_VM に対しクリップボードの共有を双方向にします

    ```
$ VBoxManage list vms
"A_VM" {51e22b07-a72a-4624-94f8-7b8c75222e8d}
"B_VM" {666afa45-e0f1-4d62-ad87-2332dfc7e108}
$ VBoxManage modifyvm "A_VM" --clipboard bidirectional
   ```