OmniAICreator/Qiita-1.07M huggingface dataset:
Udacity Palindromesの私の解答とメモ

Udacityでの学習でのメモとして残したいと思います。たびたびこういったことをやろうと思います。たとえ問題に正解したとしてももっといい方法はあったりしますし。

私の解答

```python:qiita.rb
def is_palindrome(s):
    if s[0] == s[-1] and s[1] == s[-2]:
        return True
    elif s == '':
        return True
    else:
        return False

```




Udacityの先生の解答

```python:qiita.rb
def is_palindrome(s):
　　if s == '':
        return True
    else:
       if s[0] == s[-1]:
         return  is_palindrome(s[1:-1])
         else:
            return  False
Graphviz で CONSORT 的な RCT 用 flowchart 作成

RCT 用の作図です。解説は特にありません。多少 Exclusion が増えても、伸び縮みします (下の方の図を参照)。

```dot

digraph g {
layout=neato;
rankdir=TB;
bgcolor=white;
splines=ortho;
nodesep=0.1;
ranksep=0.1;

edge[arrowsize=.3, color=black];
node[shape=box, color=black, fontsize=6]

l1   [pos="0,6!", shape=plaintext, label="Enrollment"]
l2   [pos="0,3!", shape=plaintext, label="Allocation"]
l3   [pos="0,2!", shape=plaintext, label="Follow-Up"]
l4   [pos="0,1!", shape=plaintext, label="Analysis"]


a1   [pos="2,6!", width=1.0, label="Assessed for eligibility \l(n= )"]
a2   [pos="2,5!", style="none", label="", width=0, height=0];
b    [pos="3.5,5!", width=2.0, label="Excluded (n = ) \l \l Reason 1 (n = )\l Reason 222222222 (n = )\l Reason 3333  33333  33333 (n = )\l Reason 4 (n = )\l Reason 5 (n = )\l Reason 6 (n = ) \l "]
a3   [pos="2,4!", width=1.0, label="Randomized (n = )"]
a4   [pos="2,3.5!", label="", width=0, height=0];
a4int[pos="1.5,3.5!", style="none", label="", width=0, height=0];
a4con[pos="4,3.5!", style="none", label="", width=0, height=0];

int1 [pos="1.5,3!", width=2.0, label="Allocated to ARP (n = )"]
con1 [pos="4,3!", width=2.0, label="Allocated to CON (n = )"]
int2 [pos="1.5,2!", width=2.0, label="Lost to follow-up (give reasons) (n = ) \l \l Discontinued intervention (give reasons) (n = ) \l Discontinued intervention (give reasons) (n = ) \l Discontinued intervention (give reasons) (n = ) \l Discontinued intervention (give reasons) (n = ) \l"]
con2 [pos="4,2!", width=2.0, label="Lost to follow-up (give reasons) (n = ) \l \l Discontinued intervention (give reasons) (n = ) \l Discontinued intervention (give reasons) (n = ) \l"]
int3 [pos="1.5,1!", width=2.0, label="Analyzed (n = ) \l Exluded from analysis (give reasons) (n = )"]
con3 [pos="4,1!", width=2.0, label="Analyzed (n = ) \l Exluded from analysis (n = 0)"]



a1 -> a2 [dir="none"];
a2 -> b;
a2 -> a3;
a3 -> a4 [dir="none"];
a4 -> a4int [dir="none"];
a4 -> a4con [dir="none"];
a4int -> int1 -> int2 -> int3;
a4con -> con1 -> con2 -> con3;
l1 -> l2 -> l3 -> l4 [style="invis"];
}
```

![consort1.png](https://qiita-image-store.s3.amazonaws.com/0/118479/68139f29-470f-f621-97d4-fca7d9de89d3.png)


![consort2.png](https://qiita-image-store.s3.amazonaws.com/0/118479/5b485777-e2f7-b258-8904-a2da61f42d5e.png)
GAE上のnodemailerでホスト名を指定する

GAE上に構築したNode.jsアプリからnodemailerでSMTP認証を利用してメールを送信する際、
https://nodemailer.com/smtp/ に記載のある

```
name – optional hostname of the client, used for identifying to the server, 
defaults to hostname of the machine
```
のパラメータを指定しないとうまくホスト名を取得できずメールサーバから拒否られる場合があった。
Golangでローカル環境(WINDOWS)にて開発中にmemcachedを使用するには

Golangでローカル環境(WINDOWS)にて開発中にmemcachedを使用するには

ローカル環境に開発している場合、下記とする
http://localhost:8080/v1/hogehoge
8080を使用している

ここに、下記のパッケージを取込む
https://github.com/bradfitz/gomemcache
ドキュメントに記載されているように、インストールを行い
Exampleを作成する。
ドキュメントのExampleを少し書き替える。

```
import (
        "github.com/bradfitz/gomemcache/memcache"
)

func main() {
     mc := memcache.New("localhost:11211")
     mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})

     it, err := mc.Get("foo")
     ...
}
```
すると
下記のエラーが表示される

```
memcache: connect timeout to "localhost:11211"
```
まあ、当然である。
そこで、下記のmemocachedをインストールする。
但し、インストールする際、CMDを立ち上げてインストールを行うのだが
必ず管理者権限でCMDを立ち上げて操作すること。

https://commaster.net/content/installing-memcached-windows
新人プログラマーが意識すべき５つのこと

#はじめに
ある案件で30代後半のプログラマーのおっさんが言いました。
「開発する時はまずはコピペする」
「とりあえず動けばOK」
「自分がいなくなった後のことは知りません」

30歳過ぎるともうどうしようもないですが、20代ならまだ間に合います！
最低限意識してほしいことをできる限り絞って簡潔にまとめましたので
新人プログラマーはぜひ読んでください。Javaベースですが他の言語でも同様です。

若手プログラマーのひとはこちらをどうぞ。
[若手プログラマーが意識すべき５つのこと](https://qiita.com/nyao/items/1a855a56b02a0039ea01)

新人リーダーのひとはこちらをどうぞ。
[新人リーダーが意識すべき５つのこと](https://qiita.com/nyao/items/d3040a8e1116a47e3d97)


#新人プログラマーが意識すべき５つのこと

###１．コードはできる限りシンプルにする（保守性が高いコード）
「書きやすさ」より「読みやすさ」を重視すること。
数か月後に見直してもすぐに理解できること。

###２．書いたコードはすべて理解する
他人のコードを参考にしたとしても書いたコードは必ず理解すること。
「その処理はコピーしたのでよくわかりません。」なんていったら殴られます。

###３．不要なコードは書かない
念のためのnullチェックとかいらない。必要ならチェックし、必要ないならチェックしない。
その他、絶対通らない処理もいらない。

###４．同じコードを何度も書かない
同じような処理は共通メソッド化する。
同じような処理だけど対象のクラスが異なる場合はインターフェースやジェネリクスを利用する。

###５．見てすぐにわからない複雑な処理は「意味のあるコメント」を記載する
どうしても複雑になってしまうこともある。
そういう時は数か月後に見てもすぐに理解できるようなコメントを記載する。


#１について、具体的な補足
例えば以下のようなルールを守る
・メソッド名は動詞、変数は名詞でわかりやすい名前にする

・メソッド、定数、変数のスコープはできるだけ小さくする
(public protected privateを意識、定数、変数の宣言の場所を意識する)

・コーディングに制限値を決めて守る
(具体的な値は現場ごとに異なるので参考値を以下に記載)
>・ネストの階層は３つまで
・一つのメソッドは50行まで
・一つのクラスは、10メソッド、500行まで
・一つのパッケージ内にはクラスは20個まで


###もっと知りたければ以下の本を読むべし
[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)

#最後に
最近またそのおっさんを使いませんかという提案があったそうです。
怖いですね。
Ricoh thetaのJPGから角度を取り出すコード（2018年版）

# はじめに
* THETA Vの静止画から角度情報を取得して画像を正しい向きにする（天頂補正）際に実施した内容（取得編）
    * こちらの方法では取得できなくなっていたので新規に作成しました
        * https://qiita.com/nano06126728/items/717dc37333032ed95d81
    * Unityアプリでの使用を前提としています

# 作業方針
* THETA Vの静止画には角度情報がxmpとして入っているためその情報を取得する
    * 以前の方法では、リコー固有ブロックのExif情報を取得していました
* 必要な部分だけ取り出す
    * XMLパーサなどを使用せずに軽量化

# コード

```c#:XmpReader.cs
using UnityEngine;
using System.Collections;
using System.IO;
using System;

