OmniAICreator/Qiita-1.07M huggingface dataset:
sudoと環境変数とリダイレクトと

# `sudo`と環境変数
`sudo`コマンドを使う時、`sudo`コマンドを使うユーザーの環境変数を引き継ぎたい時とかがあったりします。

プロキシとか、プロキシとか、プロキシとか。

例えば、ちょっと強引ですが、プロキシを設定後`wget`を`sudo`越しに実行しようとすると…プロキシ前提でインターネットアクセスする環境だと、うまくいきません。

```shell
$ export https_proxy=http://your-proxy.host:your-proxy.port
$ sudo wget https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64
--2018-11-29 12:47:02--  https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64
github.com (github.com) をDNSに問いあわせています... 失敗しました: 名前またはサービスが不明です.
wget: ホストアドレス `github.com' を解決できませんでした。
```

こういう時は、`sudo`に`-E`オプションを付けると、実行ユーザーの環境変数を引き継いでくれます。

```shell
$ sudo -E wget https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64
```
[Man page of SUDO - JM Project](https://linuxjm.osdn.jp/html/sudo/man8/sudo.8.html)
> 現在の環境変数をそのまま保持するのがユーザの意向だと、セキュリティポリシーに指示する。 ユーザが環境を保持する許可を持っていない場合は、 セキュリティポリシーがエラーを返すことになるだろう。

とはいえ、そもそも環境変数を引き継ぐことは余計な問題を持ち込んでしまう可能性があることは意識しておく必要があるでしょう。

# `sudo`とリダイレクト
`sudo`コマンドを実行した結果を、たまにファイルなどにリダイレクトしたいことがあります。

例えば、このように。

```shell
$ sudo -E wget https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64 > /usr/local/bin/minikube
bash: /usr/local/bin/minikube: 許可がありません
```

ですが、これだとリダイレクト時に書き込み先の権限がない場合は、エラーになってしまいます。

1度、ファイルを別の場所に移動して`mv`したり、`wget`の例だと`-O`オプションで解決してもいいのですが、こういう場合は`sudo`と`sh -c`を組み合わせることでも解決できます。

```shell
$ sudo -E sh -c 'wget https://github.com/kubernetes/minikube/releases/download/v0.30.0/minikube-linux-amd64 > /usr/local/bin/minikube'
```

`sh`コマンドに`-c`で、コマンドを渡して実行する方法で回避。

小ネタとして。
phpMyadminを日本語表示にする方法

phpMyadminを使うときに日本語表示にする方法を２つ解説します。
<br>


####1,左上の家のマークを押して、「Language」を「日本語」に変える
家のマーク
![fullsizeoutput_9.jpeg](https://qiita-image-store.s3.amazonaws.com/0/320755/407996aa-83c5-c28a-01e3-ccc9f976d4e9.jpeg)
<br>
Englishのところを日本語に変える
![fullsizeoutput_a.jpeg](https://qiita-image-store.s3.amazonaws.com/0/320755/8a922b78-8a7a-a019-0e25-af94b2262763.jpeg)
<br>
####2,urlを変える
urlの`http://localhost:8888/phpMyAdmin/?lang=en`
の最後のenをjaに変えて
`http://localhost:8888/phpMyAdmin/?lang=ja`にする。
qemu + debootstrap で aarch64 バイナリを x86 Linux chroot 環境で動かす(2018 年度版)

## 背景

* aarch64 でのレンダラなどの C++ + グラフィックスの開発がしたい.
* Raspberry Pi3 では非力なのでコンパイルとか実行が遅い
* クラウドサービスで使える arm だと画面出力が面倒であるしネットワーク越しの転送時間もかかってしまう.
* Android 用開発ボードもよいが環境設定がめんどう.

手元の今使っているそこそこ性能のよい x86 PC 環境なので, home など共有して aarch64 開発とアプリ実行/デバッグしたい.

## ソリューション

qemu + schroot でいけます.

追記: Android 端末 + Termux もよさそう https://termux.com/

## 環境

* Ubuntu 16.04 LTS
* 2018 年時点でそこその性能のよい PC(8 コア, メモリ 32 GB とか)

## インストール

http://logan.tw/posts/2017/01/21/introduction-to-qemu-debootstrap/

を参考に debootstrap で簡単にインストールできます.

```
$ sudo qemu-debootstrap --arch=arm64 xenial arm64-ubuntu
```

ホスト側で以下のようにして設定ファイルを作ります.

```
$ echo "[arm64-ubuntu]
description=Ubuntu 16.04 Xenial (arm64)
directory=$(pwd)/arm64-ubuntu
root-users=$(whoami)
users=$(whoami)
type=directory" | sudo tee /etc/schroot/chroot.d/arm64-ubuntu
```

## schroot する

schroot をインストールし, schroot で arm64 環境に chroot します.

```
$ schroot -c arm64-ubuntu
```

Voila! 今使っているユーザアカウントで arm64 環境に入れました!

## apt でパッケージを入れる.

デフォルトでは vim が入っていないので, apt で入れます.
chroot 内で aarch64 なパッケージを apt で入れることができますが, `sudo apt-get ...` でインストールしようとすると 

```
no tty present ...
```

などとエラーがでてしまいます. `schroot -c arm64-ubuntu -u root` で root ユーザで chroot 環境に入って apt-get するしかないようです.


## bashrc の記述

`uname -m` で arm64 だと `aarch64` が却ってきますので, これを用いて x86 と arm で異なる処理を記述するとよいでしょう.

```
arch_name=`uname -m`

if [ $arch_name == "aarch64" ]; then
  ... # aarch64 specific setting
fi
```

## TODO

* [ ] X11, OpenGL の設定(xauth?)
* [ ] ARM NEON 命令に対応しているか調べる(2, 3 年ほど前では一部 NEON 命令のエミュレーションに対応していなかった記憶がある)
C++ Builder > Quality Central > 2018-11-29 特定のバージョン(例: XE4)に対するissueを見たい場合

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 3
```

### 関連

- [C++ Builder > Quality Central | forum](https://qiita.com/7of9/items/384f6a62b47613ad8d86)

### 検索

EDNアカウントで閲覧、質問可能なQuality Central。
https://quality.embarcadero.com/secure/

特定のバージョン(例: XE4)に対するissueを見たい場合(2018-11-29現在)
1. Issues
2. Search for Issues
3. More > Affects Version
4. 左に表示されるAffects Versionで「XE4」を選択
2018-11-29 C++ Builder > Quality Central | forum

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 3
```

### Quality Central

不具合の連絡先?
~~https://quality.embarcadero.com/secure/Dashboard.jspa~=
~~EDNアカウントがあれば連絡できる。~~
(追記: 2019-07-24 接続できない)


### forum > Read only 

https://community.embarcadero.com/forum
> Notice
The forum is in read only mode.

### 不明

forumとQuality Centralの使い分け。

少なくともforumはread onlyなので、質問も回答もできない。
CodePipelineのECSデプロイをキャンセルする方法

CodePipelineによるECSへのデプロイステージをキャンセルする方法をAWSに問い合わせました。

概要としては以下の通りです。

- デプロイのタイムアウトは60分（現状この値を変更できない）
- アクションの中断は手動で行えない（代替案は後述）

なお上記の２点については、AWSの製品開発チームにフィードバックしているとのことです。
> 「アクションの中断を手動で行えるようにしたい」および「アクションのタイムアウト時間を変更したい」というご要望については、既に他のお客様からも機能追加のご要望をいただいております。
本お問い合わせにつきましても、機能追加要望として製品開発チームにフィードバックさせていただきます。

何が問題かというと、新しいコンテナがヘルスチェックの失敗により落ちてしまった場合、再度新しいコンテナの立ち上げが60分間繰り返される点です。そのためのキャンセル方法を、AWSサポートが代替案として紹介してくださいました。

>パイプラインの実行中に「パイプラインの設定変更」を行うことにより、擬似的にパイプラインの実行を中断することが可能でございます。

> マネジメントコンソールより実行中のパイプラインを選択して「編集」をクリックし、例えば実行中のアクションの "アクション名" を変更して「保存」することで、パイプラインの実行が中断されることを当方でも検証により確認しております。
「パイプラインの実行を中断するためにパイプラインを編集する」といった操作は想定外の使用方法であることをご認識いただいた上で、こちらの代替案によりお客様のご要件を満たすことが可能か、ご確認いただけますと幸いです。

ということらしいです。
Terraform上からでも`stage > action > name`を別の名前にすればキャンセルできます。（下の例ではDeployからDeploysにするとキャンセルされる）

