OmniAICreator/Qiita-1.07M huggingface dataset:
［Ruby/Python/Java/Swift/JS］アルゴリズムとは？

### この記事を書く理由
1. アルゴリズムに関する知識を自分なりにまとめる（かなりざっくり）
2. 忘れた時に確認する

## アルゴリズム（algorithm）とは？
### 広義の定義
> 「仕事をやり遂げるための一連の手順」[^1]


### 日常生活にも「アルゴリズム」がある。
問題： 玄米（新米）[^2]を、おいしく炊きたい。

おいしい玄米の炊き方（=これが**「アルゴリズム」**）
　1. 玄米を洗ったあと、12時間〜24時間吸水させる　
　2. 玄米と同カップの水と塩・日本酒を入れる。
　3. 10分で沸騰するような火加減で加熱、沸騰したら弱火で15分加熱。
　4. 火を消し15分蒸らす。

▲ の炊き方を守れば、ガスでも電気コンロでもIHでも美味しく炊ける。
▲ そもそも、鍋で炊かなくても炊飯器で炊いてもOK


### 「アルゴリズム」が、マーケットを動揺させた事例[^3]
2010年5月6日 14時47分（アメリカ東部時間）　ダウ平均が３分間の間に1000ドル下落（=**フラッシュクラッシュ**）

この現象が発生した考えられる理由：詳細は未だ不明

・当時ギリシャ政府の債務不履行に陥る危機感が世界中にあり、それが現実になると世界的な金融恐慌に陥る恐れだった
・とあるファンドマネージャーが使っていたアルゴリズムが４０億ドル分の株式先物を売却するスピードが早すぎ、他のアルゴリズムが呼応した
・複数のトレーダーが結託して、複数のアルゴリズムを使いマーケットを暴落させようとした


## コンピュータの世界の「アルゴリズム」


### 再帰
再帰を利用して、階乗を求めるアルゴリズムを書く（Ruby/Python/Java/Swift）

```ruby:factiorial.rb
def factorial(number)
	if number == 0
		1
	else
		number * factorial(number - 1)
	end
end

(0..20).each do |i|
	puts "#{i}! = #{factorial(i)}"
end
```
```python:factiorial.py
def factorial(number):
    if(number==0):
        return 1
    else:
        return number * factorial(number-1)

for i in range(1,20+1):
    print(str(i) + "! = " + str(factorial(i)))
```

```java:Factorial.java
class Factorial{
	public static int factorial(int number){
		if (number == 0){
			return 1;
		} else {
			return number * factorial(number - 1);
		}
	}

	public static void main(String[] args){
		for(int i=1; i<=20; i++){
			System.out.println(i + "! = " + (factorial(i)));
		}
	}
}
```

```swift:factorial.swift
func factiorial(_ number:Int) -> Int{
    if(number==0){
        return 1
    } else {
        return number * factiorial(number-1)
    }
}

for i in 0...20 {
     print("\(i)! = \(factiorial(i))")
}
```

```javascript:factorial.js
const factorial = (number)=>{
   if(number===0){
       return 1;
   } else {
       return number * sample(number-1);
   }
}

for(let i=1; i<=20; i++){
   console.log(`${i}! = ${factorial(i)}`);
}
```

```command:Ruby/Python/Swift/JS出力結果
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
```
```command:Java出力結果
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 1932053504
14! = 1278945280
15! = 2004310016
16! = 2004189184
17! = -288522240
18! = -898433024
19! = 109641728
20! = -2102132736
```

