OmniAICreator/Qiita-1.07M huggingface dataset:
Refactoring used of map in Ruby

# Refactoring used of map in Ruby

## Overview
This is topic for practice in English, so Please don’t expect too much. 
I used to write a each, when I just started ruby programming.
but I recently write map to refactor my source. 
I write for that matter.
## Version
ruby 2.3.1

##  comparison each with map
Let's comparison each with map.
This is the most pupuler way of writing which use each.

```ruby:each
[1, 2, 3, 4, 5].each do |e|
  puts e
end
```
```console:output
1
2
3
4
5
```

This is the most pupuler way of writing which use map.

```ruby:map
[1, 2, 3, 4, 5].map{ |m| puts m }
```

map's output is same as each.

```console:output
1
2
3
4
5
```

## Refactoring used of map
This is bad smell, you should replace each with map.

```ruby:each
hoge = []
[1, 2, 3, 4, 5].each_with_index do |e, i|
  hoge[i] = e * 100
end
```

This is code replaced with map. 
It be elegant dosen't it?

```ruby:map
hoge = [1, 2, 3, 4, 5].map{ |m| m * 100 }
```

I blieve if you use map, it will lead to be readable and reduce amount of your sorce.
にわか、31歳にしてプログラマーを目指す

##自己紹介
年齢：31歳
性別：男
趣味：読書、オンラインゲーム(LoL)

##今までやってきたこと
- 仕事的な事
 - 自衛官
 - 牧夫
 - 営業マン
 - 無職　←　いまここ
 
- 趣味的な事
 - DJ
 - ボクシング
 - 柔道
 - 釣り

##なぜ、プログラマーになろうと思ったのか？
思い起こせば、あれは陸上自衛官であったある日のこ(ry

1. 響きがかっこいい
2. 仕事するとき スーツ or 制服 じゃないから
3. 競馬予想ソフトが作りたい

##Qiitaの使い方
覚えが悪いのでアウトプットのため
ふとした疑問などを諸先輩方からご教授を頂くため


##今後の予定
先月、営業マンを辞したので4月からの職業訓練にてICT科を受講(予定)
そして、2019年秋季の基本情報技術者の資格取得
人生100年時代ならまだ間に合う！！はず

##おねがい
色々と頓珍漢な記事を上げるかもしれませんがお許しください
そして、いろいろな方と出会い素晴らしい刺激を頂ければと存じます。
Visual Studio 2017でmakefileプロジェクトを作成してbuildする

ソフトはlinuxで作成しているがVisual StudioのIntellicenseが使いたいと思い調べていたら、できそうだったので記載する。

-準備
[この記事](https://qiita.com/mt08/items/e6d6179335d6653ebb89)内容を確認しておく

#プロジェクト作成
下記手順で適当なmakefileプロジェクトを作成する。
「ファイル>新規作成>プロジェクト>Visual C++>クロスプラットフォーム>Linux>メイクファイルプロジェクト」
作成したらmain.cppとmakefileを追加する。文字コードはUTF-8(BOMなし)にすること。

```main.cpp
#include <iostream>

int main() {
	std::cout << "Hello world" << std::endl;
	return 0;
}
```

```make:Makefile
all: main.o
	g++ -o main main.o

main.o: main.cpp
	g++ -c -g -O0 main.cpp

clean:
	rm -f main main.o
```

#Intellicense設定
下記の設定の。更新を押し、linuxのヘッダーをダウンロードする。
「ツール>オプション>クロスプラットフォーム>接続マネージャ>リモートヘッダー IntelliSenseマネージャー」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207883/0c2a550a-5786-10d4-f735-14a67161870f.png)
ダウンロード後、探索を押すと、ダウンロードしたパスが開く。
そこにあるcpp_includes.txt内のパスを下記インクルードの検索パスに入力すると、Intellicenseが有効になる。
**※Version 15.9.7ではIntellicenseが効かないバグがある模様**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207883/ea8b3fc9-0ff9-b662-3456-d1e403dc151a.png)

#ビルド実行
リモートビルドの各項目に下記を記載する
ビルドコマンドライン
cd \$(RemoteRootDir)/\$(ProjectName);make
すべてリビルドコマンド
cd \$(RemoteRootDir)/\$(ProjectName);make clean;make
クリーンコマンドライン
cd \$(RemoteRootDir)/\$(ProjectName);make clean
出力
/home/a/projects/Project1/main

出力は本来は下記の記載で問題ないはずだが、Version 15.9.7ではエラーが出るため、linuxのパスを直接記載する。
\$(RemoteRootDir)/\$(ProjectName)/main
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207883/0329e109-66e5-a972-18ee-43a56337df07.png)

下図の様に記載したら、buildを実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/207883/605491b9-b2d9-e441-7689-472dedc75c6b.png)

ブレークポイントを置いて、buildを実行し成功すると下図のようになります。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/207883/1a9b89f8-2f49-526a-a3c6-1e359bbf122a.png)
CS193p class note - 3 Swift programming language

###### Memo:
1. There is a global function that will create a CountableRange from floating point values.

```Swift

for i in stride(from: 0.5, through: 15.25, by: 0.3) {   
}
```

###### Tuple:
1. It is nothing more than a grouping of values. You can use it anywhere you can use a type.
2. You can use tuples to return multiple values from a function or method

###### Computed properties:
1. The value of a property can be computed rather than stored.
2. "set" is optional. You can create a read-only computed property and you don't need to specify the keyword "get".
3. Lots of times a "property" is derived from other state. That's why we use computed properties.

###### Access control:
1. internal: this is the default, it means "usable by any object in my app or framework"
2. private: this means "only callable from within this object"
3. private(set): this means "this property is readable outside, but not settable"
4. fileprivate: accessible by any code in this source file
5. public: (for framework only)this can be used by objects outside my framework
6. open: (for framework only)public and objects outside my framework can subclass this.

###### Extensions:
1. You can add methods/properties to a class/struct/enum even if you don't have the source.
2. The properties you add have no storage associated with them (computed only)
3. You can't re-implement methods or properties that are already there (only add new ones)