public class XmpReader 
{
    public static void SerchAngle(string filePath)
    {
        BinaryReader br = new BinaryReader(new FileStream(filePath, FileMode.Open));
        byte [] buf = br.ReadBytes((int)br.BaseStream.Length);
        br.Close();
        br = null;

        float pitch = getPitch(buf);
        float roll = getRoll(buf);

        Debug.Log("filePath : " + filePath);
        Debug.Log("pitch : " + pitch + ", roll : " + roll);
    }

    public static float getPitch(byte[] buf) {
        string pitchStr = getXMLTagData(buf, "GPano:PosePitchDegrees");
        float pitch = 0.0f;
        if (pitchStr != "") {
            pitch = float.Parse(pitchStr);
        }
        return pitch;
    }

    public static float getRoll(byte[] buf) {
        string rollStr = getXMLTagData(buf, "GPano:PoseRollDegrees");
        float roll = 0.0f;
        if (rollStr != "") {
            roll = float.Parse(rollStr);
        }
        return roll;
    }

    static string getXMLTagData(byte[] buf, string xmlTagName) {
        string strStart = String.Format("<{0}>", xmlTagName);
        byte[] byteStart = System.Text.Encoding.ASCII.GetBytes(strStart);
        int xmp_start = findData(buf, byteStart);
        if (xmp_start < 0) {
            return ""; 
        }
        string strEnd = String.Format("</{0}>", xmlTagName);
        byte[] byteEnd = System.Text.Encoding.ASCII.GetBytes(strEnd);
        int xmp_end = findData(buf, byteEnd); 
        if (xmp_end < 0) {
            return ""; 
        }
        xmp_end = xmp_end - strEnd.Length;

        byte[] buf_get = new byte[255];
        int copy_idx = 0;
        for (int i=xmp_start;i<xmp_end; i++) {
            buf_get[copy_idx] = buf[i];
            copy_idx++;
        }
        string result = System.Text.Encoding.ASCII.GetString(buf_get);
        return result;
    }

    static int findData(byte[] buf, byte[] pattern)
    {
        int max = buf.Length;
        if (max > 64*1000) { 
            max = 64*1000; 
        }

        for (int i = 0; i < max; i++) {
            int iTemp = i;
            for (int p = 0; p < pattern.Length ; p++, iTemp++) {
                if (pattern[p] != buf[iTemp] || iTemp >= max) {
                    break;
                }
                if (p == pattern.Length - 1) {
                    return iTemp + 1;
                }
            }
        }
        return -1;
    }
}
```


# さいごに
* この角度情報を実際に利用する方法はこちらに書きました
    * https://qiita.com/maruo2/items/1ca1c2b44a0ba6fe8ec0
* 他のアプリ（OculusGoのギャラリーなど）は、このXMPがあるためVR表示しますが天頂補正はしませんでした

# 参考資料
* https://qiita.com/nano06126728/items/717dc37333032ed95d81
Mavenのappassembler-maven-pluginでJAVA_HOMEを設定する方法

`appassembler-maven-plugin`を使ってスクリプトを自動生成する際に、自動生成スクリプト内でJAVA_HOMEを設定できるようにしたのでメモ。

## 対応
まずは事前準備としてJAVA_HOMEのexport設定を書いた`settings.sh`を用意する。

```sh:settings.sh
export JAVA_HOME=/usr/java/jdk1.8.0_152
```

次に自動生成スクリプトから`settings.sh`を呼び出せるようにassemblerを設定する。
[公式ドキュメント](http://www.mojohaus.org/appassembler/appassembler-maven-plugin/assemble-mojo.html)に`environmentSetupFileName`というパラメータがいたのでこれを使う。

```xml:pom.xml
	・・・ 中略 ・・・
	<plugin>
		<groupId>org.codehaus.mojo</groupId>
		<artifactId>appassembler-maven-plugin</artifactId>
		<version>1.1</version>
		<executions>
			<execution>
				<goals>
					<goal>assemble</goal>
				</goals>
				<phase>package</phase>
			</execution>
		</executions>
		<configuration>
			<programs>
				<program>
					<mainClass>com.fuga.hoge.SampleApp</mainClass>
					<name>SampleApp</name>
				</program>
			</programs>
			<binFileExtensions>
				<unix>.sh</unix>
			</binFileExtensions>
			<environmentSetupFileName>settings.sh</environmentSetupFileName>
		</configuration>
	</plugin>
	・・・ 以下略 ・・・
```

設定後に`mvn package`すると自動生成される`SampleApp.sh`は以下のようになる。

```sh:SampleApp.sh
BASEDIR=`dirname $0`/..
BASEDIR=`(cd "$BASEDIR"; pwd)`

[ -f "$BASEDIR"/bin/settings.sh ] && . "$BASEDIR"/bin/settings.sh
・・・ 以下略 ・・・
```

これで最初に作成した`settings.sh`が自動生成スクリプトの冒頭で読み込まれるようになるので、ビルド後に`settings.sh`をbinディレクトリ配下にコピーするタスクを設定しておけば自動生成スクリプト内からJAVA_HOMEの設定が読み込める。

## 参考
- [Appassembler :: Maven Plug-In – Introduction](http://www.mojohaus.org/appassembler/appassembler-maven-plugin/index.html)
[Redmine3.2構築 1/3]Apache 2.2 をCentOS6.7にソースからインストール

# 概要
CentOS6.7にRedmine環境を構築する
1. Apache2.2をソースからインストール（本ページ）
2. [MariaDB10.1をソースからインストール](https://qiita.com/fkmi/items/bcf62a09420d3bd65c50)
3. [Redmine3.2をインストール](https://qiita.com/fkmi/items/7616b3dc108d4a72e252)

## 構成
|H/S        |Name   |Version|Memo            |
|:----------|:------|------:|:---------------|
|OS         |CentOS |6.7    |                |
|Web Server |Apache |2.2.27 |ソースインストール|
|Database   |MariaDB|10.1.36|ソースインストール|
|Application|Redmime|3.2.9  |                |

## 参考手順
http://d.hatena.ne.jp/yk5656/20140728/1406987849

# 手順
### Apacheインストール
- 必要なパッケージをインストール

```
# yum -y install wget gcc openssl openssl-devel
```

- Apacheをダウンロード

```
# cd /usr/local/src/
# wget http://archive.apache.org/dist/httpd/httpd-2.2.27.tar.gz
# tar zxvf ./httpd-2.2.27.tar.gz
# cd httpd-2.2.27
```

- Apacheをインストール

```
# ./configure --prefix=/usr/local/apache --enable-so --enable-ssl --enable-rewrite
# make
# make install
```

- Apacheの設定ファイルを編集

```
# vi /usr/local/apache/conf/httpd.conf
```
```/usr/local/apache/conf/httpd.conf
#ServerName www.example.com:80
ServerName localhost:80                             # ADD
```

- Apacheを起動

```
# /usr/local/apache/bin/apachectl start
```

- Webサーバが稼働していることを確認
	- http://localhost/

- Apacheを停止

```
# /usr/local/apache/bin/apachectl stop
```

### 自動起動の設定

- 起動スクリプトのひな型をコピー

```
# cp build/rpm/httpd.init /etc/rc.d/init.d/httpd
```

- 起動スクリプトを編集

```
# vi /etc/rc.d/init.d/httpd
```
```/etc/rc.d/init.d/httpd
#httpd=${HTTPD-/usr/sbin/httpd}                          # COMMENT OUT
httpd=${HTTPD-/usr/local/apache/bin/httpd}               # ADD
#pidfile=${PIDFILE-/var/log/httpd/${prog}.pid}           # COMMENT OUT
pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid}      # ADD

        #CONFFILE=/etc/httpd/conf/httpd.conf             # COMMENT OUT
        CONFFILE=/usr/local/apache/conf/httpd.conf       # ADD
