OmniAICreator/Qiita-1.07M huggingface dataset:
基本的なformの作成の仕方

「form_for @hoge」でcreateとupdateを自動で認識してくれる
formのセレクトボックスなどは

http://railsdoc.com/form#%E3%83%A9%E3%82%B8%E3%82%AA%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9(radio_button)

を参照。


```ruby:qiita.rb
<%= form_for @listing do |f| %>
  <p><%= f.label "お家の種類" %>
  <%= f.select :home_type, [["一軒家","一軒家"], ["マンション","マンション"], ["アパート","アパート"]], 
　　　{prompt:"選択してください"}, {required: 'true', autofocus: 'true', class: 'form-control'} %>
  
  <p><%= f.label "ペットの種類" %>
  <%= f.select :pet_type, [["犬","犬"], ["猫","猫"], ["鳥類","鳥類"], ["爬虫類","爬虫類"], ["魚類","魚類"], ["両生類","両生類"], ["その他","その他"]], 
  {prompt:"選択してください"}, {required: 'true', autofocus: 'true'} %>
  
  <p><%= f.label "ペットの飼育歴" %>
  <%= f.select :breeding_years, [["1年",1], ["2年",2], ["3年",3], ["4年",4], ["5年",5], ["6年以上",6]], {prompt:"選択してください"}, 
  {required: 'true', autofocus: 'true'} %>
  
  <p><%= f.label "ペットのサイズ" %>
  <%= f.select :pet_size, [["小型","小型"], ["中型","中型"], ["大型","大型"], ["超大型","超大型"]], {prompt:"選択してください"}, 
  {required: 'true', autofocus: 'true', class: 'form-control'} %>
  
  <p><%= f.submit "保存" %>
<% end %>
```

コントローラーは以下のように編集。ストロングパラメーターの指定も忘れない


```ruby:qiita.rb
　　　　def new
    @listing = current_user.listings.new
  end

  def create
    @listing = current_user.listings.new(listing_params)
    if @listing.save
      redirect_to edit_listing_path(@listing),notice:"リスティングを作成・保存しました"
    else 
      render new_listing_path(@listing),notice:"リスティングを作成・保存できませんでした"
    end
  end
　　　：
　　　：
　　　：
　　private
    def listing_params
      params.require(:listing).permit(:home_type,:pet_type,:pet_size,:breeding_years)
    end
```
Firebase Remote ConfigのiOSへの導入

#何ができるか
FirebaseスイートにはRealtime DBやCloud Messaging、Analyticsなど便利な機能が用意されていますが、Firebase Remote Configもその一つで、無料でアプリのABテストが実施できるパワフルなサービスですよね。(QiitaのタグにRealtimeDatabaseやCloudMessagingがあるのに、RemoteConfigがないのが残念だったので、作りました。)

Firebase Remote Configを使うと、無料で、サーバレスで、アプリのABテストを(プロダクション環境でも)行うことができます。iOS/ Androidの両方で利用可能です。

# 考え方
デフォルトの設定値をアプリに内蔵させておき、一方で、Firebaseサーバ上の値をフェッチして反映できればその値を使って設定値を動的に書き換えてくれます。
Firebaseサーバ上の値は、比較的フレンドリーなwebコンソールから操作できます。

# 基本的な実装手順

