OmniAICreator/Qiita-1.07M huggingface dataset:
OptionalのorElse()とorElseGet()の使い分けが気になったので

##Optional is 何

Java8で追加されたクラス　-　java.util.Optional

**null以外の値が含まれている場合も含まれていない場合もあるコンテナ・オブジェクトです。**
by　https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html

なるほど、わからん。

##似てる
- orElse(T other)
存在する場合は値を返し、それ以外の場合はotherを返します。

- orElseGet(Supplier<? extends T> other)
値が存在する場合はその値を返し、そうでない場合はotherを呼び出し、その呼び出しの結果を返します。

##とりあえずお試しコード
```java:Main.java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        
        // 1.
        Optional.of("hoge").orElseGet(() -> {
            System.out.println("実行されないorElseGetだよ");
            return "";
        });

        // 2.
        Optional.empty().orElseGet(() -> {
            System.out.println("実行されるorElseGetだよ");
            return "";
        });

        // 3.
        String piyo = (String)Optional.of("hoge").orElse("返却されないorElseだよ");
        System.out.println("piyo: " + piyo);

        // 4.
        String piyo2 = (String)Optional.empty().orElse("返却されるorElseだよ");
        System.out.println("piyo2: " + piyo2);

    }
}
```


##結果
```
                              // 1.
実行されるorElseGetだよ         // 2.
piyo: hoge                     // 3.
piyo2: 返却されるorElseだよ     // 4.
```

##つまり・・・？
　orElse()はOptionalの中身がnullであるかにかかわらず実行されて、oeElseGet()はnullの場合だけ実行される。

##結論
- 「nullの場合は空文字やゼロを返す」のように定数を返すだけのためにラムダ式を書くのは無駄なのでorElse()が良い
- 「nullの場合は何かしらの処理を行い、その結果を返却する」の場合はorElseGet()
Dockerのクジラの名前は"Moby Dock"だった件

Mobyはモビー、Dockはドックと発音するので、日本語だと「モビードック」と呼べば良さそうですね。

ちなみにMoby Dockという名前はアンケートで2013年に決まったようです（他には"Humphrey(ハンフリー)", "Malcom(マルコム)"などがあった模様。）

https://blog.docker.com/2013/10/call-me-moby-dock/