```

- 自動起動を設定

```
# chkconfig --add httpd
# chkconfig httpd on
# chkconfig --list httpd
```

- Apacheを起動

```
# service httpd start
```

- Webサーバが稼働していることを確認
	- http://localhost/

### 次の手順
[MariaDB10.1をソースからインストール](https://qiita.com/fkmi/items/bcf62a09420d3bd65c50)
How to reset FastStone FSCapture settings - window location 

### How to reset FSCapture setting

 - remove **fsc.db** and **TBSettings.db**
    - eg. \Users\..\AppData\Roaming\FastStone\FSC

cf. https://www.overclockers.com/forums/showthread.php/786151-Help!-FastStone-Capture-program-opening-off-screen-from-tray-not-coming-back?p=8083071&viewfull=1#post8083071
ubuntu ネットワーク接続設定 備忘録

授業でした内容を自分のメモとして書き残します。

---

ubuntu の初期設定の際、
ネットワークが繋がらないという問題

その時の解決策の備忘録


1. デスクトップ上にあるタブ、**システム**をクリック
2. 設定 → インターネットとネットワーク → **ネットワーク接続** をクリック
3. **有線接続１ を削除**
4. 追加 → Ethernet → 作成 の順でクリック
5. **IPv4設定** タブに移動
6. 方式を **自動(DHCP) ⇒ 手動** に切り替え
7. アドレスに任意のアドレスを指定<br>
例:192.168.23.204 24 192.168.23.1
8. DNS サーバーに、**ゲートウェイと同じアドレス**を指定 → 保存
9. Firefox を起動し、ネットワーク接続されているか確認<br>
※ この時、**少し時間を置いてから確認**すること<br>
（ *設定がまだ反映されていない可能性* ）


---

最後までお読みいただきありがとうございました。
Macでtransmit使ってSSH接続する時にエラー出る。

Trasmit v4.4.13（）
.PEM 渡されたので、プロトコル：SFTPでユーザー名とパスワード入れて、
鍵マークから.pem 選んだらエラー。
結構詰まった。


▼ transmitで「SSH認証ファイルを読み込めませんでした。」が出てログインできない。
http://hacklog.hatenablog.com/entry/2015/02/15/235002

古いエントリだったけど無事解決。ありがたし。

備忘録として
→ .ssh の config にファイルパス書いておく方式にした。

これ Trasmit5 だと、GUIでも鍵ファイル選択できるのかな。
Ruby クラス 応用編

#継承
あるクラスを元にして新たなクラスをつくることを「継承」と呼びます。

「class 新しいクラス名 < 元となるクラス名」とすることで他のクラスを継承して、新しいクラスを定義することができます。
このとき、新しいクラスは「子クラス」、元となるクラスは「親クラス」と呼ばれます。

**例）**

```ruby
class 子クラス < 親クラス

end
```
継承をすると子クラスには、親クラスのインスタンスと変数とインスタンスメソッドが引き継がれる。

##子クラスにインスタンス変数,インスタンスメソッドを追加する
子クラスにインスタンス変数を追加するためには、これまで通り「attr_accessor」を用います。

**例）**

```ruby
class 子クラス < 親クラス
  attr_accessor :〇〇  # 子クラスにインスタンス変数「〇〇」を追加
  def 〇〇_△△  # 子クラスにインスタンスメソッドを追加
    ...
  end  
end
```

#オーバーライド
親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書きすることができます。これをメソッドの「オーバーライド」と呼びます。
オーバーライドをすると、子クラスのインスタンスは、親クラスのメソッドではなく、子クラスで定義したメソッドを呼び出すようになります。

**例）**

親クラス

```ruby
class 〇〇
  ...
  def △△
    ...
  end
end
```
子クラス

```ruby
class △△ < 〇〇
  ...
  def △△  # メソッド△△の上書き
    ...
  end
end
```

##オーバーライドの仕組み
子クラスのインスタンスは、子クラスで定義したメソッドを優先して呼び出すようになっています。したがって、子クラスと親クラスに同名のメソッドがある場合は、子クラスのメソッドを呼び出すので、結果的にメソッドの内容が上書きされたようになります。

##super
オーバーライドしたメソッドの中で「super」とすることで、親クラスの同名のメソッドを呼び出すことができます。
あくまでメソッドを呼び出しているので、親クラスのメソッドの定義に合わせて、superに対して引数を渡す必要があります。


**例）**

親クラス

```ruby
class 〇〇
  attr_accessor:△△
  attr_accessor:□□
def initialize(△△:,□□:)
  self.△△ = △△
  self.□□ = □□
  end
end
```
子クラス

```ruby
class △△ < 〇〇
  attr_accessor :◇◇
  def initialize(△△:,□□:,◇◇:)
    super(△△: △△, □□: □□)
    self.◇◇ = ◇◇
  end
  ...
end
```

##Dateクラス
DateクラスとはRubyがすでに用意しているクラスで、日付を扱う際に用います。

```ruby
require "date"  # dateクラスの読み込み

```

このようにrequireを用いて読み込むことで、自分でクラスを定義しなくても使うことができます。

##Dateクラスのインスタンス
Dateクラスは今まで扱ってきたクラスと同様に、Date.newとすることでインスタンスを生成することができます。

**例）**

```ruby
require "date"

date1 = Date.new(1993,3,2)

puts date1
```
コンソール

```
1993-03-02
```

Dateクラスのインスタンスをputsすると、このようにその日付を表示することができます。

##Dateクラスのインスタンスメソッド
Dateクラスには多くのインスタンスメソッドが用意されています。
その中の一つに、Dateクラスのインスタンスの日付が、「日曜日かどうか」を真偽値で返すsunday?メソッドというものがあります。

**例）**

```ruby
require "date"

date1 = Date.new(1993,3,2)

puts date1.sunday?
```
コンソール

```
false
```

##今日の日付のDateインスタンスを取得する
Date.todayとすることで、今日の日付のインスタンスをつくることができます。


**例）**

```ruby
require "date"

date1 = Date.today

puts date1
```
コンソール

```
2018-09-17
```

#クラスメソッドの定義
クラスメソッドとは、クラスに対して呼び出すメソッドのことです。
クラスメソッドは、「def クラス名.メソッド名」とすることで定義できます。インスタンスメソッドとの違いはメソッド名の前にクラス名を書く必要がある点です。

**例）**

```ruby
class クラス名
  ...
  def クラス名.メソッド名
    ...
  end
end
puts クラス名.メソッド名
```
クラスメソッドは定義時と同じように、「クラス名.メソッド名」とすることで呼び出すことができます
また、クラスメソッドはクラスの中でも、同じように呼び出すことができます。

#おわり
[Ruby 基礎](https://qiita.com/y-takayama/items/fe031827297f0b6653b5)
[Ruby 基礎（配列について）](https://qiita.com/y-takayama/items/54c1a7b299af767d62ef)
[Ruby メソッド](https://qiita.com/y-takayama/items/d95a25be5797450e0e9d)
[Ruby クラス](https://qiita.com/y-takayama/items/99c7141e40e41b188faa)
Could not build Objective-C module ‘Firebase’の解決

上部メニュー > [Product] > （optionを押しっぱなしにすると、[Clean] の項目が [Clean Build Folder...]　に変わる）[Clean Build Folder]
でエラーが解決した。

[【Swift】Could not build Objective-C module ‘Firebase’の解決方法](http://pippi-pro.com/swift-could-not-build-objective-c-module)
こちらの記事のように、ターミナルでフォルダを削除って大掛かりなことをしなくても、

以下の記事のようにシンプルな方法を順々に試していく方が良いかもしれない。
[[Xcode][小ネタ] DerivedDataの削除についての備忘録](https://dev.classmethod.jp/smartphone/iphone/remove-xcode-derived-data/)
バッチファイルでファイルを0埋めフォーマットで連番コピーする方法

# 概要

バッチファイルから特定のファイルに連番を付けてコピーする方法です。
検証などで頻繁に使用しますが、よく忘れるのでメモとして残しておきます。

# 内容

data.csv を6桁の0埋めフォーマットで連番コピーします。
ファイルを連番コピーする毎に1秒の待機を行っています。

```copy.bat
@echo off
setlocal enabledelayedexpansion
for /L %%i in (1,1,10) do (
set num=000000%%i
echo !num:~-6!
copy data.csv data_!num:~-6!.csv
ping localhost -n 2 > nul
)
endlocal
```

**実行結果**

data_000001.csv
data_000002.csv
data_000003.csv
data_000004.csv
data_000005.csv
data_000006.csv
data_000007.csv
data_000008.csv
data_000009.csv
data_000010.csv
ポインタ初心者がfor文の使い方を間違えた話

## 経緯
* Golangのsliceに要素を追加する組み込み関数 `append` さんの動作がおかしい！（誤解）
* 何故か同じ要素が無限にコピーされたsliceが生成される！（誤解of誤解）

という記事を投稿したところコメントにて秒速でご指摘をいただきました。
常々心がけている`こういう場合の99.9%は使い方が悪いだけ`というのが今回も例外でない結果になりました…。

## 間違っているソース

Playgroundはこちら: <a href="https://play.golang.org/p/jnm_Cp0yIBa" target="_brank">https://play.golang.org/p/jnm_Cp0yIBa</a>

```go
package main

import (
	"encoding/json"
	"fmt"
)

type Hoge struct {
	ID int
}

func main() {
	// 値のsliceを作る
	hoges := []Hoge{}
	for i := 0; i < 5; i++ {
		hoges = append(hoges, Hoge{ID: i})
	}

	// 値のsliceをJSONで出力
	JSONPrint(hoges)

	// 要素の参照でできたsliceを作る
	hogesRef := []*Hoge{}
	for _, h := range hoges {
		hogesRef = append(hogesRef, &h)
	}

	// 参照のsliceをJSONで出力
	JSONPrint(hogesRef)
}