おおむね、[この公式日本語記事](https://firebase.google.com/docs/remote-config/use-config-ios?hl=ja)が全てです。この通りにやれば終わります。

ただし、現時点(FirebaseRemoteConfig 2.1.1)では、日本語版の説明が若干古いので、[英語記事](https://firebase.google.com/docs/remote-config/use-config-ios?hl=en)で最新仕様を確認する必要があります。

# 読み替えが必要だった点

日本語ドキュメントのAPIのサンプルが古い。置き換えは以下のとおり。

```old.swift
self.remoteConfig = FIRRemoteConfig.remoteConfig()
```

```new.swift
self.remoteConfig = RemoteConfig.remoteConfig()
```

クラス名の接頭辞がなくなったというだけですね。リファレンスの通りにやって解決できないと焦りますが、英語リファレンスを確認しましょう。

そのうち、日本版リファレンスも刷新されると思います。

# キャッシュ
Firebaseはアプリ側で値をキャッシュすることが原則で、  `fetch(completionHandler: RemoteConfigFetchCompletion? = nil)`を使うと、12時間はキャッシュされた値が利用されるようです。その間はFirebaseサーバ値を変更しても即時反映されません。通常、それほど機動的に設定値の切り替えをする必要がないと思うので、こちらで問題ないはずです。

即時反映を行うには、`fetch(withExpirationDuration expirationDuration: TimeInterval, completionHandler: RemoteConfigFetchCompletion? = nil)`のほうを使います。 `expirationDuration: 0` にすれば、即時に切り替えが反映できます。ただし、1時間に5回までです。

関連記事:
[Firebase Remote Configのキャッシュにおけるキモ](https://qiita.com/hinom77/items/185fd4d2abde370a90c7)
Facebook の Graph API で user token を取得する

次のページを参考にしました。
[[Facebook Graph API]無期限のアクセストークンの取得方法](https://qiita.com/xiushu53/items/f2d699704d7325d02169)

app_id, app_secret, redirect_uri が必要です。
redirect_uri は、
https://developers.facebook.com　で、アプリを表示して確認が出来ます。
設定 -> ベーシック -> アプリドメイン
![token_feb2001.png](https://qiita-image-store.s3.amazonaws.com/0/179446/1807d662-830f-6b53-5b8e-9254eec18ea0.png)

もし、まだ設定していなかったら、まず、
設定 -> ベーシック -> ウェブサイト -> サイトURL
に、入力すれば、アプリドメインに入力が出来ます。
![token_feb2002.png](https://qiita-image-store.s3.amazonaws.com/0/179446/f014c2a1-1f0f-8b27-2ead-0d29ca7bfb25.png)

１）　ブラウザーで次のURI にアクセスします。
　　　client_id と、redirect_uri は変更して下さい。

```text
https://www.facebook.com/dialog/oauth?client_id=359403267812345&redirect_uri=htt
ps://ekzemplaro.org
```

ブラウザーのアドレスバーに code が表示されます。
![token_feb2003.png](https://qiita-image-store.s3.amazonaws.com/0/179446/a07aa00f-2e6a-6ec6-090b-40dad9968a08.png)

２）次のようなスクリプトを実行して、user_token を得ます

```bash:get_user_token.sh
#
#	get_user_token.sh
#
#		for ekzemplaro
#
#							Feb/20/2018
#
APP_ID="359403267812345"
APP_SECRET="ad181a19b1bd9cce695e4b4970******"
REDIRECT_URI="https://ekzemplaro.org/"
URI="https://graph.facebook.com/oauth/access_token"
#
CODE="A12345678912456011MlPXU8bz2BNBrt3Kb4FYQzPmje9umlP9QCT1rvYl3jrnEkzqN7cXhBucURpYllwxRkvjrXq4MOFRTGxAzeUCptiTn9dQXkE37nBoFklJzRQ0oESB4mLZLTFZyRQvpHeunbCrZMf54ICivFb0dLOpturRncnUdx5xKZXkcuNEZEl-20ZhcxADXvZV_5_XEV0nAx4jA3IJDZuArA1q0CU7uYqoRzxosk6vTQXpkppThPEhHNzznBo_nhUAEzKwd5-BwWQlmfgT1IB5olo5_E4v6_uPG-GGddKruxLY4giDdngyHJ123679412XRWCqECvHZVQC8i#_=_"
#
#
curl "$URI?client_id=$APP_ID&redirect_uri=$REDIRECT_URI&client_secret=$APP_SECRET&code=$CODE"
#
```

時間が経ってから、実行すると、

```json
{"error":{"message":"This authorization code has expired.","type":"OAuthException","code":100,"fbtrace_id":"FseyfgwFvTk"}}
```

そうしたら、また code を取るところからやり直しです。

うまく行けば、次のような json が返ってきます。

```json
{
  "access_token": "**************************************************",
  "token_type": "bearer",
  "expires_in": 5176832
}
```
[gitlab-runner] Shell executorが古いファイルの削除ができずfetchに失敗する

一度pushして、テストを行なった後再度テスト行うと以下のようなエラーが発生した。

> Running with gitlab-ci-multi-runner 1.6.1 (c52ad4f)
 Using Shell executor... 
 Running on ubuntu-vm...
 Fetching changes...
 warning: failed to remove dist/app.html
 ...
 ERROR: Build failed: exit status 1

https://gitlab.com/gitlab-org/gitlab-runner/issues/1839 から抜粋した。
↑によると権限の問題でgit cleanができないことが問題らしい。
実際手動で前のテストでcloneされたものを削除したところ正常に実行できた。

実行中のgitlab-runnerのserviceを下記のコマンドで調べてみる。

```
# ps aux | grep gitlab
```

その結果、--user gitlab-runnerとなっており、実際にテストを行う時はgitlab-runnerというuserで実行していることがわかった。
このserviceはregister時にinstallされたものをそのまま使っていた。
一度これを

```
# gitlab-runner uninstall
```

で削除する。その後

```
# gitlab-runner install --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --user root
# gitlab-runner start
```

でuserをrootに指定してinstallし、serviceをstartさせる。

この後再度pushを行なったところ問題なく実行できた。
UbuntuのPythonが何bit版か調べる方法

#コメント欄でもっと良い方法を教えていただきました。

#####実行した環境

　　Ubuntu Studio 17.10

#####参考にしたサイト
KIWAMIDEN　さん
https://kiwamiden.com/examine-the-execution-environment-of-python

#####BIT

~~Windowsと違い~~UbuntuのPythonは何bit版かわかりません。
ネットで検索すると上記のサイトに方法が載っているのですが、上記の記事だけだと実行できませんでした。
Pythonのオンラインドキュメントを調べるとImportが必要みたいです。
これも、Verの違いでしょうか？

```python:bit
$ python
・・・
>>> from struct import *
>>> calcsize(str('P')) * 8
64 
```
courseraの機械学習コースを諦めそうになる前に知っておきたいこと

#はじめに
Qiita界隈で絶賛されているスタンフォード大学のオンライン学習courseraの機械学習コース。先人たちの偉大な投稿を参考に私も期限ギリギリでようやく認定を取得することが出来ました。

・[例の機械学習コースが良いらしいと知りながらも2年間スルーし続けたがやはり良かったという話](https://qiita.com/shu223/items/9e3a50e092c2997fe6d2)
・[数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路](https://qiita.com/daxanya1/items/218f2e3b922142550ef9)
・[機械学習をゼロから1ヵ月間勉強し続けた結果](https://qiita.com/junichiro/items/3457e33e502086a200f1)

<img width="843" alt="スクリーンショット 2018-02-20 16.14.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/cc39a84c-250f-6c92-5409-baab49f08cf1.png">

https://www.coursera.org/account/accomplishments/certificate/K8G564RYG7HH

このコースはcoursera自体の創立者Andrew Ng先生がコンテンツを作っており、大変丁寧に設計された内容になっております。それでも修了までに幾つもの壁があったと感じましたので、それに関してシェアさせて頂きます。

#翻訳の壁
Andrew Ng先生の英語は大変簡潔に話されており、解説も丁寧であるため、ある程度英語の経験がある方なら特に問題なく理解できるかと感じております。が、新しい内容を英語で理解するのに抵抗がある方は必然的に日本語の字幕を頼ることになると思うのですが、こちらの字幕の翻訳はディープラーニングを使っていないのか精度があまり良くありません。

例えばこちらの原文に対して
>In this video, we'll talk about the second major type of machine learning problem, called Unsupervised Learning. 

Coursera付属の翻訳だと
>このビデオでは、二番目に大きな機械学習　問題である「教師なし学習」についてお話します。

google翻訳だと
>このビデオでは、教師なし学習と呼ばれる第2の主要なタイプの機械学習問題について説明します。

どちらが自然な翻訳なのかは一目瞭然かと思います。これの微妙な差分が説明でずっと積み重なっていくのです。
**先生の話している内容がわからないのは実力不足ではなく翻訳精度の責任だという可能性が有ります。日本語の字幕がわからないときは英語の字幕をコピペしてgoogle翻訳にかけてみることをおすすめします。**

#線形代数の壁
ある程度講義が進むと線形代数の概念がたくさん出てきます。私は大学時代1限で眠かったという覚えしかありませんでしたが、今回の講義でようやく線形代数の使用方法がわかりました。線形代数では*A×B≠B×A*の場合がほとんどであったりして、式の意味合いが普通の算数と少し違います。もし、これまで線形代数を学ぶ機会がなかった方にはここだけでも理解するのに少し時間が必要かと思います。先生はココらへんも丁寧にしかし、ものすごいスピードで解説してくれますが、きちんとやるのであれば通常大学の講義で1コマ使うような内容です。目標は機械学習を取得することなので線形代数はある程度わかる前提になっているかと感じております。
**数字の行列が出てきて急に内容がわからなくなっても、それは実力不足ではなく学んでいない数学の分野かもしれません。日本語で素晴らしい解説記事が有りますので参考にしながら進めてみて下さい。**
[線形代数の基礎](https://qiita.com/nognog/items/8279935a96b4ca5dd375)

#MATLAB・Octaveの壁
先人たちも書き残していらっしゃいますが、本コースではプログラミングの課題をMATLABかOctaveの環境で実施する形になっております。先生はこちらのツールも丁寧に高速に解説してくれるので、行列の変換操作が可能になりますが、やはり使いこなすにはある程度の慣れが必要になってきます。MATLAB未経験な筆者にとってはここが本コースの一番のハマリポイントでしたが、中盤のプログラミング課題はにはいくつか機械学習の理解というより、MATLABの行列変換の演習には思えたものが有りました。
**プログラミング課題がうまく進まなくても、それは機械学習への理解ではなくMATLAB操作の問題の可能性が有ります。近くにMATLABが得意な人がいれば教えてもらいましょう。**

こちらの記事にはものすごく助けられました。追記しました。
・[MATLAB-Sample 【基礎】行列操作](https://qiita.com/oicawa/items/95a2f02b771cfc25f8ab)
・[機械学習を1ヵ月で実践レベルにする #6 (Octave 実践編)](https://qiita.com/junichiro/items/7972b1b6ad3d087fbde0)

#孤独の壁
近くに聞ける人がいない場合はオンラインで議論できる場所"Discussion Forum"が用意してあります。
<img width="1064" alt="スクリーンショット 2018-02-20 17.11.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/5bf9cc40-98a2-f2c4-8d83-b9b8f643dcb2.png">
こちらも英語になりますので、英語を読むのが遅い方はガンガンgoogle翻訳を使われるとよいかと思いますが、読んでみるとわかりますように、質問のレベルはそんな高くないです。メンターが頑張って解説をしてくれます。**私は最初これを読んだ時、皆同じところで躓き悩むのだとわかり、けっこう安心できました。質問が出来なくてもいいので是非見ることをおすすめします。**

#時間の壁
最後の先生からの感動的な話の中にもありますが、それなりのコンテンツ量が有りますので、特に仕事の合間に学習するとなると、完了までは継続する力がいります。途中まで進めていて、諦めそうなになってしまった方（私がそうでした）にお伝えしたいのは**最後のコース10と11はプログラミング課題がありません。私的にはコース6−9が一番辛いところでしたので、そこまで差し掛かっている方は絶対に乗り切れるので是非修了してみてください。**

大変勉強になるコンテンツでした。Andrew先生有難うございました。
Processing - 11 - lineと二重forを使った描画(xxxの連続)

<img width="596" alt="スクリーンショット 2018-02-06 18.51.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/45520/49cb9d29-bd0f-b9fd-84d8-e4ce6a1f95ee.png">


```java:
void setup () {
  size (600, 500);
  smooth ();
  background (255);
  strokeWeight (25);
  stroke (0,0,30,200);
  noLoop ();
}

void draw () {
  for (int n = 1; n <= 3; n++) {
    for (int i = 1; i <= 9; i++) {
      line(i*50,       100*n, 150 + (i-1)*50,  100+100*n);
      line(i*50 + 100, 100*n, 50  + (i-1)*50,  100+100*n);
    }
  }
}

```
# バッチファイルでコマンドラインオプション処理を書いてみた

Windows 環境でも bash や powershell やらが使える時代だし batch 卒業記念としてコマンドラインオプション周りの処理を少し真面目に書いてみた。 (バッチ関係のタグ記事が分散してて微妙

```
@echo off
goto :Init

:Version
echo %PROGRAM% Version 0.0.0
exit /b 1

:Help
echo.Usage: %PROGRAM% [Options]
echo.Options
echo.  --HELP,-H,^/? ... this help
echo.  --VERSION    ... out version
echo.  --VERBOSE    ... verbosely
echo.  --DRYRUN     ... dry run
echo.  --DIR DIR    ... excute directory default .
exit /b 1

:Init
setlocal
set "PROGRAM=%~f0"
set "OPTIONS=%*"
set "VERBOSE="
set "DRYRUN="
set "SEPARATOR="
set "THRUOPTIONS="
set "ACTION="
set "DIR=."

:GetOpt
set OPTION=%1
if not defined OPTION goto :GetOptEnd
if defined VERBOSE echo [VERBOSE] GetOpt %1 %2
if %OPTION:~0,1%%OPTION:~-1,1% == "" set OPTION=%OPTION:~1,-1%
call :GetValue %2
if "%OPTION%" == "--VERBOSE" (
    if defined VERBOSE ( shift && goto :GetOpt )
    set "VERBOSE=1"
    echo [VERBOSE] PROGRAM %PROGRAM%
    echo [VERBOSE] OPTIONS %OPTIONS%
    goto :GetOpt
)
if "%OPTION%" == "/?" set "OPTION=--HELP"
if "%OPTION%" == "-H" set "OPTION=--HELP"
if "%OPTION%" == "--HELP" ( set "ACTION=%OPTION%" && shift && goto :GetOpt )
if "%OPTION%" == "--VERSION" ( set "ACTION=%OPTION%" && shift && goto :GetOpt )
if "%OPTION%" == "--DRYRUN" ( set "DRYRUN=1" && shift && goto :GetOpt )
if "%OPTION%" == "--DIR" (
    if not defined VALUE goto :GetOptError 
    set DIR=%VALUE%
    shift
	shift
	goto :GetOpt
)
set THRUOPTIONS=%THRUOPTIONS%%SEPARATOR%%1
set."SEPARATOR= "
shift
goto :GetOpt

:GetValue
set VALUE=%1
if not defined VALUE exit /b
if %VALUE:~0,1%%VALUE:~-1,1% == "" set VALUE=%VALUE:~1,-1%
exit /b

:GetOptError
echo [ERROR] Illegal Option '%OPTION%'
exit /b 1

:GetOptEnd
if defined VERBOSE echo [VERBOSE] THRUOPTION %THRUOPTIONS% 
if defined ACTION if defined VERBOSE echo [VERBOSE] ACTION %ACTION%
if "%ACTION%"=="--VERSION" goto :Version
if "%ACTION%"=="--HELP" goto :Help
call <nul :Main %THRUOPTIONS%
exit /b

:Main
if defined VERBOSE echo ^
[VERBOSE] change directory "%DIR%"
pushd "%DIR%"

if defined DRYRUN echo ^
[MESSAGE] DRYRUN
if not defined DRYRUN echo ^
[MESSAGE] RUN

popd
exit /b
```
FileMaker:ボタンバーツールにスクリプトを仕込む

ファイルメーカーのボタンの上下左右には文字列を入れることができます。
ボタンを複数並べた「ボタンバーツール」というボタンもあり、こちらは文字列にスクリプトを仕込んで表示を変えたりできます

##作ってみた一例
1.ボタンにこんなスクリプトを仕込みます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/c98b6f43-e08d-37e9-a7ab-2acfaa42673d.png)

2.ボタンバーの文字列入れるとろには✐ボタンがあって、つまりこれはスクリプトを入れることができます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/edfffcc1-bb13-e4c2-1220-3af8ec024f3e.png)

3.こんなスクリプトを入れた

```FileMaker:ボタンバー
If ( Get(レコード番号)=Get ( 対象レコード数 ) ; "最初に戻る"; "次の注文" )
```
すると、通常入力した文字列を表示する部分が「計算」となります。
上記スクリプトの場合、現在のレコード番号が対象レコード数と同じ＝対象の最後まで来た。ら、「最初に戻る」と表記が変わるようになっています
Pythonで簡単にFortranのsubroutineを用いる方法

はじめまして。
私はFortran中級者,Python初心者です。Pythonを最近はじめたばかりなのですが、Pythonではうまく書けなかったりする場合が多く、今までに自分の使える言語、Fortranをうまく用いれないかと調べ、この記事を書きました。基本的にはf2pyのサイトに書かれている部分を日本語訳しただけなので、英語を読む力と元気のある方は元のオリジナルのページを読んでください。[参考にしたオリジナルページ](https://sysbio.ioc.ee/projects/f2py2e/)
自分のメモ用という側面もありますので、間違いや言葉足らずな部分があるかもしれませんが、ご了承ください。

Fortranのサブルーチンを用いるにはPythonのNumpyで提供されているf2pyというインターフェースを用います。

まず、f2pyとターミナルから入力し、自分の環境にインストールされているか確認します。
もし、インストールされていなければ、


```bash
pip install python-f2py
```
と入力すると、自分の環境にインストールされる。（pipをインストールしていない方は、先にインストールしてください。）

今回は簡単に、Helloと表示させ、さらに(Python側で)入力した整数の初期値を同時に出力させるサブルーチンを作成することにする。
以下で作成するhello.f90とfromfort.pyは同じディレクトリに入れてください。

```Fortran:hello.f90
subroutine foo (a)
  integer :: a
  write(*,*) "Hello from Fortran!" !ここで文字を出力
  write(*,*) "a=",a !ここで整数を出力
end subroutine foo

```
このsubroutineを


```bash
f2py -c --fcompiler=gfortran -m hello hello.f90
```

としてコンパイルすると、この場合だとhello.soというファイルが生成される。

（※Fortran初心者の方へ書いておくと、gfortranとはFortranのコンパイラで私の環境（Ubuntu）では

```bash
sudo apt-get install gfortran
```
とすることでインストールできる。）

そして、Pythonのスクリプトでは、

```Python:fromfort.py
# -*- coding: utf-8 -*-
import hello
hello.foo(4)
```
のように書く。このfromfort.pyを以下のようにしてターミナルから実行します。

```bash
python fromfort.py
```
すると、

```
Hello from Fortran!
 a=           4
```
と表示されます。
うまく、PythonからFortranのsubroutineを呼び出すことに成功しました。

Spyderから同じファイルを実行すると、うまく動作しませんでした。ライブラリなどの検索ファイルに自分が作成したディレクトリを入れていないせいかもしれません。初心者なのでここらはまだ理解できていません。

今後はもう少し複雑なサブルーチンを用いる際にどうなるかといったことや、Pythonで書くよりもf2pyを用いたほうが計算速度が速いのかといったことについても具体的に調べたいと考えています。
それでは、失礼します。
Hackerrank 30Days of Code参考サイト集（Python）

# All Days
- [Pythonで競技プログラミングする時に知っておきたいtips(入出力編)](https://qiita.com/lethe2211/items/6cbade2bc547649bc040)

## Day 1: Data Types
- [Python3のstr.format()メソッドのいろんな書式指定](https://qiita.com/mas9612/items/af6a3030f9ef19feae22)

## Day 2: Operators
- [【Python入門】今さら聞けない関数とreturnの使い方まとめ](https://www.sejuku.net/blog/40791)
- [小数の四捨五入/切り捨て/切り上げ (round, floor, ceil)](https://hydrocul.github.io/wiki/programming_languages_diff/number/floor-ceil.html)

## Day6: Let's Review
- [Python 文字リスト（配列）の操作](https://qiita.com/HajimeKawahara/items/02c288667f0a893e8761)
- [pythonのprint内で変数に代入されている数字や文字を表示する](https://qiita.com/yuukiclass/items/760b9cd85f503fd03fbd)

## Day 7: Arrays
- [要素のソート(sortメソッド, reverseメソッド)](https://www.pythonweb.jp/tutorial/list/index11.html)

## Day8: Dictionaries and Maps
- [辞書(ディクショナリ)](https://www.pythonweb.jp/tutorial/dictionary/)
- [python3の辞書で標準入力からキーを得て値を出力する](http://reconf-shell.hatenablog.com/entry/2016/07/08/151717)

## Day 9: Recursion
- [9.2. math — 数学関数](https://docs.python.jp/3/library/math.html)
- [ライブラリ：math](https://www.lifewithpython.com/2013/04/math.html)

## Day 10: Binary Numbers
- [Pythonで2進数、8進数、16進数の数値・文字列を扱う](https://note.nkmk.me/python-bin-oct-hex-int-format/)
- [032:特定の文字・文字列の出現回数を調べる](http://lightson.dip.jp/zope/ZWiki/032_e7_89_b9_e5_ae_9a_e3_81_ae_e6_96_87_e5_ad_97_e3_83_bb_e6_96_87_e5_ad_97_e5_88_97_e3_81_ae_e5_87_ba_e7_8f_be_e5_9b_9e_e6_95_b0_e3_82_92_e8_aa_bf_e3_81_b9_e3_82_8b)
FileMaker:JSON:地図上の距離を求める

#複数拠点を移動するときの、拠点間の距離を求めたい

##Google Maps Distance Matrix API を使う
[Distance Matrix API](https://developers.google.com/maps/documentation/distance-matrix/?hl=ja)
API-Keyを取得する->https://developers.google.com/maps/documentation/distance-matrix/start?hl=ja



##出発地と到着地の住所フィールドを作る

- 変数を設定[$dept;値:出発地住所]
- 変数を設定[$goal;値:拠点住所]
＊複数ある場合は"|"でセパレートしておく

```URL:GoogleへのリクエストURLはこんな感じ
https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&avoid=highways&origins=" & $dept   & "&destinations=" & $goal & "&key=API-KEY
```
##[デベロッパーガイドより](https://developers.google.com/maps/documentation/distance-matrix/intro?hl=ja#travel_modes)
units=metric
メートル法表記
avoid=highways
高速使わない
###これで帰ってくるJSONがこちら
```json:Sample
{
   "destination_addresses" : [ "出発地の住所" ],
   "origin_addresses" : [ "拠点住所" ],
"rows" : 
	[
		{
			"elements" : 
			[
				{
					"distance" : 
					{
						"text" : "12.2 km",
						"value" : 12244
					},
					"duration" : 
					{
						"text" : "29 mins",
						"value" : 1711
					},
					"status" : "OK"
				}
			]
		},
		{
			"elements" : 
			[
				{
					"distance" : 
					{
						"text" : "4.5 km",
						"value" : 4535
					},
					"duration" : 
					{
						"text" : "13 mins",
						"value" : 806
					},
					"status" : "OK"
				}
			]
		},
		{
			"elements" : 
			[
				{
					"distance" : 
					{
						"text" : "12.8 km",
						"value" : 12826
					},
					"duration" : 
					{
						"text" : "40 mins",
						"value" : 2425
					},
					"status" : "OK"
				}
			]
		}
	],
	"status" : "OK"
}
```
あとはJSONgetElementでほしいところのオブジェクトを指定してあげればいいんですが、結構試行錯誤
IBOutletはなぜ" ! "で定義すべきか

##背景

controlキーを押しながらstoryboardの部品とコードの紐付けを行うと接続のためのコードが生成されます。

```swift
@IBOutlet weak var myLabel: UILabel!
```

その際どうして"！"（暗黙的アンラップ型）で定義されるのか、疑問に思ったので調べました。

##結論
１．IBOutletがnilになる可能性があるため、オプショナル型にする必要があるから。
２．コードをより簡潔に書くため、アンラップする手間を省く必要があるから。

では、それぞれの理由について詳しくみていきましょう。

##オプショナル型にするのはなぜか

swiftの規約を参照してみましょう。
>Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state. 

あるクラスのインスタンスを生成するときには、すべての変数に値がセットされているか、nilであることを許容するオプショナル型にしておく必要があります。

例えば下記の場合。

```swift
class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!
```

ViewControllerのインスタンスを生成するとき、Labelの値は確定していません。
そのため、値が入っていないこと（nil）を許容するオプショナル型にしておく必要があります。
たとえstoryboardと部品の紐付けをしていたとしても、オプショナル型にしていないとエラーになります。

これはなぜかというと、
１．ViewControllerのインスタンスを生成する
２．IBOutletを読み込む
という流れでXcodeが処理を行うからです。

そんなわけで、IBOutletはオプショナル型（"？"か"！"）で定義しないとエラーになってしまいます。

では"？"ではなく"！"で定義するのはなぜでしょうか。

##アンラップする手間を省くとは

```swift
    @IBOutlet weak var myLabel: UILabel?
```
と定義することもできますが、後でアンラップするために書かなければいけないコードが増えます。

※ そもそもアンラップって何？という方は、この記事がわかりやすいと思います。
　[どこよりも分かりやすいSwiftの"?"と"!"
](https://qiita.com/maiki055/items/b24378a3707bd35a31a8)

storyboardの部品との接続を忘れていない限り
IBOutletには必ず値が入っているので、わざわざアンラップするのは面倒ですよね。

そのため、IBOutletは"？"ではなく"！"で定義します。

###参照した記事

[Should Outlets Be Optionals or Implicitly Unwrapped Optionals](https://cocoacasts.com/should-outlets-be-optionals-or-implicitly-unwrapped-optionals)
ブックマークレット（自分で見る用）

##ブックマークレットとは
ブックマークしとくと役立つやつ


##開く

複数のサイト開く
javascript:(function(){var urls=["http://hoge ", "https://hoge "];for (var i = 0; i < urls.length; i++){window.open(urls[i]);}})();

#参考サイト

http://www.ryoanna.com/entry/20121021/1350784133
JavaでJSON形式のリクエストを取得する

調べてたらHttpServletRequestが〜〜など色々複雑なことが書いてあり、

```
java.lang.IllegalStateException: getInputStream() has already been called for this request
```
などエラーが出て苦しみました。

が、私の実装する部分では
結局これで取得できました。

``` java
@POST
@Path ("/authenticate")
@Produces (MediaType.APPLICATION_JSON)
public Response authenticate (String entity) {

  //entity contains the posted content
  //entity に {"a":"b"}とか文字列が入ってくる

}
```

参考：
https://stackoverflow.com/questions/17790048/java-lang-illegalstateexception-getinputstream-has-already-been-called-for-th
PHPではif ($flag == true)というコードを書いてはいけない

# はじめに
便乗ネタ記事です。
（きっと似たような記事がいっぱいあるんだろうな...

# 何がダメか
```
php > $flag = 1;
php > var_dump($flag == true);
php shell code:1:
bool(true)
```

ってなってしまうから。
なので、

```
php > $flag = 1;
php > var_dump($flag === true);
php shell code:1:
bool(false)
```

って感じで ``===`` で比較しようぜって話でした。
PHPってほんとクソ言語ですね！（褒め言葉
Macでswaggerをdockerから起動し、apiモックサーバーの動作確認するまで

# Macでswaggerをdockerから起動し、apiモックサーバーの動作確認するまで
* docker インストール
* swagger-ui イメージの起動
* nodejs-server ダウンロード
* node インストール
* nodejs-server 起動

## docker インストール
ここからstable版をダウンロードしてインストールする。
https://docs.docker.com/docker-for-mac/install/

## swagger-ui イメージの起動

```ターミナル.
docker pull swaggerapi/swagger-ui
docker run -d -p 8888:8080 swaggerapi/swagger-editor
```

pullで落として起動。
ちなみに、最後にnode server起動時にポートを8080にするため、8888で立ち上げました。

## nodejs-server ダウンロード
http://localhost:8888
にアクセス一番上のメニューから
generate server > nodejs-server
の順にクリック。nodejs-server-server-generated.zipをダウンロードします。
ちなみに、公式のオンラインエディタだとダウンロードできなかった。何でだろう？

ここまででdockerで起動したswaggerは用済みなので閉じちゃっても良いです。

```ターミナル.
docker ps
docker stop psで表示されたid
```

## node インストール
### nodebrew インストール

``` ターミナル.
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install nodebrew
nodebrew setup
```

### node インストール

```ターミナル.
nodebrew install-binary latest
nodebrew list
```

インストール済みで利用できるバージョン一覧が表示されるので好きなのを選んで

```ターミナル.
nodebrew use vXXX.XX.XX
```

 続いてpathなどの設定

bash利用の場合↓

```ターミナル.
vi ~/.bash_profile
```

```vi.
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

```ターミナル.
echo 'export PATH=$PATH:$HOME/.nodebrew/current/bin' >> ~/.bash_profile
```

zsh利用の場合↓

```ターミナル.
vi ~/.zshrc
```

```vi.
path=(
  $PATH:$HOME/.nodebrew/current/bin(N-/)
  $path
)
```
を追加

## nodejs-server 起動
「nodejs-server ダウンロード」でダウンロードした
nodejs-server-server-generated.zip を任意の場所に展開。
「展開フォルダ/api/swagger.yaml」の host, schemes をローカル実行用に下記を参考に修正。

```swagger.yaml
host: "localhost:8080"
schemes:
- "http"
```

ターミナルで nodejs-server-server フォルダに移動し、

```ターミナル.
npm install
```

してから起動。

```ターミナル.
node index.js
```

これで起動まで完了したので、
http://localhost:8080/docs/
でアクセスすると、swagger-uiで作っていたapiモックサーバーがローカルで起動する。
畳まれてるapi設計書を開いて、レスポンスを設定してから「Try it out!」すると表示されたアクセス方法でアクセスできるので確かめればOK。

ちな、確かめるときは表示されてる

```ターミナル.
curl -X ...
```

ではなく、

```ターミナル.
curl -verbose -X ...
```

のがおすすめかな。

最後にサーバーを終わらせるには

```ターミナル.
ps -e | grep node | awk '{print $1}'
kill -9 表示されたid
```

以上！
[Houdini] COPのVOP COP2 Filterでオーバーレイをつくる

![overlay_preview2.jpg](https://qiita-image-store.s3.amazonaws.com/0/153494/19e3c43b-5781-eebc-c986-fb50c305db05.jpeg)
通常COPで2つの画像をPhotoshop的に重ねたい時は`Composite COP`を使うようですが、オーバーレイが見当たらなかったので、`VOP COP2 Filter`を使った方法を考えてみました。
（Houdiniにおける解決パターンの最多ケース「見つけられないだけ」な気もするのですが、COPでのVOPの例として良さそうだったので書いてみます）


## そもそもオーバーレイとは
![overlay_formula2.jpg](https://qiita-image-store.s3.amazonaws.com/0/153494/29eefbd3-4ba7-ae5e-1013-09e63373b019.jpeg)
Wikipediaの[ブレンドモード一覧](https://en.wikipedia.org/wiki/Blend_modes)を見ると、式はこのような形になっています。一見分かりづらいですが、これは乗算とスクリーンの合せ技です。aが下のレイヤーの色、bが上のレイヤーの色だとして、もし**aが0.5より低い(暗めの色)だった場合は乗算、逆の場合(明るめの色)はスクリーンで合成する**と、オーバーレイで合成したことになります。冒頭の画像の暗い部分、明るい部分に対する変化を見てもらえると何となく分かると思います。ちなみにa>0.5と反転した場合はハードライトになります。

## COPでの組み方
![cop2filter.jpg](https://qiita-image-store.s3.amazonaws.com/0/153494/3b0da01c-6b70-e919-3fa8-f2d86532b0c7.jpeg)
2枚の画像をFileノードで読み、VOP COP2 Filterに繋ぎます。COPノードはいずれも左側(Input0)が前面、右側(Input1)が背面になっているので、それにならいます。ダブルクリックでVOPの中に入ります。


## VOPで再現する
![houdini_2018-02-20_15-55-14.jpg](https://qiita-image-store.s3.amazonaws.com/0/153494/e6a80af1-8ce8-76a9-77f0-7ee8542b376c.jpeg)
上のアルゴリズムをそのまま再現した形です。

- COPで2つ目以降の入力を使うには`COP Input`ノードを使います。globalの**X**,**Y**は画像サイズに対する0.0 - 1.0のfloatなので、実質UVとして機能します。input indexをそれぞれ0と1に設定しておきます。(通常のピクセル座標が欲しい場合は下のIX, IYを使います)　
- 明るさ判定は一番上の段で行っています。
    1. `Vector to float`でRGBを分解 
    2. `Average`で明るさを算出
    3. `Compare`で明るさを0.5と比較
    4. `switch`で乗算かスクリーンかを振り分け　という流れです。

- スクリーンの処理に頻出する反転処理(1-x)には`Complement`が便利です。どちらも途中で2倍するために`Multiply`が入っています。

## まとめ
![result.jpg](https://qiita-image-store.s3.amazonaws.com/0/153494/7fcab313-7a1a-651d-eeba-44e6d2279265.jpeg)
無事After Effectsでのオーバーレイ合成と同じ結果になりました。
応用すれば他のブレンドモードや独自の合成処理も作ることができそうです。
railsでGooglemapが表示されない（仮）

https://qiita.com/nakanoyoshiki/items/af9f37e9d2653518d6b0
gmap機能ｇは新しくなっている事について

https://h5y1m1411.gitbooks.io/rails4-with-google-map-api/googleMapsAPI/setupView.html
基本的なつくり参考

https://qiita.com/akippiko/items/a4c539934fa4df2fd5b5
htmlからheightを設定しなければという話
AmazonEC2間で鍵なしrootログインができるようにする

#目的
ansibleを実行する際等、AmazonEC2間のrootユーザでのログインを簡単にする。

#作業内容
- rootでログインする元のサーバ上で、鍵を生成（rootユーザで実行）

```
ssh-keygen -t rsa
# 対話部分は全て何も入力せずにEnter
```


- rootでログインする元のサーバのid_rsa.pubを、ログイン先のサーバのautherized_keysに転記
tomcat起動時のユーザー認証はどのユーザー名とパスワードを入力すればいいのか分かりません。

すみません、初めての投稿で要領を心得ていません。申し訳ありません。

今回tomcatの運用をしたいのです。

現在環境
windows10
eclipse
jdk1.8.0_161
tomcat 9.0.5

tomcatのstartup.batを起動させることは出来ています。
コマンドプロンプトの最後に「情報:server startup in 1110ms」と出ていました。

ただhttp://localhost:8080と入れると
「ユーザー認証、ユーザー名とパスワード」という表示が出ます。
心当たりのあるものは入れてみたのですが何度やってもtomcatのマスコットの画面に行くことができません。

不足している情報がありましたら追記させていただきますのでどうかお力をお貸しください。宜しくお願い致します。
kintoneで画像検索APIとGoogleMapsAPIを連携させてみた

## きっかけ
cybozu developer networkにある[『顧客訪問リストを地図にピン表示する』](https://developer.cybozu.io/hc/ja/articles/202341964) という
Google Maps APIを使ったカスタマイズの存在を思い出し、
「あれ？これ前作った画像検索カスタマイズと組み合わせたらなかなか面白くなるのでは？」
と思ったのがきっかけです。

前回の記事： [kintoneで画像検索API使ってみた](https://qiita.com/Ry-BB/items/b87a92815854ed5c74af)

## kintoneアプリの設定

[前回記事](https://qiita.com/Ry-BB/items/b87a92815854ed5c74af)とほとんど変わりません。

| フィールド種類 | フィールドコード | 
|:-----------|:------------|
| 文字列（一行） | Title |
| 文字列（一行） | URL |
| スペース | Image |
| スペース | Map |
| 数値 | lng |
| 数値 | lat |

GoogleMapAPI用に「Map」「lng」「lat」を追加しています。

## kintoneカスタマイズ
既存の2つのカスタマイズJSを適用するだけです。

[『顧客訪問リストを地図にピン表示する』](https://developer.cybozu.io/hc/ja/articles/202341964) 内のサンプルコードでフィールドコードが**『Address』**となっているものを、
今回は『Title』としてGoogle CustomeSearch API の検索キーワードと共通化させます。
→ Titleフィールドの文字を条件に画像検索＆地図検索します。

## 完成イメージ
前回同様、行きたい場所を記入すると、
![2018-02-20_14h56_01.png](https://qiita-image-store.s3.amazonaws.com/0/153051/7c9c4111-5a6b-fa6f-21ac-6939834afb55.png)

地図と画像が表示されました！
![2018-02-20_14h56_23.png](https://qiita-image-store.s3.amazonaws.com/0/153051/5bdb728f-2fb7-ddc4-06de-b41d9ab12cc5.png)

もちろん、別の検索キーワードでもちゃんと動作します！
![2018-02-20_15h04_19.png](https://qiita-image-store.s3.amazonaws.com/0/153051/692ba641-98fb-1e27-00f9-a4416fa524a2.png)

## おわりに
いろいろなカスタマイズを組み合わせることができるのもkintoneのメリットですね！
単体連携はもちろん、それぞれを組み合わせた複数連携カスタマイズにも要注目です！！

それでは！
2018年第1回 オークファン エンジニア勉強会を開催しました

こんにちは。
サービス開発部 部長の上垣です。

2018年2月16日(金)に、オークファン社内でエンジニア勉強会を開催いたしました。

今回の開催目的は2つでした。

* 社内メンバの技術力向上をしたい
* 社外の知見を取り入れたい

技術は、お客様に価値を提供するためにありますが、最新の技術を学び選択できる範囲を増やすことで、より良いサービスを効率的に提供できると考えています。
そういう意味でも、今回の勉強会では、エンジニアリングの未来を常に考えている[K.S.ロジャース株式会社](http://ks-rogers.co.jp/)の民輪さんを迎えて、いつも民輪さんが開発している環境についても教えてもらいました。


# どんな発表をしたのか

1. Easy-to-use AWS Services
![1.png](https://qiita-image-store.s3.amazonaws.com/0/233008/0231e3ee-907e-75d9-976b-4c5165d16829.png)
    * 新卒2年目のチョーピョーさんが、最近オークファンで使ってみたAWSのサービスをまとめて発表してくれました。
    * 説明したサービスは以下の4つ。
        * Code Commit
        * Code Pipeline
        * Elastic Beanstalk
        * RDS(EBに含まれる)
    * 今回担当したサービスの開発は、新規の小さいものでしたが、管理をAWSで一元管理するために工夫した点を交えて説明がありました。
    [<img width="711" alt="slide_kyaw.png" src="https://qiita-image-store.s3.amazonaws.com/0/233008/3a4eedb2-fd6c-dff5-710a-8c50ff93c828.png">](https://speakerdeck.com/kyawphyo/easy-to-use-aws-services)


2. 普段使ってるインフラ構成などについて
![tamiwa.png](https://qiita-image-store.s3.amazonaws.com/0/233008/d5a35e67-d2cb-c6e9-8ba9-a592bd7c8835.png)
    * [K.S.ロジャース株式会社](http://ks-rogers.co.jp/) の民輪さんに発表いただきました。
    * チョーピョーさんの説明したElasticBeanstalkを利用した環境構築のあとに、もう少し大きなものを開発するのにDocker/ECS/CloudFormationを使った環境構築を説明してもらいました。
    * 今までのご経験の中で、Web＋DBの構成の準備は、ほぼ必ず必要だったとのことで、それをパッケージングし、CloudFormationで手順を効率化したということです。
    * 色んな案件を手がけていらっしゃる民輪さんならではの視点と知見で、弊社でも利用できるところはぜひ取り込みたいと思いました

    [<img width="706" alt="slide_tamiwa.png" src="https://qiita-image-store.s3.amazonaws.com/0/233008/b49e3276-8abb-8466-0021-ef10a8c9bca7.png">](https://speakerdeck.com/kazuhirotamiwa/pu-duan-shi-tuteruinhuragou-cheng-nadonituite)


# 開催してみてどうだったか

オークファングループでは、10年以上運用してきている秘伝のタレ的な仕組みもありますが、当然新規に立ち上げるものも多くあります。
勉強会に参加したメンバからの声ですが、「仕事で使ってない技術を応用している事例を聞けたのは良かった」「普段、フロントが中心の開発をしているので、AWSを簡単に利用するノウハウは役立ちます」など概ね良かったという意見と、「もっと深いところを知りたかった」「バッチなどの開発も効率化したいがどうすればいいんだろう？」みたいな次回の課題も出てきました。

メンバのニーズに合わせて、今後も継続的に実施していければと考えています。

# 最後に

オークファングループでは、エンジニアを募集しています。

https://www.green-japan.com/job/15500?jo=blur_pc

Java以外のエンジニアも随時募集しており、話だけでも是非聞きに来て下さい :)
C#でTCP

#概要

|クラス     |説明   |
|-----------|-------|
| Socket    | Win APIのマーシャリング, 同期、非同期、サーバー、クライント|
| TCPClient | System.Net.Socket  |
| TCPLisener| System.Net.Socket  |
| UDPClinet | System.Net.Socket  |
| |
| WebClient | System.Net アップロードとダウンロード |

## WebRequestグループ(System.Net)
| クラス      | 説明 |
|-------------|------|
| WebRequest | WebResponce |
| PackWebRequest | PackWebRespoce | 
| FileWebRequest | FileWebRespoce |
| FtpWebRequest | FtpWebRespoce |
| HttpWebRequest | HttpWebRespoce |

# TCPListener (同期) AcceptTcpClientを使用
スレッドはリクエストに対する処理が 終わるまで次の処理を行えません。

``` foo.cs 使う
class ()
{
}
```  

# TCPListener (非同期1) BeginAcceptTcpClientを使用
スレットはリクエストを受付、その処理は別のスレッドが行います。直ちに次のリクエスト受付を開始しします。

# TCPListener (非同期2)


#Task async await
JavaScript jQuery UI   Datepickerを使ってみる

#jQuery UI Datepickerを使ってみる

```html:javascirpt
<html>
<head>
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" />
  <script src="http://code.jquery.com/jquery-1.8.3.js"></script>
  <script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>

  <script>
  $(function() {
    $( "#datepicker" ).datepicker();
  });
  </script>

</head>
<body>
　カレンダー<input type="text" id="datepicker" />
</body>
</html>
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/238715/c5c7fa8b-ef6f-4cca-7e80-713ebe9522c1.png)


##日本語化

```html:javascirpt
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js"></script>
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/238715/a966e59e-eb8c-2d82-1a86-7888ebdb25dc.png)


##Formatの変更

```html:javascirpt
$( function() {
  $("#datepicker").datepicker();

  //$("#datepicker").datepicker("option", "dateFormat", 'y/m/d');//->18/2/9 
  //$("#datepicker").datepicker("option", "dateFormat", 'yy/mm/dd');//->2018/02/20
  $("#datepicker").datepicker("option", "dateFormat", 'yy-mm-dd');//->2018-02-20
});
```
※y,m,dを一文字にするとゼロ埋めをしない、年の下２桁表示となる


##初期値の表示

inputのvalue値に初期値がセットされていても表示はされない。
下記のようにセットしてあげる必要がある

```html:javascirpt
$("#datepicker").datepicker("setDate","2018-02-20");
```
ExoPlayerとAudio360を統合する

[ExoPlayer](https://developer.android.com/guide/topics/media/exoplayer.html)と[Spatial Workstation](https://facebook360.fb.com/spatial-workstation/)の統合方法に関するメモ書きです。


まず`AudioEngine`を初期化し、`SpatDecoderQueue`を作成します。

```java
// 以下、フィールドに保持する
engine = AudioEngine.create(SAMPLE_RATE, this);
spat = engine.createSpatDecoderQueue();
engine.start();
```

次に、`Audio360Sink`を作成し、これを使って`OpusRenderer`を作成します。

```java
audio360Sink = new Audio360Sink(spat, ChannelMap.TBE_8_2);
audioRenderer = new OpusRenderer(audio360Sink);
```

最後に、この`OpusRenderer`を使うように`DefaultRenderersFactory`を改造して`SimpleExoPlayer`のインスタンスを作成します。

```java
DefaultRenderersFactory defaultRenderersFactory = new DefaultRenderersFactory(this) {
  @Override
  protected void buildAudioRenderers(Context context, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, AudioProcessor[] audioProcessors, Handler eventHandler, AudioRendererEventListener eventListener, int extensionRendererMode, ArrayList<Renderer> out) {
    out.add(audioRenderer);
  }
};
player = ExoPlayerFactory.newSimpleInstance(defaultRenderersFactory, new DefaultTrackSelector());
```

そしてもう一つ、毎フレームのレンダリングループの中でユーザーの視線の向きを`AudioEngine.setListenerRotation()`で伝えるようにします。

```java
engine.setListenerRotation(quat);
// or
engine.setListenerRotation(forward, up);
```


あとは通常通り`ExtractorMediaSource`とかを使って動画を再生するだけです！
Rails管理画面用GemのAdministrateでorderを変更する

## はじめに

Ruby　on Railsで管理画面作っていて、[Administrate](https://github.com/thoughtbot/administrate)を使っています。
こちらのgemの使い方はまた次回に書きます。

## 起きた問題

単純に`モデル.all`で取得したレコードのorderを指定したかった。
ただし、すでに色々処理書いてあるし、Administrateデフォルトのアクションとかをオーバーライドしたくなかったので、オーバーライドしないでorderを変更しました。

## 解決方法

Administrateで生成した`controllers/admin/hoges_controller.rb`のorderを変更したいとする


```ruby
class Admin::HogesController < Admin::ApplicationController
  before_action :default_params
  # To customize the behavior of this controller,
  # simply overwrite any of the RESTful actions. For example:
  #
  # def index
  #   super
  #   @resources = Attachment.all.paginate(10, params[:page])
  # end

  # Define a custom finder by overriding the `find_resource` method:
  # def find_resource(param)
  #   Attachment.find_by!(slug: param)
  # end

  # See https://administrate-docs.herokuapp.com/customizing_controller_actions
  # for more information
  def default_params
    params[:order] ||= 'updated_at'
    params[:direction] ||= 'desc'
  end
end
```

`default_params`というアクションを作って、制御してあげればいい。
findで複数拡張子を検索する

### -name を複数

```
find . \( -name \*.js -o -name \*.css \) -exec chmod 644 {} \;
```

### 正規表現

```
find . -regex '.*\.\(css\|map\|html\)' -exec chmod 644 {} \;
```

find のデフォルトの正規表現は Emacs のらしい
オンプレのアプリケーションにリモート更新を導入した話

## やったこと

- Amazon S3を使って、オンプレのPHPアプリケーション（CakePHP3）の更新作業をリモートから行えるようにしました

## メリット

- 訪問の回数が減る
- プログラムの修正反映が楽に行えるので開発効率も上がるはず。

## デメリット

- S3にリクエストするため、この仕組みを維持するための料金がかかります。

※1分毎のリクエストで月2円とかでした。

## 前提条件

- Fusicはリモートから該当のサーバに接続不可
- S3が使えるAWSアカウントがある
- オンプレサーバがインターネットに接続可能である
- オンプレサーバにAWS CLIをインストール可能
- オンプレサーバにAWS IAM情報を配置可能

## 処理フロー

やっていることは愚直かつシンプルです。

※以下をcronにて1分毎に実行しています。（1分毎である必要はありません。
- 自動アップデートを行うかどうかチェック（ローカルに特定のファイルが存在したら自動アップデートする
    - 行わない場合は終了
- 行う場合は、AWS CLIを使ってS3に該当のzipファイルが有るかチェックしにいく
    - zipファイルがなかったら処理終了
- zipファイルがあったらローカルにダウンロードする
- ローカルにダウンロード後、S3上の該当ファイルは削除する（ストレージ料金削減＋処理実行の検知のため
- zipファイルを解凍し、必要なフォルダ・ファイルを置き換える

## コード

```
#!/bin/bash
###################
# リリース自動化用スクリプト
#
# cronから起動される。
# S3からapp-master.zipがあれば取ってきて/var/www/html配下に設置する
###################

APP_NAME='app'
BUCKET_NAME='bucket-name'
ZIP_NAME=$APP_NAME'-master'
ZIP=$ZIP_NAME'.zip'
KEY='folder-in-bucket/'$ZIP

# S3へのリクエストが料金が発生するため、ローカルのファイルが有るかどうかで制御できるようにする
if [ ! `sudo ls /hoge | grep update_on` ]; then
    exit
fi

# S3から取得
aws s3api get-object --bucket $BUCKET_NAME --key $KEY /tmp/$ZIP

# zipがなければ何もし#ない
if [ ! -f /tmp/$ZIP ]; then
    exit
fi

# S3から削除しておく
aws s3api delete-object --bucket $BUCKET_NAME --key $KEY

DOCROOT='/var/www/html/'$APP_NAME

# 解凍 & 削除
unzip -q -d /tmp /tmp/$ZIP && rm -r /tmp/$ZIP

# 既存のフォルダを置き換え
for i in config src webroot
do
    rm -rf $DOCROOT/$i && cp -r /tmp/$ZIP_NAME/$i $DOCROOT/
done

# キャッシュの削除
rm -f $DOCROOT/tmp/cache/models/*
rm -f $DOCROOT/tmp/cache/persistent/*

# マイグレーションの実行
cd $DOCROOT/
/bin/php70 $DOCROOT/bin/cake.php migrations migrate

# npm install
cd $DOCROOT/webroot
/usr/bin/npm install

# 展開後のディレクトリを削除
rm -r /tmp/$ZIP_NAME
```
GoogleDrive+gdriveで設定ファイルを管理する

# これなに?
GoogleDriveで.zshrcなどの設定ファイルを同期的に管理する方法の忘備録

## Dropboxじゃだめなの?
もちろんDropboxでも良いが、僕の使い方が悪いせいで不必要なところで同期されてしまうことが多々あった(+無料版だと容量が少ない)ので、gitのように意識的に同期できるような感じにしたかった


# 使うもの
GoogleDriveをCLI上で使えるようにするために、[gdrive](https://github.com/prasmussen/gdrive)をインストール。macならば

```zsh
brew install gdrive
```

で完了


# 方法

## 1.認証
 
```zsh
$ gdrive list
```


とすると、URLが出てくるので、そこからtokenを取ってきて、打ち込んで認証完了。超簡単


## 2.ローカルのディレクトリを作成してupload

```zsh

$ mkdir [ディレクトリ名]
```

として、ローカルに同期用のディレクトリを作成

そのディレクトリをGoogleDriveにアップロード

```zsh
$ gdrive upload --recursive [ディレクトリ名]
```


### 3.同期するためにIDを入手

```zsh
$ gdrive list | grep "[ディレクトリ名]"
```  

でIDを入手。あとで使うので控えておく

## 4. シンボリックリンクを貼る

作成したディレクトリの配下に`.zshrc`など設定ファイルをコピーし、シンボリックリンクを貼る

```zsh
$ mkdir [ディレクトリ名]/dotfiles
$ cp ~/.zshrc [ディレクトリ名]/dotfiles
$ ln -s [ディレクトリ名]/dotfiles/.zshrc .zshrc
```


## 5. ディレクトリを同期

最後にディレクトリを同期する先程のIDを使用して、

```zsh
$ gdrive sync upload [ディレクトリ名] [ID]
```

とすると、ディレクトリが同期される。ちなみに普通の`upload`だと、同じ名前のディレクトリがGoogleDrive上にもう一つ作られてしまう

```zsh
$ gdrive sync list 
```

と打ち込んで、対象のディレクトリが出てくれば成功


いちいち打つのは面倒なので、

```zsh
alias gsync='gdrive sync upload [ディレクトリ名] [ID]'
```

と`alias`を設定しておけば、`gsync`と打つだけで内容が同期される


## 別のPCにダウンロード
別のPCに対象のディレクトリをダウンロードして同期したいときは

```zsh
$ gdrive download [ID]
```

あとは上記の`4.`以降と同様
sql_queryでハッピーな生SQL生活を


## どうしても生クエリが必要になるプロジェクトがある
ActiveRecordで済ませれば良いのですが、複雑な集計が必要なケースなど、どうしても生SQLを使わなければいけないことがあると思います。

また、パラメータや動的にSQLをゴニョゴニョしたいときなど、SQLとRubyのコードがごちゃ混ぜになって煩雑になり、保守性の低いコードになりがちです。

そんなときに便利なのが、`sql_query`というgemです。

[GitHub - sufleR/sql_query: Ruby gem to load SQL queries from `.sql.erb` templates using ERB.](https://github.com/sufleR/sql_query)

## sql_queryのいいところ

1. sqlを`hogehoge.sql.erb`（または`hoge.erb.sql`）のように外出し出来る
2. ということは、IDEなどでSQLとしてハイライトされるので、SQLとしての可視性が（少し）高くなる
3. ERBの`partial`みたいなことも出来るので、例えばWITH句などの部分を共通化しやすくなる
4. SQLファイルのなかでrubyが使えるので、条件分岐などがしやすくなる

などのメリットがあります。

## インストール
```ruby
gem 'sql_query'
```

```bash
$ bundle install
```


Railsプロジェクトに`app/sql_queries`というディレクトリを作成します。そこに、`.sql.erb`または`erb.sql`ファイルを置いていく。

## 基本的な使い方

以下のようなSQLファイルを用意する

```sql
# app/sql_queries/get_player_by_email.sql.erb
SELECT *
FROM players
WHERE email = <%= quote @email %>
```

`quote`はヘルパーメソッドで、クオートで囲ってくれる。


実行

```ruby
> query = SqlQuery.new(:get_player_by_email, email: 'e@mail.dev')

> query.execute
   (0.6ms)  SELECT * FROM players WHERE email = 'e@mail.dev'
=> []
```


Explain

```ruby
> query.explain
=> EXPLAIN for:
SELECT *
FROM players
WHERE email = 'e@mail.dev'

                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on players  (cost=0.00..2.14 rows=1 width=5061)
   Filter: ((email)::text = 'e@mail.dev'::text)
(2 rows)
```


SQL

```ruby
> query.sql
=> "SELECT *\nFROM players\nWHERE email = 'e@mail.dev'\n"
```

Pretty SQL

```ruby
>  query.pretty_sql
=> SELECT *
FROM players
WHERE email = 'e@mail.dev'
```


色々出来て便利ですね。

## Partial出来る

WITH句を共通化し、Partialで呼び出したり

```sql
## app/sql_queries/_users_clicks.erb.sql
WITH users_clicks AS (
  SELECT
	 id
  , name
  , code
  , clicks
  FROM users
  WHERE clicks > <%= @count %>
)
```

上記のようなWITH句のテンプレートを用意しておき、別の`erb.sql`の中で、

```sql
<%= partial :users_clicks %>
SELECT * FROM users_clicks;
```

というぐあいに出来ます。

## ヒアドキュメント地獄から開放されました

私はこのgemに出会う前は、SQLをヒアドキュメントの中に書いていました。少しでも複雑なSQLになるともうごちゃごちゃ。

それが、sql_queryを使うようになってからは、生SQLをキレイな状態に保つことが出来るようになりました。
DeepLearning、画像認識に関する概念と仕組み

ピクセルとセンチ、解像度（dpi）の関係
http://uxmilk.jp/48376

DeepLearningでよく使う手法の説明(CNN,RNN,LSTM,GAN)
http://gagbot.net/machine-learning/ml4

CNNの仕組み
https://qiita.com/icoxfog417/items/5fd55fad152231d706c2

CNNについてさらに詳細な説明
http://postd.cc/how-do-convolutional-neural-networks-work/
https://lp-tech.net/articles/LVB9R

CNNの可視化
http://blog.brainpad.co.jp/entry/2017/07/10/163000

RNNの仕組み
https://qiita.com/yukiB/items/f6314d2861fc8d9b739f
https://qiita.com/kiminaka/items/87afd4a433dc655d8cfd

誤差逆伝播法
https://qiita.com/Ugo-Nama/items/04814a13c9ea84978a4c

確率的勾配降下法
https://qiita.com/kenmatsu4/items/d282054ddedbd68fecb0

活性化関数（ステップ、シグモイド、ReLU、ソフトマックス、恒等関数）
https://qiita.com/namitop/items/d3d5091c7d0ab669195f

Autoencoder
https://deepage.net/deep_learning/2016/10/09/deeplearning_autoencoder.html

Gan
https://elix-tech.github.io/ja/2017/02/06/gan.html
Web IDEとは

# Web IDEとは
Web IDEについて紹介します。ここでは、日本語対応のWeb IDE [PaizaCloud](https://paiza.cloud/ja/)を取り上げます。

## ブラウザで動作

Web IDEはウェブブラウザ上で動作する統合開発環境です。ウェブブラウザさえあれば、家からでも、学校からでも、会社からでも同じ環境で開発できます。

## 環境構築不要

あかかじめ開発環境が用意されているので、開発環境のインストールや設定は不要です。

## 起動が早い

特に[PaizaCloud](https://paiza.cloud/ja/)では3秒で起動します。

## ウェブ開発、ボット開発

Web IDEでは、ウェブ開発やボット開発が行えます。特に[PaizaCloud](https://paiza.cloud/ja/)では、Ruby on Rails, Node.js, Django, PHP(LAMP), Laravelなど、多くの環境に対応しています。また、任意のポートでサービスを動かせます。

## サービス公開

Web IDEではクラウド上で動作するので、インターネットからアクセスできます。特に[PaizaCloud](https://paiza.cloud/ja/)では、開発したサービスを、そのまま公開することもできるようになっています。

## できないこと

苦手なこともあげます。iPhoneアプリやUnityのように専用の開発ツールが必要なものは開発できません。また、WindowsやMacのデスクトップアプリのようなものも作れません。

## まとめ

Web IDE([PaizaCloud](https://paiza.cloud/ja/))では、ブラウザ上で動作するウェブ開発、アプリケーション環境で、開発環境構築の必要がなく、すぐに開発やサービス公開ができます。
CREATE SPFILE文の動作を試す (Oracle Database 12c Release 2) 

# SPFILEを作る
Oracle Databaseの初期化パラメーターはPFILEと呼ばれるテキスト・ファイルとSPFILEと呼ばれるバイナリ・ファイルに記述されます。古いバージョンのOracle DatabaseではPFILEが使われていましたが、現在はALTER SYSTEM文を使って動的に更新できるSPFILEを使う方法が一般的です。

## PFILEの作成とSPFILEの作成
現在使われているSPFILEを確認するには初期化パラメーターspfileを確認します

```
SQL> SHOW PARAMETER spfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      +DATA1/ORCL/PARAMETERFILE/spfi
                                                 le.265.962448525
```

上記の例ではASM DISKGROUP +DATA1に作成されたSPFILEが使われていることがわかります。SPFILEからテキスト形式のPFILEを作成するにはCREATE PFILE文を実行します。

```
SQL> CREATE PFILE='/home/oracle/initORCL.ora' FROM SPFILE;

ファイルが作成されました。

```

上記の例ではSPFILEのパスを指定していません。パスを省略すると現在使用されているSPFILEが使われます。

SPFILEを再作成することはあまりありませんが、何等かの事情で再作成する場合は、PFILEを元にして作成します。SPFILEの作成にはCREATE SPFILE文を実行します。下記の例ではASM DISKGROUP +DATA2にSPFILEを作成しています。

```
SQL> CREATE SPFILE='+DATA2' FROM PFILE='/home/oracle/initORCL.ora' ;

ファイルが作成されました。

```

## Oracle Grid Infrastructureとの関係
CREATE SPFILE文を実行するデータベースがOracle Grid Infrastructureの配下に置かれている場合、CREATE SPFILE文を実行するとクラスタウェアの設定が自動的に変更されます。マニュアルには以下のように記載されていますが、わかりにくい表記です。

> データベースがOracle Clusterwareでリソースとして定義されており、コマンドの発行元のインスタンスが実行中で、| spfile_nameとFROM PFILE句を指定し、AS COPY句を省略した場合、この文はデータベース・リソース内のSPFILEを自動的に更新します。この場合、サーバー・パラメータ・ファイルを名前で参照せずにデータベースを起動できます。コマンドの発行元のインスタンスが実行中でない場合は、データベース・リソース内のSPFILEを、srvctl modify database -d dbname -spfile spfile_pathを使用して手動で更新する必要があります。

https://docs.oracle.com/cd/E82638_01/SQLRF/CREATE-SPFILE.htm

CREATE SPFILE文実行前の設定は以下の通りです。ASM DISKGROUP +DATA1のSPFILEが使われることがわかります。

```
$ srvctl config database -db orcl
Database unique name: ORCL
Database name: ORCL
Oracle home: /u01/app/oracle/product/12.2.0/dbhome_1
Oracle user: oracle
Spfile: +DATA1/ORCL/PARAMETERFILE/spfile.265.962448525
Password file:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Disk Groups: DATA1
Services:
OSDBA group:
OSOPER group:
Database instance: ORCL

```

AS COPY句を指定せずにCREATE SPFILE文を実行すると、Oracle Grid Infrastructureのリソース設定が変化します。SPFILEの設定が ASM DISKGROUP +DATA2に移動していることがわかります。

```
$ srvctl config database -db orcl
Database unique name: ORCL
Database name: ORCL
Oracle home: /u01/app/oracle/product/12.2.0/dbhome_1
Oracle user: oracle
Spfile: +DATA2/ORCL/PARAMETERFILE/spfile.281.968595679
Password file:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Disk Groups: DATA1,DATA2
Services:
OSDBA group:
OSOPER group:
Database instance: ORCL

```

Oracle Grid Infrastructureの設定は自動的に変更されますが、データベース・インスタンスの初期化パラメーターspfileは動的に変更できないためCREATE SPFILE文実行前の状態です。このためALTER SYSTEM文で変更されるSPFILEはCREATE SPFILE文実行前のファイルになります。

```
SQL> SHOW PARAMETER spfile;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      +DATA1/ORCL/PARAMETERFILE/spfi
                                                 le.265.962448525

```
IBM Cloud 開発環境を整えるその１

IBM Cloud 開発環境を整えるその１

Cloud開発をやる前にローカルの開発環境を整えることはとても重要です。
IBM Cloudライトアカウントは無料、やった。
そして開発で重要なIDE(統合開発環境)を何にするか、これももちろん無料がいいに決まっている。
小学生の高学年からでも開発できるようにしたいのがこの記事を書いているそもそもの動機。
「少年・少女よ未来は明るい！」

なんでAWSにしなかいって、簡単「商業主義的な匂いがプンプン」


前準備

•完全無料のIBM Cloudライトアカウントの取得はここ(https://console.bluemix.net/registration/free)
•IBM Cloudコマンド・ライン・インタフェース（CLI）のインストール 
 IBM Cloud CLIのインストーラーは、ここ(https://console.bluemix.net/docs/cli/reference/bluemix_cli/get_started.html#getting-started)

![Ex-7.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/ee067d91-0868-3ac4-7f21-98ab3dd851ee.jpeg)

Windowsのインストーラーを取得してセットアップ。
このあたりは直感的にできるような・・・説明を割愛。(英語で大変だけど、IBMのドキュメントは直感的）

そして、IDEはWindowsと最高の親和性のある
•Microsoft Visual Studio Codeは、ここ(https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)
 技術解説と自習書はここ(https://www.microsoft.com/ja-jp/dev/resource/default.aspx)

 eclipseを敢えて選択しないのは、このエディターに実装されている、デバッガー、そしてターミナルを使いたいから、たぶんフレームワークという誘惑を利用したいのであれば、eclipseを利用すべき。私はガリガリのコーダー。

![Ex-8.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/e842b040-f207-281a-b8a2-43d9d342ad30.jpeg)

赤枠がターミナルウィンドウ

DOSターミナルがIDEの中で利用できる。左側に、IBM Cloud (Bluemix)でアプリケーションを作ろうのリソース一式を表示していて、各ソースファイルをターミナルの上のウィンドウで表示編集できます。

色々ごちゃごちゃ触ったみてほしい、そう「直感的に」

IBM Cloudコマンドラインをインストールしないと、bluemixコマンドが使えない、そしてDOSターミナル画面でコマンド入力する的な開発環境から一歩前進かな。

その２へ続く、予告「なんとVisual Basic For IBM Cloudで動かしちゃう」をやっていきたいのであった。

以上、おそまつ。
WordPressから画像を取得してTwitterへ投稿するBotを作る :WordPress編 第1章


制作方針編は[こちら](https://qiita.com/Daizoo/items/677063efbf21dc3c69f0)
まず最初はどんな関数を使うのか参考程度に記述しておくことと、書いている現時点での問題点を列挙しておく。

## WPの関数を利用する
デフォルトで実装されている関数を利用する場合は以下の内容を記述しておく。

```php5
<?php
require_once(dirname(__FILE__).'wp_load.php');
?>
```

この記述のみで基本的な関数は使える。
ただ、問題としてはwp_load.phpと同一の階層でのみ実行可能なので適宜変更の必要性は多アリ。

## 画像をメディアからURLを出力させる
今回はランダムに投稿させたいので取得はランダムで行う。
とりあえずランダムに画像を取得して表示するのコード

```php5
<?php
$data = get_posts('post_type=attachment&post_mime_type=image&posts_per_page=1&orderby=rand');
echo wp_get_attachment_url($data[0]->ID);
?>
```

### 実行結果
```text
http://localhost/wordpress/wp-content/uploads/2018/02/DLWciH3VAAAKQGq.jpg
```
こんな感じにURLが返ってくる。

## 問題点

### 返り値がURL
Twitterへの投稿時に問題が無ければ大丈夫だが、実際は不明。
これはTwitterAPIの特性次第なのでBotの構築時に確認は必須

### 細かい指定ができない
これはWordPressの仕様の都合でカテゴリ、タグ付けがデフォルトでは無理な模様。
拡張プラグインの導入で対処は可能。ただし、その際にはプラグインのソースに合わせて上記のコードを変更が必要となりそう。


## 次にやること
* 拡張プラグインの導入
* それに合わせたコードの変更と実行時の動作確認

## 参考サイト
* [WordPress関数リファレンス(wp_getattchment_url)](https://wpdocs.osdn.jp/関数リファレンス/wp_get_attachment_url)
* [WordPress でメディアにアップされた画像を取得して表示する方法](https://www.webantena.net/wordpress/wp-get-attachment-url/)
Some Useful Extensions for Gmail for Better Productivity

These are a portion of the best Gmail expansions accessible, giving you the data, the apparatuses and the capacity to enhance your profitability and make your life less demanding: 

•	Ginger. Have you at any point sent an email with a humiliating grammatical mistake? Ginger will ensure that never happens again; the augmentation will check for syntax, spelling, accentuation, and general sentence structure. It even offers restricted interpreting capacities for 40 unique dialects. 



•	Followup.cc. Followup.cc is an augmentation that enables you to draft messages to plan and send whenever later on. You can likewise send yourself suggestions to catch up with your fundamental contacts, and check whether and when your messages are perused. 

You will spend in any event a large portion of your day overseeing, sending and perusing messages, so for what reason not capitalize on it? Utilize these expansions to streamline your experience and invest more energy in the undertakings that improve utilization of your abilities. Numerous are free or offer a free trial temporarily, so what do you have to lose in testing?

For any help or support related to your gmail account visit at http://www.gmailcustomerservicenumber.ca
Macに開発環境を整えるまでに、自分的にやること

## 環境

- macOS Sierra 10.13.3

## やることリスト

- 画面ロックの設定
- Touch ID の設定
- はてなブックマークの Chrome 拡張をインストール
- Clipy のインストール
    - https://clipy-app.com/
- ターミナルのセットアップ
    - Dockに追加
    - プロファイルを Pro に設定
    - フォントを 12 にする
- Xcode のインストール
    - 最近は Command Line Tools は同梱されているらしい
- エディタ(ATOM)のインストールと設定
    - パッケージの追加
        - linter
        - Sublime-Style-Column-Selection
        - platformio-ide-terminal
        - project-manager
- `.bash_profile` の設定
    - `chsh` でログインシェルを bash に変更
    - alias
    - git コマンド補完
- Homebrew のインストール
    - https://brew.sh/index_ja.html
- Git のインストール
    - Xcode に同梱されている
- rbenv のインストール
    - https://github.com/rbenv/rbenv#homebrew-on-macos
- MySQL のインストール
    - `brew install mysql`
    - `brew services start mysql`
- Vagrant のインストール
    - https://www.vagrantup.com/downloads.html
- VirtualBox のインストール
    - https://www.virtualbox.org/wiki/Downloads

## .bash_profile

```
alias be='bundle exec'
alias gb='git branch'
alias gd='git diff'
alias gl='git log --oneline --graph'
alias gs='git status'
alias ll='ls -la'

# `sudo find / -name git-completion.bash` でパスを確認する
source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
```