OmniAICreator/Qiita-1.07M huggingface dataset:
Javaにおける文字列の全角⇔半角変換について

# 背景
業務で、文字列の全角→半角、または半角→全角変換を実装する必要が生じた。調べた結果のメモ。
用途は、比較処理時の表記揺れの吸収。

# 要件
- 変換対象：英数字，記号
- 記号は、一対一で変換可能なものだけ対象としたい（いわゆる環境依存文字は対象から除外）。
- カタカナについて変換の必要はないが、用途上、一意になるなら変換されても問題ない。
- 実行環境：Java SE 8u201(64bit)

# 方法
## Normalizer
方法１。Java6以降で使用可能な`java.text.Normalizer`を使用する方法。
懸念として、全角⇔半角変換を目的としたものではないため、正規化の過程で余計な変換が生じる可能性がある。

## ICU4J
[ICU - International Components for Unicode](http://site.icu-project.org/)
方法２。外部ライブラリを使用する。
執筆時点での最新バージョンであるICU4J 63.1を使用する。

# ソース

```java
Transliterator fullToHalf = Transliterator.getInstance("Fullwidth-Halfwidth");
Transliterator halftoFull = Transliterator.getInstance("Halfwidth-Fullwidth");
String target =
    "全半“　”\" \"あがぱアガパｱｶﾞﾊﾟＡＢａｂABab１２３123「」（）()［］[]；;！!？?＃#／/－-・┣①⑪㌀㈱㌔¼⑴";
System.out.println("target :" + target);
System.out.println("NFC    :" + Normalizer.normalize(target, Normalizer.Form.NFC));
System.out.println("NFD    :" + Normalizer.normalize(target, Normalizer.Form.NFD));
System.out.println("NFKC   :" + Normalizer.normalize(target, Normalizer.Form.NFKC));
System.out.println("NFKD   :" + Normalizer.normalize(target, Normalizer.Form.NFKD));
System.out.println("ICU4J H:" + fullToHalf.transliterate(target));
System.out.println("ICU4J F:" + halftoFull.transliterate(target));
```

# 実行結果

```
target :全半“　”" "あがぱアガパｱｶﾞﾊﾟＡＢａｂABab１２３123「」（）()［］[]；;！!？?＃#／/－-・┣①⑪㌀㈱㌔¼⑴
NFC    :全半“　”" "あがぱアガパｱｶﾞﾊﾟＡＢａｂABab１２３123「」（）()［］[]；;！!？?＃#／/－-・┣①⑪㌀㈱㌔¼⑴
NFD    :全半“　”" "あがぱアガパｱｶﾞﾊﾟＡＢａｂABab１２３123「」（）()［］[]；;！!？?＃#／/－-・┣①⑪㌀㈱㌔¼⑴
NFKC   :全半“ ”" "あがぱアガパアガパABabABab123123「」()()[][];;!!??##//--・┣111アパート(株)キロ1⁄4(1)
NFKD   :全半“ ”" "あがぱアガパアガパABabABab123123「」()()[][];;!!??##//--・┣111アパート(株)キロ1⁄4(1)
ICU4J H:全半“ ”" "あがぱｱｶﾞﾊﾟｱｶﾞﾊﾟABabABab123123｢｣()()[][];;!!??##//--･┣①⑪㌀㈱㌔¼⑴
ICU4J F:全半“　”＂　＂あがぱアガパアガパＡＢａｂＡＢａｂ１２３１２３「」（）（）［］［］；；！！？？＃＃／／－－・┣①⑪㌀㈱㌔¼⑴
```

# 結論
今回はICU4Jで全角→半角変換する方法に決めました。
事前に入力を絞れるのであれば、Normalizerの方がお手軽で良いと思います。

# 参考文献
- [全角・半角変換をNormalizerでやる場合、気を付けておきたいこと](http://java-study.blog.jp/archives/1070698074.html)
- [Javaの文字変換ライブラリICU4Jを使ってみよう](https://weblabo.oscasierra.net/java-icu4j-1/)
- [Javaで半角カナ→全角カナ変換する場合のベストプラクティスについて](https://stealthinu.hatenadiary.jp/entry/20140826/p1)
- [Normalizer(Java Platform SE 8)](https://docs.oracle.com/javase/jp/8/docs/api/index.html?java/text/Normalizer.html)
- [ICU - International Components for Unicode](http://site.icu-project.org/)
初心者の障害であるエラーは意外と優しい

# はじめに
エラーって、ちゃんと導いてくれてるんだなと最近感じたのでメモついでに書いておきます。

# エラー表
下記のエラーは上から順に重要度が高いエラーとなる。

| 種類 | 内容 | 動作 |
|:-----------------|:------------------|:------------------|
| E_PARSE | シンタックスエラー（文法エラー、構文エラー） | 処理が実行されない |
| E_ERROR | 実行時の致命的なエラー | エラー発生箇所で処理停止 |
| E_WARNING | 実行時に発生した重い問題の警告 | 処理継続 |
| E_NOTICE | 実行時に発生した軽い問題の警告 | 処理継続 |
| E_DEPRECATED | 非推奨で将来的には配される関数や文法がある場合の警告 | 処理継続 |
| E_STRICT | 互換性維持のために発する警告 | 処理継続 |


## E_PARSE: シンタックスエラー
### エラー文
```php
Parse error: syntax error, unexpected 'hoge' in /path/to/file.php on line 1
```
### 説明
文法エラーや構文エラーなどのシンタックスエラーによって発生するエラー。
主に、セミコロンやカッコが足りなかったりした時に発生する。
上記の文法や構文の不足により、このままPHPファイルとして正常に実行することができないため、`E_PARSE`が発覚した時点でPHPファイルの読み込みが終了する。
### 対処法
エラー分のどのファイルの何行目の何でエラーが出ているかがわかるので、その箇所を確認する。
上記を見てもわからない場合は、よくある条件分岐などで中括弧(`{}`)がなかったり、文末のセミコロン`;`がなかったりしていないかを確認する。

## E_ERROR: 致命的なエラー
### エラー文
```php
Fatal error: Cannot redeclare class hoge in /path/to/file.php on line 1
```
### 説明
定義されていない関数の呼び出しや、すでに定義されているクラスや関数の再定義によって発生するエラー。
このエラーの場合、ファイルの読み込みはされているが、このエラーが出た時点で処理が終了するため処理は完了しない。

### 対処法
エラー文に表示されているファイルの行数目の箇所を確認し、再定義やスペルミスがないかを確認。
関数名やメソッド名を間違えているケースがよくある。

## E_WARNING: 警告
### エラー文
```php
PHP Warning: hoge() expects at least 1 parameter, 0 given in /path/to/file.php on line 1
```
### 説明
呼び出す関数の引数不足や型の不一致によって発生するエラー。
このエラーが発生すると、呼び出されている関数、式や評価の文の実行は停止する。
処理自体は続行するため、停止した処理の情報がそのあとの処理で不要なものだった場合は処理自体は正常に動作し、必要なものの場合は正常に動作しない場合がある。
### 対処法
エラー文に書いてある箇所で、呼び出し時に渡している引数と実際の引数が正しいかを確認。
引数の数があっている場合、`var_dump`で実際にどの型が引数として送られてきているのかを確認することも必要。

## E_NOTICE: 警告
### エラー文
```php
PHP Notice: Undefined variable: hoge in /path/to/file.php on line 5
```
### 説明
未定義変数を利用していたり、関数の引数がおかしかったりする時に発生するエラー。
`E_WARNING`と似ているが、修正の重要度が低い。
`E_NOTICE`の場合は、警告が発生したとしても、エラーに対してPHP側で自動的に対処を施される。例えば、未定義の変数の場合はnullが値として入る。

### 対処法
エラー文で何が間違っているか丁寧に書いてあるため、どこの何がおかしいのかをよく確認する。

## E_DEPRECATED: 非推奨
### エラー文
```php
PHP Deprecated: Function hoge_foo() is deprecated in /path/to/file.php on line 1
```
### 説明
PHPのバージョンで将来的に廃止となることから非推奨となっている文法や関数を使用していた場合に発せられるエラー。
実際に廃止されるまでは、警告は出続けるが処理は止まらず、プログラムにも影響はない。
しかし、メンテナンスしなければいけないため、変更することが推奨される。
### 対処法
非推奨となっていない関数を使用するか、別のロジックで処理を書くように修正する。

## E_STRICT: 互換性維持
### エラー文
```php
Strict Standards: Redefining already defined constructor for class hoge in /path/to/file.php on line 1
```
### 説明
同じクラス内で複数のPHPバージョンのクラスコンストラクタの定義の方法を実行すると発するエラー。
処理は最後まで実行される。
### 対処法
PHPのバージョンなどでのエラー箇所の構文などを確認して、バージョンで異なることをしていないかを確認する。

## まとめ
プログラミングを始めた時はエラーがたくさん出て嫌になることが多いと思います。
そんな時に「あ、このエラーはこういうことな気がする」というように仮説を立てて対処していけると、解決までの時間が早くなってさらにたくさんのコードを書けるようになると思います。
エラー文をしっかり見ることは大切なので、とりあえず何か問題が発生したらエラーが吐き出されていないかを確認するようにしましょう。
cmakeでDownload failed: "Unsupported protocol"でエラーが起こった時の対処方法

当方の環境はUbuntu16.04LST , cmake version 3.14.0-rc2であったことを明記しておきます。

#対処

opensslを更新する

```bash
$ sudo apt-get install openssl libssl-dev 
```

更新してからcmakeを再ビルド＆インストールします。


```bash
$ wget https://github.com/Kitware/CMake/releases/download/v3.14.0-rc2/cmake-3.14.0-rc2.zip
$ tar xvf cmake-3.14.0-rc2.tar.gz
$ cd ./ cmake-3.14.0-rc2
$ ./bootstrap && make && sudo make install
```

このURLはversion3.14のURLなので最新版がほしい時は
https://cmake.org/download/　
以上で任意のバージョンを落としてください



#参考

https://qiita.com/koara-local/items/9d01c6bb9dd93563b7c6
https://stackoverflow.com/questions/29816529/unsupported-protocol-while-download-tar-gz-package
Pythonによるスクレイピングでニコニコ大百科掲示板を保存してみる

### 背景
- ニコニコ大百科の掲示板は一度に３０件しか表示できず、ログをまとめて保存する機能もない（よね？）
- 割と頻繁に削除も入るため、過去の情報をトレースしにくい。

### 目的
- 指定した記事の掲示板をスクレイピングし、1レス目から最新レスまでをまとめて取得・保存する。

### 詳細
- 記事トップのURLを指定して叩くと全掲示板ログをtxt形式で保存する。ファイル名は「`(記事タイトル).log`」
- 新規の場合は全取得するが、既に一度保存したものの場合、未取得ID以降のみをターゲットとする。
- ファイルの結合や一行抜き出しがpythonだけだとめんどいので、一部Bashに任せている。

ソースはこちらから。
https://github.com/we-yu/sb.webscraping

### 半自動化
- 都度都度取得しておきたい記事は、以下のようなテキストファイルを用意しておき、usageのコマンドを打つと自動で取得・更新してくれる。

```txt:AutoLoadArticleList.txt
# usage
# $ cat AutoLoadArticleList.txt  | grep -vF '#' | xargs -I{} python3 nicopedy_saver.py {}
# Python
https://dic.nicovideo.jp/a/python
# Linux
https://dic.nicovideo.jp/a/linux
# PHP
https://dic.nicovideo.jp/a/php
# メルトリリス
https://dic.nicovideo.jp/a/%E3%83%A1%E3%83%AB%E3%83%88%E3%83%AA%E3%83%AA%E3%82%B9
```
数検１級 (1) 複素数

# 問題

$i$ を虚数単位、$\mathrm{e}$ を自然対数の底とします。$\mathrm{e}^{z} = -i$ を満たす複素数 $z$ のうち、虚部が $0$ 以上 $2\pi$ 未満のものを求めなさい。



<details><summary></summary><div>

# 知識

次の公式を知らないとフリーズする（オイラーの公式, [参考](https://mathtrain.jp/eulerformula)）。


```math
\mathrm{e}^{i\theta} = \cos \theta + i \sin \theta
```

導出には $\mathrm{e}^x, \cos x, \sin x$ のテイラー展開を用いるが、覚え方としては、博士の愛した数式 $\mathrm{e}^{i\pi} = -1$ を覚えていれば、右辺を極形式で表して

$$
\mathrm{e}^{i\pi} = -1 = \cos \pi + i \sin \pi
$$

この両辺を $\frac{\theta}{\pi}$ 倍して公式を復元できる。


# 解答

$z = a + b i$ とおく。

```math
\begin{align}
\mathrm{e}^{z} 
&= \mathrm{e}^{a} \mathrm{e}^{bi} \\
&= \mathrm{e}^{a} (\cos b + i \cos b) \\
&= -i \\
&= \cos \frac{3\pi}{2} + i \sin \frac{3\pi}{2} 
\end{align}
```

よって、$\mathrm{e}^a = 1$, $a = 0.$  また、$0 \le b < 2\pi$ なので、 $b = \frac{3\pi}{2}$.

$z = \frac{3\pi i}{2}$.

</div></details>
プログラミング学習はじめました

# はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<齋藤みなみ>です。
現在HTML,CSSを学習しています。
未来電子テクノロジーのプログラミング教養コースに所属し、プログラミングを学習し始めて2週間が経過したので、今まで学習したプログラミングの基本中の基本をシェアしていきたいと思います。
どちらもプログラミング初心者の私にもわかりやすい
私は、プログラミングの学習ツールとして[Progate](https://prog-8.com/languages/html)と[これからはじめるHTML&CSSの本](https://www.amazon.co.jp/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E5%AD%A6%E6%A0%A1-%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B-CSS%E3%81%AE%E6%9C%AC-Windows-macOS%E5%AF%BE%E5%BF%9C%E7%89%88/dp/4774189685/ref=pd_lpo_sbs_14_img_0?_encoding=UTF8&psc=1&refRID=TXP8CNSYRMVJPB0D3CGD)を使用しています。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

# リンクの挿入
私が、プログラミングの学習を始めて驚いたのが、リンクの挿入です。
なぜ驚いたのか、それはプログラミングの知識がなかった私にとって、普段何気なくワードをクリックしリンクに飛ばされていたことが、このような仕組みで出来上がっていたということに感動を覚えたからです。

## やり方
※以下は、HTMLコードの書き方を解説しています

1.リンク先である「通天閣」の文字を入れる。

<img width="960" alt="2019-02-27 (4).png" src="https://qiita-image-store.s3.amazonaws.com/0/359470/471114c9-738f-51b8-4fa7-fc63d273b972.png">



2.この文字列の属性がリンクであることを示すために、aタグで囲う.

<img width="960" alt="2019-02-27 (5).png" src="https://qiita-image-store.s3.amazonaws.com/0/359470/46d0f79b-7510-e832-0ae8-19734d0e6941.png">




3.リンクの開始を表すhref=""を最初のaの次に書き込み、””の中にリンクを入れて完成。

<img width="960" alt="2019-02-27 (7).png" src="https://qiita-image-store.s3.amazonaws.com/0/359470/213729fb-4020-5956-a442-62b6ecfaa59a.png">




#グーグルマップの埋め込み

1.Google Map検索して開きます。

<img width="960" alt="2019-02-27.png" src="https://qiita-image-store.s3.amazonaws.com/0/359470/76ea603b-004d-b8c0-fae0-411f80161144.png">


2.画面左上のメニューを開き、メニューバー下部の「地図を共有または埋め込む」をクリックします。

<img width="960" alt="2019-02-27 (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/359470/3baeedfe-879c-a789-f8d8-ff43bd37175d.png">



3.「地図を埋め込む」を選択し、「HTMLをコピー」をクリックします。

<img width="960" alt="2019-02-27 (2).png" src="https://qiita-image-store.s3.amazonaws.com/0/359470/3cc83548-f416-a9e3-76f4-236ada4817f8.png">



4.テキストエディタの地図を埋め込みたい場所に貼り付けて、完成。

<img width="960" alt="2019-02-27 (3).png" src="https://qiita-image-store.s3.amazonaws.com/0/359470/aab0ed5d-b156-60e7-fc6a-e96a67e02dac.png">



# おわりに
私にとってプログラミングはとても難しいですが、今後も継続して学習し、いつか自分でサイトが作れるようになりたいです。
Chapter6で躓いたところ

#### 書籍「Dockerによるアプリケーション開発環境構築ガイド
Dockerを勉強するために購入した書籍「Dockerによるアプリケーション開発環境構築ガイド（櫻井洋一郎、村崎大輔[著] ISBN978-4-8339-6458-0)」に掲載されていた演習をやった。
Chapter6でCircleCIというサービスを利用した解説があるが、すんなり行かな買ったので備忘録。

#### ハマったポイント
書籍サイトからダウンロードできるconfig.ymlはちょっと修正が必要。
i) setup_remote_dockerがコメントアウトされてしまっているがないと、Dockerが見つからないと言って怒られる。書籍での記載にはsetup_remote_dockerが入っているが、Webからダウンロードできるファイルには入っていない。
  ( "- setup_remote_docker" を"- checkout"の後ろに入れる ) 
ii) IMAGE_NAME="sampledocker1234/ci_sample..." のsampledocker1234の部分は、自分のDockerHubユーザー名にする ( 小文字でないといけない。大文字が入っている人はDockerHub側のユーザー名を変更する必要あり）
iii) \$DOCKERHUB_ID という部分は \${DOCKERHUB_ID} と修正する必要がある。（DOCKERHUB_PASSも同様に）

```yml:.circleci/config.yml
version: 2
jobs:
  build:
    working_directory: /nginx
    docker:
      - image: docker:17.05.0-ce-git
    steps:
      - checkout
      - setup_remote_docker
#      - setup_remote_docker:
#          docker_layer_caching: true
      - run:
          name: Build docker image
          command: |
            docker build -t nginx .
      - deploy:
          name: Push docker image to DockerHub
          command: |
            if [ "${CIRCLE_BRANCH}" == "master" ]; then
              DATE_LABEL="$(date '+%Y%m%d%H%M')-$(echo $CIRCLE_SHA1 | cut -c -6)"
              IMAGE_NAME="your_dockerhub_id/ci_sample:${DATE_LABEL}"
              docker tag nginx ${IMAGE_NAME}
              docker login -u ${DOCKERHUB_ID} -p ${DOCKERHUB_PASS}
              docker push ${IMAGE_NAME}
            fi
```

#### 最後に
本書、なかなかの良書と感じています。掲載されている手順に関しては完成度にまだ改善の余地ありですが、完成度よりも鮮度も大事な世の中なので感謝しています。
CircleCIを使うとDockerイメージをバックグラウンドで更新してくれるんで楽ですね。
Responder用のLogin Managerを作った話

タイトルの通りです

# インストール
```bash
$ pip install responder_login 
```
でインストールできます。

# 使用方法

```python
import responder
from responder_login import LoginManager, UserMixin

api = responder.API()
lm = LoginManager(api)
```
のように宣言してから`LoginManager.user_loader`でcallbackをデコレートして、`LoginManager.login_user(user)`でログイン, `LoginManager.logout_user()`でログアウト, `LoginManager.current_user`でログイン中のユーザの取得などができます。そのほかにも機能がありますので、[Responder-Login](https://github.com/delta114514/responder-login) --- [Docs](https://responder-login.readthedocs.io/en/latest/)をご覧ください。 


# 使用例

```python
import responder
from responder_login import LoginManager, UserMixin

api = responder.API()
lm = LoginManager(api)

users = []


class User(UserMixin):
    id = None
    name = "Anonymous"
    age = 0

    def __init__(self, name, age):
        global users
        self.name = name
        self.age = age
        users.append(self)
        self.id = users.index(self)

    def get_id(self):
        return self.id

@lm.user_loader
def user_loader(user_id):
    try:
        return users[int(user_id)]
    except IndexError:
        return None


@api.route("/login/{name}/{age}")
@lm.login_prohibited
def login(req, resp, *, name, age):
    user = User(name, age)
    lm.login_user(user)
    resp.text = f"you've logged in as User; name: {user.name}, age: {user.age}"


@api.route("/show")
def show(req, resp):
    user = lm.current_user
    if user.is_authenticated:
        resp.text = f"you're logging in as User; name: {user.name}, age: {user.age}"
    else:
        resp.text = "you're not logging in"


@api.route("/logout")
@lm.login_required
def logout(req, resp):
    lm.logout_user()
    resp.text = "you've logged out"


if __name__ == "__main__":
    api.run()
```
うまく動作します。

プルリクエスト、issueなどどしどしまってます！！
DLL作成から利用までの備忘録。

#初めに
今回の記事に関する参考サイト（正直このサイトだけで事足ります。
http://pickles-ochazuke.hatenablog.com/entry/2017/07/05/171806
http://pickles-ochazuke.hatenablog.com/entry/2017/07/05/171813


#余談
Visual Studioとは統合開発環境です。
公式ページ：https://www.microsoft.com/ja-jp/dev/default.aspx
参考Wiki：https://ja.wikipedia.org/wiki/Microsoft_Visual_Studio

DLLとはダイナミックリンクライブラリです。
weblio辞書：https://www.weblio.jp/content/DLL


#注意点
DLLの方を更新しても関数など追加削除が反映されない場合があるので、
そのときは追加したDLLのプロジェクトを外して再追加してください。



#dllとlibを使った形での環境構築
上記のやり方ではなく、dllとlibを直接渡して行うやり方があります。
こちらの方法の利点と欠点などいくらかありますが、とりあえず言えることとしてはバージョン管理が必要になります。

##1,DLLプロジェクトのlibと.hを渡す
まず、DLLを作成したプロジェクト（以下DLLプロジェクト）から出力されている「lib」と「.h」をdllを扱うためのプロジェクト（以下プロジェクトA）に渡します。

どこでもいいですがプロジェクトAのディレクトリ内にあると設定が楽です。

また、DLLプロジェクトの「Debug」と「Release」内にあるlibとdllは別物と扱います。
プロジェクトAの「Debug」と「Release」にDLLプロジェクトの「Debug」を多用することは出来なかったはずです。

![スクリーンショット (349).png](https://qiita-image-store.s3.amazonaws.com/0/252485/4559c166-994d-128e-9d32-56ca2aed9337.png)


##2,DLLプロジェクトのdllを渡す
次に、DLLプロジェクトのdllをプロジェクトAのexeと同じ階層に置きます。
この際も「Debug」に「Debug」のものを渡すようにしてください。
※今回はx86でやっています。

![スクリーンショット (350).png](https://qiita-image-store.s3.amazonaws.com/0/252485/fe916265-b048-7dd6-715a-34c01c2c8c9b.png)

ここで気づいたかもしれませんが、exeを渡す際にはdllも渡さなければならなくなります。
それを防ぐためには「ILMarge」を使った方法があるみたいです。まだやったことはないのでその点についてはご自分で調べてください。
そのほかには「ビルド後のイベント」を弄ると出来そうですがこれもまだやってないです。


##3,プロジェクトAの環境構築
見ればわかるように画像にしているので、言葉での細かい説明はしません。

まず、C/C++の全般にて、「lib」と「.h」を入れたディレクトリを指定するようにしてください。
もちろん「Debug」には「Debug」です。
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/252485/7f0246de-c82c-f4ee-04c8-d3251beb17d3.png)


同様にリンカーにても行います。
![スクリーンショット (352).png](https://qiita-image-store.s3.amazonaws.com/0/252485/334df232-f70e-10d4-850e-ecf2e1635c9e.png)


そうしたらリンカーの入力にて「lib」を指定してください。
![スクリーンショット (354).png](https://qiita-image-store.s3.amazonaws.com/0/252485/63b674d5-46c8-b9cc-8534-8678ca672934.png)


##4,そのあと
これで環境構築は終わりです。
includeにて該当の「.h」を指定すれば扱えるようになるはずです。
[python]ヘッドレスChromeでGoogle検索結果上位10件

# はじめに
Seleniumでスクレイピングする際に、ヘッドレス（ブラウザ非表示）で動かす方法のmemo。
ただし、このままだとファイルのダウンロードなどが失敗します。クロムの設定をいじる必要があるようです。ファイルDLを実施する場合は、その設定をするか非ヘッドレスで動かす必要があります。
設定については次回。

# サンプルコード

```python:Googleで「うんこ」上位10件
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options

# 時間計測用
start = time.time()

options = Options()
options.add_argument('--headless')

# ChromeのWebDriverオブジェクトを作成(ヘッドレスモードの場合)
# ノーヘッドレスの場合は引数なしで実行する
driver = webdriver.Chrome(chrome_options=options)

driver.command_executor._commands["send_command"] = (
    "POST",
    '/session/$sessionId/chromium/send_command'
)
params = {
    'cmd': 'Page.setDownloadBehavior',
    'params': {
        'behavior': 'allow'
    }
}

# 検索ワード ########################################### 
word = "うんこ"
#######################################################

url =  "https://www.google.com/search?q={}&safe=off".format(word)
driver.get(url)
time.sleep(2)

elems1 = driver.find_elements_by_class_name("LC20lb")
elems2 = driver.find_elements_by_class_name("st")

for elem1,elem2 in zip(elems1,elems2):
    e1 = elem1.text
    e2 = elem2.text
    print(e1)
    print(e2)
    print("=====================================")

print("処理時間：　" + str(time.time() - start))
driver.quit()  # ブラウザーを終了する。
```





# 結果
```
株式会社うんこ【公式ショップ】
株式会社うんこ【公式ショップ】では、Tシャツ、ポロシャツ、パーカー、リストバンドなどなど、たくさんの【うんこ】グッズを取り揃えております。 新製品も続々生産中！ 今後も楽しい商品をご提案し、多くの笑顔をお届けします。
=====================================
うんこ - Wiktionary
While うんこ (unko) is sometimes given as a literal translation of English interjection shit! as an expression of displeasure, this is inaccurate, as unko! sounds more like someone saying “Oh turd!” or “Oh doo-doo!” in English. Rather, the vulgar ...
=====================================
日本うんこ学会
日本うんこ学会公式HP unkogakkai.jp.
=====================================
About うんコレ - 日本うんこ学会
About うんコレ. こんにちは、日本うんこ学会会長の石井洋介です。 私は医師として働く中で、「医療情報をもっと身近に、面白く、分かりやすく届け、大腸癌のことをもっと知ってもらいたい」という思いを抱いてきました。その解決方法の1つとして考えてきた ...
=====================================
うんこ - アンサイクロペディア
2019/01/02 - うんこはベルギー連邦に本部を置く、製品の技術的水準を審査する国際評価機関モンドセレクションの厳正な審査により、最高金賞を受賞しました。 この優秀品質賞は完全に独立した専門家によってその高品質を表彰するラベルであり、
=====================================
UNKO - アンサイクロペディア
2017/04/05 - UNKO（英・United Nations unification of the Korean peninsula Organization、邦訳「国連朝鮮半島統一機構」は、韓国と北朝鮮を統一するために発足した国連の補助機関。本部はパキスタンのフンザ。
=====================================
うんこ - 語源由来辞典
うんこは、いきむ声「うん」に接尾語「こ」が付いたものである。 その他、「阿吽」の「吽（うん）」と関連付ける説もある。 その説とは、中国仏教で大小便を「吽」、大小便の溜まり場を「吽置（うんち）」と呼んでおり、奈良時代に「吽」が日本へ入り上流語として使われてい ...
=====================================
処理時間：　6.296737194061279
```
Ryzen Threadripper 2950X で機械学習　YOLO V3　KerasでVGG16

#買っちゃった
機械学習を高速にしたいのでRyzen Threadripper 2950X でPCを組みました。
買ったのは去年の12月。なんだかんだ実験してたらもう数カ月たってしまった。

もともとGPUをうまく使える環境ではなかったので、高性能なGPUを導入しても効果が無いことからPCを買いなおした。

#結果
結果的に早くなった。GPU,CPUをしっかり使うようになった。これはすごい。
金を使った分リニアに伸びない世界だから、価格に見合う性能UPか？と言われると・・・



#構成
元々あったのと合わせて以下のようになりました。
CPU:Ryzen Threadripper2 2950X 
クーラー:KRAKEN X52
MB:X399 GAMING PRO CARBON AC
CASE:Trooper SE (SGC-5000-KWN2)
MEM:CMK16GX4M2Z2666C16　2個で32G
SSD:MZ-V7E500B/IT
電源:CORSAIR RM1000x 
GPU:GTX1070Ti*3枚

GPUは3スロット占有が2枚、2スロット占有が1枚でも何とかささりました。
ケース大きい。



#INTEL入ってないとダメなんじゃない？
ダメじゃなかった。
Tensorflow（CPU）も動いた
YOLO V3もCPUで動いた。


#1coreあたりの性能が低いと遅い？
怖かったので 2950X にしました。i5-7500にくらべてだいぶ早いように感じます。

#YOLO V3はどうよ
i5とくらべると差が無かった。チョビットはやいかな？くらい。
でもモデルの構築？読み込み、prediction時間は高速になった。

と・・・おもったら
AlexeyAB/darknet
のソースコードを変えると、CPU使用率があがって早くなった。
変更箇所は
darknet-master\src\detector.c
の
120行目あたりに

```c
    args.threads = 3 * ngpus;   // Amazon EC2 Tesla V100: p3.2xlarge (8 logical cores) - p3.16xlarge
    //args.threads = 12 * ngpus;    // Ryzen 7 2700X (16 logical cores)

```
こんな記述があるので28にした。
30以上になると遅いかな？と思えるのでパラメータをかえながら設定する

ソース変更前はCPU使用率15％～30％だったのがCPU使用率70%～80%になった


#教師データ作成作業
結局はここの作業が快適になるかどうか？だと思いました。
快適になった。


#KerasでVGG16はどうよ
GPUがしっかりと使えるようになった。
Keras自体CPU依存度が高いように感じる

#全体的に

性能のいいCPUがほしい病から解放されて精神的に楽になった。
fullOptJS実行時にfullOptJSのファイルサイズを出力する

Scala.jsつかってると最終的なファイルサイズが気になることがある。

```scala
fullOptJS in Compile := {
  val value = (fullOptJS in Compile).value
  streams.value.log.info(s"fileSize: ${value.data.length() / 1024.0} KB")
  value
}
```

### 調査メモ

fullOptJS は TaskKeyで `Compile / fullOptKey`によって提供されてる
返す値の型は `sbt.internal.util.Attributed[java.io.File]`である。
そこからファイルサイズを取得してログにながしている。

sbtのinspectで確認

```
sbt> inspect fullOptJS
(抜粋)
Task: sbt.internal.util.Attributed[java.io.File]
Provided by:
[Project] / Compile / fullOptJS
```

* タスク自体はこの辺で動的に定義されてる。
https://github.com/scala-js/scala-js/blob/v0.6.26/sbt-plugin/src/main/scala/org/scalajs/sbtplugin/ScalaJSPluginInternal.scala#L293
* 呼び出しもとはここ stageKeysの中身を確認すればよさそう。
https://github.com/scala-js/scala-js/blob/v0.6.26/sbt-plugin/src/main/scala/org/scalajs/sbtplugin/ScalaJSPluginInternal.scala#L463
* stageKeysの中身はScalaJS.stageKeys https://github.com/scala-js/scala-js/blob/v0.6.26/sbt-plugin/src/main/scala/org/scalajs/sbtplugin/ScalaJSPluginInternal.scala#L166-L167
* ScalaJS.stageKeysの中身 https://github.com/scala-js/scala-js/blob/v0.6.26/sbt-plugin/src/main/scala/org/scalajs/sbtplugin/ScalaJSPlugin.scala#L524-L527
アルゴリズムとは？データ構造とは？基礎知識から紹介！

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている@yuka_ponです。

「アルゴリズム」という言葉を聞いたことはありませんか？
データ構造を知るために欠かせない「アルゴリズム」の基礎知識を今回は記します。

#アルゴリズムとは？
「アルゴリズム」とは、コンピューター上でのプログラム問題を解決するための「手段」です。
解決のために様々な手順を示したものであるとも言えます。
その手順に使う材料として挙げられるのが、**データ**です。
そして、この大量のデータを管理するのが**データ構造**です。
このように、アルゴリズムとデータ構造は密接な関係性があると言えます。

##アルゴリズムの考え方
問題解決のために手順を示すアルゴリズムは、次のような考え方で進めていきます。

###時間
まず、**時間**です。
日常生活において、時間をいうとき「〇時〇分」や「〇時間」のような言い方をします。
しかし、アルゴリズムは時間や分、秒と単位がバラバラのまま用いるわけではありません。
すべて、**秒**に直して時間差を示すのです。
そして、時間、分、秒に変換していきます。

###配列
次に、**配列**が挙げられます。
配列の合計を示す方法や最大値を求める方法など、たくさんの配列を用いた方法があります。


###整数
そして、**整数**があります。
ここでは、**素数**や[**ユークリッド互除法**](https://www.studyplus.jp/412)を用います。
これらをもとに、[**エラトステネスのふるい**](http://sevendays-study.com/algorithm/pr-day6.html)というやり方で示していきます。

このように、代表的な考えを3つ示しましたが、これだけではありません。
また、アルゴリズムのみで解決方法を提示するわけでもありません。
他にも様々なやり方があります。

#データ構造とは？
上記で示した通り、アルゴリズムは「手段」であるとすれば、データ構造は「材料」とも言える大量のデータをまとめたものと言えます。
そのデータ構造には、更に次のような構造に分かれます。

##リスト構造
線形データ構造には、基本的な構造として**リスト構造**が含まれています。
これは、配列を作ってその中に**要素**と呼ばれるデータを入れることができるものです。
このようなリンクをつなげているものもあります。
それが、**連結リスト**です。
このように、リスト構造は数字付けや番号振り分けに最適なデータ構造とも言えます。

##スタック構造
**スタック構造**とは、新しく挿入したデータと削除するべきデータを抽出することのできる構造です。
「最後に入れたものを最初に取り出す」という意味から、**LIFO（Last In, First Out）**とも呼ばれます。

##ツリー構造
**ツリー構造**とは、階層を使わない複数のデータを用いるときに使う木のような形をしたデータ構造です。
**ルート（根）**を出発点として、様々な方向に枝分かれしていきます。





以上より、データ構造にはたくさんの種類があると言えます。
【THE AI 3rd】のカンファレンス

#はじめに
AIは何ですか？AIは何ができるか？AIはどのように人類生活を向上させることができますか？
私はこの3つの質問がAIについて最もよくある質問だと思います。簡単に言うと、AIは人間のように動作し反応するインテリジェントマシンを作成するためのテクノロジです。

私たちが知っているように、AI技術の進化は年々進歩してきました。多くの企業は、自社の事業を改善するためにAIの開発または使用を開始し、またAIの助けを借りてより優れたサービスを提供しています。2019年3月13日に、私は虎ノ門でAI 3rdと呼ばれるAIカンファレンスにも参加しました。日本でAIカンファレンスに参加するのは初めてでした。したがって、私はそれについて少し共有したいと思います。そのカンファレンスには、その会議に参加するAI企業が多数あります。マイクロソフトジャパンやグーグルなど。

会議から様々なセッションがあります。私が選んだすべてのセッションの中から、興味あるのセッションが2つあります。それは ：

- 綜合警備保障株式会社**「AI・4K・5Gで進化するALSOKの警備サービス」**
- グーグル・クラウド・ジャパン合同会社**「Google Cloud の AI 技術をビジネス活用する方法」**

#AI·4K·5Gで進化するALSOKの警備サービス
ALSOKはセキュリティの問題に焦点を当てている会社です。ALSOKもTechnologyがAI処理、画像認識、機械学習/ディープラーニング技術を使用してアルゴリズムソリューションを開発し提供している会社であるPKSHA社とのパートナーによる自社製品でのAIの使用。以下はALSOKが実装する製品です。
##機械警備+AI
侵入者検知に、AIによる物体=ヒト検知を活用して誤報を低減。CCTVの人が侵入者のようにふるまうか、泥棒のように振る舞うかどうかを検出するために機械学習を使います。
##おもてなしAI
防犯カメラ画像から、AIが困っている人」を検出します。例えば、誰かが突然倒れたかどうかを検出するなど。もし誰かが倒れたの時、このシステムは警備員に警告して、より迅速に対応して手助けできるようにします。以下は検出項目の例です。倒れるだけではなく、うずくまる、車椅子、乳幼児も検出しま。
##その他
1．車が道路の路線を変え続けるかどうかを検出できるカメラもあります。 
2．AI·4K·5Gを使用してカメラの半径上の火災事故を検出など。

#Google Cloud の AI 技術をビジネス活用する方法
機械学習のケーススタディは、さまざまな業界で増え続けている。例えば：

- 製造業
- 小売業
- ヘルスケア業界
- メディア＆エンターテインメント

Google自体も自社の製品やサービスにAIを使用しています。例えば、Google Pixel 3の夜景モードです。Googleは機械学習を使って、光源が少ない場所で明るい写真を簡単に撮影します。Gmailのメール書く時も、スマートリプライがあります。

しかし、機械学習のモデルをーから、構築できる専門家が少ない。2,300万人開発者の中に、数万人ディープラーニングの研究者、あと、２００万人データサイエンティストしかないです。だから、Googleは「AIをお客様やパートナーのみなさまが簡単・迅速・便利に活用できる環境をつくる」。

##機械学習API
Googleは色々な機械学習APIを開発しました。機械学習の知識ないでもすぐに使い始められる。3つカテゴリーがあります。

- 視覚API
    - 画像分析
    - 動画分析
- 言語API
    - テキスト分析
    - 機械翻訳
- 会話API
    - 音声認識
    - 音声合成

##Cloud AutoML
Cloud AutoMLは機械学習モデルをデータに合わせて自動カスタマイズというサービスです。Cloud AutoMLを使って、どんなメリットありますか？**「カスタムモデル開発における煩雑な作業を自動化することができる」**です。
それはデータ処理、機械学習モデル、そして展開から始まります。以下はフローの詳細です。

- データの前処理
- 機械学習モデルのデザイン
- 機械学習モデルの最適化
- 性能評価
- デプロイ
- アップデート

##Cloud AI Platform
Cloud AI Platformは専門家がカスタムモデルを柔軟・高速・安価に作成するためのプラットフォームです。google cloud AI でgoogleのAI技術を活用することができます。

#まとめ
AIと機械学習によって、私たちは多くのことを改善し変更することができます。など、人類のためのAIまたはAIサービスでビジネスモデルを改善する。 AIを使うことで、私たちは人生の多くの人々を助けることができると思います。
Synthclipseを使って、ShadertoyやGLSL Sandboxの作品を、１分でTouchDesignerで出力する。

もうすぐTouchDesignerを始めて１年くらい経つので、
何かシェア出来ないかなと思い、Qiitaを始めてみました。

今回はFacebookのTouchDesigner Help Groupに投稿されていた表題の方法を試してみました。

僕自身TouchDesignerを始めるまでプログラミング言語はほとんど書いた事がなく、
TouchDesigner Study WeekendというWSのGLSLの回で初めてGLSLを書きました。

GLSL自体全然まだ勉強中で、
TouchDesignerが面白くなってきた理由の一つがGLSLを知った事だったので、
自分みたいなプログラミング初心者の方にも、簡単にGLSLをTouchDesigner上で触れられるよう、記事を書いてみました。

必要なもの
1.Synthclipse
http://synthclipse.sourceforge.net/
-Downloadページ
https://sourceforge.net/projects/synthclipse/files/synthclipse-2.2.2/
※mac/windows/linux版があります。

2.OpenGL3.3以上がサポートされているグラボと最新のドライバ
3.Java 8

以上が準備出来ればすぐ出来ます。



■Synthclipseを立ち上げます。

■SynthclipseのSynthclipseタブ→Import→Shadertoy creationを選択
※もしSynthclipseのタブが出て来ない場合、Window→Perspective→Open PerspectiveからSynthclipseを選択する。最初から無い場合、再インストールした方がいいかと。

![スクリーンショット 2019-02-23 08.50.28.png](https://qiita-image-store.s3.amazonaws.com/0/250427/1ffec3d3-4a7c-9b70-e00e-93e8fa827863.png)
![スクリーンショット 2019-02-23 08.54.12.png](https://qiita-image-store.s3.amazonaws.com/0/250427/53470d11-95ce-257b-85d7-a1c6d4dbdba2.png)

■Shadertoyで好きな作品のURLを図の箇所にコピペし、downloadをクリック。
　その後の画面で適当なフォルダを選択。
![スクリーンショット 2019-02-23 09.00.26.png](https://qiita-image-store.s3.amazonaws.com/0/250427/eb770fec-e394-6f26-48e5-3b76b383208a.png)
![スクリーンショット 2019-02-23 09.05.15.png](https://qiita-image-store.s3.amazonaws.com/0/250427/b095a1a2-a7cc-62db-5a99-36a2652b8f4e.png)


■コードが出力されるのでコピーする。

![スクリーンショット 2019-02-23 09.01.19.png](https://qiita-image-store.s3.amazonaws.com/0/250427/1048d679-a0b4-836a-8a11-c06b4f86a5f4.png)

■TouchDesignerを開き、オペレーターウィンドウより、glsl1 TOPを選択。

■glsl1_pixel DATをアクティブにし、Synthclipseから出力されたコードをコピぺする。
![スクリーンショット 2019-02-23 09.24.25.png](https://qiita-image-store.s3.amazonaws.com/0/250427/71dcbe69-ee08-0de5-a1d6-7acac170523c.png)



■glsl1_info DATを見るとエラーが出ているので、
 エラーが出ている行のgl_FragColorをfragColorに置き換える。その後、out vec4 fragColorを追加する。
※図はout vec4 fragColorの場所。頭の方です。

![スクリーンショット 2019-02-23 09.25.23 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/250427/60bad49d-c207-6844-6de1-4596ddc4e19a.png)

■そのままだと絵が出ないので、glsl1 TOPのVector1タブに、
 エラーの内容のiResolution（Valueに1280 720と入力)とiTime（absTime.secondsと入力）などを追加してあげると大体絵が出てくるかと思います。
追記:glsl1 TOPのcommonタブの解像度も1280 720に変更する。
![スクリーンショット 2019-02-23 09.25.23.png](https://qiita-image-store.s3.amazonaws.com/0/250427/22dd496a-8bb0-43f8-c721-f865e6dcadcd.png)

![スクリーンショット 2019-02-23 09.20.16.png](https://qiita-image-store.s3.amazonaws.com/0/250427/17a54dd4-03a7-4d77-5b2f-5cf7a1f80f3a.png)

簡単に出力出来ない作品も多々ありますので、
それはDerivativeの公式など見て解決してみてください。

また、初めてこのような技術的な記事を書くので、
何かご指摘などありましたら是非お伝えください。

Sho
【備忘録】ajaxでPOSTしたObjectをPHPでJSONとしてローカル保存する

## やりたいこと
アプリケーション上で入力した値をローカルにjsonとして保存する。
javascriptにはローカルファイルとして出力する機能がなさそうだったので
ajaxを用いPHPを介して保存する。

### おもて側
```.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>post json sample</title>
</head>

<body>
  <input type="text" class="name">
  <button class="submit">submit</button>
</body>

<script>
  class POST_JSON {
    constructor() {
      this.submit();
    }
    submit() {
      const nameData = document.querySelector('.name');
      const submitBtn = document.querySelector('.submit');
      submitBtn.addEventListener('click', () => {
        const data = {
          name: nameData.value,
          date: new Date()
        };

        const xml = new XMLHttpRequest();
        xml.onreadystatechange = function () {
          if (xml.readyState === 4) {
            if (xml.status == 200) {
              console.log("OK"); //通信成功時
            } else {
              console.log("NO"); //通信失敗時
            }
          }
        };
        xml.onload = function () {
          console.log("complete"); //通信完了時
        }
        xml.open("POST", "index.php", false);
        // HTTP リクエストヘッダーの値を設定。setRequestHeader: openの後、sendの前に記述する。
        xml.setRequestHeader('Content-Type', 'application/json');
        xml.send(JSON.stringify(data));
      });
    }
  }

  new POST_JSON();
</script>

</html>
```

### PHP
```.php
<?php
// file_get_contents(): ファイルの内容を全て文字列に読み込む
// php://input POSTの生データの読み込みを許可
$obj = file_get_contents('php://input');
$data = json_decode($obj,true);
$json = fopen('sample.json', 'w+b');
fwrite($json, json_encode($data, JSON_UNESCAPED_UNICODE));
fclose($json);
?>
```

### 画面
<img width="314" alt="スクリーンショット 2019-02-25 0.45.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/199554/004d9db1-293a-8740-7442-f2741227ee40.png">

### 出力結果

```.json
{"name":"にしなかづき","date":"2019-02-24T15:29:23.944Z"}
```


とりあえずこれで動いたので終わり。


### 参考
・https://q-az.net/without-jquery-ajax/
・https://uxmilk.jp/14767
・https://tomosoft.jp/design/?p=8351
VSCodeでGradleを使い、Javaをビルド→ランするまで

#概要
本記事は、タイトルの通り「VSCodeでGradleを使い、Javaをビルド→ランするまで」の手順を簡潔にまとめます。
※Macを使用する前提ですのでご了承ください。

>Gradleとは
>https://ja.wikipedia.org/wiki/Gradle
>GradleはApache AntやApache Mavenのコンセプトに基づく**オープンソースビルド自動化システム**であり、プロジェクト設定の宣言にはApache Mavenが利用する**XML形式ではなくGroovyベース**のドメイン固有言語 (DSL) を採用している。Gradleはタスクの起動順序の決定に有向非巡回グラフ（英: Directed Acyclic Graph、DAG）を利用する。
>Gradleは非常に大きくなる可能性のあるマルチプロジェクトのビルド用に設計されており、ビルドツリーのどの部分が最新であるかをインテリジェントに決定する増分ビルドをサポートする。このため、最新の増分ビルド部分に依存するタスクを再実行する必要は一切ない。
>初期のプラグインはJava、Groovy、およびScalaの開発と配備に第一に焦点を当てられているが、ロードマップにはその他の言語やプロジェクトに対するワークフローが示されている。

#手順

###1.VSCodeをインストール
下記からVSCodeの本体をインストールします
https://code.visualstudio.com/

###2.Javaのプラグインをインストール
`Preference->Extensions`で「Java Extension Pack」を検索してインストールします
これをインストールすると、下記のプラグインが全て入ります
・Language Support for Java(TM) by Red Hat
・Debugger for Java
・Java Test Runner
・Maven for Java
・Java Dependency Viewer
・Visual Studio IntelliCode

###3.端末のJavaの準備
Javaをインストールして$JAVA_HOMEを環境変数に設定します
https://www.java.com/ja/download/help/download_options.xml
~/.bash_profileのファイルに使用するJavaのバージョンに応じて下記のいずれかを追記します

```sh
export JAVA_HOME=`/usr/libexec/java_home -v 10` #java10が使いたいとき
export JAVA_HOME=`/usr/libexec/java_home -v 9` #java9が使いたいとき
export JAVA_HOME=`/usr/libexec/java_home -v 1.8` #java8が使いたいとき
```
###4.Gradleのインストール
下記のコマンドでインストールします

```sh
brew install gradle
```

###5.プロジェクトの作成
Gradleのプロジェクト用のフォルダを作成します

```sh
mkdir project-name-dir
cd project-name-dir
gradle init --type java-application
```
###6.Gradleの動作確認
初期作成でスケルトンが用意されているので、下記を実行して動作確認をします

```sh
gradle build # ビルド
gradle run # 実行
gradle check # 検証
gradle clean # クリーン
```

###7.VSCodeの設定
JAVA_HOMEをVSCodeの設定にも追加します
`Preference->Settings`
で「javahome」と検索して、設定ファイル開き下記のように追加します

```json
"java.home": "<2.で環境変数に追加したいずれかのパス>"
```
###8.タスクの設定
VSCodeで実行する際のタスクを設定します
設定は`.vscode/task.json`のファイルに下記を追記します

```json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "./gradlew build"
        },
        {
            "label": "run",
            "type": "shell",
            "command": "./gradlew run",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "clean",
            "type": "shell",
            "command": "./gradlew clean"
        },
        {
            "label": "check",
            "type": "shell",
            "command": "./gradlew check"
        }
    ]
}
```
###9.タスクを実行
タスクを実行します
`Terminal->Run Task`で定義したタスクを実行できます

#まとめ
本当はJavaのアプリを作って記事を書く予定でしたが、まだ実装中なので今回初めてVSCodeでGradleを使ってみたので、その過程を整理してみましたが比較的容易に導入することができました。
またVSCodeの特徴ではありますが、軽量に動作するので非常に快適です。
JavaでKuromoji + Neologdを使ったプログラムを書くときのTips

業務上の理由で、Java環境でテキスト分類スクリプトを動かすことになったために、調べたことをまとめておく。

参考になった記事：
[ナイーブベイズ分類器をjavaで実装してみる](https://qiita.com/aono-masashi/items/fd633c3efe1b361d4088)

基本的に上の神記事のようにすれば良い。

いくつかの補足。

## Neologdをサクッと使う

最近のNeologdを使いたい場合は、[こちらの記事](https://kazuhira-r.hatenablog.com/entry/20160128/1453991406)が参考になる。
[こちらのQiita記事](https://qiita.com/rockhopper/items/c4a7275e666f992ed510)にも書いてあった。

[レポジトリ](https://maven.codelibs.org/org/codelibs/lucene-analyzers-kuromoji-ipadic-neologd/)を見ながら、最近のものを見つけて、 `build.gradle`に以下のように書けばよい。

```build.gradleの一部
repositories {
    maven {
        url "http://maven.codelibs.org"
    }
    mavenCentral()
}

dependencies {
    compile group: 'org.codelibs', name: 'lucene-analyzers-kuromoji-ipadic-neologd', version: '7.6.0-20190218'
}
```

## luceneのJapaneseAnalyzer周り

[こちらのQiita記事](https://qiita.com/rockhopper/items/c4a7275e666f992ed510)が書かれた時からAPIの変更があった様子。

```
import org.apache.lucene.analysis.util.CharArraySet;
```

は

```
import org.apache.lucene.analysis.CharArraySet;
```
に変更する必要がある。

http://lucene.apache.org/core/7_0_1/analyzers-kuromoji/org/apache/lucene/analysis/ja/JapaneseAnalyzer.html

以上。
Raspberry Piでクッキークリッカー専用サーバーを作った話

## はじめに
**注意：この記事は茶番です**

クッキークリッカー楽しいですよね。
ゴールデンクッキー、自己無限生成エンジン、そしてババアポカリプス。

Wikiによると「日本では2013年9月のシルバーウィーク付近に爆発的な流行を見せた」らしいです。
現在でも開発が進められており、新しい機能が実装されています。

クッキークリッカーの目標の１つは「とにかくたくさんのクッキーを焼きたい」ではないでしょうか
チートを使えば一発で解決することですが、個人的に良い気分はしません。

ブラウザでクッキークリッカーを24時間常駐させてクッキーを生産する方法もありますが
クッキークリッカーが気になって作業の邪魔ですし電気代が不安です。

そこで、Raspberry Piの特徴である小型・低消費電力性を活かして、
Raspberry Pi上でブラウザを起動し、リモートデスクトップ経由でクッキークリッカーをプレイします。

## 準備するもの
- Raspberry Pi
- Raspberry PiにアクセスするPC

## 方法
LAN内からアクセスするので、Raspberry Piに固定IPを振っておくと良いでしょう。

Raspberry Piにリモートデスクトップ環境をインストールし、再起動します。

```
sudo apt install xrdp -y
sudo reboot
```

お好みのリモートデスクトップクライアントでRaspberry Piにアクセスし、ブラウザを起動します
<img width="363" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/309467/801ec4f5-e168-d6d5-c4b5-2ab770197690.png">
次に、[http://natto0wtr.web.fc2.com/CookieClicker/](http://natto0wtr.web.fc2.com/CookieClicker/)にアクセスします。
その後、大クッキーを連打し、グランマまで解放させれば後は放置でOKです。

クッキークリッカーの画面を表示するだけで、CPUの使用率が40％を超えるので
ブラウザを畳んでおくと良いでしょう

## おわりに
あるアイテムを取得すると、ブラウザを閉じてても一定のCpSでクッキーを生産できるんですけどね笑

ラズパイ起動時に自動で、Chromiumで特定のサイトにアスセスする方法を知っている方がいれば、教えていただきたいです。

クッキークリッカー万歳
10分でなんとなくJuliaの良さに触れてみる

最近よく聞くのでさらっと10分だけ[Julia](https://julialang.org/)に触れてみます。

# 環境構築
黙って公式のDockerを立ち上げましょう。
以下のコマンドでREPLが起動し、Juliaの動きを確認できます。

```
docker run -it --rm julia
```



すると↓こんなmotdが。
<img width="567" alt="スクリーンショット 2019-02-24 23.45.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/50056/e3e344a9-837f-8c8a-b817-d17a1a569242.png">

motdが凝ってるプロジェクトはそれだけでなぜか好印象です。

# いろいろ触る
なんか書こうと思いましたがすでに↓の方が良い感じに面白い点をまとめてくださっているので割愛。

- [Juliaという速くて書きやすい言語をちょっとだけ覗いてみたんだが、なにやらワクワクするものがあったので報告しようと思う](https://qiita.com/sadayuki-matsuno/items/fc5e9ec3894a4b7bfbfb)

一通り触ってみましょう。

# 所感(小並感)
- 楽しい
- かゆい所に手が届く(気がする)
- **さすが新しい言語** という印象

表面的な部分を触っただけでも楽しさが伝わってきます。この言語作った人たちは楽しんで作ったんだろうなと。
もちろんデータ分析や機械学習周りでぶん回してこそその真価が発揮できる言語だと思いますので、次にそのようなタスクがあればゴリゴリ使ってみようと思います。

10分だけでも素直に楽しさがわかる言語でした。
アコーディオンパネル（子要素の高さを保持）をつくってみた

##まえがき
コーディングを主で対応するようになって1年ほどの新米コーダーです。
自分なりの勉強や改善を備忘録として記録してます。
##実装
[アコーディオンパネル実装](https://codepen.io/itamkia/pen/WPqgBo)

アコーディオンパネルの中の要素でlineHeightを使用したかったので、`display: none;`ではなく親要素を`height: 0;`と`overflow: hidden;`にして実装をしてます。
##ソースコード
```html:HTML
<div class="js-accordion">
    <div class="accordionTrigger">ボタン1</div>
    <div class="accordionPanel">
        <div class="inner">
        	<a href="#">パネル1</a>
        </div>
    </div>
</div>
```
```sass:SCSS
.js-accordion {
	.accordionTrigger {
		//ボタンのスタイル
	}
	.accordionPanel {
		//パネルのスタイル
		height: 0;
		overflow: hidden;
		transition: .4s height;
		.inner {
			//パネル内のスタイル
		}
	}
}
```
非表示は`.accordionPanel`を`height: 0;`と`overflow: hidden;`でおこないます。
`overflow: hidden;`ではみ出している部分も非表示にします。
`.accordionPanel`にmarginやpaddingの値を設定すると非表示時にその数値分余白が空いてしまうので、余白を空けるには子要素の`.inner`で設定をします。

親要素の高さを０にしても子要素の高さは０にならない特性を使用してます。
そのため、lineHeightなど高さが必要なjs（jQuery）が使えます。

```javascript:jQuery
$(function(){
 var objAccordion = $('.js-accordion').children('.accordionTrigger');
    var FlagAccordionSingleDoor = 'js-accordion_singledoor';
    objAccordion.on('click',function(){
        var target_h = $(this).next().children().innerHeight() + 1;
        var panel = $(this).next();
        var parent = $(this).parent().parent();
        if(!parent.hasClass(FlagAccordionSingleDoor)) {
            if(panel.hasClass('show')) {
                if(!(panel.is(':animated'))){
                    $(this).removeClass('show');
                    panel.height(0).removeClass('show');
                }
            } else {
                if(!(panel.is(':animated'))){
                    $(this).addClass('show');
                    panel.height(target_h).addClass('show');
                }
            }
        } else {
            if(panel.hasClass('show')) { //片開き
                if(!(panel.is(':animated'))){
                    $(this).removeClass('show');
                    panel.height(0).removeClass('show');
                }
            } else {
                if(!(panel.is(':animated'))){
                    $(this).addClass('show').parent().siblings().find('.accordionTrigger').removeClass('show');
                    panel.height(target_h).addClass('show');
                    $(this).parent().siblings().find('.accordionPanel').height(0).removeClass('show');
                }
            }
        }
    });
});
```
`js-accordion_singledoor`を付けると開閉が連動するアコーディオンパネルになります。

`var target_h = $(this).next().children().innerHeight() + 1;`
子要素の高さを取得します。取得した高さに対して＋１しているのは、ボーダー分の太さになります。ボーダーの太さが3pxで設定の場合は、＋３に変更します。

 `if(!parent.hasClass(FlagAccordionSingleDoor)) {`
`js-accordion_singledoor`をクラスとして持っているかで開閉連動のアコーディオンパネルか分岐をかけます。

 `if(!(panel.is(':animated'))){`
アニメーション中はクリックしても動作しないようにアニメーションを監視してます。
##最後に
下層ページの共通部分として使用したかったため、今回作成をしました。
下層ページは自分以外のコーダーが入る予定で、各々記述をすると運用がやりずらくなるため開閉連動パターンも同じ記述にしてます。

ブラッシュアップしてもっと汎用的にしていきたいとおもいます！
##使用バージョン
```html:
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
```
開発エンジニアになりたい。



Qiita初投稿。

このような形で質問というか自分用メモというか、、、

とりあえず乱文失礼します。

筆者のスキル
・C言語の(printfなどの使用方法、if文、for、while、switch、)などを使って簡単なプログラムをかける程度

こんなんじゃ働けねぇ。
と思い、Androidのアプリ開発を行いたいと思いJavaを学ぶ→kotlinを知る

現状こんな感じ。

本題、kotlinの入門(文法など)が日本語でわかりやすく解説されているようなサイトはあるんだろうか、、、、

開発エンジニアとして働きたい、そんな私のメモでした。
【Rails】RSpecでリストのn番目の要素のclass属性を検証したい

# Introduction
```html
<ul>
  <li class="list-item good">Good 1</li>
  <li class="list-item good">Good 2</li>
  <li class="list-item bad">Bad 1</li>
  <li class="list-item bad">Bad 2</li>
</ul>
```
このようなリストでn番目の`li`要素に`good`または`bad`classが適用されているかを検証したい。
`have_css` matcherだと指定した要素よりも下の階層しか検証できないようで、

```ruby
expect(find("ul").all("li")[0]).to have_css ".good"
```
だとうまくいきませんでした。

# Solution 1
`class`要素の文字列を`include`で検証する方法。

```ruby
expect(find("ul").all("li")[0][:class]).to include "good"
expect(find("ul").all("li")[1][:class]).to include "good"
expect(find("ul").all("li")[2][:class]).to include "bad"
expect(find("ul").all("li")[3][:class]).to include "bad"
```

`each`使うなら下みたいな感じ。

```ruby
(0...1).each do |i|
  expect(find("ul").all("li")[i][:class]).to include "good"
end
(2...3).each do |i|
  expect(find("ul").all("li")[i][:class]).to include "bad"
end
```

# Solution 2
`nth-child`を使って検証する方法。

```ruby
expect(find("ul")).to have_css "li:nth-child(1).good"
expect(find("ul")).to have_css "li:nth-child(2).good"
expect(find("ul")).to have_css "li:nth-child(3).bad"
expect(find("ul")).to have_css "li:nth-child(4).bad"
```

`each`使うなら下みたいな感じ。

```ruby
(1...2).each do |i|
  expect(find("ul")).to have_css "li:nth-child(#{i}).good"
end
(3...4).each do |i|
  expect(find("ul")).to have_css "li:nth-child(#{i}).bad"
end
```

# Conclusion
Solution 2の方が好み。
配列の場合は`0`から、`nth-child`の場合は`1`から始まるのはややこしや。

# Reference
- [何番目系の便利なCSSまとめ - Qiita](https://qiita.com/ituki_b/items/62a752389385de7ba4a2)

# Special Thanks
- jnchitoさん
【Swift】複数の picker がある pickerView で二次元配列を使う。

以前、
[【Swift】複数のsectionがあるtableViewで二次元配列を使う。](https://qiita.com/BMJr/items/ca7bcf76d36acbdef75e)
というタイトルで投稿しました。
今回は、複数の picker がある pickerView で二次元配列を使ってみました。
![MultiPickers.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/ae2a9988-baa4-5859-231c-e6e2764a49f3.gif)
上図のように3年A組~C組の3つのピッカーに複数の生徒の row があります。
二次元配列を twoDimArray とします。
3年A組のピッカーを「myPickerA」、tag = 0
3年B組のピッカーを「myPickerB」、tag = 1
3年C組のピッカーを「myPickerC」、tag = 2
一番下の「井上　鈴木　遠藤」というラベルを「myLabel」とします。
このサンプルを使えば、picker や row がいくら増えても「func numberOfComponents~」以下のコードを一文字も書き換える必要がありません。

```swift
import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    
    @IBOutlet var myPickerA:UIPickerView!
    @IBOutlet var myPickerB:UIPickerView!
    @IBOutlet var myPickerC:UIPickerView!
    @IBOutlet var myLabel:UILabel!
    
    var twoDimArray = [[String]]()
    var selectedPerson = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()
        for _ in 0 ... 2{
            twoDimArray.append([])
        }
        twoDimArray[0] = ["井上","加藤","田中"]
        twoDimArray[1] = ["鈴木","吉田"]
        twoDimArray[2] = ["遠藤","佐藤","村田","山田"]
        
        selectedPerson = ["井上","鈴木","遠藤"]
    }
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        return twoDimArray[pickerView.tag].count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{
        return twoDimArray[pickerView.tag][row]
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        selectedPerson[pickerView.tag] = twoDimArray[pickerView.tag][row]
        var labelText = ""
        for i in selectedPerson{
            labelText += "\(i)  "
        }
        myLabel.text = labelText
    }
}
```
丸め誤差に気をつけよう【Pythonの数値計算】

#まえがき
丸め誤差について気を付けることをまとめる。
#何が問題になるのか
以下のコードを見てください。

```python
s = 0
for i in range(1000):
    s += 0.001
print(s) # 1.0000000000000007
```
0.001を1000回足したら1になるはずですが、謎の小数点以下の誤差が生じました。
これは、丸め誤差というものです。
#丸め誤差とは？
人間は十進数を共通の数字として用いていますが、計算機は二進法を用いて計算を行います。
（ちなみに進数法を表記するときは「10進数」ではなく「十進数」と書きましょう）

二進数の変換は、
1は1
2は10
4は100
といったように、整数の範囲では簡単ですね。

小数点以下を表すときが厄介です。
0.5は0.1
0.25は0.01
0.125は0.001
そして0.001は

0.000000000100000110001001001101110100101111000110101001111111...

▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああ
(1/2)^nを組み合わせて表現できない小数は際限なく続いてしまいます。
このような小数を扱うときは桁が途中で丸められてしまい、計算に誤差が生じるわけです。
#やってはいけない例
この誤差がどう問題になるのか。それは、```==```で比較できなくなるということです。

```python
s = 0
while(True):
    if(s == 1):
        break
    s += 0.1
# 終わらない
```
10回足せばbreakで終わりのはずが、永遠に計算し続けます。
これを回避するためには、誤差を設定してあげます。

```python

s = 0
eps = 1e-10 # 十分に小さい正の誤差を設定する。
while(True):
    if(abs(s - 1) < eps): # 1との差が誤差の範囲で収まっているか
        break
    s += 0.1
print(s) # 0.9999999999999999
```
#まとめ
小数を扱うときは完全一致で比較しないこと。以上。

『機械学習のエッセンス』という本を参考にしました。しばらくこの本について勉強したことをまとめていきます。
次回:桁落ちに気をつけよう
https://qiita.com/NNNiNiNNN/items/af550e9f1c72aadd2577
WebVRで遊べるTシャツを作った

## WebVRで遊べるアパレル
<img src="https://qiita-image-store.s3.amazonaws.com/0/306452/501d4b96-12b0-a041-da83-51079b52a03e.png" width="500px">
<img src="https://qiita-image-store.s3.amazonaws.com/0/306452/484e56e7-f11e-2398-1b9f-a0e013b00815.png" width="500px">

QRコードがデザインされたアパレルを作りました。
QRコードをスマホで読み取るとWebVRのミニゲームで遊べます。

↓そのWebVRのミニゲームがこちら（スマホ推奨）
https://vrt1.saharu.work/

![スクショ１.png](https://qiita-image-store.s3.amazonaws.com/0/306452/f3fb6061-1189-b927-55aa-038d1b5c16c5.png)
こんな感じのミニゲームで遊べます。
[そしてここで売ってる！](https://suzuri.jp/saharu54)

## 動機
このアパレルはそもそも【話したい人と話せるように】コミュニケーションのきっかけを作りたいという思いから出発しました。

そのためこのプロダクトは以下の2点を重視して企画を作りました

- 誰でも遊べる
- コミュニケーションを促進する


## WebVRを実現している技術
WebVR部分は[aframe](https://aframe.io/)というライブラリを使ってます。

A-frameとはmozillaの提供するWebVRのフレームワークで、htmlと簡単なJavaScriptで3Dコンテンツがサクッと作れます。

A-Frameのコンテンツをスマホで見ていただくとわかるのですが、
スマホのジャイロセンサーを使ってシーンを見回すことができるので、実際に端末をいろんな角度に傾けることでインタラクティブな体験をすることができます。

これはWebの体験としてはかなり珍しいため、技術に対して知識がなくても、ましてやWebVRなんて全然知らないよって人でも直感的に楽しんでもらうことができます。


### その他、使用したライブラリ
- [SweetAlert2](https://sweetalert2.github.io/)
    - 簡単におしゃれなポップアップを作れるやつ

## 最後に
（ちなみに、一回の体験で満足して終わらないように
駄目押しの「おみくじ機能」もつけてます笑）
<img src="https://qiita-image-store.s3.amazonaws.com/0/306452/9e3009e7-a388-4d08-b498-120ca9b106cb.png" width="300px">

VR/AR界隈の課題のひとつは、それを体験できるハードが依然として高価であることです。
その点、アプリをインストールする必要がなくスマホのブラウザで遊べるWebVR/ARはまだおもしろいものを多くの人に遊んでもらうポテンシャルがあるのかなぁと思っています。
Scalaでコレクションから要素を削除する方法のメモ

## 概要
AtCoderに最近取り組んでいて、一度コレクションに入れた要素を削除したい場面が出てきます。該当する要素を削除した後のコレクションを、取得する方法をメモ書きします。

## 例題
下記のようなコレクションがあり、ここから要素が「1」のものを削除します。

```
val seqSample = Seq(1, 2, 1, 3, 1, 4, 1, 5, 1, 6)
```
## 対応
### 1. 「1」を全て削除する
filterNotメソッドを使うのが、一番簡単かなと思います。

##### 【サンプルコード】

```
seqSample.filterNot(_ == 1)
```
##### 【出力結果】
```
List(2, 3, 4, 5, 6)
```
### 2. 「1」を指定した数だけ削除する
どのように実装すれば良いか悩んだのですが、おそらくdiffメソッドを使うのが一番分かりやすいのかなと感じました。以下は「1」を1つだけ削除する場合です。
##### 【サンプルコード】

```
seqSample.diff(Seq(1))
```
##### 【出力結果】
```
List(2, 1, 3, 1, 4, 1, 5, 1, 6)
```

ちなみに「1」を2つ削除する場合は以下のように書けます。
##### 【サンプルコード】
```
seqSample.diff(Seq(1, 1))
```
##### 【出力結果】
```
List(2, 3, 1, 4, 1, 5, 1, 6)
```
【javascript】try-catch-finally句内のreturnについて

# 参考

- [try-catch-finally句内のreturnについて - Qiita](https://qiita.com/eijenson/items/7e9e112e69b37f72353c)
- [Will it finally: a try/catch quiz](https://frontarm.com/james-k-nelson/will-finally-run-quiz/)

参考ページはjavaで確認されていますが、javascriptでも同じなのか気になったので、試してみましたm(_ _)m

#`try`、`catch`のなかでリターンした場合

```js
function sample_1() {
    try{
        fail(); // fail is not defined
    }catch(err){
        console.log("catchの実行")
        return "catchからのリターンです。";
    }finally{
        console.log("finallyが実行されました。");
    }
}
console.log(sample_1());
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/328be845-6b8d-f80e-334c-820b314954c1.png)

```js
function sample_2() {
    try{
        console.log("tryの実行")
        return "tryからのリターンです。";
    }catch(err){
        console.log("catchの実行")
    }finally{
        console.log("finallyが実行されました。");
    }
}
console.log(sample_2());
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/27b8ea2b-bf01-23fc-02af-220ee7005570.png)

参考ページと同じように、`try`、`catch`のなかでリターンしても、`finally`が実行されることが確認できました。

---

`finally`でリターンしてしまうと、`catch`でもリターンしていた場合に、例外時に`catch`のリターンが実行されないので、
javascriptでも`finally`でリターンするのはやめたほうが良さそうです。


#`catch`でさらに`throw`した場合

```js
function sample_3() {
    try{
        fail(); // fail is not defined
    }catch(err){
        console.log("catchの実行")
        throw err
    }finally{
        console.log("finallyが実行されました。");
    }
}
sample_3();
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142910/8838d9ee-736d-a3b2-f5a0-3fa7b36bce37.png)

この場合でも`finally`が実行されることを確認できました。

---
Rubyよく使うメソッド

#メソッド
##join
引数の区切り文字を使って配列を一つの文字列にするメソッド

```ruby
fruits = ['lemon', 'banana', 'apple']
fruits.join('と')
#=> "lemonとbananaとapple"

```

##map
mapは各要素に対してブロックを評価した結果を新しい配列にして返すメソッド。


```ruby
numbers = [1,2,3,4]
new_numbers = numbers.map{ |n| n * 10}
new_numbers #=> [10,20,30,40]
```
##split
引数で渡した区切り文字で文字列を配列に分割するメソッド

```ruby
'ruby,java,php'.split(',') #=> ['ruby','java','php']
```

#%記法
%記法または、%w,%Wを使って配列を作成する方法。%記法を使うと,ではなく、スペースで配列を作り、文字列をシングルクオートやダブルクオートで囲う必要がないのでコードが短くなる。

```ruby
["apple","banana","lemon"] #=>["apple","banana","lemon"]
#めんどくさい

%w!apple banana lemon! #=>["apple","banana","lemon"]
#結構らく

%w(apple banana lemon) #=>["apple","banana","lemon"]
#もっと楽

#式展開や改行文字、タブ文字を含めたい場合は大文字のWを使う。

%i(apple pan banana) #=> [:apple, :pan, :banana]
#%iでシンボルを作る。
```

#to_a
配列に変更します。

```ruby

hash
=> {:japan=>"yen", :us=>"doller"}

hash.to_a
=> [[:japan, "yen"], [:us, "doller"]]
```

#to_h
ハッシュに変更します。

```ruby

array
=> [[:japan, "yen"], [:us, "doller"]]

array.to_a
=> {:japan=>"yen", :us=>"doller"}

#ハッシュとして解析不明な配列はエラーになる。
a
=> [1, 2, 3, 4]

a.to_h
TypeError: wrong element type Fixnum at 0 (expected array)
```

#to_s
文字列に変更します。

```ruby

sym = :asdf
=> :asdf

sym.to_s
=> "asdf"

```

#to_sym
シンボルに変更します。

```ruby

str = 'abcd'
=> "abcd"

str.to_sym
=> :abcd

```