func JSONPrint(v interface{}) {
	b, _ := json.Marshal(v)
	fmt.Println(string(b))
}
```

### 出力結果

```json
[{"ID":0},{"ID":1},{"ID":2},{"ID":3},{"ID":4}]
[{"ID":4},{"ID":4},{"ID":4},{"ID":4},{"ID":4}]
```

記事投稿前のぼく「( •̀ㅁ•́;)　え、なんで」
今となっては当たり前だろという話です…。

## 勘違いポイント
参照のsliceを作る時にfor文で `range` を使っていますが、この`h`は他の言語と同様使い回しです。

```go
	for _, h := range hoges {
		hogesRef = append(hogesRef, &h)
	}
```

この`&h`って、`h`のポインタなんですよね…。`hoges`の要素（いうなれば`hoges[i]`）へのポインタではないんです。それを知らずに`h`へのポインタをappendしまくってるわけです。そして、for文で最後に来る`hoges`の要素が`h`に与えられ、それまでappendされた`&h`はすべて最後の要素を指すということに…。

勝手に下記のようになると勘違いしていました。完全に理解不足です…。

```go
	for i := range hoges {
		hogesRef = append(hogesRef, &hoges[i])
	}
```
この修正で意図した動作を確認できました。いやはやアホすぎる
修正されたソースのPlaygroundはこちら: <a href="https://play.golang.org/p/KOifPTYN1jE" target="_brank">https://play.golang.org/p/KOifPTYN1jE</a>

## さいごに
コメントいただいている通りそもそもfor文、ポインタの理解不足が原因でしたので記事は修正されています。
あまりにも恥ずかしい初版はどうぞ履歴をご覧ください。

zetamatta様、ありがとうございます。大変勉強になりました。
PHPでimageMagick使って、画像にテキストを指定幅で折り返して描画するサンプル

# 環境
PHP7
imageMagick

# 概要
PHPでimageMagickを使って画像にテキストを描画することになったとき、見栄えでフォントやフォントサイズ調整したかったので（※）、テキストの折り返しを自動でやりたかった。
（※最初からフォント決まっていたら文字数固定とかでやっちゃえば早いって話）

テキスト合成とかに関しては何番煎じかはわかりませんが、何かしら要望もあるのではと思い、記事にしてみました。

# 実装
```sample.php
// フォント、フォントサイズの指定のみの例のため、他に設定したいパラメータを引数で渡すなりして、
// 拡張してください。
// 引数チェック、返り値チェックなどは省略していますので、ご自身で追加してください。
function imagickDrawAnnotationAutoWrapSample() {
    // テキストを描画したい画像
    $imagePath = 'sample.png';
    $im = new Imagick($imagePath);
    
    // 描画するテキスト
    $text = 'あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波';

    // 描画するテキストのスタイル
    // （適当に書いています）
    $font = 'sample.ttf';
    $fontSize = 36;

    // 設定したいテキストの描画範囲の最大幅
    // 背景画像から左右100px余白とる例
    $width = $im->getImageWidth() - 200;

    // テキストを描画する基準点の座標
    // （適当に書いています）
    $baseX = 100;
    $baseY = 500;

    // テキストの一行の描画高さ
    // （この関数作るときのプロジェクトでデザイン指定あったので、ここでも指定する実装にしています）
    $lineHeight = 50;

    // テキストを描画幅に収まるように分割した配列を取得
    $wrappedText = imagickTextWrap($text, $width, $font, $fontSize);
    
    foreach ($wrappedText as $_i => $_s) {
        $_y = $baseY + $lineHeight * ($_i);
        $draw->annotation($baseX, $_y, $_s);
    }
    
    $im->drawImage($draw);

    $im->setImageFormat("png");
    $im->writeImage('new_sample.png');
    
    $im->clear();
    $im->destroy();
}

function imagickTextWrap($text, $width, $font, $fontSize) {
    $wrappedText = [];
    $im = new Imagick();
    $draw = new ImagickDraw();
    $draw->setFont($font);
    $draw->setFontSize($fontSize);

    // 一行分の文字
    // $textの先頭から一文字ずつ加える
    $_s = '';
    while ($text) {
        // 一行分の文字に先頭一文字加えた描画幅を取得
        $_a = mb_substr($text, 0, 1);
        $metrics = $im->queryFontMetrics($draw, $_s . $_a);

        // 描画幅が指定幅を超えたら、一文字加える前の文字をreturn用配列に追加し、
        // 一行分の文字をクリア
        if (isset($metrics['textWidth']) && $metrics['textWidth'] > $width) {
            $wrappedText[] = $_s;
            $_s = '';
        // 描画幅が指定幅以内であれば、一行分の文字に先頭一文字を加え、
        // $textの先頭一文字を削除する
        } else {
            $_s .= $_a;
            $text = mb_substr($text, 1);
        }

        // $textが0文字になった場合、一行分の文字をreturn用配列に追加し終了
        if (strlen($text) == 0) {
            $wrappedText[] = $_s;
            break;
        }
    }
    
    return $wrappedText;
}
```
Storyblokのdocs翻訳チャレンジその9！！！

#### ソース
https://www.storyblok.com/docs/Delivery-Api/spaces

# スペース

エンドポイントはクライアントサイドアプリを使う際に便利です。レスポンスは`space.version`へ格納され、開発者はstory APIを呼び出し、直近のpublishedバージョンを取得できます。

StoryblokがAPIより前にCDNを使用し可能な限り速くレスポンスを返すためには、`cv`パラメータをstory apiに追加する必要があります。


### ワークフロー

1. 初めに`/1/cdn/spaces/me`を呼び`space.version`属性を取得
2. その`space.version`をその後の`/v1/cdn/stories`の呼び出し全てに使用します。


## 現在のスペースを取得

### エンドポイント

```
GET /v1/cdn/spaces/me
```

### パラメーター
|名前|説明|
|:--|:--|
|token(必須)|パブリックトークン|

### リクエスト

クエリパラメーター

```
token=wANpEQEsMYGOwLxwXQ76Ggtt
```

cURL

```
curl "https://api.storyblok.com/v1/cdn/spaces/me?token=wANpEQEsMYGOwLxwXQ76Ggtt" -X GET \
	-H "Accept: application/json" \
	-H "Content-Type: application/json"
```

### レスポンス

ボディ

```
{
  "space": {
    "name": "Space A",
    "domain": "http://example.storyblok.com",
    "version": 1532075678
  }
}
```
Go言語を真剣に勉強してみた〜基本構文編②（配列）〜

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
さて今回は「Go言語を真剣に勉強してみた〜基本構文編〜」の２回目と言うことで「Goについての配列」をみていこうと思います。
では、早速いってみましょう:point_up:
前回の「Go言語を真剣に勉強してみた〜基本構文編①（変数、定数、条件分岐、繰り返し処理）〜」については[こちら](https://qiita.com/watataku/items/f12163ade0d820d00bba)から。
#配列
Goの配列は固定長。可変長はスライス。（後述）

```
var 配列名 [要素数] データ型
```
またこのような書き方もできます。

```
配列名 := [要素数] データ型　{初期値1, 初期値2, 初期値3,　・・・}
```
**＊[要素数]を[...]にすると配列の長さは暗黙的に指定できる。**


#スライス
```
var スライス名 [] データ型
```
またこのような書き方もできます。

```
スライス名 := [] データ型　{初期値1, 初期値2, 初期値3,　・・・}
```
###スライスの末尾に値を追加する方法

```
スライス名 = append(スライス名, "値")
```
#マップ
値をkey-valueの対応で保存するデータ構造。属に言う連想配列。

```
var マップ名 map[キーの型] 値の型
```
またこのような書き方もできます。

```
マップ名 := map[キーの型] 値の型 {
         キー : 値
             ・
             ・
             ・
}
```
###マップからデータを削除する
```
delete(マップ名, 削除したいキー)
```
**＊Goで、mapをrange(後述)でイテレーションすると、取り出す順番は実行ごとに異なるので注意。**
*理由：Goでは乱択アルゴリズムが使われているようです。*
##range
配列やスライスなどに格納された値を先頭から順番に処理していく。*for文と一緒に使う*

```
for 添字, 値 := range 配列名（ここがスライス名などの名前が変わる） {
          //処理
}
```

以下、配列・スライス・マップの例。

```golang:array.go
arr := [3]string{"watataku", "minami", "yoda"}
	fmt.Println("配列：", arr[1] ,"\n")
	fmt.Println("-----------スライス------------")
	var srice[]string
	srice = append(srice, "a")
	srice = append(srice, "b")
	srice = append(srice, "c")
	for i,s := range srice {
		fmt.Println(i, ":", s)
	}
	fmt.Println("------------マップ------------")
	maps := map[int]string{
		1 : "takuya",
		2 : "mai",
		3 : "nanase",
	}
	for key, value := range maps {
		fmt.Println(key, ":", value)
	}

	delete(maps, 1)
	fmt.Println("キー１の値を消しました")
	for key, value := range maps {
		fmt.Println(key, ":",value)
	}
