OmniAICreator/Qiita-1.07M huggingface dataset:
Vue.js・Nuxt.jsを導入している企業・サービス一覧

ここ数年でVue.jsの導入事例が増えてきたので、一覧にまとめてみました。
技術ブログ、勉強会やカンファレンス資料などが中心です。

調べて見ると、導入理由、既存システムからの移行など、とても参考になるものばかりでした。
他にも導入しているサービスがあれば、随時更新していきたいと思います！

### Vue.jsを導入している国内の企業・サービス一覧

ZOZOテクノロジーズ
https://speakerdeck.com/amatsukiku/frontend-architecture-design-of-zozo

LINE
https://www.slideshare.net/linecorp/vue-fes-japan-2018-line-lunchlt-121657290
https://speakerdeck.com/noraesae/linetonuxtfalsehua

DMM
https://inside.dmm.com/entry/2018/07/12/components

note
https://note.mu/konpyu/n/n9b7bf4343514

マンガZERO
https://blog.nagisa-inc.jp/archives/2980

一休com
https://user-first.ikyu.co.jp/entry/2018/10/09/080000

Retty
https://engineer.retty.me/entry/2018/12/01/120019

RoomClip
https://speakerdeck.com/keisukeponpoko/roomclip-false-nuxt-dot-js-yi-xing-falsehua-d22b54df-2c6e-46df-ae77-eb7b09d485b1

さくらインターネット
https://yamanoku.hatenablog.com/entry/2017/10/31/%E3%80%8C%E3%81%95%E3%81%8F%E3%82%89%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AF_Vue_js_%E3%82%92%E3%81%93%E3%82%93

ITプロパートナーズ
https://tech.itpropartners.jp/entry/2018/12/04/132144

M3
https://suzan2go.hatenablog.com/entry/2018/11/10/225810

SCOUTER
https://techblog.scouter.co.jp/entry/2018/03/19/115229

リクルートライフスタイル
https://speakerdeck.com/yug1224/nuxtmeetup-number-4

Gunosy
https://tech.gunosy.io/entry/admin-vue-go

DeNA
https://www.slideshare.net/dena_tech/vuejs-denatechcon-72603570

TERIYAKI
https://speakerdeck.com/tameto/nuxtfalsepurodakusiyonshi-li

Codeal
https://www.codeal.work/contents/archives/6448

CoupLink
https://tech.linkbal.co.jp/4834/

（2020/2/4追記）
ALIS
https://alis.to/AB2/articles/34ZkxZ1pwylQ

（2020/3/14追記）
Vue Fes Japan
https://github.com/vuejs-jp/vuefes

（2020/6/19追記）
NoSchool
https://qiita.com/mejileben/items/f68a50ec9164b261b9cd

（2020/10/27追記）
MERY
https://mery.dev/1145

（2021/1/21追記）
クラウドワークス
https://note.com/contrabass/n/nf7931eb0c905

他にも知ってるサービスあればコメントでお知らせください！
一緒にVue.js、Nuxt.js界隈を盛り上げましょう！
WPFにてRIchTextの中にあるHyperlinkのクリックイベントが動作しないときにすること

# はじめに
- WPFにて、RichTextを使用していたときに、中に追加したHyperlinkのクリックイベントが発生しなかった。

# TL;TD
- RichTextに、以下のプロパティを設定する
  - isReadOnly = true
  - IsDocumentEnabled = true

# ソースコード
```sample.xaml
<RichText isReadOnly=true IsDocumentEnabled=true>
    ・
    ・
    ・
</RichText>
```
必要に応じてHyperlinkを中に設定してみてください。

