OmniAICreator/Qiita-1.07M huggingface dataset:
SQLインジェクション

#SQLとは
SQLとはStructured English Query Languageの略称で，データベースを操作するための言語です．基本的な構文としてSELECT，INSERT，UPDATE，DELETEの４つがあります．

| 命令 | 説明 | 文法 |
|:--|:--|:--|
| SELECT | データの参照 | SELECT カラム名1, カラム名2, ... FROM テーブル名 [WHERE 絞込条件]; |
| INSERT | データの挿入 | INSERT INTO テーブル名 (カラム名1, カラム名2, ...) VALUES (値1, 値2, ...); |
| UPDATE | データの更新 | UPDATE テーブル名 SET カラム名1=値1 [, カラム名2=値2 ...] [WHERE 絞込条件]; |
| DELETE | データの削除 | DELETE FROM テーブル名 [WHERE 絞込条件]; |

SQLインジェクションで起点となるのもこれらの4構文です．そのため基本的な使い方はマスターしておいた方が良いでしょう．

#SQLインジェクション
コンピュータで扱う言語の中で，特殊な意味をもつ文字をメタキャラクタと呼びます．SQLにおいても特殊な意味をもつメタキャラクタが存在しており，例えば以下のSQL文ではシングルクォーテーションマークを用いて，文字列とそうでない部分を区別しています．

```
SELECT * FROM users WHERE username='admin';
```

シングルクォーテーションで囲まれたadminは文字列として扱われ，囲まれていない部分はSQLの文として扱われます．

ではusernameに入力する文字列が' OR 1=1 --だった場合どうなるでしょうか．

```
SELECT users WHERE username='' OR 1=1 --';
```

このSQL文では条件を指定するWHERE句においてusernameが空であるか，1と1が等しい場合に真を返すという指定がなされています．そのため，入力したユーザ名・パスワードに関係なくクエリが成立してしまうのです．
このようにメタキャラクタを用いてSQL文を管理者の意図しない文に改変することで実行させるのがSQLインジェクションという攻撃手法です．

#最後に
いかがでしたでしょうか．SQLインジェクションは非常に簡単に書くことができるにもかかわらず，強力な攻撃手法です．CTF以外の実際のサービスで使用すれば不正アクセス禁止法に抵触してしまったり，データベースに被害を与えれば訴えられてしまうこともあります．そのため**許諾を得ていない環境でのSQLインジェクションは絶対に行わないでください．**
Conditional Variational Auto Encoder （条件付きVAE）

ディープラーニングの詳細な説明などは専門家の説明を読んでもらうとして，
人工知能を専門分野としておらず，既存技術に人工知能を組み合わせたい人に向けた記事です．

ディープラーニングをはじめとする人工知能技術は性質上，
big dataとよばれる巨大なサンプルデータが必要です．
そのため，
大量の画像サンプルデータをとることができる既存技術とは相性が良い事が知られています．

画像生成技術は，
大量の画像サンプルデータからある特徴量を抽出して，
サンプルにない画像を生成する事ができるようになりました．


VAEとはVariational auto encoderと呼ばれるもので，
ある画像を学習させた時に，その画像の特徴量を学習して酷似した画像を生成します．
例えば，
犬の写真を10000枚学習させた時、
犬っぽい写真を生成する事ができます．


これに，条件をつけて画像生成を行う事ができるのが，
Conditional VAEです．
例えば．
犬の写真を10000枚，猫の写真を10000枚，うさぎの写真を10000枚学習させた時、
犬の写真群には「犬」という条件を，猫の写真群には「猫」という条件を，うさぎの写真群には「うさぎ」という条件を付与します．

画像生成の際に，
「犬」という条件を入力すると犬っぽい画像が生成されますし，別の条件を入力するとそれに対応した画像が生成されます．

このConditional VAEを実装するために，
かなりの時間を浪費してしまったので，
システムの詳しい原理はすっとばしてConditional VAEを使ってみたい人に向けてコードを公開しました．

https://github.com/takuya1123x/Conditional-VAE
JavaScript入門3~HTMLを書き換える~

#処理方法#
1.書き換えたい部分のHTMLタグとそのコンテンツ,つまり要素を取得する
2.取得した要素のコンテンツを書き換える

#id属性で要素を取得する#
documentオブジェクトのgetElementByIdメソッドを用いる
`document.getElementById(id名)`

#取得した要素のコンテンツを書き換える#
textContentに代入する
`document.getElementById(id名).textContent = 書き換えたい文字列;`
LINE WORKS + Azure AD + Authenticator でパスワードレス認証

# LINE WORKS + Azure Active Directory + Authenticator でパスワードレス認証

Azure Active Directory は Microsoft Authenticator を用いたパスワードレス認証が使えます。これにより Azure AD を IdP とした SSO を設定した LINE WORKS でパスワードレス認証を利用する手順を説明します。

ユーザーは LINE WORKS の利用時にパスワードを入力する代わりに、アプリへの通知に応答することで LINE WORKS にログインできます。

# Azure Active Directory をIdP とした LINE WORKS の SSO 設定

Azure AD のエンタープライズ ギャラリーに LINE WORKS が準備されているので、設定は容易です。

手順はこちらの Microsoft のドキュメントにまとまっています。
TITLE: チュートリアル:Azure Active Directory と LINE WORKS の統合
URL: https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/worksmobile-tutorial

また、@tokotan のこちらの記事がとても分かりやすくまとまっています。
TITLE: AzureADでLINE WORKSにSSO(SAML)する方法
URL: https://qiita.com/tokotan/items/4a8c0c71ed113884e23d  

# Azure AD の Authenticator による認証

現時点ではプレビューですが、こちらの Microsoft のドキュメントの手順で Azure AD のユーザーが Authenticator によるサインインでパスワードレス認証を利用できます。

 TITLE: Microsoft Authenticator アプリを使用したパスワードなしの電話によるサインイン (パブリック プレビュー)
URL: https://docs.microsoft.com/ja-jp/azure/active-directory/authentication/howto-authentication-phone-sign-in

有効化は PowerShell のコマンドレット操作で行います。

Azure Active Directory V2 PowerShell モジュールのインストール
```
Install-Module -Name AzureADPreview
```
Azure Active Directory に接続
Connect-AzureAD コマンドレット実行後、セキュリティ管理者またはグローバル管理者の資格情報でサインイン
```
Connect-AzureAD
```

Authenticator サインイン ポリシーの作成
```
New-AzureADPolicy -Type AuthenticatorAppSignInPolicy -Definition '{"AuthenticatorAppSignInPolicy":{"Enabled":true}}' -isOrganizationDefault $true -DisplayName AuthenticatorAppSignIn
```

# Microsoft Authenticator の準備

Microsoft Authenticator のインストールと設定はこちらのドキュメントに沿って行います。

TITLE: Microsoft Authenticator アプリのダウンロードとインストール
URL: https://docs.microsoft.com/ja-jp/azure/active-directory/user-help/user-help-auth-app-download-install

TITLE: Microsoft Authenticator アプリを使用してアカウントにサインインする
URL: https://docs.microsoft.com/ja-jp/azure/active-directory/user-help/user-help-auth-app-sign-in

#動作確認

モバイル アプリでの認証エクスペリエンスは次のようになります。

1.LINE WORKS モバイル アプリで LINE WORKS のユーザー名を入力して [ログイン] をタップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/cf79ec5f-0c0f-994f-39a4-81ced58bf9b9.png)

2.Azure Active Directory の認証画面にリダイレクトされる  
Azure Active Directory のユーザー名を入力して [次へ] をタップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0fab3892-eac4-a3dc-e412-1eca8324908a.png)

3.Authenticator での認証用の数字が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/f9bceff3-5a4b-6ce6-6723-d20c92d1a6ab.png)


4.Authenticator に通知が届いたら、表示されていた数字を選択して [承認] をタップ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0da60040-a205-63b0-3749-aac6a805925d.png)

