OmniAICreator/Qiita-1.07M huggingface dataset:
ゼロからプロダクトマネージャーになりたい人に3つのメッセージ

# はじめに
この記事はProduct Manager Advent Calendar 2018の12日目の記事となります。
キャリアの最初をプロダクトマネージャーからスタートし、今現在もPMしながら社長をしているたばてぃーしゃちょーです。
スモールBtoCのベンチャー企業でPMを3年。大企業でサブスクリプションモデルのPMを2年程やっております。

私がPMになった理由としては、5年前のWantedlyでは「エンジニア」「デザイナー」「ディレクター」くらいしか選ぶことができず、
エンジニアリングとデザインはできないからディレクターで応募するしかない！と思ったのがきっかけです。
今となっては自分の中でベストな選択をできて、今の自分があるなと思います。

0→1で事業を創り出したり、1からグロースしていく本物のPMは貴重な人材だと考えています。
本当にできる人は起業した方が良かったりもしますし。

**この記事はプロダクトマネージャーになろうとしている人やなりたい人に向けて記事を書きます。**
他の職種の方には、あまり刺さらないかもしれませんのでご了承ください。

# プロダクトマネージャーとは

> プロダクトマネージャーとは経営学用語の一つ。企業においてマーケティング活動全般の権限と責任を持つ管理者を担当する職種を言う。ここで言われている権限というのは製品の開発から、その製品の宣伝、販売、流通などの広範囲にわたっている。 プロダクトマネージャーとは職種の名称であり職位を示す言葉でなく、必ずしもマネージャー職が担当すると言う意味ではない。現実にはその製品に詳しい一般社員が担当する場合が多い。 wikipediaより

Wikipediaには上記のように記述されていますが、実際にプロダクトマネージャーは企業によって役割や求められる成果が異なる曖昧な職種です。
ただ全ての企業で一致しているのは**「課題を解決する職種」**であるということ。
それは「ユーザーの課題を解決する」ことであったり「経営課題を解決する」こともあり、様々です。
そして**プロダクトの成功に対して責任を持つ職種**でもあります。

そのためプロダクトマネージャーは「mini CEO」であると言われます。
将来プロダクトを創って起業をしたい人にとっては会社の環境を活かすことができるので、起業前の良い練習になります。

# プロダクトマネージャーになりたい人へのメッセージ
## 顧客と接する機会を増やす、もしくは自分がユーザーであれ
C向けサービスも、B向けサービスも同様ですが、顧客に会わなければ本質的にプロダクトや市場の課題を認識することはできません。

本質的な課題を認識できないとどうなるのか。
PMは課題を解決する職種であるにも関わらず、見当違いの物事を課題設定してしまい、結果的に本当の課題が解決されない。
つまり成功に導くことができません。

だからこそ顧客との接点を増やす必要があります。
またC向けサービスであれば、自分がユーザーであるべきだと考えています。
これら2つは本質的な課題を認識する上で非常に効果的です。

ただし顧客は課題を課題だと言語化して教えてはくれません。
プロダクトに責任を持っている人でないと得れない気づきがあります。

ユーザーに憑依して（ユーザー目線になって）プロダクトの課題を見つけていきましょう。

## 意見にNoと言い、嫌われる勇気を持つ必要がある
1つの側面としてプロダクトマネージャーというのは**「プロを活かすプロ」**だと考えています。
最近はエンジニアやデザイナーからPMにジョブチェンする人も多いです。
しかしゼロからプロダクトマネージャーを目指す人にとってはエンジニアリングもできない、デザインもできなく物を作れない人間です。
その中でPMとしてのバリューを発揮するためには、プロを活かしてチームを成功へと導く必要があります。

プロダクトに関わる人間は非常に多いです。
ボードメンバー・エンジニア・デザイナー・マーケター・サポート・バックオフィス・社外関係者・パートナーなどなど。
これらの人間の意見を全てまとめるのは不可能です。
そのためには誰かの意見にNoと突きつける事が多々あります。

冒頭にも記述しましたが、プロダクトマネージャーはプロダクトの成功に責任を持ちます。
成功しなければプロダクトマネージャーの責任です。
メンバーの事を尊重しつつも成功のために、嫌われる勇気が必要です。

## 絶対に成功すると思って企画をすべし
企画をして改善することだけがPMの仕事ではありませんが、プロダクトに商品を追加したり、改善することが多いです。
自分の当たると思った企画であったり、トップダウンの企画等あると思います。
共通して言えるのは、プロダクトに責任を持っている人である以上、絶対に成功すると思って打席に立ち続ける必要があります。

企画は最後まで推進して、結果を確認して、初めて価値になります。
自分が成功すると思って初めて、人に思いが伝染します。この伝染した思いはプロダクトへと反映され、ユーザーも気づきます。
本当かどうかはPMになって試してみてください。

# 最後に

この記事のペルソナはPMになり始めた当時の自分です。
私自身PMとして失敗を重ねてきましたし、独りよがりだった事も多々あるなーと思ってます。
プロダクトマネージャーは一人でプロダクトを世の中に提供できません。
でも、人が欲しがる良いプロダクトをこれからも作れるように、私も頑張ります。