# 参考
[Clicking HyperLinks in a RichTextBox without holding down CTRL - WPF
](https://stackoverflow.com/questions/762271/clicking-hyperlinks-in-a-richtextbox-without-holding-down-ctrl-wpf)
S3に格納したcsvファイルのレコード数をCLIから取得する

Amazon S3 Select を利用して S3 に格納してある csv ファイルのレコード数を取得してみました。

# 使い方
レコード内に改行コードが含まれていても、1レコードとしてカウントされます。
`KEY_PATH`がフォルダなら再帰的に検索してくれます。

```
$ s3_cnt
Usage: s3_cnt [BUCKET_NAME] [KEY_PATH]

$ s3_cnt hoge-bucket hoge/fuga/
hoge/fuga/test1.csv :          100
hoge/fuga/test2.csv :          1022
hoge/fuga/foo/test3.csv :      100
hoge/fuga/foo/bar/test4.csv :  200
```

# 前準備
インストールしておいてください。

- [AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html)
- [AWS SDK for Python (Boto3)](https://aws.amazon.com/jp/sdk-for-python/)

# スクリプト作成
### 利用環境
```
$ cat /etc/system-release
Amazon Linux 2
$ python -V
Python 2.7.14
```

### Python
```s3_cnt.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import argparse
import boto3

def get_args():
    parser = argparse.ArgumentParser()

    parser.add_argument("bucket", help="input bucket name", type=str)
    parser.add_argument("key_path", help="input file path", type=str)
    args = parser.parse_args()

    return(args)

def get_s3_response(bucket, path):
    s3 = boto3.client( 's3', 'ap-northeast-1')

    response = s3.select_object_content(
        Bucket              = bucket,
        Key                 = path,
        ExpressionType      = 'SQL',
        Expression          = 'Select COUNT(1) from S3Object s',
        InputSerialization  = {
            'CompressionType': 'NONE',
            'CSV': {
                'FileHeaderInfo'                : 'Use',
                'RecordDelimiter'               : '\n',
                'FieldDelimiter'                : ',',
                'AllowQuotedRecordDelimiter'    : True    # Falseだと改行コードでレコードが分かれる
            }
        },
        OutputSerialization = {
            'CSV': {
                'RecordDelimiter'   : '\n',
                'FieldDelimiter'    : ','
            }
        }
    )
    return(response)

def main():
    args = get_args()

    response = get_s3_response(args.bucket, args.key_path)
    for event in response[ 'Payload' ]:
        if 'Records' in event:
            records = event[ 'Records' ][ 'Payload' ].decode( 'utf-8' )
            print( records )

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

### Bash
`s3_cnt.py` と `s3_cnt.sh` は同階層に置いてください。

```s3_cnt.sh
#!/bin/bash

if [ $# -ne 2 ]; then
  echo "Usage: $0 [BUCKET_NAME] [KEY_PATH]" 1>&2
  exit 1
fi

FULL_PATH=$(realpath $0)
cd $(dirname $FULL_PATH)

BUCKET_NAME=$1
KEY_PATH=$2

S3_ARRAY=`aws s3 ls $BUCKET_NAME/$KEY_PATH --recursive`

CSV_ARRAY=()
for data in ${S3_ARRAY[@]}; do
    if echo $data | grep -q '.csv' ; then
        RECORD_VAL=`python s3_cnt.py $BUCKET_NAME $data`
        echo -e "$data : \t$RECORD_VAL"
    fi
done

exit 0
```

# シンボリックリンク張る
```
$ ln -s /usr/local/bin/s3_cnt /path/to/s3_cnt/s3_cnt.sh
```

以上

# 参照
- [AWS 公式リファレンス](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/s3-glacier-select-sql-reference-select.html)
- [Amazon S3 Select が一般公開されたので使ってみた（Python）](https://dev.classmethod.jp/cloud/aws/sugano-040-s3-select/)
SwiftFormatの導入方法メモ

# はじめに
転職してはや10ヶ月が経ちました
業務でAndroid開発（Kotlin）を行っていたのですが並行して少しずつSwiftも書き始めました。
そこでAndroidStudioではCodeフォーマットがしっかりしているので
チーム開発を行っていてもコードの体裁が崩れなかったのですが、
Swiftで開発を行った時にコードレビューでメソッド名と{}にスペースがないよって指摘を受けたときに、
そこらへんをいちいち手動で直すのも大変だなと思いSwiftFormatを導入する経緯に至りました。
調べたら全然日本語の記事がなかったので簡単なメモとしてこの記事を書くことにしました。

# インストール&使用方法
[SwiftFormat](https://github.com/nicklockwood/SwiftFormat)
* スター数:2451(2018/12/21時点)

1.上記からcloneかzipでダウンロードする

2.DLしたものからSwiftFormat-master/EditorExtension/SwiftFormat for XcodeをApplicationFolderにドラッグ&ドロップする

3.システム環境設定→拡張機能→Xcode Source Editorを選択

4.SwiftFormatにチェックを入れる

5.Xcodeを再起動する

6.Xcode再起動後、windowメニューのEditorから範囲選択かファイル単位でフォーマットをかけることができる！


# まとめ
brewからインストールしコマンドで行う方法も試しましたが
開発の際はXcodeからできたほうがやりやすいので上記の方法を採用しました。
CocoaPodsを利用してビルド時にフォーマットをかけるやり方もありましたが
それもやりすぎかなとも思ったので設定しませんでした。
今のプロジェクトはSwiftLintも導入するので
ビルド時はゆるめのLintのルールで
プルリクを出す前に作業した分のファイルはフォーマットをかける運用でやっていく流れになりそうです。
raspberry pi 1でtensrorflow lite その23

#概要

raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。
ラズパイで、リアルタイム処理してみた。
sdrをやってみる。
AMラジオ受信機やってみる。
動いた。

#学習結果

![v4.png](https://qiita-image-store.s3.amazonaws.com/0/18104/3df636cc-207c-831e-b567-aec31049ef54.png)


#テスト結果

AM 918Khz 山形放送

https://www.youtube.com/watch?v=1VBgg5e-Ots

以上。
raspberry pi 1でtensrorflow lite その22

#概要

raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。
ラズパイで、リアルタイム処理してみた。
sdrをやってみる。
AMラジオ受信機やってみる。
データソースの学習とテスト。

#学習結果

![v3.png](https://qiita-image-store.s3.amazonaws.com/0/18104/03085ba7-1ecf-6c77-85f2-26303bfa645e.png)

#テスト結果

AM 918Khz 山形放送
だめ。

https://www.youtube.com/watch?v=Fl31EKqigL4

以上。
GKEでstatefulなfluentdを設置

GKEでアプリケーションのログを取るためにfluentdをStatefulSetで動かしたので、その忘備録です。

今回はBigQueryにログを加工して流す目的で使用しました。BigQueryへの挿入方法としては、`streaming insert`ではなく`load`を使用しています。

ちなみに、StackDriverやPub/Subを利用する方法も検討しましたが、費用が割と高いので、一旦断念しました。

## StatefulSetでfluentdを動かす利点

BigQueryに限らず、fluentdで何かしらのデータストアにログを送信する際は、ファイルバッファを用いて定期的に送信するのが一般的かと思います。

しかし、k8sで普通にdeploymentを使ってfluentdのPodを配置する場合、何かしら不慮の事故でPodが再起動してしまうと、バッファしていたデータが失われてしまいます。Podが1台の構成であれば単純に永続ボリュームをマウントすれば良いですが、複数のPodで負荷分散・冗長化が必要なことの方が多いでしょう。

StatefulSetならPodが再起動した場合でも、再起動前にマウントされていた永続ボリュームを再度マウントできます。つまり、再起動前のバッファファイルを引き継ぐことができるます。

## StatefulSetの定義

以下がStatefulSetのサンプルです。

```yaml
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: app-name
spec:
  serviceName: app-name
  replicas: 2
  selector:
    matchLabels:
      app: app-name
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: app-name
    spec:
      securityContext:
        fsGroup: 1000
      containers:
        - name: app-name
          image: gcr.io/:project_id/:image_name
          ports:
            - containerPort: 24224
          volumeMounts:
            - name: app-name-pvc
              mountPath: /fluentd/log
  volumeClaimTemplates:
  - metadata:
      name: app-name-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: standard
```

StatefulSetはデフォルトでローリングアップデートが出来ないので、`updateStrategy`を設定します。

```yaml
updateStrategy:
  type: RollingUpdate
```

バッファファイルの書き込みを許可するために、`securityContext`を設定しています(もっといい方法があるかも？)。

```yaml
securityContext:
  fsGroup: 1000
```

10GBストレージの`volumeClaimTemplates`を定義して、`/fluentd/log`のパスにマウントしています。

```yaml
volumeMounts:
  - name: app-name-pvc
    mountPath: /fluentd/log
```


```yaml
volumeClaimTemplates:
- metadata:
    name: app-name-pvc
  spec:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 10Gi
    storageClassName: standard
```
fluentd側でバッファを書き込むディレクトリは、`/fluentd/log`に設定する必要があります。

```
<buffer>
  path fluentd/log/bigquery.*.buffer
  flush_at_shutdown true
</buffer>
```

## 終わりに

StatefulSetでfluentdを立てるような事例がweb上にあまりなかったので、簡単にまとめてみました。GKEでログ基盤を構築する場合は、StackdriverやPub/Subを利用した方がスマートな構成にできると思います。ただ、私の扱っているシステムはリクエスト数が膨大なため、想像以上に費用が嵩むため断念し、fluentdによる構成で構築しました。kubernetesでサービスを組む場合、状態を持たせる箇所は出来るだけ少なくしたいので、スマートかつ費用を抑えた方法がないか、今後も模索したいです。
コミュニティ「くじらや」の活動について

# コミュニティ「くじらや」の活動について

## 「くじらや」とは？

Dockerなどのコンテナ関連技術の勉強会（ハンズオン）などを、全国各地で行っています。
ハンズオン形式で行う場合は、10名〜15名位の少人数で実施しています。
Connpassのイベントページは[こちら](https://docker.connpass.com/)です。

## なぜ「くじらや」をやっているのか？

私はもともとアプリケーションエンジニアなのですが、開発用プラットフォームとして、コンテナ技術を導入しようという話があり、独学でDockerを触ったりしておりました。
昨年の秋に、札幌でRancher JP主催の[Rancher Meetup #01 in Sapporo](https://rancherjp.connpass.com/event/63218/)が開催され、そこで学んでいくうちに、**何故か運営側に回るようになり**、そこでいろいろやっていくうちに、「コンテナ技術に興味はあるけれど、触ったことがない・学んだことがない」という方々が意外と多く見られたため、今後のコンテナ技術・クラウドネイティブ関連技術の普及には、そのあたりの層の技術の底上げが必要と考え、コミュニティを立ち上げるに至りました。

## どんな活動をしているのか？

主に全国各地でハンズオン形式の勉強会を行っています。
これまでに、福岡・大阪・京都・札幌・広島・岡山・沖縄の各地で開催されました。
来年２月には神戸でも開催予定が決まっています。
運営では、地元のメンバーが中心となり、アットホームな雰囲気の中で実施されています。
また、今夏には、東京で連続もくもく会も行われました。

## 今後の活動について

これからも全国各地でこういった勉強会を実施していきたいと思っております。
特にまだ実施したことのない東北・四国地方をはじめ、新しい場所での開催も積極的に行きたいです。
また、２年目となる来年は、応用編としてKubernetesや他のクラウドネイティブ技術の勉強会もやりたいと考えております。
ぜひ、一緒に勉強したい、会場を提供してもいいよ、という方々がおられたらお声がけください。

# ご参加お待ちしております！

youtube 関連動画を表示させないために

# はじめに
先日、[youtube player api](https://developers.google.com/youtube/iframe_api_reference?hl=ja)の仕様が変更になり、```rel: 0```を指定しても、動画再生後の関連動画を消すことができなくなりました。


```rel: 0```の仕様
・今まで：動画終了後、関連動画を消す
・これから:動画終了後、同アカウントの関連動画のみを表示させる

どうしても関連動画を表示させたくなかったので、どうにかならないかと模索して実装したので、その備忘録です。

## 実装方法
・動画が終了したら、動画を0秒に戻し、停止する
これで、関連動画を消すことができました。

```javascript
      this.player = new YT.Player($player, {
        videoId: id,
        width: 600,
        height: 400,
        playerVars: {
          rel: 0,
        },
        events: {
          onStateChange: event => {
            if (event.data === YT.PlayerState.ENDED) {
              this.player.seekTo(0, true);
              this.player.stopVideo();
            } 
          }
        }
      });
```

## 終わりに
この方法を使うと、動画終了後に関連動画を表示させずに済みます。
ただ、一時停止したときには関連動画が出てしまう難点もあります。
何かいい方法を知っている方がいらっしゃいましたら、教えていただければと思います。
「サーバーに入った時にしかvimは使わないよ」と言ってEscを連打していた自分に教えてあげたいコマンド

1年前くらいまでvimはサーバーに入った時にしか触っていませんでした。
当時の私にとってvimは何が何だかわからないもので、「うわ、vimでやんなきゃ」と思うくらいでした。
vimでソースコードをある程度いじれるようになった今、「あの時せめてこれだけでも知っていたらあのストレスはだいぶ無くなっていたのでは。。。」と思うものがいくつかあります。
それを紹介しようと思います。

###検索
vimを使ってファイルを開いた直後は、`ノーマルモード`と呼ばれるモードであり、このモードはvimにおける基本のモードとなります。
このモードから`i`を入力することで挿入モードに移行し、テキストを入力したりすることができます。また、挿入モードの時に`Esc`を押すことでノーマルモードへ戻ります。

vimで開いたファイルの中身を検索するときはノーマルモードでコマンドを実行します。

| コマンド | 説明 |
|:--|:--|
| /検索文字 (Enter) | 検索文字を検索（vimの画面の一番下にコマンド自体が表示されます）|
| n | (検索した状態で)次へ進む|
| N | (検索した状態で)前へ進む|
| :noh | 検索終了（ハイライト表示オフ）|

検索をしても検索文字がハイライトされない場合は、同じくノーマルモードで`:set hlsearch`というコマンドを打ちます。

###挿入モードへ移行するコマンド
ノーマルモードから挿入モードに移行するコマンドは`i`や`a`が有名かと思いますが、他にもいくつかあります。
使いこなせるとかなり便利に感じます。
これらのコマンドはノーマルモードで実行します。

| コマンド | 説明 |
|:--|:--|
| i | 現在のカーソル位置から入力を開始する | 
| a | 現在のカーソル位置の次から入力を開始する  |
| A | 現在のカーソルがある行の末尾から入力を開始する |
| o | 現在のカーソルがある行の次の行に空行を差し込んで、入力を開始する |
| O | 現在のカーソルがある行の前の行に空行を差し込んで、入力を開始する |
| Esc | 挿入モードからノーマルモードへ移行 |

```bash
# | がカーソルです
123|45678 

# "i" → _ を入力
123_45678

# "a" → _ を入力
1234_5678

# "A" → _ を入力
12345678_

# "o" → _ を入力
12345678
_

# "O" → _ を入力
_
12345678 
```
特に`o`は便利だと思います。

###元に戻す
挿入モードにて間違えて入力してしまった、という時は`undo`を使うことができます。
こちらのコマンドもノーマルモードで実行します。

| コマンド | 説明 |
|:--|:--|
| u | undo(元に戻す) |
| Ctrl + r | redo(「元に戻す」を戻す) |

###移動系コマンド
こちらのコマンドもノーマルモードで実行します。
挿入モードになっている場合やそのほかのモードになっている場合には`Esc`でノーマルモードにします。

| コマンド | 説明 |
|:--|:--|
| gg | カーソル位置をファイルの先頭へ移動する |
| G | カーソル位置をファイルの末尾へ移動する |
| 数字 + G | 数字の行へカーソルを移動する（10Gだったら10行目へ移動） |
| Ctrl + e | カーソルの位置は移動せず、画面を1行分下へ移動 |
| Ctrl + y | カーソルの位置は移動せず、画面を1行分上へ移動 |
| Ctrl + f | カーソルの位置は移動せず、画面を1画面分下へ移動 |
| Ctrl + b | カーソルの位置は移動せず、画面を1画面分上へ移動 |

ファイルの先頭/末尾へ移動も便利ですが、画面移動（スクロール）が便利です。
矢印キー連打から卒業です！

###保存系コマンド
こちらのコマンドもノーマルモードで実行します。

| コマンド | 説明 |
|:--|:--|
| :w | 保存 |
| :q | 閉じる |
| :wq | 保存して閉じる |
| :q! | 保存せずに閉じる |


###最後に
これら全部を使いこなすべき、ということではなく、これらの中から一つでも「これできるんだ！」と思ってもらえるものがあれば嬉しいです。
KeyVaultを使ったARMテンプレートへの機密情報の記載方法

ARMテンプレートを使った時にどうしてもパスワードなどの機密情報を記載しなければいけない部分が出てくる。
そこでコードとして直接記載するのではなくKeyVaultを使ったパスワードを隠す方法を記載する。
テンプレートの実施方法としてAzure DevOpsのPipelineを使用する


 # 必要なもの

* KeyVault
* Azure DevOps

# 実施
## 準備
まずはkey vaultに情報を入れておく必要があります。
すでに使ったことある方や公式のほうが詳しいと思いますので割愛します。
https://docs.microsoft.com/ja-jp/azure/key-vault/about-keys-secrets-and-certificates

これからの例ではSecretsを使った方法です。

Azure DevOpsからのアクセスを許可する必要があります。
* [Azure DevOps] Service Connections作成
https://docs.microsoft.com/en-us/azure/devops/pipelines/library/service-endpoints?view=vsts

* [Azure Portal] アプリケーション登録
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal

* [Azure Portal] KeyVault　IAM追加
https://docs.microsoft.com/ja-jp/azure/managed-applications/key-vault-access
最低限、SecretsのListとGetの権限があれば良いです

## ARM template

下記の記載は要点整理のためかなり端折っています。

ポイントはkeyvaultからの参照の仕方と呼び出し方です。

### paramater.json

```
    "databasePassword": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/[subscriptionID]/resourceGroups/[resouce group name]/providers/Microsoft.KeyVault/vaults/[keyvault name]"
        },
        "secretName": "[keyvault secret name]"
      }
    }
