OmniAICreator/Qiita-1.07M huggingface dataset:
djangoの関数でデータを格納するcontext辞書はbottleではどう設定する？

```
def vote(request, question_id):
    form = ChoiceCommentForm(request.POST or None)
    question = get_object_or_404(Question, pk=question_id)


    if request.method == 'POST':
        if form.is_valid():
            selected_choice= question.choice_set.get(pk=request.POST['choice'])
            selected_choice.votes += 1
            selected_choice.save()
            choice_comment = form.save(commit=False)  
            choice_comment.question = question
            choice_comment.save() 
            return redirect('polls:results', pk=question_id)

        context = {
            'question': question,
            'form': form,
            'error_message': "投票内容を選んでください",
        }
        return render(request, 'polls/detail.html', context)


```


djangoの関数内でこんな風に書くことがありますよね。


        context = {
            'question': question,
            'form': form,
            'error_message': "投票内容を選んでください",
        }
        return render(request, 'polls/detail.html', context)

<br><br>

これはpythonの基本で学ぶ辞書ですよね。

```
context = { 'question': question, 'form': form, 'error_message': "投票内容を選んでください", }
```

<br>
こう横に並べたほうがリストだと認識できる気がします。習いましたよね、これ。
これはリストをhtmlに送ることでhtml内でそのデータや設定を使えるようにしているのです。
分かりやすく並べてみましょうか。

```
form = ChoiceCommentForm(request.POST or None)

context = {
'form': form,
}
```

```
question = get_object_or_404(Question, pk=question_id)

context = {
'question': question,
}
```

```
'error_message': "投票内容を選んでください",
```

<br><br><br>

```
return render(request, 'polls/detail.html', context)
```
renderと記載してpollsアプリケーションのdetail.htmlにcontextリストに含まれたデータや設定を使用できるようになります。
<br>
htmlには例えばこんな記載があるんですが


```
<strong>{{ question.question_text }}の投票画面</strong>
```
<br>
このquestionは

```
question = get_object_or_404(Question, pk=question_id)

context = {
'question': question,
}
```
<br>

こっちのほうになります。

```
'question': 
```

'question':キーを呼び出してそこからvalueである右側のquestionを呼び出しているんですね。
<br>
ついでですが

```
question = get_object_or_404(Question, pk=question_id)
```

のQuestionはmodels.pyに格納されている

```
class Question(models.Model):
```
のことで、このクラスの中の

```
question_text = models.CharField(max_length=200)
```

このデータを呼び出しています。
<br>
<br>
<br>
さて、このような機能はbottleではこう書きます。
<br>

```
@route('/douinyosoku/1/')
def audience_mobilization():
    input_text = '観客動員予測や質問を入力してください'
    output_text='こんにちは！\n湘南ベルマーレ観客動員予測システムの\n「観客動員予測１号」です。\nよろしくお願いいたします！'
    return template('template', input_text=input_text, output_text=output_text, input_text_conversion='')

```

<br>
routeの下に直接関数を書き込んでtemplateに送信するのです。
ただdjangoのようにリストで色々送信できるかは不明です。
models.py自体がbottleには存在しませんし。
・・・。

```
input_text = {'1':'観客動員予測や質問を入力してください', '2': 'こんにちは！\n湘南ベルマーレ観客動員予測システムの\n「観客動員予測１号」です。\nよろしくお願いいたします！'}
```

のような書き方がは出来ると思いますが・・・。
bottleで何かを作る機会がほとんどなかったため実験したことが無いのですが、機会があればいろいろ試してみたいです。
Vagrant上のUbuntu16.04 Desktop環境でSwift Vapor開発

