OmniAICreator/Qiita-1.07M huggingface dataset:
[Xcode]クラッシュレポートの解析手順備忘録

リジェクト時の.crashの解析について、よく見かけるコマンドを使ってもエラーが返ってきて確認できなかった。

$symbolicatecrash crashlog.crash {AppName}
>Unsupported crash log version: 12 at /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash line 614.

そのため以下手順を備忘録として残しておく。

## 手順
リリースビルドに含まれるアーカイブからビルドを抽出し以下をターミナルでコマンド実行

* Xcode -> Window -> Organizer -> 対象のビルドを右クリック -> Show in Finder -> {AppName}.xcarchiveを右クリック-> パッケージ内容を表示し、.appファイルと./dSYMsを抽出する

```
{buildAppName}.xcarchive/Products/Applications/{AppName}.app
{buildAppName}.xcarchive/dSYMs/{AppName}.dSYM
```

* 抽出した./dSYMより以下コマンドにてUUIDを抽出する

```
$ xcrun dwarfdump --uuid {AppName}.app/Contents/MacOS/{AppName}

> UUID: VVVVVVVV-WWWW-XXXX-YYYY-ZZZZZZZZZZZZ (x86_64) {AppName}.app/Contents/MacOS/{AppName}
```
* .crashファイルから"Binary Image"を検索する

```
Binary Images:
0x10c8d5000 - 0x10c992ff7 +{identifier} (1.0 - 6) <VVVVVVVV-WWWW-XXXX-YYYY-ZZZZZZZZZZZZ> /Applications/{AppName}.app/Contents/MacOS/{AppName}
```

* 得た"0x10c8d5000"をキーに.crashファイルから検索を行う

```
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 {identifier} 0x000000010c95205e 0x10c8d5000 + 512094
1 {identifier} 0x000000010c950e9f 0x10c8d5000 + 507551
2 {identifier} 0x000000010c950f66 0x10c8d5000 + 507750
3 com.apple.AppKit 0x00007fff98c501cb -[NSViewController _sendViewDidLoad] + 97
4 com.apple.CoreFoundation 0x00007fff9b10b3af -[NSSet makeObjectsPerformSelector:] + 239
5 com.apple.AppKit 0x00007fff98bce886 -[NSIBObjectData nibInstantiateWithOwner:options:topLevelObjects:] + 1389
6 com.apple.AppKit 0x00007fff98cd73ca -[NSNib _instantiateNibWithExternalNameTable:options:] + 696
7 com.apple.AppKit 0x00007fff98cd6ffe -[NSNib _instantiateWithOwner:options:topLevelObjects:] + 143
8 com.apple.AppKit 0x00007fff98cd61f6 -[NSViewController loadView] + 272
9 com.apple.AppKit 0x00007fff98c46ae6 -[NSViewController _loadViewIfRequired] + 75
```

以下を抽出。
>0x000000010c95205e 0x10c8d5000


* 下記コマンドにてクラッシュ箇所を特定する。うまくいけばクラッシュしたコードの行番号が標準出力される

```
$ atos -o {AppName}.app/Contents/MacOS/{AppName} -arch x86_64 -l 0x10c8d5000 0x000000010c95205e 

> HogeViewController.fugaMethod() (in {AppName}) (HogeViewController.swift:行番号})
```

## 参考文献
https://gist.github.com/bmatcuk/c55a0dd4f8775a3a2c5a
SSHコマンドでエスケープが必要なときはヒアドキュメントを使うと良い

ヒアドキュメントを使うと、頑張ってエスケープしなくても良い。

```bash

cat <<EOS | ssh -T 192.168.0.4
grep -F '"level":50' /var/log/hoge/hoge.log | wc -l
EOS

```