![](https://i1.wp.com/blog.docker.com/wp-content/uploads/2013/10/name_votes.jpg?w=715&ssl=1)
Firebaseにおける軽量ファイル保存 - Cloud Firestore vs Cloud Storage

最近、趣味でFirebaseを使ったwebサービス開発を行っています。
現在は、軽量のファイルをアップロードし、ユーザー間で共有するwebサービスを開発中です。

数KBの軽量テキストの場合、データベースであるCloud FirestoreとストレージサービスであるCloud Storageのどちらを利用するべきか迷ったため、調査を行いました。

## 想定
- Firebaseの無料プラン
- 1ファイルのサイズの平均は5KB程度
- 月間のアクセス数は5000程度
- 多少のwrite/read制御が必要(自分のファイルは更新できる、他人のファイルは閲覧できる)

## 比較
表にまとめると以下のようになりました。

|                 | Firestore            | Storage          |
|-----------------|----------------------|------------------|
| 容量            | 1GB                  | 5GB              |
| 1ファイルの容量 | 1MiB(binary, string) | 本家は5TB        |
| 帯域幅          | 10GB/月              |                  |
| write           | 2万/日               | 2万/日           |
| read            | 5万/日               | 5万/日           |
| delete          | 2万/日               | writeに含まれる? |
| アクセス制御    | 認証と連動可         | 認証と連動可     |
| サイズ制限      | 自前で実装           | 可能             |
| 暗号化          | デフォルトで有効     | デフォルトで有効 |
| 複数取得        | 可                   | 不可             |

以下で詳細を見ていきたいと思います。

### 総容量
無料プランでは、firestoreが1GB、storageが5GBとなっています。

まあ、軽量テキストなら1GBでも十分かな？

### 1ファイルの容量
firestoreが1MiB、storageは(おそらく)5TBです。

firestoreの方をもう少し詳細に述べると、以下のようになります。

- 1ドキュメントのサイズが1MiB未満(ドキュメント = DBのレコード相当)
- string、binary属性は最大1MiBまで
- 1つのドキュメントは複数の属性を持てる

想定ファイルがサイズ以内ならどちらでもよさそうです。

### write/read/delete
おそらく大差はなさそうです。
後述の複数取得を行ったとしても、最終的にドキュメント(DBのレコードのようなもの)単位でカウントなので、結局取得するファイルの数だけ、read回数を消費することになりそうです。

### アクセス制限
どちらでもユーザーでの認識等は可能なようです。

firestoreの方が属性に含まれるユーザーIDで制御できるので、storageよりっも細かい制御が実施できる印象です。

### 暗号化
簡単な利用の場合は、差はなさそうです。

### 複数取得
当然ですが、firestoreの場合はデータベースなので、属性等による検索が実施できます。

## まとめ
firestoreでも軽量なファイル(1MiB未満)であれば十分に格納できそうです。

勉強も兼ねて開発中のサービスではfirestoreを採用してみます。

## 参考
[Firebase のガイド](https://firebase.google.com/docs/guides/?hl=ja)
[Firebase のプライバシーとセキュリティ](https://firebase.google.com/support/privacy/?hl=ja)
docker-composeのvolumesに書いてある":(コロン)"の意味について

## 結論

- コロンの左側に記述されているホストOSのファイル群を、
- コロンの右側に記述されているコンテナのパスに設置する

```dockerfile:docker-compose
version: '2'
services:
  app:
    image: openjdk:8-jdk-alpine
    ports:
      - "8080:8080"
    volumes:
      - .:/app
      # ホストのカレントディレクトリをコンテナの/appに反映する
    working_dir: /app
    command: ./mvnw spring-boot:run
```
【備忘録】『速習TYPESCRIPT』の参考になった部分まとめ

<a href="https://www.amazon.co.jp/%E9%80%9F%E7%BF%92TypeScript-altJS%E3%81%AE%E3%83%87%E3%83%95%E3%82%A1%E3%82%AF%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%80%E3%83%BC%E3%83%88%E3%82%92%E7%B4%A0%E6%97%A9%E3%81%8F%E5%AD%A6%E3%81%B6%EF%BC%81-%E9%80%9F%E7%BF%92%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B1%B1%E7%94%B0%E7%A5%A5%E5%AF%9B-ebook/dp/B0733113NK/ref=as_li_ss_il?ie=UTF8&linkCode=li3&tag=protein078-22&linkId=612b0dec51bb5680f9b84133e28cc8e1&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B0733113NK&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=protein078-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=protein078-22&language=ja_JP&l=li3&o=9&a=B0733113NK" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

何かあればご指摘大歓迎です:joy:

## オブジェクトの作り方

```typescript
let obj: { [index: string]: string; } = {
    'hoge': 'ほげ',
    'foo': 'ふー'
}

console.log(obj.hoge);
console.log(obj['hoge'])
```

interfaceを使ってもよい

```typescript
interface StringMap {
    [index: string]: string;
}

let obj: StringMap  = {
    'hoge': 'ほげ',
    'foo': 'ふー'
}
```

## アロー関数を使ったthis固定の簡素なコード

```typescript
let triangle = (base: number, height: number): number => base * height / 2;
```

## 引数が省略できる関数は ? をつける

swiftのoptionalのような？

```typescript

 function showTime(time?: Date): string {
    // ...
}
```

## デフォルト値がありの引数は引数リストの末尾に書く

## 不特定多数の引数の表現

これは arguments のようなArrayライクではなく真性のArray

```typescript
function sum(...values: number[]) {
    let result = 0;
    for (let value of values) {
        result += value;
    }
    return result;
}

console.log(sum(1, 5, -8, 10));
```

## 関数のオーバーロード

ちょっと癖がある

```typescript
function show(value: number) void;
function show(value: boolean) void;
function show(value: any): void {
    if (typeof value === 'number') {
        console.log(value.toFixed(0));
    } else {
        console.log(value ? '真' : '偽');
    }
}

show(10.358);
show(false);
show('hoge');
```

typeofはプリミティブ型の判定しかできない。クラス型ならinstanceof。
PowerCLIで仮想マシンのovfファイルへのエクスポートインポートを行う

#そもそも
web Clientのovfファイルのエクスポートインポートが使いにくい上に、IEだと4GB以上のファイルをインポート出来なくてとても困る。
そのため、エクスポートインポートはPowerCLIで実施する方が簡単確実なのでコマンドをメモ。
DR側のvCenter Serverへファイルサーバ経由でマスターをクローンするとかの際にスクリプトに組み込める。

#エクスポート
Export-VApp を使用する
出力ファイル名はFormatの拡張子が付与される

```powershell
Get-VM -Name "仮想マシン名" | Export-VApp -Destination "出力先パス" -Format "ova/ofv" -Name "出力ファイル名"
```

#インポート
Import-Vapp を使用する

```powershell
$ImportVMName = "インポートする仮想マシン名"

$vm_host = Get-VMHost -Name "インポートするESXi名" -Location "クラスタ名"
$vm_host | Import-vApp -Source "ovf/ofaファイルパス" -Name $ImportVMName -Datastore "データストア名"

#ネットワークアダプタ(ポートグループ)を変更する時はインポート後に以下を実行
$MyNetworkAdapterName = (get-VM $ImportVMName | Get-NetworkAdapter).Name
$MyNetworkAdapter = Get-NetworkAdapter -VM $ImportVMName -Name "$MyNetworkAdapterName"
$MyPortGroup = Get-VirtualPortGroup -Name "変更後のポートグループ名"
Set-NetworkAdapter -NetworkAdapter $MyNetworkAdapter -Portgroup $MyPortGroup -Confirm:$false
```
Kotlin Coroutines + Retrofit2を使ってAPIを叩く


Kotlin 1.3 からStableになるといわれているKotlin Coroutinesを勉強したのでメモとして書いておきます。

Kotlin Coroutinesって何？？って方は下の記事を読めばだいたい理解できるかと思います。自分もこの記事を読んで学びました。

- http://sys1yagi.hatenablog.com/entry/2018/08/28/000620


## 準備

まずはセットアップからしていきます。

前提として
- Retrofitは導入してある
- コンバータはMoshiを使うので導入してある

`app/build.gradle` に書きを追加します。

```groovy

kotlin {
        experimental {
            coroutines "enable"
        }
    }

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:0.22.5"
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-experimental-adapter:1.0.0'
```

バージョンは最新のものを使用してください

## 実装

### API通信

- InfoService.kt

```kotlin

interface InfoService {

    companion object {
        const val baseUrl = "APIの接続先"
    }

    @GET("info/")
    fun getInfo(): Deferred<Response<List<Info>>>
}

```

これでAPIの接続先とかを定義したので次はRetrofitインスタンスを作成します。

### Retrofitインスタンス

- InfoRepository.kt

```kotlin
class InfoRepository {

    fun getInfo() = Retrofit.Builder().baseUrl(InfoService.baseUrl)
            .addConverterFactory(MoshiConverterFactory.create())
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .build().create(InfoService::class.java)

}
```

### Retrofitインスタンスを呼ぶ

次に定義したRetofitインスタンスをViewModelから呼びます。

- InfoViewModel

```kotlin
fun start() {
        val service = InfoRepository().getInfo()
        launch {
            val request = service.getInfo()
            val response = request.await()
            if (response.isSuccessful) {
                // 成功
                print(response.body())
                val list = response.body() ?: return@launch
                // ここで取得したデータでViewwをごにょごにょする
                items.clear()
                items.addAll(list)
            } else {
                // エラー
                print(response.errorBody())
            }
        }
}
```

これで完成です。


## 参考

- https://qiita.com/takahirom/items/2ba221a8d0c32cf701ba
- https://android.jlelse.eu/kotlin-coroutines-and-retrofit-e0702d0b8e8f
- https://qiita.com/hossynohito/items/27e10df1b331e077161a
Windows10で一時的にログオンユーザーと別ユーザーとしてプログラムを実行する

コマンドプロンプト or Powershellにて、runasコマンドを実行すればOK。
/user:に続けて任意のユーザー名を指定、その後に実行プログラム名を指定。
パスワードの入力を求められるので、指定したユーザーのパスワードを入力する。

```ruby:コマンド
runas /user:username program-name
```
以上
ファイルにバージョン番号を付ける

# 概要
作業中のファイルをメール等で共有して確認する時に，`ファイル名_v07.docx`のように，バージョン番号が付いていると便利です．
しかし，イチイチコピペしてバージョン番号を書き換えるのは面倒です．

# 具体的にどのような動作をするか
## バージョン番号が付いているファイルがディレクトリ内に無い時
バージョン番号が付いていているファイルが同一ディレクトリ内に無い時には，`ファイル名_v01.docx` というファイルがディレクトリ内に作成されます．

## バージョン番号が付いているファイルがディレクトリ内にあるとき
バージョン番号が付いているファイルが同一ディレクトリ内にあるときには，バージョン番号を1つ増やしたファイルが作成されます．

例) `ファイル名_v03.txt`がディレクトリ内にあるときに，実行すると`ファイル名_v04.txt`が作成されます．

# 実際のコード
+ 使用方法
```
tcsh version.sh ファイル名
```

または，
`/bin/`とかに置いて，パスをはりましょう．

```version.sh
#!/bin/tcsh
if ($#argv != 1) then
    echo "Usage: Invalid Argument"
    exit 1
endif

set filefullname = $1
set filename = $filefullname:r
set extension = $filefullname:e
# Retrieve the current version number
set vernum = `ls *.{$extension} | grep $filename | sort -t _ -k 3 -n | tail -n1 | sed -e "s/^.*_v\([0-9]*\).*/\1/"`
# Parameters for determining whether a file with a version number exists
set nullvernum = `ls *.{$extension} | grep $filename | sort -t _ -k 3 -n | tail -n1`

# Increment or set version number
if ($nullvernum == $vernum) then
    @ newvernum = 1
else
    @ newvernum = ${vernum} + 1
endif

set newvernumchar = `printf "%02d" $newvernum`
set newfilename = $filename"_v"$newvernumchar.$extension
cp $filefullname $newfilename
```
vim-latex 利用環境において \begin{document} \end{document} の間でシンタックスハイライトする

# 何をしたいか
vim の Latex 向けプラグインの一つである vim-latex( https://github.com/vim-latex/vim-latex )で，
自作したsyntaxハイライトが\begin{document}から\end{document}の間で有効にならないという問題に直面した．

vim-latex を使いつつ，\begin{document}から\end{document}の間で，自作syntaxハイライトを利用したい．

# 方法
どうも，vim-latexがdocumentや数式のスコープ毎に有効となるsyntaxを変更しているらしい．

そこで，vim-latexで利用されているhighlightにピギーバックさせる．
`:highlight`で確認したところ，`texDocZone`が使われていない，かつ vim-latexでドキュメント中で無視されずに実行されそうである．

``` .vim/syntax/tex.vim
syn match texDocZone /#.*/
highlight link texDocZone Todo
```

上記の用に設定ファイルを記述する事で，`/#.*/`にマッチする時に，`Todo`の色づけを行えるようにできた．
(私は，tex内でPDFに出力したいメモを#で記述する事がある．)

# 落ち穂ひろい
`:highlight`で確認して，他にも使えそう(空いている `tex.*`)なハイライトがあるので流用できそう．
例えば，`texMath.*`などは数式内でのみ有効なハイライトとして使えそう．
なお，試してはいない．

# 参考にしたリンク
https://qiita.com/shuhei/items/5ff5e9792746c70ab8ad
https://qiita.com/kimurap/items/7058c9fe29f51932b196
https://vim-jp.org/vimdoc-ja/syntax.html
https://stackoverflow.com/questions/13713806/adding-syntax-highlighting-for-latex-plugin-in-vim
RasPi→AWS IoTまで来たデータを使ってメール送信

RasPiから送ったデータをES-Kibanaで可視化し、dynamoDBにも保存することができましたが、そのデータのメール通知に挑戦しました。

参考にした記事：公式チュートリアル
[Amazon SNS ルールを作成する](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sns-rule.html)

AWS IoT Coreの「ACT」からルールを開いてアクションを追加します。
上記チュートリアルの最後まで進めたら、今度はAWSコンソールからSNSダッシュボードを開きます。
左のメニューから「トピック」を押すと、チュートリアルで作成した「MySNSTopic」が表示されていると思うので、ARNをコピーしておきます。
ダッシュボードに戻り、「サブスクリプションの作成」を押して、さきほどコピーしたARNを貼り付けます。
プロトコルはEmailを押して、エンドポイントに自分のメールアドレスを入れます。
サブスクリプションの作成ボタンを押すと、メールアドレスに登録通知メールが届くので、リンクを押してactiveにします。
トピックの受信タイミングでメールが来たら成功です！

SNSはSimple Notification Serviceの略だったんですね。
ソーシャルメディアの方かと思って、Twitterとかかなーって勝手に思ってました。
新卒未経験エンジニアとして半年間学んだ振り返り

# はじめに
細々とQiita投稿していた元未経験エンジニアです。
4月に新卒として入社して半年が経ち、しっかりとしたトレーニング期間が終了しました。
この半年に学んだこと、行った業務、感じたこと、こうしておけばよかった、こうしてもらえたらもっとよかったなどを備忘録として残しておきたいと思います。今回は技術面に限定します。
来年以降に活かせるように。

#4月
##学んだこと
###内容
* HTML/CSS
* PHP（基礎）
* MySQL(触り)

###方法
ドットインストールでひたすらPHP入門を見る。その後メンターにアウトプットの目的で簡単な問題を出題してもらう。
HTML/CSSは調べながらひたすら書いていくという、必要最低限を身につける方式。
SQLはターミナルでコマンド打って見る。これもメンターからの出題形式で慣れていった。

##行った業務
* ひたすら勉強（技術的な業務はなし）
* 簡単なBMI測定アプリを作成（PHP/HTML/CSS）

##ひとこと
勉強詰だったわりには、楽しく過ごせた。おそらく全てが新しく吸収が嬉しかったから。また、BMI測定アプリは社内に公開し、ポジティブな反応を多くいただけたため嬉しかった。PHPはforeachの理解に時間を要したが、出題形式にして多くのパターンに触れることができたことが後々の業務につながったと思う。


#5月
##学んだこと
###内容
* HTML/CSS
* PHP
* MySQL
* git（概念）
* MVC（軽く）
* コードレビュー

###方法
上三点に関しては引き続き継続学習を行った。
gitについては業務で必要になるとのことで、コマンドと概念をウェブサイトで学習
MVCは概念を軽くメンターに説明してもらった
コードレビューは後述の家計簿アプリで行った

##行った業務
* ひたすら勉強（技術的な業務はなし）
* MVCで簡単な家計簿アプリを作成（PHP/HTML/CSS/MySQL）

##ひとこと
5月はSQLも使用して家計簿アプリを作成。CSSもライブラリを用いることで綺麗なウェブサイトが一つ完成して、エンジニアになったんだなあと感じることができた月だった。今振り返るとこの二ヶ月での小さいが多くの成功体験を積めたことが、エンジニアとしての仕事に対して前向きな姿勢をもたらしてくれたと思う。また、MVCに早くから触れることができたのは後々の業務に入りやすくなった。


#6月
##学んだこと
###内容
* JavaScript
* Ajax
* JSON
* git

###方法
全て業務で必要なところを都度調べながらという感じで行った。
gitも初めてしっかりと使った

##行った業務
* 広告配信システムのレポート画面の改修

##ひとこと
いきなり難しい案件に当たってしまったということもあるが、かなり苦労した。業務で使われているPHPの修正はほぼ行わず、研修でやらなかったJS、Ajax、JSONなどが出てきたため調べながらの業務となった。この後にもJSを使うことは多々あったため、研修内容に基本的なところはあってもよかったなと感じた。とはいうものの無事業務をこなすことができたという経験はやっと社会人になったのだと感じることができた瞬間だった。


#7月
##学んだこと
###内容
* JavaScript
* Vue.js
* Laravel
* 要件定義
* 設計


###方法
JavaScriptについては前月の反省を活かし、基礎研修を行っていただいた。
Vue.jsは対応箇所が少なかったため他のコードを見よう見まねで記述
Laravelは簡単に概要の説明を受け、触って慣れる方式で勉強

##行った業務
* 社内用広告配信管理ツールの新機能開発

##ひとこと
初めての自分が主体となった機能の開発であった。そのため要件定義、設計、工数見積もり、テストなど新たな経験が盛りだくさんだった。ただのプログラマーで終わらないエンジニアとしての第一歩となったかなと思う。ビジネスサイドとの要件のすり合わせ等のビジネススキルも身につけることができ、視野が広がったと感じた。今になって考えると、Laravelの基本的な機能は使っているものの、活かしきれていない感が強いため、Laravelの使い方であったりそもそものチームでの運用方針をしっかりと策定することがよりスピーディーかつ今風なチームになるのかなと感じている。

#8月
##学んだこと
###内容
* サーバーとは
* 仮想化
* テストの大切さ

###方法
上記2点は講義形式で概要の説明を受けた。vagrent upくらいはできるようになった。
テストの大切さは不具合を出したことで身にしみて感じることができた。

##行った業務
* 広告配信システムの改修数件

##ひとこと
上記のテスト漏れに関しては、インデントを1行直しただけの改修だったために起こった。smarty templateがJavaScriptのタグとして読み込んでしまうという事象で、テスト環境でストップしたから損失は出さなかったものの、冷や汗が止まらない苦くも大きく大切な経験になった。以下エラー内容

```javascript
正しいコード

 $j.ajax(
                {
                    url:"/ajax/

```

```javascript
誤ったコード

 $j.ajax({
              url:"/ajax/

```

これでエラーが出るのでSmartyは気をつけます。

#9月
##学んだこと
###内容
* 綺麗なコード
* 速度を気にした開発

###方法
DRYであったりDIを意識したコードを書く。例えばメソッドは細かく分けるであったり、タイプヒンティングをきちんとする、メソッド名をきちんと考えるなどをして地道に慣れさせ身につけていった。
速度をあげることに関してはDBアクセスをなるべく減らして時間がかからないようにした。99%以上速度が速くなった（7月の開発の自分が書いたコードが汚すぎたというナイスアシスト）。

##行った業務
* 7月に行った新機能開発のリファクタリング

##ひとこと
リファクタリングはビジネスサイドからすれば、動いているものをわざわざ綺麗にする必要はないため敬遠されがちだが、処理を軽くするということで証明できてよかった。綺麗なコードもだいぶかけるようになってきて、4月に書いていたコードを見ると吐き気がする。人は半年足らずでこんなにも成長できるのかと感じることができた。


#半年のトレーニング期間を終えての感想
メンターの方には付きっ切りでトレーニングしていただいて非常に感謝している。小さなエンジニア組織だからこそ○○エンジニアという肩書きではなくフルスタックにこなせなければいけないという認識はあるものの、まだまだカバーできていない範囲が多すぎる。特にサーバー周りであったり環境構築など。ただ、そこはチームとしてコミットするために言語の勉強を優先するという方針で指導していただき、早期からコミットすることができたため業務の中で、また自習で少しずつキャッチアップしていければいいかなと思っている。学び続ける姿勢を忘れずにチームでも目立てるような存在になれるようあと半年間、一年目としてフルコミットしていきたい。
グラデーション・デザイン【Processing】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# はじめに
今回の短めスクリプトでは、「**グラデーション・デザイン**」というグラデーションを描くプロジェクトを作りたいと思います。
長さ：`8行`（`91文字`）

# 作品サンプル
<img width="300" alt="sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/34561714-6d8d-0ac8-e279-23a76b2b9ae4.png">

# 最終的なコード
`java:gradation.pde
void setup(){
  size(255,255);
  int i;

  for(i=0; i < width; i++){
    stroke(i,255,255);
    line(i, 0, i, height);
  }
}
`

# コードの解説
## 1. `void setup(){}`
はじまった時に、{}の中身を**一度実行する**。

## 2. `size(500,500);`
**画面の横と縦の大きさ**をそれぞれ500pxにする。

## 3. `int i;`
整数の変数iを定義する。

## 4. `for(i=0; i < width; i++){}`
変数iがwidth（画面の横幅）より小さい間は{}の中を繰りかえす。
この時、iは0から始まり、{}の中のプログラムを一度行う度に、1ずつ加算されていく。

## 5. `stroke(255,255,255,100);`
線の色をRGB(255,255,255)（真っ白）にする。（透明度は100/255）

## 6. `line(0,0,10,20)`
(x,y)=(0,0)の点から、(x,y)=(10,20)の点までの線を引く。

# アレンジ・コード
#### \>>`strokeWeight(3);`
線の太さを、3に設定する。

### サンプルコード（アレンジ）
`java:gradation_arrange.pde
void setup(){
  size(255,255);
  int i;
  strokeWeight(3);

  for(i=0; i < width; i++){
    stroke(i,255,255);
    line(i, 0, i, height);
  }

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
VSCode1.28 にアップデート後、ターミナルでgit logの日本語表示がおかしくなった件

# 環境
- Win10
- VSCode1.28
- VSCode上のターミナルはPowerShellを使用

# 症状
- ↓こちらの記事の方と、全く同じ現象にぶち当たったのでメモ
  - https://qiita.com/fukasawah/items/a63b6bd8b0340c4ccaaf

# 原因？
- @fukasawah さん指摘の通り、今回のアップデートで、環境変数： `LANG` をセットするしないあたりの挙動が修正（変更）されている
- いままでは、常に 環境変数：`LANG` がsetされていたのが、ちゃんと VSCodeの設定値を参照するようになった（影響対象はWindowsのみ）

# 対応
- 基本設定 ＞ 設定 ＞ ユーザー設定 ＞ 機能 ＞ ターミナル
- terminal.integrated.setLocaleVariablesを trueにする
- これで、環境変数： `LANG` がセットされるので、VSCode上のターミナルでもちゃんと日本語表示されるようになった

```setting.json
// ターミナルの開始時にロケール変数を設定するかどうかを制御します。macOS では既定で `true` になり、その他のプラットフォームでは `false` です。
  "terminal.integrated.setLocaleVariables": false
```
Cognos Analytics でのマスター詳細を使用したレポートのチューニング

#概要
Cognos Analyticsでマスター詳細の機能を使用しているレポートのチューニング例です。

マスター詳細を使用している例ですが、以下のようにリストの中にリストが入っていて、親のリストでは「年」をデータとして持っていて、子のリストでは「製品ライン」と「数量」が、親の「年」の値に該当する数値が表示されています。
この様なレポートの場合、
①2010年の「製品ライン」と「数量」を取得するクエリーが発行され
②2011年の「製品ライン」と「数量」を取得するクエリーが発行され
③2012年の「製品ライン」と「数量」を取得するクエリーが発行され
④2013年の「製品ライン」と「数量」を取得するクエリーが発行され
という感じに、子のクエリーが、親の値分繰り返し発行されます。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/5a252a01-a487-7108-66fb-dac980f08c21.jpeg)

マスター詳細のチューニングは、子のクエリー発行の繰り返しを発生させない事が方針となります。

#マスター詳細のレポート実装
子のクエリーのプロパティの「マスター/詳細の関係」で、以下のように、親(Master)の「年」子(Detail)の「年」の間にリンクを作成して実装を行います。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d87d2fc6-20fe-8400-86e5-8b69e7539de1.jpeg)

親のMasterクエリーの保持しているデータアイテムです。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/3f4dab4d-8763-9a55-4c63-b67fd801b5b6.jpeg)

子のDetailクエリーの保持しているデータアイテムです。
![005.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ae5082ab-a0e9-2e62-011b-392b5267c6f5.jpeg)

#マスター詳細のチューニング①
この例では、MasterとDetailで取り扱うデータアイテムは「年」「製品ライン」「数量」なので、これらをまとめて一旦「Base」というクエリーで取得します。
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ff236e46-953c-a6e7-e172-0e3b1107ba1b.jpeg)

そして、クエリー・エクスプローラーで、以下の様にMasterとDetailのクエリーにリダイレクトします。
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/e9a70ccd-41f2-5a69-1aae-3497d9a865f4.jpeg)

Masterのクエリーの「年」はBaseクエリーの「年」から取得しています。
また、クエリーのプロパティで、「ローカルキャッシュを使用」を「はい」にします。
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d12604ad-7385-ad3b-98f8-1e2d0d3d2866.jpeg)

Detailのクエリーの「年」「製品ライン」「数量」は、Baseのクエリーから取得しています。
また、クエリーのプロパティで、「ローカルキャッシュを使用」を「はい」、「SQLパラメーターを使用」を「リテラル」にします。
![009.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/80712ada-dd01-76e5-2a39-6e8cfc60461d.jpeg)

この設定により、MasterもDetailのクエリーも一度Baseクエリーにて取得した結果をキャッシュに乗る事で、Detailのクエリーが複数回データベースに対して発行される事も無く、キャッシュから取得され、高速化されます。

#マスター詳細のチューニング②
Framework Managerのガバナーの機能でも、「マスター詳細の最適化」というプロパティーが存在し、これにより前述の様な親のクエリーと子のクエリーをキャッシュで扱う事による最適化が可能なようです。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/b11632ca-d4cf-074e-2a44-ec6f9c37b1f6.jpeg)

この機能をしっかり有効活用するため、こちらの記事もご参照ください。
**Cognos のレポートを改善するためのヒントをさりげなく教えてくれる機能**
https://qiita.com/shinyama/items/dae8c2ddf114ddef2a08

以上、ご活用下さい。
[Vue2.0] TypeError: Cannot read property '$createElement' of undefined

Vueで遭遇した事象を共有。

## 事象
以下のようにHogeページを追加し、該当ページに遷移しようとしてrouter.push('/hoge')したところ、エラー発生

```router/index.js
...
    {
      path: '/hoge',
      name: 'hoge',
      components: Hoge
    },
...
```

```
> TypeError: Cannot read property 'loadItems' of undefined
```

該当のページでは

```Hoge.vue
mounted () {
  this.loadItems()
},
methods: {
  loadItems () {
    //.....
  }
}
```

としていたので

```Hoge.vue
mounted () {
  console.log(this)
  this.loadItems()
},
```

this がundefined。
this汚染やっちまった？と思い、探してみたがハズレ。
mounted をコメントアウトしてみると、次のエラーが発生

```
>TypeError: Cannot read property '$createElement' of undefined
```

## 原因と答え

stackoverflowに答えが...
https://stackoverflow.com/questions/50218836/vue-router-typeerror-cannot-read-property-createelement-of-undefined?rq=1

誤：components
正：component

```router/index.js
...
    {
      path: '/hoge',
      name: 'hoge',
      component: Hoge
    },
...
```

上記とすると直りました。

## 環境
Vue2.0 + vuex
package.jsonのscriptsでは他のscriptを連続して使用できる

npmの`run`コマンドではpackage.jsonのscriptsに定義されているscriptを自由に実行できますが、あるscript内で別に定義されているscriptを実行することも可能です。

```json:package.json
{
  "scripts": {
    "echo:hello": "echo hello",
    "echo:comma": "echo ', '",
    "echo:world": "echo world",
    "echo:helloworld": "npm run echo:hello && npm run echo:comma && npm run echo:world"
  }
}
```

```bash:実行結果
$ npm run echo:helloworld
> echo hello
hello 
> echo ', '
,
> echo world
world
```
ローカルマシン からCloud Shellに接続(ssh, scp, mount)する 

## Cloud Shell に ssh 接続する

```
$ gcloud alpha cloud-shell ssh 

API [cloudshell.googleapis.com] not enabled on project
Would you like to enable and retry (this will take a
few minutes)? (y/N)?  y //Cloud Shell API をONにする

your_account_name@cloudshell:~ (project_id)$ //ssh接続できた
```

### config を設定しておくと便利

```
$ gcloud config set project [your_project_id]
$ gcloud config set account hogehoge@gmail.com
$ gcloud config list

[core]
account = hogehoge@gmail.com
disable_usage_reporting = False
project = [your_project_id]

Your active configuration is: [your_project_id]

//configを複数持つことも可能
$ gcloud config configurations list
NAME         IS_ACTIVE  ACCOUNT                  PROJECT        DEFAULT_ZONE  DEFAULT_REGION
default      False      hogehoge@gmail.com  [your_project_id_1]
flatfish-jp  True       hogehoge@gmail.com  [your_project_id_2]
```

## ssh接続はせずにコマンドの実行

```
$gcloud alpha cloud-shell ssh --command=ls
fileA
fileB
fileC
```

## scpコマンドでファイルをアップロード

```
$gcloud alpha cloud-shell scp localhost:`pwd`/filea cloudshell:~/

$gcloud alpha cloud-shell ssh --command=ls
filea
```

## scpコマンドでファイルをダウンロード

```
$gcloud alpha cloud-shell scp cloudshell:~/filea  localhost:`pwd`/

$ls
filea
```

## マウント
sshfsインストールしていることが前提
参考: [Macでsshfsを使ってローカルからリモートのファイルを触る](https://qiita.com/ysk24ok/items/bb148530a55a4e55d99b)

```
$ mkdri testdir
$ gcloud alpha cloud-shell get-mount-command testdir/
sshfs hogehoge@hogehoge: testdir/ -p 6000 -oIdentityFile=$HOME/.ssh/google_compute_engine -oStrictHostKeyChecking=no

//出て結果をそのまま実行すると testdir/ にマウントされる
$ sshfs hogehoge@hogehoge: testdir/ -p 6000 -oIdentityFile=$HOME/.ssh/google_compute_engine -oStrictHostKeyChecking=no

//マウント解除
$ diskutil unmount testdir
```
【Linux】CentOS6.xで timezone (UTC , Asia/Tokyo)がずれる場合の２つの対処法

今回の環境は、ローカル開発環境Vagrantで、Centos6.8にてphpにて開発
ですが、他の場合RHEL系なら、同様かと思います。
（７系とかも同じだとは思いますが）

<h2>ケース１（通常）: php.ini</h2>

```ターミナル
念のためバックアップ取りましょう
$ cd /etc
$ cp php.ini php.ini.org　 　　　　　// .orgをつけてバックアップした例

// 編集は管理者権限で
$ sudo vi php.ini
```

次に、php.ini のタイムゾーンを変更しましょう！

```/etc/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"
```

<h2>ケース２ : そもそもOSのタイムゾーンがおかしい場合</h2>
```Terminal
$ sudo yum install ntp
$ sudo ntpdate ntp.nict.jp
```

```
$ date
// 2018年 10月 10日 水曜日 16:26:30 JST/  あってればOK
```

ケース１、２両方試せば大丈夫なはずです。

※管理者権限(sudo)は忘れがちなので、注意です。

参考：
[CentOS6.4のタイムゾーン設定は正常なのにGMT+18Hになってるのを直した](http://blog.at-human.com/2013/10/14/centos6-4%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E8%A8%AD%E5%AE%9A%E3%81%AF%E6%AD%A3%E5%B8%B8%E3%81%AA%E3%81%AE%E3%81%ABgmt18h%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B/)
pythonで四則演算

#　はじめに
pythonの基礎として、簡単な四則演算について記載します。


#　環境
python3.6
anaconda1.8.7

#　やってみる

四則演算

加算

```python
>>> 2+3
5
```
減算

```python
>>> 3-2
1
```
乗算

```python
>>> 4*2
8
```
累乗

```python
>>> 4**2
16
```
除算

```python
>>> 4/2
2
```
浮動小数点数までの除算

```python
>>> 7/3
2.3333333333333335
```
整数除算

```python
>>> 7//3
2
```
剰余

```python
>>> 7%3
1
```

括弧あり計算

```python
>>> (2+3)*3
15
```
変数代入して計算もできる

```python
>>> a=2
>>> b=3
>>> a*b
6
>>> a+b
5
```

計算式でintとfloatが混ざっていてもOK

```python
>>> 1.25*4+2
7.0
```
最後の出力は変数_に入っている

```python
>>> 2+_
9.0
```
平方根

```python
>>> import math
>>> math.sqrt(_)
3.0
```
モジュールのインポートを書き方変えるとこうなる

```python
>>> from math import sqrt
>>> sqrt(_)
1.7320508075688772
```






#　おわり
リモートマシン上でのtabキー補完を強化する

リモートマシン（スーパーコンピュータなど）のデータをscpやrsyncコマンドで持ってきたい...
でもディレクトリ名が正確にわからんのだけど…
って人向けの記事。

# `bash-completion-extras` を導入しよう！
`bash-completion`がローカルでのtabキー補完を担っていて、
`bash-completion-extras`をインストールすることで補完が強化される。

## 環境
- CentOS Linux release 7.5.1804 (Core)
- GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

## インストール方法
```bash
$ sudo yum install -y bash-completion-extras
```
これだけ。

#### - もし、以下のようなエラーが出たら

```
No package bash-completion-extras available.
Error: Nothing to do
```

epelリポジトリが登録されてないことが多いので、

```
$ sudo yum install epel-release
```

とした後に最初のコマンドを叩くだけ。

## 実行結果

```bash
$ ssh
123.4.5.678    876.5.4.321    hosaname1    hostname2
```

以上のようにtabを押した時の補完が優秀になる。（ipアドレスやホスト名までわかる）
ただし、はじめのリモートマシンでの補完を有効にするにはsshでパスフリーになっている必要がある。
それについては以下を参照してほしい。

 - [パスワードなしでssh接続できるようにする方法](https://qiita.com/shuntaro_tamura/items/048a1d9521bf7579892b)
 - [sshの設定（passwordなしでsshログイン（scp）する)](https://qiita.com/hnishi/items/5dec4c7fca9b5121430f)

##参考
- [bash-completionでserviceコマンドなどの補完を強化しよう ](https://heartbeats.jp/hbblog/2013/06/bash-completion.html)
エンジニアの未来は明るい

# きっかけ
@shibukawa さんの [オブジェクト指向と20年戦ってわかったこと](https://qiita.com/shibukawa/items/2698b980933367ad93b4) を拝読した際に気づいた事です。

> ビジネスの根幹をITで動かしていく時代が来たら、ドメインエキスパートは利用者ではなくて、その会社のシステム部門の中にしかない、という時代が来たよ、という話を聞きました。システムを作ってしまったら、細部まで把握している人はコードを書いた人しかいなくなりますよね。

腑に落ちたのと同時に「エンジニアの未来は明るい」と思いました。

# How engineers win over others in business?
理論で組み立てていく姿勢と、その理論を確認して理解できる知能が、曖昧で漠然としたセンスを凌駕する時代が来ます。

現在のソフトウェアエンジニアにとって恐らくは最大級の悩みであり、同時に腕の見せ所でもあるのは曖昧で漠然としていて頻繁に矛盾している利用者側の要求を上手く抽出し、整合性を保ちながら破綻しないようにシステムに落とし込む部分だと思います。

それは昔からあった業務のひとつかもしれませんが、機械は空気読んでくれない、指示した通りにしか動かず、意図しない結果が出た時は指示が間違っていたのだと受け止めざるを得ないが故に、コンピューターの発明以後に急激に進展している分野なはずです。[^0]

この要求の把握がある程度上手くできるようになると、次第に利用者側よりもエンジニア側のほうがビジネスに対してより正確で効果的なアプローチを発見しやすくなると思うのです。

即ち、将来的にはビジネスで勝てるのはエンジニア集団だけになり、エンジニアリングを否定して個人のセンスだけに頼る集団を凌駕するようになるはずです。

ビジネスで勝ちたいなら、まずは自身がエンジニアになる事。それがどうしてもできないなら、最上のエンジニア集団を確保してご機嫌をとりながら味方でいてもらい続ける事、それがビジネスの基本的な常識になる時代が必ずくるのです。

あまりにもビジネス側が無能で、見合う待遇がなされていないと感じるなら、エンジニアはいつでも自分でビジネスを興せばいいし、そこに勝機はあるのです。[^1]


# だからプログラミング教育
故に、ソフトウェアエンジニアリングの基礎であるプログラミング教育が義務教育に組み込まれる事は当然に理に適っています。
同時に、されど日本国の義務教育だと思ってしまうのは、極めて個人的にですが義務教育に対しては苦い経験の比重が圧倒的に勝っているからでしょうか。[^2]

プログラミングはとても面白いし、その先にあるエンジニアリングはもっと面白く、極めて機械的になるところから始まったはずなのに、何故かどんどんと人間という泥臭い存在の面白さを気づかせてくれてリスペクトできるようになる所に繋がっていきます。

それを個人の興味や関心、その学習曲線を無視して、義務だからやらなくちゃいけない、落ちこぼれた場合どころか抜きんでた場合ですらも周囲に歩調を合わせる事を強要されるつまらない物にしてしまわないように、現場の先生方や教育委員会的な組織が頑張ってくれると信じたいですね。
先生方、宜しくお願いしますよ!!

[^0]: 対人間の場合に、この点で甘えてしまっている人が多いと感じませんか？

[^1]: 同時に、想定もしていなかったような泥臭くて人間臭い業務をやってくれている人がいる事をリスペクトするいい機会になるかもしれません。

[^2]: 「だから海外の教育は素晴らしい」には残念ながらなりません。日本より素晴らしい所があるのと同時に日本にはない彼らだけの奥深い問題が同時に存在しているでしょう。良い部分を取り入れる事ができないか検討する姿勢は大事だと思いますが、心酔して盲信するのは中二病患者の症状の一つだと思います。
Railsでグラフ描画Chartkickを使用する方法(Cloud9)

##Chartkickの使用手順

#### 1 gemfileを追加

~~~
gem "chartkick"
gem 'chartable'
~~~
この２つを追加後

~~~
bundle install
~~~

#### 2 Javascriptライブラリを読み込む

bundle installしたら次はJavaScriptライブラリを読み込まなければなりません。

`application.js`にこの２つを記述

~~~
//= require Chart.bundle
//= require chartkick
~~~



####3 グラフ描画データを準備する


`charts_conroller`

~~~
def index
 配列の場合
  @chart = [['2018-10-1', 10], ['2018-10-02', 20]]
 ハッシュの場合
  @chart = {"2018'-10-1" => 10, "2018-10-02" => 20}
end
~~~


####4 ビューに表示させる

`charts/index.html.erb`

~~~
<%= pie_chart @chart %>
~~~

出来上がりはこんな感じです。
<img width="401" alt="スクリーンショット 2018-10-10 16.35.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/285652/da8910df-19cb-5fbc-7544-51730fa461c4.png">


今回は円グラフ（pie_chart）でしたが、他にもグラフの種類があります。
公式ホームページで参照ください。
[公式ホームページ](https://chartkick.com/)
以上です。
Pythonの環境を0から整える(mac)(2018/10)

Pythonの環境構築系統の記事は星の数ほどありますが、バージョンはどんどん新しくなりますし、その意味で記事を残すことに意味はあるのかなと。言うことで始めます。

# 短期的にちょっとPython触りたい人向け
Anacondaをインストールします。spyderを立ち上げます。するとコードが書けます。
https://www.anaconda.com/
anacondaはインストーラーがあるので、それを使えば特に難しいこともなくできると思います。
spyderのコンソールですぐに実行もできるので楽ちん。

# 他の環境もあったり、そこそこ長くプログラムを書くつもりの人。
homebrewとvenv(python標準)で管理するのが良いと思われます。理由は以下

+ Anacondaは環境を荒らす(アンインストールが結構面倒臭い、Pathにも追記されます)
+ venvはPython標準に組み込まれているので、(多分)外部の環境分離ツールよりもサポートされる
+ venvがあるとパッケージとかバカスカ足しても、リセット再構築が楽。

人によってはvenvすらいらないと言うかもしれませんが、なんかvenvなしだとpip周りのアップデートなどで失敗したので(pythonが切り替わってない？でもPath通すのも面倒…)venv入れちゃってもいいかなぁと思ってます。

## homebrewのインストール

まずはXcodeをダウンロードします。
そしたらターミナルで以下のコマンドを試してみましょう。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
(from homebrew公式サイトhttps://brew.sh/index_ja.html)

もしもこれでだめだった場合は
Xcodeコマンドラインツールをダウンロードします。

```
xcode-select --install
```
を叩くか、

http://docwiki.embarcadero.com/RADStudio/Berlin/ja/Mac_%E3%81%A7%E3%81%AE_Xcode_%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89_%E3%83%A9%E3%82%A4%E3%83%B3_%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
こちらに書かれてる手順の通り進めれば良いです。コマンドラインツールがダウンロードできたら、再びhomebrewのインストールコマンドを叩きましょう。

## python3のインストール

```
brew install python3
```
と叩けばおしまいです。

## Pycharmのダウンロード(任意)
個人的にはやはりこれが一番使いやすいので。
https://www.jetbrains.com/pycharm/
こちらからダウンロードできます。community editionなら無償で使えます。

## venvの作成(任意だけど推奨？)
Pycharmをダウンロードした方は、PycharmProjectsフォルダにvenｖを作ると楽です。
その場合は、

```
cd PycharmProjects
python3 -m venv venv
```
とするとvenvが作れます。

```
source venv/bin/activate
```
と叩くと、仮想環境がアクティベートできて、この状態で

```
which python
```
とすると、venv内のpythonが呼び出されているのが確認できます。

## もろもろの細かいこと

venvを起動したら、pipくらいは何はともかくupgradeしておきましょう。

```
pip install --upgrade pip
```
と叩いておけばオッケーです。

一応ですが、もしパッケージを追加したい場合はpipコマンドをググってください(超初心者向けの説明)

あと、Pycharmを導入した方はPreferences→Project　Interpreterとたどって、Pycharmがvenvを使う設定になっているかを確認しておきましょう。もしなってなかった場合はaddから追加できます。


# おわりに
venvが標準で入ったり、homebrewのpythonでインストールできるのが2→3→2と変わったり時代の流れは早いので、この記事もすでに古いかもしれません。悪しからず。
【総評】MAC環境にAnsible導入後、AWSサービス構築までの道

総評
今回vagrant上にAnsibleを導入し、Ansible modules、aws-cli、shellなどを使用して、コマンド１つでWebサイトが見えるまでの環境作りをしました。
一部手動になってしまった部分はありますが、やったことを残してみたいと思います。

## 前提
最終テストは実際にAWSインスタンスを立ち上げた環境で実施しました。
ELB、EC2、RDSは事前に構築済みとします。
構築されているEC2にAnsibleをインストールして構築しています。

## Ansibleで実施していること
site.ymlのrolesを見ていただくと、何を構築かわかると思うのでsite.ymlをのせます。

```site.yml
- name: Startup project
  hosts: all
  user: root
  vars:
    now_date: "{{ lookup('pipe','date +%Y%m%d') }}"
  vars_files:
    - "vars_files/common.yml"
  roles:
    - role: S3
    - role: Lambda
    - role: ApiGateway
    - role: CloudFront
#    - role: Route53　# cloudfrontのドメインネームが上手くとれず断念…
    - role: App # Webサイト資源の配置を自動化
    - role: Db
    - role: Vhost # Apache vhostの設定＋再起動
    - role: CloudSearch
```

### ■Lambda、ApiGateway、CloudFront、Db
過去の投稿参考にしていただければと思います。

・[MAC環境にAnsible導入後、AWSサービス構築までの道〜③cloudfront_distributionモジュール〜](https://qiita.com/mura-no/items/5a49b6f9cb14d9df5c3e)
・[MAC環境にAnsible導入後、AWSサービス構築までの道〜④Lambdaモジュール〜](https://qiita.com/mura-no/items/25ed667c68032ce22020)
・[MAC環境にAnsible導入後、AWSサービス構築までの道〜⑤API Gateway〜](https://qiita.com/mura-no/items/836e24b8968be141ef8b)
・[MAC環境にAnsible導入後、AWSサービス構築までの道〜番外編：DB構築（MySQL）〜](https://qiita.com/mura-no/items/20962ff5f8eee5662c5d)

### ■App、Vhost
プロジェクトなどでバージョン管理やデプロイの方法などが違うと思いますので、こちらでは記載しません。
vhostはひな形ファイルをCopyし、特定箇所のみreplaceする形をとっています。

###■CloudSearch
過去の記事に上げたShell ScriptをAnsible上で実行しているだけになります。
Indexingを自動化しているだけですので、CloudSearchのドメインは事前に作成が必要です。

・[CloudSearchのIndexingをsh化する](https://qiita.com/mura-no/items/9748af1116c168715eb7)

###■S3
Ansible Documentation「aws_s3」閲覧いただければ、すぐに対応いただけると思います。

[Ansible Documentation：aws_s3](https://docs.ansible.com/ansible/latest/modules/aws_s3_module.html?highlight=aws_s3)

## 自動化できなかった点（残課題）
1. Route53

Cloudfrontのドメインネームが上手く取得できず設定できませんでした。
ディストリビューション情報を取得した際のレスポンスの順番がディストリビューションによって順番が異なっていたりしたため、上手くできなかったです。。。

## Webサイト閲覧までの流れ
上記site.ymlを実行することで一連のサービスが立ち上がり、Apacheの再起動も実施されているので、あとはRoute53にてDNSの設定をするだけになります。
ただし、Cloudfrontが構築中の場合、Enabledになるまで待っていただく必要があるかもしれません。

1. site.yml
2. Route53設定
3. ブラウザよりアクセス

## まとめ
自動化することで、今までサイト閲覧までにかかっていた時間が1/8ぐらいになりました。
まだ改善しなければならないところはありますが、一旦ほぼ自動化できたという点では良かったと思います。

また知らない技術を使っての自動化構築ということで非常に楽しかったです！
Ansibleのレスポンスの取り方がイマイチわかりずらかったです…

今後の課題として

* 今回の自動化スクリプトのアップデート（完全自動化）
* 汎用性の検討（対話式にして、どの案件でも使えるようにするなど）
* ステージング、本番環境への適用

を目指していきたいと思います。
TensorFlowSharp を VisualStudio2010 から使う

# はじめに
　仕事の話がきっかけですが、顔写真に対する証明写真としての適正具合を画像分類で判定できるんじゃないか？　という個人的興味がわいたため、適当にWebで顔写真を集めて VGG16 をベースに転移学習した Keras のお試しモデルを作りました。0.0 ～ 1.0 の不適切度を出力し、しきい値 0.5 で 93% くらいの精度でした。
　現場のサーバーが Windows Server なので、もしそこで動かすならということで「[C#で学習済みVGG16モデルを使ってアプリを作る方法](https://qiita.com/peace098beat/items/2ac273bc9dd1f900281e)」を参考に VisualStudio2017 と TensorFlowSharp を使って動くことを確認しましたが、ついでに現場の開発用IDEである VisualStudio2010 でもビルドできるようにしてみました。

# 作ったもの
　github に [TensorFlowSharpNet40](https://github.com/hokonin/TensorFlowSharpNet40) というレポジトリで公開しています。2018/10/10 時点では「net40/1.9.0」というブランチで TensorFlowSharp 1.9.0 版のみコミットしてあります。
　上記は [本家レポジトリ](https://github.com/migueldeicaza/TensorFlowSharp) の内、TensorFlowSharp フォルダだけ Fork した形にしてあるため存在しているファイルは本家コミットログも保持しています。むしろ部分Forkに苦戦して色々試しましたが結局「[gitを使って、レポジトリの一部抽出forkしてみました](https://www.slideshare.net/NEKOGET/code-igniter-talk-04)」の方法になりました。

# そもそもの話
　無理して VisualStudio2010 を使ったところで ValueTuple 4.4.0 に依存しているため実行には .NetFramework 4.6.1 以上のランタイムが必要と思われます（未確認）。
　また VisualStudio2017 を使って本家ソースコードを変更することなく VisualStudio2010 から参照設定可能な TensorFlowSharp.dll をビルドすることもできます。
　わざわざソースコードを変更してまで得られるメリットは VisualStudio2010 だけでビルドできる、という1点のみです。ビルドできてもタプル構文が使えないため使いづらいでしょうし、冒頭のモデルによる判定値出力は動きましたが、どこまでちゃんと動くかは不透明です。

# おわりに
　修正自体は大した作業ではないので TensorFlowSharp 1.11.0 くらいまでは対応版をコミットしておきたいところですが、私自身も含めて誰かの役に立ちそうにありませんのでやる気が出るかは分かりません。
Bash に住む妖怪 〜 空配列

# 結論

Bash に空の配列は無い。空の配列を値に持つと変数は unset される。unset された変数を空の配列として扱いたいなら `set -u` をしないか、`set -u` するなら `"${array[@]+"${array[@]}"}"` という表現を使う。

（この記事で使っている Bash は 4.3.48 である。Ubuntu 16.04 で実行。）

# 空の配列

Bash には配列が用意されていて、以下のように使う。

```bash
words=(foo bar baz)
for w in "${words[@]}"; do
    echo "( $w )"
done
```

これを実行すると以下のようになる。

```shell-session
( foo )
( bar )
( baz )
```

これは当然、配列が空の場合も動作すると期待するだろうし、実際動作しているように見える。

```bash
words=()
for w in "${words[@]}"; do
    echo "( $w )"
done
```

↓

```shell-session
```

しかしシェルスクリプトを書くときに常用する `set -u` (代入していない変数を使うとエラーで停止）を使うと...

```bash
set -u
words=()
for w in "${words[@]}"; do
    echo "( $w )"
done
```

↓

```shell-session
bash: line 3: words[@]: unbound variable
```

`declare` を使って明示的に配列と宣言しても駄目。

```bash
set -u
declare -a words=()
for w in "${words[@]}"; do
    echo "( $w )"
done
```

↓

```shell-session
bash: line 3: words[@]: unbound variable
```

# 仕様をチェック

そこで、man bash (1) をチェックしてみよう。空の配列のはっきりした説明は出てこないが、以下のような記述がある。

> An array variable is considered set if a subscript has been assigned a value.  The null string is a valid value.

要素を持たない配列変数は unset のようだ（はっきりと書いているわけではないが）。

実際、明示的に要素を削除して空配列にすると unset になるのが観測できる。

```bash
set -u
words=(foo)
unset words[0]
echo $words
```

↓

```shell-session
bash: line 4: words: unbound variable
```

# 対処法

配列が空のとき `${words[@]}` という表現が、`words` が unset なのでエラーになる。よって set のときのみ `${words[@]}` が評価されるようにすればいい。こういうとき Bash では `${var+var}` という表現を使う。

```bash
set -u
words=()
for w in "${words[@]+"${words[@]}"}"; do
    echo "( $w )"
done
```

↓

```shell-session
```

配列の要素数を数える表現はそのまま使える。

```bash
set -u
words=()
echo ${#words[@]}
```

↓

```shell-session
0
```

# 後記

そのまんまの質問が Stackoverflow にあった : [Bash empty array expansion with `set -u` - Stack Overflow](https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u)

この記事によると Bash 4.4 では `${words[@]}` が unset のときにエラーにならずに空配列として扱えるようだ。ただし man の記述はそのままらしいので、Bash のバグか man のバグかは不明の由。
abc 091

B
高橋君は青いカードを N 枚，赤いカードを M 枚持っています。 カードにはそれぞれ文字列が書かれており， i 枚目の青いカードに書かれている文字列は si， i 枚目の赤いカードに書かれている文字列は ti です。
高橋君は，文字列を 1 つ言います。 そして，全てのカードを確認し， その文字列が書かれた青いカードを 1 枚見つけるごとに 1 円貰えます。 また，その文字列が書かれた赤いカードを 1 枚見つけるごとに 1 円失います。
なお，高橋君の言った文字列と，カードに書かれた文字列が完全に一致していた場合のみを考えます。 例えば，高橋君が atcoder と言った場合，atcoderr，atcode，btcoder などと書かれた青いカードがあってもお金は貰えません(逆に，このような文字列が書かれた赤いカードがあってもお金を失うことはありません)。
高橋君は，最大で差し引き何円貰うことができるでしょうか？
ただし，違うカードに同じ文字列が書かれていることもあることに注意してください。

```
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
	int N, M;
	string s[101], t[101];
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> s[i];
	}
	cin >> M;
	for (int i = 0; i < M; ++i) {
		cin >> t[i];
	}
	int ans = 0; int Ans = 0;
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			if (s[i] == s[j]) {
				ans++;
			}
		}
		for (int j = 0; j < M; ++j) {
			if (s[i] == t[j]) {
				ans--;
			}
		}
		Ans = max(Ans, ans);
		ans = 0;
	}
	if (Ans > 0)
		cout << Ans;
	else
		cout << 0;
	return 0;
}
```

C
二次元平面に，赤い点と青い点が N 個ずつあります。 i 個目の赤い点の座標は (ai,bi) で，i 個目の青い点の座標は (ci,di) です。
赤い点と青い点は，赤い点の x 座標が青い点の x 座標より小さく， また赤い点の y 座標も青い点の y 座標より小さいとき，仲良しペアになれます。
あなたは最大で何個の仲良しペアを作ることができますか？ ただし，1 つの点が複数のペアに所属することはできません。
制約
入力は全て整数
1≤N≤100
0≤ai,bi,ci,di<2N
a1,a2,…,aN,c1,c2,…,cN はすべて異なる
b1,b2,…,bN,d1,d2,…,dN はすべて異なる




```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int N;
	cin >> N;
	vector<pii>s(N), l(N);
	for (int i = 0; i < N; ++i) {
		int a, b;
		cin >> a >> b;
		s[i] = make_pair(b, a);
	}
	for (int i = 0; i < N; ++i) {
		int c, d;
		cin >> c >> d;
		l[i] = make_pair(c, d);
	}
	for (int i = 0; i < N; ++i) {
		sort(l.begin(), l.end());
	}
	int ans = 0;
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < l.size(); ++j) {
			sort(s.begin(), s.end(), greater<pii>());
		}
		for (int j = 0; j < s.size(); ++j) {
			if (s[j].second < l[i].first && s[j].first < l[i].second) {
				ans++;
				s.erase(s.begin() + j);
				break;
			}
		}
	}
	cout << ans << endl;
	return 0;
}
```
fishでファイル名の拡張子を置き換える

##bash
bashの場合は変数展開で簡単に置き換えられる。

```
function extention () {
  echo ${1%.*}.after
}
```

##fish
fishの場合、変数展開が使えないのでどうしようかと考えた結果、string replaceで文字列を置換することにした。

```
function extention
  echo (string replace -ra '(.*)\\.(.*)' '$1.after' $argv[1])