```
出力結果

```
配列： minami 

-----------スライス------------
0 : a
1 : b
2 : c
------------マップ------------
2 : mai
3 : nanase
1 : takuya
キー１の値を消しました
2 : mai
3 : nanase
```
以上。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。
次回は「Go言語を真剣に勉強してみた〜基本構文編③（関数）〜」です。

よろしければ、[Go言語を真剣に勉強してみた〜環境構築編〜](https://qiita.com/watataku/items/c2b25ace1aeaaf0b75c0)もご覧ください。
Windowsで[AWS][SVN]接続の方法[TortoiseSVN]

##～WindowsでAWS svn接続の方法～

###環境
|OS|TortoiseSVNバージョン|
|:----|:----|
|Windows10|1.10.1|

###事前準備
**AWSにSVNをインストール, リポジトリ用ディレクトリを作成**
[[参考] >> [CentOS7][SVN]サーバ構築](https://qiita.com/SierSetup/items/c47b861dc563919c94ac)

##["TortoiseSVN"](https://tortoisesvn.net/)をダウンロード手順
(2018/09/19 現在)

https://tortoisesvn.net/
にアクセス

[**"TortoiseSVN (バージョン名) released"**](https://tortoisesvn.net/)
をクリックする。

パソコンのOSに合わせ、
**"for 32-bit OS", "for 64-bit OS"**
のどちらかをクリックする。

ダウンロードページに飛ぶので、
ダウンロードが完了したらダウンロードした
**"TortoiseSVN-○○-x○○-svn-○○.msi"**
を開く。

##"TortoiseSVN"をインストール手順
(2018/09/19 現在)

1. Nextを選択
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/4daea733-ae5c-7f7a-3621-7f20631814dc.png)

2. Nextを選択
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/caee336e-fe30-c68c-c105-06ff95732859.png)

3. Nextを選択
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/e267d4f5-09e3-8845-4a81-0255743b50f1.png)

4. Installを選択
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/462bd18f-e2ae-f9aa-1273-814f849c74de.png)

5. デバイスの変更を許可
6. Finishを選択
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/228d65d0-af0d-e023-525c-defb3ed700bf.png)

##"TortoiseSVN Project Monitor"の起動方法

Windowsボタンを押し、
"最近追加されたもの"から
1. **"TortoiseSVN Project Monitor"**を右クリック
2. "その他"をクリック
3. "管理者として実行"を選択
4. デバイスの変更を許可

![11.png](https://qiita-image-store.s3.amazonaws.com/0/213065/b361c6b2-dd2a-a066-37c5-7366c2d13bf4.png)

これで**"TortoiseSVN Project Monitor"**は開けたと思います。

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/643b2b64-3119-8ecc-8eb5-2cd7d8346885.png)


##接続方法

**"Add Project"(プロジェクトを追加)**を選択します。

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/0f04425b-c8c0-0b04-ee8d-84f085177e30.png)


1. **"Name:"(名前:)**に任意の名前を入力する。(ここでは"svn"にします)
2. **"Path or URL:"(パスまたはURL:)**に"svn://**(AWSのIPアドレス)**/"と入力します。
3. **"OK"**を選択

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/7fbabcb0-0722-66d5-143c-548cef5e78d8.png)


##[日本語化の方法](https://tortoisesvn.net/downloads.html)

https://tortoisesvn.net/downloads.html
へアクセス

[**"Language packs"**](https://tortoisesvn.net/downloads.html)の
**Country**の**Japanese**から**Setup**をクリック
(**32bit, 64bit**があるのでパソコンのOSに合わせて
どちらかをダウンロードする)

ダウンロードした
**"LanguagePack_1.10.1.28295-x64-ja.msi"**
を開く。

1. "次へ"を選択
![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/9ba9c4ee-1e11-3355-e1e5-e94e6427c8e8.png)

2. デバイスの変更を許可
3. "完了"を選択
![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/213065/45705beb-b48c-7aac-41fd-e7334635a686.png)

1.任意のフォルダで右クリック
2. "TortoiseSVN"を選択
3. "Settings"を選択
![12.png](https://qiita-image-store.s3.amazonaws.com/0/213065/318659cf-62e5-77ae-5abf-a71c0a2e992c.png)

4. "Language"で"日本語(日本)"を選択
5. "適応"を選択
6. "OK"を選択

![13.png](https://qiita-image-store.s3.amazonaws.com/0/213065/313e1a48-29a2-75e9-1284-21d1bf66d7d7.png)
RDSでOracleを使用する際に確認すること

#RDSで利用できることを確認する
[Amazon RDS での Oracle](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)

#statspackを有効化する
[Oracle statspack](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.Statspack.html)

#デフォルトタイムゾーン確認
##現状設定の確認
```
SELECT window_name, window_next_time, window_active, autotask_status, optimizer_stats, segment_advisor, sql_tune_advisor FROM dba_autotask_window_clients;
```
タイムゾーンがEST5EDT（アメリカ東部標準時）になっていないか確認
##デフォルトタイムゾーンを変更
```
exec DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('default_timezone','Asia/Tokyo');
```

#REDOログファイル変更

[REDOログファイルのサイズ変更方法](https://dev.classmethod.jp/cloud/aws/rds-oracle-resize-redologfile/)
CSSのnext-sibling combinator

`A + B`というセレクタは、Aの兄弟でAの直後にあるBにマッチする。

```css
/* .fooの直後にある.barのcolorをredにする。 */
.foo + .bar {
  color: red;
}
```

```html
<div class="foo">foo</div>
<div class="bar">bar</div>
<div class="bar">bar</div>
```

☞ [デモ](https://codepen.io/anon/pen/PdxgMb)

`+`は[next-sibling combinator](https://www.w3.org/TR/selectors-3/#adjacent-sibling-combinators)（※1）という名前である。直訳すれば「次兄弟組合せ子」だろうか。

※1 昔の仕様書ではadjacent sibling combinatorと呼ばれていた。日本語の資料では「隣接兄弟結合子」や「隣接セレクタ」と呼ばれているのをよく見る。

## よくある使い道

同種の要素が連続している状況で、要素間の間隔を空けたり、要素間にボーダーを引くときによく使う。

```css
/* .fooが連続しているとき、2つ目以降の.fooの上マージンを20pxにする。 */
.foo + .foo {
  margin-top: 20px;
}
```

```html
<div class="foo">foo</div>
<div class="foo">foo</div>
<div class="foo">foo</div>
```

☞ [デモ](https://codepen.io/anon/pen/oPQRNN)

上記のCSSは、SCSSだと次のようにも書ける。

```scss
.foo {
  & + & {
    margin-top: 20px;
  }
}
```
at coder beginner 022

a
高橋君は太りやすく痩せやすい体質です。そこで彼は N 日間の体重の変化量を記録してみました。
1 日目の高橋くんの体重は W キログラムでした。 i 日目 (2≦i≦N) の体重の変化量は Ai キログラムでした(Ai は負になり得ます)。 つまり i−1 日目の体重を X キログラムとすると、 i 日目の体重は X+Ai キログラムだったということです。
ところで、高橋君の個人的な価値観では、体重が S キログラム以上 T キログラム以下の体型が「ベストボディー」だと考えています。
体重を記録した N 日間のうち、高橋君がベストボディーであった日数を求めてください。

```
#include<iostream>
using namespace std;
int main() {
	int N, S, T;
	int X=0;
	int A[1010];
	cin >> N >> S >> T;
	cin >> A[0];
	int count = 0;
	for (int i = 1; i < N; ++i) {
		cin >> A[i];
	}
	for (int i = 0; i < N; ++i) {
		X += A[i];
		if (S <= X && X <= T) {
			count += 1;
		}
	}
	cout << count << endl;
	return 0;
}
```
b
高橋君はマルハナバチ(Bumblebee)という種類のミツバチです。
今日も花の蜜を求めて異なる N 個の花を訪れました。
高橋君が i 番目に訪れた花の種類は Ai です。
i 番目の花は、i>j かつ i 番目の花の種類と j 番目の花の種類が同じになるような j が存在すれば受粉します。
高橋君が訪れた N 個の花の種類の情報が与えられるので、そのうちいくつの花が受粉したか求めてください。
なお、高橋君以外による受粉や自家受粉を考える必要はありません。

```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int N;
	int A[1000000];
	int count = 0;
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> A[i];
	}

	sort(A, A + N);
	for (int i = 0; i < N; ++i) {
		if (A[i + 1] == A[i])
			count++;
	}
	cout << count << endl;
	return 0;
}
```
あーたしかにソートすればいいだけやな、、気づかなかった、、

```
int main()
{
	long long ans = 0, i = 0, j = 0, k = 0, N, A[100000], a[100000] = { 0 };
	cin >> N;
	for (i = 0; i < N; i++) {
		cin >> A[i];
		a[A[i]]++;
	}
 
	for (i = 0; i < N; i++) {
		if (a[A[i]] >= 2)ans+=a[A[i]]-1;
		a[A[i]] = 0;
	}
 
	cout << ans << endl;
	return 0;
}
```
これも賢いなー慣れてる人にとっては当たり前なんだろうけど、、a[A[i]]をカウントしたら0にするのがポイントやな、、

C

```
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define MAX_V 333
#define INF 1e9
int d[MAX_V][MAX_V];//d[u][v]はe=(u,v)のコスト(存在しなければINF,u=vは0)
int V, E;
void init() {
	for (int i = 0; i < V; ++i) {
		for (int j = 0; j < V; ++j) {
			if (i == j)d[i][j] = 0;
			else d[i][j] = INF;
		}
	}
}
void warshall_floyd() {
	for (int i = 0; i < V; ++i) {
		for (int j = 0; j < V; ++j) {
			for (int k = 0; k < V; ++k) {
				if (d[j][i] != INF && d[i][k] != INF) {
					d[j][k] = min(d[j][k], d[j][i] + d[i][k]);
				}
			}
		}
	}
}
int main() {
	cin >> V >> E;
	init();
	int d0[MAX_V] = {};
	for (int i = 0; i < E; ++i) {
		int a, b, c;
		cin >> a >> b >> c;
		a--; b--;
		if (a == 0) {
			d0[b] = c;
			continue;
		}
		d[a][b] = c;
		d[b][a] = c;
	}
	warshall_floyd();
	int ans = INF;
	for (int i = 1; i < V; ++i) {
		for (int j = i+1; j < V; ++j) {
			if (d0[i] == 0 || d0[j] == 0 || d[i][j] == INF)
				continue;

			ans = min(ans, d0[i] + d0[j] + d[i][j]);
		}
	}
	if (ans == INF) {
		cout << -1 << endl;
	}
	else {
		cout << ans << endl;
	}
	return 0;
}
```
スプレッドシートのデータをフィルタリング→query+importrangeで別シート管理を行う


##目的

- スプレッドシートで管理している情報を、ある条件下でフィルタリングし、別シートへ転記したい
- 別シートへの転記コピペ作業を無くしたい

##方法

```スプレッドシート関数
=query(importrange("スプレッドシートのid", "シート名!A2:B"), "select Col1, Col2 where Col2 = FALSE")
```

##詰まったところ

- Where関数を使う時、TRUE/FALSEでの分岐フィルタリングが詰まった
	- あれ？where Col2 = "TRUE"　って打っても反応しない
	- 実際は　where Col2 = FALSEが正解
		- 「２番目のセルがFALSEの時に表示しない」という意味
	- hoge
Macでsshの秘密鍵をさくっとppkに変換する

## puttyをインストール

```
brew install putty
```

## 鍵を変換 pem -> ppk

```
puttygen id_ecdsa.pem -O private -o id_ecdsa.ppk
```

## 逆の変換もできる ppk -> pem

```
puttygen id_ecdsa.ppk -O private-openssh -o id_ecdsa.pem
```
Mac OS X で、ターミナルから特定の Xcode.app でプロジェクトを開く

# tl;dr

`open -a "/Applications/Xcode.app/" "path/to/some_project.xcworkspace/"`

## 説明

### open -a "Path/to/The.app"

-a に続いて指定されたパスのアプリケーションを開く

## 利用例

例えば複数のバージョンの Xcode.app を持ってるときとかにつかう
sendgrid の reputation とは

SendGrid の reputation ってなんだろう？と気になったのでメモ。

reputation の floating help
>your sendgrid reputation reflects the last 30 days and is updated daily.
it goes up for every delivered email, and down for every bounce or spam report. 
it does  not represent your inboxing percentage at mailbox providers.

翻訳
>あなたのsendgridの評判は過去30日間を反映し、毎日更新されます。
配信される電子メールごとに上がり、バウンスまたはスパムレポートごとに下がります。
メールボックスプロバイダーでの受信箱の割合を表すものではありません。

こちらで詳しく解説してくださっていました。
[メール送信において重要なレピュテーションとは](https://qiita.com/nakansuke/items/cbdf3a3ba130431be466)
CodeIgniterでライブラリのSession使っていたところをDynamoDBのSessionHandlerに置き換えた話

# 環境
PHP7
CodeIgniter 3.1.9
DynamoDB

# 概要
CodeIgniterでWebアプリのSession情報を、DynamoDBに抽出してうんぬんってことをしたいという話。

現状のソースに特に変更の制限とかなかったのですが、~~それだとつまらない~~テストや横展開のことなども考え、Sessionライブラリを拡張する方向にしました。

わりかしコンパクトにまとまったので、（こんなニッチな要件はそうそう無いとは思いますが）記事にしてみました。

# 実装
```application/libraries/Session.php
require_once(APPPATH.'libraries/aws/aws-autoloader.php');
use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\SessionHandler;

