OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel開発：bladeで改行したいだけ（nl2br）

[こちらの内容はブログの方でも投稿しています。](https://ksysnote.com/php/laravel-nl2br/)

Laravelについてはこちらにまとめていきます。

https://ksysnote.com/tag/laravel/
<h3>環境</h3>
OS : macOS High Sierra 10.13.6

MAMP : 5.1

Laravel : 5.7.6
<h3>nl2brを使用する</h3>
以下のコードでLravel5では、改行されて表示することができます。
<pre class="EnlighterJSRAW" data-enlighter-language="null">{!! nl2br(e($value)) !!}</pre>
<h4>解説</h4>
改行を&lt;br&gt;に変換する場合はnl2br()でいけますが、そのままだとエスケープされて表示されます。
<pre class="EnlighterJSRAW" data-enlighter-language="null">hoge&lt;br&gt;hoge</pre>
エスケープされないようにLaravel5では、{!! !!}で囲む必要があります。

ただ、そうすると元々あったタグまでもエスケープされずに表示されるので、最初にe()でエスケープを行います。

1. e() でエスケープをする

2. nl2br() で改行を&lt;br&gt;に置き換える

3. {!! !!}で、&lt;br&gt;だけエスケープをせずに表示する

&nbsp;

以上、もっと簡単な方法はないものか。。。
第41話 オイラーの幸運数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第41話です。

```math
\arg\max_{𝑞}[∀𝑛≤𝑞−2,𝑞^2+𝑞+𝑛=𝑝]=41
```

オイラーの幸運数を意味する式です。

```math
f(x)=x^2+x+41
```
この式は、x=0～39の整数のとき必ず素数になります。
しかし、x=40のときは、f(42)=1849=43×43となり、素数ではなくなります。

これを一般化して、以下の式にします

```math
f(x)=x^2+x+p
```

この関数は、pがある値のとき、q=0～(p-2)の結果がすべて素数になります。
他にも、pの候補は2, 3, 5, 11, 17があります。

| p | f(0)~f(p-2) | f(p-1) | 1-4p |
|:-:|:-:|:-:|:-:|
|2   |2   |4=2*2   | -7  |
|3   |3,5   |9=3*3   | -11  |
|5   |5,7,11,17   | 25=5*5  | -19  |
|11   |11,13,17,…,83,101   | 121=11*11  | -43  |
|17   |17,19,23,…,227,257   | 289=17*17  | -67  |
|41   |41,43,47,…1523,1601  | 1681=41*41  | -163  |


素数の連続が途切れる数は、必ずp^2となっています。
ですが、実は計算すればわかるのですが、
上に上げた数以外でもかならずf(p-1)=p^2 となります。

これらの数が素数の連続になるのは偶然ではありません。
一番右に1-4pというのがありますが、これは解の公式に入れたときの平方根の中の値になります。
そして、これらの値はすべてヒーグナー数であり、虚二次体の類数が１になる数です。
これらのxの解がちょうどよく虚二次体の形をしていて、
それ故に、次数が1だと合成数になり得なくなってしまう、という仕組みがあります。

…といったものの、二次体の話は高校の範囲で習うものですらなく、
難しいのでこの辺はサラッと流しましょう。
第37話の話も巡り巡って二次体の話なのですが、ちょっと泥沼です。

ヒーグナー数は163が最大の数なので、この式では41が最大になります。
それ故に41がオイラーの幸運数と呼ばれています。
XSS対策とSQLインジェクション対策

#XSS対策

##XSSとは

XSSとはクロスサイト・スクリプティングの略です。
ユーザーの入力したデータを利用するWEBサイトに対して、
悪意のあるHTMLタグやJavascriptコードを注入し、閲覧者に送信する攻撃です。


##htmlspecialchars

文字列に含まれる特殊文字を抜き出して、htmlで記号として出力できるように、変換して文字列を返す関数です。

特殊文字の変換例

| 変換前 | 変換後 |
|:------------------:|:------------------:|
| \< | \&lt |
| \> | \&gt |
| \& | \&amp |
| " | \&quot |

htmlspecialcharsは次のように記述します。

`htmlspecialchars(文字列,変換スタイル,文字コード)`

この変換スタイルは、クォートや文書などの扱いを指定します。
デフォルトではENT_COMPATが指定されているので、クォートはダブルクォートだけが変換されます。
ここでよく使われる変換スタイルをまとました。

| 定数 | 意味 |
|:------------------:|:------------------:|
| ENT_COMPAT | ダブルクォートは変換、シングルクォートは変換しない |
| ENT_QUOTES | ダブルクォートもシングルクォートは変換 |
| ENT_NOQUOTES | ダブルクォートもシングルクォートは変換しない |
| ENT_HTML5 | コードを HTML 5 として処理 |


##改行のみ出力するには・・・
改行がない文章なんて見づらくて仕方ありません。
「HTMLのタグなどの部品はそのまま表示したいけど、改行文字は改行として扱ってほしい」
そんな時に便利な関数が`nl2br()`です。

`nl2br(文字列)`を実行すると、`\n`や`\r`などの改行文字の前に、HTMLの改行タグ`<br>`を挿入した文字列を返してくれます。
こうして改行してほしいところで改行してくれる文字列を作成できます。


```php
echo nl2br(htmlspecialchars($remark,ENT_QUOTES)) ;
```
htmlspecialcharsとnl2brを使用して、このようにXSS対策をしながら、改行をHTML上に反映しました。


#SQLインジェクション

##SQLインジェクションとは？
SQLインジェクションとは、SQL文に代入する変数に、SQLの操作に関わる文字を使うなどして、アプリが意図しないSQL文を実行させ、データベースを不正に操作する攻撃です。

##バインド機構
これを回避する方法の1つにバインド機構というものがあります。

バインド機構では、まずSQL文の中に変数の場所を記号（プレースホルダー）で確保しておきます。
そして後からその場所に変数を割り当てます。
こうすることで、特殊記号も単なる値として扱われるので安全なSQL文を作成できます。

```php
 $stmt = $db -> prepare("INSERT INTO students_table (entry_id,student_id,student_name,student_age,remark) VALUES (:entry_id,:student_id,:student_name,:student_age,:remark)");
 $stmt->bindValue(':entry_id', $count, PDO::PARAM_INT);
 $stmt->bindParam(':student_id', $number, PDO::PARAM_STR);
 $stmt->bindParam(':student_name', $name, PDO::PARAM_STR);
 $stmt->bindValue(':student_age', $age, PDO::PARAM_INT);
 $stmt->bindParam(':remark', $remark, PDO::PARAM_STR);
 $stmt->execute();
```
`:名前`でプレースホルダ―を用意します。
bindValueとbindParamメソッドを使って、プレースホルダーに実際の値を割り当てます。
そして最後にexecuteメソッドでSQL文を実行します。
Cookieをながめてみた

##Cookie
Cookieとは、サービス側がウェブサイトの情報（前回見たページや商品の情報など）をクライアント側のブラウザに保存する仕組みです。

## Cookieの配置場所
Cookieはサービス側の要請によってクライアント側が保持する情報です。
当然、PCの中にCookie情報は保存されています。


ChromeをWindowsで使っているのなら

```
C:\Users\UserName\AppData\Local\Google\Chrome\User Data\Default
```
のなかに全てのCookieが保存されています。

上記パス配下に`Cookies`というファイルが配置されています。

## どんなCookieをもっているのか確認する
Chromeの検索バーに

```
chrome://settings/siteData
```
と入力し検索を掛けると、「すべての Cookie とサイトデータ」が表示されます。

ドメインごとにどのようなCookieが保存されているのか確認できますね。

いくつか眺めていると、`_ga`というCookieがいっぱいあることに気づきます。


`_ga`はGoogle Analyticsで使われるクライアント識別子です。ウェブトラッキングなどで利用されているようです。

## Chrome開発者ツールを使ってCookieの中身をみる
CookieのなかみをChrome開発者ツールを使ってみてみましょう。

Windowsの場合は`Ctrl Shift I` で開発者ツールを開くことができます。Macの場合は`command option I`で開くことができます。

開いたら、`Console`に

```
document.cookie
```
と入力します。
すると、今見ているウェブサイトのドメインのCookieが表示されます。

%パーセントが出てきて何が書いてあるかわからない場合は、URLデコーダーにかけて解読できます。

「URL　エンコード　デコード」などでググるとデコードしてくれるサイトが見つかります。

### Cookieに付与される詳細情報をみる
開発者ツールの`Application`の`Storage`からCookieの詳細情報をみることができます。

* Name: Cookieの名前。
* Value: Nameにひもづく値。
* Domain: クッキーを送信する対象ドメイン。発行時に特に指定がなければ発行したサーバーのドメイン名が補完されます。
* Path: Cookieを送信する対象パス。「このページを見ているときにこのCookieをおくってくれ」という細かい指示ができます。
* Expires, Max-Age: Cookieの有効期限。有効期限が切れるとCookieが消滅します。この欄に「1969-12-31T23:59:59.000Z」と書かれているCookieがあります。これは`Expires, Max-Age`属性を指定しなかった場合に自動で保管される値です。この値が現時点よりも過去日に設定されているCookieはブラウザの終了とともに消滅します。
* HTTP: チェックが入っている場合、HTTP通信でのみ触ることができるることを示しています。実際、先ほど`document.cookie`と入力したとき、`HTTP`欄にチェックがはいっていないCookieは表示されていません。このページで開発者ツールを開いている人は、`.qiita.com`ドメインに`secure_token`というCookieが存在していることを確認できると思います。ここでもう一度`document.cookie`と`Console`に入力してみると、`secure_cookie`は表示されていないはずです。
* Secure: チェックが入っている場合、HTTPS通信の場合でのみサーバーへの送信ができることを示しています。HTTP通信の場合Secureにチェックが入っているCookieは送信されません。
コードレビューは恐れずにどんな小さなことでも伝えてみよう

# はじめに
この記事はとあることから全く知らない人の全く知らないコードをレビューした話です。
私と同じでコードレビュー苦手だなと感じている人にこの話が少しでも力になればと思います。

# 発端はここから
ある日Twitterを眺めていると私がフォローしている[@pei2_dir](https://twitter.com/pei2_dir)さんのこんなメッセージを見つけました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">プライベートで誰もコードレビューしてくれない😭😭😭</p>&mdash; pei@SE1年生 (@pei2_dir) <a href="https://twitter.com/pei2_dir/status/1054727413937127425?ref_src=twsrc%5Etfw">2018年10月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

コードレビューの文化がある会社に入って1年半ほど経ちますが、まだまだコードレビューが苦手な私。
こんな私でもできるのかと不安になりましたが、コードには興味がありますし、自分のレビュー力アップにもいいかもしれないと思い、速攻で「見てみたいです。」と返事しました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">まともなレビューできないかもしれませんが、公開されているのであれば見てみたいです！</p>&mdash; TomoProg (@tomoprog_xxx) <a href="https://twitter.com/tomoprog_xxx/status/1054869536770469888?ref_src=twsrc%5Etfw">2018年10月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# そこは未知の領域だった
正式にレビューお願いしますと返事をいただいたため、少し概要を教えてもらうと、どうやら今流行りの機械学習の分野のようでかつPythonで書かれているとのことでした。

やばい・・・
Pythonは少し書いたことあるけど、機械学習とか全く分からん。
どうしよう・・・

と内心は思つつも、見ますと言ったからにはここで引き下がるのは嫌だなと思い、とりあえずコードを見てみますと伝え、コードを見てみることにしました。

# それでも指摘できる点はある
早速コードを読んでいくといくつか気になる点が出てきました。
実際のコードは共有できないため、詳しくは書けませんが、大きく分けて以下の3点についてコメントしました。

**1. メソッドの名称について**
`_setup_args_check`というパラメータチェックを行うメソッドが書かれていましたが、メソッド名の最後が`check`という動詞で終わっていることが気になり指摘しました。
メソッド名の付け方は私も苦手ですが、このメソッドは`チェックする`ことが目的のため、`check`という動詞を前に置いたほうが素直なのではないかと思います。
指摘した結果`check_args`というメソッド名に変更されました。
ちなみにメソッドの命名に関してはこの記事がすごく参考になります。
https://qiita.com/jnchito/items/459d58ba652bf4763820

**2. コメントの有無**
パラメータに関してのコメントがあるところとないところがあり、気になったためコメントしました。
個人的には書いていたほうが優しいと感じるため、書いてもらうように指摘しました。

**3. タイプミス**
英語のスペルミスやなぜか大文字になっている変数名など気になる点を指摘しました。
タイプミス自分ではなかなか気がつけないですよね・・・

中身に関しては未経験分野だったため、ほぼ理解できず指摘できませんでした。

# まとめ
こうしてレビュー体験を終えたわけですが、今回の件で思ったことは大きく2つありました。

**1. 指摘できる点は意外とある**
特定のプログラミング言語やフレームワーク特有のことでなく、一般的でどの言語でも通用するようなことであれば、触れたことのない分野でも指摘できる点が多くあることに気づけました。分からないからと諦めるのではなくどこかに改善できそうなところないかなと探してみることが大事だと思いました。

**2. 素直に感じたことをコメントしてみる**
「ここなんでこうなっているのかな？」と思ったことは些細なことでもコメントしました。
私はよく分からない部分を見かけても「こういうものなのだな」と強引に理解する傾向があるのですが、その感じたことをコメントすることで「実は間違っていた」とか「この記述は不要だった」という結果につながることがありました。
自分の中だけで解釈するのではなく、それを言語化して伝えることがコードを良いものにしていくために重要であることを改めて認識しました。

この経験を与えてくれた[@pei2_dir](https://twitter.com/pei2_dir)さんに感謝です。
この記事を読んでコードレビューに関しての考え方が変わる人がいれば幸いです。

それではまた。
Javaの定数定義

Javaで定数をまとめて管理する方法
プロパティ以外で知っているのだと3種類。どれで実装するべきか？の話
1. 定数インタフェース
2. 定数クラス
3. enumクラス

enumを使ってください。インタフェースで定義しているのは聞いたことはあるけど見たことは無い。

##### 定数インタフェースを実装した例（Effective Java第２版項目１９から引用）

```
public interface PhysicalConstants {
    // アボガドロ定数（1/mol）
    static final double AVOGADROS_NUMBER = 6.02214199e23;
    // ボルツマン定数（J/K）
    static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
    // 電子の質量（kg）
    static final double ELECTRON_MASS = 9.10938188e-31;
}
```

 * implementして利用する。

見たことはない。。定数インタフェース増えたら必要な分implementするということ？
名前がかぶりそう。。結合度高い。インタフェースの使い方じゃない。

##### 定数クラスを実装した例

```
public final class Constants {
    public static final String PATH_SEP = "/";
    public static final String LINE_SEP = "¥n";
    private Constants (){}
}
```

 * finalにして継承不可。
 * privateコンストラクタでインスタンス不可。

最初に作る人がクラス名をConstantsとかにしてしまうと肥大化する。
大体そうなってる。

##### enum クラスでを実装した例

``` 
public enum ExamEnum {
    SUNDAY(0),
    MONDAY(1),
    TUESDAY(3),
    WEDNESDAY(4),
    THURSDAY(5),
    FRIDAY(6),
    SATURDAY(7);
}
 
```

 * シングルトン強制
 * 型安全にできる
 * enumクラスで用意されたメソッド使って色々
 * 順番も保持
 
いつかどこかで「定数クラス（笑）」といわれて使い始めた。他に比べて実装するコード量以外のデメリットがないので使い続けている。コード量も一度書けばコピペで基本的なことはできるので。。
いい感じの使い方は調べれば沢山出てくるのでここでは書きません。
人工衛星の観測画像による世界の夜間光データ．(Nightlight observed by Satellite in the world.)

人工衛星の画像といえば，Google Mapなどのお昼の画像が一般的ですが，夜間の観測画像もあることを紹介したいと思います．

##追加情報
夜間光（Night Light)のデータは以下のサイトよりダウンロードできます．
2012-2018 [VIIRS Data](https://www.ngdc.noaa.gov/eog/viirs/download_dnb_composites.html)
1992-2013 [DMSP Data](https://ngdc.noaa.gov/eog/dmsp/downloadV4composites.html)

##1. 人工衛星による夜間光観測．
多くの方はご存じないと思いますが，人工衛星による夜間の都市や街の光の観測は長い歴史があります．

米国の気象庁である米国海洋大気庁（NOAA: National Ocean and Atmospheric Administration)が1992年から，軍事衛星でもあるDMSPの観測画像を公開しています．NOAAの人工衛星といえば，LANDSATが有名ですね．

参考：[宇宙からみた宇宙の光](http://agora.ex.nii.ac.jp/~kitamoto/research/rs/world-lights.html.ja)

現在は，同じNOAAのVIIRS(Visible Infrared Imaging Radiometer Suite)が観測し，そのデータを公開しています．

##2. 人工衛星による夜間光データ．

[こちらのサイト](http://go.nasa.gov/2iFEzX8)より人工衛星の夜間光データを閲覧することができます．

![VIIRS1.png](https://qiita-image-store.s3.amazonaws.com/0/187602/8a9f5674-5c24-f443-fc31-8b0e779619e1.png)

雲がかかっていると夜間光がどうしてもぼやけてしまいますが，雲がないときは，都市の分布をみることができます．
例えば，日本は以下の夜間光分布となっています．
![VIIRS2.png](https://qiita-image-store.s3.amazonaws.com/0/187602/c2848079-dc6c-ee2f-1e99-49000c60eada.png)

東京や大阪などの大都市の光が強いのはよく分かります．ただ，その分布は都市と地方でだいぶ偏りがあるのがわかります．
一方，隣国の韓国は，それほど光の分布に偏りがあるようにはみえません．北朝鮮は全体的に暗いですね．

これによって，その国の経済的な活発度（強さ）を見える化することが研究されています．
国に経済力の指標としてGDPが有名ですが，それはその国全体の数値であって，国内の経済力の分布はわかりません．
このサイトを見ると，どこの光が強くなっているのかが分かりますので，大きく発展している都市を見分けることができます．

ブラウザだけでなく，[こののサイト](https://earthdata.nasa.gov/viirs-dnb)からデータそのもののダウンロードもできます．

興味がありましたら，一度ご覧になってください．
私もここのデータをダウンロードし，PythonやRを使って，数値解析をしてみます．

##3. 解析例（2018/11/4追記）
VIIRSのデータをダウンロードし，QGISで解析してみました．
夜間光による経済活動力を評価します．

VIIRSのデータをダウンロードし，QGISの"ラスタ" → "ラスタ計算機"にて，２時期のデータの差分にて評価します．

まず，２０１２年９月と２０１８年９月の東京の夜間光の差です．

![2018_2012_09.png](https://qiita-image-store.s3.amazonaws.com/0/187602/0cb42b71-f9c9-f160-1d32-8833e0a89130.png)

黄色が夜間光量が上昇したエリア，紫が夜間光量が低下したエリアになります．
夜間光量の増減は，そのエリアの経済活性度と相関がある，との[レポート](http://journals.sfu.ca/apan/index.php/apan/article/viewFile/59/71)が複数あります．

渋谷，新宿，新橋などの主要駅周辺は夜間光が増えており，このあたりは経済的にもこの数年で賑わってきたのだと思います．
一方，上野のあたりは夜間光量が低下しています．

でも，全体的に光量は増加しています．日本経済も向上している，とのことなので，その傾向とも一致していますね．

次に，２０１７年９月と２０１８年９月の，この１年間での差分です．
![2018_2017_09.png](https://qiita-image-store.s3.amazonaws.com/0/187602/df5f3469-c329-7fa7-e827-09e64927b477.png)

先ほどと比べると，夜間光量の低下を示す紫色の地域が増えています．
渋谷の西側や，丸の内の南半分の低下が大きいです．東京駅周辺も紫色です．

渋谷周辺もいちじきよりも賑わいが落ちてきているのかもしれませんね．
私は渋谷にほとんどいかないので勘違いしているかもしれませんが，９０年台のときのような”文化を創り出す街”というイメージが無くなってきています．

それにしても，東京ディズニーランドは，ずーっと夜間光が向上している．
はじめは，人気がつねに上昇しているのかな，と思いましたが，アトラクションが増えてるのが要因ですね．

自宅近郊をみると，夜間光とその近辺の賑わいの関係が，肌感覚でわかります．
なかなかおもしろい指標です．

ただ，相関をしるには，そのエリアの経済活性度を何らかの形で数値化する必要があります．
GDPは国レベルの数値なため，そのままでは使えませんし．

人口密度，店舗数，などとの相関をみるのもいいかもしれません．

数値データですので，統計解析をおこない，これから発展しそうな街・地域を予測してみるのも面白いかもしれません．


##4. 関連サイト
[無料で最新の衛星画像を入手する方法．](https://qiita.com/nigo1973/items/9bb6a11caac8e3e1e850)
[衛星画像のSegmentation（セグメンテーション）により建物地図を作成する．](https://qiita.com/nigo1973/items/78dea24fd997674ca8b9)
Lazyな人向け！！　Kotlinで最小限に画面遷移コードを書く  --Android Studio

Android StudioのKotlinを用いたアプリ開発で、
画面遷移コードを最小限に記述する手順を簡単に記します。



ここではAnkoというKotlin用の外部ライブラリを用います。
その中でも　**Anko Commons**を使用します。

**AnkoはKotlinの開発元であるJetbrains社が開発・メンテナンスを行っているので安心して使えます。**





##１．build.gradle(Project:)にAnkoを追加

buildscript内の
`ext.kotlin_version = "1.2.71"` (ヴァージョンは随時変更される)
の下に

`ext.anko_version = "0.10.7"`
と記述します。

Ankoのヴァージョンも
(https://Github.com/Kotlin/anko/releases)
で確認して最新版の番号を入れます。



##２．build.gradle(Module:app)にAnkoを追加



dependencies{}内に
`implementation "org.jetbrains.anko:anko-common:$anko_version"`
と記述します。



##３．Activityに画面遷移コードを記述する

記述するコードを先に記しておくと
`startActivity<遷移したいActivity名>(乗っけたいデータ)`
になります。

データを付けたなくても良いのなら()は空白でも大丈夫です。

**ここで注意すべき点が１つあって**
startActivityと打つと変換候補がいくつか出てきますが、その中で
`startActivity(verag params:Pair<String, Any>)`
を選択してください。

この候補は上記の１．と２．のプロセスを踏んでないと出てきません。

また、このコードを書くと自動的にクラスに下のimport文が追加されます。
`import org.jetbrains.anko.startActivity`




場所はonCreateメソッドか、新たな関数を作ってその中に記述してください。
【権限は合ってる】could not be opened: failed to open stream: Permission denied

#検索で中々たどりつけないシリーズ〜1
こんばんは。やる彦です。

もう朝ですかね。
google先生に質問をすると「ファイル権限、所有者が適切かどうか」
を確認するよう促されます。

```:よくある返答
# chmod -R 770 {Laravelルートディレクトリ}/storage/ {Laravelルートディレクトリ}/bootstrap/cache/
```
、、、、、こっちはなあ、それなりにエンジニアやってるし
そんなことは実行済みだ。もう朝なんだから手間とらせないでくれよなあ。

、
、
、
、
、

多分、1時間くらいはハマったんじゃないかなあ。。。
SELinux？？？なきがしてきた。。。

```
# getenforce 
Enforcing
# setenforce 0
# getenforce 
Permissive
```
と、してからアクセスすると無事解決。。。
多くのブログなどでは初学者向けに書いてあるからそれ以上突っ込んで書いてある
記事は少ないように思える。特定のファイルだけ除外する設定を追加してSELinux
を有効化、httpdをリスタートしてスッキリ。

```
# semanage fcontext -a -t httpd_sys_content_t "{Laravelルートディレクトリ}/storage/(./*)"
# semanage fcontext -a -t httpd_sys_content_t "{Laravelルートディレクトリ}/bootstrap/cache/(./*)"
# setenforce 1
# getenforce 
Enforcing

# service httpd restart
```

SELinuxについては、この記事がおすすめです。
https://qiita.com/hanaita0102/items/5d3675e4dc1530b255ba

以上、やる彦でした。

##追記
```
# cd {Laravelルートディレクトリ}
# chcon -R -t httpd_sys_rw_content_t storage
```
こっちのほうが楽
Keyboard for LaTeX?

#概要
物理学系で, LaTeX入力の労力が占める割合が高いことで悪名高いレポートがある.
(自分だけでも)なんとかならんかなと色々調べてみたら, Arduinoがキーボードになるらしいとわかったのでテストしてみた.
# LaTeXで過去にやったこと
* コピペテンプレを置いておく
    * Windows10の仮想デスクトップ + 3本指横スライドで颯爽と切り替えしたるで
    * メモ帳でもいいで
    * ちょっと手間
        * 長さによっては生入力とあまり時間が変わらない
* IME辞書
    * しばらく使ってきた方法
    * けど"\frac{}{}"とかを入力した後{}の中にカーソルが自動で入るといいな...
    * 英字とかなの切り替えが面倒
        * 数式内では英字をよく使うのにその途中でIMEオン/オフにしないといけない
* Windows10のCtrl + Shift + [キー]でカスタマイズできるショートカット + VBS
    * ショートカットを生成→デスクトップに置く→カスタマイズ という順番でやらなければいけない
    * そもそも押しづらい
    * JScript? JavaScriptじゃないの?
    * さっきの{}の中にカーソルを入れるのはできそうだ

# 今回最終的につかったもの
* Arduino Leonald
* USBキーボードエミュレーションKeyboardライブラリの亜種
    * [Arduino Leonardoで\記号を打つ](https://mgt.blog.so-net.ne.jp/2016-01-14)
* 電子部品
    * ブレッドボード
    * タクトスイッチ
    * 3.3kΩ 抵抗
    * ジャンパー線

# 手順
* 先述のリンクからソースをコピーしてKeyboard_jp.hとKeyboard_jp.cppをArduino/libraries/Keyboard_jp/に作成
* 以下のスケッチを作成

```sketch_oct30b.ino
#include  "Keyboard_jp.h"
int prev = LOW;
int now = LOW;
int pin = 7;
void frac(){
  char str[10] = "\\frac{}{}";
  for(int i = 0; i < 10; i++){
    Keyboard.write(str[i]);
  }
  for(int i = 0; i < 3;i++){
    Keyboard.write(KEY_LEFT_ARROW);
  }
}
void setup() {
  // put your setup code here, to run once:
  pinMode(pin, INPUT);
  Keyboard.begin();
  delay(1000);
}

void loop() {
  // put your main code here, to run repeatedly:
  now = digitalRead(pin);
  if(prev == LOW && now == HIGH){
    frac();
  }
  prev = now;
}
```
* 配線

![circuit.png](https://qiita-image-store.s3.amazonaws.com/0/309703/1298cceb-fbaf-bfe2-fc7f-3fbee0c17735.png)

* スケッチを実行
* タクトスイッチを押すと現在のカーソルの位置に"\frac{}{}"と入力され, カーソルは一つ目の{}の間に入る

# やっていること
タクトスイッチを押すと"\frac{}{}"の文字列を順番にタイプしたのと同じ信号がArduinoからコンピュータに送られる.
# 問題点
* ハードを作らないといけない
    * しかしそれがよい
    * キースイッチとキーカバーを買ってキーボードを作ったら楽しそう
* カスタマイズするにはArduinoに書き込まなければならない
* VBSとは違って既に入力された情報を取得できないから, かねてから考えていた{}の間同士をジャンプするなどのソフトウェアを使った技巧ができない

# 苦労したこと
Keyboard.h/cppを使えることが分かったときは飛び上がるほどうれしかったが, "\"が入力できなくてキレた.
(Keyboard_jp.h/cppを作成されたtoshi-uさん, ありがとうございます.)

# 今後
自分でキーボードを作れるのは楽しそうだからLaTeXコマンドのうち汎用的なものを選び出して作りたい.
php-master-changes 2018-11-01

今日は PHP の生みの親がいくつかのテストを修正してた！

# 2018-11-01
## rlerdorf: This test needs to log to stdout
- https://github.com/php/php-src/commit/1954c7e1c6167db863096dcab0bf08cf1a6a5184
- [7.3~]
- 標準出力へログを吐かなければならないテストへ `--INI--` セクションを追加して設定を固定

## rlerdorf: Fix session tests that fail if error_log is set
- https://github.com/php/php-src/commit/4e8195769ddcc791c83e37b00019ef761b679412
- [7.3~]
- ext/session の error_log が設定されていると失敗するテストについて `--INI--` セクションで設定を固定するよう修正

## rlerdorf: Fix stray newline that caused this test to fail
- https://github.com/php/php-src/commit/99a9e85c65bb01d8254557a7685f25b6b26ef111
- [7.3~]
- sapi/cli のテストに紛れ込んだ誤った改行を修正
合成数列の和 (Python2/3)


|合成数列の和|https://qiita.com/advent-calendar/2018/composite-number|
|:--|:--|
|Python(/Ruby)|https://qiita.com/cielavenir/items/dcbd839b0c66af1bc971|
|Crystal|https://qiita.com/cielavenir/items/1a0dd1a94aca9935f5aa|
|Kuin|https://qiita.com/cielavenir/items/47fd18fc68055d990599|
|Swift|https://qiita.com/cielavenir/items/6cde3b20866c842dc9e2|
|Kotlin|https://qiita.com/cielavenir/items/f58eaa30f90781229a6d|
|Pascal|https://qiita.com/cielavenir/items/35c2fc54ca16b620c9c7|

代入禁止縛り。

## 試し割り

~~isqrtモジュールが入っていれば~~ 自前の平方根算出により、平方根までのチェックになります。

```py:composite.py
import sys,itertools
def isqrt(n):
	if n<=0: return 0
	if n<4: return 1
	x,y=0,n
	while x!=y and x+1!=y:
		x,y=y,(n//y+y)//2
	return x

def composite_numbers():
	for i in itertools.count(4):
		if any(not i%j for j in range(2,isqrt(i)+1)):
			yield i

print(sum(itertools.islice(composite_numbers(),int(sys.stdin.readline()))))
```

同様の処理をRubyで書くと以下のようになります。Ruby 2.5以降ではInteger.sqrtが標準で使えます。

```rb:composite.rb
p (4..).lazy.select{|i|(2..Integer.sqrt(i)).any?{|j|i%j<1}}.take(gets.to_i).sum
```

## 素因数分解

Pythonだと非標準モジュールが必須です(試し割りの際はモジュールがなければフォールバックできた)

```py:prime.py
import sys,itertools
import sympy

print(sum(itertools.islice((i for i in itertools.count(4) if not sympy.ntheory.primetest.isprime(i)),int(sys.stdin.readline()))))
```

```rb:prime.rb
require'prime'
p (4..).lazy.select{|i|!i.prime?}.take(gets.to_i).sum
```

\# Rangeの終端、Ruby 2.6だと省略できるのを下書き後に知り。この記事公開25日にすればよかったと思ったけど後の祭りです(∴こちらのプログラムは2.6以降専用です)。
SnakeYAMLによるYAMLデータのパース (なろうリーダー(仮) 3日目)

# やりたいこと
- 【大目標】 [小説家になろう](https://syosetu.com/)の小説ダウンロードAndroidアプリの作成。
- 【中目標】[なろう小説API](https://dev.syosetu.com/man/api/)を使った小説検索機能の実装。
- 【この記事のゴール】なろう小説APIで取得したYamlデータのパース方法の模索。

# [SnakeYAML](https://code.google.com/archive/p/snakeyaml/)について
- InputstreamやStringからYAMLデータを読み込み、適当な型にパースしてくれる便利ライブラリ。
- YAMLデータにおいてアイテムが複数階層で定義される場合、戻り値は入れ子構造となる。
- YAMLデータがおいてアイテムが並列に定義される場合、戻り値は`List`または`Array`となる。
- `load`時に型を指定しない場合、YAML文章の`Key`と`Value`それぞれに型推測を行い`LinkedHashMap<Object,Object>`を返す。
- `load`時に型を指定した場合、指定した型にキャストして返してくれる。
    - 指定する型にはSetterとGetterの両方が定義されたデータを定義する必要がある。

## 型指定なしの場合
``` java
LinkedHashMap<String,Object> doc = yaml.load(inputStream);
```

| YAML文章|生成されるJavaオブジェクト|備考|
|:-----------|:------------|:------|
| novel_type: 1|LinkedHashMap\<String, **Integer**\>|
|keyword: ほのぼの 学園|LinkedHashMap\<String, **String**\>| 空白や改行が含まれる場合もStringは１つ|
|updated_at: 2018-10-30 05:53:44|LinkedHashMap\<String, **Date**\>|
|gensaku: null|LinkedHashMap\<String, **Object**\>|valueはnull|


## 型指定ありの場合

``` java
Item doc = yaml.loadAs(inputStream, Item.class);
```

``` Item.java
public class Item {//Lombokを利用
  @Setter @Getter private Integer novel_type;
  @Setter @Getter private String keyword;
  @Setter @Getter private Date updated_at;
  @Setter @Getter private String gensaku;
}
```
- 入力元のYAML構文に定義済み項目が存在しない場合、プリミティブ型の場合は例外(`YamlException`)、クラスの場合は`null`となる。

# パースしたいYAML構文(なろう小説API出力)
``` yaml
---
-
 allcount 2
-
 title AAA
 writer aaa
 ...(その他多くのパラメータ)
-
 title BBB
 writer bbb
 ...(その他多くのパラメータ)
```
- 1アイテム目に取得した小説数(allcount)を定義される。
- 2アイテム以降が、実際の小説サマリデータとなる。(アイテム数はallcountに依存)
- 入力元のYAML構文はできるだけ加工したくない。


##パース後のデータ構造
``` こんなデータクラスに格納したい.java
public class NovelSummary { // allcount(小説数)は含まない
    @Setter @Getter private String title; 
    @Setter @Getter private String writer;
　　…その他たくさん
} 
```

## パースするのに困ること
- トップレベルのアイテムが複数のため、本Yaml構文は`Array`または`List`型でのみパースできる。
- ジェネリクスでリストの型指定はできず、戻り値は`LinkedHashMap`となる。
- そもそも、１アイテム目(小説数)と２アイテム目以降(小説データ)が並列関係で定義されているため、一括でデータ化できない。

``` できません.java 
List<NovelSummary> docs = yaml.load(target);
```

## 他の人はどうしてるの？
- [StackOverrun](https://stackoverrun.com/ja/q/7841611) - 入力元のYAML文を改造(ルートにアイテムを追加し、当該アイテムのコンストラクタでパース)
- [baeldung](https://www.baeldung.com/java-snake-yaml) - 同上


## 悩んだ結果、最終的な実装

``` java
  public static ArrayList<NovelSummary> parseYaml(String input) {
    ArrayList<NovelSummary> results = new ArrayList<>();
    Yaml yaml = new Yaml();

    List list = yaml.load(target); //戻り値は List<LinkedHashMap<String,?>>
    ListIterator iterator = list.listIterator(1); //最初の1アイテム目は小説数のため読み飛ばす
    while (iterator.hasNext()) {
      String docYaml = yaml.dump(iterator.next()); //LinkedHashMap から YAML構文を生成
      NovelSummary sr = yaml.loadAs(docYaml, NovelSummary.class); //YAML構文を独自データ型にキャスト
      results.add(sr);
    }
  return results;
  }
```

-　型指定なしでリスト形式にYAMLパースを実施し、リスト内の各要素に対して再度YAMLパースすることで独自データ型にキャストしてみる。
-　~~SnakeYAMLにキャストさせずに、自分でHashMapから独自データ型を生成するほうがベーシックなような~~

## まとめ
- インテリジェンスに解析してくれるため、YAMLはとても便利。
- ただし、データ構造が単純な場合に限る。
- データ構造が複雑(ネストとか、並列階層のアイテムの構造が違うとか)の場合は、つらかとです。
Flutter/DartのDrawingAPI

# 概要

Flutter/Dart環境でほそぼそとサンプルを作ってて気がついたんですが、所謂Creative Coding環境として非常に優秀な子かもしれません。

この分野ではProcessingやopenFrameworksなどが有名ですが、スマートフォン向けにサクっとデプロイできて試行錯誤が容易、描画APIも比較的癖がなく個人的には非常に魅力的です。

本来の用途からすると明後日の方向なのは百も承知で所感を書こうと思います。

ちなみに、Creative Codingっつうもったいぶった名前は微妙にモヤりますね
（ProgrammingやCodingはどの分野であれCreativeだと思ってるから）

# HotReload, HotRestart

多くのFlutterianが口を揃えて賛美する機能ですが、まあ優秀です。モーションのスピードや色相のバランスなどパラメータを修正すると即反映されます。「即」っていうのがどれくらいかというと1-2秒くらい。ガチです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Flutter?src=hash&amp;ref_src=twsrc%5Etfw">#Flutter</a> <a href="https://twitter.com/hashtag/Dart?src=hash&amp;ref_src=twsrc%5Etfw">#Dart</a> 環境のHotReloadが快適なのでmotionScript的なやつが非常に捗る <a href="https://t.co/19i5Ymdmzv">pic.twitter.com/19i5Ymdmzv</a></p>&mdash; Kappa-Lab.gamiken (@kappaLab) <a href="https://twitter.com/kappaLab/status/1054889355649605632?ref_src=twsrc%5Etfw">2018年10月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# Canvas Class

実際に丸や四角、線を描くのは[CanvasのAPI](https://docs.flutter.io/flutter/dart-ui/Canvas-class.html)を使います。[HTML5のCanvas](https://developer.mozilla.org/ja/docs/Web/HTML/Canvas)と似ている点もありますが（moveToとかlineTo）異なる点も多いです。

[Path Class](https://docs.flutter.io/flutter/dart-ui/Path-class.html)を使えばベジェ曲線も描画可能です。

Canvasに描画した内容はPictureインスタンスとして生成され、Windowに渡してRenderingされます。RenderBoxやCustomPainterを使うとこの辺は隠蔽されますが、Widgetを使用すると後述のフレーム毎処理が厄介になります。

# フレーム毎処理

Processingのdraw()、UnityのUpdate()、ActionScriptのonEnterFrame()の様にフレーム毎に処理を行うには

```
 void main() { 
   ui.window.onBeginFrame = beginFrame; 
   ui.window.scheduleFrame(); 
 } 
```
https://github.com/flutter/flutter/blob/master/examples/layers/raw/spinning_square.dart

という感じでWindow.onBeginFrameにcallbackを渡してやります。Widgetを使用するとcallbackの中でStatefulWidget.setState()を呼ぶことになると思いますが、オーバーヘッドが気になります。（未検証）

# 成果物

上記のフレーム毎処理やレンダリング処理をまとめたクラスを[Gist](https://gist.github.com/kappa-lab/775b3824284eefd0669732df8ebb445d)に一時保管。もう少し整備してrepogitoryを作る予定です。
WindowsバッチでSQLiteのデータベースの値を取得する方法

# はじめに
Windowsバッチでもデータベースの値を取得することができます。

今回、WindowsバッチでSQLiteのデータベースの値を取得する方法を解説します。
ただし、今回解説する方法はWindows上に存在するDBの値を取得する方法に限りますので、
別サーバー上のDBの値を取得する方法ではないのでご注意ください。

# 1. サンプルコマンド
まずサンプルとして、以下の情報のときsample_tableのvalueを取得する例をあげます。

SQLite起動exeファイル：sqlite3.exe
DBファイル：sampleDb.sqlite
取得したいテーブル：sample_table
取得したいカラム：value

```sample.bat
set SQLCMD=sqlite3.exe "sampleDb.sqlite" "select value from sample_table;"
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%a in (`%SQLCMD%`) do set String=%%a
```

# 2. 構文
# 2-1. SQL実行コマンド
SQLite起動exeファイルへDBファイルとSQL文を引数として渡すことで
SQLの実行結果を取得することができます。

`SQLite起動exeファイル "DBファイル" "SQL文"`

各ファイルのパスですが、実行するbatファイルからの相対パスもしくは絶対パスのどちらも指定することが可能です。

上記コマンドを実行すると、SQL文の結果が戻り値として返却されます。

# 2-2. コマンド実行結果の取得
まず、for文を使用するときは以下のコマンドをあらかじめ実行します。

`setlocal enabledelayedexpansion`

ERRORLEVELコマンドを使用してエラー判定したいときなどに
このコマンドがないと正常終了してもエラーとしてリターンコードが返却されてしまいます。

理由としては、for文を実行している間にERRORLEVELコマンドが実行されるためです。

まあここはfor文を使うときはおまじないと思っていただければと思います。
なくても動きますが、for文を使用するときは記載するくせをつけましょう。

次にfor文の解説をします。

`for /f "usebackq delims=" %%a in (`コマンド`) do set String=%%a`

各オプションは以下の役割をしてます。

|オプション|役割|
|:--:|:--|
|/f|コマンドの実行結果を行単位で変数に読み込み繰り返し処理が行えるオプションです。|
|delims="|デリミタ(区切り)を無効にする。|
|usebackq=`コマンド`|`(バッククォート）で囲まれた文字列をコマンドとして実行する。|

for文でコマンドを実行し、戻り値を%%aに一時的に格納し、
Stringに代入しているというイメージです。

最後にもう一度サンプルプログラムをのせておきます。

```sample.bat
set SQLCMD=sqlite3.exe "sampleDb.sqlite" "select value from sample_table;"
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%a in (`%SQLCMD%`) do set String=%%a
```

ぜひ活用してみてください。

# さいごに
2020年から個人ブログはじめました！

フリーランスエンジニアになって得た知識と経験をもとに、フリーランスエンジニアに関する情報をはじめ、IT技術情報や業界情報、エンジニアライフハック等のコンテンツを配信していく予定です。

まだまだ記事数は少ないのですが、週単位で更新してますので、もしご興味ございましたら、みていただけると嬉しいです。

https://yacchi-engineer.com/

さいごまでお読みいただき、ありがとうございました。
XAMPPとは【初心者向け】

こんにちは。
HTMLでコードを書く場合、テキストエディタ等で打ったコードをそのままブラウザに反映させることができました。
しかしPHPを使ってコードを書く場合、そのままではブラウザにはんえいさせることができません。
そこで多くの場合、WEBアプリケーションを実行するためによく使われるXAMPPをインストールする必要があります。

##XAMPPとは
XAMPPとは日本語で「ザンプ」と呼び、WEBアプリケーションの開発環境となるソフトウェアの頭文字を合わせたものです。
- **クロスプラットフォーム**
WindowsやMac、Linuxなど、さまざまなOSに対応しています。
- **Apache**
世界中で広く使われているWEBサーバーのことです。
このWEBサーバーがなければWEBアプリケーションを使用することができません。
- **MySQL**
データベースのソフトウェアです。
WEB上で大量のデータを保管しなければならない際に使われます。
ここにデータを蓄積することで検索や加工、共有することが可能になります。
- **PHP**
WEBアプリケーションなどを作成する際に用いられるプログラミング言語の一種です。
HTMLに入れ込むことができ、Javaのような他の言語と比べて比較的習得が容易であることから人気の高い言語です。
- **Perl**
テキスト管理に適したプログラミング言語と言われており、比較的長い歴史があります。

##XAMPPのダウンロード方法
まずこちらのサイトにアクセスします。
https://www.apachefriends.org/jp/index.html
ここからは下の図のようにWindows、Linux、MacのOSにそれぞれ対応したファイルをダウンロードすることができます。
<img width="1280" alt="スクリーンショット 2018-11-02 0.40.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/cbe06945-583d-8054-3bba-bde13fed2422.png">

現在お使いのPCに合った形のファイルをダウンロードします。
私個人の体感ではダウンロードに5-10分ほどかかりました。

ダウンロードが終了するとアプリケーションを開きます。
パスワードの入力を求められたり、Bitnamiという環境構築ソフトに関するチェックタブが出たりします（特別なこだわりがなければチェックを外して大丈夫）。
そのままずっと画面を進めていくと以下のような画面が開きます。
<img width="671" alt="スクリーンショット 2018-11-02 0.46.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/93ddec7b-7029-cdd4-e652-9d8013a5ce80.png">

Apache　Web　Serverが起動していることを確認し、
<img width="671" alt="スクリーンショット 2018-11-02 0.52.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/5d875b69-af78-d425-abdd-8b39d632de86.png">

最初の画面に戻ってGo To Applicationをクリック。
<img width="1280" alt="スクリーンショット 2018-11-02 0.55.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/99f16d03-2f52-7fba-5f97-9071509ad3b5.png">
このような画面が出てくれば設定完了です。

##まとめ
以上、今回は初心者の方向けにXAMPPの意味とインストール方法をご紹介しました。
私も最初はXAMPPを知らないままPHPファイルをブラウザで開こうと無駄な努力をしていました。
これからPHPやPerlといったプログラミング言語を勉強される際は、ぜひこの記事を参考にXAMPPをダウンロードして見てください。
DynamoDBを使ってみて

# 何
- DynamoDBを使った際のメモ
- 内容に古い点があればご指摘ください

## 内容
- 古くなったデータはTTL機能で消せる。トリガーを使えば移動も可能
- または、最初から月次テーブルとして作成し、数ヶ月で消す（当月以外はキャパシティを低くする）
- テーブルのサイズが10GBを超えるとパーティション分割される。キャパシティはパーティション数で割り算されるため、参照頻度の低い古いデータが溜まると性能が落ちていく。（データが減ってもパーティション数は減らない点も注意）
- LSIを使った際に、「同じハッシュキーを持つItem」の合計サイズに、10GBという制限がある。射影を控えて制約にひっかからないようにする。
- 項目コレクションのサイズを監視することにより、データ量の警告（8GBを超えましたなど）を出すことができる
- 項目の最大サイズは400KBだが、このサイズではreadで100、writeで400キャパシティが必要になる。項目サイズがキャパシティ見積もりに影響大。
- 「スパースなインデックス」により、特定の状態にある項目を軽量に取得可能
- autoScaleを使用したとして、急激な要求量の増加に耐えられるかどうか。耐えられない場合は、どこかで要求量がなだらかに増加するように調整できるか検討する
- （利用しなかったキャパシティを300秒間保持しているので、この部分を使い果たす前に、Scaleを上げる必要がある）
Permission to　◯◯　denied to　△△ と出てプッシュできない時の対処法

## なんかエラーがでてプッシュできない…
```
Premote: Permission to nabe-kurage/test.git denied to hogehoge
```
プッシュしようとすると上記の様なエラーが出てしまい、プッシュできない場合の話。
 複数のgitアカウントを持っていて、configを設定してもなぜか違うアカウントにむすびついてしまうとこうなります。
一度、gitのuser.nameとemailを設定し直しましょう。

```
$ git config --global user.name “HOGE（ユーザー名）”
$ git config --global user.email “hoge@hoge.jp（メールアドレス）”
```

## それでもだめなら…
以下の手順を試してみて、紐ついてしまったgitアカウントのデータを消してやります。
(注：MACの場合)
 
 
 - キーチェーンアクセスを開く
 - gitで検索
 - 設定されて困っている方のアカウント情報を消す。
 - これでOK
 - もう一度git pushをしてみたらいけるはずです。
Vue.js で ColorPicker (iro.js) を使う方法

タイトル通り。

[iro.js](https://iro.js.org/) という Color Picker をどうしても使いたかった、Vue.jsで。[^dousitemoooooooooooooo]
しかし、Vue.js向けには作られていないのでちょっとだけ使い方を工夫する必要があった。
具体的な方法についてはGithub上でおこなわれた議論(?)の途中に出てきた template の書き方を参考にした。[^raisensu]

[^dousitemoooooooooooooo]: デザイン的に、丸いのが可愛いからです。

### 実行結果

以下画像。
この丸い、Color Pickerが良かった。（他のは四角いの多い）
![スクリーンショット 2018-11-02 0.41.42.png](https://qiita-image-store.s3.amazonaws.com/0/93918/82d52b2d-07f4-5efe-b44f-aabe4fd838f5.png)

### インストール

```terminal
$ npm install @jaames/iro
```

### ソースコード

```ColorPicker.vue
<template>
  <div :id="'iro-'+id"></div>
</template>

<script>
import iro from '@jaames/iro'

let colorPicker;
export default {
  name: 'color-picker',
  props: ['value', 'config'],
  data() {
    return {
      id: this._uid,
    }
  },
  mounted() {
    this.init();
  },
  methods: {
    init() {
      if (!this.value || this.value.length > 7) {
        this.config.color = '#ffffff'
      } else if (this.value.length === 6) {
        this.config.color = '#' + this.value
      } else {
        this.config.color = this.value;
      }

      colorPicker = new iro.ColorPicker('#iro-' + this.id, this.config);
      colorPicker.on('color:change', this.emitColor)
    },
    updateConfig() {
      // TODO - watch for config changes and apply them
    },
    emitColor(color) {
      this.$emit('input', color.hexString);
    }
  },
  watch: {
    value: (to) => {
      if (colorPicker && colorPicker.color && to.length <= 7) {
        colorPicker.color.hexString = to;
      }
    },
    config: () => {
      this.updateConfig()
    }
  }
}
</script>

<style scoped>

</style>
```



[^raisensu]: https://github.com/jaames/iro.js/issues/30 の議論にでているソースコードを参考にした。参考先は　[adrianjost/SmartLight-Firebase](https://github.com/adrianjost/SmartLight-Firebase) である。またライセンスが不明であるがため、参考にした点で何らかの問題があるかもしれないが、 MIT LICENSE である iro.js の Issue 上に特に料金体系等に関する記載なく掲載しているためMITと仮定して使用した。元のソースコードを監視(watch)し、ライセンスが適用されればそのライセンスに従う。また、ライセンスが無いことを指摘し作って欲しいというIssueを作成した。[これ](https://github.com/adrianjost/SmartLight-Firebase/issues/1)
S3の静的ホスティング設定手順メモ

# S3で静的ホスティングする

## 手順

"バケット作成"→バケット名を入れて→"③アクセス許可の設定"まで"次へ"
↓
"③アクセス許可の設定"で"パブリックアクセス許可を管理する"を"このバケットにパブリック読み取りアクセス権限を付与する"へ変更して、バケット作成まで完了させる。
↓
バケット一覧に戻るので、バケットに"パブリック"と付いてるのを確認する
↓
作成したバケットを選択して、"プロパティ"→"static website hosting"→"このバケットを使用してウェブサイトをホストする"を選択→インデックスドキュメントを適当に入力→"保存"
↓
バケットにファイルをアップロード
↓
アップロードしたファイルを選択して、"アクセス権限"→"パブリックアクセス"→"Everyone"→"オブジェクトの読み取り"にチェックを入れて"保存"
↓
URLは http://<バケット名>.s3-website-<リージョン名>.amazonaws.com/<ファイルパス>
[※公式サイト](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteHosting.html)
↓
アクセスして表示されれば成功。

## 既に存在してるバケットに対しての設定

バケット選択→"アクセス権限設定"→"パブリックアクセス"→"オブジェクトへのアクセス"の"オブジェクト一覧"へチェックを入れる
↓
上の手順の"static website hosting"の設定のところから同じ手順で実行する

## ファイルアップロード時の注意事項

即アップロードではなく、
`アップロード > 次へ（右下のボタン）` と手順を踏んで `パブリックアクセス許可を管理する` を `このオブジェクトにパブリック読み取りアクセス権限を付与する` にしないと `403` になるので注意。

## 補足

↓で一括でパブリック読み取りアクセス権限を付与できる。

```bash
$ aws s3 ls --recursive s3://${バケット名}/ | awk '{print $4}' | xargs -I{} aws s3api put-object-acl --acl public-read --bucket ${バケット名} --key "{}"
```
※[こちらより拝借](https://qiita.com/kentokento/items/7881efe1717fbe5fdfba)
MacのターミナルからUSBメモリを安全に取り外す

## 動機
普段Finderを使うことはあまりなくて、ファイル弄ったりするのはターミナル(iTerm)を介することが多いので。
あまりCmd+Tab使いたくないのと、Finder開くと.DS_Storeが生成されるのが嫌というのもあります。

## 結論
~~安全取り出しとか気にせずぶっこ抜く~~diskutilを使うといいそうです
ファイルシステムのデバイス名もしくはUSBメモリのボリューム名を指定できます。

```
$ diskutil eject /dev/disk2s1 # デバイス名
$ diskutil eject Sony_4GU     # USBメモリのボリューム名 
```

デバイス名/ボリューム名は`diskutil list`または`df`で確認できます。
`diskutil list`では(external, physical)となっているところの末尾に表示されていることが確認できました。デバイス名は`IDENTIFIER`の列、ボリューム名は`NAME`の列に表示されているようです。

```
$ diskutil list
/dev/disk0 (internal):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         251.0 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         250.7 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +250.7 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            143.3 GB   disk1s1
   2:                APFS Volume Preboot                 22.1 MB    disk1s2
   3:                APFS Volume Recovery                519.0 MB   disk1s3
   4:                APFS Volume VM                      5.4 GB     disk1s4

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *3.9 GB     disk2
   1:             Windows_FAT_32 Sony_4GU                3.9 GB     disk2s1
```
dfも末尾に表示されていました。デバイス名は`Filesystem`列、ボリューム名は`Mounted on`列の/Volumes以下に表示されているようです。

```
$ df
Filesystem      Size   Used  Avail Capacity iused               ifree %iused  Mounted on
/dev/disk1s1   233Gi  133Gi   94Gi    59% 1863367 9223372036852912440    0%   /
devfs          198Ki  198Ki    0Bi   100%     684                   0  100%   /dev
/dev/disk1s4   233Gi  5.0Gi   94Gi     6%       5 9223372036854775802    0%   /private/var/vm
map -hosts       0Bi    0Bi    0Bi   100%       0                   0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%       0                   0  100%   /home
/dev/disk1s3   233Gi  495Mi   94Gi     1%      16 9223372036854775791    0%   /Volumes/Recovery
/dev/disk2s1   3.6Gi  1.8Gi  1.8Gi    50%       0                   0  100%   /Volumes/Sony_4GU
```

ディスク名/ボリューム名はdfで確認して、取り出しコマンドにはalias張るのが好みです。

```:.bashrc
alias de='diskutil eject'
```
【Git】間違えて消したファイルの取り戻し方

だいぶ前に削除したファイルを、後になって「あれ消しちゃったの！！早急元に戻しといて！」と言われた時のためのTips。

まずターミナルを開いて、git管理しているディレクトリまで移動してきましょう。
参考コマンド
`cd`…移動
`ls`…リスト表示

ディレクトリにたどり着いたら、ファイルの削除を実行したGitのログを探していきます。

```
git log --diff-filter=D --summary
```

- `git log`…ログを最新順で表示してくれます。
- `--diff-filter=D`…何かを削除した時のコミットデータだけに制限します
- `--summary`　で操作したファイル名が確認できます

コードを入力すると、削除したコミットログとファイル名が羅列されます。ぱっと見てなかったら、下方向の矢印を押すことで、さらに過去のコミットログを見ることができます。また、qを押せば終了することができます。

```
commit b322eb6c0833cffcc6e7c6c4990d5ed11177ad40
Author: nabe <nabe_nabe@yahoo.co.jp>
Date:   Fri Oct 19 16:08:52 2018 +0900

    modify: #211 不要ファイル削除


 delete mode 100644 dist/test1.html
 delete mode 100644 dist/test2.html
```


自分の求めているファイルを見つけたら、その情報のコミットIDとファイル名をコピペしましょう。
次に、削除してしまったファイルとそのコミットログを指定して、指定ファイルだけ削除する前に戻します。

```
git checkout 『コミットID』 -- 『ファイル名』
```
具体的に書くと…

```
git checkout b322eb6c0833cffcc6e7c6c4990d5ed11177ad40^ -- dist/test2.html
```
こんな感じになります。
これで指定されたファイルは元に戻っているはずです。このコードの解説をいたしますと…
- `checkout`…いわゆるチェックアウトです。ブランチ切り替えでも使いますが、今回の場合は前のコミットの状態に戻す意味で使っています。
- `^`…このコミットの一つ前のコミットを意味します。このブランチまで戻ると消した後になってしまうので、その一つ前にもどすんですね。
- `--`…オプションはないよという引数です。

これで指定ファイルだけが戻った状態になったかと思います。
消したファイルを戻さなくちゃいけなくなった時は試して見てください。
JavaScriptでHTMLを書き換える

# JavascriptとJQueryの混同
JavaScriptで要素を取得して中身を書き換えようとしたとき、JavaScriptとJQueryが混同して、はまってしまった。

```html:html
<div id="hoge"></div>
```
```javascript:混同
var hoge = $("#hoge");
var str = "hogehoge"
hoge.innerHTML = str;
```
`var hoge = $("hoge")`は、JQueryで要素を指定して、中身を取得している。
`hoge.innerHTML = str`の`innerHTML`は、javascriptのメソッド。
この方法では、書き換えられない。

### 書き換えるなら

```javascript:JQueryバージョン
var hoge = $("#hoge");
var str = "hogehoge"
hoge.html(str);
```
もしくは、

```javascript:javascriptバージョン
var hoge = document.getElementById("hoge");
var str = "hogehoge"
hoge.innerHTML = str;
```
で書き換えられる。
Herokuにデプロイしようとして、ここから進まなくなっています。原因がわからないので、教えていただきたいです

application errorの状態からデプロイしたページに移動したい。
ここに質問の内容を詳しく書いてください。
rails4(mysql)を使っています。railsやrubyのバージョンなどを変更したのですが、変化なく、動かない状態になっています。どこが原因か教えていただきたいです。
Herokuのデプロイを実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ
2018-10-31T19:28:49.367339+00:00 heroku[web.1]: Process exited with status 1
2018-10-31T19:28:49.136121+00:00 app[web.1]: /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:121: warning: constant ::Fixnum is deprecated
2018-10-31T19:28:49.136149+00:00 app[web.1]: /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:121: warning: constant ::Bignum is deprecated
2018-10-31T19:28:49.303526+00:00 app[web.1]: /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:131:in block (2 levels) in <class:Numeric>': stack level too deep (SystemStackError)
2018-10-31T19:28:49.303531+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:131:in block (2 levels) in <class:Numeric>'
2018-10-31T19:28:49.303533+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:131:in block (2 levels) in <class:Numeric>'
2018-10-31T19:28:49.303534+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:131:in block (2 levels) in <class:Numeric>'
2018-10-31T19:28:49.303540+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:131:in block (2 levels) in <class:Numeric>'
2018-10-31T19:28:49.303542+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:131:in block (2 levels) in <class:Numeric>'
2018-10-31T19:28:49.303544+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:131:in block (2 levels) in <class:Numeric>'
2018-10-31T19:28:49.303545+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:131:in block (2 levels) in <class:Numeric>'
2018-10-31T19:28:49.303547+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/activesupport-4.2.6/lib/active_support/core_ext/numeric/conversions.rb:131:in block (2 levels) in <class:Numeric>'
2018-10-31T19:28:49.303549+00:00 app[web.1]: ... 8541 levels...
2018-10-31T19:28:49.303557+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:39:in run_command!'
2018-10-31T19:28:49.303563+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.4.0/gems/railties-4.2.6/lib/rails/commands.rb:17:in <top (required)>'
2018-10-31T19:28:49.303565+00:00 app[web.1]: from bin/rails:9:in require'
2018-10-31T19:28:49.303567+00:00 app[web.1]: from bin/rails:9:in `<main>'
PhpMetrics - コード・メトリクスをお手軽にビジュアル化

# はじめに

前回の記事（[PHPUnit - テストカバレッジをHTMLレポートで出力 / phpdbg + php-code-coverage + PHPUnit](https://qiita.com/anfangd/items/5038f6ae46144c413825)）では、UnitTest 実行時の網羅率をビジュアル化する為に、 **phpdbg** と **php-code-coverage** を使用して、**テストカバレッジを HTMLレポートする方法**についてまとめました。

今回は、静的解析に位置づけられるもののうち、**コード・メトリクス**に関連した情報を**イイ感じで出力**するツールに関する導入手順を記載します。

# 想定環境

本記事は以下の環境にて動作確認を行っています。

- OS : Windows / macOS
- 仮想環境 : VirtualBox + Vagrant
- コンテナ : Docker Container by docker-compose [^1]
- PHP
 - PHP 7.2.11
 - composer 1.7.2
 - PhpMetrics 2.4.1

# 構築手順

## 概要

今回構築する環境は、 CentOS/7 の上に、 Docker をインストールし、その上で **PHPUnit + phpdbg + php-code-coverage** を使用してレポートを出力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79222/33b7f74c-52a5-606f-d04b-58a395e31ce5.png)

## 手順

これから行う手順は、以下の記事で紹介した手順で構築した ローカル開発環境 をベースとして操作を行ってゆきます。
Windows / Mac を問わず簡単に構築が可能ですので、動作の再現を行いたい場合はそちらの記事を参照してください。

- [docker - ローカル開発環境の構築 / Laravel on Vagrant + VirtualBox with Docker - Qiita](https://qiita.com/anfangd/items/8c57f3d753117ea288b9)

なお、上記の手順の中で **PHP** や **composer** はインストール済みの為、Composerインストールが必要な **PhpMetrics** のインストールから操作を進めます。

### 1. PhpMetrics のインストール

composer コマンドを実行して、 PhpMetrics をインストールします。

```bash:@VirtualHost
$ docker-composer exec php composer require --dev phpmetrics/phpmetrics
```

### 2. HTMLレポートを出力

インストールした　PhpMetrics を使用して、メトリクスに関連する情報を HTML 出力します。

```bash:@VirtualHost
$ docker-composer exec php php ./vendor/bin/phpmetrics --report-html=myreport .
```

### 3. レポートの確認

生成した　HTMLレポート は以下の場所に出力されていますので、Webブラウザで確認しましょう。

```bash:@VirtualHost
$ ./myreport/index.php
```

今回は Laravel に AdminLTE をミニマム構成で組み込んだプロジェクトを解析してみました。
結果は以下のようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79222/f1d0abaa-d9f1-b359-d4e3-d530a4f76eb1.png)

composer コマンド一発でインストールすることが出来、HTMLレポートの生成もすぐに行うことができるので、手間なくすぐに導入することが可能です。

# 終わりに

コーディングしたプロジェクト内に含まれるソースコードについては、行数やコードの重複、クラス数など、UnitTestの実行以前に解析することが出来る情報が多く存在します。
「**静的解析**」や「**机上デバッグ**」と呼ばれるように、ソースコードを定量的、定性的に見ることによってバグの検出を行うことが出来るので、 **PhpMetrics** のようなツールは非常に有用だと思います。

これまでこういったツールは、 [SonarQube](https://www.sonarqube.org/) くらいしか使ったことがなかったのですが、 今回の調査で PHP に特化したツールを発見することが出来ました。
このツールの利点は、 **composer でお手軽にインストールすることができ**、 **PHP が実行出来る環境であれば、 Webサーバやその他のツールをインストールすることなく利用出来る**ことだと思います。

プロジェクトで適切に使用することで、ソースコードのセルフ・クロスレビュ時や、テスト計画の立案時などにデータを活用出来るのではないでしょうか。

# 参考

## 様々な静的解析ツール

- [exakat/php-static-analysis-tools - GitHub](https://github.com/exakat/php-static-analysis-tools)
- [PHP Code Quality Tools to Check and Improve your Code - Web technologies](https://web-techno.net/code-quality-check-tools-php/)

## PhpMetrics

- [phpmetrics/PhpMetrics - GitHub](https://github.com/phpmetrics/PhpMetrics)
- [PhpMetrics - Demo](http://www.phpmetrics.org/report/latest/index.html)
- [PhpMetrics - Docs](https://www.phpmetrics.org/)

## Other

- [Qafoo/QualityAnalyzer - GitHub](https://github.com/Qafoo/QualityAnalyzer)
【Vue.js入門】v-bindでclassを操作してToDoアプリの完了状態を管理してみる

# ToDoアプリの完了状態を管理できるようになる
今回の[サンプル](https://codepen.io/tsu2626/pen/Pyreyr)はこちらで確認できます。
完成形はこんな感じで、タスクを完了（チェック）すると文字が青くなり横線が入るようになります。
![Screen Capture 46.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/253605/f6f2de17-e9ee-6679-a157-38f59ad267f7.gif)

# JavaScriptにデータに完了状態を加える
todoそれぞれに**title**と状態を表す**isDone**を用意します。

```js
data: {
  newItem: '',
  todos: [{
    title: 'task1',
    isDone: false
  }, {
    title: 'task2',
    isDone: true
  }, {
    title: 'task3',
    isDone: false
  }]
```
上記のようにオブジェクトごとにすることによって、**todoのタイトル**と**状態**を表現できるようになります。
今回は**task2**だけを**true**とし、サンプルgif画像で言う**チェックや横線が入っているタスク**になります。

新規作成するtodoにデフォルトで状態を**folse**になるように設定します。

```js
let item = {
  title: this.newItem,
  isdone: false
};
```

以上の変更により、**push**するのは**item**に変更されます。

```js
this.todos.push(item);
this.newItem = '';
```
# HTML側で完了状態を表示できるようにする
今までは**{{ todo }}**だけで表示させてきましたが、**data**が細分化されたため、タイトルを表示させるためには**{{ todo.title }}**とさせる必要があります。
今回は**チェックボックス**も表示します。

```html
  <input type="checkbox" v-model="todo.isDone">
  <!-- <span v-bind:class ="{done: todo.isDone}">  -->v-bind:を省略
  <span :class ="{done: todo.isDone}">//todo.isDoneがtrueの時、doneというクラスが適用
    {{ todo.title }}
  </span>
```

# 最後にCSSで状態を表現
HTML側で**todo.title**にクラスを指定したのでCSSで装飾します。

```css
#app li > span.done{
  text-decoration: line-through;
  color: blue;
}
```
**id=app**のクラスがdoneだったらCSSを適用するようにしています。
**text-decoration: line-through;**で打ち消し線になってます。

以上で、表題のToDoアプリの完了状態の管理ができるようになりました！

今回の[サンプル](https://codepen.io/tsu2626/pen/Pyreyr)はこちらで確認できます。
完成形はこんな感じで、タスクを完了（チェック）すると文字が青くなり横線が入るようになります。
![Screen Capture 46.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/253605/f6f2de17-e9ee-6679-a157-38f59ad267f7.gif)
【GitHub】楽しく草を生やしやすい環境を作ろう！【Sourcetree】

![Github.png](https://qiita-image-store.s3.amazonaws.com/0/307359/682616b6-ee8b-298e-4835-1f1874d50b9c.png)

1コミット目がプログラミング始めたて（HTML,CSS学んでた時期）
間が空いてるのはGitHubをよく知らなかった＆就職活動＆リポジトリ消したら草が消えた。
やたら濃い所はREADMEの書き方と沢山機能さわりまくってた(忘れた)
途中からの緑まみれは何が起きた？と思う人もいると思いますが簡潔に言うと
#### GitHubに『気軽』に草を生やす事が出来る環境にした。
「GitHubって凄いプログラマーが使ってるやつでしょ？」
いえ、使い方でプログラミングを始めたばかりの人でも使えてモチベを上げてくれて、武器に出来て成長する為のツールに出来るんです！

具体的には
####・[Sourcetreeの導入](https://ja.atlassian.com/software/sourcetree)
※ 今回のメイン愛用ツール
分かりやすく言うとこのツールは、GitHubのリポジトリとリンクしてるフォルダに更新があれば自動で「まだGitHubに上げてないよ～コレとコレ！」と未更新ファイルを表示してくれボタンでコミット出来る
（色んなGit機能を分かりやすくしっかり使えます。）

#### ・ほんの少ししか触れなかったとしても毎日草を生やす事で日課にする
これの意図は、少ししか出来なかったとしてもコードは少なからず見る事になるし手を動かさないと草は生やせませんので経験が浅いけど成長したい！でも何をすれば..って人に良いと思います。


##### これでも自分、毎日6時30起きの23時帰宅なんです。
(自慢になってない…)


####GitHubは気になるけどまだちょっと乗り気じゃない方
インストールめんどくさいし想像と違ったら嫌だな～って人！
自分がGitHub大好きになってSourcetreeを知ったきっかけの本

### 『わかばちゃんと学ぶ Git使い方入門』
![20181102_000737_775.jpg](https://qiita-image-store.s3.amazonaws.com/0/307359/b514a1a8-f3f8-dddc-3c6e-ed1306bd82c2.jpeg)

漫画で分かりやすく楽しく、スラスラ読めて"GitHubでプルリクエスト"まで実践できます！
自分はこの本に本当に感謝してるし、一番楽しく学べた本だと思う。

ぜひGitHubに興味がある人は、Sourcetreeの導入やこの本を読んでみて欲しい
そしてGitHubは、IT業界では転職などで武器にもなります。

客先常駐の方などは、イマイチ評価されずらいと思うので、
自分で学んだ物や成果物を見せたり出来れば評価は上がるかもしれません。
こんなツイートを目にした事があります。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">うまく生きるコツは「成果を人に言う」こと。人はあなたのことを常に見ているわけじゃないし、すべての成果が分かりやすいわけじゃない。だからあなたが言わないと誰も「あなたが成果を出した」と認識しない。ほとんどの人は成果を出して満足して人に言わないために、評価されず文句を言う。</p>&mdash; さけびん ｜ 仕事のお悩み解決 (@WSakebi) <a href="https://twitter.com/WSakebi/status/1032044029272178688?ref_src=twsrc%5Etfw">2018年8月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


つまり良い事しかない！これはやるしかないな
では楽しいプログラミングライフを( ´∀｀ )
  　　
　　
  
私のGitHub（見てるのも好きだからフォロー返すよ！気軽にどうぞ）
### https://github.com/aocattleya
はじめてのGitとGitHub

# はじめてのGitとGitHub
久しぶりにgit使ってみたらやり方を完全に忘れていたので, メモっておく. 
gitは, ソースコードの変更履歴を管理するツール. 
[GitHub](https://github.com/)は, gitと連携してソースを公開できるようにしたWebサービス. 
そのようなサービスには, 他に[Bitbucket](https://bitbucket.org/)がある. 
~~昔使った記憶だと, 無料アカウントではGitHubは全体公開しか選択できなくて, Bitbucketは公開範囲を指定できた気がする.~~
追記: GitHubも2019/01/07に無料アカウントでPrivate Repositoryに対応した

今回は訳あって, githubで説明する. 
(Bitbucketの方が使いやすかった記憶がある)

## [GitHub](https://github.com/)
https://github.com/ ここから登録する. 
登録後`New Repository`からリポジトリを作成する. 
ここまでは, 調べれば出てくる. 

## Git
gitは[cygwinなどでインストール](https://qiita.com/birdwatcher/items/891ebe41a5e80d080171)しよう. 

ここからが, 少し惑わされた. 
`github 使い方`とかで調べると, 「ディレクトリ作って`git init`する...」などと説明が出てくる. 
しかし, 自分の場合はこのまま進めていくと, Errorが出てうまくいかなかった. 
(Web上にあるものと, ローカルで作ったものが違ってたりとかややこしい)
既にgithubでリポジトリを作ったなら, `git clone`の方が早いので, その方向で進めていく. 

1. `git clone URL` 
 - URLはここから確認できる: 
![url.png](https://qiita-image-store.s3.amazonaws.com/0/294661/129b3937-4c95-d009-0706-9563736647d5.png)
 - この操作でWeb上のものと同じものがローカルに複製される
2. `cd リポジトリ名`
 - クローンしたリポジトリのディレクトリに入る
 - `ls -a`で`.git`があることを確認しよう
 - これ以降, このディレクトリ内で作業をする
3. `git status`
 - 現在のステータスを確認するコマンド
4. `git add ファイル`
 - 追加したいファイルを`.git`と同じ階層に置いた後に実行
 - この操作で, そのファイルがgitの管理対象に入る
 - 操作を取り消すには`git rm --cached ファイル`か`git reset`
 - 全ファイルを追加する場合は`git add --all`
 - 変更があったファイルのみ追加する場合は`git add -u`
5. `git commit -m "コメント"`
 - 作成したファイルをgitへ保存
 - mオプションでコメントをつけておくとよい
 - ここまでの操作ではまだWeb上のファイルは変わっていない
 - `Please tell me who you are.`というErrorが出たら, 次を実行してから再チャレンジ
      - `git config --global user.email メールアドレス`
      - `git config --global user.name ユーザ名`
 - 直前のcommitを取り消すには`git reset --hard HEAD^`
6. `git push origin master`
 - ローカルの変更をWeb上にコミットしよう
 - ユーザ名とパスワードが聞かれる
 - Web上で変更されたことを確認してみよう

とりあえず, 一旦ここまで. 
branchとか他の機能は気が向いたら書きます.
Jupyter Notebookのホームディレクトリを変更する

windows10にインストールしたAnacondaに入っているJupyter Notebookのホームディレクトリを変更する手順です。以外と忘れるので備忘録として書いておきます。

# 1.設定ファイルを作成する

まず、Anaconda Navigator からAnacondaプロンプトを起動します。
※以下の画像の赤枠の箇所をクリックすると開きます
![Ana_navi.png](https://qiita-image-store.s3.amazonaws.com/0/163518/9d8a3c94-af33-f170-1d4f-888b20c1f2ee.png)

次に以下のコマンドを実行します。

```
jupyter notebook --generate-config
```

そうすると設定ファイルである「jupyter_notebook_config.py」が「~/.jupyter/」の配下に作成されます。
※設定ファイルが配置される`~/.jupyter/`は、現時点でJupyter Notebookを起動したときのホームディレクトリです。

# 2.設定ファイルを編集する
次に、作成された設定ファイルの内容を修正します。「c.NotebookApp.notebook_dir=」でホームディレクトリを設定できます。
初期状態は#でコメントアウトされていますので、コメントアウトを外して、ホームディレクトリに指定したいディレクトリをフルパスで記述します。

変更前）

```
## The directory to use for notebooks and kernels.
#c.NotebookApp.notebook_dir = ''
```

変更後）

```
## The directory to use for notebooks and kernels.
c.NotebookApp.notebook_dir = '/Path/to/notebooks/'
```

これでJupyter Notebookを再起動すると、ホームディレクトリが変更されています。
CodeIgniter4予定とか

CIが好きなので楽しみです。

[codeigniter4 userguide](https://codeigniter4.github.io/userguide/index.html)

[releases](https://github.com/bcit-ci/CodeIgniter4/releases)

[Roadmap](https://forum.codeigniter.com/thread-62615.html)

https://forum.codeigniter.com/thread-66704-post-338691.html#pid338691

Alpha - No later than ... 2018
Beta - No later than ... 2019
RC - No later than ... 2020
Release - No later than ... 2021

[milestones](https://github.com/bcit-ci/CodeIgniter4/milestones/)