end
```

##でもfishで関数はやめたほうがいいかも
fishでスクリプトを描こうとすると以下の点が引っかかる。
・ググって出てきた便利なシェルスクリプトはだいたいbashで、fishへの書き換えに文法を調べる時間がかかる
・自作のfishスクリプトを他人に展開しようとすると、まず相手はfishを使っていないのでbashへの書き換えが必要になる
・プロジェクトで使うようなスクリプトはまずbashだと思われるので、普段からfishで書いているとbashに不慣れになる

関数はやめて実行ファイルにして、一つのディレクトリにまとめてからパスを通す方向にしよう。
abc 090

B
A 以上 B 以下の整数のうち、回文数となるものの個数を求めてください。 ただし、回文数とは、先頭に 0 をつけない 10 進表記を文字列として見たとき、前から読んでも後ろから読んでも同じ文字列となるような正の整数のことを指します。

```
#include<iostream>
using namespace std;
int main() {
	int A, B;
	cin >> A >> B;
	int sum = 0;
	for (int i = A; i <= B; ++i) {
		int s = i % 10;
		int t = i / 10 % 10;
		int r = i / 10 / 10 / 10 % 10;
		int u = i / 10 / 10 / 10 / 10 % 10;
		if (s == u && t == r)
			sum++;
	}
	cout << sum;
	return 0;
}
```
こういうのは余りで処理やな

C
縦横に無限に広がるマス目があり、そのうちの連続する N 行 M 列の領域のすべてのマスに表裏の区別できるカードが置かれています。 最初はすべてのカードが表を向いています。
以下の操作を、カードが置かれている全てのマスについて 1 度ずつ行います。
そのマスと辺または点で接する 8 つのマスと、そのマスの合計 9 マスについて、カードが存在するなら裏返す。
すべての操作を行った後の各カードの状態は操作を行う順番に依らないことが証明できます。 すべての操作を行った後、裏を向いているカードの枚数を求めてください。
制約
1≤N,M≤109
入力は全て整数である

```
#include <iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
using ll = long long;
#define INF 1e9
int main() {
	ll N, M;
	cin >> N >> M;
	if (N ==1&&M == 1)
		cout << 1 << endl;
	else if (N == 1 && M != 1)
		cout << M - 2 << endl;
	else if (N != 1 && M == 1)
		cout << N - 2 << endl;
	else
		cout << (N-2)*(M-2) << endl;
	return 0;
}
```
Windows10 October 2018 Update(1809)後にEdgeやストアアプリが「0x80072efd」エラーで起動しない場合の対処法

Windows10 October 2018 Update(1809)後にEdgeやストアアプリが「0x80072efd」エラーを吐いて起動しない場合の対処方法。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/67623/e261f33d-ed8e-8913-c9f0-5e7b25566850.png)

**[対処方法]**
イーサーネットアダプタのプロパティのIPv6を有効にする。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/67623/9e388542-f3da-ed6e-c65e-286fa1a837d6.png)


(October 2018 Update後はストアアプリを開くためにIPv6ループバックが必須になったのかも?)
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/67623/dc3a5212-89b5-80b4-d7ad-d75c15eb0e03.png)
MAC環境にAnsible導入後、AWSサービス構築までの道〜番外編：DB構築（MySQL）〜

番外編
Ansibleで新規データベース作成、新規ユーザー作成、データインポートを行う

## やりたいこと
2. 新規DB作成
3. 新規ユーザー作成
1. 既存DBよりデータdump
4. 新規DBへデータインポート

## 事前準備
AnsibleよりMySQLを実行する際にMySQL-pythonが必要となる。
私の環境ではMySQL-python26では上手く動かず、MySQL-python27をインストールすることで動くようになりましたので、バージョンを指定しています。

MySQL-python26の際に出たエラー内容は「MySQL-pythonがない」というエラーでした。
MySQL-pythonがインストールされているにも関わらず、エラーになる場合はバージョンを変更して試してみるといいかもしれません。

```
sudo yum install MySQL-python27.x86_64
```

## create_database.yml作成
変数化できる部分はvars_filesにまとめています。

```create_database.yml
# MySQL関連のモジュールを利用する際のログインユーザー情報ファイルの作成
- name: Create .my.cnf
  template:
    src: templates/my.cnf.j2
    dest: /root/.my.cnf
    owner: root
    group: root
    mode: 0600