iOSアプリ開発のための言語と思っていたSwiftで何とWebアプリケーションが開発出来るそうで、ひとまず環境を構築してみました。
以前構築した[この](https://qiita.com/NishizawaIkuhei/items/cb13225947d24b9b56b2)環境を使いました。

<code>OS: Ubuntu16.04
Swift: 4.2.3
Vapor: 3.3.0</code>

vagrant環境に接続して、ひたすらコマンドです。
<pre>
sudo su -
cd /tmp
apt-get update
apt-get install -y clang libpython2.7 libxml2
wget https://swift.org/builds/swift-4.2.3-release/ubuntu1604/swift-4.2.3-RELEASE/swift-4.2.3-RELEASE-ubuntu16.04.tar.gz
tar zxfv swift-4.2.3-RELEASE-ubuntu16.04.tar.gz
mkdir /usr/local/swift
mv swift-4.2.3-RELEASE-ubuntu16.04 /usr/local/swift/
ln -s /usr/local/swift/swift-4.2.3-RELEASE-ubuntu16.04/usr/bin/swift /usr/local/bin/swift
swift --version
  Swift version 4.2.3 (swift-4.2.3-RELEASE)
  Target: x86_64-unknown-linux-gnu
wget -q https://repo.vapor.codes/apt/keyring.gpg -O- | sudo apt-key add -
echo "deb https://repo.vapor.codes/apt $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/vapor.list
apt-get update
apt-get install -y swift vapor
</pre>
<code>vapor --help</code>で下記が表示されればインストール済み。
<pre>
Usage: vapor command

Join our team chat if you have questions, need help,
or want to contribute: http://vapor.team

Commands:
       new Creates a new Vapor application from a template.
           Use --template=repo/template for github templates
           Use --template=full-url-here.git for non github templates
           Use --web to create a new web app
           Use --auth to create a new authenticated API app
           Use --api (default) to create a new API
     build Compiles the application.
       run Runs the compiled application.
     fetch Fetches the application's dependencies.
    update Updates your dependencies.
     clean Cleans temporary files--usually fixes
           a plethora of bizarre build errors.
      test Runs the application's tests.
     xcode Generates an Xcode project for development.
           Additionally links commonly used libraries.
   version Displays Vapor CLI version
     cloud Commands for interacting with Vapor Cloud.
    heroku Commands to help deploy to Heroku.
  provider Commands to help manage providers.

Use `vapor command --help` for more information on a command.
</pre>
あとはrootユーザは抜けて、プロジェクト作成です。
<pre>
mkdir webapps
cd webapps/
vapor new web_blank
</pre>
![vapor_prj_create.png](https://qiita-image-store.s3.amazonaws.com/0/372909/bef35171-322d-96ab-cf9a-041f1f584f02.png)

続いて
<pre>
cd web_blank
vapor build
vapor run serve
</pre>
まで実行して、<code>localhost:8080</code>にアクセスします。
![Screenshot from 2019-03-18 11-57-58.png](https://qiita-image-store.s3.amazonaws.com/0/372909/f3acf92a-81a4-8e64-2b04-15faffec9f07.png)

OK！
Git Bash 設定メモ

# PATHを通す
- Git配下の/usr/binに配置することで実行可能になる

# bashrcの設定
- Git配下の/etc/bash.bashrcに追記する

# ConEmuのインストール
- cmdより使いやすそうなので使用

## フォント変更
- Ricty Diminishedがおススメらしいので採用
- [Git Hub](https://github.com/mzyy94/RictyDiminished-for-Powerline)からzipをダウントード
- 解凍しエクスプローラーでttfファイルを選択するとプレビューが表示される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269592/708822c6-4fcf-f289-b30e-4d21eb64bae0.png)

- 気に入ったらインストールを押下する
- 完了するとConEmuのSetting→General→FontsのMain Console fontにRicty Diminishedが選択できる

# 課題
## sudoが使えない
- https://github.com/imachug/win-sudo を試してみたとこと、sudoコマンドは打てるようになったが処理が返ってこない、、
Android Studioで"io.fabric.tools:gradle"のバージョン1.28.0に関連した問題


## 概要

なんにもしてないのに今日ビルドエラーになってました。(まじで)

```
No signature of method: com.crashlytics.tools.gradle.CrashlyticsPlugin.findObfuscationTransformTask() is applicable for argument types: (java.lang.String) values: [MyAppProductionDebug]
```

スタックオーバーフローに解決方法が記載されていました。
https://stackoverflow.com/questions/55214993/error-no-signature-of-method-com-crashlytics-tools-gradle-crashlyticsplugin-fi

## 原因
"io.fabric.tools:gradle"の最新バージョン1.28.0に関連した問題のようです。
手元のBuild.gradleは"1.+"となっていて常に最新になるようになっておりました。

```
dependencies {
    classpath 'io.fabric.tools:gradle:1.+'
}
```

## 解決方法
現在の最新安定版にダウングレードする。

```
dependencies {
    classpath 'io.fabric.tools:gradle:1.27.1'
}
```

## おわり
今後はバージョン番号に+を使用しないほうが無難ですね。
Clovaスキル開発をワークショップでやってみたお話

## ワークショップの実施経緯
ある勉強会で知り合った方にお話をいただき、京大でワークショップをやろうというお話に。。。。
詳細をお話していく中で、合計10時間のワークショップを実施することになりました。
- 2019/02/08　17:00-20:00
- 2019/02/15　17:00-20:00
- 2019/03/01　16:00-20:00
お話をいただいたものの、私自身Clovaスキル開発はTシャツ欲しさに1つ公開した程度で、
ほとんど経験がありませんでした。
そんな中で当日のスケジュール企画、資料作成、実際のスキル作成を行い、
業務から帰って家でひたすら作成しておりました。

## 実施時の様子
まず、大量のClova。。。。こんな台数お目にかかることがないので驚きました！
![IMG_1931.JPG](https://qiita-image-store.s3.amazonaws.com/0/215684/ad2e62f4-2ac2-e2ef-4674-d66d827683fd.jpeg)

1回目は、弊社概要を説明後にClovaの設定から行いました。。。
そしてClovaが多すぎて一人の「Clova!」のいうウェイクワードにめちゃくちゃ反応する、というシュールな光景でした！
「自己紹介スキル」を一から作成しよう。というメインテーマで行いました。
![51515941_602488086865479_1105322873146310656_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/215684/680ac5d4-dda0-444a-ff5d-6db14e9be5c5.jpeg)

2回目は、1回目に作成した「自己紹介スキル」をbot連携しよう、というメインテーマで行いました。
![52588082_606224699825151_5632826329981255680_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/215684/e84da8b7-3aa5-ad2d-86bc-4e753888e177.jpeg)
少し駆け足で進めてしまった点が大きな反省点です。。。
bot連携は今回のワークショップの実施にあたり、私自身も初めて行いました。
本当にメッセージを送るだけの単純なものなので
今後LIFFとかにもチャレンジしたいなと思いました。
1回目、2回目を通して作成したスキルはこちらです。(動画の掲載方法がわからないので静止画です)↓↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215684/454840a3-7990-9b10-500b-b0b9bf8078f9.png)

3回目は、LINEの小城様にゲストでご参加いただき、私自身も勉強させていただくことができました。
スマートスピーカーを中身(スキル開発)だけでなく、外見もデコろう！ということで、
全ワークショップとも任意参加者でClovaデコレーションを行いました。
皆さん非常に楽しんでご参加いただきデコレーションをすることで、スキル開発に取っ付きやすくなるように伺えました。
デコレーションすることで親しみを感じ、積極的にスキル開発に取り組むことができるのではないでしょうか？
ぜひclovaデコを推していきたいと思います。(第3回で私がデコレーションしたClovaです。↓↓)
![52926842_613983785715909_4943532616398667776_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/215684/5358ebc6-d39f-3ada-0459-9be29ffc6f4f.jpeg)

## 実施アンケートをふまえて
実施時のアンケートの一部ですが、非常に多岐にわたる学生さんにご参加いただけました。
<img width="691" alt="スクリーンショット 2019-03-19 11.17.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/215684/bc0a1651-edab-8ef9-d790-4fc8e529b2ef.png">
プログラミング未経験、という方でも楽しんでもらえたように伺えました。
学部も様々であれば学位もバラバラ、他大学からもご参加いただいたり、
最終日は学生さん以外の方にもお越しいただけました。
差し入れをお持ちいただきました皆さま、ありがとうございました。

## 最後に・・・
余談ですが、私は普段の業務はiOSアプリの開発を行なっており、
はっきりいうと、スキル開発は業務とは全く関係がない分野です。
そして、そんな私がこんなお話をいただけるのは本当に感謝でいっぱいです。
いつかスマートスピーカーをお仕事にできたらなぁ。。。と思います！
そしてこれだけは断言します。「人を教えるって難しい」
いずれもう少し簡単なツールを勉強して、
小さな子供向けにワークショップを行ってみるのも楽しそう、やってみたいなぁと思います！
iosのabmobやgoogle ad managerでGADInvalidInitializationExceptionが発生した場合

こんなエラーが出た場合の解決方法

```
*** Terminating app due to uncaught exception 'GADInvalidInitializationException', reason: 'The Google Mobile Ads SDK was initialized incorrectly. Google AdMob publishers should follow instructions here: https://googlemobileadssdk.page.link/admob-ios-update-plist to include the AppMeasurement framework, set the -ObjC linker flag, and set GADApplicationIdentifier with a valid App ID. Google Ad Manager publishers should follow instructions here: https://googlemobileadssdk.page.link/ad-manager-ios-update-plist'
*** First throw call stack:
(
	0   CoreFoundation                      0x00000001146301bb __exceptionPreprocess + 331
	1   libobjc.A.dylib                     0x0000000113bd6735 objc_exception_throw + 48
	2   CoreFoundation                      0x000000011462fd29 -[NSException raise] + 9
	3   Runner                              0x0000000109f2f680 GADVerifyApplicationID + 148
	4   Runner                              0x0000000109f30266 GADVerifyApplicationID + 3194
	5   libdispatch.dylib                   0x000000011239d595 _dispatch_call_block_and_release + 12
	6   libdispatch.dylib                   0x000000011239e602 _dispatch_client_callout + 8
	7   libdispatch.dylib                   0x00000001123ab99a _dispatch_main_queue_callback_4CF + 1541
	8   CoreFoundation                      0x00000001145953e9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
	9   CoreFoundation                      0x000000011458fa76 __CFRunLoopRun + 2342
	10  CoreFoundation                      0x000000011458ee11 CFRunLoopRunSpecific + 625
	11  GraphicsServices                    0x00000001177ef1dd GSEventRunModal + 62
	12  UIKitCore                           0x000000011dcd281d UIApplicationMain + 140
	13  Runner                              0x00000001098bbda4 main + 68
	14  libdyld.dylib                       0x0000000115ce8575 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
```

これらは、Google Mobile Ads SDK version 7.42.0から必須になった以下をすれば解決します。

# admobの場合

info.plistに以下を追加。アプリIDを記述する

```
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-3940256099942544~1458002511</string>
```

アプリIDは、以下を参考

https://support.google.com/admob/answer/7356431

# Google Ad Managerの場合

info.plistに以下を追加

```
<key>GADIsAdManagerApp</key>
<true/>
```

# 結論

これらは、英語のドキュメントにすれば書いてあります。
英語のドキュメントを見よう。
JSでとまどったやつ【WIP】

おもに【[ECMAScript6の新機能 - Qiita](https://qiita.com/rana_kualu/items/1f98c1a642102f48aa78)】の記事を読み進めるにあたって、自身が今まで曖昧に理解していたものをピックアップ。

今後も追記するかどうかはその時の気分とか余裕度によって。


## `{ [ 'prop_' + (() => 42)() ]: 42 }`

計算結果をプロパティ名にできる。

```js
const obj = { [ 'prop_' + (() => 42)() ]: 42 }
const obj.prop_42; // => 42
```

メソッド名にも使用できる。

```js
const a = 'hello';
const obj = {
  [a]() {
    console.log('this is hello');
  }
};
obj.hello(); // => 'this is hello'
```

- enhanced object literals  
https://qiita.com/rana_kualu/items/1f98c1a642102f48aa78#enhanced-object-literals


## `{ somthing }`

変数名とkey名が一緒なら省略可能。

```js
const something = 'hello';
const obj = {something };
obj.something; // => 'hello'
```

- enhanced object literals  
https://qiita.com/rana_kualu/items/1f98c1a642102f48aa78#enhanced-object-literals


## `[...someArray]`

スプレッド演算子。
関数の引数で使ったら配列で受けるやつ。
呼び出す側でつかったら配列を引数に展開するやつ。

```js
function f(a, ...b) {
  console.log(a); // => 1
  console.log(b); // => [2, 3]
}

f(...[1,2,3]);
```

- default + rest + spread  
https://qiita.com/rana_kualu/items/1f98c1a642102f48aa78#default--rest--spread


## `for(;;)`

無限ループ。
きちんと`break`すること。

- generators  
https://qiita.com/rana_kualu/items/1f98c1a642102f48aa78#generators
- 省略可能な for の式  
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for#Optional_for_expressions


## `function*`

> function* 宣言 (末尾にアスタリスクが付いたfunctionキーワード)は、 Generator オブジェクトを返すジェネレーター関数を定義します。

- function* - JavaScript | MDN  
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function*
コメダ珈琲店で Linux で Wifi 接続ができない状況

コメダ珈琲店で Linux で Wifi 接続ができない状況の報告です。

テストしたのは、Arch LInux です。

```text
$ uname -a
Linux iwata 5.0.2-arch1-1-ARCH #1 SMP PREEMPT Thu Mar 14 18:47:49 UTC 2019 x86_64 GNU/Linux
```

```text:/etc/netctl/komeda
Description='Automatically generated profile by wifi-menu'
Interface=wlp2s0
Connection=wireless
#Security=wpa
#Security=wep
ESSID=Komeda_Wi-Fi
IP=dhcp
#Key='12345678'
key_mgmt=NONE
```

使ったコマンド

```bash
sudo netctl start komeda
```

ログの状況

```text
● netctl@komeda.service - Networking for netctl profile komeda
   Loaded: loaded (/usr/lib/systemd/system/netctl@.service; static; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2019-03-19 10:26:14 JST; 3min 0s ago
     Docs: man:netctl.profile(5)
  Process: 1124 ExecStart=/usr/lib/netctl/network start komeda (code=exited, status=1/FAILURE)
 Main PID: 1124 (code=exited, status=1/FAILURE)

Mar 19 10:25:43 iwata dhcpcd[1171]: DUID 00:01:00:01:22:75:6d:a4:80:fa:5b:07:26:86
Mar 19 10:25:43 iwata dhcpcd[1171]: wlp2s0: IAID 5e:92:c4:48
Mar 19 10:25:43 iwata dhcpcd[1171]: wlp2s0: soliciting a DHCP lease
Mar 19 10:26:13 iwata network[1124]: timed out
Mar 19 10:26:13 iwata dhcpcd[1171]: timed out
Mar 19 10:26:13 iwata dhcpcd[1171]: dhcpcd exited
Mar 19 10:26:13 iwata network[1124]: DHCP IPv4 lease attempt failed on interface 'wlp2s0'
Mar 19 10:26:14 iwata network[1124]: Failed to bring the network up for profile 'komeda'
Mar 19 10:26:14 iwata systemd[1]: netctl@komeda.service: Main process exited, code=exited, status=1/FAILURE
Mar 19 10:26:14 iwata systemd[1]: netctl@komeda.service: Failed with result 'exit-code'.
```

ちなみに今は、自分のモバイルルーターを使って、Arch Linux からこの記事を書いています。

Ubuntu 18.10 でも wifi の接続を試みましたが失敗しました。

Android, Raspberry Pi (Raspbian) では wifi 接続ができます。
VBScriptでネットワークアダプターを復活させる

# 背景
WindowsでノートPCをスリープ状態から復元するとWirelessが死んでしまうけど、
電源オプション周りで調整ができなかった。

デバイスマネージャでWirelessのハードの無効・有効操作で復活できることが分かっている。
この操作を毎回やるのも邪魔なので、VBSでやってみようとして作ったスクリプト。


# スクリプト
例のWirelessのデバイス名は`[00000011] Intel(R) Wireless-N 7260`となっている。
個人のデバイスマネージャーを確認して差し替える必要あり。
コメントアウトになっている部分：Retを開放して実行することで確認できる。

```VB:restart_wireless.vbs
'-----------------------------------
'Device list
'Availability
'1 Other. 2 Unknown. 3 Running/full power. 4 Warning. 5 Testing. 
'6 Not applicable. 7 Power off. 8 Offline. 9 Off duty. 
'10 Degraded. 11 Not installed. 12 Install error. 13-17 Power save. 
'18 Paused. 19 Not ready. 20 Not configured. 21 Quiesced. 
'-----------------------------------
Option Explicit

Dim QfeSet
Dim Qfe
Dim Locator
Dim Service
Dim Ret

Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer
Set QfeSet = Service.ExecQuery("Select * From CIM_LogicalDevice Where Availability=3")

For Each Qfe In QfeSet
  'Ret = Ret & Qfe.Caption & vbCrLf
  If Qfe.Caption = "[00000011] Intel(R) Wireless-N 7260" Then
    Wscript.Echo Qfe.Caption
    Qfe.Disable
    Wscript.Sleep 2000
    Qfe.Enable
  End If
Next

'Wscript.Echo Ret

```


### 参考
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1047089555
Vagrant上でUbuntu Desktop環境を構築

リモートデスクトップ環境に興味があり、Vagrant上で作ってみることにしました。
難しい事は何もなく、基本的に[こちら](https://qiita.com/mhagita/items/8f339106c3b48eb098ca)そのままです(^_^;)

環境は下記。
<code>OS: macOS 10.13.6 High Sierra
Virtualbox: 5.2.18
vagrant: 2.1.4
</code>
ここで、
<pre>
(元々boxはある状態で)
vagrant init bento/ubuntu16.04
vagrant up
</pre>
のあと <code>vagrant ssh</code>で接続。<br>
続いて
<pre>
sudo su -
apt-get update
apt-get install -y ubuntu-desktop
</pre>
結構時間がかかるのでコーヒーでも。（15分くらいでした。）
終わったら<code>exit</code>して<code>vagrant halt</code>と<code>vagrant up</code>でウィンドウが表示されるのでOK。<br>
クラウド環境使う時の踏み台にデスクトップも付けたら便利になるかな、の思い付きを試すために手元で作ってみました。
せっかくなのでもう少し遊んでみようと思います。
Elixir ~外部APIをWeb表示~



おひさしぶりです。水野です。

# ここまでのあらまし 

北九州に生活の場を移し、しばらく生活の安定や音楽、デザイン、映像まわりを頑張っていたのですが、事情があって一ヶ月ほど中止していたElixir学習を再開しました。

自分の記事を振り返ると"あれっ、ここなんで理解できてたのかわからない"といったことが大いにあることも気づきでした。

# DBから取得したデータから "列の抽出"

piacereさんのドキュメント[Excelから関数型言語マスター4回目：Webに外部APIデータ表示](https://qiita.com/piacere_ex/items/4c212615a4eb699dd109) の前半部分、DBから取得したデータからの列の抽出を行っていきます。

```elixir:lib/sample_db_web/templates/page/index.html.eex

<%
result = Db.query( "select * from members" )
data = result |> Db.columns_rows
columns = result |> Db.columns
%>
<table border="1">
<tr>
  <%= for column <- columns do %>
  <th><%= column %></td>
  <% end %>
</tr>
<%= for record <- data do %>
<tr>
  <%= for column <- columns do %>
  <td><%= record[ column ] %></td>
  <% end %>
</tr>
<% end %>
</table>

```

ここまでのコードで表示させたDBの内容に対し、

```elixir

|> Enum.filter( fn( column ) -> column == "name" || column == "age" end )
```

Enum.filterで名前と年齢のカラムのみフィルターします。<img width="945" alt="スクリーンショット 2019-03-19 10.19.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/306722/476794fd-faa1-8aa5-4ab7-4f7572def3c0.png">
DBに重複データが残っているため、同じ名前が何度も出てきてしまいます。DB側でこれを綺麗にできないかが課題です。

# 外部APIを呼び出し、Web表示

Smallex導入およびmix deps.getは割愛します。

```elixir:lib/sample_db_web/templates/page/index.html.eex

<%
result = Json.get( "https://qiita.com", "/api/v2/items?query=elixir" )
data = result
columns = [ "id", "title", "created_at" ]
%>
```

<table border="1">以降のHTML部分はDB表示と変わっていない。
つまり、先頭のDBからのデータ取得の部分を外部APIからのデータ呼び出しに書き換えるだけで、同じようにWeb表示させ扱えるということになります。

(この肝要なポイントに気づかず全部写経していたのは効率が悪かったかもしれない。このシリーズは通算で5回くらいずつ復習しているのですが...苦笑)

で、このような表示になりました。

<img width="955" alt="スクリーンショット 2019-03-19 10.18.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/306722/a67f501a-714c-e494-dc16-78f4cbe67919.png">

前回猛烈なペースでQiitaドキュメントを書いていたときは、この一覧に自分のそれも混じっていて、そのときはなかなかタイムリーなスクリーンショットが撮れました。(笑

＃わかるようになったこと

DB表示から列の抽出には、上記Enum.filterの式が肝要。

DB表示の際に書いたコードの上部３行ほどを書き換えるだけで、DB表示と同様に外部API呼び出し、Web表示ができる。

まだまだコード自体自分で体系的理解を以って書き上げるのは難しいのですが、以上２点を肝要なポイントとして押さえることができました。

うまず、たゆまず、頑張ります。
Kento Mizuno
最新情報を取得できるおすすめのメディア

## Clound Native
https://itnext.io
Kubernetesが多い、気がする

https://thenewstack.io/
最新の開発についてかなり幅広く乗っている

## Start Up
https://www.producthunt.com/
かの有名なYコンビネーターのサイト
Laravel+Duskでheadタグ内の要素のテストの書き方

久しぶりにLaravelに戻ってテストを書く日々を送ってます。
そんな中で今度はheadタグ内の要素を確認するテストが必要になって調べてみました。
前提は以前書いたこの記事です。

[Laravel+Duskでブラウザテスト](https://qiita.com/Masakiy99/items/59e7f850f6b1552b3acf)

## 一番初めにやったこと

```
$browser->dump()
```

ソース丸ごと取得して正規表現でチェック。


## タイトルの場合

```
$this->assertEquals($browser->driver->getTitle(), "タイトル") ;
```

## 他の要素（例：description)
この場合はメソッドは用意されてなかったのでfindElementで探します。

```
$this->assertEquals($browser->driver->findElement(WebDriverBy::xpath("//meta[@name='description']"))->getAttribute('content'), "descript") ;
```

## javascriptの読込確認

```
$elemntFind = false;
$elemnts = $browser->driver->findElements(WebDriverBy::xpath("//script"));
foreach ($elemnts as $elemnt) {
    /** @var $elemnt RemoteWebElement */
    if (strpos($elemnt->getAttribute('src'), 'jsのパスとか') !== false) {
        $elemntFind = true;
        break;
    }
}
$this->assertTrue($elemntFind);
```

## ソース内で直接書かれてるjavascriptの内容確認

```
<script type="text/javascript">
この中身を知りたい
</script>
```

広告とか計測とかってjsが動いてページ内にjsを埋め込むことがあるのでそれをチェックするのに使った。

```
$elemnts = $browser->driver->findElements(WebDriverBy::xpath("//script"));
foreach ($elemnts as $elemnt) {
    /** @var $elemnt RemoteWebElement */
    $this->assertNotNull($elemnt->getAttribute('innerHTML'));
}
```

基本は2つ目に書いたjsのチェックと同じ。
だけど中に書かれてる内容を取り出すメソッドが無くていろいろやってたらこれで出来た。
innerHTMLってメソッドだよなぁと思いつつ出来たのでいいか。
アクセス権を使い分けてみよう

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている[りく](https://qiita.com/rikukaikuu)です。

PHPⅢを学んだ際に新たな「アクセス権」についての説明があったので、使い分けをしてみようと思います。

#public編
書き方は以下の通りです。

```php

public $name
```
これでプロパティが定義されました。
一度定義すればどこからでもアクセスが可能です。（別のファイルにある場合はrequire_once()を忘れずに書き込んでください）

#private編
次にprivateについてです。
書き方は以下の通りです。

```php
private $name
```
これでプロパティが定義されました。
しかし、pubicと違宇点があります。
それは「クラスの外部からアクセスできない」ことです。
どういうことかというと、

```php
class Rain{
    private $Umbrella
}

$please = new Rain('傘をくれ');
echo $please->umbrella
```
これがエラーになるということです。
こんなの何の役に立つのかというと、外部から変更できないようにするためです。
例えば、通販サイトで書かれている金額があるとします。
これを、購入する側が設定できたら困りますよね。
それを防ぐために一部制限をするためにprivateがあります。

#protected編
最後に今回新たに学んだprotectedについてです。
書き方は以下の通りです。

```php
protected $name
```
これでプロパティが定義されました。
privateとの違いは、親クラスで定義した場合子クラスにも定義されることです。
つまり、

```php:rain.php
   class Rain{
     protected $Umbrella
```

```php:please.php
   class Please extends Rain{
     public function __construct($Umbrella){
     $this->umbrella = $umbrella
   }
}
      
```
このようなことができます。

#まとめ
以上、アクセス権のまとめでした。

- public
  - どこからでもアクセス可能
- private
   - そのクラス内からのみアクセス可能
- protected
   - そのクラスと子クラス内からのみアクセス可能

それぞれの特徴を理解して使うとやりやすいと思います。（基本はprivateで、get○○でpublicとか）
もし、誤りや無駄な文があれば修正するので、指摘してくれると助かります。
vue.js + 単体テスト

# はじめに
Vueで業務にあたって、テスト（単体テストとe2eテスト）を行う機会があると思います。今日はVueの単体テストについて書いていきます。

# 単体テストとは
単体テストとは、プログラムを構成する比較的小さな単位（ユニット）が個々の機能を正しく果たしているかどうかを検証するテストのことです。世の中に出ているサービス等のプログラムは計り知れない膨大なプログラムが書かれています。そのひとつのまとまりを細かく細かく分解すると小さなプログラムが検出されます。例えば文字列を置換する関数、入力された値の型をチェックする関数、、などなど小さなまとまりが現れます。その個々の機能が自分が意図した機能であるかどうかを判定するのがこの単体テストです。

単体テストの必要性（以下、Vueの公式サイト）
>
+ コンポーネントがどう動作すべきかのドキュメントを提供します
+ 過度な手動テストの時間を節約します
+ 新しい機能におけるバグを減らします
+ 設計を改良します
+ リファクタリングを容易にします
>

[参考：単体テスト (ユニットテスト)とは](https://www.techmatrix.co.jp/t/quality/unittest.html)
[参考：Vue コンポーネントの単体テスト（Vue公式サイトより）](https://jp.vuejs.org/v2/cookbook/unit-testing-vue-components.html)

# Vueで単体テストを書く
テストを書くことはVueに特化したことではありません。僕が今回`vue/test-utils`を使って、そのテスト方法を説明するだけで、どのような言語＋フレームワークでもテストは推奨されます。公式にも記載されていますが、Vue の単一ファイルコンポーネントは独立したコンポーネントの単体テストを書くことを容易にできます。ちなみに`vue/test-utils`はVue.js 向けの公式単体テストライブラリです。

[参考：vue-test-utils公式](https://vue-test-utils.vuejs.org/ja/)

## 実践（コンポーネントを定義）

```vue:sample.vue
<template>
  <div>
    <input v-model="username">
    <div 
      v-if="error"
      class="error"
    >
      {{ error }}
    </div>
  </div>
</template>

<script>
export default {
  name: 'Hello',
  data () {
    return {
      username: ''
    }
  },

  computed: {
    error () {
      return this.username.trim().length < 7
        ? 'Please enter a longer username'
        : ''
    }
  }
}
</script>
```
このプログラムは入力した値の文字数が7文字より少ない場合はエラーとして、`Please enter a longer username`と出力されます。このプログラムで単体テストを行っていきます。

## 実践(テストを書く)
```javascript:sample_test.js
//必要なモジュールとコンポーネントを読み込む
import { shallowMount } from '@vue/test-utils'
import Hello from './Hello.vue'

//テストを書く
test('Hello', () => {
  // コンポーネントを描画します(Wrapperを返す)
  const wrapper = shallowMount(Hello)

  // `username`は空白を除外して7文字未満は許されません
  wrapper.setData({ username: ' '.repeat(7) })

  // エラーが描画されることをアサートします
  expect(wrapper.find('.error').exists()).toBe(true)

  // 名前を十分な長さにします
  wrapper.setData({ username: 'Lachlan' })

  // エラーがなくなったことをアサートします
  expect(wrapper.find('.error').exists()).toBe(false)
})
```
このテストのコードを読んでいくと、感覚的に掴めるところがあると思います。`shallowMount`関数は`vue/test-utils`のAPIです。`Wrapper` は、マウントされたコンポーネントと仮想 DOM 、またはコンポーネントと仮想 DOM をテストするメソッドを含むオブジェクトを指します。このオブジェクトを作成されると、`Wrapper`用のメソッドが使用できます。この`Wrapper`のメソッドと比較して正常か否かを判定します。
また、Jestというテストツールを踏まえてのテストですが、`.toBe`や`.repeat`等はテスト用法で、この用法は書いていくと慣れてると思います。そんなに量も多くない（以下参考）ので覚えるのもあっという間でしょう。
[参考：vue/test-utilsのAPIについて](https://vue-test-utils.vuejs.org/ja/api/)
[参考：vue/test-utilsのWrapperについて](https://vue-test-utils.vuejs.org/ja/api/wrapper/)
[参考：Facebook製のJavaScriptテストツール「Jest」の逆引き使用例](https://qiita.com/chimame/items/e97883fd46b67529d59f)

# まとめ
Vue単体テストの「単体」の単位はコンポーネントと結びついて容易に単体テストができます。
ぜひぜひやってみてください。
Docker Compose で Rocket.Chat 起動しない（waiting for connections on port 27017）

Docker Compose で Rocket.Chat 起動しなかったときのメモ。

# 事象
会社のセキュリティ規定でSlackが使えないので、Rocket.Chat を社内基盤に立ち上げた。
どうせなら Docker を使おうと思い、Docker Compose で Rocket.Chat を構築したら初回は起動したけど、なぜか２回目から起動しない。

ログを見ると「waiting for connections on port 27017」で MongoDBがコネクションを待ち受けており、接続先が無くて止まっている様子。

docker-compose stop や docker-compose down を実行後、docker-compose up してもダメ。

# 解決策

根本原因までは調べてないが、初回起動以降はログの通り、MongoDB が Rocket.Chat App より先に起動してしまい、接続先が無くて止まっているっぽい。なので、先ずは MongoDB を起動させ、

```
# MongoDB起動
docker-compose up -d mongodb
# logの確認
docker-compose logs mongodb
```
で、以下のログが出ていることを確認してから、

```
mongodb_1  | 2019-03-19T00:00:00.000+0000 I NETWORK  [initandlisten] waiting for connections on port 27017
```

Rocket.Chat App を起動させる。

```
# rocketchat起動
docker-compose up -d rocketchat
```

詳細は[この](https://github.com/RocketChat/Rocket.Chat/issues/1373)あたりか？

docker-compose only runs first time #1373
https://github.com/RocketChat/Rocket.Chat/issues/1373
シェル変数と環境変数の違い

# シェル変数と環境変数

## シェル変数

- 実行中のシェル内でのみ有効な変数
- 子プロセスには引き継がれない

### 利用例

```shell
$ SHELL_VAR=value
$ echo $SHELL_VAR
```

## 環境変数

- 実行中のシェル内、および子プロセスで有効な変数

### 利用例

```shell
$ ENV_VAR=value
$ export ENV_VAR   # または export ENV_VAR=value として一行で書くことも可能
$ echo $ENV_VAR
```

# env/export/printenv/setコマンドの違い

| コマンド | シェル変数 | 環境変数 | 説明                                                 |
|----------|------------|----------|------------------------------------------------------|
| env      | -          | ✓        | 実行対象のコマンドに一時的な環境変数を設定して実行 |
| export   | -          | ✓        | 環境変数の定義を行う                               |
| printenv | -          | ✓        | 環境変数の一覧を表示                               |
| set      | ✓          | ✓        | シェル変数と環境変数の一覧を表示                   |

# コマンドの特徴

- `env`コマンド
    - 一時的な環境を設定してコマンドを実行
        - 例えば、`env PATH=/usr/local/bin:$PATH some_command`とすることで、`some_command`を実行する際に`PATH`を一時的に変更できる
- `export`コマンド
    - シェル変数を環境変数に変換
        - 例えば、`export VAR=value`とすることで、`VAR`が環境変数として子プロセスにも引き継がれるようになる
- `printenv`コマンド
    - 現在の環境変数を一覧表示
        - デバッグやシステムの設定確認に便利
- `set`コマンド
    - 現在のシェル変数と環境変数を一覧表示
        - スクリプトのデバッグに有用
どうしてもゲームプログラマになりたい人へ基礎知識編＃B０1

##記述する動機
私、とある専門学校でPGを教えています。はや10年。
いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、全て実例です。学校名は秘密！！

##基礎知識編（2019）
この記事を読んで「心折れる」という人はさっさと折って差し上げます。
サクサク行きます。いいですか？
そもそもゲームが好きなのか？プログラムが好きなのか？
だいたいゲームが好きなのは単にプレイが好きなのです。
あなたは英語、数学、物理が好きですか？そもそも知らないのでは無いでしょうか？
あなたが知らない、やったことの無いこと全てに立ち向かうガッツ有ります？
毎日５、６時間ノンストップで机に向かえます？
何日徹夜しても笑顔でいられます？
有能な上司と無能な同僚に挟まれても平常でいられます？
デザイナーの感覚やプランナーの喋りに対応できます？
みんな最初はできないと思います。立ち向かった人が少しづつできるようになる。
ゲーム好きなだけなら、他の仕事をしましょう。
まだ頑張りますか？そうですか。では次に進みます。

##English
コンピュータ用語はほとんどEnglish。正式な情報はEnglish読むのが一番早い。仕方ないのです。
勉強しましょう。話せなくてもいいです。（今の所ね。話せた方がいいに決まっとる）
原文をだいたい読めるぐらいは大した努力では無いです。
まだ頑張りますか？そうですか。では次に進みます。

##数学
ペーパーテストを解けなくても良いです。しかし、簡単な代数、基礎的な微分、正方行列ぐらいはわからないと幾何のプログラムは書けません。画像処理の最低ラインでこれくらいだと思います。
勉強しましょう。関数作れたり、関数使えたりはできないとどうにもなりません。
大学理数系の基礎的数学レベルで良いでしょう。一般教養レベルです。大したことある...
まだ頑張りますか？そうですか。では次に進みます。

##物理学
大したことはないんだけど、力学で大丈夫です。よかったですね。あ、熱学も少しは、波もちょっと。
物理以外は生物シミュレーションの考え方は役に立ちます。
大学理数系の力学だけで良いでしょう。一般教養レベルです。大したことある...
まだ頑張りますか？そうですか。では次に進みます。

##情報量の多さ
これらをプログラミングと同時平行で出来た人間は何人というぐらいのレアもの。
土台がある程度以上ある人は可能です。
大学行けたけど行かんかったとか、中卒だけど英語バリバリとか、数学は見りゃわかるくらいとか
もう一つとにかく大事なこと。「精神力」矛盾してるように感じるかもしれませんね。
この勉強量に負けない精神力。有りますか？大丈夫？
まだ頑張りますか？そうですか。では次に進みます。

##今までを振り返る
勉強なんて嫌いかもな人。悪いことは言わない。もう一度考えて欲しい。
誰もがなれる仕事ではない。やり続けることは結構大変。
夢は叶わない。夢ですから！！
一つ一つ、現実にしていくことが必要。
専門学校で生き血を啜られることにならぬように冷静に考えてください。

それでもやるって人はある意味ahoなので、仕方ない。全力で取り組みましょう。
死んでも悔いるな。#B02以降で個別に記述する予定です。
「C#」「Visual studio」「Windows EXE実行ファイル」のリリースについての質問です

Visual studio(C#)でコンパイルした、
Windows EXE実行ファイルのリリースについて質問です。

バッチシステムとしてタスクスケジューラーで起動させますが、
頻繁にシステム改修があり、都度リリースが必要です。

しかし、システム実行中にリリース(EXEファイルの上書き)を行うと、
起動中のため上書きエラーとなります。

実行中のEXEに対して、
次回の実行分から最新のシステム改修を反映させるには、
どのようにしたら良いでしょうか？

以下私の案がございますが、スマートではありませんし、
実行開始に時間がかかるデメリットがございます。
他にスマートな案はございますでしょうか？

起動に関するフレームワークなどあるのでしょうか。

<案>
1.処理開始時に本体EXEファイルをコピーして実行版EXEファイルを作成する(同一のEXEファイル)
2.実行版EXEファイルを起動する
3.実行中でも本体EXEファイルは上書き可能なため、本体EXEファイルに対してリリース(EXEファイルの上書き)を行う
#3タグマネージャの導入準備

#1.Point(要点)
Webサイト運営を行うにあたりGoogleタグマネージャ(以下タグマネ)は、
必ず導入しなければならないのか？

#2.Reason(理由)
そう考る理由としてタグマネは、「タグを管理しやすくする」ツールでしかなく、
使用してもそれが直接的なアクセス数や、売り上げなどの利益になるわけでない。
またタグマネ導入時にコスト(導入作業時間 = 工数)が発生する為、必ずしも導入する
必要性は無いと言う考えも存在するからです。

#3.Example(具体例)
###・主な導入作業
①.サイトの全HTMLページにタグマネのタグを記述する
②.タグマネで管理する予定のタグをHTMLから削除する
③.タグマネの管理画面上で配信設定を行う

#4.Point(要点)
###・タグマネのメリット
①.それまで手間がかかった様々な種類のタグ管理を一元管理する事で管理が楽になる。
###・タグマネ導入のオススメタイミング
①.サイト新規立ち上げ時
②.サイトリニューアル時
③.ユニバーサルアナリティクス移行時
Android有料課金アプリ販売登録方法 - 初心者向け

#Androidアプリの有料課金には詳細情報を登録する必要アリ

2回目の投稿ではAndroidアプリの有料課金に必要な販売者情報登録方法について解説しよう。
まだ、Android開発者登録を行っていない方は以下のページの内容に沿って開発者登録を事前に行ってください。
*[Android開発者登録方法 2019年最新版 かんたんな方法](https://qiita.com/QRES/items/e236d63689d003e7af67)*

#ステップ1 プロフィール詳細ページへ移動

### Google play consoleページを開き、左の「アカウントの詳細」を押す
https://play.google.com/apps/publish/
![developer1.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/5c5bc788-27c0-f883-19f1-4039e4cf508f.png)


#ステップ2 販売者情報を記入
画面最下部の販売アカウントまで移動し、*「販売アカウントセットアップ」*を押す。
![developer2.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/7799454e-0add-f0e1-1fff-503edff7dc0c.png)

#ステップ3 販売者情報を入力
![developer3.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/0d1eb2d4-75fd-a98e-e014-3e9a1984e2a7.png)
以前、登録した住所情報などで問題が無ければアプリの販売内容を記入する欄を入力していく。
### 入力必要項目
入力が必要な内容は以下のものです。
*1. 販売する商品やサービス
2. カスタマーサポートのメールアドレス
3. クレジットカード明細書に記載される請求名*
"""英数字で入力しよう。日本語やドットや記号などは使用できません。"""

#Androidアプリ販売者登録完了
以下の画面が表示されれば登録完了となります。
これにて課金アプリの販売が可能となります。
![developer4.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/fa814e9c-c5e1-d41a-dcf3-657231b8015d.png)
Docker HubでAutomated Buildを設定する

# はじめに
本記事は、Docker HubのAutomated Buildを使用して、GitHubで管理するDockerfileと連携を行い、自動でイメージをビルドする手順について記載しています。（※）本記事執筆時点（2019.3）のDocker Hubに対応

![docker_Automated Build.png](https://qiita-image-store.s3.amazonaws.com/0/221759/e1deb962-bf0d-ae29-89f2-2ef4f08d0c47.png)

**Automated Buildを設定することで、GitHubにDockerfileをpushすると、自動でイメージのビルドが行われます。**

## Automated Buildの設定
Automated Buildを行うにあたり、必要な設定は以下になります。
Dockerfileは、ソースコードと同じ手順でレポジトリを作成して公開します。

- GitHubの設定
- Docker Hubの設定

### GitHubの設定
1. Docker Hubにログインを行い、画面右の自分のDockerID▼より、[Account Settings]をクリックします。
![スクリーンショット 2019-03-19 00.25.12.png](https://qiita-image-store.s3.amazonaws.com/0/221759/f10cde2d-2153-c305-5cfd-30168687573d.png)

2. Linked AccountsのGitHubより、[Connect provider]を有効にします。
![スクリーンショット 2019-03-19 00.28.17.png](https://qiita-image-store.s3.amazonaws.com/0/221759/d18abf7b-e9cb-bed1-f25b-fc8d2a5df9d5.png)


### Docker Hubの設定
1. 画面上のRepositoriesより、画面右の[Create Repository+]ボタンをクリックします。
![スクリーンショット 2019-03-19 00.33.43.png](https://qiita-image-store.s3.amazonaws.com/0/221759/064ad217-e115-f182-7b6c-2155c4be6129.png)

2. [Name]と[Description]を入力します。
![スクリーンショット 2019-03-19 00.44.52.png](https://qiita-image-store.s3.amazonaws.com/0/221759/dc5b1a18-d4c2-4f4b-b742-f7f9f48b204b.png)

3. Build Settings (optional)の[Select organization]から、自分のDockerIDを選択し、[Select repository]はDockerfileのあるGitHubレポジトリを選択します。最後に[Create]ボタンをクリックします。
![スクリーンショット 2019-03-19 00.47.56.png](https://qiita-image-store.s3.amazonaws.com/0/221759/0dc514c9-6ddf-045e-7f8d-ca85b981a3bd.png)

4. レポジトリ作成後、レポジトリ画面に遷移するので[Builds]をクリックします。
![スクリーンショット 2019-03-19 00.48.40.png](https://qiita-image-store.s3.amazonaws.com/0/221759/5250dffa-6ae0-122a-811b-1870ffdaf6ff.png)

5. [Trigger]をクリックすると、GitHubのDockerfileをもとに、イメージが作成されます。なお、イメージの作成には、数分程度かかります。
![スクリーンショット 2019-03-19 01.00.55.png](https://qiita-image-store.s3.amazonaws.com/0/221759/04095c58-b178-ec9a-259b-1a606d9ed5b1.png)

6. ビルド完了後（Build StatusがSUCCESS）、レポジトリ画面の[Public View]ボタンを押して、DockerfileよりビルドしたDockerfileが確認できます。
![スクリーンショット 2019-03-19 01.19.12.png](https://qiita-image-store.s3.amazonaws.com/0/221759/c2b50ef5-b77c-e8c9-4ed9-51a11a4d3a39.png)

7. 以降は、GitHubのDockerfileが更新されると、自動でビルドが行われます。

# おわりに
ユーティリティ環境変数、フック、ビルドフェーズの上書きなど、自動ビルドをカスタマイズするための追加の高度なオプションがあります。詳細については、以下の参考を参照。

## 参考
- [Set up Automated builds](https://docs.docker.com/docker-hub/builds/)
- [Advanced options for Autobuild and Autotest](https://docs.docker.com/docker-hub/builds/advanced/)
ファイル、フォルダ名の一括変換がうまくいかないとき

bashでrenameを使うとき、ファイル（フォルダ）名の指定にワイルドカードがうまく使えなくて苦戦したので、代替のコードを記載しておく。

###何らかの区切り文字がある場合
この例では「XY_Z」と区切られたフォルダ名であるとして、
Yがランダムであるためワイルドカードなどで指定する必要があるとする。

XY_Z → Z
に変更したい。

```ruby:
for i in $(ls -d [X*Z]);
do
  a=$(ls -d ${i} | cut -f 2 -d "_")
  mv ${i} ${a}
done
```
Android開発者登録方法 2020年最新版 かんたんな方法

##Android開発者登録方法 2020最新版

Androidアプリの公開にはGoogleへのデベロッパー登録が必要となる。
2019年に入って少し登録方法が変更となったようなので登録方法を紹介する。
入口から入ると迷路となる場合があるので、直接行けるページでスピーディーに登録しよう。
登録には登録金として25ドルとそれを支払うクレジットカードが必要となる。

---
###登録条件
**1. Googleアカウントを保持していること
2. 年齢が18歳以上であること
3. 25ドルの登録金を支払えるクレジットカード
（*VISA・Master・JCB・DISCOVERのみとなります*）**


---
#ステップ１ Andoroidデベロッパーコンソール起動ページを開く

https://developer.android.com/distribute へアクセス。
アクセスしたら、黄色いマーカーで囲った**PLAY CONSOLE を起動**をクリック

![play.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/dd77e668-ecce-9593-8b60-6720f2f4973c.png)


#ステップ2 確認ページで登録アカウントと規約を確認
遷移先のページでは登録するアカウントが表示され、規約などの同意画面が表示される。
登録するアカウントが正しいか確認し、正しくなければアカウントを切り替えてください。
同時ログインはできないため、一旦ログアウトしてから再ログインでページを開きなおすことができます。

![android2.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/b89d8f9e-b02f-aab2-d243-c8dfa2016708.png)

問題が無ければ、ページ左下の黄マーカーで囲んだ規約に同意して**支払いに進む**ボタンを押します。

#ステップ3 支払い画面
![android5.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/ef1f2e64-c0ce-585f-fcd4-6c3e256469be.png)

Googleアカウントにクレジットカードを登録済みの場合、直接支払い画面になります。
問題が無ければそのまま支払を行って問題ございません。
![android3.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/d68b27df-817a-606d-bd80-c29cba93bde6.png)


クレジットカードをまだ登録していない場合は以下のクレジットカード入力画面が出てきますので、
登録するクレジットカード番号情報を入力して下さい。
![android4.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/730d3d6c-e1fc-d66d-a639-44a985d04304.png)

購入ボタンを押すとデベロッパー プロフィールへ移動することが可能だ。
![andoroid6.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/c10fc982-013d-575d-9793-e5cfe4cdc94e.png)

#ステップ4 デベロッパー プロフィール入力ページ

ここではデベロッパーの情報を登録することになる。後で変更も可能だが変更審査に時間がかかる場合があるので、
前もって決めておこう。

##入力が必要な項目

**1. デベロッパー名**

     50文字以内で設定してください。デベロッパー名はアプリ名の下に表示されます。
     デベロッパー名を変更するにはGoogle の審査が必要。この審査には 7 日ほどかかることがあります。
**2. メールアドレス**
**3. ウェブサイト(任意)**
**4. 電話番号**

     電話番号は、公開されたアプリで問題が発生した場合に、
     Google から連絡を取るためのものになります。 電話番号にはプラス記号、国番号、市外局番を含める必要アリ。
     例 03-3456-7890の場合
     +81-33456-7890という風に入力しよう。```

#Android開発者登録完了

お疲れさまでした。これにてAndroid開発者登録は完了です。
自動的に以下の画面に遷移して、アプリの公開準備に進めます。
![android7.PNG](https://qiita-image-store.s3.amazonaws.com/0/150720/bb776f49-fa2c-7f8c-5073-c3e89c81cb97.png)


#有料課金アプリを販売したい方は次のステップも必要
販売者情報を登録する必要ががあります。かんたんに登録できるので時間があれば一緒に行いましょう。
以下の記事で解説しています。

[Android有料課金アプリ販売登録方法 - 初心者向け](https://qiita.com/QRES/items/66226f2fb452f8a209a2)
Qiitaからスパム記事を抹消する方法

# 今日の1日トレンドにスパムが発生していた

![20190318_210202000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/213065/c0cb5f4b-f822-47f2-9429-ed76cf3bca72.jpeg)

---

まずこちらが今日(2019年3月19日)の朝のトレンド記事。
見事にスパムが占領していた。(※トレンドに入っているアイコンがないアカウントの記事は全てスパムだと思われる)
※【追記】2019年3月19日午前8:50頃に確認したところトレンドのスパム記事が消えていました。
(今のところトレンドに入っているスパム記事は8件だが、被害が増えれば30件全てスパム記事になるのではないかと危惧している)

Qiitaのトレンドを毎日楽しみにしているわたしにとってはこれはあまりにも胸糞悪いので、Qiita運営さんにはスパム対策を頑張ってもらいたい。

ということでわたしたちQiitaユーザが出来る範囲でスパムを消す方法を書く。

---

# 記事の報告

![20190318_210209000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/213065/4db0a859-e097-e46a-1c3e-e756ec2125b0.jpeg)

---

まず、スパムだと思われる記事を開く。
決して記事に書かれているURLは開かないように注意(と言われると開きたくなるのが人間である)。

---

![20190318_210212000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/213065/8b1fc250-3216-bec0-aba0-ccb436c3885c.jpeg)

---

画面右上にある**「…」マーク**を押すとメニューが開くので**"問題がある記事を報告する"**を押す。

---

![20190318_210218000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/213065/cef7a61f-ed56-a9b3-2905-bbd50db7d61f.jpeg)

---

選択ボタンが表示されるので、一番上の**"スパムです"**を選択し、**"送信"**を押す。

---

![20190318_210224000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/213065/4cc99f25-3d0f-f8da-1dcd-eadcc31b9a62.jpeg)

---

**"ご意見ありがとうございました。"**と表示されれば報告は完了です。

### より有効な対策方法や疑問点等があればコメントにてお願いします。
とあるエンジニアの問題意識 2019-03-18


# はじめてLinuxでWebサーバー構築した時、1ヶ月ぐらい右も左も分からずに、寝食も忘れて、人生で最大のモチベーションを持ち、新しい世界に飛び込み、ひたすらに書籍を読んだり、コンソールを叩いたりしていた、懐かしい日。
エンジニア <https://t.co/kRRWDHHaIh>。 
# 「業務ドメインの理解」をやさしくいうと、わけのわからない日本語の翻訳と言えるかもしれない。

エンジニア <https://t.co/EjfWUoID1I>

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/816








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
どうしてもゲームプログラマになりたい人へ＃０３

##記述する動機
私、とある専門学校でPGを教えています。はや10年。
いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、全て実例です。学校名は秘密！！

##フロント編（2019で考える）
方針
C++をバリバリ書けるのがやはり理想。Cはもういいかと
その上で
コンシュマー開発に向けて
VC++ + DirectX or VC# + DirectXで3Dプログラミング Winだけ。DirectXはその名称通りDirectなのだ（そりゃそうか）
unity,ueは時間的問題で難しいと思います。プログラム以外の作業量が半端では無いです。なめたらいかんぜよ。

##よーく読んで欲しい
ゲーム市場は常にシフトしています。2019/03/18時点の私見ですが、王道であるコンシュマーで勝負しましょう。みなさんご存知だとは思いますが、ソーシャルメインは辛いと思います。
コンシュマーで勝負して受からんぐらいなら、潔く他の職業プログラムやったほうが良いと思う。どうせ長持ちしない。ここは大事な話。よくよく考えてみて欲しい。（くどくてごめん）

##環境
Win環境 VC++ + DirectX or VC# + DirectXで3Dプログラミング
自作の3Dエンジン本体（みたいなもの）まで作る意欲、実力があれば評価されると思います。専門学校を選ぶなら、ここをどこまで学べるか確認した方が良いです。つまり設計まで身につけることができるか？ぜひ学校関係者に詳しい説明を求めましょう。きちんとした説明があれば良いのでは無いでしょうか？誤魔化すようならダメよ！！学費、時間の無駄。

標準c,c++環境
VS(VC#)+DirectX
Unix,Linux（仮想環境を含む）でc++
テストレビュー

レビューポイント
　☑　テストのゴールが明確になっていること
　☑　テスト種類が適切に選択されていること
　☑　テストケースが網羅的に用意されていること
　☑　テストケースを他者が読んで実施・検証できる分かりやすさであること
　☑　UAT/本番環境と比較しての制約事項が明確になっていること
　☑　実施結果（エビデンス）はテストケース（条件/入力/テスト対象/結果）とおりに実施していることが分かること

テスト種類
　・修正テスト
　・デグレテスト
　・リグレッションテスト
　・負荷テスト
　・シナリオテスト
　・いじわるテスト
　・０件テスト

テストケース（基本）
　・条件
　・入力
　・テスト対象
　・想定結果
　・結果

テストケース（網羅性）
　・条件分岐
　・正常系／異常系
　・境界値
コマンド1つで競プロコンテストの予定一覧を取得

# 要約
競プロのコンテストの予定をいちいちwebサイトに行って確認するのが面倒なのでコマンド化しました。コードは1行も書いてなくて既存のものを組み合わせただけです。

# 環境
Ubuntu 18.04
Anaconda 4.6.8
Python 3.7.1

# 手順
まず[Competitive Programming Contests Calender](https://competitiveprogramming.info/calendar)にアクセスし、右下のボタンで自分のGoogleカレンダーに追加。

Googleカレンダーにアクセスし、設定ページから追加したカレンダーのカレンダーIDをメモしておきましょう。

次にGoogleCalenderAPIからデータを取得します。
GoogleCalenderAPIの[Python QuickStart](https://developers.google.com/calendar/quickstart/python)に従って進めていきます。

Step1ではAPIkeyをダウンロードします。jsonファイルを.pyファイルと同じフォルダにダウンロードします。

Step2では以下のコマンドを実行して必要なパッケージをインストールします。

```python
pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
```
Step3で書かれているコードをまるごとコピーして新規ファイル(calender.pyとか適当に名前をつけて)に貼り付けます。このとき変数のcalenderIdを'primary'から先程メモしたカレンダーIDに書き換えてください。また、'credentials.json'に相対パスでも絶対パスでもいいので付け加えてください。

この時点で

```python
python calender.py
```

を実行するとWebブラウザで認証画面が開き、認証するとコンテストの予定が表示されると思います。

```
Getting the upcoming 10 events
2019-03-15T22:00:00+09:00 [topcoder] Quantum Computing Series - MM
2019-03-16T10:00:00+09:00 [topcoder] MM 109 (10-Day)
2019-03-19T23:35:00+09:00 [Codeforces] #547 (Div. 3)
2019-03-21T00:00:00+09:00 [topcoder] SRM 753
2019-03-21 [topcoder] Geolocation Algo Challenge
2019-03-21T01:05:00+09:00 [CSA] FII Code #3
2019-03-22T00:35:00+09:00 [Codeforces] #548 (Div. 2)
2019-03-22T21:20:00+09:00 [yukicoder] #208
2019-03-23T00:05:00+09:00 [Codeforces] Educational #62 (Rated for Div. 2)
2019-03-23T13:00:00+09:00 [AtCoder] CADDi 2019 (Japanese)
```

ここまでで十分な方はこれでOKです。

更に単一コマンド化したかったのでそれを行うパッケージを

```
pip3 install pyinstall
```

でインストールします。
インストールできたら以下のコマンドを実行します。

```
pyinstaller calender.py --onefile --hidden-import googleapiclient
```

するとdistディレクトリが生成されて、中にcalenderファイルができます。
これを実行すると先程と同じ結果が得られます。

このファイルのpathを~/.bashrcにaliasで書いておけばどこにいてもコマンド一つでコンテストの予定を見ることができます。

```
alias calender="~/dist/calender"
```
Amazon APIで503エラーになる理由


#出たエラー

HTTP Response: 503 Service Unavailable - AWS Access Key ID: XXXXXXXXXXXXXXX. You are submitting requests too quickly. Please retry your requests at a slower rate.

1回も成功してないリクエストが早すぎ（多すぎ）な訳が無いでしょ……という


#原因

2019年01月23日以降のAPI側、Amazon側の仕様変更。

「直近30日で売上実績が無い場合にProduct Advertising API（PA-API）をコールしてもエラーメッセージが返却されるようになります」とのこと。

Amazonアソシエイト・ヘルプ
https://affiliate.amazon.co.jp/help/topic/t52


#一応環境

Ruby on Rails 5.2.2
gem 'amazon-ecs'


#対応策

売上実績を作ればいいらしい


#やってみた結果

とりあえずKindleの0円本では売上にならずダメでした。

次に、Kindle本を1冊友人に買ってもらって売上実績出たのにまだリンクタイプレポートにPA-APIが出てこない……。

#問い合わせた結果


>Amazon.co.jpアソシエイト・プログラムにお問い合わせいただき、ありがとうございます。

>確認したところ、以下の点を確認いたしました。

>-2013年参加以降、売上実績がほとんどなく、ここ最近の売り上げも多いとは言えない状態
>-http://XXXXXXXXXX.blog.fc2.com/も更新はされておらず、活動している様子が全く見られない(念のためのご案内となりますが、未承認サイトでの活動はお断りしておりますし、リンクを使っているサイトはすべてメールで事前申告しなければなりません)

>2019年1月23日により、PA-APIより取得したリンク経由で売上実績を発生させることが、PA-APIへのアクセス維持のための必要条件となりました。

>https://affiliate.amazon.co.jp/help/topic/t52/

>現状のシステムでは、十分な売上実績を継続的に上げ続けることがPA-API利用のための条件になるものとお考え下さい。

>よって、まずは、PA-APIではなく、通常のリンクをご利用のうえ、十分な売上実績を積んでいただくようお願いします。

>なお、PA-APIはリンクの一種であり、必ずしも使用しなければならないというものではございません。

>売上実績が多くはなく、PA-APIを使用できないのであれば、下記のアソシエイトツールバーの利用への移行を検討願います。

>https://affiliate.amazon.co.jp/home/textlink/sitestripe?ac-ms-src=ac-nav

>その他にもご不明な点がございましたら、ご遠慮なくお問い合わせください。
アソシエイト・プログラムをご利用いただき、ありがとうございます。

>Amazon.co.jp カスタマーサービス　アソシエイト・プログラムスタッフ
ご利用ありがとうございました。


Fxxxxxxxxxxxxxxxxxxxxxxxxxxxxck!!!!!!!!!!!!!!!!!!!!!!!!!!!!

😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡

ちくしょうめ！！！！！！！！！！！！！

現在は「十分な売上実績ってなんだよ」で再度問い合わせした所です

↓

来た返信

>なお、具体的どのくらいの売上実勢が必要であるかは公開しておりませんことをご了承くださいますようお願いいたします。

うーん、この


#オマケ

AWS_access_key_id
AWS_secret_key

これAWSから取れみたいな感じしますけど、アソシエイト登録しておけばそっちから取得してもいいみたいですね。
無駄にAWS登録しちゃいましたよ……。

アソシエイトタグ、アフィリエイトIDみたいなのもどっちにしろ必要になるだろうし、アソシエイトだけ登録しておけば良かったんじゃないの感あります。
RPAにおける要求事項の引出し

RPA化のメリット
・単純作業を自動化し、人はクリエイティブなことに時間を割くことができる。
・小規模な開発を行うことができる。

RPA化の注意事項（基本編）
・RPAは覚えさせたことしかできない（AIのように学習はしない）
・RPAはルール化されていない作業は得意ではない
・RPAは作業頻度、作業反復数、自動化率を掛け合わせて相当数にならないと、効果は表れない
・RPAは作り込みが過ぎると開発工数が増大し、保守が難しくなり、RPA化のメリットが小さくなる

RPA化の注意事項（障害編）
・RPA障害による事務ミスリスクを防ぐために、人によるコントロールを適切なタイミングで配置すること
・事務ミスリスク（可能性/影響規模）の大きい処理はRPAに実行させないこと
・障害時に、担当者によるリカバリーが可能となるよう体制を整えておくこと
・RPAを完全に信用してはいけない。
　－人が誤った情報を入力すれば、誤った情報を出力したり、異常終了したり。
　－利用アプリケーションのUIが変われば、RPAは画面を認識できず異常終了したり。
　－取得するエクセルの項目が変われば、RPAは情報を正しく認識できず異常終了したり、誤った結果を出力したり。

RPA化の要求事項の引出し
・RPA化の動機と期待していることを聞き、要件定義に取込み、ユーザー満足度を高める
・RPAが得意な作業、不得意な作業を説明し、要件定義の前提を理解してもらう
・削減効果と開発規模/容易さどちらも基準を満たし、ユーザー/IT双方がWIN-WINの関係をつくる
・障害/事務ミスの責任の所在を説明して理解してもらい、事務ミスを防止するためのコントロールの設置をユーザーと検討する
JuliaのDebugger

~~後で書き足すかもしれませんが、~~とりあえず報告です。（追記しました）

つい先日、[Debugger.jl](https://github.com/JuliaDebug/Debugger.jl)がリリースされました。
ステップ実行、ブレークポイント（条件付きブレークポイントも使えます）、ウォッチリスト、デバッグ中のコンテキストでの任意コマンド実行、等の通常のデバッグに必要と思われる機能を網羅しています。

現在は、REPL上でのコマンドラインデバッグしかできませんが、Juno等でのIDE側での対応を目指した作業も進んでいます。[これ](https://github.com/JunoLab/Juno.jl/issues/257)とか[これ](https://github.com/JunoLab/Atom.jl/pull/138)とか。
近いうちに、IDEでのデバッグもできるようになるでしょう。

Juliaを人に勧めるうえでの最大の障害といってよかったDebuggerがないという問題が解消されます。

---
追記。

# 使い方の簡単な説明

## インストール
REPL上で`]`を押して、PKGモードに入って、

```julia
(v1.1) pkg> add https://github.com/JuliaDebug/Debugger.jl
(v1.1) pkg> add JuliaInterpreter
```
でインストール

## 使い方
例として

```julia
julia> function foo(n)
           x = n+1
           ((BigInt[1 1; 1 0])^x)[2,1]
       end
foo (generic function with 1 method)
```
という関数をデバッグしたいとします。

まず、

```julia
julia> using Debugger, JuliaInterpreter
```
しておいて、

```julia
julia> @enter foo(20)
In foo(n) at REPL[1]
>2      x = n+1
 3      ((BigInt[1 1; 1 0])^x)[2,1]
 4  end

About to run: (+)(20, 1)
1|debug>
```
のように、`@enter`マクロで`foo`を呼び出せば、関数の最初の行でとまります。
ここで、例えば、`n`と押せばステップ実行できます。使えるコマンド一覧は、`?`と押せば表示されます。

```julia
1|debug> ?
  Basic Commands:
  - st: show the status
  - n: step to the next line
  - s: step into the next call
  - so: step out of the current call
  - c: continue execution until a breakpoint is hit
  - bt: show a simple backtrace
  - `stuff: run stuff in the current function's context
  - fr [v::Int]: show all variables in the current frame, v defaults to 1
  - f [n::Int]: go to the n-th frame
  - w
   - w add expr: add an expression to the watch list
   - w: show all watch expressions evaluated in the current function's context
   - w rm [i::Int]: remove all or the i:th watch expression
  - q: quit the debugger, returning nothing
  Advanced commands:
  - nc: step to the next call
  - se: step one expression step
  - si: same as se but step into a call if a call is the next expression
  - sg: step into a generated function
```

とくに、`` ` ``と押すと、プロンプトが変わって、デバッグ中のコンテキストで任意のコマンドを実行できます。
変数の中身を表示したり、

```julia
1|julia> n
20
```

変数を書き換えたり。

```julia
1|julia> n=15
15
```

### ブレークポイント

ブレークポイントは、JuliaInterpreter.jlを使って設定します。[公式ドキュメント](https://juliadebug.github.io/JuliaInterpreter.jl/latest/dev_reference/#Breakpoints-1)
例えば、

```julia
julia> breakpoint(foo, Tuple{Int}, 3)
```
とすれば、`foo(::Int)`メソッドの3行目にブレークポイントが設定されます。
`@run`マクロで`foo`を呼び出せば、ブレークポイントでとまります。

```julia
julia> @run foo(20)
Hit breakpoint: foo(n) at REPL[1], line 3
In foo(n) at REPL[1]
 2      x = n+1
>3      ((BigInt[1 1; 1 0])^x)[2,1]
 4  end

About to run: (tuple)(2, 2)
1|debug>
```

ファイル上の特定の場所にブレークポイントを設定することもできます。

```julia
julia> breakpoint(filename, line)
julia> breakpoint(filename, line, condition)
```


条件付きブレークポイントとかは、[公式ドキュメント](https://juliadebug.github.io/JuliaInterpreter.jl/latest/dev_reference/#Breakpoints-1)を見てください。
gem bcrypt を使ってパスワードを安全に保存するために知っておきたいこと

下記の記事を見て、改めてパスワード保存の安全性について勉強しようと思ったので、簡潔にまとめます。
[【bcrypt】ユーザーパスワードを本当に安全に保存する方法](https://liginc.co.jp/377191)

##パスワード保存の安全性確保について

### 1. パスワードのハッシュ化
パスワードを何の加工もせずにデータベースに保管するのは、非常に危険なので、ハッシュ関数で違う文字列に変更して保存します。

ここで言うハッシュ関数とは、
・ 暗号化すると元に戻せない変換
・ 同じ値を関数に通すと同じハッシュ値が得られる
・ 称号する時は、この結果の値を照合する
という性質を持っています。

### 2. ソルトの追加
ハッシュ関数は、 **同じ値を関数に通すと同じハッシュ値が得られる**という性質を持っています。
ということは、総当たり攻撃で時間をかければ同じハッシュ値が得られ、元のパスワードを見つけ出せる可能性があります。

パスワードを十分長くしておけば、元のパスワードの算出に時間がかかるため耐える事が可能ですが、全てのユーザーに非常に長いパスワードを入力させる事は現実的ではありません。

そこで、ソルトと呼ばれるランダムな文字列をユーザーが入力したパスワードにくっ付けて暗号化します。こうする事で、十分長いパスワードを保証する事が出来、解読される可能性を低くする事が出来ます。

### 3. ストレッチング

ソルトを付与して暗号化したとは言っても攻撃側が膨大な時間をかければ、解読される可能性はあります。
なので、ハッシュ関数を数千回通して、非常に複雑で解読に時間をかけせる嫌がらせを行います。
これをストレッチングといいます。

## bcrypt導入準備
これら3つを踏まえたbcryptoというアルゴリズムがあります。今回は、gemのbcryptoを使用しながら安全なパスワード保存を試してみましょう。

まず、Gemfileにbcryptを追加します。

```rb
gem 'bcrypt'
```

追加したらbundle install

```
bundle install
```

パスワード暗号化を試すためにUser modelを作ります。
パスワードを保存するカラムは```password_digest```にして下さい。後で説明するメソッドの仕様で、```password_digest```にしておく必要があります。

```rb
rails g model User name:string email:string password_digest:string
```
モデルが出来たら、マイグレートしましょう。

```rb
rake db:migrate
```

user.rbに次の```has_secure_password```を記述して下さい。これは、bcryptをbundle installすると使用可能になるメソッドで、password_digestに暗号化したパスワードを保存してくれるものです。

```rb
class User < ApplicationRecord
  has_secure_password
end
```

## bcryptを使ってみる

導入出来たところで、パスワードの暗号化保存を使ってみましょう。
rails consoleを開いて下さい。

```rb
rails console
```

下記のようにuserデータを作成しましょう。
ここでhas_secure_passwordメソッドにより、passwordの文字列が暗号化されてpassword_digestに保存されます。

```rb
User.create(name: 'name', email: 'test@email.com', password: 'password')
```

createするとrails consoleの画面に作られたデータが表示されると思いますが、password_digestに下記のように暗号化された文字列が入っていればOKです。

```rb
password_digest: "$2a$10$BUD6HR0ljHwVR.2bElaTZugMvrjCFj9HpQxjh8GUzTG..."
```

何気なく使っていた暗号化ですが、まとめてみると理解が深まった気がします。
ユーザーのパスワードは、安全に保管しましょう。
gitのコミッター設定をフォルダによって使い分ける

皆さん、git使ってますか？
業務で使ってますか？個人開発で使ってますか？

業務のリポジトリには会社の名前とアドレス、個人開発のリポジトリには個人アカウントとアドレスのように
リポジトリによって、gitのコミッターを使い分ける必要があること、多いですよね。

これ、毎回リポジトリによってgit configで設定するのが消耗するのと、
設定し忘れたりすることが多いので、フォルダごとに**自動的に**コミッター設定を切り替えられるようにしました。

## まず最初に
今回は業務用のリポジトリ一覧が格納されてるフォルダを 
`~/work/`
個人開発用リポジトリ一覧が格納されてるフォルダを
`~/private/`
として話をします

## 業務用のコミッター設定

```
$ echo "[user]
name = work_user_name
email = work_email@work.com
" >> ./gitconfig_work
```

で、業務用で使うユーザ、emailアドレスの設定ファイルを作ります。
name、emailの値は自分の設定に置き換えてください

## 個人開発用のコミッター設定

同様に個人用も作成

```
$ echo "[user]
name = private_user_name
email = private_email@work.com
" >> ./gitconfig_private
```

## 特定のフォルダによって使い分けるようにする
`git config --global -e`
でグローバル設定を開きます

特に何も設定されていなければ

```
[user]
    name = hoge
    email = hoge@fuga.com

[core]
・・・
```

のような感じになっていると思います。
これを

```
[user]
    name = hoge
    email = hoge@fuga.com

[includeIf "gitdir:~/work/"]
 path = ~/.gitconfig_work

[includeIf "gitdir:~/private/"]
 path = ~/.gitconfig_private

[core]
・・・
```

のように追記します。

なんのことはなく、
ローカルリポジトリのパスがgitdir:XxxxのXxxxに含まれていたら、 
pathの値に設定しているgitのUserの値を使うようにすることができます。

## 試しに
`cd ~/work/hoge_repos/; git config user.name`
とやれば
`work_user_name`

`cd ~/private/fuga_repos/; git config user.name`
とやれば
`private_user_name`
のようにフォルダによって自動的にコミッターの設定が切り替えられるのが確認できると思います。

これでコミット時に「やべ」とならずに済みますね