OmniAICreator/Qiita-1.07M huggingface dataset:
VRTK 3.2.1の基本設定から物を掴むまで

#まえがき
参考ページの丸写しです。ごめんなさい&ありがとうございます。
なお、自分のメモ用ですので、ご容赦ください。

#バージョン
Unity 2017.4.2f2
SteamVR Plugin 1.2.3
VRTK - Virtual Reality Toolkit - [ VR Toolkit ] 3.2.1

#基本設定
空オブジェクトVRTK作成
VRTKの子に空オブジェクトLeft, Right. Steam作成
Steamの子に[CameraRig]配置
VRTKにVRTK_SDKManagerをアタッチ
SteamにVRTK_SDKSetupをアタッチ
VRTK_SDKSetupのQuick SelectにSteamVRを設定
VRTK_SDKManagerのAuto Populateをクリック
VRTK_SDKManagerのSDK_OCULUS_AVATAR(not installed)をチェック

#コントローラ
VRTK_SDKManagerのScript AliasesにLeft, Rightをアサイン
Left, RightにVRTK_ControllerEventsをアタッチ
Left, RightにVRTK_InteractTouchをアタッチ
Left, RightにVRTK_InteractGrabをアタッチ
Left, RightにRigidbodyをアタッチ
RigidbodyのIs Kinematicをチェック
Left, RightのVRTK_InteractGrabのController Attach PointにLeft, Rightをアサイン

#対象物
対象物にVRTK_InteractableObjectをアタッチ
VRTK_InteractableObjectのIs GrabbableとIs Usableをチェック
対象物にVRTK_FixedJointGrabAttachをアタッチ
VRTK_FixedJointGrabAttachのPrecision Grabをチェック
対象物にRigidbodyをアタッチ※

#※対象物を掴んで離した後の挙動
空中でピタッと止めたい場合はIs Kinematicを有効
無重力感を出す場合はUse GravityとIs Kinematicを無効

#その他
掴んで移動してると何かに引っかかって落ちるのが嫌な場合
→対象物のVRTK_FixedJointGrabAttachのBreak Forceを無限に設定
持ち換えたい場合
→VRTK_SwapControllerGrabActionをアタッチ

#参考
http://maplesyrup-cs6.hatenablog.com/entry/2017/10/05/235958
http://maplesyrup-cs6.hatenablog.com/entry/2017/12/12/173811
http://dasutio.hatenablog.com/entry/2018/01/20/234425
XMLを一言でいう

##XML
HTMLをデータ管理しやすく記述したマークアップ言語
Extensible Markup Language
1998年〜

##XML Schema
XMLの構造を定義する

##XSLT
XMLを別の表示形式に変換

##SOAP
XMLを利用して、通信上のデータのやり取りを定めたもの


>参考
http://gogodiet.net/z/xml/1.htm
C#の基本文法 - 制御構文

授業でした内容を自分のメモとして書き残します。

---

C#の基本文法 - 制御構文

---

#制御構文とは？
■ 制御構文の基本は以下の二つ
※ 構文が二つしかないわけではない

1. **分岐**
 - 条件などをチェックし、それにより実行する処理を変える
2. **繰り返し**
 - 決まった処理を何度も繰り返し実行する

##1. if-else
〇 予め用意しておいた条件をチェックし、その条件が正しいかどうかで実行する処理を変える

```c#:ex1
if ( 条件 )
{
    ……条件が正しい時に実行する処理……
}
```
```c#:ex2
if ( 条件 )
{
    ……条件が正しい時に実行する処理……
}
else
{
    ……条件が正しくない時に実行する処理……
}
```

##2. switch
〇 あらかじめチェック用の値を指定しておき、その値が何かによって処理を分岐する

```c#:ex
switch( チェックする値 )
{
    case 値1:
        ……実行する処理……
        break;
    case 値1:
        ……実行する処理……
        break;

    //……必要なだけcaseを用意する……

    default:
        ……どれにも当てはまらない時の処理
        break;
}
```

##3. while, do
〇 用意された条件をチェックし、それが正しい間は処理を繰り返す
　 この二つは、基本的には同じ働きをしている

```c#:while.ex
while ( 条件 )
{
        ……繰り返す処理……
}
```
```c#:do.ex
do
{
        ……繰り返す処理……
} while ( 条件 );
```

■ while と do の最大の違い
⇒ いつ、条件をチェックするか

- **while**
まず条件をチェックし、それがtrueなら処理を実行
※ 一度も処理を実行しない場合もある

- **do**
まず処理を実行し、その後に条件をチェックする
※ 一度は必ず処理を実行する

##4. for
〇 条件をチェックし、trueならば繰り返し処理を行う

```c#:for.ex
for ( 初期化処理; 条件; 後処理 )
{
        ……繰り返す処理……
}
```

- **初期化処理**
繰り返しに入る時、最初に実行するもの

- **条件**
繰り返しを実行するかチェックするためのもの

- **後処理**
繰り返す処理が終わった後でチェックするもの

■ 基本はカウンタ方式

```c#:ex
for ( int 変数 = 初期値; 変数 < 最大値; 変数++)
```

---

最後までお読みいただきありがとうございました。
flutter doctorでAndroid SDKが認識されない

# flutter doctor でAndroid SDKが認識されない

こんなサイトを見つけた。
https://blog.gauravagarwalr.com/posts/2018-04-11-setting-up-flutter/

上記サイトの、NDKの部分だけハショれば問題は解決した。
概要はこんな感じ。
※環境変数＝システム環境変数の前提で進めます。

1. 環境変数`ANDROID_HOME`を設定していなければ、設定する。
例）ANDROID_HOME = C:\Program Files (x86)\Android\android-sdk

2. 環境変数`ANDROID_SDK_ROOT`を設定していなければ、設定する。(`ANDROID_HOME`と一緒のパス)
例）ANDROID_SDK_HOME = C:\Program Files (x86)\Android\android-sdk

3. 下記をPathに追加する。
%ANDROID_SDK_HOME%\tools
%ANDROID_SDK_HOME%\tools\bin
%ANDROID_SDK_HOME%\platform-tools

4. コマンドプロンプトを開き、sdkmanagerのコマンドを打つ

```bat
  sdkmanager "tools"
  sdkmanager "platform-tools"
  sdkmanager "build-tools;27.0.3"
  sdkmanager "platforms;android-27"
  sdkmanager "extras;android;m2repository"
  sdkmanager "extras;google;m2repository"
  sdkmanager "patcher;v4"
```

【補足１】 こんなエラーメッセージが出たら（一番下の行）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/169861/05292fb3-52c1-a7f4-ad6b-dd50ee982374.png)

`flutter doctor --android-licenses`
と打ち、ライセンスに同意することで解決します。
SwiftでDuplicateメソッドをログへ出力する

下記のようなケースを想定します。

```swift
// ↓この関数を
func duplicatedFunction() {
    // 処理
}

// ↓この関数に置き換えたい
func newFunction() {
    // 処理
}
```

`duplicatedFunction`は様々な個所から参照されているため、一変に置換するのは安全ではありませんし、確認範囲も広がるのでまとまって時間が取れないと対応は困難です。

duplicateとなった処理を見つけ次第変更するという漸進的な対応のほうが現実的です。
`duplicatedFunction`がどこから呼び出されているか確認出来るようにして、コードが実行されたものをログに出力されるようにします。

```diff
- func duplicatedFunction() {
+ func duplicatedFunction(_ file: String = #file, _ line: Int = #line) {
+     debugPrint("!!!Duplicate!!! \(file):\(line), Please replace to newFunction.")
      // 処理
  }
```

`#file`と`#line`をデフォルト引数で与えることで、どこから呼び出されているかを確認出来るように修正しました。

これで出力されるログを`!!!Duplicate!!!`でフィルタしておけば何処で呼ばれたのかログから確認出来るようになりますので、ログを確認さえしていれば対応範囲内の処理を修正していけますね！
code academy : js復習 ①

code academy が英語記述なので、ノートと頭の整理のためのまとめ

*topics*
1出力console.log
2データ型
3計算


---
##出力　console.log();

とにかくセミコロン";"を忘れない(出力すり時だけでなく、jsでコーディングする際)

```js

console.log("Hello");
console.log(5);
```

##データ型

-string（" もしくは　'で囲む）
-numbers(doubleとかの区別なし)
-booleans(true もしくは　false)
-null(空っぽって意味.nilと間違わないように注意！)

```js
console.log("Hello");
console.log(5);
console.log(true);
console.log(null);
```


lengthでstring型の文字数を出力する方法

```js
console.log("Hello".length);

```

##計算

```js
console.log(5 + 2);
console.log(5 - 2);
console.log(5 * 2);
console.log(5 / 2);
console.log(5 % 2); //余りの算出
```
C#プログラミング(基礎)二回目

※自分用のメモに書いています

環境:Windows10 Visual Studio 2012

