OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity(C#)】常に中心を見ながら円運動させる


　　
　　
　　
この記事は

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

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


##円運動

円運動はSinとCosを組み合わせてそれらを座標に代入することで再現します。
SinとCosの数値を得るには`Mathf.Sin(数値)`と`Mathf.Cos(数値)`を使います。

##中心(一定の方向)を見る
中心にゲームオブジェクトを置いてカメラをその方向に向かせます。
中心のゲームオブジェクトにスクリプトがAdd Componentされているつもりで説明します。
`カメラの入った変数.transform.LookAt(this.gameObject.transform)`
これで中心を向きます。

 ```C#
public float speed = 0.5f;  //カメラの移動速度
public float radius = 0.5f; //円の大きさ

public GameObject _camera;

float _x;
float _z;


void Update () {

 _x = radius * Mathf.Sin(Time.time * speed);
 _z = radius * Mathf.Cos(Time.time * speed);

 _camera.transform.position = new Vector3(_x, 0, _z );

 _camera.transform.LookAt(this.gameObject.transform); 
 
    }

```
なにかしらの処理の後に円運動させたい場合はコルーチンを使うといいと思います。
~~それは今度まとめまーす。~~
簡単にまとめました！→[コルーチン](https://qiita.com/OKsaiyowa/items/d0f59ae0c97b29118a80)

---
2020/11/3 追記

カメラにアタッチしてターゲットをInspectorで設定するやつ

```C#
using UnityEngine;

/// <summary>
/// 特定のオブジェクトを中心にカメラが回転
/// カメラにアタッチ
/// </summary>
public class RotationAroundTarget : MonoBehaviour
{
    [SerializeField] private Transform _targetTransfrom;
    [SerializeField] private float _speed = 0.5f;
    [SerializeField] private float _radius = 5.0f;
    [SerializeField] private float _upper = 1.0f;

    void Update()
    {
        float posX = _radius * Mathf.Sin(Time.time * _speed);
        float posZ = _radius * Mathf.Cos(Time.time * _speed);

        transform.position = new Vector3(posX, _upper, posZ);
        transform.LookAt(_targetTransfrom);
    }
}
```
モブプロで技術書を攻略する！

この記事は[モブプログラミング Advent Calendar 2018](https://qiita.com/advent-calendar/2018/mobprogramming) 2日目の記事です！

1日目は [@TAKAKING22](https://qiita.com/TAKAKING22)さんの[モブプログラミングのよくある誤解
](https://takaking22.com/2018/mob-advent/)というグレートな記事でした！

## 今年は何冊の技術書を読みましたか？
自分の技術に磨きをかけたい！ もっとレベルアップしたい！
現状のスキルを伸ばすだけではなく、新しい領域にもどんどん手を出していきたい。

そんな向上心にあふれる我々にとって技術書はとてもありがたい存在です。

しかし、意外と難しいのが読み切ること。挫折した技術書はいくつあるだろう？

この記事ではいかにして技術書を攻略するかについて考えていきます。

## 読み切れないときのパターン
技術書をきちんと読み切れないパターンはいくつかあります。例えば次の3つ。

1. 積ん読: 買って満足してしまう
2. N日坊主: 途中で止めちゃった
3. 理解の壁: 内容が理解できなくてあきらめた

## モブプロスタイルで技術書を読む
前述の問題を攻略するために様々な策を弄してきました。
プライベートな時間に気合いで読んだり、輪読会に開催したり、業務時間中に勉強会の時間をとってみたり。

その中でも非常に有力なのが「モブプロ(モブワーク)で技術書を読むこと」です。

## モブプロでの読書会の進め方
読書会にモブプロのアプローチを適用するだけです。考え方は非常にシンプルです。

そもそもモブプロってどうやるんだろう？ という方は下記の資料を参照してください。非常によくまとまっています。

- [明日からできる働き方改革「モブプログラミング」 WHOLE TEAM APPROACH / mobprogramming as work style reform」](https://speakerdeck.com/takaking22/mobprogramming-as-work-style-reform)
- [WEB+DB PRESS Vol.102](https://gihyo.jp/magazine/wdpress/archive/2018/vol102)

ここでは、特にポイントとなる3点にフォーカスして説明をします。

### ポイント1. すべてを声に出して読む
書いてある文字はすべてを**声に出して**読みましょう。いいですか？ 必ず声に出して読みましょう。

一定の文章ごとに交代で音読する。それだけ。どこで交代するか迷ったら文ごと交代するのがおすすめです。

声に出して読む行為は学習に大きく貢献します。もちろん音読自体は1人でも可能ですが、モブになると効果が超UPします！ 更に、交代読むことにより負担がかなり減ります。実際にどれだけ効果があるかは実際に試してみてくださいね。

ソースコードについては写経しましょう。このときにマシンは1台あればOKです。ただ、キーボードやエディタが違うとストレスが大きいのでGitHubなどを使って交代のタイミングでPushとPullを行うのもアリです。

### ポイント2. とにかく表明する
思ったことはとにかく表明しましょう。もー、とにかくなんでも言います。
全然まとまってなくてもいいです。声じゃなくて身振り手振りでもいいです。表現しましょう。

特に、わからないことだけではなく、わかったことも表明するところが重要です。
「めっちゃわかったー！！！」とか「読んだけど全然わかんねー！」とか。

無理に表明しようとしなくても、表情や声に現れることも多いです。例えば、意味がよくわからない文章はスラスラ音読できませんし、読んで違和感がある場合につい首をかしげたりすることがあります。反応は人それぞれですが、そういう感覚は何らかの形で出現します。

### ポイント3. 予習をしない
一緒に読むので予習はしません。やるときは必ずモブで読みます。

予習ゼロの恩恵はかなり大きいんですよね。予習の負担は予習をやめてみるまでと気づきませんでした。

とにかく気が楽です。前日に慌てる必要はありません。予習をしていない自分にショックを受ける必要もありません。モブで読んでいるときだけ集中すればいいのです。

## 実際にやってみて気づいたこと
いろんな発見があるものです。3つお伝えします。

### 発見1. モブが消滅しても平気！
挫折理由の1つに内容が理解できなくてあきらめることがありますが、モブならそれを緩和できます。そのため、モブプロならそもそも挫折しにくいと考えていましたが、実際にそのとおりでした。とはいえ、モブが消滅してしまうこともありました。

しかし、ここで意外だったのは途中でやめてしまっても気分が悪くないんですね。逆説的ですが、やめてもいいんです。

毎回の学習効果が非常に高いので、仮に途中でモブが消滅してもそこまでに学習したことは個人内にきちんと残ります。だから、「なんか中途半端にやったけど全然みになってねえや＼(^o^)／」みたいな自体にはならず、前向きに「今度またやってみようかな」という気持ちになりました。

### 発見2. 時間は必要なだけかかる
当初、全部音読するからすごく時間かかるのでは？ と思っていましたが、そんなことはありませんでした。

モブにとって内容が簡単であれば時間はかかりません。難しい場合は相応の時間がかかる。ただそれだけです。

予習するタイプの読書会(例: 章ごとに担当者が発表するスタイル)のほうが短時間で済むようにみえますが、それは個人での予習時間が隠れているからです。真に比較すべきは最終的にどれだけ身についたのかということでしょう。

この議論はいわゆる「生産性おじさん」の話と似ています。

### 発見3. モブプロがうまくなる
モブプロのやり方を技術書を読むことに適用するわけですが、これは本家モブプロの上達にも繋がります。

タスクの対象が開発から技術書の理解になっただけなので当然といえば当然です。

モブプロでによる技術書攻略をやることで、読書会というかたちでモブプロを浸透させることができます。
「モブプロを社内で実践してみたいけどハードルが高いなあ」と思っている人はお試しあれ。


## まとめ
この記事ではモブプロを読書会に適用することを考えていきました。

いくつかのポイントを書きましたが、まあとにかくやってみることですね。モブはモブの数だけバリエーションがあるので、やってみなくちゃあわからんのです。やってみてから考えようじゃありませんか。

記事で触れたこと以外にもメリットやデメリットはきっとありますが、そういうこと発見した場合はご一報ください！

また、「モブプロで技術書を攻略したいけど周りに人がいない」とか「ちょっとやってみたいかも！」という方はぜひ [おーひら@mohirara](https://twitter.com/mohirara) までお声かけください！ 一緒にモブモブしましょう！


## 3日目は...?
[@PoohSunny](https://qiita.com/PoohSunny)さんの[ウチのチームがモブってるとき](http://poohsunny.hatenablog.com/entry/2018/12/03/212837)です！
大切なことはスタートレックから学んだ - プロジェクト -

スタートレックのすべてのシリーズに男女間の話が出てきます。坂本龍馬が世の中の情勢を男女間の話に例えたように、プロジェクトを男女間の話に例えると学びも得ることができます。

## きょうのことば

> 「あんな恋は二度と無い」
> 「そうよ」
> 「意外なセリフ」
> 「また恋はする。でも同じ恋は二度とないわ。いつもちがうの」
> 「恋って難しいね」
> 「そういうものよ」
　　　　　　　　　　　　　　　　　　新スタートレックより 

 恋をプロジェクトに置き換えてみてください。プロジェクトは常に新しい何かを作る仕事ですから、同じプロジェクトは2度とありません。だから、いつも難しいのでしょう。
複数の数値が定義されている配列dataから、「100」と「40」の値を取り出し、2つの値を合算し表示するプログラムを作成

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>4_9</title>
    <script>
        var data = [59, 39, 100, 2, 15, 40, 84, 97];
        for (var i = 0; i < data.length; i++) {
        }
        document.write(data[2] + ' + ' + data[5] + ' = ' + (data[2]+data[5]));
    </script>
</head>
<body>
</body>
</html>
```

# 100 + 40 = 140
VisualStudio Community 2017 で Gstreamer tutorial を実行する


## **動作環境**
windows 10 バージョン 1803 osビルド 17134.407 64bit
VisualStudio Community 2017 version 15.9.3
windows sdk 10.0.17763.0
gstreamer-1.0-x86_64-1.14.4.msi
gstreamer-1.0-devel-x86_64-1.14.4.msi
    
# **手順**

**手順1 Gstreamerのインストール**
動作環境にあるgstreamerをインストールする。
インストール時にはCompleteを選択する。
↓ダウンロード先
https://gstreamer.freedesktop.org/data/pkg/windows/1.14.4/

**2. 環境変数の設定**
ユーザー環境変数
変数名　：　GSTREAMER_1_0_ROOT_X86_64
変数値　：　C:\gstreamer\1.0\x86_64\

ユーザー環境変数のPathに下記を追加
変数名　：　Path
変数値　：　%GSTREAMER_1_0_ROOT_X86_64%\bin

システム環境変数のPathにも追加
変数名　：　Path
変数値　：　%GSTREAMER_1_0_ROOT_X86_64%\bin

※Pathはどちらかだけでもいいかもだが。。。

**3. プロジェクトの作成および設定**
Visual C++ ⇒Windows コンソールアプリケーションを選択。
プロジェクトが作成できれば、
画面上の 表示(V)⇒その他ウィンドウ⇒プロパティマネージャー を選択。
プロパティマネージャーの既存のプロパティシートを追加をクリック

C:\gstreamer\1.0\x86_64\share\vs\2010\libs
にある gstreamer-1.0.props を適用する

↓適用後このようになる
![image](https://qiita-image-store.s3.amazonaws.com/0/37407/1de0dcbc-4f48-172b-4f14-cfc81f7306fb.png)

**4. ソースコード**
下記を参考にmain関数を作成する。
https://gstreamer.freedesktop.org/documentation/tutorials/basic/hello-world.html

**5. 最終**
https://gist.github.com/satoru-naruko/9c37c36c2b2bc8ed8bd2d3f8881e16af

実行するとこんな感じのウィンドウが表示される。
![image](https://qiita-image-store.s3.amazonaws.com/0/37407/2ff246b7-980d-6a60-e506-010c5de6e178.png)

tutorial1~3 までは動作できました。
2,3ではそのままだとコンパイルエラーがでますが簡単に修正できます。


**参考**
↓公式
https://gstreamer.freedesktop.org/documentation/installing/on-windows.html

↓とても参考になりました
https://qiita.com/tetsukuz/items/9a9b0f7bccc227b70de8
出力の管理について

昨日はWebシステムの入力について触れましたが、今日は出力部分について触れます。

## 出力の形態

Webアプリを作るに当たって、外部に出力するものもいろいろとあります。

* DBへの問い合わせ
* OSコマンドの呼び出し
* メール送信
* 外部APIの呼び出し
* HTMLなどの生成

システム内部にある間には、データとコマンドの区別は基本的にはっきりしていますが（例外は[後述](#その他)）、これらのように他のシステムへデータを持ち出すと、**単なるデータがコマンドに誤認される**というリスクが生じるため、他のシステムに渡す出力についてはきちんと管理する必要があります。

## 出力形態ごとの分析

### SQLの場合

RDBMSはSQLというプログラミング言語で操作しますので、プログラムからSQLを生成する必要が生じてきます。その過程で、うっかりデータを混ぜ込めばSQLインジェクションとなってしまいます。

#### 純粋な値のデータ→バインド機構が使える

元来、プリペアドステートメントは「あらかじめSQL文の枠組みだけ送ってサーバサイドで準備しておくことで、本体のデータ処理を効率化すること」が役割なのですが、副産物として「値は値として送信されるので、値とSQL構文を混同してしまうことがない」というメリットもあって、セキュリティ的な意味合いでも使われています（サーバが対応しないエミュレーションでは、後者の効果のみとなります）。

#### それ以外→エスケープ、あるいはホワイトリストでの検証

ただし、「SQL文の枠組み」を送るという性質上、あとから供給できるものは値だけで、列名などのキーワードはバインドの対象とできません。また、値の中でも、`LIKE`で使う検索用の値や正規表現など、値自身が機能性を持つ場合も、そちらのエスケープが必要となります。

* 列名や`ASC`/`DESC`など…テーブル構造は決まっているはずなので、ホワイトリストと照らし合わせて検証
* `LIKE`の引数→適切なエスケープ関数を使う

### OSコマンドの場合

理想論をいえば、他の手段で可能なことは他の手段でしてしまったほうがいいでしょう。それでも使わざるを得ない場合には、

* `system`系のシェルを介する関数ではなく、できるだけ`exec`のような、実行ファイルを直接実行する方法を使う
* 処理に使うファイルの名前は、可能な限り「英数字+拡張子」ぐらいにして、余計な文字で変な挙動を起こさせないようにする
* 一時ファイルは競合状態でも介入が不可能な、安全な手法で生成する

などの緩和策を取っておきましょう。

### メール送信の場合

メールを送信する場合、ヘッダの途中に改行コードを入れると、そこで別のヘッダだと認識されるメールヘッダ・インジェクションが発生します。

本文はともかく、メールヘッダとして入れる文字列として改行は不適切なので、きちんと弾いておきましょう。

### HTML出力する場合

HTMLもタグを出力しないといけませんが、想定外のものをタグとして出力してしまうとXSSを起こします。もちろん「適宜エスケープする」という手段もありますが、確立したHTML手法があるのであれば、それに乗ってしまうのも1つの手法です（[Railsでの例](https://qiita.com/jkr_2255/items/5d57262bda74d49e1352)）。

なお、HTMLの中にJavaScriptやCSSなど別な言語で解釈されるコードが入る場合、**その言語で見て**安全性を確保しないといけませんので要注意です。

### その他

言語内でも、正規表現などで「文字列で動作をコントロールする」場面があります。問題となった例として[Rubyの`Kernel.#open`](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/open.html)がありまして、これは開く文字列の先頭が`|`だと、**コマンドを実行**してそのプロセスとのパイプを開くという仕様になっています。このような挙動が必要な場合は稀でしょうし、開くものの種類も通常は事前にわかるでしょうから、ファイルなら`File.open`、URLなら`OpenURI.open_uri`、本当にプロセスとパイプしたい場合は`IO.popen`など、機能特化したメソッドを使いましょう（[参考](https://www.lanches.co.jp/blog/5996)、[Rubocopからの警告](https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Security/Open)）。



[^1]: データを参照して呼ぶコードを変えるなどをする場合は、プログラム内でも注意が必要です。
大切なことはスタートレックから学んだ - 新しい技術への挑戦 -

多くの刺激を受けたのは、バブル期の「新スタートレック」というシリーズです。科学技術の発展でお金があれば何でもできるような社会風土の中で、人間や家庭に対して問いかける場面が多くあります。

## きょうのことば

### 「生まれつきの親なんて一人もいませんよ。みんな苦労しながら学ぶんです。」
　　　　　　　　　　　　by カウンセラートロイ@新スタートレック4-4

もっと早く聞きたかった言葉です。うまくいかないと、何かにつけて自分はダメだ、向いていないと思ってしまいがちです。しかし、全知全能なのは神様だけで、人間は完ぺきではありません。うまくいかなければ、勉強すればよいのです。

技術者は、新しい技術に常に立ち向かわなければなりません。経験のある環境でもバージョンアップでトラブルに合うこともあるでしょう。

常に学ぶことを忘れない。エンジニアに求められていることです。
非エンジニアのためのvim

GROOVE Xという会社でエンジニアをやらせてもらってます。ロボット作ってます。
この記事が公開される頃には開発中のロボットが発表されてるはず！

弊社では、エンジニアだけでなくアニメーターと呼ばれる人たちがロボットの振る舞いを自分の手でプログラミングしています。

ほとんどのメンバーはCGアニメーションやゲームCGなどの制作経験者ですが、全員がIDEをつかってpython3を記述しているので、いつでもvimの使い方を説明できるように記事にしておこうと思います。

## vimについて

LinuxやMac(Unix系のOS)で主流のエディタviの拡張版のエディタがvimです。
大抵の環境にはviが入っていて、viを扱いやすくしたのがvimになります。
viやvimはコンソール上で実行するコマンドになってますが、別のウィンドウで立ち上げたりできるgvimというのもあります。
gvimは香り屋のが有名です。https://www.kaoriya.net
windowsでも使えるし、マウス操作が最初からできるのでまずはgvimから入るのがオススメ

## vimでプログラムを書くメリット

vimは書いたプログラムの編集に特化していて、キーバインド（ショートカットみたいなの）で操作することで、大量のコードを書く手間を減らすことができ、マウスもいらないのでsshでログインした先でもテキストファイルを編集することが簡単にできます。
IDEを使っていると、テキスト選択、スクロールなどはマウスを使ってやらないといけないですが、vimの場合そういった作業を全てキーボードだけで完結させられることができます。

## モード

vimには大きくカーソルモードとインサートモードがあります。
編集モードはその名の通り、テキストを編集するためのモードで、プログラムを書くときはこのモードでメモ帳のごとくタイピングをしてプログラムやテキストファイルを編集します。
カーソルモードは、テキストファイルを閲覧するのに特化してますが、コピペしたり、文字列を置換したりすることもできます。

## これだけ覚えてとりあえず触ってみて

起動時はカーソルモードで始まる、カーソルモードから抜けるにはiを押す
あとは思うままに編集する

## すっごい使いづらいと思う

何が足りないと思うかは素のvimを使ってから色々考えるのがいいです。
例えば、行番号を表示したい場合はカーソルモードで
:set number
と入力する
自動でインデントしたい場合は
:set indent
する
起動時に実行したい場合は~/.vimrcに記述する
そうやってvimの使い方を一つづつ覚えて行くのがvimと仲良くなるコツです。
最初はIDEに戻りたくなると思うけど、使っていくうちにIDEを使うよりも効率が良くなるタイミングが来るはず！
大切なことはスタートレックから学んだ - エンジニアの誇り -



スタートレックとは宇宙大作戦から始まるSFテレビドラマシリーズです（[wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%AC%E3%83%83%E3%82%AF)、[U.S.S. Kyushu](http://www.usskyushu.com/trek.html)）。複数の番組があり、制作された時代によって背景にあるテーマ（価値観）が異なっていて様々な刺激を感じます。

バブル崩壊後に公開されたスタートレック:ヴォイジャーは、バブル期のイケイケどんどんから新たな歩みを一歩ずつ進めていこうとする言葉がありました。

## きょうのことば

### 「栄光を築くのは戦士かもしれないけど、社会を築くのはエンジニアよ」
　　　　　　　　　スタートレック:ヴォイジャーの トレス中尉の言葉

戦士のところを企業戦士と読み替えてみてください。企業において営業や経営層は、売り上げに責任を持つことから、評価が高いかもしれませんが、実際にシステムを開発するのはエンジニアです。

利用者に喜ばれるシステムを作ることで信頼を勝ち取り、企業活動を通じて社会に貢献することで、その存続を担うのはエンジニアの仕事です。

開発が遅れたり、トラブルが生じる方が会社の利益になることもあるでしょうけど、「社会を築く」という誇りがより良いシステムの開発に我々を向かわせるのだと思います。
PowerApps で"ソースコード"比較してみた

#PowerAppsのソースコード？
PowerAppsはWebアプリケーションをExcelやPowerPointのような感覚で作成できる、Office365のサービスです。
アプリを作成する際には、フォームアプリを作る時のように、ボタンやラベル、データグリッド等を配置し、それらのプロパティを設定していきます。
フォームアプリと違って、「コードを書く」というよりは、各コンポーネントのプロパティを、(Excel関数のような)関数で指定していくという開発になります。もちろんアプリにはバージョン管理機能もあります。

ここで疑問。
**「PowerAppsでソースコードレビューってどうやるの？？」**
または
**「バージョン間のコード差分ってとれるの？？」**

これを簡単に確認したので結果をまとめておきます。

#PowerAppsのファイル構成
PowerAppsでアプリを作成したのち、基本的な保存先は各テナントにあるクラウド上になりますが、ローカルに保存することも可能です。(以降このファイルをmsappと呼びます)

ローカルには、*AppName*.msapp というファイルがダウンロードされます。このmsappファイルは、ファイルとしてほかのPCにコピーするなどして、ほかの環境で開く/編集することができます。
msappファイルを.zipにリネームし、これを展開してみると下図のようなファイルが含まれていることがわかります。
<img width="563" alt="zip_content.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/e5abede4-377f-8cc8-88f1-d30ff288eb90.png">

見てわかるとおり、PowerAppsのアプリは、jsonファイル+画像や音声などのメディアファイルの集合で構成されています。
Entities.jsonを覗いてみると、下図のように、アプリの各スクリーン、各パーツの定義、プロパティが含まれています。
<img width="622" alt="entites.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/202779/7c90c6eb-5feb-0771-0c24-41b2adfe24e5.png">
基本的には、**PowerAppsのソースコードをレビューするぞ！**といった場合には、画面からの確認が基本ですが、やるならこのEntities.jsonの中をレビューするのがよいと思われます。

#PowerAppsのソースコード差分
簡単に以下のようなアプリを作成してみました。
<img width="837" alt="setup.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/c8733ee9-e0ef-3f33-51b2-f34dfdf8b0dd.png">
ラベル1個と、そのテキストを書き換えるボタン2個で構成しています。
この場合のアプリ(バージョン1)をダウンロードし、先述の手順でEntites.jsonを抽出しておきます。

次に、ボタン位置と中のテキスト、そして書き換えるテキストを変更して保存します。(バージョン2)
<img width="449" alt="change.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/202779/791d2201-4e79-869c-8885-bb3105e22f13.png">
同様の手順で、Entities.jsonを抽出し、今回はVSCodeでDiffをとります。

##結果
差分が発生した部分のみ見てみると、以下のように、この簡単な変更でも、それなりにDiffがでています。
<img width="1086" alt="Button1.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/e796ed93-348a-2aeb-c2e8-4d9f37e561cc.png">

挙動を変えたボタンに関してのみ注目します。
<img width="1087" alt="Button2.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/0d4f2412-5240-e2e6-821a-d99cae789a11.png">
確かに、変更した部分のDiffが期待通り出ていることがわかりました。ただし、ボタンコントロールにくっついている謎のプロパティ(画面からは確認できない)も変更されていました。（上図で「謎」とある部分）


#結論
**PowerAppsはソースコード(jsonファイル群)のバージョン管理、ソースコード自体のレビューには不向き**かもしれません。
(差分の出方を完全に把握できれば別ですが)
また、1つのオブジェクトだけでもかなりの行数になるため、読むのが大変です。
もしPowerAppsのアプリをレビューする となった場合には、もともとの開発思想に則り、画面から各オブジェクトの設定されたプロパティを一個ずつ確認していきましょう。
【Go言語のimageパッケージと戯れる】第1回：画像ファイルを読み込む

# はじめに
Go超初心者がデフォルトパッケージを使ってみただけの内容です。
間違っている部分があれば優しく教えてください。

# Goのimageパッケージでできること
ざっくりと、以下のようなものが扱えるようです。

- アルファ値
- 色空間とグレースケール
- png/jpeg/gif画像

もっと具体的にどんなことができるのか、[公式](https://golang.org/pkg/image/)資料を見るだけではよくわからないので、とにかく使ってみます。


# 画像を読み込み
画像の読み込みはosパッケージを使います。

```go
file, _ := os.Open("{ファイルパス}")
```

# 画像情報の出力
今回は、読み込んだ画像の「フォーマット」と「サイズ」を出力してみます。
imageパッケージの[ `DecodeConfig` 関数](https://golang.org/pkg/image/#DecodeConfig)を使うことで、これらの情報を取得できます。

```go
config, formatName, err := image.DecodeConfig(file)
```

## jpegファイルを読み込み、フォーマットとサイズ情報を出力する
```go:main.go
package main

import (
	"fmt"
	"image"
	_ "image/jpeg"
	"log"
	"os"
	"strconv"
)

func main() {
	//画像ファイルを開く
	file, _ := os.Open("C://Users/user_name/Desktop/test.jpeg")
	defer file.Close()

	//設定をデコード
	config, format, err := image.DecodeConfig(file)
	if err != nil {
		log.Fatal(err)
	}

	//フォーマット名表示
	fmt.Println("画像フォーマット：" + format)
	//サイズ表示
	fmt.Println("横幅=" + strconv.Itoa(config.Width) + ", 縦幅=" + strconv.Itoa(config.Height))
}
```

## 実行結果
```
C:\Users\user_name\go\src\picture>go run main.go
画像フォーマット：jpeg
横幅=968, 縦幅=726
```

# RegisterFormat関数
imageパッケージの[`RegisterFormat`関数](https://golang.org/pkg/image/#RegisterFormat)を使用することで、
jpegをデコードで使用する画像フォーマットとして登録しています。
ここで、「ん？RegisterFormat関数なんて、ソースコード上で使っていないじゃないか！！！！」となりますよね。

実は、`_ "image/jpeg"`をimportする際に、RegisterFormat関数を使用しています。
そのため、`_ "image/jpeg"`をimport宣言から削除し、実行すると下記のようなエラーが出力されます。

```
C:\Users\user_name\go\src\picture>go run main.go
2018/12/02 22:55:34 image: unknown format
exit status 1
```

もちろん、`_ "image/jpeg"`の代わりに`_ "image/png"`をimportしても、同様のエラーが発生します。

# import宣言でのアンダースコア？

import宣言での_(アンダースコア)は、**ブランク識別子**と呼ばれます。
Go言語ではimportしたパッケージをコード内で使用しないとコンパイルエラーとなりますが
ブランク識別子を利用することで、依存関係を解決するためのimportであることを明示することができます。

また、ブランク識別子を利用すると、パッケージの中の関数は直接使わず
このパッケージの中にあるinit関数をコールします。
今回、実際に呼ばれているinit関数の中身は下記のように定義されています。

```go:image/jpeg/reader.go
func init() {
	image.RegisterFormat("jpeg", "\xff\xd8", Decode, DecodeConfig)
}
```

そのため、`_ "image/jpeg"`をimportすると、RegisterFormat関数が呼び出されます。
Node.js入門

# 概要
- ドットインストールで勉強していくメモ。
- 大量のリクエストを捌くのに向いている。

# 公式サイト
- https://nodejs.org

# 知識
- HTML/JavaScript

# 簡単なwebserverを作ってみよう

```:server.js
var http = require('http');

var server = http.createServer();

server.on('request', function(req, res){
 res.writeHead(200,{'Content-Type':'text/plain'});
 res.write('hello world');
 res.end();
});

server.listen(1337,'xxx.xxx.xxx.xxx');

console.log("server litening....");
```
合成数列の和アドベントカレンダー Pascal 編

合成数列の和アドベントカレンダー Advent Calendar 2018 の 2 日目です

# ルール
* 入力として正の整数 N を与えたら 4 から始まる 合成数 の数列の 1 番目から N 番目からの合計を出力してください
* N は最大で 100 とします

```pascal:test.p
program test(output);
var primeNumber,compositeCount,n,amax,num,sum: integer;
function IsPrime(n : integer) : boolean;
begin
	amax:=trunc(sqrt(n));
	if n mod 2=0 then
	begin 
		if n=2 then IsPrime := True
		else IsPrime := False;
	end
	else
	begin
		primeNumber:=3;
	while (n mod primeNumber<>0) and (primeNumber<=amax) do primeNumber:=primeNumber+2;
	if (n mod primeNumber=0) and (n>primeNumber) then IsPrime:=False
	else IsPrime:= True;
	end;
end;

begin
	read(n);
	num := 4;
	compositeCount := 0;
	while compositeCount < n do
	begin
		if not IsPrime(num) then
			begin
				compositeCount := compositeCount + 1;
				sum := sum + num
			end;
		num := num + 1;
	end;
	writeln(sum);
end.


```

#出力例

```
$ test //実行する
4 //Nの数を入力する
27 //結果

$ test //実行する
10 //Nの数を入力する
112 //結果

$ test //実行する
200 //Nの数を入力する
26558 //結果

```

# メモ
この問題は[ずんだ問題](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0)の番外編です
BitcoinKitを使って、たった9行で実装するビットコインウォレットアプリ

みなさん、ビットコインしてますか〜？
この記事は[Bitcoin Cash Advent Calendar 2018](https://qiita.com/advent-calendar/2018/bch) 2日目の記事です。

実装することのざっくりとした流れは以下

```
1. 秘密鍵の生成、アドレスの生成、QRコードの表示
2. アドレスにコインを受け取る
3. 受け取ったコインを他のアドレスに送金する
```
早速いってみましょう。

## 1. 秘密鍵の生成、アドレスの生成、QRコードの表示
```
let privkey: PrivateKey = PrivateKey(network: .mainnet)
let wallet: Wallet = Wallet(privateKey: privkey)
let qrCodeImage: UIImage = wallet.address.qrImage()
```
実は、たった3行でQRコードの表示までができます。
テストネット用にしたい場合は、PrivateKeyを生成する時の引数を `.testnet`に変更して下さい。

## 2. アドレスにコインを受け取る
まずは、他のウォレットアプリ等から、先ほど生成したアドレス宛に送金してみましょう。

以下の2行で、受け取ったコインの残高を確認できます。
balanceの単位はsatoshiでかえってきます。
（1億satoshi = 1 BitcoinCash）

```
wallet.reloadBalance()
let balance: UInt64 = wallet.balance
```

## 3. 受け取ったコインを他のアドレスに送金する
最後に、他のアドレスに受け取ったビットコインキャッシュを送金してみましょう。

```
let address = try! AddressFactory.create("bitcoincash:qz936smm809wq0eqthqyh2sgdzhs7v08nvnuq0dmps")
try wallet.send(to: address, amount: 10000)
```
まずはアドレスの文字列 `bitcoincash:qz936smm809wq0eqthqyh2sgdzhs7v08nvnuq0dmps` からAddressクラスを生成します。
walletクラスを使って宛先のAddressと送金したい量（satoshi）を指定すれば、すぐに送金することができます。たった2行。

ここまでたった7行で、ウォレットの機能としては一応一通り実装できたと思います！

## ※秘密鍵の保存
最初に生成したPrivateKeyは、毎回ランダムに生成されています。（生成するたびに違う秘密鍵になる＝受け取ったコインが取り出せなくなるので注意！）

ですので、通常PrivateKeyの生成を行うのは初回だけです。
初回に生成してそれを保存しておいて、後からは保存していた秘密鍵を使ってウォレットを生成します。

### 秘密鍵の保存
```
wallet.save()
```
デフォルトではUserDefaultsに保存されます。

### 保存していた秘密鍵を使ってウォレットを生成
```
let wallet: Wallet? = Wallet()
```
デフォルトではUserDefaultsに保存されている秘密鍵からWalletを生成します。

## 終わりに
以上で、この記事は終わりです。
合計たった9行でしたが、いかがでしたでしょうか？笑

この記事ではBitcoinCash（BCH）のウォレットを実装しましたが、BitcoinCore(BTC)などを使いたい方は、networkとWalletの各種引数を変更（自前で実装）すれば書けるようになりますので、興味があればチャレンジしてみてください。
Windows 10 October 2018 Updateを入れても勝手に戻るのを解決した話

# はじめに
Windows 10 October 2018 Updateが公開されたので、[Windows10更新アシスタント](https://www.microsoft.com/ja-jp/software-download/windows10)を使って手動で導入しました。
しかし`winver`を叩くと、なんとバージョンが上がっていません。
再度インストールを試みると、

>Windows 更新プログラムの構成に失敗しました。変更を元に戻しています

と表示されたので、途中で何かに失敗して、ロールバックしているようです。
対策を行ってOctober Updateを導入完了するまでの経緯を記します。

# 原因調査
困ったことに、**Windowsイベントログ・WindowsUpdate履歴には全く情報が記録されていません。**
代わりに、`C:\$Windows.~BT\Sources\Panther\setuperr.log` にセットアップ時のエラーが記録されています。
下記のようなログが記録されていました。

>"Failure Data: Last Phase = SafeOS,Start, Last Operation = Add [1] package C:$WINDOWS.~BT\DUImageSandbox\Microsoft-OneCore-DeveloperMode-Desktop-Package~31bf3856ad364e35~amd64~~.cab, Error = 0x800F081F-0x20003"

ログの文言で検索したところ、[情報が出てきました]
(https://www.repairwin.com/fix-windows-10-october-2018-v1809-update-installation-failed-error-0x800f081f-0x20003/)。

# 対策
以下の手順の実行後にOctober Updateを導入するとうまくいきました。
変更した設定は後で忘れずに直しましょう。

1. アプリのサイドローディングを有効にする
2. Windows開発者モードをアンインストールする
3. 再起動 

スクリーンショット付きの詳細手順は元記事を参照ください。
[FIX: Windows 10 October 2018 v1809 Update Installation Failed Error 0x800F081F-0x20003 (Solved) • Repair Windows™](https://www.repairwin.com/fix-windows-10-october-2018-v1809-update-installation-failed-error-0x800f081f-0x20003/)

# 参考元
[FIX: Windows 10 October 2018 v1809 Update Installation Failed Error 0x800F081F-0x20003 (Solved) • Repair Windows™](https://www.repairwin.com/fix-windows-10-october-2018-v1809-update-installation-failed-error-0x800f081f-0x20003/)
[Windows 10 1809 update "Undoing changes" - Microsoft Community](https://answers.microsoft.com/en-us/windows/forum/windows_10-update/windows-10-1809-update-undoing-changes/def7560f-2a8d-4a70-8ed4-d0a2dd0f613d)
GraphQLでレスポンスにCopyright表示を追加

# やりたいこと＝GraphQLのレスポンスにdataだけじゃなく説明とかいろいろ入れたい

Hiroyuki_OSAKIです。
GraphQLを使ってオープンデータを公開しようとしたら、オープンデータでもCopyright表示は必須、という条件をよく見ます。
そうするとどこに書かなければいけないのかというと、やはりAPIの返り値しか思いつきません。
でもGraphQL APIの返り値の形式はデフォルトでは`data`しか入っていません。

たとえば`data`以外に`meta`という要素をデフォルトで追記して、その中にcopyrightを入れるのはどうか。

```json
{
  "data": {
    "location": {
      "Japanese": "高知市",
      "Prefecture": "Kōchi",
      "Country": "Japan"
    }
  },
  "meta": { //ここを追加したい
    "data_origin": "Wikipedia",
    "source_url": "https://en.wikipedia.org/wiki/List_of_cities_in_Japan",
    "licence_type": "https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License"
  }
}
```

どうやれば説明などメタデータを追加できるのでしょうか。

# 返り値はformatResponseで変更できる

formatResponseでメタデータ（コピーライトなど）を入れてみましょう。
apollo-serverやgraphql-yogaを使えば、`server.start`のオプションに`formatResponse`を入れるとよいです。

```index.ts
  import { GraphQLServer } from 'graphql-yoga'
  const typeDefs = 'schema.graphql';
  const resolvers = { 
//略
  };

  const formatResponse = (response:any) => {
    var meta = {
      data_origin: "Wikipedia",
      source_url: "https://en.wikipedia.org/wiki/List_of_cities_in_Japan",
      licence_type: "https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License"
    }
    return {
      ...response,
      meta
    }
  }

  const server = new GraphQLServer({ typeDefs, resolvers })
  server.start({port: PORT, formatResponse}, () =>
    console.log(`Your GraphQL server is running now ...`),
  )
```

### 結果

お！できました！

```json
{
  "data": {
    "location": { //ここには任意のデータが出ます
      "Japanese": "高知市",
      "Prefecture": "Kōchi",
      "Country": "Japan"
    }
  },
  "meta": { //ここから追加したメタデータが表示。
    "data_origin": "Wikipedia",
    "source_url": "https://en.wikipedia.org/wiki/List_of_cities_in_Japan",
    "licence_type": "https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License"
  }
}
```
Git pull

よく手が止まるgit pullです。あれ、これ取り込んでいいのかな？とか、コンフリクトした！とか。
その度に「Git pull」と調べていたり、メモを見返してしまっています。
なので、メモにあったものを簡潔に、自分が悩まないようにQiitaにあげときます！
## Git pull
**最新のコミットを取得したいところで行なう。**

sampleはdevelopからブランチを切ったものとして、

```
master
develop
sample
```
sampleのリモートリポジトリが進んでいてローカルリポジトリを最新にしたいのであれば
**git pull origin sample**

developを最新にしたい場合は
**git pull origin develop**

以上！！普通にやればコンフリクトはしない！!
IFTTTでbioarxivの気になる分野の論文をつぶやくbotを作る

## はじめに
論文からの情報収集ってどのようにしていますか？
情報・数学・物理系だと[arxiv](https://arxiv.org/)上で色々見ている方がいることと思います。
先日arxivの生物学版[bioarxiv](https://www.biorxiv.org/)を見つけたので、気になる分野の論文がupされたら呟くbotを作ってみました。

## Twitter bot
と思ったらTwitterではすでに、bioarxivのほとんどの分野でTweetbotがありました。

 - Bioinformatics: https://twitter.com/biorxiv_bioinfo
 - Biophysics: https://twitter.com/biorxiv_biophys
 - Cancer Biology: https://twitter.com/biorxiv_cancer
 - Cell Biology: https://twitter.com/biorxiv_cellbio
 - Ecology: https://twitter.com/biorxiv_ecology
 - Evolutionary Biology: https://twitter.com/biorxiv_evobio
 - Genetics: https://twitter.com/biorxiv_genetic
 - Genomics: https://twitter.com/biorxiv_genomic
 - Microbiology: https://twitter.com/biorxiv_micrbio
 - Neuroscience: https://twitter.com/biorxiv_neursci
 - Systems Biology: https://twitter.com/biorxiv_sysbio

なので今回はまだなかったScience Communication & education分野のbotを作ってみました。
https://twitter.com/Science_comedu

## 方法
### 1. RSSのurlを調べる
「bioarxiv RSS」などでググると分野ごとのrssが検索できるページが出てきます。
science communation&educationを選ぶと[xmlが記述されたページ](http://connect.biorxiv.org/biorxiv_xml.php?subject=scientific_communication_and_education)が開かれるので、このurlをコピーしておきます。

### 2. 1.で出てきたurlをiftttに登録する
[ifttt](https://ifttt.com/discover)にログインし、My appletを選択します。
iftttでは、if(何があったら),then(どうする)という風に動作を設定することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258705/0be704c2-9770-d259-d137-cd1b098a0ea1.png)

なのでif(論文が更新されたら),then(つぶやく)という風な設定をします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258705/4f8c14b8-4b9e-ae39-9e22-07b1a984595f.png)
こんな感じで、設定が完了しました。

### 3. つぶやいているか確認する

twitterにログインして実際につぶやいているか確認します。

<img width="375" alt="F95C3B9E-3144-4257-AC20-CE7B7B1DB048.png" src="https://qiita-image-store.s3.amazonaws.com/0/258705/d5a28ae6-c910-1667-8214-3eb42f495873.png">

完成です。




## おわりに
今回はiftttを使ってTwitterのbotをつくりました。
しかし、最近はTwitterのアカウントをフォローするのもひと手間と感じるご時世だと思うので次回は同じifttを使ってslackに気になる分野の論文を通知する仕組みを作ろうと思います。
東北, 関東, 中部, 近畿, 中国, 四国, 九州を1つの配列でまとめ、中部を表示

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>4_8日本配列</title>
</head>
<body>
   <script>
        //東北, 関東, 中部, 近畿, 中国, 四国, 九州を1つの配列でまとめ、
        //中部を表示
        var area = ['東北', '関東', '中部', '近畿', '中国', '四国', '九州'];
        console.log(area);
        
        area.push('沖縄'); //沖縄を追加
        console.log(area);
        
        area.splice(0,2);//0番目から2個消す
        console.log(area);
        
        console.log(area.length);//areaに何個の要素がはいっているか？
        
        for (var i = 0; i < area.length; i++) { 
            console.log(area[0]);//0番目に中部がはいっているか確認
        }
        document.write(area[0]);//0番目の中部を表示せよ
    </script>    
</body>
</html>
```
Goでnet/httpしてみる

#目的
Goでhello worldの学習が完了したので、次にWebアプリ作ってみたいなーと思っていたところ、
net/httpなるパッケージを発見し早速動かしてみました。今回使用するコードは[Github](https://github.com/uguisuhohokekyo/webapp_gogo/tree/first_webapp)上にございます。

#net/httpとは？
Goのパッケージです。ドキュメントは[こちら](https://golang.org/pkg/net/http/)。
その名の通り、HTTPクライアントとサーバーの機能を実装するためのパッケージです。

#hello world!
まずはまずはhello worldですよね。[こちら](https://qiita.com/taizo/items/bf1ec35a65ad5f608d45)の記事を参考にさせていただきました。

```server1.go
package main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello, World")
}

func main() {
  http.HandleFunc("/", handler) // ハンドラを登録してウェブページを表示させる
  http.ListenAndServe(":8080", nil)
}
```

server1.goを実行します。

```
go run server1.go
```

localhost:8080にアクセスして、、、やりました、hello world!!
<img width="405" alt="スクリーンショット 2018-12-01 20.10.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/67c965d3-0437-a468-8339-597847b1cde6.png">

#解説
一体どうなっているのか、ドキュメントを参考にコードをみていきます。


##  http.HandleFunc("/", handler)
あたえられたURLパターン(第1引数)に対して、ハンドラ(第2引数)をDefaultServeMuxに登録します。(DefaultServeMuxは後ほど出てきます)
ハンドラとは、何らかのアクションをトリガーに実行される関数です。
つまり、第1引数で定義したパターンでリクエストが来たら、第2引数で定義したハンドラを呼び出すよ。ということです。

###第1引数　"/"
トリガーとなるURLパターンを登録します。試しに/helloに変更してみます。
/だと見つかりませんね。
<img width="351" alt="スクリーンショット 2018-12-01 20.35.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/e0d07452-88a1-2d70-c058-f8589d7e4692.png">
/helloだと見つかりました。
<img width="349" alt="スクリーンショット 2018-12-01 20.35.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/2dfaefcc-3915-adca-16c5-593bf25821c6.png">

###第２引数 handler
実行されるハンドラです。試しに2パターンセットしてみます。

```server2.go
package main

import (
  "fmt"
  "net/http"
)

func handler1(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "I am handler1")
}

func handler2(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "I am handler2")
}

func main() {
  http.HandleFunc("/hander1", handler1)
  http.HandleFunc("/hander2", handler2)
  http.ListenAndServe(":8080", nil)
}
```
/hander1の場合は（l抜けちゃいました）、handler1というハンドラが呼び出されるので、handler1と表示されます。
<img width="368" alt="スクリーンショット 2018-12-01 20.48.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/cad85f81-756b-9c7e-d2a1-1d1edbd5b7cd.png">

/hander2の場合は（l抜けちゃいました）、hander2というハンドラが呼び出されるので、handler2と表示されます。
<img width="379" alt="スクリーンショット 2018-12-01 20.49.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/c5603509-73a4-779f-24ba-d2086192043d.png">

##http.ListenAndServe(":8080", nil)
Listenするアドレスと、ハンドラーを定義しています。

###第1引数 ":8080"
TCPのネットワークアドレスを設定します。今回のようにhost部分の記載が省略されると、使用可能なインターフェースを利用するため、localhostが使用されています。:以降はポートですね。
今回の場合、localhostの8080でListenすることになります。

###第２引数 nil
ハンドラーを設定します。
nilを設定すると、DefaultServeMuxが使用されます。（HandleFuncで設定したやつです）

##func handler(w http.ResponseWriter, r *http.Request) 
ハンドラーを定義します。

###第1引数　w ResponseWriter
HTTPレスポンスを構成する際に使用されます。

###第2引数　r *http.Request
サーバーが受け取ったHTTP Requestのことです。*はポインタです。

##fmt.Fprintf(w, "I am handler1")
ResponseWriterであるwに"I am handler1"を書き込んでいます。

#まとめ
net/httpのhello worldでした。コードは[Github](https://github.com/uguisuhohokekyo/webapp_gogo/tree/first_webapp)上にございます。
【RHEL, CentOS, Fedora】Linux コマンドのソースコード取得方法

# ■ はじめに

本稿では、RHEL、CentOS、Fedora といった RedHat 系 Linux のコマンドに紐づくソースコードを取得するための方法を記載しています。

一例として、`dmesg` のパッケージである `util-linux` のソースコードを取得します。

# ■ 検証環境

```console:
[root@hst ~]# uname -r
4.18.11-200.fc28.x86_64

[root@hst ~]# cat /etc/fedora-release 
Fedora release 28 (Twenty Eight)
```

上記のとおり、検証環境は Fedora ですが、以降の手順は RHEL や CentOS でも使えるはずです。ただし、RHEL, CentOS, Fedora(21以前)の標準のパッケージマネージャは dnf ではなく yum なので、その点は注意です(具体的なコマンドは併せて載せています)。

# ■ ソースコードの取得方法

主な流れは次のとおりです。

- 確認したいコマンドのパッケージ名を確認
- 確認したパッケージのソースパッケージをダウンロード
- ソースパッケージからソースファイルを抽出

※ソースパッケージには、ビルドに必要なファイルなどソースファイル以外も含まれています。

## 1. 事前準備

はじめに必要なコマンドのパッケージをインストールします。

```console
// Fedora(22以降)の場合
[root@hst ~]# dnf install rpmdevtools
 
// RHEL, CentOS, Fedora(21以前)の場合
[root@hst ~]# yum install rpmdevtools yum-utils
```

次に実装を確認したいコマンドのパッケージ名を確認します(本稿では dmesg コマンドが対象)。

```console
[root@hst ~]# rpm -qf $(which --skip-alias dmesg)
util-linux-2.32-2.fc28.x86_64
 
※ .fc28.x86_64 はご使用の環境により変化します。
```

作業用のディレクトリを作成します(適宜)。以降は、ここで作業するものとします。

```console
[root@hst ~]# mkdir work && cd work
```

## 2. 手順

事前準備で確認したパッケージのソースパッケージをダウンロードします。

```console
// Fedora(22以降)の場合
[root@hst work]# dnf download --source util-linux-2.32-2.fc28.x86_64
 
// RHEL, CentOS, Fedora(21以前)の場合
[root@hst work]# yumdownloader --source util-linux-x.xx-x.xxx
```

カレントディレクトリに src.rpm ファイルがダウンロードされます。

```console
[root@hst work]# ls
util-linux-2.32-2.fc28.src.rpm
```

ダウンロードしたソースパッケージからソースファイル群を抽出します。

```console
[root@hst work]# rpmdev-extract util-linux-2.32-2.fc28.src.rpm
```

カレントディレクトリに util-linux-2.32-2.fc28.src というディレクトリが生成されますので、その中にある tar ファイルを解凍します。

```console
[root@hst work]# cd util-linux-2.32-2.fc28.src
[root@hst util-linux-2.32-2.fc28.src]# tar xvf util-linux-2.32.tar.xz
```

解凍すると、ディレクトリ(util-linux-2.32)の中にソースファイルが展開されます。

```console
[root@hst util-linux-2.32-2.fc28.src]# ls -l util-linux-2.32
total 2488
-rw-r--r--. 1 hp-spectre13 hp-spectre13   93787 Mar 21  2018 ABOUT-NLS
-rw-rw-r--. 1 hp-spectre13 hp-spectre13   66331 Mar 21  2018 aclocal.m4
-rw-rw-r--. 1 hp-spectre13 hp-spectre13   29121 Mar 21  2018 AUTHORS
-rwxrwxr-x. 1 hp-spectre13 hp-spectre13    3569 Sep 18  2017 autogen.sh
...
(snip)
...
drwxrwxr-x. 2 hp-spectre13 hp-spectre13    4096 Mar 21  2018 tools
```

最後に dmesg のソースファイルがどこにあるのか探してみます。

```console
[root@hst util-linux-2.32-2.fc28.src]# find util-linux-2.32/ -name "dmesg*"
util-linux-2.32/tests/expected/dmesg
util-linux-2.32/tests/ts/dmesg
util-linux-2.32/bash-completion/dmesg
util-linux-2.32/sys-utils/dmesg.1
util-linux-2.32/sys-utils/dmesg.c ★
```

C言語のソースファイルが見つかりました(dmesg.c)。

以上です。
Centos7にMiniSatをインストールする

MiniSatインストールに詰まったので自分用のメモ。

[MininSat公式HP](http://minisat.se/MiniSat.html)

#うまくいった方法
さんざん調べてよくわからなかったので、パッケージを探したらあるやん...
https://centos.pkgs.org/7/lux/minisat2-2.2.1-1.el7.lux.x86_64.rpm.html

```shell:
luxのレポジトリを登録して
sudo yum install http://repo.iotti.biz/CentOS/7/noarch/lux-release-7-1.noarch.rpm

インストール
sudo yum install minisat2
```

##うまくいかなかった方法
```shell:ソースのダウロードと解凍
wget http://minisat.se/downloads/minisat-2.2.0.tar.gz
tar -xvf minisat-2.2.0.tar.gz
```

READMEとかネット曰くこの後
make様のために少し手心を加える

```shell:ソースのダウロードと解凍
sudo export MROOT='pwd'
cd minisat/core
sudo make rs
```

がうまくいかないホントはこの後も手順があるが、そこまでのエラーが出る。

```shell:エラー
Linking: minisat_static ( core/Solver.or core/Main.or utils/System.or utils/Options.or )
/usr/bin/ld: -lstdc++ が見つかりません
/usr/bin/ld: -lm が見つかりません
/usr/bin/ld: -lc が見つかりません
collect2: エラー: ld はステータス 1 で終了しました
make: *** [minisat_static] エラー 1
```

stdc++とかのライブラリはもちろんインストールされているが、バーション情報がライブラリ名に付くのでうまく参照できないことがあるとか。
http://d.hatena.ne.jp/cou929_la/20080718/1216391301
usrとrootのlibやlib64をいじったがこれでも解決しなかった。
定期的に通知を出すAppleScript    



この記事は[DTP Advent Calendar 2018][calendar]の3日目の記事です。

macOSにはMountain Lion以降、通知センター機能が搭載されています。この機能を利用して定期的に通知を出すAppleScriptの紹介です。
なお、動作確認は10.12で行なっています。
  
風邪の季節ですので今回は予防効果が期待される（？）水分補給をうながすメッセージを15分ごとに、また、60分ごとに休憩をうながすメッセージを通知します。
これで、作業に集中しすげて数時間も椅子に座りっぱなしだった！！なんてことが防げるようになるのでは？

## コード  
``` AppleScript
(*
	定期的に通知を出す
	2018-12-03
*)

property f : 1

on idle
	
	set aTime to 15 --分単位で指定
	
	my main()
	return aTime * minutes
	
end idle

on main()
	
	set aTitle to "カサカサ警報"
	set aMess1 to "水分補給の時間です"
	set aMess2 to "そろそろ休憩を取りませんか？"
	
	if f is not 4 then
		display notification aMess1 with title aTitle
		set f to f + 1
	else
		display notification aMess2 with title aTitle
		set f to 1
	end if
	
end main
```
## 使い方  
上記コードをスクリプトエディタにペーストし、アプリケーション形式で任意の場所に保存します。  
その際、下図のように**ハンドラの実行後に終了しない**のチェックを忘れないようにしましょう。
忘れると1度の実行で終了してしまいます。

![saved.png](https://qiita-image-store.s3.amazonaws.com/0/7001/1422ef5f-93d8-41f9-eb30-850109882a54.png)
  
ダブルクリックで起動します。起動直度に1度目のメッセージがでます。その後、15分置きに通知が出ますので、終了させる場合はアプリケーションを最前面にし、終了させてください。

## 解説  

というほどのことはしていないのですが……

`on idle`を使うことで定期的に処理を実行させることができます。
`return`の後ろの数値で実行間隔を秒単位で指定します。今回は分単位で実行するので`minutes`定数を掛けています。  

それぞれの変数は下記の通り指定します。

```AppleScript
display notification "通知したい本文" with title "タイトル" subtitle "サブタイトル" sound name "Glass"
```
サウンドは`/System/Library/Sounds`にある音源を指定します。

## おまけ
通知センターのメッセージはSystem Eventsで取得できます。
通知メッセージごとに別の処理を走らせるなんて使い方ができるのではないでしょうか？

```AppleScript
display notification "メインタイトルが取れない！" subtitle "サブタイトル"
delay 1

tell application "System Events"
	tell process "通知センター"
		
		set notificationWindow to window 1 whose subrole is "AXNotificationCenterAlert" or subrole is "AXNotificationCenterBanner"
		
		tell notificationWindow's scroll area 1
			set aSub to static text 1's the value
			set aMessage to static text 2's the value
		end tell
		
		tell application "Finder" to display dialog aSub & return & aMessage buttons {"OK"} default button "OK"
		
	end tell
end tell
```

と、思ったのですが以前できたようには取得できない……
参考のサンプルは動作するので確認できるのですが、これを`on idle`でリピート処理しようとすると取得できないようで、あれこれ試しているうちに時間切れ。
返り値も変わった気がするし当時とはOSのバージョンが違うからなのかな〜

## リンク
最後に[公式ドキュメント][doc]（2018-12-12現在）のリンクを紹介して結びにしたいと思います。



[calendar]:https://adventar.org/calendars/3126
[doc]:https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/DisplayNotifications.html
[Julia] Jupyter NotebookからJuliaを利用する方法

[公式のJulia downloads](https://julialang.org/downloads/)に従いjuliaのパッケージをインストール後にjuliaを起動させてJuliaのコンソール上で下記操作を行います。
*Jupyter notebookはすでに導入済みであることを想定しています。
#Jupyter NotebookからJuliaを利用する設定
Juliaのコンソールに以下のコマンドを入力します。
終了したらプロンプトが出てきます。

```Julia:usingPkg
julia> using Pkg
julia> Pkg.add("IJulia")
```
実行すると、下記のようにインストールとビルドが始まります。
<img width="571" alt="Screen Shot 2018-12-02 at 9.31.14 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/315941/1aaaf805-59af-5f63-c881-a4ae074e7732.png">

Buildingが終わるまでしばらく待つ。

```Julia:Building
 Building Conda ──→ `~/.julia/packages/Conda/uQitS/deps/build.log`
 Building ZMQ ────→ `~/.julia/packages/ZMQ/ABGOx/deps/build.log`
 Building MbedTLS → `~/.julia/packages/MbedTLS/r1Ufc/deps/build.log`
 Building IJulia ─→ `~/.julia/packages/IJulia/DL02A/deps/build.log`

julia> 
``` 
 **julia>** が表示されたら、**using IJulia**を実行します。


```Julia:IJulia
julia> using IJulia
[ Info: Precompiling IJulia [7073ff75-c697-5162-941a-fcdaad2a7d2a]
```
これで設定は完了です。jupyter notebookを立ち上げてNewのタブでJuliaが出てきたら成功です。
<img width="168" alt="Screen Shot 2018-12-02 at 10.05.01 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/315941/f049e892-b0bf-ccf1-2435-d2da6844c5ce.png">
ReactNative Androidで 『Unable to load script from assets index.android.bundle』エラーが出た時の対処法

## はじめに
`Unable to load script from assets index.android.bundle` 関係は様々なエラーが存在していて毎回忘れるので発生する度に追記していきます。

## エラー内容(1)
今回の場合は、 `index.android.bundle`が読み込めないよってエラー。

```react:error
Unable to load script from assets 'index.android.bundle' Make sure your bundle is packaged correctly or you're running a packager server.
```

### 解決方法
`android/app/src/main/assets/` 配下に `index.android.bundle` を生成する必要があるので以下のコマンドを実行。
 
```
$ mkdir android/app/src/main/assets
$ react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
$ react-native run-android
```
以下2ファイルが生成されてエラーが解消される。
`index.android.bundle`
`index.android.bundle.meta`
Hugo の置換で Markdown から生成した HTML を加工する

Hugo で Markdown から生成した HTML 要素に class を付与したいことがある。その方法を紹介をする。


## 置換方法

結論から言うと、

```
{{ .Content }}
```

を次のように書き換えれば良い。

```
{{ .Content | replaceRE "<p>" "<p class=\"myclass\">" | safeHTML }}
```

上では p タグに `myclass` というクラスを追加している。追加というよりは hugo の置換機能を使って実現している。


## 具体的な手順

Hugo に慣れていない人のために具体的な作業内容を紹介する。例として次の Hugo Theme を用いる。

- [Future Imperfect | Hugo Themes](https://themes.gohugo.io/future-imperfect/)

### 修正すべきファイルを探す

テーマの中のファイルで `.Content` を含むファイルを探す。

```sh
$ grep -r "\.Content" */**/*.html
...
themes/hugo-future-imperfect/layouts/post/content-single.html:    {{ .Content }}
...
```

- [hugo-future-imperfect/layouts/post/content-single.html](https://github.com/jpescador/hugo-future-imperfect/blob/master/layouts/post/content-single.html)

いくつかファイルがヒットするが、今回は記事ページに変更を反映させたいのでこのファイルのみを編集する。

### ファイルのコピー

ファイルを編集するとは言っても、 Hugo では `themes/` 以下の編集は推奨されていない。テーマのアップデートがしにくくなるからである。

今回の場合だと次のようにして

```sh
mkdir -p layouts/post
cp themes/hugo-future-imperfect/layouts/post/content-single.html layouts/post/
vim layouts/post/content-single.html
```

同名ファイル `layouts/` 以下にコピーしてそれを編集すれば `themes/` のものより優先されて読み込まれるので、テーマのソースを汚すことなくテーマのカスタマイズができる。

次のようなディレクトリ構造になっていれば良い。

```
layouts/
├── post/
│   └── content-single.html
themes/hugo-future-imperfect/layouts/post/
├── ...
├── content-single.html
├── ...
```

個人的には theme を fork して submodule として取り込み、ブランチを切ってそこで管理しても良いと思う。テーマへの Pull Request も出しやすくなるし。


### 書き換え

例えば p タグに `myclass` を付与したい場合は `layouts/post/content-single.html` の中の `{{ .Content }}` を次のように書き換えれば良い。

```
{{ .Content | replaceRE "<p>" "<p class=\"myclass\">" | safeHTML }}
```

Markdown から HTML に変換したものを `replaceRE` で置換して、 `\` とかを消すために `safeHTML` に食わせる、というパイプ処理である。


### 確認

```sh
$ hugo
$ cat ./public/blog/creating-a-new-theme/index.html
...
<p class="myclass">Hugo is Static Site Generator</p>
...
```

`{{ .Content }}` で生成される p タグにクラスが付与されていることが確認できる。

ʕ◔ϖ◔ʔ


## 参考

- [replaceRE | Hugo](https://gohugo.io/functions/replacere/)
- [safeHTML | Hugo](https://gohugo.io/functions/safehtml/)

<!--
- https://twitter.com/kamishibusan/status/1062245100040859649
- [[Solved] Adding class attribute to p tags in {{ .Content }} - Hugo Discussion](https://discourse.gohugo.io/t/solved-adding-class-attribute-to-p-tags-in-content/7615/6)
-->
MongoDBとmetabaseでjsonファイルを見やすくしたい 前編

この記事は<a href="https://qiita.com/advent-calendar/2018/nifty">ニフティグループ Advent Calendar 2018</a> 2日目の記事です。
1日目は@winterwindさんの<a href="https://qiita.com/winterwind26/items/94fed1c570a7aadb6067">S3 に画像が保存されたら自動でAmazon Rekognitionの画像分析を実行する</a> でした。

<hr>
手元にゲームの戦績データが入ったjsonがあるのですが、結構複雑で1個1個のデータが大きくてふつうにパースするのもちょっと面倒な感じです。
本稿は、そんな感じのjsonをいい感じに可視化してみようと試みた記事です。

やったこととしては

- MongoDBにJSONデータを突っ込む
- metabase(https://www.metabase.com/) とMongoDBを連携する
- というのをDocker上で完結させる

といったかんじです。結構簡単にできます。

# 立ち上げるまで
1. docker hubからMongoDBのimageをpullする

```
$ docker pull mongo
```

2.metabaseのimageもpullする

```
$ docker pull metabase/metabase
```

3.docker-compose.ymlを記述する

```docker-compose.yml
version: "2"
services:
  metabase:
    container_name: "metabase"
    image: metabase/metabase
    ports:
      - "3000:3000"
  db:
    container_name: "mongo"
    image: mongo
    ports:
      - "27017:27017"
    volumes:
      - ./:/tmp
```
mongoのvolumesは、ホスト側には自分がmongoにつっこみたいjsonファイルのあるディレクトリを指定して、
コンテナ側にはとりあえずtmpを指定しました。
IPASSはローカルなのでとりあえず無し。


4.コンテナを立ち上げる

```
$ docker-compose up
```

これで環境が整いました。とても簡単。Dockerってすばらしいですね・・・・・・。
これでバックグラウンドでMongoDBのコンテナが起動した状態になります。

# コンテナの中に入る
```
$ docker exec -it mongo /bin/bash
# cd tmp
# ls
hoge.json
```
コンテナ起動時に指定したディレクトリに移動してlsするとローカル側のファイルがあることが確認できるはずです。


# jsonファイルをつっこむ
`mongoimport`コマンドでjsonファイルをimportすることが可能です。

```
mongoimport --db db_name --collection collection_name --type json --file hoge.json 
```
db_nameとcollection_nameは任意の好きな名前をつけます。
collectionというのはMySQLなどで言うところのテーブルです。
とくにDB・テーブルを作成するという操作が無くてもinsertできました。

# 中身を確認する
`mongo` と入力することでmongoのコマンドラインが起動します。

```
# mongo
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017
後略
---

> use db_name
switched to db db_name
> db.collection_name.find()
# 結果が出る
```

# metabaseの設定をする
名前やメールアドレスなどは任意のものを入力します。DB追加の部分は以下のように設定。

- 名前
    - dashbordで見つけやすい名前
- ホスト
    - MongoDBのコンテナの名前。上記のymlだと"mongo"にしています。
- ポート　
    - ymlに記述した値。上記だと27017
- データベース名
    - JSONをinsertしたときにつけたDBの名前を設定。

おそらくこれでmetabase側でDBの情報が適当にグラフ化されたりするはず。
<img width="1025" alt="スクリーンショット 2018-12-02 21.56.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/208347/f0b4ed24-6169-8ba0-8634-68cbaa1bf792.png">

クエリを書かなくても簡単なグラフ作ってくれるのはかなり便利ですね。
こんな感じでわりとシンプルな手順で複雑なjsonがいじりやすく、可視化しやすい状態になりました。

<a href="https://qiita.com/motaHack/items/49d45c07c61f286851ec">後編</a>につづきます。

# 参考文献
https://open-groove.net/mongodb/mongodb-shell-eval/
https://qiita.com/saba1024/items/f2ad56f2a3ba7aaf8521



3日目は@machinanetteさんの「サンタのおもちゃをmicro:bitで制御する」です！
Elmを始めたらプログラマーとして成長してしまった話

## はじめに

[今勢いのある言語 Elm](https://qiita.com/ababup1192/items/c48df0495728f89f756a)を始めて4ヶ月も経ったのですが、こんな変化がありました。

* **質の高いプログラムを書けるようになった**
* **開発のストレスがなくなった**
* **社会人としても成長できちゃった**

今回はその話と、自分で作ったアプリの紹介をしてみます。

Elm自体の解説や入門する方法は書かないことにします。Elmを始めるには上記事にある**[公式ガイド](https://guide.elm-lang.org/)を読むのが一番**だと考えているからです。[(日本語版も)](https://guide.elm-lang.jp/)



## なぜこれを書くか

私は未経験からSIerに就職してJavaとかJavaScriptとかを2年くらいやったのち、Web系に転職してElmを使い始めて4ヶ月の人です。半年くらい前までaltJSという概念すら知りませんでした。

このようにモダンな言語をそんなに知らない人でも簡単に使えるようになったよ〜という事例を紹介することで、過去の私と同じような人に価値を感じてもらうために書いています。

とはいっても関数型言語という敬遠されがちなものですし、[Elmに向いていない人もいる](https://qiita.com/arowM/items/dfb38d1c5f3dfde8b8bf)ことには注意していただきたいです。



## Elmを始めてから何が変わったか

### コードの質が上がった

ストレスの原因は人それぞれですが、私はこんな感じです。

* コードの書き方が時と人によってバラバラ

ところでElmは**プログラマーに書き方の選択肢を与えすぎない**ように作られています。[Elm0.19の変更点](https://github.com/elm/compiler/blob/master/upgrade-docs/0.19.md)を見てもわかるように複数の機能がremoveされており、不要なテクニックを使ってしまうリスクを最小限にとどめてくれています。

したがってElmでプログラミングを行えば自然と統一感のあるきれいなコードになります。私も過去の自分や他人のコードに悩まされることがなくなり、ストレスから開放されました。

### ランタイムエラーに悩まされなくなった

ストレスの原因は人それぞれですが、私はこんな感じです。

* デバッグ

ところでElmはコンパイル時にほとんどのエラーを検出してくれます。私は今のところ**実行時エラーを起こしたことがありません**。

型を定義してそれっぽく書いたあとはコンパイラの示すとおりに直していくだけで、いつの間にか意図したとおりに動くプログラムが出来てしまいます。まるで魔法のようです。

そしてがんばってブラウザ上でデベロッパーツールを開きながら動かしてバグを探す時間がほぼ0になり、ストレスフリーになりました！他言語ではミスを量産してしまう**弱小プログラマーほどElmから授かる恩恵が大きくなる**と思います。私がそうです。

### 公式ドキュメントの重要性に気づいた

書き方がよくわからないからとりあえずググって上の方に出てきたやつをコピペして終わらせたら、実はコピペ元がバグを含んでいたor間違ってて動かなかった、という経験をする駆け出しプログラマーは後を絶ちません。

このように現代社会では真偽のわからない情報がネット上に溢れており、調べものをするたびに何が正しいかを判断するためには大きな時間と手間が必要です。一次ソースに当たることでこれを解決することが出来ますが、私たちは検索エンジンが推すものは信用できるだろうという刷り込みからなかなか抜け出せません。

しかし、[Elm界においてはきれいにまとまった公式ドキュメントがあり、困ったときはまずこれを参照することが基本的に最適解であるとされています](https://qiita.com/arowM/items/5ec5853298fc880353b7)。
(もちろん、公式でなくてもサンプルコードや記事を読んで理解の助けとすることも非常に大切だと思います)

Elmで公式ドキュメントを読みながら効率よく開発をする経験を通じて一次ソースの重要性を認識し、デマに踊らされることのない一人前の社会人に成長することができました。



## 自分で作ってみたもの

ElmとFirebaseを使ってチャットアプリを作りました！

![Screenshot from 2018-12-02 01-07-50.png](https://qiita-image-store.s3.amazonaws.com/0/239916/352bb36f-174a-8585-2a6e-3eaa6885ce89.png)

とりあえず[GitHub](https://github.com/qnoyxu/chat-room)に上げてみました。

* ページが開かれたらまずダイアログを出して
* 名前を入力してもらって(入力が空文字だったらGuest-[3桁の数値]にして)
* それをlocalStorageに保存して
* Firebaseから過去メッセージを取ってきて
* チャットルームを表示して
* メッセージを送信してもらって
* 送信されたメッセージをFirebaseに保存する

というアプリです。

参考にしていただけたら嬉しいですが、それより公式ガイドを読んで自分で何か作るほうが建設的だと思います。

初めてElmのアプリを一から作ってみましたが、自動スクロールの実装方法を調べるのに少し苦労した程度で、CSSのほうがよっぽど大変でした。開発中に発生したランタイムエラーはFirebaseとかlocalStorageを書いたJSの部分だけです。Elmすごい！



## おわりに

知識の乏しい弱小プログラマーでも、Elmのおかげで4ヶ月で誰の手も借りずにアプリを作れるまでになりました。

入門して半年足らずで質の高いプログラムをストレスなく開発できるようになるうえに、プログラマーに留まらず社会人としても成長できるなんて最高じゃありませんか？

私もElm界にもっと貢献していきたいと思います。
スタートアップのWebサービス開発ことはじめ

## はじめに

### 紹介するサービス
3年間ほどスタートアップの中で働いてみて、このツールは使った方が良いなー、次やるなら最初から導入したいなーとか思ったものを紹介します

以下のことを考えて導入したりしてます

- 「導入コストが極力かからず、メンバーがすぐに使える」
- 「日々の業務を属人化させないためのフレームワークになる」



## 導入した方が良いと思ったサービス

### サービスの利用者状態を知る
**[Google タグマネージャ](https://tagmanager.google.com/#/home)**
プロダクトのクリックイベントとか計測していますか?そのときにプロダクトに直接コードを書き込んでいませんか?
GTMを使うとプロダクトとは独立してスクリプトの埋め込みを行うことが可能です、バージョン管理できたりとか結構機能がリッチなので暇を見つけて習得しておくと結構便利です。
GAの埋め込みもGTMで出来るのでとりあえず入れましょう。

**[アナリティクス](https://analytics.google.com/analytics/)**
言わずとしれた計測ツール
LPなどの集客サイトはもちろん、プロダクトに埋め込んで使われている機能やユーザーの行動を可視化することができます。


### サーバーの状態を知る
**[Mackerel](https://mackerel.io/ja/)**
サーバーの監視とかモニタリングとかやってくれる。
サーバーに求められるスペックやディスクの空き容量は日々変化します。
突然サーバーが落ちて、原因調査を行って半日潰す前に入れましょう。

**[New relic](https://newrelic.com/)**
アプリケーションのパフォーマンス計測ツールです。
使用頻度の高いメソッドや重いメソッドなどが一目で分かるので改修の優先度がつけやすいです。
また、Apdexというユーザーの満足度を計測する独自指標があります

参考: 

- [New Relicを使ってる人に見て欲しい指標。「Apdex」 - Qiita](https://qiita.com/g08m11/items/70d730593458ae0f1a55)


### タスク管理
**[Trello](https://trello.com)**
カンバン式のタスク管理
小さい機能ごとにプロジェクトを立てて進捗を可視化しましょう
最初からissueなどを活用するのもアリですが、メンバーにgithubを使い慣れていないメンバーがいる場合はtrelloの方が抵抗なく導入できます

**Github Isuue**
Githubを使って開発しているなら使わない理由はないかと思います
使いつづけることで、issueは開発の歴史(ドキュメント)にもなり、過去の判断やなぜそうしたのかを記録しておくことができます

### ドキュメントをどこに書くか決める
**Github wiki**
ドキュメントは早いうちにどんどん書いて溜めましょう
READMEなども活用して、作業手順やチームのナレッジを溜めましょう
Github wiki は変更差分が残るので間違って編集した場合なども遡ることができます
差分があると、変更するときの心理的な負荷が減るのでおすすめです

**[esa - 自律的なチームのための情報共有サービス](https://esa.io/)**
次に、同じく変更差分の管理ができるサービスの紹介です
esaにはWIPとShipという概念があり、まだ未完成のドキュメントも気軽に書いて溜めておくことができます

ドキュメントの重要性ですがプロダクト開発を1、2年もやっていると何でこの機能あるんだっけ?みたいなことも起きたりするので、議事録や目的を溜めておける場所はさっさと作って損はないと思ってます


### 開発の品質
**フルスタックなフレームワークを使う**
最低限のセキュリティや開発速度を保つには「どれだけ自分たちで作らないか」が重要だと思ってます
フレームワークを使うことで一般的に作られている機能などはフレームワーク自体や周辺のライブラリでサポートされています
どんどん使って自分たちが本当に作りたいコア機能に集中しましょう

具体的には以下のフレームワークとかです

- [Ruby on Rails](https://rubyonrails.org/)
- [Django](https://www.djangoproject.com/)
- [Laravel](http://laravel.jp/)

**[Sider - GitHub対応のコードレビュー自動化サービス](https://sider.review/ja)**
静的解析ツールを実行してくれるサービスです

Railsのセキュリティチェックをしてくれる[Brakeman](https://github.com/presidentbeef/brakeman)などがサポートされています

静的解析ツールを入れるときにでてくる以下のような課題を吸収してくれるサービスです

- 自前でCIを立てる時間がない! => Siderを導入で解決
- 設定ファイルを作るのが大変! => Siderがデフォルトの設定ファイルを持っているのでそれを使うだけ
- 途中から導入するとエラーが大量に出て導入コストが大きい => コミットした差分だけ解析するのでコストが減!

最後の差分だけ解析するってのが最高に良いですね

### リポジトリのホスティング
**[GitHub](https://github.com/)**
ホスティングには他にも色々とサービスはありますが、外部サービスとの連携という点では一番良さそうな印象があります
コスト的に難しい場合は、GitLabなどの選択肢もありですが、タイミングをみてGithubへ移行したいですね

### チームビルディング
[フィードバックの仕組みをつくるHRサービス TeamUp[チームアップ]](https://www.teamup.jp/)

開発メンバーが多くなってくると、チームや個人のサポートも必要です
チーム内でのフィードバックを行うことでメンバーの成長を促したり、細かい認識のすり合わせを行うことで業務効率化にもつながります
TeamUpでは1on1や360度フィードバックを実施するためのフレームが提供されるので、メンバーへ負荷なく導入することができます

参考:

- [1on1とは？ ヤフーが導入した上司・部下の個人面談、目的、効果について【導入方法、導入事例】 - カオナビ人事用語集](https://www.kaonavi.jp/dictionary/1on1/)
- [TeamUp MAGAZINE](https://www.teamup.jp/column/)

## 最後に

### 紹介したものに関して
あたりまえですが、最初から全て導入するのは難しいです
導入できる部分から始めて下さい

また、紹介していないものも多いです、他にも色々あると思うのでちゃんと比較検討してください
長期的にはインフラのコード化とか経営・財務のためのサービスとか諸々必須です

### 他のツールなども教えてください!
自分の知っている・使ったことのある範囲で書いているので、もっと良いツールあるよとかあればコメントで教えてください!
編集リクエストで追記なども歓迎です!!