###### Enum:
1. It can only have discrete states
2. An enum is a value type, so it is copied when it is passed around.
3. Each state can (but doesn't have to) have its own "associated data".
4. When you set the value of an enum you must provide the associated data (if any).
5. Swift can infer the type on one side of the assignment or the other (but not both).
6. An enum's state is checked with a switch statement.
7. If you don't want to do anything in a given case, use "break".
8. You must handle all possible cases (although you can default uninteresting cases).
9. Each case in a switch can be multiple lines and does not fall through the next case. 
10. Associated data is accessed through a switch statement using "let syntax"
11. An enum can have methods and computed properties but no stored properties
12. "mutating" keyword is required because enum is a value type.

###### ARC (Automatic Reference Counting):
1. Reference types (classes) are stored in the heap. The system "counts reference" to each of them and when there are zero references, they get tossed automatically. This process is known as "Automatic Reference Counting" and it is not garbage collection.
2. You can influence ARC by how you declare a reference-type var with these keywords: strong, weak, unowned
3. strong: normal reference counting
4. weak: weak means "if no one else is interested in this, then neither am I, set me to nil in that case". We usually use weak in IBOutlet and delegate.
5. unowned: "don't reference count this. Crash if I am wrong". This is very rarely used. Usually only to break memory cycles between objects.
VirtualBox/Vagrant上で立てたサーバーに外部からアクセスする

# やりたいこと
`rails s`や`yarn serve`などでサーバーを立てた後、iPhoneなどからアクセスして、スタイルなどを確認したい。

# 環境
ホストOS: Windows10
ゲストOS: CentOS

今回はiPhoneからアクセスします。

# 手順
## WindowsとiPhoneを同じWi-Fiに接続する
同じSSIDのWi-Fiにつなぎます。
この時にipアドレスを調べておきます。
私の場合は192.168.11.xxxでした。

## Vagrantfileを書き換える
:public_networkを使って外部からアクセスできるようにします。

```..Vagrantfile
# 下記を記入(xxxは任意の数値)
config.vm.network :public_network, ip: "192.168.11.xxx", bridged: "en1: Wi-Fi (AirPort)"
```

# アクセス方法
iPhoneでブラウザを開き、検索欄に`192.168.11.xxx:yyyy`を記入すればアクセスできるようになります。

# さいごに
ip打たなきゃいけないのは面倒ですが、とりあえずスタイルの確認等はできるようになったので良かったです。
ほかにいい方法もあるとは思いますが…

# 参考
[[Vagrant & VirtualBox] Vagrant: 同じLAN内の端末から仮想マシンにアクセスする](https://www.d-wood.com/blog/2014/06/13_6344.html)
[Vagrant(VCCW)のゲスト側に他の端末からアクセス出来るようにした](https://blog.daisukekonishi.com/archives/1766)
Amazon Linux 2 に SVN インストール

Amazon Linux 2 に SVN と Apache をインストールしてみました。
セキュリティ的に脆弱かもしれませんのでご注意ください。

# 参考

- [Amazon EC2\+EBSにSubversionを突っ込んでみた \| 毒舌プランナーの異論持論](http://blog.peacepiece.info/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/1068/)
- [Apache \- AmazonLinuxでSVNサーバー構築をし、ブラウザでディレクトリを確認しようとしたけど見当たらない…｜teratail](https://teratail.com/questions/38137)

基本的に上の記事の内容で問題ありませんでしたが、一部誤りがありました。
`[group]`を`[groups]`にすると良いみたいです。

```/svn/repos/sample/authzsvn.conf
[groups]
dev_grp = ec2-user
[/]
@dev_grp = rw
```

# 手順

```
sudo yum update
sudo yum install -y httpd
sudo mkdir /svn
sudo yum install subversion mod_dav_svn
cd /svn
sudo mkdir repos
cd repos
sudo mkdir sample
sudo svnadmin create sample
sudo svn mkdir file:///svn/repos/sample/trunk -m "create"
sudo svn mkdir file:///svn/repos/sample/branches -m "create"
sudo svn mkdir file:///svn/repos/sample/tags -m "create"
sudo vi /etc/httpd/conf.d/subversion.conf
```
```/etc/httpd/conf.d/subversion.conf
<Location /repos>
DAV svn
SVNPath /svn/repos/sample
AuthzSVNAccessFile /svn/repos/sample/authzsvn.conf
Require valid-user
AuthType Basic
AuthName "SVN repos"
AuthUserFile /svn/repos/sample/.htpasswd
</Location>
```
```
sudo htpasswd -cb /svn/repos/sample/.htpasswd ec2-user <パスワード>
sudo vi /svn/repos/sample/authzsvn.conf
```
```/svn/repos/sample/authzsvn.conf
[groups]
dev_grp = ec2-user
[/]
@dev_grp = rw
```
```
sudo chown -R apache:apache /svn/repos/sample
sudo systemctl start httpd
sudo systemctl enable httpd
```
PHPではネストした三項演算子は左から評価される

PHPの三項演算子はネスト、つまり三項演算子の項に三項演算子を使った式を使うことができるが、**PHPの三項演算子は右から順に評価されるので注意が必要だ**。

いろんな言語で次のようにネストした三項演算式が書ける。

```php
true ? 1 : true ? 2 : true ? 3 : 4
```

多くの言語[^1]は、次のように右から評価していく。

[^1]: Java, Swift, Ruby, JavaScriptなど

```php
true ? 1 : (true ? 2 : (true ? 3 : 4))
true ? 1 : (true ? 2 :         3    ))
true ? 1 :         2
       1
```

しかしPHPは、左から評価していく。

```php
((true ? 1 : true) ? 2 : true) ? 3 : 4
(        1         ? 2 : true) ? 3 : 4
                     2         ? 3 : 4
                                 3
```

したがって、例えば、1なら「one」、2なら「two」、3なら「three」、それ以外なら「more」をマッピングしたい気持ちで次のような三項演算子の式を書くと思いがけない罠にはまる。

```php
$value = 2;

var_dump(
	$value === 1 ? 'one' :
	$value === 2 ? 'two' :
	$value === 3 ? 'three' : 'more'
); //=> string(5) "three"
```

上のコードは次のように計算された結果、"three"が答えになる。

```php
(($v === 1 ? 'one' : $v === 2) ? 'two' : $v === 3) ? 'three' : 'more'
  ^^
((2  === 1 ? 'one' : $v === 2) ? 'two' : $v === 3) ? 'three' : 'more'
  ^------^
((false    ? 'one' : $v === 2) ? 'two' : $v === 3) ? 'three' : 'more'
                     ^^
((false    ? 'one' : 2  === 2) ? 'two' : $v === 3) ? 'three' : 'more'
                     ^------^
((false    ? 'one' : true    ) ? 'two' : $v === 3) ? 'three' : 'more'
 ^---------------------------^                                   
(true                          ? 'two' : $v === 3) ? 'three' : 'more'
^------------------------------------------------^
'two'                                              ? 'three' : 'more'
^-------------------------------------------------------------------^
'three'
```

上記のようなマッピングをしたい場合は、ifやswitch、連想配列など他の手立てを使ったほうがいい。

```php
$value = 2;

var_dump(
	(function (int $value): string {
		if ($value === 1) return 'one';
		if ($value === 2) return 'two';
		if ($value === 3) return 'three';
		return 'more';
	})($value)
); //=> string(3) "two"

var_dump(
	(function (int $value): string {
		switch ($value) {
			case 1: return 'one';
			case 2: return 'two';
			case 3: return 'three';
			default: return 'more';
		}
	})($value)
); //=> string(3) "two"

var_dump(
	(function (int $value): string {
		return [
			1 => 'one',
			2 => 'two',
			3 => 'three'
		][$value] ?? 'more';
	})($value)
); //=> string(3) "two"
```
【C言語】コンパイルとビルドの違い

#コンパイルとは

>**コンパイル**とは、プログラミング言語で書かれたコンピュータプログラム（ソースコード）を解析し、コンピュータが直接実行可能な形式のプログラム（オブジェクトコード）に変換すること。そのためのソフトウェアをコンパイラ（compiler）という。


C言語でもPHPでもPythonでもGOでも、なーーーんでも
プログラミング言語で書かれたコードは機械側は解読できません。

機械が読める言語、すなわち**機械語**に直す（＝翻訳する）必要があります。
**オブジェクトコード**っていってるのは、この機械語で書かれたプログラムのことです。
この翻訳の作業を**コンパイル**、翻訳してくれるヤツを**コンパイラ**と呼びます。



###機械語って？
マシン語ともいう。どっちでもOKです。
「0」と「1」で表現される文字の羅列です。

機械語もとい機械語に近い、つまりマシン寄りの言語は**低水準言語**と呼ばれ、
普段私たちが使ってるプログラミング言語は**高水準言語**と呼ぶのです。
機械語に近い言語の代表としてアセンブリ言語が挙げられますが、その話は今回割愛。

#ビルドとは

>**ビルド**とは、組み立てる、建てる、築く、作り上げる、などの意味を持つ英単語。ソフトウェアの分野では、プログラミング言語で書かれたソースコードなどを元に実行可能ファイルや配布パッケージを作成する処理や操作のこと。また、組み立てられた実行ファイルなどの特定の版を指す場合もある。

コンパイルして機械が読めるようになったコードをガッチャンコする作業をビルドと呼びます。
コンパイルが終わった（＝機械語に変換した）ところで、まだ実行可能ではないんですよ。
実行可能な形式って？.exe形式を想像してもらってOK。

コンパイルの後には**リンク**という作業が必要です。
コンパイルしたオブジェクトコードたちをまとめることで実行可能形式になります。
リンクも一応辞書引いときますね。
>ソフトウェア開発やプログラミングの分野では、機械語のプログラム（オブジェクトコード）が収められた複数のファイルを結合して実行可能ファイルを生成することを**リンク**と呼び、その作業を行うプログラムをリンカ（linker）という。一つのファイルにすべてを結合する方式を静的リンク（static link）、実行時に必要に応じて外部のファイルをメモリ上に呼び出す方式を動的リンク（dynamic link）という。


#まとめ

###ビルド　＝　コンパイル　＋　リンク

開発環境でリンクとコンパイルを一気にやってくれることが多いので、
C言語初心者がよく？？？？ってなるところだと思います。
【Python】切り捨て除算演算子を使った切り上げ【算数】

pythonで切り上げはいつも次のようにmathをimportして求めていた。

```python
import math
n = 2 / 3    # 0.6666666666666666
math.ceil(n) # 1
```

次のような書き方もできるが何しているのか良く分からなかったのでメモ。

```python
x, y = 2, 3
-(-x // y) # 1
```

//が割り算の整数部分を返す演算子という事は分かる。
でもマイナスつけたら何で切り上げになるんだ。
細かく実行してみた。

```python
x, y = 2, 3

# 1. 普通の割り算
x / y       # 0.6666666666666666
# 2. 1の小数部分を切り捨て
x // y      # 0
# 3. 1の負数版
-x / y      # -0.6666666666666666
# 4. 3を切り捨てて-1側になる
-x // y     # -1
# 5. 4の符号を反転させると切上げの結果と等しくなる
-(-x // y)  # 1
```

切り捨てて数字が大きくなるのは確かにおかしい。
ここまで動かして、負数の切り捨てが小さい方へ倒れるからだと理解。

こういう問題めっちゃ苦手なんですが、克服する方法ってないんでしょうかね...
Windowsのリモートデスクトップで、認証エラー暗号化オラクルと表示される

## はじめに
Windowsのリモートデスクトップでエラーが出ました。2018年5月に問題が出て個人的にメモしてたのですが、このエラーが出ると忘れていました。誰かの役に立つかもと思い記事を投稿します。

<img src='https://qiita-image-store.s3.amazonaws.com/0/253995/623d02c2-6d29-aae6-1da7-d934086edb79.png' width=400px>

## 問題
2018年5月のWindowsアップデートで、リモートデスクトップが使用できなくなる可能性があります。

## 内容
2018年3月のWinアプデでポリシーが追加され脆弱となります。
2018年5月のアプデでポリシーが脆弱から緩和になります。

|いつ|クライアント側|サーバー側|接続|
|:-----------|:----|:----|:--------|
|2月	|ポリシーなし	|ポリシーなし	|可能|
|3月	|Vulnerable（脆弱）|ポリシーなし	|可能|
|3月	|Vulnerable（脆弱）|Vulnerable（脆弱）|可能|
|5月	|Mitigated（緩和）|ポリシーなし	|<font color=red>不可</font>|
|5月	|Mitigated（緩和）|Vulnerable（脆弱）|可能|
|5月	|Mitigated（緩和）|Mitigated（緩和）|可能|

2018年6月以降リモートデスクトップ接続（不可というのは安全とも言えます）

|サーバー→<br>↓クライアント |未パッチ	|脆弱	|緩和	|強制（手動）|
|:-----------|:----|:----|:--------|:----|
|未パッチ	|脆弱で可能	|脆弱で可能	|脆弱で可能	|<font color=red>不可</font>|
|脆弱	|脆弱で可能	|脆弱で可能	|脆弱で可能	|脆弱で可能|
|緩和|<font color=red>不可</font>|脆弱で可能|<font color=green>安全に可能</font>|<font color=green>安全に可能</font>|

## 方法１　サーバー側
Windowsアップデートを行う（そもそも）

## 方法２　サーバー側
単体アップデート KBパッチ を実行する（探せばあるかも）

## 方法３　クライアント側
セキュリティを弱める
とりあえずこの方法がおすすめとなります
ファイル名を指定して実行　gpedit.msc
[コンピューターの構成]
-> [管理用テンプレート]
-> [システム]
-> [資格情報の委任]
ポリシー名 : Encryption Oracle Remediation （暗号化オラクルの修復）
オプション 保護レベル →  Vulnerable （脆弱）
<img src='https://qiita-image-store.s3.amazonaws.com/0/253995/0653142d-f742-9c3d-306a-8ae1b6d948e1.png' width=400px>

## 方法４　サーバー側
リモートデスクトップのセキュリティ自体を無効にする
<font color=red>危険度が高いのでおすすめできない</font>
以下のポリシー変更にてNLAを強制しないようにすることができます。
ファイル名を指定して実行　gpedit.msc
[コンピューターの構成]
-> [管理用テンプレート]
-> [Windows コンポーネント]
-> [リモート デスクトップ サービス]
-> [リモート デスクトップ サービス セッション ホスト]
-> [セキュリティ]
ポリシー名 : リモート接続にネットワーク レベル認証を使用したユーザー認証を必要とする。
設定 → 無効

## まとめ
暗号化オラクルと言われても分からなかったので、ちょっとビビりました。全体がアップデートされていけば、この問題は徐々になくなると思います。
form_withしたけど、redirectされない原因と解決策

###エラーについて

ユーザー登録できたけど、画面推移しないエラーにぶつかりました。

つまり、Usersコントローラーのcreateアクション内で、User.newして、@user.saveできてユーザー登録完了しているけど、redirect_to("/users/#{@user.id}")できないので、画面推移がされないエラーが起きました。


```users_controller.rb
def create
    @user = User.new(
        name: params[:name],
        email: params[:email],
        image_name:"default_user.jpg",
        password: params[:password]
    )
    if @user.save
      session[:user_id] = @user.id
      flash[:notice] = "ユーザー登録が完了しました。"
      @current_user = @user
      redirect_to("/users/#{@user.id}")
    else
      render("users/new")
    end
  end
```

###原因

form_withのurl先にlocal:trueがついていないことが、@user.saveできてユーザー登録完了しているけど、redirect_to("/users/#{@user.id}")できない原因でした。

```users/new.html.erb
<%= form_with url: users_path do |form| %>
```


参照記事：「Rails 5.1のform_withを使ってうまくredirectできないあなたへ」https://kimuraysp.hatenablog.com/entry/2017/07/08/233754


###解決策

local:trueをつけてフォームの送信ボタンを押したら、redirectされて、無事、画面推移されました。

```users/new.html.erb
<%= form_with url: users_path, local: true do |form| %>
```

###メモ：なぜform_with url: users_path, local: true do |form|だとredirect(画面推移)されるのか

結論：form_withの送信先がlocalであるべきところを、リモートに指定されていたからかもしれません。

自分はlocalで開発していたので、フォームの送信先もlocalであるべきだったのかもしれません。ですが、local:trueをつけていないことから、デフォルトのフォームになっていたため、リモート + unobtrusive XHRが有効になっており、フォームの送信先がリモートになっていた可能性が高いです。

つまり、送信先がlocalであるべきところを、リモートにフォームの送信先が指定されていた点に原因があったのかもしれません。

>local: trueを指定するとフォームのリモート + unobtrusive XHR送信が無効になります（デフォルトのフォームではリモート + unobtrusive XHRが有効になります）。
参照記事：https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502

###メモ

今回のエラーの原因を深掘りしていくには、Javascriptの知識が必要みたいです。なので、まずはprogateである一定理解した後に、今回のエラーを振り返りたいと思います。

「unobtrusive XHR」とは、
unobtrusive ＝ 「控えめな」 + XHR　＝「XMLHttpRequest」で、
「必控えめなXMLHttpRequest」という意味らしい。

・参照記事：
XMLHttpRequest についてのメモ　https://qiita.com/sirone/items/412b2a171dccb11e1bb6
【Swift】 カスタムキーボードを無効化する

### アプリ内でサードパーティー製のカスタムキーボードを制限、無効化する方法を紹介します

## 脆弱性診断NG

事の発端は、↓でした。

```
Input Interception: Keyboard Extensions Allowed
```

これは、[fortify](https://www.scsk.jp/sp/sys/fortify/)という脆弱性診断の静的解析ツールによって吐かれた脆弱性です。

***サードパーティのカスタムキーボードの利用が無効化されていません。カスタムキーボードはユーザ入力を全て取得でき、悪意の有無に関わらずキーロギングを行っている可能性があります。***
という脆弱性のようです。

## カスタムキーボードの脆弱性とは?
予測変換などに活用するため、ユーザの入力情報を取得しているため、それによって、パスワードやクレジットカード情報などが送信されてしまう脆弱性があるようです。
例えば、有名なアプリ[simeji](https://simeji.me/)では下記のサイトのようなリスクが有るようです。
[使うのは危険！？Simejiを安全に使う方法](https://jp.appbase.info/about-simeji/)

## 対処法
対処法は、以下のコードをAppDelegate.swiftに書くだけです。
これで、simejiアプリを無効化することができました。

```swift:AppDelegate.swift
func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplicationExtensionPointIdentifier) -> Bool {
    if extensionPointIdentifier == .keyboard {
        return false
    }
    return true
}
```

## 参考資料
- http://blogs.quovantis.com/best-practices-to-avoid-security-vulnerabilities-in-your-ios-app/
- [自分のアプリでカスタムキーボードを使われないように制限する](https://qiita.com/Ushio/items/cc79630a829f8a393d7b)

## おまけ
「カスタムキーボード　無効化」とぐぐっても出てこなくて苦労しました、、
「カスタムキーボード　制限」とググればよかったんですね、、泣
Javaで素数判定プログラムを書きました

#Javaで素数判定
昨日から本格的にJavaの講義を受けていて、do-while文まで学習したあたりで
素数判定プログラムを書いてみることになったので、その備忘録です。

```Sosu.java
package sample;

import java.util.Scanner;

public class Sosu {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int num;
		boolean b = true;

		while (true) {
			System.out.println("素数判定");
			System.out.print("2以上の整数を入力してください：");
			num = sc.nextInt();

			if (num < 2) {
				System.out.println("2未満の整数です。");
			} else {
				break;
			}
		}
		if (num == 2) {
			System.out.println(num + "は素数です。");
		} else {
			for (int i = 2; i < num; i++) {
				if (num % i == 0) {
					System.out.println(num + "は素数ではありません。");
					b = false;
					break;
				}
			}
			if (b) {
				System.out.println(num + "は素数です。");
			}
		}
	}

}
```
#内容
1. while文で入力内容が2未満であるものを弾いて再入力させる。
2. while文をbreakで脱出し、入力が2以上であるものをif文で判定。
3. 入力が2のときは素数。
4. 入力が2より大きいときは、2以上num未満の数で順に割っていってどこかで割り切れたら素数ではない。
5. 割り切れなかったものは素数。最後の判定はbooleanで判定。

#コメント
正直もっといいやり方はありそうなので、この先学んでいってもし思いついたら訂正します。
また、現在の形のままここをこうした方がいい、などアドバイスがあれば教えてもらえると嬉しいです。
Ansible+Jupyter-notebookをDockerで使う

色々とハマったのでメモっておきます。

ファイル内のコメント（#）で説明を書いてます。
インストールしているもの：
python3, git, ansible, jupyter notebook, ubuntuの日本語化パッケージ（公式のubuntuイメージはそのままだと日本語ファイルが文字化けしたので）

gitは、対象機器からコンフィグを採取してファイルにした時、社内サーバに立てたGitLabに簡単に保管できるようにするため入れてます。

Dockerfile

```Dockerfile
FROM ubuntu:latest

MAINTAINER your_name

# イメージ容量の肥大を抑えるため、RUNはなるべく一つにまとめる。
# set -xを最初に書く事でコメントをshellに表示できるのでDockerのビルドプロセスを確認しやすい
RUN set -x && \
    apt-get update && \
    : "python3, pip, ubuntuの日本語化パッケージ, gitをインストールする" && \
    apt-get install -y \
    language-pack-ja-base language-pack-ja \
    git \
    python3-pip && \
    locale-gen ja_JP.UTF-8 && \
    : "ansibleとjupyter notebookをインストールする" && \
    python3 -m pip install --upgrade pip && \
    python3 -m pip install ansible && \
    python3 -m pip install jupyter

# 日本語の扱いを可能にするための環境変数
ENV LANG ja_JP.UTF-8
```
これで確か、だいたい１GBくらいのイメージが出来上がった。
<h2>Buildコマンドについて</h2>
Proxy環境下では、Proxy認証のための値を渡してやらないとRUNで書いたものが実行できません。
そのため、--build-argオプションを使って対処します。

また、今回はansible-basicというイメージ名にしました。

```sh
docker build --build-arg \ 
http_proxy=http://yourname@password:port \
--build-arg https_proxy=http://yourname@password:port -t ansible-basic .
```

<h2>ちなみに</h2>
jupyter notebookをDockerから使いたい場合は、イメージをrunする時にポートの指定が必要です。
以下はその例。

```sh
docker run -p 8080:8080 -it --name test01 ansible-basic:latest /bin/bash
```
上記のコマンドでコンテナを作成した場合、またrootユーザーのままJupyter notebookを起動する場合はコマンドは以下のようになる。

```sh
jupyter notebook --port 8080 --ip=0.0.0.0 --allow-root
```

上記のコマンドでアドレスが出力されるので、ブラウザに打ち込んで以下のように書き変える。ex.)http://abcabcabchash:8080/hogehoge...
→http://ホストのIPaddress:8080/hogehoge...


これで見れるはず。

------後記------
データセンターに設置してある機器にAnsibleを使いたい、という時、データセンターの外から
SSHの許可がない場合はデータセンタへの持ち込み用PCにAnsible環境を入れて作業する事になるかと思います。

そんな時、各PCごとに環境構築するのは非常に手間がかかるし、また色んな人が毎回微妙に異なる環境を構築すると管理も大変になってしまうので、Dockerを使って用意することにしました。

Vagrant or Docker で迷いましたが、Ansibleでの作業が終われば手軽に削除が可能なのと、素早く環境を立てられる理由からDockerを選定しました。
python, ruby, php, node のループの速さ

今日も楽しいマイクロベンチマーク。

某所で python の for ループが遅いという話を聞いたので、そうなの？　と思って他の言語と比べてみた。

# ソース

## python3

```python:python3
import sys
r=0
for i in range(int(sys.argv[1])):
  r+=1
print(r)
```

## PHP

```php
<?php
$len = (int)$argv[1];
$r=0;
for( $i=0 ; $i<$len ; ++$i ){
  ++$r;
}
echo($r);
```

## node.js

```js:node.js
const len = process.argv[2]|0;
let r=0;
for( let i=0 ; i<len ; ++i ){
  ++r;
}
console.log(r);
```

## ruby

```ruby:ruby2.6
n=ARGV[0].to_i
r=0
n.times do
  r+=1
end
p r
```

## 測る人

測る人はわりとやる気ない感じで、`Benchmark.realtime` を使っている。

```ruby:bench.rb
require "benchmark"
require "pp"

COMMANDS = [
  [ "php for.php", "php" ],
  [ "node for_pp.js", "node" ],
  [ "python3 for_range.py", "python3" ],
  [ "ruby times.rb", "ruby" ],
]

COUNTS = (10..27).map{ |e| 2**e }

File.open( "result.csv", "w" ) do |f|
  f.puts( (["tick"]+COMMANDS.map{ |cmd| cmd[1] }).join(",") )
  COUNTS.each do |count|
    s=([count]+COMMANDS.map{ |cmd|
      Benchmark.realtime{ %x(#{cmd[0]} #{count}) }
    }).join(",")
    f.puts(s)
    puts(s)
  end
end
```

各言語のファイル名がいい加減なのがバレるね。

# 結果

結果は下記グラフの通り。
両対数グラフ注意。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6854/9e32b4c1-c8ae-6bc2-d2c7-0642cec8bd47.png)

測る人のソースコードを見ると分かる通り、プログラムの起動時間を含んでいる。
10万回ぐらい回しても、起動時間の影に隠れて殆ど見えないということがわかる。

1.34億回回すのに要する時間を、node.js を 1.00 として表にすると：

||php|node|python3|ruby|
|:--|--:|--:|--:|--:|
|Benchmark.realtime そのまま|6.13|1.00|61.72|28.83|
|起動時間らしきものを減算|10.56|1.00|108.11|50.13|

「起動時間らしきものを減算」は、1.34億回の結果から 1024回の結果を減じたもの。

こんな感じ。node 速いね。
そして噂のとおり、python3 は遅いのであった。

あと。PHP だけ起動が速いらしい。そういうものか。
プログラミング学習記録17〜変数はletでおーけー〜

##今日やったこと
- Udemyの「Web開発入門完全攻略コース - プログラミングをはじめて学び創れる人へ！未経験から現場で使える開発スキルを習得！」のセクション9の89~103

今日はjavascriptの基礎を学びました。

以下、パートごとのメモです。

###セクション９javaScript入門
####89.イントロダクション-javascript入門-
セクション９の概要。

####90.Javascriptの歴史
1995年に生まれた言語だと知りました。

この講座ではES3、ES5を学習します。

####91.JavaScriptの開発環境構築
開発環境はgoogle chromeとatomのみ。

####92.はじめてのjavascript
Hello World!を出力しました。

ディベロッパーツールのconsoleから出力されていることを確認しました。

####93.JavaScriptのエラーを自力で解決するための方法
ディベロッパーツールのコンソールを使って、エラーメッセージを表示する方法について学びました。

エラーメッセージはMDNのリファレンスにまとめられています。

JavaScript エラーリファレンス(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors)

####94.コメント
コメントアウトのやり方についての動画です。

HTMLやCSS同様に、atomエディタの場合はcommandキー+/キーで簡単にコメントアウトすることができます。

####95.演算
四則演算と余りの計算方法についてです。
これはProgateで散々やったので大丈夫でした。

####96.変数
Progateではlet=“”で変数を指定したが、動画ではvar x=“”で指定していました。

「この違いはなんなんだ？」と疑問に思い、調べたらQiitaの過去記事に答えが載っていました。

letとvarの違い(https://qiita.com/y-temp4/items/289686fbdde896d22b5e)


>一言で言うと、変数のスコープがブロックスコープか関数スコープかの違いです。

>ES6からはletが使えるため、今後はvarではなく好んでletが使われるようになるかと思います。

この講座ではES3、ES5なのでvarで定義していますが、ES6の場合はProgateでやったようにletで定義する方が好ましいようです。

変数の記述法、ルールで細かい違いはありましたが、概念に大きな違いはないので、そういうものなんだな〜という感じで進んでいっていいと思います。


####97.インクリメントとデクリメント
インクリメントとは、値に１を足すこと。
x=x+1
x+=1
x++
というように３種類の表記法があります。

デクリメントとは、値から１を引くこと。
x=x-1
x-=1
x--
というようにインクリメント同様に、３種類の表記法があります。


####98.条件分岐
条件分岐の概要です。

####99.条件分岐if/else
If、elseに関する動画です。
ここはProgateをしっかりやってれば流し見で大丈夫です。

####100.条件分岐if/if else/else
If、else if、elseに関する動画です。
ここもProgateをしっかりやっている場合は流し見で大丈夫です。

####101.条件分岐switch
Switchに関する動画です。
ここもProgateをしっかりやっている場合は流し見で大丈夫です。

####102.演習：テーマパークの入場料計算
年齢によって異なる入場料を出力するプログラムを作る演習です。

####103.演習回答：テーマパークの入場料計算
102の回答です。無事正解することができました。

If、else If、elseが理解できてれば特に問題なくできる課題です。


<br>
ProgateではES6を学んでいたので、今回ES5を学んでみて一部違いに戸惑う部分もありましたが、大まかな概念は一緒だと思いました。

明日からも引き続きプログラミング学習頑張ります。

おわり
Pythonでseleniumを用いたスクレイピング

pythonにてseleniumを使う機会があったので、メモ。

## chromedriverのダウンロード
以下のURLからchromedriverをダウンロード
http://chromedriver.chromium.org/downloads
firefoxdriverもあるらしい。

## ライブラリの追加
```
➜   pip install selenium
```
無事インストールできたらOK

## スクリプトでseleniumとchrome driverを読み込む
```
from selenium import webdriver
driver = webdriver.Chrome(executable_path="./chromedriver")
```
chromedriverへのパスは注意。上記コードは同じディレクトリに配置想定。

## 所定のURLのページを開く
```
url  = "https://www.google.co.jp/"
driver.get(url)
```

## 要素を取得する
以下の2つのメソッドを使用した。 

- `find_elements_by_xpath`
  -  リストなど、複数あるものを取得。 
  -  ループを回してリストに繰り返し処理をかけて処理を効率化することができる。
- `find_element_by_xpath`
  - 特定の要素を狙って取得

なお、`xpath` 以外にも、
 
- id名
- class名
- その他

などの要素取得方法がある。
[参考](https://kurozumi.github.io/selenium-python/locating-elements.html)

今回は `xpath` を使用した。`xapth`はデベロッパーツールから確認できる。
macのショートカットは、 `command` + `option` + `i`

デベロッパーツールにて、HTML要素を右クリックするとメニューが出てくるので、
Copy > Copy XPath の順で選択。

<img width="558" alt="スクリーンショット 2019-03-05 21.31.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/168995/3e97f558-2895-c26e-1624-9b077a9aacf6.png">

## 要素の中の属性を取得したい場合
要素（HTMLタグ）の中の属性(attribute)を取得したい場合は `get_attribute("属性名")` を使う。

例

```
driver.find_element_by_xpath("//div[@class='hoge']/div[1]/a/img").get_attribute("src")
```

例では `src` 属性の値を取得している。

## 取りたい要素にidやclassが割り振られておらず、同じタグが子要素として並んでいる場合
以下のような場合に `b` を取得するにはどうしたらいいか?

```
<div id="hoge">
  <div>a</div>
  <div>b</div>
  <div>c</div>
</div?>
```

以下のようにする。

```
driver.find_element_by_xpath("//div[@id='hoge']/div[2]").text
```

2番目に格納されているdivと明示的に示せば、`b`が取得できる。
[参考](https://kurozumi.github.io/selenium-python/api.html?highlight=text#selenium.webdriver.remote.webelement.WebElement.text)
アプリケーションクラッシュイベント「w3wp.exe」について

おはようございます、こんにちわ、こんばんわ:relaxed:

掲題の件、異常メッセージ検知が頻発しているので情報を役に立てていただければ幸いです

# 1. アプリケーションクラッシュw3wp.exe

------------------------------------------------------
<障害が発生しているアプリケーション>
w3wp.exe

<アプリケーション>
Application Error

<オブジェクト>
アプリケーションクラッシュイベント

例外コード：0xc0000005
障害オフセット：0x00038e19
障害が発生しているプロセスID：0x2170
障害が発生しているアプリケーションの開始時刻：
0x01d4c263b54959e3

上記についての情報です
w3wmp.exe(Webアプリケーションが動作するワーカープロセス)が
0xc0000005(アクセス違反)にて異常終了していることを表しています。

当該アプリケーションはIIS(Internet Information Services)上で起動しているアプリケーションです。

# 2. IIS(Internet Information Services)とは

無料で利用できるWebサーバーソフトみたいです
サーバー用OSのWindows Server 2016(最新)はもちろんのこと
Windows10にも導入が可能なのだそうです。

# 3. 必要なログについて

当該メッセージの原因が非常に多岐にわたるようですが
主因であるアプリケーション要因により記録されたかどうかを確認するには
Collectログに加えて、現象発生時に作成されたプロセスタンプを確認する必要があるそうです。

大した情報ではありませんが、何かの役に立てたら嬉しいです:v:
フォルダ内のCSVファイルを統合するマクロ　その1

2個目のマクロは
『同じフォルダ内にあるCSVファイルを使用範囲をそのままコピペして統合するマクロ』
を作成しました。
今回はできるだけオブジェクト思考なコードになるよう、意識しました。
（前回はまずは最後まで動くマクロを作りたかったので、煩雑なコードになってしまいました・・・）

```VB
Sub test002()
   
'フォルダを選択
    Dim folderPath As Variant
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Show
        folderPath = .SelectedItems(1)
    End With
       
'Dir関数でCSVファイル名を取得
    Dim buf As String
    buf = Dir(folderPath & "\" & "*.csv")
    
'貼り付け元の「請求統合.xlsx」ファイルの作成
    Dim bath As Workbook
    Set bath = Workbooks.Add
    bath.SaveAs fileName:=folderPath & "\請求統合.xlsx", _
    FileFormat:=xlOpenXMLWorkbook
     
'「請求統合.xlsx」の最初のシート
    Dim tougouWs As Worksheet
    Set tougouWs = bath.Worksheets(1)
       
'ループ開始・CSVファイルの名前が空白になったら（取得できなかったら）ループから外れる
    Do While buf <> ""
    
'「請求統合.xlsx」の最終行を取得
        With tougouWs
            Dim lastLine As Long
            lastLine = .Cells(Rows.Count, 1).End(xlUp).Row
        End With

'CSVファイルの最初のシートを取得
        Dim wb As Workbook
        Set wb = Workbooks.Open(folderPath & "\" & buf)
        Dim ws As Worksheet
        Set ws = wb.Worksheets(1)
    
'CSVファイルの使用範囲を「UsedRange」で指定してコピー
        ws.UsedRange.Copy
        
'もし「請求統合.xlsx」最終行が一行目だったら、A1を指定し貼り付け
'そうではなかったら、A列の最終行の次のセルを指定し貼り付け
        If lastLine = 1 Then
            With tougouWs
                .Activate
                .Cells(lastLine, 1).Activate
            End With
            ActiveSheet.Paste
        Else
            With tougouWs
                .Activate
                .Cells(lastLine + 1, 1).Activate
            End With
            ActiveSheet.Paste
        End If

'CSVファイルを保存せずに閉じる
        wb.Application.CutCopyMode = False
        wb.Saved = True
        wb.Close
                      
'次のCSVファイルを指定する
        buf = Dir()
    Loop
    
'「請求統合.xlsx」を保存して閉じる
    bath.Save
    bath.Close
    
End Sub
```
これで、一応統合されたデータはできます・・・が、実際は
<img src=https://qiita-image-store.s3.amazonaws.com/0/265756/1a9003b0-8120-a307-cfbc-6b6cdc12acdd.png width=70%>
このようなデータなので、統合範囲をもう少し調整が必要です。
それは次回にしたいと思います。
機械学習用にプロ野球の球団マスコット画像を集めるスクリプトを作ってみた


機械学習用(画像判定のデータ収集用)のデータ集め用に、google画像検索から画像ファイルを集めるスクリプトを書いてみたので、ここに残しておこうかと思います。

ちなみにseleniumを使用するための環境構築は以下のリンクなんかを参考にしています。
https://tanuhack.com/python/selenium/

~~~
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import os
import json
import urllib
import sys
import time
import io
from PIL import Image

text = [ "ドアラ","スラィリー","トラッキー","ジャビット", "つば九郎","スターマン" ]
download_path = ["doara/","sllighly/","toracky/","jabitto/","tubakuro/","starman/"]
headers = {}
headers['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
extensions = {"jpg", "jpeg", "png", "gif"}
img_count = 0
downloaded_img_count = 0
img_skip = 0
dPath_index = 0

#画像を取得
for index in text:
    # ディレクトリを作成
    try:
        os.mkdir(download_path[dPath_index])
    except OSError:
        print("file exist")
    
    # Firefoxを起動
    browser = webdriver.Firefox()
    # Webブラウザを表示
    url = "https://www.google.co.in/search?q={}&source=lnms&tbm=isch".format(index)
    browser.get(url)
    #  画像を全て表示させる
    for __ in range(10):
        # スクロール
        browser.execute_script("window.scrollBy(0, 1000000)")
        time.sleep(0.2)
        try:
            # 「結果をもっと表示」があればクリック
            browser.find_element_by_xpath("//input[@value='結果をもっと表示']").click()
            time.sleep(2.5)
        except Exception as e:
            print("not found:"+ str(e))

    imges = browser.find_elements_by_xpath('//div[contains(@class,"rg_meta")]')
    
    print("Total images:"+ str(len(imges)) + "\n")
    for img in imges:
            # Get image
            img_count += 1
            img_url = json.loads(img.get_attribute('innerHTML'))["ou"]
            img_type = json.loads(img.get_attribute('innerHTML'))["ity"]
            
            print("Downloading image "+ str(img_count) + ": "+ img_url)
            try:
                if img_type not in extensions:
                    img_type = "jpg"
                # Download image and save it
                raw_img = io.BytesIO(urllib.urlopen(img_url).read())
                
                img = Image.open(raw_img)
                img.save( download_path[dPath_index]+'img{}.jpg'.format(img_count))
                time.sleep(0.2)
                downloaded_img_count += 1
            except Exception as e:
                print("Download failed:"+ str(e))
            finally:
                print("")
                
    # Webブラウザを一旦閉じる
    img_count = 0
    browser.close()
    dPath_index+= 1
~~~

## 参考文献

- 以下のgitHubと記事を参考に作らせていただきました。
  
https://github.com/penseeartificielle/google-image-scrapping/blob/master/google-image-scraping.py

https://qiita.com/mijamija1995/items/63f60cf533346d8c344b
バッチでOracleからデータ抽出をする(備忘録)

バッチでオラクルデーダベースに接続してデータ抽出を行う。
抽出結果はtxt形式、ログには実行時刻をファイル名につけて出力する。


仕事でどうしても中身だけが欲しく、形式はどうでもいいときに作ったスクリプトです。
カスタマイズすれば使える形だと思ったので、備忘録として記録します。


###実行環境
windows server 2008 R2 Standard

###バッチ構成

```
D：
 |--¥#Batch開発
       |
       |--bat
       |   |--テストora.bat
       |   |--LOG
       | 
       |--sql
           |--テストora.sql
```

###テストora.bat

```text:テストora.bat

SET ID=usr_taro
SET PW=test_pass
SET TNS=TS

SET dd=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
SET d2=%DATE:~5,2%%DATE:~8,2%
SET tt=%TIME:~0,2%%TIME:~3,2%

SQLPLUS %ID%/%PW%@%TNS% @D:¥#Batch開発¥sql¥テストora.sql %d2% %tt%

```




###テストpos.sql

```sql:テストora.sql
SET echo on
SET linesize 2000
SET trimspool on

spool .¥出力結果ログ_&2._&1..log
spool D:¥#Batch開発¥bat¥LOG¥出力結果.txt

select a.日付,a.番号,count(0)
from usr_taro.table_kanri a
where a.日付 > 20190131
group by a.番号 ,a.日付
order by 3 desc;

spool off
```

###補足説明
結果、txtファイルにはecho offしていないので定義箇所が残り、
その下に抽出結果が表示されます。
djangoで作ったwebページにgoogle analyticsのトラッキングコードを埋め込む方法

とりあえずメモとして。

やりたきことはdjangoで作ったwebサイトにトラッキングコードをいい感じに埋めたかったんです。

GAへのプロパティ追加とかはすでに済んでいる前提です。

## やること

### 独自のcontext_processorsとやらを作成する

`app名/context_processors.py` というファイルを新しく作り

```python

from django.conf import settings

def google_analytics(request):
    """
    DEBUG=Falseの場合に、GoogleアナリティクスのトラッキングIDを返す
    """
    # GoogleアナリティクスのトラッキングIDをsettings.pyから取得する
    # settings.py内に、GOOGLE_ANALYTICS_TRACKING_ID='自分のトラッキングID'を書き込んでおく
    ga_tracking_id = getattr(settings, 'GOOGLE_ANALYTICS_TRACKING_ID', False)

    # DEBUG=FalseかつGoogleアナリティクスのトラッキングIDを取得できたら、
    # テンプレート内で'GOOGLE_ANALYTICS_TRACKING_ID'という変数を利用できるようにする
    if not settings.DEBUG and ga_tracking_id:
        return {
            'GOOGLE_ANALYTICS_TRACKING_ID': ga_tracking_id,
        }
    return {}

```

これをそのまま貼り付けます。


作っただけだとなんにもならないので、

settings.pyを編集し、↑を読み込ませてあげます。

TEMPLATESの変数があると思うので、

```python

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], # 404ページ用に記載
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'app名.context_processors.google_analytics',　←を追加
            ],
        },
    },
]

```

上記のような感じで一行追加します。

更に、
どこでもいいので、settings.pyのなかのどこかに、

```
GOOGLE_ANALYTICS_TRACKING_ID = 'トラッキングID'
```
を追記します。



こうするとdjangoアプリが起動したタイミングで、
context_processors.py
が読み込まれて、テンプレートの中で、

```
{{ GOOGLE_ANALYTICS_TRACKING_ID }}
```

という感じで変数を呼び出せるんじゃないかって推測してます。

### templateでgaのトラッキングコードを呼び出す。


`base.html` が置かれているディレクトリに新しく、

`ga.html`

というファイルを作成し、

```javascript
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=トラッキングコード"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'トラッキングコード');
</script>
```

GAの画面で出力されたjsをそのまま貼っつけます。

もちろんこれだけだと読み込まれないので、base.htmlのheadタグの中に、


```
{% if GOOGLE_ANALYTICS_TRACKING_ID %}
    {% include 'app名/ga.html' %}
{% endif %}
```

を追記します。
場合によっては、
`{% include 'ga.html' %}`

でいけちゃうかもです。そこらへんはよしなに。

これで、DEBUGモードじゃないかつ、settings.pyにGOOGLE_ANALYTICS_TRACKING_IDが設定されている場合にのみ、
トラッキングコードがwebページに埋め込まれます。



## 以上です。


はじめは、
https://www.djangobrothers.com/blogs/django_google_analytics/
を参考にしたのですが、

`context_processors.google_analytics `
をsettings.pyに追記しろと書かれておらず、

[django context_processors]

でぐぐったらどっかのqiitaの記事が引っかかってどうにか設定できました。

なんか回りくどいことしてるような気がしないでもですが、
context_processors
について色々学べたので良しとしましょう。
JavaScriptで無限ループを書くと逮捕される

# 元ネタ
NHKニュースより
https://www3.nhk.or.jp/lnews/kobe/20190304/2020003239.html
クリックすると同じ画面が表示され、消えなくなる不正なプログラムのアドレスをインターネットの掲示板に書き込んだとして、１３歳の女子中学生が兵庫県警に補導されました。

# JavaScriptで無限ループを書くと逮捕される
怖い時代になりました:innocent:
無限ループのバグは重い罪みたいです。新人プログラマは注意しないと警察のお世話になってしまいますね・・・

例えば勉強がてらFizzBuzzを実装したとします

新人プログラマ「繰り返しはいろいろ書き方があるみたいだけどまずはwhileを使ってみよう」

``` js
function FizzBuzz(){
	while(i<20){
		if (i%15 == 0){
			alert("FizzBuzz");
		}
		else if (i%3 == 0){
			alert("Fizz");
		}
		else if (i%5 == 0){
			alert("Buzz");
		}
		else {
			alert(i);
		}
	}
}
```

新人プログラマ「よし多分実装できたぞ！WEBページに乗せてみよう」

``` html
<html>
<head>
<script>
function FizzBuzz(){
	var i = 0
	while(i<20){
		if (i%15 == 0){
			alert("FizzBuzz");
		}
		else if (i%3 == 0){
			alert("Fizz");
		}
		else if (i%5 == 0){
			alert("Buzz");
		}
		else {
			alert(i);
		}
	}
}
</script>
</head>
<body onload=FizzBuzz()>
</body>
</html>
```

新人プログラマ「えーと。htmlのbodyでonloadで呼び出すようにして・・・WEBに公開っと」

数日後・・・

警察「悪質な不正ソフトウェアを作り配信しましたね？署までご同行ください」



・・・


・・・


この新人プログラマはWEBページ上で繰り返しalertを出したことで逮捕されてしまいました:joy:

ソースコードをよく見るとwhile文の中で i が変化することがないですから
無限ループしてしまいそうです。

これは重い罪ですね・・・無限ループは不正なプログラムですから・・・

一回でもテスト実行していればこんな事故は防げただけに非常に残念です
[^1]とにかく「e」を無限に書いていても、もしかしたら逮捕されてしまうかもしれません・・・・

おや、誰か来たようだ


# あわせて読みたい
・[Lets-get-arrested project](https://github.com/hamukazu/lets-get-arrested) :thumbsup:
・[alert無限ループは不正プログラムとして逮捕されるらしいので警察にゴールドバッハ予想を証明してもらおう](https://qiita.com/yuta0801/items/82872d551caf47f2c7af)
・[兵庫県警に捕まるためのショートカットキー入門](https://qiita.com/tomiuchi-kouta-github/items/47836ce9c30d091bc21f)
・["何回閉じても無駄ですよ〜"と無限にアラートを出す10の方法](https://qiita.com/relu/items/1bfdd1b5dd2b11eb2ee6)
・[【☠️危険なプログラム☠️】"何回閉じても無駄ですよ〜"と無限にアラートを出すサイトのコードを添削してみた。](https://qiita.com/redshoga/items/6a152ef0ce76d2fefdd3)
・[☠️†卍️ 兵庫県警に補導される難解スクリプト️ ️卍†☠️](https://qiita.com/redshoga/items/1c7b82284519fa3435c6)

ホントはこういうユーモアある記事が書きたかった(小声)
　
[^1]: [とにかく「e」が書かれているだけのリポジトリが面白い](https://qiita.com/wagase/items/867c38f57fe0bce86495)
eventでfieldSelectorを使う時の罠

忘れて再度ハマりそうなやつメモ

eventにfieldSelectorで `source.component` を指定する時、なぜか `component` が省略されて `source` だけで指定するようになっている

× `$ kubectl get events --field-selector="soruce.component=kubelet"`

○ `$ kubectl get events --field-selector="soruce=kubelet"`

https://github.com/kubernetes/kubernetes/blob/v1.13.2/pkg/registry/core/event/strategy.go#L110

https://github.com/kubernetes/kubernetes/issues/41743

どうやら修正されることはなさそう

event以外にもあるかも？
ブルックスの法則とプログラマの三大美徳とWikiの重要性とガリレオの言葉

>質問にたいして、ナレッジにのこしていなかった部分もあり、思い出すのに苦労しました。
今後に生かしていきたいです。とにかくメモとります。

後輩の日報にこんなことが書いてあり、経験則で同感はしたんですが、もっと具体的な、定量的？な解釈はできないかとふと考えてみました。


# ブルックスの法則

引用元：[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AB%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E6%B3%95%E5%89%87)


>2. 人員の投下は、チーム内のコミュニケーションコストを増大させる。プロジェクトを進めるうえで、プロジェクトチームは、協力して同じ課題に取り組む必要がある。しかし、これを実現するには、調整のためのコストがかかる。一般に、 n人が協調して仕事を進めるためには、 n(n-1)のコミュニケーションチャンネルを調整する必要がある。したがって、プロジェクトの人員に対してコミュニケーションコストは、 n²のオーダーで増加することになる。単純にいえば、開発メンバーを2倍に増やしたチームは、それに伴って4倍のコミュニケーションコストを負担するのである。


要するに人を増やせば増やすほどコミュニケーションのパスが増えるということで、下記の画像のような状態ではないかと。


![image1.JPG](https://qiita-image-store.s3.amazonaws.com/0/107536/14c7e179-2ed1-7e8f-59be-98ff3bf8b4ce.jpeg)

5人いたら10本のパス。

# プログラマの三大美徳

引用元：[日経XTECH](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250057/)

>怠慢
全体の労力を減らすために手間を惜しまない気質。この気質の持ち主は、役立つプログラムを書いてみんなの苦労を減らしたり、同じ質問に何度も答えなくてもいいように文書を書いたりする。よって、プログラマーの第一の美徳である。

パスの観点で考えるとこういうことではないのかと。

![image2.JPG](https://qiita-image-store.s3.amazonaws.com/0/107536/e9d360ac-0d30-0b91-7865-09877dd76cfd.jpeg)

Wはwikiのことです。
完全にドキュメントでやり取りするならばこんな感じですかね。

# 現実に即してみる

実際には完全にドキュメントだけで会話するなんて無理なので、コミュニケーションの量という概念を追加してより現実に即した表現にしてみました。

まずは、ドキュメントを使わない場合。

![image3.JPG](https://qiita-image-store.s3.amazonaws.com/0/107536/71877320-14b9-761e-d926-bb1428b08fd9.jpeg)

一人に対して2本にすることでコミュニケーションの量を表しました。5人いたら20本分の量になります。

次にドキュメントを使ってコミュニケーションの量を減らした場合。

![image4.JPG](https://qiita-image-store.s3.amazonaws.com/0/107536/3459f6ff-ffe6-2137-bd9d-9a3c281fea4d.jpeg)

ドキュメント無しの時よりも人間のコミュニケーションの量は減らせるはずなので、より現実的ではないでしょうか。

5人いても15本分のコミュニケーションの量になりました。

# 結論
Wikiを書けばコミュニケーションの量が減らせる。生産性アップが期待できる。

これでドキュメンテーション嫌いな人も納得させられるかもしれない。。結局は楽になるのだから。。


# ガリレオ・ガリレイの言葉

<p class="codepen" data-height="600" data-theme-id="0" data-default-tab="html,result" data-user="kshimoji" data-slug-hash="YgGmbd" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="galileo">
  <span>See the Pen <a href="https://codepen.io/kshimoji/pen/YgGmbd/">
  galileo</a> by k.shimoji (<a href="https://codepen.io/kshimoji">@kshimoji</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
RustでGUI 〜gtk編〜

コード全体はgithubの[ogata-k/GUI_cmp/example_gtk](https://github.com/ogata-k/GUI_cmp/tree/master/example_gtk)を参考にしてください。
# gtk
今回使用するバージョンは```0.5.0```です。
## どんなクレートか
[gtk](https://github.com/gtk-rs/gtk)はGTK+ 3とCairo、GtkSourceView、そしてGLibの互換性のあるライブラリ（つまり[cairo-rs](https://crates.io/crates/cairo-rs), [gdk](https://crates.io/crates/gdk), [gdk-pixbuf](https://crates.io/crates/gdk-pixbuf),[gio](https://crates.io/crates/gio), [glib](https://crates.io/crates/glib), [gtk](https://crates.io/crates/gtk), [pango](https://crates.io/crates/pango), [sourceview](https://crates.io/crates/sourceview)）を結びつけるためのクレートです。
このgtkクレートはOSに[GTK+とGLibとCairoをインストール](https://gtk-rs.org/docs-src/requirements.html)されていることを要求するので注意が必要です。
## コード
ボタンを押した数をカウントするプログラムを作っていきます。

``` rust:main.rs
extern crate gtk;

use gtk::prelude::*;
use gtk::{Button, Label, Window, WindowType};

fn main(){
  if gtk::init().is_err() {
    println!("Faild to initialize GTK");
    return;
  }

  // windowの作成
  let window = Window::new(WindowType::Toplevel);
  window.set_title("カウントアップ");
  window.set_default_size(400, 300);  // 横×縦

  // 各widgetの作成
  let label = Label::new("0");
  let button = Button::new_with_label("+1");
  
  // windowへの配置
  let vbox = gtk::Box::new(gtk::Orientation::Vertical, 2);
  // child: &P, expand: bool, fill: bool, padding: u32
  vbox.pack_start(&label, true, true, 3); 
  vbox.pack_start(&button, false, true, 2);
  window.add(&vbox);
  
  // 初期表示
  window.show_all();

  // eventの設定
  window.connect_delete_event(|_, _| {
    gtk::main_quit();
    Inhibit(false)
  });

  let label_c = label.clone();
  button.connect_clicked(move |_| {
    let old_num: u16 = label_c.get_text().unwrap().to_string().parse::<u16>().unwrap();
    label.set_text(&(old_num + 1).to_string());
    println!("カウント+1");
  });

  // GUIの実行
  gtk::main();
}
```
![gtk_rs.png](https://qiita-image-store.s3.amazonaws.com/0/167385/a57d9ada-b0d5-1fc2-fd22-772383769b13.png)
## コードの説明
他の言語のgtkでの書き方とほとんど似ているので説明はいらないと思いますが、念のため。
まず最初に

```rust
if gtk::init().is_err() {
    println!("Faild to initialize GTK");
    return;
  }
```
でgtkを使うための初期化をします。
そして```window```や```widget```をそれぞれ生成していきます。
次に配置のために縦方向の```Box```(```vbox```)を用意しています。実は```window```は```widget```をただ一つしか持つことができません。そこで```Box```を作り中に```widget```を詰めて一つの```widget```のようなものとしてまとめて```Window```が保持するようにしています。
その後```window```が消されたときに何をするかの設定とボタンが押されたときに何をするかのイベントを設定して、最後に```gtk::main()```でgtkを実行してコード自体は終了です。

コード自体はそれほど難しいものではないと思います。
## 所感
他の言語によるgtkとよく似た書き心地です。gtkユーザーなら[ドキュメント](http://gtk-rs.org/docs/)を少し見るだけで書き始められると思います。
[一応htmlのように書くことはできる](https://gtk-rs.org/docs/gtk/struct.Label.html#markup-styled-text)らしいのですが、やはりレイアウトは複雑なものは苦手なようです。何か良い方法があるならコメントなどで教えてください。
## まとめ
gtk自体有名なので調べれば簡単に情報は出てくる。GUIなど一度も書いたことがないという人にはお勧めなクレートだと思う。
プログラミング入門のためのCygwin導入（C，C++）

# はじめに

プログラミング入門の授業を受ける（受けた）し，Cygwinを入れてC言語の勉強をしたい，だけどうまく導入できない…　そんな後輩のためというローカルなターゲットのための記事です．
CygwinでC言語・C++のコンパイル・実行，それとmakefileが使えるようになることを目指します．
ちなみに僕も「なんとなくやりたいことはできてるけどよく分からない」ような環境構築しかしておらず，Cygwinにそこまで詳しいわけではないです．
そんなでも使えるんだという解釈の仕方もあります（？）

# Cygwinのダウンロード

[Cygwin](https://www.cygwin.com/)の「Installing Cygwin」からビット数の合うものをDL．
バージョンは3.0.1でした．

# Cygwin Setupを起動してインストール作業を開始

1. **Cygwin Net Release Setup Program** 次へ
2. **Choose A Download Source** 「Install from Internet」を選択したまま次へ
3. **Select Root Install Directory** デフォルト（おそらく`C:\cygwin64`）のままでいいでしょう．Install ForもAll Usersでいいと思います．次へ
4. **Select Local Package Directory** デフォルトでいいでしょう．次へ
5. **Select Your Internet Connection** 「Direct Connection」を選択したまま次へ
6. **Choose A Download Site** おそらく近くて信頼できるサーバを選択するのが良いのでしょうがそんなに気になることはないでしょう．「http\://cygwin.mirror.constant.com」を選択したまま次へ

おそらくここまでは問題ないんですよね．
むしろ知りたいのはこの後ですよね．

# Select Packages

基本的には検索窓に「gcc」とか「make」とか入れるとそれっぽいのが見つかるのでバージョンを選択するという流れだと思いますが，それは慣れてからということにして，ここでは細かく見て行きましょう．

ViewをCategoryに切り替えます．
Allを展開，さらにDevelを展開．
以下にリストアップした項目のNewをプルダウンしてバージョンを選択します．
最新のでいいと思います．

- gcc-core
- gcc-g++
- make

それと，All内のShellsを展開した中にあるchereを入れると便利みたいです．
参考: [CygwinでC](http://www.spice.ci.ritsumei.ac.jp/~hiratsuka/cygwin.html)
Cygwinインストール後にTerminalを管理者権限で起動し，`chere -i`を実行すると，ファイルエクスプローラから右クリックで、その場所をカレントディレクトリとするTerminalを起動できるようになります．

他の項目はデフォルトのまま置いておきます．
（デフォルトで選択されているものと，デフォルトではSkipになっているものとがあると思います）

次へ

# 仕上げ

次へを押していくと緑のゲージが出てインストールされていき，それが終わると**Create Icons**の画面になります．
両方チェックしてアイコンをデスクトップに置いておけばプログラミングに気が向く頻度が上がるかもしれません．

# 確認

Terminalで`gcc --version`と`make -v`を実行してgccとmakeのバージョンが表示されるか確かめましょう．
表示されたら無事インストールできているはずです．
お疲れ様でした．

**僕たちのプログラミングはこれからだ！**
バッチでpostgreDBからデータ抽出を行う

バッチでpostgresDBに接続してデータ抽出を行う。
実行ファイルはedb-psql.exeを用いる。

###実行環境
windows server 2008 R2 Standard
psqledit_4.0.4.1


###バッチ構成

```
D：
 |--¥#Batch開発
       |
       |--bat
       |   |--テストpos.bat
       | 
       |--sql
           |--テストpos.sql
```

###テストpos.bat

```text:テストpos.bat
@echo off
SET PGPASSWORD=testpass
SET PGUSER=usr_test
SET PGPORT=5432
SET PGHOST=10.xx.xx.xx
SET PGDATABASE=db_tsna

clip < ¥encoding SJIS

echo #############################
echo ## postgresに接続
echo #############################

D:¥db¥PostgreDB¥migrationstudio¥edb-psql.exe -f "D¥#Batch開発¥sql¥テストpos.sql"
```

使用するのはpsql.exeではなくedb-psql.exeです。


###テストpos.sql

```sql:テストpos.sql
¥o PAR_DATA.txt

select 一連番号,更新年月日,sum(金額)
from table_TEST
where 更新年月日 < '20190301' and 更新年月日 > '20190131'
group by 一連番号,更新年月日
order by sum(金額) desc;

¥q
```

###補足説明
先頭に¥o [ファイル名].[拡張子]を記述すると、postgreでファイル出力ができます。
セットとして最後尾に¥qを書いて、勝手に終了するようにします。
sqlスクリプトの保存は**文字コードがUTF8、改行コードはLF**にしないとうまくSQL文を読み取ってもらえません。
この時、出力ファイル名が日本語の場合は文字化けしてしまうので、今回は英語にしています。
出力ファイル名を変更したい場合は、テストpos.batの中にリネーム(ren)コマンドを付け加えることで対応できます。（コードは模索中です）
復刻 VBAのtips解説

#018. ADOを用いてテーブルやレコードを削除する方法 ： VBAのTips解説
http://accessclub.jp/vbakaisetu/18.html

###<font color="Bronwn">Deleteメソッド</font>
Deleteメソッドとは、カレントレコードを削除したり、テーブルやテーブルフィールド、などをコレクションから削除するメソッドです。DAO、ADOともに使用できますが、削除可能なレコードセットであることが必要です。削除を行うテーブルが連鎖削除リレーションの主テーブルである場合、カレントレコードの削除を行う際、外部キー側のテーブルレコードも削除される可能性があります。


#####:green_book:書式

```vb
recordset.Delete
```

#####:green_book:引数

|引数|意味|指定|
|:---:|:----|:---|
|Recordset|開いているRecordsetオブジェクト変数を指定します|省略不可|

#####関連項目
<OL type="1">
<LI>CurrentDbメソッド（DAO）
<LI>TableDefs（DAO）
<LI>Open（ADO）
<LI>MoveNext（ADO）
</OL>

$\style{background-color:DodgerBlue;}{事例 )ADOを用いて"株式会社"の文字を持つレコードを削除する}$

####ADOを用いて"株式会社"の文字を持つレコードを削除します。
<OL type="1">
<LI>テーブルを作成します。 <br>
<LI>ID、取引先フィールドを作成します。
<LI>連結フォームを作成します。
<LI>ID、取引先テキストボックスを作成します。
<LI>実行するコマンドボタンを作成します。
</ol>

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/d9e6fc1d-ee65-47ba-daab-0c1db1f4c054.png)

$\style{background-color:DodgerBlue;}{コマンドボタンクリック時イベントプロシージャの作成}$

コマンドボタンクリック時イベントプロシージャを以下のように作成します。

コマンドボタンクリック時イベントプロシージャを以下のように作成します。

```vb
Private Sub 実行_Click()

   On Error GoTo エラー

   Dim cn As New ADODB.Connection
   Dim rs As New ADODB.Recordset
   Dim strTbl As String
   Dim strMoji As String
   Dim varRet As Variant

   Set cn = CurrentProject.Connection
   strTbl = "納入先マスター"
   strMoji = "株式会社"
   rs.Open strTbl, cn, adOpenKeyset, adLockOptimistic

   Do Until rs.EOF
  If InStr(rs!取引先, strMoji) <> 0 Then '--- A
   rs.Delete
  End If
  rs.MoveNext
   Loop

   Me.Requery '--- B

   rs.Close: Set rs = Nothing
   cn.Close: Set cn = Nothing

   Exit Sub

エラー:

If Err.Number = -2147217900 Then
   MsgBox "該当するテーブルがありません。"
   Else
   MsgBox Err.Number & " : " & Err.Description
End If

End Sub
```

###<font color="Bronwn">解説</font>
<OL>
A.InStr関数は指定した文字が見つからなかった時、0を返します。 <br>
B.削除したレコードをフォーム上から排除します。
</OL>

$\style{background-color:DodgerBlue;}{動作確認}$
<OL type="1">
<li>フォームをビューモードで開きます。
<li>[実行]ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/1f2292da-bc9a-eb16-a668-b9596a161edb.png)

<li>[実行]ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/ae86a4e3-a696-caa6-6164-6c8b35b3f606.png)
</ol>
bsh-if文

# Shellのif文について
shell のif文で if test -f test.txtだのif [ -f test.txt ] など書き方があって、
意味を忘れがちになってしまうので、shellのif文について簡単なメモ書きでまとめます。

## if文の前にtestコマンドについて
testコマンドとは、条件式の評価をして真偽値を返却してくれるコマンド。
ファイルの有無や文字列比較に用いることが多く、if文を書くときに必ず出てくると言っていいほどのコマンドです。

## if文の基本形

```bash
#!/bin/sh
if test -f test.txt
then
  echo 'test.txt'
elif test -f text.sh
then
  echo 'test.sh'
else
  echo 'nothing'
fi
```
- if文はifで始まりfiで終わります。
- そして、条件式のあとにthenをつけて、コマンドの実行文を書きます。

## 条件部を１行で

```bash
#!/bin/sh
if test -f test.txt; then
  echo 'test.txt'
elif test -f text.sh; then
  echo 'test.sh'
else
  echo 'nothing'
fi
```

- 条件部の最後にセミコロンをつけて、１行で表現

## testコマンドの省略

```bash
#!/bin/sh
if [ -f test.txt ]; then
  echo 'test.txt'
elif [ -f text.sh ]; then
  echo 'test.sh'
else
  echo 'nothing'
fi
```
- testコマンドを省略した場合、[]で条件をくくる。
- []内部の空白は文法上必須だから注意
herokuでページを更新をする。

#事件発生
herokuで作成したアプリに静的ファイルを以下のコマンドでアップロードする。

```
$ git push heroku master
```
そしてファイルを更新して再度同じコマンドでアップロードする。

```
$ git push heroku master
Everything up-to-date
```

ここで事件が発生。
”””全てアップロードしましたよ”””と表示されているのに確実にアップされていない。


#解決方法
プッシュする前に以下のコマンドを叩く。

```
git commit -am "コメント"
```

そして先ほどのコマンドをもう一度叩く。

```
$ git push heroku master
```
今度はEverything up-to-dateではなくremote: 〜がいっぱい出でくる。
これでページは更新されました。