[trentm/node-bunyan](https://github.com/trentm/node-bunyan)というログツールが使われているシステムでerrorをgrepする際に、errorと出ていないのでえらく苦労するという。。でも、これで出来た♪
naming > argument(引数) | parameter(パラメータ) > 実引数 (actual ...) | 仮引数 (formal ...)

初心者向けの記事を読む中、パラメータと引数という意味で両方とも「引数」とする記事に関してひっかかった。

自分が使ってきた用語を再度思い返すと、スクリプトなどの「実行時引数」としてタグ「runtimeParameter」を使ってきた。これは正しくは「runtimeArgument」なのだろう。

- [パラメータと引数の違い @ いっしきまさひこBLOGさん](http://blog.masahiko.info/entry/2008/05/28/181539)
- [パラメータと引数の違い @ MDSN](https://msdn.microsoft.com/ja-jp/library/windows/hardware/9kewt1b3(v=vs.90).aspx/css)
- [パラメータと引数 @ Life like a clownさん](http://clown.hatenablog.jp/entry/20100819/1282205892)

> 簡単に言うと，関数などの宣言部に記述するものを「パラメータ」，関数を呼び出す際に実際に指定する式や値を「引数」と呼びます

### 追記
(2017/10/22 追記)

@SaitoAtsushi さんに、実引数と仮引数、actual ...とformal ...について教えていただきました。

情報感謝です。
画像を格子状にカットして画像回転してから並べ直す

思いつきで作った。深い意味は無い。

![original.jpg](https://qiita-image-store.s3.amazonaws.com/0/44464/2e1e2800-3ed1-a1f9-6a33-4625120877a8.jpeg)

```python
from PIL import Image
import random

#縦の枚数
xb = 20
#横の枚数
yb = 20

#1枚あたりの横サイズ(px)
bw = 30
#1枚あたりの縦サイズ(px)
bh = 30

#余白
pd = 3

#回転の角度を設定(自動でマイナス分も設定)
dgree = 20

#画像を開く
pic = Image.open('original.jpg')
#アルファチャネルモードに変換
pic = pic.convert('RGBA')

#画像の縦横サイズを取得
[gwidth,gheight] = pic.size

#完成画像用のキャンバスを適切な大きさで用意する
output = Image.new('RGBA', (gwidth+((xb+1)*pd), gheight+((yb+1)*pd)), (255, 255, 255))

#1枚ずつ切り出して処理
for y in range(yb):
	for x in range(xb):
		p = pic.crop((x*bw,y*bh,x*bw+bw,y*bh+bh))
		d = random.randint(dgree*-1,dgree)
		p = p.rotate(d,Image.BICUBIC,expand = 1)
		output.paste(p,(x*bw+(x*pd),y*bh+(y*pd)),p)

#保存する
output.save('output.png')
```

![output.png](https://qiita-image-store.s3.amazonaws.com/0/44464/8929093f-9ccb-1c94-9ec6-b1776cdf7378.png)

プロパティをイジって何度か生成していると絵の表情が変わって面白い

![output.png](https://qiita-image-store.s3.amazonaws.com/0/44464/b2ff8ef4-e40e-ff1e-e79f-e3e3bad7aca7.png)
[備忘録] Django で API サーバー を作るまでの道のり

## 注意
この投稿では、勉強手順のみを記載しています。
ですので、技術的な内容は期待しないでください。

## 何で Django でやるのか？
機械学習系のツールキットはほとんどがPythonです。
で、いざWebアプリに組み込もうとしても、大体のプロジェクトはRailsかGoかJava（Scala）のどれか。
機械学習の成果を利用する段階では大量のデータとか複雑なビジネスロジックはそんなにないので
PythonでWeb API のエンドポイントを簡単に立てられればいいじゃんというところから
とりあえず　flask or Django を 勉強しようというお話に。
で、どうせやるなら Django REST framework 使ってみようと。

## 勉強手順
1. Django ドキュメントを見る
2. Django チュートリアルをやってみる
 - はじめての Django アプリ作成、その 1〜7 までをやる
3. Django REST framework の Tutorial をやってみる
 - Tutorial 1〜7 までをやる

## 感想
これは Django の流儀かもしれないのですが
チュートリアルではいきなり高度なことをやるのではなくて
step by step で少しずつ進めていくやり方になってました。
思ったよりもすごく考えられてていい感じです。

## 参考URL
- https://docs.djangoproject.com/ja/
- http://www.django-rest-framework.org/

## 実際に実装を頑張りたい人向け
- https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8
PHP7をmacOSでビルドしたらエラーになった

phpenv で PHP-7.1.5 をインストールしたらエラーになった。

```
ld: file not found: /usr/lib/system/libsystem_darwin.dylib for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [ext/opcache/opcache.la] Error 1
```

以前はエラーにならなかった。何がきっかけかなのかわからない。

ファイル名から推測するとmacOSのシステムライブラリっぽい。macOS か Xcode のアップデートでファイルがなくなんだろうか。

find で検索したところ `/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/system/libsystem_darwin.tbd` というファイルが見つかった。拡張子が `.dylib` じゃなくて `.tbd` になっている。
テキストファイルなので中を表示すると `libsystem_darwin.dylib` のパスやシンボル名？などが書いてある。
ググってみてもよくわからないがこのファイルがリンクのような役割をしてそうなので `LDFLAGS` でこのディレクトリを教えてやると無事コンパイルできた。

```bash
$ LDFLAGS="-L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/system" phpenv install 7.1.5
```
RailsGuidesのActiveSupportのStringの拡張を読んだ記録

[Active Support コア拡張機能 | Rails ガイド#Stringの拡張](https://railsguides.jp/active_support_core_extensions.html#string%E3%81%AE%E6%8B%A1%E5%BC%B5)
を読んだ感想をだらだら書くよ!

# [String#remove](https://railsguides.jp/active_support_core_extensions.html#remove)

```.rb
"Hello World".remove(/Hello /) # => "World"
```

`"Hello World".gsub(/Hello /, '')` とかよくやりがちなので積極活用する

# [String#squish](https://railsguides.jp/active_support_core_extensions.html#squish)

> squishメソッドは、冒頭と末尾のホワイトスペースを除去し、連続したホワイトスペースを1つに減らします。

```.rb
" \n  foo\n\r \t bar \n".squish # => "foo bar"
```

便利!

# [String#strip-heredoc](https://railsguides.jp/active_support_core_extensions.html#strip-heredoc)

[2.3 から `<<~` で squiggly heredoc に対応している](https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html#here)ので、もはや不要

# [String#titleize](https://railsguides.jp/active_support_core_extensions.html#titleize)

> titleizeメソッドは、レシーバの語の1文字目を大文字にします。

いつか使いそう

そんな感じ
照明をrubyから制御

# 目的
照明(Mi-Light)をRubyから制御できるようにしたいと思います。

# 経緯
### なぜMi-Lightなのか
一般には「Hue」がよく知られていますが、Hueは値段が高く僕みたいな庶民はとても買えないものです。それで比較的に値段がやすいMi-Lightを制御してみようと思います。

Mi-Light・White(２色)タイプ：¥1299
Mi-Light・Colorタイプ：¥3880
Hue・White(２色)タイプ：¥3672
HueColorタイプ：¥7992

Mi-Lightやすい！最高！

### なぜRubyで制御したいのか
一言でいえば一つのWEBページでエアコン・テレビ・照明などを全部制御したいからです。
うちには赤外線学習リモコンがあり、それを使って電子機器を制御しています。

Mi-Light用アプリも赤外線学習リモコンアプリも出ていますが、
エアコン使用する時はリモコンアプリを、照明制御する時はMi-Lightアプリを、蛍光灯はリモコンアプリを起動するのがめっちゃ嫌でした。
まとめて一つのWEBページで制御したい！

以下はうちで実際使用している家電製品・照明を制御するためのWEBページです。
（嫁がすごく喜んで使っています。）
<img width="775" alt="スクリーンショット 2017-11-09 22.00.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/81150/1ec2b127-d40a-336a-3f54-d21401a15b0f.png">

# 準備物
##### Mi-Light・White(２色)タイプ
https://www.amazon.co.jp/gp/product/B01FCWGMNO/ref=oh_aui_detailpage_o00_s00?ie=UTF8&th=1

##### Mi-Light・Colorタイプ
https://www.amazon.co.jp/dp/B075JDN1NF/ref=sspa_dk_detail_4?psc=1

##### 無線LANコントローラ
https://item.rakuten.co.jp/illumica/it_m005/
https://www.amazon.co.jp/gp/product/B00SMFRSLE/ref=od_aui_detailpages00?ie=UTF8&psc=1


# 基本的な使い方
アプリからの使い方やペアリングする方法はここでは省略します。
※「無線LANコントローラ」の説明書に書いてあります。

# コーディング
### Gem追加
```ruby:Gemfile
gem "limitless-led", git: 'git@github.com:begaborn/limitless-led.git'
```

### 実装例
##### Whiteタイプ
```ruby:
light = LimitlessLed::White.new(host: "10.0.1.4", port: 8899)

# 1番目に登録してした電球をオンにする
light.group_1_on

# ２番目に登録してした電球をオフにする
light.group_2_warm

# １段階昼白色にする
light.group_1_cool

# １段階電球色にする
light.group_2_warm

# 明るくする
light.group_1_brightness_up

# 暗くする
light.group_1_brightness_down

# 一番明るくてする
light.group_1_brightness_max

# 一番暗くする
light.group_1_brightness_min

# １番目〜４番目の電球全部をオンにする
light.all_on
```

##### Colorタイプ
```ruby:
light = LimitlessLed::White.new(host: "10.0.1.4", port: 8899)

# 全照明制御
# ペアリングされたすべてのLEDを点灯
light.all_on
# ペアリングされたすべてのLEDを消灯   
light.all_off  
# 色情報は Color::RGB オブジェクトで渡す
light.color(Color::RGB::Red)  
# 明るさ最小
light.brightness(2)   
# 明るさ最大
light.brightness(27)  

# グループの個別制御
group = bridge.group(1) 
# 色情報は Color::RGB オブジェクトで渡す
group.color(Color::RGB::Blue)
# 明るさ最大
group.brightness(2)
```

# 参考したページ
https://qiita.com/athlonz/items/8f108fadd27bda8d0272


以上となります。
数学-三角関数の極限公式の証明

# 三角関数の極限公式

[数学に戻る](eb2ee12608a969cea3e4)

## lim sin x / x = 1

```math
\\
\begin{array}{l}
\lim_{x \to 0} \frac{\sin x}{x} = 1 の証明 \\
\\
半径１で中心角が x ラジアンの扇形に内接する直角三角形と外接する直角三角形から考える。\\
\end{array}
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/4641/33eb2c3a-73e3-0b33-7367-79f5ba1812db.png" width="40%">

<img src="https://qiita-image-store.s3.amazonaws.com/0/4641/2f03a891-c5e1-7d03-c591-24ba30e353e0.png" width="40%">


[弧度法](eb2ee12608a969cea3e4#%E5%BC%A7%E5%BA%A6%E6%B3%95)

```math
\\
\begin{array}{l}
中心角が 0 < x < \frac{\pi}{2} のとき \\
\\
\begin{array}{rl}
1. &扇型に内接する直角三角形の面積（青色の部分） S_1 は、底辺=1、高さ=\sin x より\\
&S_1 = \frac{1}{2} \cdot 1 \cdot \sin x = \frac{\sin x}{2} \\
\\
2. &扇型の面積（青色＋赤色の部分） S_2 は、半径=1 で弧度法より、\\
&S_2 = \frac{1}{2} \cdot 1^2 \cdot x = \frac{x}{2} \\
\\
3. &扇型に外接する直角三角形の面積（青色＋赤色＋黄色の部分） S_3 は、底辺=1、高さ=\tan x より\\
&S_3 = \frac{1}{2} \cdot 1 \cdot \tan x = \frac{\tan x}{2} \\
\end{array}
\\
\\
面積から明らかに、 S_1 < S_2 < S_3 => \frac{\sin x}{2} < \frac{x}{2} < \frac{\tan x}{2} \\
\\
\\
\begin{array}{ll}
\frac{\sin x}{2} < \frac{x}{2} < \frac{\tan x}{2}　&全体に2をかける。\tan x = \frac{\sin x}{\cos x} \\
\sin x < x < \frac{\sin x}{\cos x} &0 < x < \frac{\pi}{2} より \sin x > 0 なので、\sin x で割って \\
1 < \frac{x}{\sin x} < \frac{1}{\cos x} &0 < x のとき逆数をとる \\
\cos x < \frac{\sin x}{x} < 1 &\\
\end{array}
\\
\begin{array}{rl}
\\
(1) &x > 0 のときに各辺に {x \to +0} の極限を取った場合\\
&\lim_{x \to +0} \cos x < \lim_{x \to +0} \frac{\sin x}{x} < 1 \\
&\lim_{x \to +0} \cos x = 1 より、1 < \lim_{x \to +0} \frac{\sin x}{x} < 1 \\
&はさみうちの原理より\\
&\lim_{x \to +0} \frac{\sin x}{x} = 1\\
\\
(2) &X < 0 のときに各辺に{x \to -0} の極限を取った場合\\
& x < 0 より -x > 0\\
&\cos x < \frac{\sin x}{x} < 1 に x = -x を代入して\\
&\cos (-x) < \frac{\sin (-x)}{(-x)} < 1\\
&\cos x < \frac{\sin x}{x} < 1\\
&各辺に{x \to -0} の極限をとると\\
&\lim_{x \to -0} \cos x < \lim_{x \to -0} \frac{\sin x}{x} < 1 \\
&\lim_{x \to -0} \cos x = 1 より、1 < \lim_{x \to -0} \frac{\sin x}{x} < 1 \\
&はさみうちの原理より\\
&\lim_{x \to -0} \frac{\sin x}{x} = 1\\
\end{array}
\\
\end{array}
```

## lim tan x / x = 1

```math
\\
\begin{array}{ll}
&lim_{x \to 0} \frac{\tan x}{x} = 1 の証明 \\
\\
&\lim_{x \to 0} \frac{\sin x}{x} = 1 より\\
\\
&\lim_{x \to 0} \frac{\tan x}{x} \\
&= \lim_{x \to 0} \frac{\sin x}{\cos x} \cdot \frac{1}{x} \\
&= \lim_{x \to 0} \frac{\sin x}{x} \cdot \frac{1}{\cos x} \\
&= 1 \cdot \frac{1}{1}\\
&= 1\\
\end{array}
```

## lim (1 - \cos x) / x^2 = 1/2

```math
\\
\begin{array}{ll}
&\lim_{x \to 0} \frac{1 - \cos x}{x^2} = \frac{1}{2} の証明 \\
&\lim_{x \to 0} \frac{\sin x}{x} = 1 より\\
\\
&\lim_{x \to 0} \frac{1 - \cos x}{x^2} \\
&= \lim_{x \to 0} \frac{(1 - \cos x)}{x^2} \cdot \frac{(1 + \cos x)}{(1 + \cos x)} \\
&=  \lim_{x \to 0} \frac{1 - \cos^2 x}{x^2 (1 + \cos x)} \\
&=  \lim_{x \to 0} \frac{\sin^2 x}{x^2 (1 + \cos x)}　\because \sin^2 x + \cos^2 x = 1 => 1 - \cos^2 x = \sin^2 x \\
&=  \lim_{x \to 0} \left( \frac{\sin x}{x} \right)^2 \cdot \frac{1}{1 + \cos x} \\
&= 1^2 \cdot \frac{1}{1 + 1} \\
& = \frac{1}{2} \\
\end{array}
```
bash > 実行時引数 > --debugがついているかのチェック > ifとechoとgrep 

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

### 概要

bashスクリプト実行時、`--debug`を付けたときだけ別処理をしたい。
例として、4時間30分かかるデータ処理をする前に、１つのファイルだけの処理で完了し、チェックをしたい。

### 参考

https://stackoverflow.com/questions/4467735/how-to-find-substring-inside-a-string-or-how-to-grep-a-variable
> answered Dec 17 '10 at 5:38
dietbuddha

上記のコードを使わせていただく。

### code

```bash:check_runtimeparameter_171016_exec
#!/usr/bin/env bash

TARGET="\-\-debug"  # --debug

if echo $@ | grep -q $TARGET; then
	echo "matched"
else
	echo "no match"
fi
```

```bash
$ bash check_runtimeparameter_171016_exec -parr2 --debug -param1
matched
$ bash check_runtimeparameter_171016_exec -parr2 --debuk -param1
no match
```

### 備考

きちんとした実行時引数の解析の場合は、以下のリンク先などが参考になりそうです。
自分がやりたいことはそこまでのことでないので上記程度で目的は果たせそうです。

関連: [bash によるオプション解析](https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb)
関連: [bashで長いオプション解析をするためのスクリプト](https://qiita.com/nazoking@github/items/1505417824f9541ae632)


### 検索用キーワード
(追記 2018/03/12)

- DEBUG_OPT
    - 自分の実装で使っている変数名
ActiveRecordSerializerのScope

#ActiveModelSerialzerで詰まったところ

## scopeって何?

どうやらデフォルトではcurrent_userらしい。 (devise環境下)

## 場合分け

```ruby
attribute :email, if: :admin?

def admin?
    scope.admin?
end
```
みたいにする

```ruby
attributes :id, :email, if: :admin?
```
だとできなかった。 `if: :admin?` が `{:if => :admin?}` と認識される。

## REST

indexとかshowとかで出力を分けたい時ってどうすればいいんですかね。
ファイル分けるとか？
パーセプトロンの勉強　ANDゲート　NANDゲート　ORゲート

10/16 18:53 
shiracamusさんよりいただいた編集リクエストの部分を訂正しましたｗ
ありがとうございます！！

※復習として、自分はこう解釈しているというものになるので、間違ってるところがあれば指摘お願いしますｗ

参考書はゼロから作るDeepLearning

パーセプトロンとは・・
>複数の信号の(x)入力を受け取り、1つの信号( 1 or 0 )を出力する。


複数の信号 x1,x2 があるとする。
その信号に重みw1, w2 が乗算され その総和がyとして出力される

まとめるとx1w1+x2w2 = y

この時にある限界値（閾値:θ）を超えたときにだけ１が出力される
つまり

**【θ <  y = 1】【θ ≧  y = 0】**

#パーセプトロンを使ってANDゲートについて考える

ANDゲートの真理値表はこんなかんじ

|x1 |x2 |y  |
|:--|:--|:--|
| 0 | 0 | 0 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |

x1,x2が1のときだけ1が出力される

これを表現するためには 重み（w1,w2）と閾値(θ)の値を決めなければならない。

作るのはすごく簡単で(w1, w2, θ)と考える場合(1.1, 2.1, 2.2)で代入すると

x1w1 + x2w2 = y 

【θ　≧　y】 or 【θ　＜  y】
上から当てはめていくと

0*1.1 + 0*2.1 = 0
1*1.1 + 0*2.1 = 1.1
0*1.1 + 1*2.1 = 2.1
1*1.1 + 0*2.1 = 3.2

θ　＝　3.2　なので 2.1以下は0となり
上から
0
0
0
1
となります。

#NANDゲート、ORゲートについて
NANDゲートとは　Not AND を意味しており、AND回路の真逆のゲートになります。
ANDゲートを実現するパラメーターの符号を反転するだけでNANDゲートになるみたいです。

ORゲートとは複数の入力信号の1つが　1 であれば　出力も　1　になります。

つまり簡単に書くと

```
x1 x2 = y
0  0  = 0
1  0  = 1
0  1  = 1
1  1  = 1
```
になります。

適当にパラメータ(w1, w2, θ)を設定してみます

w1 = 0.5　w2 = 0.2　 閾値 = 0

0 + 0     = 0
0.5 + 0   = 0.5
0 + 0.2   = 0.2
0.5 + 0.2 = 0.7

θ < y =  1　という条件なので

上から　
0
1
1
1

#つまり機械学習は・・

今回はパラメータを自分で決めてきたけど、機械学習をさせる場合にはこのパラメータをPCに自動で決めさせる。
適切なパラメータを導き出すために学習モデルを人が与え、PCに決めてもらう・・という解釈であってるはず。

#最後にPython3で実装する
```Perceptron.py
# coding: utf-8

# ANDゲート
def AND(x1, x2):
    w1, w2, theta = 1.1, 2.1, 2.2  # 数値のパラメータは自分で決めている
    y = x1*w1 + x2*w2
    if y <= theta:
        return 0
    elif y > theta:
        return 1

# NANDゲート

def NAND(x1, x2):
    w1, w2, theta = -1.1, -2.1, -2.2  # 数値のパラメータは自分で決めている
    y = x1*w1 + x2*w2
    if y <= theta:
        return 0
    elif y > theta:
        return 1

# ORゲート

def OR(x1, x2):
    w1, w2, theta = 0.5, 0.2, 0  # 数値のパラメータは自分で決めている
    y = x1*w1 + x2*w2
    if y <= theta:
        return 0
    elif y > theta:
        return 1

print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))
print("--------")
print(NAND(0, 0))
print(NAND(1, 0))
print(NAND(0, 1))
print(NAND(1, 1))
print("--------")
print(OR(0, 0))
print(OR(1, 0))
print(OR(0, 1))
print(OR(1, 1))
print("--------")

```
LibreOfficeのCalcで1枚に縮小印刷

* 参考: [LIbreOfficeのCalcで1枚に縮小印刷 - gooブログはじめました！](http://blog.goo.ne.jp/arowana1998/e/e21d85fb85d3f2e4e0013f871a799886)

* LibreOfficeのDrawにて1枚に縮小印刷にできるか調査したが発見できなかった。
* LibreOfficeのCalcでは出来た。

![syosiki.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a63968a9-92aa-f794-58b7-faf9dce92795.png)

![スクリーンショット_2017-10-16_08-54-47.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ecfb062e-cf1d-9ca0-7b8a-ca827622b97b.png)

## その他

* [オブジェクトを回転する - LibreOffice Help](https://help.libreoffice.org/Draw/Rotating_Objects/ja)
* グループ化していると、図形を反転できない
Ruby の Array でまとめて push / unshift

Ruby の配列操作である `Array#push` と `Array#unshift` は複数の引数を取ることが出来ます。

まとめて push

```rb
list = [1, 2, 3, 4, 5]

a = []
b = []

list.each do |n|
  a.push(n)
end

b.push(*list)

p a #=> [1, 2, 3, 4, 5]
p b #=> [1, 2, 3, 4, 5]
```

まとめて unshift

```rb
list = [1, 2, 3, 4, 5]

a = []
b = []

list.each do |n|
  a.unshift(n)
end

b.unshift(*list.reverse)

p a #=> [5, 4, 3, 2, 1]
p b #=> [5, 4, 3, 2, 1]
```


まとめて操作したほうが処理速度も速くなります。

push の比較

```rb
require 'benchmark/ips'

MAX_N = 10000
list = Array.new(MAX_N) { rand(MAX_N) }

Benchmark.ips do |x|
  x.report("#each_push") do
    a = []
    list.each do |n|
      a.push(n)
    end
  end

  x.report("#bulk_push") do
    a = []
    a.push(*list)
  end

  x.compare!
end
```

結果

```console
Warming up --------------------------------------
          #each_push   146.000  i/100ms
          #bulk_push     3.714k i/100ms
Calculating -------------------------------------
          #each_push      1.506k (± 5.2%) i/s -      7.592k in   5.053872s
          #bulk_push     46.680k (±29.7%) i/s -    219.126k in   5.013369s

Comparison:
          #bulk_push:    46679.9 i/s
          #each_push:     1506.5 i/s - 30.99x  slower
```

unshift の比較

```rb
require 'benchmark/ips'

MAX_N = 10000
list = Array.new(MAX_N) { rand(MAX_N) }

Benchmark.ips do |x|
  x.report("#each_unshift") do
    a = []
    list.each do |n|
      a.unshift(n)
    end
  end

  x.report("#bulk_unshift") do
    a = []
    a.unshift(*list.reverse)
  end

  x.compare!
end
```

結果

```console
Warming up --------------------------------------
       #each_unshift   147.000  i/100ms
       #bulk_unshift     1.971k i/100ms
Calculating -------------------------------------
       #each_unshift      1.542k (± 5.4%) i/s -      7.791k in   5.067292s
       #bulk_unshift     23.891k (±27.8%) i/s -    114.318k in   5.113775s

Comparison:
       #bulk_unshift:    23890.6 i/s
       #each_unshift:     1542.4 i/s - 15.49x  slower
```


## 参考サイト

* https://docs.ruby-lang.org/ja/latest/method/Array/i/push.html
* https://docs.ruby-lang.org/ja/latest/method/Array/i/unshift.html
Rustの浮動小数点数テスト


rustでテスト書いている時、f64やf32の数値の一致を確認したいことはありませんか。
浮動小数点数には誤差があり、計算を行っていくうちに誤差が累積していくことから、
厳密なイコールではなく、だいたい等しい事を確認したいことが多いかと思います。

そこで、だいたい等しい事を確認するためのクレート[nearly_eq](https://crates.io/crates/nearly-eq)を作成しました。
（nearly equalではなくて正しくはapproximately equalだというツッコミはやめてください。作ってから気づきました。）

## 使い方

基本的な使い方は次の通り。

assert_nearly_eq!(チェックしたい値, チェックする値);
または
assert_nearly_eq!(チェックしたい値, チェックする値, 誤差);

誤差を入力しなかった場合、f32では1e-6、f64では1e-11、整数では0がデフォルトとなります。


実際は次の様になります。

```rust
#[macro_use]
extern crate nearly_eq;

fn main() {
    assert_nearly_eq!(1f64, 1.5f64, 0.6f64); // does not panic
    assert_nearly_eq!(0f64, 1e-12f64); // does not panic

    assert_nearly_eq!(1f64, 2f64); // panics
}
```

こんな風に配列のチェックも可能です。

```rust
#[macro_use]
extern crate nearly_eq;

fn main() {
    let left = vec![1f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0];
    let right = vec![1f32, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0];
    assert_nearly_eq!(left, right);
}
```

num-complex featureを有効にすると、複素数のチェックも可能

```rust
#[macro_use]
extern crate nearly_eq;
extern crate num_complex;

use num_complex::Complex;

fn main() {
    let left = Complex::new(1.0f64, 0.0);
    let right = Complex::new(1.0f64, 1e-12);
    assert_nearly_eq!(left, right);
}
```

当然組み合わせても問題ありません。

```rust
#[macro_use]
extern crate nearly_eq;
extern crate num_complex;

use num_complex::Complex;

fn main() {
    let left = vec![Complex::new(1.0f64, 0.0), Complex::new(2.0, 0.0)];
    let right = vec![Complex::new(1.0f64, 1e-12), Complex::new(2.0, 1e-12)];
    assert_nearly_eq!(left, right);
}
```

その他、ndarray等にも対応しております。

NearlyEqクレートを実装することにより、どのような引数でも対応できるようになります。

## 最後に
issue/PR募集中です。
herokuにrailsdeploy

# 設定方法

## HerokuCLIインストール

https://airteamlab.jp/posts/819/

上記が詳しい

## gitの登録

### git上でのアカウント認証

```
$ heroku login
Enter your Heroku credentials.
Email: adam@example.com
Password (typing will be hidden):
Authentication successful.
```

### herokuにアプリ作成

既存のアプリがない場合は下記

```
$ heroku create
Creating app... done, stack is cedar-14
https://xxxxxxxxxx.herokuapp.com/ | https://git.heroku.com/xxxxxxxxxx.git
```

### remoteの設定

```
git remote add heroku url
```

上記コマンドで紐づけてもいいが、下記のherokuコマンドでも可能

https://airteamlab.jp/posts/821/

### 環境変数の設定

環境変数を設定しておかないとdeploy時にerrorがでるので先に設定しておく。aws関連の環境変数があったら先にawsの設定をしておいたほうが良い。

### pgの設定

```
remote:        In Gemfile:
remote:        sqlite3
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !     Detected sqlite3 gem which is not supported on Heroku:
remote:  !     https://devcenter.heroku.com/articles/sqlite3
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !    Push rejected to looploop.
remote: 
To https://git.heroku.com/looploop.git
```

sqliteのままdeployすると上記のようなエラーが出てしまう。これはherokuがsqlite未対応のためである。

* アプリにpostgresを追加
* gemfileにpgを追加（productionのみに）
* gemfileでsqliteをdevelopmentに移動

### database.ymlの編集

database.ymlもpg用に書き換えないといけません。

```database.yml
production:
  <<: *default
  adapter: postgresql
  username:
  host:
  database:
  password:
  database: db/production.sqlite3
```

### gemfile

```
group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  # Use sqlite3 as the database for Active Record
  gem 'sqlite3'
end

group :production do
 gem 'pg'
end
```

## デプロイ

```
$ git push heroku master
```

## DBmigrate

```
heroku run rake db:migrate
```
Docker for Azure: AzureでDockerを使う



メモ


## 公式ドキュメント

[Docker for Azure setup & prerequisites | Docker Documentation](https://docs.docker.com/docker-for-azure/)

上記ドキュメントをより効率的にできるように以下にまとめる


## 用語

* Stable channel:
* Edge channel: 

### コンテナ管理ツール

Azureでは、複数のDockerホスト(クラスタ)管理ツールは、以下の3つが使える

* Docker Swarm: 
* Mesosphere DC/OS:
* Kubernetes:


### Service Principal

* Service Principal: Azure APIを呼び出すために使われる

1. ローカル環境にdocker4x/create-sp-azureの最新バージョンをダウンロード

```
docker pull docker4x/create-sp-azure:latest
```

2. sp-azureを以下の引数で実行

```
$ docker run -ti docker4x/create-sp-azure sp-name [rg-name rg-region]
```

* sp-name: 認証アプリの名前。重要じゃない。組織でわかる名前にする
* rg-name: 新しいリソースグループの名前。
* rg-region: Azureリージョン/ロケーションの名前
 * リージョン名はこちらから [Docker for Azure frequently asked questions (FAQ) | Docker Documentation](https://docs.docker.com/docker-for-azure/faqs/#what-are-the-different-azure-regions)


具体例
```
$ docker run -ti docker4x/create-sp-azure sp1 swarm1 japaneast
```

上記を実行するとログインをwebブラウザでの求められるので、表示されたコードを入力する。

```
info:    Executing command login
\info:    To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code XXXXXXXXX to authenticate.
```



## SSH key

下記のカスタムデプロイ次にSSHの公開鍵が必要

```
ssh-keygen -t rsa -b 2048
```

参考: [Azure での Linux VM 用の SSH キー ペアの作成と使用 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/mac-create-ssh-keys?toc=%2Fazure%2Fvirtual-machines%2Flinux%2Ftoc.json)



## Azure でのカスタムデプロイ

* Azureのテンプレートを使ってカスタムデプロイすると、自動で起動する



上記で、無事立ち上がった。
Rubyのブロック、Proc、そしてlambdaについて調べてみた

## 背景
Rubyにおけるブロックはほぼ無意識に使っているのですが、
流石にそろそろLambda何かについても学ぼうかな、と思い、ブロック、Proc、lambdaについて
調べてみた記録です。
同じような説明はすでにQiita内にも溢れていますが、自分の理解を言葉にしてoutputするのも大事だと思っているので作成しました。

## ブロック
### ブロックとは?
メソッドに対する引数として、**値ではなくコードブロックを渡すことができるもの**。
`do |i| ~ end` もしくは `{ |i| ~ }`と表記する。
複数行に渡って記述する場合は`do ~ end`、1行で記述する場合は`{ ~ }`を使うことが多い。
なお、`i`はブロック変数で、ブロック内でしか使用できない変数(ブロック内でスコープが閉じている)

以下はArray#eachメソッドの例

```each.rb
hoge = [1,2,3,4,5]
hoge.each do |fuga|
  p fuga
end
```

**ブロックはメソッドの引数として1つしか与えることができない**。
(というより言語仕様として`do~end`を連続して記述できないといったほうが正しいかも)

## Proc
### Procとは?
一言で言うと、ブロックをオブジェクト化したもの
`Proc.new`の引数にブロックを渡すことで、そのブロックをオブジェクト化できる。

```proc.rb
proc_block = Proc.new { |i| p i }
```

なので、前述のeachは以下のようにも記述できる(けど普通はこの書き方はしない)

```rb
hoge = [1,2,3,4,5]
proc = Proc.new { |i| p i }
## Procオブジェクトを引数として渡す場合は先頭に&を記載する
hoge.each &proc
```

Q: なんでProcオブジェクトをメソッドの引数として渡す時、先頭に`&`をつけるの?
A: (言語)仕様です。

リファレンス
https://docs.ruby-lang.org/ja/latest/class/Proc.html

## Lambda
### Lambdaとは?
ここがまだよく理解できていない。
イメージとしてはJavascriptの無名関数に近い。

Procオブジェクトと似たような働きをするけど、色々違うところがあるらしい。

この記事が参考になるよ！、Lambdaはこう使うとこういう時嬉しいよ！等ありましたら是非お願いします。
テスト自動化が進まない原因を考える

# 概要
私が勤務している職場では、5年くらい前からテスト自動化の話が定期的に出てきて、その都度何らかの対策を行っていますが、
未だにテスト自動化が全く出来ていません。
その原因と対策を考えてみます。

# 前提
- システム担当者は、テスト自動化の必要性・有用性は理解している（はず・・・）
- システム担当以外（営業とか）の人も有用性は理解している（していて欲しいな）
- テスト自動化で確認したい事は、
 - 画面AからCまで遷移できる
 - 自動入力された値がDBに登録されている
 - DBに登録されている値が想定通り

# どんな時にテスト自動化の話が出てきた？
- サイトAに機能追加をしたところ、サイトAでは問題なく想定通りの動作をしていたけど、
いつの間にかサイトBが動かなくなっていたとき。（利用者の問い合わせでサイトBの不具合を知ったとき）
- ブラウザのバージョンアップでサイトが動かなくなっていたが、気が付くまでに数週間要したとき。
- マスタデータの更新を行ったとき。（車の情報、郵便番号、電話番号などのマスタ更新）

# 自動化で使用したツール
Selenium

# 自動化が進まない原因
私が勤務している職場では、下記のような原因が考えられます。

- 一人のエンジニアが複数サイトの案件を同時並行で対応しているため、テストコードの修正まで手が回らない
 - テストコードの修正は、開発期間に考慮されないことが多い
 - 「直ぐに対応出来ないから暇なときに修正しよう」と対応を後回しにすると、時間とともにテストコードの修正が億劫になる。そして放置・・・（私だけかも）
 - 不特定多数の人が1つのサイトに対して修正を行っているので、誰かがテストコードの修正を怠ると、修正が終わるまで待ち状態になり、そして誰もやらなくなる。
- 自動化の必要性は理解しているが、それを運用していくノウハウがない
- テストコードの作成は評価して貰えるが、テストコードの運用は評価して貰えない。
 - テストコードをしっかりと運用しますと言っても、それ当たり前の事だから他の事してと言われる。（それはそうなんだけど・・・）
 - 評価して貰えない事に時間を費やすぐらいなら、評価して貰える別の事に時間を割いた方が良いよね！ってなる。（私だけかも）

 愚痴っぽくなってしまいました。

# どうしたら良いのか（対策）
自動化を試みても定着しない現状と、人力で何とかなってる現状から、私の職場に自動化は必要は無いのかもしれませんが、
どうしたら自動化の導入と運用が定着するか、考えてみました。

1. テストコードの修正が必要な場合は、修正に必要な工数を開発期間として考慮して貰う。
2. ツールでテストを行う範囲（導入するサイトなど）が適切か再考する。
3. テスト自動化の良いところ・悪いところを知り、自社サイトに適したツール・運用方法を導入する
4. テスト自動化について情報収集を行い、社内共有を行いノウハウを蓄積する
5. テストコードの運用についても評価して貰える体制にしたい（個人的要望）


# 今後の予定
まずは、上記の3.と4.について取り組もうと考えています。
やっぱり導入しないって流れるになるかもしれませんが・・・
ElementのValidationの使い方はasync-validatorを参照する

[Element](http://element.eleme.io/#/en-US)はVue 2.0のコンポーネントライブラリです。
様々なコンポーネントが用意されていますが、今回はその中でも[FormのValidation](http://element.eleme.io/#/en-US/component/form#validation)に注目します。
Validation機能は、入力チェックとその結果の表示を簡単にしてくれる便利な機能なのですが、Elementの公式ページにはいくつか例が載っているものの、すべての機能(例えば、typeプロパティに使えるデータ型には何があるかなど)に関しては記載されていません。

# ElementのValidatorの仕様
Elementのソースを見ていくと、Validationを行う部分に関しては[async-validator](https://github.com/yiminghe/async-validator)が使われています。
(2017/10/17追記 よく見たら公式サイトのValidationのところにもちゃんとasync-validatorを参照しろって書いてました)

ElementでのValidationのソースコードは以下のようになります。

```js
<template lang="html">
  <el-row :gutter="20">
    <el-col :span="12" :offset="6">
      <el-form ref="form" :model="form" label-width="120px" :rules="rules">
        <el-form-item label="Name" prop="name">
          <el-input v-model="form.name"></el-input>
        </el-form-item>
      </el-form>
    </el-col>
  </el-row>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
      },
      rules: {
        name: [
          { required: true, message: '入力必須です', trigger: 'blur' },
          { min: 3, max: 5, message: '3~5文字で入力してください', trigger: 'blur' },
        ],
      },
    };
  },
};
</script>

<style lang="css">
</style>
```

ここで、rulesとして定義する部分に、[async-validatorのRules](https://github.com/yiminghe/async-validator#rules)の形式で指定できます。

# async-validatorのRules
## プロパティ

- type
型を定義
    - string(デフォルト)
    - number
    - boolean
    - method
    - regexp
    - integer
    - float
    - array
    - object
    - enum
    - date
    - url
    - hex
    - email
 
- required
trueの場合、必須

- pattern
正規表現のパターンと一致チェック

- min, max
最小と最大を設定し、その間に数や文字数が収まるかをチェック

- len
数や文字数と一致チェック

- enum
typeがenumの時、データがenumの配列の中身のいずれかに一致しているかをチェック

- whitespace
trueの時、空白でもエラーになる

- message
ValidationErrorが発生した場合に表示するメッセージを定義します。

ほかにも少し高度なプロパティがいくつかありますが、詳細は公式を参照してください。

# Elementのプロパティ
triggerはElementのほうで使われるプロパティです。
Validationのタイミングについて設定できます。
`change`を指定するとリアルタイム、`blur`を指定するとフォーカスが外れたタイミングでValidationが行われます。
Ubuntu16.04へのDocker-CE packageインストールメモ

## 前提
### 環境等
* コピペで動くようにコマンドはそのまま貼りつけています。
* Linux初心者向けに書いているつもり。
* 環境は下表の通り。

|            |Name              |Version          |
|:-----------|:----------------:|:---------------:|
|OS          |Ubuntu            |16.04(64bit)     |
|CPU         |Intel® Core™      |i5-5200U         |
|kernel      |Linux             |4.10.0-35-generic|
|GPU         |Intel® HD Graphics|5500U            |
|install_pkg |Docker            |17.09.0          |

### Ubuntuの名前
* Ubuntuのバージョン毎の名前は下表の通り。
    * LTSは長期サポート(Long Term Support)のこと。
    * 詳細は[Ubuntuとは | Ubuntu Japanese Team](https://www.ubuntulinux.jp/ubuntu)を参照。

|Version     |Name     |
|:-----------|:-------:|
|17.04       |Zesty    |
|16.04(LTS)  |Xenial   |
|14.04(LTS)  |Trusty   |

## Dockerのインストール
* [Get Docker CE for Ubuntu | Docker Documentation](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-from-a-package)を参考に、Dockerをインストールします。

### packageのダウンロード
* Ubuntu 16.04(64bit)用のDocker最新版を以下のURLで確認
    * https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/
* 2017/10/15時点では17.09.0が最新版だったので該当ファイルをダウンロード
    * .debファイルはUbuntuへインストールできるパッケージ

```
wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_17.09.0~ce-0~ubuntu_amd64.deb
```

### packageのインストール
* ダウンロードしたパッケージを以下のコマンドでインストール

```
sudo dpkg -i docker-ce_17.09.0~ce-0~ubuntu_amd64.deb
```

### 確認
```
sudo docker --version
```
* 以下のようにダウンロードしたバージョンが表示されればインストール完了

```text:出力
Docker version 17.09.0-ce, build afdb6d4
```

## インストール後の設定
* [Post-installation steps for Linux | Docker Documentation](https://docs.docker.com/engine/installation/linux/linux-postinstall/)を参考に、```sudo```無しで使えるようにする。

### ```docker```グループの作成
```
sudo groupadd docker
```

### ユーザーを```docker```グループへ追加
```
sudo usermod -aG docker $USER
```

### 一度ログアウトする
```
gnome-session-quit --logout --no-prompt
```

### 確認
* ログイン後、```sudo```無しでdockerを利用できるか確認する。
```
docker --version
```

## proxyの設定
* [systemd と Docker の管理・設定 — Docker-docs-ja 1.9.0b ドキュメント](http://docs.docker.jp/engine/articles/systemd.html#http)を参考に、proxyの設定を行う。

### docker.serviceの確認
```
sudo systemctl status docker | grep Loaded
```

* 以下のように出力されるはず

```text:出力
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
```

* しかし、serviceファイルに直接proxy設定を書くのは良くないらしいので、設定ファイルを適切な位置に作成する。

### 設定ファイルの作成
* docker サービス向けの systemd ドロップイン・ディレクトリを作成し、設定ファイルを作成。

```
sudo mkdir /etc/systemd/system/docker.service.d
sudo gedit /etc/systemd/system/docker.service.d/http-proxy.conf
```

```text:http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
```

### 設定ファイルの読み込み
```
sudo systemctl daemon-reload
```

### 読み込み確認
```
sudo systemctl show docker --property Environment
```

* 以下のように出力されればよい

```text:出力
Environment=HTTP_PROXY=http://proxy.example.com:80/
```

### 反映
```
sudo systemctl restart docker
```
ハッシュ化パスワードを生成する

Pythonを使ってUnixのパスワードファイル用のハッシュ化パスワードをコマンドラインから生成する方法.

Python3.3以降でしか動作しません.

ハッシュアルゴリズムはSHA512とする. PythonのcryptモジュールはOSのcrypt(3)に依存するようなので, macOSでは動作しなかった.

```
$ python3.6 -c "import crypt; print(crypt.crypt(input('password: '), crypt.METHOD_SHA512))"
```

参考 https://docs.python.org/3/library/crypt.html
togglebox

レスポンシブでコンテンツ毎にpc/sp時のトグル機能の有効/無効を切り替えたい際に。
使用する場合は必要に応じてresizeイベントで表示を初期化してください。

```
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Document</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
'use strict';
$(document).ready(function() {
    var mediaQueries = [
        window.matchMedia('(max-width: 767px)'),
        window.matchMedia('(min-width: 768px)')
    ];

    // toggle box
    var toggleBoxInit = function() {
        $('[data-togglebox-switch]').each(function() {
            var $this = $(this);
            var data = $this.data('toggleboxSwitch').split(',');
            var $content = $('[data-togglebox="'+ data[0] +'"]');
            $content.show();
            if(mediaQueries[0].matches && data[1] == 'sp') {
                $this.removeClass('is-active');
                $content.hide();
            } else if (mediaQueries[1].matches && data[1] == 'pc') {
                $this.removeClass('is-active');
                $content.hide();
            } else if (!data[1]) {
                $this.removeClass('is-active');
                $content.hide();
            }
        });
    };
    var toggleBox = function($elm) {
        var $switch = $elm;
        var $content = $('[data-togglebox="'+ $elm.data('toggleboxSwitch').split(',')[0] +'"]');
        $switch.toggleClass('is-active');
        $content.slideToggle(200);
    }
    toggleBoxInit();
    $('[data-togglebox-switch]').on('click', function() {
        var data = $(this).data('toggleboxSwitch').split(',');
        var $elm = $(this);
        if(mediaQueries[0].matches && data[1] == 'sp') {
            toggleBox($elm);
        } else if (mediaQueries[1].matches && data[1] == 'pc') {
            toggleBox($elm);
        } else if (!data[1]) {
            toggleBox($elm);
        }
    });

    $('#clear').on('click', function() {
      toggleBoxInit();
    });

});
</script>
</head>
<body>

<dl>
  <dt data-togglebox-switch="togglebox-sp,sp">開閉する(sp)</dt>
  <dd data-togglebox="togglebox-sp">コンテンツ</dd>
</dl>
<dl>
  <dt data-togglebox-switch="togglebox-pc,pc">開閉する(pc)</dt>
  <dd data-togglebox="togglebox-pc">コンテンツ</dd>
</dl>
<button id="clear">初期化</button>

</body>
</html>
```
ネットワークスペシャリストを受けてみた大学生

#ネットワークスペシャリストを受けてみた大学生
大学生でネットワークスペシャリストを受けてみた素直な気持ちで書いてみます。(※プログラムの話は出てきません)

##所有資格
・基本情報処理技術者試験
・応用情報処理技術者試験
・日商簿記2級(関係ない)
・TOEIC 580点

##普段の日常
Andoridアプリの開発を主にしています。たまにサーバのコード見たりはしてますが、ネットワーク関連の知識は皆無です。

##全体の感想
普通に難しかった。実務はない大学生といえど、ある程度はできるだろうと思って申し込みましたが、過去問を解くに連れて、恐ろしいほどできないのを実感しました。確実に落ちましたとさ。

##午前2
午前1は昨年に応用情報を取得していたので免除でしたので、午前2からでした。午前の問題は過去問から出る問題も多く、幅広く浅い知識を持っていれば特にどうってことないと思います。主にネットワーク全般、プロトコル、セキュリティ、サーバ関連の基礎的な知識が問われます。
こちらは実務がなくても大丈夫だと思います。

##午後1
ここらへんから実務に直結していくと思います。まずA社だのB社だのO主任だの色んなステークホルダーが登場してきます。また全問がマーク式ではなく記述式なので自分の考えを述べる必要があります。ただ1問はそれほど大きなものでもなく、冷静に文章を読んでいけば、時折答えが書いてあることもしばしばなので、よく読んだらよかったなと振り返って思います。

##午後2
これがほんとにしんどかったです。とにかく文章が長いし、ネットワーク構成の規模がでかくて全体像を掴むのに苦労しました。また実務も全くやったことがないので、新しい単語が出るわ出るわ。
一応機器の説明とかは記述されているんですが、なんせ初めて聞く機器名言われてすぐに頭に入るわけはないですよね。
それに加えて設問も抽象的で答えは自分の考えとか、こういうときはどうするかとか、なぜこの機器を使用したと思うかとか、自分のイメージや思考を問われている問題が多く出ていました。
やはりこういう部分では実務でやっていた方が、この場面ではこういう対処だなとか、そういう直感が働くと思うので有利だと思います。

##試験を終え
少ないかもしれませんが、約2ヶ月ほど勉強しましたが、全体的に暗記と経験がものをいうといった印象です。確かに大学生では難しいかもしれませんが、自分のPCでネットワークを構築してみたり、パケットキャプチャしてみたり、そういう経験がある人にはそこまで難しくないのかもしれません(私はこれらを全くしませんでした。)
単純に本を見て勉強するよりも自分でやってみる方が、数倍頭にも入るし今後の実務にも活かせると思うので、ぜひ時間がある大学生は挑戦してみてください。
ちなみに私は、自己採点ですが確実に落ちたと思いますので次に向けて頑張ります。

##来春は
データベーススペシャリストを受けようと思います。
素のJavaScript 〜基本編〜

![20170119125519.jpg](https://qiita-image-store.s3.amazonaws.com/0/174017/bc3247f5-8e44-2d5a-1515-cee36fea78fb.jpeg)
# あらゆる要素へのアクセス
メモ的な感じです。

### IDを指定して取得
```js
document.getElementById("foo");
```
### クラスを指定して取得
1ページ複数の要素を取得することとなるので、
リストの形で返ってきます。

```js
document.getElementsByClassName("foo");
```

### タグを指定して取得
1ページ複数の要素を取得することとなるので、
リストの形で返ってきます。

```js
document.getElementsByTagName("foo");
```

### name属性を指定して取得
1ページ複数の要素を取得することとなるので、
リストの形で返ってきます。

```js
document.getElementsByName("bar");
```

## 要素の親子兄弟を指定して取得
※`li`は複数存在する想定

```html
<ul>
  <li>テスト01</li>
  <li>テスト02</li>
  <li>テスト03</li>
  <li>テスト04</li>
  <li>テスト05</li>
</ul>
<script>
var element = document.getElementsByTagName("ul");
</script>
```
### 親要素の指定
```js
element[0].parentNode;
```

### 子要素の指定
```js
element[0].childNodes;
```

### 子要素の一番目の要素の指定
```js
element[0].firstChild;
```

### 子要素の最後の要素の指定
```js
element[0].lastChild;
```

### 兄要素の指定
```js
element[0].previousSibling;
```
### 弟要素の指定
```js
element.nextSibling;
```

## 要素リストから要素を取得
```html
<ul>
  <li>テスト01</li>
  <li>テスト02</li>
  <li id="test3">テスト03</li>
  <li>テスト04</li>
  <li>テスト05</li>
</ul>
<script>
var element = document.getElementsByTagName("li");
</script>
```
### 要素の数を取得
```js
element.length; // 5
```
### `id`が`test3`の要素を取得
```js
element.test3 // 結果 ： <li id="test3">テスト03</li>
```
### リストの4番目の項目を取得
```js
element.item(3); // 結果 ： <li>テスト04</li>
```

## `li`の中の`id`が`test3`のスタイルを変更。（背景：黄色、テキスト：赤色）
```js
element.test3.style.backgroundColor = 'yellow';
element.test3.style.color = 'red';
```
![スクリーンショット 2017-10-16 1.45.45.png](https://qiita-image-store.s3.amazonaws.com/0/174017/71e35c2f-f3b0-995c-62ba-cea8810da0ae.png)
二次方程式の実数解と虚数解の割合

```math
ax^2 + bx + c = 0
```
の実係数a,b,cを乱数(-2,147,483,648 ～ 2,147,483,647)で発生させ
実数解と虚数解の割合を計算しました。

10,000,000回計算した結果
実数解:6272888(62.72888%)
虚数解:3727112(37.27112%)
二重解:0(0%)

なぜ、この割合なのかを数学的に証明できたらと思っています。

以下にソースコードの一部を掲載します。

```csharp
private void abc_r_2()
        {
            decimal a;
            decimal b;
            decimal c;
            decimal d;

            byte[] bs = new byte[4];
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

            int m = 0; //重解 multiple root
            int r = 0;
            int i = 0;

            decimal total = 10000000;
            int n = 1;

            for (int x = 0; x < total; x++)
            {
                do
                {
                    rng.GetBytes(bs);
                    //Int32に変換する
                    a = BitConverter.ToInt32(bs, 0);
                    //a = -1;
                } while (a == 0);

                rng.GetBytes(bs);
                //Int32に変換する
                b = BitConverter.ToInt32(bs, 0);

                rng.GetBytes(bs);
                //Int32に変換する
                c = BitConverter.ToInt32(bs, 0);

                d = b * b - 4 * a * c;

                if (d == 0)
                {
                    m++;
                }
                else if (d > 0)
                {
                    r++;
                }
                else
                {
                    i++;
                }
            }

            
            decimal m_p = m * 100 / total;
            decimal r_p = r * 100 / total;
            decimal i_p = i * 100 / total;

            Invoke(new dldl(delegate
            {
                textBox1.AppendText("実数解:" + r.ToString() + "(" + r_p.ToString() + "%)" +
                                    "虚数解:" + i.ToString() + "(" + i_p.ToString() + "%)" +
                                    "二重解:" + m.ToString() + "(" + m_p.ToString() + "%)" + Environment.NewLine);
                button1.Enabled = true;
            }));
        }
```
画像投稿を可能にするgem carrierwave

gem 'carrierwave'

ruby on railsでは、トップページにコンテンツを投稿する機能があります。その際に文字だけでなく画像も投稿できるようにするgemがあります。それが carrierwaveです。

ー完成予想図ー

トップページに画像を投稿できるようにします。

〜完成予想図ートップページ
![スクリーンショット-2017-02-01-22.43.38.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/e7085d2f-43a0-7684-250e-b654b48f6cd4.gif)







〜完成予想図ー投稿画面

![2f20765252c23641a76f28031434428b_f244100080d705ad91f18193adaf33e0 (1).gif](https://qiita-image-store.s3.amazonaws.com/0/147990/648104a4-411c-fc59-6d47-473858494338.gif)




投稿画面の「ファイルを選択」のボタンから、自分のパソコンにある画像データを選び、投稿できます。

上の場合だと、ワインの画像です。



ープログラミング書き方ー

まず、gemのcarrierwaveをインストールします。

いじるファイル名　Gemfile

gem 'carrierwave'と入力

[ruby] gem 'carrierwave' [/ruby]
ターミナルでbundle installと書き、enterを押します。

いじる場所　ターミナル

bundle installと入力

[ruby] $bundle install [/ruby]
下のようにbundle complete!と出れば成功です。



[ruby] Bundle complete! 29 Gemfile dependencies, 94 gems now installed.

Use 'bundle show [generate]' to see where a bundle_gem is installed. [/ruby]




次に画像の保存形式を指定するためのアップローダーというファイルを作成します。

そのファイルの中で画像の保存形式（jpegやgif等）や画像の大きさの許容範囲を決定できます。

いじる場所　ターミナル

アップローダー作成構文

rails g uploader （任意のファイル名）

ここでは例として、rails g uploader Frontcoverとします。ファイルの最初の文字は大文字にしましょう。

そうすると、create app/uploaders/frontcover_uploader.rbと出て、sublime textの中で、アップローダーファイルが作成されます。このファイルの中で保存形式等をいじることができます。

では次に、テーブルをいじりましょう。テーブルの中に画像を保存するためのカラムを追加しましょう。これがないと画像が保存できません。すでに作ってある場合は追加しなくて大丈夫です。

いじる場所　ターミナル

カラム追加構文

rails g migration add_（任意のカラム名）_to_（任意のテーブル名）（任意のカラム名）:（任意のカラムの型）



では、ターミナルでrails g migration add_frontcover_to_comic frontcover:stringと書いて、enterを押します。

さらに、次の行でrake db:migrateと書いてenterを押します。

[ruby]$rails g migration add_frontcover_to_comic frontcover:string
$rake db:migrate[/ruby]
上の例だとfrontcoverがカラムでcomicがテーブルです。

そのあと、画像データがあるモデルに以下のように追記しましょう。

今回はfrontcoverというカラムはcomicモデルの中にあります。

いじるファイル名　（任意のモデル名）.rb

アップローダー追加構文

mount_uploader :（任意のカラム）,(任意のカラム名）Uploader

[ruby]mount_uploader: frontcover, FrontcoverUploader[/ruby]
２つ目のカラム名の最初の一文字目は大文字にしましょう。長いカラム名の場合は、上のFrontCoverのように大文字が２つになることもあります。

これで投稿した画像データをテーブルに保存できるようになりました。最後に、画像を投稿する画面と画像をページに出力する画面を作成しましょう。

まずは投稿画面です。

いじるファイル名　new.html.erb

投稿画面はform_forを使います。

[ruby]<%=form_for @comic do |f|%> 
       <div class="field">
        <%= f.text_field :title placeholder:"作品タイトル" %>
        <%= f.text_field :author placeholder:"著者" %>
        <%= f.file_field :front_cover placeholder: "表紙" %>
        <%= f.submit "投稿する"　%>
       </div>
      <% end %> [/ruby]
上記のように書くと、画像ファイルを選んで投稿という動きができるようになります。

次に、投稿された画像をトップページに表示されるようにしましょう。

基本的にトップページをいじる際は、indexをいじることにになります。

いじるファイル名　index.html.erb

画像表示構文

image_tag （任意のテーブル名）.（任意のカラム名）.to_s

[ruby]<% @comic.each do |comic| %>
 <tr>
  <td><%= image_tag comic.front_cover.to_s %></td>
  <td><%= comic.title %></td>
  <td><%= comic.author %></td>
 </tr>
<% end %>[/ruby]
このようにすることで保存した画像データをトップページに出力することができます。

上記の例では、画像以外にも、タイトルや著者の名前も出すようにしています。



投稿画面で画像をトップページに投稿できるようになります。



![スクリーンショット-2017-02-01-22.43.38.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/43bea6c4-1b4f-6b40-dd13-14a13938b194.gif)
GITでオートデプロイ

まずローカルとリモートを用意しよう。
リモート（＝本番）
masterにプッシュしたら自動反映つまりオートデプロイする。

```
cd /var/www
sudo mkdir test.git
cd test.git
git init --bare --shared
```

ローカルにレポジトリを作って
コミット
そして

```
ssh://192.138.33.99/var/www/test.git
(git remote add origin ssh://192.138.33.99/var/www/test.git)
```

リモートにプッシュしよう
本番に戻ってローカルからプッシュしたやつをクローンする

```
mkdir /var/git
cd /var/git
git clone ssh://192.138.33.99/var/www/test.git
```

シンボリックリンクを張ろう

```
ln -s /var/git/test/html /var/www/html
```
そしてhooksしよう
```
cd /var/www/test.git/hooks
vi post-receive
```
中身は

```
cd /var/git/test
git --git-dir=.git pull
```

これで行ける。
間違いない。
redux-sagaの覚書


## タスクという概念をReduxに持ち込むための支援ライブラリ
* タスクとはプロセスのような独立した実行単位
* それぞれが別々に並行して動作する

## redux-sagaがしてくれること
* タスクの実行環境を用意する
* 非同期処理をタスクとして記述するための道具たてである作用と非同期処理を同期的に書き下す手段も提供してくれる

## 作用(Effect)とは
* 非同期処理を同期的に書き下す手段
* タスクを記述するためのコマンドのようなもの

## 一覧
* select: Stateから必要なデータを取り出す
* put: Actionをdispatchする
* take: Actionを待つ、イベントの発生を待つ
* call: Promiseの完了を待つ
* fork: 別のタスクを開始する
* join: 別のタスクの終了を待つ

## 3つのTake
* take
* takeEvery
	- dispatchされたら毎回実行。複数取得にも対応
* takeLatest
	- 最後の1回のみ実行される。前回のが実行中でもキャンセルされる

## ES6のGenerator
* 任意の時点で処理を中断/再開することができる関数」
* 一般的にはコルーチン(coroutine)と呼ばれるものでサブルーチン(通常の関数)を一般化したもの

### 3つのキーワード
* Generator Function
    * 処理の中断/再開が行われる特殊な関数
     * function* generatorFunction(){}のようにfunction*を使って定義する

* Generator Object
  * 中断された処理を再開したり、値を取得し対するオブジェクト
  * var generatorObject = generatorFunction()のように取得する

* yield
  * Generator Functionの中で使われる処理の中断を指定するキーワード
ABテストでコンテンツを出し分けるphpテスト

AB二種類だけならもっとシンプルで良いと思いますが、微妙に表示が違うページをいくつも用意する必要があって作ったサンプルのメモです。
静的サイトでgulp使えるならEJSなどを使用した方が楽だと思います。。。

```ruby:inc_setting.php
<?php
// 共通変数
$params = array (
  'name' => basename(__DIR__), // デフォルトのページ固有名はディレクトリ名
  'title' => 'ほげほげ',
  'description' => 'ふがふが'
);

// ボタン 挿入関数 ※引数で id,class を指定可
$inc_btn = function($btn_id = null, $btn_class = null) {
    include '/include/inc_btn.html';
};
?>
```

```ruby:inc_template.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title><?php echo $params['title'] ?></title>
<meta name="description" content="<?php echo $params['description'] ?>">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="viewport" content="width=device-width">
</head>
<body class="<?php echo $params['name'] ?>"><!-- ページ固有名classが付加される※cssでデザインを変える場合に利用 -->

<?php $inc_btn('hoge01','mgt20 mgb20') ?><!-- コンポーネントのボタンhtmlを表示 -->

<?php if ($params['name'] == 'page_a') { ?><!-- ページ固有名が「page_a」の場合に表示 -->
<p>Aのコンテンツ</p>
<?php } ?>

<?php if ($params['name'] == 'page_b') { ?><!-- ページ固有名が「page_b」の場合に表示 -->
<p>Bのコンテンツ</p>
<?php } ?>

</body>
</html>
```

```ruby:inc_btn.html
<?php
$btn_attr_htm = null;
if (!empty($btn_id)) {
    $btn_attr_htm  = ' id="'. $btn_id .'"';
}
if (!empty($btn_class)) {
  $btn_attr_htm  = $btn_attr_htm.' class="'. $btn_class .'"';
}
?>
<p<?php echo $btn_attr_htm; ?>><a href="#btn" class="btn">inc_btn</a></p>
```

```ruby:/page_a/index.html
<?php
require_once('inc_setting.php');

// ページ固有の設定はここから上書き
//$params['name'] = 'hoge'; // ディレクトリ名以外の固有名を付ける場合
//$params['title'] = 'hoge'; // title
//$params['description'] = 'hoge'; // description

// html読み込み
require_once ('inc_template.html');
?>
```

```ruby:/page_b/index.html
<?php
require_once('inc_setting.php');

// ページ固有の設定はここから上書き
//$params['name'] = 'hoge'; // ディレクトリ名以外の固有名を付ける場合
$params['title'] = 'Bのページ'; // title
$params['description'] = 'Bのページです'; // description

// htmlを表示
require_once ('inc_template.html');
?>
```

htmlコンポーネントパーツを呼び出す関数を inc_setting.php に入れていますが、パーツが多い場合はファイルを分離した方がいいと思います。

以上、ありがとうございました。
phpで問題を解いてみた【5】

#問題
あなたが投票するかもしれない党をおみくじ形式でだそう。



#自分なりの回答

```php
<?php
// Here your code !
$tou = array();
$tou[0] = "Ji党";
$tou[1] = "Ki党";
$tou[2] = "Ri党";
$tou[3] = "Ky党";
$tou[4] = "Ko党";
echo "あなたは".$tou[rand(0,count($tou) - 1)]."に投票するかもしれません。";
?>



```


#まとめ
rand関数を使ってみたかっただけです。なかなか使う機会がないものでね。
他のブックから、VlooKupでそれぞれのシートへデータを拾い上げる

風邪気味なんですいません。
走り書きですが参考になれば宣言してない変数もあったりして....

Sub test()
'データシート
Dim wb As Workbook
Dim ws As Worksheet
Dim RG As Range

'データを吸い上げる集計ブック
Dim mb As Workbook
Dim ms As Worksheet
'集計ブックのシート名が次々変えられるように
'シート名を変数に収める
Dim shname(5) As String, i As Long
shname(1) = "メイン１"
shname(2) = "メイン2"
shname(3) = "メイン3"
shname(4) = "メイン4"
shname(5) = "メイン5"
'vlookupように変数宣言
Dim x As Long
Dim y As Long
Dim c As Long
Dim e As Long
Dim n As Long

'検索先のブックを宣言
Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & "やさい.xlsx")
Set ws = wb.Worksheets("受注一覧")
Set RG = ws.Columns("A:E")
    
'独自の検索キーを割り当てるための操作
’１列目の重複個数を拾い上げ、１列めの番号と重複の個数でユニークなキーをつくる
For Z = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
ws.Cells(Z, 7) = Application.WorksheetFunction.CountIf(Range(ws.Cells(2, 1),
ws.Cells(Z, 1)), ws.Cells(Z, 1))
ws.Cells(Z, 6) = ws.Cells(Z, 1)
Next
        For t = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
            ws.Cells(t, 1) = ws.Cells(t, 6) & ws.Cells(t, 7)
        Next
    
For i = 1 To 5
    Set mb = ThisWorkbook
    Set ms = mb.Worksheets(shname(i))
'データシートで６列目に移動したデータから顧客番号の個数を検索して集計ブックの各シートに
'保存。もともと各シートに振られた顧客番号とこの個数をキーにして検索をかける
    ms.Cells(1, 2) = Application.WorksheetFunction.CountIf(ws.Range("F:F"), ms.Cells(1, 1))
    '******************************
    e = ms.Cells(Rows.Count, 1).End(xlUp).Row + 1
        For c = 1 To ms.Cells(1, 2)
        ms.Cells(e, 1) = ms.Cells(1, 1) & c
        e = e + 1
        Next
            s = ms.Cells(Rows.Count, 2).End(xlUp).Row + 1
            For n = 2 To ms.Cells(Rows.Count, 1).End(xlUp).Row
            ms.Cells(s, 2) = Application.WorksheetFunction.VLookup(ms.Cells(n, 1), RG, 2, 0)
            ms.Cells(s, 3) = Application.WorksheetFunction.VLookup(ms.Cells(n, 1), RG, 3, 0)
            ms.Cells(s, 4) = Application.WorksheetFunction.VLookup(ms.Cells(n, 1), RG, 4, 0)
            ms.Cells(s, 5) = Application.WorksheetFunction.VLookup(ms.Cells(n, 1), RG, 5, 0)
            s = s + 1
            Next
            ms.Columns(1).Hidden = True
Next
End Sub
phpで問題を解いてみた【4】

#問題
1歩でぴったりaセンチメートル歩ける。
bセンチメートルの区間を歩くのに最小で何歩歩く？
なお、区間はオーバーしても良い。



#自分なりの回答

```php
<?php
// Here your code !
function hosu($ippokyori){
    $ippokyoritemp = explode(' ',$ippokyori);
    $ippo = $ippokyoritemp[0];
    $kyori = $ippokyoritemp[1];
    $hosuu = 0;
    do{
        $kyori = $kyori - $ippo;
        if(0 >= $kyori){
            if($ippokyoritemp[0] <= $ippokyoritemp[1]){
                $hosuu = $hosuu + 1;
            }
            break;
        }
        $hosuu = $hosuu + 1;
    }while(1);
    return $hosuu;
}
var_dump(hosu("2 5"));
?>


```


#まとめ
いままで解いた問題を気が向いたら一気に投稿したい。。。
簡単な問題は前回投稿でも書いたけど、簡単な問題はいろいろな方法で解いたら勉強になりそうなものだが
1回解いたら割りと満足しちゃう・・・
phpで問題を解いてみた【3】

#問題
フィボナッチ数列出力



#自分なりの回答

```php
<?php
// Here your code !
function fivonachi($target){
    $i = 1;
    $y = 0;
    $r = 1;
    $answer = 0;
    if($target < 2){
        return $target;
    }
    do{
        $answer = $y + $i;
        $y = $i;
        $i = $answer;
        $r = $r + 1;
    }while($r <> $target);
    return $answer;
}
var_dump(fivonachi(1));
?>


```


#まとめ
今回は1つのパターンのみですが、いろいろな方法で書くのも面白いですね。