OmniAICreator/Qiita-1.07M huggingface dataset:
C#のメモリアレンジメント

C++のとき構造体のデータのアレンジメントをよく注意しなればないですが、C#はほとんどは自動管理でやります。でも本当に何もしなくていいですか？これについて確認します。

最初は簡単な構造体を作ります。

```C#
struct MyStruct
{
	public byte a;	//1byte
	public int b;   //4byte
	public short c; //2byte
	public byte d;  //1byte
}
```

Marshal.SizeOfを利用してメモリサイズを確認したら12 bytesを返します。つまりC#は自動的に4 byteのブロックを分けています。
現在のレイアウトは下のようにアレンジメントしています。こうする見ると、この中にはすでに4 bytesの無駄スペースを発生しました。
[byte][..][..][..]
[int][int][int][int]
[short][short][byte][..]

今ブロックの長さは一番長いのintのサイズと一致ですから、intをdoubleに変わると24 Bytesになるはず。
早速確認すると、やっぱり24 bytesになりました。

```C#
struct MyStruct
{
	public byte a;	//1byte
	public double b;   //8byte
	public short c; //2byte
	public byte d;  //1byte
}
```


メモリレイアウトはこうになりました。無駄なメモリも12 bytesになりました。50％のスペースが使わないからなんかもったいないです。では、手動的にデータの順序でレイアウトを変わってみます。
[byte][..][..][..][..][..][..][..]
[double][double][double][double][double][double][double][double]
[short][short][byte][..][..][..][..][..]

はじめてのメモリレイアウトを見ると、変数a、変数cと変数dのサイズの和は4 bytesです。一緒に並びましょう。

```C#
struct MyStruct
{
	public byte a;	//1byte
	public byte d;  //1byte
	public short c; //2byte
	public int b;   //4byte
}
```

今回SizeOfで確認すると8 bytesを返します。レイアウトをコンパクトしました。無駄にさようなら！
[byte][byte][short][short]
[int][int][int][int]

そして２つのレイアウトは効率にも差があります。1000000の構造体を生成するテストプログラムを作ります。

```C#
		public struct MyStruct
		{
			public byte a;	//1byte
			public byte d;  //1byte
			public short c; //2byte
			public int b;   //8byte

			public void modify(byte a)
			{
				this.a = a;
			}
		}
		


		public class Struct2
		{
			public byte a;	//1byte
			public int b; // 4byte
			public short c; //2byte
			public byte d; //1byte
		}

		private const int Num = 1000000;
		public static void Main(string[] args)
		{
			Stopwatch sw = new Stopwatch();
			sw.Start();
			List<MyStruct> list = new List<MyStruct>();
			for (int i = 0; i < Num; i++)
			{
				list.Add(new MyStruct());
			}
			
			sw.Stop();
			Console.WriteLine("Struct1 Elapsed: " + sw.Elapsed);
			GC.Collect();
			Thread.Sleep(1000);
			sw.Restart();
			var list2 = new List<Struct2>();
			for (int i = 0; i < Num; i++)
			{
				list2.Add(new Struct2());
			}
			sw.Stop();
			Console.WriteLine("Struct2 Elapsed: " + sw.Elapsed);
		}
```

リザルト

```
Struct1 Elapsed: 00:00:00.0208816
Struct2 Elapsed: 00:00:00.0616822
```

構造体だけではなく、クラスにも同じ原理です。日常のプログラミングには特にメモリレイアウトを書きながら変数を移動しなくてもいいです。ただ、同じタイプの変数を一緒に並ぶと無駄を結構減っています。
今時のコミュニケーション 一般化しつつある チャット (+∞) ツール Slack / Discord

__非同期コミュニケーション__ が肝です。

