OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Registry V2でタグを削除可能にする


### registry

```registry-srv.yml
version: 0.1   

storage:
  filesystem:
    rootdirectory: /var/lib/registry
  delete:
    enabled: true
http:
  addr: 0.0.0.0:5000
```

```bash
docker run -d -p 5000:5000 \
    -v $(pwd)/registry-srv.yml:/etc/docker/registry/config.yml:ro \
    -v /var/opt/docker-registry:/var/lib/registry \
    --name registry-srv registry:2.3.0
```

### hyper/docker-registry-web

```registry-web.yml
registry:
  # Docker registry url
  url: http://registry-srv:5000/v2
  # Docker registry fqdn
  name: localhost:5000
  # To allow image delete, should be false
  readonly: false
  auth:
    # Disable authentication
    enabled: false
```

```bash
docker run -it -p 8080:8080 \
    -v $(pwd)/registry-web.yml:/conf/config.yml:ro \
    --link registry-srv \
    --name registry-web hyper/docker-registry-web
```

https://docs.docker.com/registry/configuration/#overriding-the-entire-configuration-file
Anaconda Navigator（Mac)が起動しないとき

#Anaconda Navigatorが起動しない
Anaconda(Mac)を使ってみようと公式サイトからインストーラーをダウンロードしインストールしたが、アプリケーションから起動しようとしたが強制終了してしまった。
再インストールしても状況が変わらなかったので、コマンドラインから起動したら以下のエラーが出ていた
```binstar_client.errors.BinstarError: ~/.continuum/anaconda-client: Permission denied
```
なので、```Sudo```を使って起動したら無事実行できた

##環境
macOS 10.12.4
anaconda 4.3.1
python 3.x
サーバー監視ツール netdata

## netdata
https://github.com/firehol/netdata

Mastodon のインスタンスで使ってるところがあったのでさっそく真似る。

