OmniAICreator/Qiita-1.07M huggingface dataset:
箱ひげ図に要約統計量を記載

# やりたいこと

箱ひげ図は分布形状を知るのに便利だけど、具体的な数値も知りたいところです。

当然`summary()`でもいいんですが、どうせなら一遍に知りたいし伝えたいので、
箱ひげ図に要約統計量を書きたいです。

とりあえずそれだけなら`stat_summary()`でＯＫ。

# やったこと

ただこれだけだとnが分からないので、以下を丸々参考に記載。

参考：https://stackoverflow.com/questions/40102613/ggplot2-adding-sample-size-information-to-x-axis-tick-labels

```r
StatN <- ggproto("StatN", Stat,
                 required_aes = c("x", "y"), 
                 compute_group = function(data, scales) {
                   y <- data$y
                   y <- y[!is.na(y)]
                   n <- length(y)
                   data.frame(x = data$x[1], y = min(y), label = paste0("n=", n))
                 }
)

stat_n <- function(mapping = NULL, data = NULL, geom = "text", 
                   position = "identity", inherit.aes = TRUE, show.legend = NA, 
                   na.rm = FALSE, ...) {
  ggplot2::layer(stat = StatN, mapping = mapping, data = data, geom = geom, 
                 position = position, inherit.aes = inherit.aes, show.legend = show.legend, 
                 params = list(na.rm = na.rm, ...))
}

```

# 全部載せたのがこちら

```r
ggplot(iris, aes(Species, Sepal.Length, colour = Species))+
  geom_boxplot()+
  stat_summary(geom = "text", fun.y = quantile,
               aes(label = sprintf("%1.2f", ..y..)),
               position = position_nudge(x=0.45), size=4,
               colour = "gray30")+
  stat_n(position = position_nudge(y = -0.5))
```