```codepipeline.tf
resource "aws_codepipeline" "application" {
  name     = "my-application-pipeline"
  [.....]

  stage {
    name = "ProductionDeploy"

    action {
      name            = "Deploy"
      category        = "Deploy"
      owner           = "AWS"
      provider        = "ECS"
      input_artifacts = ["imagedefinitions"]
      version         = "1"

      configuration {
        ClusterName = "${aws_ecs_cluster.this.name}"
        ServiceName = "${aws_ecs_service.this.name}"
        FileName    = "imagedefinitions.json"
      }
    }
  }
}
```

以上です。CodePipelineにはお世話になっているので、上記の改善を心よりお待ちしております。
2000年から本日までの年を全て表示

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>2000年から本日までの年を全て表示</title>
</head>
<body>
    <script>
        // 現在日時を取得
        var date = new Date();　//秒まで取得できる
        // 現在日時から「年」のみを取得
        // dateオブジェクトから西暦のみを取るのがgetFullYeaメソッドの役割
        var year = date.getFullYear(); //2018がyaerに入る
         
        for (var i = 2000; i<= year; i++) {
        document.write('<p>' + i + '</p>')
        }
    </script>
</body>
</html>
```

2000

2001

2002

2003

2004

2005

2006

2007

2008

2009

2010

2011

2012

2013

2014

2015

2016

2017

2018
Laravel MixでビルドするとsummernoteのCode Viewが動かなくなる現象の解消

# はじめに
Laravel Mixを使ってsummernoteを含むCSSやJavaScriptをワンソースにパッケージ化した際に、summernoteのCode Viewが動かなくなる現象がありました。

イメージで説明するとこういう状況です。
下記のキャプチャはCode Viewボタンを押す前のエディタです。
![summernote_before.png](https://qiita-image-store.s3.amazonaws.com/0/186115/4b53ce80-5925-bc39-73d2-1ab448b25253.png)
そして下記のキャプチャがCode Viewボタンを押した後のエディタです。
![summernote_after.png](https://qiita-image-store.s3.amazonaws.com/0/186115/b8e9a254-336b-1fd7-7bbb-53750fe845bd.png)

おわかりいただけたでしょうか？
コードが表示されません。ビルド前はちゃんと表示されていたのに！

なお、summernoteのバージョンは0.8.11、Bootstrapのバージョンは3.3.7で確認しています。


# 要因
webpackのコンパイル時にcodemirrorを含んでしまうのがいけなかったようです。


# 解決方法
下記のissueの通りなのですが、webpackのプラグインでcodemirrorをコンパイルの対象から除外してやればOKです。

https://github.com/summernote/summernote/issues/1171

```javascript:webpack.mix.js
const mix = require('laravel-mix');
const webpack = require('webpack');

mix.webpackConfig({
  plugins: [
    new webpack.IgnorePlugin(/^codemirror$/)
  ]
});

mix.js('resources/assets/js/app.js', 'public/assets/js')
   .sass('resources/assets/scss/app.scss', 'public/assets/css')
   .version();
```


# おわりに
何に原因があるのか分からず困っていましたが、webpackのキーワードで解決方法が見つかって助かりました。:joy:
【FizzBuzz問題】1から100までの整数に対し、  3で割り切れる場合は「Fizz」 5で割り切れる場合は「Buzz」 3でも5でも割り切れる場合は「FizzBuzz」 上記以外は数値そのまま を表示

どうやら定番問題らしい

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="UTF-8">
   <title>FizzBuzz問題</title>
</head>
<body>
<script>
    for (var i = 1; i <= 100; i++) {
        if ((i%3 === 0) && (i%5 === 0)) { //３かつ５の倍数
        document.write('<p>FizzBuzz</p>');
        
        } else if (i%3 === 0 ) { //それ以外で３の倍数
        document.write('<p>Fizz</p>');
       
        } else if (i%5 === 0) { //それ以外で５の倍数
        document.write('<p>Buzz</p>');
       
        } else {
        document.write('<p>' + i + '</p>');　//<p>タグを忘れないように
        }
    }
</script>
</body>
</html>
```
Dialogflow覚書