![netdata.png](https://qiita-image-store.s3.amazonaws.com/0/15175/e3e6e1d6-951f-29d7-b502-247f29abe4bc.png)

## 検証環境
* CentOS 7.3.1611
    * [Mastodon を CentOS にインストールする (Docker未使用)](http://qiita.com/bezeklik/items/1a8530d530613acd665c) で構築したサーバー

## インストール
```
yum install PyYAML autoconf automake {libmnl,libuuid}-devel lm_sensors nmap-ncat python-psycopg2
git clone https://github.com/firehol/netdata.git --depth=1
cd netdata && ./netdata-installer.sh
firewall-cmd --permanent --add-port=19999/tcp && firewall-cmd --reload
```

これでおしまい。簡単すぎてやばい。詳細は「[Installation](https://github.com/firehol/netdata/wiki/Installation)」を確認のこと。インストールパッケージは一部省略しているので注意。

```
   - the daemon     at /usr/sbin/netdata
   - config files   in /etc/netdata
   - web files      in /usr/share/netdata
   - plugins        in /usr/libexec/netdata
   - cache files    in /var/cache/netdata
   - db files       in /var/lib/netdata
   - log files      in /var/log/netdata
   - pid file       at /var/run/netdata.pid
   - logrotate file at /etc/logrotate.d/netdata
```

ファイル類は上記のディレクトリに保存されるらしい。

![netdata_applications.png](https://qiita-image-store.s3.amazonaws.com/0/15175/6ec14396-5c2a-4fb6-da90-c17fefbb453c.png)

インストールするだけでプロセス別の CPU 時間とか表示してくれたりする。

![netdata_badge.png](https://qiita-image-store.s3.amazonaws.com/0/15175/7b4557b0-a933-0149-146c-286eccaa2924.png)

バッジ表示もできる。

# モニタリング関連記事
* [サーバー監視ツール netdata](http://qiita.com/bezeklik/items/effb70453a58415ad5dc)
* [サーバー監視ツール Munin](http://qiita.com/bezeklik/items/c4863c4114e0c339412b)
* [サーバー監視ツール Xymon](http://qiita.com/bezeklik/items/0f1234d8c9a2b54ec986)
* [サーバー監視ツール Zabbix](http://qiita.com/bezeklik/items/1f638727d6485ce9b931)
* [サーバー監視ツール Hinemos](http://qiita.com/bezeklik/items/f24077009f730eadbab1)
* [サーバー監視ツール Sensu](http://qiita.com/bezeklik/items/d026e9db4d5305165273)
React Native Debugger で Style 調節をする

1. Inspector で要素の選択
2. Style など編集


![react-native-debugger-1.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/116210d8-b7a5-15c6-0a1d-f560ff3b77d0.gif)

![react-native-debugger-2.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/f6d29708-3234-4183-6140-c5e871ec25b6.gif)

Hot Reloading よりさらに細かく確認したいとき用
Ectoでバリデーション


## 概要

`Ecto.change_set`を使用して、値が変更された時にバリデーションを行う。

```exs:example
defmodule Example do
  use Ecto.Schema
  import Ecto.Changeset

  schema "example" do
    field :user_id, :integer
  end

  def changeset(example, params \\ %{}) do
    example
    |> cast(params, [:user_id])
    |> validate_required([:user_id])

  end
end
```

## example

下記のように値が変化した時にバリデーションが走る。
`validate_required`で存在チェックをしている。
`user_id`を`nil`に更新しようとすると無効な更新となる。

```
iex>  %Example{user_id: 1}  |> Example.changeset(%{user_id: nil})
#Ecto.Changeset<action: nil, changes: %{user_id: nil},
 errors: [user_id: {"can't be blank", [validation: :required]}],
 data: #Example<>, valid?: false>
```
覚えたVimコマンド


#はじめに
仕事ではWindowsをメインに作業しているため、ターミナルを使用することは稀でした。

ただ、最近はRaspberry Piという便利な制御端末が出てきたり、自前のブログの管理にLinuxを触ったりという機会が増えてきたので、せっかくだからVimを覚えようと思い立ちました。

備忘録的な意味で、覚えたコマンドをメモしていこうと思います。

表記の補足
※ コマンドは基本ノーマルモードでの入力です
※ 「,」区切りで記載しているキーは、対応する複数のキーを示しています
※ 「Shift+v」などは、Shiftを押しながらvを押下することを示しています

#初めから知っていたコマンド
これまでもたまにターミナルを使う機会はあったので、最低限以下のようなコマンドは知っていました。
でも、正直これだけだと使いにくいので、最低限の編集に使うだけでした。
Vimはすごい！という話も聞きますが、上達すれば、本当に早く編集できるんでしょうか…と思っていたのが正直なところ。

|キー|内容|
|---|---|
|h, j, k, l |キー移動 |
|i|文字の手前で入力モード切り替え|
|a|文字の後ろで入力モード切り替え|
|gg|先頭の行にカーソル移動|
|G|末尾の行にカーソル移動|
|yy|行コピー|
|dd|行削除|
|p|貼り付け|
|:w|上書き|
|:wq|上書き保存して終了|
|:q|終了|
|:q!|保存せずに強制終了|

#少し調べてみて、覚えたコマンド
ググればたくさんvimのコマンドを紹介しているサイトが出てきます。
ひとまず簡単に使えそうなコマンドを覚えて、できることを増やしていきます。

|キー|内容|
|---|---|
|I|行の先頭で入力モード切り替え|
|A|行の末尾で入力モード切り替え|
|s|カーソル位置の文字を削除して入力モード切り替え|
|o|下に1行追加して入力モード切り替え|
|O|上に1行追加して入力モード切り替え|
|w|次の単語へ移動|
|b|前の単語へ移動|
|f(指定文字)|行内の指定文字の位置にカーソル移動|
|/(指定文字)|指定文字を検索。nを押すとさらに次の文字を検索。Shift+nで上方向へ検索|
|$|行末尾にカーソル移動|
|^|行先頭にカーソル移動|
|%|対応するカッコに移動|
|(行番号)G|指定行番号の行にカーソル移動|
|u|アンドゥ|
|Ctrl+r|リドゥ|
|J|次の行と連結する|

一文字だけ置き換えたい時はs、先頭に移動して編集したい時はI、末尾に移動して編集したい時はAなど、バリエーションが少し増えてきたので、多少編集しやすくなってきました。

#ビジュアルモードを知る
これまで、コマンドを実行するノーマルモードと、文字を直接編集する入力モードは知っていましたが、範囲選択ができるビジュアルモードもあることを知りました。
イメージとしては、マウスで特定の範囲を選択するような感じです。
vキーを押下して、キー移動をすると、vキーを押した位置を始点として、移動した位置までの範囲が選択状態になります。
選択した範囲に対して、編集、削除等の操作が行えます。
vキーに続けていろんなコマンドを押下することで、選択の方法もかなりバリエーションがあります。

|キー|内容|
|---|---|
|v|文字単位選択のビジュアルモードに切り替え|
|Shift+v|行単位選択のビジュアルモードに切り替え|
|Ctrl+v|ビジュアルモードに切り替え、矩形選択ができる|
|v$|vキーを押下した位置から行末尾まで選択|
|v^|vキーを押下した位置から行先頭まで選択|
|vw|vキーを押下した位置から、次の単語までを選択|
|viw|vキーを押下した位置の単語を選択|
|vaw|vキーを押下した位置の単語と後の空白を選択|
|va"|vキーを押下した位置の単語を前後の"を含めて選択|

また、同様にdやyコマンドも、同じように使えることを知りました。
例えば、yiwでyキーを押下した位置の単語をコピー、dawでdキーを押下した位置の単語を削除など。
思った通りに編集できると、少し楽しくなってきました。

#コマンドに繰り返しの数値を組み合わせる
いくつかのコマンドは、コマンドの前に数値を入れることで繰り返しの回数を指定できます。

|キー|内容|
|---|---|
|2h,2j,2k,2l|各方向に２文字移動|
|3yy|3行コピー|
|4dd|4行削除|
|5J|5行連結|

#数値をインクリメント、デクリメントする
数値の上で、以下のコマンドを打つと、数値のインクリメント、デクリメントができます。
プログラムを作っていると、１足したい、１引きたいという場面があるので、地味に便利です。
これまで使用していたテキストエディタではありえなかった機能なので、最初知った時は面白く思いました。
インクリメントしていって、9になると、次は0に戻るのかと思っていたら、ちゃんと桁が繰り上がります。

|キー|内容|
|---|---|
|Ctrl+a|数値をインクリメント|
|Ctrl+x|数値をデクリメント|

#コピーした文字列の連続貼り付け
ある文字列をコピーして、複数の場所で貼り付けたいと思うことがよくあるのですが、以下のような場合にうまくいきません。

```C#:sample.cs
var test = "エラーメッセージ"
MessageBox.Show("エラー1");
Log.Output("エラー2");
```
このようなコードで、２行目、３行目の"エラー"の部分を、１行目の変数testで置き換えたいとします。
① １行目のtestの部分でyiwコマンドで文字列「test」をコピー
② ２行目の"エラー"の部分でva"コマンドで「"エラー1"」を選択
③ pコマンドで、選択した文字列を削除して、「test」を貼り付け
④ 3行目の"エラー"の部分でva"コマンドで「"エラー2"」を選択
⑤ pコマンドで、選択した文字列を削除して、「test」を貼り付けたいが、③で削除した"エラー1"が貼り付いてしまう 

vimの動作として、文字列を削除した時は切り取りと同じ動作になるようですので、連続でコピーした文字を貼り付けようとするとうまくいきません。

いろいろと調べていると、ひとまず以下の方法で連続コピーができました。
③の操作の際に、ca"コマンドで対象文字列を削除して入力モードに切り替え、その上でCtrl+rを押してから0を押下します。
vimでコピーした時はレジスタ0という場所にコピーされるそうで、
Ctrl+rを押してから0を押すと、このレジスタ0の文字列を貼り付けるという意味になるそうです。
削除した時は、別のレジスタに保管されるため、このような動作になるようです。

ちょっと回りくどいですが、ひとまず連続コピーが実現できました。
ただ、もう少し簡単な方法があればいいんですが...

------

また新しいコマンドを覚えたら追記予定です。
x-codeインストール

# X-codeとは
macで使用する開発ツールです。
Apple社が開発しているので、詳しくはAppleホームページを見てね⭐️

## インストール手順

App Storeで「xcode」で検索する。
<img width="721" alt="スクリーンショット 2017-04-22 2.59.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/4d895a07-51f1-d6f7-f064-5fdb401f11e9.png">

出てきた検索結果から下記をインストールする
<img width="274" alt="スクリーンショット 2017-04-22 3.00.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/c01aabe9-f31e-e3ed-59e6-c81eba00c5d3.png">

以上でX-Codeのインストールは完了です。
まぁ、AppStoreから落としただけですが…

次はx-codeのコマンドラインを確認して見ましょう。（<a href="http://bit.ly/2pZNO3N">x-codeコマンドライン</a>）

# 関連リンク
<a href="http://bit.ly/2pmuy42">リンク一覧</a>
<a href="http://bit.ly/2pjm0el">mac MySQLインストール手順</a>
JetPack導入時に「XML拡張が使用できません」と表示されてしまうときの対処法


こんな初歩的な内容で詰む人もそんなにいないかと思いますが、イマイチググっても出てこなくて10分くらい悩んでしまったので誰かのお役に立てば、ということで書いておきます。
## 環境
* Nginx
* php-fpm
* Ubuntu

バージョンなどは省略

## エラー画面
![エラー画面](https://qiita-image-store.s3.amazonaws.com/0/20371/62a779b5-cb4b-3f2b-3a45-fc3ab8ac7434.png "スクリーンショット 2017-04-21 1.04.50.png")

## やったこと
XML拡張は`php-xml`をインストールすると利用可能になるようなので

```
$ sudo apt install php-xml
```

でOKです。

一応このあとnginxの再起動を行ったのですが、よく考えたら必要なかった気がしてきてます。ちなみに再起動はコレで。

```
$ sudo service nginx restart
```
とりあえずはじめるAngular2


## Webpackを使用したAngular2開発のテンプレートプロジェクト
https://github.com/angular/angular2-seed
上記のGitからクローンしてWebstormかPycharmで開発

1.Node.jsをインストール（http://qiita.com/sinmetal/items/154e81823f386279b33c ）

- 適当に6.10.0とかインストール


2.必要なnode_moduleをインストール

> npm install


3.Webサーバー起動

> npm start

http://localhost:3000/ にアクセスすると閲覧できる

「<プロジェクトフォルダ>/src/app」配下のソースを開発していく


## 資料リンク

Angular2本家のドキュメント（https://angular.io/docs/ts/latest/ ）

Angular2日本語情報サイト
http://blog.lacolaco.net/
http://blog.yuhiisk.com/category/angular2/

* ルーティング（http://wordpress.honobono-life.info/code/angular2_router_rest/）
* 通信（http://qiita.com/laco0416/items/364c5923f77458c468ac）
  * おまけ [「RxJS」初心者入門 – JavaScriptの非同期処理の常識を変えるライブラリ](http://liginc.co.jp/web/js/151272)
  * おまけ　[Angular2でObservableを使ってHTTPリクエストを複数送信](http://wordpress.honobono-life.info/code/angular2%E3%81%A7observable%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6http%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E8%A4%87%E6%95%B0%E9%80%81%E4%BF%A1/)
      * RxJSにはforkJoinとかflatMapという便利メソッドがあって、複数のhttp送信のような非同期処理をすべて完了時に別処理するようなことが短いコードでできます。
  * [Rx逆引き](http://wilfrem.github.io/learn_rx/operators.html)
* UIコンポーネント [PrimeNG](http://www.primefaces.org/primeng/)
* [表示言語切替：Angular2でi18n対応してみる](http://qiita.com/taxponation@github/items/247a06106f2912acd05c)
AWS S3 の goofys がたまに切れるので再マウント

# AWS S3 再マウント
AWS S3 の goofys がたまに切れるので再マウント。
check.sh を cron で定期実行する。

```bash:check.sh
#!/bin/bash

# あらかじめ fstab が設定されていること

if [ ! -e /home/hoge/s3/healthy.txt ]; then
  sudo /bin/umount /home/hoge/s3
  sudo /bin/mount -a
  echo 'remount s3'
fi

exit
```
goofysの使い方はこのへんで。
http://qiita.com/kooohei/items/a14f22cb0381342d1861
mac MySQLインストール手順

# mac MySQLインストール手順

##前提
・x-codeがインストールされいていること
されていない（わからない）場合はこちら（<a href="http://bit.ly/2pjyeDN">x-codeインストールリンク</a>）
・x-codeコマンドラインがインストールされていること
されていない（わからない）場合はこちら（<a href="http://bit.ly/2pZNO3N">x-codeコマンドライン</a>）
・Homebrewがインストールされていること
されていない（わからない）場合はこちら（<a href="http://bit.ly/2pmy26y">Homebrewインストール手順</a>）

## MySQLインストール手順

### MySQLインストール

ターミナルで下記のコマンドをまるまるコピペして実行する。
<pre>
brew install mysql
</pre>

<img width="455" alt="スクリーンショット 2017-04-22 4.16.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/1c5d517b-b508-929b-3dde-6d42819214fe.png">

で、申し訳ないことに、ここから先が、すでにインストールしていた為に、キャプチャが撮れなかった…
ので、とりあえず、撮れれば更新しときます！

まぁ、でもここからは、インストールが終わるまでひたすら待つ様な記憶があるので問題ないでしょ！（謎の自信）

インストールが終われば下記のコマンドをまるまるコピペして実行して下さい。
<pre>
brew info mysql
</pre>
<img width="407" alt="スクリーンショット 2017-04-22 4.19.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/9586f9da-6ed2-47a1-5b40-fbf9da6af9cd.png">

実行するとインストールが正常に行われていれば、コマンドの直下辺りにSQLのバージョンが表示されます。

<img width="361" alt="スクリーンショット 2017-04-22 4.20.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/675e8c99-b3cc-a44d-bb40-9b070d598120.png">

あとは単純に

<pre>
mysql --version
</pre>

でも見れます。

<img width="565" alt="スクリーンショット 2017-04-22 4.23.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/177318/826694ef-97ed-13a8-2cb8-5bef9a98823e.png">


#関連リンク
<a href="http://bit.ly/2pmuy42">リンク一覧</a>
<a href="http://bit.ly/2pZFDEw">windows MySQLインストール手順</a>
<a href="http://bit.ly/2pZQJtn">MySQLを使おう</a>
[Java][Spring] Spring DataのRepositoryをインスタンス化する際にHibernateのフィルタを有効にしようとして失敗した記録

# 動機

Hibernate 3でマルチテナントをしようとしました。

各テーブルにテナントを区別するためのSystemId列を付けました。

SystemId列を検索条件に付与するHibernateフィルタをJPAエンティティに付けました。

# 失敗の記録

## 自前のRepositoryファクトリを使うようにする

Configurationに以下のようなアノテーションをつけて、自前のRepositoryファクトリを使うようにしました。

```
@EnableJpaRepositories(basePackages = "com.example.dataaccess.repositories",
        repositoryFactoryBeanClass = PrimaryRepositoryFactoryBean.class)
```

## 作成したRepositoryファクトリ


```java:PrimaryRepositoryFactoryBean.class
public class PrimaryRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends JpaRepositoryFactoryBean<T, S, ID> {

    @Autowired // この子がSystemIdを持っている
    private CurrentAppUserDetailsProvider currentAppUserDetailsProvider;

    @Override // RepositoryFactoryを返します
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
        return new MyRepositoryFactory(entityManager, currentAppUserDetailsProvider);
    }

    private static class MyRepositoryFactory<E, I extends Serializable> extends JpaRepositoryFactory {

        private final EntityManager entityManager;
        private final CurrentAppUserDetailsProvider currentAppUserDetailsProvider;

        public MyRepositoryFactory(EntityManager entityManager,
                CurrentAppUserDetailsProvider currentAppUserDetailsProvider) {
            super(entityManager);
            this.entityManager = entityManager;
            this.currentAppUserDetailsProvider = currentAppUserDetailsProvider;
        }

        @Override
        protected Object getTargetRepository(RepositoryMetadata metadata) {
            Object repository = super.getTargetRepository(metadata);

            SessionFactory sessionFactory = entityManager.getEntityManagerFactory().unwrap(SessionFactory.class);

            Session session = sessionFactory.getCurrentSession(); // 例外発生！！

            session.enableFilter("SYSTEM_ID_FILTER")
                    .setParameter("systemId", getSystemId());

            return repository;
        }

        private int getSystemId() {
            return currentAppUserDetailsProvider
                    .getCurrentAppUserDetails()
                    .getSystemId();
        }

    }
}
```

# 失敗の内容

Repositoryをインスタンス化する時点では、トランザクション始まってないからSession無いよーーー。

当たり前だよねーーー。
配列の添え字チェックは自動になったと割り切ろう？

前回の投稿に続く：http://qiita.com/chesscommands/items/68d8237eccf5fac05e13
C言語と言えば，ポインタを使うことだと言われている(誰が言う?)．
理解するためには勉強しなければならない．
まずは，配列の勉強をすることにした．

しかし，前回は，書籍の内容と少し違う出力結果に出くわし，つまづいた．
つまづいた箇所は，勉強から逸れるため気にしないはずが・・・今回調べることにした．

前回はc89規格でコンパイルをしたが，配列の添え字を自動でチェックしてくれた．
今回はc78のオプションを指定したが，そもそもそんなオプションはないと言われてエラーになった．

![c78.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/33d1212e-15b6-109a-ca67-bc394827ae40.jpeg)


#JIS規格
X 3010：2003 (ISO/IEC 9899：1999)のP61に，配列の範囲参照に関する説明を見つけた．
一生懸命説明してくれているのは分かる．しかし，内容は全然分からない．
http://kikakurui.com/x3/X3010-2003-01.html

![JIS.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/a460117c-6e6f-4a0f-d5d5-ac9a5708ef44.jpeg)

結局何が言いたいのだろうか．

#wikipedia
ウィキペディアでは，配列の範囲外を参照した場合，何もチェックしないため，どうなるか分からないと記述してあったのだが・・・．
[https://ja.wikipedia.org/wiki/C言語](https://ja.wikipedia.org/wiki/C言語#.E5.87.A6.E7.90.86.E7.B3.BB.E3.81.AE.E7.B0.A1.E7.B4.A0.E5.8C.96 "wikipediaのC言語")

![配列の自動チェック.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/0b4cda84-7a08-ea68-b324-31b095d2663e.jpeg)

チェックしないプログラミングの説明なのか?
そんな馬鹿な．


#勉強できず
こんな下らないことに時間と労力を費やすのは間違っている．
しかし，規格を理解できずに勉強を進めると言うことは，本格的に使うプログラムを作る場合，その時のコンパイラに合わせたプログラムを組むことになる．
そんなことをしては，時間と労力がそれこそ途方もなく掛かってしまう(そのコンパイラを調べるわけだからな)．
規格を理解しておけば，応用が利くと思ったのだが・・・．
そもそも生粋のC言語コンパイラではないのが原因か?


#今回の勉強
書籍には，C言語の配列チェックは現時点でできないとの記載があった．
15年以上前の書籍だからなのか・・・時代は変わるものだとつくづく実感する．
そして，勉強を進めることで，配列の表記に`[ ]`を使っており，これは**簡便記法**(syntax sugar)ということがわかった．
本来のC言語で配列を表すのは，アスタリスクや丸括弧で表現するのが正しいようだ．
　本来：`*(temp + i)`
　簡便：`temp[ i ]`

![本来の表記.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/c3a18b6d-ecac-fc86-001d-f722307de14f.jpeg)

16行目の部分は，コンパイル時に警告が出なかった(簡便記法の17行目が警告されただけで終わった)．
添え字チェックは，コンパイラか何かが勝手にやったことなのだろうと結論づけた．
しかし，勉強のために配列外へのアクセスをするだけで，ここまで書籍から離れるプログラミングは間違っているように思う．
それでもここまで脇道に逸れた理由は，配列の添え字チェックが当たり前と思ってプログラミングした場合，意図しない箇所でのバグに対処することを想定したからだ(ただのこじ付け)．


先日の投稿に，何がしたいのかわからないとコメントをもらった．
確かに，ここまでプログラムを書き換えたら，自分でもやりたい目的を忘れてしまう．
たかが配列の範疇を越えたアクセスをするはずだったのに，勉強の範疇を越えるとは思わなかった．
こんな突飛なことをするから就職先が決まらないのだろう．
今後の私は大丈夫か!?

そもそも書籍通りに進めるための勉強が何になるかと言われても勉強のためとしか言えない．
何より，歴史の勉強などもそうだろう．覆るかもしれない歴史を勉強して何になるのかと・・・．
極端なことを言えば，死ぬことが分かっている人間が勉強して何になるのかと・・・．

C言語の配列の勉強が哲学の話に・・・ならないか．


#結論
なぜ，未定義部分を実行(表示)させたいのかという問いに対しての応えは，そこに未定義がある限り...
もとい，暇だから．
勉強する必要に迫られているが，そこまで切羽詰まっていないため，脇道に逸れにそれているというのが本音になる．

さらに言えば，未定義を再現したいのではなく，最終的にポインタを理解したい．
しかし，どこまで勉強すれば良いのか分からないため，書籍通りに進めようと思ったが，脇道部分に躓いてしまった．というのが今回の経緯・・・かな．


#参考URL
C99：https://ja.wikipedia.org/wiki/C99
C言語のバージョン：http://portable-c.jugem.jp/?eid=3
Cはパンクロックだ：http://qiita.com/jj1bdx/items/135d650255e8f870a20e
バグ回避：http://qiita.com/Ki4mTaria/items/b6ab0bcbe9c87d4dc071
バグ回避？：http://www.g-ishihara.com/c_ar_02.htm
添え字の確認：http://kaworu.jpn.org/c/配列の要素数を調べる
配列の添字に関する重要な注意事項：http://www.cc.kyoto-su.ac.jp/~yamada/programming/array.html

##余談
冒頭のc78は，ギャグで使われていることに便乗した．
[https://www.ibm.com](https://www.ibm.com/developerworks/jp/linux/library/l-c99/"IBMのC78規格説明")
![C78説明.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/5038eafc-5412-7508-1f51-9fddd1b90b1a.jpeg)
※文字列範囲選択(反転)は私がしたもの.

以上．
Rubyのオープンクラスで無駄で邪魔なメソッドをつくる

Rubyには、既に定義されたクラスを修正できる**オープンクラス**という機能があります。
##オープンクラスとは

オープンクラスは文字通り「クラスをオープンする」ということですが、例えば以下のような使い方ができます。

```rb
class Hoge
  def foo
    p "foo"
  end
  def baz
    p "baz"
  end
end

Hoge.new.foo #=> foo

class Hoge
  def foo
    p "foo2回目"
  end
  def bar
    p "bar"
  end
end

Hoge.new.foo #=> foo2回め
Hoge.new.bar #=> bar
Hoge.new.baz #=> baz
```
1回目のHogeクラスを定義して、"foo"を出力するところまではなんということもありませんが、そのあとまた**Hogeクラスを定義することができる**のですね。
「クラスをこじあける」という表現をすることがありますが、オープンクラスによってクラスの内容を修正することができます。

オープンクラスしたコードを見ていきましょう。
先程のコードでは、オープンクラスした際にfooメソッドをもう一度定義しています。

```rb
  def foo
    p "foo2回目"
  end
```
こうすることによって、メソッドを上書きすることができます。結果、"foo"と出力していたメソッドが上書きされ、"foo2回目"が出力されたのです。

また、barメソッドも定義しました。

```rb
  def bar
    p "bar"
  end
```
Hogeクラスのインスタンスメソッドとして、barメソッドが追加されたことを意味します。

さらに、「こじ開ける」という表現だと想像しやすいかもしれませんが、元のクラスに定義されていたメソッドはそのまま使用することができます。
例えば、先程のコードでbazメソッドは1回目の定義では記述されていたものの、オープンクラスでクラスを修正した際には記述していません。

```rb
  def baz
    p "baz"
  end
```
しかし、オープンクラス後に生成したHogeクラスのインスタンスでbazメソッドを実行すると、"baz"が出力されています。このように、オープンクラスでは必要な分だけクラスを修正したり、機能を追加することができるのです。

そこで、こんな無駄なこともできるわけです。

##無駄で邪魔なメソッドをつくってみる
Rubyには、組み込みライブラリとしてStringクラスが組み込まれています。
例えば、こんなコードがあります。

```rb
puts "aaa".size #=> 3
```
"aaa"というのは文字列。つまりStringクラスのインスタンスです。また、Stringクラスのインスタンスメソッドとしてsizeが最初から定義されています。Stringが組み込みライブラリのため、特にクラスの定義をしなくても文字列を扱うことができるようになっているのです。
さて本題ですが、オープンクラスの性質を利用して遊んでみます。以下のような形でStringのオープンクラスを定義します。

```rb
class String
  def inspect
    "無駄ァ！"
  end
  def muda
    "無駄無駄無駄無駄ァ！"
  end
end
```

inspectというのは、Objectクラスのインスタンスメソッドです。StringはObjectを継承したサブクラスであるため、Stringでもinspectメソッドが使用できます。
そして、出力に利用される組み込み関数の「p」は、オブジェクトのinspectメソッドの結果を返すのです。

通常、「Hello!World!」を出力しようとすると、以下のように書けば出力されます。

```rb
p "Hello!World" #=> Hello!World!
```
しかし、上記のオープンクラスを使用すると、結果はこうなります。

```rb
class String
  def inspect
    "無駄ァ！"
  end
  def muda
    "無駄無駄無駄無駄ァ！"
  end
end
p "Hello!World" #=> 無駄ァ！

```
inspectメソッドがStringクラスで書き換えられているため、pメソッドの結果も無駄になってしまったわけです。

また、オープンクラスでmudaというメソッドを再定義しました。こんな使い方もできます。

```rb
class String
  def inspect
    "無駄ァ！"
  end
  def muda
    "無駄無駄無駄無駄ァ！"
  end
end
p "Hello!World".muda #=> 無駄無駄無駄無駄ァ！

```
これでどんな文字列でも無駄で邪魔な出力ができるようになりました。

## まとめ
無駄な使い方をご紹介しましたが、オープンクラスはRubyならではの本来とっても役に立つ機能です。
実はオープンクラスはRuby技術者認定試験Goldでも重要な試験範囲の一つです。また、pメソッドでinspectの結果が出力される点も聞かれることがあるので、Rubyの試験を受ける方は覚えておくとよいでしょう。
超々初心者のローカルホスト立ち上げ

はじめまして！

私はプログラミングとは全く関係ない業種で働いていたはずなのですが、いつの間にかExcelVBAにハマり前任者が作った会社のプログラムを運営することを任された、いわば“にわかプログラマー”です。
つまり、かなりのプログラミング初心者です。
そうこうする内にプログラミングにハマり、気付けば30代半ば…　いい歳してプログラマーを目指したいと思い始めてしまったわけです。
そんな僕がつまづいたり勉強になったものを少しずつ皆様と共有できれば幸いだと思い投稿をさせて頂くことにします！

## プログラミング経験言語は…
HTML少々、CSS少々、JavaScript少々、PHP少々。と、どれも少々です。
そんな私ですが、とりあえずものにしたいと思い手を付けたのが**WordPress**
最初は自分で契約しているレンタルサーバーにアップしつつ練習していたのですが、「いや、これ面倒でしょ！」となり今まで何度も挫折してきたローカルサーバーの構築を頑張ろうと考えたわけです。

## 取り敢えずXAMPP導入
色々ネットで検索した結果、やっぱりXAMPPがよさそうなのでXAMPPを導入することに。
そして、予想通りローカルホストが立ち上がらない事件に遭遇しました。

![access-forbidden.png](https://qiita-image-store.s3.amazonaws.com/0/155272/caf33dbe-dfd1-7e79-6395-dc3b8a1745f7.png)


ウェブ管理者？
もちろん私の事なんですよね？
ということは私が何とかしなきゃいけない問題なんですよね？

ひとまずApacheについての理解が足りなかったのでそこをちょっと調べてからエラーに立ち向かうことにしました。

そして前置きは長かったのですが、今回のお話はそんな私のローカルホスト構築に立ち向かう備忘録とさせていただきます。

## 超初心者向け？
そうです！サイトを運営している方ですら予想もしていない超々初心者が僕です。
超初心者向けのサイトに書いてある意味があまりわかりませんｗ
その通りに設定したつもりでもちゃんと動きませんｗ
いや、インストールまでは普通にできます。しかしそのあとの設定がうまくいかずエラーになってしまうのです。

## .htaccessファイルとは…
初めて触れ合いました「.htaccess」
読み方がよくわからないのですが「エイチティアクセス」って読むらしいですね！
いわゆるApacheの設定ファイルだそうで先頭に．(ドット)がついていないとダメみたいですね。
最初に読んだ記事では
C:\xampp\htdocs\の中に「.htaccess」を設置してその中に

```
Order deny,allow
Deny from All
Allow from localhost 127.0.0.1
```

と記述しておいておけば大丈夫。とあったのですがこれではうまくいきませんでした。

よくよく調べてみるとどうやらXAMPPに関する記事が割と古いものが多いっぽくてApacheのバージョンが違うためエラーになるようでした。
現在は普通にダウンロードしたらApacheのバージョンが2.4以降のバージョンになるようで上記のような記述ではダメらしいですね。

Apacheのバージョンが2.4以降について調べていたら

```
Require all denied
```

を追記しましょう。
みたいな記事があったので追記してみると。。。やっぱりうまく行きません。
というか僕は超々初心者なので一体どこに追記すればよいのか全然理解できませんｗ
もう頑張ってApacheについてもっと勉強してみようかと検索していった結果。

```
Order deny,allow
Deny from All
```

これの代わりに2.4以降では

```
Require all denied
```

になるとの記事を発見。
えぇーー！
そ、そんな簡単なことだったのか…

ということで無事XAMPPによるローカルサーバーの構築はうまくいきましたｗ


僕と同じようなところでつまづいている方(いないかもしれませんが…)の参考になればと思い投稿してみました！
最後まで読んでいただきありがとうございます！
昨年度の取り組み今年度の取り組み

# 昨年度の取り組み
### 『Koopman作用素を応用したバイタルサイン解析手法の確立』
- バイタルサインをドップラーセンサーを使い、非接触で計測する。

- ドップラーセンサーで得られる時系列データは複数の情報が混合して計測される
    - Koopman作用素に基づくDMD法により信号を分離する
        - 呼吸や心拍の頻度を推定する

---

# ドップラーセンサー
離れた位置にある物体の移動速度を計測するセンサーである。ドップラーセンサーから発せられたマイクロ波を対象(人体等)に当て、反射したマイクロ波を計測して元の波と比較し、ドップラー効果により対象の動きなどを検知する

# DMD法(Dynamic Mode Decomposition)
時系列データを各固有値に対応するモードに分解する、モード分解法。

---
# 結果
- コンピュータ上で疑似的信号の作成

![疑似的信号.jpg](https://qiita-image-store.s3.amazonaws.com/0/166799/7fb5aae5-1153-b241-7912-0a79d411afd1.jpeg)
図1　疑似的信号

- 作成した疑似的信号を用いて、提案手法を検討
- 検討の結果、バイタルサインが検出出来る事を示した

![呼吸.jpg](https://qiita-image-store.s3.amazonaws.com/0/166799/85545b95-3c63-b4cf-a5c8-caa42457488c.jpeg)

図2 呼吸頻度検出結果


--- 
# 今後の課題
- 推定精度の向上。

![心拍数.jpg](https://qiita-image-store.s3.amazonaws.com/0/166799/8e4b4813-5885-1ba1-7ca9-115e8de7fb07.jpeg)

図3　心拍数

- 実際にセンサーを用いて信号を計測。
- 実際のバイタルサインを検出できるか検証。
- *提案手法のウェブアプリ化。*

---
# 現在の学習
- 提案手法のウェブアプリ化を目指し、「heroku」「Django(ジャンゴ)」を学習中。

- 今後は「heroku」を勉強しつつ、今後の課題に取り組む。

---
# 「heroku」
WEBアプリの公開を簡単にしてくれるサービス。
利用できるプログラミング言語が多数ある。
 - Python
 - Java
 - Ruby
 - Clojure
 - Scala
 - Node.js
 - PHP

「heroku」にはWEBアプリケーションで頻繁に利用されている機能が提供されていたり、ログの確認やデータベースのバックアップ等の運用サポート機能も提供されている。
その為、開発全体の精度向上やコスト軽減が図れるため、**WEBアプリ開発では欠かせない存在**と言われている。

# 「Django」
Pythonでウェブアプリを開発するためのウェブフレームワーク。
* ウェブフレームワーク
開発の効率を上げるために便利な機能がつまったツール。
IAM Roleを後からアタッチしたEC2でAWS CodeDeployに失敗する

タイトルの通り、AWS CodeDeployを使うために後からIAM Roleをアタッチしてもデプロイが失敗してハマったので、その解決策。

# 結論

**`codedeploy-agent` を再起動する**

# 背景

2017年02月に発表された新機能で、既に作成しているEC2インスタンスにIAM Roleがアタッチできるようになった。
本当はもっと前からできるようになっていて欲しい機能。これのせいでどれだけ苦しめられたか。。

*「既存のAmazon EC2インスタンスにIAM Roleがアタッチできるようになりました」*
https://aws.amazon.com/jp/blogs/news/new-attach-an-aws-iam-role-to-an-existing-amazon-ec2-instance-by-using-the-aws-cli/
 
> ```bash
> $ aws ec2 associate-iam-instance-profile --instance-id YourInstanceId --iam-instance-profile Name=YourNewRole-Instance-Profile
> ````

ちなみに、2017年05月時点ではCLIからしか操作できない。


この新機能に、クライアントであるEC2インスタンスにインストールすべき `codedeploy-agent` が対応してないのが問題だと推測される。

IAM Roleをアタッチしてもエラーを吐き続ける。

```logos:/var/log/aws/codedeploy-agent/codedeploy-agent.log
2017-05-10 21:08:21 ERROR [codedeploy-agent(13743)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile
2017-05-10 21:09:32 INFO  [codedeploy-agent(13743)]: Version file found in /opt/codedeploy-agent/.version.
```

IAM Roleの設定に問題があるのかと思ってかなり色々試したが解決せず。

結局、最後の頼みで再起動したら正常にデプロイできた。

```bash
$ sudo service codedeploy-agent restart
```
iOSアプリの更新で、iTunes Connectにビルドのアップロードが反映されず困った件&解決方法

## 状況
* だいぶ前に作成したアプリの更新
* カメラアプリ
* Xcode6で作成したアプリを、Xcode8対応に書き直した
* iTunes Connect でアプリ情報を更新し、さあこれからバイナリのアップロードという状態

## 症状
* Xcode8からのバイナリuploadは正常終了する(エラーなし)
* だが、iTunesConnectの「ビルド」のところに、いつまでたっても表示されない
 * 普段もupから表示までに数分のタイムラグがある。しかし、今回は1日待ってもダメだった

## 原因調査
とりあえずいろいろ調査した。

### 年齢制限
[はじめてiOSアプリ公開申請して個人的にハマったこと及び解決法 -
Qiita](http://qiita.com/tomcky/items/25edc9a7ab46cf525c04)

> ここで、年齢制限指定の「編集」から、設定をしていなかったことに気づいたため設定
すると「ビルド」の項目にバイナリアップロードが反映された

やってみたけど効かず...。ただ、いつのまにか年齢制限の質問項目が増えていたようなので、見直してみるのも良いと思う。

### NSCameraUsageDescription

[実際にiOSアプリが審査通過できた手順をまとめる（2016年11月時点） -
Qiita](http://qiita.com/yuki-TheWaggle/items/6cc3a25b1d993fcad9ec#%E2%91%A42)

> Upload後 iTunes Connect に反映されなかった原因と対処
>《エラー内容》
>iTunes Store からメールで下記のエラーが届いていた。
>…
The app's Info.plist must contain an NSCameraUsageDescription key with
a string value…

これでした...。あー、なるほど。
Info.plistにNSCameraUsageDescriptionを追加し、カメラ利用する理由を記述。
その後Xcodeでuploadすると、iTunes Connectにビルドが反映されました。

## 教訓
### 本体機能の使用許可に気をつけよう
* カメラ、フォトライブラリ、位置情報、住所録アクセス などなど
* デバッグ実行は出来るので、見落としがち。

### Appleからのメールはちゃんと見よう
* 普段は使っていない、アプリ申請専用のアドレスにメールが来ていたため、気付かなかった
* ↑のようなことが起こらないよう、転送設定を行った
Python で多重ループを回避する

# はじめに

以前 [Array#product で多重ループを回避しよう](http://qiita.com/QUANON/items/e23d35cf193b5d07bf58) という Ruby の記事を投稿しました。この記事では [Array#product](https://docs.ruby-lang.org/ja/latest/method/Array/i/product.html) を利用して多重ループを単一ループに変える[^1]方法を紹介しています。最近は個人的に Python に傾倒しているので、この言語ではどう書けるかを探ってみました。

# 変更前のサンプルコード

```py:python
for year in range(2010, 2013):
  for i in range(1, 3):
    for char in ('a', 'b', 'c'):
      print(year, i, char)
```
```:stdout
2010 1 a
2010 1 b
2010 1 c
2010 2 a
2010 2 b
2010 2 c
2011 1 a
2011 1 b
2011 1 c
2011 2 a
2011 2 b
2011 2 c
2012 1 a
2012 1 b
2012 1 c
2012 2 a
2012 2 b
2012 2 c
```

# 方法 1: itertools.product() を使う

Ruby の Array#product と同様に Python にも [itertools.product()](https://docs.python.jp/3/library/itertools.html#itertools.product) というデカルト積 (直積) を求めるための関数があります。

```py:python
from itertools import product

years = range(2010, 2013)
integers = range(1, 3)
chars = ('a', 'b', 'c')

for year, i, char in product(years, integers, chars):
  print(year, i, char)
```

# 方法 2: 内包表記を使う

ネストした内包表記も利用できます。

```py:python
years = range(2010, 2013)
integers = range(1, 3)
chars = ('a', 'b', 'c')

combinations = [(year, i, char)
                for year in years
                for i in integers
                for char in chars]

for year, i, char in combinations:
  print(year, i, char)
```

# おまけ: Ruby の場合

```rb:ruby
years = Array(2010..2012)
integers = Array(1..2)
chars = Array('a'..'c')

years.product(integers, chars) { |year, i, char| puts("#{year} #{i} #{char}") }
```

# 参考

* [ジェダイ流・Pythonの内包表記](http://postd.cc/comprehensions-in-python-the-jedi-way/)
  * ネストした内包表記について参考にしました。 

[^1]: あくまで見かけ上の話で、ループ構文によるインデントを複数から 1 つにすることです。内部的なループ回数や計算量が減るわけではありません。
Google Play System Images: Android Studio 2.3.2 and Emulator 26.0.2 are now available（公式Play Store同梱イメージが利用可能に）


Android Studio 2.3.2からは公式エミュレータでPlay Store同梱イメージが利用できるようになります。いろいろ捗りそうですね。

なお2.3.2は現在まだBeta channelですので、[ダウンロードアーカイブ](https://developer.android.com/studio/archive.html)から落として入れるか、Android StudioのSettingsからAppearance & Behavior > System Settings > UpdatesでBata Channel以降を選んでアップデートしないと使えません。


公式発表記事：[Android Studio Release Updates: Google Play System Images: Android Studio 2.3.2 and Emulator 26.0.2 are now available](https://androidstudio.googleblog.com/2017/04/google-play-system-images-android.html)
Firebase StorageにWEBからアップロードする

はじめて投稿させていただきます。よろしくお願いいたします！

今回扱うのはGoogleのmBaaS, Firebaseでの画像アップロードです。

※今回扱う内容は、あくまでＷＥＢ上の話なのであしからず。ただし、Cordova/Phonegapでも同様の方法でいけるはずです(というか使っています)。

## 動作環境

・GoogleChrome(バージョン58）
・jQuery2.x系

## まず基本的な構成から

firebaseの初期設定（Config->initializeApp)については、省きます。
初期設定を読み込ませた後に、以下の内容を書き込みます。
ポイントは、storageの後ろの()を忘れないこと、そしてref()の中身はフルパスでのファイル名を入れるということです。
Ex)index.pngをiconに入れたい→refの中身は(icon/index.png)

```javascript:index.js
var userName = file.name;
var storageRef = firebase.storage().ref(userName);
                    storageRef.put(file).then(function(snapshot) {
                      console.log('Uploaded a blob or file!');
                    });
```

##問題：fileをどのようにして読ませる？

ここまではいいのですが、初心者にとっては「画像を文字で持ってくる（ＢＬＯＢ）」という問題にぶつかって、その先の理解などは進みにくいものです。
~~ＭｙＳＱＬなどに入れる時は確かにＢＬＯＢ形式に入れることを意識しますが、**Ｆｉｒｅａｓｅの場合は(HTML5のFile APIに任せることなく)直接代入すればアップロードができてしまいます**。便利！~~
文字のエンコードをしなくてもOK！というだけみたいでした。

```javascript:index.js
if (this.files.length > 0) {
                // 選択されたファイル情報を取得
                console.log(this.files.length);
                for(var i=0;i<this.files.length;i++){
                  var file = this.files[i];
                  // readerで、データURLとしてエンコード(BLOB)したファイルデータを作成(不要)
                  //var reader = new FileReader();
                  //reader.readAsDataURL(file);
//ここまで不要。まったくHTML5のFileAPI使ってません！
                    var userName = file.name;
                    var storageRef = firebase.storage().ref(userName);
                    storageRef.put(file).then(function(snapshot) {
                      console.log('Uploaded a blob or file!');
                    });
                }}
```
※上記のサンプルにある「 //reader.readAsDataURL(file);」が本来ＢＬＯＢ形式に書き換えるところなのですが、このような操作をしなくともアップロードできます。
※アップロードした後の画面はこんな感じになります。
![スクリーンショット 2017-05-10 22.56.55.png](https://qiita-image-store.s3.amazonaws.com/0/83251/697d106d-76d2-92ee-998b-06ee3e5e8312.png)
Android Studioのエミュレータをコマンドプロンプトから実行したい


AndroidのエミュレータにProxyとか設定したくて、コマンドプロンプト（やAndroid StudioのTerminal）から実行したいのですよ。
ところがよく分からないエラーが出てしまうのです。

```text:エラー！
> emulator @Nexus_5_API_22
[8920]:ERROR:./android/qt/qt_setup.cpp:28:Qt library not found at ..\emulator\lib64\qt\lib
Could not launch '..\emulator/qemu/windows-x86_64/qemu-system-i386.exe': No such file or directory
```

どうもAndroid SDKに複数エミュレータが入ってしまっていて、ダメなemulatorを起動しているみたい。

```text:emulatorの場所
> echo %ANDROID_HOME%
C:\Android\android-sdk

> where /R %ANDROID_HOME% emulator.exe
C:\Android\android-sdk\emulator\emulator.exe
C:\Android\android-sdk\tools\emulator.exe

> where emulator
C:\Android\android-sdk\tools\emulator.exe
```

別のほうのエミュレータを直接叩いたらうまく起動できました。

```text:違う方を実行
> %ANDROID_HOME%\emulator\emulator @Nexus_5_API_22
```
【rails】エラー文をビューの任意の位置に配置できる、 errors.full_messagesの使い方

##ビューの任意の位置にエラー文を表示できる
errors.full_messagesはhamlやerbの中に配置することができるので、エラー文を自由に配置することができます。controllerから指定するflashメッセージと比較して、自由度高く使うことができます。

ほとんど以下のサイトを参考にさせていただいています。
その上で自分が次に使いやすいようにしています。
日本語化の方法ものっているので、気になる方はぜひ↓
http://ruby-rails.hatenadiary.com/entry/20140810/1407623400

##エラー文が表示されるまでの流れ　
MVC全てに記述

0.（ビューでエラーになる内容をフォームに入力）
↓
1.モデルでエラーを感知して
↓
2.コントローラで同じページを表示するように
↓
3.ビューでエラー文の位置を指定

記事でもこの順番で書いていきます。

##具体的にどう書けばいいか。

まず、モデルでエラーを検知しないとダメですね。
バリデーションの記述をモデルにします↓

```hoge.rb
class Hoge < ApplicationRecord
  validates :fuga, uniqueness: true, presence: true
end
```

コントローラではエラー文にはredirect_toではなくrenderを使います↓
redirect_toでは再読み込みになり、errors.full_messagesのエラー文は表示されません。
(成功の場合はflashメッセージを使っています。)

```hoge_controller.rb
def create
  @hoge = Hoge.find(params[:id])
  if @chatgroup.save
    redirect_to root_path, notice: "グループ作成完了！"
  else
    render :new
  end
end
```

ビューでは表示したい場所に、こんな感じで書けば大丈夫です。↓

```hoge.haml
.hoge-form__errors
  - if @hoge.errors.any?
    %ul
      -@hoge.errors.full_messages.each do |message|
        %li
          =message
```

画像の中の赤文字の部分がerrors.full_messagesの表示です↓


![スクリーンショット 2017-05-13 午後6.26.47.png](https://qiita-image-store.s3.amazonaws.com/0/178099/e7c7a3d0-5d57-4f2f-f807-26155dd45a37.png)


不足点や修正点ありましたらご指摘いただけると嬉しいです。
railsのjbuilderでモデルのデータを全て書き出す

todoアプリを作っていて、todoListモデルの全てをjsonに書き出す場合の手順

### routeの設定
api/todo/へアクセスしたときに、indexアクションが実行されるようにroutes.rbを設定します。

```ruby:config/routes.rb
  namespace :api do
    namespace :todo do
      get '/', action: 'index'
    end
  end
```

### コントローラーの記述
renderのところでjbuilderへ渡すように記述します。

```ruby:app/controllers/api/todo_controller.rb
class Api::TodoController < ApplicationController
  def index
    @sample_todoes = Todo.all
    render 'index', formats: 'json', handlers: 'jbuilder'
  end
end
```

### jbudilerの記述
viewとしてjbuilderを以下のように記述します。
なんかもっといい書き方があるんだろうか。

```ruby:app/views/api/todo/index.json.jbuilder
json.todo do |json|
  json.array!(@sample_todoes) do |todo|
    json.extract! todo, ;id, :title, :done
  end
end
```

### ブラウザで確認
http://localhost:3000/api/todo/

```
{
  "todo":[
    {"title":"test投稿todo","done":false},
    {"title":"test投稿2","done":true}
  ]
}
```
ActiveRecord::QueryMethods#limitとActiveRecord::FinderMethods#take

# はじめに
RailsのActiveRecordのメソッド `QueryMethods#limit` をあまり良く知らずに使っていたら、あれ？という挙動がでたので、それとRuby標準のメソッド `ActiveRecord::FinderMethods#take`の使い分けについて考えました。
Rails ~> 5.1.0
# `limit`はQueryMethod
Webプログラミングの入門としてRailsから入った僕は、`limitメソッド`の挙動だけをみると、`Array#take`とそんなに変わらないじゃんと思う事がある。
が、`limit`はそのクラスの名前通り、**SQLのメソッドのlimit**を実装したメソッドであることを意識するのは大事なことである。

年齢が12歳のユーザーを3人所得する時の例をみてみる。

```ruby

twelves = User.where(age: 12)

# ActiveRecord::QueryMethods#limitを使用する
twelves.limit(3)
# User Load (4.9ms)  SELECT  `users`.* FROM `users` WHERE `users`.`age` = '12' LIMIT 3
#=> <#ActiveRecord::Relation [<#User id: 1, name: "ゴン＝フリークス", age: 12>, <#User id: 2, name: "キルア＝ゾルディック", age: 12>, <#User id: 3, name: "ピーター・パン", age: 12>]>

# ActiveRecord::FinderMethods#takeを使用する
twelves.take(3)
#=> [<#User id: 1, name: "ゴン＝フリークス", age: 12>, <#User id: 2, name: "キルア＝ゾルディック", age: 12>, <#User id: 3, name: "ピーター・パン", age: 12>]
```


## 返り値
`limit`は `ActiveRecord::Relation` を返しているのに対して、
`take` は `Array` を返します。

```ruby
twelves.limit(3).class
# => User::ActiveRecord_Relation

twelves.take(3).class
# => Array
```

つまり、なんでもかんでも `take` をしたあとは、`ActiveRecord::Relation` の便利なメソッドたちが使えなくなります。
なので、`take`は色々複雑な処理が終えてから最後に数を合わせたい時にするのがいいということでしょうか。少なくとも、複雑な処理の前で`take`メソッドはしようするものではないですね。

## SQL文

`take`は一度、DBから読み込んだレコードに対してはSQL文を発行しません。一番はじめのコードをみればわかるように、`limit`は一度読み込まれたものに対しても、SQLを発行して再度DBからレコードを所得します。
この違いは、`Rails 5.10.1` からのものだと思われます。`Rails 5.0.2` では、`take`も`limit`と同じようにSQLを発行し、再度DBから読み込みます。

では、下記のようなコードはどのようなSQL文が発行されるのでしょうか。

```ruby
User.where(age: 12).take(3)
```

一見すると、

`一度、年齢が12歳のUserを全て所得しする　ー＞ その中から３つを選ぶ。`
というコードに見えますが、実際のところは `limit` を使い一度に
`年齢が12歳のUserを３つ所得する`という内容のSQL文を発行しています。つまり

```SQL
User Load (4.9ms)  SELECT  `users`.* FROM `users` WHERE `users`.`age` = '12' 
```
ではなく

```SQL
User Load (4.9ms)  SELECT  `users`.* FROM `users` WHERE `users`.`age` = '12' LIMIT 3
```
というSQL文を発行します。

この違いだけを見ると、SQL文を発行する必要が無いときは発行しなくて、SQL文に `limit` を入れたほうが効率のいい時は、`limit` をいれてくれる `take`使っとけばいいじゃんとなりますが、返り値が配列であることを考えないといけません。

## `limit` 再びSQL文を発行するということ

僕が、あれ？と思った動作です。

```ruby
twelves = User.where(age: 12).limit(3)
twelves = twelves.limit(5)
```

さて、これは何人のレコードがとれるでしょうか。一度に`limit`をこのような形で続けて書く人はいないでしょうが、一度３つユーザーをとり、また別のメソッドでユーザーが５人または５人以下であることを確認したい時などにこのように書いてしまう可能性があります。
予測としては、３人の中から５人を取ろうとするのは無理なので、３人のユーザーを返してくれると期待してました。
ですが、上記でも書いたように `limit` メソッドはSQL文を再発行します。つまり、

```ruby
twelves = User.where(age: 12).limit(3)
```
で下記のような、SQL文とともに年齢が12歳のユーザーを３人集めてくれます。

```SQL
User Load (4.9ms)  SELECT  `users`.* FROM `users` WHERE `users`.`age` = '12' LIMIT 3
```
ですが

```ruby
twelves = twelves.limit(5)
```
このコードでは、一度下記のようなSQL文を再発行してしまいます。

```SQL
User Load (4.9ms)  SELECT  `users`.* FROM `users` WHERE `users`.`age` = '12' LIMIT 5
```

つまり、ユーザーが５人とれてしまうということですね。
MAMPでEC-CUBE3を構築した際にSQLSTATE[HY000] [2002] No such file or directoryエラー

備忘録的に

MAMPでEC-CUBE3を構築した後、作成したプラグインをインストールするために、ターミナルから

```
php app/console plugin:develop install
```

を叩いたら

```
SQLSTATE[HY000] [2002] No such file or directory
```
が出てきた。

php.iniの設定もmysql.socketの設定もEC-CUBE3の各種ymlファイルも問題なく書いてあるし、EC-CUBE3のdatabases.ymlのhostとかも、もともとは空文字だったがlocalhostにしたのに全くわからなかった。

結論、EC-CUBE3内のコア部分やPDOConnection.php内にログを仕込んでやっとわかった。
どうやらdatabases.ymlのhostを空文字にしているとPDOConnectionの$dnsにhostがつかないのが問題だったみたい。

```:hostが空文字の場合
$dsn="mysql:port=;dbname=net_bglen_db30;charset=utf8;";
```

```:求められる正常な形
$dsn="mysql:host=;port=;dbname=net_bglen_db30;charset=utf8;";
```

たぶんローカルIPとかにすれば動いたのかもしれないが、localhostと記述しただけでは動かなかった。

いや〜つかれた。。
PDFMiner 使ってみる

#はじめに

PDFファイルを解析する必要がありました。
とりあえずPythonでやりたかった。
PDFMinerというライブラリが便利そうなので、使ってみました。

#PDFMiner

http://www.unixuser.org/~euske/python/pdfminer/index.html
https://github.com/euske/pdfminer/

#Python2環境の作成

手元には、Python3環境しかなかったので、Python2環境を増やしました。

```shell-session
$ pyenv install 2.7.13
...省略...
$ pyenv local 2.7.13
$ python --version
Python 2.7.13
```

できました。

#PDFMinerでPDF解析

##導入

```shell-session
$ git clone https://github.com/euske/pdfminer.git
Cloning into 'pdfminer'...
remote: Counting objects: 3164, done.
remote: Total 3164 (delta 0), reused 0 (delta 0), pack-reused 3164
Receiving objects: 100% (3164/3164), 6.01 MiB | 406.00 KiB/s, done.
Resolving deltas: 100% (2245/2245), done.
$ cd ./pdfminer
$ make cmap
...省略...
$ python ./setup.py install
...省略...
```

##おためし

ためしに使ってみます。

```shell-session
$ cat ./samples/simple1.pdf | head
%PDF-1.4
1 0 obj
<<
 /Type /Catalog
 /Outlines 2 0 R
 /Pages 3 0 R
>>
endobj
2 0 obj
<<
$ ./tools/pdf2txt.py ./samples/simple1.pdf
Hello

World

Hello

World

H e l l o

W o r l d

H e l l o

W o r l d


```

どうやらこのpdf2txt.pyというツールは問題なく動作するようです。
Vagrant+Amazon Linux

# 最新のAmazonLinuxのboxを持ってくる（Virtualbox Only）
```bash
vagrant init mvbcoding/awslinux
vagrant up --provider virtualbox
```
# 指定のバージョンをboxに追加してそれを使う
```
vagrant box add amzn-linux-2017.03 https://atlas.hashicorp.com/mvbcoding/boxes/awslinux/versions/2017.03.0.20170401/providers/virtualbox.box
```
# AWS EC2 に AmazonLinux を起動してプロキシを起動
上記のみだと、AmazonLinux向けのRPMレポジトリが参照できないので、yumをプロキシするためにAWS上にAmazonLinuxのEC2を適当に起動して、tinyproxy　を起動します
※ tinyproxyのデフォルトポートは 8888 です、 アクセス元のIPとかセキュリティグループで制限しておいた方がいいです
# tinyproxy を EC2（AmazonLinux） へインストール
```
sudo yum -y install epel-release.noarch
sudo yum -y install --enablerepo=epel tinyproxy
sudo service tinyproxy start
```
# Vagrant上のyum.confへプロキシ設定追加
```
echo 'proxy=http://<AWS EC2 IP ADDR>:8088' >> /etc/yum.conf
```

# 参考
- https://atlas.hashicorp.com/mvbcoding/boxes/awslinux
strftimeの使い方　datetimeで入っているカラムを表示するとき

### 環境

```ruby:環境
rails 5.0.2
```

###やりたいこと
カラムdatetimeで入っているデータをviewで表示させる。

###やり方

datetimeカラムで作っている。

```ruby:db/migrate/2017043530_create_lends.rb
puts 'code with syntax'
.....

 def change
    t.datetime :date

 end 



 .......
```

indexや　showなどの表示させるとき、

```ruby:index.html.erb

<%= date.strftime('%Y年%m月%d日') %>

```

上にすると２０１７年6月４日の表示になる。

###オプション

下のオプションで、秒まで表示できる。

%A	曜日の名称(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)
%a	曜日の省略名(Sun, Mon, Tue, Wed, Thu, Fri, Sat)
%B	月の名称(January, February, March, April, May, June, July, August, September, October, November, December)
%b	月の省略名(Jan, Feb, Mar, Aprm May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
%c	日付と時刻
%d	日(01-31)
%H	24時間制の時(00-23)
%I	12時間制の時(01-12)
%j	年中の通算日(001-366)
%M	分(00-59)
%m	月を表す数字(01-12)
%p	午前または午後(AM,PM)
%S	秒(00-60) (60はうるう秒)
%U	週を表す数。最初の日曜日が第1週の始まり(00-53)
%W	週を表す数。最初の月曜日が第1週の始まり(00-53)
%w	曜日を表す数。日曜日が0(0-6)
%X	時刻
%x	日付
%Y	西暦を表す数
%y	西暦の下2桁(00-99)
%Z	タイムゾーン
%%	パーセント文字


参考資料
　http://railsdoc.com/references/strftime
neovimで.を打つとステータスラインにエラーが表示される時の解決策

rubyのプログラムを書いてる時に「.」を打つときが多々あると思います。
neovimに移行してから、「.」を打つたびに```Error occurred calling omnifunction: rubycomplete#Complete```とエラーが表示されるようになりました。
issueを見ていたら解決策を発見したので、残しておきます。

### 原因
deopleteがrubyのgemがインストールされていない状態で補完をしようとするため、このようなエラーが吐かれます。
gemが入っていないかは、```:CheckHealth```で確認できます。
Ruby provider の項目に Fail not foundとか書いてあったら、それが原因です。

### 解決策
gem でneovimを入れる
```sudo gem install neovim```
あとはneovimを再起動すればうまく動くようになるはずです。
capistranoでec2のipをハードコーディングせず、いい感じにデプロイしたい

これまでサーバの増減がほとんどなかったので、デプロイ対象はハードコーディングしていたのですが、そろそろ台数が増えそうなので、ハードコーディングを止める方法を考えてみました。


#### lib/capistrano/tasks/aws_ec2.rake

aws-sdkを使って、describe_instancesするだけなんですが、これを設定ファイルに書いてしまうと読みづらいので、taskに分離します。


```ruby
require 'aws-sdk'

namespace :aws_ec2 do
  desc 'aws ec2'
  task :roles do
    run_locally do
      ec2 = Aws::EC2::Client.new
      default_filters = [{name: "tag:Env", values: [fetch(:aws_ec2_env)]}, {name: 'instance-state-name', values: ['running']}]

      %w(app web job).each do |target|
        tag_filters = fetch("role_tags_#{target}".to_sym, [])
        next if tag_filters.empty?
        filters = default_filters + tag_filters

        instances = ec2.describe_instances(filters: filters).reservations.map(&:instances).flatten
        hosts = instances.map{|k| k.tags.select{|t| t.key == "Name"} }.flatten.map(&:value)
        ip_addresses = instances.map{|k| k.private_ip_address }

        output = "#{target}:" + hosts.join(',')
        info output

        role target, ip_addresses
      end
    end
  end
end
```

実行すると role に動的に private_ip_address がセットされます。


#### config/deploy/production.rb

あとはフィルタリングルールを書いてあげて、デプロイステップの最初の方でroleをセットしてあげればOK。

```ruby
set :aws_ec2_env, :sandbox
set :role_tags_app, -> { [{name: "tag:Role", values: ['app']}]}
set :role_tags_job, -> { [{name: "tag:Role", values: ['job']}]}

before 'deploy:starting', 'aws_ec2:roles'
```

## References
 - http://qiita.com/ShotaKameyama/items/c66d64551411897082a1
OSX ショートカットキー入力の際Beep音を鳴らさない方法

# 背景

ユーザーによる任意のショートカットキー(ホットキー)設定を実装しようとした際、アルファベットや記号などの入力(KeyDownイベント)ではBeep音が鳴らないが、Command + A や Shift + B のように修飾キーを伴った入力を行うとBeep音が鳴ってしまった。何が原因なのかわからずBeep音が消せない状態が長引き困ったため解決方法をここにまとめておく。

# 解決方法

キー入力を受け付けるViewや要素の中で以下のメソッドをoverrideして返り値にtrueを設定すれば良い。

```swift
override func performKeyEquivalent(with event: NSEvent) -> Bool {
	return true;
}
```
ActiveRecord::Relationのオブジェクトに対してメソッドを追加したい時

# はじめに
ActiveRecord::Relationはレコードの集まりであるが、Railsでアプリケーションを開発している時に、ActiveRecord::Relationに対してのメソッドを定義したい時が幾度もある。具体的な例とその手法を見ていきたい。
[本編](#all)

## `ActiveRecord::Base`と`ActiveRecord::Relation`の関係
各々のモデル、`ActiveRecord::Base`、`ActiveRecord::Relation`のオブジェクトに対応推している。
例えば、`User`というモデルについて考えてみる。
現在、`users`テーブルにはレコードが下の様に入ってたとする。

| id      | name     | email             | power(億単位)|
|---------|----------|-------------------|------|
| 1       | カカロット | ninjin@saiya.com  | 130|
| 2       | ベジータ   | yasai@saiya.com   | 75|
| 3       | 18号   | kuririn.love@kikai.com   |13|
| 4       | セル      | sell@kanzentai.com | 300|
| 5       | ピッコロ  | gohan.love@namekku.com |20|
| 6       | ゴハン    | gohan@saiya.com | 300|

Userのレコードを全て所得すれば、以下のように表示される。

```ruby
User.all
=> #<ActiveRecord::Relation [#<User id: 1, name: "カカロット", email: "ninjin@saiya.com", power: "130">, #<User id: 2, name: "ベジータ", email: "yasai@saiya.com", power: "75億"> ... 省略]>
```

つまり、 `ActiveBase::Relation` クラスのインスタンスを返しているのである。

# all
おそらく、最も一般的なものはクラスメソッド内で、allを使う手法である。
考えてみれば、当たり前なんだけど気づかなんだ。
例：ActiveRecord::Relation内にフリーザーよりも強いやつが一人でもいたらtrueを返すメソッド

```ruby
class User
  def self.can_beat_freezer?
     # 便宜上、Freezer.power が 0.0053 (53万) を返すことにします。
     # 上記のメンバーだとヘナチョコのボコボコのペチャペチャのギッタンギッタンですね
     all.pluck(:power).any? { |power| power > Freezer.power }
  end
end
```
他にも、`relation` method などありますが、`all`は`relation`を間接的に呼び出しているので、`all`の方がいいでしょう。
バージョンが低い場合は（3以下かな？） `@relation` や `scoped` などがあったようです。（よく知らない）。

# クラス化
このように少しでもロジックが入ってしまうと、メソッドにしまいたいですね。
今回のように、戦闘力を比較して解決してしまう比較的単純なメソッドならばする必要はゼロなのですが、比較的複雑なメソッドをこのようにどんどんモデルにメソッドを足していくとデブモデルが出来てしまい、収拾がつかなくなります。そこで、このようなメソッドはクラスにするのがいいでしょう。

```ruby:beating_freeza.rb
class BeatingFreeza
  class << self
     def possible?(collection)
       new(collection).possible?
     end
  end

  def initialize(collection)
    @collection = collection 
  end

  def possible?
     collection.pluck(:power).any? { |power| power > Freezer.power } ||
     collection.any? { |user| user.super_saiya? } ||
     # ....... 以下戦闘力だけではなく、環境や頭の回転などを考慮するようになってくるとこのようにするのがいいでしょう。
     # ドラゴンボールは戦闘力で決まってしまうので、ハンターハンターとかのときには、クラスを別途で作りましょう。
  end
end
```

```user.rb
class User < ActiveRecord::Base
  def self.can_beat_freeza?
    BeatingFreeza.possible?(all)   
  end
end
```

# ちなみに
ドドリアなどの部下（果物）やサイヤ人（野菜）、リクームとかギニュウ（クリームと牛乳）を統括するフリーザ（冷凍庫）っていうことらしい。それがスーパーな人参に負けてしまうんだから、奇跡だな。
Qiitaの代替サービスに必要なもの ～ なぜQiitaは強いのか

Qiitaがはてな等他のブログサービスより使われる理由を解説します。代替サービス開発の一助となれば幸いです。

Qiitaが一般的なブログサービスより率先して使われる理由は公開した記事の**周知能力**、およびこれによるそのテーマに先鞭をつけた人物と日時を明らかにする**証拠能力**です。

**個人ブログでいかに優れた記事を書こうと人に知られなければ存在しないのと変わりません**。最悪、記事を盗用されるリスクさえあります。

Qiitaにメジャーなタグをつけて記事を投稿すれば高確率で存在だけは認識されます。不特定多数の人間の目に触れる機会が与えられます。加えて少なからぬ人の目にさらされるので明らかな不正は追及され、出稿日時も証明されるなどの付随効果もあります(もちろん承認欲求の充足も)。これがQiitaが選ばれる理由です。記事を書きやすく読みやすいから使われているという点も主要な要因ではありますが最大の要因ではありません。

つまりQiitaの代替サービスとなるためには**全ユーザーの投稿を一元化して発信する機能**として、**新着記事や人気記事をTwitterに投稿するBot**やタグ購読機能が必要です。すなわちQiitaは**すべての執筆者に対して平等にメディアとしての役割を果たしているから単なるブログサービスよりも強い**のです。書きやすさ読みやすさだけ追及してもメディアとしての効果をすべての執筆者に分け隔てなく提供できなければQiitaの優位性を代替することは困難です。

しかし最低限やるべきことはBotと購読機能(Botに丸投げするのもあり)の実装だけと技術的難易度は非常に低いです。たったこれだけのことをせずにみすみす成功を逃す手はありません。Botはリツイートの一本化や記事の身元保証にも有用です。必ず実装しましょう。人気コンテンツのような掲示機能があるとなおいいです。**要するに他のブログより初心者が浮かばれやすくするのです**。

なお前提としてQiita同様プログラミング関連のテーマのみ扱うものとしています。用途を限定せずに**発信に同名異議で用いられたタグの記事や企業のセールスといったノイズが入ってしまうとここで述べた発信機能の利益は得られません**。Qiitaのユーザーを得たいならQiita同様プログラミング関連の非営利投稿のみを対象としたサービスにするのが得策です。

マーケティングには年齢や所属、境遇などでターゲットを絞り込んだタイトルやキャッチコピーで訴求性を上げる手法があり、Qiitaはその効果を受けていることも理由として挙げられます。心理学上はおそらく類似性のバイアスに分類されるでしょう。

これらの要点は学生や新卒等スキルの低い新規参入者を対象としており、高いスキルと知名度を持った人は対象外です。若者がわいわいやってればおっさんは我慢できず向こうから寄ってくるのでおっさんのことは気にしなくてかまいません。**若者がたくさん集まっている以上の集客はありません**。初心者を第一に考えましょう。

**プログラミング関連の制約を外したり実績のない新規ユーザーの投稿を発信しなかったりすることは新規ユーザーの獲得において不利となるため避けるべきです**。こうした変更はQiitaに優位性を残します。

最後に、ちゃぶ台を返すようで恐縮ですが上記の点を踏まえて作ったとしても大前提として**サービスの継続性と安定性**を担保できるだけの信用がなければ現実には刹那的なサービスとしか見られないと思います。個人でなく法人として複数人で立ち上げることを求めたいところです。
コマンドライン上でMD5のハッシュ値を取得

## 前置き
ファイルのハッシュ値を取得したくなるときがある。主にファイルの転送を行い、それらの同一性を担保したいときなど）

そういうときは、md5sumコマンドでハッシュ値を求めて比較をする。

```
$ echo "abcABC123" > foo.txt
$ md5sum foo.txt
c92cd7e4a8f52284bf956ac63b72bb13  foo.txt
```

MD5ではなくSHA-256が良い場合はこう。

```
$ sha256sum foo.txt
6916802971d6cbd36dcc535bbad309ecc7c099b330ba0b4ed3a980157fc4da35  foo.txt
```

## 本題
ファイルではなく、任意の文字列のハッシュ値を取得したい場合はどうするか。

echoを使うのが簡単だ。

```
// echoは末尾に改行コードを挿入するので、"-n"が必要
$ echo -n "abcABC123" | md5sum
480aeb42d7b1e3937fe8db12a1ffe6d8  -
```

さきほどの例と結果が違うのは、コメントにも書いたが、改行コードの有無による。

```
$ echo "abcABC123" > foo.txt
$ md5sum foo.txt
c92cd7e4a8f52284bf956ac63b72bb13  foo.txt

// "-n"を付けない
$ echo "abcABC123" | md5sum -
c92cd7e4a8f52284bf956ac63b72bb13  -
```

いっしょになった。
GAEのDatastoreで、リモートのデータをローカルに持ってくる

2のローカルへのアップロードでの認証のところ、下記のエラーで躓いたのでメモ。

```bash
Error 401: --- begin server output ---
You must be logged in as an administrator to access this.
```

# 1. リモートからデータを取得する

app.yamlに下記のコードを追加し、remote_apiが使えるようにする。

```yaml
builtins:
- remote_api: on
```

追加してdeployしたら、terminalで下記のコードを実行して、欲しいエンティティのデータを取得する。

```bash
$ appcfg.py download_data --kind=<エンティティ> --url=http://<APPのID>.appspot.com/_ah/remote_api --filename=<エンティティ名でもなんでも>.dump
```

# 2. ローカルサーバへのデータのアップロード

ローカルへのアップロードは、GoogleのOAuthと関係ないので、このままアップロードすると、認証エラーになる。

そのためappengine_config.pyに下記のコードを追加して、ローカルの場合の認証を回避させる。

```py
if os.environ.get('SERVER_SOFTWARE','').startswith('Development'):
    remoteapi_CUSTOM_ENVIRONMENT_AUTHENTICATION = (
    'REMOTE_ADDR', ['127.0.0.1'])
```

その後、ダウンロードしたファイルをローカルのデータストアにアップしてめでたくローカルへのコピーが完了する。

```bash
$ appcfg.py upload_data --url=http://127.0.0.1:8080/_ah/remote_api --application=`dev~<APPのID>` --filename=<1でダウンロードしたファイル名>.dump --num_threads=5
```

<APPのID>の前に、"dev~"を入れるの忘れずにね。ローカルだとIDに入るので。
LT資料まとめ

[株式会社Eyes, JAPAN](http://nowhere.co.jp)のエンジニアの伊藤です。

今年も会津大学の新入生を対象としたLT会を「新入生セミナー」と題して4月13日（木）に開催いたしました。
技術を学ぶ楽しさと、スタートアップ企業の様子を知ってもらい、今後の学生生活の過ごし方の参考にしてほしいという目的で実施しています。

## 1. FUKUSHIMA Wheel「自転車で世界一周してみた」
[![thumbnail](https://image.slidesharecdn.com/lt-170509023004/95/slide-1-1024.jpg)](https://www.slideshare.net/EyesJapan/fukushima-wheel)

Speaker: 山寺(代表取締役)

概要: 弊社のシェアサイクル事業の紹介。

## 2. 5分でわかるエニグマ暗号
[![thumbnail](https://image.slidesharecdn.com/enigma-170509022330/95/slide-1-1024.jpg)](https://www.slideshare.net/EyesJapan/enigma-75799585)

Speaker: 小林(エンジニア)

概要: エニグマ暗号を歴史を絡めてわかりやすく解説してくださりました。

## 3. p進と僕
[![thumbnail](https://image.slidesharecdn.com/padicvaluation-170509025644/95/slide-1-1024.jpg)](https://www.slideshare.net/EyesJapan/p-75800148)

Speaker: 斎藤(エンジニア)

概要: p進距離について。思わず頭をひねってしまう数学のお時間。

## 4. お前のWebカメラ、大丈夫か?
[![thumbnail](https://image.slidesharecdn.com/sinnyuusei-lt2017-170509030028/95/slide-1-1024.jpg)](https://www.slideshare.net/EyesJapan/web-75800221)

Speaker: 兼澤(エンジニア）

概要: セキュリティ班からは実際のハッキングデモを交えたWebカメラについて。しっかりシールで塞ぎましょう。

## 5. ぼくがかんがえたさいきょうのキーボード配列
[![thumbnail](https://image.slidesharecdn.com/random-170509025407/95/slide-1-1024.jpg)](https://www.slideshare.net/EyesJapan/ss-75800092)

Speaker: 伊藤(エンジニア)

概要: Dvorak/親指シフトについて。勢いで乗り切っている感がすごいですね。

## 6. 人工知能の歴史&HTM
[![thumbnail](https://image.slidesharecdn.com/htm-170509021429/95/slide-1-1024.jpg)](https://www.slideshare.net/EyesJapan/htm-75799436)

Speaker: 及川(エンジニア)

概要: 社内最強人工知能エンジニアによるHTMの解説。