5.パスワード入力なしで、LINE WORKS にログイン完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/22da65c8-dfd8-7cd4-ef89-d8fd6ab7ac16.png)
micro:bit GAMEPAD ZIP64を使ったプログラム

#研究用ロボットのコントローラを作る

- [マイクロビットのコントローラキット:Kitronik GAMEPAD ZIP-64](https://www.kitronik.co.uk/5626-game-zip-64-for-the-bbc-microbit.html)を購入した。
- 送信機として、このコントローラ＋micro:bitを使って、micro:bitのメッセージ通信機能をつかって、ロボットの制御を行う。

#公開コード

- [ゲームパッド側プログラム](https://makecode.microbit.org/_haW6XUWVAE1d)
- [ロボット側プログラム](https://makecode.microbit.org/_aKEPAwdxcJTh)

#現在はロボットのハードウェアを開発中 2019.04.26

- ロボットは開発中のためロボット側のmicro:bitのLED画面のドットを、ゲームパッドの十字キーに相当するボタンで、移動できるようにした。
Sipeed M1でTiny YOLOv2の20クラス検出器デモを動かすまで

# 概要
SiPEED M1という、エッジコンピューティング向けの開発ボードがseeed studioで安かったので買ってみた。[(購入ページ)](https://www.seeedstudio.io/Sipeed-M1-dock-suit-%28-M1-dock-%2B-2.4-inch-LCD-%2B-OV2640-%29-K210-Dev.-Board-1st-RV64-AI-board-for-Edge-Computing-p-3211.html)
とりあえず既存のモデル(Tiny YOLOv2の顔認識)を動かせたので備忘録。
（開発スピードが速そうなので、すぐ陳腐化するだろう。）

# ハードウェア
[KENDRYTE](https://kendryte.com/)というメーカーのK210というコアらしい。デュアルコアのRISC-Vプロセッサと、KPUと呼ばれているCNN用のアクセラレータが載ったチップ。
0.25TOPS @0.3W, 400MHzらしい。
付属していたTypeC→MicroBアダプタ経由でUSBポートにつなぐと、USBシリアルとして認識するとともに電源供給もできた。

# 開発環境
## ダウンロード
[githubのリリースページ](https://github.com/sipeed/MaixPy/releases)から開発環境`MaixPy IDE v0.1.0`とフラッシュに焼くファイル(`face_model_at_0x300000.kfpkg`, `maixpy_v0.3.0_full.bin`)を入手。
デバイス上にスクリプトをアップロード/ダウンロードするツール[uPyLoader](https://github.com/sipeed/uPyLoader)もダウンロードしておく。

## Flash焼き込み
公式ドキュメントの[Upgrade Firmware](https://maixpy.sipeed.com/en/get_started/upgrade_firmware.html)の章の通りにファームを焼く。今回はWindows環境から焼いたので、[K-Flash](https://github.com/kendryte/kendryte-flash-windows/releases)を用いた。
0.2.4では顔認識モデルとSDKが両方入ったバイナリがリリースされていたが、0.3.0は別々だった。最初0.2.4で試していて、SDKだけバージョンアップしたためにハマってしまった。
K-Flashで`maixpy_v0.3.0_full.bin`を焼いたあと、連続して`face_model_at_0x300000.kfpkg`を焼けば別々の領域に配置してくれるようだった。
フラッシュを焼き終わるとターミナルが起動するが、後述のIDEのほうが使いやすいのでそのまま閉じる。

## MaixPy IDE
上記MaixPy IDEのインストーラでインストールすると、OpenMV IDEという名前でインストールされた。
![OpenMV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235770/099d91a0-d380-bf4f-ab43-610b30631022.png)
「ツール」->「ターミナルを開く」から新ターミナルまたは以前接続したシリアルポート名を選択すると、ターミナルが開く。
他のボードだと画像プレビューもできるのか！というリッチなターミナル画面。
![OpenMV_SerialPort.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235770/df9d04fd-c49e-7e58-2b94-7123ba357dce.png)
サンプルが実行され、カメラの映像が液晶に表示された。

## uPyLoader
uPyLoaderデバイス上のスクリプトファイル操作ツールらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235770/47f98b9a-6104-d567-fe6e-a804603c121f.png)
シリアルポート指定して接続すると、ローカルからのスクリプトファイルのアップロードが楽。OpenMV IDEのシリアルポートと同じポートを使うので、排他なので注意。
Remote側に見えているboot.pyを書き換えておくと、次回ブート時に自動実行されるようになる。OpenMV IDEのデモスクリプトで置き換えると、起動直後にカメラ画像が表示されるようになった。

(4/27追記)
Micro SDカードを刺しておくと、内蔵フラッシュを使わずにSDカードを使用するようになり、boot.pyもSDカードのものを使用するようになる。シリアル経由だとPCとのデータのやり取りが遅いので、SDカードは刺しておくと便利。

# KPUのテスト
IDEのサンプルでは肝心のKPUを使用しないので、[顔認識デモ](https://github.com/sipeed/MaixPy_scripts/blob/master/machine_vision/demo_find_face.py)を焼いてみた。
難なく動作できたし、非常に速い。
https://www.youtube.com/watch?v=wIkQ6JHkOt4

# その他のモデルについて
[Maix Toolbox](https://github.com/sipeed/Maix_Toolbox)で他のTensorFlow Liteのモデルをkmodelに変換できるようなので、[Edge TPUのモデル](https://coral.withgoogle.com/models/)などを変換してみたが、使用できるレイヤにいろいろと制限があるようでまだうまくいっていない。
そのへんの条件のドキュメントはどこにあるんだろう。
→ KPU用にモデルの変換を行う[nncaseのgit](https://github.com/kendryte/nncase/blob/master/README.md)にSupported layersの記述があった。

(4/27追記)
[SiPEEDのBBS](https://bbs.sipeed.com/)にいろいろなサンプルが上がっていた。

## 20クラス検出器の動作 (4/28追記)
[20クラス検出](https://bbs.sipeed.com/t/topic/683)のデモも動いた。
~~当初メモリ容量が足りないとのエラーが出たので、`task = kpu.load("/sd/20class.kmodel")`としてSDからモデルを読むようにした。このロードには数十秒時間がかかるので注意。~~
再度やったら普通に動いた。モデルもロードもSDカード使わなければ一瞬だった。
上記BBSの投稿から、`maixpy_20class.zip`をダウンロード・展開し、K-Flashで`20class.kfpkg`を焼く。
BBSのコードに処理時間の計測を追加して、無事動作した。
https://youtu.be/MjHON3F0mUs
VSCodeのmarkdown(初心者向け)

# 前書き
VSCodeでmarkdown書きたいことありますよね？はい、あるとしましょう。
拡張子をmdのファイルを作成してCtrl+KのあとにVを押しましょう。VのときはCtrlを離してくださいね。プレビュー画面が表示されます。この状態でmkをバリバリ書いていきましょう。
できれば下記を入れておいた方が捗ります。
#### Markdown All in One
https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one

※markdownの規格を誰か作ってください。統一しましょう。

# 改行
VSCodeのmarkdownがよくわからない人が最初に思うことであろう疑問。
改行どうすんねん。。となりますよね？改行してもスペースになってしまうやん。。って。
行の末尾に半角スペースを2つ入れればOKです。

```return.md
test1  
test2  
test3  
```

上の例にも半角スペースが2つ入れてあります。コピペしてみてください。
これでプレビュー側も改行されています。

# 見出し

```header.md
# test1
```
表示は下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/bebbc3dd-8b04-ff40-7f0f-d2a5dc027b10.png)


# 箇条書き

```item.md
- test1
- test2
- test3
```
下記のような表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/095273e2-7765-8d46-b21d-db0ea1af21fa.png)

他にも「-」でなくても「*」でもOKです。
あとは「-」のあとに半角スペースも必要ですね。Qiitaみたいに気を利かせてくれないカタいやつです。

# 箇条書き(番号)
1. test1
2. test2
3. test3

下記のような表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/b77009cb-396e-7b74-8aff-a950741b6a77.png)

# 太字
```bold.md
**test1**
```
※Markdown All in Oneを入れているとCtrl + bが効きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/7d3a12ff-2a7a-e54e-80cb-1cb4895723b5.png)

# 斜体
```italic.md
*test1*
```
※Markdown All in Oneを入れているとCtrl + iが効きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/49bc544d-2f0b-3aa6-03a9-d82e3349fd35.png)

# 打消し線
```strikethrough.md
~~test1~~
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/ceb4aeab-b17b-c0c8-3975-7c89705da772.png)

# ライン
```line.md
---
```
※要Markdown All in One

# 表
```table.md
| test1 | test2 | test3 |
| ----- | ----- | ----- |
| aaaaa | bbbbb | ccccc |
```
※Markdown All in Oneが入っていればShift + Alt + fでフォーマットされます

# チェックボックス
VSCodeは標準でチェックボックスを表示することができないようです。
やり方はいろいろあるようですが、下記拡張を入れるのが速そうです。

#### Markdown Checkbox
https://marketplace.visualstudio.com/items?itemName=PKief.markdown-checkbox

```checkbox.md
- [ ] test1
- [x] test2
```
※半角スペースに気を付けましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/f2308c84-63bd-9937-4abc-445d133c747e.png)

# 引用
```quote.md
> test1
>> test2
>>> test3
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251209/41af7f7a-afa5-22af-641c-43f8f68c485a.png)

# コメントアウト
```comment.md
<!-- test -->
```
VSCode標準機能のCtrl + /が効きます

# 紹介
#### HackMD
https://hackmd.io/
markdownで書いたことを共有できます。そうリアルタイムにね。
会議のたびに各自でノートにメモ？セキュリティ上仕方ないこともありますね。
でも使える場合は使いましょう。
使えなかったら上司に提案しましょう。
メリットとデメリットを表にするといいですよ。
全員の年間のメモにかかるコストを見積もるのです。それがセキュリティ高めるためのコストということです。セキュリティにお金をかけすぎていることがわかるでしょう。
※回し者ではありません

# 終わりに
markdownよさそう！というより効率を高めるためにあるものだと思います。
全部覚えなくてもよいと思いますが、ある程度覚えていないと効率も上がりません。
自分にあったものでドキュメント作成やその他もろもろの課題をささっとクリアしていきましょう！
Combo boxで何も選択されていないかどうかを取得する方法

PowerAppsのコンボボックスは多機能で便利なのですが扱いが難しいですね。

今回コンボボックスで何も選択されてなかったらボタンを非表示状態になるようにがんばりました。

コンボボックスは複数選択可能で任意の値の入力も出来るようにしました。ちなにみ下記の属性の設定が必要です。

```
IsSearchable = true
SelectMultiple = true
```

「何も選択されていない状態」の時にボタンのVisible属性が「false」になるようにすればボタンが消えてくれます。

しかし、これが結構難しかったです。結論から言うとボタンのVisible属性にこの式を入れて出来ました。

（#github129さん、ご指摘ありがとうございました。）

```
Visible = Or(
　　!IsBlank(Combobox1.SearchText),
　　!IsEmpty(Combobox1.SelectedItems)
)
```


任意の値は.SearchText属性なんですね。これは文字列なのでそれをIsBlank関数で入力されているかどうかを判断しています。

もう一つ、コンボボックスで何も選択されていないのを判断するのに、一つしか選択されていなくてもコンボボックスはテーブル扱いなのでIsBlank関数は使えません。その代わりIsEmpty関数を使ってIsEmpty(Combobox1.SelectedItems)で上手くできました。

上記の数式のおさらいをすると、PowerAppsでは「！」で意味が逆になるので、「任意の入力が空でない時」か「選択アイテム数が０でない時」この条件を満たしたら結果は「true」だし、満たしていなければ「false」なのでIf関数を省略しました。上記の式は下の式と同じ意味です。

```
Visible = If(
   Or(
       !IsBlank(Combobox1.SearchText),
       !IsEmpty(Combobox1.SelectedItems)
   ),
   true,
   false
)
```
Pythonのクラス機能について

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている@yuka_ponです。
Pythonで必ず登場する、**クラス機能**。
今回は、Pythonのクラスについて学んだことを記します。

#Pythonのクラス機能
##クラスとは
クラス機能は、オブジェクト指向を適用するときに使います。
主に処理操作を行い、一般的にはゲームやアプリ操作に使用されます。

##コンストラクタ
Pythonには、**コンストラクタ**と呼ばれるものも使われています。
これは、オブジェクトを使う際に使う特殊な関数です。

このときは、```__int__()```を使います。


##デストラクタ
これは、オブジェクトを削除するときに使う関数です。
このときは、```__del__```を使います。


##インスタンス
これは、クラスの分身でもあり、クラス内の関数などを使うときに使用します。


##メソッド
これは、ある処理をまとめて名前をつけるものです。
**def**を使って、処理をする上で必須となる**引数**を用います。
Node.js: Expressの基本メモ

追記していく。

参考URL：
https://expressjs.com/

---


### bodyを取得

```js
app.post('/users', function (req, res) {
    let body = req.body;
    res.json(body);
});
```

### JSONを返す

```js
res.json("abc")
```

### クエリストリングを取得

https://expressjs.com/ja/guide/routing.html

```js
app.get('/users', function (req, res) {
    let params = req.query;
    res.json(params);
});
```
さらに RDP Wrapper Library  が使えなくなって fork先に変更した。

2020/02/24 追記 chrome リモートデスクトップ に してみた。

2020/02/19 最近のupdateで 動かなかくなったようです。
つかうのやめようかなぁ・・
べんりだったんだけどなぁ。
ケチらないで Proにupdateする時期なのかも

windows10homeでRDPサービスを実現するのに 利用していた [RDP Wrapper Library](https://github.com/stascorp/rdpwrap)が windowupdate で ライブラリが 更新されると 使えなくなることが相次いだ。今回は termsrv.dll Ver.10.0.17763.437に更新された。

新ライブラリ用のiniファイルを 用意したら いいのだけどなかなか手間である。

なんと、 fork先で 対応した ini ファイルの参照先が 書き換えられた [RDP Wrapper Library v1.6.2.1がリリース](https://github.com/DrDrrae/rdpwrap/releases)された。
いつものように install.bat と update.bat を 管理者権限のあるユーザで 実行して設定ツール RDPConf.exe で 確認したら Listening に なった。

![RDPConf1.6.2.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125882/f813007d-dc89-8186-c9ca-31bf4afd4943.png)

フォークされた プロジェクト → https://github.com/DrDrrae/rdpwrap/


追記

本家の https://github.com/stascorp/rdpwrap/issues/795 に rdpwrap_ini_updater_(02_August_2019).zip があって、Windows Update 1903 に対応したとの情報がありました。しかし リリースに 取り込まれてはいないようです。
ABC - 032- A&B&C

#AtCoder ABC 032 A&B&C
[AtCoder - 032](https://atcoder.jp/contests/abc032)

#A問題

 - aとbの最小公倍数を求める
 - n以上で、nに一番近い最小公倍数を求める
    - nを最小公倍数で割って切り上げる
    - 最小公倍数×求めた値

```java

	private void solveA() {
		int a = nextInt();
		int b = nextInt();
		int numN = nextInt();

		int baisu = koubaiA(a, b);
		/*
		 * int res = (int) (baisu * Math.ceil(numN / baisu));
		 */
		int res = baisu * ((numN + baisu - 1) / baisu);
		out.println(res);
	}

	private int koubaiA(int a, int b) {
		return a * b / kouyakuA(a, b);
	}

	private int kouyakuA(int a, int b) {
		int max = Integer.max(a, b);
		int min = Integer.min(a, b);
		int amari = max % min;
		while (amari != 0) {
			max = min;
			min = amari;
			amari = max % min;
		}
		return min;

	}
```

#A問題：別解

 - これでも通った
    - n以上の数で、aでもbでも割り切れるものを1個ずつ試す

```java
	private void solveA2() {
		int a = nextInt();
		int b = nextInt();
		int numN = nextInt();

		while (true) {

			if (numN % a == 0 && numN % b == 0) {
				out.println(numN);
				return;
			}
			numN++;
		}

	}
```

#B問題

 - kのサイズの文字列を全部切り出す
 - setに入れて重複を除外する

```java
	private void solveB() {
		String s = next();
		int k = nextInt();

		Set<String> wk = new HashSet<String>();
		for (int i = 0; i <= s.length() - k; i++) {
			String moji = s.substring(i, i + k);
			wk.add(moji);
		}

		out.println(wk.size());
	}

```

#C問題

 - これもしゃくとり法で
    - むしろ、しゃくとり法以外の解き方がわからん

 - 数列の中に0が入っていた場合、全体が0になるので最初に判定してそれは除外している
    - しゃくとり法の途中で0が出現したときの除外を書くよりは、最初に排除したほうが楽だったので

```java
	private void solveC() {

		int n = nextInt();
		int k = nextInt();
		int[] wk = IntStream.range(0, n).map(i -> nextInt()).toArray();

		for (int i = 0; i < wk.length; i++) {
			if (wk[i] == 0) {
				out.println(n);
				return;
			}
		}

		int right = 0;
		int left = 0;
		long innerResult = 1;
		long res = 0;
		while (left < n) {

			/*
			 * 右を進める
			 */
			while (right < n && innerResult * wk[right] <= k) {
				/*
				 * 右の数値を一つずつかける
				 */
				innerResult *= wk[right];
				/*
				 * 数値をつくったら一つ進める
				 */
				right++;
			}

			/*
			 * どれだけながくできたのか？
			 */
			res = Long.max(res, right - left);

			/*
			 * 右を進める?
			 */
			if (left == right) {
				right++;
			} else if (innerResult >= wk[left]) {
				/*
				 * 左の数値を除去
				 */
				innerResult /= wk[left];
			}
			left++;
		}

		out.println(res);
	}
```
初心者がチーム組んでWebサイトを立ち上げてみた

## 背景
いくつかの技術資格の取得を通じて、
圧倒的経験不足に気づきました

**肝心のものを作ったことがない**
![zawaSan.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378268/6ead2fcd-0051-dca9-5836-66fca276511f.jpeg)

同じ悩みを抱える同期で集まり、行ったことを書いてみます
同じ悩みを抱える人の参考になれば幸いです
~~あわよくば「いいね」しt、、~~

##スペック
それぞれスペックは違なるが、大体以下の特徴を持つ

- 社会人4年目(大学の専攻はIT関係ないとこ)
- 業務はJava
<br>→Java以外の開発経験皆無
- 資格はDB・HTML・Linux・AWSなど幅広く
<br>→大体の知識がある程度

##チーム開発にあたり
チームでの開発(計3人)を行うにあたり以下の前提を遵守した

- 1ヶ月単位で完成する目標設定(成果物)
- 目標に向けた週ごとのスケジュール設定
- 週単位で行った内容のOutPut
<br>→具体的にメンバー向けのプレゼンを行う
- 判断は多数決で
<br>→3人なのでちょうどよかった

## 環境とか
チャットツール：Slack
　→チャンネル分けができて便利
タスク管理：trello
　→途中で使いづらさに気づき、Slackのスター機能を使うように。。。
成果物格納：git
　→とりあえず、GUIで
開発環境：Atom
　→UIが可愛い

## 今回作ったもの
架空のゲーム販促サイト
[Man in the Mirror](https://s3-ap-northeast-1.amazonaws.com/upallnightfirstproduct/inputName.html)
※某King of Popの曲に感化され命名

### 構成
アーキテクチャ
S3オンリー

### やったこと
「HTML5,jsで自分が表現したいものを実現する」を目標に週単位のタスクを設定


#### 1週目
HTML・CSSを使ったMock開発
\- Point1:JavaScript使ってみたい欲を抑えて、無骨に
\- Point2:お題はみんなが興味ある内容に(私たちの場合は、友達の紹介サイト)

#### 2週目
1週目のMockにjsを適応させる
\- Point1:外部のプラグインを使わずに動きを表現する(後から外部プラグインの感動を覚えるため)
\- Point2:気に入ったサイトの動きを実装することを目標に作業分担(私たちが参考にしたサイトは以下)

・リアル脱出ゲーム「さよなら、僕らのマジックアワー」
https://mysterycircus.jp/bokumaji/
　→遊びに行きたかった。。。
・PS4®専用ソフトウェア　GRAVITY DAZE | プレイステーション® オフィシャルサイト
https://www.jp.playstation.com/scej/title/gravitydaze/ps4/

#### 3週目
ここで成果物作成に初めて取り掛かる
サイトを作るために以下を考える・作る必要があるため、ある程度作業を進め、
Slackで密に連絡を取りながら作業分担を行う

・サイトのコンテンツ
・サイトの構成図
・HTMLファイル
・CSSファイル
・JSファイル

\- Point1:ローカルPC上でデザインが整っていればOKとする(でも、サイズ指定はpx指定不可)
\- Point2:画像サイズや処理速度について一切考慮しない
\- Point3:画像はフリー素材で
\- Point4:ライブラリーはCDNで公開されてるのを使う(自分でローカルにファイルを落とさない)

#### 4週目
AWSのS3に実際の動作確認を行い、ブラッシュアップする

\- Point1:問題点を箇条書きで洗い出して、担当割りする
\- Point2:スマホとPCで画像を切り分ける(先にやってもよかったかも。。)

## 総括
目的とやる事が各週単位で明確化していたため、いい塩梅に技術を磨けた
意外とスケジュールきついように感じたけど、案外いける(定時で帰れてたからかな？)

## おまけ
各週ごとに行ったプレゼンや今回詰まったことをQiitaに投稿する

[・CSSとレイアウト設計](https://qiita.com/UpAllNight/items/51592b7ea1f13e29381c)
[・JavaGoldが教えるJavaScript](https://qiita.com/UpAllNight/items/91441d12bad70f13615c)
[・初めてのJQuery](https://qiita.com/UpAllNight/items/a0d9be73cf90902d0351)
[・初心者にも使いやすいアニメーションライブラリ](https://qiita.com/UpAllNight/items/378de397c899193403d9)
[・初めてのGitHubの導入から利用方法まで(SVNとの違いも)](https://qiita.com/UpAllNight/items/fbcd22c04891e50c9ec3)
[・スマホ対応で苦戦したこと](https://qiita.com/UpAllNight/items/5fd9206106924914da9f)
[・AWS初心者によるS3でのWebページ公開までの道のり](https://qiita.com/UpAllNight/items/7add9831f379274c557c)
seleniumでchomedriverが使えない（エラー名：session not created: chrome version must be between 71 and 75）


#はじめに

はじめにこの記事のライターのスペックはMacBook pro(2.7 GHz Intel icore5)を使用しています
。

またこちらの記事が僕にとってQiitaの初投稿になりますので、足りないところ不備があればコメントで指摘していただけると嬉しいです。



#【問題点】スクレイピングをしようとしたらエラーがでた。

今回のエラーはスクレイピングをしようとしてjupyte notebookを使用してコードを書き込んだところ下記のようなエラーが起きました。

```
session not created: chrome version must be between 71 and 75
```

chrome versionがおかしいので修正してください。と言われました。
このエラー文のままググったのですが、Macの人のための改善策がなかったのでここに残しておきます。


#やったこと

自分のchrome versionを確かめたところversion 74でした。
あれ？大丈夫じゃ、、？
でも何回トライしてもできない

異なる方法を探してみました。
しかし調べてもdowngradeなどのよくわからないので、もう一回インストールをし直しました。

```
 brew cask reinstall chromedriver
```
こちらをTerminal上で実行したとこと「chromedriver」をもう一回インストールをし直してくれます。


僕はこれで解決しました。
調べてもよくわからなかった人はぜひ試してみてください。
Leetcode #149: Max Points on a line

The difficult part is that there are many edge cases, such as the points can be duplicates.

```swift
func maxPoints(_ points: [[Int]]) -> Int {
    if points.count <= 1 {
        return points.count
    }
    var pointDict = [[Int]: Int]()
    for point in points {
        if let value = pointDict[point] {
            pointDict[point] = value + 1
        } else {
            pointDict[point] = 1
        }
    }
    let noDuplicatePoints = Array(pointDict.keys)
    var answer = 0
    for i in 0..<noDuplicatePoints.count-1 {
        var dict = [Double: Int]()
        for j in i+1..<noDuplicatePoints.count {
            let slope = findSlope(p1: noDuplicatePoints[i], p2: noDuplicatePoints[j])
            if let value = dict[slope] {
                dict[slope] = value + pointDict[noDuplicatePoints[j]]!
            } else {
                dict[slope] = pointDict[noDuplicatePoints[i]]! + pointDict[noDuplicatePoints[j]]!
            }
            answer = max(answer, dict[slope]!)
        }
        if answer > points.count / 2 {
            return answer
        }
    }
    return answer == 0 ? points.count : answer
}

func findSlope(p1: [Int], p2: [Int]) -> Double {
    let p1_x = p1.first!, p1_y = p1.last!, p2_x = p2.first!, p2_y = p2.last!
    if p1_x == p2_x {
        return Double.infinity
    } else {
        return Double(p2_y-p1_y) / Double(p2_x-p1_x)
    }
}

```
Haskellによる並列・並行プログラミング(12.3) チャットサーバを写経 & network-3.0対応

Haskellの並列処理モデルの勉強がてらに「Haskellによる並列・並行プログラミング」の12章にあるチャットサーバを写経した
そのとき、`Network` ライブラリでdeprecatedのwarningが出ていたのでその辺修正した記録
後日別記事でソースの内容解説についても書きたいな、と思っています

source codeは [こちら](https://github.com/keiSunagawa/parconc-chat-server/tree/master/haskell/chat-server)
本に乗っていた方source codeは [こちら](https://github.com/simonmar/parconc-examples/blob/master/chat.hs)

`Network` ライブラリ周り、他、本に直接乗っていなかった `tell` `kick` 関数はせっかくなので自作したため
オリジナルとコードが異なります(キモとなるトランザクション範囲は一緒になっているはずです)

当方Haskell初心者のため不手際な点もあると思いますが、やんわり指摘いただけると助かります

## Networkライブラリのmigrate  
さて、今回写経するにあたって対応したNetworkライブラリのmigrateについて話します
ちなみに、localで動かしていた限りでは非推奨の警告が出るのみで、本のソースコードそのままでも動きます
networkライブラリ 3.0での変更点は [github](https://github.com/haskell/network) にかかれています
その中で今回非推奨の警告が出る原因となっていたのは
>  Removing Network

たぶんこちらです
本のソースコードでは `Network` トップレベルに定義されていた `listenOn` を使っていたので
使えなくなった以上代替え手段で対応するしましょう
対応手段としてはNetwork.Socket.Socket data typeをそのまま扱う形に変更してもいいのですが
今回は別の手段でSocket -> Handleへ変換したほうが差分も少なくなるので良いと判断しました

### `socketToHandle :: Socket -> IOMode -> IO Handle`  
`socketToHandle` メソッドにSocketを渡すことでそのSocketをwrapしたHandleを取得できます 
一緒にIOModeを渡す必要があるのですが、Socketは双方向の通信(read&write)を行うので `ReadWriteMode` を [使用します](https://github.com/keiSunagawa/parconc-chat-server/blob/master/haskell/chat-server/app/Main.hs#L19)

```haskell
handle <- socketToHandle csock ReadWriteMode
```
SocketをHandle化する利点としては

- HandleにすることでFileと同じinterfaceで扱える
- 今回のsocketから流れてくるデータが長さ固定ではなく、改行コードで区切られた文字列を一つのメッセージとして扱う要件のため `hGetLine` 関数を使用することでハンドリングが楽になる
- 取得する文字列の型が `Network.Socket.ByteString` ではなく `[Char]` になるので馴染みのあるListの関数が使える

あたりでしょうか

### socketの生成
地味にNetworkライブラリの更新でsocketの[生成方法](https://github.com/keiSunagawa/parconc-chat-server/blob/master/haskell/chat-server/app/Main.hs#L23-L37)も変わっています

```haskell
resolve port = do
  let hints = defaultHints { addrFlags = [AI_PASSIVE]
                           , addrSocketType = Stream }
  addr:_ <- getAddrInfo (Just hints) Nothing (Just port)
  return addr
open addr = do
  sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
  setSocketOption sock ReuseAddr 1
  let fd = fdSocket sock
  setCloseOnExecIfNeeded fd
  bind sock (addrAddress addr)
  listen sock 10
  return sock
```

Adress typeが間に噛むので一見すると少し複雑ですが、細かい設定値を設定することができるので有識者はこちらのほうがよいのでしょうか？  
ちなみに、[ドキュメント](http://hackage.haskell.org/package/network-3.0.0.0/docs/Network-Socket.html)からのコピペです

---

主な変更点はこの二点となります
Socket周りを簡易的に扱える `listenOn` 関数がなくなってしまった？ので低レイヤの設定等が露出するようになってしまいましたが
望むのであればこれに対するwrapper関数を自作で書いてあげるとよいかもしれませんね、ただ実務では他言語同様なんらかのServerフレームワークを使用するのがよいでしょう(あるよね？)
Python2で実行時にSyntaxErrorになる件(UTF-8)

## python実行時にSyntaxErrorになる件

```
$ ./hoge.py
  File "./hoge.py", line 7
SyntaxError: Non-ASCII character '\xe3' in file ./hoge.py on line 7, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
```

ヘッダ行をこうした

```python:hoge.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
```

## 参考（リスペクト）
http://yono.cc/python/python_basics/japanese.html
『state』を用いて、入力された文字数をカウントしてみよう！

#概要
前回の記事ではpropsについてまとめさせて頂きましたが、今回はpropsのように状態を管理する__『state』__についてまとめたいと思います！

前回の記事
[Reactにおける『props』を理解しよう！](https://qiita.com/micropig3402/items/c2c9c07ee99ed511ac61)

次回
[『Redux』を用いて状態管理をしてみよう！](https://qiita.com/micropig3402/items/ca6f14f92d6238a0aade)

#stateとは
ReactのComponentではComponentの内部で状態を持つことができます。この内部の状態のことを__『state』__と言います。
propsは親のComponentから値を渡されたのに対して、stateはComponentの内部でのみ使用されるという点でpropsとは異なります。
またpropsは変更不可能な値なのに対して、__『state』__は変更が可能です。

#実際にコードを書いてみよう！
では、実際のコードではどのように__『state』__が使われているのか、入力した文字数を返すプログラムを例に見ていきましょう！


```react
import React, {Component} from 'react';

const App = () => <Counter />;

class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = {count: 0, textValue: 'initial value'};
  }

  handleTextChange(textValue) {
    this.setState({textValue});
  }

  handleCountChange(textLength) {
    this.setState({count: textLength});
  }

  render() {
    return (
      <React.Fragment>
        <div>文字数： {this.state.count}</div>
        <textarea
          type="text"
          onChange={e => this.handleTextChange(e.target.value)}
          onKeyUp={e => this.handleCountChange(e.target.value.length)}
        />
      </React.Fragment>
    );
  }
}

export default App;
```

以上のコードを書くと以下のような機能を実装できます

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343290/6f9c702d-db68-6251-b265-2059d9bbdd62.gif)

#解説
`constructor`はComponentの作成時に最初に実行されるメソッドです。その中で`this.state = {count: 0, textValue: 'initial value'};`と書くことで、他のメソッドから`this.state.count`などのように__『state』__を取得することが可能です。

```react
constructor(props) {
    super(props);
    this.state = {count: 0, textValue: 'initial value'};
  }
```

`setState`は状態を変更したいときに使うお決まりのメソッドです。`setState`を使うことで、その状態に関連するDOMが再描画されます。

```react
  handleTextChange(textValue) {
    // this.setState({textValue: textValue}); 下記のように省略可
    this.setState({textValue});
  }

  handleCountChange(textLength) {
    this.setState({count: textLength});
  }
```

`<textarea>`の属性に`onChange`と`onKeyUp`をつけることで`textarea`の中身が変わった時と、キーボードの何れかのキーを放した時にそれぞれ__『state』__を変更するイベントが起こります！
そして、`<div>文字数： {this.state.count}</div>`と書いていることで`textarea`の文字数をブラウザにレンダリングすることができます。

```react
render() {
    return (
      <React.Fragment>
        <div>文字数： {this.state.count}</div>
        <textarea
          type="text"
          onChange={e => this.handleTextChange(e.target.value)}
          onKeyUp={e => this.handleCountChange(e.target.value.length)}
        />
      </React.Fragment>
    );
  }
```


#最後に
次回からは__『Redux』__についてまとめていきたいと思います！

#リファレンス
- [今からはじめるReact.js〜propsとstate、それからrefs〜
](https://qiita.com/kuniken/items/a22adda392ccc30011b1)
- [React.jsでFormを扱う](https://qiita.com/koba04/items/40cc217ab925ef651113)
- [React でフォームを使う](https://react.keicode.com/basics/react-form-basics.php)
- [Reactでフォームから入力された値を表示させてみる - BppLOG](http://tkybpp.hatenablog.com/entry/2017/10/10/152204)
- [Stateとは？ – React入門](https://www.to-r.net/media/react-tutorial07/)
AKSでサンプルアプリを動かす(しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識)

# 概要
- Azure Kubernetes Service(AKS)を使って、アプリケーションのデプロイを行う
    - マニフェストファイルの作成
        - アプリの設定をする「deployment」
        - サービス(ネットワークとか)の設定をする「service」
    - k8sクラスタでのリソース作成(アプリのデプロイやネットワークを構成する)
    - アプリケーションの動作確認
- あらかじめAKSを使ってK8sクラスタを作成しておく


# 課金が発生する
- 稼働中は課金が発生する。必要に応じて作成/削除すること。


# 参考書籍
- [しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識
](https://www.shoeisha.co.jp/book/detail/9784798157849) 阿佐志保 著
    - 3. Kubernetesを動かしてみよう


# マニフェストファイルの作成(サンプルを修正)
- サンプルの```chap03/tutorial-deployment.yaml```を編集する
    - コンテナイメージの場所を、「sampleacrregistry.azurecr.io」から```自分のレジストリ.azurecr.io```に書き換える
    - レジストリ名は```echo $ACR_NAME```で確認する

# サービスの設定ファイルの作成(サンプルそのまま)
- サンプルの```chap03/tutorial-service.yaml```をそのまま使用する

# アプリケーションのデプロイ(リソースの作成)

- Nodeの状態を確認する
    - ```kubectl get node```
        - ```Unable to connect to the server: dial tcp: lookup xxx.hcp.japaneast.azmk8s.io on 192.168.3.1:53: no such host``` のように表示された場合は、認証情報を設定し忘れていないか確認する

- Posの状態を確認する
    - ```kubectl get pod```
        - まだデプロイしていないので、```No resources found.```

- デプロイ
    - ```kubectl apply -f tutorial-deployment.yaml```

- Posの状態を確認する
    - ```kubectl get pod```
        - 5つのpodが表示される
        - Statusが「ContainerCreating」から「Running」になるまで1分ほど待つ

- サービスの公開
    - ```kubectl apply -f tutorial-service.yaml```

- ブラウザで開くためのアドレスを確認する
    - ```kubectl get svc```
    - ```EXTERNAL-IP```が「< pending >」から実際のIPアドレスになるまで少し待つ

```
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
kubernetes   ClusterIP      10.0.0.1      <none>         443/TCP        31m
webserver    LoadBalancer   10.0.121.73   xx.xx.xx.xx    80:30510/TCP   1m
```

- ブラウザでアプリを確認する
    - 上記のIPアドレスにブラウザでアクセスする
    - リロードすると、pod名と写真が変わるのを確認する

- podの詳細を表示する
    - ```kubectl describe pod photoview-deployment-1234567890-xxxxx```

- 使い終わったら、リソースを削除する
    - ```kubectl delete -f tutorial-service.yaml```
    - ```kubectl delete -f tutorial-deployment.yaml```
        - ブラウザをリロードすると、アクセスできなくなっている事を確認する
        - ```kubectl get svc```で見ても、サービスが無くなっている事を確認する

- (クラスター(Node)は動いたままなので注意)
    - ```az group list```
    - ```az aks list```

- クラスタを停止
    - ```az aks delete --resource-group AKSCluster --name AKSCluster```
         - 停止にも8分ほどかかる
         - Azureポータルで状況確認
いつの間にか XAMPP for Windows が 64bit になっていた


Linux版とMac版が 64bit 化した後も長らくWindows版だけが 32bit のままでしたが、今年の3月頃からWindows版も 64bit でリリースされるようになりました
(最近は全く`XAMPP`を使っていなかったので気が付きませんでした)

[Download XAMPP](https://www.apachefriends.org/download.html)

# PHPの動作検証

## これまでの 32bit PHP

```
D:\>php --version
PHP 5.5.19 (cli) (built: Nov 12 2014 12:35:44)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

D:\>php -r "echo PHP_INT_MAX;"
2147483647

D:\>php -r "$a=2147483647;var_dump($a);$a++;var_dump($a);$n=(int)$a;var_dump($n);"
int(2147483647)
float(2147483648)
int(-2147483648)
```
`2147483647` を超えた整数を与えたときにオーバーフローしています

## 64bit PHP

```
D:\>php --version
PHP 7.2.17 (cli) (built: Apr  2 2019 20:11:25) ( ZTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

D:\>php -r "echo PHP_INT_MAX;"
9223372036854775807

D:\>php -r "$a=2147483647;var_dump($a);$a++;var_dump($a);$n=(int)$a;var_dump($n);"
int(2147483647)
int(2147483648)
int(2147483648)
```

`2147483647` を超えた整数でもオーバーフローしていません

# 参考

[PHPでintをオーバーフローさせた結果 - Qiita](https://qiita.com/dev100kg/items/82e68e69083b23c227cd)
今年の言語はRust その３８

# 今年の言語はRust その３８

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 13. 関数型言語の機能: イテレータとクロージャ

### 13.3 入出力プロジェクトを改善する

いつかのチュートリアルででてきた、Config構造体のnew関数を__リファクタリング__します.

argsの所有権がないので、引数を__clone__して、Configに所有権を渡しています。

これを__イテレータ__を使って賢くしましょう

```rust
impl Config {
    pub fn new(args: &[String]) -> Result<Config, &'static str> {
        if args.len() < 3 {
            return Err("not enough arguments");
        }

        let query = args[1].clone(); // 無駄無駄無駄無駄
        let filename = args[2].clone(); // 無駄無駄駄駄駄駄

        let case_sensitive = env::var("CASE_INSENSITIVE").is_err();

        Ok(Config { query, filename, case_sensitive })
    }
}
```


#### 返却されるイテレータを直接使う

```rust
fn main() {
    let args: Vec<String> = env::args().collect();

    let config = Config::new(&args).unwrap_or_else(|err| {
        eprintln!("Problem parsing arguments: {}", err);
        process::exit(1);
    })
}

```


```rust
fn main(){

    let config = Config::new(env::args()).unwrap_or_else(|err| {
        // snip
    })

}

impl Config {
    pub fn new(mut args: std::env::Args) -> Result<Config, &'static str> {
        args.next();

        // イテレータから受け取る
        let query = match args.next() {
            Some(arg) => arg,
            None => return Err("Didn't get a query string"),
        }

        // イテレータから受け取る
        let filename = match args.next() {
            Some(arg) => arg,
            None => return Err("Didn't get a file name"),
        }

        let case_sensitive = env::var("CASE_INSENSITIVE").is_err();

        Ok(Config { query, filename, case_sensitive })
    }
}
```

#### イテレータアダプタでコードをより明確にする

__イテレータアダプタ__????

```rust
pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    let mut results = Vec::new();

    for line in contents.lines() {
        if line.contains(query) {
            results.push(line);
        }
    }

    results

}
```

イテレータアダプタをりようすると、もっと__簡素__にできる

```rust
pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    contents.lines()
            .filter(|line| line.contains(query))
            .collect()
}
```

なんてことだ..

ワンライナーでできるじゃないか

次回は、__どっちが高速化?__




イエス！
テンプレートでグローバル変数にアクセスするとVue.js開発バージョンではエラーになる

Vue.js開発バージョンと本番バージョンの挙動の違いで少しハマったのでメモ。

開発バージョンでは`Proxy`を使って、テンプレート解析の際にアトリビュートがVueオブジェクト内に存在するかチェックしているため、本来アクセス出来るグローバル変数やメソッドを利用出来無い。

https://github.com/vuejs/vue/issues/8384

例として、次のコードは本番用の`vue-min.js`を使用した場合動作する。
テンプレートで呼ばれている`getFoo`はグローバルな位置に置かれているため、vmオブジェクト内からでもアクセス出来る。

```index.html
<script src="https://unpkg.com/vue@2.4.2/dist/vue.min.js"></script>
<!--
<script src="https://unpkg.com/vue@2.4.2/dist/vue.js"></script>
-->
<div id="app">{{ getFoo(times) }}</div>
<script>
    var getFoo = function (num) {
        return 'foo!'.repeat(num);
    }

    var vm = new Vue({
        el: '#app',
        data: {
            times: 5,
        }
    })
</script>
```

しかし開発用バージョンの`vue.js`を使うと警告とエラーが出力され動作しない。

```
[Vue warn]: Property or method "getFoo" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option.

vue.js:572 TypeError: getFoo is not a function
    at Proxy.eval (eval at createFunction (vue.js:9818), <anonymous>:3:56)
    at Vue$3.Vue._render (vue.js:4123)
    at Vue$3.updateComponent (vue.js:2542)
    at Watcher.get (vue.js:2883)
    at new Watcher (vue.js:2872)
    at mountComponent (vue.js:2546)
    at Vue$3.$mount (vue.js:7854)
    at Vue$3.$mount (vue.js:10057)
    at Vue$3.Vue._init (vue.js:4227)
    at new Vue$3 (vue.js:4312)
```

この場合`methods`に置いたメソッドを経由することでエラーを回避できるようになる。

```index.html
<div id="app">{{ callGetFoo(times) }}</div>
<script>
    var getFoo = function (num) {
        return 'foo!'.repeat(num);
    }
    var vm = new Vue({
        el: '#app',
        data: {
            times: 5,
        },
        methods: {
            callGetFoo: function (num) {
                return getFoo(num);
            }
        }
    })
</script>
```

テンプレート内ではグローバルに直接アクセスすべきではない。

それ以外の違いはここに記述されている。

https://vuejs.org/v2/guide/installation.html#Explanation-of-Different-Builds
Python2でprintを標準入力に渡すときにUnicodeEncodeErrorになる場合の対処法

## UnicodeEncodeError
###こういうやつ

```
$ ./hoge.py  > fuga.txt
Traceback (most recent call last):
File "./hoge.py", line 35, in <module>
print(aaa)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-12: ordinal not in range(128)
```

### pythonのdefault encodeがasciiになっていることが原因のようだ
```phthon:python
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
```

### pythonのライブラリにsite-packagesなるものがあるらしいのでfind。

```
$ find / -name site-packages 2> /dev/null
/usr/lib/python2.7/site-packages
/usr/lib64/python2.7/site-packages
```

### site-package下にスクリプトを置く

```
$ sudo vi /usr/lib64/python2.7/site-packages/sitecustomize.py 
```

```python:sitecustomize.py
import sys
sys.setdefaultencoding('utf-8')
```

### 設定が効いているか確認
```phthon:python
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
```

## 完全にこちらを参考にした。リスペクト。
http://shu223.hatenablog.com/entry/20111201/1328334689
Android Studio 3.4に上げたら何かエラーが・・・


```
java.lang.NoClassDefFoundError: org/mozilla/javascript/Scriptable
	at delight.rhinosandox.RhinoSandboxes.create(RhinoSandboxes.java:9)
	at com.github.markusbernhardt.proxy.selector.pac.JavaxPacScriptParser.setupEngine(JavaxPacScriptParser.java:51)
	at com.github.markusbernhardt.proxy.selector.pac.JavaxPacScriptParser.<init>(JavaxPacScriptParser.java:40)
	at com.github.markusbernhardt.proxy.selector.pac.PacProxySelector.selectEngine(PacProxySelector.java:76)
	at com.github.markusbernhardt.proxy.selector.pac.PacProxySelector.<init>(PacProxySelector.java:41)
	at com.intellij.util.net.IdeaWideProxySelector.select(IdeaWideProxySelector.java:75)
	at com.intellij.util.proxy.CommonProxy.select(CommonProxy.java:213)
	at com.intellij.util.proxy.CommonProxy.select(CommonProxy.java:182)
	at com.intellij.util.net.HttpConfigurable.openConnection(HttpConfigurable.java:412)
	at com.intellij.util.net.HttpConfigurable.prepareURL(HttpConfigurable.java:391)
	at com.intellij.internal.statistic.libraryJar.LibraryJarStatisticsService.createVersionsUrl(LibraryJarStatisticsService.java:82)
	at com.intellij.internal.statistic.libraryJar.LibraryJarStatisticsService.getTechnologyDescriptors(LibraryJarStatisticsService.java:54)
	at com.intellij.internal.statistic.libraryJar.LibraryJarStatisticsService.lambda$runActivity$0(LibraryJarStatisticsService.java:98)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:314)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.mozilla.javascript.Scriptable
	at com.intellij.util.lang.UrlClassLoader.findClass(UrlClassLoader.java:241)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 19 more
```

#とりあえずの策
Settings -> HTTP Proxy -> Auto-Detect proxy settings
がチェックされているとだめみたいなので no proxyに変更。
bitbucket-pipelines セットアップ

Bitbucket pipelinesを試す。

2年くらい前にベータ版を触ったきりなので、現在何ができるのか色々やってみる

ちなみに、GROOVE Xでは現在主に[Circle CI](https://circleci.com/)を使ってますが、過去に[wercker](https://app.wercker.com/sessions/new?return_url=%2F)を使っていたり、時間のかかるOSビルドなどはJenkinsを使っています。

GROOVE Xはテスト駆動を推奨しているので、ロボットのテスト駆動開発という未知の世界にダイブしたい方は是非遊びに来てください！

# 作業場所

動作確認用のリポジトリを作っていろいろ試していきます

* https://bitbucket.org/hiro15/bitbucket-pipelines-test/src

# 料金

* リポジトリのページに行くとサイドバーにpipelinesの項目が表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/ca023676-2327-7aa8-408f-e5a7ad66406c.png)

* 課金なしだと50min/month使える模様

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/b36d81ef-c9b7-8fcf-bd42-94b7dce5c6fb.png)

[料金プラン](https://confluence.atlassian.com/bitbucket/plans-and-billing-224395568.html#BitbucketCloudplandetails-Plandetails)

* ビルド時間はアカウントごとに紐づいていて、設定ページから残りのビルド時間を確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/0727b598-b42e-4caf-f31d-a4e0f02242f0.png)

* チームも同様でビルド時間はチームに紐付いていてチームの設定ページからビルド時間が確認できる

プラン関係なく、追加でビルド時間を購入できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/2737ecab-7539-985c-955f-ee52fe92866e.png)

# うごかしてみる

* pipelinesのページからテンプレートを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/3c20ff36-24db-c3f0-052f-986c11c9a675.png)

とりあえず、うちのチームの主要言語のgoを選択

* ページの下にあるcommitボタンを押すと最初のビルドが走る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/dc91b3dd-ce08-d7c9-61b4-4eacefd3843c.png)

なんもないからコケる

* main.goとコケるテストを追加してpushする

```
(master)% tree
.
├── bitbucket-pipelines.yml
├── main.go
└── main_test.go
```

* pushするとpipelinesが動きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/1f34670b-dcd2-2008-90c9-5d289cc10a2d.png)

* 思ってたのと違うところでコケた＼(^o^)／

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/e5df36bb-fd87-a5f9-6895-d05a4e8fc866.png)

* 色々見た結果、環境変数を `\` でエスケープしてるのが問題だと判明

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/160273c6-5f95-cbdd-0d7a-e28bf260aa13.png)

* pipelinesの結果はビルドステータスに表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/ec9e1f15-d1a0-7e5e-e901-c7cbc5f0a037.png)

* 通るとこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/c71bf2b1-3ad1-72bc-1b7e-1c8ecdd464bc.png)
Oracle Database 18cとOracle Database 19cの初期化パラメーターを比較する

Oracle Database 19cのオンプレミス版が[ダウンロード](https://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html)できるようになったため、Oracle Database 18c (18.3)と初期化パラメーターを比較してみました。基本的にデフォルト状態でデータベースを作成し、インスタンス名やファイルのパス等環境によって変化するパラメーターは比較対象から除いています。SQL*PlusからSYSDBA接続を行い、SHOW PARAMETERコマンドの結果を比較しています。

# 削除されたパラメーター

削除されたパラメーターは２つだけです。O7_DICTIONARY_ACCESSIBILITYはOracle 7との互換性維持のため残っていたパラメーターです。よく今まで残っていたと感心します。

|パラメーター名|説明|
|:---|:---|
|O7_DICTIONARY_ACCESSIBILITY|SYSスキーマ内のオブジェクトへのアクセス許可設定を行います|
|exafusion_enabled|Exafusion高速化キャッシュ・フュージョン・プロトコル機能を有効または無効にします|

# 追加されたパラメーター

14個の初期化パラメーターが追加されています。Data Guard関連や、管理系の初期化パラメーターが多い印象です。ただし、[マニュアル](https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/index.html)の追加が間に合わないらしく、いくつかの初期化パラメーターが記載されていません。allow_rowid_column_typeはマニュアルに記載が無いようです。名前からROWID型の利用許可を制限する機能のようです。client_statistics_levelもマニュアルに記載がありません。統計情報の取得に関するパラメーターだと思われます。cpu_min_countもマニュアルに記載がありません。動的にCPU数を変化させる機能でしょうか？data_guard_max_longio_timeもマニュアルに記載がありません。

|パラメーター名|説明|デフォルト値|備考|
|:---|:---|:---|:---|
|adg_redirect_dml|Active Data Guard環境で DML Redirect機能を有効にする|FALSE||
|allow_rowid_column_type|不明|FALSE||
|client_statistics_level|不明|TYPICAL||
|cpu_min_count|不明|1||
|data_guard_max_io_time|Data Guard環境で通常のI/Oがハングしたとみなされる秒数|240||
|data_guard_max_longio_time|Data Guard環境で長いI/Oがハングしたとみなされる秒数|240||
|enable_imc_with_mira|Active Data Guard スタンバイで院メモリー列ストアの有効化|FALSE||
|http_proxy|不明|''||
|lob_signature_enable|LOB locatorの署名機能を有効化|FALSE||
|max_datapump_parallel_per_job|PDB単位のData Pumpジョブの最大数|50|マニュアル上のデフォルトは100|
|max_idle_blocker_time|不明|0||
|scheduler_follow_pdbtz|不明|FALSE||
|ssl_wallet|不明|''|
|unified_audit_common_systemlog|不明|''||

# デフォルト値が変更されたパラメーター
デフォルト値が変更された初期化パラメーターは基本的にバージョン関連のものを除くと２つのみです。job_queue_processesとmax_pdbsは、マニュアル上のデフォルト値は変化がありませんが、DBCAで作成して確認したところ変わっていました。

|パラメーター名|Oracle Database 18c|Oracle Database 19c|
|:---|:---|:---|
|compatible|18.0.0|19.0.0|
|job_queue_processes|4000|20|
|max_pdbs|4096|254|
|optimizer_features_enable|18.1.0|19.1.0|

今後マニュアルの記載は拡充されるでしょう。
DATA_GUARD_MAX_LONGIO_TIMEの説明を追記しました（2019/5/9)。
[Unity]Switch文_to_Delegate

##はじめに

〇YouTubeでUnity Japanの安原 祐二さんが解説している、[part3-プッシュとプル]という動画で、Switch文をdelegateに変えることでスッキリした文章になっていたので、理解するべく個人の記事にまとめました。

〇動画で、紹介されていたところ ↓↓
<img width="552" alt="delegate_to_switch.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176010/28d2c95f-037b-772b-3be6-08536fe2a5c3.png">
[参照]https://www.youtube.com/watch?v=HwD7npYb9_k


##まず、コード

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SwitchToDelegate : MonoBehaviour
{
    void Start()
    {
	// ステージにギミックをランダムに発生させる
	funcGimmick[UnityEngine.Random.Range(0, funcGimmick.Length - 1)];
    }

    private delegate int funcDelegate(Rigidbody[] rb, int index, int create_num);

    private static Dictionary<GimmickType,funcDelegate> funcGimmick = new Dictionary<GimmickType, funcDelegate>
    {
        {GimmickType.Fall, 	FallGimmick },
        {GimmickType.BurnOut, 	BurnOutGimmick },
    };
    private static int FallGimmick(Rigidbody[] rb, int index, int create_num)
    {
        // ステージが落ちる
	return 0;
    }
    private static int BurnOutGimmick(Rigidbody[] rb, int index, int create_num)
    {
        // ステージが跳ねる
	return 0;
    }
}

public enum GimmickType
{
    Fall,
    BurnOut
}
```

〇このコードは、ステージにランダムでギミックを発生させる処理を書いたときに使ってみたのでその時のコードから切り取ってます。

##利用するときに
〇Enum型をDictionaryのKeyにしているため、
funcGimmick[GimmickType.Fall]
のように呼ぶことができる。

〇型省略
private static Dictionary<GimmickType,funcDelegate> funcGimmick = new Dictionary<GimmickType, funcDelegate> ⇒
var funcGimmick = new Dictionary<GimmickType, funcDelegate>
{
	//すっきりする
}

〇速度面
自身では検証していないが、調べたところ
C#では、列挙型をキーにしたDictionaryは
.NET4.6以前：int型のキーと比べて5倍ほど遅い
.NET4.6以降：int型のキーと比べて差がない
[参照]https://qiita.com/goropocha/items/9c58d4f163c1e409a3fd

##おわりに
勉強になった（　）
追記：最初、限定公開で個人的なメモにしてたのでいろいろ雑
GitHub, twitter等の連携方法について

Qiitaには、Github, twitter, Linkedin, Facebookなどを横顔(profile)に登録できる。
ある１００人を調べてみた。

| link | 人数 |
|:--|--:|
| github | 52 |
| twitter | 37 |
| なし | 29 |
| facebook | 6 |
| linkedin | 1 |

合計が100より多いのは、2つのlinkがある人が15人。3つのlinkがあるひとが5人。

記事の最後に必ずついてくるのは、
twitter, facebook, mastodon

linkedinは、リーディングリストへの追加に、twitter, facebookと並んでいる。

gihubは、主に記事中で引用する。

githubの整理をせねば、、、。

#課題
ある10人だとgithubよりtwitterの数が多くなることがある。
100人だとだいたいこの順番。1000人だとどうだろう。
集計ソフトウェアを記述するとより。


### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.