まず初めにString内の文字列を大文字や小文字にしてみる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/dcccf3be-bfd9-837e-6a37-e768e8b10ba9.png)
結果画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/bb2da1cb-0dc8-d807-d608-d1843f5ad3a0.png)
##クラス
クラスを新しく作り中に変数nameとageを作る。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/3090faff-fa24-ada5-be43-9c797ca93c21.png)
次に先ほど作ったクラスを使う用に変数を用意する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/57ba38d8-6784-e9d4-2096-a5fd4dc3cda1.png)
がこのままでは使えないので使えるようにするために、
personクラスの変数の前にpublicを追加する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/28be3756-b298-0cfb-6357-82e28f3a4206.png)
結果画面。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/7457f12d-f350-f9ae-109e-e547a98f91b8.png)
まだ変数内が表示されないので表示するためにpersonクラス内に表示用の文を追記する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/dffdb5b6-9509-8dd6-70ae-5c10f6af3947.png)
ついでに他のデータも追加する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/fd239fd3-5581-e766-f56f-5bfc28475252.png)
もうすこし弄ってこうなった。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/0cca27e9-9f0a-439e-ffab-cf891fbe3f74.png)
結果画面。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/52f30f6f-23b9-81a6-95e6-2d6e6ab9755a.png)
社員教育にモブプログラミングを適用してみて学んだこと


