OmniAICreator/Qiita-1.07M huggingface dataset:
macOS Big Sur で pyenv Python インストールできない場合

## こんなふうになってしまう場合

```
% pyenv install 3.8.3

・・・・
configure: error: C compiler cannot create executables
```

## Xcode 12のインストール

2020/12 追記
`＊App Storeからインストールできる最新バージョンで構いません。`

それでもうまく行かない場合のみ、下記のベータ版でお試しください。

https://developer.apple.com/download/more/

- Xcode 12 beta x
- Command Line Tools for Xcode 12 beta x

この２つをダウンロードしてインストール

Xcode → Preference から コマンドラインツールで使うXcodeを 12 beta xにしておく

## zlib インストール
```
% brew install zlib 
% export LDFLAGS="-L/usr/local/opt/zlib/lib" 
% export CPPFLAGS="-I/usr/local/opt/zlib/include" 
```

## python インストール
```
% CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.8.0 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.0.tar.xz...
-> https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz
Installing Python-3.8.0...
patching file Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst
patching file configure
Hunk #1 succeeded at 3394 (offset -32 lines).
patching file configure.ac
Hunk #1 succeeded at 498 (offset -12 lines).
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.8.0 to /Users/[USER]/.pyenv/versions/3.8.0
```

```
% CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.8.3 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.3.tar.xz...
-> https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tar.xz
Installing Python-3.8.3...
patching file Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst
patching file configure
Hunk #1 succeeded at 3398 (offset -28 lines).
patching file configure.ac
Hunk #1 succeeded at 498 (offset -12 lines).
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.8.3 to /Users/[USER]/.pyenv/versions/3.8.3
```

## 確認
```
% pyenv versions
* system (set by /Users/[USER]/.pyenv/version)
  3.8.0
  3.8.3
```

## macOS Big Surをサポートした Python 3.9.1
macOS Big Surをサポートした Python 3.9.1 がリリースされました。
https://ledge.ai/python-3-9-1/

最初からこちらをインストールするのがいいかもしれません。

```
% git clone git://github.com/yyuu/pyenv.git ~/.pyenv
% CPPFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(brew --prefix zlib)/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.9.1
```
〔JavaScript〕未来の自分が読みやすいコードにするために出来る事

#はじめに
私はJavaScriptを勉強し始めて3ヶ月経ちました。
難しい問題も解けるようになり始めましたが、深いネストが多く見直した時に何をしているのかわからないコードを書いてしまいます。
深いネストの解消の仕方調べても難しそうな関数がたくさんで今すぐに改善するのは大変そう、、、、と思ってしまいました。
今回は、読みやすいコードにするためにする方法をたくさん調べ、<font color="OrangeRed">**今からでも意識して変えられる方法**</font>をまとめて書きたいと思います。

#マジックナンバーには名前をつける
<font color="OrangeRed">**ハードコーディングされている謎の数字**</font>のことをマジックナンバーと言います。

```javascript

// この「50」は何？
const pages = Math.ceil(records.length / 50);
```
マジックナンバーは混乱させる原因になります。できるだけ値には名前をつけるようにしましょう。

```javascript

const maxPage = 50;
const pages = Math.ceil(records.length / maxPage);
```
とすることで最大のページ数が50であることがわかります。

もちろん名前をつけなくてもいい数字もあります。
例えば角度をラジアンに変換するとき、「180」に名前をつける必要はないと思います。

```javascript

const radian = degree * Math.PI / 180;
```
#識別子を短くしない
**識別子（関数名、変数名など）**をむやみに短くしないというのも大事です。名前が省略されていると、本来の名前を推測する必要が出てきます。そうすると無駄な時間がかかりますし、<font color="OrangeRed">**最悪の場合は全く違う理解**</font>をしてしまうことがあります。
私の場合、関数の意味あっているものをつけるだけではなく、似たような意味を持つ関数の時に違いがわからないような名前をつけてしまうので気をつけたいです。
##否定形は、ほどほどに
名前に否定形はあまり入れないほうがいいです。
何か処理するのは表示するとき？しないとき？と混乱します。

#####関数名のおすすめサイト
[プログラミングでよく使う英単語のまとめ【随時更新】](https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923 'プログラミングでよく使う英単語のまとめ【随時更新】')

#目的を名前にする
こちらも名前関連で、うっかりすると、関数名で「手段」を名前につけてしまうことがあります。
後から手段が変わったときに実態と異なる名前になってしまい、バグのもとです。
<font color="OrangeRed">**名前には「目的」をつけましょう。**</font>


#コメントを書く
どうわかりやすくすればいいかわからなくなった時は私はだいたいコメント書いてしまいます。
初歩的な事柄であるわりに効果が大きいのがコメントです。コメントは、コードを読む人が意味を理解するための**大きな助け**になります。

#深いネストの解消
関数を使うネストの解消は私には難しく少し勉強しないと使えないかなと思ったので、すぐできそうな解消の仕方を紹介します。

```javascript
if(...){
    if(...){
        if(...){
            処理...
        }else{
            エラー処理①...
        }
    }else{
        エラー処理②...
    }
}else{
    エラー処理③...
}
```
if文が3つネストしています。
この場合はエラー処理をifで定義してネストを解消することができます。

```javascript

if(...){
    エラー処理③
    return or exception
}

if(...){
    エラー処理②
    return or exception
}

if(...){
    エラー処理①
    return or exception
}

  処理...

```
他にも改善できる書き方があります。

#####数珠つなぎの条件

```javascript

if($a == 1){
  if($b == 2){
    // 何らかの処理
  }
}
```
こうやって繋げていくのはやめて

```javascript

if($a == 1 && $b ==2){
  // なんらかの処理
}
```
こうできるといいと思います。


#最後に
紹介した他にもたくさん良くする方法はあります。
もっとこうすると良いんじゃないかっと思ったらコメントイダ抱けると嬉しいです。

