OmniAICreator/Qiita-1.07M huggingface dataset:
Unityでブラーshader(NotPostEffect)を作る

![615339e6e019b45e18884a5158b02ebf.gif](https://qiita-image-store.s3.amazonaws.com/0/108368/03264cee-8a35-6bd1-1f2e-d53235accea3.gif)

こんなん。
上のgifは、動画のデータにブラーshader貼り付けた感じです。

参考にしたサイト
http://gameprogramming.me.land.to/PDF/ESL516.pdf


```glsl:qiita.hlsl

Shader "Unlit/Blur"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}

        Uoffset ("Uoffset", float) = 0.1

        Voffset ("Voffset", float) = 0.1

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float Uoffset;
            float Voffset;
        
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

         
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);

                float4 txl0=tex2D(_MainTex,i.uv+float2(0.0f,0.0f))*0.2f;
float4 txl1=tex2D(_MainTex,i.uv+float2(-Uoffset,-Voffset))*0.1f; float4 txl2=tex2D(_MainTex,i.uv+float2(0.0f,-Voffset))*0.1f; float4 txl3=tex2D(_MainTex,i.uv+float2(+Uoffset,-Voffset))*0.1f;
float4 txl4=tex2D(_MainTex,i.uv+float2(-Uoffset,0.0f))*0.1f; float4 txl5=tex2D(_MainTex,i.uv+float2(+Uoffset,0.0f))*0.1f;
float4 txl6=tex2D(_MainTex,i.uv+float2(-Uoffset,+Voffset))*0.1f; float4 txl7=tex2D(_MainTex,i.uv+float2(0.0f,+Voffset))*0.1f; float4 txl8=tex2D(_MainTex,i.uv+float2(+Uoffset,+Voffset))*0.1f;
float4 color1=txl0+txl1+txl2+txl3+txl4+txl5+txl6+txl7+txl8;

                // apply fog
               
                float s = _Time*30;
                return color1;

                }

                 
            
            ENDCG
        }
    }
}

```

こんな感じ。

やったことは、uv座標をぼかす感じ。
少しずらしたピクセル部分を全部足し合わせると上手くいきます。

ソーベルフィルターみたいな感じですね。
Railsのマイグレーションファイルを整理する

継続して開発していくプロジェクトでは、データベースの変更も繰り返されることとなります。そうすれば、マイグレーションファイルも多量に存在することとなってしまいます。

# マイグレーションは便利、だけど
マイグレーションを使えば、データベース構造もソースコードと一貫して管理できるようになるので、反映忘れやミスなどが軽減できて便利です。

ただ、Railsの標準ではマイグレーションファイルを`db/migrate/`の直下に作ることとなっていて、長期間が過ぎたプロジェクトではマイグレーションファイルだけで数百個、ということになってしまって、エディタのリストで見たときもえんえん過去のマイグレーションが並んでいて、目的のものが見つからない、なんてことになってしまいます。

# 意外とデフォルト機能で対応できた
だからといって削除するわけにも行かないし、どうしたものだろうと悩んでいたのですが、ActiveRecordのソースを見たことで、悩みはあっけなく解決しました（[4.2のコード](https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/migration.rb#L923)）。

```activerecord/lib/active_record/migration.rb
      def migration_files(paths)
        Dir[*paths.flat_map { |path| "#{path}/**/[0-9]*_*.rb" }]
      end
```

ということで、パスに`/**/`が入っている、つまり**指定フォルダ以下ならどこに置いてもいい**のでした。速攻で`db/migrate/`以下にサブフォルダを作って、分類格納する形に切り替えたことで、問題は一件落着となりました。
Smartyを使ったサイトでGoolgeAnalyticsを使う際の注意点

```{}```がSmartyに認識されないように、以下のように```{literal}{/literal}```で囲う必要がある

## ユニバーサルアナリティクス
```html
{literal}
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-xxxxxxxx-1', 'auto');
  ga('send', 'pageview');
</script>
{/literal}
```

## 非同期版Googleアナリティクス

```HTML
{literal}
<script type="text/javascript">

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-xxxxxxxx-1']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

</script>
{/literal}
```
(参考)
http://daisukebe.net/smarty-javascript/
Mac に ArraySSLVPN をインストールする方法

#更新
こちらの方法がありました。

>[SSL VPN for Mac OS X 10.11-12](https://knowledgelayer.softlayer.com/procedure/ssl-vpn-mac-os-x-1011-12)
>Due to changes in the in macOS the process for getting the ArraySSLVPN standalone client connected on 10.11 and 10.12 has changed somewhat. Once you have downloaded the Standalone client you will need to edit the install.sh file and make the following 2 changes. 

>Line 4: cs_dir="/usr/array_cs" is changed to cs_dir="$HOME/array_cs"

>Line 21: /usr/array_cs/scpt.dat is changed to "$HOME"/array_cs/scpt.dat

>Once those 2 changes are made, you can start the install process with the command sudo ./install.sh.

>When the install completes you can continue the connection steps from the SSL VPN for Mac OS X 10.10 guide, starting on Step 4. 

#スタンドアローンVPNクライアントのインストール
こちらの記事を参考にして進めます。
><a href="https://knowledgelayer.softlayer.com/articles/standalone-vpn-clients-windows-linux-and-mac-os-x" >Standalone VPN Clients - Windows, Linux, and Mac OS X | IBM</a>

#ダウンロード
まず、ファイルを [こちら](http://speedtest.dal05.softlayer.com/array/ArrayNetworksL3VPN_MAC.zip) からダウンロードします。

解凍したら、アプリケーションフォルダに移しておきましょう。

「install」ファイルを実行して、ファイルが壊れている、と表示された場合は、以下の対応をしましょう。

#インストール
こちらのコマンドでおこないましょう。

```
sudo ./install.sh
```

#Operation not permitted エラー
mkdirでOperation not permittedが出ていた場合は、再起動をかけ、リカバリーモードから、操作をする必要があります。（System Integrity Protectionを無効にします。）

```
$ csrutil status
System Integrity Protection status: enabled.
```

cmd + R を押しながら再起動をかけ、メニューバーからターミナルを起動させ、以下のコマンドを入力します。

```
$ csrutil disable
Successufully disabled System Integrity Protection. Please restart the machine for the changes to take effect.  
$ reboot
```

再度ログイン後、以下のように、System Integrity Protectionが無効になっていれば、mkdirのエラーは出なくなるはずです。

```
$ csrutil status
System Integrity Protection status: disabled.
```

※System Integrity Protection はインストール完了後には、有効に戻しておきましょう。

# No such xattr: com.apple.quarantine のエラー
こちらは、スクリプト内にオプションが足りないことがエラーの原因となっていますので、スクリプトを以下のように修正します。

```
#19行目のオプションを「-d」から「-dr」にします。 
xattr -dr com.apple.quarantine "$curr_dir"/ArraySSLVPN.app/
```

#インストール確認
上記インストールコマンドにより、エラーなく「Install finish」と表示されれば完了になります。

#参考記事
- <a href="http://berukann.hatenablog.jp/entry/2015/12/30/123020" >EI Capitanでsudo付けているOperation not permittedが出た時の対処法 - いつかエンジニアになりたい</a>
- <a href="http://www.mnhr.net/reports/index.php/20120120" >Technical Reports Index</a>
AzureイメージファイルからのProvisioning注意点

# まえがき
すでに構築を完了した仮想マシンのキャプチャイメージを利用して、VMSS（Virtual Machine Scale Set)を構築しました。NIC2枚刺しの仮想マシンということもあり、PowerShellでVMSSを作成しましたが。。。。。エラー。。。。。


# エラー内容

```
New-AzureRmVmss : Long running operation failed with status 'Failed'.
ErrorCode: OSProvisioningInternalError
ErrorMessage: OS Provisioning failed for VM 'testscaleset01_0' due to an internal error.
StartTime: 2017/03/18 4:50:42
EndTime: 2017/03/18 4:52:51
OperationID: ****************
Status: Failed
発生場所 C:\Users\miwato\Desktop\AutoScaleSet.ps1:106 文字:2
+     New-AzureRmVmss -ResourceGroupName $ResourceGroupName -Name $Vmss ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-AzureRmVmss], ComputeCloudException
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.Compute.Common.ComputeCloudException,Microsoft.Azure.Commands.Compute.Automation.NewAzureRmVmss

```

# 今一度Check
構築が完了した仮想マシン上では、CentOS7.3 が動きDockerコンテナが動いていたため、iptablesが動いてました。これが原因。
MSさんの[Japan Azure Technical Support Engineers' Blog](https://blogs.technet.microsoft.com/jpaztech/2016/08/02/virtual-machine-provisioning-error/)に、「Provisioning failed」の原因についてあるあるパターンの記載がありました。

・#1 : 一般化されていないイメージを一般化イメージとして起動した
・#2 : ファイアウォール設定がされて外部と接続できない       ★ BINGO！ ★ 
・#3 : 仮想ネットワーク・ネットワークインターフェースカードに存在しない DNS サーバーが設定されている
・#4 : インターネットに接続できない状況で診断を有効化した
・#5 : VPN / ExpressRoute でインターネットに接続できないオンプレミス環境へ強制トンネリングをしている


#エラー原因
次のオプションで英大文字を利用していたことが原因でした。
・Set-AzureRmVmssOSProfile のオプションとなる -AdminUsername
・New-AzureRmVmss のオプションとなる -Name


# どうやって判明したか
Azureポータルから同じ名前を利用して作ってみると、設定した値ではダメということで「！」（ビックリマーク）が表示されました。
Data Encryption In Ruby On Rails

Data security is the main concern in any application.Because we are storing the user's personal data such as date of birth, mobile number, address, bank details and etc.

So you are at the right place to implement the data security functionality.
Here we are using the Ruby(4.2.5) and Postgresql(to store the user's data).

There are multiple gems available in Ruby On Rails.But we are going to implement the "attr_encrypted" Gem.

**Step1. Add data encryption gem**
add a gem in GemFile.

```rb
gem 'attr_encrypted'
```
**Step2. Perform the bundle install**

```
bundle install
```
**Step3. Generate a model**

```
rails g model UserDetail
```
**Step4. Set encrypted columns in migration file.**

```rb
class CreateUserDetails < ActiveRecord::Migration
  def change
    create_table :user_details do |t|
      t.string :last_name
      t.string :first_name
      t.string :encrypted_birth_date
      t.string :encrypted_birth_date_iv
      t.string :encrypted_mobile_no
      t.string :encrypted_mobile_no_iv
      t.timestamps null: false
    end
  end
end
```
In the migration file, we need to encrypt birth_date and mobile_no.
So, we have to add 「encrypted_」string before column name.
For example, birth_date.
so,our migration file look like,

```rb
t.string :encrypted_birth_date
t.string :encrypted_birth_date_iv
```

iv column is used for more data security.

**Step5. Setting in Model**
in your model,

```rb
class UserDetail < ActiveRecord::Base
    secret_key = ENV['DB_COL_ENCRYPTED_KEY']
    attr_encrypted :birth_date, :key => secret_key
    attr_encrypted :mobile_no, :key => secret_key
    validates_presence_of :last_name
    validates_presence_of :first_name
    validates_presence_of :birth_date 
end
```
**for environment variables setting, please check the below article.**
http://qiita.com/alokrawat050/items/0d7791b3915579f95791

**Step6. How to access encrypted fields in view or rails console**
If you need to access encrypted fields in views or rails console then you just need to write the column name(no need to write the encrypted_).

in views,

```html+erb
<%= f.text_field :birth_date, class: 'form-control'  %>
<%= f.text_field : mobile_no, class: 'form-control'  %>
```
in your controller, set the permit params,

```rb
private
    def user_details_params
      params.require(:user_detail).permit(:id, :last_name, :birth_date, :mobile_no)
    end
```
**in rails console,**
rails c

1.data insert in user_details table.
![Screen Shot 2017-03-18 at 13.00.18.png](https://qiita-image-store.s3.amazonaws.com/0/117479/c239c834-383d-2aef-4991-c14a289214a0.png)

In above example, you can see that when we are going to save data then it encrypted both the column's data(birth_date and mobile_no).

2.data fetch from user_details table.
![Screen Shot 2017-03-18 at 13.00.49.png](https://qiita-image-store.s3.amazonaws.com/0/117479/78620403-6a9c-96b0-55aa-0429a9fdd191.png)

when we are fetching data then we need to call only column name(no need to write the encrypted_).

```rb
usr = UserDetail.find(1)
usr.birth_date
usr.mobile_no
```
and you will get the data in decrypted form.

Enjoy Coding.

**Thanks & Best Regards,
Alok Rawat**
raspbianでchrony（時刻同期編

# はじめに

最終目標であるネットラジオ録音サーバの構築の第一歩です
ここでは録音に重要な**時刻同期**です

raspbianではntpが使われていますが、chronyを使用します（何となくntpよりchronyが楽しそうだから…

# chronyのインストール

まず、ntpdのサービスを止めましょう…

```shell-session:ntpdサービス停止
raspberry$ sudo systemctl stop ntp.service
```

サービスが止まったら削除してしまいます

```shell-session:ntp削除
raspberry$ sudo apt-get remove ntp
```

そして、chronyをインストール!

```shell-session:chronyインストール
raspberry$ sudo apt-get install chrony
```

# chronyの設定

そのままでも良いですが、参照サーバ位はお好みで変えておきたいもんです
と、言う訳でchronyの設定をします

/etc/chrony/chrony.confを編集します

```:/etc/chrony/chrony.conf
#server 0.debian.pool.ntp.org offline minpoll 8
#server 1.debian.pool.ntp.org offline minpoll 8
#server 2.debian.pool.ntp.org offline minpoll 8
#server 3.debian.pool.ntp.org offline minpoll 8

server ntp.nict.jp iburst minpoll 8 maxpoll 14
server ntp.jst.mfeed.ad.jp iburst minpoll 8 maxpoll 14
server time.google.com iburst minpoll 8 maxpoll 14
```

ちなみに、サーバ横のオプションは：

- iburst : 起動直後に短い間隔で4回問い合わせをする
- minpoll *n* : ポーリング間隔最小値のべき乗数(2のn乗秒)
- maxpoll *n* : ポーリング間隔最大値のべき乗数(2のn乗秒)

設定ファイルを書き換えたら再起動させましょう…

```
raspberry$ sudo systemctl restart chrony.service
```

# chronycコマンド(一部)の使い方

chronycコマンドで状況の確認がいろいろできるらしいですよ…

- 強制同期

```shell-session:強制同期
raspberry$ sudo chronyc -a makestep
```
- トラッキングの確認

```shell-session:トラッキング確認
raspberry$ chronyc tracking
```

- ソースの確認

```shell-session:ソース確認
raspberry$ chronyc sources -v
```

- ソースの統計情報の確認

```shell-session:ソース統計情報確認
raspberry$ chronyc sourcestatus -v
```
Ubuntu 16.04 on Raspberry Pi 3 Bのアップデートについて

ラズパイをUbuntu 16.04で運用したいなーと思い意気揚々とインストールしたはいいものの、`sudo apt update`からの`sudo apt upgrade`かけて`reboot`で見事に起動しなくなりハマったので解決（**してない**）方法の備忘録。
原因としては、FDT (Flattened Device Tree)のロード位置がデフォルトから変更になったため動かなくなったって感じみたいです。

# 注意事項
当方ブート周りに全く詳しくないので見当違いのことを言っている可能性が十二分にあります。

# インストール
何はともあれインストール。イメージを[ここ](https://wiki.ubuntu.com/ARM/RaspberryPi)からダウンロードします。RPi3向けのUbuntu 16.04 LTS 'classic'イメージです。一応アンオフィシャルですのでご注意を。
PCとSDカードを接続して、イメージをSDカードに書き込みます。ここではSDカードのデバイス名は/dev/sdeです。

```bash
xzcat ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz | sudo dd bs=4M of=/dev/sde
```

私の環境ではパーティション構成はこのようになります。

```
(parted) print
Number  Start   End     Size    Type     File system  Flags
 1      4194kB  138MB   134MB   primary  fat16        boot, lba
 2      138MB   31.0GB  30.9GB  primary  ext4
```

# アップデート
今回の鬼門。まずは普通にアップデートします。

```bash
sudo apt update
sudo apt upgrade
```

ここで再起動してしまうと、起動しなくなって辛い気持ちになるので、もう少し作業します。
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1652504 のバグレポートを参考にブート周りの設定を変更しました。

まず、 /usr/share/flash-kernel/bootscript/bootscr.rpi3 に、FDTの手動ロードを追加します。

```diff:/usr/share/flash-kernel/bootscript/bootscr.rpi3
 setenv fdt_addr_r 0x02008000
+fatload mmc 0:1 ${fdt_addr_r} bcm2710-rpi-3-b.dtb
 fdt addr ${fdt_addr_r}
 fdt get value bootargs /chosen bootargs
 setenv kernel_addr_r 0x01000000
 setenv ramdisk_addr_r 0x02100000
 fatload mmc 0:1 ${kernel_addr_r} vmlinuz
 fatload mmc 0:1 ${ramdisk_addr_r} initrd.img
 setenv initrdsize $filesize
 bootz ${kernel_addr_r} ${ramdisk_addr_r}:${initrdsize} ${fdt_addr_r}
```

次にブート関連ファイルの更新。

```bash
sudo update-initramfs -u -k all
```

このまま再起動してもちゃんとブートはするのですが、デバイスの認識が上手く行かず（？）、NICのMACアドレスが起動する度に変わります。
そこで、 /boot/firmware/config.txt のFDTのアドレスをboot.scrで設定した値に変更すると、それがなくなるそうです。
**ただ、私は変えたのだけど駄目でした。**

```diff:/boot/firmware/config.txt
...

 kernel=uboot.bin

 # enable uart (needed for u-boot on RPi3)
 enable_uart=1

 # set extended DT area
-device_tree_address=0x100
-device_tree_end=0x8000
+device_tree_address=0x2008000
+device_tree_end=0x200ff00

 # enable i2c
 dtparam=i2c_arm=on
 dtparam=spi=on

...
```

この後も色々と調べてみたのですが、MACアドレスが変わる問題についてはわからずじまいで、結局解決せず・・・。

# 最後に
もっかい新規インストールして駄目なら諦めてRaspbian使います。

# 参考
* https://wiki.ubuntu.com/ARM/RaspberryPi
* https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1652504
RubyにSwiftっぽいenumを作りました

Swiftのenumが使いやすくて好きです。
Rubyには標準でenumがなく、gemでも同じような動きをしてくれるものがなかったので、自作してみました。

[swifty_enum | RubyGems.org](https://rubygems.org/gems/swifty_enum)
[zeero/ruby-swifty_enum | GitHub](https://github.com/zeero/ruby-swifty_enum)

# インストール

RubyGemsに登録済みなので、bundler経由で。

```ruby:Gemfile
gem 'swifty_enum'
```

```
$ bundle
```

または直接。

```
$ gem install swifty_enum
```

# 使い方

## enumを定義する

1. クラスを作成し、SwiftyEnumモジュールをincludeします。（以下、enumクラスと呼びます）
1. `def_case 名前 [値]` でenumの要素（Swiftでいうcase）を作成します。（以下、enumケースと呼びます）
1. 指定した名前のサブクラスが定義されます。

サンプルはこんな感じです。

```ruby:flag.rb
require 'swifty_enum'

class Flag
  include SwiftyEnum

  def_case :On, '1'
  def_case :Off, '0'
end

Flag::On                       # => Flag::On
```

## enumケースに定義されるメソッド

Swiftでも用意されているhashvalue、rawvalueをenumケースで使えるようにしています。

```ruby
Flag::On.hashvalue             # => 0
Flag::On.rawvalue              # => '1'
```

`def_case`でrawvalueが指定されなかった場合は、hashvalueをrawvalueの代わりに使うようにしています。ここはSwiftと振る舞いが違うことになってしまうので少し悩んでいます。。。

## enumケースの生成

rawvalueに指定した値を使って、enumクラスの`get`メソッドからenumケースを生成できます。
定義していないrawvalueで呼び出すとnilになります。

```ruby
Flag.get('1')                  # => Flag::On
Flag.get('0')                  # => Flag::Off
Flag.get('2')                  # => nil
```

enumケースはスイッチ文で分岐することもできます。

```ruby
on = Flag.get('1')
case on
when Flag::Off then
  puts 'NG'
when Flag::On then
  puts 'OK'
else
  puts 'NG'
end
# >> OK
```

## enumケースに独自メソッドを追加する

enumクラス定義内で`def_method`を使うことにより、enumケースに独自のメソッドを追加できます。
メソッドの戻り値はメソッドの最後の値になります。`return`は使用できません。（LocalJumpErrorになってしまいます）

```ruby
class Flag
  include SwiftyEnum

  def_case :On, '1'
  def_case :Off, '0'

  # メソッドを追加
  def_method :status do |enum_case|
    case enum_case
    when On then
      'OK'
    when Off then
      'NG'
    end
  end

  # 引数をもつメソッドは可変長引数として受け取ることができる
  def_method :status_with do |enum_case, args|
    if args.empty?
      enum_case.status
    else
      with = args.join(', ')
      "#{enum_case.status} with #{with}"
    end
  end
end

Flag::On.status                # => 'OK'
Flag::Off.status               # => 'NG'
Flag::On.status_with('foo')    # => 'OK with foo'
```

ブロックの引数に自分自身が渡ってくるのでケースで分岐させることができます。
定義内なのでenumクラスの名前まで（上記例では`Flag::`）は省略することができます。

また注意点ですが、`def_method`はすべてのenumケースを定義したあとに呼び出してください。

## すべてのenumケースを取得する

Swiftのenumにはない機能ですが、すべてのenumケースを取得する`enum_case`メソッドを追加しています。

```ruby
Flag.enum_cases                # => [Flag::On, Flag::Off]
```

# おわり

Swiftのenumの一通りの機能はつけれたかなと思ってます。
要望やご意見などありましたらコメントや[Githubイシュー](https://github.com/zeero/ruby-swifty_enum/issues/new)をもらえると嬉しいです。
文系エンジニアが言語処理100本ノックやってみた　in Python　00

文系だけども、これから言語処理とか機械学習は標準になると感じたので早めに触れておこうと思って始めました。
コメントで意見いただけると嬉しいです！

環境はPython2.7 ＋　macOS Sierra ver10.12.3です

#00
>文字列"stressed"の文字を逆に（末尾から先頭に向かって）並べた文字列を得よ．


```Python:100:0.py
str = "stressed"
str = str[::-1]
print str
```

これは文字列操作の基本でスライスって言うらしいです。
これ使うとかなり便利


ちょっとスライスについては勉強不足なので後日まとめたいと思います。
もっと言語仕様に詳しくなりたい。。。


参考: [言語処理100本ノック 第1章 in Python](http://qiita.com/piyo56/items/eb72b496669f541055c3 "言語処理100本ノック 第1章 in Python")

参考:[言語処理100本ノック 2015　1日目](http://qiita.com/piyo56/items/eb72b496669f541055c3 "言語処理100本ノック 2015　1日目")
WindowsでSSHキーを作る時に躓いたところ

#概要
[WindowsでSSHの鍵を作る](http://qiita.com/digdagdag/items/9e5c061e7d86e0af9a57)という記事を使ってSSHキーを作っていて躓いたところがあったのでメモしておきます。
#パスを通すってどういうこと？
普通環境変数PATHにディレクトリを追加することです。もしくは以下のようにコマンドを実行してbinからの操作を有効にすれば問題ありません。

```
C:\Users\XXXX>cd C:\Program Files\Git\bin
```
```
C:\Program Files\Git\bin>
```
#ssh-keygenを適用するには
適当にこのコマンドを実行してもエラーが起きます。

```
 C:\Program Files\Git\bin>sh
```
```
XXXX@PC番号 MINGW64 /bin
$ ssh-keygen
```

shを開いてから```ssh-keygen```を実行してください。これでエラーは起きません。

```
Generating public/private rsa key pair.
Enter file in which to save the key (//.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in c:/Users/XXXXX/.ssh/id_rsa.
Your public key has been saved in c:/Users/XXXXX/.ssh/id_rsa.pub.
The key fingerprint is:
48:--:--:--:0b:bf:0a:fd:ff:--:--:--:--:--:--:-- XXXXX@YOUR SERVER NAME
The key's randomart image is:
+--[ RSA 2048]----+
|        略       |
+-----------------+
```
鍵の生成だけなら```Enter same passphrase```まで何も入力せずにエンターキーを押せば鍵の生成はできてます。
aws-serverless-expressを使ってみた！（超初心者メモ）

今回は、サーバレス＋Express.jsでサービスを作りたいのでAWS純正（？）aws-serverless-expressを使ってみた！こいつは優れもので、APIGateway + Lambda + Node + Expressがあっという間に作れてしまう。でも、私はサザエ的な人なので「あっというまに作れてしまう」代物でもハマってしまう。そこで、私の同志（＝サザエ的な方）のためにメモを取りました!

とりあえず、最初はテキスト通りに表示確認から！
#環境
MacBook Pro
OS:sierra 
バージョン:10.12.3
#参考にしたサイト
[AWS 謹製 aws-serverless-express を使って APIGateway + Lambda + Node + Express で RESTful サービスの雛形を最速で作る](http://qiita.com/exabugs/items/594d3cd417e99dc29387)
[GitHub awslabs / aws-serverless-express](https://github.com/awslabs/aws-serverless-express)

#手順
すでにAWSアカウントを設定し、最新バージョンのAWS CLIをインストールしていることを前提としています。

1.ローカル環境を作る

とにかく、色々やりすぎでどこからがスタートなのかすでにわからないが、とにかく、npmは入れてください。
npm は Node.js で作られたパッケージモジュールを管理するツールです。
私はnvmも入れてます。nvm は Node.js 自体をバージョン管理するツールです。
インストール方法など詳しくはこちら↓
[macでNode.jsの環境設定](http://qiita.com/tagosaku324/items/bf1fe149c38c99728c72)
そして、Lambdaとバージョンを合わせた方がいいかもなのでnode.jsは4.3.2を使いました。

```
$ nvm install v4.3.2
$ node -v
v4.3.2
```

2.サンプルを取得する。
作業をするのでイレクトリを作って、そこでサンプルを取得します。

```
$mkdir project/
$cd project/
$ git clone https://github.com/awslabs/aws-serverless-express.git
```

すると、
/project/aws-serverless-express
というディレクトリが出来上がります。

3.設定する。
まずは作ったディレクトリ内に移って設定をします。

```
$npm run config -- --account-id="<accountId>" --bucket-name="<bucketName>" --region="<region>" --function-name="<functionName>"
```
これが設定するための魔法のコード。
中の詳細は以下。

accountIdはAWSのコンソール画面＞MyAcount＞Account Settingsに書いてある数字です。
bucketNameはS3に作った（なかったら勝手に作ってくれる）バケットの名前。
regionはS3に作るバケットのリージョン。
functionNameはLambdaに使われる関数名っぽい。←これ、あってるか知っている方教えてください〜

ちなみに、regionとfunctionNameはなくても動きます。
デフォルトではregionは「us-east-1」でfinctionNameは「AwsServerlessExpressFunction」と設定されるみたいです。

```
$cd /prpject/aws-serverless-express/example
$npm run config -- --account-id="<accountId>" --bucket-name="<bucketName>" --region="<region>" --function-name="<functionName>"
> aws-serverless-express-example@2.1.1 config /Users/×××××/prpject/aws-serverless-express/example
> node ./scripts/configure.js "--account-id=×××××" "--bucket-name=×××××" "--region=ap-northeast-1" "--function-name=×××××"

```

上記を実行すると、package.json, simple-proxy-api.yaml , cloudformation.yamlのファイルに設定を書き込んでくれます。
（私は色々やりすぎで、この３ファイルを手動で書き換えました）

4.セットアップ

```
$npm run setup

省略

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - AwsServerlessExpressStack
```

これだけ！

5.確認
AWS コンソールの[CloudFormation](https://console.aws.amazon.com/cloudformation/home)>Stacks でAwsServerlessExpressStackが CREATE_COMPLETE になれば、完了。
<img width="1378" alt="スクリーンショット 2017-03-18 16.57.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/100644/d6a927d7-90f6-c76c-f712-e02d325da4ab.png">

Outup>ApiUrlにあるURLをクリックすると
<img width="1377" alt="スクリーンショット 2017-03-18 17.04.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/100644/edf32d13-8331-a3ba-25f8-4548ba8b7f2a.png">


が表示されればOK！


#まとめ
GitHubを見てみるとここからこの「example」を使って自分のプロジェクトを作ってね！的なことが書いてあるのでここから、やっと自分のプロジェクトを作っていくわけですが、この先は現在やっているさいちゅうなので、ある程度やってからまとめたいと思います。
chainerでCommon Representation Learningをやってみる

# 概要
KDD2016 workshopに出てる， IBM Research, Indiaの人の「[Joint multi-modal representations for e-commerce catalog search driven by visual attributes] (https://kddfashion2016.mybluemix.net/kddfashion_finalSubmissions/Joint%20multi-modal%20representations%20for%20e-commerce%20catalog%20search%20driven%20by%20visual%20attributes.pdf) 」をchainerで実装しようというものです．

論文の手法の元論文は[こちら](https://arxiv.org/abs/1504.07225)です．
この論文の[本実装](https://github.com/apsarath/CorrNet)は，Theanoで書かれています．

論文の内容は，ざっくり読んだ感じ，テキストと画像がペアで与えられたとき，その共通空間をNeural Netを使って求めて(手法名は「Correlational Neural Net, 略してCorrNet」)検索エンジンに役立てようというなものになってます．

2つの異なるモーダルの共通空間を求める場合，CCAを使うのが一般的かと思いますが，実用上scikit-learnのCCAはデータサイズが大きくなるととたんに訓練に時間がかる＆MemoryErrorで使い物にならないこともありますし，今回はサクッとchainerで実装してみました．

python3で，jupyter notebookで書いたコードは**[こちら](https://github.com/LittleWat/CommonRepresentationLearning/blob/master/CorrNet.ipynb)**です．

相関係数を共通空間で大きくなるように学習させるのがポイントみたいです．

イメージ図
<img width="473" alt="スクリーンショット 2017-03-27 11.29.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/4b08136e-74d9-1302-7bac-189d6c681e73.png">

ロス関数は，2つのモーダルが与えられたとき両方復元する際の損失，片方のモーダルが与えられたとき両方復元する際の損失，そして隠れ層での相関が高くなるようにする損失で構成されてます．
<img width="841" alt="スクリーンショット 2017-03-27 11.35.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/24eb9f40-1842-3090-04e4-4db6e246f0d1.png">


# 使用したデータ
簡単に試してみたかったのでMNIST使って，28x28の画像と，one-hot-vector形式にしたラベル情報の共通空間を求めました．

今後違うデータでも試すつもりです．


# 結果
### もともとの画像
<img width="210" alt="スクリーンショット 2017-03-24 17.07.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/7d27acfd-940b-6e81-1da2-02b70b09a443.png">

### 復元後の画像（「画像」　→　「画像」）
<img width="209" alt="スクリーンショット 2017-03-24 17.06.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/ef6dbc0d-0403-b241-7eb4-a4e71c2e1644.png">


うまく復元できてるようです

### ラベルを使っての復元後の画像（「ラベル」　→　「画像」） 
<img width="210" alt="スクリーンショット 2017-03-24 17.06.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/1452c429-e5cd-b483-b3be-75d187ab4e7a.png">

### ラベル情報を組み合わせて（0と8）の復元後の画像（「ラベル」　→　「画像」） 

<img width="236" alt="スクリーンショット 2017-03-27 11.52.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/4bd19f46-6d4f-f674-4493-9f8e0c842332.png">

0と8の中間のような画像がちゃんと生成されております．

## ロスの推移
### Total
![loss.png](https://qiita-image-store.s3.amazonaws.com/0/104256/1dbafc51-8d8e-3c4a-b5f7-33c6acb659e0.png)

### Detail

![detail_loss.png](https://qiita-image-store.s3.amazonaws.com/0/104256/297eedb8-3c76-8e62-7239-ce9c0dde2f14.png)

ちゃんと隠れ層で相関が高くなるように学習が進んでおります！

## 考察
ラベル情報からだけでも復元できるようです！

いずれにせよ，chainer，やはりTheanoよりだいぶ簡単に書けてログも出力できて便利ですね^^
pyenv-virtualenv環境でimport matplotlib.pyplotができない時

#環境
OS:ubuntu14.04 LTS
pyenv virtualenv 3.5.2 xxxでpython3の環境構築
その後、
`pip install matplotlib`
でmatplotlibをインストール：ここまで問題なし。
ここからドハマり。対話環境で
`>>>import matplotlib.pyplot`
とやると

```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user/.pyenv/versions/pyenv3.5.2/lib/python3.5/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/home/user/.pyenv/versions/pyenv3.5.2/lib/python3.5/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
  File "/home/user/.pyenv/versions/pyenv3.5.2/lib/python3.5/site-packages/matplotlib/backends/backend_tkagg.py", line 6, in <module>
    from six.moves import tkinter as Tk
  File "/home/user/.pyenv/versions/pyenv3.5.2/lib/python3.5/site-packages/six.py", line 92, in __get__
    result = self._resolve()
  File "/home/user/.pyenv/versions/pyenv3.5.2/lib/python3.5/site-packages/six.py", line 115, in _resolve
    return _import_module(self.mod)
  File "/home/user/.pyenv/versions/pyenv3.5.2/lib/python3.5/site-packages/six.py", line 82, in _import_module
    __import__(name)
  File "/home/user/.pyenv/versions/3.5.2/lib/python3.5/tkinter/__init__.py", line 35, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
ImportError: No module named '_tkinter'
```

こんなエラーが出て一歩も進めなくなる。
いろんなサイト調べて、`matplotlibrc`の`backend`書き換えとか、
`freetype`だの`libpng`だの入れるとかやってみましたが全く効果なし。

#結論
matplotlibのバージョン変える。
`pip freeze`等で確認して`matplotlib==2.0.0`となっていたら、

```
(xxx)pip uninstall matplotlib
(xxx)pip install matplotlib==1.4.3 ※xxxはvirtualenv環境名
```

で前のバージョンインストールしてみて下さい。
私の場合はこれで`matplotlib.pyplot`の`import`に成功しました。

[参考:matplotlib.pyplotがversion 1.5.0でうまく動かなくなった@Mac](http://montblanc6615.blog90.fc2.com/blog-entry-118.html)
GitHubとgitコマンドを利用する


下記の記事を実践済みという前提で進めます。

[GitHub入門 ~登録編~](http://qiita.com/y_sekitoba/private/68c20feb591ad6dab92a)
[GitHub入門 ~利用編~](http://qiita.com/y_sekitoba/private/d5d5108a48d1110ff0d4)
[git入門 ~入門編~](http://qiita.com/y_sekitoba/private/aad68a9aef91e50172a8)

##実践

実際に、GitHubとgitコマンドを利用して作業をしていきます。

今回は、下記の流れで進めていきます。

1.GitHubでリポジトリを作成
2.自分のPCにGitHubで作成するディレクトリを作成


[GitHub入門 ~利用編~](http://qiita.com/y_sekitoba/private/d5d5108a48d1110ff0d4)

を参考にGitHubと自分のPCと連携したディレクトリを作成します。
※私は今回は記事の中で作成した「zerofurotest」ディレクトリを対象に進めていきます。

今回は、GitHubと連携させた「zerofurotest」ディレクトリにGulpを導入していきます。
Gulpの導入に関しては下記の記事をを参照してください。

[初めてのコマンドライン=>npmの利用まで](http://qiita.com/y_sekitoba/private/f0d50afe3884bd22f6d5)
[初めてのGulp入門 ~インストール編~](http://qiita.com/y_sekitoba/private/ca8f582dbf437afdbf1d)


##step1

```
$ cd zerofurotest  // すでに対象のディレクトリにいる場合はそのままで大丈夫です。
```

[GitHub入門 ~利用編~](http://qiita.com/y_sekitoba/private/d5d5108a48d1110ff0d4)で作成したディレクトリに移動します。


##step2

```
$ npm init -y
```

`package.json`ファイルを作成します。


##step3

```
$ npm install gulp -D
```

npmコマンドを利用してGulpパッケージをインストールしていきます。


##step4

```
$ touch gulpfile.js
```

Gulpの設定ファイルである`gulpfile.js`を作成する
※`gulpfile.js`の中身は記述していなくても問題ありません。


##step5

```
$ git status
```

現在の状況を確認すると大量のファイルが作成されているはずです。
これはnpmを利用してGulpパッケージをインストールした際にGulpパッケージで利用している様々なパッケージをnpmが自動的にインストールしているからです。

Gulpパッケージのインストールは下記のコマンド1行で完結しますが実際にはインストールしたパッケージが利用している様々なパッケージも同時にインストールされています。

ただ、GitHubでディレクトリを管理していく際はこれらのパッケージのデータは必要ないので除外する必要があります。
除外するには`.gitignore`ファイルを作成する必要があります。

下記のコマンドを実行してください。

```
$ touch .gitignore
```

作成した`.gitignore`ファイルに下記の内容を貼り付けて保存してください。

```
# node_modules/を除外
node_modules/
```

上記の作業が完了後、再度下記のコマンドを実行します。

```
$ git status
```

先ほどよりファイル数が大きく減っているはずです。
これは、`.gitignore`ファイルの設定が効いているからです。

今後も、Gitで管理する必要がないファイルに関しては`.gitignore`ファイルに記述していくようにしてください。


##step6

```
$ git add .
```

作成したファイルを「ステージングエリア」に移動


##step7

```
$ git commit -m "pacage.json & gulpfile.jsの作成"
```

コミットの作成


##step8

```
$ git push origin master
```

先ほど作成したコミットをGitHubに送る
問題なく処理が進んだ後はご自身のGitHubに移動して先ほどの変更が反映されているかを確認してみましょう。


##こちらもどうぞ
[新人の指導者 or 新人の方へ](http://qiita.com/y_sekitoba/private/89e421c5e2b28dfe5dfb)
Slackで特定のemojiリアクションが付いたら別のチャンネルに内容を通知する

[Reacji Channeler](https://slackhq.com/a-new-way-to-share-messages-across-channels-using-emoji-ba9fdac5744e#.98ls5c5n6)というSlackの情報集約や自動化に便利そうな機能が追加されてました。

これは一種のSlackBotで、投稿に対して特定のemojiリアクションがついたら、その投稿の内容を特定のチャンネルに通知出来ます。どの絵文字をトリガーにするかや、送り先のチャンネルも任意に設定できます。

例えば :thumbsup: された全ての投稿を特定のチャンネルに集めるといった活用が考えられます。[API](https://api.slack.com/methods/reactions.add)やbotと組み合わせれば色々な活用が出来そうな機能ですね。

# 設定手順

設定手順は以下

1. [SlackのReacji Channelerページ](https://reacji-channeler.builtbyslack.com/)で[Add to Slack]ボタンをクリックし、Sklackチームへのアクセスを許可してReacji Channelerを有効にする
2. Slack上で `/reacji-channeler :+1: #thanks` コマンドを入力してReacji Channelerを有効にする
  - この例だと、 :thumbsup: されたあらゆる投稿が `#thanks` ページに通知されます
  - 現状では、一つのリアクションは 一つのチャンネルにしか通知出来ないようです (+1 されたら複数のチャンネルに投稿とか出来ない)
Pythonのre.subで正規表現置換するグループ番号の後に数字を置きたい時の書き方

この記事ではPython 2.7を使用して確認しています。

## グループ置換の基本

`re.sub()`を使用して正規表現のグループ置換をしたいとき、通常はこのように書く。
（※ グループ番号1の前に`'\'`を2回書くのに注意）

```python:
re.sub(r'(hoge)', '\\1bar', 'hogefoo')
# 結果：
# 'hogebarfoo'
```

## エラーになるケース

しかし、この書き方だと**グループ番号の後に数字を置きたい場合、以下のようなエラーになってしまう。**

```python:
# '第三'を'第3'にしたい
re.sub(r'(第)三', '\\13', '第三')
# 結果：
# ...
# raise error, "invalid group reference"
# sre_constants.error: invalid group reference
```
これはグループ番号が1ではなく（上記の例では）13として認識されてしまうためである。

## 対応方法

このようなときは、以下のように書くことで解決できる。

```python:
re.sub(r'(第)三', '\g<1>3', '第三')
# 結果：
# 第3
```
ARCH_INSTALL.md

# PREPARE
- Prepare USB stick
    - check disk
        - dmsg
        - lsblk
    - SIZE>=4GB
    - fdisk -l /dev/sdxx
        - fdisk /dev/sdxx
- Download ISO
    - wget [URL]
- Create LiveUSB
    - check disk
        - dmsg
        - lsblk
    - copy
        - dd bs=4M if=[ISO] of=/dev/sdxx
        - sync

# BOOT
- Boot USB
    - check BIOS
- Boot Arch
    - Login: root
    - loadkeys jp106

# INTERNET CONNECTION
- Connect Wireless
    - check wireless interfaces [ifname]
        - iw channel
        - iwconfig
    - create configuration
        - cp /usr/share/doc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant.conf
        - delete example networks and create one
        - man wpa_supplicant.conf
    - run wpa_supplicant
        - man wpa_supplicant
        - test
            - wpa_supplicant -D nl80211 -i [ifname] -c /etc/wpa_supplicant.conf
        - connect
            - wpa_supplicant -D nl80211 -B -i [ifname] -c /etc/wpa_supplicant.conf
    - run dhcpclient
        - dhcpcd [ifname]

# INITIALIZE DISK
- partition
    - size
        - sdy1:+512M sdy2:last
    - type
        - sdy1:swap sdy2:ext4
        - bootflag
            - sdy2
    - format
        - mkswap sdy1
        - mkfs.ext4 sdy2

# MOUNT DISK
- mount
    - swapon /dev/sdy1
    - mount /dev/sdy2 /mnt
- bootdir
    - mkdir -p /mnt/boot

# INSTALL ARCH
- install
    - pacstrap /mnt base
        - NOTE
            - Downloads 200MB installation data

# MODIFY ARCH
- copy wireless configuration
    - cp /etc/wpa_supplicant.conf /mnt/etc/
- install grub
    - grub-install --boot-directory=/mnt/boot --root-directory=/mnt/ /dev/sdy
- modify fstab
    - genfstab -U /mnt >> /mnt/etc/fstab
- arch-chroot /mnt
    - install wpa_supplicant
        - pacman -S wpa_supplicant
    - create linuz
        - mkinitcpio -p linux
    - create grub.cfg
        - grub-mkconfig -o /boot/grub/grub.cfg
    - exit
- unmount
    - umount /mnt
ffmpegで -filter_complex オプションを使わずに動画を連結する

まずファイルを作って

```mylist.txt
# this is a comment
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
```

そしてコマンドラインで

```.bash
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output
```

`-safe 0` は絶対パスじゃなかったらいらないそうです。

「ffmpeg 連結」で検索すると`-filter_complex`を使った方法ばかり出てくるんですが、ffmpeg の wiki だとこの方法が一番上に来てるんですよね。

https://trac.ffmpeg.org/wiki/Concatenate

他の方法でうまく行かなかった動画の連結がこの方法だとうまくいったので記録として残しておきます。
rspecでcreateアクションのテスト

# 問題
createアクションでメッセージを保存した時に、データベースのレコードが一つ増えているかどうかを検証するテストでNo route mathesエラーが出る。

# コード

### messagesコントローラー

```rails:messages_controller.rb
  def create
    @message = Message.new(create_params)
    if @message.save
      redirect_to group_messages_path(@group)
    else
      @groups = current_user.groups.includes(:users)
      @messages = Message.where(group_id: params[:group_id]).order(created_at: :ASC).includes(:user)
      flash.now[:alert] = "メッセージが送信できませんでした。"
      render action: :index
    end
  end
```

### 最初のコード

```rails:messsages_controller_spec.rb

〜略〜
it "データベースに新しいメッセージが登録されること" do
  expect{
    post :create, message: attributes_for(:message, group_id: group.id )
  }.to change(Message, :count).by(1)
end
〜略〜
```

これでテストしてみると以下のようなエラー文が！
(messageモデルはテキスト本文であるbodyというカラムがあり、FactoryGirlで定義しています)

```
Failures:

  1) MessagesController POST #create メッセージの保存に成功した場合 データベースに新しいメッセージが登録されること
     Failure/Error: post :create, message: attributes_for(:message, group_id: group.id )
     
     ActionController::UrlGenerationError:
       No route matches {:action=>"create", :controller=>"messages", :message=>{:body=>"Hello", :group_id=>81}}
     # ./spec/controllers/messages_controller_spec.rb:34:in `block (5 levels) in <top (required)>'
     # ./spec/controllers/messages_controller_spec.rb:33:in `block (4 levels) in <top (required)>'

Finished in 0.81058 seconds (files took 3.76 seconds to load)
4 examples, 1 failure

Failed examples:

rspec ./spec/controllers/messages_controller_spec.rb:32 # MessagesController POST #create メッセージの保存に成功した場合 データベースに新しいメッセージが登録されること
```

routeがいかれていると…。

binding.pryでparamsを確認してみると。

```
[1] pry(#<MessagesController>)> params
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"sQeDsqZbUxrIrnHiW82gSPb3rOAqvgyrDdM2DdGdI2nWrIMCAyYS5+ZEi0vhFrBV1nLBQJFNBp6WwwhsMrbdxw==", "message"=>{"body"=>"あら"}, "commit"=>"Send", "controller"=>"messages", "action"=>"create", "group_id"=>"1"} permitted: false>
```

思ったよりbodyが深く埋め込まれてました。

つまり、今現在のテストでは、
params: {:action=>"create", :controller=>"messages", :message=>{:body=>"Hello", :group_id=>81}}

こんなハッシュになっているところを

params: {:action=>"create", :controller=>"messages", :message=>{:body=>"Hello"}, :group_id=>81}

というふうにすればrouteがいい感じになるのではという仮説のもと、いろいろ試行錯誤してみたところ、以下のコードでテストをパスしました。


```rails:messsages_controller_spec.rb
it "データベースに新しいメッセージが登録されること" do
  expect{
    post :create, params: { message: attributes_for(:message, { body: 'hello' }), group_id: group.id }
  }.to change(Message, :count).by(1)
end
```

it内ではなくて、messageのFactorygirlで定義しようとも思ったのですが、うまくできませんでしたね。
adb shell inputで簡単ログイン

先日、[DroidKaigi2017](https://droidkaigi.github.io/2017/)で@operandoOSさんが発表されていた[コマンドなしでぼくはAndroid開発できない話](https://droidkaigi.github.io/2017/timetable.html#session-60)の中で`input`コマンドを初めて知ったので早速使ってみることにしました。

## ログインを簡単に
アプリを開発しているとアプリのインストールやアンインストールを行うことが多く、その都度ログイン画面にIDとパスワードを入力するのは非常に面倒に感じていました。  
そこで`adb shell input`コマンドを使って楽をする方法を試してみました。
※一般的なユーザIDやパスワードを入力してログインする画面を想定しています。

## input text : 文字列の入力
ユーザIDやパスワードを入力するための文字列送信を行います。
これは発表であった通りそのまま`input text`に渡すだけです。
基本的にはマルチバイト文字は入力できないので注意。

```adb shell input text ＜文字列＞```

## input tap : 入力フォームのフォーカスを取得
`input text`実行時に気づいたのがそもそも入力対象にフォーカスさせないといけないという問題。  
ログインを自動化したいのにフォーカスさせるのだけ手動にしてしまってはあまり意味がないので座標を指定して画面上をタップしてフォーカスさせます。
※数値は入力ボックスの位置や端末によって調整する必要があります。  

```adb shell input tap 100 700```

## input keyevent : キーイベントの送信
ユーザIDからパスワードに遷移する際は以下のコマンドでTABキー押下を送信します。

```adb shell input keyevent KEYCODE_TAB```

次回からの入力を省略などのチェックボックスにチェックを付ける場合はスペースキーを送信します。

```adb shell input keyevent KEYCODE_SPACE```

入力後にログインを実行したい場合はエンターキーを送信します。

```adb shell input keyevent KEYCODE_ENTER```

## まとめて実行
上記のコマンドを組み合わせて実行します。

```adb shell "input tap 100 700 && input text ＜ユーザID＞ && input keyevent KEYCODE_TAB && input text ＜パスワード＞ && input keyevent KEYCODE_TAB && input keyevent KEYCODE_SPACE && input keyevent KEYCODE_ENTER"```

流れとしては以下となります。コマンドの実行を待ってから次のコマンドを実行するように&&で接続しています。
1.`input tap 100 700`:ユーザID入力ボックスをタップしてフォーカス
2.`input text ＜ユーザID＞`:ユーザIDを入力
3.`input keyevent KEYCODE_TAB`:パスワード入力ボックスにフォーカスを遷移
4.`inpuｔ text ＜パスワード＞`:パスワードを入力
5.`input keyevent KEYCODE_TAB`:次回からの入力を省略チェックボックスにフォーカスを遷移
6.`input keyevent KEYCODE_SPACE`:次回からの入力を省略チェックボックスにチェックをつける
7.`input keyevent KEYCODE_ENTER`:ログイン実行

これでログイン画面からコマンド一発でログインすることができました！
もっといい方法などがあれば教えてください。
slackの日本語のチャンネルでもフリガナで補完や検索をしやすくする

[slackで日本語のチャンネルが作れるようになりました](https://twitter.com/SlackHQ/status/842475876134481920)ね。`#ご飯` とか `#開発` という具合です。

しかしこの日本語チャンネル名、一つ難点がありましてメッセージ入力欄や <kbd><kbd>⌘</kbd>+<kbd>K</kbd></kbd> での検索時にチャンネル名を補完させにくいという事です。

例えば前述の `#ご飯` チャンネルでしたら `#gohan` という具合にフリガナでサジェストして欲しくないでしょうか？実はこれ、ある手順を踏んでチャンネルを作ると可能になります。 (既存のチャンネルでも修正可)

# 手順

手順は以下のようにシンプル。一度、フリガナでチャンネルを作ってから任意の日本語のチャンネル名にするだけ。

`#ご飯` チャンネルの例。

1. `#gohan` でチャンネルを作る
2. `#ご飯` にチャンネル名を変更する。 (チャンネル設定の「Additional Options...」から変更可)

## 既存のチャンネルの場合

既に `#ご飯` というチャンネルを作ってしまった場合。

1. `#ご飯` チャンネルを `#gohan` チャンネルに一旦変更
2. 再度 `#ご飯` に変更

この手順を踏むだけでメッセージ入力欄やチャンネル検索で、 「#go」 と入力すれば `#ご飯` チャンネルがサジェストされます。 :)

# 仕組み

実は、slackは変更前のチャンネル名でも補完が効くという細かな機能があります。サジェスト時に、  「formerly #gohan」 と表示されます。

これによって、直前に設定していたフリガナのチャンネル名でも補完されるという事ですね。
よって単純にフリガナにしなくても、例えば `#開発` チャンネルでしたら `#dev` チャンネルからリネームすれば `#dev` と入力する事で `#開発` を補完してもらう事が出来ます。

# 注意点

- 細かな機能を利用しているので、Slack側の仕様変更によって今後、フリガナでのサジェストが効かなくなる可能性もあります
- アプリ右上の検索バーからの `in: hoge` などではフリガナでの入力補完はされませんでした
- Mac版のアプリでしか動作確認していませんので、Web版やWindows版での動作は未調査です
HTTP500エラー　ラッパーがサーブレットクラス○○又はそれが依存するクラスを見つけることができません

HTTP500エラー　ラッパーがサーブレットクラス○○又はそれが依存するクラスを見つけることができません。

プログラミング初心者です。

eclipseでサーブレットを作成してますが、
上記のエラーがでて、サーブレットが動きません。
もう５時間以上調べていますが原因がわからないのでどなたか助けてください。

下記情報です。

例外 
javax.servlet.ServletException: ラッパがサーブレットクラス Echo_Servlet_A 又はそれが依存するクラスを見つけることができません
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:662)



原因 
java.lang.ClassNotFoundException: Echo_Servlet_A
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:662)

以上です。

よろしくお願いいたします。
SSHKeyの設定


##SSHKeyをセッテイングする

ターミナルを開く

```
// homeへ移動
$ cd ~

// SSHKeyがすでにあるかを確認
$ ls -al ~/.ssh
```

###鍵がない場合

```
// 鍵の作成
$ ssh-keygen -t rsa -C "test@test.com"
```

パスワードの設定を聞かれるけど2回ともenterでOK

ここで鍵が作成される

```
// 鍵データをコピーする
$ pbcopy < ~/.ssh/id_rsa.pub   // これはMacの場合です
```

コピーが完了したらGitHubへ

「SSH and GPG keys」を選択すると下記のページになる

![スクリーンショット 2017-02-26 14.35.59.png](https://qiita-image-store.s3.amazonaws.com/0/95873/e3eb7411-5427-c238-b5e3-1dacbb3a1f5d.png "スクリーンショット 2017-02-26 14.35.59.png")

「SSH keys」にある「New SSH key」ボタンを押すと下記のような画面に移行

![スクリーンショット 2017-02-26 14.36.10.png](https://qiita-image-store.s3.amazonaws.com/0/95873/cb9414c9-dfb3-13ee-b238-3800098a4f6b.png "スクリーンショット 2017-02-26 14.36.10.png")

ここで鍵の登録を行う。
　
titleには適当に入力

keyの部分には先ほどコピーしたものを貼り付け

貼り付け後、「Add SSH key」ボタンを押す

ボタンを押すと下記のようにPWを求められるのでGitHubのPWを入力

![スクリーンショット 2017-02-26 14.36.58.png](https://qiita-image-store.s3.amazonaws.com/0/95873/51cdbc3c-0051-b480-5a7c-d4b9dbab40f1.png "スクリーンショット 2017-02-26 14.36.58.png")

問題なく鍵が登録されると下記の画面に移動

![スクリーンショット 2017-02-26 14.37.47.png](https://qiita-image-store.s3.amazonaws.com/0/95873/933207f8-2d01-bc4a-94f9-527457445321.png "スクリーンショット 2017-02-26 14.37.47.png")


##こちらもどうぞ
[新人の指導者 or 新人の方へ](http://qiita.com/y_sekitoba/private/89e421c5e2b28dfe5dfb)
Git（GitHub）の勉強をする。まずGitの教本とGitのエリアについて

職場でSVNからGitにバージョン管理ソフトを変更する事になった。
今年から切り替わりもう三ヶ月たつが、正しく理解して使えていないのを実感しているので１から勉強し直す。

下記教本を読みながら、後で自分で見返した時に分かりやすいようにまとめてみる。
つまり間違った内容や自分流に分かりやすくしてあったりもする。

#教本
[エンジニアのためのGitの教科書 実践で使える！バージョン管理とチーム開発手法](http://amzn.to/2n86S1k)
Kindleで以前購入したこれを使用。

#Gitとは
**バージョン管理で分散型に分類される。**

- 集中型
SubversionやVCSのようなバージョン管理のこと。
名前の通り一つのサーバーに集約して全体のソースを管理する

- 分散型
Gitはこちらに分類される。
クライアントへサーバー側の持っている情報全て（過去の更新履歴を含めたリポジトリ全体）をミラーリングする。
故にネットワークに接続していない状態でも、ローカルでさらに分岐して開発することが出来る。


#Gitの超基本の3本の矢、ならず3つのエリア
**３つのエリアがある**
ワーキングディレクトリとステージングエリアとリポジトリ。

- ワーキングディレクトリ
Gitでバージョン管理の対象にしたプロジェクトの、実際に編集などするファイルのあるところ。
Eclipseで言えば普通のワークスペース以下のソースコード。

- ステージングエリア
リポジトリへ**コミット**をするファイルを選択してまとめておくエリア。
**コミット**を実行すると、ここにまとめてあるファイルがリポジトリにまとめて登録される。

- リポジトリ
SVNと同じバージョン管理をしている本体。
**コミット**を行うとここに登録される。

**つまり**
例えばある画面にファイルアップロード機能とデザインの修正が入る事になった。
アップロードボタンを作成し、アップロード用の処理を追加修正した。
それとは別にデザインの修正もした。

で、これがまとめて一つの**コミット**とだと、あとで見た時にソース上のどの修正がどっちの機能に対しての修正か分かりづらい。

なので、コミットを分ける事にする。
**ワーキングディレクトリ**：修正したファイルのうちアップロード機能用のファイルをステージングする
**ステージングエリア**：ステージングされたファイルをまとめてコミット
**リポジトリ**：このコミットを「アップロード機能用のコミットとして残す」

こういうことね

#Gitによる監視
ワーキングディレクトリの変更を監視してくれている。


**untracked（未追跡）**
>新規に作成されたファイルなど、ステージングを提案されない状態のファイル

**unmodified（未変更）**
>ワーキングディレクトリで変更のあったファイルをステージングエリアへ格納する候補として認識した状態

**modified（編集済み）**
>ワーキングディレクトリで変更のあったファイルをステージングエリアへ格納する候補として認識した状態

**staged（ステージ済み）**
>ステージングエリアに格納された状態
>この状態になるとtracked（追跡）状態となり、以降の変更は常にステージングする候補として提案される。
機械学習の環境を構築するのにAnacondaをインストールする必要はない。Minicondaを使おう

Pythonで機械学習の環境を作る、というと山のように「Anacondaをインストールせよ」という記事が出てきますが、実際環境構築はMinicondaというAnacondaの最小構成版で十分です。
ということを伝える記事です。

# 最速で機械学習の開発環境を作る方法

基本は以下で十分です。

1. Minicondaをインストールする(※もちろんPython3の方をインストールして下さい)
2. `conda create -n ml_env numpy scipy scikit-learn matplotlib jupyter`で開発環境を作成
3. `activate ml_env`で作成した開発環境を有効化

実際はMacかWindowsかなどで微妙な差異があるので、詳細はこちらを参照して下さい。

* [Pythonで機械学習アプリケーションの開発環境を構築する](http://qiita.com/icoxfog417/items/950b8af9100b64c0d8f9)

また、開発環境を作成する`conda`コマンドの使い方についてはこちらをご参照下さい。

* [Python Conda Tips](http://qiita.com/icoxfog417/items/02a80b93b5f1e95f2795)

Dockerで開発を行いたい場合は、Minicondaの公式Dockerfileが提供されています。このDockerfileを`FROM`で継承して、後は`conda`や`pip`のコマンドで好きに追加ライブラリを入れれば自前のコンテナがすぐに作れます。

* [docker-images/miniconda3/](https://github.com/ContinuumIO/docker-images/tree/master/miniconda3)
  * やむにやまれない事情がある場合は、[Python2のものもあります](https://github.com/ContinuumIO/docker-images/tree/master/miniconda)。

TensorFlowやChainerを利用したい場合は、追加で`pip install`をすれば良いです。

# Anacondaを推奨しない理由

Anacondaは、正直重たすぎます。Minicondaなら必要な分だけ選択できるので開発環境の容量は500~600M程度で済みますが、これに比べてAnacondaはインストールしただけで2~3Gは取ります。そして、その中には別段使わないようなライブラリも山のように入っています。

そして、自分の開発しているコードが依存しているライブラリもわからなくなります。いざどこかにデプロイしよう、と思ってもAnacondaにはデフォルトで多くのライブラリがインストールされているのでどのライブラリに依存しているのかわからなくなります。Minicondaなら環境ごとに必要なライブラリがわかります。もちろんAnacondaでも個別のプロジェクトごとに環境を作ることはできますが、それじゃあMinicondaでいいじゃんということになります。

現場からは以上です。
git入門 ~入門編~


##最低限おさえておきたいgitコマンド

web制作をする上で、gitコマンドを使用するのはもはや当たり前になってきています。
実際、gitコマンドには便利なコマンドが非常に多いです。

しかし、最初から全てを覚え使用していくというのはあまり現実的ではありません。
今回は、最低限これだけはおさえてほしいというコマンドに絞って説明していきます。

※今回は1人で作業する前提で説明していきます。

## 押さえておきたい概念

- 共有リポジトリ
- ローカルリポジトリ
- 作業ツリー
- インデックス

###共有リポジトリ

共有リポジトリとは、複数の利用者で共有するリポジトリのこと。
ローカルでの変更を共有リポジトリに反映することで利用者同士で共有する

###ローカルリポジトリ

ローカルリポジトリとは、利用者がローカルでの作業で利用するリポジトリ。
`git clone`で共有リポジトリを複製して利用する。
ローカルでの変更は、`git push`で共有リポジトリに反映させることができる。
他の利用者の変更を取り込む場合は`git pull`を利用する

##作業ツリー

実際に利用者が編集するファイル

##インデックス

インデックスとは、作業ツリーの変更点を登録する一時領域。
作業ツリーでの変更を`git add`でインデックスに登録する。
登録された変更点は`git commit`でローカルリポジトリに反映される

##ローカルリポジトリの作成方法

主に下記の2つがある

- 方法1 ローカルマシンのバージョン管理を行いたいディレクトリ上で新しいリポジトリを作成する
- 方法2 既存のリポジトリ(共有リポジトリ)を複製する

###方法1

gitで管理したいディレクトリで下記のコマンドを実行

```
$ git init
```

`git init`コマンドを実行することで、`.git`ディレクトリがローカルリポジトリとして作成される。
この`.git`ディレクトリの中に設定ファイルやリポジトリデータが格納される。

作成した段階では、ローカルリポジトリの中身は空なので下記のコマンドなどを利用してファイルを登録する

```
// 作業ツリーの変更をインデックスに登録
$ git add

// インデックスにある変更をローカルリポジトリに反映
$ git commit
```

###方法2

下記のコマンドを利用して、複製したいリポジトリをローカルに作成

```
$ git clone git@github.com:y-sekitoba/zerofurotest.git
```


##おさえておきたいコマンド

- git init
- git clone
- git add
- git commit
- git push

ではそれぞれのコマンドを簡単に説明をしていきます。

##git initコマンド

```
$ git init
```

`git init`コマンドはgitで管理したいディレクトリで最初に実行するコマンドです。
`git init`を実行することで、対象のディレクトリに「.gitディレクトリ」が作成されます。


##git cloneコマンド

```
$ git clone git@github.com:y-sekitoba/zerofurotest.git
```

`git clone`コマンドは「GitHub」や「BitBucket」などでgit管理させているデータを自分のPCにコピーするコマンドです。


##git addコマンド

```
$ git add <ディレクトリ名 or ファイル名>
```

`git add`コマンドは指定したファイルを「ステージングエリア」に移動させます。


##git commitコマンド

```
$ git commit -m "コミットメッセージ"
```

`git commit`コマンドは「ステージングエリア」にあるディレクトリやファイルを「コミット」と呼ばれる1つのまとまりにします。


##git pushコマンド

```
$ git push origin master
```

`git push`コマンドは`git commit`コマンドで作成したコミットを「GitHub」や「BitBucket」などで作成してたリポジトリに送ります。


では、実際にGitHubとgitを利用して自分で「git管理」を体験していきましょう。

##こちらもどうぞ
[新人の指導者 or 新人の方へ](http://qiita.com/y_sekitoba/private/89e421c5e2b28dfe5dfb)
アクセストークンを利用したHTTPSによるGithubへのpush/pull

## 手順
- httpsでgit clone
- github.comでaccess tokenを作成する。
- `% git config --global credential.helper osxkeychain` を実行して設定。
    - これで覚えるのがほぼ不可能なtokenを毎回入力しなくて良いようになるはず。
- git pushして、usernameは通常通り自分のgithub.comのID、passwordは2で作成したaccess tokenを入力する。
- 次回以降のpush/pullは何も聞かれずにできるはず。

## 参考
- http://qiita.com/yoan/items/08b1ba9c9aceab1ffe5e
- https://help.github.com/articles/caching-your-github-password-in-git/
- https://help.github.com/articles/creating-an-access-token-for-command-line-use/
MacにPython3をインストールし環境構築【決定版】

# <strong>Mac に Python3 をインストールし環境構築する方法</strong>

Mac にはデフォルトで Python2系 がインストールされていますが、ここでは`brew`による3系のインストール方法と、 `venv`による仮想環境構築方法を説明します。

<!-- 
    How to install Python3
-->
## Python3 の導入手順
Python3 を `homebrew` でインストールします。

### homebrew のインストール

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

### Python3 のインストール

以前は `python3` と明示的に指定する必要がありましたが、現在はデフォルトで3系がインストールされるようです

```bash
brew install python
```

### Python3 の確認

以下を実行し、 `Python 3.7.3` 等と表示されればインストールの成功です。
また、 `python` では2系が選択され、 `python3` では3系が選択されるようになっているはずです。

```bash
python3 -V
```

※ 2020年5月10日現在 3.7.3

<!-- 
    How to use venv to make virtual environment
-->

## venv による仮想環境構築

### 作業用ディレクトリを _make directory_ した上で、 _change directory_

```bash
mkdir project
cd project
```

### venvによる仮想環境切り出し

```bash
python3 -m venv env
```

### 仮想環境を有効にする

以下のコマンドで仮想環境を有効にできます。

```bash
source env/bin/activate
```

仮想環境を有効にした状態では、 `python -V` で3系が紐づけられている状態になっています。

### 仮想環境から出る

以下のコマンドで仮想環境から出ることができます。

```bash
deactivate
```


<!-- 
    summary
-->
## まとめ

Python3 をインストールし、プロジェクトによって使用するライブラリが異なる時は上記の手順で `venv` にて環境を切り分けることが必須だと思います。
`venv` を活用することで、 `pip freeze > requirements.txt` 等でプロジェクトで使用しているライブラリ一覧を書き出す際も、不要なライブラリの混入を防ぐことが可能です。

---


以前はこの記事で、 `venv` ではなく `virtualenv` を使用した方法を紹介していたので合わせて記載します。

<!-- 
    How to install virtualenv and make environment
-->
## virtualenv による環境構築

`virtualenv` を `pip3` でインストールします。

### virtualenv のインストール

```bash
pip3 install virtualenv
```

※ pip ではなく pip3 を使う点に注意してください。

### Python3 の仮想環境を切り出す

プロジェクト ディレクトリに移動してから

```bash
virtualenv --python=/usr/local/bin/python3 env
```

### 仮想環境をアクティベイト

プロジェクト ディレクトリで以下を実行

```bash
source env/bin/activate
```