Class Session {

    // 環境に合わせてkeyとか埋める
    public function __construct()
    {
        $dynamoDb = new DynamoDbClient([
            'endpoint' => 'http://dynamodb.ap-northeast-1.amazonaws.com',
            'region'   => '',
            'version'  => 'latest',
            'credentials' => [
                'key' => '',
                'secret' => '',
            ],
        ]);

        $sessionHandler = SessionHandler::fromClient($dynamoDb, [
            'table_name' => '',
        ]);

        $sessionHandler->register();

        session_start();
    }

    public function __get($key)
    {
        return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
    }

    public function __set($key, $value)
    {
        $_SESSION[$key] = $value;
    }
}
```

# 使い方
CodeIgniterは、ライブラリを指定したとき、

　・そのライブラリがapplication/librariesにあればapplication/librariesの方を参照
　・なければsystem/librariesの方を参照

するので、上のソースをapplication/librariesディレクトリの下に保存してやれば、あとは（もともとconfigやらcontrollerやらでSessionライブラリ呼び出されている前提で）変更なしでCI_Session使っていたところがDynamoDBに置き換わります。
※DynamoDBClientなどは各々適切に用意してください。
A shell task (/usr/bin/xcrun xcodebuild -project /Users ~~ failed with exit code 72: xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH

Carthageをインストールする時に、エラーが起きた。
`$ carthage update --ios plathome`

でダウンロードが始まるが、自分の場合は、
`A shell task (/usr/bin/xcrun xcodebuild -project /Users/ユーザー名/Desktop/CartfileBox/Carthage/Checkouts/restkit/RestKit.xcodeproj CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES -list) failed with exit code 72:
xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH`
というエラーが起きた。

これに対しては、導入先のXcodeでPriferences→locations→Command Line Toolsを選択しバージョンを指定するということを行った結果解決した。

参考<https://qiita.com/Atsushi_/items/40b204d6ff576eef86b9>
Incoming Webhooks を利用してslackに通知を飛ばす

システム上の特定のタイミングでslackに通知を飛ばすことで、
何かが起きたことを検知する仕組みを試したので、記載。

# slackに通知を飛ばす

Incoming Webhooks
というslackAppの機能を使うことで実現できる。
簡単に言うと、外部サービスからslackにメッセージを書き込む機能。

## Incoming Webhooks の使い方は二種類ある？

色んな人がIncoming Webhooksの使い方をまとめているのだが、
どうもやり方が二種類あるようで少し迷った。

調べてみたら、custom integrationsは
公式が「古い手法だから、こっちは使わないでね」と言っていた。

https://api.slack.com/custom-integrations/incoming-webhooks

ということで、slackappを作る方法でやってみた。

https://api.slack.com/incoming-webhooks

## Incoming Webhooksの導入

基本的に、公式サイトに書いてある方法をなぞることで実現可能。

1. 自分のslackappを作成する  
[create your Slack app] と書かれたボタンを押せば、アプリの作成画面が開かれる  
アプリの名前(任意)と、そのアプリを追加したいワークスペースを選択して、作成
1. Incoming Webhooksの画面に遷移  
[Add features and functionality]から選択しても、左メニューから遷移してもよい
1. Activate Incoming Webhooks と書かれた隣に、offになっているトグルボタンがあるので、これをクリックしてonにする
1. 下の方に[Add New Webhook to Workspace] というボタンがあるので、クリック  
投稿先のチャンネルを選択して、許可する
1. 先ほどの画面に戻され、[Webhook URL]に一つURLが追加されている  
[Channel]で投稿先も確認できる

以上で準備完了。

## 試しにメッセージを送ってみる

使用法は簡単で、先ほど追加されたURLに対して、json形式で書き込みたい内容を送るだけ。
[Sample curl request to post to a channel:]に送り方のサンプルまで書かれた親切っぷり。

```
curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' 
https://hooks.slack.com/services/それぞれのURL
```

上記コマンドを仮想マシンで実行してみると、
見事に指定したチャンネルに「Hello, World!」というメッセージが届いた。

# 最後に

以上で導入完了。
あとは、通知したいタイミングで、追加したURLにjsonをつけて送信するだけ。
送信の仕方は、サービスによってそれぞれだと思うので、適した方法で。
jsonの中身をカスタマイズすることで、見た目にも豪華な書き込みができるので、
そのあたりを凝ってみても面白いかも。
ただ、やりすぎて通知がうっとうしくならないように、節度はわきまえましょう。
firebase-adminでCloud Firestoreを使う際にserverTimestamp()を使う

# 環境
```
  "dependencies": {
    "express": "^4.16.3",
    "firebase": "^5.5.0",
    "firebase-admin": "~6.0.0",
    "firebase-functions": "^2.0.3"
  },
  "devDependencies": {
    "typescript": "~2.8.3"
  },