### その他のアルゴリズム
[線形探索](https://qiita.com/tanakadaichi_1989/items/61244707d1bd6a207efe)
[二分探索](https://qiita.com/tanakadaichi_1989/items/b9b6a6807c98c62d8109)
[ハッシュ探索](https://qiita.com/tanakadaichi_1989/items/e0ba7836cb2c9bcbfd62)

### 編集履歴
2018/11/03 投稿
2018/11/19 JSのコードを追加・タイトル変更
2018/12/01 線形探索のリンクを追加
2018/12/02 二分探索・ハッシュ探索のリンクを追加

### 参考資料
・クリストファー・スタイナー（訳：永峯涼）「アルゴリズムが世界を支配する」（KADOKAWA,2013）
・トーマス・H・コルメン（訳：長尾高弘）「アルゴリズムの基本」（日経BP社,2016）
・柴田望洋「新・明解Javaで学ぶアルゴリズムとデータ構造」（SBクリエイティブ,2017）

[^1]: 「アルゴリズムの基本」 p15
[^2]: 自宅に炊飯器がないのと出来るだけモノを増やしたくないため、鍋で米を炊いている。
[^3]: 「アルゴリズムが世界を支配する」 pp.5-10
jQueryの基礎（概念・メソッド）

##【jQueryとは？】
jQuery：JavaScriptのライブラリでJavaScriptで行える全てのことをJavaScriptよりも簡単にできる。
→簡単に言うと、「JavaScriptで書かれた様々なお役立ち機能を、後に再利用しやすい形でまとめあげたパッケージ」
※JavaScript：HTML/CSSを操作するための言語

＜前提（処理のタイミング）＞
JavaScriptはHTMLのhead要素内に入っているので、書き換えたいbody要素を読み込む前に処理が終了している状態になっている。だから下記のような記述をして、HTML要素が全て読み込み終わったタイミングで処理を実行するように記述する。リセットCSS並に必須事項。

```javascript:sample.js
$(function( ) {

});
```

##【jQueryの基本ルール】
jQueryの基本ルールは極めてシンプルで2つだけ。


①**操作したいHTML要素を取得**
②**取得したHTMLに操作（命令）を付与**
→操作（命令）が起こるキッカケを設定してあげないといない。これを**「イベント」**と呼ぶ。


＜イベント＞
→HTMLの要素に対して行われた処理要求。「ユーザーがブラウザ上のボタンをクリックした」「テキストフィールドでキー入力をした」「要素の上にマウスカーソルを乗せた」などいずれもイベント。分かりやすくいうと、Railsで言うリクエストのイメージ。
ーーーーーーーーーーーーーーーーー
**①操作したいHTML要素を取得**


＜取得方法＞
■基本形
$("セレクタ")

■IDセレクタ
$("#Selector")

■クラスセレクタ
$(".Selector")

■要素セレクタ
$("h1")


**②取得したHTMLに操作（命令）を付与**


＜操作（命令）方法＞
$("セレクタ").jQueryの命令 (  ) ;
$("セレクタ").jQueryの命令 (引数) ;


##【メソッド】##
**■val( )メソッド**
→フォームに入力された値を取得したいときに使う。
実際に使うときは、取得した値を変数に代入して使う。


＜例＞

```javascript:sample.js
var input = $("#keyword").val( );
/*keywordというidセレクタに入力されたフォームの値を取得し、input変数に代入する。/*
```

**■text ( )メソッド**
→テキストを書き換えたいときに使う

```javascript:sample.js
$("#title").text ("変更したタイトル名") ;
```

■**html ( )メソッド**
→HTML要素のテキストをHTMLを含むテキストに書き換えたいときに使う

```javascript:sample.js
$("p").html("<strong>変更されたコンテンツ</strong>");
/*これはHTML要素のテキストをstrongタグで強調された（太字）の「変更されたコンテンツ」というHTMLに書き換えている/*
```

###★on( )メソッド###
→どんなイベントが起きたら、何が実行されるかを設定したいときに使う

```javascript:sample.js
$(function() {
    $("セレクタ").on("イベント名",function( ) {
        /*イベントが起きたときに行う処理/*
    });
});
```

これを基本ルールに則って解釈すると、


①操作したいHTML要素を取得
→$( " セレクタ " )


②取得したHTMLに操作（命令）を付与 ＆ 操作・命令が起きるキッカケ（イベント）を設定
→.on( " イベント名 ", function( ) {

＜イベント名一覧＞
その他イベント名については、下記URLをご参照ください
https://javascript.programmer-reference.com/jquery-list-event/

	
**■append ( )メソッド**
→引数で指定したHTML要素を追加したいときに使う

```javascript:sample.js
$ ("#lists").append('<li class = "list">追加されたリスト</li>') ;
```

**■remove ( )メソッド**
→指定したHTML要素を削除したいときに使う

```javascript:sample.js
$ (".list").remove( ) ;
/*今回は上記のappendメソッドで追加したlistクラスのセレクタ（".list"）を指定して、削除しています/*
```
**■attr( )メソッド**
→HTML要素の属性値を取得・変更したいときに使う。

```javascript:sample.js
$("セレクタ").attr("取得したい属性名") ;
$("セレクタ").attr("変更したい属性名", "変更したい属性値 ")
```
```javascript:sample.js
$("changeButton").on("click",function( ) {
    $("img").attr("src", "http:// ~~~ ") ;
});
```

＜コードの説明＞
「changeButton」要素を「click」したときに、「img」要素の「src」属性の属性値を「http:// ~~~」に変更する。
※<img>要素タグは、画像を表示する際に使用し、src属性は記述の際には必須の属性で、src属性の属性値を記述することで画像ファイルのURLを指定する。つまり上記の記述は実際のブラウザ上では、既に指定されていた「src」属性の属性値が「http:// ~~~」という別の属性値に変更されるので、表示される画像が「http:// ~~~」の画像に変化するという操作（命令）を付与したことになる。
→HTML5タグリファレンス　http://www.htmq.com/html5/img.shtml


**■addClass ( )メソッド**
→指定した要素に引数で設定したクラスを追加したいときに使う

```javascript:sample.js
$("p").addClass("red");
```
**■removeClass( )メソッド**
→指定した要素に引数で設定したクラスを削除したいときに使う

```javascript:sample.js
$("p").removeClass("red");
```

＜その他のメソッド＞
■hide ( )メソッド
→要素を非表示にしたいときに使う

■show ( )メソッド
→非表示の要素を表示にしたいときに使う


■fadeOut ( )メソッド
→指定したHTML要素をフェードアウトさせたいときに使う。
引数にはフェードアウトにかかる時間を記入。1000＝1秒


■fadeIn ( )メソッド
→指定したHTML要素をフェードインさせたいときに使う。
引数にはフェードインにかかる時間を記入。1000＝1秒
アセンブリ(NASM)で関数作ってC言語で呼ぶ

# 環境
- OS : Ubuntu 18.04
- アセンブラ : NASM 2.13.02
- リンカ : ld 2.30

# ソースコード
```ruby:function.asm
global _nasm_hello
global _nasm_exit

[section .data]
string1: db "Hello", 0x0a
length1: equ $ - string1

[section .text]

_nasm_hello:
	mov rax, 1
	mov rdi, 1
	mov rsi, string1
	mov rdx, length1
	syscall
	ret

_nasm_exit:
	mov rax, 60
	mov rdi, 0
	syscall
```

```ruby:main.c
void _nasm_hello(void);
void _nasm_exit(void);

void main(void){

	_nasm_hello();
	_nasm_exit();

}
```

# コマンド
`nasm -felf64 function.asm -o function.obj`
`gcc -c -o main.obj main.c`
`ld -e main -o exe main.obj function.obj`
`./exe`

# 最後に
今回は色々と間違っていることがると思います。
というのも、試行錯誤しているときに`Segmentation fault (コアダンプ)`と出てきてしまったりしたからです。
最終的に出てこなくなりましたが、ご指摘などありましたらコメントお願いします。
そしてセンター試験まで残り75日くらいなのでやばいです。発狂してます。
Pythonの仮想環境を構築する

## はじめに
pyenvというPythonのバージョン管理ツールを使っていると、
pip等で導入したパッケージはPythonのバージョンごとに管理されますが、
各プロジェクトごとにパッケージを分けたい場合もあるかと思います。

pyenv-virtualenvを導入することで、同じPythonのバージョンでも、
複数の仮想環境を管理することができるようになります。

## pyenv-virtualenvをインストールする

**:warning:pyenvのインストールがまだの場合は [こちら](/r-fuji/items/cdb53f36b975d0123aad#pyenv%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B) をご参照ください。**

まずはHomebrewでpyenv-virtualenvをインストールします。

```terminal
$ brew install pyenv-virtualenv
```

インストールが完了したら、 以下のコマンドを実行します。

```terminal
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
```

## 仮想環境を構築する
例えばPython 3.6.5の仮想環境を構築する場合は、以下のように行います。
仮想環境の名前は何でもいいですが、仮に「virtual1」とします。

```terminal
$ pyenv virtualenv 3.6.5 virtual1 #virtual1 という名前で環境を作成
```

その後インストール済みのPythonのバージョンを確認してみると、
新たに「virtual1」が追加されていると思います。

```terminal
$ pyenv versions #インストール済み一覧を表示
  system
* 3.6.5 (set by /Users/[ユーザー名]/.pyenv/version)
  3.6.5/envs/virtual1
  virtual1
```

ただし、ここで新しく作った環境では、
pyenvの環境でpip等でインストールしたパッケージは使えません。
それらのパッケージも使えるようにしたければ、
「--system-site-package」というオプションを付けます。

```terminal
$ pyenv virtualenv --system-site-packages 3.6.5 virtual2 #virtual2 という名前で環境を作成
```

## 仮想環境を切り替える
仮想環境を切り替える場合は、以下のように行います。

```terminal
$ pyenv activate virtual1 #virtual1 に入る
$ pyenv activate virtual2 #virtual2 に入る
$ pyenv deactivate #仮想環境から抜ける
```

#おまけ
「pyenv virtualenvs」で、仮想環境だけを表示することも可能です。
あまりこのコマンドを使う機会はなさそうですが。

```terminal
$ pyenv virtualenvs

  3.6.5/envs/virtual1 (created from /Users/[ユーザー名]/.pyenv/versions/3.6.5)
  3.6.5/envs/virtual2 (created from /Users/[ユーザー名]/.pyenv/versions/3.6.5)
  virtual1 (created from /Users/[ユーザー名]/.pyenv/versions/3.6.5)
  virtual2 (created from /Users/[ユーザー名]/.pyenv/versions/3.6.5)
```
Hugo でローカルサーバーかどうかで条件分岐する

Hugo Theme を自作していると 「`hugo server` を実行した時だけこの処理をしてほしい」なんてことがあると思います。Hugo はその要望に応える機能を提供していますが、あまり知られていないと感じるので紹介します。



## `.Site.IsServer` 変数を見ればいい

結論から言うと `.Site.IsServer` 変数を見て条件分岐すればオッケーです。

`hugo server` でローカルサーバー(ビルトインサーバー)を立ち上げた時に `True` が格納されます。以下の公式ドキュメントで紹介されています。

- [Site Variables | Hugo](https://gohugo.io/variables/site/)

> `.Site.IsServer`
>
> a boolean to indicate if the site is being served with Hugo’s built-in server. See `hugo server` for more information.



## 利用ケース

`.Site.IsServer` 変数を使えば簡単に実現できます。

### リソースの取得先を変更する

例えば、PCがオフラインの時でも `hugo server` でレンダリング結果を確認したいと思ったら、 CSS や JavaScript の読み込みを、

- ローカルサーバー(`hugo server`)の時はローカルのリソースにアクセスする。
- サイトを生成(`hugo`)した時は https で始まるリンクを指定する。

というように分岐させれば良いです。

### Google Analytics のオン・オフ

`hugo server` を実行した時のサイトでは Google Analytics にアクセス解析させたくない場合もあるかと思います。というかその時は Google Analytics を生成する意味はないです。



## `.Site.IsServer` の使い方

実際の使い方です。

```html
{{ if $.Site.IsServer }}
  <script src="/local/materialize/materialize.min.js"></script>
{{ else }}
  <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js" defer></script>
{{ end }}
```

`/local/materialize/materialize.min.js` は `${hugo_theme_root}/static/local/materialize/materialize.min.js` に配置しておきます。

このようにしておくことで、 `hugo server` を実行した時には上の script タグが展開され、 `hugo` コマンドを実行した際には下の script タグが展開されるようになります。

以上です。ありがとうGoざいました ʕ◔ϖ◔ʔ
MySQLに接続すると"java.sql.SQLException: The server time zone value"が出る

## 環境

MySQL：5.7.21
Spring-boot：2.1.0
MyBatis spring-boot-stater：1.3.2
MySQLドライバ：mysql-connector-java-8.0.13

## 解決

DDBC接続のURLに serverTimezone パラメータを付ける。

```
spring.datasource.url=jdbc:mysql://localhost:3306/test
```

↓

```
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=JST
```

## 備考

古い組み合わせ↓だとパラメータ無しでも普通に動くけど、例外出るようになったのは謎。（まー、どっか変わったんでしょうけど。。
MySQL：5.7.21
Spring-boot：2.0.5
MyBatis spring-boot-stater：1.3.2
MySQLドライバ：mysql-connector-java-5.1.47
Windows環境でBIGSQLのPostgreSQL 10でPostGISをインストールする方法

# はじめに
BIGSQLのインストーラーで、PostgreSQL10をインストールした場合、PostGISは付録しておりません。故に、`CREATE EXTENSION postgis;` をしてもエラーが出ます。

BIGSQLにもPostGISのインストール方法の記載があります
https://www.openscg.com/bigsql/docs/postgis/postgis/

# 古くて参考にならないオフィシャル情報

BIGSQLには下記のようなPostGISのインストール方法が記載されています。

```
C:\Program Files\PostgreSQL>pgc install postgis23-pg96
  ['postgis23-pg96']
Get:1 http://s3.amazonaws.com/pgcentral postgis23-pg96-2.3.0-win64
  Unpacking postgis23-pg96-2.3.0-win64.tar.bz2
```

このコマンドでは、PostgreSQL9.6で、PostGIS2.3 をインストールするという代表例であり、PostgreSQL10では参考になりません。

# BIGSQLの PostgreSQL 10 に postGIS 2.4 を入れる方法

## インストールコマンド
BIGSQLのPostgreSQLはpgcコマンドによって管理しされています。
PostGISのインストールは`pgc install `によって実現します。

STEP0：コマンドプロンプトの起動（※管理者として実行）
STEP1：pgc.batが配置されれているディレクトリに移動
STEP2：`pgc install postgis24-pg10` を実行

```
c:\PostgreSQL10のインストールフォルダ>pgc install postgis24-pg10
  ['postgis24-pg10']
Get:1 https://s3.amazonaws.com/pgcentral postgis24-pg10-2.4.3-1-win64
 Unpacking postgis24-pg10-2.4.3-1-win64.tar.bz2
```
管理者権限が無いユーザアカウントで実行するとエラーが出ると思います。
コマンドプロンプトを実行する際に、アイコンを右クリックして「管理者として実行」を忘れずに。
プログラムを書くときに心がけている事

ときどき「きれいですね」って言われることがあリます。
Qiitaなので、もちろん容姿のことではなく、ソースコードのことです。
お世辞でもそう言ってもらえるのは嬉しいので、普段どんなことを気をつけているか書いておく事にしました。なお、Code Completeとかに書いてあるような一般的なことは、書いても面白くないので省略してます :-P

# そもそも書かない

自分が使っている言語やフレームワークの機能をしっかりと理解して、車輪の再発明をしないように心がけています。例えば、Pythonでループ処理でループのインデックス値も使いたい場合。例えばこんなソースコードを書いてみます。

```python:ループのインデックス値を独自実装で使う
names = ['Alice', 'Bob', 'Charlie']
index = 0
for name in names:
    print (index, name)
    index += 1
```

でも、実はPythonにはループ時に要素だけでなくカウンタも取得できる`enumerate`があります。

```python:ループのインデックス値をPythonの機能で使う
names = ['Alice', 'Bob', 'Charlie']
for index, name in enumerate(names):
    print (index, name)
```

この例のように、自分が使っている言語やフレームワークにどんな機能があるのかを、常に好奇心を持って探すようにしています。

# 改行やスペースに注意を払う

インデントを揃えるのはもちろんなのですが、スペースや改行にも注意を払います。意味のない２文字以上のスペースや２行以上の改行は使わないようにしています。余分なスペースや改行は、ソースコードフォーマッターも積極的にはきれいにしてくれません。

```Java:こういう事にならないよう気をつけている
public class Person  {  /* ← 中括弧の前が意味なく２文字スペース */
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
        /* ← 意味なく２行以上の改行 */

}
```

# 画面は小さめ、フォントは大きめ

ときどき若い人で、巨大なモニターに小さな文字でコーディングをしている人を見ます。そんな見晴らしのいい環境だと、ちょっとやそっとのサイズではメソッドを分割しようというモチベーションがわかないので、ノートパソコンオンリーで作業しています。

# 名前を可能な限り短くする

変な略語にならないレベルで、変数名やメソッド名を短くする。特に意味の重複などには気をつける。

```Java:重複あり
public class Player {
    private int playerId

    public void setPlayerId(int playerId) {
        this.playerId = playerId;
    }

    public int getPlayerId() {
        return playerId
    }
}
```

このクラスだと、player用のものであることは明白なので、その辺を短くして見ます。
でも、Playerクラスの中に入っているので、idだけで意味は通じますよね、多分。

```Java:重複を削除
public class Player {
    private int id

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return this.id;
    }
}
```

# ゴミ掃除をする

使われなくなったライブラリー、呼ばれなくなったメソッド、参照されなくなった変数などは、気がついたら消すようにしています。IDEのサポートもありますが、メソッド呼び出される可能性があるかどうかについて調べるには、そのメソッドをコメントアウトしてコンパイルしてみるとわかります（ただしリフレクションで呼ばれることを除く）。

# 神は細部に宿る

最後ですが、神は細部に宿ります。こう言った日々の活動の積み重ねが、コードをきれいにするコツかなと思いました。まる。
GoogleAppsScriptで修正が反映されない

GoogleAppsScriptでプログラムを書いて一度公開したあと、
プログラムを修正をしたときに、修正内容が反映されなくてちょっと困ったのでメモ。

プログラムの修正を反映させるには、

「公開」→「ウェブアプリケーションとして導入・・・」をクリック

<img width="270" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/24392/e2bf33bf-dee1-cc9d-d83b-2bbdfce993a8.png">

プロジェクトバージョンで「新規登録」を選択。「更新」ボタンをクリックして保存。

<img width="447" alt="２.png" src="https://qiita-image-store.s3.amazonaws.com/0/24392/8835306d-fa4d-5a91-765d-3036720b47f7.png">


これで修正した内容が反映される。
VSCodeでC言語自作ヘッダファイルの追加方法

#1.cファイルの作成
```C:sum.c
#include <stdio.h>
#include "sum.h"

int main(void){
    int value;
    value = sum(50,100);
    printf("%d\n",value);
    return 0;
}

int sum(int min,int max){
    int num;
    num = (min + max) * (max - min+1) / 2;
    return num;
}
```
#2.hファイルの作成
```C:sum.h
int sum(int min,int max);
```
#3.新規ヘッダファイルの追加
```json
{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "ここにパスを追記"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}
```
**使っているコンパイラにより手順が異なる場合があります。**
作業ディレクトリの.vscodeディレクトリの配下にあるc_cpp_properties.jsonファイルの**includePath**という括弧内にヘッダファイルのパスを追記し、保存すればOK。
SalesforcexytoolsCore Introduce

# The original page link
[SalesforcexytoolsCore Introduce](http://salesforcexytools.com/SalesforceXyToolsCore-JP/SalesforceXyToolsCoreJP/001-SalesforceXyToolsCore-Introduce.html)


# Introduce
> SalesforcexytoolsCore is a python library for salesforce. It is base on [simple-salesforce](https://github.com/simple-salesforce/simple-salesforce)

* Sobject Record Management : sobject create, get, get_by_custom_id, update, delete
* Sobject Queries : query, query_more, search, query_allsearch
* Sobject Bulk action
* Run Apex Script
* Metadata Control : describeMetadata, listAllMetadata, getAllMetadataMap, listmeta, listFolder, retrieve, etc.
* Package.xml builder.
* Retrieve Metadata to memory, Retrieve Metadata zip file.
* ApexClass, Trigger, ApexComponent, ApexPage: create, update, delete, get
* Get Apex Log 
* Run test class

# Requirement
* Python3
* [requests](http://requests-docs-ja.readthedocs.io/en/latest/)

# Install
```
pip install SalesforcexytoolsCore
```

# Document
[SalesforceXyToolsCore JP Document](http://salesforcexytools.com/categories/SalesforceXyToolsCore-JP/)


# Download PDF
[SalesforcexytoolsCore-python-library-for-salesforce(日本語).pdf](http://salesforcexytools.com/pdf/SalesforceXyToolsCore-Python-Library-For-salesforce-jp.pdf)


# About Author : Exia.Huang

* [SalesforceXyTools HP](http://salesforcexytools.com)
* [Github](https://github.com/exiahuang)
* [Twitter](https://twitter.com/ExiaSfdc)
* [Facebook](https://www.facebook.com/profile.php?id=100015890262852)
* [Qiita](https://qiita.com/exiasfdc)
* [Hatenaはてなブログ](https://exiasfdc.hatenablog.com/)


# Sample Source
[Sample Source](https://github.com/exiahuang/SalesforceXyToolsCore/tree/master/example)

```
apexclass-create.py
apexclass-delete.py
apexclass-update.py
apexcomponent-create.py
build-package-xml.py
config.py
describe-metadata.py
download-attachments.py
get-all-metadata-map.py
get-apexlog.py
list-all-metadata.py
list-folders.py
list-metadata.py
package-type-list.py
retrieve-metadata-to-memory.py
retrieve-metadata-to-zip.py
run-apex-script.py
run-rest-api.py
run-soql-queries.py
run-testclass.py
sobject-CURD.py
trigger-create.py
visualforce-create.py
```
SalesforceXyToolsCore/Python上でSobjectを作成・更新・削除

# The original page link
[SalesforceXyToolsCore/Python上でSobjectを作成・更新・削除](http://salesforcexytools.com/SalesforceXyToolsCore-JP/SalesforceXyToolsCoreJP/003-sobject-curd.html)



# Topic

* [SalesforceXyToolsCore](http://salesforcexytools.com/categories/SalesforceXyToolsCore-JP/)を使ってSobjectを作成・更新・削除



# IDでSobjectの取得

Salesforce組織のユーザ名、パスワード、Apiバージョン、Product/Sandboxを設定してください。

> Accountを取得する

```python
from SalesforceXytoolsCore import *
import pprint

config = {
    "api_version": 42.0, 
    "username": "sfdc username", 
    "password": "sfdc password", 
    "security_token": "", 
    "is_sandbox": True
}

soap_api = Soap(username=config["username"], 
                password=config["password"], 
                security_token=config["security_token"], 
                sandbox=config["is_sandbox"],
                version=config["api_version"]
                )

print('hello SalesforceXytoolsCore Test start')
Account = soap_api.get_sobject("Account")

"""
get a Sobject in Salesforce
"""
acc_id="set your sobject id"
account1 = Account.get(acc_id)
pprint.pprint(account1)
```

# 外部キーでSobjectの取得

```python
"""
get a Sobject by External ID
"""
account1 = Account.get_by_custom_id('My_Custom_ID__c', 'custom_id')
pprint.pprint(account1)

```


# IDでSobjectの更新

```python

"""
update a Sobject in Salesforce
"""
acc_id="set your sobject id"
account1 = Account.update(acc_id,{'LastName': 'sfdc'})
pprint.pprint(account1)
```


# IDでSobjectの削除

```python
"""
delete a Sobject in Salesforce
"""
acc_id="set your sobject id"
Account.delete(acc_id)
```
SalesforceXyToolsCore/Python上でApexClassを作成・更新・削除

# The original page link
[SalesforceXyToolsCore/Python上でApexClassを作成・更新・削除](http://salesforcexytools.com/SalesforceXyToolsCore-JP/SalesforceXyToolsCoreJP/002-apexclass-curd.html)



# Topic

* [SalesforceXyToolsCore](http://salesforcexytools.com/categories/SalesforceXyToolsCore-JP/)を使ってApexClassを作成・更新・削除



# ApexClassの作成

* Salesforce組織のユーザ名、パスワード、Apiバージョン、Product/Sandboxを設定してください。

```python
from SalesforceXytoolsCore import *
import pprint

config = {
    "api_version": 42.0, 
    "username": "sfdc username", 
    "password": "sfdc password", 
    "security_token": "", 
    "is_sandbox": True
}

tooling_api = ToolingApi(username=config["username"], 
                password=config["password"], 
                security_token=config["security_token"], 
                sandbox=config["is_sandbox"],
                version=config["api_version"]
                )

"""createApexClass"""
name = "HelloWorld"
body = """public class HelloWorld {
        private String mystr;
}"""


status_code, result = tooling_api.createApexClass(name, body)
print(status_code)
pprint.pprint(result)
```



結果確認：

```json
{'errors': [], 'id': '01pxxxxxxxxxxxxxxxxx', 'success': True}
```



# ApexClassの更新

```python
from SalesforceXytoolsCore import *
import pprint

config = {
    "api_version": 42.0, 
    "username": "sfdc username", 
    "password": "sfdc password", 
    "security_token": "", 
    "is_sandbox": True
}

tooling_api = ToolingApi(username=config["username"], 
                password=config["password"], 
                security_token=config["security_token"], 
                sandbox=config["is_sandbox"],
                version=config["api_version"]
                )

apexclass_id = "set your apex class id"
body = """public class HelloWorld {
        private String mystr1;
}"""
tooling_api.updateApexClass(apexclass_id, body)
```



# ApexClassの削除

```python
from SalesforceXytoolsCore import *
import pprint

config = {
    "api_version": 42.0, 
    "username": "sfdc username", 
    "password": "sfdc password", 
    "security_token": "", 
    "is_sandbox": True
}

tooling_api = ToolingApi(username=config["username"], 
                password=config["password"], 
                security_token=config["security_token"], 
                sandbox=config["is_sandbox"],
                version=config["api_version"]
                )

apexclass_id = "set your apex class id"
body = """public class HelloWorld {
        private String mystr1;
}"""
tooling_api.updateApexClass(apexclass_id, body)
```



# その他

## Triggerの作成

```python
"""createTrigger"""
tooling_api.createTrigger(tableEnumOrId, name, body)
```


## VisualForceの作成

```python
"""createApexPage"""
tooling_api.createApexPage(MasterLabel, name, markup)
```


## ApexComponentの作成

```python
"""createApexComponent"""
tooling_api.createApexComponent(MasterLabel, name, markup)
```
SalesforceXyToolsCore/Python上でApexScriptを実行する

# The original page link
[SalesforceXyToolsCore/Python上でApexScriptを実行する](http://salesforcexytools.com/SalesforceXyToolsCore-JP/SalesforceXyToolsCoreJP/005-run-apexscript.html)



# Topic

* [SalesforceXyToolsCore](http://salesforcexytools.com/categories/SalesforceXyToolsCore-JP/)を使ってSalesforceのApexScriptを実行する





# ApexScriptを実行する

Salesforce組織のユーザ名、パスワード、Apiバージョン、Product/Sandboxを設定してください。

```python
from SalesforceXytoolsCore import *
import pprint

config = {
    "api_version": 42.0, 
    "username": "sfdc username", 
    "password": "sfdc password", 
    "security_token": "", 
    "is_sandbox": True
}

soap_api = Soap(username=config["username"], 
                password=config["password"], 
                security_token=config["security_token"], 
                sandbox=config["is_sandbox"],
                version=config["api_version"]
                )

"""
Run Apex Script
"""
apex_string = "System.debug('hello world');"
debug_levels = {
        "DB": "Info", 
        "System": "DEBUG", 
        "Workflow": "INFO", 
        "Callout": "INFO", 
        "Validation": "INFO", 
        "Apex_Code": "DEBUG", 
        "Apex_Profiling": "INFO"
    }
result = soap_api.execute_anonymous(apex_string, debug_levels)
pprint.pprint(result)
```



## 結果ログを確認：

```json
{'debugLog': '42.0 '
             'APEX_CODE,DEBUG;APEX_PROFILING,INFO;CALLOUT,INFO;DB,INFO;SYSTEM,DEBUG;VALIDATION,INFO;WORKFLOW,INFO\n'
             "Execute Anonymous: System.debug('hello world');\n"
             '22:22:14.19 '
             '()|USER_INFO|[EXTERNAL]|xxxxxxxxxxxxxxxxxxxxxxxxx|日本標準時|GMT+09:00\n'
             '22:22:14.19 ()|EXECUTION_STARTED\n'
             '22:22:14.19 '
             '()|CODE_UNIT_STARTED|[EXTERNAL]|execute_anonymous_apex\n'
             '22:22:14.19 ()|USER_DEBUG|[1]|DEBUG|hello world\n'
             '22:22:14.19 ()|CUMULATIVE_LIMIT_USAGE\n'
             '22:22:14.19 ()|LIMIT_USAGE_FOR_NS|(default)|\n'
             '  Number of SOQL queries: 0 out of 100\n'
             '  Number of query rows: 0 out of 50000\n'
             '  Number of SOSL queries: 0 out of 20\n'
             '  Number of DML statements: 0 out of 150\n'
             '  Number of DML rows: 0 out of 10000\n'
             '  Maximum CPU time: 0 out of 10000\n'
             '  Maximum heap size: 0 out of 6000000\n'
             '  Number of callouts: 0 out of 100\n'
             '  Number of Email Invocations: 0 out of 10\n'
             '  Number of future calls: 0 out of 50\n'
             '  Number of queueable jobs added to the queue: 0 out of 50\n'
             '  Number of Mobile Apex push calls: 0 out of 10\n'
             '\n'
             '22:22:14.19 ()|CUMULATIVE_LIMIT_USAGE_END\n'
             '\n'
             '22:22:14.19 '
             '()|CODE_UNIT_FINISHED|execute_anonymous_apex\n'
             '22:22:14.19 ()|EXECUTION_FINISHED\n',
 'success': True}
```
SalesforceXyToolsCore/Python上でApexログを取得

# The original page link
[SalesforceXyToolsCore/Python上でApexログを取得](http://salesforcexytools.com/SalesforceXyToolsCore-JP/SalesforceXyToolsCoreJP/004-sfdc-get-apexlog.html)



# Topic

* [SalesforceXyToolsCore](http://salesforcexytools.com/categories/SalesforceXyToolsCore-JP/)を使ってApexログを取得



# Apexログを取得

* Salesforce組織のユーザ名、パスワード、Apiバージョン、Product/Sandboxを設定してください。

```python
from SalesforceXytoolsCore import *
import pprint

config = {
    "api_version": 42.0, 
    "username": "sfdc username", 
    "password": "sfdc password", 
    "security_token": "", 
    "is_sandbox": True
}

tooling_api = ToolingApi(username=config["username"], 
                password=config["password"], 
                security_token=config["security_token"], 
                sandbox=config["is_sandbox"],
                version=config["api_version"]
                )

"""get apex log"""
log_id = '07LXXXXXXXXXXXXXXXXXXXX'
result = tooling_api.getLog(log_id)
pprint.pprint(result)

```
SalesforceXyToolsCore/Python上でテストクラスを実行する

# The original page link
[SalesforceXyToolsCore/Python上でテストクラスを実行する](http://salesforcexytools.com/SalesforceXyToolsCore-JP/SalesforceXyToolsCoreJP/007-run-testclass.html)



# Topic

* [SalesforceXyToolsCore](http://salesforcexytools.com/categories/SalesforceXyToolsCore-JP/)を使ってSalesforceのテストクラスを実行する



# テストクラスを実行する

Salesforce組織のユーザ名、パスワード、Apiバージョン、Product/Sandboxを設定してください。

```python
from SalesforceXytoolsCore import *
import pprint

config = {
    "api_version": 42.0, 
    "username": "sfdc username", 
    "password": "sfdc password", 
    "security_token": "", 
    "is_sandbox": True
}

tooling_api = ToolingApi(username=config["username"], 
                password=config["password"], 
                security_token=config["security_token"], 
                sandbox=config["is_sandbox"],
                version=config["api_version"]
                )

"""run test class"""
id_list = ['xxx', 'xxxx']
tooling_api.runTestSynchronous(id_list)
```
SalesforceXyToolsCore/Python上でSalesforce組織のSoqlを実行する

# The original page link
[SalesforceXyToolsCore/Python上でSalesforce組織のSoqlを実行する](http://salesforcexytools.com/SalesforceXyToolsCore-JP/SalesforceXyToolsCoreJP/006-run-soql-queries.html)



# Topic

* [SalesforceXyToolsCore](http://salesforcexytools.com/categories/SalesforceXyToolsCore-JP/)を使ってSalesforce組織のSoqlを実行する



# メールテンプレートのフォルダーを取得する

* Salesforce組織のユーザ名、パスワード、Apiバージョン、Product/Sandboxを設定してください。

```python
from SalesforceXytoolsCore import *
import pprint

config = {
    "api_version": 42.0, 
    "username": "sfdc username", 
    "password": "sfdc password", 
    "security_token": "", 
    "is_sandbox": True
}

soap_api = Soap(username=config["username"], 
                password=config["password"], 
                security_token=config["security_token"], 
                sandbox=config["is_sandbox"],
                version=config["api_version"]
                )

"""
Run Soql Queries
"""
soql_string = "SELECT Id, Name FROM User LIMIT 3"
result = soap_api.query(soql_string)
pprint.pprint(result)


```



## 結果確認

```json
OrderedDict([('totalSize', 3),
             ('done', True),
             ('records',
              [OrderedDict([('attributes',
                             OrderedDict([('type', 'User'),
                                          ('url',
                                           '/services/data/v42.0/sobjects/User/005XXXXXXXXXXXXXXX')])),
                            ('Id', '005XXXXXXXXXXXXXXX'),
                            ('Name', 'Process Automated')]),
               OrderedDict([('attributes',
                             OrderedDict([('type', 'User'),
                                          ('url',
                                           '/services/data/v42.0/sobjects/User/005XXXXXXXXXXXXXXX')])),
                            ('Id', '005XXXXXXXXXXXXXXX'),
                            ('Name', 'サイトゲストユーザ')]),
               OrderedDict([('attributes',
                             OrderedDict([('type', 'User'),
                                          ('url',
                                           '/services/data/v42.0/sobjects/User/005XXXXXXXXXXXXXXX')])),
                            ('Id', '005XXXXXXXXXXXXXXX'),
                            ('Name', 'SFDC Exia')])])])
```



# その他方法

## query_more
```
soap_api.query_more(sobject_id)
soap_api.query_more("/services/data/v43.0/query/sobject_id", True)
```


## query_allですべてのデータを取得する
```
soap_api.query_all("SELECT Id, Email FROM Contact WHERE LastName = 'Jones'")
```

## search
```
soap_api.search("FIND {exia}")
```

## quick_search
```
soap_api.quick_search("exia")
```
SalesforceXyToolsCore/Python上でSalesforce組織の添付ファイルを一括ダウンロードする

# The original page link
[SalesforceXyToolsCore/Python上でSalesforce組織の添付ファイルを一括ダウンロードする](http://salesforcexytools.com/SalesforceXyToolsCore-JP/SalesforceXyToolsCoreJP/014-download-attachments.html)

# Topic

* [SalesforceXyToolsCore](http://salesforcexytools.com/categories/SalesforceXyToolsCore-JP/)を使ってSalesforce組織の添付ファイルを一括ダウンロードする

# Attachment
User が親オブジェクトにアップロードおよび添付したファイルをダウンロードする。
`Body`をファイルに保存すれば、完了です。

# Salesforce組織の添付ファイルを一括ダウンロードする

* Salesforce組織のユーザ名、パスワード、Apiバージョン、Product/Sandboxを設定してください。

```python
from SalesforceXytoolsCore import *
import pprint

config = {
    "api_version": 42.0, 
    "username": "sfdc username", 
    "password": "sfdc password", 
    "security_token": "", 
    "is_sandbox": True
}

SAVE_DIR = './attachments_download'
if not os.path.exists(SAVE_DIR):
    os.mkdir(SAVE_DIR)

rest_api = RestApi(username=config["username"], 
                password=config["password"], 
                security_token=config["security_token"], 
                sandbox=config["is_sandbox"],
                version=config["api_version"]
                )

attachments = rest_api.query("SELECT Id, Name, Body FROM Attachment LIMIT 2000")
print("添付ファイル件数 : " + str(len(attachments)))

for attachment in attachments["records"]:
    print("start to download : " + attachment["Name"])
    """
    Run Rest API : download attachment
    """
    rest_path = "/services/data/v42.0/sobjects/Attachment/{id}/Body".format(id=attachment["Id"])
    result = rest_api.call_rest(
        method='GET',
        path=rest_path, 
        params={},
    )
    with open(os.path.join(SAVE_DIR, attachment["Id"] + "_" + attachment["Name"]), mode='wb') as f:
        f.write(result.content)
```

実行すれば、添付ファイル件数ファイルをダウンロードする可能です。
GitLab CIをスケジュール実行する

* Pipeline Schedulesを使うとできます
* 公式の通りですがメモします

# 使い方

## 前提

* runner等の設定は終わっているものとします 

## `.gitlab-ci.yml`

* 以下のようにSchdule実行の時だけ実行する/しない jobを記述することができます

```.gitlab-ci.yml
job:on-schedule:
  only:
    - schedules
  script:
    - make world
job:
  except:
    - schedules
  script:
    - make build
```

## 設定場所

* 対象プロジェクトまで行きます
* `CI/CD`
* `Schedules`
* 右上の`New schedule`をクリック
* 適宜項目を入力します

## 設定項目で迷ったところ

### Interval Pattern

* 設定したい内容に近しい選択肢を選択します
* Cron syntaxが入力されます
* `Custom`を選択します
* Cron syntaxを設定したい内容に変更します
* の手順がはやそうですし、ミスが少ないかと・・・ :sob: 

### Variables

* key-valueの形で変数を設定できます
* `.gitlab-ci.yml`で`$key`という形で使用できます

# 参考

* [Pipeline Schedules](https://docs.gitlab.com/ee/user/project/pipelines/schedules.html)
* [only-and-except-simplified](https://docs.gitlab.com/ee/ci/yaml/README.html#only-and-except-simplified)
ディレクトリのみ、構造を保ったままコピー


ファイルのコピーは実行せず、ディレクトリのみを、構造を保ったままコピーする方法。

あるあるネタ[^1]なのだが、GNU coreutils の cp なら、find  xargs やら rsync やら使わずに簡単にできる。

[^1]: 近年のGoogle様だと、今回のやり方は上位に出てこない。何で？ 誰かしらメモってるだろうに。

```
$ mkdir -p foo/bar/buz
$ touch foo/bar/file1
$ cd foo && tree     # 本物の tree じゃないよ
/PATH/TO/foo/            
+--bar/                                        
   +--buz/                                     
   +--file1                                     
```

- [tree もどき](http://qiita.com/bunzaemon/items/ab8eedae6a1e380c9859#tree-%E3%82%82%E3%81%A9%E3%81%8D)




## cp -sr

foo を hoge としてディレクトリのみコピーしたい場合。

cp -sr で、コピー元を相対パス記載してコピーする。

```
$ cp -sr foo hoge
# STDERR は気にしない
$ cd hoge && tree
/PATH/TO/hoge/            
+--bar/                                        
   +--buz/     
```

ま、-s がコケるのを見越した、お行儀の悪いやりかたなんだけど。


## cp -sr 本来の使い方


で、

コピー元をフルパスで実施すると、ファイルのシンボリックリンクが出来る[^2]。

[^2]: コピー元にシンボリックリンクがあった場合は？ とかは調べてない。
```
$ cp -sr /PATH/TO/foo hoge2
$ cd hoge2 && tree
/PATH/TO/hoge2/            
+--bar/                                        
   +--buz/   
   +--file1
```

一気に再帰的にシンボリックリンクが作成できるので、深い階層に鎮座するデータを手元に構成したいときには便利。
SPA開発のプロジェクトメンバー(初心者)向けのタスク一覧兼指示書を公開します

# 概要

業務でSPA開発のフロントエンド部分を対応しており、チームで作業するにあたって必要なタスクの洗い出しの結果をまとめたので、せっかくなので今後の自分のためにも公開してみます:tada:

内容は、プロジェクトメンバーの1人(初級者コーダー)向けにまとめたものです。

中規模のSPAの開発を行うフロント界隈の人が、こんな感じでがんばってるのかと思ってくれれば嬉しい、、:ok_woman: 

プロジェクトはシェアエコ系のサービスを開発しているイメージでお読みください

内容をみて「もっとこうした方がいいよ」とか「意味がわからんぞこれ？」といった話あれば教えてください〜 :bow: 

# 前提

## プロジェクトイメージ

* SPA開発である
    * フロントエンドとバックエンドの作業が基本的に分離している
    * フロントエンドはアプリケーションにコミット、バックエンドはAPI開発にコミットしている
* デザインは基本決まってる
    * inVisionで共有されている
* 筆者の担当はフロントエンド
    * SPAとAPIのつなぎこみと
    * スタイリングが主な仕事
* よくあるシェアエコ系のサービス開発である
    * 画面数多くてつらい
    * やることは結構一般的
* 開発メンバーは3人
    * バックエンド1人
    * フロントエンド2人(うち1人はコーダー寄り)
* 導入技術/ルール
    * 全体
        * Reactオンリー(きつさを感じたらreduxとか考える)
    * ルーティング
        * react-router-dom
    * スタイリング
        * styled-components
    * コンポーネントの区分け方法
        * Atomic Design

### ディレクトリ構成

```
src/
├── App.js
├── components
│   ├── Shared
│   │   ├── Footer.js
│   │   └── index.js
│   ├── StyledComponents.js
│   └── atomic
│       ├── atoms
│       │   ├── Button
│       │   ├── Card
│       │   ├── InputField
│       │   ├── InputRadio
│       │   └── Label
│       ├── molecules
│       │   ├── ImageGallery
│       │   └── Setup
│       ├── organisms
│       │   ├── Header
│       │   └── Login
│       ├── pages
│       │   ├── Login
│       │   ├── Setup
│       │   ├── Signup
│       │   └── Top
│       └── templates
│           ├── Column
│           ├── Default
│           └── Page.js
├── containers
│   ├── LoginContainer.js
│   ├── SetupContainer.js
│   └── SignupContainer.js
├── helpers
│   └── media-query.js
├── images
│   └── user-avatar.png
├── index.css
├── index.js
├── registerServiceWorker.js
└── variables
    ├── colors.js
    ├── dimens.js
    ├── fontsizes.js
    └── index.js

```

## 筆者のレベル
* React歴1年、エンジニア歴2年半の初級~中級くらいのフリーランスエンジニア
* フロントエンドまるっと任されたの初めて
* reduxはしってるけどよくわかってない
* 雑魚


# ここから内容
※内容は少し抽象化してます

### 作業対象項目
- LP
- 新規登録・ログイン
- 登録後の設定
- マイページ
- 設定変更
- お知らせ
- 記事投稿
- 記事詳細

## 共通作業
- ページ作成(ルーティング/ファイル作成)
- 画面作成(スタイリング以外の画面作成)
- データなしでの動作作成(propsの受け渡しなど)
- スタイリング
- データつなぎこみ
- 動作確認

※順不同

## 共通作業詳細

### ページ作成(ルーティング/ファイル作成)

1. `src/components/atomic/pages/`配下に`PageName/index.js`を作成
2. `src/App.js`内でimportし`<Route exact path="/pagename" component={PageName} />`を追加

### 画面作成(スタイリング以外の画面作成)

1. デザインをもとにスタイリングなしのhtmlを`src/components/atomic/pages/PageName/index.js`に記述

※`src/components/atomic/`配下の`atoms、molecules、organisms、templates`をできるだけ使う

### データなしでの動作作成(propsの受け渡しなど)

1. コンポーネントを`atoms、molecules、organisms、templates`に切り分け
  - 参考: https://goo.gl/UTP9Q5
  - 参考2: https://goo.gl/jQo8Ju
2. 仮データをprops経由でコンポーネントが受け取り、表示できるようにする

※詳細まで作り込まないでOK。データつなぎ込み時の修正しやすさ重視で

### 【補足】データなしでの動作に、ユーザー操作(状態管理)が発生する場合

container(状態を管理するコンポーネント)を作成しstateを管理します。

1. `src/containers/CompNameContainer`を作成
2. class構文で記述し、stateを管理

### スタイリング

1. デザインをCSSで実現する

*補足*

* `src/variables`に定義されたAssetを積極的に利用する(定義内容はWIP)
* 固定値を利用しない、inVisionで自動生成されたコードを盲信しちゃダメ、、。

### データつなぎこみ

1. `src/containers/CompNameContainer`を作成
2. class構文で記述し、stateを管理
3. 必要な動作関数を定義

### 動作確認

1. 動作するようにpropsの受け渡しなど調整


# 以上です

各項目のタスクは、もっと詳細にタスク化していきます。
イケてないところとか、色々やばやばなところたくさんありそう、、:dizzy_face:
【AWS】AWSの登録・初期設定のまとめ【プログラミング学習69日目】

# はじめに
プログラミング学習を開始して69日が経過しました。

今後、Ruby / Ruby on Railsを本格的に学んでいくにあたり、開発環境の準備が必要そうだったため、このタイミングでアマゾンウェブサービス（AWS）の登録・初期設定をしてみましたが、初トライということもあり、非常に時間が掛かってしまいました。

そこで、次回設定時は効率よくできるように、備忘録として今回のトライで学んだことを残しておくこととしました。

#1. アカウント作成
[AWS アカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)に従って実施。
ここまでは問題ありませんでした。

#2. 初期設定時に必要な用語の理解
アカウントの作成後、初期設定をしようにも知らない用語のオンパレードだったため、まずはAWSのユーザーガイドをコツコツと読み進め、下記リンクにポイントをまとめていきました。

- [【AWS】初期設定、用語まとめ（ルートアカウント、IAM、IAMユーザー、IAMグループ、ポリシー）](https://fukutech.qrunch.io/logs/i8bxg41ZPxJ6Mqtr)

# 3. 登録後すぐにやるべきこと
前章で用語をまとめたことにより、ようやく下記リンクの内容が分かるようになりました。

- [AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](https://qiita.com/tmknom/items/303db2d1d928db720888)

これを見ると、登録後すぐにやるべきことは大きく分けて以下2点でした。

**(1) セキュリティ設定**
- MFA（多要素認証）の導入によるルートアカウントの保護
- 管理用のIAMアカウントの作成
- IAMパスワードポリシーの適用
- セキュリティステータスの確認
- git-secretsの設定

**(2) 利用料金の監視・アラートの設定**
- IAMユーザへの請求情報のアクセス許可
- AWSアカウントの設定
- 通知設定
- IAMユーザーへの切り替えとリージョン設定
- CloudTrailの設定

(1)はルートアカウントが悪用され、不正利用・高額請求などがないように、(2)は使用状況を把握し、高額な請求を予防するために必要な設定とのことです。

上記の設定ミスによる失敗談も見つけ、気を付けなければと思いました。
・[初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。](https://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694)
・[AWS無料枠の落とし穴](https://www.skyarch.net/blog/?p=8798)

#3. 具体的な初期設定の方法
下記2つのサイトを参考にしながら、設定を進めました。
所々デザインが違った部分もありましたが、設定の流れを非常に分かりやすくまとめてくださっているのでこれらの通りに進めて行けばできます。

- [AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](https://qiita.com/tmknom/items/303db2d1d928db720888)
- [AWS・IAM(Identity and Access Management)ユーザの作成](https://qiita.com/ai-2723/items/fe83669768f8277f144c)

#まとめ
- AWSの登録・初期設定を行った。
- 初期設定時に出てくる用語をまとめた。(参考：[【AWS】初期設定、用語まとめ（ルートアカウント、IAM、IAMユーザー、IAMグループ、ポリシー）](https://fukutech.qrunch.io/logs/i8bxg41ZPxJ6Mqtr))
- 登録後すぐにやるべきことは大きく分けて(1) セキュリティ設定、(2) 利用料金の監視・アラートの設定の2つであることを学んだ。
js 



# document.querySelectorで取れること

![スクリーンショット 2018-11-03 19.56.25.png](https://qiita-image-store.s3.amazonaws.com/0/286971/eac561a2-7637-772e-6471-b0e297468924.png)

## index


```

  <div class="main">
    <di id ="search">
      <labe for="city">City Name</labe>
      <input type="text" id="city">
      <button type="button">Show Weather</button>
    </di>
    <div id ="weather">Loding...</div>
    <div id ="weather">
      <h1 id ="weatherCity">City name</h1>
      <div id="weatherDescription">Weather Description</div>
      <div id ="weatherTemperature">Temperature</div>
    </div>
  </div>
```
増築の果ての隣室


隣接判定で`||`と`or`を混在させる暴挙に出てしまった笑
なんだけど、`||`は式レベル、`or`は関数レベルの結合と思っておけば間違いがない気がする(実際にはRubyの構文は全部式だけど)。`or abort`(Perlでいう`or die`)的な。

```rb:tyama_henae28.rb
#!/usr/bin/ruby
#http://nabetani.sakura.ne.jp/hena/orde28sqst/
#https://qiita.com/Nabetani/items/4e3fac2746ca05a93165

while gets
	seq,n=$_.split('/')
	nx=ny=Rational(1)
	mx=my=Rational(0)
	a=[[[0,0],[1,1]]]
	seq.chars.each_slice(2){|c,k|
		width=nx-mx
		height=ny-my
		k=k.to_i
		if c==?N
			siz=width/k
			k.times{|i|
				a<<[[mx+siz*i,ny],[mx+siz*(i+1),ny+siz]]
			}
			ny+=siz
		elsif c==?E
			siz=height/k
			k.times{|i|
				a<<[[nx,ny-siz*(i+1)],[nx+siz,ny-siz*i]]
			}
			nx+=siz
		elsif c==?S
			siz=width/k
			k.times{|i|
				a<<[[mx+siz*i,my-siz],[mx+siz*(i+1),my]]
			}
			my-=siz
		elsif c==?W
			siz=height/k
			k.times{|i|
				a<<[[mx-siz,ny-siz*(i+1)],[mx,ny-siz*i]]
			}
			mx-=siz
		end
	}
	q=a[n.to_i-1]
	puts (1..a.size).select{|i|
		(a[i-1][0][0]==q[1][0]||a[i-1][1][0]==q[0][0])&&a[i-1][0][1]<q[1][1]&&q[0][1]<a[i-1][1][1] or
		(a[i-1][0][1]==q[1][1]||a[i-1][1][1]==q[0][1])&&a[i-1][0][0]<q[1][0]&&q[0][0]<a[i-1][1][0]
	}*','
	STDOUT.flush
end
```
MySQL をソースからコンパイルしてインストール

MySQL をソースからコンパイルしてインストールする方法です。
次のページを参考にしました。
[MySQL 5.7をroot権限を使わずにソースからコンパイル](http://www.denzow.me/entry/2017/09/03/135314)

ソースの取得

```bash
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24.tar.gz
```

解凍

```bash
tar xvfz mysql-5.7.24.tar.gz
```

バイナリーを入れるフォルダーの作成

```bash
mkdir mysqlHome
```

boost を入れるフォルダーの作成

```bash
mkdir boost
```

コンパイル　（３３分かかりました。）

```bash
cd mysql-5.7.24
#
cmake -DCMAKE_INSTALL_PREFIX=/home/ekzemplaro/mysqlHome \
	-DDOWNLOAD_BOOST=1 -DWITH_BOOST=/home/ekzemplaro/boost \
	-DDEFAULT_CHARSET=utf8 \
	-DDEFAULT_COLLATION=utf8_general_ci \
	-DWITH_INNOBASE_STORAGE_ENGINE=1
#
make
```

インストール

```bash
make install
```

起動の用意

データを入れるフォルダーを作成

```bash
mkdir mydata1
```

設定ファイルの作成　（ポートを変更）

```text:my-opts1.cnf
[mysqld]
datadir = /home/ekzemplaro/mydata1
port = 49554
```

パスの設定

```bash
export PATH=$HOME/mysqlHome/bin:$PATH
```

初期化

```bash
mysqld --defaults-file=my-opts1.cnf --user=ekzemplaro --initialize
```

次のように　root のパスワードが出る

```text
[Note] A temporary password is generated for root@localhost: F)cxw:w6C2Gw
```

mysqld の起動

```bash
mysqld --defaults-file=/home/ekzemplaro/my-opts1.cnf &
```

root パスワードの再設定

```bash
mysql -P 49554 -uroot -p
```

```text
mysql> alter user 'root'@'localhost' identified by 'tiger123';
```
【Flask】コーディングメモ（共通テンプレートを使用した画面遷移プログラムのサンプルソース）

#やりたいこと
Flaskを用いて、共通テンプレートを使用した画面遷移プログラムのサンプルソースを作成したい。

#環境
Flask 1.0.2
Python 3.5.2 (default, Nov 23 2017, 16:37:01)


#サンプルソース
- 以下、ソースファイルを作成。
	- ワークディレクトリ：/home/xxx/workdir/sample_app
	- indexページ：/home/xxx/workdir/sample_app/index.py
	- テンプレート：/home/xxx/workdir/sample_app/templates/index.html
- layout.htmlが共通テンプレートです。ヘッダータグ、Bodyタグの骨格を記載しています。
- index.htmlとscreen_tran.htmlは共通テンプレートのlayout.htmlをextends で読み込んでいます。その為、index.htmlとscreen_tran.htmlは画面固有の出力処理のみ記載すれば良くなります。


```index.py
from flask import Flask, render_template
app = Flask(__name__)

user_name="田中　一郎"

# メニューを表示
@app.route("/")
def menu():
    return render_template("index.html", user_name = user_name)

# マイページ
@app.route("/mypage")
def walk():
    menu_name = "マイページ"
    info = "会員ランク：A"
    return render_template("screen_tran.html", menu_name = menu_name, user_name = user_name, info = info)

# 購入履歴
@app.route("/history")
def attack():
    menu_name = " 購入履歴"
    info = "2018.11.01 iMac 120,000"
    return render_template("screen_tran.html", menu_name = menu_name, user_name = user_name, info = info)
```


```index.html
{% extends "layout.html" %}
{% block content %}
    <h1>{{ user_name }}さん。こんにちは！</h1>
    <p><a href="/mypage">マイページ</a></p>
    <p><a href="/history">購入履歴</a></p>
{% endblock %}

```

```layout.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Flask</title>
    </head>
    <body>
        {% block content %}
        {% endblock %}
    </body>
</html>

```

```screen_tran.html
{% extends "layout.html" %}
{% block content %}
    <h1>{{ user_name }}さんの{{ menu_name }}です。</h1>
    <p>{{ info }}</p>
    <p><a href="/">メニューに戻る</a></p>
{% endblock %}

```

- コマンドを実行してFlaskのサーバーを起動

```terminal
FLASK_APP="index.py" FLASK_ENV=development flask run
```

- ブラウザで実行結果を確認
	- http://localhost:5000 にアクセス

#実行結果を確認

- Topページを表示しました。期待通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/34a01541-be57-68e1-4559-cde007aa00c1.png)


- マイページリンクをクリックして画面遷移しました。期待通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/303c3a8f-188b-34b4-260a-207dbbc42b63.png)

- メニューに戻るリンクをクリックして、Topページに画面遷移することも出来ました。
- 再び、Topページから、購入履歴ページリンクをクリックして画面遷移しました。期待通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/d154267a-412d-c811-459a-13e77c676092.png)
スラックの通知をつける

#スラック通知機能をつける処理の方法

ET局のみなさんこんにちは！
slackの通知機能をつける処理をしていただきます。

1. ホーム画面から右上のメニューボタンをおす。
2. メニュー画面の設定ボタンをおす。
3. 通知ボタンを参照してください。この時携帯自体の通知許可アラートが表示されるので、
許可するようにしてください。
4. すべての新規メッセージに通知がとぶようにしてください。

<br><br>
1. ホーム画面から右上のメニューボタンをおす。

![iOS の画像.png](https://qiita-image-store.s3.amazonaws.com/0/310289/ee64f318-6211-19d8-0c7f-5d32eb4ba2a6.png)

<br><br>
2. メニュー画面の設定ボタンをおす。

![iOS の画像 (1).png](https://qiita-image-store.s3.amazonaws.com/0/310289/2f1b3305-65a2-98c0-5618-2341a586cce7.png)

<br><br>
3. 通知ボタンを参照してください。この時携帯自体の通知許可アラートが表示されるので、
許可するようにしてください。

![iOS の画像 (2).png](https://qiita-image-store.s3.amazonaws.com/0/310289/d13a53c0-d95e-b533-3fbd-b661e0b75f9d.png)

<br><br>

4. すべての新規メッセージに通知がとぶようにしてください。

![iOS の画像 (3).png](https://qiita-image-store.s3.amazonaws.com/0/310289/17654979-7c9f-26f8-e6c0-d64aec2c37a4.png)

<br><br>

以上でスラックの通知設定は終わりです。ありがとうございました。
KotlinとOCamlでバイナリーツリーの比較

KotlinとOCamlを勉強した

Kotlinが関数型っぽく書けるようなので比較してみる。

Kotlinではifもwhen(パターンマッチング)も式であり、値を返す。
つまりif,whenは関数である。

なので、Kotlinは基本は手続き型言語だが、書き方によってはプログラムを一つの関数として書ける。

## OCaml（関数型言語）の場合

```

# バイナリーツリー（２分木）の定義

type 'a binary_tree =
  Empty
| Node of 'a * 'a binary_tree * 'a binary_tree;;

# 要素のfind関数: find(x,tree): 返り値 boolean

let rec find x tree =
  match tree with
    Empty -> false
  | Node(y, left, right) ->
      if x = y then true else
      if x < y then find x left else find x right;;

# Tree作成

let tree = Node(4, Node(2, Node(1, Empty, Empty), Node(3, Empty, Empty)), Empty);;

# find実行
find 1 tree;; // -> true

```

## kotlinの場合も同じように書ける？

### Node定義

- classとして定義すればいいっぽい。クラスを再帰的に定義できる。

```
# node
class Node(var value: Int, var left: Node? = null, var right: Node? = null)

# binary_tree作成
val binary_tree = Node(6, Node(3, Node(2), Node(5)), Node(8, Node(7), Node(9)))
 
```

### find関数

- 手続き的に書いてもいいが、ifとwhenを関数として値を返させるように使える。

```
fun find(tree: Node?, x: Int): Boolean =
        when (tree) {
            null -> false
            is Node -> {
                if (tree.value == x) {
                    true
                } else if (tree.value < x) {
                    find(tree.right, x)
                } else {
                    find(tree.left, x)
                }
            }
            else -> throw Error("error")
        }
```

### Tree作成とfind実行
```
fun main(args: Array<String>) {
    val tree = Node(6, Node(3, Node(2), Node(5)), Node(8, Node(7), Node(9)))

    println("find 6: ${find(tree,6)}") 
}


　　　　　　　// -> "find 6: true"が出力される
```


OCamlとKotlinで、見た目かなり似てるように書けているような気がしました。

（終）
Docker立ち上げたらネットがつながらなくなった話

## 問題
Docker立ち上げたらネットが繋がらなくなりました。
具体的には、別のDockerを立ち上げようとして

```
ERROR: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection 
(Client.Timeout exceeded while awaiting headers)
```

のエラーが出ました。
ブラウザで適当なURL叩いても、ターミナルでping送ってもタイムアウトしてしまう状態...

## 原因
ネットワーク設定においてIPが衝突してる

## 解決策

```
$ docker network ls
$ docker network inspect ネットワークID
//ここでGatewayのipアドレスを確認する
$ ifconfig
//inetアドレスを確認する
```

もし上記2つのアドレスが被っていれば、それが衝突の原因です。
ドッカ―側のネットワーク設定削除します。

```
$ docker network rm DockerID
```
これでネットが繋がるようになるはずです。

## 予防策
docker-compose.yml のnetworkで被らないIPを指定します。

```
service: 
  ServiceName:
    network: 
    - xxx.xxx.xxx.x
```

指定しない場合は動的にIPが割り振られるため、上記設定が面倒だったら
ブラウザでネット立ち上げてる状態でドッカーを起動すればOK。
PHP_CodeSnifferで"PHP version not specified"に遭遇したときの対処方法

# 概要

PHP_CodeSnifferの対処方法はなかなか検索で出にくい上phpcbfで自動修正がされなかったものもあるので備忘として書いておく
今回のエラーメッセージ"PHP version not specified"は至ってシンプルなエラーメッセージだが、バージョンの書き方がわかりにくいので検索しても日本語の資料が出なかった
よって対処法をここに書いておく

# 問題のコード
docコメントを書くだけの至ってシンプルなコード
こいつをPHP_CodeSnifferにかけると警告文"PHP version not specified"が出る。
問題はPHPのバージョンってどうやって書くんだ？というお話

```php:ng.php
<?php
/**
 * ファイルの説明文。
 *
 * ファイルの説明文の
 * 詳細を記したブロック
 *
 * @category Example
 * @package  Qiita
 * @author   Hayakuchi0 <Hayakuchi0@example.com>
 * @license  MIT License
 * @link     https://qiita.com/Hayakuchi0
 */
?>

```

# 原因と対処法
docコメントの末尾にPHPバージョンを記述すれば解決する。
バージョンの記述方法は、その行の先頭に「PHP Version 」と記されていればあとはなんでもいい

```php:ok.php
<?php
/**
 * ファイルの説明文。
 *
 * ファイルの説明文の
 * 詳細を記したブロック
 * PHP Version >= 5.4
 *
 * @category Example
 * @package  Qiita
 * @author   Hayakuchi0 <Hayakuchi0@example.com>
 * @license  MIT License
 * @link     https://qiita.com/Hayakuchi0
 */
?>
```

ちなみに以下でも警告文は消える。が、実際にこんなことやるのはやめましょう。

```php:example.php
<?php
/**
 * ファイルの説明文。
 *
 * ファイルの説明文の
 * 詳細を記したブロック
 * PHP Version ぺぺぺぺぺぺぺぺぺ
 *
 * @category Example
 * @package  Qiita
 * @author   Hayakuchi0 <Hayakuchi0@example.com>
 * @license  MIT License
 * @link     https://qiita.com/Hayakuchi0
 */
?>

```


# 参考資料

https://pear.php.net/manual/en/package.php.php-codesniffer.reporting.php