#参考リンク
[他人に読んでもらうJavaScriptコードを書くために
](https://sbfl.net/blog/2018/03/24/readable-javascript-code/ '他人に読んでもらうJavaScriptコードを書くために
')[読みやすいコードを書くために](https://qiita.com/shimataro999/items/ef6cd838d56f1fe87015 '読みやすいコードを書くために')
[新人プログラマに知ってもらいたいメソッドを読みやすく維持するいくつかの原則](https://qiita.com/hirokidaichi/items/c9a76191216f3cc6c4b2 '新人プログラマに知ってもらいたいメソッドを読みやすく維持するいくつかの原則')
[【プログラミング】ネストの減らし方 〜可読性UPのシンプルな原則〜](https://yamapyblack.com/reduce-nest/ '【プログラミング】ネストの減らし方 〜可読性UPのシンプルな原則〜')
Laravelで好きなCSSフレームワークを使う

## 準備
- npmというパッケージマネージャでのインストールを行います。
- Laravel標準のBootstrapではなく、どうしてもMaterializeを使ってみたかったのでこれを導入します。
- Materialize以外でも、npmでインストールできればやり方は同じです。

  [Materialize](https://materializecss.com/)
![Materialize01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649853/137fba65-302e-2373-d29c-f59f18c1d8b3.png)


### 環境
- Laravel Framework 7.22.4
- Materialize 1.0.0

## 導入
### 1. Sassを使えるようにする
まずSassを使えるようにします。
シンプルでわかりやすかった記事のリンクを貼っておきます。
[LaravelにSCSSの導入方法](https://qiita.com/mk185/items/1508ac6172c73db7808b)

### 2.Materializeを導入
公式サイトの[Getting Started](https://materializecss.com/getting-started.html)にあるコマンドを入れてインストールします。

```:terminal
npm install materialize-css
```


### 3. Materializeを読み込むように設定

```resources/sass/app.scss
// Bootstrap
@import '~bootstrap/scss/bootstrap';
```
↑この部分を

```resources/sass/app.scss
// Materialize
@import '~materialize-src/sass/materialize.scss';
```
↑に変更します

ちなみにフルパスは`node_modules/materialize-src/sass/materialize.scss`です。


### 4. 変更を適用
```:terminal
npm run dev
```

念の為、コンパイル先を確認します。

```public/css/app.css
@import url(https://fonts.googleapis.com/css?family=Nunito);@charset "UTF-8";

.materialize-red {
  background-color: #e51c23 !important;
}

.materialize-red-text {
  color: #e51c23 !important;
}

.materialize-red.lighten-5 {
  background-color: #fdeaeb !important;
                 ~省略~
```

`materialize-red `などそれっぽいものが書かれているのでコンパイルされているようです。


###5.　完成
最後に、CSSを適用させたいビューテンプレートのheadタグ中に
`<link href="{{ asset('/css/app.css') }}" rel="stylesheet">`
を書いてあげれば完成です。

**`layouts/app.blade.php`に書いて全ページに適用させるのが良いと思います。**

## 番外編：導入される仕組み
ここまでで導入はできました。
導入された仕組みを書いてみたので時間があれば読んでみてください。


まず**プロジェクトフォルダ直下のwebpack.mix.jsを開きます。**

```webpack.mix.js
mix.js('resources/js/app.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css');
```
この`.sass('~')`の部分でwebpackが`resources/sass/app.scss`ファイルをコンパイルして`public/css/app.css`に出力してくれているようです。

そのため、コンパイル元の`resources/sass/app.scss`を見てみます。

```resources/sass/app.scss
// Fonts
@import url('https://fonts.googleapis.com/css?family=Nunito');

// Variables
@import 'variables';

// Bootstrap
@import '~bootstrap/scss/bootstrap';
```

ここでBootstrapを読み込んでいました。~の部分は`node_modules/`が省略されてます。

つまり**`resources/sass/app.scss`ファイルで読み込むパッケージを指定してコンパイルしている**という事でした。
【swift5】UIButtonでsetTitleした時のアニメーションを無効化する

swiftでUIButtonのsetTitleを変更すると、文字がフェードイン・フェードアウトをするようにじんわり表示されてきます。
特に何か設定したわけでもなく、デフォルトでアニメーションが有効化になっているみたいなので、UIButtonのsetTitleを変更し反映するところではアニメーションを停止するように設定します。
#対策
```swift
UIView.setAnimationsEnabled(false) //アニメーション無効化
button.setTitle("label", for: .normal) //buttonの文字変更
button.layoutIfNeeded() // buttonの変更箇所反映
UIView.setAnimationsEnabled(true) // アニメーション有効化
```
button.layoutIfNeeded()を宣言していないと、変更した箇所が反映されないので注意しましょう。
かなり力技で対応している感がありますね。
extentionを表記して対応することとかも可能のようなので、今後調べて書いてみたいと思います。
ChocolateyでFlutterの開発環境構築やってみる

#ChocolateyでFlutterの開発環境構築したときのメモ
[Chocolatey](https://chocolatey.org/)のインストールがまだの方はインストールしておいてください。
 
[Chocolateyを使った環境構築の時のメモ](https://qiita.com/konta220/items/95b40b4647a737cb51aa)などをご参考に。
　
##gitのインストール
powershellを管理者権限で開きます。（以降、すべてのchocoコマンドは管理者権限で開いたpowershellで行ってください。）
　

```:PowerShell(管理者)
choco install git
```

バージョンは２以上のものをインストール

##Flutterのインストール
 
今回は、Flutter1.17.5をインストールします。

```:PowerShell(管理者)
choco install -y flutter
```
 
dart-sdkが未インストールの場合は、一緒にインストールされます。
![2020-08-02 160856.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353211/36b2cf17-bf52-b3bc-aee4-df6bb51dbf18.jpeg)
できました。
　
##Flutterのパスを通す
windowsの検索窓に
```env```
と打ち込んで、でてきた
```環境変数を編集```
を選択。
![2020-08-02 161333.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353211/7170a0f0-28b6-835a-a92d-f1cd5c3f2bd8.jpeg)

Pathを選んで、
![2020-08-02 161723.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353211/e9ad3e09-d812-025d-085a-f1ebc87c6a44.jpeg)
新規ボタンを押すと青い入力欄が出るので、そこに

```:Path
C:\tools\flutter\bin
```
と入力してエンター。
　
##PowerShellを新たに立ち上げる（管理者権限ではない）
新しいPowerShellを立ち上げる。（管理者ではない普通の方）

```:PowerShell
flutter doctor
```
　
と打ち込んで、
　
![2020-08-02 163205.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353211/32f4b37c-4532-8997-ba18-1942b8c38239.jpeg)
　
が出てきたら、インストールもパスが通っています。
##AndroidStudioのインストール

```:powershell(管理者)
choco install -y androidstudio
```
![2020-08-02 163701.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353211/9d356375-fc1c-131b-7a71-a85aa8bde36b.jpeg)
 
あとはお好みにあわせてAndroidStudioをセットアップして完了です。
cc65におけるソフトウェア開発

この記事では、cc65を用いてソフトウェアを開発する際のトピックスをまとめるかもしれない。

# cc65について

MOS6502用のＣ言語コンパイラ`cl65.exe`、アセンブラ`ca65.exe`、リンカ`ld65.exe`、ライブラリアーカイバ`ar65.exe`等が付属したクロス開発環境であり、有志によりＯＳＳとして開発されている。

## ROMイメージを作成するまで

cc65では、Visual C++や、LSI-C86等の一般的な開発環境と同様に、Ｃ言語や、アセンブリ言語で記述されたソースコードは、一旦、オブジェクトと呼ばれる中間ファイル(*.o)が生成される。
このオブジェクトファイル(*.o)、及び様々なオブジェクトファイルがアーカイブされたライブラリファイル(*.lib)をリンクする事により、ROMイメージが生成される。

```
[*.s] ---> ca65.exe ---> [*.o] ──┐
                                 ├--→　cl65.exe ----> [ROM Image]
[*.c] ---> cl65.exe ---> [*.o] ──┤　　　　↑
                                 │     [*.cfg]
                       [*.lib] ──┘

[*.s] ---> ca65.exe ---> [*.o] ──┐
                                 ├--→　ar65.exe ----> [*.lib]
[*.c] ---> cl65.exe ---> [*.o] ──┘
```
PHPで世界のナベアツさんのネタを実装してテストを書く

元ネタ
[rubyで世界のナベアツさんのネタを実装してテストを書く \- Qiita](https://qiita.com/yoshinyan/items/7dbe38f4751b8019a8c5)

これを書いたあとPHPでも書きたくなりやってみました。
テストは書いてません。
実行したらrubyでやったものと同じように出力できたのでよしとします。

#### 仕様
最初に「これから面白いことつまりオモローなことをします」という
１から40まで数を数える
３がつく数字のときアホになる
３の倍数のときアホになる
5の倍数のとき犬になる(3と5の倍数なら犬になる)
最後に「オモロー」という

```php:omoro_class.php
<?php
class Omoro
{
  const TSUKAMI = "これから面白いことつまりオモローなことをします";
  const OCHI = "オモロー";
  const TSUJO_KAO_MOJI = "(　･`ω･´)";
  const AHO_KAO_MOJI = "ʅ( ՞ਊ՞)ʃ≡";
  const DOG_KAO_MOJI = "∪･ω･∪";

  // ネタ
  public function main($max_kazu = 40)
  {
    $this->speak(self::TSUKAMI);

    for ($figure = 1; $figure <= $max_kazu; $figure++) {
      sleep(1);
      $kao_moji = $this->verification($figure);
      $serif = $this->make_serif($figure, $kao_moji);
      $this->speak($serif);
    }

    $this->speak(self::OCHI);
  }

  // セリフを作る
  public function make_serif($figure, $kao_moji)
  {
    return $figure . $kao_moji;
  }

  // 判断する
  private function verification($figure)
  {
    if ($figure % 5 == 0) {
      return self::DOG_KAO_MOJI;
    }

    if ($figure % 3 == 0 || strpos($figure, '３') !== false) {
      return self::AHO_KAO_MOJI;
    }

    return self::TSUJO_KAO_MOJI;
  }

  // 話す
  private function speak($serif)
  {
    echo $serif . "\n";
  }
}

$omoro = new Omoro();
$omoro->main(40);
```

#### テスト
テストも少しだけ書いた。

```php:omoroTest.php
<?php

use PHPUnit\Framework\TestCase;

require('./omoro_class.php');

class omoroTest extends TestCase
{
  const TSUKAMI = "これから面白いことつまりオモローなことをします";
  const OCHI = "オモロー";
  const TSUJO_KAO_MOJI = "(　･`ω･´)";
  const AHO_KAO_MOJI = "ʅ( ՞ਊ՞)ʃ≡";
  const DOG_KAO_MOJI = "∪･ω･∪";

  public function testMakeSerif1()
  {
    $omoro = new Omoro();
    $serif = $omoro->make_serif(1, self::TSUJO_KAO_MOJI);

    $this->assertSame('1(　･`ω･´)', $serif);
  }

  public function testMakeSerif3()
  {
    $omoro = new Omoro();
    $serif = $omoro->make_serif(3, self::AHO_KAO_MOJI);

    $this->assertSame('3ʅ( ՞ਊ՞)ʃ≡', $serif);
  }

  public function testMakeSerifInu()
  {
    $omoro = new Omoro();
    $serif = $omoro->make_serif(5, self::DOG_KAO_MOJI);

    $this->assertSame('5∪･ω･∪', $serif);
  }

  public function testMakeSerif33()
  {
    $omoro = new Omoro();
    $serif = $omoro->make_serif(33, self::AHO_KAO_MOJI);

    $this->assertSame('33ʅ( ՞ਊ՞)ʃ≡', $serif);
  }
}
```
rails 本番環境のエラーをブラウザで表示する方法

##結論
下記を変更するだけで本番環境でもブラウザ上でエラーを表示することが可能である。

```
//config/enviroments/production.rb
config.consider_all_requests_local = false 変更前
config.consider_all_requests_local = true 変更後
```

## 注意点
本番環境の詳細なエラー内容がユーザに見えてしまうのはよくないので、
エラー原因が特定できれば元に戻すのが良いかと思います。


開発環境ではエラーが存在する場合、ブラウザ上で表示してくれる。
しかし、本番環境ではproduction.rbのログを見たり、unicornやnginxのエラーログを見るくらいしか知らなかった。
PHPのマジックメソッドについて調べてみた件

# マジックメソッドとは
PHPには様々な特殊機能をもった関数をもとから持っています。

`__`で始まる関数名を特殊関数と呼び、あらかじめ取りおいているようです。
なので、特殊な機能を持たない関数を`__`で始まる名前にしないほうがいいみたいです。

また、全てのマジックメソッドは`public`で宣言しないといけないようです。

コンストラクタ(`__construct()`)などもマジックメソッドです。

# マジックメソッドの一覧

| メソッド | 引数 | 戻り値| 内容 |
| --- | --- | --- | ------ |
| __construct() | 任意 | なし | インスタンス生成時 |
| __destruct() | なし| なし | インスタンスを破棄するとき |
| __call() | 任意 | 任意| アクセス不能メソッドをオブジェクトのコンテキストで実行したとき |
| __callStatic() | 任意 | 任意| アクセス不能メソッドを静的コンテキストで実行したとき |
| __get() | プロパティ名 | 任意|  アクセス不能(protected または private)または存在しないプロパティからデータを読み込むとき |
| __set() |プロパティ名と値  | なし | アクセス不能(protected または private)または存在しないプロパティへデータを書き込むとき |
| __isset() | プロパティ名| true/false|  isset() あるいは empty() をアクセス不能(protected または private)または存在しないプロパティに対して実行したとき |
| __unset() | プロパティ名| なし |  unset() をアクセス不能(protected または private)または存在しないプロパティに対して実行したとき |
| __sleep() | なし| 配列 | インスタンスに対してserialize()を実行したとき |
| __wakeup() | なし| なし | インスタンスに対してunserialize()を実行したとき |
| __toString() | なし| 文字列 | インスタンスを文字列に変換しなければならないとき |
| __invoke() | 任意 | 任意 | スクリプトがオブジェクトを関数としてコールしようとした |
| __set_state() | 配列| インスタンス | インスタンスに対してvar_export()を実行しようとしたとき |
| __clone() | なし| なし | cloneキーワードを使ってインスタンスのクローン生成を実行したとき |
| __debugInfo() | なし| 配列 | インスタンスに対してvar_dump()を実行したとき |

# 使い方(一部)
## __construct()
インスタンス生成時に実行される

```php
class hoge {
  private $name = "";
  
  public function __construct(string $name) {
    $this->name = $name;
  }
}
```

## __call()
アクセス不能メソッドをオブジェクトのコンテキストで実行したとき

```php
class hoge {  
  public function __call($name, $argments) {
    return $name($argments); //関数$nameに引数として$argmentsを渡して実行
  }
}
```

# 参考にさせていただいた記事など
- [PHPの「マジックメソッド」とは――「__set()」「__get()」「__invoke()」の使い方](https://www.atmarkit.co.jp/ait/articles/1804/05/news008.html)
- [PHP: マジックメソッド - Manual](https://www.php.net/manual/ja/language.oop5.magic.php)
- [PHPのマジックメソッド一覧と使い方まとめ](https://qiita.com/ichi_404/items/257b2c23aacef0b3cfdc)
mercurialをソースからビルドする

Mercurialをインストールしないといかんなぁという状況になった。

諸事情でroot使ったインストールしたくないのでソースからビルドすることを試みる。

OSはCentOS7

まずは、Mercurialのソースを探す。

https://www.mercurial-scm.org/wiki/Download#Source_packages

↓にあるらしい。

https://www.mercurial-scm.org/release/

私は`$HOME/local`にソース群をインストールするようにしているので下記のようにしてソースをダウンロード。

```
cd $HOME/local/src
wget https://www.mercurial-scm.org/release/mercurial-5.4.2.tar.gz
tar xvzf mercurial-5.4.2.tar.gz
```

`Makefile`とか用意されてるだろうから確認

docutilsが必要らしいがまだインストールしていなかったので入れておく

```
pip install docutils
```

環境変数上書きしてmakeしろって書いてあるようなのでそうする。

```
cd $HOME/local/src/mercurial-5.4.2
make PREFIX=$HOME/local install
```
複数拠点での開発プロジェクト管理ー午後

応用情報技術者令和元年秋期 午後問9

ファイル：2019r01a_ap_pm_qs.pdf　午後問9
メモです。


１、開発要員の異動
私の考えは、モバイルアプリ（新規開発）は、若手社員複数名が不足と思ったが、
参考答えは、大阪チームの現行システムの開発経験者がないの点で、

東京チーム内でモバイルアプリ（新規開発）チームにベテラン社員数名を追加する
→
現行システムの開発経験者を東京チームから大阪チームへ異動させた


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/78f76766-ba2e-c5e8-47f3-d60b3a162156.png)


２、インタフェースを疎結合とする設計は、何を実現でき、どのような効果があるか
システムの独立性が実現でき、コミュー二ケーションエラーリスクを抑制できる
→
作業の独立性を高め、コミュニケーションエラーのリスクを軽減する。


３、なぜプロジェクト全体は東京チーム内の取り組みを適用するというと、
文書管理では、文書名称、格納方法、版管理の規則を定め、その実施を徹底しているから。

４、EVM計算
d: SPI=EV/PV = 360/400 = 0.90
e: CPI=EV/AC = 210/200 = 1.05

EVM指標値によると、
東京チーム：
SPIが0.90<1 ので、スケジュールが予定より遅れ
CPIが0.90<1 ので、コストは計画値を超過

大阪チーム：
SPIが1.00=1 ので、スケジュールが予定通り
CPIが1.05>1 ので、コストは計画値未満


**EVM**とは、プロジェクトマネジメントにおいて進捗状況の把握・管理を行う手法の一つ。作業の到達度を金銭などの価値に換算したEV（Earned Value：アーンドバリュー、出来高）という概念で把握する。

**EV** (Earned Value：出来高)
EVMで利用される指標の一つで、ある時点までに完了した工程の予算コストの合計のこと。

**PV** (Planned Value：計画価値)
積算した計画値

**AC** (Actual Cost：実コスト)
EVMで利用される指標の一つで、ある時点までに投入した実際のコストの合計のこと。

**コスト効率指数**（CPI：Cost Performance Index）= EV/AC

**スケジュール効率指数**（SPI：Schedule Performance Index）= EV/PV

**SV** (Schedule Variance：スケジュール差異)
EVMで利用される指標の一つで、ある時点で完了した作業の予算コストの合計（EV：Earned Value）と、計画時にその時点で完了していると予想されていた作業の予算コストの合計（PV：Planned Value）の差のこと

**CV** (Cost Variance：コスト差異)
EVMで利用される指標の一つで、ある時点までに投入した実際のコスト（AC：Actual Cost）と、完了した作業の予算コストの合計（EV：Earned Value）との差のこと


５、EAC計算
ECAは、完成時総コスト見積もり

計算方法は、BAC/CPI

BACは、完成時総予算です。

東京チームのBACは、4160＋250（業務要件追加費用）＝4410
CPIは、４月累計のCPIを使うので、CPI＝EV/AC=2100/2000=1.05

EAC=4410/1.05=4200万円

多分、式が覚えられないだろうね。。。


参考：
**BABOK**とは、Business Analysis Body of Knowledge（ビジネスアナリシスの知識体系）の略で、カナダのトロントにある国際非営利団体「IIBA（International Institute of Business Analysis、2003年に設立）」により制定され、すでにグローバルスタンダードとして確立されている知識体系だ。ビジネスアナリシスのベストプラクティスを体系化したもので、7つの知識エリア（後述）とそれを構成するタスクやテクニックからなる。


共通フレーム  【 SLCP-JCF 】  Software Life Cycle Process Japan Common Frame
共通フレームとは、情報処理推進機構（IPA）が発行しているソフトウェア取引に関するガイドラインで、ソフトウェアの構想・設計から開発、導入、運用、保守、破棄に到るまでの各工程について、個々の作業内容、用語の意味などの標準的なモデルを示したもの。

疎結合
読み方：そけつごう
【英】loose coupling
疎結合とは、細分化された個々のコンポーネント同士の結びつきが比較的緩やかで、独立性が強い状態のことである。

疎結合では、個々のコンポーネント同士は相互に連携しているが、相互に依存している余地が少ない。そのためコンポーネント間の連携をあまり顧慮せず、それぞれのコンポーネントを交換したり改良したりするような柔軟な対処を行うことができる。

疎結合に対して、このコンポーネントが密接に連携している状態は密結合と呼ばれている。密結合状態のシステムは、動作は高速であるが、一方のコンポーネントが異常をきたしてしまうと他方のコンポーネントもその影響を受けてしまう。

参考：
BABOK
https://www.sbbit.jp/article/cont1/22277

共通フレーム
http://e-words.jp/w/%E5%85%B1%E9%80%9A%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0.html

疎結合
https://www.sophia-it.com/content/%E7%96%8E%E7%B5%90%E5%90%88#:~:text=%E7%96%8E%E7%B5%90%E5%90%88%E3%81%A8%E3%81%AF%E3%80%81%E7%B4%B0%E5%88%86,%E3%81%A6%E3%81%84%E3%82%8B%E4%BD%99%E5%9C%B0%E3%81%8C%E5%B0%91%E3%81%AA%E3%81%84%E3%80%82

EVM
http://e-words.jp/w/EVM.html#:~:text=EVM%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88,%E3%81%A8%E3%81%84%E3%81%86%E6%A6%82%E5%BF%B5%E3%81%A7%E6%8A%8A%E6%8F%A1%E3%81%99%E3%82%8B%E3%80%82
ES6、ES５メモ

英語で書いた練習問題の自分用メモです。
ES5, ES6の場合ですと、以下の通り重要なポイントがあります。

``` javascript
// change everything below to the newer Javascript!

// let + const
let a = 'test';
const b = true;
const c = 789;
a = 'test2';


// Destructuring
// var person
const person = {
    firstName: "John",
    lastName: "Doe",
    age: 50,
    eyeColor: "blue"
};

const { firstName, lastName, age, eyeColor } = person;
// var firstName = person.firstName;
// var lastName = person.lastName;
// var age = person.age;
// var eyeColor = person.eyeColor;


// Object properties
// var a = 'test';
// var b = true;
// var c = 789;

// var okObj = {
//     a: a,
//     b: b,
//     c: c
// };
const a = "test";
const b = true;
const c = 789;

var okObj = {
    a, b, c
}



// Template strings
// var message = "Hello " + firstName + " have I met you before? I think we met in " + city + " last summer no???";
const message = `Hello, ${firstName} Havae I met you before? I think we met in ${city} last summer NO???`




// default arguments
// default age to 10;
// function isValidAge(age) {
//     return age
// }
const isValidAge = (age = 10) => age;
// 这里使用这个const定义函数的含义是，不允许这个变量继续编程别的东西了。他只能指向这个函数。


// Symbol
// Create a symbol: "This is my first Symbol"

// Arrow functions
// function whereAmI(username, location) {
//     if (username && location) {
//         return "I am not lost";
//     } else {
//         return "I am totally lost!";
//     }
// }

const whereAmI = (username, location) => {
    if (username && location) {
        return "I am not lost";

    } else {
        return " I am totally lost";
    }
}

```
mrubyでWOL

FreeBSDでRealtekなethernetインターフェースはWOLに対応しているので、mrubyからたたき起こしてみました。

ターゲットはASRock DeskMini A300で、BIOSの設定はネットで調べてみました。

mrubyはmrbgemsのmruby-socketを入れてビルドしておきます。

```ruby
s = UDPSocket.new
s.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
mac = "12:34:56:78:9a:bc"
mes = ['FF'].pack('H2') * 6
sp = mac.split(':')
mgc = [sp[0]].pack('H2')
mgc << [sp[1]].pack('H2')
mgc << [sp[2]].pack('H2')
mgc << [sp[3]].pack('H2')
mgc << [sp[4]].pack('H2')
mgc << [sp[5]].pack('H2')
mes << mgc * 16
s.send(mes, 0, '192.168.1.255', 9)
```

macはターゲットのMACアドレスにします。192.168.1.255は自分のネットワークのブロードキャストアドレスにします。

FreeBSDは12.1でとくに設定は必要なかったです。インターフェースはこんなになってました。

```
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGC,LINKSTATE>
        ether 12:34:56:78:9a:bc
        inet 192.168.1.2 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
```

tcpdump -e -xX ether broadcastで確認したところ、なぜか

```ruby
mes << mac.split(':').pack('H2H2H2H2H2H2') * 16
```

がおかしな動きをしていたのでpackをばらしました。追記：[修正済みです](https://github.com/mruby/mruby/issues/5057)。

このターゲットは負荷がなければ13Wくらいなのですが、でんこちゃんに怒られるので、未使用時は電源落としています。

昔元祖amd64のHummerなマシンが消費電力が100W以上あってskにパッチを当ててWOLできるようにしてみたことがありました。確かレジスタにフラグを立てるだけだったような記憶があります。

mrubyはFreeBSD/mipsのルーターに入っているのですが、ルーターは3Wくらいなので常時通電しています。

shutdownするときは必ず-pで電源を落とす必要があります。単にHALTしてシングルユーザになるとコントロールできなくなります。FreeBSDやLinuxにはpoweroffというコマンドもあるので、これを使っても良いかもしれません。

WOLのパケットはEtherパケットのヘッダーがブロードキャストアドレス(0xff,0xff,0xff,0xff,0xff,0xff)と自分のMACアドレスでパケットの種別がIP(0x0800)の14バイトになります。その後IPv4パケットが入りIPヘッダーと上のmrubyで作っているデータが入ります。WOL待ちのインターフェースはブロードキャストのEtherパケットを受け取れるようになっていて、その中身が自分宛のWOLパケットのときにパワーオンします。

WOLパケット待ちのreなインターフェースは100BaseTXでLink upした状態になっています。インターフェースがLink Down(LEDが消えてる)してるとWOLはできません。Linkは接続しているスイッチのLEDでも確認できます。

いくら自分しか知らないはずといっても通信がどこかでもれて不正アクセスで起動されると困ります。安全にインターネットから直接パケットを飛ばすことはできないので、[VPNを張って](https://qiita.com/yamori813/items/e90727c5db56f9cc9294)ルーターに入ってスクリプトを実行しています。

![WOL2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5bab39f0-e697-e8b0-cc78-c6c365424e15.png)

追記：FreeBSDには/usr/sbin/wakeというWOLのパケットを送れるコマンドがありました。portsにもいくつかありますが、依存もなくwakeでもよさそうです。とはいえ、ルーターはZRouterでイメージを作っていて、バイナリを追加するのはビルドと焼き直しが必要で、mrubyで処理するのも一つの方法です。

ネットで検索するとncコマンドでWOLのパケットを送信しているページがありますが、LinuxとFreeBSDではncの実装が違うためそのままは使えません。

Windowsのmruby-socket入りのmrubyでも動作しました。

Windows 7以降ではBATファイルでもWOLパケットが送れるようです。

https://poga.jp/?p=182

WOLはBIOSで有効にした上で、shutdownする前にインターフェースのWOLをenableしておく必要があります。FreeBSDのreやfxpはデフォルトでWOLがenable(optionのWOL_MAGIC)になっています。

BIOSの設定はWOLとなっている場合もあり、PCI PMEとなってる場合もあり様々です。

PCI 2.1ではWOLはPCIボードとマザーボードをケーブルで接続していましたが、2.2ではPMEとしてPCIバスの中に取り込まれたので、ケーブル接続は必要なくなったようです。

Debianなマシンも起こせました。FreeBSDではデフォルトでWOLが有効なインターフェースが多いですが、Debianでは設定しないと有効にならないようです。

猛牛さんのLGY-PCI-TXDは古いものは蟹さんのRTL8139Cを使っていたようですがハードオフでRTL8139Dな物を110円で購入しDebianなマシンに入れてみたのですがWOLできませんでした。RTL8139DはRTL8139Cと互換がないのかもしれません。

停電があるとWOLできなくなります。機種によってはBIOSに電源復旧後に起動するなどの設定があるので、そうやって立ち上がったものを落とせば大丈夫かもしれません。
AWS EC2で将棋ソフトを動かす。

# 1. 設定手順
[みくにまるさんのブログ](http://web.archive.org/web/20190505232131/https://www.mikunimaru.com/entry/ShogiAWS)は、初心者向けに丁寧にAWSでのセットアップ方法が書いてある。ただし、AWSに慣れた人からすると、アカウント作成から書いてあるので冗長で読みずらい。このため、必要なところだけ抜き出してみた。なお、構成は、以下のとおりである。

- ノートPC(Windows10)
- サーバ(AWS EC2)

これにより、ノートPCと、AWSに接続できるインターネット環境があれば、1時間70円程度で毎秒2000万局面読める環境が構築できる。


## 1.1. 将棋エンジンのセットアップ
### 1.1.1. AMIインスタンスの作成

インスタンスのイメージを`shogi`で検索する。なお、Amazon Linux2でインスタンスはできているので、`ec2-user`でログインできる。
2020年8月1日現在の最新イメージは以下の模様

```
ami-084b54ebcb697a77f
```

### 1.1.2. セットアップができていることの確認
以下のスクリプト(AWS.bat)を作成する。ここでは、以下の2つを設定する必要がある。

- 鍵ファイル(key.pem)
- ホスト名(ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com)

その後、スクリプトをダブルクリックして起動する。

```bash
@echo off
setlocal

cd /d %~dp0

ssh -i key.pem ec2-user@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com cd ./engine;./YaneuraOu-avx2

pause
```

コンソール上でusiとたたくと、それらしき出力が出る。

## 1.2. ShogiGUIの設定
上記で、設定が終わった。今度は、GUIから接続する。

ツール(T)＝＞エンジン設定(E)から、上記のAWS.batを登録する。


# A. 参考資料
## A.1. みくにまるさんの頁
- [将棋ソフトをAWSで動かす方法を解説！！ノートPCでも毎秒2000万局面の検討が可能に！！](http://web.archive.org/web/20190505232131/https://www.mikunimaru.com/entry/ShogiAWS)
   - 電王戦並みの性能ならEC2だと、16コア(4xlarge)で達成できるらしい。

## A.2. ShogiGUI
- [ShogiGUI](http://shogigui.siganus.com/)
- [ShogiGUI(マニュアル)](https://sites.google.com/site/shogigui/home)
QiitaでGoogleアナリティクスを使う

QiitaでGoogleアナリティクスを設定し、自分の投稿について、閲覧数・LGTM数以外も解析することができそうです。
（というのを最近気がつきました）
Qiita公式の方法・画像は少し古かったので、書きました。

## Qiita公式の方法

https://qiita.com/Qiita/items/c7f704e3786df3aa7a11

## Google Analytics設定

すでに自分が他でGoogleアナリティクスを使っていたので、申し込み手順についてはスキップします。

### アカウントの追加

<img width="320" alt="スクリーンショット 2020-08-02 15.00.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/e98adb9e-042a-6b77-d6ee-42a489e02f39.png">

「設定」＞「アカウントの追加」を押します。

### アカウント設定

アカウントの基本設定を行います。

### 測定の対象

「ウェブ」を選択します。

### プロパティの設定

下記の項目を設定します。

- プロパティ名
- URL：今回は `qiita.com`
- 業種：コンピューター、電化製品
- レポートタイムゾーン：日本

作成されたトラッキングIDはコピーします。

## Qiita設定

QiitaのGoogleアナリティクス設定ページに行きます。
https://qiita.com/settings/analytics

先ほどのトラッキングIDを入力し、更新します。

ちなみに、

```
「Universal Analytics」を有効にしたプロパティIDを登録してください
```

とありましたが、最新のGoogle Analyticsだとこの設定は出てきませんでした。

## 動作確認

Qiitaの自分の記事を開いたまま、Googleアナリティクスの「リアルタイム」を確認します。

<img width="1000" alt="スクリーンショット 2020-08-02 15.06.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297014/0474a4b5-3401-c591-dba1-352d2f62151f.png">

アクティブユーザーが１人以上、「アクティブページ」に現在見ている自分の記事が表示されていれば、設定はうまくいっています。

## 参考資料

https://support.google.com/analytics/answer/2790010?hl=ja
https://qiita.com/Qiita/items/c7f704e3786df3aa7a11
配列のコピー

###変数を代入する
変数を代入した場合、コピーとはならず同じデータを参照されるようになる。
そのため片方で行った変更がもう片方に影響を与えてしまう。

````js
var a = [1, 2, 3];
var b = a;
// 変数bに対して行った値の変更が変数aにも影響を与えてしまう。
b[0] = 9;
console.log(b);
// [9, 2, 3]
console.log(a);
// [9, 2, 3]
````

コピーには種類があり、浅いコピーと深いコピーがある。
他の変数に影響を与えないようにしたい場合、深いコピーをする必要がある。

### slice(浅いコピー)

````js
var array = [
  {name: "yamada"},
  {name: "tanaka"},
];

var copyArray = array.slice();
copyArray[0].name = "sasaki";
console.log(array);
// {name: "sasaki"},{name: "tanaka"}
console.log(copyArray);
// {name: "sasaki"},{name: "tanaka"}

````

### concat(浅いコピー)
````js
var array = [
  {name: "yamada"},
  {name: "tanaka"},
];

var copyArray = array.concat();
copyArray[0].name = "sasaki";
console.log(array);
// {name: "sasaki"},{name: "tanaka"}
console.log(copyArray);
// {name: "sasaki"},{name: "tanaka"}

````
### JSON.stringifyを使用する(深いコピー)
この方法では、Date オブジェクトや function など 文字列化すると壊れるオブジェクトが含まれていると正しくコピーできないようだ。

````js
var array = [
  {name: "yamada"},
  {name: "tanaka"},
];

var copyArray = JSON.parse(JSON.stringify(array));
copyArray[0].name = "sasaki";
console.log(array);
// {name: "yamada"},{name: "tanaka"}
console.log(copyArray);
// {name: "sasaki"},{name: "tanaka"}
````
他にはjQueryのExtend関数やlodashのcloneDeepを使うと
実現できるようだ。
fish shellのTimeZoneの設定

今更ながら、fish shellを導入した際に、promptの右側に表示される現在時刻がUTCっぽかったのでそれを変更する際、どこで変えるのか謎だったのでメモ的に残します。
（最初はfish_configとかで変更できるのかと思ってた）

Googleで調べてもあまり参考になる記事がなかったので、下記のディレクトリ辺りをみていたらそれっぽいことをしてるファイルを発見。

```bash
~/.config/fish/functions/fish_right_prompt.fish
```

開いてみると一番上に思いっきり書いてありました。。

```bash
# You can override some default right prompt options in your config.fish:
#     set -g theme_date_format "+%a %H:%M"
#     set -g theme_date_timezone America/Los_Angeles
```

fish shellをカスタマイズする際は

```bash
~/.config/fish/config.fish
```

に記載していくとのことで、下記の内容を記載。

```bash
set -g theme_date_timezone Asia/Tokyo
set -g theme_date_format  "+%Y-%m-%d %H:%M:%S"
```

これで日本時間になりました。


個人的にずっとzshを使用していたので、fish shellは fish_configや日本語のドキュメントがあったりとびっくりしつつ、いろいろカスタマイズしていきたいと思いました!
Androidアプリ開発探求記（その１）

# はじめに
Andorid アプリ開発に関して、あまりトピックを絞らずに、まったりと実験しつつ、その過程を綴ってみようと思います。

# 新規 GitHub Repository の作成と設定

## ◆ 新規 GitHub Repository の作成
まずは手始めに、GitHub 上に 新規 repository を作ってみます。

Git Hub の Web ページにて、以下を実行：

- README と MIT License 付きの public repository を作成。

## ◆ Default Branch を develop に変更
次に、git の default branch を master から develop に変更します。

PC 上で以下を実行：

```
$ git clone git@github.com:beyondseeker/chrono0015.git
$ cd chrono0015
$ git checkout -b develop
$ git push
```

Git Hub の Web ページにて、以下を実行：

- *Settings* -> *Branches* -> *Default branch* にて default branch を *develop* に変更。

## ◆ ブランチの自動削除設定
PR 後に手動で PR branch を削除するのがめんどいので、自動削除の設定を入れます。

Git Hub の Web ページにて、以下にチェックを入れる：

- *Settings* -> *Options* -> *Automatically delete head branches* 

# 新規 Android Project の作成
ということで、実際にコードをいじっていこうと思います。

まずは、アプリ開発のベースとなる Android project を作成してみようと思います。

## ◆ 作業内容の確認
まずは作業内容の確認から。

- 作業名
    - 新規Androidプロジェクトの作成
- 概要
    - Android Studio にて Android project を作成する。
- 完了条件
    - Android Studio にて作成された直後の Android project を成果物とする。

## ◆ Feature Branch の作成
作業内容を十分に推測できる名前の feature branch を作成します。[^3]

Pull Request できるように空コミットを入れたうえで push します。

```
$ git checkout -b create_new_android_project
$ git commit --allow-empty -m "initial: create_new_android_project"
$ git push
```

## ◆ Draft Pull Request の作成
上記で push した branch から develop に merge するための draft pull request を作成します。

事前に draft pull request として作業内容や完了条件などを明言しておくことにより、意図された内容が実装されていることを merge 前に確認できるようにします。

**タイトル**

```
新規Androidプロジェクトの作成
```

**本文**

```
# 概要
Android Studio にて Android project を作成する。

# 完了条件
Android Studio にて作成された直後の Android project を成果物とする。
```

## ◆ 新規 Android Project の作成  
Android Studio を起動し、以下のように新規 Android project を作成します。

- *Start a new Android Studio project*
- *Select a Project Template* -> *Empty Activity*
- *Configure Your Project*
    - *Name* -> chrono0015
    - *Save location* -> C:\tmp\chrono0015[^1]
    - *Minimum SDK* -> API 23[^2]

## ◆ Pull Request の merge
作成直後の Android project を develop に merge します。

一人プロジェクトなので review 入れずに merge しちゃいます。

PC 上で以下を実行：

```
$ git add .
$ git commit -m "create new android project"
$ git push
```

Git Hub の Web ページにて以下を実行：

- *Ready for review* ボタンを押下。
- *Merge pull request* ボタンを押下。
- *Confirm merge* ボタンを押下。

# おわりに
ということで、今回は手初めに、GitHub 上に repository を作成し、そこに Android project を作ってみました。

次回も行き当たりばったりで、まったりと実験しつつ、その過程を綴ってみようと思います。

[^1]: Git Hub の repository の root フォルダを選択している。そのため `'chrono0015' already exists at the specific project location and it is not empty.` と警告が出るが、意図したものなので無視します。
[^2]: https://twitter.com/minsdkversion を参考にしてます。
[^3]: feature branch の naming convention については、今回は `作業内容を十分に推測できる名前` としておきます。naming convention の best practices と呼ばれるものは世の中に多々ありますが、naming convention の採用自体がプロジェクトに複雑さを導入してしまうというのは本末転倒です。現段階では naming convention の導入自体が YAGNI や BDUF の類だと考えます。
Ubuntu 20.04 上で wireshark をビルドする

# Ubuntu 20.04 上で wireshark をビルドする

※ windows でのビルドは https://qiita.com/m-tmatma/items/1c0565fd5a963ab6f93d

Ubuntu 20.04 上で wireshark のビルドする

## 必要なモジュールをインストール

```
sudo apt install -y build-essential \
python3-pip \
ninja-build \
cmake flex bison libgcrypt20-dev \
libssh-dev libpcap-dev libsystemd-dev \
qtbase5-dev qttools5-dev qtmultimedia5-dev \
libqt5svg5-dev libc-ares-dev
```

## ソースコードの入手

```
git clone https://gitlab.com/wireshark/wireshark.git
```

## ビルド方法

```
cd wireshark
mkdir build
cd build
cmake -GNinja ..
cmake --build .
```

`build/run` 以下に `wireshark` や `tshark` などが生成されます。


### 注意

https://github.com/wireshark/wireshark.git は readonly のミラーです。
コマンドの説明の URL を https://gitlab.com/wireshark/wireshark.git に変更しました。
はじめてのPython3 ~はじめての比較編~

# はじめに
注意点などは[こちら](https://qiita.com/kashun0410/items/4113051964d5a1cd0bb5)を参照してください。


# If文による条件分岐

```
import random
x = random.randint(1, 3) # １から3のランダムな数値を代入

if x == 1:
    print("これは1です") # 条件式が成立した場合

elif x == 2:
    print(“これは2です”) #条件式2が成立したときの処理
    
else:
    print("これは1や2ではありません") # 条件式が成立しなかった場合

```
・if文では:(コロン)を忘れずに
　エラーになる。（筆者はよく忘れてしまう）
・elsifではない
　elsifが使われる言語があるため混同しやすい。

## インデント

コードの行頭を字下げすることを「インデント」という。
Pythonでは、１段のインデントに、tab1回か半角スペース4つを入力。

```
# 省略
if x == 2000:
    print("2000ポイント")

```
Pythonでは、条件式のあとの「:」(コロン)やelseのあとの「:」(コロン)から始まって、
インデント行が終わるまでを、ひとかたまりのブロックとして扱う。

インデントは、Python では、条件式が成立した時に実行する処理を表すと同時に、
プログラマーにとって、条件式に応じて実行する処理を見分けやすくする。

## 比較演算子

一覧

|例     |意味          |真になる例|
|:-----:|:---------:|:-------:|
|a < b|a が b よりも小さい|10 < 15|
|a > b|a が b よりも大きい|10 > 7 |
|a <= b|a が b 以下である|10 <= 15|
|a >= b|a が b 以上である|10 >= 7|
|a != b|a と b が等しくない|10 != 1|


# 例文

### 飲酒可能かどうかを比較する

```
import random
age = random.randint(18, 22)    # ageに、何才かを18~22の範囲でランダムに代入
text = "" 
if age < 20:
    text = "飲酒不可"
else:
    text = "飲酒可能"    
print(str(age) + "才は" + text)
```
【初心者でもわかる】flexboxのjustify-content: space-between;で最後の行を左寄せにする方法

# どうも、7noteです。flexboxは便利ですが、たまに思い通りにならないパターンの解決方法を書いていきたいと思います。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/flexbox_left/
[Mac] $llを実行してもcommand not foundと表示される

[このサイト](lanchesters.site/howtouse-mac-ll/)の通り、
`$ alias ll='ls -l'`
をターミナルで実行するだけでコマンドが通るようになった。

一度ターミナルを閉じると、再度command not foundが出てしまうので、
`$vim ~/.bashrc`
↓
i
↓
最後の行に`alias ll='ls -l'`を追記
↓
esc
↓
:wq
↓
`$source ~/.bashrc`
で反映させれば完了
【flutter】firebase_admobでバナー広告が表示されないときのチェック項目

## はじめに
[firebase_admob](https://pub.dev/packages/firebase_admob) を使っていて、本番用のバナー広告が表示されず苦労したので、それについてまとめます。

この記事では、 **本番用のバナー広告だけ表示されない** 場合を扱います。

## チェック項目

- [ ] admobでお支払い情報を入力しているか？
- [ ] app id が間違っていないか？
- [ ] unit id が間違っていないか？
- [ ] admobとfirebaseの連携はできているか？
- [ ] アプリストア公開後数時間が経過しているか？


以下でこれらの詳細を説明します。

## 1. admobでお支払い情報を入力しているか？
admobの画面がこのように「お客様のアカウントは確認中です」と表示されている場合、本番用の広告は表示されません。

<img width="962" alt="スクリーンショット 2020-08-02 13.57.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164020/7bb78ae1-ad8a-7369-def1-1da896e6cd09.png">

これを直すには、「お支払い情報」を入力する必要があります。

上の画像の左サイドバーの「お支払い」から、お支払い情報を登録しましょう（Safariの場合お支払い画面でインジケータが回っているだけで何も進まない場合があるので、Chromeでアクセスするように気をつけてください）。

## 2. app id が間違っていないか？

### add idの確認
「アプリ」 > 「アプリの設定」 にある「アプリID」をメモしましょう。

<img width="1090" alt="スクリーンショット 2020-08-02 15.10.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164020/26380f5f-004a-d860-1187-b35e8915afce.png">


### app idの設定
先ほどメモした「アプリID」を設定します。

アプリのエントリーポイントとなるStatefulWidget

```dart
FirebaseAdMob.instance.initialize(appId: 'ca-app-pub-bbb~aaa');
```

app/src/main/AndroidManifest.xml

```xml
        </activity>

        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-bbb~aaa"/>
    </application>
</manifest>
```

ios/Runner/info.plist

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
/* 中略 */
	<key>GADApplicationIdentifier</key>
    <string>ca-app-pub-ddd~ccc</string>
</dict>
</plist>
```


## 3. unit id が間違っていないか？

### unit idの確認
「アプリ」 > 「広告ユニット」 にあるca-pubから始まる文字列をメモしましょう。

<img width="1216" alt="スクリーンショット 2020-08-02 15.10.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164020/25126b27-b5fd-0c4a-ac45-ca87ebb199ea.png">


### unit idの設定
先ほどメモした「広告ユニットID」を設定します。

```dart
BannerAd(
      adUnitId: 'ca-app-pub-yyy/xxx', # ユニットID
      size: AdSize.smartBanner,
      targetingInfo: targetingInfo,
      listener: (MobileAdEvent event) {},
    );
```

## 4. admobとfirebaseの連携はできているか？
「アプリ」 > 「アプリの設定」 > 「リンクされたサービス」でFirebaseと連携させましょう。

<img width="1256" alt="スクリーンショット 2020-08-02 15.07.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164020/dd0014f9-5a37-263b-b599-9a499c1c356f.png">


## 5. アプリストア公開後数時間が経過しているか？
こちら @glassmonkey さんからコメントをいただきましたので、追加いたしました。

> アプリストア公開後数時間じゃないと広告が表示されなかったので、念のため情報共有です。


## 終わりに
その他、ハマりポイントがあればコメントしていただけると嬉しいです！
null、undefinedの判定

以下で判定可能

````js
var nullOrUndefined = (val) => {
    // ==演算子を使用する。
    // ===にすると厳密な比較が行われ、undefinedの場合falseになる
    if (val == null) {
        console.log("null or undefined");
    } else {
        console.log(val);
    }
};

var a;
nullOrUndefined(a);
// "null or undefined"
var b = null;
nullOrUndefined(b);
// "null or undefined"
var c = "hoge";
nullOrUndefined(c);
// "hoge"
````

コーディング規約によっては==の使用が禁止されていて
===しか使用できないことがある(体験談…)

その場合の代替案をいくつか調べてみた。

###1.自分でメソッドを作る
無ければ作ればいいじゃないの精神。

````js
var isNullOrUndefined = (val) => {
    if (val === null) return true;
    if(val === undefined) return true;
    return false;
};
````

###2.!hogeによる判定
0、false、空文字の場合もtrueと判定されることを理解して使用する。


````js
if (!hoge) { 
    //null, undefined, 0, 空文字(''), falseの場合trueとなりこのブロックに入る
}
````

自分は判定対象の値に0が入っていることもあり1の方法を使用していたが、
2つ以上の値を判定する場合、記述数が多くなりモヤモヤしていた。

````js
// もしも変数名が長いと手に負えない
if (isNullOrUndefined(a) && isNullOrUndefined(b)){}
````

2つ以上の値のチェックが頻繁に必要な場合、可変長で引数を受け取るメソッドを作成しておいても良いのかもしれない。

````js
var isNullOrUndefinedAll = (...args) => {
  for (let val of args) {
    if (val !== null && val !== undefined) return false;
  }
  return true;
};
````
windowsでエイリアスを登録する

windows環境でneovimにエイリアスを登録したくて調べました
以下の記述はこれらの記事を参照してます
https://takuya-1st.hatenablog.jp/entry/20110116/1295188903
https://qiita.com/jeyei/items/2c385e4e0488a5fa2591

# windowsのパスの解決順
1.カレントディレクトリ
2.システムPATH
3.ユーザーPATH
4.Registry "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"
の順番で解決される様です

コマンドプロンプトなら```echo %path%```
powershellなら```echo $env:path```で確認できます

システムPATHとユーザーPATHはそれぞれ先頭から探して見つかったものが優先されます
（guiで編集すると上にあるやつから探します）

4はpythonって打ってストアが開くアレとか、excelって打ってエクセル起動するアレとかが記述されてる様です
今regedit起動して自分の環境見たらよくわからんのがたくさん登録されてました

# エイリアス
エイリアスを設定しておきたいなら、例えば
c:\mycmd
みたいなフォルダを作っておいて、そこに好きな名前でショートカット放り込んでパス通しておけばいいと思います

忘れがちですがpathextに
;.lnk
を加えておきましょう
pathextに記述してある拡張子は、エイリアス呼ぶ時に省略してOKになります

windows terminal使ってる人はタブ閉じただけでは環境変数リロードされないっぽい？
ので、ウィンドウごと一旦閉じないと諸々が反映されないっぽいです

おわり
Visual Studioの基本機能で JSON からクラスを自動生成する方法

# はじめに

あんまりこの辺の基本機能が有名ではないようなので紹介しておこうかと思います。
ちなみにですが XML でもまったく同じことが可能です。

# 前提

- 適当な C# プロジェクトを作っておいてください

# JSON

今回は以下のような JSON を利用していこうと思います。
> 参照: **[Qiita API v2 | /api/v2/templates/:template_id](https://qiita.com/api/v2/docs)**

```json
{
  "body": "Weekly MTG on %{Year}/%{month}/%{day}",
  "id": 1,
  "name": "Weekly MTG",
  "expanded_body": "Weekly MTG on 2000/01/01",
  "expanded_tags": [
    {
      "name": "MTG/2000/01/01",
      "versions": [
        "0.0.1"
      ]
    }
  ],
  "expanded_title": "Weekly MTG on 2015/06/03",
  "tags": [
    {
      "name": "MTG/%{Year}/%{month}/%{day}",
      "versions": [
        "0.0.1"
      ]
    }
  ],
  "title": "Weekly MTG on %{Year}/%{month}/%{day}"
}
```

この JSON をクリップボードにコピーしておいてください。

# Visual Studio

## クラスファイルを 1つ 追加する

今回は `Template.cs` を追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/4eb6f9dd-d7b9-d46f-a84f-13099bd33c70.png)


## JSON を クラス として貼り付ける

**[ 編集 ]** → **[ 形式を選択して貼り付け ]** → **[ JSON をクラスとして貼り付ける ]**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/e906cd3d-9972-8b50-3918-2e0ca27958f9.png)


## Rootobject クラスを修正する

`Rootobject` というクラスとともに関連クラスが自動で生成されるので, あとはお好みで修正していきます。
ここで注意しなければならないのは, **"プロパティ名を変更してはならない"** ということです。クラス名は変更しても問題ありません。

今回は以下のようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/ce74179d-ad9e-114f-a3bd-41c4fa3795f5.png)

ここで問題になってくるのが, プロパティ名が通常の C# コーディングガイドラインに則っていないことです。
そこで今回は **System.Runtime.Serialization.DataMemberAttribute** を利用していこうと思います。

各プロパティにこの属性を利用してあげて、以下のようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/25f136b1-66c9-be39-f5b6-6439c3ca1546.png)

これで Upper Camel Case でプロパティを書きつつ正常にデシリアライズできるようになりました。
ここで注意ですが, 利用するデシリアライザによっては別の Attribute が用意されている可能性があるので, その辺りはドキュメントに従って良しなに対応してください。


## デシリアライズしてみる

nugetから **Utf8Json** を導入してデシリアライズしてみます。

```cs:Program.cs
using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var json = @""
{
  ""body"": ""Weekly MTG on %{Year}/%{month}/%{day}"",
  ""id"": 1,
  ""name"": ""Weekly MTG"",
  ""expanded_body"": ""Weekly MTG on 2000/01/01"",
  ""expanded_tags"": [
    {
      ""name"": ""MTG/2000/01/01"",
      ""versions"": [
        ""0.0.1""
      ]
    }
  ],
  ""expanded_title"": ""Weekly MTG on 2015/06/03"",
  ""tags"": [
    {
      ""name"": ""MTG/%{Year}/%{month}/%{day}"",
      ""versions"": [
        ""0.0.1""
      ]
    }
  ],
  ""title"": ""Weekly MTG on %{Year}/%{month}/%{day}""
}
            "";

            var x = Utf8Json.JsonSerializer.Deserialize<Template>(json);
            Console.WriteLine($"body= {x.Body}\r\nid= {x.ID}\r\nname= {x.Name}");
        }
    }
}
```

実行結果は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125601/f3e3ac1b-3aac-fada-9cd9-7e5eca0a07e7.png)


# おわりに

生成されるクラスが最初から Upper Camel だと, もっと使いやすいのですが…。
そこは今後に期待というところですね。
scoop開発覚書

# tl;dr

- 自分のやり方だから他は知らないよ！
- 真っ新な仮想環境でやった方が楽だよ！特に依存関係！
- commitは完成時だけで事足りるよ！

# 全体の流れ

- scoopとgitは導入済みとする
    - powershellで以下のコマンドを実行
        - `Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force`
        - `iwr -useb get.scoop.sh | iex`
- 大体[昔作った奴](https://github.com/2nd-junkey/scoop-korindoh)の見直し兼まとめ

## 新規開発部分

- [main](https://github.com/ScoopInstaller/Main/tree/master/bucket)や[extras](https://github.com/lukesampson/scoop-extras/tree/master/bucket)に欲しいソフトが無いか探す
  - 既に存在するならそれを使いましょう
  - 無かったらやったねたえちゃん！タスクが増えるよ！
  - 尚`scoop search $keyword`でも事足りる
- bucket(インストール用設定ファイル置き場)を既存にプルリクを投げるか自分で作るかを決める
  - 既存に投げた場合は誰かがメンテナンスしてくれるかもしれないが、速度や品質は不安定になる
  - 自作すると速度と品質は良くも悪くも担保されるが、ほぼ間違いなく自分でメンテする羽目になる
    - 自分が欲しい物を纏めるなら自作した方が楽
    - 作った場合は`scoop bucket add <name> <repo>`で追加する
        - `scoop bucket add korindoh https://github.com/2nd-junkey/scoop-korindoh.git`
- 開発用のbucketを[scoopに登録](https://github.com/lukesampson/scoop/wiki/Buckets#creating-your-own-bucket)する
- こんな感じで欲しいソフト名でjsonを作成、bucketに放り込む
  - `%USERPROFILE%\scoop\buckets\$bucket\**\$software.json`
- [公式サンプル](https://github.com/lukesampson/scoop/wiki/App-Manifests)を見ながらインストーラースクリプトで死ぬ

## バージョンアップ

- 必須
  - インストールするなりしてバージョンを更新
  - インストーラーファイル名にバージョンが入ってるなら更新
  - 一度インストールして動作確認
- 必要なら
  - 最新版をDLしてきてインストーラーのSHA256を更新
- 最後に
  - bucketにプルリクを投げる
時系列の解析 SARIMAモデルにて売上予測してみた

####Pythonで時系列解析・分析を行っていくうえでの基礎知識として、SARIMAモデルにて車の売上予測をしてみます。平均・分散、正規分布などの統計学の初歩知識を前提とした学習の自身の振り返りの為の記事です。

##実践！PythonによるSARIMAモデルの推定
##①SARIMAを用いた時系列データの分析手順
1.データの読み込み 　
2.データの整理 　
3.データの可視化 　
4.データの周期の把握 (パラメーターsの決定) 
5.s以外のパラメーターの決定 6.モデルの構築 
7.データとの予測とその可視化 


##②実践！PythonによるSARIMAモデルの推定
下記ではパラメータの決定を自動で最適化しています
<img width="829" alt="スクリーンショット 2020-08-02 14.14.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675961/4d855399-4950-8119-5848-7d6b71d13f43.png">
<img width="829" alt="スクリーンショット 2020-08-02 14.14.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675961/fcce0b94-566e-254e-40aa-9b2788b15584.png">

##③1968-01-31から1972-01-31のある会社の車の売上データの予測と可視化
<img width="829" alt="スクリーンショット 2020-08-02 14.18.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675961/9f335df6-4b3d-d50c-4d8a-cd732341bc60.png">


##④SARIMAモデル (Seasonal ARIMA model)とは
ARIMAモデルに周期成分を取り入れたモデルをSARIMAモデルといいます。＜＜ARMAモデルとは定常な時系列のモデルであり、非定常な時系列は定常な時系列に変換した後にARMAモデルに当てはめる必要がモデルの事。 𝑑 階差分をとった系列に対してARMA( 𝑝,𝑞 )を考えるモデルをARIMA( 𝑝,𝑑,𝑞 )モデルといいます。 時系列が ( 𝑑 次式のトレンド) + (定常部分) といえる場合に有効なモデルです。＞＞
SARIMAモデルは、時系列方向の説明にARIMA( 𝑝,𝑑,𝑞 ) モデルを使うだけでなく、周期方向の説明にもARIMA( 𝑃,𝐷,𝑄 )モデルを使おう、というものです。
SARIMAモデルでは合計7個のパラメータがあります。 時系列方向のARIMA( 𝑝,𝑑,𝑞 )に加え季節差分方向のARIMA( 𝑃,𝐷,𝑄 )、さらには周期 𝑠 があるためです。
新しいMacを買ってからpyenv + poetryでPythonの環境構築手順書

# 前提
MacOS Catalinaでの手順です。
zsh対応しています。

# pyenvとは？
Pythonのバージョンを簡単に切り替えるためのツールとなります。
最近はPython2は使うことないと思いますが、Python3内でのバージョン切り替えが簡単にできるようになるのは便利です。

# poetryとは？
Pythonのパッケージ管理するツールとなります。

# .zshrcの設定
```zsh
echo 'export PIPENV_VENV_IN_PROJECT=1' >> ~/.zshrc
. ~/.zshrc
```

```zsh
echo $PIPENV_VENV_IN_PROJECT
> 1
```

# pyenvのインストール
```zsh
git clone git://github.com/yyuu/pyenv.git ~/.pyenv
git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update
```

~/.zshrcにパスを追加

```zshh
vim ~/.zshrc
```

```vim:.zshrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
```

ターミナルを再起動

```zsh
pyenv update
pyenv --version
> pyenv 1.2.20
```

# pyenvで使うPythonのバージョンを設定
今回は3.7.4にしてますが、お好きなバージョンを指定してください

```zsh
pyenv install 3.7.4
pyenv global 3.7.4
pyenv versions
> * 3.7.4 (set by /Users/***/.pyenv/version)
```

ターミナルの再起動
バージョンの確認

```zsh
python --version
> Python 3.7.4
pip --version
> pip 19.0.3 from /Users/***/.pyenv/versions/3.7.4/lib/python3.7/site-packages/pip (python 3.7)
```

# pipの設定
```zsh
pip install --upgrade pip
pip --version
> pip 20.2 from /Users/***/.pyenv/versions/3.7.4/lib/python3.7/site-packages/pip (python 3.7)
```

# poetryのインストール
```zsh
curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
```

~/.zshrcにパスを追記

```zsh
vim ~/.zshrc
```

```vim
export PATH="$HOME/.poetry/bin:$PATH"
```


ターミナルを再起動

```zsh
poetry --version
> Poetry version 1.0.10
poetry self update
> You are using the latest version
```

# ローカルのPythonに必要なパッケージを追加する
ここ必要に応じてパッケージを追加してください
飛ばしても大丈夫です

```zsh
pip install pipenv
pip install awscli
pip install awslogs
```

インストールしたパッケージの確認
バージョンは異なる可能性が高いです

```zsh
pip freeze
> awscli==1.16.254
> awslogs==0.11.0
> boto3==1.9.244
> botocore==1.12.244
> certifi==2019.9.11
> colorama==0.4.1
> docutils==0.15.2
> jmespath==0.9.4
> pipenv==2018.11.26
> pyasn1==0.4.7
> python-dateutil==2.8.0
> PyYAML==5.1.2
> rsa==3.4.2
> s3transfer==0.2.1
> six==1.12.0
> termcolor==1.1.0
> urllib3==1.25.6
> virtualenv==16.7.5
> virtualenv-clone==0.5.3
```

# Poetryでプロジェクトの作成
新規でプロジェクトを作成する場合

```zsh
poetry new my-package
```

既存のプロジェクトをpoetryで管理する場合
(色々聞かれますが、そのままEnterで大丈夫です)

```zsh
poetry init
```

パッケージを追加する

```zsh
poetry add [パッケージ名]
```

pyproject.tomlからパッケージをインストール

```zsh
poetry install
```

pyproject.tomlからパッケージを更新

```zsh
poetry update
```

以上となります。
お疲れ様でした。
本当は怖い論理値の真実～if true or false～

#はじめに
この記事はphpにおける論理値についてまとめたものです。
ノリで映画みたいなタイトルをつけてみましたが当たり前のことを当たり前にまとめただけなので、
対象読者はプログラミング初級者、又は死ぬほど暇なエンジニアの方になります。

#まずはテスト

さっそくですが、みなさん下記処理の結果はわかりますか？

```
$function = '';

if($function):
echo 'おはよう';
endif;

if(!empty($function)):
echo 'こんにちわ';
endif;
```
**「両方とも$functionが定義されていればifの中の処理を実行するだろう」**と思った方は本記事必読です。
ちなみに答えは**「何も出力されない」**です。

#論理値とは
まずは論理値ってなんやねんという人のために。

>
論理値 とは、「何かが真であるか、真でないか（偽であるか）」を表す値のことです。ブール(bool)値 とも言われます。又、論理値 のデータ型は 論理型 となります。論理型 は、ブール(bool)型、ブーリアン型(Boolean)とも言われます。


ちなみに、PHPの 論理値 は キーワードの TRUE （真）と FALSE （偽）です。キーワードとして予め TRUE と FALSE がPHPで用意されています（このようなワードを予約語と言います）。大文字小文字は区別しません。true false でも同じ意になります。

なんとなく論理値に関しては上記引用でご理解いただけたかと思いますが、ここで厄介なのが
**phpにおいてTRUE(真)やFALSE(偽)と見なされる値があり、それらには決まりがあるということです。**

#FALSEとみなされる値
キーワードFALSEと同じ偽と見なされる値。
>
表示なし
キーワード FALSE
整数 0
浮動小数点 0.0
空の文字列 " "
空の文字列 ' '
文字列 '0' （文字列としての0）
要素数が 0 の配列　$ary = array();
プロパティーやメソッドを含まない空のオブジェクト
NULL値

はい、最初に提示させていただいたテスト問題。

```
$function = '';

if($function):
echo 'おはよう';
endif;

if(!empty($function)):
echo 'こんにちわ';
endif;
```
もうご理解いただけたかと思いますが、**空の文字列 ' '**はphpにおいてはFALSEとして扱われるのですね。
そしてif文、empty関数は、条件式の結果が 真 であるか 偽 であるかによって処理を分岐させます。
なので分岐処理を行わず、「おはよう」「こんにちわ」が出力されなかったのです。
ややこしいですねぇ。。
ちなみに私は論理値に関して理解するまで「こんにちわ」が出力されると思っていました、お恥ずかしい。。

#TRUEとみなされる値

```
FALSE 以外のすべて
```
こちらは非常にシンプルで分かりやすいですね。

```
if(1):
echo 'おはよう';
endif;

if('真です'):
echo 'こんちにわ';
endif;
```
出力される内容は「おはようこんにちわ」です。

#おわりに
はい、またも30分で調べた内容を書き殴らせていただきました。
論理値は分かっているようで分かっていない人が多いと思いまとめさせていただきました。
疲れたマン。