Dialogflowの覚書です。
少し触ってみて「この用語なんだ？」的な事をまとめています。
公式は[これ](https://dialogflow.com/docs)です。(全部英語です。)
※もうちょっと触って、追記します。

## そもそもDialogflowとは？
会話型のインターフェースを簡単に作れるサービス。
そのサービスの中に自然言語理解のエンジンが含まれる。
Googleが提供しています。


## Agent(エージェント)
エージェントは、チャットボットです。
※公式には、「自然言語理解のモジュール」と書かれている。
当然複数のbotを作成できる。

## Intents(インテント)
Intentsは、平たく言うと「Q&A」を定義する事を指します。
Intentsは直訳すると「意思/意図/目的」です。
つまり正確にいうと、**ユーザーの発言がどういった意思や意図を持っているかをカテゴリー分けしていく概念。**
(個人的にはQ&Aと言われるより↑の方がしっくりくる。)

そもそもdialogflowは以下の流れで会話をする。

```
1. ユーザーが入力
2. Agentがユーザーの入力を解析する
3. Agentがユーザーにレスポンスを返す
```
↑Agentにユーザーの入力に対応するインテントを作成する事で、会話の仕組みを定義できる。

## Entities(エンティティ)
Entitiesは平たく言うと「単語の辞書登録」を定義する事を指します。
Entitiesは直訳すると「存在/実体」です。
↑これは正直わかりにくいですね。
言い換えると、**ユーザーの発言の中にある、意味のある単語をカテゴリー分けしていく概念。**

そして公式には、「自然言語入力から有益な情報を抽出して識別するメカニズム」と書いてます。


## 気になる料金
[公式](https://cloud.google.com/dialogflow-enterprise/pricing)に書かれているので最新はこのページ見て下さい。

でも、一応概要だけ書く。
> Dialogflow の料金は、Cloud Speech API を使用して認識されたテキスト入力と音声入力の両方からのリクエストの数に基づいて月ごとに請求されます。

つまり、使用頻度が高いと料金も上がる。
しかし、Editonが二つ用意されており、Dialogflow Standard Editionを使えば無料で使用できる。
(もちろん制限あり。制限については[これ](https://cloud.google.com/dialogflow-enterprise/quotas)を参照して下さい。)




## 参考
この辺に目を通すと更に理解が深まると思います。
というかまだ僕も概要だけしか知らない状況なので、ちゃんと触って別のエントリー書きます。

- [公式のドキュメント](https://dialogflow.com/docs)
- [Dialogflow入門](https://qiita.com/kenz_firespeed/items/0979ceb05e4e3299f313)
- [チャットボットをAIでもっと素敵にする！自然言語処理の仕組み](https://qiita.com/okajax/items/0534c92bb9b7f9bc1413)
1+2+3+…と足される数を1ずつ増やしながら足していき、和が1000を超えるときの足される数値と、合計値を表示

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>和が1000を超えるときの足される数値と合計値</title>
</head>
<body>
    <script>
    ///1+2+3+…と足される数を1ずつ増やしながら足していき、
    ///和が1000を超えるときの足される数値と合計値を表示してください。
        var i = 1;//足される数をiと定義し、初期値1を代入
        var sum = 0; //今までの和の初期値に0を代入
        while (sum <= 1000) {//和が1000以下ならループ
            sum = sum + i; //現在の和にiを足す sum += i でもOK。
            //ここまでで、sum= 990 + 45=1035　が成立
            i++ //i を一つ増やす
            //iが46になった
        
        //45番目を知りたいから1引く
        document.write('<p>足される数値：　' + (i-1) + '</p>' );
        document.write('<p>合計値：　' + sum + '</p>');
        }
    </script>
</body>
</html>
```
足される数値：　1

合計値：　1

足される数値：　2

合計値：　3

足される数値：　3

合計値：　6

足される数値：　4

合計値：　10

足される数値：　5

合計値：　15

〜〜〜中略〜〜〜

足される数値：　44

合計値：　990

足される数値：　45

合計値：　1035

#最終的な数値だけを出したい
`sum = sum + i;`　と　`i++`の順序を入れ替えてみた

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>和が1000を超えるときの足される数値と合計値</title>
</head>
<body>
    <script>
    ///1+2+3+…と足される数を1ずつ増やしながら足していき、
    ///和が1000を超えるときの足される数値と合計値を表示してください。
        var i = 0;//足される数をiと定義し、初期値0を代入
        var sum = 0; //今までの和の初期値に0を代入
        while (sum <= 1000) {//和が1000以下ならループ
            i++ //45 になってから
            sum = sum + i; //（sum += i でもOK）。sum= 990 + 45=1035　が成立
        }
        
        document.write('<p>足される数値：　' + (i) + '</p>' );
        document.write('<p>合計値：　' + sum + '</p>');

    </script>
</body>
</html>
```
足される数値：　45

合計値：　1035
GASでGoogleDriveにあるテキスト以外のファイルを更新する

#はじめに
DriveAppクラスでidを維持したままファイルを更新するメソッドがなくて(テキストはsetContent()がある)、Advanced Drive Serviceを使おうとしたらハマったので置いておきます
#方法
リソース→Googleの拡張サービスよりDrive APIをONにしておく

```javascript

//画像を更新する場合
function updateImageFile(title,targetId,blob) {
  var body = {
    title: title,
    mimeType: 'image/png'
  };
  
  file = Drive.Files.update(body,targetId, blob);

  Logger.log('ID: %s, File size (bytes): %s', file.id, file.fileSize);
}
```
Visual Studio CodeでGit mergeする方法

#はじめに
Visual Studio CodeでGitのブランチをマージする方法がわかりませんでした。

だって、Visual Studio CodeのGitのメニューに`マージ`がないんですもの。
あるって思うじゃないですか。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/6c949565-9848-a687-ba33-566d62dc863b.png" title="" alt="image.png" width="60%" height="" >

自分がどれだけ普段Visual Studioにおんぶにだっこなのかがわかる出来事でした。

とはいえ、マージだけコマンドラインでやるのもスマートではないので調べたところ、以下のようにVisual Studio Code上でマージができることがわかりました。

#マージはコマンドパレットから
`Ctrl+Shif+P`でコマンドパレットを開きます。
そして、入力欄に`Git:merge`と入力すると以下のようにマージの項目が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/f7b1108d-3b70-c135-cf98-79ecbfba54c1.png)

そうしたら、マージしたいブランチを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/42e4f304-7705-3d6f-8a43-9134de52d69e.png)

これで、現在のブランチに選択したブランチがマージされます。

簡単で良かったです。
これからも開発環境におんぶにだっこでいきたいと思います

#おわりに
メニューに加えてくれたらいいのに。
Androidで使っていこうKotlin コルーチン


[ZOZOテクノロジーズ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/zozo_tech) の1日目の記事になります。


## Kotlin コルーチンをAndroidで使っていこうぜ

Kotlin 1.3からstableとなったKotlin コルーチンをAndroidで使っていくためのTIPSを書いてみたいと思います。

以前の[potatotips #56](https://potatotips.connpass.com/event/104242/)で登壇した資料もよろしければご覧ください。

https://speakerdeck.com/yshogo/androidkai-fa-tipsgong-you-hui

### Retrofitと一緒に使う

Retrofitと一緒に使う場合はこんな実装をします。

- build.gradle

```groovy

// kotlin coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1"

// retrofit
implementation "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2"

```

あとはRepositoryでこんな実装を書いて

```kotlin
fun getInfo() = Retrofit.Builder().baseUrl(InfoService.baseUrl)
             .addConverterFactory(MoshiConverterFactory.create())
             .addCallAdapterFactory(CoroutineCallAdapterFactory())
             .build().create(InfoService::class.java)
```

コルーチンを使って呼び出します。

```kotlin
val service = InfoRepository().getInfo()
launch {
         val request = service.getInfo()
         val response = request.await()
         if (response.isSuccessful) {
            print(response.body())
         } else {
            // エラー
            print(response.errorBody())
         }
      }
```

### GlobalScope.launchはあまりつかわなくていいと思う


GlobalScopeは使わなくてもいいと思います。GlobalScopeは *呼び出しときからアプリが終了するまで保持される* ので生存期間が長すぎると思います。

ですので、 `CoroutineScope` をimplementsしましょう。

そして、ViewModelが破棄されたのと同時にjobをキャンセルすれば、生存期間がActivityを同じになります。


```kotlin

class HomeViewModel: ViewModel(), CoroutineScope {

    private val loadingJob: Job = Job()

    override val coroutineContext: CoroutineContext
        get() = loadingJob

    override fun onCleared() {
        super.onCleared()
        loadingJob.cancel()
    }
    
   fun getInfo() {
      val service = InfoRepository().getInfo()
      launch {
         val request = service.getInfo()
         val response = request.await()
         if (response.isSuccessful) {
            print(response.body())
         } else {
            // エラー
            print(response.errorBody())
         }
      }
   }
}
```

## UIを触りにいくためには、 `Dispatchers.Main` をつける

Kotlin 1.3より前は　`UI` をつけていましたが、1.3からは `Dispatchers.Main` に変わりました。

```kotlin
launch(Dispatchers.Main) {
    message.text = "10"
}
```

詳しくは下記の公式サイトに詳しく載っているのでご覧ください。

https://kotlinlang.org/docs/reference/coroutines-overview.html


## これから

Kotlinコルーチンについてはまだ出てきてから、少ししか経ってないので手探りの状態だと思います。
どんどん触っていって、どんどん記事を書いていきましょう！！！！
dplyr使いのためのpandas スライスsliceとインデックスindex編

#はじめに
pandasデータフレームの操作には基本編で紹介した操作方法がありますが、データの部分的な取り出しにはスライスとインデックスという記法による操作手法があり覚えておくと便利です。
配列やデータフレームには行と列にインデックス属性（名前や番号）というものがあり、これを指定することで操作します。

##関連記事
[dplyr使いのためのpandas 基本編](https://qiita.com/T_Shinomiya/items/d445ce2f3d95160ec944)
[dplyr使いのためのpandas マルチカラム操作編](https://qiita.com/T_Shinomiya/items/78a9695dff796dccaed5)

##slice スライス
コロン(:)でマークされた表記方法によるNumpy配列やPandasデータフレームの行や列（範囲）を操作する手法

```Python:numpyスライス
#numpy配列の操作
import numpy as np
numpyarray = np.array([[1,2,3],[4,5,6],[7,8,9]])

#以下のような配列があるとき
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

numpyarray[:, :1] #1列目の配列データを指定
array([[1],
       [4],
       [7]])

numpyarray[:1, :] #1行目の配列データを指定
array([[1, 2, 3]])

numpyarray[:2, :2] #1~2行と1~2列の配列データを指定
array([[1, 2],
       [4, 5]])

```
```Python:pandasスライス
#pandasデータフレームの操作
import pandas as pd
dataframe = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]])
pddata.columns = ["colA", "colB", "colC"]

#以下のようなデータフレームがあるとき
	colA	colB	colC
0	1       2       3
1	4       5       6
2	7       8       9

dataframe.iloc[:, :1] #1列目の範囲データを指定
	colA
0	1
1	4
2	7

dataframe.iloc[:1, :] #1行目の範囲データを指定
	colA   colB   colC
0	1      2      3

dataframe.iloc[:2, :2] #1~2行と1~2列の範囲データを指定
      colA    colB
0     1	      2
1     4	      5
```

##index インデックス
Numpy配列やPandasデータフレームの個々の要素（値）を操作する手法

```Python:numpyインデックス
#0がスタート位置になる
numpyarray[0, 0] #1行1列目の値の指定

1
```
```Python:pandasインデックス
#0がスタート位置になる
pddata.iloc[2, 2] #3行3列目の値の指定

9
```

##locとiloc
padasデータフレームのスライス、インデックスに出てきた "iloc" はデータフレームのインデックス属性を操作する機能です。ilocはデータの行と列の位置で指定、locは行と列の明示的な名称で指定します。

```Python:locとiloc
#1~2行と1~2列の範囲データを指定（ilocとlocで同じ）
pddata.iloc[:2, :2] #位置で指定
pddata.loc[:"1", :"colB"] #名称で指定

    colA     colB
0   1        2
1   4        5
```

#まとめ
スライスとインデックスはMultiindexの操作には必要となる記法です。ぜひ覚えておきましょう。
AnsibleでAmazon EFSの作成からマウントするまで

# 概要

Amazon EFSの作成からEC2にマウントするまでをAnsibleでやります
Ansibleのmountモジュールを使用することで、**マウント済みチェック**や**自動マウント設定**もやってくれるので便利

# 手順

1. [EFSアクセス用のセキュリティグループの作成もしくは、既存のセキュリティグループに追加](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/accessing-fs-create-security-groups.html)（手動）
2. EFSボリュームの作成
3. EC2にマウント

# コード

```yaml:amazon_efs.yml
---
# EFSボリュームの作成
- name: create efs volume
  hosts: localhost
  connection: local
  gather_facts: False
  tasks:
    # create EFS volume
    - name: Create EFS
      efs:
        state: present
        region: "リージョンID"
        name: "sample_efs"
        tags:
          Name: "タグ名"
        targets:
          - subnet_id: "AZ-aのサブネットID"
            security_groups: [ "EFS接続できるセキュリティグループID" ]
          - subnet_id: "AZ-cのサブネットID"
            security_groups: [ "EFS接続できるセキュリティグループID" ]
        performance_mode: general_purpose
        encrypt: yes

# EFSボリュームのマウント
- name: efs mount to ec2
  hosts: my_ec2
  vars:
    efs_vol_name: "sample_efs"
  tasks:
    # EFSボリュームIDを取得する
    - local_action:
        module: efs_facts
        name: "{{ efs_vol_name }}"
      run_once: true
      register: _efs_fact

    - set_fact:
        _efs_fact_id: "{{ _efs_fact.ansible_facts.efs[0].file_system_id }}"
    
    # EFSマウント用のユーティリティツールをインストール
    # amazon-efs-utilsを使用して、マウントしないが、とりあえずインストールしておく
    - name: install efs libs
      yum:
        name: "{{ item }}"
        state: present
      become: yes
      with_items:
        - "nfs-utils"
        - "amazon-efs-utils"

    # EC2にマウント用のディレクトリを作成しておく
    - name: Create data store directory for efs mount
      file:
        dest: "/home/ec2-user/{{ efs_vol_name }}"
        state: directory

    # EFSのマウント
    - name: mount efs volume
      mount:
        path: "/home/ec2-user/{{ efs_vol_name }}"
        src: "{{ _efs_fact_id }}.efs.ap-northeast-1.amazonaws.com:/"
        fstype: "nfs4"
        opts: "nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport"
        state: mounted
      become: yes  
    
    # マウント後はrootユーザの所有権になるため、明示的に所有権を変更
    - name: change directory owner
      file:
        dest: "/home/ec2-user/{{ efs_vol_name }}"
        owner: "ec2-user"
        group: "ec2-user"
        state: directory
      become: yes
```

# ポイント

## [mountモジュール](https://docs.ansible.com/ansible/2.6/modules/mount_module.html)

- stateで`mounted`にすることで自動マウントの設定（`/etc/fstab`）もやってくれます
- optsは[Amazon EFSの設定値](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/mounting-fs.html#mounting-fs-mount-helper-ec2)を用いる
rubocop-airbnbのエラー一覧


#初めに
私が試してきて出てきたエラーですので全部を網羅できている訳ではないと思いますが、参考になる方がいれば幸いです。

#各エラーについて
+ 1 Line is too long.
1行80文字以上だとはじかれるので、設定を変える（例えば120字以上をはじくようにする）か、なんとかして短くしましょう。

+ 2 Prefer single-quoted strings when you don't need string interpolation or special symbols.
" "を''にかえる。string interpolationは、" "の中に変数などを入れてそこにデータを入れること。special symbolsは、" "の中であれば例えば"こんにちは\n私の名前は~"と書けば \n のところで改行してくれる。けど、' 'だとそのまま バックスラッシュ+n が出力されます。

+ 3 Missing top-level class documentation comment.
一行目にいきなり class ~~ と書き始めると怒られる。その前にどういうクラスなのかcommentして欲しいというものです。

+ 4 Space inside square brackets detected. あるいは Space inside { missing.
[ ]の中は、文字列の前後にスペース不要。{ }の中は、文字列の前後にスペース入れる。つまり[:id]とか{ maximum: 50 }が推奨。

+ 5 Method has too many lines.
5行以内で書くことが推奨されていて、10行を超えると警告が出る。if文を三項演算子使って簡略化するなどで対応できるかと思います。

+ 6 Extra blank line detected.
空行が2行続いてたりするので、消しましょう。

+ 7 Inconsistent indentation detected.
インデントがおかしいので、見直す。例えば、コントローラーのprivate以降のメソッドがインデントされてるとか（インデント必要ない）個人的によく見ました。

+ 8 Final newline missing.
最終改行がありません。

+ 9 Airbnb/ModuleMethodInWrongFile~
このエラーが出た場合には以下を追加しましょう。

```.rubocop.yml
Airbnb/ModuleMethodInWrongFile:
  Description: Define a module method in the file that defines the module, not a file that
    happens to use the module as a namespace.
  Enabled: false
  Include:
    - 'app/**/*'
    - 'lib/**/*'
``` 

+ 10 Airbnb/ConstAssignedInWrongFile~
このエラーが出た場合には以下を追加しましょう。

```.rubocop.yml
Airbnb/ConstAssignedInWrongFile:
  Enabled: false
  Include:
    - 'app/**/*'
    - 'lib/**/*'
```
ビジュアルプログラミングツール Lakeshore を触ってみた

# LakeShoreとは？

ゲームをシーン単位に分割し、各シーンのスプライトをイベントベースでビジュアルプログラミングするオーサリングツールで、HTML5アプリとして書き出しするツールです。

公式サイト: https://www.egret.com/products/lakeshore.html
> Lakeshoreはプログラミングを必要としない無料のゲーム作成ツールです。Lakeshoreの力で、誰もが素早くクールなゲームを作成できます。 Egretエンジンでは、LakeshoreのゲームはAndroid、iOS、Windows Phoneプラットフォームで動作します。


# LakeShoreの基本概念
公式サイトの翻訳になります
公式サイト： http://developer.egret.com/cn/github/egret-docs/Lakeshore/manual/basicConcept/basicConcept/index.html

## 1. シーン
シーンはゲームの基本単位。開始位置、終了位置や各レベルは、シーンで表現します。 ゲームの進行に応じて、シーン間を遷移することができます。

## 2.スプライト
スプライトはイメージのコンテナです。ゲームシーンに静止画像を挿入する場合は、レンダリングしたい画像をスプライトに配置します。ゲームを作る際は、スプライトを動かして、画像の動き、変形、回転などの動作を実現します。

## 3.インスタンス
ゲームで操作できる基本単位。インスタンスには、テキストボックス、アニメーション化された文字、背景イメージ、画像を含むスプライトなどがあります。インスタンスは、、場所やサイズなどの属性が異なるものを複製することができて、独立して操作することができます。

## 5.ビヘイビアー
シューティングゲームであれば、飛行機を指でドラッグして移動することができたり、スーパーマリオであればマリオをキーで、ジャンプやしゃがんだりなどの操作することができます。それらを実現するためにビヘイビアーという機能があります。インスタンスにビヘイビアーを追加すると、そのインスタンスは設定したビヘイビアーに応じた振る舞いや反応が実装されます。たとえばインスタンスに弾丸ビヘイビアを追加すると、個別にイベントのトリガーや実装をしなくても、ゲームをはじめたら弾丸のように飛びます。インスタンスにドラッグビヘイビアを追加したら、指でスクリーンをドラッグして、インスタンスをドラッグすることができます。ビヘイビアを使うことで、ゲーム制作の難しさと複雑さを大幅に単純化することができます。

下の画像のように、ビヘイビアーはあらかじめプリセットでが用意されていて、インスタンスに貼り付けることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/ae89c681-860e-edb2-5cdc-f2955ae722b5.png)

## 6.イベントとイベントテーブル
ゲームのロジックを簡単に説明すると、どのような条件が満たされたときにどのようなことをすることです。これがイベントの基本的な構成です。たとえば、弾丸が敵機に当たると、敵機が爆発するのもイベントです。また、複数のイベントをイベントテーブルにまとめることで、ゲーム全体のロジックはイベントテーブルを通じて実装されます。

# デモ
動画がアップロードできないので私のTwitterの貼り付けになりますが、それなりのものが動きます

# プログラミング画面
## シーンエディタ
こんな形でシーン内にインスタンスを配置したり編集したりします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/1bf68cbf-4140-edcf-37f1-a3e12135d43f.png)

## イベントエディタ
各シーンにてペインを切り替えるとイベント編集モードになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/6fc60593-4e1d-dff1-894a-ae5ccb2423fc.png)
rubocop−airbnbを使うにあたって　

#rubocopとは

Ruby style guideを基づいて作られたstatic code analyzerです。
[git](https://github.com/rubocop-hq/rubocop)はこちら

#rubocop−airbnbとは
airbnb社が作っているrubocopです。
[git](https://github.com/airbnb/ruby/tree/master/rubocop-airbnb)はこちら

#導入
Gemfileに以下のgemを追加しましょう。

```．Gemfile
group :development, :test do
  gem 'rubocop-airbnb'
```

追加しましたら、bundle　installを実行しましょう。

#設定
アプリのフォルダに.rubocop.ymlと.rubocop_airbnb.ymlファイルを作成し、以下の内容を記入しましょう

```．rubocop.yml
inherit_from:
  - .rubocop_airbnb.yml

#以下にはrubocopで検証したくないフォルダを指定する
AllCops:
  Exclude:
    - 'db/**/*'
    - 'bin/*'
    - 'config/environments/*'
    - 'config/application.rb'
    - 'config/initializers/*'
    - 'config/spring.rb'
    - 'lib/tasks/*'
    - 'vendor/**/*'
    - 'path/ruby'

```
```．rubocop_airbnb.yml
require:
  - rubocop-airbnb

```
ここまでの設定が終わりましたら、ターミナルで以下を実行

```
bundle exec rubocop --require rubocop-airbnb
```

正常に起動すれば大丈夫です。
1から100までの間で、3の倍数の数だけを足した合計値を表示

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="UTF-8">
   <title>1から100までの間で、3の倍数の数だけを足した合計値</title>
</head>
<body>
<script>
    var sum = 0; //初期値0
    for (var i = 1; i <= 100; i++) {
        if (i%3 === 0) {
        sum = sum + i ; //sum += i でもOK
        }
    }
    document.write(sum);
</script>
</body>
</html>
Gitで「Git: remote: Permission to ~/~~.git denied to ~~ 」と出てしまったときの対処法

#はじめに

VS CodeでGitでプッシュしようとしたら以下のメッセージができてリモートにプッシュできなくなりました。

![ajdflkajsdflaj.png](https://qiita-image-store.s3.amazonaws.com/0/245438/30e1ce34-0610-2fcb-8ce4-86d530177ba0.png)

何が原因かというと見たまんまプッシュ先のリポジトリに対する権限がないっていわれています。

原因は前日に「1つのPC上で複数のGitHubアカウントにプッシュしたい」と思ってネットを見ながらいろいろ設定を変えたことです。

今回はその変更を修正する方法です。

#資格情報マネージャーを起動
Windowsの検索欄から資格情報マネージャーを検索して起動します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/ca61d45c-06f2-2cd6-7c2b-5e6bb8e2e9a8.png" title="" alt="image.png" width="60%" height="" >

#GitHubの資格情報を確認
開いた資格情報ウィンドウで、「Windows資格情報」を選択し、表示された`汎用資格情報`の中から`git:htt@s://github.com`を探してクリックします。

すると、登録されている`ユーザー名`と`パスワード`が表示されると思うのですが、おそらくそれがプッシュしたいGitHubのアカウントとは異なっているのではないでしょうか。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/f9cd18db-75d2-b1d3-cc61-74ce6421818a.png" title="" alt="sdjfalksdjfla.png" width="60%" height="" >

#GitHubの資格情報の修正
`編集`という項目があるので、それをクリックします。
編集ウィンドウが開くので、ユーザー名とパスワードを変更して`保存`ボタンをクリックして保存します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/245438/b1c1eadc-7f05-bfc2-9887-7be40f8e6125.png" title="" alt="asdklfjalskdfjal.png" width="60%" height="" >


プッシュできるようになったと思います。
Golang - What is _ (Blank Identifier)?

# 1. Import _ xxxx
```golang
import   "lib/math"    ->     math.Sin
import m "lib/math"    ->     m.Sin
import . "lib/math"    ->     Sin
import _ "lib/math"    ->     import this package and allow it can not be used
                              (normally, golang compiler always show error when import package not be used)
```
https://stackoverflow.com/questions/21220077/what-does-an-underscore-in-front-of-an-import-statement-mean-in-golang
https://golang.org/ref/spec#Import_declarations
https://yushuangqi.com/blog/2016/understanding-golang-import-package.html
https://gocn.vip/question/218


# 2. As return parameters
```golang
_, y, _ := coord(p)  // coord() returns three values; only interested in y coordinate
```

https://golang.org/doc/effective_go.html#blank
https://stackoverflow.com/questions/27764421/what-is-underscore-comma-in-a-go-declaration
arduinoでchip8

#概要

arduinoでchip8やってみる。
romをprogmem化する。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/M/v/a/Mva3.jpg?t=1543458122)

#サンプルコード


```
var out = document.getElementById('out');
out.value = "const char rom[] PROGMEM = {\n";

var memory = new Uint8Array(768);
var PC_START = 0x200;
var fontset = new Uint8Array([0xF0, 0x90, 0x90, 0x90, 0xF0, 0x20, 0x60, 0x20, 0x20, 0x70, 
                                   0xF0, 0x10, 0xF0, 0x80, 0xF0, 0xF0, 0x10, 0xF0, 0x10, 0xF0, 
                                   0x90, 0x90, 0xF0, 0x10, 0x10, 0xF0, 0x80, 0xF0, 0x10, 0xF0, 
                                   0xF0, 0x80, 0xF0, 0x90, 0xF0, 0xF0, 0x10, 0x20, 0x40, 0x40, 
                                   0xF0, 0x90, 0xF0, 0x90, 0xF0, 0xF0, 0x90, 0xF0, 0x10, 0xF0, 
                                   0xF0, 0x90, 0xF0, 0x90, 0x90, 0xE0, 0x90, 0xE0, 0x90, 0xE0, 
                                   0xF0, 0x80, 0x80, 0x80, 0xF0, 0xE0, 0x90, 0x90, 0x90, 0xE0, 
                                   0xF0, 0x80, 0xF0, 0x80, 0xF0, 0xF0, 0x80, 0xF0, 0x80, 0x80]);

for (var i = 0; i < 80; i++) memory[i] = fontset[i];

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://jsrun.it/assets/y/6/t/z/y6tzO', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
    var dv = new DataView(xhr.response);
    for (var i = 0; i < dv.byteLength; i++)
    {
        memory[PC_START + i] = dv.getUint8(i * Uint8Array.BYTES_PER_ELEMENT, false);
    }
    for (i = 0; i < 768; i++)
    {
        out.value += memory[i] + ", ";
    }
    out.value += "}";
}
xhr.send();


         
```

#成果物

http://jsdo.it/ohisama1/Mva3/

以上。
【Java】Mirage-SQLの基本的な使い方

Javaアプリケーションでデータアクセス用のフレームワークとして、Mirage-SQLを使ってみたので、基本的な使い方を紹介します。
※プロジェクト管理ツールはMavenを使っています。

#Mavenの設定

```xml:pom.xml
  <dependency>
    <groupId>jp.sf.amateras.mirage</groupId>
    <artifactId>mirage</artifactId>
    <version>***</version>
  </dependency>
```

リポジトリも追加します。

```xml:pom.xml
  <repository>
    <id>amateras</id>
    <name>amateras</name>
    <url>http://amateras.sourceforge.jp/mvn</url>
  </repository>
```

#DBへの接続設定
クラスパスのルートに`jdbc.properties`ファイルを配置します。

```properties:jdbc.properties
jdbc.driver=ドライバクラス
jdbc.url=URL
jdbc.user=ユーザ名
jdbc.password=パスワード
```

#SQLファイル
クラスパスのルートに`.sql`ファイルを配置します。

```sql:test.sql
SELECT *
FROM staff
 
/*BEGIN*/
WHERE
 
  /*IF username != null */
  staffname = /*staffname*/'testuser'
  /*END*/
 
  /*IF staffstatus != null */
  AND staffstatus = /*status*/1
  /*END*/
 
/*END*/
```

意味ありげなコメントが挟まっています。
このコメント文とコメントの後ろの値がプリペアードステートメント生成時にプレースホルダに置き換わります。

バインド変数がSQLのコメントとして書かれており、その直後にテスト用の値が書かれているので、このSQLをDB管理ツールやコマンドラインでそのまま実行することができます。
これが「2WaySQL」です。

一般的に、アプリケーションからデータベースを操作する場合、SQLを文字列型の変数に格納して実行すると思いますが、Mirage-SQLを使うと、JavaのソースコードからSQLを完全に分離することができるので「実行してみるまでSQLの確認ができない」という状況を回避できます。
SQL文の組み立てを動的に行わないので、SQLインジェクション対策にもなります。

`/*BEGIN*/〜/*END*/`については、構文エラーにならないように調整してくれるもの、と捉えておくとよいと思います。
（詳しくは[githubのwiki](https://github.com/mirage-sql/mirage/wiki/2WaySQL)を参照してください）

#Entityクラス

```java:Staff
import jp.sf.amateras.mirage.annotation.Column;
import jp.sf.amateras.mirage.annotation.Table;

@Table(name = "staff")//クラス名とテーブル名が同じ場合は省略可
public class Staff implements Serializable {
 
  @Column(name = "staffname")//カラム名とフィールド名が同じ場合は省略可
  private String staffname ;
 
  @Column(name = "staffstatus ")
  private int staffstatus ;

  //以下、アクセサメソッド
  public void setStaffname (String staffname) {
    this.staffname= staffname;
  }

  public String getStaffname () {
    return staffname;
  }

  public void setStaffstatus (int staffstatus ) {
    this.staffstatus = staffstatus ;
  }

  public int getStaffstatus () {
    return staffstatus ;
  }

}
```

#データ取得

```java:Main

Session session = SessionFactory.getSession();
SqlManager sqlManager = session.getSqlManager();

session.begin();
try {
	Map<String, Object> params = new HashMap<>();
	params.put("status", 0);
	SqlResource selectUserSql = new ClasspathSqlResource("test.sql");
	List<Staff> results = sqlManager.getResultList(Staff.class, selectUserSql, params);

	for (Staff result : results ) {
		System.out.println(result.getStaffname());
	}
	session.commit();
} catch (Exception ex) {
	session.rollback();
} finally {
	session.release();
}
```
バインド変数に渡す値にMapを使いましたが、バインド変数と同名のフィールドを持つクラスでも大丈夫です。


※本記事は[github](https://github.com/mirage-sql/mirage)を参考にしています。
Herokuにポートフォリをデプロイする

#初めに
Heroku初心者がHerokuでポートフォリオをデプロイ出来ればと思いまして書きます。

メモ的に書きますので、参考になる方がいればと思います。

#Heroku登録
まずはHerokuに[登録](https://signup.heroku.com/)しましょう。

#heroku toolbeltインストール
次に[こちら](https://devcenter.heroku.com/articles/heroku-cli)をインストール
自分の環境にあったものをインストールしましょう。

#アカウント認証
```ターミナル
$ heroku login
Enter your Heroku credentials.
Email: adam@example.com
Password (typing will be hidden):
Authentication successful.
```

EmailとPasswordには先ほど登録したものを入力する。

#Gitリポジトリ
作成しているポートフォリオにGitリポジトリがなければ作成しておきましょう。
Herokuでは、アプリケーションごとにGitを使ってリモートリポジトリへプッシュする必要があるので、リポジトリを作成し、追加、コミットします。

```
$ git init
$ git add 
$ git commit -m "hogehoge"
```

#Herokuにアプリ作成
Herokuに新しいアプリケーションを作成しましょう。

```
$ heroku create
Creating app... done, stack is cedar-14
https://xxxxxxxxxx.herokuapp.com/ | https://git.heroku.com/xxxxxxxxxx.git
```

#ポートフォリオをデプロイ

```
$ git push heroku master
Counting objects: 4, done.

〜 略 〜

remote: Verifying deploy... done.
To https://git.heroku.com/xxxxxxxxxxxxxxx.git
 * [new branch]      master -> master
```


#アプリをブラウザで確認


```
$ heroku open
```

#DBをmigrateやseedを行う場合

```
$ heroku run rails db:migrate
$ heroku run rails db:seed
```
#エラーが出てlogやconsoleを確認したい時

```
$　heroku logs -t
$　heroku run rails console
```
#終わりに
何かしら困っている方に少しでも参考になればと思います。
ITベンチャーが語るエンジニアリング組織論とは

#[【特別対談】 ITベンチャーが語るエンジニアリング組織論とは](https://lob.connpass.com/event/106604/)
11月27日に開催されたこちらのイベントに参加させていただ来ました。
その中で気になったことをまとめました。

##参加の目的
- エンジニアに対するマネジメントは何が正解なのか知りたかった
- 自分は若手でマネジメントされる側ですが
マネジメントする側の視点を取り入れたくて参加しました。



##トークの流れ
1. 初期採用について
2. チーム開発
3. 目標設定と評価設定
4. EM（エンジニアマネージャー）の重要性について


##1. 初期採用について

###何をした？
リファラル採用

###人事は？
スタートの段階ではいなかった
リファラルで人事が入社してきてくれた

###社員の巻き込みは？
社内を２チームに分けてリファラルで入社数で勝負したり
共感してくれる人をリファラルで引っ張る

###初期採用について
初期はいい人材をゲットできるチャンス
VCはエンジニアの獲得を見ている
逆にエンジニア引っ張ってこれない人に魅力がない

###リファラル
ビジネスサイドがエンジニアに遠慮する

####理由
エンジニアが協力的ではないではないかという思い込み

- コードを書く以外もエンジニアの仕事という風土を作る
- リファラル採用のメリットをエンジニアにも持たせる


##２.チーム開発

###ツールは？
・JIRAで管理

###体制は？
・アジャイル開発

###役割分担は？
POを決めて意思決定は全てPOが行う
####理由
- 人数が少ないチームでも職種で意見が別れやすいため

##３、目標設定と評価設定

###目標設定はほんとは無くていい

社長は決済権を行使できるのでいらない
目標設定はお金のためではない

###結果に対して説明しやすくなるための目標設定

目標設定と評価制度が密接になりすぎると目標を下げようとする感情が働く

目標設定と評価が紐づくのは枯れたビジネス
イノベーティブではない

###will can must

**will と mustが結びつく＝ 企業と個人の利害の一致**


###課外活動に対する企業の評価
業界にインパクトを与えるor執筆など＝広報活動の一環として社外にアピールする
課外活動がマイナスにはまずならない、評価しない理由はない

企業の特色によっては社外での発表が問題になる企業もある


##EMの重要性（エンジニアマネージャー）

事業を成功させるためにメンバーを動かせる人

###エキスパートエンジニア
今までできなかったことが自分が作ったものによってできるようになる楽しみ
所属企業に対しての影響力が大きくなっていく感じが楽しい

###マネジメントの魅力、面白さについて
マネジメント、エキスパートそれぞれ面白いが
マネジメントは部下が成長していく楽しみがある
**アーキテクチャ設計と組織設計は同じ**

###なぜマネジメントを目指す人が少ないのか？
エンジニアマネジメントが面白そうに見えないのは
面白く無い人がマネジメントをしているから

###親とマネージャーは違う
マネージャーを人格者だと見るな
あくまで社内の役割分担

##まとめ
- 今回のトークを聞いて改めて自分の組織でのあり方を考えるいい機会になりました
- 企業と自分の利害が一致していると思った内容には積極的に手を上げていこう
- エンジニアとしての課外活動を評価する動きは個人的には嬉しいと感じた
- 上司もあくまで人間であり人に対するフィードバックと行動に対するフィードバックを混同しないようにする
python環境構築について

pythonの環境構築についてよくわからない点があります。
ターミナルでpythonと打ってもanacondaが表示されなくてanacondaを入れる必要があったので、
https://qiita.com/neet-AI/items/54f675dbcc1a0a513882
このページを参考にして一通りの順序に沿ってやってみたのですが
pyenvを入れようとしたところでこう表示されてどのように対処すればいいのか分からず困っています。
どなたか対処法をご存知の方がいらっしゃいましたらご教授ください。
Macは10.13.6です。

Downloading Anaconda3-4.2.0-MacOSX-x86_64.sh...
-> https://repo.continuum.io/archive/Anaconda3-4.2.0-MacOSX-x86_64.sh
Installing Anaconda3-4.2.0-MacOSX-x86_64...

BUILD FAILED (OS X 10.13.6 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/0d/rxhsgkqx36d_y57r1fnys6yw0000gn/T/python-build.20181129092250.89526
Results logged to /var/folders/0d/rxhsgkqx36d_y57r1fnys6yw0000gn/T/python-build.20181129092250.89526.log

Last 10 log lines:
installing: anaconda-4.2.0-np111py35_0 ...
installing: ruamel_yaml-0.11.14-py35_0 ...
installing: conda-4.2.9-py35_0 ...
installing: conda-build-2.0.2-py35_0 ...
Dockerの使い方・概念の備忘録　（作成途中）

##1 前書き
qiita初めての投稿です
dockerを一から勉強する際の備忘録及びマークダウンの書き方の練習を兼ねて残していきます。



##2 コンテナ技術
ホストOS上に論理的なコンテナを作り必要なライブラリやアプリケーションをまとめて一つの塊として扱う技術

######2.1ホスト型サーバー仮想化
[virtualbox](https://www.virtualbox.org/)や[VMware](https://www.vmware.com/jp.html)はメモリやCPUリソースの無駄が大きい（dockerのubuntu等はGUIが付随しない最小限のパッケージ）
ホストOSの上にゲストOSが乗っかる

######2.2ハイパーバイザー型サーバー仮想化
MicrosoftのハイパーV等
ハードウェアを直接制御するのでホスト型よりリソースの効率が良い
![プレゼンテーション1.jpg](https://qiita-image-store.s3.amazonaws.com/0/293578/2e1fe0e9-ff79-8188-28b8-446e8bd677fc.jpeg)


##3　コンテナの構成要素から分かるDockerのメリット
1.インフラの環境設定
2.ライブラリ
3.実行するプログラム本体
4.ミドルウェア
特にdockerのメリットが出るのはインフラの環境設定の部分と持ち運びの容易さ。
ハードウェア・OS・ミドルウェア等が異なるとプログラムは同じようには動かない。dockerとdocker imageさえあれば再現可能（但しホストとコンテナの環境変数を合わせる必要がある場合等はimageからコンテナを作った後も環境構築の必要性があるために絶対じゃない）
dockerとdocker imageだけで実行可能なので持ち運びに便利

#####3.1 学習に使える

Dockerコンテナが簡単に作れるということは簡単に壊せることも意味する
virtual boxでは初心者は設定ファイルをいじったりするのには勇気がいる（わからなくなったら最悪再インストール）
試行錯誤が簡単にできるのでlinuxコマンド等に触れるのに便利

##4　Docker３大機能
**1.Build**
**2.共有**
**3.RUN**

####4.1 Build
インフラの構成情報や実行ファイルを記述したDockerfile（後述）からdocker imageを構築します。  例えばCentOSイメージ　Apacheイメージ　実行ファイル（アプリ)イメージ をひとまとめにしたファイル。
Dockerfileはlinux上での動きを１つずつ順番に記述していくような形になるために作成にはlinuxコマンドの知識が必要です。（もう少し詳しく後述予定）

####4.2 共有
作成したDocker imageはDocker hubで共有・配布することができます。
git　hubと連携することでgithubでDockerfileを管理してDockerhubで自動的にイメージ作成なども可能です。（後述予定）

####4.3 RUN
作成したコンテナの実行です。ターミナル/コマンドプロンプトから簡単に実行・停止が可能です。
コンテナの実行はLinuxカーネルを用いて行われる別々のコンテナでもカーネル自体は一つのものを共有
複数のマシンから分散環境での実行も可能（これは試したことがないです）

##５　Dockerの通信構成とポート

##6 コンテナのライフサイクル

##7　Dockerでよく使うコマンド集 (追加中)
以下のコマンドだけでなくイメージやコンテナの識別子が必要です

| コマンド       | 内容 |よく使うオプション     |備考|
|:-----------------|------------------:|:------------------:|:--------:|
| container run            |コンテナの実行    |bin/bash       |コンテナの作成から実行まで行ってくれる bin/bashでコンテナのシェルを動かして操作できる |
|            ||-d       |サーバーとしてバックグラウンで実行させるのに使う|
| container ls             |稼働中のコンテナの確認 |-a        |-aで停止中含めて全てのコンテナを表示|
| container exec               |稼働しているコンテナで新しいプロセスの実行 |-d   |-dコマンドでバックグラウンドで実行する|
| container commit             |コンテナからのイメージ作成 |-a       |-aで作成者の名前（Author）がつけられる|
| container diff        |コンテナでの操作の変更点を確認 |       |コンテナ内では何をしたか自分でわからなくなることが多い|
flexboxの色々なパターンサンプル

#flexboxに惑う
flexboxで何度もチートシート見てしまうのでよく使うやつをcodepenでまとめたい。


##ヘッダー付き
1つ目の要素を横100%に、他を50%にするサンプル

<p data-height="265" data-theme-id="light" data-slug-hash="LXgKVN" data-default-tab="css,result" data-user="tentatsu" data-pen-title="Flexboxタイトル行付き" class="codepen">See the Pen <a href="https://codepen.io/tentatsu/pen/LXgKVN/">Flexboxタイトル行付き</a> by tentatsu (<a href="https://codepen.io/tentatsu">@tentatsu</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
windows10でsshするまで

windows10での標準機能でlinux触れるようになったというので実際にやってみました。

#機能の有効化
標準ではLinuxのスクリプトはOFFになっていて何もできないのでwindows機能の追加と削除で"Windows Subsystem for Linux"をOnにします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/f16559e8-70eb-8a74-fe50-804851a74659.png)

はじめはこれさえ追加したら実行できるのかと思い、cmdでbashと実行してみましたが、ものの見事にエラー、なにかが足りないと言われました。
そこで調べるとwindowsAppから対応アプリを入れる必要がありとのこと

そこでWindowsAppも導入してみました

#Windows10アプリのインストール
はじめは機能の追加だけでできると思っていましたが、bashと叩いてもエラーがでてしまいました。
調べるとどうやらWindows10アプリのインストールが必要なようです。

アプリストアで"Ubuntu"と検索
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/e13fdb4e-fcb2-c9b1-1897-d35ab7cf88a7.png)
シンプルにUbuntuをインストールしました。

#Linuxにssh
さぁ、これで準備が整いました。それではsshしてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/2bb249df-2eda-e6d1-778f-f2002974dc66.png)

無事できました！

アプリを入れさえすれば、アプリからでもCmdでもどちらからでもアクセスすることができるようです。
MANPのphpMyadminが開けないエラーの対処法（mysqli_real_connect(): (HY000/2002): No such file or directory）

phpMyadminを開こうとしたら
>mysqli_real_connect(): (HY000/2002): No such file or directory

このようなエラーが出てしまった時の対処法
<br>

<br>



MAMP/bin/phpMyadmin/config.inc.phpファイルの

```php:config.inc.php
$cfg['Servers'][$i]['connect_type'] = 'tcp';
```
この部分を

```php:config.inc.php
//$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['connect_type'] = 'socket';
$cfg['Servers'][$i]['socket'] = '/tmp/mysql.sock';
```
に変える。

原因は、「connect_type」が「soket」ではなく、「tcp」になってしまっていたからです。
mecabで25文字超の英字

mecab 0.996です。
25文字を超えると英字が分割されます。
対処方法が知りたいです。

C:>
$ echo aaaaaaaaaaaaaaaaaaaaaaaaa | mecab
aaaaaaaaaaaaaaaaaaaaaaaaa       名詞,固有名詞,組織,*,*,*,*
EOS

>
$ echo aaaaaaaaaaaaaaaaaaaaaaaaaa | mecab
a       名詞,固有名詞,組織,*,*,*,*
aaaaaaaaaaaaaaaaaaaaaaaaa       名詞,一般,*,*,*,*,*
EOS

>
$ echo aaaaaaaaaaaaaaaaaaaaaaaaaaa | mecab
a       名詞,固有名詞,組織,*,*,*,*
a       名詞,一般,*,*,*,*,*
aaaaaaaaaaaaaaaaaaaaaaaaa       名詞,固有名詞,組織,*,*,*,*
EOS
Ruby – 半角スペースも全角スペースも一緒に削除する例

#code

```rb
gsub(/[[:space:]]/, '')
```

#pry

```rb
[2] pry(main)> ' ←半角　←全角'.gsub(/[[:space:]]/, '')
=> "←半角←全角"
```

#ref

- `[\p{Z}\t\r\n\v\f]` と同義っぽい
- `\s` では全角スペースが削除されなかった

[Regexp Tutorial - Character Classes or Character Sets](https://www.regular-expressions.info/charclass.html)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/92938ab8-2f17-ebbf-b1c2-34c0bc487acc.png)

#env

- ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
nuxt.jsでパララックスをするならvue-parallax-jsがお手軽。Cool!

できる限りお手軽なパララックスないかなとVueプラグインを幾つかテスト。
中でも「[vue-parallax-js](https://github.com/jsnanigans/vue-parallax-js)」が導入しやすく軽量なので、常に入れておいても良いかもしれない。

早速、nuxt.jsで使ってみる。

## vue-parallax-jsの導入方法

### npmパッケージをインストール

```terminal
npm i vue-parallax-js --save
```

### pluginファイル作成

```javascript:plugins/vue-parallax-js.js
import Vue from 'vue'
import VueParallaxJs from 'vue-parallax-js'

Vue.use(VueParallaxJs)
```

SSRに対応していないので、plgugin読み込み時に`ssr: false`を追加。

```javascript:nuxt.config.js
module.exports = {
  plugins: [
    { src :'~/plugins/vue-parallax-js', ssr: false },
  ],
  ...
}
```

### 動作テスト

```vue:pages/index.vue
<template lang="pug">
.main
  h1(v-parallax="0.2") parallaxテスト
</template>

<style scoped>
.main {
  width: 100%;
  background-color: #eee;
  margin-top: 100vh;
  margin-bottom: 100vh;
}
</style>
```

### 画像も試してみる

```vue:pages/index.vue
<template lang="pug">
.main
  img(src="~/assets/dummy.png" v-parallax="0.2")
</template>

<style scoped>
.main {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 300px;
  overflow: hidden;
  margin-top: 80vh;
  margin-bottom: 100vh;
}
</style>
```

何この簡単さは…Cool!


## 他も試してみたけど…

 [vue-parallax](https://github.com/vue-comps/vue-parallax)や[vue-parallaxy](https://github.com/apertureless/vue-parallax)も試した見たけど…導入に比較的ハードルがあるので、手軽さにおいて「vue-parallax-js」に軍配が上がりました。

loading周りは魅力だけど、無理して使う必要はないかな。

---

久しぶりにcoffeeScriptのソースを読んだ。なつい。


# Link

以下、公開中のnuxt.js(v2)関連の記事一覧

## 技術よりの記事

0. [nuxt.js(v2)のインストール〜ESLint設定まで](https://qiita.com/amishiro/items/9cd8007d46f91c8b5da2)
0. [nuxt.js(v2)の作業ディレクトリを整理](https://qiita.com/amishiro/items/9c31a3a9424de27efe28)
0. [nuxt.js(v2)のベースURLをターミナルからコントロール](https://qiita.com/amishiro/items/7c7af250368083216d8e)
0. [nuxt.js(v2)でpug/stylusを利用する](https://qiita.com/amishiro/items/38fe1b102d7e91a93ada)
0. [nuxt.js(v2)でIE11対応をする（CSS編）](https://qiita.com/amishiro/items/84b14108c749a0a0c966)
0. [nuxt.js(v2)でIE11対応をする（JS編）](https://qiita.com/amishiro/items/db37c6a56ddf7e214144)
0. [nuxt.js(v2)で絶対パス(https~)を取得する方法](https://qiita.com/amishiro/items/9d7ca6b239f604a40424) 
0. [nuxt.js(v2)でSEOに必要なmeta(OGP)を入れたい](https://qiita.com/amishiro/items/b7260116b282d2cf2756)
0. [nuxt.js(v2)でSEOに必要なmeta(OGP)で入力漏れの事故をなくす](https://qiita.com/amishiro/items/77e3c2546fa63cc69a62)

## よく使うプラグインのお話

0. [nuxt.js(v2)で便利なvue-mqを使ってみるがSSRモードでコンソールエラーがでるので確認してみた。](https://qiita.com/amishiro/items/f2e302fedf03c3d0f79e)
0. [nuxt-linkでスムーズスクロールするならvue-scrolltoが便利で気が利いている…と思う。](https://qiita.com/amishiro/items/f70aca4797cd57bc51b5)
0. [nuxt.jsでパララックスをするならvue-parallax-jsがお手軽。Cool!](https://qiita.com/amishiro/items/ccca406a9bda1863ab01)

## まとめ系

0. [nuxt.js(v2)でgenerate納品する前にやっておきたい設定](https://qiita.com/amishiro/items/11bd642728f6b5838189)
0. [nuxt.jsにおける「components」ディレクトリの規約（案）](https://qiita.com/amishiro/items/c7493f5e9375a0609bdc)
キーボード操作とタッチパッド・マウス操作はどっちも！良いとこ取りをしたい。

- キーボードだけで操作しようとするのは慢心だ
- マウスだけで操作しようとするのは愚かだ
- それぞれに使い勝手というものがある
- 基本的にシステムエンジニアはキーボード操作が大好きだけど、無理だと思ったらさっと離れろ
- 思い込みは危険で、キーボード操作で全部やるんだ！ という気持ちだけで効率を激しく落としているパターンがあると思う
- マウス操作も慣れてくたら美しく手が動いたりするし、そんなに悪いものじゃないよ
- 手足の全てを、爆速と操作の快感のために最大化させていこう








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
XMLでPollerに初期遅延を設定するTips

#### 動作確認環境
- Java 8
- TERASOLUNA Server Framework for Java (5.4.1.RELEASE) 
 - Spring Framwork 4.3.14.RELEASE
 - Spring Integration 4.3.14.RELEASE 

#### XMLでPollerを定義する
Spring Integrationには、`Poller`という定期的に実行する仕組みがありますが、XML(`<int:poller>`)で定義する場合に、`fixed-delay`や`fixed-rate`といった実行間隔を設定できる属性は用意されているのですが、初期値遅延の属性は用意されていません。

以下は4.3.xのxsdファイルの`Poller`に関する記述です。

```xml:spring-integration-4.3.xsd
<xsd:element name="poller">
	<xsd:annotation>
		<xsd:documentation>
			Defines a top-level poller - 'org.springframework.integration.scheduling.PollerMetadata'.
		</xsd:documentation>
	</xsd:annotation>
	<xsd:complexType>
		<xsd:complexContent>
			<xsd:extension base="basePollerType">
				<xsd:attribute name="id" type="xsd:string" />
				<xsd:attribute name="default" type="xsd:boolean" default="false" />
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
</xsd:element>

<xsd:complexType name="basePollerType">
	<xsd:annotation>
		<xsd:documentation>
			Defines the configuration metadata for a poller.
		</xsd:documentation>
	</xsd:annotation>
	<xsd:sequence>
		<!-- 略 -->
	</xsd:sequence>
	<xsd:attribute name="fixed-delay" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>Fixed delay trigger (in milliseconds).</xsd:documentation>
		</xsd:annotation>
	</xsd:attribute>
	<xsd:attribute name="ref" type="xsd:string" use="optional">
		<xsd:annotation>
			<xsd:documentation>
				Allows this poller to reference another instance of a top-level poller.
				[IMPORTANT] - This attribute is only allowed on inner poller definitions.
				Defining this attribute on a top-level poller definition will result in a configuration exception.
			</xsd:documentation>
		</xsd:annotation>
	</xsd:attribute>
	<xsd:attribute name="fixed-rate" type="xsd:string">
		<xsd:annotation>
			<xsd:documentation>Fixed rate trigger (in milliseconds).</xsd:documentation>
		</xsd:annotation>
	</xsd:attribute>
	<!-- 略 -->
</xsd:complexType>
```

そのため、例えばアプリケーション起動後1分経過後、接続に問題ないか定期的に監視メッセージを投げたいという仕様を満たせません。

#### `PeriodicTrigger`で解決

で、調べた結果、なんと2011年にフォーラムで同じような質問をしていた方がいました。

- [initial delay for poller](http://forum.spring.io/forum/spring-projects/integration/106582-initial-delay-for-poller)

その回答によると、`PeriodicTrigger`という定期的に実行するトリガクラスに初期遅延を設定し、`Poller`の`trigger`属性に設定すればよいようです。
というわけで、以下のように`PeriodicTrigger`をビーン定義して`Poller`の`trigger`属性に設定したところ、アプリケーション起動後60秒経過してから60秒間隔で監視メッセージが投げられることを確認できました。

```xml
<!-- 監視メッセージを投げるアダプタ -->
<int:inbound-channel-adapter id="monitoringAdapter"
    auto-startup="true" expression="'monitor'.bytes"
    channel="inboundMonitoringChannel">
    <int:poller trigger="monitoringTrigger" />
</int:inbound-channel-adapter>

<!-- 監視メッセージを投げる間隔 -->
<!-- 初期遅延60秒後に60秒間隔で発火 -->
<bean id="monitoringTrigger" class="org.springframework.scheduling.support.PeriodicTrigger"
    c:period="60" c:timeUnit="SECONDS" p:initialDelay="60" />
```

#### おわりに

- Poller
- Task Executor
- Trigger

の違いがあやふやになってきました:rolling_eyes:。

今回のサンプルコードはGitHubで公開しています（内容は少し変えました:sweat:）。

[neriudon-TriggerSample-](https://github.com/neriudon/triggerSample)
Windowsでショートカットのリンク先のファイルを同じフォルダにコピーするスニペット

![1280px-Bleekman_zimmer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64695/878c0bb8-175a-6444-ef73-453e2282e6be.jpeg)



タイトルどおりのものです。

```powershell
$WScript = New-Object -ComObject WScript.Shell
Get-ChildItem *.lnk | ForEach-Object -Process { 
    $src = $WScript.CreateShortcut($_.FullName).TargetPath;
    $dest = Split-Path $src -leaf;    
    Copy-Item -Path $src -Destination $dest;
}
```

大量の画像ファイルがあって、そのなかからいい画像を見繕ってアルバムを作りたいが、ショートカットで集めたら編集ソフトにドラッグアンドドロップで挿入できないぞ困った！と相談されたので書いたやつです。PowerShellよくわからないのでちょっと悩みました。
BigQueryで2つの配列をzipする方法

こんな感じに非正規化されてデータが格納されているテーブルがあったとします。

| fruit_en                      | furuits_ja             |
|-------------------------------|------------------------|
| ["apple", "pear", "mandarin"] | ["林檎", "梨", "蜜柑"] |

このテーブルを以下のように変換するにはどうしたら、よいでしょうか？

| fruit_en   | furuits_ja |
|------------|------------|
| "apple"    | "林檎"     |
| "pear"     | "梨"       |
| "mandarin" | "蜜柑"     |

# 失敗例: `,` でJOINする

とりあえずのカンで以下のクエリを書きましたが、失敗しました。

```sql
with data as (
  select ["apple", "pear", "mandarin"] as fruit_en, ["林檎", "梨", "蜜柑"] as fruit_ja
)
select fruit_en, fruit_ja from data, unnest(data.fruit_en) as fruit_en, unnest(data.fruit_ja) as fruit_ja
```

**結果**

| fruit_en | fruit_ja |
|----------|----------|
| apple    | 林檎     |
| apple    | 梨       |
| apple    | 蜜柑     |
| pear     | 林檎     |
| pear     | 梨       |
| pear     | 蜜柑     |
| mandarin | 林檎     |
| mandarin | 梨       |
| mandarin | 蜜柑     |

これは `,` によるJOINがCROSS JOINなための挙動です。

# 正解

with offset句を使うことで、配列のINDEXを出力し、その情報を使ってJOINすることによって配列のzipを行います。

```sql
select fruit_en, fruit_ja from 
  (select fruit_en , offset from data, unnest(data.fruit_en) as fruit_en with offset as offset) join
  (select fruit_ja , offset from data, unnest(data.fruit_ja) as fruit_ja with offset as offset)
  using(offset)
```