# 新規データベース作成
- name: Create Database
  mysql_db:
    login_host: "{{ db_host }}"
    login_user: "{{ db_root_user }}"
    login_password: "{{ db_root_pass }}"
    name: "{{ prefix }}_{{ project_name }}"
    encoding: utf8
    state: present

# 新規ユーザー作成
- name: Create User
  mysql_user:
    login_host: "{{ db_host }}"
    login_user: "{{ db_root_user }}"
    login_password: "{{ db_root_pass }}"
    host: '%'
    name: "{{ db_user }}"
    password: "{{ db_pass }}"	
    append_privs: yes
    priv: "{{ prefix }}_{{ project_name }}.*:ALL,GRANT"
    state: present

# 既存DBよりデータdump
# 既存DBからdumpするため、新規DBとは別hostを指定する
- name: Create Dump
  mysql_db:
    login_host: "{{ db_dump_host }}"
    login_user: "{{ db_dump_user }}"
    login_password: "{{ db_dump_pass }}"
    name: "{{ db_dump_name }}"
    target: /tmp/{{ db_dump_name }}_{{ now_date }}.sql
    encoding: utf8
    single_transaction: yes
    state: dump

# 新規DBへデータインポート
- name: Import Date
  mysql_db:
    login_host: "{{ db_host }}"
    login_user: "{{ db_user }}"
    login_password: "{{ db_pass }}"
    name: "{{ prefix }}_{{ project_name }}"
    target: /tmp/{{ db_dump_name }}_{{ now_date }}.sql
    encoding: utf8
    state: import
