OmniAICreator/Qiita-1.07M huggingface dataset:
bootstrap.css をここだけ使いたい 〜 Laravel @scss ディレクティブの応用 〜

人のサイトをいじっていて、あーここだけbootstrap.css の `form-control` とか適用したいなぁってときがあります。

でも bootstrap.css を読み込んじゃったら、ページ全体に適用されちゃって困りますね。このdivの中でだけ適用したい、みたいな。

そこで、以前投稿した [@scss ディレクティブ](https://qiita.com/puchida/items/e6c7e8325dbf95fe8959)を応用して、bootstrap.css を指定箇所（具体的には `.my-bootstrap` 内）でのみ適用する方法を紹介します。

# 準備

[@scss ディレクティブ](https://qiita.com/puchida/items/e6c7e8325dbf95fe8959)
を準備します。

# 設定

```php:route/web.php

Route::get('{scssPath}', function ($scssPath) {

    $cacheDays = 7;
    $scssPath = strtr($scssPath, ['.scss'=>'']);

    $response = \Cache::remember($scssPath, 60 * 24 * $cacheDays,
        function () use ($scssPath) {
            return view($scssPath)->render();
        });

    return response($response)->header('Content-Type', 'text/css');

})->where('scssPath', '(.*).scss');

```

```php:resources/views/scss/bootstrap.blade.php
@scss
.my-bootstrap {
{!! file_get_contents('/path/to/bootstrap.4.1.3.css') !!}
}
@endscss

```

```html:hoge.html
<link rel="stylesheet" href="/scss/bootstrap.scss" type="text/css" media="all" />

<input type="text" class="form-control" name="hoge" value="適用されない" >

<div class="my-bootstrap">
  <input type="text" class="form-control" name="hoge" value="適用される" >
</div>
```

できましたー
unityで作成したPCアプリの画面サイズを指定する

unityで作成したPCアプリをwindow表示に固定して解像度を指定する方法についてまとめました

## 試行環境
Windows10
unity2018.3.0f2 personal

## 解像度選択ダイアログを無効にする

unityで特に設定しないままPCアプリをBuildすると、アプリ実行時に解像度選択画面が出てきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/fb15af81-4ac4-e291-a144-6963e8351479.png)
解像度が変わってレイアウトが崩れるのは嫌ですし、解像度を指定してしまいましょう。Player SettingsのInspectorからDisplay Resolution Dialogを無効にするとダイアログが出なくなります。Player SettingsのInspectorはBuild Settingウィンドウの左下にあるPlayer Settingsボタンを押すとInspectorパネルに表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/248a731f-05e0-b091-2ff2-83311ea60551.png)

## window表示に設定する

Player SettingsのInspectorからFull Screen ModeをWindowedにすればWindow表示されます。

## 解像度を設定する

Default Screen WidthとDefault Screen Heightを設定し、Use Player Logを無効にすると解像度が設定できる筈ですが何故か解像度が反映されません。

仕方ないのでコードで解像度を変更します。適当なオブジェクトのScriptに以下のような感じで1行書けばOKです。以下のコードだと横幅480 pixel、縦幅350 pixel、フルスクリーン無効(window表示)、リフレッシュレート60Hzとなります。

```
void Start()
{
    Screen.SetResolution(480, 350, false, 60);
}
```
うっかりスペースを入れてしまったユーザー名の変更に労力を要した話