# まえがき
2017年4月にこんな記事を書いた。[社員教育にモブプログラミングを取り入れてみた](https://qiita.com/takaaki4cards/items/b35a3ac3fccf5c9f1564)
約1年半にわたり月1のペースで実施し、社員教育について自分の任務が終ったので、教育という観点で学んだことを整理。
会社からは好きにやらせてもらっていた。

# やったこと
## 主旨
- 1つのJavaアプリケーションをみんなで学びながら作ろうという主旨

## 参加者
- プログラミング経験がほとんど無い後輩
	- 普段は別々の現場
	- 多い時で6人
	- 少ないと1人(この時はペアプロ)

## 開催頻度
- 月1で土曜日の午前中約3h実施

## 環境
- 場所: 本社会議室
	- 自分たちしかいない状況作り
- 使用機器: ノートPC(Windows 10)
- ディスプレイ:
	- 初めは23インチのディスプレイ
	- その後しばらくプロジェクター
	- ラスト3回くらいは40インチくらいのディスプレイ
- 開発環境: Cloud9というクラウド開発環境

## 各回の進め方
1. アイスブレイク3分くらい
1. 前回やったことを5~10分くらいで振り返り
1. 今回やることを5~10分くらいでタスク出し
1. モブプロわいわい(1時間くらいで10分ほど休憩)
1. 今回の成果レビューを5~10分くらい




# 学んだこと
- 山本五十六氏の「やってみせ・・・」の名言を実践できる。
- 参加者の反応を見て理解してる/してないがリアルタイムにわかる。
- 伝えられる内容が増える。
	- Javaだけではなく、DB, Git, Maven等の関連技術。
	- 作業タスクの作り方等の開発プロセス周り。
- 参加者の成長がリアルタイムに見れる。
- 心理的安全性作りが重要
	- 邪魔が入らない環境作り。
		- そもそも社員が不在の土曜日に開催。
	- 自分がドライバーの時に率先してエラーを出す。
		- エラーになるの恥ずかしいことではないよということを暗黙的に伝える。
- コンパイルエラーや期待した挙動にならない等失敗を見せることができる。
- 失敗をどうやって解決するのかという手順をリアルタイムに教えることができる。
- 回を重ねる毎に参加者の発言も増えていくのがわかる。
	- 何回目かの会で参加者がナビをし始めた時は嬉しかった。
- 参加者が不明点について積極的に聞いてくるようになった。
- 言葉で伝えにくい事柄についてはコードで見せることができる。
- ホワイトボードや付箋などアナログツールが共通認識を得る上でとても役立つ。
- 教えるのではなく参加者と一緒に学んでいくというスタンスが良さそう。
- 必然的に会話が増えるから参加者との距離が縮まる。
- モブプロするなら大画面がいい。
- モブプロの進め方も変わっていった。
	- 初めは10分くらいで時間測って交代していたが、いつからか1タスク単位で交代になっていた。
	- 参加者がモブプロのサイクルに慣れてきたためと思われる。

# 改善の余地があると思ったポイント
- 参加者の主体性の引き出し方
	- 私と参加者の経験の差が結構あったため、参加者はどうしても教えてもらうという受け身な感じになる。
- ずっとモブプロで良かったのかどうか
	- 1人で学ぶ時間、みんなで学ぶ時間とメリハリをつけても良かったのかもしれない
- 参加者の成長具合の評価
	- 定性的な評価はできる。
	- 定量的な評価の仕方は結局見つからず。
- 参加人数
	- 参加者はみな普段は別々の現場という背景があるのでスケジュールが合わなかったりで人数少ないことの方が多かった。


# まとめ
- 後輩の成長が見れたことは良かった！
- いろんな実験ができた！
- モブプロ楽しい！
- 他の会社ではモブチームの人事評価どうやってるんだろう・・・？
ISUCON5 予選 part2

研究室有志によるISUCON勉強会 ISUCON部 の第2回資料です。

## 概要

[ISUCON 夏期講習 2017](http://isucon.net/archives/50648750.html) の資料を参考に、各種logの解析と簡単なチューニングをする。


## 手順

```
# 毎回忘れずにやること
vagrant ssh image
sudo su - isucon
```

```
# 必要なものインストール
sudo apt-get install -y htop dstat glances
sudo apt-get install -y unzip

# alp インストール
mkdir -p ~/tmp
cd ~/tmp
wget https://github.com/tkuchiki/alp/releases/download/v0.3.1/alp_linux_amd64.zip
unzip alp_linux_amd64.zip
sudo install ./alp /usr/local/bin

# nginx の log format 変更
# 参考: https://github.com/gky360/isucon5-qual-etc/commit/1b7a1c334b0744fb7561461e530df224b5c02cae
sudo systemctl restart nginx
sudo rm /var/log/nginx/access.log
systemctl status nginx
# ここでベンチを回してみる

# alp
sudo alp -f /var/log/nginx/access.log

# 静的ファイルを nginx に処理させる
# 参考: https://github.com/gky360/isucon5-qual-etc/commit/9b6e6f6fe3fc11e352322df798a0947dc79762a0
sudo rm /var/log/nginx/access.log
sudo systemctl restart nginx

# mysql slow log
# /etc/mysql/my.cnf を編集
# 参考: https://github.com/gky360/isucon5-qual-etc/commit/df13fc1f043194786927084097b1ca11fed23d45
sudo systemctl restart mysql
sudo systemctl restart isuxi.go.service

# slow log 解析
sudo mysqldumpslow /var/log/mysql/slow.log

# percona tools
sudo apt-get install -y percona-toolkit
sudo pt-query-digest --limit 10 /var/log/mysql/slow.log | less
# 見方はここ参照: https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html
```
is_nullか=== null

[is_null](http://php.net/manual/ja/function.is-null.php)は関数なので呼び出しのオーバーヘッドがある
=== nullの方がパフォーマンスが[良い](https://stackoverflow.com/questions/8228837/is-nullx-vs-x-null-in-php#answer-8229059)
といっても沢山回す処理でもない限り気にする必要はないので好きな方で良い。

個人的にはわかりやすいis_nullが好き。
ISUCON5 予選 part1


研究室有志によるISUCON勉強会 ISUCON部 の第1回資料です。

## vagrant を使った環境構築

試しに ISUCON5 の予選を再現した環境を vagrant で動かしてみる。

### 競技用ウェブアプリの環境構築

```
git clone https://github.com/gky360/vagrant-isucon.git
cd vagrant-isucon/isucon5-qualifier
vagrant up image
```

http://192.168.33.10 が見られたらここまではok。

### ベンチマーク用の環境構築

```
vagrant up bench
vagrant ssh bench
sudo su -l isucon

# 上で立てた競技用ウェブアプリに対してベンチマークを走らせる
./bench.sh 192.168.33.10
```

何もしない状態でとりあえず 271.2 点取れました。
ちなみに、ISUCON 5 本戦出場者の得点はみんな5桁とか6桁とかです。
http://isucon.net/archives/48475110.html


## 言語を golang に切り替え

基本的に以降のコマンドは `vagrant ssh image` した中で。

```
# 環境構築 (optional)
sudo apt-get install -y zsh vim tmux htop dstat

# isucon ユーザに変える
sudo su - isucon

# systemctl スクリプトの確認
ls -l /etc/systemd/system/

# 80 と 8080 で何か動いている
sudo lsof -i :8080

# 実はこの vagrant はデフォルトで ruby 版の実装が動いている
systemctl status isuxi.ruby.service

# ruby 版webapp停止
systemctl stop isuxi.ruby.service
systemctl disable isuxi.ruby.service
sudo lsof -i :8080

# golang 用環境設定
echo "export PATH=/home/isucon/.local/go/bin:$PATH" >> ~/.bashrc
echo "export GOROOT=/home/isucon/.local/go" >> ~/.bashrc
echo "export GOPATH=/home/isucon/webapp/go" >> ~/.bashrc
exec -l $SHELL

# go build
cd ~/webapp/go
go build app.go
go run app.go

# golang のサーバに切り替え
systemctl start isuxi.go.service
systemctl status isuxi.go.service
sudo lsof -i :8080
```

なにも log がでなくて不安なので、出るようにする。
https://github.com/gorilla/mux の Middleware のところを参考に `loggingMiddleware` を足す。
slack リマインダーの設定整理 /remind

slackでリマインダーを設定するときにいつも公式ページを探しているが、見づらかったのでちょっと整理しておく。

[公式ページ](https://get.slack.help/hc/ja/articles/208423427-%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)

# 登録する

/remind [@メンバー/#チャンネル] [何を (日本語OK)] [任意: いつ (英語)]

例)

```
/remind me simカード返却 at 21:00 every day
```

## 宛先

|宛先|書き方|
|:--|:--|
|自分へ|me|
|メンバー指定(グループもOK)|<span>@</span>mariko|
|チャンネルのみんなに|#i_love_it|

## 日時の指定

|種類|例|意味|
|:--:|:--|:--|
|経過時間|in 10 seconds|10秒後|
|経過時間|in 10 minutes|10分後|
|経過時間|in 1 hour|1時間後|
|経過時間|in 2 hours|2時間後|
|時間指定|at 19:00|19:00に|
|時間指定|at 7:00pm|午後7:00に|
|時間指定|at midnight|午前0:00に|
|日付指定|on January 1|1月1日に|
|日付指定|on 05/02/2018|2018/05/02に(MM/DD/YYYY形式で指定)|

## 繰り返し

|種類|例|意味|
|:--:|:--|:--|
|毎日|every day|毎日|
|毎日(平日)|every weekday|平日の毎日|
|毎週|every Monday, Wednesday and Friday|毎週月・水・金|

# 登録内容確認

```
/remind list
```
![remind01.png](https://qiita-image-store.s3.amazonaws.com/0/224453/0b076ea0-7815-c82e-550a-61acc48d9338.png)

# 削除する

`/remind list`したあとに対象を[削除]する。

![remind02.png](https://qiita-image-store.s3.amazonaws.com/0/224453/0847a49c-e51a-941f-2220-d8aa31f7d093.png)
Macのスクリーンショットの保存場所を変更しよう

#スクリーンショットの保存場所を変更しよう

デフォルト[Desktop]
↓
今回保存したいところ[「Desktop」の中の「Screenshot」というファイル]

###実際に変更してみよう
ターミナルで次のように打っていきます。

```
$ defaults write com.apple.screencapture location ~/Desktop/Screenshot/　
```

###サービス再起動することにより設定が反映されます。

```
$ killall SystemUIServer
```
Docker for Mac の "incorrect username or password" エラーの対処法

[Docker for Mac](https://www.docker.com/docker-mac)をインストールしてみたものの，イメージのダウンロード(`Docker pull`)が，認証エラーによってうまく動かないことがある．

エラーメッセージ
------------

正しいE-mailとパスワードを入力して，認証を終わっているのに，ドキュメントの最初に書いてある `hello-world`ですらpullできない

```
$ docker run hello-world

Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/latest: unauthorized: incorrect username or password.
See 'docker run --help'.
````

対処方法
-------

docker cloudのIDとしてE-mailアドレスを入れている場合，このエラーが出る．

1. メニューバーのアイコンから，`Sign in / Create Docker ID`を選ぶ

　　　　<img width="257" alt="スクリーンショット 2018-05-02 13.15.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/75935/b3ab3269-106f-830b-fccc-761a6285afe4.png">

2. あらかじめ登録しておいたDocker IDのEmailではない方を入力する

    <img width="606" alt="スクリーンショット 2018-05-02 13.15.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/75935/43e8fb34-e590-2b21-f840-ac1997383830.png">

確認
----

これでpullができるようになります．

```
$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete 
Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
```

### 参考情報

1. [はじめてのDocker for Mac](https://qiita.com/kobori_akira/items/0cc993caeb20d77cd367)
1. [dockerのmacへのインストール手順](https://qiita.com/hogehoge1234/items/7c73be819295d183aa5b)
1. [Docker for Macのインストール](https://qiita.com/bgg0u/items/5b46c7afa48cadd02f9b)
1. [Docker for Macをインストールしてみた](https://qiita.com/gtracker64/items/e9de48bc3e2b5df255b2)
1. [macOSでDocker環境構築](https://qiita.com/mks1412/items/9356187a3bcb20b64e82)
1. ["docker pull" and "docker login" command failed ,When logging in the Docker ID(Using High Sierra 10.13.0)](https://github.com/docker/for-mac/issues/2124)
System.Diagnostics.EventLogの取得結果がWindows10 2018Springから全件取れなくなったっぽい件

#要約
対処療法な感じがすごいので良いのかどうかはわからないが、
Windows10の2018 Springアップデートから
System.Diagnostics.EventLogのEntriesを使うとデータが全件取れない現象が起きており、
PowerShellのGet-WinEventをつかってデータを取るとうまく逃げられるよ

##以下、経緯
EventLog.EntriesをForEachループで回して全件処理　が今までの鉄板だった感じですが、
ちょうどそんな処理を書いてテストしてる最中にWindows10 2018Springアップデートしたら
130件ぐらいでForEachループが終わるようになりました。

ちなみにこんな処理も通んない…　（のはさすがにどうかと思うんだが。）

```csharp
System.Diagnostics.EventLog log = new System.Diagnostics.EventLog(logName_sec, machineName);

for(int i=0;i<=log.Entries.Count;i++){
	Console.WriteLine(log.Entries[i].TimeGenerated);
}
```

※注：logName_secは単にセキュリティログを抜きたいので"Security"です。当然管理者権限での実行。

##結局どうした~~（ようとしている）~~のか
WindowsPowerShellでならWindowsログを従前のようにそれなりに取得可能。
ただし、取得順序がSystem.Diagnostics.EventLogで取ると昔→今のログ
WindowsPowerShellのGet-WinEventで取ると今→昔のログになるみたい。

で、結局下記のようなコードになりました。
時間でソートしてたりいろいろと力業感が強いです。

```csharp
string script = @"Get-WinEvent Security |select-object TimeCreated,ID|sort-object TimeCreated";

using(RunspaceInvoke ivk = new RunspaceInvoke())
{
	System.Collections.ObjectModel.Collection<System.Management.Automation.PSObject> psList = ivk.Invoke(script);
	foreach (var pso in psList) //System.Diagnostics.Eventing.Reader.EventLogRecord
	{
		EventID = (int)pso.Properties["ID"].Value;
		dtGetLog = (DateTime)pso.Properties["TimeCreated"].Value;	//ログの日付取得

//～～～～～～～～～～～～～～～～～～
// なんかやりたい本処理
//～～～～～～～～～～～～～～～～～～

	}
	
}
```

ログの生成時間とログＩＤが取れれば充分だったので、
とりあえず要件は満たせた形です。

あと、私はC#触ってまだ２週間ぐらいなのでコードの構文規則とか
見る人が見たら全然ダメかもしれません。
（自分でも何かダメな気はしています。）

通りすがりの方で、指摘や改善点などあればコメント欄で頂けると幸いです。
Ubuntu 18.04にDockerをインストールする

Ubuntu 18.04でDockerのインストールする際に
https://docs.docker.com/install/linux/docker-ce/ubuntu/
の「Install using the repository」に従ってインストールしたらエラーになります（2018/5/2 確認）

`add-apt-repository`コマンド実行時に`stabe`だけでなく`test`や`edge`とか追加しておけば、エラーを回避してインストールすることができました。

具体的には下記のコマンドでエラーなくインストールできました。

```
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable test edge"
sudo apt-get update
sudo apt-get install docker-ce
```

とりあえず以下のバージョンがインストールされました。

```
$ docker --version
Docker version 18.05.0-ce-rc1, build 33f00ce
```
Vim でシンタックスハイライトが上手くいかない時

Vim でシンタックスファイルを追加して、.vimrcに設定を書いたのに上手く色がついてくれないことってありますよね。

というのも Vim は起動時に読み込む設定ファイルが複数あるから、優先順位によって上書きされちゃうことが多々あるからです。

自分の場合は、Processing ファイルが arduino 判定されたり、actionscript ファイルが atlas 判定されたりしたことがあります。  
だいたいは、filetype.vim という設定ファイルの優先順位が強いために起こっていることが多いです。

これを解決するには、今判定されているファイルタイプが、どの設定ファイルによるものなのかを調べればOK。

ということで、Vim で、
```
:verbose :setlocal filetype?
```
と入れると、今のファイルが判定されているファイルタイプと、決定している設定ファイルがどれかわかるので、それを修正 -> まだ直らない場合はもう一回。

という感じでやると解決できます。

また、Vim の設定ファイルの優先順位については、runtimepath オプションというものが、設定ファイルの読み込み順を決定しており、`:set runtimepath`で確認できます。  
この辺り、自分もあまり詳しくないので調べたい。
PATCHについて


* HTTP
    * [Patchについてrequest・responseについてのMDNのまとめ](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH)
    * [PatchについてHTTPのRFC](https://tools.ietf.org/html/rfc5789)
* JSON
    * [PatchについてJSONのRFC](https://tools.ietf.org/html/rfc6902)
    * [日本語版](https://triple-underscore.github.io/RFC6902-ja.html)
* その他
    * [こっちに全部載ってた](https://github.com/jersey/jersey/tree/master/examples/http-patch)
C で覚えたことまとめメモ vol.3

[vol.1](https://qiita.com/aki_55p/items/9829f7150d4d85715f9f)  
[vol.2](https://qiita.com/aki_55p/items/befee0aa4782961c310e)  
の続きです。

- システムサービス：プログラムの実行  
    * `$ ps -ef`でプロセス表示  
    * `int system( const char *command );`  
セキュリティ的に問題あるからあんまり使わないほうが良い。
    * `exec()`は exec+バージョンのオプションで色々種類がある。  
ヘッダーは`unistd.h`  
`l`：引数がリスト  
`v`：引数が配列 / ベクトル  
`p`：パスの検索  
`e`：環境変数  
    * exec() の引数について  
プログラム  
コマンドライン引数（最初のコマンドライン引数はプログラム名 == 始めの引数と一緒）  
NULL　(コマンドライン引数の最後を知らせる)  
環境変数（配列）  
    * 例えば  
`execle ("/app/hoge", "/app/hoge", "arg01", "arg02", NULL, my_env);`  
`execvp ("hoge", my_args);`  
    * C プログラムは環境変数を`getenv()`で読み取れる。  
    * `exec()`が失敗した時  
`errno`変数にエラーが格納されている。ヘッダーは`errno.h`。  
`string.h`の関数で`strerror (errno)`ってするとエラーテキストとして取り出せる。  
    * `exit()`  
ヘッダーは`stdlib.h`。  
通常終了なら引数に0、異常終了ならそれ以外。この辺は調べるべし。
    * プロセスのフォーク  
`pid_t pid = fork()`成功すると、子プロセスは0、親プロセスは、フォークした子プロセスのプロセスIDを返す。  
- プロセス間通信  
    * ディスクリプタの取得  
`int fileno (FILE *file);`  
    * データストリームの複製  
`int dup2 (int oldhandle, int newhandle);`成功したら0、失敗で-1  
    * 子プロセスの完了を待つ  
`pid_t waitpid(pid_t pid, int *status, int options);`  
`pid`親プロセスが子プロセスをフォークした際のプロセスID。  
`pid_status`プロセスの終了情報が格納される。  
`options`オプション。完了待ちなら0。  
    * `pid_status`の中身  
`WEXITSTATUS(pid_status)`っていうマクロに渡すとわかる。  
- パイプ  
    * `int fd[2];  pipe(fd);` fd[0] が読み込む側、fd[1] が書き込む側。
dup2 で標準入出力にコピー。  
プロセスによって、使わない方は閉じる。`close(fd)`ヘッダーは`unistd.h`。  
ちなみに`fgets`とかで、fd[1] につながってる stdin からの入力を読んだりする場合、fd[1] を閉じとかないと、永遠と入力を待つ感じになるので注意。  
それから、一回閉じたファイルは標準出力とかであっても開き直さないと挙動がおかしくなる。  
for 文とかでループする時にハマった。`freopen()`。  
- シグナル  
    * sigaction 構造体  
`struct sigaction {`  
`    void     (*sa_handler)(int);`  
`    void     (*sa_sigaction)(int, siginfo_t *, void *);`  
`    sigset_t   sa_mask;`  
`    int        sa_flags;`  
`    void     (*sa_restorer)(void);`  
`};`  
取り急ぎは以下のように設定すればOK  
`struct sigaction hoge;`  
`hoge.sa_handler = action;`シグナル受け取った時に呼び出したい関数  
`sigemptyset (&hoge.sa_mask);`  
`hoge.sa_flags = 0;`追加のフラグ。とりあえず0でよし。  
    * シグナルの登録  
`int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);`  
`signum`:シグナル番号。`SIGINT`とかのシグナルのシンボルを渡す。  
`act`:登録したいsigactionのアドレス。  
`oldact`:オーバーライドするsigaction。特に気にしない場合は NULL。  
    * シグナルエスカレーション  
`raise(SIGINT)`みたいにハンドラ内で呼び出すと、プロセスからプロセス自体にシグナルを送れる。  
`SIGALRM` アラームシグナル。`alarm (秒数)`で発動。  

終わらなかった…。[次](https://qiita.com/aki_55p/items/0d12308af75f48b33850)に続きます。
C で覚えたことまとめメモ vol.2

[前回](https://qiita.com/aki_55p/items/9829f7150d4d85715f9f)の続きです。

- 関数ポインタ  
    * `戻り値の型 (*ポインタ変数) ( 引数の型)  //ex.  int (*hoge) (int, char*) `  
- ソート関数  
    * `void qsort( const void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *) );`  
ptr: 配列へのポインタ  
count: 配列の長さ  
size: 配列の各要素のサイズ  
comp: コンパレータ関数  
    * ヘッダーは`stdlib.h`  
    * コンパレータ関数の返り値（第一引数 - 第二引数 == 正、ゼロ、負）でソート。  
    * qsort()は、配列の実体を操作。  
- 関数ポインタ配列とenum  
    * enum はそれぞれのシンボルに、実際には整数値を割り当てているだけなので、関数ポインタの配列と enum を組み合わせることで、関数の使い分けが楽になる。  
- 可変個引数  
    * ヘッダーは`stdarg.h`  
    * `void hoge (int args, ...) { ~`args は普通の引数。…が可変個引数  
    * `va_list s;`s は関数に追加した引数を格納する変数  
    * `va_start (s, args);`可変個引数がどこから始まるかを示す。args は最後の固定引数の名前  
    * `va_arg (s, [型]);`va_arg ()を使って読み取り  
    * `va_end (s)`  
- ヘッダファイルの共有  
    * `<hoge.h>`標準ヘッダディレクトリ。  
UNIX系だと /usr/local/include か usr/include にだいたい入ってる。  
    * `"hoge.h"`カレントディレクトリ。  
    * 標準以外のディレクトリからヘッダファイルをインクルードする場合。  
インクルード文にフルパスを含める。  
gcc の`-I`オプションでディレクトリを指定する。  
- オブジェクトファイルの共有  
    * gccにフルパスを追加する。  
    * ライブラリ作る。
- スタティックライブラリ  
    * ライブラリアーカイブは`lib`で始まり`.a`で終わる。  
    * `.a`ファイルの中身を見るのは`$ nm`もしくは`$ ar -t`コマンド（あんまりよく分かってない）  
    * `$ ar -rcs libhoge.a fuga01.o fuga02.o fuga03.o`  
`r`：.a ファイルが既に存在する場合置き換える。  
`c`：フィードバックなしにアーカイブを作成。  
`s`：.a ファイルの先頭にインデックスを作成する。  
/usr/local/lib などの標準ディレクトリか独自ディレクトリに入れる。  
    * コンパイル  
`l`スイッチを使用。複数ライブラリを使ってる場合は`-l`も複数設定可。  
ライブラリの前にソースファイルを列挙するべし。  
`$ gcc hogefuga.c -lhoge -o hogefuga  //libhoge.a に対応`  
独自ライブラリに格納してる場合は、ソースの後に`-L`オプションを使って検索するディレクトリ指定。  
- ダイナミックライブラリ  
    * まずはオブジェクトファイルを作成  
`$ gcc -fPIC -c hoge.c -o hoge.o`  
`fPIC`オプションは指定しなくても問題ないことがほとんど。  
    * ダイナミックライブラリの呼び名  
Win: `.dll`  
Linux, Unix: `.so`  
Mac: `.dylib`  
    * 作成方法  
`$ gcc -shared hoge.o libhfcal.dylib`  
ライブラリは作成時に、ファイル内にライブラリの名前を格納するので、名前を変更するときは再コンパイルが必要。  
    * 使い方はスタティックライブラリと一緒。  
Linux の場合は、コンパイル時にダイナミックライブラリのパス名を記憶しないので、標準ライブラリ以外に格納した場合は、`LD_LIBRARY_PATH`変数にディレクトリを追加してエクスポートしておく必要がある。

長くなりそうなので、続きは[次回](https://qiita.com/aki_55p/items/e65acd6cb4be3cbbd3f0)で。
C で覚えたことまとめメモ vol.1

Head First C やら猫Cやら Web に落ちてる記事やらを参考にここ何ヶ月か C を勉強して、一区切りついたのでメモ的にまとめとく。

- 文字列  
    * 文字列型はない。文字型配列の最後に`'\0'`が入る。`'\0'`は文字列終端文字。
- メモリ  
    * スタック：ローカル変数。  
ヒープ：動的メモリ。関数が終了しても残る。  
グローバル：グローバル変数。  
定数：定数。  
 - ポインタ  
    * ポインタ宣言：`int *hoge`  
ポインタ実体：`*hoge`  
変数のアドレス：`&fuga`  
    * 配列変数  
`char s[] = "hogegegegege";  // 配列変数、strlen(s) == 12、sizeof(s) == 13`  
`char *t = s;  // 配列ポインタ、sizeof(t) == 4 もしくは 8`  
は s と t は別物。(関数の引数の場合は両方共ポインタ)  
    *  ポインタ記法  
hoge[2] == 2[hoge] == *(hoge + 2)  
    * 文字列リテラル  
`char *s = "hoge";  //文字列リテラル　書き換えられない`  
`char s[] = "hoge";  //これは配列なので書き換えられる`  
ポインタに文字列リテラルを設定するときは必ず  
`const char *s = "hoge";`  
みたいに`const`使うべし。  
- ファイル  
    * < :標準入力リダイレクト // シェル  
    * > :標準出力リダイレクト  // シェル  
    * エラー表示：`$ echo $?`  // シェル
    * パイプ`hoge | fuga`  // シェル  
    ちなみに`hoge`と`fuga`は同時に動作するので、`hoge`が完了するのを待ったりはしない。  
    * `int fprintf( FILE *restrict stream, const char *restrict format, ... );`  
    * `FILE *fopen( const char *restrict filename, const char *restrict mode );`  
`int fclose( FILE *stream );`  
- コマンドライン引数  
    * int main (int argc, char *argv[]) {…  
`argv[0]`は実行するプログラム名なので、実際の引数は`argv[1]`から。  
    * コマンドラインオプション  
`getopt()`でオプション読み込み。オプションの引数は`optarg`で取得。最後に`optind`で調整。  
ヘッダーは`unistd.h`。  
ちなみに`unistd.h`は標準Cライブラリではなく、POSIXライブラリ。  
- 複数ソースファイル  
    * ヘッダファイルで宣言分離  
    * プリプロセッシング  
コンパイル：アセンブリ言語に変換  
アセンブリ：オブジェクトコードの生成  
リンク  
    * make  
インデントはタブです。  
- 構造体  
    * `struct hoge { ~ };  //要素の区切りはセミコロン`  
`typedef struct hoge { ~ } fuga;  //fuga は struct hoge のエイリアス。hoge は省略可。  
要素のことはフィールドって呼ぶ。.記法でアクセス。  
構造体の入れ子とか再帰的なのも可。  
    * 構造体変数の代入はデータのコピー。  
    * 構造体へのポインタ`struct *s`のフィールドへのアクセスは`s -> hoge`。  
    * 共用体  
`typedef union { ~ } hoge;  // 要素の区切りはセミコロン`  
`hoge h = {.fuga = num};`  
`hoge q;  q.fuga = num;`  
みたいに値を設定。  
    * 列挙型  
`enum hoge (fuga1, fuga2, fuga3);  //typedef も使える`  
共用体に何が格納されているかわからないので、列挙型と一緒に使うと管理しやすい。  
    * ビットフィールド  
`typedef struct { unsigned int hoge:1; } fuga;`  
とすると1ビットに格納する。  
実際にはワード境界とかあるから、全体でグループ化されたりする。  
- 動的メモリ  
    * 連結リストは再帰構造体で作成。  
~~同じ型の構造体へのポインタを構造体の中に含めるので、typedef のエイリアスが使えない。  
だから`struct hoge`の正式な名前を使わなくてはいけない。~~  
typedef でエイリアス定義した後に、構造体の中身を定義できるため、typedef のエイリアスを使うことは可能でした。
    * `void* malloc( size_t size );`  
`void free( void* ptr );`  
ヘッダーは`stdlib.h`  
    * ヒープ領域での文字列コピー  
`char *strdup(const char *s);`  
`free()`で解放するのを忘れずに。  
    * メモリリーク  
Linux は valgrind とかある。mac は別途調べるべし。  

取り急ぎ以上です。  
[vol.2](https://qiita.com/aki_55p/items/befee0aa4782961c310e) へ続く。
Git リポジトリの中で別のリポジトリを管理する submodule

Git を使っていると、自分で作ったリポジトリの中で、別のリポジトリを入れたい時があるかと思います。

僕の場合は、Vim の設定ファイルやプラグイン管理用にディレクトリを作って、 GitHub で管理しようと思った時に、プラグインに関しては、外部のリポジトリと同期させる必要がありました。

が、例えば、`hoge`っていうリポジトリがあるとして、その中で、`fuga`っていうリポジトリを外部から`$ git clone`してきた場合`hoge`を`$git push`しても、`fuga`の中身はpushされません。

困ったなーって思ってたら見つけたのが submodule という機能！

具体的には、リポジトリ内の外部リポジトリを取り込みたいディレクトリで、
`$ git submodule add [外部リポジトリ] [ローカルで格納したいディレクトリ]`
すれば、サブモジュールが作成できます。

ポイントとしては、サブモジュールの中と外は連動しておらず、外側から見るとサブモジュールは、外部リポジトリが入っている箱でしかないという点です。

なので、サブモジュールを更新したり別のブランチを使ったりしたい場合は、サブモジュールの中に入って、git 操作を行います。

ちなみに、別のマシンで`hoge`を`$ git pull`する場合、それだけでは`fuga`の中身は引っ張ってこれません。  
`fuga`の中身を引っ張ってくるには、pull した後に、`$ git submodule init`して、`$ git submodule update`すると`fuga`が参照してるリポジトリからクローンされます。  

ここで、自分の場合は、`No submodule mapping found in .gitmodules for path 〜`というエラーが出て最初はうまく行かなかったのですが、原因はサブモジュールを管理する`.gitmodules`というファイルの中での記述に問題があったからのようでした。

`.gitmodules`の中には、サブモジュールへのパスや、参照しているリポジトリの情報が書いてあるのですが、そのパスが、フルパスだと何故か認識されておらず相対パスに書き換えるとうまく行きました。

ということで、今回の参考ブログは以下！  
[Git submodule の基礎 | Qiita / sotarok](http://qiita.com/sotarok/items/0d525e568a6088f6f6bb)  
[git submodule ではまった | ryusunslifestyle](http://ryusunslifestyle.wordpress.com/2013/05/27/git-submodule-%E3%81%A7%E3%81%AF%E3%81%BE%E3%81%A3%E3%81%9F/)
vim で delete できない。

正確に言うと、インサートモードで入力した文字以外を delete で消せない。

ということで .vimrc に以下設定追加したらできるようになりました。ついでにカーソルの移動についても便利な設定あったので追加してます。(リンク先から全コピです）
参考：[vimのインサートモード中にカーソルキー及びBSキーが使えるようにする | sseze's blog](http://sseze.hatenablog.com/entry/20120414/1334398422)

```  
"viとの互換性を無効にする(INSERT中にカーソルキーが有効になる)
set nocompatible
"カーソルを行頭，行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
"BSで削除できるものを指定する
" indent  : 行頭の空白
" eol     : 改行
" start   : 挿入モード開始位置より手前の文字
set backspace=indent,eol,start
```

めちゃ便利。
GitHub の Pull Request について調べた

いつかチームで開発することを夢見て普段もソースの管理には Git と GitHub をつかっているのですが、今回は Pull Request について調べたのでメモ。

ちなみに以下のブログ見て勉強したことのトピックメモなので詳細はリンク先へ。

- fork してプルリクする場合  
[はじめてのPull Request | Arapedia ぼくの技術的まとめですお](http://wiki.arashike.com/git/PullRequest)
- 共有リポジトリでプルリクする場合  
[GitHub初心者はForkしない方のPull Requestから入門しよう | qnyp blog](http://blog.qnyp.com/2013/05/28/pull-request-for-github-beginners/)
- いままでで最もわかりやすかった Git の解説  
[こわくない Git | SlideShare](http://www.slideshare.net/kotas/git-15276118)

ということで、以下ポイント

- fork してプルリクする場合  
  - 本家から fork
  - fork してきたのをローカルにクローン`$ git clone origin`
  - 作業用ブランチ切る`$ git checkout -b hoge`  
`-b`は新規ブランチ作成してテェックアウト（ブランチに移動）するオプション
  - ブランチで作業（コミットとかコミットとか）
  - master ブランチを本家の master と合わす。（プルリク前に本家最新版をローカル master に反映しとく）  
`$ git remote add [本家URL]`  
`$ git pull [本家URL] master //master ブランチで実行`
  - 作業したブランチを、最新版にした master に反映して、コミットログを綺麗にする。  
`$ git rebase i- master [作業用ブランチ]`  
その後、開いたエディタ上で、複数のコミットを`squash`して一つにして綺麗に。  
これで、プルリクしてOKな内容になる。たぶんここが一番むずいので rebase とはなんなのかを理解するべし。
  - プルリク専用ブランチを切る。  
これは、プルリク専用ブランチを切ることで後々の修正とかに対応しやすくするため。必要なければ作業用ブランチでプルリク送っても良い。
  - それぞれpush`$ git push origin [ローカルブランチ☓3]`
  - GitHub 上でプルリク専用ブランチで Pull Request 作成

以上。

- 共有リポジトリでプルリクする場合  
これは、チーム内での開発の時とかによさげなやつ。GitHub でもこのスタイルとのこと。
  - 共有リポジトリからローカルにクローン`$ git clone origin`
  - 作業用ブランチ切る`$ git checkout -b hoge`
  - ブランチで作業（コミットとかコミットとか）
  - 作業用ブランチを共有リポジトリにプッシュして GitHub 上でプルリク作成

以上。簡単！  
共有リポジトリの方は、チームでやってたら、push の前にコミット綺麗にするとかのルールはいるかも。
make 失踪事件

C 書いてて、makefile 作ったあとに、make したらそんなコマンド無いと怒られたのでびっくりした件。

```
$ which make
```
しても not found すら返ってこない…  
（which hoge は コマンド hoge がどこにあるかをフルパスで表示するコマンド。ただし、探せるのは環境変数の PATH が通っている場所にあるやつのみ。PATH が通ってるディレクトリ順に調べてくれる。）  

Xcode が入ってれば入ってるもんだと思ってましたが、Preference の Downloads から Command Line Tools をダウンロードしなきゃ入らないというオチでした。

普段プログラミングに使ってない端末だったので入れるの忘れてた。

ところで、which した時に not found すら返ってこなかったのは何故なんだろう？
WebGL でローカルでテクスチャを読み込めない！

ウェブでも3Dグラフィック扱いたい！と思って Three.js をいじり始めたのですが、ローカルでテクスチャを読み込むにあたってつまづいたのでメモ。

これは何が原因かというと、プログラマブルシェーダーというのが悪用されるのを防ぐため、WebGLでは別ドメインから読み込んだ画像などをテクスチャとして使用できないことが原因だそうです。  
※CORSというので明示的に許可した場合は除くとのこと  

特に chrome はこの規制が厳しいらしく、ローカルにあるファイルは一切読み込めない！

ということで、都度サーバに上げて確認してもいいのですが、めんどくさいので chrome 起動の際にオプションつけると解決します。

```
$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files
```
参考：[webGLでローカルにあるテクスチャファイルを使用したい場合 | youth](http://yohtn.hatenablog.com/entry/2013/07/16/181323)

これで、ローカルでもテクスチャ読み込み放題です。  
プログラマブルシェーダー（っていうかシェーダー）とか、まだ全然わかってないけれども、とりあえずはよかったね！
シェルについて体系的にまとまっている記事メモ

Linux のシェル (bash) についてとてもよくまとまっている記事があったのでメモ

[Linux上でシェルが実行される仕組みを，体系的に理解しよう　（bash 中級者への道） | 主に言語とシステム開発に関して](http://d.hatena.ne.jp/language_and_engineering/20110617/p1)

普段パイプラインとかデーモンとかなんとなく使ってましたが、体系的に理解すると、謎だった挙動もすっきりつるりー。
[Review] CNN Summary

## Preface
In this article, I would like to summarise and get together the components to understand CNN.

## Research Paper Summary
Since I have read two research papers, I will brief both of them in my another articles.
1. [Gradient-Based Learning Applied to Document Recognition](http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf): https://qiita.com/Rowing0914/items/445095163bc6a58c59b5
Authors: Yann LeCun, Leon Bottou, Yoshua Bengio and Patrick Haffer
2. [Recent Advances in Convolutional Neural Networks](https://arxiv.org/pdf/1512.07108.pdf)
https://qiita.com/Rowing0914/items/4627b4a15b22ae53760b
Authors: Jiuxiang Gua,∗ , Zhenhua Wangb,∗ , Jason Kuenb , Lianyang Mab , Amir Shahroudyb , Bing Shuaib , Ting Liub , Xingxing Wangb , Li Wangb , Gang Wangb , Jianfei Caic , Tsuhan Chenc

## Implementation of CNN in python with Numpy
https://qiita.com/Rowing0914/items/2060af90b97c6739883e

## Math in CNN
https://qiita.com/Rowing0914/items/e815ca24427874030526

## What "Convolution" means mathematically?
https://qiita.com/Rowing0914/items/bef94b187772ff585413

## Nice Summary of Algorithms in CNN
http://blog.yusugomori.com/post/129688163130/%E6%95%B0%E5%BC%8F%E3%81%A7%E6%9B%B8%E3%81%8D%E4%B8%8B%E3%81%99-convolutional-neural-networks-cnn
https://medium.com/@2017csm1006/forward-and-backpropagation-in-convolutional-neural-network-4dfa96d7b37e
http://www.jefkine.com/general/2016/09/05/backpropagation-in-convolutional-neural-networks/
リモートからローカルにファイルをコピーする場合

scp  でリモートからローカルにファイルをコピーするときにつまづいたのでメモ。

はじめにやってたやり方としては、サーバ（リモート）側で  
`$ scp hoge@hoge:~/filename .`  
してたのですが、Permission Denied と言われておりました。

これは鍵認証に関わることに違いないと思い、鍵ペアを生成、リモート側に秘密鍵を置き、ローカル側に公開鍵を置き、ローカル側に authorized_keys を作成、追記。  
さらにリモート側に ~/.ssh/config を作成し、ホストの設定を書き込んだのですが、やはりうまくいかず。

この時の思考回路としては、「ファイルを送信するのだから、送信する側でコマンド実行するべきだろう」と思ってリモートでコマンド実行していたのですが、ここが違った。

普通にローカルで  
`$ scp hoge@hoge:~/filename .`  
すればよかったのですね。

リモートに対して ssh の接続を行うのはローカルからで、その後、どちらからどちらにファイルのやりとりを行うのかを指定すればよいということでした。

賢くなった！
[Review] Recent Advances in Convolutional Neural Networks

## Preface
Since I have read two research papers, I will brief both of them in this article following order.
1. [Gradient-Based Learning Applied to Document Recognition](http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf): https://qiita.com/Rowing0914/items/445095163bc6a58c59b5
Authors: Yann LeCun, Leon Bottou, Yoshua Bengio and Patrick Haffer
2. [Recent Advances in Convolutional Neural Networks](https://arxiv.org/pdf/1512.07108.pdf)
Authors: Jiuxiang Gua,∗ , Zhenhua Wangb,∗ , Jason Kuenb , Lianyang Mab , Amir Shahroudyb , Bing Shuaib , Ting Liub , Xingxing Wangb , Li Wangb , Gang Wangb , Jianfei Caic , Tsuhan Chenc

## Implementation of CNN in python with Numpy
https://qiita.com/Rowing0914/items/2060af90b97c6739883e

## Math in CNN
https://qiita.com/Rowing0914/items/e815ca24427874030526
GitHub に複数デバイスからアクセスするときの鍵認証でつまづいた

普段 GitHub は Macbook Air からアクセスしてたのだけど、最近 iMac で作業することも多いので、iMac からもアクセスできるようにしようと思ったら鍵認証のとこでハマったのでメモ。

GitHub とか SSH 鍵の設定はこの辺りを参照。  
- [Set Up Git | GitHub Help](https://help.github.com/articles/set-up-git)  
- [Create A Repo | GitHub Help](https://help.github.com/articles/create-a-repo)  
- [Generating SSH Keys | GitHub Help](https://help.github.com/articles/generating-ssh-keys)

で、ハマったところですが、鍵ペアを作って公開鍵を GitHub に登録して、  
`$ ssh -T git@github.com`  
で接続を試みるも Permission denied (publickey). とエラーが出てしまうというもの。

これは、ssh した時に、デフォルトで読みに行く秘密鍵が ~/.ssh/id_rsa だけだからだそうな。   
※ssh-keygen した時の秘密鍵のデフォの名前が id_rsa

参考：[SSHの鍵交換でPermission denied | わーくあうと！](http://nick.hateblo.jp/entry/20111209/1323455748)

ということで、~/.ssh/config ファイルに以下の設定を書けばOK。  
identityFile が読みに行く秘密鍵の設定です。  
（config がない場合は自分で作る）  

```
Host [任意のホスト名]
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/[公開鍵の名前]
  TCPKeepAlive yes
  IdentitiesOnly yes  
```

上記設定を書くと、ssh で指定する接続先は git@github.com ではなく[任意のホスト名]  になるので気をつけましょう。  
`$ ssh -T [任意のホスト名]`  
ですね。

参考：[【メモ】githubの複数アカウントにSSH接続するための設定手順 | Developers.IO](http://dev.classmethod.jp/tool/github-ssh-sub-account-setting/)

<br>
以上！

<br>
追記：

github に対してローカルから clone とかする場合は、

```
$ git clone [任意のホスト名]:[githubのユーザー名]/[リポジトリ名].git
```

になります。  
[任意のホスト名] のところを、https://hoge とか git@github.com とかなんだかとかにしがちですが、そうすると clone できても push とかできなくなるので注意。
VPS 借りたので③　PHP、MySQLの設定メモ

[前々回](https://qiita.com/aki_55p/items/963f15470235e98dc51d)、[前回](https://qiita.com/aki_55p/items/b79942948e32c54b863d)の続きです。

ようやく基本的な設定が終わりまして、その他実行環境の設定です。  
今回もドットインストールを見ながら調べたことのメモです。

- PHPの設定  
  - インストール  
`# yum install php php-devel php-mysql php-mbstring php-gd`  
devel はよくわかんないけど、それ以外はMySQL、マルチバイト文字、グラフィクのライブラリ(?)の模様。  
入れたあとは、php -v でバージョン確認。  

  - 設定ファイルいじる  
/etc/php.ini
いつものごとくバックアップ。.org

  - 設定ファイルの中身  
    - エラーログの場所を /var/log の下に  
`error_log = /var/log/php.log`

    - 日本語環境に  
`mbstring.language = Japanese`

    - エンコーディングをUTF-8に  
`mbstring.internal_encoding = UTF-8`

    - HTTP通信時のインプット文字コードの設定  
`mbstring.http_input = auto`  
※自動変換にするとトラブルの元っていうブログもあってどうしたらいいのか不明

    - 文字コードの自動判別を行う時にどの文字コードから順に確認していくのか  
`mbstring.detect_order = auto`  
※これも自動だとダメっていうのがあったけど不明

    - 参考：[日本語利用の為の設定](http://www.phpbook.jp/install/phpini/index5.html)

    - PHPの情報を公開するかどうか  
`expose_php = Off`  
参考：[知らなかったよ、expose_php | PHPの種 ブログ](http://www.php-seed.net/blog/archives/743)  

    - タイムゾーンの設定  
`date.timezone = Asia/Tokyo`

  - サーバー再起動
`# service httpd restart`

- MySQL の設定  
  - `# yum install mysql-server`

  - 設定ファイルいじる  
/etc/my.cnf  
いつものごとくバックアップ。.org

  - 設定ファイルの中身  
    - UTF-8  環境にする。  
ソース自体はドットインストール自体からコピペ。

  - MySQL の起動  
  `# service mysqld start`

  - セキュリティ周りの設定  
`# mysql_secure_installation`  
ログイン権限とかパスワードとか設定する。  
参考：[ぷちWiki - mysql_secure_installation](http://lightly.wjg.jp/wiki/858)

  - 自動起動  
`# chkconfig mysqld on`  

  - 起動確認  
`# mysql -u root -p`  


これで、サーバの設定からウェブ作るまでのとりあえずの設定は終わった感じかと思われます。  
Ruby とか Python とか node とかは適当に入れるべし。
VPS 借りたので②　Web サーバー設定などメモ

[前回](https://qiita.com/aki_55p/items/963f15470235e98dc51d)の続きです。  
今回もドットインストール見ながら調べたメモ。

- apache インストール&設定  
  - `# yum install httpd`  

  - 自動起動設定  
`# chkconfig httpd on`  

  - 設定ファイルいじる  
/etc/httpd/conf/httpd.conf  
設定ファイルいじるときはバックアップとっときましょう。.org  

  - [設定ファイル]HTTP 応答ヘッダを設定する  
`ServerTokens Prod`  
参考：[Code Life: Apache ServerTokensについて少しだけ理解を深めてみる](http://code-life.net/?p=1985)  

  - [設定ファイル]HTTPレスポンスヘッダに出力されるサーバ情報の制御  
`ServerSignature Off`   
参考：[ServerSignature: HTTPレスポンスヘッダに出力されるサーバ署名の設定](http://apache.bruteberry.com/security/serversignature_off.php)

  - [設定ファイル]Apacheでファイル一覧を表示させないようにする  
`Options -Indexes FollowSymLinks`  

  - 設定がちゃんと通ってるか確認  
`# service httpd configtest`

  - サーバー起動  
`# service httpd start`

- サーバーにファイルを置く  
  - ファイルを置く場所  
/etc/httpd/conf/httpd.conf  
の DocumentRoot に書いてある。  
デフォだと /var/www/html  

  - DocumentRoot の権限設定  
`# chown -R hoge:hoge /var/www/html`  
chown はファイルやディレクトリの所有者を変更するコマンド。所属グループの変更もできる。変更を行えるのは、そのファイルの所有者または管理者だけ。  
chown [-cfhvR] [ユーザー]:[グループ] ファイル  
-R はディレクトリとその中のファイルを再帰的に変更する。

  - FTPクライアント設定  
クライアント次第だけれども、色々パラメータ入れる。  
ちなみに自分は [transmit](http://panic.com/jp/transmit/)でSFTPで接続してます。

- VirtualHost の設定  
  - ディレクトリを作る（dev.example.com っていうサブドメイン想定）  
`# mkdir -p /var/www/dev.example.com/public_html`  
-p (parents) は、サブディレクトリを含んだディレクトリまで一気に作成する。

   - ディレクトリの権限設定  
`# chown -R hoge:hoge /var/www/dev.example.com`  

  - VirtuwlHost の設定ファイル作成  
`# vim /etc/httpd/conf.d/dev.example.com.conf`  
中身はドットインストールのソースコピペ  
```
<VirtualHost *:80>
  ServerName dev.example.com
  DocumentRoot "/var/www/dev.example.com/public_html"
  DirectoryIndex index.html index.php
  ErrorLog /var/log/httpd/dev.example.com_error_log
  CustomLog /var/log/httpd/dev.example.com_access_log combined
  AddDefaultCharset UTF-8
  <Directory "/var/www/dev.example.com/public_html">
    AllowOverride All
  </Directory>
</VirtualHost>
```
  
※2015/03/22 追記  
virtualhost の設定ファイル名は、特にドメイン名と一致させる必要がないので、サブドメを複数運営する場合などは、```virtualhost.conf``` みたいなファイル名にして、全部この中に書いちゃった方が楽ということが判明。  
ちなみに、メインのドメインの設定もちゃんとやっとかなくてはいけない。  
この場合は```example.com```。  

  - Apache の設定変更  
`# vim /etc/httpd/conf/httpd.conf`  
ファイル内の "NameVirtualHost *:80" のところのコメントアウトを外す。

  - あとはDNSサーバーでドメインとIP登録。
  

以上！
Objective-CでHTTP通信（NSURLSession）

Objective-CでHTTP通信するためにNSURLSessionを使ってみました。

参考：https://developer.apple.com/documentation/foundation/nsurlsession

# やりたい事

- HTTP GET
 - 取得するデータは小さいものを想定しています。

# 注意した点

- 取得するデータサイズが小さいのでtaskはNSURLSessionDataTaskを使用しました。
- 処理を単純化させるためにdelegateは使用しませんでした。
- UI関連の処理を想定していないため、delegateQueueは独自に作成しました。
 - NSURLSessionはdelegateQueueに強い参照を持つため、invalidateをしないとメモリリークするので注意が必要です。

# サンプルコード

```objc:YKTHttpClient.h
#import <Foundation/Foundation.h>

@interface YKTHttpClient : NSObject

// Var
@property (nonatomic) NSURLSession        *urlSession;

- (void)getWithUrlString:(NSString *)urlString;

@end
```
```objc:YKTHttpClient.m
#import "YKTHttpClient.h"

@implementation YKTHttpClient

- (id)init {
    NSLog(@"init");
    if (self = [super init]) {
        NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
        sessionConfig.timeoutIntervalForRequest  =  5;
        sessionConfig.timeoutIntervalForResource =  20;

        // 処理を単純化させるためにdelegateは使用しませんでした。
        // UI関連の処理を想定していないため、delegateQueueは独自に作成しました。
        self.urlSession = [NSURLSession sessionWithConfiguration: sessionConfig
                                                            delegate: nil
                                                       delegateQueue: nil];
    }
    return self;
}

- (void)getWithUrlString:(NSString *)urlString {
    NSLog(@"get start");

    NSMutableURLRequest *request = [NSMutableURLRequest new];
    [request setURL            :[NSURL URLWithString:urlString]];
    [request setCachePolicy    :NSURLRequestReloadIgnoringLocalCacheData];
    [request setValue          :@"YKTHttpClient"   forHTTPHeaderField:@"User-Agent"];
    [request setHTTPMethod     :@"GET"];

    // 取得するデータサイズが小さいのでtaskはNSURLSessionDataTaskを使用    
    NSURLSessionDataTask *dataTask
        = [self.urlSession dataTaskWithRequest:request
                                 completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                     NSHTTPURLResponse *httpUrlResponse = (NSHTTPURLResponse *)response;
                                     NSLog(@"Status code: %ld", httpUrlResponse.statusCode);
                                                                
                                     CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)[response textEncodingName]);
                                     NSString *body = [[NSString alloc] initWithData:data encoding:CFStringConvertEncodingToNSStringEncoding(encoding)];
                                     NSLog(@"body : %@...", [body substringToIndex:20]);
                                 }];

    [dataTask resume];
    
    NSLog(@"get end");
}

-(void) dealloc {
    NSLog(@"dealloc");
    [self.urlSession invalidateAndCancel];
}
@end
```
VPS 借りたので①　セキュリティ関係の初期設定メモ

さくらで VPS 借りたので初期設定メモ。  
ドットインストール見ながら調べた。

- yum でパッケージアップデート  
  - `# yum update`  
yum は Linux のパッケージマネージャ。  
rpm との違いは、yum > rpm で、rpm を高機能にしたもの。  
yum の中で rpm 呼んでる。  
参考 [初心者の頃に知っておきたかった rpm と yum の違いと使い分け](http://d.hatena.ne.jp/inouetakuya/20111006/1317900802)

- 日本語化  
  - /etc/sysconfig/i18n ファイルが言語設定ファイル  
`LANG="ja_JP.UTF-8"`

- ユーザー追加 / パスワード設定  
  - `# useradd hoge`  
`# passwsd hoge`  
ちなみにユーザー追加するとホームフォルダは  
/home/hoge  
になる。

- sudo 設定  
  - `# usermod -G wheel hoge`  
wheel というグループは、UNIX系システム上でスーパーユーザー（root）特権を得ることのできるユーザーの属するグループの名称とのこと。  
sudo の設定は visudo コマンドで呼び出せる。  
Allows people in group wheel to run all commands  
の下の行をコメントアウト解除

- 鍵認証  
  - サーバ側に公開鍵保管場所 .ssh を作成。  

  - PC側で鍵生成  
`$ ssh-keygen -t rsa -b 4096 -v -C "your_email@hoge.com"`  
-t  生成する鍵の種類を指定。  
-v  冗長表示モード。ssh-keygen が進行中のデバッグメッセージを表示。  
-b  鍵の長さ。初期値は 2048bit  
特にファイル名やパスは変更しなくてOKだけど、したかったら別途指定する。  
※ [このへん](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)参照

  - scp (Secure CoPy) で公開鍵転送  
```
$ scp ~/.ssh/id_rsa.pub hoge@IP.ADD.RE.SS:~/.ssh/authorized_keys  
//scp [オプション][転送したいファイル名][転送先ユーザ名]@[ホスト名]:[パス]  
```
  ディレクトリを転送したいときは -r オプション（再帰的に実行するオプション）

  - PC 側でRSA読み込み指定  
  `$ ssh -i ~/.ssh/id_rsa hoge@IP.ADD.RE.SS`  
  -i identity  
RSAあるいはDSA認証で読み込まれるprivate keyの書かれたファイルを指定する。デフォルトでは、プロトコル１のときは~/.ssh/identityを読み込み、プロトコル２のときはRSA認証は~/.ssh/id_rsaで、DSA認証は~/.ssh/id_dsa。

  - 複数デバイスからのアクセス  
別デバイスからのアクセスは、都度、アクセスしたいデバイスで鍵ペアを作成。  
公開鍵をサーバ側の .ssh に追加して、authorized_keys に追記。  
`$ cat id_rsa.hostA.pub >> ~/.ssh/authorized_keys`  
ちなみに鍵の名前を id_rsa 以外にする場合は ~/.ssh/config に設定を追加する必要があるので注意。[参考](http://55p.hatenablog.com/entry/2013/10/14/110207)  

  - 簡易アクセス設定  
.ssh フォルダに config ファイルを作成して設定  
詳細は以下  
参考：[sshを公開鍵認証にする（複数ホスト対応）| オデの日記＠WEB系](http://koexuka.blogspot.jp/2011/12/ssh.html)

- パーミッション  
  - 変更 `$ chmod *** ファイル（フォルダ）名`  
*** の部分は、3桁の数字で、左からOwner権限、Group権限、Other権限。  
「4=読み込み許可(r) / 2=書き込み許可(w) / 1=実行・ディレクトリ一覧許可(x)」の数字を足し合わせて指定する。

  - 確認 `$ ls -l`  
-rw-rw-r-- 2  nakamuratou  suri  2194  Dec 23 07:30  personal  
のように表示される。  
左からアクセス権、所有者、所有グループ、サイズ、更新日時、ファイルorディレクトリ名。  
フォルダのサイズ表示がよくわからない（中身の合計値じゃないっぽい）のと更新日時の年表示がないのが気になるけどわからなかった。

- SSH 設定  
  - ポート番号の変更  
デフォルトは22で、1024~65535 の範囲に変更する。  
設定ファイル /etc/ssh/sshd_config をバックアップ、その後編集。
バックアップのファイル名は sshd_config.org がいいんじゃないかな。  
ポート番号のところ探してコメントアウト解除。数字設定。  

  - パスワードログイン禁止  
`PasswordAuthentication no`  

  - ルートログイン禁止  
`PermitRootLogin no`  

  - 再起動  
`$ service sshd restart`  

  - ポートを指定してログイン  
`$ ssh -p YOUR_PORT_NUMBER dotinstall@IP.ADD.RE.SS`

- ファイアウォールの設定  
  - 設定ファイルの作成  
`# vim /etc/sysconfig/iptables`  
中身はドットインストールのソースコピペした。  

  - ファイアウォールスタート  
`# service iptables restart`  

  - ファイアウォールの設定確認  
`# iptables -L (list)`  

  ちなみに iptables は、Linuxに実装されたIPv4用のパケットフィルタリングおよびネットワークアドレス変換 (NAT) 機能（複数のNetfilterモジュールとして実装されている）の設定を操作するコマンドのこと。Netfilterは、いわゆるファイヤウォールやルータとしての役割を果たす。IPv6 用の実装は ip6tables。

- その他  
  - \# は root 、\$ は一般ユーザー  
  - 常に root にする場合 sudo -s


長くなったのでこの辺で！  
次回からはWebサーバーの設定など！
独自マーカーアノテーションを活用する

# 目的
- 独自のマーカー用アノテーションを作成する。
- class・interface・methodに付与されたアノテーションの有無により条件を加える。


# 利用方法
## 1. 独自マーカーアノテーションを作成する
> 参考記事：[ちょっと特殊なJavaのアノテーション](https://qiita.com/kashira2339/items/6450714e42c37b441514)

### アノテーションの対象を指定する:`Target`
- class・interface と method を対象とする。  
[java.lang.annotation.ElementType](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/annotation/Target.html) より **TYPE、METHOD** を選択する。
- **ElementType** を複数選択する場合は、弧`{}`を使用しカンマ`,`で区切る。

```java:SampleAnnotation.java
/**
 * class・interfaceとmethodに付与可能とするアノテーション
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@interface SampleAnnotation {

}
```


### アノテーションの読み込みタイミングを指定する:`Retention`
- 実行時にVMに読み込まれよう指定する。  
[java.lang.annotation.RetentionPolicy](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/annotation/RetentionPolicy.html) より **RUNTIME** を選択する。

```java:SampleAnnotation.java
/**
 * 実行時のVMの読み込みを表すアノテーション
 */
@Retention(RetentionPolicy.RUNTIME)
@interface SampleAnnotation {
	
}
```


## 2. アノテーション付与の有無による条件を加える
### 利用するマーカーアノテーション (1.で作成したアノテーション)
【利用例】 
本アノテーション`@IgnoreSession`が付与されたclass・interfaceまたはmethodは、 
**セッションを扱う処理ではない** ことを表すマーカー用のアノテーションとする。

```java:IgnoreSession.java
/**
 * セッションを扱わない処理であることを表すアノテーション
 * セッションを扱わない処理に付与
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreSession {

}
```

### 判定処理
本アノテーション`@IgnoreSession`が付与されたかの有無を判定する処理を記述する。

#### class・interfaceの検証
`bean` : class・interfaceの実体を表す

1. 通常の場合

	```java:class・interfaceを検証する
	
	// class・interfaceに対する検証
	if (targetClass.isAnnotationPresent(IgnoreSession.class)
	
		// セッションを扱わないclass・interfaceである場合の処理
	}
	```
	
2. spring等のfw使用の場合
springAOPの処理において、検証対象なるbeanの実体がProxyクラスとなる場合があるため、 
②「class・interfaceに対する検証」の前に①「beanに対してProxyクラスであるかを検証」する処理が必要となる。
> 参考記事：[SpringAOPが適用されたbeanを使ったメタプログラミングでハマった件
](https://kamatama41.hatenablog.com/entry/20131202/1385989767)

	```java:class・interfaceを検証する
	
	// ①beanに対してProxyクラスであるかを検証
	Class<?> targetClass = null;
	if (AopUtils.isAopProxy(bean)) {
	   	targetClass = AopUtils.getTargetClass(bean);
	} else {
	   	targetClass = bean.getClass();
	}
	
	// ②class・interfaceに対する検証
	if (targetClass.isAnnotationPresent(IgnoreSession.class)
	
		// セッションを扱わないclass・interfaceである場合の処理
	}
	```



#### methodの検証
`method ` : methodの実体を表す

```java:methodを検証する

// methodに対する検証
if (method.isAnnotationPresent(IgnoreSession.class)) {

    // セッションを扱わないmethodである場合の処理
}
```


# 参考まとめ
- [Java アノテーションに関する基本知識](https://www.qoosky.io/techs/390aad36f8)
- [ちょっと特殊なJavaのアノテーション](https://qiita.com/kashira2339/items/6450714e42c37b441514)
- [SpringAOPが適用されたbeanを使ったメタプログラミングでハマった件
](https://kamatama41.hatenablog.com/entry/20131202/1385989767)
プログラミングと高校数学

## はじめに
数学科を卒業してから10年以上も経過しますが
プログラミングに興味を持ちはじめた古い友人と話しているときに
正直なところ高校数学レベルの知識ってプログラミングに役立つの? 
という話題になったのでそのとき紹介したTipsを書き留めておきます。


## 初歩的な競技プログラミングと高校数学
題材として 初歩的な競技プログラミングの問題を取り上げます。AtCoderの 
 [beginner contest26](https://abc026.contest.atcoder.jp/tasks/abc026_a) の1問目になります。

以下のような内容です。

```
問題文
正の偶数 A が与えられる。

x+y=A となる正の整数 x, y のうち、 x×y が最大となるものを選び、その値を出力しなさい。

入力
入力は以下の形式で標準入力から与えられる。

A
1 行目には、正の偶数 A(2≦A≦100) が与えられる。
出力
x×y の最大値を出力しなさい。 出力の末尾には改行を入れること。

入力例1
10
出力例1
25

x=5, y=5 のとき、 x×y=25 となり、これが最大値となります。
```

熟練プログラマの方でも競技プログラミング慣れていない方（全然普通だと思います) は身構えてしまうかもですが、難しく考えずにまずは全探索する方法を考えるのが競技プログラミングの基本になります。
競技プログラミングと実務で必要とされる力はスコープが違う部分も多いので、できなくてもへこまないことです。村上春樹風に言えば、「完璧なプログラミングなんてない。完璧な絶望がないように」という感じでしょうか。

話を元に戻します。Javaで書きました。(AtCoderでACとなるのを確認済み)

```java
import java.util.Scanner;
  
public class Main {
 
  public static void main(String[] args) {
 
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int max = 0;
       for ( int x = 1; x < n; x++) {
           if ( x * (n -x) > max) {
                 max = x * (n-x);
           }
       }
 
       System.out.println(max);
 
       return;
 
  }
}
```

愚直に1から一つずつ調べ上げていく方法ですね。

## O(n)をO(1)に
このままでも正解となり得点は来るのですが、計算量という観点で見るとO(n)となっています。
つまり、入力サイズ n が増加するにつれて、実行時間が n に比例して増加する　ということです。

実はこの問題 **相加相乗平均** という公式を知っていると、O(1)にすることができます。
入力値がnが常に偶数ならば x=y=n/2 が常に答えとなります。問題文をよく見ると
「正の偶数 A が与えられる。」と書いてありますね！

以下のようになります。

```java
import java.util.Scanner;
 
 
public class Main {
 
 
  public static void main(String[] args) {
 
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       
       System.out.println(n/2 * n/2);
 
       return;
 
  }
 
 
}
```
これでももちろんAC(正解)がきます。
しかも、この場合計算量はO(1)　つまり、nがどんな数字でも実行時間がそれに比例して増加することはありません。模範解答という点ではこちらでしょうか。
実行時間を気にしないプログラムはそんなにないはずなので、実務観点でも興味深い話ではないでしょうか。

## まとめ
実際には、仕事であるいは趣味でプログラミングをする上で、
数学の専門的知識はほとんど必要ないと言えるでしょう。
(そうでないと採用難しい)

しかし、数学は現代においては実学であり、IT社会にいると知っておいて得をすることが多いよ、
というお話です。