```


## 実行
以下コマンドにて実行。
「-vvv」をつけることで、詳細な実行ログが出力されます。
エラーが出ている際など、非常に助かるので常にオプション付与して実行しています！

```
ansible-playbook -vvv -i localhost, -c local create_database.yml
```
## 確認
新規データベースに作成したユーザーでアクセスできること。
インポートしたデータが確認できること。


## 感想
コマンドラインとあまり変わらない感じですが、自動化することで作業時間の短縮には繋がりました。
growisofsを使用したDVD-R(BD-R)への書き込み(オプション、補足追記)

## はじめに  

- ここでは、Linux環境(CentOS)での、DVD-RやBD-Rへの書き込み方法についてまとめています。
- 一般的なISOファイル形式のデータの書き込みではなく、通常データ(例：～.tar.gz、～.zipなど)をそのままDVD-RやBD-Rへ書き込む方法について書いています。

## 実行環境  
- CentoOS 7.4  

## 書き込み手順

１．書き込みツールのインストール

```
yum install dvd+rw-tools
```
２．**通常ファイル**をデータとして書き込む
※ISOファイルを焼く場合はコマンドが違うので注意すること

主要なオプションは以下の通り。

- -dvd-compat：DVD-RW, DVD+RW等の互換性のために指定(BDも同様)
- -speed=N：N倍速で書き込む
- -Z：指定したデバイスに最初のセッションを書き込む
- DEVICE：dev/cdromや/dev/sr0などのドライブを指定
- FILE：書き込むディレクトリやファイルを指定

```
growisofs -dvd-compat -Z  [DEVICE]  [FILE]
```
## 補足  
growisofsでの書き込むデータサイズの上限は**4GB**に制限されているが、以下のオプションをつけることで回避可能

```
-allow-limited-size
```
PHP 変数について調べてみた

# 前提（学んであること）
- 数ヶ月ほどJavaを学んだ
- CSS、JavaScriptも少し学習した
- Pythonはほんの少し触れた程度
- PHPは触れたことないです

# 調べたこと
以下の内容は**[PHPマニュアル](http://php.net/manual/ja/language.variables.scope.php)**より引用してます。

- まずPHPファイルは **<?PHP** で始まり **?>** で終わる
- 原則、1変数に1スコープ

~~~PHP:PHPファイル
<?php
$a = 1;
include 'b.inc'; /*includeやrequireにより読みこまれたファイルでも$aが使える。*/
?>

変数$aはインクルードされた b.inc スクリプトの中でも利用可能
~~~
---
- グローバル、ローカルといったスコープの範囲がある

~~~php:スコープ範囲
<?php
$a = 1; /* グローバルスコープ */ 

function test()
{ 
    echo $a; /* ローカルスコープ変数の参照 */ 
} 

test();
?>
~~~

↑でtest()を実行しても何も表示されない。
(あくまでも、異なるスコープだから。)

---
・メソッド内でグローバルスコープ変数を使うならglobalキーワードを使う

~~~php:globalキーワード
<?php
$a = 1;
$b = 2;

function Sum() 
{
    global $a, $b;
    $b = $a + $b;
} 

Sum();
echo $b;  /*$b=3*/
?>
~~~
↑自分の理解：定義されてるグローバルスコープを使うための合言葉？



・globalキーワードの代わりに$GLOBALSも使える

~~~php:$GLOBALS
<?php
$a = 1;
$b = 2;

function Sum() 
{
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
} 

Sum();
echo $b;
?>
~~~
`$GLOBALS`はスーパーグローバルというらしい。なにそれ。。。


>$GLOBALS
(PHP 4, PHP 5, PHP 7)

>$GLOBALS — グローバルスコープで使用可能なすべての変数への参照

>>説明
スクリプトのグローバルスコープに現在定義されているすべての変数への参照を含む連想配列です。 変数名が配列のキーとなります。

~~~php:スーパーグローバル使用例
<?php
function test() {
    $foo = "local variable";

    echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
    echo '$foo in current scope: ' . $foo . "\n";
}

$foo = "Example content";
test();
?>

出力結果
$foo in global scope: Example content
$foo in current scope: local variable
~~~
つまりはグローバル変数 `$foo`に代入すると、メソッド内とか関係なく全ての `$GLOBALS["foo"]`に
値が代入される？
(Javaだとprivateついてるとsetter必須だから、簡単に代入できちゃうと怖い気が、、、)

・スーパーグローバルはglobal宣言いらない、それ以外はglobal宣言必要

~~~php:スーパーグローバルとグローバル
<?php
function test_global()
{
    // ほとんどの定義済み変数は"スーパー"ではなく、関数内の
    // ローカルスコープで有効とするには'global'をコールする必要があります。
    global $HTTP_POST_VARS;
    
    echo $HTTP_POST_VARS['name'];
    
    // スーパーグローバルはどのスコープでも有効であり
    // 'global'をコールする必要がありません。
    // スーパーグローバルはPHP4.1.0以降で利用できます。
    // HTTP_POST_VARS は今や非推奨とされています。
    echo $_POST['name'];
}
?>
~~~
---
・静的変数(static)
>静的変数はローカル関数スコープのみに 存在しますが、プログラム実行がこのスコープの外で行われるようになっ てもその値を失わないません。

~~~php:static変数
<?php
function test()
{
    static $a = 0;
    echo $a;
    $a++;
}
?>
~~~
↑staticがないと、test()が呼び出されるたびに`$a=0`で初期化される。
staticがあると、test()が呼び出されれば`$a++`で`$a`の値が増えていく。


・再帰的な関数

~~~php:再帰的関数
<?php
function test()
{
    static $count = 0;

    $count++;
    echo $count;
    if ($count < 10) {
        test();
    }
    $count--;
}  /*$countは1,2,3,...,9,10と増えていく*/
?>
~~~
↑こちらもstaticがないと、毎回`$count=0`で初期化される。

ちなみに、、、**static変数宣言のしかたに注意！**

~~~php:static変数の宣言
<?php
function foo(){
    static $int = 0;          // 正しい
    static $int = 1+2;        // 正しい（ただし、PHP 5.6 以降に限ります）
    static $int = sqrt(121);  // 間違い（関数を使っています）

    $int++;
    echo $int;
}
?>
~~~

# まとめ
変数について調べたけど、意外とすんなり理解した。
ただ、スコープの範囲を常に意識しないと混乱しそう。
PHP使うかはわかんないけど。。。

今後も自分なりにまとめて書いていこう。