OmniAICreator/Qiita-1.07M huggingface dataset:
How to get files (objects) from Amazon S3 using s3cmd on CentOS

##Environment
CentOS Linux release 7.3.1611 (Core) 

##Installation

```bash
$ yum insatall s3cmd

$ s3cmd --version
s3cmd version 2.0.1
```

##Configuration

```bash
$ s3cmd
ERROR: /root/.s3cfg: None
ERROR: Configuration file not available.
ERROR: Consider using --configure parameter to create one.
```

```bash
$ s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: xxxxxxxxxxxxxxxxxxxxxxxxxxx # your access key
Secret Key: xxxxxxxxxxxxxxxxxxxxxxxxxxx # your secret key
Default Region [US]: ap-xxxxxxxxx # your region

Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [s3.amazonaws.com]:  # push enter anyway

Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: # push enter anyway

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: # push enter anyway
Path to GPG program [/usr/bin/gpg]: 

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]: # push enter anyway

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name: # push enter anyway

New settings:
  Access Key: xxxxxxxxxxxxxxxxxxxxxxxxx
  Secret Key: xxxxxxxxxxxxxxxxxxxxxxxxx
  Default Region: ap-xxxxxxxxxxx
  S3 Endpoint: s3.amazonaws.com
  DNS-style bucket+hostname:port template for accessing a bucket: %(bucket)s.s3.amazonaws.com
  Encryption password: 
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: True
  HTTP Proxy server name: 
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] y
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Not configured. Never mind.

Save settings? [y/N] y
Configuration saved to '/root/.s3cfg'
```

## How to get

###Show bucket or objects list

```bash
$ s3cmd ls # show bucket list

$ s3cmd ls s3://(bucket_name) # show directory or objects

# handy way to find target object
$ s3cmd ls s3://(bucket_name) | grep "keyword"
```
###get object

```bash
$ s3cmd get s3://(bucket_name)/(object_name)
```

##Refs

[Amazon S3 Tools: S3cmd Usage](https://s3tools.org/usage)
最新バージョンじゃないAndroidStudioをインストールする

こんにちは。私です。
案件によってAndroidStudioの過去バージョンが必要な時ってよくあるよねぇ(海外通販番組風)

そんな時の過去バージョンのダウンロード方法を自分のメモがてら、どなたかの役に立てますよう…。。


#AndroidStudioアーカイブページ

[AndroidStudioアーカイブページ](https://developer.android.com/studio/archive)

枠で囲まれている部分が「**Terms and conditions(規約と条件)**」です。
画面下部のボタン「**I AGREE TO THE TEAMS(同意)**」を押下することでアーカイブページに遷移できます。
(上記リンクから飛ぶことができます！)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217071/34e9e675-0f41-db27-2dad-d019e87b7073.png)


#自分が欲しいバージョンを選択する
たっくさんありますが、自分が欲しい(案件で指定されている)バージョンを選択しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217071/7afe8e45-8d5f-8679-c62e-7ba4e12fb720.png)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

#Installers? or Zip files?
開いたらたくさん英語みたいなのが、出てきましたね…。

macの私は問答無用でInstallersをポチッとな。ですが
Windowsの皆さまには選択肢が与えられました。

InstallersかZip filesか…それが最大の問題だ…
ってそんな大きな話じゃないです。

**Installers**はGUIでぽちぽちしていくと環境が整う。
**Zip files**はソースからビルドしていき環境が整う。

好みや思想はあると思いますが、基本Installersを選択すればハッピーです。
この記事ではInstallersを選択した場合しかご説明できません…。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217071/32680c9c-a42b-83e2-aab6-7085260a211c.png)

#ダウンロード
macの方はXXXX-mac.dmg,Windowsの方はXXXX-windows.zipを選択するとダウンロードが始まります。
その後はインストールできたAndroidStudioをアプリケーションフォルダに移動させたり各指定の場所に置きましょう！




#おしまい

以上でAndroidの指定バージョンのダウンロードが完了しました！
この記事が誰かのお役に立てますように！
ではみなさま！良いAndroidライフを！！
Pythonのスレッドについて理解したのでまとめておく。

## Pythonのスレッドについて理解したのでまとめておく。
<p>
タイトル同じです。自分はまだ未熟なエンジニアで忘備録的な側面もありこの記事を書いています。smtpを用いてメール送信の処理を書いていたのですが、その処理が比較的重く次の処理に映るまでに時間がかかってしまっていました。そこで使ったのがスレッドです。
</p>


<h3>スレッドとは</h3>
<p>スレッドとは２つの意味がありプログラムの処理の実行単位と、もう１つは某巨大掲示板におけるそれぞれのトピックスのことです。もちろん今回は前者です。スレッドが一番威力を発揮するのは,並列処理の際です。並列処理とは,コンピュータのプロセッサで１つのタスクを分割させることで,重い処理をするときに活躍します。</p>

<h3>簡単なスレッドのプログラム</h3>
環境 macOs 
訳あってpython2系ですが,ほとんど3系とコードは変わりません。詳しくはドキュメント等を参照していただきたいです。


```py
import threading

def thread_practice(n):
    for i in range(n):
        print ("thread : " + str(i))
 
if __name__ == '__main__':
    t1 = threading.Thread(target=thread_practice, name="practice", args=(5,))
    t1.start()
    t1.join()
    print ("end")
```
実行結果は
thread : 0
thread : 1
thread : 2
thread : 3
thread : 4
end

のようになります。threading,Threadの引数について軽く説明するとtargetでスレッドで実行する関数を指定し、nameがスレッドの名前空間、argsに実行する関数の引数を書くみたいです。またstart()でスレッドの開始をしています。join()は後ほど説明します。
これだけだと通常のfor文と違いが分かりませんね...


```py
import threading

def thread_practice(n):
    for i in range(n):
        print ("thread : " + str(i))
 
if __name__ == '__main__':
    t2 = threading.Thread(target=thread_practice, name="practice", args=(5,))
    t2.start()
    print ("end")
```

ここで先ほどまであったjoin()を書くのをやめてみましょう。そうすると結果は

thread : 0
end
thread : 1
thread : 2
thread : 3
thread : 4

というようになります。スレッドが終了する前に,endと出力されています。実は先ほどのjoin()はスレッドの終了を待つ操作で、mainのスレッドが実行中のスレッドが終了するのを待っていることが分かります。

<h3>これを使うとできること。</h3>
Webページのお問い合わせフォームなどで,入力されたメールアドレスに自動で返信をする場合などがあると思いますが、比較的メール送信の処理は時間がかかり、ユーザーが数秒間待たないと完了ページにたどり着かないことが多々あります。
そこでメール送信などの重い処理をスレッドに割り振ることで、終了を待たずに次の処理に進めます。いくつかの重い処理をマルチスレッドで並列に処理させるのも良いと思います。
何か間違いなどのご指摘あればお願い致します。

#
Mac に goenv を利用して Go をインストールする