```

なお、今回はCloud Functions上で実行することを想定したコードになっていますが、ローカル環境で実行する際にも適用できる内容だと思われます。(未確認)

# 発生する問題
(問題というか、ちゃんとリファレンスなどを確認しろという話ではあるのですが、分かりづらかったので記事にします。)

firebase-adminを用いてFirestoreへ保存する処理を行ったり、アップデート処理などを行う際に値に`serverTimestamp()`が含まれていると以下のようなエラーが発生します。

```
Error: Argument "data" is not a valid Document. Couldn't serialize object of type "ServerTimestampFieldValueImpl". Firestore doesn't support JavaScript objects with custom prototypes (i.e. objects that were created via the 'new' operator).
```

# 解決方法
上記のエラーが出たときのコードは以下の様になっていました。[^1]

[^1]: 実際にはエラーハンドリングをしてあげる必要がありますがここでは省略し

```typescript
import * as admin from 'firebase-admin';
import { firestore } from 'firebase';

admin.initializeApp();
const db = admin.firestore();
firestore.settings({
  timestampsInSnapshots: true
});

const docRef = await db.collection('notes').add({
  createdAt: firestore.FieldValue.serverTimestamp()
});
```

実際に動くコードはこう

```diff
import * as admin from 'firebase-admin';
import { firestore } from 'firebase';

admin.initializeApp();
const db = admin.firestore();
firestore.settings({
  timestampsInSnapshots: true
});