![boxplot.PNG](https://qiita-image-store.s3.amazonaws.com/0/85783/915d93d9-91f9-076c-1e38-92c085148ecd.png)

もうちょい見栄えをよくしたいけども、
まぁそれは今後の課題ということで。
Beamer: ボールドフォント, ロゴ右上配置

# ボールドフォント使用

Beamerでスライドを作るとき, 明朝体は横線が細いため, 全体のフォントをゴシックにすることが多い. 
しかし, ゴシックフォントに`\textbf{}`をやっても太字になってくれない. 
今回はそれを解決する. 

まず, `\usepackage[deluxe]{otf}`を記述. 
次に, コンパイル時にフォントをマッピングする`font.map`ファイルを作成. 

```:font.map
hgothb-h H meiryob.ttc
```

以下を実行
1. `platex slide.tex`
2. `dvipdfmx -f font slide.dvi`

<img width="960" alt="bold.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/2d79e8f1-a02e-111e-aa8e-2afadf210bb5.png">

実は, フォントを`メイリオボールド`に置き換えているだけ. 
`C:\Windows\Fonts`から好きなフォントに置き換えよう. 

<!--
|font.mapに書くもの|対応するコマンド|
|-----------------|---------------|
|hminr-h          | `\rm`         |
|hminb-h          | `\rm` & `\bf` |
|hgothr-h         | `\gt`         |
|hgothb-h         | `\gt` & `\bf` |
-->


# ロゴの右上配置

`\logo{}`コマンドを使うと, デフォルトでは右下に配置されてしまう. 
**右上に配置**するには, `\vspace`を用いる. (LaTeXで絶対座標は使いたくない)

```latex
\logo{\includegraphics[height=0.1\textheight]{logo.pdf}\\ \vspace{0.87\textheight}}
```

<img width="960" alt="slide.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/bf33bcc2-b672-7172-e18d-34458017a47a.png">

# 補足

- 使用したテンプレートは[こちら](https://qiita.com/birdwatcher/items/5dd8a5f453bdc0c6940e)
- コンパイル用Makefileは[こちら](https://qiita.com/birdwatcher/items/2f5d8fae50e2eee2d0ec)
 - ボールドフォントを使うときは, `dvipdfmx`の行を書き換えてください
ハムスターでも分かった組み合わせの余剰

すぐ忘れるので自分用備忘録

ABC110のD問題で組み合わせのライブラリが手元にないことに気づいた．
https://abc110.contest.atcoder.jp/tasks/abc110_d

下記のめぐるちゃんの解説の2つ目のコードをほぼコピペして自分に使いやすいようにした．
https://twitter.com/meguru_comp/status/694547019885449216

#コード

```cpp
struct combLarge{
	typedef long int_type;
	vector<int_type> fact;
	vector<int_type> revFact;
	//in:nCrのn
	void init(int_type N){
		N++;
		fact.assign(N,0);
		revFact.assign(N,0);
		fact[0] = 1;
		for( int i = 1 ; i < N ; i++ ){
			fact[i] = fact[i-1] * i;
			fact[i] %= mod;
		}
		revFact[N-1] = powMod(fact[N-1] , mod - 2);
		for(int i = N-2 ; i >= 0 ; i-- ){
			revFact[i] = revFact[i+1] * (i+1);
			revFact[i] %= mod;
		}
	}
	//in:nCrのn，r out:nCr % mod
	int_type getC(int_type a , int_type b){
		return (((fact[a] * revFact[b]) % mod) * revFact[a-b] ) % mod;
	}
};
```
https://github.com/walk-to-work/My-comp-prog-library/blob/master/cpp/snip-combLarge.cpp

#割り算の余剰
くそデカイ数とくそデカイ数の割り算の結果を大きい素数で割った余りを求まるのと，それぞれの大きい素数で割った余りの割り算をするのは意味が異なる（小数点以下云々のせいか？）ので，　逆元を求めて，掛け算に落とし込む必要があるらしい．

要するに次式にする．
$$\frac{a}{b}=a・b^{-1}$$
$b^{-1}$も無理数になることがあるので，$b^{-1}$をかけることと等価になるものを求めなければならない(?)．
フェルマーの小定理というのがあり（バカなので知らなかった)，aとpが互いに素のとき次式で表せる．

$$a^{p-1}\equiv1 \ mod \ p$$

これも知らなかったが，$x$と$y$を$n$で割った余剰が等しいとき次式でかけるらしい．
$$x \equiv y \ mod \ n  $$

先ほどのフェルマーの小定理の式の両辺に$a^{-1}$をかけると，次式になる．
$$a^{p-2}\equiv a^{-1} \ mod \ p$$

求めたいaをbで割った答えのnで割った余りは，aにbをp-2乗したものを掛けたものをnで割った余りを求めればよい．

#組み合わせ
nCrの定義は次式
$$nCr=\frac{nPr}{r!}=\frac{n!}{r!(n-r)!}=n!・(r!)^{-1}・(n-r)!^{-1}$$

求めたいのは余剰なので
$$nCr\equiv n!・(r!)^{-1}・(n-r)!^{-1}\equiv n!・(r!)^{p-2}・(n-r)!^{p-2} \ mod \ p$$

#コードの説明
階乗とその逆元を$O(n)$で配列に格納し，nCrを$O(1)$で求められるようにしている．
考えた人は天才だと思った．
###階乗とその逆元の格納
1.配列(vector)初期化 ($O(1)$?)

```cpp
N++;
fact.assign(N,0);
revFact.assign(N,0);
```
入力nに対してnCrを求めたいので，ここでn++している．

2.$N!$までの値の余剰を求め配列Factに格納 ($O(N)$)

```cpp
fact[0] = 1;
for( int i = 1 ; i < N ; i++ ){
	fact[i] = fact[i-1] * i;
	fact[i] %= mod;
}
```
3.$N!$の逆元を計算 ($O(logN)$)

```cpp
revFact[N-1] = powMod(fact[N-1] , mod - 2);
```

```cpp
long powMod( long a , long p ){
	if( p == 0 ) return 1;
	else if( p == 1 ) return a % mod;
	else if( p % 2 == 0 ){
		long tmp = powMod( a , p/2 );
		return (tmp * tmp) % mod;
	}
	else{
		long tmp = powMod( a , p/2 );
		return ((tmp%mod * tmp%mod) * a ) % mod;
	}
}
```
累乗の余剰を求めるのは，ビットシフトでの実装の方が早いが見た目がわかりやすいので再帰で実装している．

4.階乗の逆元の余剰を求めて配列revFactに格納 ($O(N)$)

```cpp
for(int i = N-2 ; i >= 0 ; i-- ){
	revFact[i] = revFact[i+1] * (i+1);
	revFact[i] %= mod;
}
```
こういう解釈でいいのだろうか......

```math
(n+1)!^{-1}=\frac{1}{1}・\frac{1}{2}・...・\frac{1}{n}・\frac{1}{n+1}\\
(n+1)!^{-1}・(n+1)=\frac{1}{1}・\frac{1}{2}・...・\frac{1}{n}・\frac{1}{n+1}・(n+1)\\
(n!)^{-1}=\frac{1}{1}・\frac{1}{2}・...・\frac{1}{n}
```
よって$((n+1)!)^{-1}・(n+1)=(n!)^{-1}$なので次式が成り立つ(?)

```math
((n+1)!)^{p-2}・(n+1)\equiv((n+1)!)^{-1}・(n+1)\equiv(n!)^{-1}\equiv(n!)^{p-2} \ mod \ p
```
オーダーは$O(1+N+logN+N)=O(N)$となる

###nCrを返す
あらかじめ階乗とその逆元を求めているので，O(1)でnCrを出力できる．

```cpp
return (((fact[a] * revFact[b]) % mod) * revFact[a-b] ) % mod;
```

#感想
フェルマーの小定理とかすっかり忘れていたのでいい復習になった気がする．
考えた人は天才だと思った．
ScalaでJavaのStreamAPIを使ったら妙にハマった

#はじめに
###概要
Scalaに不慣れな筆者が、JavaとScalaのListをごちゃ混ぜにしたところハマりました。普段Javaを書いていてScalaは初心者だよっていう人はハマりやすいかもと思ったので、原因と解決策をシェアします。

###環境
- Scala2.12.6
- Java10.0.2

###やりたいこと
Twitter4JのAPIで返ってくるツイートのリスト(ResponseList[Status])から必要な情報だけを抜き出して、自作クラスTweet型のListを取得したい。
JavaだとStreamAPIを使えば瞬殺できそう。

#元のコード
###コード
Twitter4JのAPIから返却されるResponseListはStreamAPIを使えるので、Java風に書くとこんな感じになりました。
※動きません。

```scala
val statuses: ResponseList[Status] = twitter.getUserTimeline(paging)
      val tweets: List[Tweet] = statuses
        .stream()
        .map(status => new Tweet(status.getId, status.getText, status.getUser.getName))
        .collect(Collectors.toList) //なぜかここでコンパイルエラーが…
```

###原因
StreamAPIの終端操作`.collect(Collectors.toList)`で戻るのはjava.util.Listなのに、格納する変数の型がScalaのList型になっていること。

ScalaではScalaのAPIもJavaのAPIも使えますが、両者は別物。同じ名前の型を両者ともに提供していますが、ごちゃまぜに使ってはいけません。

#書き直す方針
###1.仕方がないのでjava.util.Listを変数の型に採用する
一番楽。

```scala
val statuses: ResponseList[Status] = twitter.getUserTimeline(paging)
val tweets: java.util.List[Tweet] = statuses
    .stream()
    .map(status => new Tweet(status.getId, status.getText, status.getUser.getName))
    .collect(Collectors.toList)
```
だけど、メソッドで変数tweetsを戻すなら、ScalaのListが良い!だってScalaだもの。

###2.JavaのコレクションクラスをScalaのコレクションクラスに変換
[Scalaのドキュメント](https://docs.scala-lang.org/ja/overviews/collections/conversions-between-java-and-scala-collections.html)によると、ScalaとJavaのコレクションは相互に変換できる模様。

```Scala
//JavaConvertersクラスがコレクションの変換を担う
import scala.collection.JavaConverters._

val statuses: ResponseList[Status] = twitter.getUserTimeline(paging)
val tweets: List[Tweet] = statuses
      //ResponseList(Java) => mutable.Buffer(Scala)
      .asScala 
      //あとはScalaコレクション操作APIを使用
      .map(status => new Tweet(status.getId, status.getText, status.getUser.getName))
      .toList
```

#JavaConvertersについて補足
###ScalaのコレクションとJavaのコレクションの対照表

| Scala | Java |
|:-:|:-:|
| Iterator | java.util.Iterator |
| Iterator | java.util.Enumeration |
| Iterable | java.lang.Iterable |
| Iterable | java.util.Collection |
| mutable.Buffer | java.util.List |
| mutable.Set | java.util.Set |
| mutable.Map | java.util.Map |
| mutable.ConcurrentMap | java.util.concurrent.ConcurrentMap |

###使い方
`import collection.JavaConverters._`と宣言した上で、`asJava`メソッドや`asScala`メソッドを使うことで、変換をすることが可能。ただ、万能というわけでもないらしいので気をつけて使ってください。詳しくは[公式ドキュメント](https://docs.scala-lang.org/ja/overviews/collections/conversions-between-java-and-scala-collections.html)

#参考URL
[Scala Documentation JAVAとSCALA間のコレクションの変換](https://docs.scala-lang.org/ja/overviews/collections/conversions-between-java-and-scala-collections.html)
英語苦手な人向けのブロックチェーン用語の読み方辞書

英語が苦手なんですが、ブロックチェーン関連の用語が読めない問題が頻出するので、備忘録的ブロックチェーン読み方メモ。Qiitaとかのポスト見てても固有名詞は英語で書かれているので、イベントに行ってそれっぽく発音しつつみんなの様子を伺うしかない。特にブロックチェーン関連にはそれが多い気がする。

なので恥を晒しつつ、みなさんからフィードバックいただき、正しい発音になっていきたいw

# 読み方
|英語|読み|なにそれ|
|:--|:--|:--|
|bitcoind|ビットコインディー|ビットコインのデーモン|
|Hyperledger|ハイパーレジャー|ブロックチェーンプラットフォームの1種|
|Ethereum|イーサリアム|イーサリウムと読む人もいる|
|Ether|イーサー|イーサリアム上の内部通貨|
|Dapp(Dapps)|ダップ(ダップス)|分散型アプリケーションのこと。ディーアップスって人もいる|
|Geth|ゲス|Go Ethereumの略。コマンドラインインターフェース|
|Rinkeby|リンクビー|Ethereumのテストネット環境|
|Truffle|トリフ|Ethereumの開発者ツール。英語発音だとトラフルに聞こえる|
|Ganache|ガネーシャ|Ethereumの開発者ツール|
|keccak|ケチャック|ハッシュ関数の一種|
|Vyper|バイパー|Ethereumのコントラクトを記述する言語|
|XEM|ゼム|NEM上の内部通貨|
|EWASM|イーワズム|Ethereum用のWebAssembly|

随時更新していきたい。
なんかあればどんどん教えて欲しいので、フィードバックお待ちしてます。

（結構あると錯覚してたけど意外にないな）
Homebrewでphp7.2を入れようとしたらハマった

# 動機
Laravel使って何かしよう！と思いcomposerを入れようとした。
どうせならとphpも、もともとmacに入ってた7.1から7.2にバージョンあげてみることに。

# やったこと
ネットで検索してphpを入れようとすると、だいたい以下のコマンドが見つかる

```
brew install homebrew/php/php72
```

けれど、どうもhomebrew/phpはdeprecatedになってしまったらしく、以下のエラーになってしまった。

```
Error: homebrew/php was deprecated. This tap is now empty as all its formulae were migrated.
```

非推奨になったので、違う方法で試さないといけない。
で、`brew search php72`で探したところ、以下のコマンドでインストールできた。

```
brew install php@7.2
```

### ※2019/10/5追記
**コメントで教えていただきましたが、本来はこのコマンド実行後に表示されるメッセージにしたがって、環境変数を設定する必要があるみたいです。**
**設定変更ができれば、以下のハマりどころには出くわさないようです。**


# ハマりどころ
インストールしたものの、どうしてももともと入っているphpを見てしまう。
調べたところ、ターミナルを再起動すれば良いという記事を見たが、それでも上手くいかない。
よくよくメッセージを見ると、`brew link php`しろ、と書いてある。
なるほどリンクが上手く言っていないのか、と実行してみると、以下のエラーになってしまった。

```
$ brew link php
Linking /usr/local/Cellar/php/7.2.10...
Error: Could not symlink sbin/php
/usr/local/sbin is not writable.
```

おや？と思ってそのディレクトリを探すも、そんなものはない。
仕方がないので`mkdir /usr/local/sbin`でディレクトリを作成。
not writableとか言ってるので、権限も`sudo chmod -R 777 /usr/local/sbin`で付与。
その後、もう一度コマンドを叩く。
すると、

```
$ brew link php
Linking /usr/local/Cellar/php/7.2.10...
Error: Could not symlink include/php
/usr/local/include is not writable.
```

今度はincludeディレクトリが無いと言う。
ちくしょーめ！　とincludeディレクトリも作成してまたまたパーミッションを設定。
今度こそは！　と`brew link php`!

```
$ brew link php
Linking /usr/local/Cellar/php/7.2.10...
Error: Could not symlink lib/httpd
/usr/local/lib is not writable.
```

。。。。

ぐぬぬ、、、こうなったらとことん付き合ってやる。。。
libディレクトリを作成してパーミッションを設定。
これで三度目の正直！

```
$ brew link php
Linking /usr/local/Cellar/php/7.2.10... 24 symlinks created
```
ほっ。。。なんとかできた。
バージョンも確認して見ると、

```
$ php -v
PHP 7.2.10 (cli) (built: Sep 14 2018 07:07:08) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
```
7.2になった！

# まとめ
なんだったんだ。。。。
詳しい人教えてください。。。

#参考
[homebrewインストール時にリンクが貼られない問題](https://qiita.com/odacoh/items/16d5d454b18337bdb6b5)
[/usr/local/sbinを使いたいがディレクトリ自体が存在しなかった。対応策を知りたい。](https://teratail.com/questions/110332)
Spring Frameworkの勉強ノート【その1】DIコンテナ

## はじめに

- 今回の内容
   - Spring Frameworkの基盤の一つ、DIコンテナについて
   - 筆者の解釈による補完がいっぱいあるので、ご指摘あればぜひお願いします

## 題材

- 以下のインターフェースと、それぞれの実装クラス。
   - ユーザの登録業務を行う `UserService` 
   - 永続か処理を行う `UserRep`
   - パスワードのハッシュ化を行う `PasswdEnc`
- クラス図を描くと以下のような感じ。

![uml.png](https://qiita-image-store.s3.amazonaws.com/0/288168/974bb62e-879c-9b13-6d4b-4ed559723249.png)

## 依存性の注入（Dependency Injection, DI）

- `UserService` クラスのコンストラクタが `UserRep` と `PasswdEnc` 、それぞれの実装を引数にとると仮定する。
- このとき `UserServiceImpl` クラスの使用例は以下の通り。

```java
PasswdEnc passwdEnc = new PasswdEncImpl();
UserRep userRep = new UserRepImpl();
UserService userService = new UserServiceImpl(passwdEnc, userRep);
```

- このように、**あるクラスの初期化に必要となるコンポーネントを設定すること** を **依存性の注入（Dependency Injection, DI）** と呼ぶ。
- **DIを自動で行う基盤** を **DIコンテナ** と呼ぶ。
- 「自動で行う」とはどういうことか？
- （俺俺解釈） *あるインターフェース型のインスタンスを初期化するときに、毎回呼びたい実装をあらかじめ設定しておくことで、インターフェース使用時の記述を楽にすること。* 

### Bean定義ファイル

- 「あらかじめ設定しておく」には...
   - `@Configuration` アノテーションを付与したクラス（**Bean定義ファイル**）にて定義を行う。
   - `@Bean` アノテーションを付与したコンポーネントを付与して、毎回呼びたい実装を指定する。
   -  このようなコンポーネントは、他のコンポーネントの中に注入することもできる。

```java
@Configuration
public class AppConfig{
  @Bean
  UserRep userRep(){
    return new UserRepImpl();
  }

  @Bean
  PasswdEnc passwdEnc(){
    return new PasswdEncImpl();
  }

  @Bean
  UserService userService(){
    return new UserServiceImpl(userRep(), passwdEnc());
  }
}
```

- 上のようにあらかじめ設定しておけば、`UserService` インターフェース型の初期化はDIコンテナを経由して楽に実現できる。

```java
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); 
// DIコンテナを生成

UserService userService = context.getBean(UserService.class) 
// DIコンテナを経由してあらかじめ設定した実装を取得
```

- つまり、DIコンテナの利用は次の3つのフェイズに大別される。
   1. Bean定義にコンポーネントを登録する
   1. Bean定義からDIコンテナを生成する
   1. DIコテンナとBeanを指定して、意図した実装を呼び出す（**ルックアップ**）

### コンポーネントスキャン

- Bean登録の方法には、Bean定義ファイルへの記述以外に、コンポーネントスキャンというものがある。
- 実装クラスに直接 `@Component`アノテーションを付与してBean登録し、他のコンポーネントから呼び出したいときは `@Autowired` アノテーションを付与する。

```java
@Component // 自身をBean登録する
public class UserRepImpl implemente UserRep {
  // 省略
}
```

```java
@Component // 自身をBean登録する
public class PasswdEncImpl implemente PasswdEnc {
  // 省略
}
```

```java
@Component // 自身をBean登録するとともに...
public class UserServiceImpl implemente UserService {
  @Autowired // 他のBeanを注入する
  public UserServiceImpl(UserRep userRep, PasswdEnc passwdEnc)
}
```

- `@Autowired` は **デフォルトで対象の型が一致するBean** をDIコンテナから探す。 
- コンポーネントスキャンを行う場合、以下のようにBean定義ファイルにてコンポーネントスキャン対象としたいパッケージを明示する必要がある。

```java
@Configuration
@ComponentScan("com.example.hoge")
public class AppConfig{
}
```
- ルックアップはBean定義ファイル利用時と同様。

```java
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); 
// DIコンテナを生成

UserService userService = context.getBean(UserService.class) 
// DIコンテナを経由してあらかじめ設定した実装を取得
```

## つづく

## 参考文献

- 株式会社NTTデータ (2016) 『Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発』 翔泳社
【SQL基礎】世代ごとに人数を表示する

##はじめに
今回は**MySQLで世代ごとの人数を表示する**方法についてまとめます。


（参考）データ分析スキルチェック

|カテゴリ|プログラミング                 |
|--------------|---------------------|
|レベル|★☆☆　        |
|チェック項目|SQLで簡単なSELECT文を記述・実行できる <br> （副問合せを含まない、2テーブル程度の結合と簡単なWHERE条件を含むSELECT文）|

https://www.slideshare.net/DataScientist_JP/2017-81179087

## 使うデータ
今回は以下のデータで練習します。

| name | age |
|------|-----|
| 二宮 | 22  |
| 松本 | 24  |
| 中居 | 22  |
| 木村 | 32  |
| 香取 | 29  |
| 櫻井 | 22  |
| 岡田 | 25  |
| 長瀬 | 23  |
| 三宅 | 36  |
| 森田 | 35  |
| 大野 | 40  |
| 草薙 | 44  |
| 稲垣 | 33  |


##GROUP BYを使ってみる
まずGROUP BYでそれぞれの年齢の人数を見てみましょう。20代が多めですね。

```sql
SELECT
    age AS 年齢, 
    COUNT(*) AS 人数
FROM
    table_name 
GROUP BY age;
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/133230/f6c1e2f1-0319-1d79-a6a9-6f8215b4a73b.png" width=20%>


##Whereで条件を絞る
以下のようにWHEREを組み合わせます。
この方法だと'age'列で、10, 20, 30, 40歳ピッタリのデータを検索しカウントしてくれます。

```sql
SELECT
    age AS 年齢, 
    COUNT(*) AS 人数
FROM
    table_name 
WHERE
    age = 10 OR age = 20 OR age = 30 OR age = 40 OR age = 50
GROUP BY age;
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/133230/b4930cf7-d667-6366-e6d8-4c5f6040aaf8.png" width=20%>




##DIVを使い、グルーピングを行う
'age'列の数値をDIVを使い10で割って切り捨てしてからグループ化することで、
それぞれのグループのデータ数をカウントを行います。
例えば、20～29の数値はすべて2になるので同一グループとしてみなされます。

```sql
SELECT
    age AS 年代,
    COUNT(*) AS 人数
FROM
    table_name 
GROUP BY
    age DIV 10;
```

グループごとの一番低い数値がセルにはいるので、このままではデータ量が少ないときは注意が必要です。例えば20代でも一番低い数字が23な場合は、23が表示されてしまいます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/133230/38fde0a1-f5bd-bb23-8d77-eca2e45e89f3.png" width=20%>

##CONCAT関数を使ってインデックスを生成
そんなときはCONCAT関数を使ってインデックスとなる列をつくりましょう。

```sql
SELECT
    CONCAT( (age DIV 10) * 10, "代") AS 年代,
    COUNT(*) AS 人数
FROM
    table_name 
GROUP BY
    age DIV 10
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/133230/f463bbba-f193-2270-1f56-e8b13b3a4aac.png" width=20%>


参考　http://uyamazak.hatenablog.com/entry/2017/08/18/144725


##CASE文でより柔軟に数値の範囲指定を
18歳以下など、範囲の指定が柔軟に必要な場合は、以下のようなやり方が必要です。
他にもっといいやり方があったら教えてください！

```sql
SELECT
    CASE
        WHEN age <18 THEN 'Under 18' 
        WHEN age between 18 AND 24 THEN '18-24' 
        WHEN age between 25 AND 34 THEN '25-34'
        WHEN age between 35 AND 44 THEN '35-44'
    END AS 年代,
    Count(*) AS 人数
FROM
    table_name 
GROUP BY 年代;
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/133230/76f6ccae-6914-93c9-22f8-fbe7d585f8af.png" width=20%>


参考　https://teratail.com/questions/51772
今はやりのKotlinとやらをWSL+Visual Studio Codeで実行したい

# 初めに
いろいろな記事の寄せ集めです。備忘録的に。
なうな言語であるKotlinの環境をWindows側で構築したい、けどVisualStudioCodeのIntegrate TerminalではWSLのUnix Terminal使いたい人向けの記事です。

# 前提環境
* VisualStudio Code 1.27.2
* Windows10 1803
* Kotlin1.2.71-release-64
* WSL(Debian)

# 環境構築
## Kotlin導入
まずこれを入れなきゃ始まらない。
[GitHub](https://github.com/JetBrains/kotlin/releases/tag/v1.2.71) から環境に合うものをダウンロード・展開します。
適当な場所(`C:\Program Files\kotlinc`など)においてください。  
PATHを通します。上記の場合は環境変数に`C:\Program Files\kotlinc\bin`へのPATHを追加します。

## まずはコマンドプロンプトで動作確認
コマンドプロンプトで `kotlin -version`と入力し、バージョン情報が表示されるかを確認します。

## WSL側にもPATHを通す
WSLに上記のbinディレクトリへPATHを通します。

```
$vim ~/.profile
export PATH=$PATH:/mnt/c/Program\ Files/kotlinc/bin
```
ここが少しだけ重要だったりします。通常のLinuxのファイルパスにはスペースが入らないので\\(バックスラッシュ)でエスケープする必要があります。 ~~MSもよくこんなガバガバOSにUnixターミナルなんかつけよったな~~

## WSLからコマンドを実行できるようにする
WSLの`.bashrc`あたりにaliasを書けば問題ないように見えますが、Windows版Kotlinはbatファイルなのでそのままで実行するともれなく1行目の`@echo off`で撃沈します。さすがにMSも対策を打っていてbashからCMDを実行することでこれを回避できます。

```
$vim ~/.bashrc
alias kotlin = "cmd.exe /c kotlin"
alias kotlinc = "cmd.exe /c kotlinc"
---以下略---
```
こんな感じで追加します。
## おしまい
これにより何とかWSLでWindows環境のKotlinを実行することができました。そもそもこんな変なことをする人がいるかはわからないですが。

## 参考
https://qiita.com/toastkidjp/items/16ca39cc83e888a95256
https://qiita.com/python_walker/items/41894c952ee06b018994
http://www.atmarkit.co.jp/ait/articles/1805/31/news052.html
データベース内のカラム一覧をSQL文を使って表示させる

#はじめに
##概要
SQL文（SELECT文）を使ってデータベース内に存在するカラムの定義一覧を出力する方法

##背景
マイグレーションも使わず、カラム定義変更が入るたびに誰かがSQLファイルを実行する運用をしていたので、漏れが出ました。開発環境と検証環境でテーブルごとに`show table 〇〇`ってやって目で確認するのもあほらしいので、データベース内のカラム定義をSELECT文で出力しました。

##環境
Windows10（開発環境）/Amazon Linux（検証環境）
MySQL5.7

※information_schemaはRDBの標準規格になっているので、MySQLでなくても使えるかも。

#実行したSQL
```sql
SELECT
	table_name,
	column_name,
	ordinal_position,
	column_default,
	is_nullable,
	data_type,
	character_maximum_length
FROM
	information_schema.columns
WHERE
    --ここでデータベース名を指定する
	table_schema = ''
```

information_schemaのcolumnsに問い合わせるとカラムの一覧が出力されます。
上のSQLで出力している内容は以下の通りです。

| カラム名 | 内容 |
|:-:|:-:|
| table_name | テーブル名 |
| column_name | カラム名 |
| ordinal_position | カラムの順番 |
| column_default | カラムのデフォルト値 |
| is_nullable | NULL許可か否か |
| data_type | データ型 |
| character_maximum_length | 長さ |

ここでは`show table`コマンドで表示されそうなものをピックアップして載せています。
[MySQLのリファレンス](https://dev.mysql.com/doc/refman/5.7/en/columns-table.html)には、ここに載せていない情報についても解説されていますので、気になる方はぜひご覧ください。

#参考URL
[MySQL5.7 information_schema colomnsテーブル](https://dev.mysql.com/doc/refman/5.7/en/columns-table.html)
macOS Mojave の Apache で Sites ディレクトリを使って localhost を特定アカウントで利用する方法

# 概要
macOS Mojave (10.14) にアップデートすると、それまで設定していたApacheの設定が吹き飛んだ、かつ、下記の参考文献通り設定ファイルを復活させても期待通りに動作しなかった。なお、それまで設定していたのは、ユーザディレクトリ配下の Sites ディレクトリを使って localhost を特定アカウントで利用する方法です。

参考文献: [MacOS X の Yosemite (10.10) で Sites ディレクトリを使って localhost をアカウント別に利用する方法](https://qiita.com/colorrabbit/items/3ab4c2d863a55ca72d35)

# 修正手順

ほぼ参考文献にある、Mojave 以前と同じ手順ですが、Mojave ではユーザ設定ファイル内で DocumentRoot を明示する必要があります。

## ユーザーディレクトリを有効化

```
$ sudo vi /etc/apache2/httpd.conf
```

以下のコメントアウトを外します。

```
LoadModule userdir_module libexec/apache2/mod_userdir.so
LoadModule authz_core_module libexec/apache2/mod_authz_core.so
LoadModule authz_host_module libexec/apache2/mod_authz_host.so

# User home directories
Include /private/etc/apache2/extra/httpd-userdir.conf
```

あと、個人的にPHPを使うのでPHPも有効化

```
LoadModule php7_module libexec/apache2/libphp7.so
```

## ユーザ設定ファイルの読み込み設定

```
$ sudo vi /etc/apache2/extra/httpd-userdir.conf
```

```
UserDir Sites

Include /private/etc/apache2/users/*.conf
<IfModule bonjour_module>
       RegisterUserSite customized-users
</IfModule>
```

## ユーザー設定ファイルの作成

`{username}` は `$whoami` で確認してください。

```
$ sudo vim /etc/apache2/users/{username}.conf
```

Mojave 以前は1行目のDocumentRootの記述がなくてもいけていましたが、これを追記せねば正しく動作しませんでした。

```
DocumentRoot "/Users/{username}/Sites/"
<Directory "/Users/{username}/Sites/">
    AllowOverride All
    Options Indexes FollowSymLinks Multiviews
    Require all granted
</Directory>
```

## Apache に適用

```
$ sudo apachectl -t
$ sudo apachectl restart
```

初めてやる人はこれも忘れずに。

```
$ mkdir ~/Sites
```

以上により、 http://localhost で /Users/{username}/Sites/ にアクセスできます。


↓励みになりますので「いいね」お願いします笑
Serialを引数で渡す

#何をしたいか
Arduinoで開発可能な複数のUART通信ができるマイコンボードにて、
UART通信処理をする関数へ使用するシリアルを渡したい。

#動作確認環境
・Arduino IDE 1.8.5
・ESP32 DEVKIT

#予備知識
`Serial`や`Serial1`は`HardwareSerial`という型らしい

#コード
シリアルモニタに文字がでてくればOK！
※色分けの為拡張子は「.c」にしていますが、実際は「.ino」です。

```SerialTest.c
/*================================================
 * Create:    2018.09.22 teppei 
 * Overview:  HardWareSerialを引数で渡せるかのテスト
 ================================================*/
 
void setup() {
  Serial.begin(115200);
}

void loop() {

  for(int i=40; i<100; i++)
  {
    SerialWrite(Serial, i);
    delay(500);
  }
  
}

void SerialWrite(HardwareSerial &serial, int val)
{
  serial.print("function out: ");
  serial.write(val);
  serial.println();
}
```
IBM Cloud Internet Services (CIS)  IP Firewallについて

IBM Cloud Internet Services (CIS) のIP Firewallについてです。
https://console.bluemix.net/docs/infrastructure/cis/security-features.html

管理ポータルにタブのある、IP rules、 User Agent blocking、 Domain lockdownの順に書きます。

#IP rules

IPアドレスを指定し、そのIPアドレスからのアクセスを制御します。

何もルールを入れていない状態では、問題なくウェブサーバーにアクセスできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/530fa7c6-bbc2-ddf1-f593-52c7df08ad3a.png)

ここで、例えば自分のIPアドレスを調べ、それをBlockするルールを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/cbcccb6a-aea7-0e77-6952-0ccaa63a499e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/a19333f5-a882-f6b3-c646-fafb1c3b578b.png)

先ほどは表示できていたウェブサイトに再度アクセスすると、Access deniedのページになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/b212db92-bda1-5ca0-b28c-71dce32ed237.png)


先ほどBlockにしていたルールをChallengeに変更すると、自分がボットで無いことを証明するために指示された画像を選ぶステップが入り、それに正しく答えると、通常のウェブサイトが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/46de57ee-9f4b-80dc-aa74-e716c6ceec0e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/9ea2c6bd-4431-101c-a35d-da780b7da43a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/17da043e-0134-3222-94be-7f908557c8ca.png)

IPレンジでの指定も可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/3184c4b5-0580-e87c-8700-3ff3be705202.png)

また、IPアドレスだけでなく、国単位でChallengeを設定することもできます。（国単位のChallengeはStandard Planや無償トライアルで設定可能です。国単位のBlockはEnterprise Planの機能となります。）
※国名を指定する際は、日本語表示だと思ったように検索・指定できない場合があるので、英語表示にしたほうが設定しやすいと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/3f39ba64-cf2d-3959-674c-66a3000316fc.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/c5bd74a1-3415-b3fd-cb4e-0fc956eb4f48.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/419c25ce-41c3-30dc-6dc8-a30ee2283374.png)


#User Agent blocking

ユーザーエージェント毎にBlockやChallengeを設定可能です。
制御したいユーザーエージェントを、ウェブサーバーのログで確認し、ルールに追加してアクセス制御を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/c0ee5a7b-5c39-c383-4f48-a218991ea9aa.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/c78a097c-80d7-76c5-eb46-c48e71f0bd9e.png)

#Domain lockdown

特定のIPアドレスからのアクセスのみ許可します。
例えば、自社オフィスからの接続のみ許可する等の使い方をします。
それ以外のIPアドレスからのアクセスは、Access denied となります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59627/df7fbff3-f94e-8cc1-781d-57e1cfa5c32e.png)
集中と分散の狭間で

最近、分散システムというやつに関する議論をすることが多いのですが、色々誤解が多くて、なんだかよくわからない話になってしまうことがあります。以前、分散システムや自律分散システムの研究をやっていた身としては、寂しい気持ちになってしまいます。そんな寂しさを綴った、単なるポエムです。

# システムいろいろ

集中型システム、分散型システムというのを耳にする機会があります。これらに加えて最近は、自律分散型システムみたいな言葉も見かけます。ブロックチェーンが流行ってるからですかね。その昔はP2Pでも流行ってました。

集中型システム、分散型システム、自律分散型システム、これらの明確な定義はないような気がしますが、大雑把にいえば2つのグループに分けることが出来ます。

俺様グループ：集中型システム、分散型システム
アナーキーグループ：自律分散型システム

大きな誤解は、分散型システムと自律分散型システムを1つのグループにしてしまうことです。そのせいで色々話が噛み合わなくなります。

# 集中型システムと分散型システム（俺様グループ）

このグループは、サービスを提供する側とサービスを受ける側が分かれます。「欲望」を持つ人が明確に分かれているということです。サービスを提供して金儲けしたいという欲望と、サービスを利用したいという欲望です。

最近は多くのサービスがクラウドで提供されていて、集中型といいつつその中身は分散型システムになっています。つまり、サービスを提供する欲望を持っている人が、1つのサーバでサービスを提供するではなく、スケーラビリティや対障害性を考慮して、複数のサーバに処理や情報保存を分散しています。

また、かつてマッシュアップと呼ばれましたが、複数のサービスを組み合わせて一つのサービスを構成することも行われます。これもAPI連携による分散型システムですが、欲望の観点からは、単にサービス提供者が自分の欲望を満たすために他のサービスを利用しているに過ぎません。サービスを受ける側からすれば、どうやってそのサービスが実現されているかを気にすることはなく、サービス提供者からサービスを受けているに過ぎません。

結局、分散型システムというのは、集中型システムで多数のリクエストを処理したり信頼性を上げるためだったり、他人の能力を利用して自分のサービスを拡充するための仕組みということになります。

# 自律分散型システム（アナーキーグループ）

このグループは、欲望が渦巻いています。みんながそれぞれ似たような欲望を持っていて、それらが絡み合って、全体としてシステムを成しています。集中型・分散型システムとの大きな違いは、特定の誰かがサービスを提供したいという欲望をもって、全体をうまいこと制御しているわけではないということです。

自律分散型システムを勉強しようとすると、生物やら細胞、社会みたいなものがよく出てきます。自己組織化や創発といったキーワードも出てきます。例えば細胞は、1個1個が「生きたい」という欲望を持っていて、それを達成するために活動しています。そのような細胞が寄り集まって、一個の生物が構成される、みたいな話です。自律分散型システムは、それ自体が生物だったり社会だったり、そんな感じです。哲学的です。

ここ数年注目されているブロックチェーン、特にBitcoinやEthereumは自律分散型システムといえそうです。これらのシステムでは、マイニングはシステムを動作させるための手段であり、目的にもなっています。みんな、マイニングしたいからシステムに参加しています。そして、みんなが参加するから、システムが上手く動作するようになっています。

生物も進化すると、内部の役割が分化し洗練されていきます。脳を筆頭に、臓器、細胞と階層的に組織化されいます。脳が体全体を統括し、様々な欲望を持つことができるようになり、まるで脳を中心とした集中型システムのようになっています。この方が繁栄できるからなのでしょう。

ブロックチェーンになぞらえると、おそらくそれはDAppsじゃないかと思います。単なるアナーキーなアプリではなく、生物の進化のように、洗練された集中型システムを目指すことになるでしょう。でないとお金が儲かりません。

ここで、たまに疑問が出ます。「それ、ブロックチェーン上のDAppsにする意味あるの？」と。

そもそもそのアプリは何をやりたかったのか、それが明確でないのにDAppsにする意味ってあまりないように思います。一番良い理由は、ETHを使いたいから。それならEthereumでDAppsを作るしかありません。生物が「自分の細胞を使って生きていくしかない」ってのと同じだと思います。

一番いいと書きましたが、それ以外のいい理由があまり思いつきません。もしかすると「そこにEthereumというインフラがあるから」という理由もあるかもしれません。しかし、必ずしもコストが安いとも限りませんし、サービスの継続性がプラットフォームに依存してしまいます。もう一つは「流行ってるから」。これは否定すべきものではありませんが、効率の悪いシステムだと、流行が去ると負の資産にしかならないので注意が必要です。

# よくみると謎なモノも・・・

ブロックチェーンの話になってしまいますが、パブリック型とプライベート型があります。パブリック型はアナーキーブループ、プライベート型は俺様グループです。

しかし、パブリック型を謳っているものの中には、「ん？」というものもあります。欲望がどこにあるか、つまり誰が運営しているか、という点を確認してみましょう。実は、集中型のものがあります。こういう奴は、パブリック型というよりも超でかいプライベート型と言ったほうが良さそうです。

パブリック型と超でかいプライベート型のどちらが優れているかという話ではなく、それぞれ全く違う特性をもっているということを意識しておかないと、あとで「聞いてないよ」みたいなことになるかもしれません。注意しましょう。


# むすび

似たような言葉、逆に全然違う言葉のせいで、その特徴を誤認すると、あとで困ることもありそうです。自分が知ってる分野だからわかるのですが、知らない分野だと同じような誤解をしてしまってるんだろうなと思うと恐ろしいですね。。
getSupportLoaderManagerが使えないから

AsyncTaskを触っているときに、LoaderManagerがdeprecatedされたということでメモ。
正直わかってないですが、とりあえずアウトプットします。

---

以下のようにすると、AndroidStudioに怒られてしまいます。



```MainActivity.java
private LoaderManager manager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

manager = getSupportLoaderManager();//　←　非推奨



```



~~getSupportLoaderManager()~~と打消し線されちゃいます。

だからといって、動かないわけではありません。動きはします。
しかし少し気になるので、公式ドキュメントを読みました。

[LoaderManager](https://developer.android.com/reference/android/support/v4/app/LoaderManager)




2つ方法がありそうです。


１、getInstance()を使う。
２、initLoader()を使う。




1、はそのまんまですね。インスタンスがほしいので、getします。

> Gets a LoaderManager associated with the given owner, such as a FragmentActivity or Fragment.

とのことです。


2、はLoaderを始めちゃうってことですね。
> If the loader doesn't already exist, one is created and (if the activity/fragment is currently started) starts the loader. Otherwise the last created loader is re-used.

もしなかったら作ってくれるし、既にあるなら再利用しますよと言っています。
LoaderManagerはActivityやFragmentの一つに一つ割り当てられていることからもわかります。

___


がしかし、そもそも
>Your activity must derive from FragmentActivity to use this.

なので、FragmentActivityを継承させれば良い、ということになりますが、
他で使いたくなったらどうするんだろう、という疑問は解消されていません。
kerasでtrainとvalidationのTensorboardの出力を分ける

## これなーに
keras便利ですよね〜　
モデル作って、精度のカーブをtensorboardで確認っと・・・

<img width="1222" alt="スクリーンショット 2018-09-25 23.12.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/40159/93e3d753-80c2-4575-a936-f1199e994526.png">

trainとvalが別れてグラフにプロットされてて、ちょっと見づらい。。
特にoverfitなどを確認する時は、trainとvalのグラフの精度のカーブを一緒に見たくなるので、できたら一緒にみたい！

ということで、下みたいに一緒に見れるようにするtipsです。
<img width="1219" alt="スクリーンショット 2018-09-25 22.44.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/40159/996d6141-2511-b21d-af24-52a928217c9a.png">

## やり方
以下のclassを作って、model.fitをする時の引数にcallbacks=[TrainValTensorBoard(write_graph=False)]を指定してあげる。

```
class TrainValTensorBoard(keras.callbacks.TensorBoard):
    def __init__(self, log_dir='../saved/', **kwargs):
        # Make the original `TensorBoard` log to a subdirectory 'training'
        training_log_dir = os.path.join(log_dir, '../saved/tensorboard/train')
        super(TrainValTensorBoard, self).__init__(training_log_dir, **kwargs)

        # Log the validation metrics to a separate subdirectory
        self.val_log_dir = os.path.join(log_dir, '../saved/tensorboard/val')

    def set_model(self, model):
        # Setup writer for validation metrics
        self.val_writer = tf.summary.FileWriter(self.val_log_dir)
        super(TrainValTensorBoard, self).set_model(model)

    def on_epoch_end(self, epoch, logs=None):
        # Pop the validation logs and handle them separately with
        # `self.val_writer`. Also rename the keys so that they can
        # be plotted on the same figure with the training metrics
        logs = logs or {}
        val_logs = {k.replace('val_', ''): v for k, v in logs.items() if k.startswith('val_')}
        for name, value in val_logs.items():
            summary = tf.Summary()
            summary_value = summary.value.add()
            summary_value.simple_value = value.item()
            summary_value.tag = name
            self.val_writer.add_summary(summary, epoch)
        self.val_writer.flush()

        # Pass the remaining logs to `TensorBoard.on_epoch_end`
        logs = {k: v for k, v in logs.items() if not k.startswith('val_')}
        super(TrainValTensorBoard, self).on_epoch_end(epoch, logs)

    def on_train_end(self, logs=None):
        super(TrainValTensorBoard, self).on_train_end(logs)
        self.val_writer.close()

def training():
    ~略~
    model.fit(x_train, y_train,
              batch_size=batch_size,
              epochs=epochs,
              verbose=1,
              validation_data=(x_test, y_test),
              callbacks=[TrainValTensorBoard(write_graph=False)])
    ~略~
```

一番簡単なのは、tensorboardの利用を以下の形で定義し、fitする時のcallbacksに定義した物を突っ込みますが、その代わりに上をやると良い感じでtrainとvalが同時に見えるように出力できます。

```
    ~略~
    tb_cb = keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
    cbks = [tb_cb]
    ~略~
    model.fit(x_train, y_train,
              batch_size=batch_size,
              epochs=epochs,
              verbose=1,
              validation_data=(x_test, y_test),
              callbacks=cbks)
```
UnityのIsometric Tileで高さのあるステージを作る設定

# はじめに

この投稿では、Unity2018.3から登場したIsometric Tileを用いて次のGifのようなステージを作成するための、設定方法を紹介します。ステージはクォータビューで、高さがあることに注目してください。またキャラクターが移動する際、キャラクターの手前にタイルがあると、キャラクターの一部が隠れていることに注目してください。

![dungeon.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/70d8709f-8397-7479-9795-da8aa03c7faf.gif)

本投稿執筆時、Unity 2018.3はベータ段階です。本投稿では、Unity 2018.3b2で検証しています。今後、正式リリースまでに改善・改修されることが考えられます。ご注意ください。

キャラクター画像は、[香月清人さん](https://enty.jp/usui634)、タイルマップ画像は[Golden Skullさん](https://assetstore.unity.com/publishers/10686)によるものです。

また、これを行う設定は[こちら](https://forum.unity.com/threads/isometric-tilemap-sorting-issues.554914/)のUnity 公式ベータフォーラムで質問・回答されていた内容になります。


# GridのCellLayout

GridコンポーネントのCellLayoutプロパティを「`Isometric Z As Y`」に設定してください。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/e942b8aa-8af7-729d-f852-9d6a914ca50c.png)

# GridのCellSize

GridコンポーネントのCellSizeプロパティのZを「`1`」にしてください。デフォルトでは`0`になっています。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/e942b8aa-8af7-729d-f852-9d6a914ca50c.png)

# CameraのTransperency Sort Mode

CameraのTransperency Sort ModeとAxisを設定してください。方法は2つあります。

1つ目は、プロジェクト全体の設定から（プロジェクトグローバルに設定）行います。`Edit > Settings > Graphics`から、`Transparency Sort Mode`を`Custom Axis`に。`Transparency Sort Axos`を`(0, 1, -0.26)`にしてください。

![キャプチャ0.png](https://qiita-image-store.s3.amazonaws.com/0/4125/dbb70878-9b3e-422e-aafe-4193b9d2c657.png)


2つ目は、カメラの設定を変更するコンポーネントを作成し、それをカメラのゲームオブジェクトに付与することで行います。次のコードのコンポーネントに付与してください。

```cs
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif    
 
[ExecuteInEditMode]
public class AxisDistanceSortCameraHelper : MonoBehaviour {
    void Start () {
        var camera = GetComponent<Camera>();
        camera.transparencySortMode = TransparencySortMode.CustomAxis;
        camera.transparencySortAxis = new Vector3(0.0F, 1.0F, -0.26F);
   
#if UNITY_EDITOR
        foreach (SceneView sv in SceneView.sceneViews)
        {
            sv.camera.transparencySortMode = TransparencySortMode.CustomAxis;
            sv.camera.transparencySortAxis = new Vector3(0.0F, 1.0F, -0.26F);
        }
#endif      
    }
}
```

# TilemapRendererのMode

この設定項目は、今後改善の可能性され必要なくなる可能性があります。

`TilemapRenderer`の`Mode`を`Indivisual`にします。

私の環境だと、Tileアセットが参照するSpriteが同一SpriteAtlasに存在しても、こうしないと描画順序が狂ってしまいました。この設定はパフォーマンスに影響を与える可能性があります。今後、これは改善する可能性が高いです。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/b7b34783-a0c5-f38b-9673-fe61ac2b08bb.png)


# 高い位置にTileのz座標を0以外に

壁などを表現するための高い位置にあるTileのz座標を、1や2など0以外に設定します。


`TilePalleteWindow`の`Z Position`から設定を行ってください。


![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/44cfc889-38df-d927-498d-13ee317d5e62.png)

# さいごに

以上の設定を行うことで、次のGifのような挙動をするステージを実現できます！ワクワクしますね。

![dungeon.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/70d8709f-8397-7479-9795-da8aa03c7faf.gif)

本投稿ではUnity 2018.3b2で検証しています。今後、正式リリースまでに改善・改修されることが考えられます。ご注意ください。

# 関連

合わせて、2018/09/26(水)に開催された[Gotanda.unity #8](https://gotanda-unity.connpass.com/event/97806/)の私[@RyotaMurohoshi](https://twitter.com/RyotaMurohoshi)の発表資料、「Tilemapのアップデート」もどうぞ！

TODO 公開後、ここに張り付け
GitHubのcontributionsが消えた？メールアドレス変えませんでした？

# contributionsとは
以下の図のやつのことですね。
緑色のやつ。
業界用語で「芝」です。
![contributions.PNG](https://qiita-image-store.s3.amazonaws.com/0/145181/fba6fa76-da70-e8fd-6d00-0f1060f8bdd7.png)

# いきなり消えたんだけど、どうやって戻すの？
このcontributionsはどうやらメールアドレスに紐づいているようでして、直前に消したメールアドレスを再登録すれば戻ります。

![github emails.PNG](https://qiita-image-store.s3.amazonaws.com/0/145181/1ac7d2b5-805e-e31b-4f4d-5a9a52eab0b9.png)

おそらく、私のような初学者は以下のようなパターンで驚いたと思います。
1. 「今までは常用のメアド使ってたけど、そろそろ開発用のアカウント作るかー」
2. 「開発用アカ作った。GitHubのメールアドレスも変えとこ」
3. 「あれ、緑色のやつが消えとるんやけど。。。(;^ω^)」

こんなんで悩む人って自分以外でいるのかわかりませんが、調べても地味に出てこなかったので。
Go言語を真剣に勉強してみた〜パッケージ編〜

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
さて今回は「Go言語を真剣に勉強してみた〜パッケージ編〜」と言うことで「Goのパッケージ」について見ていきましょう。
では、早速いってみましょう:point_up:

「Go言語を真剣に勉強してみた〜基本構文編①（変数、定数、条件分岐、繰り返し処理）〜」については[こちら](https://qiita.com/watataku/items/f12163ade0d820d00bba)から。
「Go言語を真剣に勉強してみた〜基本構文編②（配列）〜」については[こちら](https://qiita.com/drafts/50de84b191f73d281be9)から。
「Go言語を真剣に勉強してみた〜基本構文編③（関数）〜」については[こちら](https://qiita.com/watataku/items/79f5e49d08000838150d)から。
「Go言語を真剣に勉強してみた〜基本構文編④（ポインタ、構造体）〜」については[こちら](https://qiita.com/watataku/items/ef518d59a4ae31b45b63)から。
#パッケージ
モジュール性、カプセル化、分離されたコンパイル、再利用をサポートするものです。
すなわち、**機能を分離して、綺麗なソースコードにしよう。さらに、必要最低限の公開範囲にしよう。**と言う感じです。

＜ディレクトリ構成＞

```
・
|-user
|  |-user.go
|-main.go
```

では実際にパッケージを作ってみましょう。

```golang:user.go
package user

func Name(name string) string {
    return name + "さんよろしくお願いします"
}

func email(email string) string {
    return email
}

```
ちなみにName関数は外部から参照できるが、email関数は参照できない。

```golang:main.go
package main

import "./user" //自作パッケージ


func main() {
    name := user.Name("hoge")
    
    email := user.email("hoge@xx.xx.jp") //エラー
}
```



以上。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。
次回は「Go言語を真剣に勉強してみた〜データベース接続(MySQL)編〜」です。

よろしければ、[Go言語を真剣に勉強してみた〜環境構築編〜](https://qiita.com/watataku/items/c2b25ace1aeaaf0b75c0)もご覧ください。
【永久保存版 | Java Script】ライブラリを使わない日付や時間の取得

現在の日付や時間を取得してそれによって動作を変えたい、そんな時ありますよね。
**「[moment.js](https://momentjs.com/)を使えばいいじゃん」**
そんな声が至るところから聞こえてきます。

だがしかし！　
**「jQuery以外のライブラリ以外使用禁止ね」**
といった禁止令を時々言われることがあると思います。(多分あまりない)

「他でも調べたけどよくわかんなかった」
「急いでるんだ！とりあえず今日と明日の日付と時間の取得、おまけに年月日を8桁で表記する方法だけを教えてくれ！」
そんな時にご参照ください。




##現在の西暦と日付を取得する

```javascript
var date = new Date();
var year = date.getFullYear(); //2018
var month = date.getMonth() +1; //1
var day = date.getDate(); //14
```
上記で注意すべき点はたったの1点。
月を取得してする時は0(1月)が起点となるため、必ず +1を付けるように！



##次の日の西暦と日付を取得する
```javascript
var date = new Date();
var tmrw = new Date(date.setDate(date.getDate() + 1));
var nextYear = tmrw.getFullYear();
var nextMonth = tmrw.getMonth() +1;
var nextDay = tmrw.getDate();
```
一行目では現在の日時を取得。
二行目で1日足して明日を表わす変数を作ります。
そこから下は明日の年月日を取得できます。
現在の日時と次の日の日時を取得したい場合の注意としては、今日の日付を取得後した後にsetDateすることです！
順番を守らないと次の日は永遠に取得できません。

##時間を取得する
```javascript
var date = new Date();
var hours = date.getHours(); //5
var minutes = date.getMinutes(); //4
```

##年月日を8桁表記する
お気付きのとおり、月日時は1桁の時に最初に0がついてくれません。
そんな時はsliceメゾットで0をつけてあげましょう。

```javascript
var date = new Date();
var year = date.getFullYear(); //2018
var month = ('0' + (date.getMonth() +1)).slice(-2); //01
var day = ('0' + date.getDate()).slice(-2); //01
var today = "" + year + month + day; //20180101
```




##最後に
もっとええ書き方あるんやで、と思った方はコメントでご教示ください。
intelliJ Color Themes 適応方法

intelliJを使っている中で、カラースキーマを[Color Themes](http://color-themes.com/?view=index)からダウンロードして適応する手順を記載していきます。


#### ■ Download for Color Themes
まず、[Color Themes](http://color-themes.com/?view=index)から好きなテーマをDownloadします。

<img width="824" alt="スクリーンショット 2018-09-25 23.04.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/5b9ee654-7107-9e8e-ecb1-49b39d05f96b.png">
ex . http://color-themes.com/?view=theme&id=563a1a6180b4acf11273ae3d

#### ■ intelliJにimportします。
`File` -> `Import Settings`からDownloadしたテーマを読み込みます。
<img width="236" alt="スクリーンショット 2018-09-25 23.09.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/5724d79a-534b-c173-708e-5026bd5d37fb.png">


#### IntelliJの`Colors & Fonts`に読み込みます。
`Preferences` -> `Colors & Fonts` -> `Scheme`からDownloadしたものを選択する。
<img width="646" alt="スクリーンショット 2018-09-25 23.13.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/5716da6c-291a-63a4-43a1-ceaea19397f6.png">
※選択肢に出てこない場合はどこかの手順に問題がある可能性が高いです。


これで再起動したら、適応されるはずです。
以上です。
Bigqueryで変数を使う

## はじめに
他のDBでは使えるものもあるようですが、Bigqueryでは変数が使えません。
使えないですが、クエリを工夫すると変数のようなものを扱うことができ、
再利用性も可読性もすごく高まります。

今回はBQでよくある、`パーティションタイムだけ都度変えてクエリを発行する`
という場面を想定して変数(のようなもの)の使い方を紹介します 


### パターン①　1行のテーブルをcross join
```sql
with const as (
select
 timestamp('2018-1-1') as date
)

select
  *
from
  table,const
where
  _PARTITIONTIME = date
```

### パターン②　ユーザー定義関数を使う

```sql
create temporary function getDate() as (TIMESTAMP('2018-1-1'));

select
  *
from
  table
where
  _PARTITIONTIME = getDate()
```
犯人はお前か!!!

***犯人はお前だったのか!!!! プロキシ!!!!***

# MattermostとJenkinsのTest Connectionに失敗する

以前、Mattermostとjenkinsの連携をVagrantを使って連携を行いました。
そのときは、Mattermost と JenkinsがそれぞれゲストOSで動作していたこともあり、連携がサクッと出来ました。
今回、MattermostとJenkinsが異なるサーバで動作している環境で、MattermostとJenkinsを連携させてみたところ。。。

***「姉さん、事件です。Test ConnectionがFailure になります。」***

ゲストOSでは、サクッと連携出来たのに・・・。
ここで、悩んでもしょうがないので、Jenkinsのログを見ることしました。

# 解析を始めてみる

Jenkins側の問題である可能性が高いので、/var/log/jenkins/jenkins.log を確認しました。
ログでは、Connection reset のエラーが発生していました。

ここで、頼みの綱のグーグル先生に伺ったところ、同じような問題が発生しているページを発見。
["Test connection" gives "Failure"](https://github.com/jovandeginste/jenkins-mattermost-plugin/issues/12)

どうやら同じエラーのようなので、記事を読んでみました。

## curlコマンドは通るのか？

curlがどうとかの話が出ていたので、念のため、Jenkinsがインストールされているマシンから Mattermostのインストールされたマシンに対してcrulコマンドを実行してみた。

```sh
# curl -i -X POST -H 'Content-Type: application/json' -d '{\"text\": \"Hello, this is some text\nThis is more text. :tada:\"}' <Webhookを設定した時にMattermostから提示されたURL>
```

Mattermostにメッセージが表示されたので、crulコマンドは成功であり問題なし。

## チャンネルの名前は間違っていないか？

チャンネル名は、off-topicを使用していたので、合ってる。

# 原因は、TLSのバージョン差分？

記事の末尾まで来ると、イッシュー発行者がnginx ssh configとOpenJDK1.7とのTLSバージョンの差分で、OpenJDK1.8をインストールしてJenkinsをTLSv1なしで再起動したら成功したと報告していた。

***「いやいや、nginxとか使ってない。そもそも OpenJDK1.8使ってますよ？」***

どうやら、ここで初めて***自分が違う問題をひいた***ことに気づきました。

# もう一度問題を整理

ここで、焦ってもしょうがないので分かっていることを整理した。

- MattermostとJenkinsは異なるサーバで動作
- コマンドラインからのcurlコマンドは成功する(Jenkinsからもcurlコマンドを実行したら成功した)
- MattermostもJenkinsは、OpenJDK1.8を使用している

どうやら、curlコマンドが成功するのに、webhookだと失敗するのは怪しいことからcrulとwebhookでのtcpdumpを取ってみた。

```sh
# tcpdump -A
```

# webhookの宛先がおかしい

tcpdumpを取得してみて気が付いた。
curlコマンドの時は、MattermostのサーバからJenkinsのサーバにリクエストを出していた。
しかし、JenkinsからwebhookでMattermostにリクエストした場合、宛先がMattermostのサーバではなく、知らないIPアドレスであることに気が付いた。
ここで、環境について追加事項がある。
Jenkinsをインストールをしたマシンは直接外部のネットワークには繋げられず、***プロキシ***経由でプラグインをダウンロードしている。

***「いやいや、まさかプロキシじゃ・・・」***
半信半疑で、Jenkinsのプラグイン管理からプロキシの設定を削除し、再度、Test Connectionを実行してみた。

***Success***

うまく行きました。

# まとめ
まさかプロキシの影響とは考えてなかったので、Successが出た瞬間に<span style="font-size: 150%"><b>「プロキシかよ」</b></span>と一人ツッコミしてしまいました。プラグインをインストールするために、設定していたプロキシが影響しているとは思いもよりませんでした。

- サーバ間で通信できない場合は、送信元でtcpdumpを実行し、通信の中身を見てみる。
- プロキシは流石に影響しないと思い込んでいた、問題ない・影響ないとは思い込まずに対象として調べる。
RubyのHashクラスを繰り返し処理で取り出し

# RubyのHashクラスを繰り返し処理で取りだす

Hashクラスに対して繰り返し処理で取りだす方法を学んだので、メモ

each_valueメソッドでvalueを取りだす方法

```ruby:sample.rb
human = {name: "田中", age: 26, school: "UCLA", major: "computer science"}
human.each_value do |element|
  puts element
end
#=>
#田中
#26
#UCLA
#computer science
```

each_keyメソッドでkeyを取りだす方法

```ruby:sample.rb
human = {name: "田中", age: 26, school: "UCLA", major: "computer science"}
human.each_key do |element|
  puts element
end

#=>
#name
#age
#school
#major
```

eachメソッドでkeyとvalueを取り出し

```ruby:sample.rb
human = {name: "田中", age: 26, school: "UCLA", major: "computer science"}
human.each do |key, value|
  puts "#{key}は#{value}です"
end
#=>
#nameは田中です
#ageは26です
#schoolはUCLAです
#majorはcomputer scienceです
```

覚えておく！
HTTPリクエストメソッドまとめ

サーバー周りの作業を進めるにあたって、HTTPリクエストメソッドをまとめる必要を感じたので、以下にまとめます。
ほとんど備忘録の目的で記載しています。
筆者がプログラミング初心者ゆえ、致命的な誤りなどありましたらご指摘いただければ幸いです。

HTTPプロトコルとは
-
サーバーが通信を行う際のルールのことです。身近な例では、

- http//〜

から始まるURLがまさにHTTP形式のプロトコルに沿った書き方です。

HTTPリクエストメソッドとは
-
WEBブラウザなどから「URL」の形式で、データのやり取りなど「動き」の指令（リクエスト）を役割ごとにわかりやすく定義したものです。
RubyやRailsの言語に関わらず、コードを記述する際の大きな基本となっていることに気付いたので、
以下に基本となるところをまとめます。



GET（参照）
-

指示の実行者の手元に使えるようにデータを取ってきます。
欲しい情報の詳細を記述します。

POST（新規作成）
-
副作用をともなうデータを送ることができます。

新しくデータを作成するときによく使用します。
新規作成したいデータの情報を追加で送信できます。

PUT（更新）
-
すでに存在しているデータを上書きして更新します。
更新の対象や更新内容などの情報を追加で送信できます。

PATCH（一部更新）
-
PUTと同じ更新のリクエストですが、PUTと違い、一部更新するときに使います。
更新の対象や更新内容などの情報を追加で送信できます。


DELETE（削除）
-
すでに存在しているデータを削除します。
削除の対象の情報を追加して記述します。



参考サイト
-
まとめるにあたって、下記のサイトを参考にさせていただきました。
HTTP リクエストメソッド
https://developer.mozilla.org/ja/docs/Web/HTTP/Methods

HTTPメソッド一覧
https://www.cresc.co.jp/tech/java/Servlet_Tutorial/Att_02.htm

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word11405.html

RESTful、HTTPメソッドについて　[ 自分用メモ ]
https://qiita.com/dawn_628/items/0b02f5f36c3516c03aff

今日はこのあたりで、失礼します。
PHPでのCSVファイル読み込みおよび配列化

基盤系の開発などをしていると、売上データや顧客データなどが書かれたExcelファイルや、CSVファイルを読み込んで、DBに格納するというシーンがボチボチあるため、対応しやすいようQiitaにまとめておく。
#環境#
PHP 7.1.7
Laravel 5.6.33(pureでも問題ない、使うのはpure標準の関数だか開発した環境がたまたまLaravelだっただけ）
MySQL 5.7.22

#使う主な関数#
###fopen()###
第一引数に指定したファイルを第二引数で指定したファイルモードで開く。
今回の場合はCSVファイルを開くのに使用する。
ファイルモードに関してはドキュメントを参照するのが一番良いと思う。とりあえず今回使うのは、読み込み専用でファイルがなかった場合falseを返す、'r'となる。

```php:ex.)
fopen('指定したファイル', 'ファイルモード');
```

###fgetcsv()###
引数に指定したfopen()関数を通過した後のCSVファイルを行ごとに配列化する。
fopen()関数を通したあとでないと使えないので注意

```php:ex.)
fgetcsv(引数);
```

###fclose()###
引数に指定したファイルを閉じる。
今回はCSVファイルを閉じるのに使用する。

```php:ex.)
fclose(引数);
```

#手順#
流れとしては、
①fopen()関数でCSVファイルを開く。
②CSVファイルをfgetcsv()関数で行ごとに抽出(行ごと抽出なので回数回してあげないと抽出できない)
③fclose()関数でCSVファイルを閉じる。
となる。

View側Formの内容に関しては詳しい話は省略するが、

```php:ex.)
{!! Form::open(['route' => 'hoge.hoge', 'files' => true]) !!}
    {{Form::file('csvfile')}}
    {{Form::submit('送信')}}
{!! Form::close() !!}

```
こんな感じでしょう。type属性は'csvfile'としている。
またForm::open()メソッドの'files'キーを'true'にしておかないとファイルアップロードの対応をしてくれないので忘れずに:sweat_drops:
まずはCSVファイルを開いてあげる。

```php:ex.)

public function hoge(Request $request)
{
    $input = $request->all();　
    $csvfile = $input['csvfile']; 
    $importfile = fopen($csvfile, "r"); 
}
```
fopen()関数の第一引数にはformから送られてきたCSVファイルが代入されている'$csvfile'が,第二引数には読み込み専用のファイルモードが記述されている。
ちなみに今回はForm経由のCSVファイルを使っているわけだが、**fopen()関数の第一引数に直接Pathを記述して指定することもできる**ので、もし挙動チェックなどをしたい場合などに使うと良いだろう。:relaxed:

続いて、fgetcsv()関数を用いてCSVファイルの行ごと取得を行っていく。

```php:ex.)
while($line = fgetcsv($importfile)) {
    //headerのスキップ処理
    if($line[0] == 'id') {
      continue;
    }
    $importline = [
                      'hoge' => $line[1],
                      'fuga' => $line[2]                               
                  ];
    $array[] = $importline;
}
```
今回はwhile文で処理してみた。
注意点はCSVファイルだと大概「ヘッダー」（id,名前,年齢,性別的なやつ）が記述されているとおもうが、それも読み込んでしまうので**条件式でスキップさせる必要がある。**（上記ではfgetcsvで＄lineに行の内容を配列として取得した際に、$line[0]がidという文字列だった場合、処理を飛ばしてあるが、ここは自分がクールだと思う方法で飛ばしてあげて良いと思う。。)
あとは＄lineの内容を連想配列化し、その連想配列をさらに配列に入れ多次元配列化してあげる。この処理は＄lineがfalseを返すまで繰り返される。

つづいてDBに格納する。:grin:

```php:ex.)
    while() {
    ...
    }
    DB::insert($array);
    fclose($importfile);
}
```
DBへ格納する方法はいくつかあるとは思うが、今回注意なのはsave()メソッドを使うと最後尾の行しか反映されないので、insertメソッドで処理すると全行をDBへ保存できる。（**DBの部分はDBファサードで置き換え、DBファサードはuseしておく必要があるので忘れずに**)
最後にfclose()関数でCSVファイルを閉じてあげる。
あとはトップページなどにリダイレクトしてあげれば処理としては終了:sunny:
割と急ぎだったけどまとめとしてはこんな感じでしょうか:hugging:

#まとめコード#
全部まとめるとこんな感じ
 
```php:ex.)
public function hoge(Request $request)
{
    $input = $request->all();　
    $csvfile = $input['csvfile']; 
    $importfile = fopen($csvfile, "r"); 

    while($line = fgetcsv($importfile)) {
        //headerのスキップ処理
        if($line[0] == 'id') {
          continue;
        }
        $importline = [
                        'hoge' => $line[1],
                        'fuga' => $line[2]                               
                      ];
        $array[] = $importline;
    }
    DB::insert($array);
    fclose($importfile);
    return redirect()->to('遷移したいページ');
}
[Unity] 初めてのスクリプトの作り方

#手順１
ヒエラルキーから[Create Empty]を選択
<img width="153" alt="スクリーンショット 2018-09-25 22.43.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/bc55e650-5120-7a2c-f361-2be6e362d2a4.png">

#手順２
inspectorの[Add Component]から[New Script]を選択
<img width="319" alt="スクリーンショット 2018-09-25 22.44.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/378892da-6a35-29a8-827d-b58a90c3a662.png">

#手順３
作成したファイルをエディタで開き編集する
<img width="378" alt="スクリーンショット 2018-09-25 22.44.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/1fc1a351-ced2-4d08-7181-be0d7baf52c4.png">

#手順４
実行ボタンを押す
<img width="186" alt="スクリーンショット 2018-09-25 22.44.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/a52d5d2a-b844-bb3f-389b-03abbc41fa7c.png">

画面下の方にHelloの文字列がでる
Gitについて自分なりに記す

#まずはじめに...
で検索すると下記サイトが一番上に表示されると思います。
基本的には下記を読んで「自分なりにどう解釈したのか」、を記していきます。
https://www.sejuku.net/blog/5756
#Gitとは
Gitがなんで生まれたかとか、誰が作ったのかという歴史的なことはすっ飛ばします(一応読みました)。
ちなみに↑の記事ではGitのできた訳を知ると理解が早まるでしょうみたいなことが書かれているので一度は目を通して見るのが良いかもしれません。
↓背景とか難しい単語や専門用語もりもりで書かれた参考文献はこちらです。
https://ja.wikipedia.org/wiki/Git

#本題の"Git"とは
ソースコードなどの変更履歴を管理することができる分散型のバージョン管理システムです。
Gitではローカル環境でもソースコードの変更をコミット(保存)且つ変更履歴を記録することができます。要はネットに接続していなくても、ローカル開発環境でサーバー上に上がっている全く同じファイルをいじることができます。
その分散型と呼ばれる所以は、2005年12月のGitが世に出る前までは、エンジニアやプログラマーが、サーバー上にある一つのリポジトリをその開発に携わる全員で共同利用していたそうですが、Gitでは個々がサーバー上に上がっているリポジトリをローカルに落として作業することで、より効率的に作業・開発をすることができるようになったという訳です。

##**リポジトリとは**...
情報工学において、仕様・デザイン・ソースコード・テスト情報・インシデント情報など、システムの開発プロジェクトに関連するデータの一元的な貯蔵庫を意味する。日本語でレポジトリと表記される場合もある。一種のデータベースであり、ソフトウェア開発および保守における各工程の様々な情報を一元管理する。
######概要
データを管理するための情報のことをメタデータといい、メタデータを収集・登録・管理したものをデータディクショナリという。データディクショナリはデータの管理を主とするが、リポジトリはシステム開発の各工程での成果物をメタ情報として管理する。
もっと**リポジトリ**について詳しく知りたいってかたは[こちら](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA)
をどうぞ(雑)www

#まとめ
以上Gitについて自分なりに理解した内容を文字に書き起こしてみたよって投稿でした。
次回はpushやcommitの手順を実際に使ったコマンドを載せながら説明していこうと思います。

*P.S.
読みづらいとか、わかりにくいとかの感想お待ちしております。
自省して次の投稿に活かします💪*