OmniAICreator/Qiita-1.07M huggingface dataset:
[小ネタ] [0,n)のレンジチェックを1回で済ませる

# TL;DR

[これ](https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/Collections/Generic/List.cs#L156-L157)を見たとき、目から鱗が落ちた。

# 一般的な話

今まで、0～nまでのレンジチェックをするときは以下のように書いていた

```csharp

if (index < 0 || index >= _size) throw new ArgumentException();

```

よくあるパターンなんだけど、値域の判定が2度入る。


# List<T>のIndexerがしてたこと

```csharp

if ((uint)index >= (uint)_size) throw new ArgumentException();

```

こんな風に`uint`にキャストしてチェックすることで判定を一度にすることが出来ている [^1] 。
で、`List`のIndexerみたいに、ほぼほぼ正しい値域を伴って高頻度に呼ばれる様な場合、チェックを1回すっ飛ばせるコトは凄くでかいんじゃないかなと思ったし、こんなコト考えつかなかったのですげーなと思った。

# なんでこんなコトが出来るのか

C#では、`int`は32bit符号あり`uint`は32bit符号無しの整数であり[^2]、符号表現は2の補数となっている[^3]。
で、intとuintの差は整数のビットをどのように解釈するのかという差のみなので、キャストにかかるコストは実質0となる[^3]。

ここで、符号表現が2の補数であるから、負数を`uint`として解釈したとき、とり得る全ての負数は`int.MaxValue`を`uint`で表現したときよりも大きくなる。
このことから、1度のレンジチェックで`[0,n)`のレンジチェックを完了できることになる。

興味深かったので小ネタとしてまとめてみた次第。




[^1]: だからこそ、// Following trick can reduce the range check by one　こーかいてあったのかと。
[^2]: [このへん](https://github.com/dotnet/csharplang/blob/master/spec/types.md#simple-types)に書いてある。
[^3]: [このへん](https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf)のI.12.1辺りに書いてる。ちなみに"コストが実質0"と言う点はおいらの推論
PythonでNPBのチームデータが取りたい。(球団名とPDFのpath)



プロ野球の選手会のページから球団名と選手一覧のPDFのURLをゲットしてくる。

※個人利用だけどもし問題がある場合は誰か教えてください。

```getURL.py
import bs4
import requests
url = requests.get('http://jpbpa.net/register/')
url.raise_for_status()
soup = bs4.BeautifulSoup(url.text, "html.parser")
elems = soup.select('a')
for elem in elems:
    # elem.getText=球団名、elem.get('href')=PDFのpath
    if elem.getText() == "ロッテ":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "ソフトバンク":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "西武":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "楽天":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "オリックス":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "日本ハム":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "広島":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "阪神":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "DeNA":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "巨人":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "中日":
        print('{}({})'.format(elem.getText(), elem.get('href')))
    elif elem.getText() == "ヤクルト":
        print('{}({})'.format(elem.getText(), elem.get('href')))
```
Reactチュートリアル 〜reactでTODOアプリを作ろう〜

この記事は、noteで販売している[【脱初心者！！】ゼロから始めるReact](https://note.mu/dragontaro/n/n04e0b9c0cca7)のコードです。解説に関してはnoteをご購入ください。

# コード

```
class App extends Component {
  constructor() {
    super()
    this.state={
      count: 0,
      todoList: [],
      value: "",
    }
  }

  onChange(key_value) {
    this.setState(key_value)
  }

  add(todoElement) {
    this.setState({
      todoList: this.state.todoList.concat(todoElement),
      value: "",
    })
  }

  handleDelete(id) {
    let todoList = this.state.todoList.concat()
    let index = 0
    todoList.map((element, idx) => {
      if (element.id == id) {
        index = idx
      }
    })
    todoList.splice(index, 1)
    this.setState({todoList: todoList})
  }

  render() {
    const todoListNode = this.state.todoList.map(element => {
      return (
        <TodoElement
          key={element.id}
          element={element}
          onDelete={this.handleDelete.bind(this)}
          {...this.state}
        />
      )
    })
    return (
      <div>
        <h1>TODO App</h1>
        <AddTodo
          {...this.state}
          onChange={this.onChange.bind(this)}
          add={this.add.bind(this)}
        />
        <ul>
          {todoListNode}
        </ul>
      </div>
    );
  }
}

class AddTodo extends React.Component {
  onChange(e) {
    const key_value = {
      value: e.target.value,
    }
    this.props.onChange(key_value)
  }

  add() {
    if (this.props.value) {
      const todoElement = {
        content: this.props.value,
        id: this.props.todoList.length + 1,
      }
      this.props.add(todoElement)
    }
  }

  render() {
    return(
      <div>
        <input
          type="text"
          value={this.props.value}
          onChange={this.onChange.bind(this)}
        />
        <button onClick={this.add.bind(this)}>追加</button>
      </div>
    )
  }
}

class TodoElement extends React.Component {
  onDelete() {
    this.props.onDelete(this.props.element.id)
  }
  render() {
    return(
      <li>
        <span>{this.props.element.content}</span>
        <button onClick={this.onDelete.bind(this)}>削除</button>
      </li>
    )
  }
}
```
今後、ドラッグ&ドロップで並び替えられる機能等を実装するかもです。

[github](https://github.com/Dragon-taro/react-tutorial)にも載せてあります。
Macでおやすみモードをコマンドで切り替える

#動作確認環境
MacBook Air 2017
macOS High Sierra 10.13.4

#おやすみモードを有効化する

```shell_session
defaults -currentHost write ~/Library/Preferences/ByHost/com.apple.notificationcenterui doNotDisturb -boolean true
defaults -currentHost write ~/Library/Preferences/ByHost/com.apple.notificationcenterui doNotDisturbDate -date "`date -u +\"%Y-%m-%d %H:%M:%S +0000\"`"
killall NotificationCenter
```

#おやすみモードを無効化する

```shell_session
defaults -currentHost write ~/Library/Preferences/ByHost/com.apple.notificationcenterui doNotDisturb -boolean false
defaults -currentHost delete ~/Library/Preferences/ByHost/com.apple.notificationcenterui doNotDisturbDate
killall NotificationCenter
```

#参考
How to enable/disable Do Not Disturb from shell on Mavericks?
https://apple.stackexchange.com/questions/145487/how-to-enable-disable-do-not-disturb-from-shell-on-mavericks
Unreal C++でRubyのRSpecっぽくテストを書く

# よくあるUnreal C++でのテスト

Unreal Engineにもテスト機構があります。
http://historia.co.jp/archives/698/

テスト結果や実行範囲をリッチなGUIで選択できるのは素晴らしいのですが下記のような不満がありました。

* テスト名には当然説明的な名前を採用したいがクラス名では難しい。特に冠詞とか
* 実行順序が不定かつ前処理、後処理がないのでグローバルを使ってでさえ同じ記述を何度もすることになる
* テストの最小単位を書くのが面倒なので1つのテストに何個ものテストを書いてしまう

# RSpecっぽいテスト

そんな不満の解決策を探していた所、下記のような実装を見つけました。

```cpp:github.com/EpicGames/UnrealEngine/blob/4.19/Engine/Plugins/Tests/RuntimeTests/Source/RuntimeTests/Private/AutomationSpec.spec.cpp
// BEGINとENDの間の変数がDescribe中保持される
BEGIN_DEFINE_SPEC(AutomationSpec, "System.Automation.Spec", /* 省略 */)
	bool Foo;
	FString RunOrder; 
END_DEFINE_SPEC(AutomationSpec)

void AutomationSpec::Define()
{
	// 1つのテスト定義中にテストを複数書けるので実質的にスイートとして機能させることができる
	Describe(/* 省略 */);
	Describe("A spec using BeforeEach and AfterEach", [this]()
	{
		BeforeEach([this]()
		{
			RunOrder = TEXT("A");
		});

		It("will run code before each spec in the Describe and after each spec in the Describe", [this]()
		{
			TestEqual("RunOrder", RunOrder, TEXT("A"));
		});

		AfterEach([this]()
		{
			RunOrder += TEXT("Z");
			TestEqual("RunOrder", RunOrder, TEXT("AZ"));
		});
	});
}
```

内部実装でもほとんど使われていないテスト方法なので、いろいろ不具合があるかもしれませんが、ちょっと使っていってみようかと思います。
VRMで遊ぶ③ ～ SteamVRでやってみる～

##はじめに
VRMで遊ぶ①～②はTrackedPoseDriveを使用していましたが、今回はSteamVRで行ってみます。
基本的に使用するAssetはSteamVR Plugin以外変わらないです。

##1.SteamVR Pluginをインストール
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/454944d9-ad1c-8da6-ae0e-35a66203fbd9.png)

##2.SteamVR Pluginの設定
[SteamVR]→[Prefabs]→[CameraRig]をSceneに配置する。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/a3a04a52-0691-5fbe-6bc0-01753f24899e.png)

Controller (left)、Controller (right)、Camera (eye)直下にトラッキング対象のGameObjectを追加する。※leftとrightの直下のモデルは削除してもOKです。

![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/d8e6bf5f-cc09-f570-66b4-d6cccbdbde9c.png)

##3.VRMモデルを追加する
[CameraRig]直下にVRMモデルを追加しVRIKをアタッチする。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/13d04655-6169-6737-f8f9-cd1faae12980.png)

アタッチしたVRIKに追加したController (left)、Controller (right)、Camera (eye)直下のGameObjectをセットしていく。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/f04c859e-4269-e8d4-7064-697edfd7674d.png)

![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/283b3a45-618e-4a01-ea4b-65f4176d5fea.png)

![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/48820/8cb03c0e-2af9-2d98-75b7-98db3eaaac78.png)

最後にMainCameraを消しておきます。

これで再生すればちゃんと動作するはずです。

##モデルの向き、角度がおかしい場合
Controller (left)、Controller (right)、Camera (eye)の直下に追加したGameObjectの角度を変更しましょう。
Unity5とVisual Studio for Macの連携

##環境
MacOSX 10.13.4
Unity 2018.1.0f2 Personal

##Visual Studio for MacのDL
https://goo.gl/WSWJBx

##Unityの設定
ツールバーのUnity→Preferences→Eternal Tools→Eternal Script Editerの設定を、Visual Studioに変更する
![スクリーンショット 2018-05-09 21.41.14.png](https://qiita-image-store.s3.amazonaws.com/0/95487/a69f0f7d-1603-9b04-d8a6-ff4471fb3cb4.png)

##Codeを立ち上げる
C# or JS(UnityScript)のファイルをUnityからクリックすると自動的にVSの画面が立ち上がる。
![スクリーンショット 2018-05-09 21.40.45.png](https://qiita-image-store.s3.amazonaws.com/0/95487/1221b2a1-bada-2870-f1eb-1f3e064f04a2.png)

##感想
2016年ごろからちらほらUnityを使っており、ブランクはありますが久しぶりにVisual 
 StudioをいれてみたらUIもMonoDevelopよりになっており嬉しいです。
今まではMacだとMonoDevelop、WindowsだとVisual Studioの流れでしたが今後はVisual Studioの方に流れていくのかもしれません。
※公式HPを見ての見解ですが、MonoDevelopのサイトで先にリンクが貼ってあることからの推測です。

<img width="1206" alt="スクリーンショット 2018-05-09 21.54.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/95487/8198bad7-38e6-54fa-4132-0753c4d96ee0.png">
Redmineの登録と更新が遅い件

[Docs » インストールガイド » » メールの設定例](http://guide.redmine.jp/Email_Configuration/#delivery_method)

>非同期送信を利用する場合は、SMTPの設定を指定するには smtp_settings ではなく async_smtp_settings を使用します:

```/path/to/configuration.yml 
development:
  email_delivery:
    delivery_method: :async_smtp
    async_smtp_settings:  # smtp_settings ではありません
      address: ...
      port: ...
    ...
```
Macでスクリーンショットの保存先を変える方法

※この記事は
https://pc-karuma.net/mac-customize-screencapture-location/
https://qiita.com/mamohacy/items/559af38aacb7a17a1600
を参考に検証した結果に基づき書いております。

Macではデフォルトの設定だとスクリーンショットがデスクトップに置かれてしまい、散乱することになるので早めに設定を変えたい方も多いことでしょう。
私はDropboxの中にSSディレクトリを作りそこへ保管していたのですが、今回はデスクトップへPicturesディレクトリを作り保存する方法に変え検証してみました。

1.Picturesディレクトリをデスクトップへ作成する。
2.ターミナルで
 
```
$ defaults write com.apple.screencapture location
```
 
の後半角スペースを一つ空け、デスクトップへ作成したPicturesディレクトリをドラッグ&ドロップで持ってきます。

```
$ defaults write com.apple.screencapture location /Users/ユーザー名/Desktop/Pictures
```

となります。

以上、Macでスクリーンショットの保存先を変える方法でした。
GAE Search API の整理用メモ

# 概要

オフィシャルドキュメントを箇条書き？しただけです。
誤解あったら教えてください。
自分のなかで確実な情報は詳細まで書いてません。

+ 到達・解決に時間がかかった逆引き

# リンク色々

* https://cloud.google.com/appengine/docs/standard/python/search/
* https://cloud.google.com/appengine/docs/standard/java/search/?hl=ja

# メモ

* ドキュメント
    * ユニークID, ユーザーデータを含むフィールドリストを持つ
    * フィールド
        * 名前、タイプを持つ
        * タイプ
            * Atom Field : 完全一致文字列
            * Text Field
            * HTML Field
            * Number Field
            * Date Field
            * Geopoint Field
    * 最大サイズは 1MB
* インデックス
    * 1インデックス内のドキュメントサイズ上限はデフォルトでは10GB
        * 200GM まで上限を拡張はできる
* クエリー
* リザルト

# 逆引き

* Search API のメソッドでエラーは出ないがコンソールにインデックスが登録されない
    * ローカルから実行してない？
        * Yes => https://cloud.google.com/appengine/docs/standard/java/search/devserver?hl=ja
* ローカル環境から本番など GAE 上のリソースをいじる
    * Remote API を利用する
        * https://cloud.google.com/appengine/docs/standard/java/tools/remoteapi?hl=ja
【非エンジニア向け】Macでパスワード付きのZipファイルを作る

## 概要

Macの非エンジニアの人が「パスワード付きのZipファイルを作りたい！！」と言ったときに、毎回「PC貸してください。」と言ってターミナルをがちゃがちゃするのも色々嫌なので、ターミナルの操作をほぼなしでパスワード付きのZipを作るメモ

※ 内容は非常に初歩的なShell Scriptだと思います。

## ソースコード

`エンジニア`の人は、ターミナルを開いて、以下のコマンドを入力して`zip.command`というファイルを作成しましょう。

```
# vim zip.command
```

vimを開いたら、以下のコードを入力して`:wq`で保存しましょう。

```sh:zip.command
#!/bin/sh

echo "ファイルをドラッグ&ドロップ:"
read in

echo "zip名を入力:"
read out

infile=$(basename $in)

echo "パスワード:"
read pass

cd $(dirname $in)
zip -r --password=$pass $out.zip $infile
```

そのままだと実行できないので、ファイルに実行権限を与えましょう。

```
# chmod +x zip.command
```

これで完成です。

## 軽く解説

`echo` : 画面に出力します。

`dirname` : 対象ファイルが存在するディレクトリを表示します。

`basename` : 対象パスのファイル名を抜き出します。

`read` : キー入力を待つことができます。 `out`, `in`と続きますが、それが変数名になりますので`$out`, `$in`というように使うことができます。

`zip` : `-r`オプションをつけることでファイル/フォルダの両方に対応できます。 `--password`オプションをつけることで`パスワード付き`のzipを作ることができます。

## 使い方

1. zip.commandを`ダブルクリック`します。すると、ターミナルが開きます。
2. `出力ファイル名を入力:`と出たら、出力したいファイル名を入力します。`out`と入力した場合、`out.zip`というファイルが生成されます。
3. `元ファイルをドラッグ・アンド・ドロップしてください:`と出たら、ZipにしたいファイルorフォルダをFinderからドラッグ・アンド・ドロップします。こうすることで、対象ファイルの絶対パスが入力されます。
4. パスワードを入力します。 (入力したパスワードは表示されないので戸惑う人もいるはず。また管理者パスワードではなく、Zipにかけるパスワードなのでそこも伝える必要がありそうです。)
5. ファイルが完成します。このプログラムではDesktop上に作られるようになっているので、「Desktopにできますよ」と一声かけてあげましょう。


![zip (1).gif](https://qiita-image-store.s3.amazonaws.com/0/29844/5f5338a9-46f0-8ba1-1e5e-289b6014ced1.gif)
tortoiseSVNとsshでチェックアウトするまでの手順

#概要
windows10からTortoiseSVN のリポジトリにアクセスするまでの手順を書く．
普段はgitを使用しているけれど，SVNのリポジトリにアクセスすることがあった．
ネットに載っている諸々の記事では必要なこと以外もあるので簡潔に手順だけ載せる．

#環境
* windows10
* TortoiseSVN

#準備
* [TortoiseSVN](https://tortoisesvn.net/docs/release/TortoiseSVN_ja/index.html)のインストール
* SSHクライアントの[Putty](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)のインストール
* ホストサーバに公開鍵を登録してもらう

#秘密鍵のputty形式に変換
自分はopen-sshの鍵を使っていたのでputty形式に変更した
[ここのqiitaの記事](https://qiita.com/dskst/items/391fc55018fbf3cf795e)を参考に
 
#SVNのコンフィグ設定
* 「右クリックメニュー」-> 「tortoiseSVN」-> 「Settings」 
*  Networkタブ
* ![Tortoisesvnssh.jpg](https://qiita-image-store.s3.amazonaws.com/0/125382/f7a6f78e-8b40-3c73-fa4a-a626afd2fd01.jpeg)
* SSHに以下のようにputtyクライアントを設定
* "C:\Program Files\putty\plink.exe" -l [ユーザ名] -pw [パスワード] -i [.ppkファイル（秘密鍵）への絶対パス]

##補足解説
tortoiseSVNのクライアントにputty付属のsshクライアントplinkを設定する．plink.exeはputtyをインストールすると同時に入る．
exe起動に伴って通常のsshと同様のオプションを記述する．今回はユーザ名とパスワードと鍵を指定した．

#チェックアウトする
* 「右クリックメニュー」-> 「SVN CheckOut」
* ![Svncheckout.jpg](https://qiita-image-store.s3.amazonaws.com/0/125382/b302df37-0a3c-1bff-e9d4-ff46a61c8424.jpeg)
* リポジトリのURLとローカルディレクトリのパスを指定
* 「OK」ボタンでチェックアウト開始

#まとめ
win10でtortouiseSVNを使ってリポジトリをチェックアウトした
gitのほうが楽だと感じました
Ruby on RailsでPV数を計測する

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

記事を投稿する機能があるサイトなどでは、PV数の多い順に記事を順位づけて表示したいという時があると思います。
Railsではあるモデルに紐づいたレコードのPV数を計測することができる [impressionist](https://github.com/charlotte-ruby/impressionist) というgemがあります。
プロジェクトで使用したついでに、`impressionist` の導入方法をまとめておきました。

## Gemのimpressionistをインストール

Gemfileに以下の記述をして、`bundle install`しましょう。

```ruby:Gemfile
gem 'impressionist'
```

```bash
bundle install
```


## impressionists_tableを作成
次に、 `impressionist` が用意している `impressionsテーブル` を作成するために、以下のコマンドをターミナルで実行しマイグレーションファイルを作成しましょう。

```bash
rails g impressionist
```

以下のような表示が出れば、マイグレーションファイルの作成ができています。

```bash
create  db/migrate/20180508141931_create_impressions_table.rb
create  config/initializers/impression.rb
```

実際にテーブルを作成しましょう。

```bash
rake db:migrate
```

## PV数を計測したいテーブルに関連したモデルとコントローラに記述を加える

わかりやすいように、本記事ではTwitterのようなサービスを考えて実装を行っていきます。
`tweets_controller.rb` の中で、動かしたいアクションに対して `impressionist` というアクションを追加します。
例えば、ある特定のツイートを誰かが押して、詳細をみた際にPV数を計測したい場合は以下のように、showアクションに `impressionist` をつけます。

```ruby:tweets_controller.rb
class TweetsController < ApplicationController
  impressionist :actions=> [:show]

  def show
    @tweet = Tweet.find(params[:id])
  end
end
```

また、該当のアクション内に以下の記述をします。
PV数は様々な方法で計測することができますが、今回は同じ人アクセス（同じブラウザからアクセス）した複数回、同じ記事をみた場合は1PVと数えることにしました。


```ruby:tweets_controller.rb
  def show
    @tweet = Tweet.find(params[:id])
    impressionist(@tweet, nil, unique: [:session_hash])
  end
```

計測したいモデルに、以下の記述をします。

```ruby:tweet.rb
class Tweet < ApplicationRecord
  is_impressionable
end
```

以上で設定は完了です。
実際にブラウザでPV数を確認するには、以下の記述をします。

```ruby:show.html.erb
<%=  @tweet.impressionist_count %>
```

`show.html.erb` にPV数が出てきたら完了です。
※同じブラウザからアクセスしてもPV数は変わらない設定なので、違うブラウザからアクセスしてみてください。
AWS CLIを使ってEC2の作成や削除

## 概要
コンソールでポチポチ作成していたが、管理がしんどくなりそうだったのでCLIに移行。
個人的なメモに近いですが何かのお役に立てれば幸いです。
help見れば大体なんとかなりますが、しんどい人も多いと思うので。

## 環境
```
$ jq --version
jq-1.5

$ aws --version
aws-cli/1.14.30 Python/3.6.4 Darwin/16.7.0 botocore/1.8.34
```

## EC2作成

### EC2作成
```
$ aws ec2 run-instances \
--image-id ami-xxxxx \
--count 1 \
--instance-type t2.micro \
--subnet-id subnet-xxxxx \
--private-ip-address 10.0.0.0 \
--security-group-ids sg-xxxxx \
--key-name test_key \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=ec2-test}]' 'ResourceType=volume,Tags=[{Key=Name,Value=volume-test}]' \
--block-device-mappings '{"DeviceName":"/dev/xvda", "Ebs":{"VolumeSize":20,"VolumeType":"gp2"}}'
```
作成と同時にEBSにどうやってTagをつければいいのか困っていたが「--tag-specifications」をつかえばいいらしい。
オプション多いよって思う場合は[--generate-cli-skeleton」を使ってjsonを読み込むようにするとスッキリします。

### EIP作成
```
$ aws ec2 allocate-address --domain vpc
```

### EIPのアタッチ
```
$ aws ec2 associate-address --instance-id xxxxx --allocation-id xxxxx
```

## EC2削除
### EIPのデタッチ
```
$ aws ec2 disassociate-address --association-id xxxxx
```

### EIP開放
```
$ aws ec2 release-address --allocation-id xxxxx
```

### EC2削除
```
$ aws ec2 terminate-instances --instance-ids xxxxx
```

## その他よく使う操作
### EIP確認
```
$ aws ec2 describe-addresses| jq '.Addresses[]'
```

### EC2ストップ
```
$ aws ec2 stop-instances --instance-ids xxxxx
```

### EC2スタート
```
$ aws ec2 start-instances --instance-ids xxxxx
```

### EC2再起動
```
$ aws ec2 reboot-instances --instance-ids xxxxx
```

### EC2一覧確認
```
$ aws ec2 describe-instances | jq '.Reservations[].Instances[] | {InstanceId, PublicIpAddress, PrivateIpAddress, State, Tags}'
```

### EC2一覧確認(起動中の物のみ)
```
$ aws ec2 describe-instances | jq '.Reservations[].Instances[] | {InstanceId, PublicIpAddress, PrivateIpAddress, State, Tags} | select(.State.Name == "running")'
```

### EC2タグ検索
```
$ aws ec2 describe-instances | jq '.Reservations[].Instances[] | {InstanceId, PublicIpAddress, PrivateIpAddress, State, Tags} | select(.Tags[].Key == "Name" and .Tags[].Value == "ec2-test")'
```
[PosgreSQL][Presto]MAX_BY(MIN_BY)がpostgreで使えなくて困った話

# PostgreSQLでPrestoのmax_byを実現しよう。

Prestoでものすごく便利なUDFである、MAX_BYやMIN_BY。
でも、PosgreSQLでは使用することができない。
とはいえ、なんらかの理由からPostgreSQLで同じことをやらないといけないことがある。

## データセット
今回の説明に使うデータは`user(ユーザー)`, `log(オウンド訪問ログ)`の2つで、以下のようなテーブル。

user

| id | name |
| --- | --- |
| 1 | A |
| 2 | B |

log

| id | url | user_id | created_at |
| --- | --- | --- | --- |
| 1 | http://xxx.jp/page/1 | 1 | 2018-05-09 10:00 |
| 2 | http://xxx.jp/page/2 | 1 | 2018-05-10 11:00 |
| 3 | http://xxx.jp/page/3 | 1 | 2018-05-11 12:00 |
| 4 | http://xxx.jp/home | 2 | 2018-04-09 13:00 |

## クエリ
各ユーザーの最終訪問ログを取得したいとする。
結果は

| id | url |
| --- | --- |
| 1 | http://xxx.jp/page/3 |
| 2 | http://xxx.jp/home |

### Presto
```SQL
select
  user.id
  , max_by( log.url, td_time_parse( log.created_at ) ) as url
from
  user
  left outer join
    log
    on  user.id = log.user_id
group by
  user.id
```

### Postgre SQL

```SQL
select distinct
  user.id
  , first_value( log.url ) over( partition by user.id order by log.created_at desc ) as url
from
  user
  left outer join
    log
    on  user.id = log.user_id
```

## ポイント
1. ウィンドウ関数を使用すること
2. distinctを使って重複を省いてあげること(group byはウィンドウ関数に使用できないため)

min_byの場合は、ウィンドウ関数部分のorder byをascにしてあげるなどすればよい。

## 備考
他にもっとよいやり方ありそうなので募集しています。
railsのlocal開発でA5M2でpostgresに接続する

railsでlocalのpostgresに接続の仕方のメモ

##a5m2のDL
以下からダウンロード
https://www.vector.co.jp/soft/dl/winnt/business/se422726.html

##接続
 - データベース > データベースの追加と削除 > 追加  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/95ffa735-5da9-96e4-f2be-c2ab40cb650b.png)

 - PostgreSQL(直接接続)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/26419c38-699a-649a-ceff-23af48d81f8d.png)

 - 入力  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/7efb1f88-bae1-7d96-1b2a-084e03472619.png)

※データベース名は/config/database.ymlから参照(以下だとSHIPS_development)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/9cf3f32e-790a-026d-7ea4-6e94626d4287.png)

##結果
 - 接続できた  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202761/8ec97e85-4968-32be-c24d-d74bddd3387a.png)
UbuntuMateのインストール

##インストール
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/3fec9751-361f-bbfe-3ea4-fb1bc982c082.png)
1.[公式HP](https://www.ubuntulinux.jp/)にアクセスしてダウンロードボタンをクリック
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/89b3421a-eb59-e8e4-f716-1c2d3cf0f308.png)
2.日本語Remix　イメージのダウンロードをクリック
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/87736cfd-9b3b-7e31-2f40-99467bc8f410.png)
3.Ubuntu 16.04 LTS - 2021年4月までサポートの欄にある
　「ubuntu-ja-16.04-desktop-amd64.iso（ISOイメージ）」をダウンロード

##VirtualBox仮想HD
1.VirtualBoxを起動する　[ダウンロード先](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)
2.画面が出てきたら上にある新規（N)のアイコンをクリックする。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/ce5614d4-3f00-b26d-6331-1913ebd8c1ec.png)
こんな感じの画面が出てくるので、名前は任意のものを入力、タイプはLinux、バージョンはUbuntuにする
※ビット数は使っているPCと同じにする
3.次の画面でメモリーサイズの割り当てが出てくるのでPCに搭載しているサイズと相談して決めましょう。
※4GB搭載してたので1GBに設定してます。
4.次の画面はハードディスクの設定です
　デフォルトで真ん中が選択さてるのでそのままでおけ
　ほかもデフォルトで問題なし
5.仮想HDの大きさ決めたら作成ボタンをクリックして終了ーー
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/54d25fc6-78ef-946e-ba18-8d1430618c7d.png)

####最後に...
家のPCでもインストールしてるかー。。。
C#

##for文
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/6a5c7461-d313-c678-dfd4-51fe16f74632.png)
・初期化処理・・・繰り返しに入るとき、最初に実行するもの
・条件・・・繰り返しを実行するか確認するためのもの
・後処理・・・繰り返しが終わってから実行するもの

授業内でやったもの↓
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/96aa6b3e-d384-9b44-f42a-4f210a145b00.png)


##配列
配列・・・たくさんの値を保管するための場所を持った変数
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/99f8fd3d-ddb9-e030-f99c-27db6d17c294.png)
・配列は変巣の宣言をする際に、タイプの後に[]を付けて宣言します。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/b2e1c7b7-f241-d85b-dd93-1d40a6d0b966.png)
・これは配列に保管しておく値をコンマで区切って｛｝内に記述しています。
　↓の画像の｛｝の数字が記述されている部分のこと（授業内でやったもの）
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/777f5088-51b2-6f6a-d2a6-4de1e47d5cc5.png)

###最後に...
しっかり理解できるように頑張る
Linux デスクトップ環境でサスペンドモードから安全にパスワード入力無しで復帰する方法

# 経緯 
Linux がインストールされたノートPC をデブサミのような場所で会場移動する時、ノートPC を閉じると自動的に画面が消えてsuspend モードに入りそれをバッグに入れて会場を移動して、再度開くとsuspend が解除されて画面が映るものの、パスワードの入力が求められてしまう…その間わずか3 分程度なのに、これはちょっと煩わしかったりします。
そういったシチュエーションにおいて短時間のsuspend に関してはパスワードの入力無しでログインして復帰できる方法についてご紹介します。
挙動を確認したのはUbuntu 18.04, Arch Linux(KDE + sddm) です。

# 対処法 
`/lib/systemd/system-sleep/` 配下にスクリプトを置くと、suspend, hybernate 等を契機にスクリプトを実行させることができます。
また、そこに置かれたスクリプトはsuspend/hybernate 時にスクリプトが実行されると引数が渡される仕様になっているので、それを基準に動作を切り替えることができます。

例えば、suspend モードに入って、そのあとsuspend から復帰した時、suspend 時間が10 分以内であればパスワード入力無しで復帰できるようにするには以下のようにスクリプトを作成します。


```bash:/lib/systemd/system-sleep/unlock_suspend
#!/bin/bash

[ -f /opt/unlock_suspend/etc/unlock_suspend.conf ] && . /opt/unlock_suspend/etc/unlock_suspend.conf

# パスワード無しでunlock できるようにするsuspend 時間(秒単位)。これを超えてsuspend されていた場合は、復帰時にパスワードを入力しないとログインできない。
# また、/opt/unlock-suspend/etc/unlock-suspend.conf ファイルにSUSPEND_GRACE_TIME 変数の宣言がない場合も常にパスワードを求めるようにする
SUSPEND_GRACE_TIME=${SUSPEND_GRACE_TIME:-1}

file_time() {
    stat --format="%Y" "$1";
}

unlock_session() {
    sleep 1; loginctl unlock-sessions
}

# suspend の場合のみ動作するようにする。hibernate については特に何もしない
if [ "$2" != "suspend" ]; then  exit 0;  fi

# suspend に突入した時の時間を記録するため、ファイルをtouch する
if [ "$1" = "pre" ]; then  touch /tmp/last_suspend;  fi

# Resume
if [ "$1" = "post" ]; then
    touch /tmp/last_resume
    last_suspend=`file_time /tmp/last_suspend`
    last_resume=`file_time /tmp/last_resume`
    suspend_time=$[$last_resume - $last_suspend]

    if [ "$suspend_time" -le $SUSPEND_GRACE_TIME ]; then
        unlock_session
    fi
fi
```

上記スクリプトを作成したら、`/opt/unlock_suspend/etc/unlock_suspend.conf` ファイルに以下のように記述してください。


```bash:/opt/unlock_suspend/etc/unlock_suspend.conf
# パスワード無しで復帰可能なsuspend 時間(単位は秒)
# 本設定を定義しなかった場合は、suspend 復帰後、常にパスワード入力が求められる
SUSPEND_GRACE_TIME=600
```


テストするときは、ラップトップPC 等で実際に画面を閉じて、suspend モードになったのを確認後、開いてみてください。
すると画面を閉じて10 分以内であればパスワード入力無しでログイン復帰できますし、10 分以上経過している場合はパスワードを入力しないとログインできないという感じで安全性と利便性を両立したsuspend スケジュールを実現することができます。

# 常にパスワード入力無しでsuspend から復帰したい場合は
また、単にsuspend から復帰するときは常にパスワードの入力を省略したい場合は以下のようにスクリプトを作成すればOK です。
下記スクリプトはsuspend していた時間にかかわらず、復帰時にパスワードの入力を求められなくなります。


```bash:/lib/systemd/system-sleep/unlock_suspend
#!/bin/bash
[ "$1" = "post" ] && sleep 1 && loginctl unlock-sessions
```


# 参考 
- Only require password when waking up from suspend when suspended for 10 minutes
    - https://askubuntu.com/questions/909151/only-require-password-when-waking-up-from-suspend-when-suspended-for-10-minutes
LaravelExcelの2系を使っていてセル関数が計算されなくなっちゃった

# 結論
いきなり結論から書くと、LaravelExcelのconfigファイル

```php:config/excel.php
/*
|--------------------------------------------------------------------------
| Pre-calculate formulas during export
|--------------------------------------------------------------------------
*/
'calculate'                   => false,
```

これを *true* とする事で解決。セル関数が計算されるようになりました。

PHPExcelを直接つかっている場合は PHPExcel/Classes/PHPExcel/Writer/Abstract.php に
preCalculateFormulasプロパティを変更するためのメソッドが用意されているので
これを利用すると良いと思います。
https://github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/Writer/Abstract.php#L110

# LaravelExcelのバージョン
```
2.1.xx
```

2系はPHPExcelのラッパーになっていて
3系はPHPSpreadsheetのラッパーになっているみたいです。

PHPExcelは開発終了していることもあって LaravelExcelの2系も2018年5月15日にEOLを迎えるようです。
https://github.com/Maatwebsite/Laravel-Excel

# ケース
Laravelを使ったWebサイトで、雛形となるExcelシートに値を埋めてダウンロードする機能がありました。
Excelシートにはセル関数もあって、プログラムがセットした値を元に集計値とか出るようになっていました。

# 症状
ある日を境にセル関数が計算されなくなってしまいました。
ダウンロードしたエクセルを開くとセル関数が消えているわけでもないのに、計算されていないのです。
セル関数が消えてしまっているわけではなく、対象のセルを一度「編集状態」にするとしっかり計算される状況。
なんでやねん。
Excelの計算方式も「自動」になっているのに。。

# 原因
Office365のバージョンアップが影響している模様で
Twiiterとか見てるとちらほら困っている人がいるようですね。

こちらの記事でも紹介されていました。
https://qiita.com/makasn/items/98b4995266661ec1659f
https://qiita.com/no22@github/items/3401b10d2e389b9ed55e
lambdaで EC2の起動停止をする


・INCETANCE_IDは環境変数に追加

## StartEC2Instance
```
const INSTANCE_ID = `${process.env.NODE_ENV}`;
 
var AWS = require('aws-sdk'); 
AWS.config.region = 'ap-northeast-1';
 
function ec2Start(cb){
    var ec2 = new AWS.EC2();
    var params = {
        InstanceIds: [
            INSTANCE_ID
        ]
    };
  
    ec2.startInstances(params, function(err, data) {
        if (!!err) {
            console.log(err, err.stack);
        } else {
            console.log(data);
            cb();
        }
    });
}
exports.handler = function(event, context) {
    console.log('start');
    ec2Start(function() {
        context.done(null, 'Started Instance');
    });
};
```

## StopEC2Instance
```
const INSTANCE_ID = `${process.env.NODE_ENV}`;

var AWS = require('aws-sdk'); 



AWS.config.region = 'ap-northeast-1';
 
function ec2Stop(cb){
    
    var ec2 = new AWS.EC2();
    var params = {
        InstanceIds: [
            INSTANCE_ID
        ]
    };
  
    ec2.stopInstances(params, function(err, data) {
        if (!!err) {
            console.log(err, err.stack);
        } else {
            console.log(data);
            cb();
        }
    });
}
exports.handler = function(event, context) {
    console.log('start');
    ec2Stop(function() {
        context.done(null, 'Stoped Instance');
    });
};
```
CoreNFCでICカードを読み込む。

皆さんこんにちは。
現在Swift言語とCoreNFCでICカードを読み込む機能が入ってるアプリを開発中です。
でも今迷っています。ちゃんと資料を読んだり調べたりしてインタネットの通り情報を確認し、実装してみましが、なかなかsuicaカードを読み込むことができなかったです。本当に困っています。
他のカードを読み込んでみたいなあと思って結局マスターカードが読み込めました。でもsuicaカードはできなかった。;(
なので、恐れ入りますが、この投稿を書いて出します。皆さんからの力を貸して頂けませんか。
何かわかりましたら教えて頂けば幸いと思います。
よろしくお願い致します。
ちなみに以下は自分のコードであります。
entitlementsファイルに
<key>com.apple.developer.nfc.readersession.formats</key>
    <array>
        <string>NDEF</string>
    </array>
を追加済みです。
/// ボタン
    @IBAction func onClickToScan(_ sender: UIButton) {
        if NFCNDEFReaderSession.readingAvailable {
            session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
            session?.alertMessage = "NFCタグをiPhoneに近づけてください"
            session?.begin()
        } else {
            print("NFCが使えません")
        }
    }
    
    /// 読み取りエラーが起こった時呼ばれる。ユーザーがキャンセルボタンを押すか、タイムアウトしたときに呼ばれる。
    func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
        print("error:\(error.localizedDescription)")
    }
    
    /// 読み取りに成功したら呼ばれる。
    func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
        for message in messages {
            for record in message.records {
                print(String(data: record.payload, encoding: .utf8)!)
            }
        }
    }
WordpressとMySQLでトランザクション処理をする

一度の処理で複数のテーブルを更新する際、予期しないエラーが発生して中途半端にデータが更新されて放置されてしまう可能性がある。
それを避けるためにテーブルを更新する前にトランザクションを開始して、エラーが発生したらロールバック、処理が成功したらコミットしたいという事でネットの海から情報を拾ってソース書いた。

```php
function hogehoge() {
    global $wpdb;

    // トランザクションを開始
    $wpdb->query("START TRANSACTION"); // BEGINでもOK

    // 処理対象のテーブルをロック(table_name1, table_name2は適宜変更)
    $wpdb->query("LOCK TABLES table_name1 WRITE, table_name2 WRITE");

    try{
        // 更新処理
        $result = update_hogehoge();

        // エラー起こしてないか確認
        if( is_wp_error( $result ) ){
            $wpdb->query('ROLLBACK'); // Rollback
            // 必要があればエラー処理
            return;
        }

        $wpdb->query('COMMIT'); // Commit

    }catch( Exception $e ){
        $wpdb->query('ROLLBACK'); // Rollback
        // エラー処理をもごもご

    }finally{
        // テーブルのロックを解除
        $wpdb->query('UNLOCK TABLES');
    }
}
```

#注意事項
##ストレージエンジン
MySQLのストレージエンジンがinnoDBじゃないとトランザクションが使えないので要注意。
ストレージエンジンの違いは↓を見てみるといいのかもしれない
http://shindolog.hatenablog.com/entry/2015/04/01/185703

##テーブルロック
安意なテーブルロックはデッドロックを助長するのでご利用は計画的に。

テーブルロックのWRITEロックとREADロックの意味は↓を参考に
http://sawara.me/mysql/1918/

__MySQLのテーブルロックはROLLBACKしてもUNLOCK TABLESをかけないと解除されない__ので注意。詳しくは[MySQLのリファレンス](https://dev.mysql.com/doc/refman/5.6/ja/lock-tables-and-transactions.html)を参照のこと。
テーブルロックとtry〜finallyでUNLOCKはセットにしとくと安心。

try / catch / finallyについては[php.net](http://php.net/manual/ja/language.exceptions.php)を見てみよう。

###2018/10/27 追記
try〜finallyでtryの中でreturnを行ってもfinally句に記述されている処理はreturn前に実行されます。
ただし、finally句にreturnを記述するとfinally句からストレートに関数の呼び出し元に戻されるので、finally句の外に予め書いてた処理が行われません。

詳しくは↓の記事をご参照ください。
[try-catch-finally句内のreturnについて - Qiita](https://qiita.com/eijenson/items/7e9e112e69b37f72353c)

#さいごに
至らぬ所がございましたらご助言、編集依頼いただけますと幸いです。
phpmdやphpcsの設定XMLを簡単に作成する

# ここだけ読めばいい

下記サイト便利です。
チェック入れたり数字変えるだけでxmlができます。

[PHP Coding Standard Generator](http://edorian.github.io/php-coding-standard-generator/#phpmd)

![580d7f2c-7124-403a-8488-7bf48f2184a7.png](https://qiita-image-store.s3.amazonaws.com/0/90155/be5319b9-06b6-4e60-05ee-87644f4bc68d.png)


# 見つけた背景

ATOMでlinter-phpmdを使用していますが、設定方法をちゃんと調べて設定するのがめんどくさかったので、そのまま使ってました。packageの設定で「cleancode, codesize, controversial, design, naming, unusedcode」のどれを使うかぐらいは設定できたので、それをいじってたぐらい。

でもやっぱりルール厳しすぎてもっと緩めたくなったことが何度もあって、ふと「誰かgeneratorぐらい作ってんだろ」って思って「phpmd generator」でぐぐったら、やっぱりありました。

作ってくれた人ありがとう。
laravelでphp artisan db:seed すると does not exist とエラーが出る

laravel5.5 の環境で確認。

```
php artisan db:seed
```
を実行したら

```
In Container.php line 752:
   Class hogehogeSeeder does not exist
```

と表示されて止まってしまう場合。

```
composer dump-autoload
```

を実行してからもう１回やると、正常に実行されます。
pyenvでもanacondaでもjedi-vimを動かす

pyenvもpipenvもanacondaも全てに対応。鉄の意志で。

# やること
今のシェルで呼び出せるpythonを補完する設定です。
~/.vim/ftplugin/python.vim
をこうしました。

```vim
pythonx << EOF
import subprocess
import sys
path = subprocess.run(['python','-c','import site; print(site.getsitepackages()[0])'],
                      stdout=subprocess.PIPE).stdout
path = path.strip()
path = path.decode('utf-8')
path = str(path)

if not path in sys.path:
    sys.path.append(path)
EOF
```

# 解説
最近のpythonではシェルを使うにはsubprocessモジュールのrun()を使うのが良いらしいです。

run()は第一変数にコマンドラインをスペースで分けたリストを放り込めば良いようです。
で、結果を取得したい場合はstdout=subprocess.PIPEというのをつけねばならぬらしい。
返り値はsubprocessモジュールで定義されたオブジェクトで、
その中のstdoutという変数に結果が格納されるようです。
文字列には改行文字が含まれていたりするのでstripで取り除いてあげます。
文字列はバイトの文字列なので、utf-8にデコードしてあげないといけません。

クソ面倒くさくね(´・ω・｀)？

でもまぁ、これでどんなpythonの環境でもjediの力が及ぶわけです。
フォースとともにあらんことを。
Go言語のAWS Lambdaから別Lambdaを呼び出そう

AWS LambdaをGo言語で書いて、別Lambdaを呼び出したりしたのでメモを残す。
誰かのお役に立てば。


# 1. 別のLambda Functionを呼び出す

```golang
package main

import l "github.com/aws/aws-lambda-go/lambda"
import "github.com/aws/aws-sdk-go/service/lambda"
import "github.com/aws/aws-sdk-go/aws"
import "github.com/aws/aws-sdk-go/aws/session"
import "fmt"
import "encoding/json"

// これはLambda関数の完了で返すための構造体定義
type Response struct {
    Message string `json:"message"`
    Ok      bool   `json:"ok"`
}

// 別のLambdaに渡すための構造体定義
type Event struct {
    Id   int    `json:"id"`
    Name string `json:"name"`
}

func Handler() (Response, error) {
    // 呼び出したLambdaに渡すデータ
    payload := Event{
        Id:   1,
        Name: "yukpiz",
    }
    jsonBytes, _ := json.Marshal(payload)

    // このlambdaはaws/aws-lambda-go/lambdaではなく、
    // aws/aws-sdk-go-aws/service/lambdaなので注意
    svc := lambda.New(session.New())

    input := &lambda.InvokeInput{
        FunctionName:   aws.String("arn:aws:lambda:ap-northeast-1:xxxxxxxxxx:function:{function_name}"),
        Payload:        jsonBytes,
        InvocationType: aws.String("Event"),
    }

    resp, _ := svc.Invoke(input)
    fmt.Println(resp)

    return Response{
        Message: "success",
        Ok:      true,
    }, nil
}

func main() {
    l.Start(Handler)
}
```

InvocationTypeはLambdaの呼び出しタイプ。EventとRequestResponseが選べるやつ。
[呼び出しタイプ - AWS Lambda]
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-invocation-options.html

InvokeInput構造体はその他のいくつかのオプションがある。
[lambda - Amazon Web Services - Go SDK]
https://docs.aws.amazon.com/sdk-for-go/api/service/lambda/#InvokeInput


# 2. HandlerでEventを受け取る

呼び出される側のLambda関数では、呼び出し元から渡された構造体を受け取る必要がある。

```go
package main

import l "github.com/aws/aws-lambda-go/lambda"
import "fmt"

// 呼び出し元のLambdaから受け取るための構造体定義
type Event struct {
    Id   int    `json:"id"`
    Name string `json:"name"`
}

func Handler(event Event) (Response, error) {
    fmt.Println(event) //{1 yukpiz}
    return Response{
        Message: "success",
        Ok:      true,
    }, nil
}

func main() {
    l.Start(Handler)
}
```

このあたりも参考に
[Lambda Function Handler(Go) - AWS Lambda]
https://docs.aws.amazon.com/lambda/latest/dg/go-programming-model-handler-types.html

負荷分散の為に、別Lambdaを呼び出す構造は割とスタンダードのよう。
Step Functionsで負荷分散の並列処理ができるようになってほしい。
Docker for WindowsでJupyter（公式よりは軽く）

# [昨日はXした](/kfjt/items/369c48686c849c0042a9)
- コンソールさわるの飽きた
- Windows側でコード書きたい
- デーモンとして動いてて欲しい

# それjupyterで
- え、それWindowsとか関係な(ry
- 昨日は[Python公式](https://store.docker.com/images/python)が700MBでがっかりしたけど
- 今日は[Jupyter公式](https://github.com/jupyter/docker-stacks)が700MBで絶望した

# できた
- 注意：セキュリティ無視、ポート開放に気を付けてください
- 前提の環境は[昨日Xした](/kfjt/items/369c48686c849c0042a9)のと同じ
 - Docker for Windows のみ

### コンセプト
- Ubuntu（ベース80MBくらい？）
- Python3（標準ではいってる）
- Chainer v4.0.0（stableなやつ）
- 340MBくらいになった
 - もっとまじめに小さくするならtiniとか入れるのかな
 - あとUbuntuでなくAlpineにするか

### 成果物
- つぎの３ファイルを同じフォルダにおいて`jupyter_up.bat`を叩く

```yml:docker-compose.yml
version: '3'
services:
  jupyter:
    build: .
    volumes:
      - C:\data:/data
    ports:
      - "8888:8888"
```
```dockerfile:Dockerfile
FROM ubuntu

RUN apt-get update -y \
    && apt-get install -yq --no-install-recommends \
    python3-setuptools \
    python3-pip \
    && rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* \
    && python3 -m pip install --upgrade pip \
    && python3 -m pip install --no-cache-dir wheel jupyter matplotlib numpy==1.13 chainer==4.0.0

EXPOSE 8888

CMD ["jupyter", "notebook", "--allow-root", "--no-browser", "--NotebookApp.token=''", "--ip=0.0.0.0"]
```
```sh:jupyter_up.bat
pushd %~dp0
docker-compose up -d --build
popd
timeout 1
start http://localhost:8888/
```

# お約束のMNIST
- Windows側で`C:/data`以下に[train_mnist.py](https://raw.githubusercontent.com/chainer/chainer/v4.0.0/examples/mnist/train_mnist.py)を取得しておく
- ブラウザで[data](http://localhost:8888/tree/data)以下のフォルダを辿り`train_mnist.py`があるフォルダに移動する
- Jupyterのメニュー`New -> Python3`でnotebookをつくる

```python:notebook_Codeセル
%run -i train_mnist.py
```
```python:notebook_Markdownセル_Code実行後に確認用
- accuracy
<img src="result/accuracy.png">
- loss
<img src="result/loss.png">
```
- うえのをipynbに保存したらこう

```text:train_mnist.ipynb
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "%run -i train_mnist.py"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- accuracy\n",
    "<img src=\"result/accuracy.png\">\n",
    "- loss\n",
    "<img src=\"result/loss.png\">"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
```

おわり
TravisCI , F# and Paket ( brew install paket )

# Summary

`TravisCI`で`Paket`をインストールする

# Like this

point is `-- without-mono`

`.travis.yml`

```yaml
language: csharp

os: osx
osx_image: latest
mono: latest

before_install:
    - brew update
    - brew install paket --without-mono
```
AMPでサイズ不明の画像を表示する

通常のウェブサイトをAMPに対応させる場合、`img`タグを`amp-img`タグに変更する必要があります。その際に**「サイズの分からないこの画像、どうやって表示させればいいんだ…」**と頭を悩ませていたんですが、公式に答えがありました。公式 is 神。

> We can solve this problem by combining AMP's fill layout with the object-fit CSS property. The object-fit property helps us ensure that the image maintains its aspect ratio while being resized via the fill layout.

https://ampbyexample.com/advanced/how_to_support_images_with_unknown_dimensions/

つうことで、サイズが固定されたブロックの中で、画像に対して`object-fit: contain`を使えば良いとのことで、無事実装完了。

気になるこの`object-fit`っつう、見慣れないCSSプロパティ。調べたら、`background-size`みたいな感じで、親ブロックに対するふるまいを定義出来るプロパティで、画像をクロップしたりするのに便利っぽい。**たーだーしー、IEはゴリゴリ未対応！**今回はAMPだからいいかな、ってことでこの件終了。

https://developer.mozilla.org/ja/docs/Web/CSS/object-fit
GWも明けたので社会人1ヶ月間を振り返ってみる

##**はじめに**
こんにちは、教育業界に就職した新米データサイエンティストです。
現在データサイエンティスト新人研修を自分で組み、取り組んでいます。

> **[新米データサイエンティスト、研修プログラムを考える。](https://qiita.com/s_yaginuma/items/a9c97f62d9bec129c33b)**

約１ヶ月経過した今、「統計学の時間」と「東大松尾研の演習コンテンツ」を終え、CouseraのMachine Learningに入っています。
今回はGWも明けたということで、1ヶ月間新人研修をやってきて感じたことなどを振り返ってみようと思います。

##**最初に全体をざっと知ることが出来て良かった**
自分的に、最初の段階で松尾研の演習コンテンツに取り組んだのは正解だったと思っています。

> **[GCIデータサイエンティスト育成講座演習コンテンツ](http://weblab.t.u-tokyo.ac.jp/gci_contents/)**

コンテンツ構成が、最初にNumpyやpandas、matplotlibなどの必須パッケージの使い方を学ぶところから始まり、次にデータの前処理、可視化、モデル構築＆予測、評価＆モデル改善といった実際のデータ分析の流れに沿った章立てで学ぶことが出来ます。

さらに、このコンテンツでは演習問題がかなり充実していました。オライリーの機械学習関連の本は、コードは記載されていても演習問題はないものが多いと感じていたので、演習問題が豊富なこのコンテンツはかなり有り難かったです。データ分析の流れを様々なデータに対して繰り返し行うことができ、Kaggleに挑戦したいと思うきっかけにもなりました。
問題もステップバイステップという感じで、導入付きの数学の問題を解いているような印象でした。

これにより、必要最低限のパッケージの知識を得ることが出来ましたし、データ分析の全体のイメージをつかむことができました。
エラーなどでハマるポイントも少なく、スムーズに学習を進めることができました。
これからデータサイエンスを学びたいという方には強くお薦めしたいです。

##**インプットとアウトプットのバランス**
至極当たり前のことなんですが、改めて感じました。

というのも、2週目の研修が終わった段階でKaggleのタイタニックデータに挑戦してみたのですが、写経とは違い、実際に自分の頭を探りながらデータの前処理をしたり、モデルを構築してトレーニングデータへの予測精度が出す、という一連のプロセスを実行できたことがすごく自信になりましたし、欠損値の処理方法や他のモデルの適用など自分に足りないものも見えてきました。

実際、モデル構築はただscikit-learnを使っているだけだったり、そこまで高い精度が出たわけでは無いのですが、すごく達成感があり、学習意欲が湧きました。

何かの本で、「アウトプットは次のためのインプット」ということをおっしゃっている人がいたのですが、まさに同じようなことを感じています。

- インプットした知識を元にアウトプットすることで知識を「知っている」から「使える」に変えること
- 理解の足りない部分、必要な部分が分かり、次に進むべき方向を見定めること


などの意味合いがあると思っていて、目標達成までに定期的にアウトプットをしていくことは、必要だなあと感じています。

> **[新米データサイエンティストが覚えたての知識を使ってKaggleのタイタニックデータを分析し、投稿してみた！](https://qiita.com/s_yaginuma/items/4fa07cd1cde519a7e3d4)**

>**[KaggleのCTOが教えてくれた”AIエンジニアに超オススメな8つの学習ステップ”](http://blog.team-ai.com/8steps-for-studying-ai/)**


##**必要性のないものはあんまり身につかない**
これは僕自身に限った問題かもしれません（笑）

これを感じたのは、主に東大松尾研の演習コンテンツに取り組んでいる時です。
こちらの演習コンテンツは、pandasやmatplotlibなどのライブラリの使い方から、SparkやMongoDBなど広い範囲をカバーしています。

データ分析を進める上で必須になってくるであろう、pandasなどライブラリの使い方や、モデル構築、交差検証、グリッドサーチなどはかなり必要性を感じながら進めることができたのですが、SparkやNoSQLの部分は、これからおそらく必要になるタイミングはいずれ来るのでしょうが、現時点ではSQLが書ければ十分だったり、まだ分散処理を使うほどデータが大きくなかったりと必要性を感じることができず、正直あまり学習に身が入りませんでした。

なので、やはり現時点での必要性を感じないものは意欲を持って学習しづらく、身につかないのかなと思いました。
そこで、「鉄は熱いうちに打て」と言いますが、現時点で必要性を感じているものに関してはたくさん調べて深め、その上で新しいことにどんどん挑戦して、学ぶ必要性があるものを増やしていくということが大事なのかなと感じました。

##**終わりに**
まだまだ駆け出しですが、１ヶ月の研修を振り返ってみました。
道は長いですが、今後もマイペースにやっていけたらと思っています。
今月はCouseraのMachine Learningをやり、終了後GCP関連の講座に入っていく予定です。
js 引数が各位の数と位置による数のべき乗の合計と等しいか

##題
与えられた数値が、各位の数字と位置による数字のべき乗の合計と等しいか判定する。
（詳しくは下記例を参照ください。）
正の場合は`yes!!` 偽の場合は`not!!`を返す。
*与えられる数は常に正の数
*文字を返してください

例
`f(89)// yes!!`
$8^1$+ $9^2$ = 89
与えられた数と合計が一致する

`f(564)//not!!`
$5^1$+ $6^2$ + $4^3$ = 546
与えられた数と合計が一致しない

```javascript
function f(n){
  //your code here

}

f(89);// yes!!
f(564);//not!!
f(135);// yes!!
f(136586);//not!!
```


##使ったもの
String();
split();
for
Math.pow();
if


##考えかた
与えられた数値を文字へ変換し、分割して配列にいれる。
for文で各位の数と位置の数をべき乗して合計していく。
最後に引数と合計した数を判定する。

##コード

```javascript
function f(n){
  //your code here
  let array = [];
  let sum = 0;
  let num = 0;  
  let str = String(n);
  array = str.split('');
  for(let i = 1 ; i <= array.length ; i++){
	num = Number(array[i -1]);
    sum += Math.pow(num, i)
  }
 
  return sum == n? 'yes!!':'not!!';
}
f(89);
```

##その他コード

```javascript
const f = (num) => (
  [...num + ''].reduce(
    (acc, n, i) => acc + Math.pow(n, i + 1), 0
  ) === num ? 'yes' : 'not'
) + '!!';
```

その他コード浮かんだ方、コメントお願いします。
Ethereum: Web3.pyで取得したトランザクション・ハッシュを文字列へ変換する

メモ書き。Web3.pyでtx_hashを扱う場合は `str(tx_hash)` しても素直に文字列にならないので注意。
以下のように変換する必要がある。

```python
tx_hash.hex()
```

# 原因
Web3.py でトランザクションを取得する場合、返り値の型は `<class 'hexbytes.main.HexBytes'>` であるため。

# 吐かれるエラーの例

```bash
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbb in position 0: invalid start byte
```

# 環境
- Python 3.6.1
- AWS Lambda
- Web3.py 4.2.0
Reactでイベントハンドリングするときは

# 概要
Reactでイベントハンドリングするときに関数が未定義だよって言われたことありません？あっ、ないんですか、、そうですか、、、。

# 3つの方法で回避

## バインディングしよう

これが基本らしいよ

```jsx
class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // ！これが必要！
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);
```

##  public class fields syntax?を使う

つまりこんな感じで書く

```jsx
class LoggingButton extends React.Component {
  // This syntax ensures `this` is bound within handleClick.
  // Warning: this is *experimental* syntax.
  // ！ここね！
  handleClick = () => {
    console.log('this is:', this);
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        Click me
      </button>
    );
  }
}
```

[create-react-app](https://github.com/facebook/create-react-app)ではこれがデフォルトやねんて、俺もこれ使お

## アロー関数を使う

なるほど〜

```jsx
class LoggingButton extends React.Component {
  handleClick() {
    console.log('this is:', this);
  }

  render() {
    // This syntax ensures `this` is bound within handleClick
    return (
      <button onClick={(e) => this.handleClick(e)}>
        Click me
      </button>
    );
  }
}
```

## 余談：引数渡すとき
```jsx
<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
```

### 🙆

全部このチュートリアルに書いてあった話

https://reactjs.org/docs/handling-events.html
Pugの改行<br>のはなし

大した内容ではないんですが、ググって出てくる回答がイマイチな気がしたので、Pugの改行タグ\<br>の話。

## これをPugで書きたい。
```html:html
<p class="class">
  pタグです<br>
  pタグです<span>spanタグです</span><br>
  pタグです
</p>
```

## 基本的な書き方

```pug:pug
p.class pタグです
  br
  | pタグです
  span spanタグです
  br
  | pタグです
```
なんとなく見づらいし、どこで改行されるのかがわかりづらい。

## こうしてみたらどうでしょう。
複数行の文章を書く際は、かならず改行してから「|」で始めるようにします。

```pug:pug
p.class
  | pタグです
  br
  | pタグです
  span spanタグです
  br
  | pタグです
```
少し見やすくなった気がします。

## 多分これが一番見やすいと思います
\<br>タグは普通にそのまま書いちゃいます。

```pug:pug
p.class
  | pタグです<br>
  | pタグです
  span spanタグです<br>
  | pタグです
```
若干アウトローな書き方ではありますが、htmlタグは普通に読み取ってくれるのでこの方法でも動きます。
\<br>だけ特別扱いすることになるので、採用するかはお好みですが。
文章が長くなってくると、無駄に行数が増えない点が効いてくるんじゃないかと思います。
見た目も（この場合spanが入ってるので若干見辛いですが）表示に近いため読みやすいのではないかと。
いっそインライン要素はそのままhtmlタグで書いてもいいかもしれないですね。

```pug:pug
p.class
  | pタグです<br>
  | pタグです<span>spanタグです</span><br>
  | pタグです
```


## まとめ
まとめるほどの内容でもないんですが、Pugはbrだけなんだかちょっと苦手です。
今回の解決法もあまり推奨できる方法ではない気もしますが、こんなやり方もあるよってことで。
openFrameworks0.10.0でofxBox2dを動かす(Windows)

#概略
openFrameworks0.10.0がリリースされました。新しい環境でofxBox2dと呼ばれる2次元の物理エンジンAddonを動かしてみたました。

openFrameworks 0.9.8の時はofxBox2dを利用するのに少し手を入れる必要がありました。今回、作業量は減ったのですが、修正が必要な箇所がありましたので、情報共有致します。

なお、openFrameworks 0.9.8の時の情報は自身のblogで共有しておりますので、必要な方はご参照下さい。

ofxBox2dをWindows環境で使う
http://junkiyoshi.com/use_ofxbox2d_on_windows_os/

#開発環境
Windows 10
Visual Studio 2017
openFrameworks 0.10.0
ofxBox2d

#本編

ofxBox2d
https://github.com/vanderlin/ofxBox2d

![cap_6.PNG](https://qiita-image-store.s3.amazonaws.com/0/151530/d00f7e5d-4d2f-bcb1-dc39-c8795f842cab.png)

ofxBox2dはGitHubにて公開されておりますので、こちらからAddonを取得します。なお、ReadMeにはopenFrameworks 0.10.0ではmasterブランチを使うように指示がありますので、そちらを引っ張ってきましょう。

![cap_7.PNG](https://qiita-image-store.s3.amazonaws.com/0/151530/10bc98e3-b833-b59e-6e47-0ed91b66f0be.png)

前のバージョンと同じく、openFrameworksのインストールフォルダ内にあるAddonsフォルダへ配置をしてあげれば大丈夫です。

openFrameworks plugin for Visual Studio 2017から新規プロジェクトを起動する際のダイヤログのCommunity addonsにofxBox2dが含まれているはずですので、チェックを入れましょう。

![cap_8.PNG](https://qiita-image-store.s3.amazonaws.com/0/151530/7f686e1e-d016-0863-5f7e-70b764af2085.png)

なお、ofxBox2dを使う・使わないに限らず、openFrameworks plugin for Visual Studio 2017を使用して新規プロジェクトを作成した際、プラットフォームセットという項目が2015になっています。このままではビルドがエラーになるので、プロジェクトのプロパティからVisual Studio 2017へ直してあげましょう。

![cap_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/151530/88a72fd0-0cce-4191-ffc3-41b0eb46c972.png)

![cap_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/151530/97d0d763-c772-1753-bd76-a2a5a1633548.png)

上記が修正出来たら、一旦ビルドをしてみます。するとofxBox2d関連のヘッダーファイルが見つからないというエラーが沢山出ます。

![cap_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/151530/faf1c6d8-5faa-94c0-6f6b-4bdbf5545ae6.png)

ファイル検索で指定されたファイルを見てみると、ヘッダー自体は存在するようです。

![cap_4.PNG](https://qiita-image-store.s3.amazonaws.com/0/151530/eda1092a-fea3-0b22-dff4-2fa8b9e1d9fb.png)

プロパティから追加のインクルードディレクトリを確認すると、検索で見つかったディレクトリに対するパスが足りないようなので、追記します。

追記行は、青色でハイライトがついている行です。インストールされた環境ごとでパスなどは違うはずですので、検索結果や他の値を参考に適宜設定して下さい。

![cap_5.PNG](https://qiita-image-store.s3.amazonaws.com/0/151530/b101d525-aa8e-2846-4343-b9ada2bc330f.png)

私の環境では、これでビルド・実行まで出来るようになりました。

#おまけ
普段はSNS(Instagram / Twitter)やBlogでopenFrameworksで作った動画＆元となったソースコードを公開しております。ofxBox2dを使った動画やソースも公開してありますので、興味のある方はご覧になって下さい。

プログラミング DE 落書き
http://junkiyoshi.com/

ありがとうございました。
【LINUX】複数ファイルの移動・リネーム（xargs mv）

Linuxで同じディレクトリーである複数ファイルを別のフォルダーに移動し、リネームする方法を紹介します。
処理を纏めてシェルに書いてから、シェル実行するという形にします。

###  Shell実施前：ディレクトリー参照
```shell-session:
[root@localhost ~]#
[root@localhost ~]#ls /var/www/html/dir1
file1.txt file2.txt sample.txt
[root@localhost ~]#ls /var/www/html/dir2
[root@localhost ~]#
```

###  Shell実施

####　shellファイル

```shell:rmFiles.sh
# パス定義
## 移動元パス
dir1=/var/www/html/dir1
## 移動先パス
dir2=/var/www/html/dir2


# ログ出力
## ログファイル
logfile=/var/www/html/log/`date '+%Y%m%d'`'.log'


# メイン
exitcode=0
filecount=`find $dir1 -type f | wc -l`
if [[ $filecount -ne 0 ]]; then
      ls $dir1 | grep -v total | xargs -i mv -f $dir1/{} $dir2/{}.`date -d yesterday '+%Y%m%d%H%M%S'`
      if [[ ${?} -ne 0 ]]; then
            echo `date` " [ERROR] ファイル移動に失敗しました。" | tee -a $logfile
            exitcode=1
      fi
      echo `date` " [SUCCESS] ファイル移動に正常終了しました。" | tee -a $logfile
fi

exit ${exitcode}
```

####　shellファイル起動

```shell-session:
[root@localhost ~]#
[root@localhost ~]#./var/www/html/rmFiles.sh
user : root
2018年 5月 9日 水曜日 10:01:01 JST  [SUCCESS] ファイル移動に正常終了しました。
[root@localhost ~]#
```

###  Shell実施後：ディレクトリー参照
```shell-session:
[root@localhost ~]#
[root@localhost ~]#ls /var/www/html/dir1
[root@localhost ~]#ls /var/www/html/dir2
file1.txt.20180509100101 file2.txt.20180509100101 sample.txt.20180509100101
[root@localhost ~]#
[root@localhost ~]#cat /var/www/html/log/20180509.log
2018年 5月 9日 水曜日 10:01:01 JST  [SUCCESS] ファイル移動に正常終了しました。
[root@localhost ~]#
```