#話の始まり
さっくりいうと結論は[こちら](#光明を見つける)です。

・・・

windows10をセットアップした際ユーザー名に空白を入れてしまった。
AnacondaをインストールしようとしたらPathがおかしいよとwarningされたのでこの機に直してしまおうと決意。
**地獄の始まり。**


変更しようとしたパスの例）
*C:\Users\hoge hoge*
↓
*C:\Users\hoge*

#失敗した手順
**※うまくいかなかった例です。**

- ユーザー名を変更する権限を付与するためAdministratorユーザーを有効にする。`(このとき事前に元のMicrosoftアカウントからログオフしローカルアカウントにしておく)`

```
$ net user Administrator /active:yes
```

<br>

- ユーザー名を変更する。`(できない場合はセーフモードで行う)`

<br>

- 再起動ののち元のユーザーにサインイン。Administratorをオフにする。

```
$ net user Administrator /active:no
```
<br>

- その後、regeditから旧ユーザー名になったままのレジストリをいじいじしたりしてPathを変更後のユーザー名に直したりした。が、全体的におかしい…。
全くもって正しく変更できていない上にwindowsの設定が開けなくなるなど致命的なエラーが発生する。この時点でかなり嫌な予感…。

- 色々調べてwindowsのアップグレードインストールをすることに。本格的な**悲劇**の始まり。
2~3時間後に無事インストール自体は完了したが依然問題が改善しない…。
ここでレジストリをいじる前に必ず行っている復元ポイントを実行して全てを無に返すことを決意。
しかしアップグレードをしたことで復元ポイントが消えていた。**死にたい。**

#光明を見つける
**新しいユーザーを作成**しユーザープロファイル等の今までの環境を全てそちらに移行する方法を試すことに。

・・・

結果、なんとかなった。
唯一の問題はwindowsデバイスにサインインするためのMicrosoftアカウントが再利用できなくなったことぐらい。（元のユーザー上でちゃんとローカルアカウントに切り替えたのだが…）
解決策が全く見つからなかったので仕方なく新しいアカウントを入手した。
>Another user on this device uses this Microsoft account, so you can't add it here
>>https://answers.microsoft.com/en-us/windows/forum/windows_10-security/another-user-on-this-device-uses-this-microsoft/3920bd03-bc04-40e3-b51e-9ceabe7a5842

#おわりに
復元ポイントが使えないと分かったときの絶望感は半端なかったです。
が、なんとかユーザー名からスペースを取り除くという最初の目標をクリアし環境を再現し直せたのでよかった。
日本語評価極性辞書を利用したPython用Sentiment Analysisライブラリ oseti を公開しました

# はじめに
[東北大学の乾・鈴木研究室のページで公開されている日本語評価極性辞書](http://www.cl.ecei.tohoku.ac.jp/index.php?Open%20Resources%2FJapanese%20Sentiment%20Polarity%20Dictionary)を使ったSentiment Analysis (いわゆるネガポジ判定) ライブラリ [oseti](https://github.com/ikegami-yukino/oseti) を公開しました。これは日本語評価極性辞書を用いて文の評価極性 (ポジティブ/ネガティブ) のスコアを計算するものです。

何番煎じかって感じはありますけど、自分のPCの中にだけずっとあるのはもったいないので公開しました。

※バージョンv0.2 (2019/10/7公開) からの変更点を追加しました。

## インストール
```
pip install oseti
```
このライブラリはMeCabを利用しているためMeCabのインストールも必要です。MeCab本体は以下のURLからダウンロードできます。
http://taku910.github.io/mecab/

あとは依存モジュールとして`neologdn`と`mecab-python-windows`あるいは`mecab-python3`や`sengiri`がインストールされます。

## 使い方

```python

import oseti

analyzer = oseti.Analyzer()
analyzer.analyze('天国で待ってる。')
# => [1.0]
analyzer.analyze('遅刻したけど楽しかったし嬉しかった。すごく充実した！')
# => [0.3333333333333333, 1.0]
```
テキストを入れると文ごとの評価極性のスコアが出ます。スコアの値は[-1, 1]でプラス値が大きいほどポジティブで、マイナス値が大きいほどネガティブとなります。
スコアの計算は、単語あるいは用言ごとにポジティブ (+1) あるいはネガティブ (-1) のラベルが付いた辞書を使い、それにマッチすると1あるいは-1の極性値が加えられ、`極性値の総和 / マッチした単語・用言の数`でスコアを出します。たとえば`遅刻したけど楽しかったし嬉しかった。`という文では、遅刻 (-1)、楽しい (+1)、嬉しい (+1) となり極性値の総和は`1`で、マッチした数は`3`なので`1 / 3 = 0.3333`となります。
なお、「ない」や「ぬ」といった否定表現があると極性値を反転させます。

## バージョンv0.2 (2019/10/7公開) からの変更点

```py

analyzer.count_polarity('遅刻したけど楽しかったし嬉しかった。すごく充実した！')
# => [{'positive': 2, 'negative': 1}, {'positive': 1, 'negative': 0}])
analyzer.count_polarity('そこにはいつもと変わらない日常があった。')
# => [{'positive': 0, 'negative': 0}]
```
`count_polarity` methodでは、ポジティブ/ネガティブ表現の数のみを返却します。文単位でなく文書単位の極性値を測りたい場合や、違った手法でスコアリングしたい場合に向いています。

```py

analyzer.analyze_detail('お金も希望もない！')
# => [{'positive': [], 'negative': ['お金-NEGATION', '希望-NEGATION'], 'score': -1.0}])
analyzer.analyze_detail('お金がないわけではない')
# => [{'positive': ['お金'], 'negative': [], 'score': 1.0}]
```
`analyze_detail` メソッドではどの単語がポジティブ/ネガティブ判定されたのかという情報も出力されます。デバッグ用に役立つかもしれません。
PycharmとAnacondaの連携メモ(2)

初めまして！！
今回は表題の通り、PycharmとAnacondaの連携について残しておきたいと思い書きました。
あくまで備忘録のようなものなので、分かりづらかったらごめんなさい。

#問題
Anacondaで導入済のライブラリをimportしてPycharmでコードを実行するとエラーが表示され実行出来ない。

■ソースコード
import numpy as np
s = np.arange(5)
print(s)

■エラー内容
ImportError: 
Importing the multiarray numpy extension module failed.  Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control).  Otherwise reinstall numpy.

Original error was: DLL load failed: 指定されたモジュールが見つかりません。

#環境
Pycharm 2018.3.4(Community Edition)
Anaconda Python 3.7 version
Python 3.7.1

#原因
Anacondaをインストールした際にnumpyなどのライブラリもインストールされるが、
PycharmからAnacondaでインストールしたライブラリへのPathが通っていないことが原因。

#解決策
環境変数にPathの設定をする。
私の場合は下記のPathを通すことで問題なく実行出来るようになった。
C:\Users\【username】\Anaconda3\envs\【仮想環境名】\Library\bin
※疑問点として、仮想環境を作成するたびにPathを追加する必要がある？

※仮想環境では無く、大元の箇所へのPathでも動いた。
C:\Users\【username】\Anaconda3\Library\bin
※疑問点として、これだと仮想環境ごとにライブラリをインストールする意味がなくなる？

■実行結果
![python00.png](https://qiita-image-store.s3.amazonaws.com/0/359277/9caff998-662d-06be-6e27-b7d4883525bd.png)

#最後に
上記の設定をしなくてもTerminal上で動いた理由は不明。
しかし設定することでPycharmでも動くようになるので結果OKだと思う。
PathについてもどこかのLibrary\binへのPathが通っていればいいように見えるので、
もうちょい使いながら調べていきたい。
PycharmとAnacondaの連携メモ(1)

初めまして！！
今回は表題の通り、PycharmとAnacondaの連携について残しておきたいと思い書きました。
あくまで備忘録のようなものなので、分かりづらかったらごめんなさい。

#問題
AnacondaでインストールしたPythonをPycharmで利用したい

#環境
Pycharm 2018.3.4(Community Edition)
Anaconda Python 3.7 version
Python 3.7.1

#解決策
※PycharmまたAnacondaのインストール方法については割愛します。
※2つともインストール済の状態を想定しております。

1.Pycharmを起動すると下の画面が表示されので、[＋ Create New Project]を選択
![pycharm00.png](https://qiita-image-store.s3.amazonaws.com/0/359277/24171525-dff2-8e82-6143-88d6f9e03475.png)

2.untitledを任意のタイトル（今回はtest）に変更し、▶の印を押すと下の画面が表示されるので、[Existing interpreter]を選択
![pycharm01.png](https://qiita-image-store.s3.amazonaws.com/0/359277/102fc3b7-496c-c4b0-0106-c676ddd27375.png)

3.Interpreter右端の…を押すと下の画像が表示されるので、[System Interpreter]を選択し、利用するpython.exeが入っているフォルダパスを選択しOKを押す
![pycharm02.png](https://qiita-image-store.s3.amazonaws.com/0/359277/2c363302-d41c-9e78-fb9f-c527430d9430.png)

4.右下の[Create]を選択

上記の1～4の手順でプロジェクトフォルダが作成されるので、後はそのフォルダ内に.pyファイルを作成すればOK!

なおプロジェクトフォルダを作成後に同様の設定を行いたい場合は、[File]-[Setting]-[Project:○○○(プロジェクト名)]-[Project Interpreter]から設定可能
![pycharm03.png](https://qiita-image-store.s3.amazonaws.com/0/359277/ba21751a-1e7a-a4bb-7d32-a78811ade05b.png)

#最後に
環境の設定で手間取って時間を費やすのはもったいないと思ったので、これを見て参考になれば幸いです。
ArcSuite / Evidence ManagerのWSIは1万件制限があるって話。

## 前提条件

- 富士ゼロックス社製文書管理ソフトウェア、ArcSuite もしくは Evidence Manager の個別開発者
- 個別開発にWebサービスインターフェイスを使用している
- 大量の件数が返ってくるような検索/取得を行う

## 件数の上限は1万件

**結論：Webサービスインターフェイスで検索 or 取得をする場合、オブジェクト数が1万件までしか取得できない。**

回避するには以下のいずれかを検討する。

1. 検索条件を見直し、1万件以下に抑える
2. 諦めてドキュメント管理サービスSDKを使う

## 1. 検索条件を見直し、1万件以下に抑える
システム属性の「登録日時(system:createdon)」はオブジェクトが登録された瞬間に決定し、変更不可。
これを範囲指定条件とし、範囲を調整することで1万件以下に抑えることが可能。
ただし、移行案件等で一括登録された場合、当該処理で対象となったオブジェクトはすべて同じ登録日時になるため、
1万件以上同時に登録されるとアウト。

## 2. 諦めてドキュメント管理サービスSDKを使う
これが確実。
何万件だろうが一発で抜ける。
移行案件なんかは

- 検索/取得：ドキュメント管理サービスSDK
- 登録：Webサービスインターフェイス

みたいにわけるべき。
つか全部ドキュメント管理サービスSDKでやろう、速度がぜんぜん違うから。

## 何でこんなの書いたの？
前職で検索して全然引っかからなくて泣きそうだったから。
誰かのお役に立てれば幸い。
UnityでVRPNを取り扱う際の覚書

# 想定する環境
- Windows 10 64bit
- Unity 2018.2.17f1

# VRPNとは
VRPN(Virtual Reality Peripheral Network)とは、VRデバイスをTracker、Axis、Buttonなどの型に抽象化して一元的に制御できるようにしたインターフェースです。OculusやViveが存在しない時代に生まれた古のVR規格です。
接続デバイスを定義してVRPNサーバーを立て、アプリケーションをサーバーに接続すると、デバイスの情報を取得することができます。

# VRPNサーバーをビルドする
現在はWindows用のバイナリが配布されていないため、自分でビルドする必要があります。(過去に配布されていたらしきページにはアクセスできなくなっています)

- 以下のソフトウェアをDL・インストール
  - [CMake](https://cmake.org/)
  - [Visual Studio](https://visualstudio.microsoft.com/ja/)
- 以下のファイルをDL
  - [vrpn_xx.xx.zip](https://github.com/vrpn/vrpn/releases)
- CMakeにSourceディレクトリとBuildディレクトリを指定
- Configureをクリック
- インストールしたVisualStudioのバージョンを指定してFinishをクリック
- BUILD_TESTINGチェックを外し、CMAKE_INSTALL_PREFIXにビルド先ディレクトリのパスを入力してConfigureをクリックし、Generateをクリック
- BuildディレクトリのVRPN.slnを実行し、VisualStudioが起動したらALL BUIIDを実行(F5)
  - このときエラーが出るがスルーしてよい
- ソリューションエクスプローラーのINSTALLの上で右クリックしてビルドをクリック

# VRPNクライアントとサーバーを疎通する
VRPNサーバーを経由してマウス入力を取得します

- Build/binディレクトリを開く
- vrpn.cfgを開き、空いている行に`vrpn_Mouse Mouse0`と入力して保存
- vrpn_server.exeを実行してサーバーを立ち上げる
- cmdで`vrpn_print_devices.exe Mouse0@localhost`を実行し、サーバーに接続
- 接続に成功すると、vrpn_print_devices.exeに現在のマウス入力のAnalog値とButton値が表示されます

# UnityからVRPNサーバーに接続する
UnityにはネイティブでVRPNに接続するためのClusterInputクラスがありますが、試した限りでは使えませんでした。(フォーラムにも"あるバージョンから使えなくなった"という言及もあります。)
他に使えそうな外部ライブラリが無いか探したところ、

- [Laremere/unityVRPN: Simple VRPN wrapper for unity](https://github.com/Laremere/unityVRPN)
- [vrpn/VrpnNet: \.NET bindings for VRPN](https://github.com/vrpn/VrpnNet)
- [OSVR Developer Portal](https://osvr.github.io/whitepapers/vrpn_in_osvr/)

が見つかりました。今回は一番上のUnityVRPNを使用します。

- [こちら](https://github.com/arviceblot/unityVRPN/releases)からWindows 64bit用のビルドをDL
- [VRPN.cs](https://github.com/Laremere/unityVRPN/blob/master/scriptForUnity/VRPN.cs) をDL
- Unityプロジェクトに上記2つを放り込み、以下のスクリプトをCubeかなにかにアタッチすると、マウスに連動してオブジェクトが動きます。


```csharp:UnityVRPNExample.cs
using UnityEngine;

public class UnityVRPNExample : MonoBehaviour
{
    private string _deviceName = "Mouse0";
    private string _serverAddress = "localhost";
    private string _fullAddress;
    
    private void Start()
    {
        _fullAddress = _deviceName + "@" +_serverAddress;
    }
    
    void Update()
    {
        var mult = 2f;
        var x = (float)VRPN.vrpnAnalog(_fullAddress, 0) * mult;
        var y = (float)VRPN.vrpnAnalog(_fullAddress, 1) * mult;
        transform.position = new Vector3(x, 0, y);
    }
}
```

# 参考
- [Tutorial \- Use VRPN \- The VR Geeks Association](http://www.vrgeeks.org/vrpn/tutorial---use-vrpn#TOC-Coding-a-VRPN-client)
TidalCyclesをQuickTimeで画面収録したい

タイトルの通り、画面収録で録画したいとき。

SoundFlower使えばすんなりいけるだとと思ってたけど、SuperColliderの出力をSoundFlowerに流せなくて、はまってたのでメモしておきます。

結論から言うと、公式ブログのYouTube配信向けに書いてありました。

http://blog.tidalcycles.org/live-streaming-on-youtube/

ポイントは下記のあたり。

> Launch SuperCollider
Run the following command in SuperCollider by pasting it in the input window and hitting Shift + return anywhere on the line:
```
Server.default.options.outDevice_("Soundflower (2ch)")
```
Server.default.options.outDevice_("Soundflower (2ch)")
Hit Cmd + Shift + L to recompile the class library


⌘+Shift+L してリコンパイルしないといけないのが落とし穴でした。

あとはいつも通り

```supercollider
SuperDirt.start
```

すればOK

これでSuperColliderからSoundFlowerに出力が流せるようになるので、好きな録音ソフトの入力をそちらに向ければ録音できるようになります。
Mac の Eclipse で複数のワークスペースを開く

# やりたいこと

macOS で Eclipse を複数開きたい。

個人的には作業毎にワークスペースを分けたい派なのでどうにかできないものか試行錯誤。
意外と簡単にできることが判明。

あまり需要ないかもしれないですが、同じところでハマる人向けに。

# 方法

```bash
open -n /Applications/Eclipse.app
```

`open` コマンドに「別インスタンスで開く」というオプションがあるんですね。

```bash
$> man open
...
-n  Open a new instance of the application(s) even if one is already running.
```

常に `-n` オプションを付けても問題はないので、エイリアスを登録しておけばターミナルから起動可能です。

```bash
alias eclipse='open -n /Applications/Eclipse.app'
```

# 確認環境

macOS 10.14.2
Pythonで日経平均株価を取得します

## はじめに
Pythonで、Webスクレイピングにより、日経平均株価を取得します。
Webスクレイピングとは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のことを指します。

なお、本方法は、2019/2/12時点で実現可能であることを確認しましたが、Pythonのモジュールの仕様変更や、ホームページの仕様変更により、取得できなくなる可能性があります。

## Webスクレイピング方法
Yahooの日経平均株価のページをChromeで開いたら、空白部分で右クリックして、「ページのソースを表示」でHTMLデータを表示させます。
そして、株価が表示されている部分を探します。（ここでは、日経平均株価で検索しました）

``` html
<table class="stocksTable" summary="株価詳細">
<tr>
<th class="symbol"><h1>日経平均株価</h1></th>
<td class="stoksPrice realTimChange">
<div class="realTimChangeMod">
</div>
</td>
<td class="stoksPrice">20,864.21</td>

<td class="change"><span class="yjSt">前日比</span><span class="icoUpGreen yjMSt">+531.04（+2.61%）</span></td>

</tr>
</table>
```

```<td class="stoksPrice">20,864.21</td>```のように、class属性stoksPriceに、株価が記述されていることがわかりました。
class属性を条件に要素を取得するためには```.クラス名```のように指定します。
そして、どのパラメーターを参照すれば日経平均株価の値が取得できるか確認します。

ここでは、PythonのIDEであるPyCharmのデバッグを使用する方法を用いました。

[手順]

(1) PyCharm上でコードを記載
(2) ```stoksPrice = bs.select('.stoksPrice')```のところにブレークポイントをセット
(3) プログラムをデバッグモードでスタートさせて、ブレークポイントで停止させ、1行コードを進めて、stoksPrice 変数の中身を確認
(4) ```[1].text```の要素に株価情報があることを確認したので、コードに反映させる

``` py
import urllib.request as request
from bs4 import BeautifulSoup

def get_stock_price(url):
    response = request.urlopen(url)
    bs = BeautifulSoup(response, 'html.parser')
    stoksPrice = bs.select('.stoksPrice')[1].text
    return stoksPrice


url = 'https://stocks.finance.yahoo.co.jp/stocks/detail/?code=998407.O'
result = get_stock_price(url)
print(f'日経平均株価は{result}円です。')

url2 = 'https://stocks.finance.yahoo.co.jp/stocks/detail/?code=8411.T'
result = get_stock_price(url2)
print(f'みずほ銀行の株価は`{result}円です。')
```

```
日経平均株価は20,864.21円です。
みずほ銀行の株価は173.4円です。
```

## 感想
PyCharmを使った方法以外に、もっと簡単に取得したいパラメーターの要素を取得する方法があるかもしれません。方法があれば、展開したいと思います。
遅いpandasのread_csvを高速化する方法(dask)

# 目的
pythonで重いcsvファイルを読み込む時に、pandasだと時間がかかる。
そこで早いと噂のdaskを試してみる。
ここでは、daskの中身には詳しく触れず、使い方を説明する。

ちなみに、私が5GBのcsvファイルをdaskで読み込んだ時は、pandasを使用した時よりも10倍くらい早く読み込めた。


## daskってなに？
daskとはpandasのようなライブラリの一つ。
daskは、pandasのDataFrameの処理を応用しているから、基本的にpandasと同じ動作をする。
早くなる理由は、並列分散を使用しているから。

詳しくは[こちら](http://sinhrks.hatenablog.com/entry/2015/09/24/222735)の方の記事をご覧ください（めちゃわかりやすい）


### 使い方
anacondaをダウンロードした人なら基本的に何もせずに使える。
pandasならば、

```python
import pandas as pd
pd.read_csv('test.csv')
```

と記述するところを、

```python
import dask.dataframe as dd
dd.read_csv('test.csv').compute()
```

とするだけ。
pandasとの違いは.compute()とつける必要があること。これがないと実行されない。
後の結合や抽出といった処理もpandasのDataFrameと同様に処理できるし、早い。


### エラーの対処法
基本的には、pandasの対処法と同じ。

- csvの中身に読み取れない日本語があるエラー

```python
dd.read_csv('test.csv', encoding='sjis').compute()
```
encodingを試してみる。ダメなら'cp932'も試す。

- dtypeが違うエラー

daskはcsvファイルを読み込む際に、dtypeを始めの方の行で判断して読み込んでいるようで、途中で違うdtypeの文字が出てきたときにエラーがでる。
その時は、

```python
dd.read_csv('test.csv', dtype={'カラム１':object,
                               'カラム２':float})
```

といったように、エラーが出た列のdtypeを指定してあげるといい。

## daskでできないこと
- read_excelが使えない。
- [前回の記事](https://qiita.com/lucky0707/items/becdbed49c4ecb4fe246)で書いたエラーを無視して無理やり読み込むpandasの方法が使えない。

```python
import codecs as cd
tmp = cd.open('test.csv', 'r', 'sjis', 'ignore')
pd.read_table(tmp)
```
理由は、dd.read_tableでは、上のコードのtmp部分(バッシュと呼ばれるデータの一時保管場所）を読み込めないから。pd.read_tableでは読み込めるようになっているのだが、まだdaskだと対応していないみたい。

# まとめ
まだ、完全にはpandasと同じように使える訳ではないが、基本的な処理ならdaskでできる。
何より早く処理できるので、ストレスがなくなる！


### 参考
- [Python Dask で 並列 DataFrame 処理 - StatsFragments](http://sinhrks.hatenablog.com/entry/2015/09/24/222735)
- [Dask使ってみた - Qiita](https://qiita.com/art_526/items/ca003a78535ab4546a01)


以上です。
これを書いて欲しい、役に立った等のご意見があると嬉しいです。
また、間違いがあればご指摘ください。
jQueryを使った複数条件(and,or入り混じり)の絞り込みを実装する

## まずはサンプル
https://kackie.github.io/sort/
ポケモンです。すみません。
HTML内にスタイルとプログラムコードも記述してあります。

## 作った経緯
PCソフトウェアの紹介サイトで、ユーザが対応OSや保証期間など複数軸で絞り込みできるエリアがほしいということで、いろいろライブラリ等を探したりしてみたものの見つけられず、自分で作ることにしました。

## おおまかな仕組み
主な処理は3つ。

1. チェックボックス操作時、切り替えた内容に応じて表示を切り替える
1. チェックボックス操作時、チェックのオンオフに応じてURLにパラメータを付与する
1. ページ読み込み時、URLにパラメータが付いていたら内容に応じて表示を切り替える

### 1.チェックボックス操作時の動作
チェックの切り替えを行うと各カテゴリ毎に項目のオンオフを確認していき、配列を使って下記のような条件を作ります。
条件1 = カテゴリ1のチェック項目
条件2 = カテゴリ2のチェック項目
条件3 = カテゴリ3のチェック項目
切り替え対象の要素のうち、条件1にあてはまるもの かつ 条件2にあてはまるもの かつ 条件3にあてはまるもの を絞り込み、それ以外のものを非表示にします。

### 2.チェックに応じたパラメータの操作
1で作った条件の配列をもとに各カテゴリのどこにチェックが入っているかをテキストとして整形し、URLにパラメータとして付与します。

### 3.ページ読み込み時の動作
2で作られたパラメータを、ページ読み込み時に利用します。
URLにパラメータが付いていないときにはすべての要素を表示し、付いているときはその内容に応じて要素の表示非表示を切り替えます。

## 実装の肝の部分と解説
```js
for(i=0;i<groupLength;i++){
	var arr = [];
	var filterArr = [];
	if(sortControl.find('input[type="checkbox"][data-group="' + i + '"]:checked').length){
		sortControl.find('input[type="checkbox"][data-group="' + i + '"]:checked').each(function(){
			arr.push($(this).attr('id'));
			filterArr.push('.' + $(this).attr('id'));
		});
	}
	active[i] = arr;
	if(filterArr.length){
		allArr.push(filterArr);
	}
	param += (active[i].length) ? '?group' + i + '=' + active[i] : '';
}
```
カテゴリをグループ化するのにHTMLのdata属性を使用しました。
同一のdata属性内のチェックボックスのうちチェックがオンされているものを取得し、条件の作成に使っています。

```js
if(allArr.length){
	for(j=0;j<allArr.length;j++){
		var filter = allArr[j].join(',');
		showClass = showClass.filter(filter);
	}
}
```
作られた条件の数を調べてその数の分だけ、すべての要素のうち条件1を満たすもの、かつ2を満たすもの...という絞り込みをかけていきます。

```js
if($.isEmptyObject(param) !== true){
```
もし変数paramが空じゃなければ
`$.isEmptyObject(変数)`　→　変数が空かどうかを調べる

```js
history.pushState(null,null,param);
```
ページ遷移無しで、現在見ているページのURLの末尾にparamを付与し、それまで見ていたページを履歴に追加することができる。

```js
if(location.search){
```
もしURLにパラメータがついていたら

## やろうとしてできなかったこと・課題など
- カテゴリの数を手動で設定する必要がある
  - groupLength = 3;　<br>この部分。別にこれでも問題ないけどスマートではない気がする。
- チェックボックスにしか対応していない
  - ラジオボタンやセレクトボックスは使えない。<br>今回の要件では必要なかったけれど、今後使い回すことを考えて書いても良かった。<br>`sortControl.find('input[type="checkbox"]').change`等の、条件がチェックボックスになっているところを書き換えたりif文を追加する必要がありそう。
- 連想配列に対して.lengthが使えない
  - 知らなかった。<br>group[i]というラベルに対してチェックされているもののIDを格納した連想配列を作り、forループでURLに追加するパラメータを作ったり、表示切り替えの条件として使いたかった（ような気がする、忘れた）。<br>
`param += (active[i].length) ? '?group' + i + '=' + active[i] : '';`<br>
	↑こんなふうにラベルを使わずパラメータを作成している。
- パラメータの追加にlocation.searchは使えない
  - 普通にページ遷移した。パラメータはあくまで外部リンク用なので、表示切り替え時にはリロードさせたくない。<br>パラメータの操作にはhistory.pushState()を使った。
- 全体的に記述が冗長になってしまった。
  - ```var defCheck = '#' +  defArr.join(',').replace(/,/g,',#');
	defArr = '.' + defArr.join('|.').replace(/,/g,',.');
	defArr = defArr.split('|');```<br>
	↑読み込み時URLにパラメータがある場合それを取得し、activeClassに格納するためにテキストを変形させつつ配列にしている（なんだこりゃ）。<br>
	joinとreplaceを多用せずもっときれいに書けないもんかと思う。

## まとめ
Qiita初投稿になります。皆さんはじめまして(遅
業務では基本的にHTMLを扱う人種なので、長めのプログラムを書いたのは本当に久々だったので、今後のために反省と覚え書きをしておこうと思い、書き始めた次第です。
簡単なサイト制作ではほぼ使わない配列やループ処理を実践できたのはよい経験でした。

表示非表示の切り替えに何かインタラクションを入れたかったのですが、非表示時の操作がわからず断念してしまいました（表示はstyleタグ内`/*animation: show 0.3s ease 0s;*/`のコメントアウトを消せばいけます）。
Masonryを使って整列させようともしたのですがこちらもうまくいかず。
この辺りはうまく動かせるようにもっと色々試してみたいです。

あと似たような機能のライブラリあったら教えてください(切実)。
syslogでdebug

mruby on Yet Another Bare Metalでコンソール無しでデバッグメッセージを確認する方法です。

```ruby
begin

yabm = YABM.new

addr = "10.10.10.123"
mask = "255.255.255.0"
gw = "10.10.10.3"
dns = "10.10.10.3"

yabm.netstart(addr, mask, gw, dns)

dist = "10.10.10.3"

yabm.udpinit

i = i + 1

rescue => e
  yabm.udpsend(dist, 514, e.to_s, e.to_s.length)
end
```

10.10.10.3のサーバのsyslogdでリモートのメッセージも取り込めるようにオプション無しで起動しておくと/var/log/messagesに(もちろんFreeBSDの場合ですが)

```
Feb 12 22:25:45 10.10.10.123 undefined method '+'
```

とでます。
PHPの実装パターンとデザインパターンのリンク集

随時更新します。

* [Middlewareパターン](https://qiita.com/suin/items/5c53f72e9c7e2c05b18f)
* [Middlewareパターン(Interceptorパターン)](https://qiita.com/suin/items/41042739bfca271da729)
* [イミュータブルオブジェクト](https://qiita.com/suin/items/56859f5b5f6f962e2744)
* [イミュータブルオブジェクト(属性が多いとき)](https://qiita.com/suin/items/6c8a841643269059378a)
* [クラスのメモ化](https://qiita.com/arai-ta/items/d5e4d52509478e58e136)
* [振る舞いを持つEnum](https://qiita.com/suin/items/17ee61d7e75b422a7ec3)
* [SystemClockパターン](https://qiita.com/suin/items/bcd7488df4403a53d7d9)
* [引数に多重度[1..*]の制約を課す方法](https://qiita.com/suin/items/fb6859a06d2b63790be8)
* [配列の中身の型を保証する方法](https://qiita.com/suin/items/a9ff73591b6e77c133e9)
* [PHP: Builderパターンの実装手順 #1【基礎実装】](https://qiita.com/suin/items/d8d4dc019d3beb428249)
* [PHP: Builderパターンの実装手順 #2【Fluent Interface実装】](https://qiita.com/suin/items/888f59851f940ee97c3a) 
* [PHP: Builderパターンの実装手順 #3【Immutable Builder実装】](https://qiita.com/suin/items/7594e8984efc96594cee)
* [PHP: Builderパターンの実装手順 #4【Builder経由での生成を強制する】](https://qiita.com/suin/items/feafae06c644f871f7b8)
PHPをかじってみる４日目。なぞなぞランドにはまっています。

昨日作ったRubyとRuby on RailsをHerokuで動かしたい！
しかし何回やっても`Push failed`ルビーじゃないって言われます。
うーん、わからん。こういう時はギブアップです！
まあそのうちわかるでしょう。

というわけで、今日はPHPにチャレンジ。ProgateでPHP初級をクリアしました。
これでお問い合わせフォームを作れるようになったぞ！

http://appdays.herokuapp.com/Day4/

ついでにもうちょっとだけ遊んでみました。
PHPで作れそうなページを探してっと。

なぞなぞらんど
http://nazo-nazo.com/sp/cat398/post-17.html

これは面白い！
なぞなぞにハマってしばらく遊んでしまいました。
PHP、CSS、JQueryの応用でできていて、
クリックで答えがピュンとでてくるアクションが面白い。
こういうのが作れたらいいなあ。

WEBサービス
【PHP】簡単に4択クイズプログラムを作ってみよう
https://kinocolog.com/quizprogram/

PHPの解説つきです。なんて親切なんだ。。。
今日はこちらを写経しました。
http://appdays.herokuapp.com/Day4/quest.php

プログラミングって本当に面白いですね。ではまた明日！
Stringオブジェクト

#Stringオブジェクト
StringはSringクラスにより作られる。
###クラスとは
雛形のようなもの、メソッド(機能のようなもの)が与えられる。

```
シングルクォーテーションは中の変数などを認識できない
'文字列'

*ダブルクォーテーションは中の変数などを認識できる
"文字列" 
```

クラスの確認↓

```
$ pry
>'文字列'.class
 > String
```
文字列のように直接記述できるものは**リテラル**という

Sringクラスからオブジェクトを生成する場合は`new`メソッドを使用する

```
String.new('文字列')
```

*ただし、文字列などリテラルで記述できる場合は基本的にnewメソッドで生成しない。*

メソッドを使う場合、引数がない場合は`()`を省略できる
>(例)`'sample'.uppercase()`

###オブジェクトがもつメソッドの一覧を出力する

下のコードは、Stringオブジェクトが持つメソッドの一覧を表示する

```
'sample'.methods
```
メソッドは随時調べながらやるのが良い
最近のJupyter Notebookの1セル目


```
# Jupyterのセル内容をすべて出力する設定
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity ='all'

import pandas as pd
pd.set_option('display.max_columns', 99)

#進捗の確認
from fastprogress import master_bar, progress_bar

import numpy as np
import pandas_profiling as pdp

from sklearn.model_selection import train_test_split,KFold,StratifiedKFold,GridSearchCV
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import roc_auc_score

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

# 警告を消す
import warnings
from pandas.core.common import SettingWithCopyWarning
warnings.simplefilter(action='ignore', category=SettingWithCopyWarning)
warnings.simplefilter(action='ignore', category=FutureWarning)

# 乱数固定
SEED = 2019
# K分割はほぼ5で分割
N_FOLDS = 5

# ディレクトリはKaggleっぽく切る
import gc
import os
print(os.listdir("../input"))
```
Java SE 8 Sliver 問題集まとめ

# 1 javaの基本

# 2 javaのデータ型の操作

# 3 演算子っと判定構造の使用

# 4 配列の作成と使用

# 5 ループ構造と使用

# 6 メソッドとカプセル化び操作

# 7 継承の操作

# 8 例外の処理

# 9 java APIの主要なクラス操作
Shadeスクリプト(Python)で、メビウスの輪を作る


Shadeスクリプト(Python)で、メビウスの輪を作る

```python:script.py
import math
scene = xshade.scene()
scene.begin_creating()

r = 10

for n in range(0,360,3):

	for rr in [-1.5,-1.2, -0.9, -0.6, -0.3, 0.0, 0.3, 0.6, 0.9, 1.2,1.5]:
		nn = n / 2
		x1 = (r) * math.cos(n * math.pi/180)
		y1 = (r) * math.sin(n * math.pi/180)
		x2 = x1 + (rr) * math.sin(nn * math.pi/180) * math.cos(n * math.pi/180) 
		y2 = y1 + (rr) * math.sin(nn * math.pi/180) * math.sin(n * math.pi/180)
		z2 =      (rr) * math.cos(nn * math.pi/180)
		scene.create_sphere(None,(x2, y2, z2),0.6)

scene.end_creating()

```
<img width="528" alt="スクリーンショット 2019-02-12 21.50.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/92b331ff-b399-f8f8-6e71-567e5c0715ff.png">


For文の中の

```python:hineri.py
nn = n / 2
```
を修正すると、ひねり回数などが変わる

```python:hineri.py
nn = n 
```
↓
<img width="359" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/b6b398a0-2821-ca04-eba1-a2a36d5c4dc4.png">

```python:hineri.py
nn = n * 6
```
↓
<img width="377" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/02591fad-d178-b694-08dc-680369ac4184.png">

```python:hineri.py
nn = n * 2
```
↓
<img width="379" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/e4430b31-3330-e32b-d5c6-33b8fcb56f71.png">

```python:hineri.py
nn = n * 2.5
```
↓
<img width="383" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/ac41dbf7-b1b7-3f9a-ec44-efb0d2ad2f9d.png">

```python:hineri.py
nn = n * math.cos(n * math.pi/180)
```
↓
<img width="361" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/dfdae066-75a2-9909-fe55-db10c5f343a5.png">

```python:hineri.py
for n in range(0,360,1):
~~
nn = n * 17
```
↓
<img width="384" alt="a.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/c230a49c-3def-63a5-0627-cc7c73927d4e.png">
【RHEL, CentOS, Fedora】Linux コマンドのデバッグ方法

# ■ はじめに

本稿では、RHEL、CentOS、Fedora といった RedHat 系 Linux のコマンドをデバッグする方法を記載しています。

一例として、`free` のパッケージである `procps-ng` のデバッグシンボルを取得し、デバッグを開始するまで行います。

# ■ 検証環境

```console:
[root@hst ~]# uname -r
4.18.11-200.fc28.x86_64

[root@hst ~]# cat /etc/fedora-release 
Fedora release 28 (Twenty Eight)
```

上記のとおり、検証環境は Fedora ですが、以降の手順は RHEL や CentOS でも使えるはずです。ただし、RHEL, CentOS, Fedora(21以前)の標準のパッケージマネージャは dnf ではなく yum なので、その点は注意です(具体的なコマンドは併せて載せています)。

# ■ デバッグシンボルの取得方法

主な流れは次のとおりです。

- デバッグしたいコマンドのパッケージ名を確認
- デバッグしたいパッケージのデバッグシンボルをインストール

## 1. 事前準備

はじめに必要なコマンドのパッケージをインストールします。

```console
// Fedora(22以降)の場合
なし
 
// RHEL, CentOS, Fedora(21以前)の場合
[root@hst ~]# yum install yum-utils
```

次にデバッグしたいコマンドのパッケージ名を確認します(本稿では free コマンドが対象)。

```console
[root@hst ~]# rpm -qf $(which --skip-alias free)
procps-ng-3.3.12-3.fc28.x86_64

※ .fc28.x86_64 はご使用の環境により変化します。
```

## 2. デバッグシンボル取得手順

事前準備で確認したパッケージのデバッグシンボルをインストールします。

```console
// Fedora(22以降)の場合
[root@hst ~]# dnf debuginfo-install procps-ng-3.3.12-3.fc28.x86_64

// RHEL, CentOS, Fedora(21以前)の場合
[root@hst ~]# debuginfo-install procps-ng-x.x.xx-x.xxx
```

コマンドを実行すると次のように \<pkg\>-debuginfo と \<pkg\>-debugsource をインストールしようとします。

```console
Dependencies resolved.
===================================================================================================================================================================================================================
 Package                                                  Arch                                      Version                                            Repository                                            Size
===================================================================================================================================================================================================================
Installing:
 procps-ng-debuginfo                                      x86_64                                    3.3.12-3.fc28                                      updates-debuginfo                                    382 k
Installing weak dependencies:
 procps-ng-debugsource                                    x86_64                                    3.3.12-3.fc28                                      updates-debuginfo                                    229 k 

Transaction Summary
===================================================================================================================================================================================================================
Install  2 Packages

Total download size: 611 k
Installed size: 2.3 M
Is this ok [y/N]: y
```

念のためデバッグシンボルが読み込まれるか確認します。

```console
[root@hst ~]# gdb -q free
Reading symbols from free...Reading symbols from /usr/lib/debug/usr/bin/free-3.3.12-3.fc28.x86_64.debug...done.
done.
```

上記のように表示されていれば、そのままデバッグできるはずです。もし、(no debugging symbols found)...done. と表示されている(デバッグシンボルが読み込まれていない)場合は、次のコマンドを実行し、パッケージがインストールされているかご確認ください。

```console
[root@hst ~]# rpm -qa | grep procps-ng
procps-ng-debugsource-3.3.12-3.fc28.x86_64
procps-ng-debuginfo-3.3.12-3.fc28.x86_64
procps-ng-3.3.12-3.fc28.x86_64
```

以上です。
Railsチュートリアル2周目(1~6章)をしてみて

Railsチュートリアル2周目をしてみて理解できたことを書いていく。(文字のみ)
##はじめに
Railsチュートリアル1周目はとにかくやりきることを目標に取り組んだが理解度は10%もないくらいであった。２周目はゆっくりと1つずつ理解することを目標に取り組んだ。
1周目の開発環境はcloud9,2周目はvscodeを使用してローカル環境で開発。


２周目をしてみて特に理解出来なかった所はなくMVCだけでなくtestについても程度理解できた。
1~6章でかかった時間はおよそ6時間くらいであった。

##Railsチュートリアルで理解できた所
####scaffoldを使ってUserリソースを作成する欠点
・データの検証が行われていないのでユーザー名が空欄であったりメールアドレスが適当でもログイン出来たりする。
・ユーザー認証が行われていないのでログインなどしなくても誰でも入れてしまう。
・簡単に作れてしまうのでRailsについて理解できない
####assets/stylesheets/application.cssについて
require_tree・・・stylesheetディレクトリ中のすべてのcssファイルがapplication.cssに含まれるようにしている。
require_self・・・application.css自身も含めるよ的な感じ
####scssとcss
今までなぜcssがscssになっているか理解せず使っていたがscssにすることで.center{}.center h1{}みたいに2度も.centerを書かなくていいためコードがシュッとする。
####integration_testについて
・サイト内のリンクボタンを押せばちゃんと飛べるのかをテストしてくれる。
同じview内に/homeのリンクが２つあればcount: 2をつける(2つあるよってこと)

####SQL
Railsにはマイグレーション機能があることでデータの定義をRubyで記述することができるのでSQLをわかっていなくても使える。
↑使えるが理解しているわけではないので学習する必要あり。

###終わりに
7章以降はさらに難しくなっていくので時間をかけてゆっくり理解しながら進んでいく14章まで終わったらQiitaを更新する予定
Gitに名前、メールアドレス、コマンドラインの設定をする。

この記事ではWindows10にインストールしたGit version 2.20.1.windows.1
を使っています。

GitHubを使う事になったのでお勉強ついでにQiitaに記事を投稿してみました。

#目次
1.名前の設定
2.メールアドレスの設定
3.コマンドラインの設定

#1.名前の設定
Gitで利用する名前を設定する。

```git
git config --global user.name "ユーザ名"
```

#2.メールアドレスの設定
Gitで利用するメールアドレスを設定する。

```git
git config --global user.email "メールアドレス"
```

#3.コマンドラインの設定 
Git Bashの設定

```git
git config ---global color.ui auto
```

次の記事ではGitHubを利用する前準備をする予定。
JavaScript type check

# JavaScript type check memo

## instanceof 
check whether an object belongs to a certain class

```javascript
a = new Number('1'); // create a Number object using Number() constructor
b = Number('1'); // create primitive type object number using Number() function

a instanceof Number
> true // a is Number object
b instanceof Number 
> false // b is primitive type object: number
typeof(a);
> 'object'
typeof(b);
> 'number'
```

prototype chain :

```javascript
Number.prototype;
> [Number: 0]
a.__proto__;
> [Number: 0] // Number.prototype
a.__proto__.__proto__;
> {}          // Object.prototype
a.__proto__.__proto__.__proto__;
> null        // no deeper prototype
```

## isPrototypeOf
`a instanceof Class` can be rephrased as `Class.prototype.isPrototypeOf(a)`

```javascript
a = new Number('1');
b = Number('1');
Number.prototype.isPrototypeOf(a)
> true
Number.prototype.isPrototypeOf(b) 
> false
```

## getOwnPropertyNames
```javascript
Object.getOwnPropertyNames(Object)
[ 'length',
  'name',
  'prototype', // the instance of any Object follows this
  'assign',
  'getOwnPropertyDescriptor',
  'getOwnPropertyDescriptors',
  'getOwnPropertyNames', // use this to check properties
   ...
  'keys',
  'entries',
  'values' ]

> Object.getOwnPropertyNames(Object.prototype)
[ 'constructor',
  '__defineGetter__',
   ...
  'propertyIsEnumerable',
  'toString', // prototype.toString just return '[object <object name>]'
  'valueOf',
  '__proto__',
  'toLocaleString' ]

Object.getOwnPropertyNames(Number)
[ 'length',
  'name',
  'prototype',
  'isFinite',
   ...
  'EPSILON' ]

Object.getOwnPropertyNames(Number.prototype)
[ 'constructor',
   ...
  'toString',
  'valueOf',
  'toLocaleString' ]

```

## prototype
```javascript
Object.getPrototypeOf(123) // prototype of Number
> [Number: 0]
Object.getPrototypeOf('123') // prototype of String
> [String: '']
Object.getPrototypeOf([1,2,3]) // prototype of Array
> []
```

```javascript
Object.prototype.toString.call(new Object())
> '[object Object]'
Object.prototype.toString.call(123)
> '[object Number]'
Object.prototype.toString.call('123')
> '[object String]'
Object.prototype.toString.call([1,2,3])
> '[object Array]'
```

```javascript
String.prototype.toString.call('123') // String('123').toString()
> '123'
String.prototype.toString.call(123)
/* TypeError: String.prototype.toString requires that 'this' be a String
     at Number.toString (<anonymous>) */

Number.prototype.toString.call(123) // Number(123).toString()
> '123'
Number.prototype.toString.call('123')
/* TypeError: Number.prototype.toString requires that 'this' be a Number
     at String.toString (<anonymous>) */

```
PHP: str_putcsv

PHPにはCSV文字列をパースして配列にする`str_getcsv`関数があるが、これとは逆の配列をCSV文字列に変換する関数が存在しない。

         | ファイル | 文字列
---------|-----------|---
CSV→配列 | fgetcsv() | str_getcsv()
配列→CSV | fputcsv() | **存在しない**

仕方がないので、`str_putcsv`は自作した。

```php
/**
 * @param string[] $record
 * @return bool|string
 */
function str_putcsv(
	array $record,
	?string $delimiter = null,
	?string $enclosure = null
) {
	$delimiter = $delimiter ?? ',';
	$enclosure = $enclosure ?? '"';
	$fp = fopen('php://memory', 'r+b');
	if ($fp === false) {
		return false;
	}
	if (fputcsv($fp, $record, $delimiter, $enclosure, "\0") === false) {
		return false;
	}
	if (!rewind($fp)) {
		return false;
	}
	return stream_get_contents($fp);
}
```

実装内容は下記参考文献とほとんど同じだけど、ちょっと良くした部分として、

* 型宣言をちゃんとした
* `fputcsv()`の第5引数 `$escape_char` のデフォルトは `\` だが、これをそのままにしておくと `\"`が `\""` にならない謎仕様を抑制するためにヌルバイトを与えておくようにした。(ヌルバイト+エンクロージャのパターンが扱うデータにないことを前提としている)
* `fputcsv`に習って、エラーのときは`false`を返すようにした

という点がある。

動かしてみる:

```php
echo str_putcsv(['a', 'b', ',', '"', '\"']);
```

出力結果:

```vb
a,b,",","""","\"""
```


## 参考文献

* [[PHP]str_getcsv()があるんならstr_putcsv()があってもいいじゃない｜シラサヤ備忘館](http://xirasaya.com/?m=detail&hid=407)
* [PHP str_putcsv function](https://gist.github.com/johanmeiring/2894568)
【最新サービス試用③】快適なChrome生活を過ごすために「QuickTabSwitch」を試用。

- 日々輩出される素晴らしき最新サービスを素早く試して、不鮮明な先見性を堂々と誇示する記事第三弾。
- オープンソースが産み出した最強の利点である「素晴らしきサービスの中身が見れて、勉強になる」ことを、決して活かさず、試用を夜な夜な繰り返している技術者もどき。
- 「中身が非常に素晴らしい技術で溢れていることは、信頼しているから。」という典型的な稚拙な言い訳に、我ながら感慨深い。
- 今回は、タブ大量表示人の私にとって、快適なChrome生活がおくれる「QuickTabSwitch」を試用していこう。

## 試用サービス名
### 「[QuickTabSwitch](https://www.moongift.jp/2019/02/quicktabswitch-google-chrome%E3%81%AE%E3%82%BF%E3%83%96%E3%82%92%E7%B4%A0%E6%97%A9%E3%81%8F%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B/)」

## 概要
- 大量のタブをショートカットで、一覧表示してくれる。
- 対応キーを押すだけで、そのページに飛んでくれる。
- JavaScript製のプロジェクト

## 結果

![test.png](https://qiita-image-store.s3.amazonaws.com/0/336499/026825c3-b9e1-5fd5-220d-0cd6fffb356c.png)


## 基本手順
### 1. Chrome拡張機能として追加
- [こちらのURL](https://chrome.google.com/webstore/detail/quicktabswitch/pnelkdgjfmmkcogamkjkcajgdkomjgco?hl=ja&gl=JP)にアクセス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/90fe170d-8247-9aba-751d-7fbcafba9d87.png)

- 「Chromeに追加」ボタンで追加する。
- 完了。

### 2. 表示確認
- 大量のタブを開く。  
→少なすぎると効果があまりないので、10個以上出す。
- ショートカットキー「Ctrl(command) + Shif + X」で一覧が出るか確認。
- 表示後、各ページの左側についている対応キーを押下してきちんと遷移するか確認。
- 完了。  
※一覧をクリックしても遷移はしない。対応キー押下のみ。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/336499/026825c3-b9e1-5fd5-220d-0cd6fffb356c.png)

## まとめ
- 今回は快適なchrome拡張機能ということで、これまでにも多くの便利なタブ管理拡張機能が出てきており、大量表示一族は精力的に拡大していると感じながら、記事を書く。
- タブをファイルとして保存したり、名前をコピーしたりということはできないが、「単純こそ真の至宝である」という数多くの経験をしてきた人が立つ境地の考えを、子供より経験未熟な私が声高々に語る。
- どんなことがあってもこれだけは忘れない「開発者への礼拝」を、目に余裕で止まる速さで遂行し、また次の調査に戻る。

## 参考
- https://www.moongift.jp/2019/02/quicktabswitch-google-chrome%E3%81%AE%E3%82%BF%E3%83%96%E3%82%92%E7%B4%A0%E6%97%A9%E3%81%8F%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B/  
→こちらの記事から見つけてきました。大変お世話になりました。
FlutterのStreamBuilderでFirestoreに保存されているデータを表示する


#StreamBuilderのイメージ
まず、StreamBuilderの和訳はStreamは「流れる」、Builderは「建築者」なので「流れる建築者」という意味です。
これじゃあよくわからないですね。。

StreamBuilderのイメージは、コードの順序関係なく流れてきたデータをキャッチして処理を行う感じです。

そして2つの要素、streamとbuilderから構成されています。
では、次にコードをもとに詳細を説明します。

##コード全体
```dart:main.dart
        Widget userName() {
    
    return StreamBuilder<QuerySnapshot>(
        
        //表示したいFiresotreの保存先を指定
        stream: Firestore.instance
        .collection('users')
        .document(firebaseUser.uid)
        .collection("transaction")
        .snapshots(),

        //streamが更新されるたびに呼ばれる
        builder: (BuildContext context,
            AsyncSnapshot<QuerySnapshot> snapshot) {
            
          //データが取れていない時の処理
          if (!snapshot.hasData) return const Text('Loading...');

          return Text(snapshot.data.documents[0]['userName']);

        }
     );
  }
```
表示したい場所にuserName()を記載すれば使える。

##stream部分解説
```dart:main.dart
stream: Firestore.instance
        .collection('users')
        .document(firebaseUser.uid)
        .collection("transaction")
        .snapshots(),
```
streamでは表示したいFirestoreの保存先を指定します。そして最後に、【.snapshots()】を記載してデータを取得します。

##builder部分解説
```dart:main.dart
 //streamが更新されるたびに呼ばれる
 builder: (BuildContext context,
            AsyncSnapshot<QuerySnapshot> snapshot) {
            
          //データが取れていない時の処理
          if (!snapshot.hasData) return const Text('Loading...');

          return Text(snapshot.data.documents[0]['userName']);

        }
```
builderはstreamが更新するするたびに呼ばれます。

####【AsyncSnapshot＜QuerySnapshot＞ snapshot】
一番上のこの部分で先程snapshotsで取得したデータをsnapshotに代入しています。

####【if (!snapshot.hasData) return const Text('Loading...');】
この部分は、snapshotにデータが代入できていないときLoading... と表示する処理です。

####【return Text(snapshot.data.documents[0]['userName']);】
最後にこの部分でデータを表示させています。
documents[0]の部分で表示させたいデータのindex番号を指定しています。['userName']で表示したいフィールド名を指定しています。
LeXインストーラ3のインストール時のエラーの解決法

# はじめに
AtomでLatexの日本語環境を作ろうとした際に、[LeXインストーラ3](https://www.ms.u-tokyo.ac.jp/~abenori/soft/abtexinst.html)からダウンロードしたabtexinst.exeの実行でつまづいたので、その解決法をシェアします。

日本語環境作りは[この記事](https://qiita.com/tomochiii/items/152160a9915fb7b2146c)に従って行いました。

# 環境
OSはWindows 10になります。
[Perlをインストール](http://strawberryperl.com/)した状態です。

# 手順
TeXインストーラ3を用いてのLatexのインストール法は、

1. [LeXインストーラ3](https://www.ms.u-tokyo.ac.jp/~abenori/soft/abtexinst.html)にあるダウンロードの最新版をクリック
2. ダウンロードされたzipファイルを解凍
3. 解凍されたファイル内にあるabtexinst.exeをダブルクリックし実行

といった感じです。

# 問題
上記の3つめのabtexinst.exeの実行において動作が止まってしまいインストールがうまくいきませんでした。

解凍したフォルダ(abtexinst)内のabtexinst_logファイルを見てみると、「情報ファイルの発見に失敗」というエラーがみられました。

# 解決策
[このリンク](https://www.ms.u-tokyo.ac.jp/~abenori/soft/readme/abtexinst_plugin.txt)にある使用法を試したところエラーがみられなくなりました。

具体的には、abtexinstフォルダ内にある、libフォルダをpluginフォルダ内にコピペすることでエラーが解消できます。

Latexの日本語環境を作ろうとしている方で同じように詰まってしまった方は参考にしてみてください。
99 PSiE [Extra 1]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日さわることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Haskell の dropWhile を Elm で再現せよ｡
([Extra 1](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/e01.html)を改変)

# 成果物
```elm
import Html

-- main = dropWhile isOdd [1, 2, 1]
--      |> Debug.toString
--      |> Html.text

-- My solution
dropWhile func list =
    case list of
        [] -> []
        x::xs ->
            if func x then
                dropWhile func xs
            else
                list

-- Test
main : Html.Html a
main =
    Html.text
        <| case test of
               0 -> "Your implementation passed all tests."
               1 -> "Your implementation failed one test."
               x -> "Your implementation failed " ++ (Debug.toString x) ++ " tests."

test : Int
test =
    List.length
        <| List.filter ((==) False)
            [ ( dropWhile isOdd [1, 2, 1] == [2, 1] )
            , ( dropWhile isEven [1, 2, 1] == [1, 2, 1] )
            , ( dropWhile isEven [] == [] )
            , ( dropWhile isEven [2, 4, 100000, 1] == [1] )
            , ( dropWhile ((>) 5 ) (List.range 1 10) == [5, 6, 7, 8, 9, 10])
            , ( dropWhile ((>) 50 ) (List.range 1 10) ==[])
            ]

isOdd x = modBy 2 x /= 0
isEven x = modBy 2 x == 0
```

# 正答例
→ [Extra 1 Solution](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/e01.html)

# コメント
これ通称『すごいH本』にあった関数だよなぁ... と思った｡まぁ､いいか｡
海外からPerlのURLにアクセスできない？

# はじめに
AtomでLatexの日本語環境を作ろうとした際に必要となったPerlのダウンロードがうまくいかなかったので、その解決策をシェアします。

日本語環境作りは[この記事](https://qiita.com/tomochiii/items/152160a9915fb7b2146c)に従って行いました。

# 環境
今回は出先のシンガポールにて作業をしていました。
OSはWindows 10になります。

# 問題
Perlのインストールのために、(http://strawberryperl.com/) へアクセスしようとしたのですが、アクセスができませんでした。

# 解決策
所属している日本の大学のVPNを使用することでURLにアクセスすることができるようになり、次のステップに進めることになりました。
海外からLatexの日本語環境を作ろうとしている方で同じように詰まってしまった方は参考にしてみてください。
99 PSiE [Problem 7]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日さわることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Flatten a nested lists into a single list.
([Problem 7](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p07.html) を改変)

# 成果物
```elm
import Html

main = Html.text <| Debug.toString <| flatten [['a'],['b','c'],['d','e','f']]

flatten list = List.foldr (\y ys -> y ++ ys ) [] list
```

# 正答
なし

# コメント
問題文を読んでも全く意味がわからなかったので､ Ruby 言語でいうところの  [['a'],['b','c'],['d','e','f']].flatten を Elm 言語でやれって話なんでしょ､って勝手に自己解釈して書いた｡アルゴリズムを解釈していないのがバレるが､正答を読んでも意味不明だったので仕方ないよね...

# P.S.
同じようなことは `List.concat` を使ってもできるようだ｡
市町村名に「市or町or村」の文字を含む市町村のリスト。の作り方。

住所を表す文字列から市区町村を抽出したい，という場面があろうかと思います。
手っ取り早く思いつく手段としては，`/[都道府県].+[市区町村]/`といった正規表現を用いることです。
が，この方法，たとえば 東京都東**村**山(市) のように，市区町村の名称に「市」「町」「村」の文字を含む地方公共団体があるため，失敗します（ちなみに東村山(市)繋がりで言えば，沖縄県に「東村」という村があります。）。
そこで，たとえば簡単な正規表現で`match`した文字列について，このような *市町村名が`[市町村]`を含む市町村のリスト* に引っかからないかチェックする，といったロジックが考えられます。（全部を正規表現で処理すると大変なので…。）
ということで，そのようなリストを作ってみましょう。

# 「全ての市町村のリスト」は総務省が持っている。
今日現在，全国には1,724の市町村と23の特別区があるそうですが（→[政府統計](https://www.e-stat.go.jp/municipalities/number-of-municipalities)），全ての市区町村には6桁の**[地方公共団体コード](http://www.soumu.go.jp/denshijiti/code.html)**が振られており，そのコードの一覧表が，総務省のWebサイトに置いてあります。
→ http://www.soumu.go.jp/denshijiti/code.html

そこで，上記リンク先からExcelファイルをダウンロードして使います。
もっとも，Excelのままだと使いにくいので，中のシートをCVSファイルとして書き出しておきます。
（「平成30年10月1日現在」とのことなので，*市町村コード20181001.csv*とでもしておきます。）

# CSVファイルをgrepする。
こうして取得した全市町村名リストから，*市町村名に`[市町村]`を含む市町村* を抽出してみましょう。
ファイルの中身は，１行に

```
6桁の数字,都道府県名,市町村名,都道府県名半角カナ,市町村名半角カナ,,
```
という内容なので，これを前提にgrepすればOK。
## 簡単なバージョン
とりあえず，私はこんな感じにしました。

```sh
$ grep -E ",[^,]*[市区町村][^,]*[市区町村]," 市町村コード20181001.csv 
=>
014087,北海道,余市町,ﾎｯｶｲﾄﾞｳ,ﾖｲﾁﾁｮｳ,,
043222,宮城県,村田町,ﾐﾔｷﾞｹﾝ,ﾑﾗﾀﾏﾁ,,
062081,山形県,村山市,ﾔﾏｶﾞﾀｹﾝ,ﾑﾗﾔﾏｼ,,
072117,福島県,田村市,ﾌｸｼﾏｹﾝ,ﾀﾑﾗｼ,,
093441,栃木県,市貝町,ﾄﾁｷﾞｹﾝ,ｲﾁｶｲﾏﾁ,,
104647,群馬県,玉村町,ｸﾞﾝﾏｹﾝ,ﾀﾏﾑﾗﾏﾁ,,
122033,千葉県,市川市,ﾁﾊﾞｹﾝ,ｲﾁｶﾜｼ,,
122190,千葉県,市原市,ﾁﾊﾞｹﾝ,ｲﾁﾊﾗｼ,,
132098,東京都,町田市,ﾄｳｷｮｳﾄ,ﾏﾁﾀﾞｼ,,
132136,東京都,東村山市,ﾄｳｷｮｳﾄ,ﾋｶﾞｼﾑﾗﾔﾏｼ,,
132233,東京都,武蔵村山市,ﾄｳｷｮｳﾄ,ﾑｻｼﾑﾗﾔﾏｼ,,
132276,東京都,羽村市,ﾄｳｷｮｳﾄ,ﾊﾑﾗｼ,,
152102,新潟県,十日町市,ﾆｲｶﾞﾀｹﾝ,ﾄｵｶﾏﾁｼ,,
152129,新潟県,村上市,ﾆｲｶﾞﾀｹﾝ,ﾑﾗｶﾐｼ,,
163228,富山県,上市町,ﾄﾔﾏｹﾝ,ｶﾐｲﾁﾏﾁ,,
172120,石川県,野々市市,ｲｼｶﾜｹﾝ,ﾉﾉｲﾁｼ,,
193461,山梨県,市川三郷町,ﾔﾏﾅｼｹﾝ,ｲﾁｶﾜﾐｻﾄﾁｮｳ,,
202126,長野県,大町市,ﾅｶﾞﾉｹﾝ,ｵｵﾏﾁｼ,,
242021,三重県,四日市市,ﾐｴｹﾝ,ﾖｯｶｲﾁｼ,,
284424,兵庫県,市川町,ﾋｮｳｺﾞｹﾝ,ｲﾁｶﾜﾁｮｳ,,
294438,奈良県,下市町,ﾅﾗｹﾝ,ｼﾓｲﾁﾁｮｳ,,
342131,広島県,廿日市市,ﾋﾛｼﾏｹﾝ,ﾊﾂｶｲﾁｼ,,
414239,佐賀県,大町町,ｻｶﾞｹﾝ,ｵｵﾏﾁﾁｮｳ,,
422053,長崎県,大村市,ﾅｶﾞｻｷｹﾝ,ｵｵﾑﾗｼ,,
```
ということで，24の地方自治体が抽出できたので，あとはこのリストを適当に整形して使えばOK。

## 先頭２文字が市町村である場合は除外するバージョン
ところで，上記のリストから分かるように，現在，市町村名に市町村の文字が含まれる市町村の市町村名は，全て３文字以上です。
ということは，除外のロジックを組む際には，住所文字列の３文字目以降に市町村の文字がある場合にリストをチェックする，という手法も考えられます。
市町村名の３文字目以降に市町村の文字を含む市町村，抽出してみましょう。

```sh
$ grep -E ",[^,市町村]{2,}[^,]*[市区町村][^,]*[市区町村]," 市町村コード20181001.csv 
=>
132233,東京都,武蔵村山市,ﾄｳｷｮｳﾄ,ﾑｻｼﾑﾗﾔﾏｼ,,
152102,新潟県,十日町市,ﾆｲｶﾞﾀｹﾝ,ﾄｵｶﾏﾁｼ,,
172120,石川県,野々市市,ｲｼｶﾜｹﾝ,ﾉﾉｲﾁｼ,,
242021,三重県,四日市市,ﾐｴｹﾝ,ﾖｯｶｲﾁｼ,,
342131,広島県,廿日市市,ﾋﾛｼﾏｹﾝ,ﾊﾂｶｲﾁｼ,,
```
地方自治体の数が5つに絞られました。これなら，コードの冒頭にリストを付けても目立たないかも。
ちなみに，「武蔵(村)」「十日(町)」「野々(市)」「四日(市)」「廿日(市)」という市町村は存在しないので，たとえば「武蔵村」にmatchする場合は，市町村名が「武蔵村山市」であると断定できます。
（ちなみに東京都**東村山市**は沖縄県**東村**と被るので，先頭**１**文字が市町村である場合を除外したリストだと，上記のロジックは使えないかもしれません。）

気を付けたいのは「市町村名に市町村の文字が含まれる市町村の市町村名が全て３文字以上である」というのは，今日現在たまたまそうであるに過ぎないことです。
もし将来，市町村の合併等で「村(市)」のような市町村が誕生した場合には，上記のような縮小版リストを前提にしたロジックが死ぬ可能性がある点は留意しましょう。
（本稿が，単にリストを掲載するのではなく，リストの作り方を記事化しているのも，市町村名の変更に応じてリストを更新できるようにするためです。）
~~「市町村名に市町村が含まれる市町村」の志布志市志布志感はわざとです。~~
Enjoy!

#追記（余談）：「郡」を含む市町村

```sh
grep 郡 市町村コード20181001.csv
=>
072036,福島県,郡山市,ﾌｸｼﾏｹﾝ,ｺｵﾘﾔﾏｼ,,
212199,岐阜県,郡上市,ｷﾞﾌｹﾝ,ｸﾞｼﾞｮｳｼ,,
232149,愛知県,蒲郡市,ｱｲﾁｹﾝ,ｶﾞﾏｺﾞｵﾘｼ,,
284815,兵庫県,上郡町,ﾋｮｳｺﾞｹﾝ,ｶﾐｺﾞｵﾘﾁｮｳ,,
292036,奈良県,大和郡山市,ﾅﾗｹﾝ,ﾔﾏﾄｺｵﾘﾔﾏｼ,,
402168,福岡県,小郡市,ﾌｸｵｶｹﾝ,ｵｺﾞｵﾘｼ,,
```
99 PSiE [Problem 6]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日さわることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Determine if a list is a palindrome, that is, the list is identical when read forward or backward.
(引用元: [Problem 6](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p06.html))

# 成果物
```elm
import Html

main : Html.Html a
main =
    Html.text
        <| case test of
            0 -> "Your implementation passed all tests."
            1 -> "Your implementation failed one test."
            x -> "Your implementation failed " ++ Debug.toString x ++ " tests."


test : Int
test =
    List.length
        <| List.filter ((==) False)
            [ isPalindrome [ 1, 3, 5, 8, 5, 3, 1 ] == True
            , isPalindrome [ 2, 1 ] == False
            , isPalindrome [ 1 ] == True
            , isPalindrome [] == True
            , isPalindrome [ "aa", "bb", "aa" ] == True
            , isPalindrome [ "aab", "b", "aa" ] == False
            ]

-- My solution 1.
isPalindrome_ list =
    list == List.reverse list
-- 最初は中央と左右にわけて､左右比較するという方法を思いついたが､普通にひっくり返した方楽なことに気がついてこういう形となった

-- Their Solution 2
isPalindrome list =
    let
        halfLength = List.length list // 2
        left = List.take halfLength list
        right = List.take halfLength (List.reverse list)
    in
        right == left
```

# 正答
=> [Problem 6 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s06.html) 

# コメント
Haskell みたいな !! がないのは不利かと思っていたが､そうでもないみたいですね｡

# P.S.
なぁ､思わないか? Vue や React なんかが全盛の昨今よりも､あの jQuery の時代のほうがマシだったと｡むしろ Html なんて､jQuery ぐらいで終わらせておくべきだったと｡
99 PSiE [Problem 5]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日さわることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Elm provides the function List.reverse to reverse the order of elements in a list. See if you can implement it.
(引用元: [Problem 5](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p05.html))

# 成果物
```elm
import Html

main : Html.Html a
main =
    Html.text
        <| case test of
            0 -> "Your implementation passed all tests."
            1 -> "Your implementation failed one test."
            n -> "Your implementation failed " ++ Debug.toString n ++ " tests."


test : Int
test =
    List.length
        <| List.filter ((==) False)
            [ myReverse_ [1, 2, 3, 4] == [4, 3, 2, 1]
            , myReverse_ [2, 1] == [1, 2]
            , myReverse_ [1] == [1]
            , myReverse_ [] == []
            , myReverse_ [ 'a', 'b', 'c' ] == [ 'c', 'b', 'a' ]
            ]

-- My solution 1
myReverse list =
    case list of
        [] -> list
        x::xs -> myReverse xs ++ [x]

-- My solution 2
myReverse_ list = List.foldr (\y ys -> ys ++ [y]) [] list


```

# 正解
=> [Problem 5 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s05.html) 

# コメント
List.foldr と List.foldl の良い勉強になった｡
Vue.jsでbackground-imageを指定する

ちょっと手間取ったのでメモ

API叩いて画像のURLを取得・表示するサンプル抜粋

```vue
<template>
  <div v-if="image_src">
    <!-- ここ！ -->
    <div :style="{ backgroundImage: 'url(' + image_src.url + ')' }"></div>
  </div>
  <div v-else>
    <p>no image</p>
  </div>
</template>

<script>
export default {
  computed: {
    image_src(){return this.$store.state.image.url}
  },
}
</script>
```
Elixir~Enum.reduceの威力~

# こんな式を覚えた

```elixir
iex> 1..100 |> Enum.map(& &1 * 2) |> Enum.filter(& &1 <= 100) |> Enum.reduce(0, fn x, acc -> x + acc end)
2550
```

#  式の解説

1..100は簡潔にいって1から100の整数の羅列の省略形です。
これにパイプライン演算子とEnum.mapを挟んですべてに2をかけている。
そしてEnum.filterで100以下の数値だけをフィルターにかけて拾ってくる。
そして、Enum.reduceで各要素の総和を求める。2550。

まとめると、

**1から100までのすべての偶数の総和**

という式になります。

# 編集後記

ただの式の解説なのですが、備忘録というか、ついに自分の手でElixirを書き始めたという大いなる実感があります。
自分自身横浜を離れて直近で福岡に飛び込む予定なので、勢いを大事にしたいと思って気づきを多少粗雑なまま記事にしました。
うまずたゆまず、頑張ります。