const docRef = await db.collection('notes').add({
-  createdAt: firestore.FieldValue.serverTimestamp()
+  createdAt: admin.firestore.FieldValue.serverTimestamp()
});
```

`serverTimestamp()`ってなにかの定数を返してあげててFirestore側でよしなにタイムスタンプに変換しているものだと思っていたのですが、どうやらそうではないことがわかりました。

わかってみればそりゃそうという程度の問題ですが、なかなか解決までにハマってしまったので、誰かのお役に立てると嬉しいです。

# 参考
[node.js - How do I get the server timestamp in Cloud Functions for Firebase? - Stack Overflow](https://stackoverflow.com/questions/43567312/how-do-i-get-the-server-timestamp-in-cloud-functions-for-firebase)
iOS12 + Vision Framework で顔の向きが取れるようになりました！

先日iOS12がリリースされましたね。
待ち望んでいた機能がついにリリースされました！
それは...`VNDetectFaceRectanglesRequest`でロールとヨー角が取れるようになりました...！
ここでは、iOS12で追加されたロールとヨー角について簡単に記載しています。

## はじめに
本記事はVisionを使って顔検出をしたことがある方向けの記事です。
Visionでの顔検出の方法を知りたい方は参考記事を先に見ると良いと思います。

- 参考
[[iOS 11] 画像解析フレームワークVisionで顔認識を試した結果](https://dev.classmethod.jp/smartphone/iphone/ios-11-vision/)

## iOS11までの課題
Visionを使えば楽々顔検出！できますが、問題がありました。

なんと横顔でも取れてしまいます。

横顔でも取れるなんてすごい！何も問題ない！ように見えますが、正面の顔のみ欲しいというニーズは結構あります。
私が参加しているプロジェクトでもなるべく正面の顔のみ抽出したかったのですが、iOS11までのVisionでは私の知る限りでは正面の顔のみ抽出したいということはできませんでした。
その為、`VNDetectFaceLandmarksRequest`を利用して顔のパーツ座標から顔の正面具合を計算してみたり、Visionは諦めてOpenCVの`frontalface`を検討等していました。

そこで、iOS12の新機能の登場です！
ロールとヨー角が取れるようになりました！

## 用語
ざっくり言うと下記です。
どちらも正面を向いているときは0度となります。
- ロール (roll)
首の傾げ具合の角度
- ヨー角 (yaw)
どれだけ首を横に向けているかの角度

[参考](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0)

## 実装
非常に簡単です。
`VNDetectFaceRectanglesRequest`で取得できる`VNFaceObservation`から、`roll`と`yaw`プロパティを呼ぶだけです。

```swift
let request = VNDetectFaceRectanglesRequest { (request: VNRequest, error: Error?) in
    for observation in request.results as! [VNFaceObservation] {
        print(observation.roll)
        print(observation.yaw)
    }
}
```

`roll`と`yaw`プロパティはOptionalですので、実際に使用する際には`if let`等を使います。

## 結果
プロパティ呼ぶだけですので取得はさくっとできました。

```
[出力例]
roll: 0.5235988
yaw: 0.7853982
```

上記の値はRadianなので角度に直すと`roll`が30度、`yaw`が45度になります。
もっと細かな値が取れるのかと想定していましたが、下記のように`roll`は30度ずつ、`yaw`は45度ずつの角度が取得できるようです。

```
roll: 0, 0.5235988, 1.047198, ...
yaw:  0, 0.7853982, 1.570796, ...
```

よく考えるとVisionは機械学習で顔検出してるはずですので、適度な角度ずつクラス分類されているのは当然なのかなーと思います。
30度、45度ずつしか取得できませんが、横顔の取得は除外できるようになりそうです。

お試しに作ったプログラムは[GitHub](https://github.com/hirok115/FaceDetector)で公開していますので、気になる方はどうぞ。

## 参考
[Apple 公式 Document](https://developer.apple.com/documentation/vision)
[[iOS 11] 画像解析フレームワークVisionで顔認識を試した結果](https://dev.classmethod.jp/smartphone/iphone/ios-11-vision/)
【Mac】Unity+VSCodeの環境構築でめっちゃ時間が取られたから構築手順を書いてくぞ

やあ、タイトルの通りだ。
環境構築していざ、コーディングだ！ってときにコード補完効かなくてあるぇ…？ってなって時間が取られたから書くぞ。

# 前提としてインストールしておくもの
* Unity（書いてる人は `2018.2.17f1` を使ってるんだぜ）
* VSCode

# VSCodeにプラグインを突っ込む
最低限これが必要ってのはなんか調べると大体出てくる。後はお好みでSnippet突っ込むと良いんじゃないかなぁ

* C# 
* Debugger For Unity
* Mono Debug

で、実は今回の対象は一通りやったけどなんかコード補完が効かねぇおrrrrrrrrr！ってなってる人が対象だったりする。

# 次に用意するもの

* [.NET SDK](https://www.microsoft.com/net/learn/get-started-with-dotnet-tutorial#macos) -> 多分Unityでは使わんけど変なエラーダイアログVSCodeに出てうざったいから入れた。ストレージに余裕が有るならばどーぞだ。
* Mono -> こいつが重要、**絶対HomeBrewで入れような**

```shell:入れ方一応書いとくよ！
brew install mono
```

# おーし、いろいろ入れたな？じゃあVSCodeと連携だ
手順はこんな感じ

1. 設定を開いてVSCodeをエディタとして設定するわけなんだけど、プロジェクトを開いてないと設定項目自体が出てこない。だから適当にプロジェクトを作る。
2. `cmd` + `,` または Unity -> Preferences…で設定を開く
3. 画像のように`External Tools`を選択して`External Script Editor` 項目で `Browse…` を選ぶ
<img width="520" alt="Editor_Attach.png" src="https://qiita-image-store.s3.amazonaws.com/0/82799/e616af29-31b1-9efa-0f75-c1eb89af0111.png">

4. VSCodeを選択

終わりっ！一応これで環境構築は終了だ。

# ハマりどころ（ここがミソってやつだ）

* **あぁ！？.NET SDK突っ込んでもエラーダイアログ消えねぇぞ！**

`dotnet` コマンド使えるか？使えないならパスが通ってない可能性が有りますぜ？
パスが通って無いとVSCode君は `.NET SDK` が見えない(入ってるか使えるかもわからんってこと、　で見つからないんだけどってダイアログが出続ける)
だからVSCode君がdotnetコマンドが見える&使えるようにする必要が有る。

シンボリックリンクでも貼っとこう。

```shell
ln -s /usr/local/share/dotnet/dotnet /usr/local/bin
```

* **公式ページでインストーラからMono入れたけどなんかOmnisharpホニャホニャとか言われてなんか読み込みが失敗してるっぽいんだけど…**

で、コード補完が効かないって寸法よぉ！私めはここであらぁ！？ってなって悩んだのだ…
なんか `Mono` を入れ直すと良いみたいな記事がちらほら有った。

公式ページとかではいろんなところで使ってるかもよ？大丈夫？みたいなこと書いてあるけど、気にするな勇気を出してまるっと消す。削除がコマンドで不安？大丈夫、[公式サイト](https://www.mono-project.com/docs/about-mono/supported-platforms/macos/#uninstalling-mono-on-macos)にもそう書かれてる。

```shell
sudo rm -rf /Library/Frameworks/Mono.framework
sudo pkgutil --forget com.xamarin.mono-MDK.pkg
sudo rm /etc/paths.d/mono-commands
```

でHomebrewから `Mono` を突っ込むのだ。これで入れ直しは完了したはず。

* **あぁ！？この記事の手順でやっても読み込みが失敗してるっぽいんだけど(半ギレ)** 

`mono` コマンド使えてるか？ `command not found.` だと意味が無い。やっぱりVSCode君が `mono` コマンドその他諸々使える&見える状態にしないといけない。

でHomebrewで突っ込んだならこうする。

```shell
# これでOK
brew link mono
# だめなら…こうじゃ
brew link --overwrite mono
```

# 最後

こんな感じで補完が効いてりゃOK！
<img width="750" alt="success.png" src="https://qiita-image-store.s3.amazonaws.com/0/82799/ed1a840c-6710-2443-2245-bdcedaf5fe8a.png">
Proxy 環境下で rpm コマンドを使う際の設定ファイルの書き方

rpm コマンドを使ってインターネット経由でパッケージをインストールする場合、Proxy 環境下ではどうすればいいのかを記す。

rpm コマンド実行ユーザ (主に root ユーザ) のホームディレクトリ直下に `.rpmmacros` というファイルを作成してそこに Proxy 設定を記述すればよい。

```text:~/.rpmmacros
%_httpport 12345
%_httpproxy http://your.proxy.url
```

ちなみにデフォルトの設定値は、`/usr/lib/rpm/macros` というファイルに記述してあるため、そちらを直接編集してもよい。


コマンドラインオプションを使用する際は、以下のようなオプションを付与すればよい。

```terminal
$ rpm --httpproxy http://your.proxy.url --httpport 12345
```
Storyblokのdocs翻訳チャレンジその8！！！

### 第八段

https://www.storyblok.com/docs/Delivery-Api/overview Storyblokのdocsの構造が変わったので、CONTENT DELIVERY APIの項から訳します。その5-7まではチュートリアルの翻訳(途中やり)となってます。

# 認証(Authentication)とSDK

StoryblokのコンテンツデリバリAPIを呼べるようにするためには、トークンを用いて自分だということを識別する必要があります。このトークンはapp.storyblok.comのStoryblokのダッシュボードにて生成できます。

トークンには3種類あります

* `Preview`: このトークンはコンテンツのdraft及びpublishedへアクセス出来るようにします。
* `Public`: publishedのみへアクセス出来るようにします。
* `Theme`: Cloud Rendering Serviceのテンプレートのアップロードへアクセス出来るようにします。

## API

エンドポイント`api.storyblok.com/v1/cdn`から以下のREST-APIが使用できます。

* [Stories](https://www.storyblok.com/docs/Delivery-Api/get-a-story): コンテンツエントリを受け取る
* [Tags](https://www.storyblok.com/docs/Delivery-Api/Tags): タグを受け取る(タグクラウドなどに使用)
* [Links](https://www.storyblok.com/docs/Delivery-Api/Links): ストーリーのリンクをマップしたものを受け取る
* [Datasource_entries](https://www.storyblok.com/docs/Delivery-Api/Datasource-Entries): データソースを受け取る(キーバリューペア)

このエンドポイントは高速に配信できるように作られていて、コンテンツはCDNにキャッシュされています。キャッシュでないコンテンツを受け取りたい場合、URLにバージョンパラメータを渡す必要があります。このパラメータは`cache_version`というもので、通常はタイムスタンプを持ちます。(SDKは自動でバージョンのタイムスタンプを更新します。)

## SDK

開発はSDKを使えばより簡単になります。以下のSDKは現在利用可能なものです。今後も追加されます。

**JavaScript**

```javascript
<body>
<script src="https://app.storyblok.com/f/storyblok-latest.js?t=hZ9t5mLywGe41ragtcSLgwtt">
</script>
<script>
  // Get the content of the current page
  storyblok.get({slug: 'home', version: 'draft'}, function(data) {
    console.log(data.story)
  })

  // Get multiple content entries from a folder called "news"
  storyblok.getAll({starts_with: 'story', version: 'draft'}, function(data) {
    console.log(data.stories)
  })
</script>
</body>
```

**Node.js**

```javascript
// Install by $ npm install storyblok-js-client --save

import StoryblokClient from 'storyblok-js-client'

var Storyblok = new StoryblokClient({
  accessToken: '{{preview_token}}' // Your preview token
})

// Get the content of the current page
Storyblok
  .get('cdn/stories/home', {
    version: 'draft'
  })
  .then((response) => {
    console.log(response)
  })

// Get multiple content entries from a folder called "news"
Storyblok
  .get('cdn/stories', {
    starts_with: 'news',
    version: 'draft'
  })
  .then((response) => {
    console.log(response)
  })
```

**Ruby**

```ruby
client = new Storyblok::Client(token: '{{preview_token}}') # Your preview token

# Get the content of the current page
p client.story('home')

# Get multiple content entries from a folder called "news"
p client.stories({
  :starts_with => 'news'
})

# More on https://github.com/storyblok/storyblok-ruby
```

**PHP**

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

$client = new \Storyblok\Client('{{preview_token}}'); // Your preview token{%- raw -%}

// Get the content of the current page
$client->getStoryBySlug('home');
$data = $client->getBody();

// Get multiple content entries from a folder called "news"
$client->getStories(
  array(
    'starts_with' => 'news'
  )
);
$data = $client->getStoryContent();{% endraw %}

# More on https://github.com/storyblok/php-client
```
React基本(ファイルの分割)

+ 開発環境構築
+ ファイル階層
+ ファイル分割


***

#開発環境構築

```
#.bashrc再読み込み
. ~/.bashrc
#開発環境構築
create-react-app [name]
cd [name]
#アプリ入れたところでNodeを立ち上げる
npm start
```



#ファイル階層
[name]の中身

```
package-lock.json
package.json
README.md
public
node_modules
src(←主にいじるのはここ)
```

実はcreate-react-appですでにファイル分割されている

```
src/
　├ App.css
　├ App.js
　├ App.test.js
　├ index.css
　├ index.js
　├ logo.svg
　├ registerServiceWorker.js
```

#ファイル分割
###メインファイル
htmlと一緒でindexが優先して参照されるっぽい

```index.js

import React from 'react';//　これは必須
import ReactDOM from 'react-dom';//　表示するのに必要なおまじない
import './index.css';//　css
import App from './App';//Appを読み込む
import registerServiceWorker from './registerServiceWorker';//　表示するのに必要なおまじない

//読み込んだコンポーネントを入れる
ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();
```

###外部ファイル

```App.js
import React from 'react';
import logo from './logo.svg';
import './App.css';

export default class Click extends React.Component{
  clickAction(event){
      alert('clicked!');
  }

  render(){
      return (
        <div onClick={(event) => this.clickAction(event) }>
          クリックしてね
          </div>
     )
  }
}
```

###外部コンポーネント
exportさせんといけない

```
export default class Click extends React.Component{
・・・
}
```

または

```
class Click extends React.Component{
・・・
}
export default Click;
```