```
### template

```
{
	"parameters": {
		"databasePassword": {
			"type": "securestring"
		}
	},
	"resources": [
		{
			"name": "database",
			"type": "Microsoft.Sql/servers",
			"apiVersion": "2015-05-01-preview",
			"location": "[resourceGroup().location]",
			"tags": {},
			"properties": {
				"administratorLogin": "admin",
				"administratorLoginPassword": "[parameters('databasePassword')]",
				"version": "12.0"
			}
		}
	]
}
```
type を「secretring」としていますが「string」でも構いません
その場合、Azure portal上からは参照できてしまうのでご注意ください

## Azure DevOps
ここでは「Builds」を使用しますが「Releses」でも同じことができると思います。
（未検証です。すみません）

最低限必要なジョブは下記の2つ
設定についてはほぼ選択式なので割愛します。
デフォルトで埋まっている部分に関しては変更なしです。

![azureDevOpsBuild.png](https://qiita-image-store.s3.amazonaws.com/0/138634/351c3825-2789-56d6-abf5-b3ffb70da3b5.png)


# まとめ
keyvaultと連携することでコード上には記載することなくリソースを構築することができます。
ただし、keyvault自体のセキュリティが緩いと元も子もないので不要な許可はしないようにしましょう
非エンジニアのNEM好きがAPIを知ってNEMをもっと好きになる

# これを書く理由
私は、2017年の12月ごろがらブロックチェーンのことについて調べ始ました。その時からNEMを特に調べていました。
なので、NEMの特徴も理解していましたが、ネイティブのAPIを提供しているという特徴に関しては、あまりピンときていませんでした。そもそもAPIという言葉は非エンジニアに取ってあまり聞いたことはない言葉だったからです。
2018年になってプログラミングの知識をつけ始めてからAPIについて理解しました。それによってNEMはエンジニアも扱いやすいブロックチェーンだということが理解でき、ますます魅力に感じました。この記事をみて、APIについて知ることで、非エンジニアがNEMについてより理解し、魅力を感じてもらえるようになればと思っています。


# 「APIを叩く」とは

APIというのは、あるネットの保存しているところからデータの取得、保存、更新、削除する時に使用します。
あるネットの保存しているというのが、サーバー、ブロックチェーンなどが当たります。

それを「叩く」というのは、コマンドを叩くという動作から由来しています。
https://www.wdic.org/w/TECH/%E5%8F%A9%E3%81%8F
よって「APIを叩く」というのは、データの参照などのために、あるところにアクセスすることを指しています。


# NEMはネイティブでAPIを提供している。
NEMでは、特有のツールなどを使わずとも、APIを叩くことで、ブロックチェーンを利用することができます。
NEMのAPIはこちらにあります。
https://nemproject.github.io/
日本語訳はこちらにあります。
http://i-yusuke.com/entry/nem-nis-api-document-japanese/#i-3

## 現在のブロック高を調べる
* NEMの提供しているAPIの一つに、現在のブロックチェーンの高さを調べてくれるものがあります。このエンドポイントを叩けば、nodeにアクセスして、そのnodeの現在のブロックチェーンの高さの情報を返してくれます。

↓をブラウザのURLに入れてみると、、、、
http://138.201.158.14:7890/chain/height

```
{"height":1946079}
```

このように、height、つまりブロックチェーンの高さがかえってきます。
Ethereumをちょっと使うというと、諸処のブロックチェーンの利用に結構なコストを使います。しかし、NEMはAPIを叩くだけでブロックチェーンを利用することができるのです。
NEMはエンジニアに優しいというのはこういうところからきています。


# あとがき
最後まで読んでいただき、ありがとうございました。
ほんとはFlutterでNEM触るとかRailsで触るとかを構想してたりしてましたが、数日前に書かれていたり、ハイクオリティであったため、恐れおののきn番煎じの記事になってしまいました。
技術力が低かったり、NEMについての知識が浅かったりするので、他のアドベントの方とは比べ物にならないくらい低クオリティの記事になったことをご了承ください。
Railsで個別のカラムをバリデーションするvalidate_specific_value gem

RailsのActiveRecordで個別のカラムをバリデーションする[validate_specific_value gem](https://github.com/ts-3156/validate_specific_value)を作った。

## このgemを使う利点

通常のバリデーション実行には`model#valid?`を使うが、このメソッドはそのモデルのすべてのバリデーションを実行してしまう。

バリデーションの内容によってはデータベースでSQLを実行するもの、複雑なRubyのコードを実行するもの、などがあり、毎回すべてのバリデーションを実行してしまうと必要以上にコストがかかってしまうことになる。

```ruby:app/models/user.rb
class User < ApplicationRecord
  # valid?を呼ぶたびに、emailとnameがユニークかどうかをチェックするSQLを実行する
  validates :email, uniqueness: true
  validates :name, uniqueness: true

  # valid?を呼ぶたびに、高コストなバリデーションが実行される
  validates_with Validations::ComplexValidator 
end
```