参考情報は [トリセツ \(ITの人達編\) \- Qiita](https://qiita.com/szf/items/5b624eb104a00caa4927#%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) をご参照下さい。

## [TED] ジェイソン・フリード：なぜ職場で仕事ができないのか

[開発フロー研修 @ Wantedly \- Qiita](https://qiita.com/awakia/items/c571e93e96a1ec28044f)
で紹介されているTEDのトークがあります。とても分かりやすいので是非ご覧下さい。日本語字幕も完備です。

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/74939/e409c5bb-dc8f-1b9e-8e4b-13a227ebb79c.png)](https://www.ted.com/talks/jason_fried_why_work_doesn_t_happen_at_work?language=ja)

TED [ジェイソン・フリード：なぜ職場で仕事ができないのか \| TED Talk](https://www.ted.com/talks/jason_fried_why_work_doesn_t_happen_at_work?language=ja)

Watenlyさんの投稿自体も素晴らしいのですがいかんせんIT寄りですのでIT系のエンジニアでも読者を選ぶレベルではあります。


# Slack

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74939/f1767387-c36c-852c-c8db-c20a401aef1f.png)

## Slackとは

Slackは日本国内の組織でも大分一般化してきており、その利点などについて語られている記事も多く存在します。私自身既にあるものの焼き直しは好まないのでリンクの紹介とさせて頂きます。


- [なぜSlackを導入するのか、メールとは何が違うのか、他の選択肢はないのか \- Qiita](https://qiita.com/will_meaning/items/21a88ec0b61435e8652f)


# Discord

Slackは確かに素晴らしいツールの一つです。しかし無料プランでは有料プランのような十分な活用が出来ません。

そこで、お薦め出来るサービスがDiscordです。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/74939/6cca7f9d-cc4a-db3f-2521-28f3a4f5924b.png)


コミュニケーション系サービスというものは

「先輩達がいるとウザいので別のもの使おうぜ」

の繰り返しです。mixiしかり、Faebookしかり、これは現実です。

その流れもあって2018年の今お薦め出来るSlackではないSlackのようなサービスがDiscordです。

## Discord とは

Discordも既に一定の支持を得ているサービスですので関連記事もそれなりに存在します。


- [Slackユーザ向けにDiscordの概要を説明する \- Qiita](https://qiita.com/allegrogiken/items/8484b63826244b6e2106)
- [チャットワーク（Chatwork）とSlackどちらを採用すべき？2大チャットツールを徹底比較！ \- 社内SNS \| ボクシルマガジン](https://boxil.jp/mag/a110/)
- [Discordをみだりに採用されると困る \- Qiita](https://qiita.com/nekova/items/ffe7b3620334530e6bb4)



## Discord 本当に良いものなの?

既に一部企業などはユーザーとのコミュニケーションチャネルとしてDiscordを利用しています。
Slackは無料プランでも十分利用出来るものですが有料プランで利用出来る各機能はさらに素晴らしいものです、しかしお高い。Slackは既に有料プランで十分に成り立っているので今以上に無料プランが優遇されることは無いでしょう。

Slackを無料プランで利用する際の一番辛いところは閲覧可能なメッセージ数の制限です。Facebookやその他のSNS程度の頻度でのコミュニケーションを望むのであればSlackの無料プランでも十分かと思います。むしろお薦め出来ます。

ただ、かなりの頻度でコミュニケーションが発生している、外部サービス連携を存分に利用したい、と言う方にとってはDiscordは有力な選択肢となり得るでしょう。




## Discord ってそもそもどんな感じなの?

説明割愛しますが、 [Twitch](https://www.twitch.tv/) というゲーム実況プラットフォームがあります。
ITにある程度詳しい方向けの表現となりますが、[Amazon Web Services \(AWS\) \- Cloud Computing Services](https://aws.amazon.com/?nc2=h_lg) ですら現在はストリーミング、動画アーカイブ配信にTwitchを利用している時代です。
DicsordはTwitch同等に利活用される可能性を有するサービスだと思います。

いくつかの利用例を挙げておきます

- [PokemonGoNews](https://discordapp.com/channels/394100660083359754/)
    - [Pokémon GO](https://pokemongolive.com/) のユーザーグループです
- [HasuraHQ](https://discordapp.com/channels/407792526867693568/)
    - [Hasura](https://hasura.io/) というサービスの公式コミュニケーションチャネルです
- [Infrastructure Workshop](https://discordapp.com/channels/201963297967177728/)
    - [インフラ勉強会 – 日本最大級のオンライン勉強会＆コミュニティ](https://wp.infra-workshop.tech/) の公式コミュニケーションチャネルです




Slackに飽きた人は是非お試し下さい。
NEOの開発者向けツールリスト

#はじめに
日本ではNEOの開発者は少ないですがメモ程度にツールリストを残しておきます。

#ノード（クライアント）
- [NEO-GUI](https://github.com/neo-project/neo-gui/releases)
- [NEO-CLI](https://github.com/neo-project/neo-gui/releases)
- [neo-gui-developer](https://github.com/neo-project/neo-gui/releases)
- [neo-python](https://github.com/neo-project/neo-gui/releases)

#explorer（ネットワーク監視）
- [NEO Tracker](https://neotracker.io)
- [NEOSCAN](https://neoscan.io)
- [NEOMON](http://monitor.cityofzion.io)

#コントラクト開発
- [neo-debugger-tools](https://github.com/Relfos/neo-debugger-tools)
- [Visual Studio](https://visualstudio.microsoft.com/ja/)
- [neo-compiler](https://github.com/neo-project/neo-compiler)

#ウォレット
- [Neo Wallet](https://neonwallet.com)
- [SEA Wallet](https://otcgo.cn/download/)
- [Aphelion Wallet](https://github.com/aphtoken/aph-wallet-gui/releases)


#最後に
新たに良いものが見つかったら追記していきたいと思います。
また、おすすめツールがあれが教えていただけると嬉しいです。
rails server  の際に　configuration.rb:58:in `load_defaults': stack level too deep (SystemStackError)　とエラーが出た。

環境構築してる際に下記エラーが出て詰まりました。

```
コマンド: rails server
/home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:58:in `load_defaults': stack level too deep (SystemStackError)
        from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:74:in `load_defaults'
        from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:74:in `load_defaults'
        from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:74:in `load_defaults'
        from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:74:in `load_defaults'
        from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:74:in `load_defaults'
        from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:74:in `load_defaults'
        from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:74:in `load_defaults'
        from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:74:in `load_defaults'
         ... 11899 levels...
        from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:65:in `require'
        from /home/vagrant/early_rise/bin/spring:15:in `<top (required)>'
        from bin/rails:3:in `load'
        from bin/rails:3:in `<main>'
```

一番行数の多いこいつから調べていきます。
```
from /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb:74:in `load_defaults'
```

```
$vim /home/vagrant/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/railties-5.1.6/lib/rails/application/configuration.rb
```

/load_defaultを入力後エンターで検索できます。
74行目ですね。

```
load_defaults "5.1"
```
検索したところ、コメントアウトすれば大丈夫だそうですのでコメントアウトします。

```
# load_defaults "5.1"↲
```

これで再びrails serverを実行すると...

```
$rails server
=> Booting Puma
=> Rails 5.1.6 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.9.1 (ruby 2.4.1-p111), codename: Private Caller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

なんとかなりました。
PHPでAWS Lambdaを使ってみる

## 概要
この記事は[Serverless2 Advent Calendar 2018
](https://qiita.com/advent-calendar/2018/serverless2)の19日目の記事になります。

ずっとLambdaについて気になっていたのですが、PHPが対応していない故に手を出せない状態でした。
そんな中、[たぶん月刊PHPニュース 2018年11月27日号 \| 株式会社インフィニットループ技術ブログ](https://www.infiniteloop.co.jp/blog/2018/11/php-news-5/)でPHP用のサーバレスフレームワークが紹介されていたので、試していきます。

2021/08/17更新
2021年に改めて調べた内容を下記にまとめました。
記事の内容は古いので、こちらを参照いただればと思います。

https://juve534.hatenablog.com/entry/2021/08/04/231217

## 事前準備
事前にPHPとComposer、Node.jsが動く環境を用意しておいてください。
Composerが早くなるらしいので、下記のライブラリもインストールすると良さそうです。   

[composerを速くするプラグイン・prestissimoを作った: Architect Note](http://blog.tojiru.net/article/432944706.html)

## 導入
[README](https://github.com/mnapoli/bref)に従って進めます。  

### 1.serverlessの導入
```
npm install -g serverless
```

### 2.AWSの準備
Lambdaを実行できる準備をします。
事前にアクセスキーを発行してください。

```:tips
ここで設定するアカウントはAdmin権限のものでは動きませんでした。  
IAMでLambdaの権限を与えたアカウントに設定が必要そうです。
```

```bash:awscliのインストール
# yum install -y python-pip
$ pip install awscli --user
```
awscliを導入したら、アクセスキー等を設定します。

```bash
$ aws configure
AWS Access Key ID [None]: 作ったやつを入力
AWS Secret Access Key [None]: 作ったやつを入力
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
これでawsの準備はOKです。

### 3.brefを導入
```php
composer require mnapoli/bref
vendor/bin/bref init
```

<img width="842" alt="success.png" src="https://qiita-image-store.s3.amazonaws.com/0/39671/1029f4cd-ebd4-46e0-9057-21d034c39a56.png">


initとすると下記のファイルが生成される。 
 
```php:bref.php
<?php declare(strict_types=1);

require __DIR__.'/vendor/autoload.php';

λ(function (array $event) {
    return [
        'hello' => $event['name'] ?? 'world',
    ];
});
```

λは下記の省略形で、本格的に書くと下記になります。

```php
$app = new \Bref\Application ; 
$app->simpleHandler(function (array $event) {
    return [
        'hello' => $event['name'] ?? 'world',
    ];
});
$app->run();
```

### 4.brefをデプロイ
先程 `init` したディレクトリ配下で、下記Commandを実行します。  
正常にデプロイが終われば準備完了です。

```
$ vendor/bin/bref deploy
Serverless: Packaging service...
(以下略)
Deployment success
```

記載されているendpointにアクセスすると、下記の画面が表示されました。
これで準備は整ったようです。

![browser.png](https://qiita-image-store.s3.amazonaws.com/0/39671/f11b496c-8ef0-35d5-d8a4-966eba12d3bc.png)

まだAWS Lambdaの箇所に、今回デプロイしたプログラムがありました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/39671/408224c2-8316-fc96-dd12-f18b5ae69d19.png)

CLIで試しに実行してみます。  
`vendor/bin/bref invoke` を実行して、 `hello world` が表示されれば問題ありません。

```bash
$ vendor/bin/bref invoke
{
    "hello": "world"
}
```

ちなみにローカルで実行するときは、普通にphpコマンドを実行で良いようです。

```bash
$ php bref.php bref:invoke
{
    "hello": "world"
}
```

これでPHPからAWS Lambdaを使う準備が整いました。  
`bref` は `Composer` でインストールできるので、実際に導入する際は他のライブラリやFWと連携して使うと良さそうです。

## 参考

* [bref](https://github.com/mnapoli/bref)
Macのgitignoreで、簡単にUserInterfaceState.xcuserstateを差分としない方法

#### 今回の方法は、既にプロジェクトがある場合に、UserInterfaceState.xcuserstateを差分としない方法です。


所定のリポジトリで、Macのターミナル操作

```
touch .gitignore
```
続けて

```
vi .gitignore
```

iを押して、編集モード

```
.DS_Store
*.swp
UserInterfaceState.xcuserstate
```

:wqで閉じる。コミットしてgitignoreをpush後


#### UserInterfaceState.xcuserstateがある一つ上の階層をshow in Finderでファイルをターミナルにドラッグ&ドロップしてEnter

```
git rm --cached  ファイルをドラッグ&ドロップするとPathが自動で記載されます。
```
続けてEnter

```
git commit -m "removed cache."
```
push
#### これで毎回差分として、出現するUserInterfaceState.xcuserstateが出現しなくなります。
iOS&Androidアプリの画像リソースの分け方

# リンク
[画像サイズと解像度の種類一覧](https://blog.excite.co.jp/spdesign/19798730/)
[解像度ごとにつけるsuffix](https://qiita.com/Omoti/items/772fb1227dd6190fc925)
[アイコンの画像リソース設定方法](https://naochael-jordan.github.io/blog/2018-11-23-react-native-change-app-icon/)
【もげぞうβ】trivial-gamekitのチュートリアルやる

# PeerCast プログラミング配信 Advent Calendar 2018 12/18

どうも、もげぞうです。
[以前](https://qiita.com/fusuya/items/d3344c77f2a214209973)は、bind-cursor関数で詰んだと言ってましたが、謎が解けました。  
どうやら、gamekit:start してアプリ起動してからbind-cursorとかしないとだめっぽいです。  
なので


```cl
(progn
  (gamekit:start 'hoge)
  (gamekit:bind-cursor ～～～～))
```
みたいにして起動したらちゃんと動きますた。  
こんなんでいいのかはわからない。
簡素なslack botをCloudFormationで素早く作る

この記事は [AWS初心者 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/aws_beginner) 17日目の記事です。

# 概要

lambda + APIGatewayでslack botを作る際にAWSコンソールから設定してくいのがめんどくさかったのでCloudFormationのテンプレートで実現してみました。
channelで"ping"と打つと"pong"と反応する簡単なbotの例でご紹介します。

# テンプレート

スタックを作る際に参照するので、適当な名前でローカルに保存しておいてください。
https://gist.github.com/tenmihi/6132f8140c6d3ef279bddaba175b5c47

# botを動かすまでの手順

## Slack Apiを設定する 1
<img width="400" alt="スクリーンショット 2018-11-08 00.37.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/102294/38eb9f27-be10-ab10-08ab-6ebb9cda20bd.png">
https://api.slack.com/apps のCreate New AppからSlack Appを作ります。

<img width="400" alt="スクリーンショット 2018-12-05 01.26.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/102294/1f624c0e-8551-1445-c7bd-9d7dbee18859.png">

Basic Information > Add features and functionalityアコーディオンのPermissionを選びます。

<img width="400" alt="スクリーンショット 2018-12-05 01.26.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/102294/e4b02c71-b179-b93a-c0af-8734a6d00673.png">

Scopesから"chat:write:bot"のpermission scopeを割り当ててSaveします。
割り当てた終わったら、同じくPermissionsの設定ページのOAuth Tokens & Redirect URLs からinstall app to workspaceでAppをインストールします。

![スクリーンショット 2018-12-05 01.35.57.png](https://qiita-image-store.s3.amazonaws.com/0/102294/0a026508-cf45-da1c-b8bf-8d8d762c01f6.png)

インストール後にOAuth tokenが取得されていればOKです。

## CloudFormationでスタックを作成する

<img width="600" alt="スクリーンショット 2018-12-05 01.40.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/102294/24ddc609-1ec9-cdea-05b1-2d469a9e8c12.png">

AWSコンソールからCloud Formationを選んでスタックの作成を行います。
ローカルファイルに保存しておいたものをテンプレートに指定します。

![スクリーンショット 2018-12-05 01.42.23.png](https://qiita-image-store.s3.amazonaws.com/0/102294/8453a382-b95f-a1fc-dcdc-238c77d9e7ea.png)

スタック名は適当で、SlackBotUserOAuthAccessTokenには先程取得したOAuth Tokenを入力します。
このあと途中IAMロールの作成で注意が出ますが、チェックボックスを入れてスタックの作成をすれば大丈夫です。

![スクリーンショット 2018-12-05 01.45.56.png](https://qiita-image-store.s3.amazonaws.com/0/102294/06a44c7c-1976-7f61-b629-4aeaa3127520.png)

作成を始めたスタックの状況がCREATE_COMPLETEになったら、スタック名をクリックしてスタックの詳細ページに飛びます。
出力アコーディオンからApiEndpointが確認できればスタックの作成はOKです。

## Slack Apiを設定する 2

Basic Information > Add features and functionalityアコーディオンのEvent Subscriptionsを選びます。

![スクリーンショット 2018-12-05 01.53.56.png](https://qiita-image-store.s3.amazonaws.com/0/102294/522213d1-5923-00db-6b15-8ccbec2b3edf.png)

右上のボタンから機能そのものをEnableしたあとに、Request URLにさきほど確認したApiEndpointの値を入れます。ローディング後に緑のチェックマークが付くはずです。
さらに、Add Workspace Eventからmessage.channelsを追加して、左下のsaveで設定を保存します。

保存するとパーミッションが変わって再インストールが求められる(黄色いnotificationが飛んでくる)ので再インストールを行います。以上でBotの設定はおしまいです。

## テストする

<img width="249" alt="スクリーンショット 2018-12-05 01.55.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/102294/d74bf239-cbb2-f5f6-5b3a-43f6f2073c87.png">

適当なチャンネルで ping > pong が帰ってくればOK。
あとは、lambdaのコンソールに行って直接書き換えるなり、短ければtemplateのZipFileの部分を書き換えて自分のbotを作ることができます。


## さいごに
AWSでApi GatewayやLambdaなんかを1つ1つ設定すると管理がしにくいんですが、Cloud Formationを使ってスタック管理でできると要らなくなったときに一気に消せたりして便利です。またbotくらい簡単な関数であればtemplateにソース直書きでここまで完結するのは良いですね。

記事の公開遅くなってすいませんでした :bow:
明日は flat-8-kiki さんです!
Dialogflowのhistoryをcsvで出力する方法

# Dialogflowのhistory(会話のログ)をcsvで出力する方法
Dialogflow触ってるんですけど、history(会話のログ)をどうにかしてCSVで吐き出す方法がないのか探してみました。

# やり方：chromeの検証機能のXHRを利用する
1. Dialogflowのconsoleを開く
2. 左側のメニューからHistoryを選択
3. 範囲と１ページに表示させるログ数を指定
4. Chormeの検証画面を開く
5. Networkタブを開く
6. XHRタブを開く
7. その状態でページをreload
8. コネクションの中の"conversations2?startTime..."を選択する
9. Responseウィンドウを選択する
10. JSON形式でResponseが返答があるので、その内容をコピー
11. CSVに変換

## CSV変換ツール
なんでもいいんですが、こういう変換ツール使うといいかもです。
https://json-csv.com/
AWS LambdaからABEJA Platformの推論APIを呼び出す方法

AWS LambdaからABEJA Platform上にデプロイしたHTTP Serviceで推論する方法です。

# 前提
ABEJA Platform上でHTTP Serviceを立てていること。
まだの場合は [ABEJA Platform Advent Calendar 2018](https://qiita.com/advent-calendar/2018/abejaplatform) を参考に立ててください。

# 概要
ABEJA Platformの推論は、ただ単にAPIに対してHTTPリクエスト投げるだけです。
今回はLambdaでPythonのrequestsを使って投げます。

# 手順
まず、LambdaでHTTPリクエストを投げるためにrequestsを導入します。
ローカルでrequestsをダウンロードします。

```
mkdir lambda_requests
cd lambda_requests
pip install requests -t ./
```

そしてLambda用のコードを書きます。

```
vim lambda_function.py
```

```:lambda_function.py
import json
import requests

# 今回はWeb上にある画像をそのまま使っています。
# Lambdaから利用する場合はS3などの画像を扱ったりするかと思います、
sample = "https://console.abeja.io/images/cat_thumb.jpg"
data = requests.get(sample).content

def lambda_handler(event, context):
    url = "https://{}.api.abeja.io/deployments/{}".format(os.environ["ORGANIZATION_NAME"], os.environ["DEPLOYMENT_ID"])
    user = "user-{}".format(os.environ["ABEJA-PLATFORM-USER"]
    token = os.environ["PERSONAL-ACCESS-TOKEN"]
    payload = data
    headers = {
        'Content-Type': 'image/jpeg',
    }

    r = requests.post(url, data=payload, auth=(user, token), headers=headers)
    
    return r.text
```
"ORGANIZATION_NAME"、"DEPLOYMENT_ID"、"ABEJA-PLATFORM-USER"、"PERSONAL-ACCESS-TOKEN"はLambdaに設定した環境変数から呼び出すようにしています。
コードや操作が複雑になるのと連携の趣旨から外れるため記載していませんが、Tokenに関しては環境変数よりKMSに入れた方が安全です。

出来上がったら、zip化します。

```
zip -r lambda_function.zip ./
```

Lambdaの関数を作成の際に以下の通りに進めます。

- 関数の作成
- 一から作成
    - 関数名: 好きな関数名
    - ランタイム: Python2.x or Python3.x
    - ロール: 権限は必要ないので適当なもの
- 関数コード
    - 「zipファイルをアップロード」を選択し、先ほどのzipファイルをアップロード
    - ハンドラ: lambda_function.lambda_handler
- 基本設定
    - タイムアウト: 30秒ほど
- 環境変数
    - "ORGANIZATION_NAME"、"DEPLOYMENT_ID"、"ABEJA-PLATFORM-USER"、"PERSONAL-ACCESS-TOKEN" を設定

# 完了

# まとめ
たったこれだけで、LambdaからABEJA Platform上の推論APIを呼び出すことができます。
今回は画像でしたが、jsonでも少し書き換えれば実装可能です。

また、AWSを組み合わせると、S3にファイルが置かれたらLambdaを呼び出して推論APIに投げる。レスポンスをDynamoDBに書き込む。といったイベントドリブンアーキテクチャも作ることが可能です。

ぜひトライしてください。
【Ethereum】署名付きトランザクションの送信【web3.js】

Ethereumベースのウォレットの署名付きトランザクションを開発していて、ググってもちょうどいい事例が見つからず試行錯誤して動くようになったので、これからやる人が私と同じ苦しみを味わわずに済むようにここに記しておく。

# 前提
- Mac
- Node.js インストール済み
- Web3.js インストール済み
- Ganache インストール済み

上記のインストール事例はネットの海に広がっているので割愛

# Ganache上にウォレットを作成してローカルストレージに保存

## web3読み込み
```
import Web3 from 'web3'
```

## Ganacheに接続
Ganacheを起動してね

```
const web3 = new Web3('http://localhost:7545')
```

## ウォレットを１つ作成
引数はアカウントに対するウォレットの数

```
const wallet = web3.eth.accounts.wallet.create(1)
```

## ローカルストレージにウォレットを保存
keynameとpasswordは適当

```
const keyname = 'wallet'
const password = 'walletwallet'
wallet.save(password, keyname)
```

# ローカルストレージからウォレットを読み込んで署名付きトランザクションを送信

## ローカルストレージからウォレットを読み込む
保存したときと同じkeynameとpasswordを使う

```
const keyname = 'wallet'
const password = 'walletwallet'
const wallet = web3.eth.accounts.wallet.load(password, keyname)
```

## 署名付きトランザクションを作成
to: 送信先アドレス（Ganacheにデフォルトで作成されてるものでも良い）
value: 1etherをweiに変換
gas: 適当

```
const signedTx = wallet.signTransaction({
  to: '0x827E07A9652a2CfD7fDa2aa6d1a2fB08bD0cE919',
  value: web3.utils.toWei('1', "ether"),
  gas: 2000000
})
```

## トランザクションを送信
```
web3.eth.sendSignedTransaction(signedTx.rawTransaction)
```

# まとめ
web3.jsすごい！

それではみなさん良いクリスマスと良いお年を！
Railsのsanitize　初心者→中級者へのSTEP18/25

#Railsのsanitize
##はじめに
今回は`sanitize`についてです。cachingはいつやるんでしょうね...(ごめんなさい)
XSS対策において活躍する`sanitize`をご紹介します。

##XSS(クロスサイトスクリプティング)とは
XSSとはWebアプリケーションにおいて、動的にhtmlを出力する時、そのデータをエスケープしていないが為に、悪意のあるhtmlやjavascriptが紛れ込むことです。
良いサイトがあったのでご紹介します。

XSS攻撃を体験サイト
http://www.ne.senshu-u.ac.jp/~proj28-19/tasa/xss/xss1.html

上記のようにきちんと対策しないと、jsをページに埋め込むことができ、他ユーザーをいろんなサイトに飛ばしたりできるのです。

##どう対策するか
簡単です。`sanitize`を使うだけです。（htmlエスケープも対策となりますが、今回はsanitizeをご説明。）

```haml
  = sanitize "<h2>sanitize</h2><p>テスト</p>", tags: %w(h2　p)
```
最初に対象となる文字列、次に許可するhtmlタグを配列で指定します。（%wは配列を生成します。）
ちなみにsanitizeはエスケープではありません。なので例えば以下の場合、`<h1>`は消去されます。

```haml
  = sanitize "<h1>sanitize</h1><p>テスト</p>", tags: %w(h2 p)
```
今試しにqiitaの記事編集フォームで`<script>`を埋め込んでみましたが、見事に消去されてました。

また、許可する属性も設定するときは、以下のように書きます。

```haml
= sanitize "<h1>sanitize</h1><a href='test.html'>テスト</a><img src='buhi.png'>", attributes: %w(href), tags: %w(h1 a img)
```
上記の場合、href属性は許可しますがsrc属性は消去されます。

ちなみに、`tags`と`attributes`を指定しないとデフォルトの設定が採用されるのですが、デフォルトでは`<script>`などは消されますが他は、ほぼほぼ消去されません。

デフォルトはconfigで設定可能。

```config/application.rb 
config.action_view.sanitized_allowed_tags = ['strong', 'em', 'a'] 
config.action_view.sanitized_allowed_attributes = ['href', 'title'] 
```

##まとめ
ひとまず簡単なsanitizeのご紹介でした。他にもカスタマイズする方法など掘り下げれば色々あるのですが、時間がないので今日はここまでにします。


##参考にしたの

ActionView::Helpers::SanitizeHelper
https://api.rubyonrails.org/v5.1/classes/ActionView/Helpers/SanitizeHelper.html
最適化とは何だろう？


* 問題提起
   * 機械学習では、予測や分類モデルを作成する際に`最適化`が行われる。
   * 最適化とは何だろうか。
   * 以下では、厳密さをある程度犠牲にしても、誰でもイメージがつかめる視覚的な説明がしたい。

* 最適化とは何か。
   * 回帰分析における最適化
      * データAからデータBを予測する式を得るために、予測式の最適なパラメーターを得るために最適化が行われる。
         * パラメータというのは以下
            * 切片
            * 傾き
         * 適切な切片と傾きが得られれば、データAからデータBを予測できる。
      * 図1
         ![最適化_図1.png](https://qiita-image-store.s3.amazonaws.com/0/321994/a4755170-fb0d-e3a0-b4d1-bcc0689878db.png)

         * 横軸: データA(この例では身長)
         * 縦軸: データB(この例では体重)
   *  パラメーターが最適化されていない予測式の例
      * 図2
        ![最適化_図2.png](https://qiita-image-store.s3.amazonaws.com/0/321994/7cb37ee6-4f58-04af-15a2-b739bb9a849e.png)

         * 切片が不適切であるため、予測式とデータがずれてしまっている。
      * 図3
         ![最適化_図3.png](https://qiita-image-store.s3.amazonaws.com/0/321994/8c981874-e44b-0210-647f-3610c52f1605.png)

         * 傾きが不適切であるため、予測式とデータがずれてしまっている。

   * NW(ニューラルネットワーク)の例
      * NWにおける最適化とは？
         * 適切な予測や分類をするために、ノードやエッジに設定する適切なパラメーターを見つけること
            * パラメーターは以下がある。
               * エッジの重み(ノードへの入力値の重み)
               * ノードに設定するバイアス(ノードが発火するしきい値)
      * 図4
      ![最適化_図4.png](https://qiita-image-store.s3.amazonaws.com/0/321994/a5ff9f15-1022-88ca-d564-e17d0ab73094.png)

         * NWは「ノード」と「エッジ」から構成される。
            * ノード: 図4の丸
            * エッジ: 図4でノードとノードをつなぐ線
            * 一つ一つのノードは、受け取った値から出力の値を計算する。
         * ノードやエッジの構成は、様々である。(図4はNWのイメージで、エッジが省略されている)
      * NWにおける最適化
         * 図4は、「身長」「体重」「言葉遣い」から、性別を推測しようというNWである。
         * 精度の高い予測をするために、エッジの重みやノードのバイアスを適切に設定する必要がある。
         * 適切なエッジの重みやノードのバイアスを見つけることが、NWにおける最適化である。

* まとめ。最適化とは何か。
   * 目的を達成するために、最適なパラメーターの値を見つけ出すこと。
   * 機械学習において、予測や分類のためのモデルの内部的なパラメーターを設定するために使われる。
nginxのリバースプロキシー先のサーバーの挙動がおかしい時にログをとる方法

# 概要

リバースプロキシーに**nginx**を使っている事例で、HTTPSのリクエストが強制的にHTTPリクエストされてしまう現象がありました。

リバースプロキシーの設定か、アップストリームサーバーの応答がおかしいのか、調査するためのログの取り方をまとめます。

# 手順
- 下記**「設定ファイルの修正方法」**の通り設定ファイルを修正
- nginxを再起動


## 設定ファイルの修正方法

```diff:nginx.conf
http {

:

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

+    log_format upstreamlog '[$time_local] $remote_addr $host $upstream_addr '
+                           '$upstream_cache_status $upstream_status `
+                           `$upstream_http_location $request';

:

}

```


```diff:conf.d/xxxx.conf
server {
:
     access_log /var/log/nginx/xxxx_access.log main;
+    access_log /var/log/nginx/xxxx_upstream.log upstreamlog;
:
}
```
# ログフォーマットの解説
|変数名|意味|
|----|----|
|`$time_local`|ログが記録されたローカル時刻|
|`$remote_addr`|クライアント端末のアドレス|
|`$host`|次の順番で決まり記録される：リクエスト行のホスト名、リクエストのヘッダー行の"Host"からのホスト名、リクエストにマッチしたサーバー名。|
|`$upstream_addr`|アップストリームサーバーのIPアドレスとポートもしくはUNIXドメインソケットが記録されます。リクエストの処理の間に複数のサーバーが応答した場合はカンマ区切りで記録されます。<br>例： `192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock`。<br>もし、`X-Accel-Redirect` か error_pageにより、あるサーバーグループから別のサーバーグループへ内部リダイレクトががあった場合は、異なるサーバーグループのサーバーアドレスはコロンで区切られます。<br>例：`192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80`。<br>サーバーが選択できなかった場合は、サーバーグループの名前が記録されます。|
|`$upstream_cache_status`|レスポンスのキャッシュのステータスが記録されます。ステータスは次のどれかです：`MISS`,`BYPASS`,`EXPIRED`,`STALE`,`UPDATING`,`REVALIDATED`もしくは`HIT`|
|`$upstream_status`|アップストリームサーバーからの応答のステータスコードを記録します。変数`$upstream_addr`のように、複数のサーバーからの複数の応答のステータスコードはカンマとコロンで分けて記録されます。サーバーが選択されなかった場合は、変数は **502(Bad Gateway)**ステータスコードには保存されます。|
|`$upstream_http_location`|アップストリームサーバーからの応答のヘッダを記録します。応答のヘッダ`Server`は、$upstream_http_server変数で記録できます。ヘッダフィールド名から環境変数の変換ルールは、`$http_`プレフィックスからのものと同じです。最後のサーバーからの応答のヘッダーの項目のみが記録されます。|
|`$request`|もとのリクエスト行の全体が記録されます|                           

# 関連資料
- [Module ngx_http_log_module](http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format)
- [Module ngx_http_core_module](http://nginx.org/en/docs/http/ngx_http_core_module.html)
- [Module ngx_http_upstream_module](http://nginx.org/en/docs/http/ngx_http_upstream_module.html)
[iOS]予期せぬTCCAccessRequest エラーに注意

## これはSWWDC39 発表用のネタを再構成したものです

[仙台iOS開発者コミュニティ SWWDC39 - 忘年LT会 - connpass](https://swwdc.connpass.com/event/112869/)

----

## TCCAccessRequestエラー

iOS10 から実装されたセキュリティ制限

> [\[iOS 10\] 各種ユーザーデータへアクセスする目的を記述することが必須になるようです ｜ DevelopersIO](https://dev.classmethod.jp/smartphone/iphone/ios10-privacy-data-purpose-description/)

記述が無いと、容赦なくアプリが落ちます。

```
 TCCAccessRequest_block_invoke
```

----

## 使用例

カメラの使用、フォトライブラリの参照などを行う場合、info.plistに説明文の記述が必要。

* カメラ : NSCameraUsageDescription
* フォトライブラリ : NSPhotoLibraryUsageDescription

----

## 罠

* iOS SDKに用意されている、標準的な画面でも各種ユーザーデータへアクセスするものがある
* この場合でも、plistに記述がないと、容赦無くアプリが落ちる

----

## 罠1 : WKWebView

Webサイトを表示するView

<img width="150" alt="webview.png" src="https://qiita-image-store.s3.amazonaws.com/0/13070/e7f9176b-f3b6-f7c9-72ba-0f7f2f5c3b6f.png">

----

## WKWebViewで必要なアクセス権限

* NSPhotoLibraryUsageDescription ... !?
* NSPhotoLibraryAddUsageDescription ... !?

----

## Why?

* webページ内の画像を長押しすると「フォトライブラリに画像を保存」ができる
* フォトライブラリへのアクセス許可がないと、アプリが落ちる

<img width="150" alt="webview_image.png" src="https://qiita-image-store.s3.amazonaws.com/0/13070/5dabdb7c-6244-e0b2-656e-0da05c29c188.png">

----

## 罠2 : EKEventEditViewController

本体カレンダーのイベントを編集するView
<img width="150" alt="EKEventEditViewController.png" src="https://qiita-image-store.s3.amazonaws.com/0/13070/8185dfad-318c-29ea-5712-13a1501f57bd.png">

----

## EKEventEditViewControllerで必要なアクセス権限

* NSCalendarsUsageDescription ... わかる
* NSLocationWhenInUseUsageDescription ... !?
* NSContactsUsageDescription ... !?

----

## Why Location?

* カレンダーイベントの"場所"を編集できる

<img width="150" alt="EKEventEditViewController_point.png" src="https://qiita-image-store.s3.amazonaws.com/0/13070/365fe9a9-38c1-62c6-aff3-65eb35cdede0.png">


----

## Why Contact?

* カレンダーイベントの"場所"を検索するとき、"連絡先"内の住所を参照する

<img width="150" alt="EKEventEditViewController_contact.png" src="https://qiita-image-store.s3.amazonaws.com/0/13070/d58606cf-df71-407c-a8bb-12382ec40387.png">

----

### まとめ

* 一見無関係なセキュリティ許可が不足していて、アプリが落ちる場合がある
    * 「WebViewで画像を保存すると落ちる」とか、正直、わからんです
* Crashレポートに以下が出ていないか注意しましょう
    * "TCCAccessRequest_block_invoke"
laravelのクエリビルダでJOINしたら、同名カラムの値が上書きされるという事案発生

#事の顛末
LaravelのクエリビルダでJOINしてテーブルの値を持ってきたときに、JOINで結びついた２つのテーブルが同じ名前のカラムを持っていた場合、従テーブルの値で上書きされて死んだ。
みなさんもお気をつけてください。

#もっと詳しく説明
例えば、多対多の関係でUserテーブルとGroupテーブル、その関係を表す中間テーブル(User_Groupテーブル)があるとしましょう。
Userは色んなグループに所属でき、グループには複数のUserがいるって感じですね。
テーブルはこんな感じ。

■Userテーブル

|id       |name     |is_deleted|
|:-------:|:--------|:--------:|
|1        | 太郎くん  |1         |
|2        | 次郎くん  |0         |


■Groupテーブル

|id       |name     |is_deleted|
|:-------:|:--------|:--------:|
|1        | 図書委員  |0         |
|2        | 保険委員  |0         |
|3        | 体育委員  |0         |

■User_Groupテーブル（中間テーブル）

|id       |user_id  |group_id|
|:-------:|:--------|:--------:|
|1        | 1       |1         |
|2        | 2       |2         |

※id_deltedは論理削除用の適当なフラグだとでも考えてください。

こんなときに、図書委員という名前のグループに所属していて、かつis_deletedが1のUserを全て持ってきたいと思ったときにみなさんどうします？
やり方はパッと2通りあるかと思います！

その１、 whereHas関数を使う
Userモデルクラスを作成して、その中で下記のようにwhereHasを使って子テーブルのカラムを指定してあげればOKです。1対多でも多対多でも大丈夫みたいですね。

```php:UserModel.php
$userModel
->where('is_deleted',1)
->whereHas('group', function ($query) use () {
    $query->where('name', 'like', '%図書委員%');
})->get();
```
これが一番わかりやすくて良いと思うのですが、どうやらwhereHasは処理が遅いらしく、whereHasの使用を禁じてJOINを使って解決しましょうというルールを今回敷かれました。（Laravel公式でこれを使えと言ってるのですがそれは）
そこで次です。

その2、JOINで頑張る。

```php:UserModel.php
return DB::table('User')
->join('User_Group', 'User.id', '=', 'User_Group.user_id')
->join('Group', 'User_Group.group_id', '=', 'Group.id')
->where('User.is_deleted', '=', 1)
->where('Group.name', 'like', '%図書委員%')
->get();
```
Userテーブルに対して中間テーブルをJOINし、続けてGroupテーブルもJOINします。
その上でwhere条件で絞ってあげれば大丈夫でしょう。

・・・と思って返却されたコレクションの値を見たら

■返却されたコレクション

```html:返ってきたコレクションの中身
#items: Collection {#2384 ▼
  #items: array:1 [▼
    0 => {#2380 ▼
      +"id": 1
      +"is_deleted": 0
      +"created_at": "2018-04-17 19:22:00"
      +"updated_at": "2018-04-17 19:22:00"
      +"group_id": 1
    }
  ]
}
```

**あれ！？where条件でis_deletedに1を指定して取ってきたのに、返却されてきたコレクションにはis_deletedが0で入ってる！！**


どうやらGroupテーブルにある同一カラム(is_deleted)の値で上書きされてしまっているようです。こんなん引っ掛かるよ...
これの詳しい仕組み知っている人いたら教えてください〜〜〜！！

#解決策
selectする値を明示的に指定する

```php:UserModel.php
return DB::table('User')
->join('User_Group', 'User.id', '=', 'User_Group.user_id')
->join('Group', 'User_Group.group_id', '=', 'Group.id')
->where('User.is_deleted', '=', 1)
->where('Group.name', 'like', '%図書委員%')
->select('User.is_deleted') //これを追加
->get();
```
のように、selectを追加してどのテーブルのカラムかを明示的に指定してあげればOKでした。


whereHasがスロークエリだということですがどれくらい遅いんでしょうかねえ。。。
まあJOINを使わなきゃいけない状況に陥ったときに参考にでもどうぞ
Alamofireを使用してPOST通信しようとすると「Extra argument 'method' in call」とエラーが発生する

# Alamofireでのエラー


こんにちは。iOSアプリでAlamofireを使ってPOST通信しようとした際にタイトルのエラーが発生しました。解決するのに少し迷ったので記事にします。試した際の環境は以下の通りです。

Mac HighSierra 10.13.6
XCode 10.1
Swift 4.2 


Xcodeでの開発はほとんどした事が無いのですが、検索すれば色々な記事が出てくるので途中までは詰まる事なく処理が書けました。
以下のように書いたところ...

```swift:ApiClient.swift
let parameter = try JSONEncoder().encode(user)
Alamofire.request(apiUrl + "register", method: .post, parameters: parameter, encoding: JSONEncoding.default, headers: headers).response { response in
	guard let data = response.data else {
		return
	}
	result = try? JSONDecoder().decode(Result.self, from: data)
}

```

このようにエラーが発生します。

```swift:error
Extra argument 'method' in call
```

# 原因・解決

Alamofire.requestのparametersで指定する型は[String: Any]にしないといけないのに、JSONEncoder().encodeで返ってくる型がData型であったためエラーが発生していたようです。何故かエラー内容が「Extra argument 'method' in call」となっていたので中々気づけませんでした...。
解決策としてEncodableを拡張し、エンコードして[String: Any]で返すメソッドを追加しました。


```swift:ApiClient.swift
extension Encodable {
    func asDictionary() throws -> [String: Any] {
        let data = try JSONEncoder().encode(self)
        guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else {
            throw NSError()
        }
        return dictionary
    }
}
```

```swift:ApiClient.swift
let parameter = try user.asDictionary()
Alamofire.request(apiUrl + "register", method: .post, parameters: parameter, encoding: JSONEncoding.default, headers: headers).response { response in
	guard let data = response.data else {
		return
	}
	result = try? JSONDecoder().decode(Result.self, from: data)
}

```

# 参考

https://stackoverflow.com/questions/45209743/how-can-i-use-swift-s-codable-to-encode-into-a-dictionary
Protocol Buffers の Marshal と Unmarshal の小さなサンプル

小さいサンプルです。
Marshal と Unmarshal は同じファイル構成で、 `main.go` のロジック切り替えで違いを見てみます。

参考にした公式ページはこちらです。
[Protocol Buffer Basics: Go](https://developers.google.com/protocol-buffers/docs/gotutorial)

```bash
$ tree
.
├── main.go
└── person
    ├── person.pb.go
    └── person.proto
```

```proto
syntax = "proto3";

package person;

message Person {
  string Name = 1;
}
```

```bash
$ protoc -I=./person --go_out=./person ./person/person.proto
```


# Marshal

インスタンスを byte へ。

```golang:main.go
package main

import (
	"fmt"
	"github.com/golang/protobuf/proto"
	pb "github.com/mochizukikotaro/study-proto-marshal/person"
)

func main() {
	p := &pb.Person{
		Name: "yuki",
	}
	data, _ := proto.Marshal(p)
	fmt.Println(data)
}
```


```bash
$ go run main.go
[10 4 121 117 107 105]
```

# Unmarshal

byte からインスタンスを。

```golang:main.go
package main

import (
	"fmt"
	"github.com/golang/protobuf/proto"
	pb "github.com/mochizukikotaro/study-proto-marshal/person"
)

func main() {
	p := &pb.Person{}
	proto.Unmarshal([]byte{10, 4, 121, 117, 107, 105}, p)
	fmt.Println(p)
}
```

```bash
$ go run main.go
Name:"yuki"
```

以上となります。
クラスメソッドじゃなくて、メソッド内の selfってなんなの

```user.rb
  
def follow(other_user)
    unless self == other_user
      self.relationships.find_or_create_by(follow_id: other_user.id)
    end
  end
```

selfにはuserが代入される。つまり実行したUserのインスタンスがself(自分自身)

https://qiita.com/suzuki_koya/items/1553c405beeb73f83bbc
Haskellの($)と(.)の違い

Haskellの`$`と`.`。

``` $.hs
f $ g x =  f (g x)
```

``` ..hs
(f . g) x = f (g x)
```
どちらも同じに見えるんですけど。
Haskellを学びはじめてから、結構長い間これが分からなかったのでまとめ。

# 結論
`func x = f (g (h x))`は`$`,`.`を使うとOKのようには書けるがNGのようには書けない。

| $                         |    | .                        |    |
|:--------------------------|:--:|:-------------------------|:--:|
| `func x = f $ g $ h $ x`  | OK | `func x = f . g . h $ x` | OK |
| `func x = f $ g $ h   x`  | OK | `func x = f . g . h  x`  | NG |
| `func   = f $ g $ h`      | NG | `func   = f . g . h`     | OK |

Haskllerは綺麗なモノが大好きなので誰に教わることもなく、慣れるに従って、括弧よりも`$`、`$`よりも`.`を使うようになる気がする。

# 具体例
たとえば、

- １から１０までの数字のうち
- 奇数のものに
- すべてに２を足したうえで
- 合計して
- 印刷する

``` basic.hs
main = do
  let list = [1..10]
  let odds = filter odd list
  let plus = map (+2) odds
  let result = sum plus
  print result
```
## 括弧
括弧で書くと

``` paren.hs
print (sum (map (+2) (filter odd [1..10])))
```
## ($)
これを`$`で書き換える。
左のカッコを`$`で置き換え対応する右カッコを削る、またはひとつひとつの処理を`$`というパイプでつなぐイメージ。

``` $.hs
print $ sum $ map (+2) $ filter odd [1..10]
-- または
print $ sum $ map (+2) $ filter odd $ [1..10]
```
あえて二つ目を示した理由は次でわかる。

## (.)

今度は関数合成`.`を使う。`$`版から書き換えるなら**最後の`$`以外は**`.`に置き換えることができる。

``` ..hs
print . sum . map (+2) . filter odd $ [1..10]
```
また、最後の引数を落とすと、この式は型`(Integral a, Show a) => [a] -> IO ()`の関数となるので

``` ok.hs

> f = print . sum . map (+2) . filter odd
> f [1..10]
35
```
もOK。
今回のケースではいわゆるポイントフリースタイルがもっともシンプルなので具体例の回答としてはこれがベストと思う。

## ($)のNGケース
ひとつ前の例で`.`を`$`に単純に置き換えると、

``` ng.hs
> f = print $ sum $ map (+2) $ filter odd

<interactive>:6:30: error:
    ? Couldn't match expected type ‘[Integer]’
                  with actual type ‘[Integer] -> [Integer]’
    ? Probable cause: ‘filter’ is applied to too few arguments
    ...............................
```
これはNG。
`map (+2)`は`Integer`のリストを期待しているのに`filter odd`は部分適用された関数`[Integer]->[Integer]`なので型が合わない。

## (.)のNGケース
逆に`$`でOKのケースを`.`に単純に置き換えた次のケースは

``` ng2.hs
> print . sum . map (+2) . filter odd [1..10]

<interactive>:7:26: error:
    ? Couldn't match expected type ‘a -> [Integer]’
                  with actual type ‘[Integer]’
    ? Possible cause: ‘filter’ is applied to too many arguments
   ........................
```
やはりNG。これは

``` ng2'.hs
> print . sum .  map (+2) . (filter odd [1..10])
```
こう書いたのと同じことになる。`.`は関数を合成しようとして引数には前後とも関数を期待しているのに（`filter`は自身の引数と先に結合してしまうため）第二引数がリストになってしまう

期待されるのは括弧で書くと

``` ok2.hs
> (print . sum .  map (+2) . filter odd) [1..10]
35
```
なので、`$`を使って括弧を除くと

``` ..hs
print . sum . map (+2) . filter odd $ [1..10]
```
こうなる。上で**最後の`$`以外は**としたのは、このような事情から。
**合成関数に直接値を喰わせるときは`.`でも空白区切りでもなく`$`.**これは大事。

# 補足
`$`と`.`の型と実装を比較。

``` $dot.hs
($) :: (a -> b) -> a -> b
f $ x =  f x

(.)    :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
```
`$`は一つだけでは見かけ上、何もしない。
しかし、`f x`と書いた場合`f`と`x`は左結合で、どんな中置演算子より強く結びつくが、`$`を使うことで右結合かつ優先順位最低（ゼロ）となることで、複数指定した場合に括弧の入れ子を単なる連結に変えてみせることができる。

一方、`.`は関数を二つとって関数を返す。
まさに関数を合成しているわけだが、実装は第二引数の関数へ値を適用した結果を第一引数の関数に食わせるもの。
（関数合成というと何やら黒魔術めいたもので複数の関数の機能を一つに錬成するようなイメージを持っていました（笑）。そのため難しいものだと思って初めは敬遠していたのですが、実際は何のことは無い**パイプライン**です。小さく作ってじゃんじゃん繋ぎましょう）
micro_mruby_for_arduino_uno を使って Arduino Uno の上で動くアプリケーションを Ruby で書く

この記事は、[Fujitsu Advent Calender](http://qiita.com/advent-calendar/2018/fujitsu)の 19 日目の記事です。

# はじめに

@GORO_Nekoです。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

えーっと、先にお断りをば一言。

自分、仕事では一切 mruby や mruby/c を扱っておりません。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# Arduino Uno で動くアプリケーションを Ruby 言語では書けない

… そう思っていた時代が自分にもありました

だってそうでしょう？　
[Arduino Uno](https://store.arduino.cc/usa/arduino-uno-rev3) の搭載 SRAM の量は 2 KB しかないんですよ？

CRuby は言うに及ばず、動作するために必要な最低メモリ量が 400 KB の mruby も、40 KB の mruby/c も動くはずないとおもうじゃないですか。

# こいつ … 動くぞ！

私は「あきらめたらそこで試合終了だよ」と言う言葉をよくよく思い出すべきでした。

なんと、Arduino Uno の上で、Ruby スクリプトから作ったアプリケーションを動作させる VM（ [micro mruby for arduino](https://github.com/kishima/micro_mruby_for_arduino_uno)、unomruby/c ベース）を作り上げた方が現れました。

これ、凄いです。

あのプアなメモリしか持たない Arduino Uno の上で、Ruby スクリプトから作ったアプリケーションが本当に動いてしまいました。

[動いたプログラムの例]

```test-001.rb

puts "hello world"

```

このアプリケーションを実行すると言うか、Arduino Uno をリセットするたびに、PC 上に立ち上げたターミナルソフトの表示画面上に「hello world」と言う文字列が表示されます。

# 等価交換と言う代償

こんなプアな環境上で動かすために "micro mruby for arduino" は、本来 Ruby が持つ機能のうちいくつかを代償として切り捨てると言う等価交換を行っています。

ベースとした mruby/c からして、Ruby の[機能やクラスをフルに取り込んでいません](https://www.s-itoc.jp/activity/research/mrubyc/mrubyc_about/)。 

加えて "micro mruby for arduino" は以下の標準クラスを⾮対応としています。
　• Array
　• Hash
　• Range
　• Math

こうした等価交換の実施により、"micro mruby for arduino" は Ruby で書かれたアプリケーションを "Arduino Uno" 上で動作させることを成しえているようです。

# GPIO の操作もできます

GitHub にコードを公開された方は、[こちら](https://silentworlds.info/2018/10/26/hacked-mruby-c-can-work-on-arduino-uno/)で解説も書かれています。

解説ページでは、Arduino Uno 上の GPIO をコントロールしてみせる Ruby スクリプトの紹介も読めます。 

[解説ページ](https://silentworlds.info/2018/10/26/hacked-mruby-c-can-work-on-arduino-uno/)の例に従って、Arduino Uno 上の GPIO をコントロールしてみせる Ruby スクリプトを書いてみましょう。

"Arduino Uno" の "Digital 11 Pin" 側に LED の長い側の足を、"GND" 側に LED の短い側の足を接続した回路を作成して、以下のようなスクリプトから作成したアプリケーションを "Arduino Uno" 上で動作させると、"Arduino Uno" に取り付けた発光ダイオードが 1 秒おきに点滅するはずです。

[回路図]
![回路図.png](https://qiita-image-store.s3.amazonaws.com/0/89832/002a803c-cfce-9cdb-421b-2260d53c412d.png)

[ GPIO を利用したプログラム例]

```test-002.rb

puts "LED Test"
pin = 11
Arduino.pin_mode(pin,:OUTPUT)
st = :LOW
while(true) do
  if(:LOW == st)
    st = :HIGH
  else
    st = :LOW
  end
  Arduino.digital_write(pin,st)
  Arduino.delay(1000)
end

```

センサーから値を読みだした値を、マイコン上で人にとって意味のある形式に変換する等を行おうとした場合、"micro mruby for arduino" は非力と言う評価になるかもしれません。

しかしマイコン上で行うのは、センサ等マイコンに接続された各電子部品を含むハードウェアに対し情報を入出力するだけ、得られた情報はサーバにでも転送してそこで加工すればよいと割り切るなら、"micro mruby for arduino" & Ruby スクリプトは、特に Ruby で何でも書きたい私のような人間には Arduino Uno 用アプリケーションを書くための良い選択肢となる気がします。

では、また。


**【 2018/12/26 追記】**

[続編](https://qiita.com/GORO_Neko/items/b2eee85a6fc56e72db74)書きました。

**開発環境の構築方法**を確認したい方、読んでいただければ幸いだったり …
Vuejs-datepickerについて

#概要
つい最近Vuejs-datepickerを触る機会があったのでその時困ったこととか解決法をまとめておきたいと思います。

#Vuejs-datepickerって？
日付選択をカレンダーを使用して出来るようにするパッケージです。
Vueと一緒に使っています！
公式のページは[vuejs-datepicker](https://www.npmjs.com/package/vuejs-datepicker)を見てください。
公式にデモもあるので試したい方はそちらで！
インストールはnpmで`npm install vuejs-datepicker`かCDNを利用してください。

#基本的な使用法
```
< datepicker  
   v-model = "変数"
   propsを記述
> < / datepicker >
```
v-modelの後に指定した日付を保持しておく変数を指定します。
そのあとにPropsを指定していきます。
#困ったこと＆解決法
- カレンダーのみを表示したい
    - propsで`inline = "true"`を指定
- カレンダーの幅を調整したい
    -  propsで指定できなかったのでjsを使って力業

```
/*Vueのmountedで実行しました。*/
var target = document.getElementsByTagName("id");//変更したいもののIDを指定
target.style.width = "100%";                     //幅を指定
```

以上です。
引き続き使っていて何かあったら追記していきたいと思います。

#参考にさせていただいた記事等
- [JavaScriptでCSSを操作する方法](https://sterfield.co.jp/designer/javascript%E3%81%A7css%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
- [vuejs-datepicker](https://www.npmjs.com/package/vuejs-datepicker)
python + ajaxのPOST通信

python + ajaxのPOST通信のサンプルコードです。
jQuery使ってます。

###クライアント側

```sample.js

let samplePost = function(){

    //レスポンス
    var response = {};

    //リクエスト
    let request = {para_1 : 12,
                   para_2 : "aaaa",
                   para_3 : encodeURI("日本語送信")};

    //ajax
    $.ajax({
      type        : "POST",
      url         : url,
      data        : JSON.stringify(request),  //object -> json
      async       : false,                    //true:非同期(デフォルト), false:同期
      dataType    : "json",
      success     : function(data) {
        //data = JSON.parse(data);  //error
        response = data;
      },
      error       : function(XMLHttpRequest, textStatus, errorThrown) {
        console.log("リクエスト時になんらかのエラーが発生しました\n" + url + "\n" + textStatus +":\n" + errorThrown);
      }
    });

    //表示
    console.log(response);
}
```

###サーバ側


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


#######################################################
#
#  import
#
#######################################################

import cgitb
import cgi
import os
import json
import sys
import io
import urllib.parse  #url encode/decode


#######################################################
#
#  main
#
#######################################################
def main():

    #文字化け対策
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

    #エラーの内容をブラウザに送信
    cgitb.enable()

    #値取得
    data   = sys.stdin.read()
    params = json.loads(data)

    #
    para_1 = params["para_1"]
    para_2 = params["para_2"]
    para_3 = params["para_3"]  #url encoded

    #url decode
    para_3 = urllib.parse.unquote(para_3)


    #######################################################
    #
    #  処理
    #
    #######################################################

    #処理

    #レスポンス
    response = {"res" : "aaaa"}


    #######################################################
    #
    #  response
    #
    #######################################################

    #print("Content-type: application/json")  #error
    print('Content-type: text/html\nAccess-Control-Allow-Origin: *\n')
    print("\n\n")
    print(json.JSONEncoder().encode(response))
    print('\n')


################################################
#
#  main実行
#
################################################
if __name__ == '__main__':
    main()

```


## 追記
python cgiでInternal Server Error(500)が出た時の対処法
https://qiita.com/qiiChan/items/f599fbf2289801348965
ファイル操作は速い

[月数100万アクセスをDB使わず超簡単にさばく](https://qiita.com/Hisashi_vc/items/a50b49ad6a75d51c880a)
ここの反応を見て思ったことやメモなど。


まず、PHPでは普通にファイルをストレージとして使う。PHPの初期設定でセッションを使う場合、データはファイルに保存される。たぶん多くの人が知らない間にファイルをストレージとして使っている。
サーバー1台でセッションGCをcronで実行するなら、[Redisよりファイルの方が速い](https://inchoo.net/magento/programming-magento/session-storage-php/)。
当然RDBよりも速い。


そしてデータ書き込み競合のことを心配している反応もあるが、`LOCK_EX`を読み飛ばしているのだろうか？今時Webプログラミングで`fopen`なんてしないから意味が分かっていない人も居るのかもしれない。
ファイル名がユニークと書いてあるので、昔のカウンターCGIや掲示板のデータファイルのようにはならなさそう。ファイルが大量にあって遅いなら`git`やキャッシュライブラリのようにprefixでディレクトリを分けてもいい。
CPU1、メモリ1GBのサーバーでDBを使っても1アクセス0.05秒以下の処理速度は普通に出るので、DBもフレームワークも使わないなら例えレンタルサーバーでもかなり速いのではないかな。速いならロックで詰まることも起きにくい。


それから、Linuxではファイルは可能な限りキャッシュされる。一度読み込んだファイルがメモリにあるならわざわざディスクを読んだりしない。
[MySQLをtmpfsに置いたりするのはナンセンス](http://d.hatena.ne.jp/naoya/20070521/1179754203)だし、ファイルから読み込んだ内容をそのまま（1台で）メモリキャッシュ系サーバーに登録するのも意味が無い。
書き込みもLinuxならキャッシュに書き込んでディスクでは待たされないけど、PHPのファイル操作はどうだっけ？



RDBMSは不要かというとそんなことはなくて、[ACID](https://ja.wikipedia.org/wiki/ACID_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E7%A7%91%E5%AD%A6))を実現したいなら使うしかないし、複雑な[リレーション](https://ja.wikipedia.org/wiki/%E9%96%A2%E4%BF%82%E3%83%A2%E3%83%87%E3%83%AB)を管理したいときも使うしかない。
まあ「コイン系SNSサービス」でACID要らないの？という気もしなくはないけれど、BitcoinだってKVS＋バイナリデータファイル＋seekによるデータ保存だったし、結果整合性でやりくりするならKVSのようなファイルがいいのかもしれない。RDBのトランザクションより結果整合性を担保する設計の方が難しい気はするが。


あと、どうでもいいけど、コメント欄のゆるい返信が地味にすごい。
Rustのファイル分割 2015

#プロジェクトの作成
cargo new --bin project1
#ファイル構造
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/245159/637cfc0e-150c-6d4b-4bb0-77aad982216e.png)

#ソースファイルの追加
##src直下の場合
src配下にanother.rsを作成
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/245159/05d90502-790e-8779-cab8-c57b7c54bf28.png)



main.rsから呼び出す

```Rust:main.rs
mod another;
fn main(){}
```
##サブディレクトリの場合
Rustの仕様により、サブディレクトリの場合はmod.rsをサブディレクトリ内に追加する必要がある。

1. src\subfolder\another.rsを作成
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/245159/d69bddda-ca2c-3b32-b4bb-76a40c2ac2c5.png)
2. src\subfolder\mod.rsを作成
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/245159/85b01616-b244-e0a3-8e01-cf9517495a3d.png)

mod.rsにファイル名を記述する

```Rust:another.rs
use another;
```
main.rsから呼び出す

```Rust:main.rs
mod subfolder;
fn main(){}
```
main.rsから呼び出すときは、フォルダ名を指定する。
マイグレーションファイルに書いてある　add_index

#【マイグレーションファイルに書いてある　add_indexってなに】
特定のカラムからデータを取得する際に、テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにしたものです。

indexに複数のカラムを設定する場合は
add_index テーブル名, [:カラム名1, :カラム名2, ・・]
と書けばOK

```rb
class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.belongs_to :user, null: false
      t.date :recorded_on, null: false
      t.string :message
      t.timestamps
    end
    add_index :comments, [:user_id, :recorded_on]
  end
end
```

本来インデックスとは「索引」「見出し」などの意味をもつ言葉で、データベースに関わるシーンで用いられる際には、格納されたデータをより早く検索したり抽出できるように作られる索引データのことを言います。
SEO用語でインデックスと言えば、クローラーが収集したWEBページのデータを検索エンジンデータベースに（処理しやすいように整理された状態で）格納されることを「インデックス化」「インデクシング」などといいます。

https://qiita.com/seiya1121/items/fb074d727c6f40a55f22
https://www.seohacks.net/basic/terms/index/
日本酒を楽しむためのサイト「S[H]AKE」をゼロから立ち上げた

#作成したサイト
S[H]AKE｜日本酒を楽しもう。
https://s-h-ake.info/
[<img width="678" alt="スクリーンショット 2018-12-18 20.44.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/104983/870428b6-e395-fa3a-5b6f-0509c642e8b3.png">](https://s-h-ake.info/)


#きっかけ
ここ1年ほど日本酒にハマっているので、飲んだ日本酒をカジュアルに共有して、楽しめるサイトがあればいいなと思い作成してみました。日本酒レビューサイトとしては、すでにSAKETIMEさんという素晴らしいサイトがあるのですが、個人的には以下のような不満点がありました。

####1.入手困難な酒の掲載が多い
十四代や新政No6など、普通には入手できないような日本酒が、ランキング上位の酒として掲載されております。美味いのはわかるんですが、飲みたくても飲めないでござる…。

####2.専門的な話が多い
私はいろんな銘柄の日本酒をカジュアルに楽しむのは好きですが、日本酒オタクではないのです。あまり専門的なことを書かれてもげんなりしてしまうのです。

ということでコアな日本酒ファン向けのサービスとなりつつあるSAKETIMEさんと棲み分けができるように、投稿できる文字数は少なめにして、カジュアルな日本酒好きが気軽に投稿できるようなUIを目指しました。

#構成
・フレームワーク
Rails 5系

・DB
MariaDB

・Web Server
nginx

・Application Server
Puma

・OS
Amazon Linux 2

・インフラ
AWS EC2

わりと手堅い構成だと思います。ただ個人開発するなら、Heroku使ったほうが間違いなく早いのですが、今回はスピード重視というよりは勉強を兼ねてこの構成としました。

#今回の開発で気をつけたこと
##テストコードを書く
いままでの個人開発では、ほとんどテストコードは書いてませんでした。めんどくさい、そもそもユーザーがいないのでサービス水準を保つ必要がないといった理由です。
趣味でやってる分にはそれでも問題ないとは思うのですが、仕事となると話は別です。自分はqiitaの投稿を成果物として面接することが多いのですが、テストコード書いてないと言うと、大体嫌な顔をされたような気がします…:sob:

ということで今回はRSpecを利用して、しっかりとテストコードを書きました。書いたテストは、System Spec/Request Spec/Model Specの三種類です。テスト用のデータ投入やログイン状態の再現など、意外と考慮すべき部分が多く、勉強になりました。

##こまめにコミットする
これまでのGitでのバージョン管理は、大量にソースコードを変更して、一括でコミットするようなやり方でした。今回は機能改修単位でこまめにコミットして、本番環境でも適宜マージしていきました。
~~一人なのでプルリク出したりとかはしていないのですが、ブランチ切って新機能追加など、チームでの開発を想定したGit運用をしていきたいと思います。~~
→ブランチ切ってセルフプルリクエストで機能追加してます。銘柄検索機能といいね機能を追加実装しました。

##CI/CDを実現する
Bitbucket+CircleCIで、リポジトリへのプッシュのタイミングで、自動テストおよびにEC2へのデプロイを行うようにしました。最初はAWS CodeDeployを使おうとしましたが、既に存在するファイルの上書きが出来ないらしく、やめました。CircleCIからSSHでEC2に接続し、デプロイ用のシェルスクリプトを叩いています。このあたりの設定に慣れてないのでかなり時間かかりましたが、長いスパンで見ると開発効率を大幅に向上させることができました。

##Linter/Formatterを導入する
VSCodeにrubocopを導入しました。形式を整える時間も削減でき、見た目も綺麗になるので、純粋に良いことづくめだなと思いました。

##Turbolinksを使う
敬遠されることも多いTurbolinksですが、サクサク感があるに越したことはないので、導入することしました。JSの実装部分がほぼ無いため、特に発火タイミングのトラブルなどもなく、体感スピードを向上させることができました。

##jQueryを使わない
Rails5.1からはデフォルトでjQuery依存が廃止されていますので、その方針に沿う形としました。最初から使わないと決めれば、特に問題は無かったです。Bootstrapが使えなくなるので、レスポンシブ対応がやや面倒になるでしょうか。

##Photoshopを使う
画像素材を作る際、今まではケチってフリーソフトを使ってましたが、今回はPhotoshopを使いました。お金はかかりますが、制作効率が段違いです。使えるツールはどんどん使っていきたいですね。

#おわりに
日本酒メーカーさんの広告貰えるぐらいまでサービス成長できるよう、機能改善を頑張りたいと思います:muscle:ご意見・ご感想などあればコメントでお願いいたします。