# P.S
ご意見やランチのお誘いはぜひ[Twitter](https://twitter.com/gahara_p)からお願いします！
Failed to create provisioning profile

最近Developer Programに登録したので、躓いたというか、少し引っかかったところのメモをと。何度もやってる人なら何だそんなこと、なのかもしれません。

#前段階
・Developer Programに参加するまでは普段遣いのAppleIDがあった。
・ぐぐったら別IDにすべし、とあったので素直に別のAppleIDを作ってそっちで課金した
・ID切り替えるとiCloudのデータだのがデスクトップから消えたりしてめんどくさいので、AppleIDマージできないの？

→出来ません
（家族共有についてはちょっと手を出してません。アプリならイケるのは知ってますが）

・ということで、XCodeでAppleID追加して、でいいかとTeamを切り替えた


#signingでエラー発生
Failed to create provisioning profile.
The app ID "[Bundle Identifier]" cannot be registered to your development team. Change your bundle identifier to a unique string to try again.

が出たわけです。二行目以降、これについては前のAppleIDでその名前でテストしたりしていたことで、XCodeが自動登録しちゃってたってことなんだと思うので、BundleIDについては内容を替えるしかないんだろうと思う。ので、そっちについてはアポストロフィの代わりにハイフン入れてたりしたのを削って解決。一行目の方についてはググってみたわけですけども、実機の登録がされてないから云々と。最初はMacが登録されていないとかなのかと思ったのですが、Certの方にはMacが登録されているので、Devicesの方にテスト用の実機が必要になるのかな、ということで、今は私の部屋でiPod扱いされているiPhone6sを登録することに。まぁ、元々ターゲットはこの辺りにする予定だったので（5sのほうがいいのかなーとも思ったのですが）。

<img width="300" alt="スクリーンショット 2018-12-11 10_Fotor.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/325109/12ece677-b2d1-b91e-7283-e903d0e46ecc.jpeg">

実機をMacに繋いでXCodeのWindow→Devices and Simulatorsを選ぶと繋いだ実機が表示されるので、情報欄のIdentifier（赤線で囲ったところ）の隣の実際のID（画像では消してますが）を選択してコピー。その内容と実機につけた名前をDeveloperサイトのCertificates,Identifiers & Profilesの下の方にあるDevicesで右上の＋を押してそこに入力。するとOSのバージョンやら情報が出るので、下部のRegisterボタンを押して登録完了。後はDevices一覧に普通に出るようになります。

で、XCodeに戻ってRetryすれば、綺麗さっぱりエラーは解消となりました。
UMLを学ぶETロボコンメンバーに送るUML講座３〜オブジェクト図〜

#内容アウトライン

　本記事ではオブジェクト図について記述します。
　・オブジェクト図って？
　・オブジェクト図を構成する要素
　・実際の描くときの流れは？
　・まとめ

#オブジェクト図って？
　オブジェクト図は、システム化しようとしているモノ、コトにどのような情報が付随しているかを考え、さらにオブジェクト間にあるつながりを表現することで、**特定時点におけるシステムの状態を表現するための図です**。

 **システムの構造を具体的に捉える際に有用**なので、クラス図を描く前段階として用いることが多いです。

#オブジェクト図を構成する要素
　オブジェクト図を構成する要素には以下のようなものがあります。

・オブジェクト
・リンク
・属性

　イメージの図としては以下のようになります。

<img width="440" alt="スクリーンショット 2018-12-11 12.01.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/219573/b6e2b1e1-2771-f641-d351-55341eedbb56.png">



　**長方形で表現されているもの全てがオブジェクト**で、**オブジェクト間の関係を表す線をリンク**と呼びます（属性がないオブジェクト同士もリンクで繋げます）。
　**属性は横線で二分割されたオブジェクトの下側に書かれているもの**です。

　**リンクは関連があるオブジェクト同士を線で結んでやれば良いだけ**です。なので、これ以降では説明を省きます。



####オブジェクトの書き方詳細
　**オブジェクトを描く上で、オプションがかかるのは名前の描き方だけ**です。
　反対に、長方形を描くということと、名前の下にはアンダーラインを引く、という点はどんな時でも共通しています。

　何も省略せずにオブジェクトを表現すると以下のようになります。

　※夏目漱石の小説「こころ」を例にとっています。
<img width="211" alt="スクリーンショット 2018-12-11 13.02.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/219573/44dfb35a-f193-6701-5a24-50ff211c8e53.png">


　**「：」の左側をオブジェクト名、「：」の右側をクラス名**と呼びます。それぞれソースコード上で言うところのインスタンスとクラスです。

　**オブジェクト名は、どちらか一方を省略して表現することができます**。

<img width="472" alt="スクリーンショット 2018-12-11 13.02.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/219573/2cb6198a-1f76-8f02-87b8-e987cb724e96.png">



　オブジェクト名だけで名前を表現するときは右側に「：」はつきませんが、**クラス名だけでオブジェクトを表現する場合は左側に「：」をつけることに注意しましょう**。

　**どちらか一方の名前だけでオブジェクトを表現するのに足りている場合に、無駄な部分の省略を行います**。
　プログラミングをしていれば、たくさんインスタンスを作る予定がないクラス（例えば属性を持たず、一連の処理だけを請け負うクラス）ができることがあると思います。そういった場合にはクラス名があれば用が足ります。オブジェクト名を書くことに意味はないので、オブジェクト名は省略の対象になります。

####属性書き方詳細
　**属性はオブジェクトの持っている情報のことです**。オブジェクトを横線で二分割したその下に**「'属性名'＝'属性値'」という形式で属性は記述されます**。

　以下がその例です。適当にクレジットカードを例にしています。

<img width="289" alt="スクリーンショット 2018-12-11 12.16.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/219573/706c5526-8dc2-4722-df9f-45fa34b87c2f.png">


#実際に書く時の流れは？
　１.構築するシステムに関連するモノ、コト、を抽出。
　２.それぞれに応じたオブジェクトを作成。
　３.関連のあるオブジェクト同士をリンクでつないで完成。

#まとめ
　・オブジェクト図にはリンク、オブジェクトがあり、オブジェクトは属性を持つことがある。
　・システムのモノ、コトの構造、意味的なつながりを考えるのに有効。
　・クラス図を描く前段階としてオブジェクト図は描かれる。
chain 技術について

こんにちは，梅濁酒です。
今回は，[Qiita BlockChain Advent Calendar 2018](https://qiita.com/advent-calendar/2018/blockchain) の記事です。

bitcoin の核をなす技術として世間を騒がせる，
block chain(=ブロックチェーン)技術ですが，
今回は，その内の chain 技術について重点的に，
色々な視点から書きたいと思います。

# block chain 技術 の定義
　今回の記事では，私が [twitter で呟いて](https://twitter.com/umedoblock/status/1059399033649750016) した以下の block chain の定義を元にお話をします。

    # block 化技術
    電子情報を一単位に区切り，
    その一単位に対改竄性を含ませる技術，

    # chain 技術
    一単位に区切った電子情報を，
    参加者の合意に基づいて，
    一方向に連ねる技術，

    # block chain 技術
    上記技術の組み合わせを，
    block chain 技術と呼ぶ。

## 意識して欲しい事
今回の定義では，
block 化技術は，chain 技術を前提としません。

chain 技術は，その前提として，block 化技術を必要としています。
しかし，厳密に「chain 技術」のみ評価すれば，
chain 技術の連ねる「一単位の電子情報」に，
「block 化技術の要件となる対改竄性は必須」ではありません。
厳密に「chain 技術」のみ評価すれば，
**「一単位の電子情報」に，対改竄性は，あってもなくても良い。**
のです。

\# 全部書いて思ったけど，一部，一方向性のない `Justice of !` がある !

##「block 化技術」の具体化
e-mail の電子署名が分かりやすいと思います。

##「chain 技術」の具体化
chain 技術の具体化として有名なのは，
やはり，暗号通貨ですね。
chain 技術の名称は，
Proof of Work, Proof of Stake, ...
でしょうか。

---
色々難しいですね。
なんか，`Proof of ~~~`って真面目な気がしませんか？
学問的なというか。雰囲気が何か。

さあ，気を抜いて。
以下では，chain 技術の **`Justice of !`** について語りたいと思います。

# Justice of !
先導する者の正義を貫いて，その正義に賛同する者で，集合を一繋ぎとしてしまう。
そんな，一繋ぎの集合を作ってしまえば，`先導するものの正義` は，立派な chain です。
\# なんか，「立派な chain」は「宗教」のように思えてしまいますね・・・

以下では，私の思いついた色々な `Justice of !` について書きたいと思います。

\#`Justice of !` には，遊び的な意味を含ませたい。ネタ的な意味を含ませたい。

## Justice of Me.
我が正義なり。
開発者が法です。
開発者が，rule book な block chain です。

この考えは，多くの open source project で見受けられると思います。
そういう意味では，github の repository なんかも，
block chian と言えると思います。

昨今，block chain 界隈，特に，暗号通貨の開発者の方達が fork していくのは，
`Justice of Me.`
が開発者の精神に根付いているからと思います。

## Justice of Punctual.
    JoP
    時間を固く守る事が正義。

    block 作成の時間単位は10分毎。
    timestamp で10分毎に区切る。
    積極的に提出するのは有利になる参加者。
    次の単位に含ませることはない。
    時間に遅れた場合は，単位に含まない。
    transaction を多くする方が有利。

## Justice of Shiba.
    JoS
    柴犬が正義だ。柴犬が一番可愛いんだ。

## Injustice of You.
    IoY
    悪いのは，あんたなんだぞ。
    あんたも悪いんだぞ。
    
    巷でよくある話。

---
ここまでご覧いただきありがとうございます。

以上，`chain 技術` について，私の思うことを書き連ねました。

もし，私のする `chain 技術` の話について興味があれば，github の [misou/idea.txt](https://github.com/umedoblock/misou/blob/master/idea.txt)をご覧ください。
開発中の味噌荘について考える上で思いついた，chain に関する雑多なことを書き連ねています。

[twitter](https://twitter.com/umedoblock) にて適当に色々な事を呟いていますので，興味があれば follow して下さい。
Ktor で Hello World までのメモ

Ktor で Hello World までやってみたメモです。この記事にはほとんど何の情報もありませんが、これから初めたい方の手助けに少しでもなれば幸いです。

- 公式サイト
  - https://ktor.io
- GitHub
  - https://github.com/ktorio/ktor

## IntelliJ IDEA のダウンロード

IDE として [IntelliJ IDEA](https://www.jetbrains.com/idea/) のサイトから IntelliJ IDEA の Community 版 をダウンロードします（Free）。

## Ktor プラグインのインストール

IntelliJ IDEA の開始画面で [Configure] -> [Plugins] を選択し、Ktor のプラグインを検索・インストールします。

<img width="600" alt="スクリーンショット 2018-12-10 14.44.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/35733/390361cd-1c45-a13e-9cff-5b20fc1a6986.png">

## Ktor のプロジェクトの作成

IntelliJ IDEA の開始画面の [Create New Project] から下図のように Ktor のプロジェクトが作成できるので、適当に最後まで進んでプロジェクトを作成します。

<img width="600" alt="スクリーンショット 2018-12-10 14.46.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/35733/fcf38078-5a21-cc1f-328a-389dca1e0d6c.png">

作成されたプロジェクト内の `Application.kt` を次のように編集し、

```kotlin:Application.kt
package com.example

import io.ktor.application.*
import io.ktor.response.*
import io.ktor.routing.get
import io.ktor.routing.routing

fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {
    routing {
        get("/") {
            call.respondText("Hello World")
        }
    }
}
```

`main` 関数の横の再生ボタンを押下します。

<img width="600" alt="スクリーンショット 2018-12-10 15.01.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/35733/2d83fca8-be4a-e463-0beb-d867efce9ba0.png">

次のようにメッセージが表示されるので、メッセージ最後の `http://0.0.0.0:8080` にブラウザでアクセスします。

<img width="800" alt="スクリーンショット_2018-12-10_14_58_42.png" src="https://qiita-image-store.s3.amazonaws.com/0/35733/333e9be5-464a-f724-99c2-3cab7b3cf2dd.png">

<img width="500" alt="スクリーンショット 2018-12-10 15.02.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/35733/627f6b6c-5965-b908-879d-2a0564deda81.png">
無料の範囲内で出来るサイトパフォーマンス見える化

![adv2018.gif](https://qiita-image-store.s3.amazonaws.com/0/217528/f4a43011-7518-cea6-8738-5ae49297899f.gif)

[aratana Advent Calendar 2018](https://qiita.com/advent-calendar/2018/aratana) 12日目の記事です。

11日目の記事は新卒[@amynakahara](https://qiita.com/amynakahara)さんの[業務で使うGitコマンドはGUIでも使用できるのか](https://qiita.com/amynakahara/items/5136322943113a9aa894)でした。
入社してはじめてgitを触る人も多く、git操作に苦戦する人も多いと思います。
なので入社後はじめてgitに触る人に読んでほしいと思う記事の１つです。

私の記事では無料の範囲内で出来るサイトパフォーマンスの見える化について書いていこうと思います。

## サイトパフォーマンスってなに？

サイトパフォーマンスとは、文字通りサイトのパフォーマンスです。
どのような指標を扱うかというと、サイトの描画にかかる時間を軸に考えます。
パフォーマンスの良いページの例を上げると、[阿部 寛のホームページ](http://abehiroshi.la.coocan.jp/)はすごく早くパフォーマンスの良いサイトと言えます。

このサイトパフォーマンスというものはすごく大事です。
コンテンツがどんなに良くても重くて見ることが出来ないサイトではコンテンツの評価もされません。
サイトパフォーマンスが悪いと、離脱率が上がるというデータも出ています[1]。
今回はサイトパフォーマンスを見えるようにし、改善につなげるきっかけを作る内容を書きました。

## 計測する

こちらの[gas-webpagetest](https://github.com/uknmr/gas-webpagetest)を使用しました。
こちらはGASのトリガーを使い、webpagetest-APIの結果をスプレッドシートに保存していくスクリプトです。下記画像のようにデータが溜まっていきます。
こちらを使い、サイトパフォーマンスのデータを数字としてスプレッドシートに保存していきます。
このデータ蓄積を２週間くらい計測してみると、だいたいの傾向が見えてきます。

<img width="1100" alt="スクリーンショット 2018-12-10 18.41.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/217528/8fb0dda5-bf52-9234-befe-65f12425fed1.png">

## グラフにする

グラフ化するために、[Google Data Studio](https://datastudio.google.com/)を使います。
集めたデータを評価するための方法として、同じようなデータを集めると比較し評価しやすいです。
たとえば目標にしているサイトや、自身のサイトと似たようなサイトのデータを集めると比較対象としては有効です。比較のため４サイト計測しました。
今回グラフとしてお見せしている評価値は[SPEED INDEX](https://1000ch.net/posts/2017/speedindex-for-web-performance.html)を使っており、サイトパフォーマンス全体の傾向が掴める指標のひとつです。

![スクリーンショット 2018-12-11 11.03.52.png](https://qiita-image-store.s3.amazonaws.com/0/217528/bba842fd-b39b-09e4-0ecd-48f1427f5943.png)

## グラフからわかること

SPEED INDEXは数字が大きいほど描画にかかる時間が長くなる指標です。そのため数字の大きいサイトAは、数字の小さいサイトDに比べて重いことがわかります。
また赤色のサイトBは9月26日を境にSPEED INDEXの値が大きくなっています。この日変更した内容が影響しているのか、この日以降のデータもサイトパフォーマンスが悪くなった状態で安定してしまいました。
このようにサイトパフォーマンスが見えるようになると、普段気にしないプログラムの計算時間の影響を見てとれるようになります。

## 改善する

計測をしたら、その値を使ってパフォーマンスの改善を考えていきます。
例えば下記グラフはhtmlのファイルサイズをキロバイト単位で表示しています。
一目瞭然で赤色のサイトB_検索ページはファイルサイズが他のサイトに比べて平均値より大きいことがわかります。
サイトB_検索のhtmlの中身を確認すると、使用していないのにスクリプトで自動生成しているソースが2MB近くあり、その無駄を削減することで描画開始が2.6秒程度早くなりました。
こうしてサイトのどこが弱点なのかを掴み、どう改善するとどう効果があるのかを把握することができます。

![スクリーンショット 2018-12-11 11.29.20.png](https://qiita-image-store.s3.amazonaws.com/0/217528/de1222bc-0c20-de08-bdc3-7db5ff7b075c.png)

## まとめ

サイトパフォーマンスを数字として掴むことって、普段自分のサイトパフォーマンスってどうなんだろう？使いやすいのだろう？を客観的に説明出来るようになります。
また自分の組んだスクリプトが与える、時間的影響も視覚的にみることができ、改善するためのきっかけづくりにもできました。
コンテンツ重視のサイトであればあるほど、パフォーマンスを把握しやすい状態での開発が望まれます。

## 明日のaratana Advent Calendar 2018
明日の[aratana Advent Calendar 2018](https://qiita.com/advent-calendar/2018/aratana)は新卒の迫地くんの投稿です！
楽しみにしています！！！

## 参考
[1][3秒が許容範囲 - Webサイトのパフォーマンスが重要な理由](http://news.mynavi.jp/news/2012/12/11/025/)
[2] [Webpagetestから始める継続的パフォーマンス改善](http://azu.github.io/slide/2018/roppongijs/webpagetest-performance.html?utm_source=newsformat.jp&utm_medium=RSS-matome)
プログラミングを始めて４ヶ月目に参加した初のハッカソンで後悔したこと

2018年12月8日〜９日に渋谷で行われた第一回WEハッカソンにWEメンバーとして参加しました！
プログラミングを始めて４ヶ月目での初ハッカソン...そこでの経験を主に共有していきたいと思います。
プログラミング初心者でハッカソンに興味はあるけど一歩が出ない。という方の参考になれば嬉しいです！！
##自己紹介

勉強した言語は↓
HTML＆CSS 1.5ヶ月
jQuery 1.5ヶ月
Python 1ヶ月

を主にプログラミングスクールで学びました。
もちろんこれが初ハッカソン！！

##WEハッカソン基本情報
第1回の今回は、

Ruby on Railsチーム 3名
Python1 チーム 3名
Python2 チーム 3名
Python3 チーム 3名
Python4 チーム 3名 <- 僕ここ

の計5チームで12月8日10時から9日
18時までの時間で、他のチームより良いプロダクトを作るために競い合った。

今回のハッカソンテーマは**クリスマス！**
そして**WatsonAPI**を使うこと！

使用言語はPython

##後悔したこと

###後悔1　事前にアイデア案をある程度考えておくべきだった

前述した通りテーマはクリスマスでWatsonAPIを使うことは決まっているのにも関わらず当日チームで考えた方が良いと思い、何もアイデアを考えなかった。結果アイデアを考える時間を含めての2日間で最初の２時間をアイデア決めに費やしてしまった。
チームのメンバーそれぞれでいくつかアイデアを考えてきて、それを元にどれにするか決めて具体的にどのように開発していくか相談していくのがベストだと感じた。


###後悔2　事前のアウトプットの勉強が少なかった。

今までプログラミング勉強はインプットだけだったと実感。実際の開発ではインプットの知識だけではできないことが多くあり、やはり簡単なプロダクトを作ってみるなどアウトプットの作業をしておく必要があった。特にJSONファイルの扱い方や関数のルール、変数スコープなど学んだつもりでいたが、実際使ってみると全然理解しておらず、基本的なところで時間を取ってしまった。

プログラミング言語の勉強というより**開発を意識した勉強をする必要**があると再確認できた。


###後悔３　チーム内のコミュニティケーションが少なかった。

普段は一人で作業を行うため、わからないところやエラーが出ても、プログラミングスクールにいない限りは時間をかけてでも、解決しなければならない。
チームに相談すれば良いものを一人で解決しなければと、無駄に時間を費やして問題点を解決をしようとしてしまった。

**チーム開発のできないところを補う**というメリットを活用できなかった。

また、チームの他のメンバーはプログラミング経験が多く、リードしてもらいっぱなしで、プログラム全体の内容に関して理解しきれていないことが多々あった。
今後のチーム開発では頻繁にコミュニケーションをとりたいと思う。



##逆に良かったこと

悪いところをツラツラと書きましたが、逆にこれやって良かったということも共有しておこうと思います。

###事前にGit・Githubを理解するために1人でチーム開発したこと


ハッカソンを行う上でGit・Githubを利用することは知っていたので最低限Git・Githubだけは使えるようにしておこうと簡単にHTMLを使って1人チーム開発をしました。
これらが使えないとチーム間での連携がうまくいかない上、トラブルも起きてしまうと思ったのでハッカソンの実施が決まってから最優先して使えるようにしました。（まだ全然わかっていない）
Git・Githubの使い方は参考書を読むよりも実際に試した方がイメージがつきやすく、ハッカソン本番でもあまり戸惑うことはなかったかと思います。
こちらの記事を参考に使い方を覚えました[チーム開発 GitHubの使い方](https://qiita.com/syougun360/items/013229aeddec08121474)

###事前にWatsonAPIがどんなものか一つ使って見たこと
ハッカソンでWatsonAPIを使うことが決まった時WatsonAPIなんて使ったことがなかった。さらに言うとAPI自体使ったことがなかったので使い方を知るために簡単そうなWatsonAPIのLanguage Translator(言語変換)を使って遊んで見たことで、ハッカソンではある程度スムーズに使えたと思う。

###ご飯を食べ過ぎなかったこと
ハッカソンは２日間という長時間なのでもちろん途中昼食をとったり夕食とったりするのですが、僕の場合食べ過ぎると使い物にならなくなるので
腹6、7分目でとどめたことで頭の回転がそこまで落ちなかった気がします。
チョコレートを少しずつ食べてたのも糖分が取れて良かったのかも...

##不安しかなかったハッカソン

ハッカソンと聞いただけでなんだか敷居が高く感じますが、実際はみなさん楽しもうという意識でやっていて雰囲気も和やかです。
WEでハッカソンを実施することになって本当に不安しかなかったのですが、参加してみると他の人のコードを描く姿が見れて、そこでの豆知識や新たな課題など得られることはたくさんありました！
割と**事前準備がかなり大事**だと実感しました。



##感想
後悔したこと・良かったこと書いてきましたが総括すると
**ハッカソン楽しいかった！**

そして、優勝されたPython1チームおめでとうございます！！
そして、企画・運営を行ってくれたWE代表の[渡辺さん](https://qiita.com/ahpjop)
本当にありがとうございました！
rubyハッシュのいろいろ

#ハッシュとは
・複数の値をキーとバリュー{key: "value"}の形で持つことができる
{fruits: "apple"}の場合キーが:fruitsでバリューが"apple"
・連想配列とも呼ばれる


#ハッシュのとり方

```test.rb
①
p = { "key" => "value" }
=> {"key"=>"value"}

②
p = { :key => "value" }
=> {:key=>"value"}

③
p = { key: "value"}
=> {:key=>"value"}

④
p = {key: :value}
=> {:key=>:value}
````

・『:』はsymbol型、『""』はstring型
・①②はハッシュロケット(=>)を使った記法。古い書き方。基本的には③④が推奨されている。
　　=>だと記述量も増え、読みづらいコードになるため。またシンボルの方が実行速度が早い


#引数にハッシュを使う場合
```test.rb
  def  self.fruits_price (apple: "100", orange: "200")
     p "#{:apple} #{apple}円" 
　　　　　　　　　　p "#{:orange} #{orange}円"
  end

-----------------------------------------------------
#コンソール
#pry(main)> Test.fruits_price
#"apple 100円"
#"orange 200円"
#=> "orange 200円"

````

{}は省略できる

```test.rb
  def self.fruits_price apple: "100", orange: "200"
    p "#{:banana} #{banana}円"
  end

-----------------------------------------------------
#コンソール
#NameError: undefined local variable or method `banana' for #<Class:0x007febae21cf18>

````
ハッシュに設定していない値を取ろうとするとエラーになる


#ハッシュのSymbol型とString型

####シンボル(Symbol)とは
・名前という概念を表すオブジェクト
・『:』をつける
・内部では整数で管理され、コード上では文字列のように表現される
・同じ内容のシンボルはかならず同一のオブジェクトになる

####ストリング(String)とは
・文字列を表すオブジェクト
・引用符で囲った文字列リテラルを使う
・同じ内容の文字列でも、管理する整数値は異なる

```test.rb

#シンボルの場合
a = :hoge
b = :hoge
a.equal?(b)
#=> true
a.object_id 
#=> 13212508
b.object_id 
#=> 13212508

#ストリングの場合
a = "hoge"
b = "hoge"
a.equal?(b)
#=> false
a.object_id
#=> 70325103742880
b.object_id 
#=> 70325061551180
````

####シンボル(Symbol)とストリング(String)の使い分け
・シンボルは何度使っても同一の値であるためメモリを圧迫しない
・名前や住所、メッセージなど文字列自身がデータの場合はストリングを使う
・ハッシュのキー、メソッドに渡すクラス名/メソッド名/変数名/定数名、ステータス名(性別・国籍)など文字列自体がデータではないときにシンボルを使う

#ハッシュを結合する
mergeメソッドを使うとハッシュを結合できる

```test.rb
hash1 = {fruits: "apple"}
#=> {:fruits=>"apple"}
hash2 = {price: "100"}
#=> {:price=>"100"}
hash3 = hash1.merge(hash2)
#=> {:fruits=>"apple", :price=>"100"}
````

ただしすでに存在するキー(シンボル・ストリングに関わらず)を使うと、ハッシュの更新として処理される。

```test.rb
hash1 = {fruits: "apple", meet: "beef"}
#=> {:fruits=>"apple", :meet=>"beef"}
hash2 = {fruits: "orange"}
#=> {:fruits=>"orange"}
hash3 = hash1.merge(hash2)
#=> {:fruits=>"orange", :meet=>"beef"}
````
【メモ】Javascriptによって追加された要素にJavascriptで何かをする

remodal.jsという鬼便利なプラグインでモーダルウインドウは実装しておりましたが、脱ぢぇーくえりーの為にそれっぽいものを自作しようと動き出した際に躓いた。
モーダルといえばレイヤー（よくある黒くて半透明なやつ）用のDOMが必要になるんだけど、予めコードの中にレイヤー用のDOMを仕込ませておいて表示非表示させれば比較的簡単なんだろうけど、ここはJavascriptで出し入れさせたい。
ぶっちゃけ、表示させるだけなら苦労しないけど、これを非表示にするために何らかの処理を走らせる必要があるのですが、いかんせんjavascriptで追加された要素なので、ただ単にそれに対して処理を走らせても存在していないもの扱いとなり動かない。

```javascript
$(document).on('EVENT', 'TARGET', function(){
  //処理
});
```
JQUERYならこんなんで監視しつつ好きなようにゴニョゴニョできたが、Javascriptではそう簡単にはいかない（メンドクサ・・・）
で、調べた結果、MutationObserverなるものを使い監視する必要があるとのことふむふむ。

まずはレイヤーDOMをBODY直下に追加する関数をザクッと（HTMLはめんどくさいので割愛）

```javascript
function setOverlay(){
  document.addEventListener('DOMContentLoaded', function(){
    var triggerNode = document.getElementById('modal');
    triggerNode.addEventListener('click', function(){
      var parentNode = document.getElementsByTagName('body').item(0);
      var newNode = document.createElement('div');
      newNode.id = 'overlay';
      parentNode.insertBefore(newNode, parentNode.firstChild);
    });
  }, false);
};
setOverlay();
```
ここで前述した監視役を投入

```javascript
function DOMmonitor(){
  document.addEventListener('DOMContentLoaded', function(){
    var targetDOM = document.getElementsByTagName('body').item(0);
    var observer = new MutationObserver(function(){
      if(document.getElementById('overlay') != null){
        console.log('overlayが追加されました');
      }
    });
    observer.observe(targetDOM, {childList: true});
  }, false);
}
DOMmonitor();
```

これでレイヤーが追加されるとコンソールにメッセージが出ます。
なるほどねえ・・・。
めんどくささ半端ないｗ
自作モーダル完成までの道のりは遠いorz

最終的にレイヤーの出し入れだけの機能はこんなんになりました・・・

```javascript
function setOverlay(){
  document.addEventListener('DOMContentLoaded', function(){
    var body = document.getElementsByTagName('body').item(0);
    var triggerBtn = document.getElementById('modal');
    triggerBtn.addEventListener('click', function(){
      var overlay = document.createElement('div');
      overlay.id = 'overlay';
      body.insertBefore(overlay, body.firstChild);
    });
    var observer = new MutationObserver(function(){
      if(document.getElementById('overlay') != null){
        overlay.addEventListener('click', function(){
          body.removeChild(overlay);
        });
      }
    });
    observer.observe(body, {childList: true});
  }, false);
};
setOverlay();
```
Github – いつの間にかWikiの記法が増えている件 ( MarkDown + Textile MediaWiki etc... )

# ご活用ください。

これなんなの？ってひとつずつ軽く調べてみたら勉強になりそう？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/350fd9c1-4483-2fb2-9548-c60dd43e81d3.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
IoTデバイスがないなら、スマホを使えばいいじゃない - ブラウザベースのIoTセンサ＆コールバック


[こちらの記事](http://www.denzow.me/entry/2017/12/16/225241)をみて、ラズパイでトイレセンサーを作ろうと、千石電商で一式１万円くらいで揃えてきた帰りに、[こちらの記事](https://ics.media/entry/4095)をみて、あーこれブラウザでできんじゃね？ということで作りました。

https://iot.dqc.jp

- 照度センサと近接センサは `Firefox for iOS/Android` でのみ動きます
- 傾斜センサは、スマホならいけると思います

詳細は下記：
https://iot.dqc.jp/howto
Node.jsのCLIツールで、Node.jsのバージョンを確認する

Ionicのソースみていて、あとで使えそうな気がしたので覚書。

IonicのCLIコマンド初期化時にこういうコードが走る。

```
var semver = require('semver');

if (semver.lt(process.version, 'v6.4.0')) {
  console.log('ERR: Your Node.js version is ' + process.version + '. Please update to the latest Node 8 LTS.');
  process.exit(1);
}
```

semberで`proccess.version`の値を比較して、古いならerrorでexitする。

あとこれも何気に便利そうな気はしている。

```
process.on('unhandledRejection', function(r) { console.error(r); });
```
raspberry pi 1でtensorflow lite

#概要

raspberry pi 1でtensorflow liteやってみた。
raspberry pi 1 model bに、インストールしてみた。

#環境

Raspberry pi 1 model b(element14)
sd-card 8GB
raspbian 2016-11-25 jessie with pixel

#インストール

git cloneして、armv6lでビルドした。

#確認

binに、benchmark_modelとminimalができた。
libに、libtensorflow-lite.aができた。

./minimal xor_model.tflite

```
=== Pre-invoke Interpreter State ===
Interpreter has 13 tensors and 4 nodes
Inputs: 8
Outputs: 1

Tensor   0 activation/Tanh      kTfLiteFloat32  kTfLiteArenaRw         32 bytes ( 0.0 MB)  1 8
Tensor   1 activation_1/Sigmoid kTfLiteFloat32  kTfLiteArenaRw          4 bytes ( 0.0 MB)  1 1
Tensor   2 dense/BiasAdd        kTfLiteFloat32  kTfLiteArenaRw         32 bytes ( 0.0 MB)  1 8
Tensor   3 dense/MatMul_bias    kTfLiteFloat32   kTfLiteMmapRo         32 bytes ( 0.0 MB)  8
Tensor   4 dense/kernel/transpose kTfLiteFloat32   kTfLiteMmapRo         64 bytes ( 0.0 MB)  8 2
Tensor   5 dense_1/BiasAdd      kTfLiteFloat32  kTfLiteArenaRw          4 bytes ( 0.0 MB)  1 1
Tensor   6 dense_1/MatMul_bias  kTfLiteFloat32   kTfLiteMmapRo          4 bytes ( 0.0 MB)  1
Tensor   7 dense_1/kernel/transpose kTfLiteFloat32   kTfLiteMmapRo         32 bytes ( 0.0 MB)  1 8
Tensor   8 dense_input          kTfLiteFloat32  kTfLiteArenaRw          8 bytes ( 0.0 MB)  1 2
Tensor   9 (null)               kTfLiteNoType  kTfLiteMemNone          0 bytes ( 0.0 MB)  (null)
Tensor  10 (null)               kTfLiteNoType  kTfLiteMemNone          0 bytes ( 0.0 MB)  (null)
Tensor  11 (null)               kTfLiteNoType  kTfLiteMemNone          0 bytes ( 0.0 MB)  (null)
Tensor  12 (null)               kTfLiteNoType  kTfLiteMemNone          0 bytes ( 0.0 MB)  (null)

Node   0 Operator Builtin Code   9
  Inputs: 8 4 3
  Outputs: 2
Node   1 Operator Builtin Code  28
  Inputs: 2
  Outputs: 0
Node   2 Operator Builtin Code   9
  Inputs: 0 7 6
  Outputs: 5
Node   3 Operator Builtin Code  14
  Inputs: 5
  Outputs: 1
```

./benchmark_model --graph=xor_model.tflite


```
STARTING!
Min num runs: [50]
Min runs duration (seconds): [1]
Inter-run delay (seconds): [-1]
Num threads: [1]
Benchmark name: []
Output prefix: []
Min warmup runs: [1]
Min warmup runs duration (seconds): [0.5]
Graph: [xor_model.tflite]
Input layers: []
Input shapes: []
Use nnapi : [0]
Loaded model xor_model.tflite
resolved reporter
Initialized session in 4.23ms
Running benchmark for at least 1 iterations and at least 0.5 seconds
count=2963 first=385 curr=19 min=18 max=20218 avg=30.4077 std=377

Running benchmark for at least 50 iterations and at least 1 seconds
count=7331 first=43 curr=20 min=17 max=298 avg=22.4294 std=7

Average inference timings in us: Warmup: 30.4077, Init: 4230, no stats: 22.4294
```


以上。
macOS Mojave上でx10のコンパイルエラー

macOS Mojaveでx10言語で書かれたコードがコンパイルできなくなったのでトラブルシュートの記録を残しておく

環境

- macOS mojave 10.14.1
- Apple LLVM version 10.0.0 (clang-1000.11.45.5)
- x10 2.6.1
    - native版 (c++にコンパイルするタイプのもの）

# 経緯

x10で書かれたコードを`x10c++`コマンドでビルドしようとしたところ以下のようなエラーが出てコンパイルできなくなった。
x10は公式のダウンロードページからダウンロードしたもの。
http://x10-lang.org/releases/x10-release-261.html

```shell-session
$ x10c++ -d build Main.x10 -VERBOSE_CHECKS

x10c++: clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated]
     clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9 [-Wdeprecated]
     warning: include path for stdlibc++ headers not found; pass '-std=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
     In file included from caravan/Main.cc:3:
     In file included from ~/work/caravan/caravan_scheduler/build/caravan/Main.h:4:
     In file included from ~/work/x10-2.6.1_macosx_x86/stdlib/include/x10rt.h:6:
     /Users/murase/work/x10-2.6.1_macosx_x86/stdlib/include/x10aux/config.h:89:12: fatal error: 'iostream' file not found
     # include <iostream>
     ^~~~~~~~~~
     1 warning and 1 error generated.

    <以下、同じエラーが続く>
```

エラーを見てもよくわからないが、おそらくx10cからc++に変換したあと、c++をコンパイルしようとしているところでエラーが起きている模様。
clangに渡すコンパイラオプションが正しくないのかもしれない。

# 試行錯誤

この問題を解決するためにx10のソースからビルドしてみる。

```shell-session
$ git clone https://github.com/x10-lang/x10.git
$ cd x10
$ git checkout -b SF_RELEASE_2_6_1 refs/tags/SF_RELEASE_2_6_1
$ cd x10.dist
$ ant -Doptimize=true -DNO_CHECKS=true -Davailable.procs=8 dist
```

これで`x10c`, `x10c++`が新規にビルドされた。

ここで作成されたx10コンパイラを使って、x10アプリをコンパイルすると先ほどのエラーはでなくなり、無事にコンパイルが通る様になった。
しかし、ビルドされたアプリを実行するとsegmentation faultが起きてしまう。

```shell-session
$ ./a.out
segmentation fault
```

LLDBででバッグしてみたところどうやら、GCが悪さをしているらしいことが判明。

```shell-session
$ lldb ./a.out
(lldb) target create "./a.out"
Current executable set to './a.out' (x86_64).
(lldb) run
Process 71498 launched: './a.out' (x86_64)
Process 71498 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x7ffeefc00000)
    frame #0: 0x0000000100518695 libx10.so`GC_push_all_eager + 133
libx10.so`GC_push_all_eager:
->  0x100518695 <+133>: movq   (%rax), %rax
    0x100518698 <+136>: movq   %rax, -0x30(%rbp)
    0x10051869c <+140>: movq   -0x30(%rbp), %rax
    0x1005186a0 <+144>: movq   -0x48(%rbp), %rcx
Target 0: (scheduler) stopped.
```

そこで、GCをオフにしてx10cを再ビルドすることにした。

```shell-session
$ ant -Doptimize=true -DNO_CHECKS=true -Davailable.procs=8 -DDISABLE_GC=true dist
```

このx10コンパイラでビルドした結果、ようやくsegmentation faultが起きずに実行できる様になった。
ただし、これは緊急回避的な処理で本質的な問題解決ではない。当然GCが行われないので、長時間走らせるジョブではメモリーが溢れる可能性が高い。

これを解決する方法は今の所不明。
Jedis(Java->Redisのライブラリ)の簡単なテストでハマった

あるときJavaからRedisにつなぐ簡単なプログラムを書きたくなり、tutorialspoint
https://www.tutorialspoint.com/redis/redis_java.htm
を見てそのとおりやってみたらハマったので備忘録。

紹介されているとおり、リポジトリからJedisのjarをダウンロードしてきてclasspathに通して、Javaのサンプルアプリを書いてJedisをインポートしてRedisにつなぐ、という流れは変わらないのだが、jedis.jarのDLはここから、というリンクから入手したjedis-2.1.0-sources.jarを利用すると、Jedisクラスを利用したときに以下のエラーがでる

```
Exception in thread "main" java.lang.NoClassDefFoundError: redis/clients/jedis/Jedis
        at RedisJava.main(RedisJava.java:6)
Caused by: java.lang.ClassNotFoundException: redis.clients.jedis.Jedis
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more
```

クラス自体が間違ってる?と思ったらそうだった(詳しいことは不明)
ダウンロードURLのパスをさかのぼっていくと
http://repo1.maven.org/maven2/redis/clients/jedis/
もっと新しいバージョンのjedis.jarをDLできるので、試しに3.0.0を使ってみたら正常に実行できた(javaのサンプルアプリからRedisにつながった)
DLしたのはこれ http://repo1.maven.org/maven2/redis/clients/jedis/3.0.0/jedis-3.0.0.jar

```
Connection to server sucessfully
Server is running: PONG
}}}
とある小規模チームの初めてのモブプロの紹介

この記事は[千 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/sen)の11日目の記事です。

[3日目の記事](https://qiita.com/jumperson/items/2444a94653da5ba4ac23) で紹介したアプリチームでは一部のタスクでモブプロを導入しています。

本記事では、初めてモブプロを導入したきっかけや具体的にどのように始めたか、その後のメンバーの反応について紹介します。

# モブプロとは

- ペアプロのモブ版
- モブ：群衆
- 群衆で一緒にプログラミングをすること

# やってみたきっかけ

- 不具合報告があり急いで対応しリリースする必要があった
- メイン担当が少し検討して結果、変更箇所が大きく規模が大きな修正になることが想定された

# 具体的な進め方

## 事前準備

- 軽くインターネット上の情報を探す
- [明日からできる働き方改革「モブプログラミング](https://speakerdeck.com/takaking22/mobprogramming-as-work-style-reform)を参考に次の内容を決めてから始めることにした
  - 実施する場所を決める
  - 交代の仕方を決める（時間 or 切りの良いところ）
  - どこまでモブプロするか決める
  - 休憩のタイミングを決める
- 実際に決めた内容
  - 実施する場所を決める：SさんのPC
  - 交代の仕方を決める：15分位で切り良いところ
  - どこまでモブプロするか決める：不具合を修正してリリースするところまで
  - 休憩のタイミングを決める：適宜！

## 流れを簡単に紹介

- 設計や進め方をモブで決める
- コーディング
- PRレビューもモブで実施
    - 変更点を見ながら「こういう変更ですねー」「これはこのためにこうしてますね」と読み上げながら見ていく
- 動作確認項目もモブで検討
- 動作確認は担当を決めて各自実施
- リリース作業もモブで実施
    - Hさんの初リリースだったためモブにしたが慣れていれば1人で良さそう

# やってみてメンバーの反応

初めてモブプロを行った後にアンケート取ってみました。

## モブプロは普段の業務よりも楽しかったですか？
<img width="730" alt="スクリーンショット 2018-11-15 12.00.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/40689/017476c7-e199-e773-99fe-d003eb568b9e.png">
<img width="683" alt="スクリーンショット 2018-11-15 11.51.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/40689/10a25076-521a-55f3-d9d4-a8102e04374a.png">

## モブ作業の効率は良かったですか？
<img width="577" alt="スクリーンショット 2018-11-15 11.51.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/40689/c87622fe-7749-0dd4-8bb1-cd6af94c1591.png">

## 今後、モブプロをどの程度行うべきだと思いますか？
<img width="521" alt="スクリーンショット 2018-11-15 11.51.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/40689/55f5233c-7b39-d0a9-81bc-1d2f40ad86a9.png">

## モブ作業が適していると感じた業務を教えて下さい

- 広範囲に渡る改修や機能の追加など
- 要件の整理
- 実装イメージが湧いていない要件の開発
- PRレビューに時間がかかりそうなものはコーディングの時点で相談したほうがよく、モブ作業が向いていると思う

## モブ作業が適していないと感じた業務を教えて下さい

- 小さなバグ改修など
- 内容にもよりますが、動作確認は今回のように各自で分担の方が効率が良いと思います。
- ないかもしれない

## 今回のモブプロで得られた事、成長した事を教えて下さい

- 仕様や処理の曖昧な箇所についていろいろと質問させてもらえたおかげで理解が深まりました。
-  1人だとただ悩んでしまうことも、皆で考えるといいアイデアが出て来てよかったです。
- 既存のコードを捨てるという発想はなかったので、結果として400行も削減できたのはよかったと思います。
- 「この実装こっちの方が良くないですか？」みたいな議論も出て、今回その案は採用しませんでしたが、自分が考えついていない実装を知るきっかけになると思います。
- 他の人のツールの使い方を学べた
- 他の人の思考回路が学べた

## モブプロの改善案を教えて下さい

- 休憩のタイミングを適宜としていましたが、時間を決めていた方がメリハリが付きそうだと感じました。
- 今回は一部ついで修正したコミットもあったので、そういうのはちゃんと分けてコミットするようにした方がいいと思いました。
- ストップウォッチ操作が面倒だったので便利なツールを使いたい

## 最後にモブプロに対する思いを自由に書いて下さい！

- もっと発言できるようになりたいという思いから、学習モチベが上がった気がします。
- モブプロ楽しいので、またやりたいですね。
- もっともっとモブプロ広めていきたい！
- リモートモブプロもやってみたい！

# その後

アンケートの結果を見てもらうと分かる通り、私達のチームではモブプロは非常に有効でした。
その後も度々モブプロを実施しています。
先日はジュニアエンジニアが3日かかると見積もりした作業をモブプロで実施し3時間で終わらせることもできました。
gulpでphpをhtmlに変換する [gulp-php2html]

#このプラグインを使います

gulp-php2html
https://www.npmjs.com/package/gulp-php2html

「拡張子が.phpから.htmlに変換される」ではないです。

イメージとしては
・phpをブラウザで表示し、
・それを名前をつけて保存する。
・index.phpならindex.htmlとして保存する
をまとめてやってくれます。 

#事前準備

- ディレクトリ構成
 
```
/
├ html（php→html変換されたものがここに出力されます）
├ root（変換されるphp置き場）
  └ index.php
├ package.json
└ gulpfile.js
```

- package.json

```javascript:package.json
{
    "name": "dev",
    "version": "1.0.0",
    "author": "",
    "main": "gulpfile.js",
    "license": "ISC",
    "devDependencies": {
        "gulp": "*",
        "gulp-php2html": "*"
    }
}
```

- gulpfile.js

```javascript:gulpfile.js
// 環境変数
const setting = {
	html: {
		src: "./root/*.php",
		dest: "./html"
	}
};

const gulp = require("gulp");

// phpからhtmlに変換するプラグインの読み込み
const php2html = require("gulp-php2html");

// phpからhtmlに変換するタスクを作成
gulp.task("html", () => {
	return (
		gulp
			// 変換対象のファイル
			.src(setting.html.src)
			// php→html変換
			.pipe(php2html())
			// htmlを保存
			.pipe(gulp.dest(setting.html.dest))
	);
});

// ファイルの変更を監視してタスク実行
gulp.task("watch", () => {
	gulp.watch(setting.html.src, ["html"]);
});

// gulp起動時に実行するタスク
gulp.task("default", ["watch"]);
```


#インストール
```
# package.jsonの内容をもとに、gulpとプラグインをインストール
$ npm install
```


#gulpを実行（起動）します
```
$ gulp
[12:19:45] Using gulpfile （ディレクトリパス）/gulpfile.js
[12:19:45] Starting 'watch'...
[12:19:45] Finished 'watch' after 9.34 ms
[12:19:45] Starting 'default'...
[12:19:45] Finished 'default' after 69
```

これで /rootディレクトリ内のphpファイルを編集するたびに
php→htmlに変換されて
/htmlディレクトリにhtmlファイルが出力されます。

以上です。
ありがとうございました。
ScrapBoxの落とし穴、単に登録しただけではGoogle検索にヒットしない？ SEOは？

https://scrapbox.io/yumainaura/


- 利用1ヶ月ほど。
- まったくインデックスされていなさそう。
- 本名でキーワード検索しても自分のTwitterやQiitaの記事しか出てこない
- Qiita が SEO に強いことの威力が改めて示された


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/77803744-38f9-b356-00f0-6bc9352baf50.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8de7c041-185f-a917-1665-1011f865b36e.png)

[yumainaura scrapbox - Google Search](https://www.google.co.jp/search?q=yumainaura+scrapbox&oq=yumainaura+scrapbox&aqs=chrome..69i57j69i60l3.5196j1j7&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 -->
サービス化したJupyter notebookからローカルに構築したtensorflowを使えるようにした

#やったこと
サービスにしたJupyter Notebookからローカルのtensorflowをインポートできるようにした。
備忘録として残しておく。

#経緯
[こちらの記事](https://qiita.com/mitsuharu_e/items/ecff16bdbcb795a86433)を参考にtensorflow-gpu環境を作ったが、Jupyter Notebook上からimportできなかった。

今回つかうJupyter Notebook色々な理由がありsystemdで以下のようにサービス化されたものである。

```jupyter.service
[Unit]
Description=Jupyter Notebook

[Service]
Type=simple
PIDFile=/run/jupyter.pid
ExecStart=/usr/local/bin/jupyter notebook
User=username
Group=usergroup
WorkingDirectory=/fileshare/
Restart=always
RestartSec=10
#KillMode=mixed

[Install]
WantedBy=multi-user.target
```

これにより起動しているJupyter Notebookで以下のようにtensorflowをimportしようとした。

```python:source.py
import tensorflow as tf
```

が、以下のエラーが出てimportできなかった

```
ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory
```

で、jupyter上からpathを確認してみたところどうもpathが通っていないっぽい。

```
import os
print(os.environ.get('LD_LIBRARY_PATH')) #-->None
```

色々調べた結果、serviceから実行すると `.bashrc` でexportしている環境変数はserviceでは読み込まれないらしい。
そのため、 `EnviromentFile` を利用して該当サービスに環境変数を無理やり通すことにした。

```jupyter.service
[Unit]
Description=Jupyter Notebook

[Service]
Type=simple
PIDFile=/run/jupyter.pid
ExecStart=/usr/local/bin/jupyter notebook
User=username
Group=usergroup
WorkingDirectory=/fileshare/
Restart=always
RestartSec=10
EnviromentFile=/etc/sysconfig/jupyter #追加
#KillMode=mixed

[Install]
WantedBy=multi-user.target
```

EnvironmentFileはこう。

```
PATH=/your/first/path:/your/second/path
LD_LIBRARY_PATH=/usr/local/cuda/lib64:
CUDA_ROOT=/usr/local/cuda
```

これでimportできるようになったと思ったら `permission denied` で起動できてないのでログみて該当ディレクトリを `chown`　した。
そしたら無事Jupyter Notebookが起動し、tensorflowのimportに成功した。

#まとめ
serviceの環境変数はEnvironmentFileで通そう。
Word for Mac (ver. 16.19) で ctrl+h でのバックスペースを有効にする

Word for Mac で ctrl+h で検索ウインドウが開いてしまう問題を解決してみた．

1. [ツール]-[ショートカットキーのユーザ設定]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/325163/7921f0d2-5639-65d9-da80-203448eeb7a0.png)

2. 「新しいショートカットキーを押してください」で ctrl+h を押してみる．すると，現在割り当てられている機能が表示される．
（NavPaneSearch が割り当てられていることがわかります）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/325163/59b558d6-7dd8-ff3f-856f-a03d2ba99e5f.png)

3. 「分類」で「すべてのコマンド」を選び，NavPaneSearchを検索します．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/325163/b7abce0c-52cc-9e6f-036f-ee77aff08625.png)

4. control+H を選んで，削除する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/325163/abcdfa62-d110-fa9e-7ec8-de66bc0b69d5.png)

快適なWordライフが待っています．
（Word自体快適なソフトではありませんが・・・）

ちなみに，[こちらの記事](https://qiita.com/m-suizu@github/items/bfd7aaca831e82f6ddfe)では別の定義に割り当てられているので，バージョンによって変わるっぽいです．
現在の割当を確認するのが，確実だと思います．

マクロを登録する方法もネットで見かけましたが，Google IME の挙動がおかしくなりました．
チーム開発のホワイトボード・カンバンの文房具は？プリンタ印刷活用例

# 横に長いJSONがカンバンで説明しづらいのでプリンタ印刷してみた例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/42b9ac1e-eff9-80fc-8a75-874c1f7f8ebe.png)

# 問題

- プログラミングコードやJSONとかホワイトボードに書くの地獄
- ノートPC使うよりアナログのまま説明できないか？

#JSON

```
{ "a": 1, "b": 2, "c": 3, "d": 4, "e": 5 }
```

# shell+jqでパース

```
echo '{ "a": 1, "b": 2, "c": 3, "d": 4, "e": 5 }' | jq .
{
  "a": 1,
  "b": 2,
  "c": 3,
  "d": 4,
  "e": 5
}
```

#エディタで印刷

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/01e57a06-c07e-8d6a-7d88-525d6360de9a.png)

#(フォントとか設定)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d09c4405-bea6-7f3f-7755-460c7f18a580.png)


#出来上がり

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/42b9ac1e-eff9-80fc-8a75-874c1f7f8ebe.png)

#プラスアルファ

- いろいろペンで書きこむ。
- その後写真撮影してSlack共有。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GCPのタスクキュー削除が紛らわしすぎた

はい。

GCPで運用していたタスクキューが無限リトライ状態になっておりログ確認の邪魔なので削除するかーとコンソール上でごそごそ削除したのだけれども、なにぶんこちらは最近GCPを使い始めた素人であり普通にハマった。

![Kobito.azdkqp.png](https://qiita-image-store.s3.amazonaws.com/0/161772/3488a915-c543-7d37-4f0a-61cb6ce721c2.png "Kobito.azdkqp.png")

コンピューティング→App engine→タスクキューの順に確認し、出てきたタスクキュー一覧からタスクキュー詳細であるこの画面に飛ぶわけですが、キューを削除とキューを消去のふたつがある。何も考えずに「キューを削除」を押すと、２，３日は同じ名前のキューは作れませんという警告と、それでも消したい場合はタスクキューの名前を入れろという脅迫が。

なぜ滞留しているタスクを削除するだけなのにそんな警告をされなあかんねんとポチポチっと消してしまってから気づいたのが、これは滞留しているタスクを削除するのではなくタスクキューそれ自体を削除する処理であること。タスクを削除したかったら「キューを消去」を押さねばならなかった……。

いや、不用意に消したこちらも悪いけど、いくらなんでもこれはわかりづらすぎるのでは……。結局そのあと、すぐに気づいて再度キューを登録しようとするも当たり前ながら同じ名前のキューは数日間登録できねえよと怒られ、開発環境だったからよかったものの、一時的にqueque.yamlのquenameを変更して登録する羽目になった。

```
ERROR: (gcloud.app.deploy) Server responded with code [400]:
 Bad Request Unexpected HTTP status 400.
 Invalid queue configuration. The queue 'sample' was deleted and its name may not be reused for a few days.
```

一度やったら二度は間違えないミスではあるが、いちおう書き残しておく。
[Flutter] animationを使って試してみた。その4


今回はFlipアニメーションを使います。

#以前
1. [[Flutter] animationを使って試してみた。](https://qiita.com/Dreamwalker/items/c195d8ba12e8a55383f1)
2. [[Flutter] animationを使って試してみた。その２](https://qiita.com/Dreamwalker/items/2a99ca6d7206d5195fd4)
3. [[Flutter] animationを使って試してみた。その3](https://qiita.com/Dreamwalker/items/134c843fcd42efb8f883)

# Animation準備する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/44402842-e8b5-0487-3057-355afcacfe48.png)


# Animationを使う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/11af729b-aeaf-4564-0fd5-b1404bead294.png)

## X軸の回転結果。

![2018_12_11_11_35_21_215.gif](https://qiita-image-store.s3.amazonaws.com/0/137182/fa7240f5-98b8-c9a8-c1f7-455ef0ade764.gif)

## Textも回転したい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137182/589bab53-5aa0-01af-c38a-469b751ae718.png)

## 結果。。

![2018_12_11_11_36_30_22.gif](https://qiita-image-store.s3.amazonaws.com/0/137182/bc05c1fe-135e-c687-9f4b-fb1e3de2ff81.gif)

![2018_12_11_11_36_43_590.gif](https://qiita-image-store.s3.amazonaws.com/0/137182/158e1bc1-8f7f-9dd0-05f9-23a6fe30be1d.gif)
銃を持ったギャングに脅されたら命乞いするしかないCSS上の計算式

# どういうことか

> 銃をもったギャングに「幅がぴったり15pxのストライプを作らないと命はないぞ」と脅されているのでもない限り、半端な数字は切り捨てて42.4pxまたはシンプルに42pxにすることを強くおすすめします。
出典: [CSSシークレット ――47のテクニックでCSSを自在に操る](https://www.oreilly.co.jp/books/9784873117669/
)
![picture978-4-87311-766-9.gif](https://qiita-image-store.s3.amazonaws.com/0/54497/9045cf12-54c6-092b-a4e2-38ad860f56e9.gif)

私はこの文章のためだけに [CSSシークレット](https://www.oreilly.co.jp/books/9784873117669/
)を購入しました。
この本がどんなに素晴らしいかは周知のことだと思うので割愛します。

# CSSは有限小数でないと計算できない
前述の銃で撃たれるケースは、幅15pxの斜めストライプ背景を`linear-gradient`で書く話です。

<img width="410" alt="スクリーンショット 2018-12-10 21.25.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/54497/2556d9fb-c895-403c-b7e4-b2ca0acbed80.png">

直角三角形の斜辺の長さを出そうにもcssでは便利な関数は用意されてないし、平方根やなんやらの定数記号を使った計算ができません。

# CSSで使いそうな有限小数じゃない数ってなにがあるかな

- **円周率π**： 3.141592653589793....
    - 円周配置で使いたい
- **自然対数の底（ネイピア数） e**： 2.718281828459045....
   - 複利計算で使うぽい。金利のチャートで使いそう
- **2の平方根** :  1.4142135623730951....
   - 三角関数でぜひとも使いたい

三角関数とnot2進法の計算式をみるたび、理系コース進めばよかったと何度おもったことか。

# ライブラリとかプリプロセッサで解決できないかな

Math関数が使える有名所は以下３つ。もっとあるかもしれない。

- [LESS - #math-functions](http://lesscss.org/functions/#math-functions)
- [compass  - math.rb](https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass_extensions/functions/math.rb)
- [MathSass](https://www.npmjs.com/package/mathsass)

LESSは`pi()  -> 3.141592653589793`や`sqrt(2) -> 1.41421356`と有限でアウトプットする。
compass(Ruby)も`Math::PI`をつかってて、直接かかれた`3.14159265358979323846 `を使ってるっぽい。
MathSassも`$PI:    3.141592653589793;`や`$SQRT2: 1.4142135623730951;`といった感じに[定数を変数にいれてる](https://github.com/terkel/mathsass/blob/master/dist/_constants.scss)。

どれも**π**や**√**をそのまま使えるようにはなってない。

# というわけで
我々はギャングに脅されたら諦めるしかないようです。

でも`calc`も使えるようになったし、そのうちなんとかなるといいな。
ただ、いうてもJSもRubyも適当なところで丸めて計算してるので、無限のまま扱うってナニソレ意味あるの？みたいな話な気もする。
LaraDock + MariaDBのデータベースとユーザーアカウントを作成

database name : your_database_name
user          : your_database_user
pass          : your_password


# connect
docker-compose exec mariadb bash

mysql -u root -p

# === mysql(mariadb) console sql ===
```sql
-- Create database
DROP DATABASE IF EXISTS your_database_name;

CREATE DATABASE IF NOT EXISTS your_database_name
  CHARACTER SET = 'utf8mb4'
  COLLATE = 'utf8mb4_unicode_ci';

-- Create user
SELECT User, Host, Password FROM mysql.user;

-- workspace console user
drop user 'your_database_user'@'your_workspace_host_ip_address';
create user IF NOT EXISTS 'your_database_user'@'your_workspace_host_ip_address' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON your_database_name.* TO 'your_database_user'@'your_workspace_host_ip_address';

-- application user
drop user 'your_database_user'@'your_application_host_ip_address';
create user IF NOT EXISTS 'your_database_user'@'your_application_host_ip_address' IDENTIFIED BY 'your_password';
GRANT SELECT,INSERT,UPDATE,DELETE ON your_database_name.* TO 'your_database_user'@'your_application_host_ip_address';

-- mariadb database console user
drop user 'your_database_user'@'localhost';
create user IF NOT EXISTS 'your_database_user'@'localhost'  IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON your_database_name.* TO 'your_database_user'@'localhost';
```


# どのホストからもアクセスできるように設定
```sql
CREATE USER 'test'@'%' IDENTIFIED VIA mysql_native_password USING 'test1234';
GRANT USAGE ON *.* TO 'test'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
CREATE DATABASE IF NOT EXISTS `test`;
GRANT ALL PRIVILEGES ON `test`.* TO 'test'@'%';
```
railsに頼りきって忘れがちな脆弱性

はじめまして。食べログでwebサービス開発のエンジニアをしている@ham0215です。

web開発をしているエンジニアなら一度は聞いたことがある「SQLインジェクション」や「クロスサイトスクリプティング」など有名な脆弱性があります。
ただ知識として知っていてもrailsのように普通に使っていたら勝手に対策されているものを使っていると、どんどん意識から離れていき無意識のうちに埋め込んでしまうことがあります。
そこでrailsでの具体例を交えて、いくつかの脆弱性についておさらいしようと思います。

# クロスサイトスクリプティング
悪意のあるスクリプトがサイト内に埋め込まれてしまう脆弱性。

## 脆弱性が発生する例
ユーザーが入力したテキストを画面表示するシステムで下記を実施
1. ユーザーが下記テキストを入力
`<script>alert('クロスサイトスクリプティング!!');</script>`
2. 入力されたテキストを画面出力するとscriptが動作してアラートが表示された
![スクリーンショット 2018-12-05 12.17.25.png](https://qiita-image-store.s3.amazonaws.com/0/83424/70e6c2e8-191c-ebd5-1ad2-a7ad28359933.png)


## railsでの対策
erbで`<%= text %>`と書いたり、slimで`= text`と書くだけでtextにhtmlタグが入っていたとしても自動的にエスケープされる。

```slim
- text = "<script>alert('クロスサイトスクリプティング!!');</script>"
/ ↓ &lt;script&gt;alert(&#39;クロスサイトスクリプティング!!&#39;);&lt;/script&gt;　とエスケープされてHTML出力される
= text
```

## NGパターン
本文の特定キーワードを強調したり、httpから始まる箇所を`<a>`タグに変換したいなどの要件があった場合に文字列全体を`raw`や`html_safe`でエスケープされない状態にしてしまいそれを画面出力してしまう。
slimの場合は`== text`と=を2つ重ねるとエスケープされない。

```erb
# やりたいこと
# ->ユーザーがURLを本文に入れると<a>タグを付加してリンクに変換して表示
<% user_input = "ここがオススメのお店です。http://hogehoge" %>
# httpの部分を<a>タグに変換(ロジックは割愛)
<% convert_a = "ここがオススメのお店です。<a href='http://hogehoge'>http://hogehoge</a>" %>
# <a>タグを有効にした状態でHTML出力したいのでhtml_safeをつける
# ->目的達成
<%= convert_a.html_safe %>

# NG
# ->ユーザーがフリーテキスト部分にHTMLタグを埋め込んだ場合
<% user_input = "<script>alert('クロスサイトスクリプティング!!');</script>。http://hogehoge" %>
# httpの部分を<a>タグに変換(ロジックは割愛)
<% convert_a2 = "<script>alert('クロスサイトスクリプティング!!');</script>。<a href='http://hogehoge'>http://hogehoge</a>" %>
# <a>タグを有効にした状態でHTML出力したいのでhtml_safeをつける
# ->アラートが表示される・・・
<%= convert_a2.html_safe %>
```

## チェック観点
* 入力項目には有効なHTMLタグを入れるテストを実施して、エスケープされることを必ず確認する。
* コードチェックでhtml_safeやslimの==を見かけたら本当に必要なのか疑う。必要な場合、システムで制御できない動的要素がないことをチェックする。

# SQLインジェクション
実行されるSQLをユーザーが任意に操作して、データを改ざんしたり取得したりする脆弱性。

## 脆弱性が発生する例
ユーザーが入力したニックネームをデータベースに登録するシステムで下記を実施

```sql
-- 正常パターン
1. ユーザーがニックネーム:"hogehoge"を入力してリクエスト
2. 下記SQLが発行
insert into users (nickname) values ('hogehoge');

-- 異常パターン
1. ユーザーがニックネーム:"a');delete from users;--"を入力してリクエスト
2. 下記SQLが発行 -> usersテーブルに対してdelete文が発行される!!
insert into users (nickname) values ('a');delete from users;--');
```

## railsでの対策
プレースホルダーを使うなど、SQLを直接文字列で生成しない書き方をすれば勝手にエスケープされます。

```ruby:ユーザーが入力したニックネームで検索する
# params[:nickname] = "' OR '1"
User.where(nickname: params[:nickname])
User.where("nickname = ?", params[:nickname])
# どちらの書き方でもシングルクォーテーションが\'にエスケープされて実行される
# select * from users where nickname = '\' OR \'1';
```

## NGパターン
SQL文を文字列で生成した場合はエスケープされません。

```ruby:ユーザーが入力したニックネームで検索する
# params[:nickname] = "' OR '1"
User.where("nickname = #{params[:nickname]}")
# シングルクォーテーションがエスケープされず、全件検索される
# select * from users where nickname = '' OR '1';
```

## チェック観点
* 入力項目にはシングルクォーテーションなどSQLの特殊文字を入れるテストを実施して、エスケープされることを必ず確認する。
* コードチェックでクエリーを文字列生成している箇所を見つけたら撲滅する。どうしても必要な場合は確実にエスケープされることをチェックする。

# 最後に

今回は個人的に埋め込みやすいと思っている2つの脆弱性をピックアップしました。
冒頭に記載した通り最近では自動的に対策されていることが多く、また脆弱性診断など別途脆弱性の確認をする工程をふむことで脆弱性を埋め込んだままリリースしてしまうリスクはかなり減っていると思います。
ただ、web開発をする上で重要な知識であることに変わりはないので、開発者自身もきちんと理解して回避することが重要ですね。

明日は@e-ronnyさんの「Fluentd + MySQL でログ保存 & 検索システムを考えてみた話」です。よろしくおねがいします！
Macのトラックパッドで「3本指ドラッグ」を有効にする

# はじめに
Macのトラックパッドで範囲選択する際、トラックパッドを押し込みながら選択していました。
ただ、押し込みながらスクロールは指に負担が掛かっていたので、「3本指ドラッグ」に変更し、快適になりました。

## 設定
【システム環境設定】→【アクセシビリティ】
(設定がトラックパッドの設定箇所ではないみたいです。。)

<img width="668" alt="スクリーンショット 2018-12-11 11.08.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/4db55954-2557-0ab8-6a20-7abbe7224d46.png">
Slackリマインド記法覚えられない？面倒？使いづらい？わりと簡単に書けるよ！

#ポイント

− 実はonとかatとか書かなくて良い。
- YYYY-MM-DD 慣れ親しんだ年月日フォーマットでOK
- チャンネル・日付は順序を入れ替えられる
 
#after

```
/remind #channel-name 2018-12-08 11:00 メッセージ
```

#before

```

/remind #channel-name on 12/08/2018 at 11:00 メッセージ
```








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
vagrantとvirtualboxのバージョンの組み合わせの確認

**※2020/01/24追加**
**※2018/12/11時点です**


# はじめに

今までwindows7(ホストOS)の下記の環境で構築していた開発環境がwindows10への移行で使えなくなった時に試した組み合わせのメモです
vagrantはアンインストールして再起動してインストールしました
virtualboxはアンインストールせずにインストールして再起動しました

# 結論
### 新しい環境

||バージョン|
|:-:|:-:|
|vagrant|2.2.2|
|virtualbox|5.2.22|
|CentOS(ゲスト)|6.7|
|windows(ホスト)|10(64bit)|


### 今までの環境

||バージョン|
|:-:|:-:|
|vagrant|1.9.2|
|virtualbox|5.1.18|
|CentOS(ゲスト)|6.7|
|windows(ホスト)|7|

## 試した組み合わせ
- ホストOS:windows10(64bit)
- 横軸:vagrant
- 縦軸:virutalbox

|-|1.9.2|1.9.8|2.1.5(追加)|2.2.2|
|:-:|:-:|:-:|:-:|:-:|
|5.1.18|×|未確認|未確認|未確認|
|5.1.30|○|○|未確認|未確認|
|5.1.38|未確認|○|未確認|○|
|5.2.22|未確認|×|未確認|○|
|5.2.34(追加)|未確認|×|○|○|


途中で何回かプラグインのアップデートをしました

```
$ vagrant plugin expunge --reinstall
```

ちなみに入っているのは下記の2つです

```
$ vagrant plugin list
vagrant-proxyconf (1.5.2, global)
vagrant-vbguest (0.16.0, global)
```

無事に新しい環境に移行できてよかったです
windows7の時は最新がダメだったり、virutualbox 5.2がダメだったり、vagrant 1.9.3がダメだったりしましたが、windows10だと最新が対応していてほんとよかったです