Mac に [goenv](https://github.com/syndbg/goenv) を利用して Go をインストールする手順。

## goenv のインストール
Homebrew でもインストールできるが、 `git clone` でインストールする。手順は [goenv](https://github.com/syndbg/goenv) のドキュメントを参照する。

```shell-session
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
```

`.bash_profile` に下記を追記する。

```sh
# goenv
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
eval "$(goenv init -)"
```

`.bash_profile` を読み込む。

```shell-session
$ source .bash_profile
```

## goenv の使い方

インストール可能なバージョンを確認する。

```shell-session
$ goenv install -l
```

指定のバージョンをインストールする。

```shell-session
$ goenv install 1.10.3
```

指定のバージョンをグローバルで利用する。

```shell-session
$ goenv global 1.10.3
```

指定のバージョンをローカル（そのディレクトリ）で利用する。

```shell-session
$ goenv local 1.10.3
```

マシンにインストールされているバージョンを確認する。

```shell-session
$ goenv versions
```

## dep のインストール

```shell-session
$ go get -u github.com/golang/dep/cmd/dep
```

## goenv を更新する方法

```shell-session
$ cd $(goenv root)
$ git pull
```
mac でdirenv を使用する

- direnv公式
  [direnv - unclutter your .profile](https://direnv.net/)

## direnvの準備
- direnvのインストール
`$ brew install direnv`

- `~/.bashrc`に下記を追記
`eval "$(direnv hook bash)"`
- bashrc再読み込み
`$ source ~/.bashrc`

## direnvを使う
- 使いたいプロジェクトのディレクトリに`.envrc`ファイルを作成する
- `.envrc`に使いたい環境変数を下記のように記述する
`export 環境変数名=値`

- `.envrc`を有効化する
`$ direnv allow .`

- `.gitignore`に追記
`.envrc`

## .direnv例

```
export PGHOST=localhost
export PGDATABASE=railsapp_development
export PGDATABASE_TEST=railsapp_test
export PGUSER=
export PGPASSWORD=
export PGPORT=
export SECRET_KEY_BASE=hogehoge
```
PHP: splatオペレータには整数添字配列のキーを振り直す効果がある

```php
function x(int ...$numbers)
{
    return $numbers;
}

assert(x(...[1, 2, 3]) === [1, 2, 3]);

// 添字配列の添字は消失し、ゼロからの添字に振り直される
assert(x(...[100 => 1, 2, 3]) === [0 => 1, 2, 3]);

try {
    // 連想配列はFatal Errorになる。
    x(...['a' => 1, 'b' => 2, 'c' => 3]);
    assert(false, '例外が発生するから、ここには来ない');
} catch (Error $e) {
    assert('Cannot unpack array with string keys' === $e->getMessage());
}
```
macOS High Sierraにしたらgit出来なくなった場合の対処法

# 環境
- macOS El Capitan -> macOS High Sierra
- PHPStorm 2017.1.5
- Vagrant
- Git version 1.7.1

# 症状
とっても今更ですが、まだ OS が El Capitan だったことに気がついたので「流石にそろそろ…」と思って macOS High Sierra にアップデートしました。

次の日 PHPStorm で、Vagrant とローカルマシンでフォルダ共有しているプロジェクトを開いてみると、見慣れないエラーが。
![スクリーンショット 2018-08-02 11.13.11.png](https://qiita-image-store.s3.amazonaws.com/0/152333/f32cdf60-2157-83e8-bfa5-bce90cfb4299.png)

```
Can't start Git: /usr/bin/git
Probably the path to Git executable is not valid. Fix it.
```

とか出ている。ううむ。

試しにVagrant上の環境で git branch を叩いてみると、問題ありませんでした。
が、ローカルマシン上の PHPStorm 上で master をプルして来ようとしたりすると、以下のようなエラーが出て出来ません。

```
Git Pull Failed: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

ちなみに、ローカルマシンの
/Library/Developer/CommandLineTools/usr/bin/
というディレクトリは見当たりませんでした。

```
$ pwd
/Library/Developer/CommandLineTools/usr
$ ls -la
total 0
drwxr-xr-x  3 root  admin  96  8  1 20:22 .
drwxr-xr-x  3 root  admin  96  8  1 20:22 ..
drwxr-xr-x  3 root  admin  96  8  1 20:22 share
```


# 解決策
こちらを参考に、xcode-select をローカルマシン上にインストールしたら治りました。

参考：Mac OS Sierraにしたらgitコマンド、ターミナル上にエラーが出てしまった。 https://qiita.com/ARTS_papa/items/60ba305b23dc967bba87

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```
叩くと、別窓でアプリケーションのインストールが始まり、10分弱でインストール完了しました。

```
$ pwd
/Library/Developer/CommandLineTools/usr
$ ls -la
total 0
drwxr-xr-x    7 root  admin   224  8  2 11:22 .
drwxr-xr-x    5 root  admin   160  8  2 11:22 ..
drwxr-xr-x  119 root  admin  3808  8  2 11:20 bin
drwxr-xr-x    5 root  admin   160  8  2 11:20 include
drwxr-xr-x   45 root  admin  1440  8  2 11:20 lib
drwxr-xr-x    6 root  admin   192  8  2 11:20 libexec
drwxr-xr-x    8 root  admin   256  8  2 11:22 share
```

増えてる。

これで無事、PHPStorm でプルが出来ました。


# 参考
Mac OS Sierraにしたらgitコマンド、ターミナル上にエラーが出てしまった。 https://qiita.com/ARTS_papa/items/60ba305b23dc967bba87
Mac に rbenv を利用して Ruby をインストールする

Mac に [rbenv](https://github.com/rbenv/rbenv) を利用して Ruby をインストールする手順。

## xcode-select のインストール

```shell-session
$ xcode-select --install
```

## rbenv のインストール
Homebrew でもインストールできるが、 `git clone` でインストールする。手順は [rbenv](https://github.com/rbenv/rbenv) のドキュメントを参照する。

```shell-session
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ cd ~/.rbenv && src/configure && make -C src
```

`.bash_profile` に下記を追記する。

```sh
# rbenv
export RBENV_ROOT="$HOME/.rbenv"
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

`.bash_profile` を読み込む。

```shell-session
$ source .bash_profile
```

`ruby-build` の plugin を入れる。

```shell-session
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
```

## rbenv の使い方

インストール可能なバージョンを確認する。

```shell-session
$ rbenv install -l
```

指定のバージョンをインストールする。

```shell-session
$ rbenv install 2.4.3
$ rbenv rehash
```

指定のバージョンをグローバルで利用する。

```shell-session
$ rbenv global 2.4.3
```

指定のバージョンをローカル（そのディレクトリ）で利用する。

```shell-session
$ rbenv local 2.4.3
```

マシンにインストールされているバージョンを確認する。

```shell-session
$ rbenv versions
```

## rbenv を更新する方法

```shell-session
$ cd $(rbenv root)
$ git pull
```

## ruby-build を更新する方法

```shell-session
$ cd "$(rbenv root)"/plugins/ruby-build
$ git pull
```
Mac に pyenv を利用して Python をインストールする

Mac に [pyenv](https://github.com/pyenv/pyenv) を利用して Python をインストールする手順。

## pyenv のインストール
Homebrew でもインストールできるが、 `git clone` でインストールする。手順は [pyenv](https://github.com/pyenv/pyenv) のドキュメントを参照する。

```shell-session
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

`.bash_profile` に下記を追記する。

```sh
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

`.bash_profile` を読み込む。

```shell-session
$ source .bash_profile
```

## pyenv の使い方

インストール可能なバージョンを確認する。

```shell-session
$ pyenv install --list
```

指定のバージョンをインストールする。

```shell-session
$ pyenv install 3.6.3
$ pyenv rehash
```

指定のバージョンをグローバルで利用する。

```shell-session
$ pyenv global 3.6.3
```

指定のバージョンをローカル（そのディレクトリ）で利用する。

```shell-session
$ pyenv local 3.6.3
```

マシンにインストールされているバージョンを確認する。

```shell-session
$ pyenv versions
```

## pyenv を更新する方法

```shell-session
$ cd $(pyenv root)
$ git pull
```
cocos creatorのスクリプトテンプレートを変更する

スクリプトを作成するたびに毎回コメントを削除するのが億劫になってきました。

以下のパスにあるファイルを編集すればOKです。
やったね。

●Mac
CocosCreator.app / Contens / Resources / static / templete / new-script.js

![スクリーンショット 2018-08-02 11.08.00.png](https://qiita-image-store.s3.amazonaws.com/0/277807/1434033a-9da9-1dd5-3045-ff7940ebd1d4.png)
複数のAndroidをつなげてadb installをする

# はじめに
Android開発で複数端末でのデバッグの際に、adb install ~~.apkでやろうとするとインストール出来なかったので、複数つなげた状態でも出来ないか調べてみた。
自分用のメモみたいな感じなんで簡単にまとめます

# 端末指定オプション

adbのオプションには端末を指定する`-s`があります。
なのでこれを使えば出来ます。

# 何を指定するの？
-s のあとに入れる文字は `adb devices`で出てくる文字列です。
例

```
adb devices
AAAAAA device
```
の`AAAAAA`の部分

# 使用例
`-s` とデバイスのID？が分かればあとは`adb install`に追加するだけ。
`adb -s AAAAAA install ~~.apk`
データベースの Primary Key を Auto Increment ではなく UUID にするメリット

データベースの Primary Key （の少なくとも一部）をアプリケーションが生成した UUID にすると、冪等性のある API を設計しやすい。

例えば、iOS アプリからリソース生成リクエストが重複して行われることはよくある。リトライの仕組みを実装しなくてもボタンの重複タップを UI 側で完全に制御することは難しい。古い端末ではどうしても画面描画は遅くなるので、重複タップを画面描画でコントロールしていると間に合わなかったりする。このリソースにユニークな ID （相当の値）がなければサーバー・データベース側で冪等性を確保することはできない。こういったときに、リクエスト発行元である iOS アプリで生成した UUID をリソースに含めると冪等性は簡単に確保できる。ユニーク制約に従ってエラーになるからである。

上記の例以外でも、マイクロサービス化によってアプリケーションの外側にあるプロキシ（セットアップする開発者は別）から冪等性を前提にしたリトライが行われることもある。こういう考えにたつと、基本的にすべてのリソースで一律に UUID を使うようにするのは、漏れなく冪等性を維持しやすいというメリットがある。

また、そもそも分散環境を前提としたデータベースや将来的にそこへの移行を視野に入れる場合は、 Auto Increment は使えない。例えば Cloud Spanner では PK にインクリメンタルな値を使うことはホットスポットを避けるためとして推奨されていない。UUID が推奨されている。サービス初期は分散環境で動かす必要はないとしても、将来的なスケールを考えると最初から PK を UUID にしてアプリケーションを実装しておいた方が手戻りが少ない。

- [スキーマとデータモデル  |  Cloud Spanner のドキュメント  |  Google Cloud](https://cloud.google.com/spanner/docs/schema-and-data-model)

メモ。個人的には、Auto Increment という値の特性に依存するアプリケーション設計を避けることは可能だと思いつつ、Auto Increment のメリットとの兼ね合いで最終的に考える必要はある。

- [Auto increment keys vs. UUID – Marek Sirkovský – Medium](https://medium.com/@Mareks_082/auto-increment-keys-vs-uuid-a74d81f7476a)
ASP.NET > EntityFrameworkCore > テーブル・ビューを扱う



忘れるのでメモ

V_Feedというビューがあったとすると、以下のように定義する

```csharp
public partial class MarketingmetricsContext : DbContext
{
	public virtual DbSet<V_Feed> V_Feeds { get; set; }
    ...
        
	protected override void OnModelCreating(ModelBuilder modelBuilder)
	{
		...

		modelBuilder.Entity<V_Feed>(entity =>
		{
		    entity.HasKey(e => e.ID); //プライマリキーを設定する
		    entity.ToTable("V_Feed"); //ビュー名とDbSet名が違う時に設定する
		});
	}
}
```



```csharp





```
Mac で画像を変換したり圧縮するコマンドやツール

Mac で画像を変換したり圧縮するコマンドやツール。画像のサイズを減らしたいときに利用する。

## ツール
GUI で画像を圧縮するなら [ImageOptim](https://imageoptim.com/mac) を利用するのが簡単で良い。フォルダごとまとめても圧縮することができる。ただちょっと時間はかかることがある。

## コマンド
コマンドで圧縮する方が早くて、コマンドに慣れている場合には簡単。

### png を圧縮
[pngquant](https://pngquant.org) を利用する。

インストール

```shell-session
$ brew install pngquant
```

よく利用する使い方

```shell-session
# 元の画像を残して別名のファイルに圧縮して保存する
$ pngquant image.png
$ pngquant dir/*.png

# 元の画像を圧縮して上書き保存する
$ pngquant --ext .png --force image.png
$ pngquant --ext .png --force dir/*.png
```

他の詳細なオプションは　[pngquant](https://pngquant.org)　を参照する。

### jpeg を圧縮
[jpegoptim](https://github.com/tjko/jpegoptim) を利用する。

インストール

```shell-session
$ brew install jpegoptim
```

よく利用する使い方

```shell-session
# 元の画像を圧縮して上書き保存する
$ jpegoptim fff.jpeg
$ jpegoptim dir/*.jpeg

# 元の画像を残して別名のファイルに圧縮して保存する
$ jpegoptim --ext .png --force image.png
$ jpegoptim --ext .png --force dir/*.png

# jpeg に含まれているメタ情報を全て削除して圧縮して保存する。
$ jpegoptim -s image.jpeg
```

他の詳細なオプションは

```shell-session
$ jpegoptim --help
```

を参照する。

他にも　Guetzli や Mozjpeg もあるので、それを利用するのも良いかもしれない。

### webp に変換
WebP にフォーマット変換するのが一番サイズが小さくなる場合が多い。

インストール

```shell-session
$ brew install webp
```

よく利用する使い方

```shell-session
$ cwebp image.png -o image.webp
```
[Resolved] (2018-08-02) Gmailのバグ? > ラベル選択ペインが左下に表示 (ラベルアイコンアクセス不可) > Chromeのバグ?

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Google Chrome バージョン: 68.0.3440.84（Official Build） （64 ビット）
```

### Gmailのバグ > ラベル選択ペイン

2018年8月2日現在、Gmailにて「ラベルを付ける」アイコンに関して下記のバグがある。

A. ラベル選択ペインが左下に表示されるようになった
B. ラベル選択後、「ラベルを付ける」アイコンをクリックしても、ラベル選択ペインは表示されない
C. ラベル選択ペインをキャンセルできない (上部の「ラベルを付ける」アイコンにアクセスできないため)

注記: 上記の「ラベル選択ペイン」というのは正式な名前ではない。

<!--
### Gmailバグの連絡先?

Gmailのバグの連絡先は不明だ。

下記の「ヘルプセンターに関するご意見をお送りください」から送信したが、ここではないかもしれない。
https://support.google.com/mail/answer/7074871?hl=ja
-->

### Chromeのバグ?

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Microsoft Edge 42.17134.1.0
```

Edgeでは「ラベルを付ける」アイコンの直下にラベル選択ペインが表示される (正常動作)。
Chromeのバグだろうか。


<!--
### Chromeバグの連絡

ブラウザ右側の縦３つマーク(Google Chromeの設定) > ヘルプ > 問題の報告
(<kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>I</kbd>)
からバグ報告しておいた。
-->

### 追加ラベル選択バグ > 対処
(追記: 2018/08/07)

> B. ラベル選択後、「ラベルを付ける」アイコンをクリックしても、ラベル選択ペインは表示されない

上記のバグに対してはブラウザリロードをすることで対処する。

### 連絡先

- [(2018-08-07) 連絡先 > Gmailのバグ、Chromeのバグ](https://qiita.com/7of9/items/c10213c2f2387aa00845)

### 当面の対処 > 以前のGmailに戻す
(追記 2018/08/21)

Gmailのラベルバグはしばらく修正の様子がみられない。

「以前のGmailに戻す」を選択することで、以前のGmailのUIに戻すことができる。
「以前のGamil」のUIにおいてはラベルの不具合は見られないようだ。

「以前のGmail」のUIは変更後一週間で現在のUIに戻されるようだ。
その時に再度「以前のGmailに戻す」を選択するといいのだろうか。

### 解決?
(2018-09-17追記)

下記の環境でラベルバグは見られなくなっている。

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
Google Chrome バージョン: バージョン: 69.0.3497.92（Official Build） （64 ビット）
```

Gmail側で対処してのか、Chromeの対処なのかは不明。
PHP7からは引数デフォルト値にはNull合体演算子｢??｣を使うと良い

PHP7からは引数のデフォルト値は、次のように作り込むことで、`null`が渡されたらデフォルト値を使う関数を実装することができる。

* 引数の型宣言はnullableにする
* 関数シグネチャの引数デフォルト値は`null`にする
* 本当のデフォルト値はNULL合体演算子`??`で表現する

たとえば次のように:

```php
// 四角形の大きさを返す関数
function rect(?int $width = null, ?int $height = null): array
{
        return [$width ?? 10, $height ?? 10];
}

// 2つの引数どちらもデフォルト値を使う
assert(rect() === [10, 10]);
assert(rect(null, null) === [10, 10]);

// 2つの引数どちらも与える
assert(rect(20, 30) === [20, 30]);

// 1つ目の引数はデフォルト値を使う
assert(rect(null, 30) === [10, 30]);
```

## なぜ関数のシグネチャにデフォルト値がだめか

PHPでは慣習として引数に`null`渡すことは、デフォルト値を使うという意味になるが、型宣言をしているとFatalエラーが発生するため、関数のシグネチャにデフォルト値を持つことができない。

```php
function rect(int $width = 10, int $height = 10): array
{
        return [$width, $height];
}

// 2つの引数どちらもデフォルト値を使う
assert(rect() === [10, 10]);
assert(rect(null, null) === [10, 10]); // Fatal error: Uncaught TypeError: Argument 1 passed to rect() must be of the type integer, null given

// 2つの引数どちらも与える
assert(rect(20, 30) === [20, 30]);

// 1つ目の引数はデフォルト値を使う
assert(rect(null, 30) === [10, 30]); // Fatal error: Uncaught TypeError: Argument 1 passed to rect() must be of the type integer, null given
```

引数の型宣言をnullableにすることでFatalは発生しなくなるが、今度は関数シグネチャのデフォルト値が使われなくなる。

```php
function rect(?int $width = 10, ?int $height = 10): array
{
        return [$width, $height];
}

// 2つの引数どちらもデフォルト値を使う
assert(rect() === [10, 10]);
assert(rect(null, null) === [10, 10]); // Fail: actual = [null, null]

// 2つの引数どちらも与える
assert(rect(20, 30) === [20, 30]);

// 1つ目の引数はデフォルト値を使う
assert(rect(null, 30) === [10, 30]); // Fail: actual = [null, 30]
```

これはPHP7だからというわけではなく、PHP7以前からある仕様だ。PHP7でnull合体演算子が登場するまでは`if`や三項演算子で対処していた。それが今は書きやすくなっているというだけだ。

```php
function rect($width = null, $height = null): array
{
        return [$width ? $width : 10, $height ? $height : 10];
}

// 2つの引数どちらもデフォルト値を使う
assert(rect() === [10, 10]);
assert(rect(null, null) === [10, 10]);

// 2つの引数どちらも与える
assert(rect(20, 30) === [20, 30]);

// 1つ目の引数はデフォルト値を使う
assert(rect(null, 30) === [10, 30]);
```

## 所感

<blockquote class="twitter-tweet" data-cards="hidden" data-lang="ja"><p lang="ja" dir="ltr">nullableな型宣言の引数だったら、nullを渡しときはデフォルト値を使ってくれればいいのに、かゆいところに手が届かない感がありますね。 <a href="https://twitter.com/hashtag/PHP?src=hash&amp;ref_src=twsrc%5Etfw">#PHP</a><a href="https://t.co/UAd66lTeky">https://t.co/UAd66lTeky</a></p>&mdash; ❄️suin (@suin) <a href="https://twitter.com/suin/status/1024831360265940992?ref_src=twsrc%5Etfw">2018年8月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【AWS】lambdaファンクションを定期的に実行する

# なぜ

lambda はアクセスの際にロード、展開された後に実行される(Cold Start)ため初回実行が遅くなります。これを回避したい場合の策です。
Cronで行っても良いのですが、そのためにサーバを立てたくないので、定期実行もlambdaで行います。

他にもlambdaの自動実行がしたい場合は同様の手順で可能です。

## 前提

今回lambdaの関数はPythonで作成し、APIGatewayをrequestで叩くものとします。

## 手順
  - lambdaアップロード用zipの準備
    - 作業用フォルダにモジュールの配置
    - ソース作成
    - zip
  - アップロード
  - テスト
  - 定期実行の設定
    - cloudwatch eventの追加
    - 設定

### lambdaアップロード用zipの準備
##### 作業用フォルダに移動

  $ cd path/to/work

##### モジュールを配置（インストール）

```
$ pip install requests -t ./
```


##### ソースの作成

```python:lambda_function.py
import requests

def lambda_handler(event, context):
    #
    r = requests.get("https://absc1234ef.execute-api.ap-northeast-1.amazonaws.com/api/apiname")
    return r.text
```

##### モジュールをlambdaに登録する必要があるのでローカルに準備しzipで固める。

```$ zip -r upload.zip *```

### アップロード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192151/1f7d059e-f5db-b26c-5a88-26e7c6c136b7.png)


### テスト


テストボタンを押して、想定したレスポンスが帰ってくればOK。


### 定期実行の設定

##### cloudwatch eventの追加

トリガーにCloudWatch Eventsを追加します



![add_trigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192151/212c9e6c-74fc-af29-cec7-20ce0480a53f.png)

![select_EventBridge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192151/9e17d08f-65d9-c89b-1eed-cddb01fd35b1.png)


##### 設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192151/f5984a1c-5be7-eaaa-7d14-64fe12ea4254.png)
reactで任意の回数分タグを生成してみる。

## 今回やりたかったこと
reactで任意の回数分タグを生成したかった。

## コード

```.jsx
import React from 'react';

class sample extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 4,
    };
  }

  render() {
    const arr = [];
    for (let i = 0; i < this.state.count; i += 1) {
      arr.push(<div key={i}>{i}</div>);
    }

    return (
      <div>
        {arr}
      </div>
    );
  }
}

export default sample;
```

## 解説
上記の例だとstateに数値4を持たせているが、ここは作るものにもよるがpropsから受け取った方が良さげ。

まず、stateに回したい回数分の数値を持たせる。

render内で
定数arrを作り、空の配列を用意しておく。

for分でstate.countの数値分回し、定数arrにpushしていく。(配列の末尾に追加していく)

あとはreturnの中で任意の場所に
定数arrを置いといてあげればreact側でいい感じにしてくれるみたいなので
そのままタグが回数分生成される。
WindowsにUbuntuをインストールするのは気持ち良いゾイ!!~開発環境編~

## 前の記事
[WindowsにUbuntuをインストールするのは気持ち良いゾイ!!~端末編~](https://qiita.com/kaitaku/items/262c249a0343c1325649)

## Docker
コンテナを使える便利なシステム。
早くて軽いとか最高かよ!!
さてさて、導入してきますか

```
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable test edge"
sudo apt update
sudo apt install docker-ce
```

参考というか、もはや引用資料
[Ubuntu 18.04にDockerをインストールする](https://qiita.com/myyasuda/items/cb8e076f4dba5c41afbc)

実際、これで導入はできたんだよね。

```
$ docker --version
Docker version 18.06.0-ce, build 0ffa825
```

…まぁ、動かなかったけど。

```
$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
```

というか、よく振り返ってみたら、権限の問題だよね。
`sudo`つけたら何事もなかったかのように動いたし。

```
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              2cb0d9787c4d        3 weeks ago         1.85kB

```

じゃあ、一般ユーザーでできるようにすれば良いのか。

### Dockerグループへユーザーの追加。
前提として、Dockerを操作できるユーザーのグループがあるみたい。
勿論、管理者はそこにいるけど、今のユーザーはいないから追加しないとね。

```
sudo groupadd docker
sudo usermod -aG docker $USER
```
参考資料
[Ubuntu16.04 に Docker をインストールする手順の解説とアンインストールまで。2017年版](http://tracpath.com/works/devops/2017-docker-install/)


あとは再起動すれば大丈夫。
自分も大丈夫だったし。

### docker-compose
まぁ、dockerだけじゃなくてこれも入れたいんですよね。
これがないとコンテナサービス動かせないし。

```
$ sudo -i
$ curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ exit
$ docker-compose -v
```

うん、できたできた。

## GCP
Goocle Cloud Platform
サーバーとか色々貸してくれるクラウドサービス。
一年間は無料で使えるし、使わない理由がないよね。
インストールしーよ。
1. [Cloud SDK のインストール](https://cloud.google.com/sdk/downloads#versioned)からOSにあった`gz`,`zip`ファイルをインストールする
2. 解答
3. OSごとにインストールスクリウトを実行
4. ./google-cloud-sdk/bin/gcloud init

上のが終わったら、`$ gcloud init`で自分のgoogleアカウントを登録したり、会社が使っているプロジェクトを選択したりする。
内容は`$ gcloud config list`で確認

まぁ、これだけあれば、あとは各自自由に設定してもらえれば、個人のサービスは作れるんじゃないかな?
Androidでのログ出力

## やりたいこと
リリース時にログを出さないようにしたい。
Androidアプリ作成時、ログのUtilクラスを毎回作っていたため、
いつでもコピペで使えるようにメモ。

BuiltTypeでログのON/OFFを切り替えるため、gradleに一度書けばビルド時に自動で切り替わります。

```LogUtil.kt
import android.util.Log

class LogUtil
{
    companion object {
        val logFlag = BuildConfig.LOGGING //gradleに記載

        //Verbose
        fun verbose (TAG: String, msg: String) {
            if (logFlag) { Log.v(TAG, msg) }
        }
        fun verbose (TAG: String, msg: String, tr: Throwable) {
            if (logFlag) { Log.v(TAG, msg, tr) }
        }

        //Debug
        fun debug (TAG: String, msg: String) {
            if (logFlag) {  Log.d(TAG, msg) }
        }
        fun debug (TAG: String, msg: String, tr: Throwable){
            if (logFlag) { Log.d(TAG, msg, tr) }
        }

        //Info
        fun info (TAG: String, msg: String) {
            if (logFlag) { Log.i(TAG, msg) }
        }
        fun info (TAG: String, msg: String, tr: Throwable) {
            if (logFlag) { Log.i(TAG, msg, tr) }
        }

        //Warning
        fun warning (TAG: String, msg: String) {
            if (logFlag) { Log.w(TAG, msg) }
        }
        fun warning (TAG: String, msg: String, tr: Throwable) {
            if (logFlag) { Log.w(TAG, msg, tr) }
        }

        //error
        fun error (TAG: String, msg: String) {
            if (logFlag) { Log.e(TAG, msg) }
        }
        fun error (TAG: String, msg: String, tr: Throwable) {
            if (logFlag) { Log.e(TAG, msg, tr) }
        }
    }
}
```
```build.gradle
    buildTypes {
        debug {
            buildConfigField 'boolean', 'LOGGING', 'true'
        }
        release {
            buildConfigField 'boolean', 'LOGGING', 'false'
        }
    }
```

## ログレベルの使い分けに悩んだら
ログレベルの使い分けで迷った時の参考サイト
とても丁寧に解説されています。
https://kokufu.blogspot.com/2014/02/android_1.html
[ PHP ]  PHPビルトイン webサーバ

#PHPビルトインについて

会社でPHPビルトインを使用することがあったので、調べてみました :pencil2:

- PHP５.4以降から「ビルトインウェブサーバ」というものが追加されている
- PHPとデータベースさえインストールしてあれば、PHPファイルを動かすことができる
- 簡易的なので、実運用では使用できない（ローカルでの使用）
- 複数同時に起動はできない
- Apacheではないので、　.htaccessは使用できない（「ルータースクリプト」が用意されている）

#使用方法

コマンド上で、実行したいファイルに移動し以下のコマンドをたたく

```
cd path

$ php -S localhost:8000
```

- php -S localhost:8000 （数字は任意）
- ブラウザでhttp://localhost:8000/ にアクセスすると、index.phpが表示される
AWS Mobile Hub と awsmobile-cli と aws-amplify-js を使ってみての所感

一週間くらい触ってみての所感なので、勘違いや間違いがあるかも知れません。つっこみ歓迎です。

## TL;DR
- [aws-amplify-js](https://github.com/aws-amplify/amplify-js) は便利なので頑張って発展していって欲しい
- [AWS Mobile Hub](https://aws.amazon.com/jp/mobile/) と [awsmobile-cli](https://github.com/aws/awsmobile-cli) は短期的なサービスをぱぱぱっと作るときにはとても便利だが、ある程度の期間継続して開発していく予定がある場合は導入すべきか少し慎重になった方がいいかも知れない。

## 各サービス・ライブラリの大雑把な説明

### AWS Mobile Hub

Mobile Hub はいくつかの AWS サービスをひとまとめにして使えるようにするメタサービスの一つで、AWS における MBaaS 的な位置づけ[^1]。具体的には Mobile Hub を使うと:

[^1]: Amazon は伝統的に XaaS という単語を使わないので公式には MBaaS とは説明されていない。

- S3 + CloudFront を使った本番環境構築
- Cognito の設定
- API Gateway + Lambda の環境構築
- Device Farm を使った E2E テスト環境構築

みたいなことを自動でやってくれる。

### awsmobile-cli

awsmobile-cli は Mobile Hub に特化した aws-cli のようなもの。 public ディレクトリ以下に吐き出された Web アプリ（HTML+JS+CSS）を Mobile Hub で用意したデプロイ環境にデプロイしたり、 Mobile Hub プロジェクトに新しいサービスを有効にしたりできる。

aws-amplify-js 用の設定ファイルを生成する機能がある。

### aws-amplify-js

aws-amplify-js はこれまで個々の AWS サービスごとに散らばっていた JS SDK を統合して使いやすくするライブラリ。 AWS Mobile Hub や awsmobile-cli とは独立して使うことができる。

## 所感
- AWS Mobile Hub
    - 詳しいことが分からなくてもそれっぽく各種サービスを設定できるのは便利。
    - 困ったときには個別のサービスを直接触ればどうとでもなるのは安心感があるかも知れないが、その結果 Mobile Hub が壊れるのではないか？という不安感が拭えない。
    - Mobile Hub が対応していない AWS サービスとの統合をどうするのか。
- awsmobile-cli
    - aws-amplify-js 用の設定ファイルを自動生成してくれるのは便利。
    - cli から簡単にデプロイできるのも初動としては便利。
    - ただ、複数人で開発する場合、どこかで誰かがデプロイするのではなく、 CodePipeline とか使って明示的にデプロイして欲しい気がする。
- aws-amplify-js
    - AWS の JS SDK はこれまでサービスごとに別々で、かつそれら組み合わせて使う方法の説明が不十分でお世辞にも体験がいいとは言えない感じだった（Cognito で認証したあと、どうやって他の AWS サービスにリクエストすればいいのか不明だったり）が、 aws-amplify-js はそこらへんがすべてライブラリの中で完結しているので使いやすい。
    - 一つの巨大な npm パッケージではなく、 `@aws-amplify/xxx` というサブパッケージをまとめたものとして提供されているので、 bundle サイズが気になる場合は個別のパッケージを直接 import することで対処ができるのも嬉しい。
画像のサンプルサービス色々

サンプル画像のサービスのまとめ

- ベーシックな画像
  - https://placeholder.com/
  - https://placehold.jp/
  - https://dummyimage.com/

- 動物
  - ネコ : https://placekitten.com/
  - クマ : https://placebear.com/
Wayback Machine を使ってリンク切れした古いバージョンのモジュール・ライブラリをダウンロードする

どうしてもという時に、こういう方法もあるよという話。

[Internet Archive: Wayback Machine](https://archive.org/web/) はWebページのアーカイブサービス。
圧縮ファイルなどもアーカイブしているようだ。

## ホップ

リンク切れしたURLを入力する

![image](https://user-images.githubusercontent.com/13635059/43556026-967db514-9638-11e8-8e92-d6d563b923b6.png)


## ステップ

見つけた

![image](https://user-images.githubusercontent.com/13635059/43555312-6bdbadba-9634-11e8-950b-b6ed87eefff4.png)

## ジャンプ

ダウンロード！

## 危なくない？

公平なアーカイブサービスだから危険度が高いとは思わないが、扱いはお任せする。

ちなみに僕はダウンロードまで進みこそすれ、実際に利用したことはない。

## Gist

- [The Case of using "Wayback Machine" when old version modules or libraries not found , deadlinked, and also not found in Google caches](https://gist.github.com/YumaInaura/88119d4faf57c290ff49d6132624e5a8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Golang でテンプレートリテラルの利用（文字列中の変数展開）について #golang


# 概要
会社でマークダウン形式の文字列を出力する簡単なツールを Golang を使って書いてたんですが、
出力する文字のテンプレートを文字列リテラル（`：バッククォート）を利用していたところバッククォートのエスケープができないことに気づきました。。。

よくよく仕様を読んでみるとそれはそーかって思うんですが、どうやって書くとソースコード的に見やすくなるかなって思って色々試してみました。

でも JS とかのテンプレートリテラルみたいに気軽に書きたい！！！

```
var a = "hoge";
console.log(`${a} fuga`);
```

ざっと考え付く限り4パターン浮かんだので、書いて見ました。
1. fmt.Sprintf の利用
2. strings.Replace の利用
3. バッククォート部分のみ文字列として結合
4. 文字列リテラルを利用しない（文字リテラルを利用）

## サンプルコード

```golang:main.go
package main

import (
	"fmt"
	"strings"
)

func main() {
	p1 := `■ fmt.Sprintf を利用
%s:nonum
a. ああああああ
b. いいいいいい
c. うううううう
%s
`
	p1 = fmt.Sprintf(p1, "```", "```")
	println(p1)

	p2 := `■ strings.Replace を利用
#code_block#:nonum
a. ああああああ
b. いいいいいい
c. うううううう
#code_block#
`
	p2 = strings.Replace(p2, "#code_block#", "```", 2)
	println(p2)

	p3 := `■ バッククォート部分のみ文字列として結合
` + "```" + `:nonum
a. ああああああ
b. いいいいいい
c. うううううう
` + "```"
	println(p3)

	p4 := "■ 文字列リテラルを利用しない（文字リテラルを利用）\n"
	p4 += "```:nonum\n"
	p4 += "a. ああああああ\n"
	p4 += "b. いいいいいい\n"
	p4 += "c. うううううう\n"
	p4 += "```\n"
	println(p4)
}

```

# まとめ
なんかどれもイマイチな気がしました。。。
ちゃんとテンプレートにするなら別ファイルとかにした方が綺麗な気がしますが、気軽に見やすく作りたかったのでちょっと考えて見ました。
perlワンライナーで正規表現を使って欲しいとこだけ抜き出す



例えばこんな感じのVagrantfileからフォワードしているhost側のポートを抜き出したいとする

```shell
$ cat Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.vm.hostname = "centos7"
  config.vm.network "forwarded_port", host: 8080, guest: 80, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", host: 18080, guest: 18080, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", host: 10443, guest: 443, host_ip: "127.0.0.1"
  config.vm.network "private_network", ip: "192.168.33.12"
  config.vm.synced_folder ".", "/vagrant", type: "virtualbox", mount_options: ['dmode=777','fmode=744']
  config.vm.provider "virtualbox" do |vb|
    vb.name = "centos7"
    vb.cpus = 2
    vb.memory = 2048
  end
end
```

# 抜き出し

```shell
$ cat Vagrantfile | perl -nle 'print $1 if /host: (\d+)/'
8080
18080
10443
```

行ごと表示したければprintの後の`$1`を消すだけで良い

```shell
$ cat Vagrantfile | perl -nle 'print if /host: (\d+)/'
  config.vm.network "forwarded_port", host: 8080, guest: 80, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", host: 18080, guest: 18080, host_ip: "127.0.0.1"
  config.vm.network "forwarded_port", host: 10443, guest: 443, host_ip: "127.0.0.1"
```
エンジニア1年間で学んだ生涯忘れてはいけない事

## 何のためにこの記事を書くか？
なにも知識がない状態からスタートした一年間で多くの事を学んだ。
その中でも自分がずっと心がけるべきであり、忘れてはいけない事をまとめるべきだと思った。
私の学びが他の人の学びにもつながってもらえたら嬉しく思う。

## 学んだことリスト
### ・なんのため？と常に自分に問いかけること
何かタスクをこなしているうちに、
何のためにやっているのか、誰のためにやっているのか
**目的を見失う**ことがある。
それを防ぐために常に**「なんのため？」**と自分に問いかける必要があると感じだ。

例えば私の場合は、テストが嫌いなので早く終わらせるようにテストケースを最小限にしようとしていた。
テストは**なんのために？**と振り返れば、すぐに品質保証のためとわかった。
自分に問いかける時間を作る事で、本来あるべき姿にもどる事が出来ることを学んだ。

未来の自分への質問
朝の短い会議、見積もり、コミュニケーションは**なんのために**しているのか？

### ・問題の定義は毎回疑う
何かタスクを実施する際に**「言われた問題定義から」**スタートすることが多い。
この問題定義は、原因や解決策など、他の何よりも重要。
**スタート地点の問題定義が間違っていては、解決策を講じても意味がない。**
なので常に「与えられた問題定義」や「自分で定義した問題定義」は疑うこと

### ・仮説や方針のない調査をしない
わからないことを調査しているうちに、ただネットサーフィンをしているだけになる事が多々ある。
これは、知りたいことがわからないor曖昧な状態にも関わらず調べているからだと思う。
しっかり、ある問題に対して切り分けて調査していれば、このようなことは起きない。
なので、**問題に対しては、仮説や、調査方針を立ててから調査に取り組むべきだ。**


### ・メモをとること
人間は忘れる生き物だから、振り返りをするときには、すでに大半の事は忘れている。
それではちゃんとした振り返りもできないし、自分の学びにもつながりにくい。
毎日自分のしたことや、学んだこと、わからなかったこと、実施したことを
メモしていくことで解消される。

### ・アウトプットをすること
私はインプットが好きで、社会人の一年目はインプットのみにこだわっていた。
大量にインプットしたにも関わらずあまりできなかった。
**アウトプットするためのインプットをしていなかったことが原因だ。**
まさに、「百聞は一見にしかず」　＝　「百インプットは一アウトプットにしかず」

ちなみに、こういった投稿も自分への学びになるので若手エンジニアは積極的にやるべき。
書いたことが間違っていても構わない。それで学びがある。

### 分からないことを有耶無耶にしない
単純に永遠にわからないままになる
先輩エンジニアを見ていて、今の自分と同じ初歩的なことがわかっていなかったりする。
ただ経験値が多い分、そこでカバーできる感はあるが、私はこんな先輩になりたくない。

### ・1度指摘されたレビュー観点などはまとめておく
私はドキュメント作成が本当に嫌いだし、得意ではない。
レビューしてもらっても同じことを指摘されることも多々ある。
一度指摘されたことは、自分のチェックリストとして持っておくべきだ。
**ドキュメント一つとっても仕事である以上、品質は保証するべきで、評価にも直結する。**

### ・共有を欠かさない
チームで仕事をしていても、やはり小さなグループは出来る。
そのグループの中でナレッジを閉ざすことは、チームの生産性を向上させない。
**チームでやる以上、優先すべきはチームの生産力向上。**
なのでこんな問題をこう解決した。などチャットでもいいので共有はするべき。

### ・空気を読まない
会議はどんどん進んでいく中で、新米だと多くの疑問が出てきても空気を読んで黙っている事がある。
こんなことわかってないと思われたら恥ずかしいと私は感じる。
これを無理してでも一歩踏み出して発言することで、自分の学びにもなるし、
**他の同じ疑問を持っていた空気読める軍団の助けにもなる。**
案外みんなわかってなかったり、考慮していないことがよくあるものだと気付いた。

### ・責任感をもつ
先輩が横にいて一緒にやった半年と、いなくなった半年を比較すると、
飛躍的に**いなくなった年**の方が伸びた。
これは責任感の違いだと思う。
先輩に聞けば最悪解決できる。
こんな気持ちはすぐに捨てるべきであり、自分のタスク以外にも責任をもってこなす心がけが必要。
他の人がタスクが終わらなかった時、他人事のように陰で見ていたり、自分じゃなくてよかったと
思う時点で三流。

## まとめ
振り返ってアウトプットしてみると、どんどん大事なことが出て来たし、
頭の中がクリアになった。
毎年全体の振り返りは設けていくようにしていきたい。
SASSのSCSS記法を触ってみた

## TL;DR
次の記事(2017年)をもとにSASSを触ってみました。
[これからはcssはSassで書こう。](https://qiita.com/m0nch1/items/b01c966dd2273e3f6abe)

## 前提[^1]

- OS: macOS High Sierra 10.13.6
- Docker 18.06.0-ce (client, serverともに)

## 動作環境
手軽にrubyの環境を用意できるため、Dockerを利用[^2]
sassは3.5.7がインストールされた。

Dockerfile

```
FROM ruby:2.5.1

RUN gem install sass
```

```docker-compose.yml
version: '2'
services:
  scss:
    build: .
    volumes:
      - .:/var/www/scss
    stdin_open: true
    tty: true
```

動作させるには

- `docker-compose up -d`
- `docker exec -it <フォルダ名>_scss_1 bash`

## SCSS記法でCSSを作ってみる

上記記事を参考に、変数・演算・関数・`@extend`(スタイルの継承)を試す

```test.scss
$bg_color: lightgreen;
$strong_em: 2em;

@function Double($value) {
  @return round($value * 2);
}

div{
  background-color: $bg_color;
  margin: 0 auto;
  p{
    padding: 0 0 0 10px;
    span{
      font-size: Double($strong_em);
    }
  }
}

.btn{
  padding: 10px 20px;
  border: 2px solid blue;
  border-radius: 3px;
  background-color: lightgray;
}

.btn-submit{
  @extend .btn;
  background-color: lightblue;
  font-size: 1.5em;
}
```

CSSの作成コマンドは以下。[^3]
`sass test.scss:test.css -style expanded`

```test.css
div {
  background-color: lightgreen;
  margin: 0 auto; }
div p {
  padding: 0 0 0 10px; }
div p span {
  font-size: 4em; }

.btn, .btn-submit {
  padding: 10px 20px;
  border: 2px solid blue;
  border-radius: 3px;
  background-color: lightgray; }

.btn-submit {
  background-color: lightblue;
  font-size: 1.5em; }

/*# sourceMappingURL=test.css.map */
```

HTMLに当ててみる。

```test.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>SASSのテスト</title>
  <link rel="stylesheet" href="test.css">
</head>
<body>
  <div>
    div要素です。
    <p>
      div要素の中のp要素です。
      <span>span要素です</span>
      div要素の中のp要素です。
    </p>
    div要素です。
  </div>
  <input type="submit" class="btn">
  <input type="submit" class="btn-submit">
</body>
</html>
```

![scss触ってみた_20180801.png](https://qiita-image-store.s3.amazonaws.com/0/82132/65030f52-2692-5fd6-3bca-66ba9e43fd11.png)

## 終わりに

* フロントエンドの経験が全然少ない身の感想ですが、関数や継承が使えてなかなかいい感触。ドキュメントなど確認していきたい。
* 今回CSSファイルができたので、以下のエラーは追っていない。宿題事項

>error No such file or directory @ rb_sysopen - expanded

* 最近rails開発でbundle installすると2019年3月でsassがdeprecatedと表示されるので、この機に対応もチェックする。(以下抜粋して引用)

>Ruby Sass is deprecated and will be unmaintained as of 26 March 2019.
>* If you use Sass as a plug-in for a Ruby web framework, we recommend using the
  sassc gem: https://github.com/sass/sassc-ruby#readme

## 脚注

[^1]: バージョンは後ほど追記します。→追記しました
[^2]: docker-compose.ymlですが、Dockerfileでdebuggerを使うためのgemを入れていないため、`stdin_open`と`tty`の設定は不要だったと気づきました。
[^3]: 参考：[「Sassチートシート」コマンド](https://qiita.com/morrr/items/36ab58bae25891331e39#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
numpy v1.15.0とtensorflow v1.9.0ではRuntime Warningが出る

事の経緯
---

今日、ipythonで以下のようなことになった。

``` python3
In [2]: import keras
Using TensorFlow backend.
/home/zero/.anyenv/envs/pyenv/versions/3.6.6/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88
  return f(*args, **kwds)
/home/zero/.anyenv/envs/pyenv/versions/3.6.6/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88
  return f(*args, **kwds)

```

これを解決する方法のメモ

こうやって解決します
---

numpy v1.15.0とtensorflow v1.19.0の互換性問題(そのうちtensorflowのほうがupdateされると思います)
そのため、numpyのバージョンを1.14.4に下げる

``` sh
pip install numpy==1.14.4
```

結果
---

``` python
In [1]: import keras
Using TensorFlow backend.

In [2]: 
```

うまく行きました。
QiitaのUI—シンタックスハイライト選択時の挙動を改善してほしい要望

Qiitaのシンタックスハイライト選択、薄々使いにくいなと思っていたのだけど、改めてまとめたらその理由が具体的に分かった。

## 第一話. 「無情なニューライン」

僕の場合、最初にコードブロックを書いてから

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/594d6a95-5cc3-fe27-2309-e08559687b7f.png)

次に中身を書くことが多い

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d74b2ff7-acd9-5ca6-88d5-0954ab536cf0.png)

だが、シンタックスハイライトを選ぼうと思ってエンターを押すと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/54b8b0db-cec1-ba56-33e3-0fa000c7b796.png)

改行されてしまう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7bb8ba35-6667-777f-3c3a-b3dcdcf6072e.png)

なのでその後に改行を削っている

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/3e5b2407-3ead-ae0d-6f77-8cbf3ed49f9a.png)


## 第二話. 「エスケープ禁止」

文字入力途中でESCを押すと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b4638691-65fb-6fd9-cee2-205238a20938.png)

そもそも選べない

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b90111fd-aa09-140d-976d-63c26a363bb1.png)

# 第三話. 「前編—右か左か」「中編—消えない」「後編—おこなわれなかった選択」

文字入力途中で右キーを押すと


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7a4a5f6d-9b89-7249-d566-8751e12ff3b5.png)

選択はおこなわれず
選択用のチップが出たままになる上に
なおかつ上下キーでの移動も出来なくなる

(トリプルパンチ)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/88b9fe5f-84f8-7c90-cd7c-560d5de7e17d.png)

さらにここでエンターを押すと、ポップが消えるだけでやっぱり選択はおこなわれない

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/755c03ae-b733-dcf7-2658-82e33032e23b.png)

## 第四話. 「暫定的な約束」

なので今はシンタックスハイライトの種類を完全に手入力してから

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/125b380f-614c-6270-762f-42aa6ea8717f.png)

ESCキーで抜けている

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/acc30300-010e-34a5-c310-9b548f57503f.png)

だがこれだと、インクリメンタルに候補を出してくれていることの効用はほとんどない

## 第五話. 「そんな話、聞いた？」あるいは「そんな手紙、読まずに食べた？」 (仮題)

個人的に、Qiitaの最も良い部分のひとつは「軽い」「書き味が優れている」だと思っているので、この挙動だけで5%ぐらいはサービスへの満足度が変わってくる。

ここを直してくれたら、わりと喜ぶ。

**具体的には、エンターを押した時に改行しなくなるだけでも良い。それだけで使い物になるはず。**

僕はお手紙書いた。読まずに食べた？


## 環境

- Google Chrome 67.0.3396.99（Official Build） （64 ビット）
- Mac OS X High Sierra








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
git log --graphの設定

## logの確認を見やすくしたい

```bash
[alias]
  graph = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
  graphall = log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
```

参考：https://blog.toshimaru.net/git-log-graph/
src は source の略 ( だと知ってからスッキリした話 )

HTMLタグはもちろんのこと


```html
<img src="http://eample.com/some_image.jpg">
```


```html
<iframe src="http://eample.com/some_file.html"></iframe>
```

たとえば Ansible (構成管理ツール) の YAML の書き方にも `src`という表現が出てくる

```yaml
- name: example copying file with owner and permissions
  copy:
    src: /srv/myfiles/foo.conf
    dest: /etc/foo.conf
```

僕は src になんとなく 「宛先」のような響きを感じていた。
`link to` の `to` のようなものかと思っていた。

上のansible のようなケースだと「どっちがdestでどっちがsrc？」とたまに混乱していた。

だが src が source = 源であると分かってからは、すんなり理解できる気がした。

- :o: src は to (宛先)
- :x: src は from (送り主)


言葉の響き、理解って大事だな。

## ところで何気なく使っている

省略名の由来を知ってる？

- HTML要素の href は Hypertext REFerence の略
- Linux コマンドの ls は List の略

## Gist

- [" src" means "source" ( I got a sense )](https://gist.github.com/YumaInaura/31ae6d519cb323748f9b2d21249c6fa3)

## あわせて読みたい

- [Linuxコマンドは単語の意味を理解するとグッと身近なものになる - Qiita](https://qiita.com/tetsuya/items/46888bb4dfc8a6bfef02)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DynamoDB Localでグローバルセカンダリインデックスが効かない時

PC上でsls-dynamodb-localを使ってテストしていたのですがグローバルセカンダリインデックスが効かなく本番上では動くのにローカル上ではこけるようになってしまいました。

こんな時はdelayTransientStatusesフラグを付けて起動するとうまく行くみたいです。
uuencode - How to yum install on CentOS

## yum install uuencode ?

### Reference
https://access.redhat.com/ja/solutions/1555523


- No package uuencode available.

```
# yum install uuencode
Loaded plugins: aliases, changelog, fastestmirror, kabi, langpacks, tmprepo, verify, versionlock
Loading support for Red Hat kernel ABI
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
No package uuencode available.
Error: Nothing to do
```

- sharutils

```
# yum install sharutils
Loaded plugins: aliases, changelog, fastestmirror, kabi, langpacks, tmprepo, verify, versionlock
Loading support for Red Hat kernel ABI
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * epel: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Resolving Dependencies
--> Running transaction check
---> Package sharutils.x86_64 0:4.13.3-8.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================
 Package                        Arch                        Version                           Repository                 Size
==============================================================================================================================
Installing:
 sharutils                      x86_64                      4.13.3-8.el7                      base                      252 k
Transaction Summary
==============================================================================================================================
Install  1 Package

Total download size: 252 k
Installed size: 898 k
Is this ok [y/d/N]: y
Downloading packages:
sharutils-4.13.3-8.el7.x86_64.rpm                                                                      | 252 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : sharutils-4.13.3-8.el7.x86_64                                                                              1/1 
  Verifying  : sharutils-4.13.3-8.el7.x86_64                                                                              1/1 
Installed:
  sharutils.x86_64 0:4.13.3-8.el7                                                                                             
Complete!
```

:smile:
【Docker For Mac】Error response from daemon: Mounts deniedの対応

Ubuntu + MySQLの環境をDockerで構築しようとしたときにマウントエラーが起きたのでそのときの対応です。

Dockerイメージは[leafney/ubuntu-mysql](https://hub.docker.com/r/leafney/ubuntu-mysql/)を使います。

ドキュメントに書いてある通り、コマンドを実行すると以下のようなエラーになりました。

```
$ docker run --name mysql -v /var/docker_data/mysql/data/:/var/lib/mysql -d -p 3306:3306 leafney/ubuntu-mysql

409e6281c751d88a935fd8db84c9dadd3f0dc2da24ba7aee203036eb493b41e6
docker: Error response from daemon: Mounts denied:
The path /var/docker_data/mysql/data/
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
```

エラー内容にも書いてあるようにDocker For MacのFile Sharingに関する情報を更新する必要があります。

以下の部分にマウントするディレクトリを追加後、DockerをリスタートすればOKです。
<img width="498" alt="スクリーンショット 2018-08-02 7.23.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/140792/4634b61b-17d5-3bec-21c0-65a62f903dcb.png">
Ubuntu/trustyにPHP7.2をインストールする

#はじめに
VagrantとVirtualBoxで構築したUbuntuの環境にPHPをインストールしたくて、`apt-get install php`でPHPをインストールできるかと思ったのですができなくて、できるようになるまでに時間がかかったので、できるようになった方法をメモしたいと思います。

#インストール対象
```
PHP 7.2.8-1
```
#環境
ホストOS: windows10
ゲストOS: Ubuntu(14.04.5 LTS, Trusty Tahr)
仮想化技術: Vagrant + VirtualBox


#方法
仮想マシン上に`vagrant ssh`で接続し以下のコマンドを打つだけです。

```sh
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.2 php7.2-common php7.2-cli php7.2-fpm
```

#結果
インストールできました。
![tmp.PNG](https://qiita-image-store.s3.amazonaws.com/0/226175/6fb42dd5-9c11-1e94-61f2-bcc2ec332f80.png)
セレクトフォーム選択時のチート

## 前提
- 今回は開発目線でなくユーザー目線
- フォーム入力の選択で国を選ぶ時に まごまごしないためのプチ時短対策です

## 背景
- 国名選択フォームで日本がなかなか見つからない時がある
- 愛国心の欠如が原因かと思いましたが、そうでもなさそうです

## ゆるいパターン分析
- 国名選択は以下２パターンある
  - 1 全てアルファベット、英語表記
  - 2 日本語でカタカナと漢字の混ざったもの

## やり方

### 1の場合
- `j` を押す
  - 基本`jamaica`（ジャマイカ）が選択されるの事が多いので、それを見越して`j`の後すばやく`↓`を押すとエキゾチック`Japan`が選択されます。

### 2の場合
- 何も考えずに一番下までスクロールしましょう
- `日本` は漢字だけで構成されているので、最下部に他の漢字圏の国々に混ざってだいたい下から５番目付近にある事が多いです。

![](https://i.gyazo.com/2f2b50765960cbd0955603f4c590634a.gif)

## 総論
- とりあえず何も考えずに`j`を押す
- 上記で無ければ、一番下まで何も考えずにスクロール

以上

これで日本を目で追ったり、日本国民としてのアイデンティティを見直したり、皇居に向かって敬礼する時間は必要なくなりました。
今の所これで不便は無いです。