この[validate_specific_value gem](https://github.com/ts-3156/validate_specific_value)を使えば、特定のカラムだけに対してバリデーションを実行することができる。

## validate_specific_value gemの使い方

Gemfileに追加する。

```ruby:Gemfile
gem 'validate_specific_value'
```

`validates_specific`で個別にバリデーションしたいカラムを指定する。

```ruby:app/models/user.rb
class User < ApplicationRecord
  validates_specific :name
end
```

`validates_specific :attribute`としておくことで、`valid_attribute?`というメソッドが定義される。

```ruby
user = User.new(name: 'duplicate_name')
user.valid_name?
# => false

user.errors[:name]
# => ["has already been taken"]
```

## 実装の詳細

メタプログラミングで下記の処理を実現している。RailsのAPIで特定のカラムのバリデーションルールをすべて取得し、それをループの中で実行している。

```ruby
class User < ApplicationRecord
  def valid_name?
    errors.clear
    self.class.validators_on(:name).each do |validator|
      validator.validate_each(self, :name, self[:name])
    end
    errors.empty?
  end
end
```

## 参考リンク

[validate_specific_value gem](https://github.com/ts-3156/validate_specific_value)
[A Tour of Go] Exercise: Errors

Goでは関数の戻り値にerror変数を返すパターンがよくあるらしい。
関数を呼び出す時にはそのerror変数がnilがどうかを確認してエラーハンドリングする。
例えば...

```ruby:
i, err := strconv.Atoi("42")
if err != nil {
    fmt.Printf("couldn't convert number: %v\n", err)
    return
}
fmt.Println("Converted integer:", i)
```

のような感じ。

実装方法はGoのチュートリアルの[A Tour of Go：Exercise: Errors] を見れば一通り説明されているのでそれを読めば一応理解はできる。
チュートリアルのなかで「負の値が与えられたとき、nil以外のエラー値を返すSqrt関数を作成」という演習がある。
error変数を返す為に必要なのは、

```ruby:
// 新しい型の作成
type ErrNegativeSqrt float64

// Errorメソッドの実装
func (e ErrNegativeSqrt) Error() string {
	// fmt.Sprint(float64(e))
	return fmt.Sprintf("cannot Sqrt negative number:%v", float64(e))
}
```

あとはSqrt関数内で必要に応じてメソッドを呼び出す。

```ruby:
func Sqrt(x float64) (float64, error) {
	if x < 0 {
		return 0, ErrNegativeSqrt(x)
	}
　　　　　　　　以下略
}
```

そしてSqrt関数を呼び出す時はエラーハンドリングする。

```ruby:
if i, err := SqrtFunc(-2); err != nil {
	log.Println(err)
} else {
	fmt.Printf("%v", i)
}

//もしくは

i, err := SqrtFunc(-2)
if err != nil {
   log.Println(err)
　　　　　return
}
fmt.Printf("%v", i)
```
今年イチの脆弱性



こんにちは。ニフティ）セキュリティチームの齊藤（貴）です。
ニフティグループのセキュリティに関すること全般を担当しています。

この記事はニフティグループ Advent Calendar 2018の23日目の記事です。

明日からクリスマス本番です。1年でもっともイベントが集中するときだけに、フィッシングメールも趣向を凝らしたものがいろいろ出てきます。楽しみですねぇ～～！！

##2018イチの脆弱性##
今回はセキュリティ担当の私が担当していますので、今年イチウケの脆弱性についてです。

セキュリティを担当していると脆弱性に関するリサーチ業務は欠かせません。
日々さまざまな脆弱性情報が出ている中で、自社に影響するような脆弱性について調査しその影響度を判断し、エンジニアの方々にアナウンスするのも大事なお仕事です。

そんな中で、今年イチウケなのが、ずばり
CVE-2018-19788：PolicyKitの脆弱性
です。

どんな脆弱性かと言うと・・・
まずはCVE番号はMITERが発行していますのでこちらの辞書を調べてみましょう。

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-19788

Descriptionの部分をみると
「A flaw was found in PolicyKit (aka polkit) 0.115 that allows a user with a uid greater than INT_MAX to successfully execute any systemctl command. 」
となっておりだいたい予想がついてきました。
さらにReferencesの部分をみるといくつかのリンクがはられており、詳細な内容がわかります。

まずはこの脆弱性を利用するには条件があることがわかります。
　・OSにログインできること
　・ユーザID(uid)がintのMAX値より大きい値であること

###ポイント###
はい、今回の脆弱性のポイントはここです！
uidがintのmax値より大きい
つまり、uidが2,147,483,647より大きい数字で作っている場合。

・・・・んー、そんなuidをふる管理者っているのかな。
まぁIDをいくつかの数字の区分にわけてそれぞれに意味をもたせて作成することはあるにはあるんですが、LinuxのログインIDだし・・・。
仮に他の脆弱性があったとして、この脆弱性を利用するためにuidをint以上に指定してユーザを作成して・・・ってユーザを作成できる時点で管理者権限になってますので、もっと他のことができそうです。

##検証環境つくって実践##
では、さっそくこの脆弱性を試してみましょう。
まずは、Linuxを用意します。
（とあるクラウドサービスでCentOS7.5のイメージで立ち上げてみました。）
そして、対象モジュールのバージョンを確認。
![00.png](https://qiita-image-store.s3.amazonaws.com/0/310933/bfbfd234-1eb2-0086-4044-63c8768de957.png)
「0.112」となっているので今回の脆弱性に該当していることがわかります。

最後に今回のポイントである特殊なuidをもつユーザを作成して準備完了です。
今回は違いを確認するために
　・「2147483647」というuidをもつ「intmax」
　・「2147483648」というuidをもつ「intover」
の2ユーザを作成してみました。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/310933/57847826-96a8-fd97-dd53-24802628ff46.png)


まずは正常な場合を実験します。
intmaxユーザでログインして、idがInt内に収まっていることを確認して
systemctlでsshdを落とそうとしてみます。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/310933/64910f5c-8827-3514-467d-68b4c60a9784.png)
ちゃんとrootユーザのパスワードを要求されて拒否られました。

続いて、おもしろuidを持つユーザ。
systemctlとかで適当なデーモン落としてみましょうw
![03.png](https://qiita-image-store.s3.amazonaws.com/0/310933/5935a215-6bd2-52dc-67b8-02fd7d5d1a5c.png)
なんかエラーっぽいものが出ます。でも終了コードは「0」が返ってます
果たして成功したのか！！
![04.png](https://qiita-image-store.s3.amazonaws.com/0/310933/8a2225a1-9be6-9750-766a-257223851be7.png)

sshd死んでます・・・。
実行方法も簡単ですしもうやりたい放題ですね。
ちまちまデーモンを落としてないで、シェルを手に入れましょう。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/310933/1d2ded03-545e-d9cf-eab9-dcecf18cce2c.png)
idをうつと「0」になってますね。rootです。
何でもできますね。
netcatなどを立ち上げてリモートからコマンドを打てるようにしても面白いかもしれません。
（※検証環境です）

いった感じで、今年でイチウケの脆弱性でした。
来年も目が離せないです！
DQNの学習速度を改善する

この記事は[Akatsuki Advent Calendar 2018](https://adventar.org/calendars/2990)の21日目の記事です。

# はじめに
この記事では機械学習で用いられるDQNについて、学習速度の改善手法を取り上げたいと思います。

題材として[こちらのブログ](https://qiita.com/oggata/items/0f95551a88ae314aa8cf)で取り上げられているカード編成問題をDQNで解く課題を高速化してみます。Originalでは大体全勝するのに20000回くらいの試行が必要でした。

# Originalとの違い

![ニューラルネットワーク](https://qiita-image-store.s3.amazonaws.com/0/23392/0aacb592-cc51-5b7f-9eb8-c895f9f40c4e.png)

Originalからどのように改良したかというと、Originalではニューラルネットワークに現在どのデッキを選んでいるかをindexで入力していましたが、これを選ぶべきデッキ番号のみ1が立つone hot表現に展開しています。一見、変数が増えて学習が遅くなりそうですが、Originalではデッキのindexという入力は他の全ての入力に関わっています。このため、学習時は敵の属性の全ての組合せを網羅する必要があります。一方、改良版ではデッキ1と敵1、デッキ2と敵2といったようにそれぞれのカード同士でしか結合しないため、デッキNoごとに学習すればよくなります。

# 結果

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/23392/ced3e3b8-0e3a-5077-c215-abde0e29535a.png)

学習させて得られた報酬をプロットすると(100回の移動平均を使っています)上のようになりました。他のパラメータは全て同じにしています。Originalが20000回の試行でようやく5点付近に来るのに対して、改良版は2500〜3000回くらいの試行で5点付近に到達しています。7〜8倍くらいの改善が見られました。


# まとめ
DQNの学習速度を改善するためにはニューラルネットワークの層を変える、ハイパーパラメータを変えるなどの対策がありますが、ニューラルネットワークに入れる入力を見直すことで大きく改善ができる可能性があります。今回のように入力の1つがデータ列のindexとして使われている場合、one hot表現に展開することでニューロン間の結合が少なくなり学習速度を改善することができます。
GUI(tkinter)を使い，時刻を表示する　No.2

#ターミナルではなく，GUIで時刻を知りたい．
このページは[GUI(tkinter)を使い，時刻を表示する　No.1](https://qiita.com/ayousanz/items/3022f58caef6b131bac9)の続きに当たります．
##実現したいこと
・前回の時刻を適度に更新して現在の時刻を表示させる．

##使用するもの
tkinterを使い，GUIを使えるようにする．

##方法
```python
# ウインドウの時間が適度に更新されるようにする．
# 入力した時間にウインドウが作成される．
from tkinter import font
import tkinter
from datetime import datetime,time

def show_time():
    today_time=datetime.now()
    label1 = tkinter.Label(root, text=today_time)
    label1.pack(side="top")
    font1 = font.Font(family='Helvetica', size=30, weight='bold')
    print("現在の時間:"+str(today_time))
    label1.destroy()
    root.after(1000,show_time)

root=tkinter.Tk()
root.title("timer")
root.geometry("400x300")
show_time()
root.mainloop()


```
##結果
<img width="401" alt="スクリーンショット 2018-12-21 13.04.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/241933/55c87096-02cf-6fa0-799f-ae93d95b2169.png">

##考察
履歴を消すために，label1.destory()をしてみたが，画面に何も表示されなくなったので，これは使えないと考えた．


##これから実現したいこと
・更新はされるが，時刻は一つでいいので，履歴？は残らないようにする．
・canvasを使い，更新できるようにする．
OMPアルゴリズムが面白い！

#こんにちは！( ｀・∀・´)ﾉ
この記事は、[VALU Advent Calendar 2018](https://qiita.com/advent-calendar/2018/valu) 12月21日目のエントリーです。

#OMPアルゴリズムとは
OMP(直交マッチング追跡)は、スパースモデリングと言われるもので、送られてきているシグナルがノイズなどで通常の方法ではひとつの解が出せないときに、大きなシグナルから順に一つずつ送られてきている情報を推定できるというアルゴリズムです。スパースというのは、復元したい情報の一部だけが実際に情報を持っていて、多くは0ということです。
機械学習、画像復元、IoTなど色々応用できて面白いなと思ったので、紹介します！

##メソッド

例えば、3つのビーコンからそれぞれシグナルs1, s2, s3が送られてきてるとすると、受け取ったシグナルは

```math
\vec{b} = x_1\vec{s_1}+ x_2\vec{s_2}+x_3\vec{s_3}
```
とかける（x1, x2, x3はそれぞれのシグナルが送りたい情報)。


1. 受け取ったシグナルbとs1, s2, s3のドット積をそれぞれ出して、一番大きな値のシグナルを見つける（このシグナルがシグナルbの中に存在することがわかる）
> 説明のためs1だと仮定

2. [最小二乗法](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95)を使って、このシグナルに対応するxの値を推定する(s1の場合はx1)

```python
xhat = least_squares(A[:,1], b)
```

3.次に大きなシグナルを見つけるためには、今見つけた一番大きなシグナルを取り省かないといけないので、残基(residue)を計算する 

```python
residue = b - A[:,1].dot(xhat)
```

4.次に大きなシグナルを見つける（1-3のプロセスを繰り返す）
5.sparsityの数をすべて見つけるか、残基のthresholdを設定してそれを下回ったら終わり



#例

6500個のビーコンがあり、受け取ったシグナルbが下記だとすると
<img width="540" alt="Screenshot 2018-12-21 12.33.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/328664/229c7315-c670-e261-f76b-481d0742e8d8.png">

下記のコードを使ってベクターx（送られてきた情報）を見つけられる（100個だけが実際に情報を送っていると仮定 sparsity = 100）

OMPコード
※コードはjupyter notebookでNumPyを使ってます

```python

%pylab inline
import numpy as np
import matplotlib.pyplot as plt
import scipy.io
import sys

def least_squares(A, b):
    return np.linalg.inv(A.T.dot(A)).dot(A.T).dot(b)

def OMP(measurements, A):
    THRESHOLD = 0.1
    SPARSITY = 100
    residue = measurements.copy()
    indices = []
    for _ in range(SPARSITY):
        # find the index of max dot product 
        max_index = np.argmax(np.abs(A.T.dot(residue)))
        indices.append(max_index)
        Ahat = A[:,indices]
        b = measurements
        
        # find the orthogonal projection of the measurements 
        # projected onto the column space of Ahat
        xhat = least_squares(Ahat, b)

        # find residue for the next iteration
        residue = b - Ahat.dot(xhat)
        if  np.linalg.norm(residue) <= THRESHOLD:
            break
    
    #
    recovered_signal = np.zeros(len(A[0]))
    for i, x in zip(indices, xhat):
        recovered_signal[i] = x
    return recovered_signal
```

```python
sig = OMP(measurements, A)

plt.title('recovered info')
plot(sig)
plt.xlabel('index')
```

↓送られてきた情報！
<img width="508" alt="Screenshot 2018-12-21 13.09.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/328664/373a6f64-5495-cb67-6953-e06160804af6.png">


もしこれがそれぞれのピクセルの情報なら、色に変換して画像を復元したり、IoTデバイスでどのuserがデバイスに何を話しかけているのかなど、いろんなモデルに応用できます（実際はもっともっと複雑ですが）。面白い！


※通常は受け取ったシグナルはシフトされてるので、ドット積ではなく、相互相関をつかうことで、max_indexとそのシグナルのシフトがわかります
UWPの制約と解決策

#初めに
Win32やWPFなどで出来ていたボリュームや輝度変更が、UWPでは基本的には出来ないという制約があります。
また、逆にWPFで作っているが一部のUIはUWPを使用したいという場合も(あるかな？)。
今回はその解決策の一つであるExtend Appを説明します。

#Extend Appとは
Extend Appの正式名称は[Extend your desktop application with modern UWP components](https://docs.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-extend)で、
UWPとWin32やWPFなどを1つのパッケージに纏めることで、出来ることを拡張します(ざっくり)。
実装方法はかずきさん記載の[ここ](https://blog.okazuki.jp/entry/2018/02/09/204909)と[ここ](https://blog.okazuki.jp/entry/2018/02/10/174735)を見てもらうとして、
このページとしては実装の際に自分が躓いた箇所を記載しようかと。

#エントリーポイントとスタートアップ
かずきさん説明ページにしっかりと記載されていますが、スタートアップはLanchAppプロジェクトで、
エントリーポイントはLaunchAppプロジェクトの"アプリケーション"の下に追加されているLaunchApp.UWPです。
何故か私は、LaunchApp.UWPという名前のプロジェクトをスタートアップとしたことで、全く動かずに1時間ぐらい無駄にしました...

#参照の追加
かずきさんが公開しているGithubのコードを単純にコピーしただけでは、コンパイルに失敗します。
NugetでUwpDesktopを追加するか、参照の追加で必要なDLLを追加する必要があります。
NugetでUwpDesktopを追加するのが一番簡単です。
詳細は以下を参照。
https://blog.okazuki.jp/entry/2015/11/07/223455
https://blogs.msdn.microsoft.com/lucian/2015/10/23/how-to-call-uwp-apis-from-a-desktop-vbc-app/
https://blogs.windows.com/buildingapps/2017/01/25/calling-windows-10-apis-desktop-application/#MOgHxP6xfT7ocrpH.97

#参考リンク
https://docs.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-extend
https://blog.okazuki.jp/entry/2018/02/09/204909
https://blog.okazuki.jp/entry/2018/02/10/174735
https://blog.okazuki.jp/entry/2015/11/07/223455
https://blogs.msdn.microsoft.com/lucian/2015/10/23/how-to-call-uwp-apis-from-a-desktop-vbc-app/
https://blogs.windows.com/buildingapps/2017/01/25/calling-windows-10-apis-desktop-application/#MOgHxP6xfT7ocrpH.97
Mac のエディタ nano を使ってみようとしたけど一瞬でやめた

# 参考

[[OS X] ターミナルでのテキスト編集にはnanoが便利 ｜ DevelopersIO](https://dev.classmethod.jp/etc/os-x-terminal-nano-editor/)

# 結論

- Vimとか他のエディタ使えるなら他の使ったほうが良いのでは
- またnanoの独自キーとか覚えるの大変そう、学習コスト高そう
- テキスト編集ならSublimeとかのハイブリッドエディタが良い気がした
- vimにもハイブリッドエディタにもならない、中途半端なイメージ、良さが分かる前に諦めた、良さはない予感がした (あるならもっと使われているはずでは)


# 手順

>ターミナルで nano と入力することで、起動します。

一瞬で起動

テキストエディタらしい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/391fd062-e156-23c1-0fba-e9fc7fd5e443.png)

# Vimとは違うのだよVimとは

vimチックには操作できないが独自のキーとかがあって学習コスト高そう

>保存
>control + x で Exit コマンドが発動します。

こういうの覚えるの無理そう

ここでそっとエディタを閉じた

ここで手記は途切れている








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
おすすめのvimプラグイン

### はじめに

この記事は[谷ゼミの落書き帳](https://qiita.com/advent-calendar/2018/drawing_pad_from_tani_seminar)の22日目の記事になります。
Advent Calendarの一覧を見ていたら、たまたま学生時代の研究室のAdvent Calendarを発見し、投稿することに決めました。

投稿を決めたのはいいが、特に記事にすることがなかったため、普段から利用しているVimのおすすめのプラグインについて書きます。
プラグイン管理にはdeinを利用していますが、deinのインストール方法は、今回の記事には含みません。
新しいプラグインのとっかかりになればと思います。

#### 1. scrooloose/syntastic
[crooloose/syntastic](https://github.com/vim-syntastic/syntastic)

構文チェックを行うプラグイン。
構文エラーを教えてくれるので、しょうもないミスをしたときに助かります。

#### 2. rhysd/clever-f.vim
[rhysd/clever-f.vim](https://github.com/rhysd/clever-f.vim)

文字移動で利用される「f」の拡張みたいなものです。
例えば`hogehoge`とあった場合に
`[fh]`で一つ目の`h`にいきますが、この後に`「f」`を押すと二つ目の`h`にいくことが可能です。

#### 3. junegunn/vim-easy-align
[junegunn/vim-easy-align](https://github.com/junegunn/vim-easy-align)

これは以下のようなコードがあった際に便利です。

```
$hoge = array(
    '0' => 1,
    '10' => 2,
    '100' => 3,
) ;
```

`=>`の位置が揃っていなくて、見づらくなることがあると思います。
その際このプラグインがあれば、`'0'`から`'100'`までの行を`ヴィジュアルモード`で選択し、`Enter`を押し、`=`を打てば以下のようになります。

```
$hoge = array(
    '0'   => 1,
    '10'  => 2,
    '100' => 3,
) ;
```

配列の要素が長くなると便利かと思います。

#### 4. ctrlpvim/ctrlp.vim
[ctrlpvim/ctrlp.vim](https://github.com/ctrlpvim)

多機能セレクタと言われるもの。
`Ctrl + p`でファイル一覧を検索可能にする。

![スクリーンショット 2018-12-21 11.49.52.png](https://qiita-image-store.s3.amazonaws.com/0/212049/f3ca90a2-dc34-a6d9-60ab-7434f3d609e1.png)

コマンドラインの`>>>`以降に文字を入力するとインクリメントサーチし、開きたいファイルで`Enter`を押すと、ファイルを開くことが可能です。

`git`管理下のディレクトリで行うと、`git`管理されたものが一覧として表示されます。
ファイル以外にも関連のプラグインを入れるとファイル内の関数のインクリメントサーチすることができたりし、便利です。

#### 5. tomtom/tcomment_vim
[tomtom/tcomment_vim](https://github.com/tomtom/tcomment_vim)

コマンドを入力するだけで、現在行（複数行選択も可）をコメントアウトできる。
いちいち先頭に移動して、コメントアウトする必要がなくなるため便利です。

#### 6. airblade/vim-gitgutter
[airblade/vim-gitgutter](https://github.com/airblade/vim-gitgutter)

`git`管理下のファイルを変更した場合、左に差分があったかどうかを表示する。
`-` => は行が削除されている
`~` => は行が編集されている
`+` => は行が追加されている

いくら`git`管理されているとはいえ、ファイルを開いている時にどこが変更されているのかが、わかるので便利です。

###終わりに

利用しているプラグインはまだ他にありますが、頻繁に利用しているプラグインを挙げさせていただきました。（無意識に利用しているプラグインを多いことが今回わかりました。）
プラグインを開発されている方には本当に感謝しかありません。いずれ開発する側に回りたいですね。

余談ですが、IDEを利用したことがあまりないので、わかりませんが、今回挙げた機能はあるのが前提になっているのでしょうか？
Vimを利用していて、よく言われるのが、「その機能〜のIDEにあるよ」と言われるのことが多いですね。
ではなぜ私がVimを利用しているかというと、かっこいい、シンプルだからですね（他にも理由はありますが）

IDEを利用されている方は一度Vimで開発されてみてはいかかでしょう？
「Vimがいい」と思っていただけたら、Vimmerは喜びますし、「やっぱりIDE」となるかもしれませんが、それはそれで、今利用しているIDEの素晴らしさを再認識することができるかもしれません。

Vimmerが増えることを切に願っています。

ここまでが[谷ゼミの落書き帳](https://qiita.com/advent-calendar/2018/drawing_pad_from_tani_seminar)の22日目の記事になります。

お読みいただきありがとうございます。
MAMP ver 5.2環境下で、ターミナルからMySQLにログインする

MAMPとは：Macintosh環境下で、Apache, MySQL, PHPを用いて開発するための開発環境のこと.
2018年11月現在、MAMPのバージョンはver 5.2となっている.
以下の手順は、MAMP ver 5.2をインストール済みであることを想定しており、
MAMPインストール後にターミナルからmysqlを実行する際のメモ書きである.
## アプリケーションのMAMPフォルダを確認する

まずはFinderを開き、アプリケーションフォルダ中のMAMPフォルダを確認してみる.
![スクリーンショット 2018-12-21 12.22.59.png](https://qiita-image-store.s3.amazonaws.com/0/329378/5e76c860-c4c3-941e-6f0b-936826b743b1.png)
パスは以下になる.
User/Applications/MAMP/Library/bin/mysql

## MAMPを起動し、SQLサーバーを立ち上げる
mysqlにログインする前に、MAMP上でサーバーを立ち上げておく.
サーバーの立ち上げに成功すると、MySQL Serverの文字の横にある点が緑色になる.
![スクリーンショット 2018-12-21 12.34.57.png](https://qiita-image-store.s3.amazonaws.com/0/329378/61d32194-aa17-6b18-0f03-3ee0538b9c03.png)
SQLサーバーが立ち上がったら、ログインの準備ok.

##  ターミナルからmysqlを実行する
ターミナル起動後、mysqlの保存先ディレクトリまで移動する.

```
# mysqlファイルの保存先であるbinに移動
$ cd Applications/MAMP/Library/bin
# mysqlを実行する
$　./mysql -u root -p
# passwordを聞かれるので、変更していないのであればデフォルト値であるrootを入力
Enter password: root
# MySQLのプロンプトが表示されれば成功
mysql>
```
mysql>と表示されればログイン成功.
終了するには、exitと入力する.
Swiftを初めてみた話

<h1>Swiftを初めてみた話</h1>
<h2>はじめに</h2>
<a href="https://adventar.org/calendars/3436">琉大情報工学科（知能情報コース) Advent Calendar 2018</a>の20日担当です。

最近スマホをiPhoneX XSにしました。これはスマホにしてはべらぼうに高くて、手元に届いた時、ただのスマホユーザとしてずっと使うのは勿体無いのでは？と思うようになりました。そんな経緯もあって、先月(11月)から時間を見つけてちょくちょくSwiftを学び始めています。この記事では、僕が学習した順序を紹介します。ie学生は2年のモデリングと設計で何らかの形で触ることになると思うので少しでも参考になればいいかなと思います(僕は当時Swiftを1ミリも触らなかったのでまっさらな状態です...あの時たった1人でSwiftの実装を担当し、やりきってくれたdajo君に圧倒的感謝)。
<h2>A Swift Tour で大まかにSwiftについて理解する</h2>
一番最初に <a href="https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html">A Swift Tour</a> やりました。ドキュメントが短くて要点だけがギュッとまとめられています。ie生で一番最初のやる言語がSwiftという人はまずいないと思うので、既に学習した言語と比較しながらやると楽しく学べます。練習問題も用意されており、何から初めていいかわからないという人におすすめです。
<h2>Paiza でならす</h2>
<a href="https://paiza.jp">Paiza</a> はコーディング転職サービスです。サービスの一貫でプログラミングのスキルチェックがあり、対応しているプログラミング言語で自分のスキルを測ることができます。

A Swift Tour をやると、「あ、俺Swiftだいたい理解したわ」って気持ちになります。そんなあなたにはPaizaのスキルアップ問題をSwiftで解いてみることをおすすめします。きっとPaiza は「一体いつからーSwiftを完全に理解したと錯覚していた？」としたり顔で挑発してくるでしょう。 A Swift Tour だけでは文法を網羅することができないので、Dランクの問題にも結構引っかかったりすると思います。僕はオプショナル型あたりで結構つまりました。高得点取ることは諦めて、思った通りの処理が書けない箇所をドキュメントで調べて理解していない穴を埋めていく作業をしました。身につけるには手を動かすべし。
<h2>Xcode の使い方等をUdemyで学ぶ</h2>
Swiftを書けるようになってもiOS Appは作れません。そこで、Udemyでアプリ開発の基礎のコースを購入(セールしてて1200円)してやりました。Swiftに関する説明はこの時点でもうほとんど必要ないので、動画を1.5倍速にして視聴するとサクサク進めます。

以前紙ベースでUnityを学習した時は、専用UIの操作説明がわかりにくかったり手順がわからなかったりしました。動画だと投稿者の作業をずっと見れるので個人的には楽だなと思ってます。また、友人によると Apple がiOS App のチュートリアルを用意してくれているみたいでそちらもわかりやすいとのことです。
<h2>これから...</h2>
これまでで、大まかな基礎を抑えられました。僕も記事を書いている時点では、UdemyでiOS App開発の動画を見終えた状態です。最初に作ろうと思ったアプリの関係で今はサーバサイドを作っています。iOS Appを作るといっても必ずしもSwiftとXcodeで完結するわけではなくて、これまで学んだ知識が様々な箇所で求められるんだなとしみじみ。
<h2>おわりに</h2>
結構各フェーズごとに時間かかってるんですが、まとめると文字だけの淡白な記事になっちゃいました。まだはじめて1ヶ月とそこらの初心者なのでご勘弁を。それでは、皆様には快適なSwiftライフをお祈りして、僕の記事を終えたいと思います。

明日は大先輩のあきお大先生です。

というか昨日もあきおさんなので、オセロみたいにヒックリ返って今日もあきおさんってサプライズもありだったのでは...。それとちょー個人的な話ですが、<a href="https://akio-burabura.blogspot.com/2018/12/2018.html">14日目</a>の記事は非常に参考になりました！

追記
遅れてしまってすいませんm(_ _)m
WordPressで記事は書いていたんですが、カレンダーにリンクを登録できず...すいやせん。
サーバーでshellを使って簡単git操作


##大まかな目的↓
・サーバー内でプロジェクトのソースに何かしらの変更（編集等やpullなどしたい）があったときにすぐにgitコマンドでそれらをしてくれる簡単なshell

・どこから呼び出しができるようにalias

## なぜ作ろうとしたか↓
サーバーで確認したのをgitコマンドで差分の確認、pushをすることが多くて毎度ｃｄコマンドやgitコマンドを書いたりhistoryを探して手間(面倒くさかった)があったから


### １：gitコマンドを実行してくれるshellの作成

まずは実行するshを作成。名前は「hoge_test.sh」にします。

```
$vi hoge_test.sh
```

中身に

```sh
basedir=[git対象プロジェクトフォルダー]

echo ""
echo "###################"
echo "### git pull ###"
echo "###################"

cd $basedir
    git pull


if [ $? -gt 0 ]; then
    echo "git command failed!"
    exit
fi

```

これを記述して、git pull コマンドまで実行させます。

## 次に差分を出すように[git status]を叩かせて、差分を確認させ対話形式（ｙとそれ以外）で[commit]と[push]までの流れを作ります。

```sh

#ここからgit statusをして実行結果を表示しるまで
echo ""
echo "command exec $ git status"
echo "#######################################################"
git status
echo "#######################################################"
echo "next command "

#ここまでgit statusをして実行結果を表示しいる


#ここからgit commit するかの実行
#DATE_1はコミットメッセージになります。今回は日付（例：201812251200）を入れています。
DATE_1=`date '+%Y%m%d%H%M'`
echo "git commit -a -m '"$DATE_1"'"

read -p "git commit ok? (y/N): " yn
#ここで対話形式で「git commit をしますか」と聞いて入力を求められる。ｙかYでcommit(-aオプション付き)実行、それ以外でshを終了するようにしている。
case "$yn" in [yY]*) ;; *) echo "abort." ; return;; esac
git commit -a -m ''$DATE_1

echo "#######################################################"
echo "exec commit "
echo "#######################################################"
#ここまでgit commit するかの実行結果


#ここからgit push するかの実行
read -p " git push ok? (y/N): " yn
#ここで対話形式で「git push をしますか」と聞いて入力を求められる。ｙかYでpush実行、それ以外でshを終了するようにしている。
case "$yn" in [yY]*) ;; *) echo "abort." ; return;; esac
echo "#######################################################"
echo "exec git push"
echo "#######################################################"
git push origin [pushしたいブランチ名]

echo "#######################################################"
echo "push ok"
echo "sh end"
echo "#######################################################"
#ここまで git psush するかの実行及びにshの終了
```

ここまで書いてshの記述が完了。

## ですがこのコマンドを実行しても動くっちゃ動きますが、「git status時にいらないものをcheckout したい！！」というときが来ると思います。↓↓
# ですがこのshを実行してと中にあるcdコマンドを実行してもshを実行した場所から動いておりません。　ですのでaliasを使ってｃｄコマンド移動ができるようにします。

## aliasを追加する
（初心者向けエイリアスの設定）参考までにhttps://qiita.com/yutat93/items/b5bb9c0366f21bcbea62

aliasは.bashrcというファイルに記述しますので、viで開きます。

```
$vi ~/.bashrc
```

ここに新しく一行足します。

```sh
alias hoge_sh='source [先程作ったhoge_test.shのパス]'
```
「hoge_sh」は仮の名前でaliasにつかしましたので、今度からは[sh [先程作ったhoge_test.shのパス]]を実行しなくてもどこからでも「hoge_sh」を実行すればhoge_test.shが動きます。

##重要なところとして
aliasを使って上げれば簡単にどこからでもコマンド一個でshを実行できるようになるのと、
aliasに[source]を入れたことでsh内で行っている「cdコマンド」で実行後カレントディレクトリが対象の場所にいられるのでgit status時のあとでshをやめてすぐに作業ができる。
ことにありけり！！


以上です。
NASA式！システムエンジニアの生産性を最大化する秘訣。実は「座りすぎ」をやめるだけで良いのでは？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/557104fc-4f61-642f-fbcd-631de2f04eb2.png)

# 必要なもの

- ノートPC必須、あればありがたいが、なければどうにか支給してもらいたい
- 周りの理解、務めであれば会社的な許可

# やり方

- 席を立つか立たないか迷ったら必ず立つ
- 1日中ストレッチのつもりでいろいろと動き回る
- いろいろな姿勢を取る、座るとスタンディングの二種類だけじゃなく、「DEATH NOTE のL座り」とか織りませていく

# 個人的な実感

- 謎の午後の疲労を感じづらくなった
- 呼吸が無意識に止まって血流がゾンビ死にすることが減った
- 働いていて楽しくなった、難しいレビューや実装をするときでも頭がクリア

# Link

[すわりすぎ いなうらゆうま - Google Search](https://www.google.com/search?ei=0lscXI_ME8PQ8wX195og&q=%E3%81%99%E3%82%8F%E3%82%8A%E3%81%99%E3%81%8E+%E3%81%84%E3%81%AA%E3%81%86%E3%82%89%E3%82%86%E3%81%86%E3%81%BE&oq=%E3%81%99%E3%82%8F%E3%82%8A%E3%81%99%E3%81%8E+%E3%81%84%E3%81%AA%E3%81%86%E3%82%89%E3%82%86%E3%81%86%E3%81%BE&gs_l=psy-ab.3..0i71.4104.4104..4245...0.0..0.0.0.......0....1..gws-wiz.bvfEnoth0qg)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
laravelをGAE SE php7.2環境で動かす

- ↓を参考にやってみた。
 - https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/appengine/php72/laravel-framework
- GCPコンソールでプロジェクトとGAEアプリケーションは作成済み。

## 実行環境
```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.2
BuildVersion:   18C54
```
```
$ docker -v
Docker version 18.09.0, build 4d60db4
```
```
$ docker-compose -v
docker-compose version 1.23.2, build 1110ad01
```
```
$ gcloud -v
Google Cloud SDK 228.0.0
bq 2.0.39
core 2018.12.07
gsutil 4.34
```

## laravel5.7のアプリケーションを作成
#### php7.2のコンテナを用意 
``` :Dockerfile
FROM php:7.2.3-fpm
ENV COMPOSER_ALLOW_SUPERUSER 1

RUN mkdir /app
WORKDIR /app

RUN apt-get update && apt-get install -y git libmcrypt-dev zlib1g-dev libpq-dev zip unzip && \
    apt-get clean

RUN curl -sS https://getcomposer.org/installer | php && \
    mv ./composer.phar /usr/local/bin/composer

RUN composer global config repositories.packagist composer https://packagist.jp && \
    composer global require hirak/prestissimo

EXPOSE 9000
```

``` :docker-compose.yml
version: '3'

services:
  php:
    build: .
    command: php artisan serve --host=0.0.0.0 --port=8000
    volumes:
      - .:/app:cached
    ports:
      - "8000:8000"
```
```
$ docker-compose build
```

#### アプリケーション作成
```
$ docker-compose run --rm php composer create-project --prefer-dist laravel/laravel application "5.7.*"
```

#### アプリケーションをルートディレクトリに移動
```
$ mv ./application/* ./application/.[^\.]* ./
```
```
$ rm -rf ./application
```

#### 実行
```
$ docker-compose up
```
- http://localhost:8000/

## GAEにデプロイ
#### app.yaml
``` :app.yaml
runtime: php72

env_variables:
  APP_LOG: errorlog
  APP_KEY: MY_APP_KEY
  APP_STORAGE: /tmp
```

#### APP_KEY作成
```
$ sed -i '' "s#MY_APP_KEY#$(docker-compose run --rm php php artisan key:generate --show --no-ansi)#" app.yaml
```

#### .envをGAEのデプロイ対象から除外
``` :.gcloudignore
.env
```

#### APP_STORAGEで指定した/tmpにキャッシュを書き込むためのコード変更

``` /config/view.php
/*
'compiled' => env(
    'VIEW_COMPILED_PATH',
    realpath(storage_path('framework/views'))
),
*/
// 追加
'compiled' => storage_path(),
```

``` /bootstrap/app.php
// 追加
$app->useStoragePath(env('APP_STORAGE', base_path() . '/storage'));

/*
|--------------------------------------------------------------------------
| Return The Application
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/

return $app;
```

#### プロジェクトID設定
```
$ gcloud projects list
```
```
$ gcloud config set project <PROJECT_ID>
```
#### 設定確認
```
$ gcloud config list
```

#### デプロイ
```
$ gcloud app deploy
```

#### デプロイされたことを確認
```
$ gcloud app browse
```
ライブラリーファイルからRecordを読み出す

開発時ローカルにあるライブラリーからRecord情報を取り出して、分析して見たい

```elixir:iex
iex(83)> Record.extract(:session, from_lib: "ssl/src/ssl_handshake.hrl")
[
  session_id: :undefined,
  peer_certificate: :undefined,
  own_certificate: :undefined,
  compression_method: :undefined,
  cipher_suite: :undefined,
  master_secret: :undefined,
  srp_username: :undefined,
  is_resumable: :undefined,
  time_stamp: :undefined,
  ecc: :undefined
]
```
以上のように勝手に現vmが使ってるバージョンのsslライブラリーからRecordをインポートできました。
ビルド時と違うのはパスに```src```が入っています

このリストを使って```Var#session.time_stamp```のようにフィールドを取り出せないので、フィールドの順番をみてデーターを取り出しましょう
Conda(Anaconda/Miniconda)コマンド一覧

Conda(Anaconda/Miniconda)を使わない期間が長くて忘れることも多く、備忘録として書きます。

#conda環境のアップデート
定期的によく使うので頭に別出しで書いておきます。
事前に対象環境をActivateしておきましょう(baseの場合不要)。
昔は"source activate"でしたが、[4.4から"conda activate"に変わったようです](https://github.com/conda/conda/blob/a4c4feae404b2b378e106bd25f62cc8be15c768f/CHANGELOG.md#440-2017-12-20)。

```
conda activate <env>
```

有効環境のConda全パッケージアップデート。

```
conda update --all
```

["conda upgrade"](https://conda.io/docs/commands/conda-upgrade.html#conda-upgrade)でもOKみたい。
※conda upgradeの記述に「Alias for conda update」と書かれています(紛らわしい・・・)。

conda本体のみのアップデート。

```
conda update -n base -c defaults conda
```


#コマンド一覧
##[conda info](https://conda.io/docs/commands/conda-info.html)
conda情報の表示。何を作ったかよく忘れるので、頻繁に使います。

```
$ conda info -e
# conda environments:
#
base                  *  /home/i348221/.pyenv/versions/miniconda3-latest
nlp                      /home/i348221/.pyenv/versions/miniconda3-latest/envs/nlp
```

|よく使うオプション|内容|
|:--|:--|
|-e, --envs|環境一覧の表示|
|-a, --all|全情報表示|

##[conda list](https://conda.io/docs/commands/conda-list.html#conda-list)
インストール済パッケージ一覧の表示。pipでインストールしたものも含まれます。pipでインストールしたものを除外したい場合は"--no-pip"オプションを付加。

```
$ conda list
# packages in environment at /home/i348221/.pyenv/versions/miniconda3-latest:
#
# Name                    Version                   Build  Channel
asn1crypto                0.24.0                   py37_0
ca-certificates           2018.03.07                    0
certifi                   2018.11.29               py37_0
```


##conda activate
環境の有効化

```
$ conda activate <env>
```

##conda detivate
環境の無効化

```
$ conda deactivate
```


##[conda create](https://conda.io/docs/commands/conda-create.html#conda-create)
新環境の作成

```
$ conda create -n <env> python=3.6
```

|よく使うオプション|内容|
|:--|:--|
|-n ENVIRONMENT, --name ENVIRONMENT|環境名の設定|
|python=X.X|オプションとは異なるのですが、環境作成時にいつも指定するのでここに載せておきます|

##[conda search](https://conda.io/docs/commands/conda-search.html#conda-search)
パッケージの検索。オプション・設定なしで[default repository](https://repo.anaconda.com/pkgs/main)に対して完全一致検索。アスタリスク(*)を付加して部分一致検索が可能。[Anaconda Cloud](https://anaconda.org/)により多くのパッケージもあるので、見つからなかったら探してみるのがお勧め。
記事[「condaとpip：混ぜるな危険」](http://onoz000.hatenablog.com/entry/2018/02/11/142347)で読んだのだが、できるだけpipでなくconda installの方がいいらしい。

```
$ conda search "tensorflow>=1.11" --platform linux-64
Loading channels: done
# Name                  Version           Build  Channel
tensorflow               1.11.0 eigen_py27h06aee4b_0  pkgs/main
tensorflow               1.11.0 eigen_py36he3f7ef1_0  pkgs/main
tensorflow               1.11.0 gpu_py27h99ab47f_0  pkgs/main
```

|よく使うオプション|内容|
|:--|:--|
|-c CHANNEL, --channel CHANNEL|default repositoryだけでなく、チャネルを追加で指定|
|-i, --info|検索結果に詳細情報追加|

##[conda install](https://conda.io/docs/commands/conda-install.html#conda-install)
パッケージのインストール

```
$ conda install flask
```

|よく使うオプション|内容|
|:--|:--|
|-c CHANNEL, --channel CHANNEL|チャネル名指定|
2018年を振り返って個人的に実践してみてよかったこと

さぁ、1年の振り返りをしようと考えたときに、ついつい出来なかったことややりたかったことなど反省点ばかり思いついてしまいがちです。もちろん、内省して改善するのはとても大事なことですが、やってみたことやできるようになったことなど、自分の成長を実感することにも目を向けてみてはいかがでしょう？

そんなわけで、私が個人的に2018年に新たに実践してみたことをざっと振り返りも兼ねて共有してみたいと思います。

## もくじ

1. GTD (Getting Things Done)っぽいタスク管理
2. モブ作業
3. 副業
4. ダイエット/筋トレ

## GTD (Getting Things Done)っぽいタスク管理

まだ若くて関わっていることが少なかった時は、手帳やグループウェアで予定を立てて実行していくことでタスク管理していましたが、仕事の幅と量も増えて「あ、キャパオーバーしたわ」って状態になってからもう何年もその状況を継続しています。

そこで、どうやって仕事をこなしていくかのを模索してきていますが、今はGTDっぽい感じでコントロールしてます。

（やったこと）

  - 「依頼されたこと」「やりたいこと」などタスクが発生したら、即タスクリストに放り込む
  - 放り込んだタスクを、「何に関わる仕事なのか」「いつまでにやりたいか」を設定
  - 毎朝、直近1wくらいのタスクを「やる必要あるのか？」「期限は大丈夫か？」などをチェックして整理
  - あとは、リストを上から順にやるだけ

今やるべき仕事に、100％集中できるのはいいところですね。頭の片隅で、「次あれやらなきゃ」とか「あれどうしようかな」とか考えることが激減しました。

※新卒のエンジニアから、[todoist](https://todoist.com)を紹介してもらって「これ最高やん」って思いながら使ってます。

## モブ作業

チームでの開発手法で、ペアプロやモブプロなど実践している組織やチームは増えてきていると思いますが、その手法をプロダクト開発以外のプロジェクトでも実践してみたら、すごい効果が高かったです。

実践したのは、新卒エンジニアの研修プロジェクト。
プロジェクトのプロセスもスクラムに近いやり方をしていたので、実作業も重要なものはできるだけメンバー全員を集めてモブで作業を実施してみて、モブプログラミングと同じような効果を発揮できたのは良かったです。

（発揮した効果）

- 一緒に作業しているので、あとで共有する手間がなくなる
- 複数の視点で作業できるので、品質が上がる。
- 手を動かす人と頭を動かす人が別れるので、効率が良い
- だれでも対応できる状態になりSPOFが皆無
- 他人の作業のやり方から、学べることがいくつもある
- 結果に対して、全員が責任が持てるし納得できる

**チームでプロジェクトをやるなら、重要な作業や品質やスピードが必要な仕事はモブ作業を超オススメします。**

ちなみに、モブ作業について社内イベントでLTをしたらベストLT賞を頂けましたw


## 副業

ガイアックスで運営しているエンジニア交流会で、副業をテーマにパネルディスカッションを開催して、実際に副業をしているエンジニアのみなさんの話を聞いて、自分もやってみようと思い実践してみました。
下記の二種類の副業を実践してみて、それぞれについて考察してみます。

- 普段の仕事と同じ内容の副業
- 普段の仕事と全く関係のない副業

#### 普段の仕事と同じ内容の副業：「開発プロジェクトの支援」

知り合いのエンジニアが、プロダクト開発のプロジェクトのリーダーをやることになったので協力してほしいという相談を受けたので、アジャイルやスクラムの導入や、チームビルディングについて支援しました。

（やったこと）

- ステークホルダーの合意形成の方法をレクチャー（インセプションデッキ）
- 組織やチームの性格を分析して、アジャイルやスクラムの導入を検討
- ステークホルダーと一緒に、プロジェクトの計画とマイルストーンの設定
- リーダーが不安になった時のサポートとアドバイス

#### 普段の仕事と全く関係のない副業：「バーテンダー」

だれか誘って飲みに行くんだったら自分で店に立てばいいじゃんと思い、行きつけのバーのオーナーに相談して、月1回土曜日の夜にバーテンをやらせてほしいという相談をしたら快諾頂いたので、実践してみた。

（やったこと）

- バーテンをやる時の、コンセプトやイベントのネーミングなど検討
- 自分も他人も楽しめるような、特殊なお酒の仕入れ
- お通しとして出す、おつまみのデプロイ
- お酒の作り方や、バーテンとしての立ち振る舞いのトライ＆エラー

そして実践してみて、結果的に今でも継続してずっと続けているはバーテン。必ず毎月開催しています。
プロジェクトの支援については、少しなりともお役立てできたとは思ってはいますが本業が忙しいため、それほど深く関わることができなかったのでスポット的な支援となりました。

副業で稼ぐという観点では、普段の業務で培ったスキルを活かした方が効率的ですが、逆に言え時間の切り売りになってしまうので本業との住み分けを考えると「本業を集中すべきでは？」と自問自答してしまいます。
そういう意味では、本業では得られないような経験やスキルを磨く手段として副業を活用していくのは超オススメです。

※月1で、五反田のバーでやってるので興味があればぜひ気軽にきてください。イケてるスコッチが揃ってます。

## ダイエット/筋トレ

実は、去年の年末くらいに、度重なる忘年会シーズンを乗り越えたて一気に弛んでしまった体に嫌気がさして、今年に入って少しづつダイエットしてきました。周りにダイエット始めた（してる）という話をすると、「なぜ？」と聞かれることがあるのですが、理由は「モテたい」からです（笑）。ひるがえると単純に自分に自身が持てるところ増やしたいということなのかもしれません。

（やったこと）

- ジュース・缶コーヒー・お菓子など、ほぼやめた
- 食事を野菜と肉中心にして、炭水化物を減らした
- 飲み会など、量を食べてしまいそうなときはカロリミットを使った
- 自宅で、体幹を鍛えるためにワークアウトした

（※炭水化物を完全にやめたら数ヶ月でじんましんが発症したので、炭水化物を完全に抜くのはオススメしないです）

結果的に、半年くらいかけて67kgだった体重が、62kgまで落ちて正味5kgくらいのダイエットに成功しました。で、先日健康診断にいったら、医者から「もうこれ以上痩せないでください」とドクターストップがかかってしまいダイエット生活は終了を迎えました。
今は、体重をあまり落とさないようにカッコいいボディを目指して、ジムに通って筋トレしています。

結果、「モテたか？」でいうと、既婚者なのでモテるわけがないし、モテてもしょうがないということに気づきました（笑）でも、体も軽くなったし、体型にすこし自身がもてたのでマイナスな点はあまりないですね。しいてマイナスがあるとすれば、カロリーが高い料理をみるとついつい「これ、太りそうだな」っと思ってしまうところくらいです。


以上、個人として実践してみてよかったことでした！

（アドベントカレンダー用の投稿なので、本来は12/16に公開したかったのですが、、、すみません！！！！）
git – コミット名だけを一覧表示する (コミットのサブジェクト、コミットタイトル)

# 全て

```
git log --format=%s
```

# 5個だけ

```
git log -5 --format=%s
```

# 参考

[Git - pretty-formats Documentation](https://git-scm.com/docs/pretty-formats)

# link

[yumainaura git - Google Search](https://www.google.com/search?q=yumainaura+git&oq=yumainaura+git&aqs=chrome..69i57j69i60l3j69i65l2.1423j0j7&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 -->