OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftでの画面遷移についてまとめ


よく忘れるのでメモとしてまとめる

## Storybordだけで画面遷移

![スクリーンショット 2017-08-01 9.21.18.png](https://qiita-image-store.s3.amazonaws.com/0/139360/f466aa67-8de9-71bc-ecd7-e827dc279818.png "スクリーンショット 2017-08-01 9.21.18.png")

シンプルな画面遷移。
ボタンと次に表示するViewControllerをsegueで繋げるだけで完了


## コードから画面遷移

画面遷移したいタイミングで下記のコードを追加する

        
```
let storyboard = self.storyboard!
let nextView = storyboard.instantiateViewController(withIdentifier: "viewcontroller2")
self.present(nextView, animated: true, completion: nil)

```

withIdentifierにはViewControllerのIdentifyで設定した名前を書く

![スクリーンショット 2017-08-01 9.36.05.png](https://qiita-image-store.s3.amazonaws.com/0/139360/a71f487f-f59e-a022-b5df-56cd4935d431.png "スクリーンショット 2017-08-01 9.36.05.png")


## NavigationControllerで画面遷移


NavigationControllerを下記の手順で追加する

```
Editor → Embed In → NavigationController
```

追加したらStoryBoardだけで画面遷移で書いたのと同じようにsegueでViewController同士をつなげれば完了

![スクリーンショット 2017-08-01 9.43.03.png](https://qiita-image-store.s3.amazonaws.com/0/139360/1d618b68-34de-a616-99c4-dd6399d73d11.png "スクリーンショット 2017-08-01 9.43.03.png")


## NavigationControllerを使ってコードで画面遷移

### 方法1 performSegueを使う

①遷移元のViewControllerの黄色のボタンから遷移先のViewControllerへドラッグ&ドロップしてsegueで繋げる

![スクリーンショット 2017-08-01 21.12.18.png](https://qiita-image-store.s3.amazonaws.com/0/139360/0a9a483f-c228-319f-d27f-03fa15cf5a48.png "スクリーンショット 2017-08-01 21.12.18.png")

②segueを選択し、Identifierを設定する


③画面遷移させたいときに下記のコードを追加する

```
performSegue(withIdentifier: "Test", sender: nil)
```

この方法は遷移するViewControllerが2個程度と少ない場合に使っている


### 方法2 PushViewControllerを使う

```
let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "Test") as! SecoundViewController
        self.navigationController?.pushViewController(secondViewController, animated: true)
        
```

Testの箇所には遷移先のStoryboardIdに設定した値を入力

![スクリーンショット 2017-08-01 21.36.21.png](https://qiita-image-store.s3.amazonaws.com/0/139360/560cba5d-6477-6f62-7966-4e7a91cd9635.png "スクリーンショット 2017-08-01 21.36.21.png")

SecoundViewControllerは遷移先Storybordに設定したViewControlerを書く

![スクリーンショット 2017-08-01 21.37.28.png](https://qiita-image-store.s3.amazonaws.com/0/139360/8dd20736-6ee2-750a-8f86-f2bd2ceeface.png "スクリーンショット 2017-08-01 21.37.28.png")


ちなみに、コードで戻る時は下記のコードでできる

```
_ = navigationController?.popViewController(animated: false)

```

この方法はnavigationControllerを配列にして管理することができるので
一気に2個戻るというようなことも簡単です。


他にも画面遷移する方法はたくさんありますが、自分がよく使うものをメモとして残しておきます。
目覚ましをpythonで作ってUbuntuに設定してみた

フロントエンドが続いたので、今回は趣向を変えてpythonです。
特に面白いことはしてないのですが、なんとなく紹介しようかと思います。

# 経緯
私は朝が滅法弱いので、隣人から苦情が来るレベルの大音量で音楽を目覚ましにかけているのですが、
今まではWindowsのタスクスケジューラで音楽ソフトにファイルを引数で渡して起動していました。

しかし、せっかくubuntuもあるので、勉強がてらそのマシンを有効活用しようと思ったのが事の始まりです。
また、勉強中のpythonで何か作りたいなと思ったのもきっかけです。

# 準備
[環境情報]
・python 3.6(Anaconda 4.3.1 64-bit) 
・pip 9.0.1

今回は音楽の再生にpygameという、pythonのゲーム用ライブラリを使います。

以下のコマンドでインストールします。
※pythonやpipなどの環境構築は省略します。

```
pip install pygame
```

# ソース
音楽ファイルが格納されたフォルダを指定し、ランダムで再生されていく作りになっています。
※拡張子はmp3のみで動作確認しました。

``` music.py
# -*- coding: utf-8 -*-

import pygame.mixer
import time
import os
import random
import sys

folder = r"/home/user/Documents/python_learn/music/" #音楽ファイルが格納されたフォルダを指定
songList = os.listdir(folder)
random.shuffle(songList)

pygame.mixer.init()

for song in songList:
    pygame.mixer.music.load(folder + song)
    pygame.mixer.music.play(1) # ループ回数（-1だと無限ループ）
    while True:
        if not pygame.mixer.music.get_busy():
            break
```

# 設定
ubuntuのcronで定時実行します。

以下コマンドでcronを設定します。

```
crontab -e
```

私の場合、平日の朝6時にかかるようにしているので以下のような設定になります。

```
# 0 6 * * 1-5 /home/user/anaconda3/bin/python /home/user/Documents/python_learn/music.py > /home/user/Documents/log.txt 2>&1
```

# 問題点
これで完了です。
上手く動かない場合はログを確認したり、cronが起動しているか確認してみてください。
※寝坊しても責任は取りません(笑)

ただ問題がいくつかあり、止める際は以下のコマンドでPIDを調べkillするしかありません。

```
ps -ef | grep music.py
kill PID
```

気が向いたら、GUI操作で止めれるようにしたいなと思います。

あと、たまに再生されない音楽ファイルがあるのですが、原因不明です。
その場合は諦めましょうorz
RackアプリケーションのメトリクスをApplication Insightsで集める。


Application InshghtsのRuby SDKに先日出したプルリクエストが取り込まれたことにより、Ruby on RailsなどRackアプリケーションのメトリクスをApplication Insightsで取れるようになりました。

# Application Insightsとは？

ウェブアプリやモバイルアプリなどのアプリケーションのパフォーマンスやエラーなどの情報を収集し、アラートや分析をするためのサービスです。

# セットアップ

## Application Insightsの作成

### PortalからApplication Insightsを作成する

Azure Portalから、Application Insightsのブレードを開き、新規作成します。

![Application_Insights_-_Microsoft_Azure.png](https://qiita-image-store.s3.amazonaws.com/0/3662/e8c5f58e-2b54-27e6-12ea-221ead5f3a29.png "Application_Insights_-_Microsoft_Azure.png")

Rubyの場合、Application TypeはGenralとして作成します。
Locationは、まだ日本が含まれていません（2017年8月1日時点）。どこを選んでも変わりが無いので、好きなところを選びましょう。

### Instrumentation Keyを取得

作成したApplication Insights のブレードを開き、Propertiesを選択し、表示されるInstrumentation Keyの値をコピーしましょう。
この後に、Rackミドルウェアをインストールする際のパラメーターとして利用します。

![Properties_-_Microsoft_Azure.png](https://qiita-image-store.s3.amazonaws.com/0/3662/c32c274d-6046-ddea-b183-46ee401dcc60.png "Properties_-_Microsoft_Azure.png")



## Rackミドルウェアの追加

お使いのRackアプリケーションのgemの依存関係をbundlerで管理している場合、`Gemfile`に

```ruby:Gemfile
gem 'application_insights', github: 'Microsoft/ApplicationInsights-Ruby'
```

を追加します。
その後、`application_insights`が提供するRackミドルウェアをインストールしましょう。

例えば、Sinatraのアプリケーションの場合は以下のようにします。上でコピーしたInstrumentation Keyは環境変数`INSTRUMENTATION_KEY`として定義されているものとします。

```ruby:app.rb
require 'sinatra'
require 'application_insights'

use ApplicationInsights::Rack::TrackRequest, ENV['INSTRUMENTATION_KEY'], 5

get '/' do
  'Hello, Application Insights!'
end
```

サンプルコードをGistに置いたので、参考にどうぞ。

* [Tiny sample application for Application Insights](https://gist.github.com/satoryu/f3649afff379f3ad5057777406027a9c)


# ざっくりと使い方

## Portalからチャートを見る

ポータルから該当のApplication Insightsのブレードを開くと、収集したリクエストの情報が見れます。

![tatz-sample-ai_-_Microsoft_Azure.png](https://qiita-image-store.s3.amazonaws.com/0/3662/6efbc434-e751-91e1-fbc5-62c44a9af2a9.png "tatz-sample-ai_-_Microsoft_Azure.png")

リクエストのパラメーターやブラウザの情報、エラー時のスタックトレースなど細かな情報まで集めており、独自のクエリを書くことで細かな分析もできるようです。
また、PowerBIと連携させたり、REST APIが提供されていたりと、外部で連携させることも可能なようです。Stream Analytics とも連携できるそうなので、機械学習含めAzure上で色々な解析ができそうですね。


# 参考

* [Azure Application Insights とは何か | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/application-insights/app-insights-overview)
* [Microsoft/ApplicationInsights-Ruby: Microsoft Application Insights SDK for Ruby](https://github.com/Microsoft/ApplicationInsights-Ruby)
* [Tiny sample application for Application Insights](https://gist.github.com/satoryu/f3649afff379f3ad5057777406027a9c)
ひとつのファイルを参照するシンボリックリンクを複数作成する

### はじめに

* 「index01.html」というものがあったとする
* 「index02~20.html」というものがあり、これらの内容は全て「index01.html」と同一である
* 全部コピーして作ってもいいが、今回はこれらをシンボリックリンクで作成することにした

### 何が問題か

シンボリックリンクが一つしかないなら、次のコマンドで簡単に作れますが…

``` ln -s /var/www/html/hoge/index01.html /var/www/html/hoge/index02.html ```

こんな風に連番に対して一度にシンボリックリンクを貼ることはできません！

``` ln -s /var/www/html/hoge/index01.html /var/www/html/hoge/index{02 .. 20}.html ```

### 結果

上のようなことを実現できる方法が、以下になります。

```
cd /var/www/html/hoge/

for i in $(seq 2 20); do i=`printf %02d $i`; ln -s $(pwd)/index01.html ./index$i.html; done
```

もし単なる連番(index2~20.html)にしたい場合はこちら

```
cd /var/www/html/hoge/

for i in $(seq 2 20); do ln -s $(pwd)/index1.html ./index$i.html; done
```

for文とかseqとかpwdとか、見慣れてる言葉が並んでるので多分解説いらないですよね。おわり。
Kinesisを覗く


## はじめに
kinesisに入っていくデータを覗き見たかった
kinesisにデータが入ると表示してくれる
kinesisへのフル権限があること

## 参考
kinesisを作ったりデータをいれたりするのは他を参考にしてください
[Kinesisの雰囲気をつかむためにawscliで操作する](http://qiita.com/oshiro/items/47e6052bbeb5954a69ed)
[[JAWS-UG CLI] Kinesis:#2 データレコードの入力 / 取得](http://qiita.com/daikumatan/items/e92d9e71f9a729ea8467)

## コード
```kinesis_get.py

import sys
import time
import boto3
from  datetime import datetime




client = boto3.client('kinesis')


def get_kinesis(key):
    try:
        res = client.get_records(
            ShardIterator=key,
            Limit=123
        )
        return res

    except Exception as e:
       print('Kinesis put record excption')
       print(e)
       sys.exit



def get_iterator(name, date, id):
    t = datetime.strptime(date, '%Y/%m/%d')
    res = client.get_shard_iterator(
        StreamName=name,
        ShardId=id,
        ShardIteratorType='AT_TIMESTAMP',
        Timestamp=t
    )
    return res


def main(stream, date, shard_id):

    try:

        res = get_iterator(stream, date ,shard_id)

        itr = res['ShardIterator']

        while True:

            response = get_kinesis(itr)


            for record in response['Records']:
                print(record['Data'])


            nxt = response['NextShardIterator']

            time.sleep(2)
            if nxt == None or nxt == '':

                break

            itr = nxt


    except Exception as e:
        print('Exception exit')
        print(e)




if __name__ == '__main__':

    if len(sys.argv) < 3:
        error = "ERROR: Please enter  stream name and shard id\n"
        command = "{} python {} [stream name] [start date %Y/%m/%d] [shard id]".format(error, sys.argv[0])
        print(command)
        exit()

    print('----------start-------------')



    stream = sys.argv[1]
    date = sys.argv[2]

    if len(sys.argv) < 4:
        shard_id = 'shardId-000000000000'
    else:
        shard_id = sys.argv[3]

    main(stream, date, shard_id)



```



## 使いかた

### 必要なもの
```
pip install boto3
```

### コマンド
日付の形式は[%Y/%m/%d]<br>
必須なのはstream nameとstart date

```
python kinesis_get.py [stream name] [start date] [shard id]
```

###結果
これでkinesisにデータが挿入されると表示されていく

```result
b'{"a": 1, "b": 2}'
b'{"a": 3, "b": 4}'
b'{"a": 5, "b": 6}'
b'{"a": 7, "b": 8}'

```




### GitHub
[git hub](https://github.com/shunsuke-aikawa/kinesis_watch)
整数の集合を一発で剰余類に分けよう


例えば $\bmod 3$だったら


```python
ns = range(30)
m = 3
list(zip(*zip(*[iter(ns)]*m)))
```




    [(0, 3, 6, 9, 12, 15, 18, 21, 24, 27),
     (1, 4, 7, 10, 13, 16, 19, 22, 25, 28),
     (2, 5, 8, 11, 14, 17, 20, 23, 26, 29)]



となり，$3$ で割ったときの余りが $0$ のもの，$1$ のもの，$2$ のもので整数を分けることができます．数でないリストに突っ込んだ場合，中身を3つ飛ばしにしたものを1つの固まりにします．


```python
ls = list('abcdefghijkl')
m = 3
list(zip(*zip(*[iter(ls)]*m)))
```




    [('a', 'd', 'g', 'j'), ('b', 'e', 'h', 'k'), ('c', 'f', 'i', 'l')]



この記法がクールと思えるかどうかは分かりませんが，なぜこれでうまくいくかを簡単に説明しましょう．例えば


```python
s = list(range(12))
s
```




    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]



を3つの数ずつに4分割するのに


```python
list(zip(*[iter(s)]*3))
```




    [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]



という方法があるのは割と有名だと思います．実は，[公式チュートリアルのzip関数](https://docs.python.jp/3/library/functions.html#zip)のところにいきなり書いてあります．

>zip(*[iter(s)]*n) を使ってデータ系列を長さ n のグループにクラスタリングするイディオムが使えます。

よくよく眺めていると，この結果を`zip`関数に突っ込めば，3つ飛ばしのリストが出来上がることに気付くと思います．


```python
list(zip(*zip(*[iter(s)]*3)))
```




    [(0, 3, 6, 9), (1, 4, 7, 10), (2, 5, 8, 11)]



但し，この方法だと，10個の数のリストを3つの数ずつに分割しようとすると，半端な部分が切り捨てられてしまいます．


```python
list(zip(*[iter(list(range(10)))]*3)) #9が切り捨てられる
```




    [(0, 1, 2), (3, 4, 5), (6, 7, 8)]



これは`zip`関数の仕様です．これを回避するために，`itertools`に[`zip_longest`](https://docs.python.jp/3/library/itertools.html#itertools.zip_longest)関数が用意されています．


```python
from itertools import zip_longest
list(zip_longest(*[iter(list(range(10)))]*3)) #半端なところにはNoneが入る
```




    [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)]



これを用いて，剰余類の方もアップデートしましょう．最後に`None`を取り除く行程があるのですが，`tuple`がイミュータブルである点は注意です．最終的には数学らしく，`set`の集まりにしました．


```python
from itertools import zip_longest
ns = range(50)
m = 3
[{x for x in t if x != None} for t in zip(*zip_longest(*[iter(ns)]*m))]
```




    [{0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48},
     {1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49},
     {2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47}]



`zip`関数は~~名前があまり好きじゃないのですが~~，奥が深いです．
【ストアアプリ】ListviewのScrollViewの操作をしたい【C#】

# 本記事の内容
　ストアアプリのListView(以下本記事のListViewはストアアプリのものとする)にあるScrollViewを操作できるようになることが目的です。調べても思ったよりも記事が見つからなかったためここに残しておきます。


# 操作案

　ListViewの操作方法としてぱっと思いつくものでは、

- ListViewをScrollViewで囲ってしまう

``` test.xaml
<ScrollView>
<ListView>
</ScrollView>

```
こんな感じです。

- ListViewの中のScrollViewをごにょごにょする

辺りが考えられますが、今回は下の「listViewの中のScrollViewをごにょごにょする」方を採用します。
理由としまして、囲ってしまうほうでは考え方が変わってしまう点と、ListViewが結果として伸びてしまう点があるためです。


# 実際に操作してみる

コードビハインドに以下のコードを追加します。
## コード
``` csharp:test.xaml.cs

        /// <summary>
        /// ここのメソッド名とかは何でもいいです。もちろんイベントでも可能。
        /// </summary>
        public void scrollOperation(){ 
             var　ScrollViewer = FindChild<ScrollViewer>(this.tableListView);
        }

        /// <summary>
        /// 指定した型の最初に見つかったビジュアル要素を返す
        /// </summary>
        /// <typeparam name="T">型</typeparam>
        /// <param name="root">探索対象のビジュアル要素</param>
        /// <returns>見つかった場合はその要素</returns>
        private static T FindChild<T>(DependencyObject root) where T : FrameworkElement
        {
            var childNumber = VisualTreeHelper.GetChildrenCount(root);
            for (var i = 0; i < childNumber; i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(root, i);
                if (child != null && child is T)
                {
                    return child as T;
                }
                else
                {
                    return FindChild<T>(child);
                }
            }
            return null;
        }
```


##解説

 　FindChildメソッドを利用して、その要素の指定した一番初めに見つかった型を取得してきています。今回は

```
FindChild<ScrollViewer>(ListViewの名前)
```

とし、ListViewの名前のScrollViewを取得してきています。

このコード自体は特に何もListViewに対して変更はかけていませんが、offsetプロパティを利用すればスクロール位置の記憶やChangeViewメソッドを利用すれば、変更も可能です。


## ただし・・・

FindChildは一番初めから対象の型を探しに行くため、処理に時間がかかります。位置を記憶するような操作をするときは、なるべく処理する回数を減らすように心がけたほうが良いです。


# 参考

- [MetroTips #29 GridViewのスクロール位置を復元するには？](https://code.msdn.microsoft.com/windowsapps/MetroTips-29-GridView1Win-8-8b43fbb7)

- [Windows ストアアプリで画面遷移前のスクロール位置を記憶するための Behavior を作る](http://matatabi-ux.hateblo.jp/entry/2014/02/07/065859)
Macで利用頻度の高いコマンド(2017/8) -2017/9/29追記-

Macのターミナルで便利だなと感じているコマンドをまとめています。
これまでFinder等GUIでの利用が多かったのでですが、ターミナルの便利さに改めて気づいたので、そういった普段GUIメインですいう人の気付きにはなるかもしれません。

# よく使うコマンド
- `mdfind [-name] [キーワード1] [キーワード2]`　➾　ファイルやディレクトリを検索する
- `open [パス]`　➾　Finderでディレクトリを開いたり、ファイルを開いたりする
- `diff -rq [ディレクトリパス1] [ディレクトリパス2]`　➾　変更ファイルの抽出(リリースのときとかによく使う)
- `ls -l | grep -v ^d`　➾　ファイルの一覧を取得(-vをなくせばディレクトリの一覧)
- `history | grep ssh`　➾　sshで繋ぐホスト等覚えていられないので履歴から使う(`$!番号`で実行)

# 利用ケース
## 1. ファイルを探して開く  

```:ファイルを探す
$ mdfind [キーワード1]

# 結果が多すぎたらファイル名だけに絞るか、キーワードを追加する
$ mdfind -name [キーワード]
or
$ mdfind [キーワード1] [キーワード2]
```
```:ファイルを探す
# パスをコピーしてファイルを開く
$ open [コピーしたファイルのフルパス]
```

## 2. Finderでカレントのディレクトリを開く
```:カレントのディレクトリ[.]をオープン
$open .
```

## 3. 元のファイル一式とリリース用のファイル一式の差分をとって適正か確認する
```:指定ディレクトリを再帰的にチェック
# -r で再起的にチェック
# -q でファイルの変更があるかどうかのみチェック
$ diff -rq [ディレクトリパス1] [ディレクトリパス2]
```

## 4. ファイルの一覧をフォーマットして表示する(リリース時のファイル一覧等に利用)
```:箇条書きでファイル一覧表示
# -v を削除すればディレクトリの一覧になる
# 空文字じゃない行を"・hogehoge"という形で出力
$ ls -l | grep -v ^d | awk '{ if($9!="") print "・"$9}'
```
```:出力した結果が満足なら、ついでにクリップボードにコピー(ドキュメントに貼り付けるのに便利)
$ ls -l | grep -v ^d | awk '{ if($9!="") print "・"$9}' | pbcopy
```

## 5. よく使うサーバへのSSH接続を行う
```:履歴をグレップ
# いくつもサーバを扱っている場合、ホスト名等覚えられなくなってきたので履歴からたどる
$ history | grep ssh

# 表示された履歴の番号を指定して実行
$ ![履歴の番号]
```

## 6. ズバリ最新の議事録のファイルを探したい
```:ファイル名に議事録が含まれるものを更新日時でソートし、表示件数も絞る
$ mdfind -name 議事録 -0 | xargs -0 ls -t | head -1
```


今後便利だなと思ったものが見つかったら更新していきたいと思います。
C言語 timeの加算

# timeの加算

現在時刻から１秒足した時間を取得します。

```c
#include <stdio.h>
#include <time.h> // add

int main(void){
    time_t timer;
    struct tm *s_tm;
    
    
    // 現在時刻でtimerを取得
    time(&timer);
    
    // timerからtm構造体を取得
    s_tm = localtime(&timer);
    printf("分: %d\n",s_tm->tm_min);
    printf("秒: %d\n",s_tm->tm_sec);
    
    // timeの加算 : timerに１秒足す
    timer += 1;
    
    // timerからtm構造体を取得
    s_tm = localtime(&timer);
    printf("分: %d\n",s_tm->tm_min);
    printf("秒: %d\n",s_tm->tm_sec);
}
```

わかってる人から見れば当たり前のコードですね。
しかし、意外とサンプルコードが見つからなくて不安になったので記事にしました。

# 参考
time http://www9.plala.or.jp/sgwr-t/lib/time.html

# オンライン実行
https://paiza.io/projects/sO_usfCmJt7PItqnXZkmOA
トライグラフが廃止だって??!

C++17で、「トライグラフ」（trigraph）という言語機能が廃止されます。

## 言語機能が廃止になる意味
ふつう、プログラミング言語で一度用意した機能を廃止するということは、そう多くはありません（Javaでも、多くはdeprecatedで生き残っています）。

廃止される機能というのには、いくつかのパターンがありますが、

0. 文法上の加減で発生してしまった、全く役に立たない機能だった（PHPでの`break 0;`や`(unset)`キャストなど）
1. 省略可能で、誰も使っていなかったキーワードの廃止（「自動変数」から「型推論」に転用された`auto`など）
2. もとの仕様が危険であるために、廃止するしかなかった（C言語の`gets`など）
3. 利用者が少ないので、廃止しても問題ないと判断された

のようにいくつか考えられますが、トライグラフの廃止理由としては4に当たります。

## そもそも、トライグラフって？
この記事を読む人の90%以上は、実用的な目的でトライグラフを書いたことがないであろうし、「トライグラフ」が何だか知らない人も多いと思います。

トライグラフの説明をするために、歴史の針を1970年代まで戻してみます。当時はUnicodeどころか、ラテンアルファベット圏では文字コードが7ビットしかありませんでした[^1]。そのため、英語ならともかく他の国ではアクセント付きのアルファベットを入れるために、ASCIIの記号領域を削って詰め込むような事態となっていました。これらをまとめた文字コードが[ISO 646](https://ja.wikipedia.org/wiki/ISO/IEC_646)で、今で言うASCIIのうち、記号領域の何文字かが可変となっていました。

ところが、C言語では使う文字コードに指定がなかった[^2]上に、可変な記号領域まで使うので、文字がない、という事態が発生してしまうわけです。そこで生まれたのがトライグラフでした。

### 機能

| 変換前 | 変換後 |
|:--:|:--:|
| `??=` | `#` |
| `??(` | `[` |
| `??/` | `\` |
| `??)` | `]` |
| `??'` | `^` |
| `??<` | `{` |
| `??!` | <code>&#124;</code> |
| `??>` | `}` |
| `??-` | `~` |

ソースコードに「変換前」の文字を書くと、「変換後」のように認識される、それだけの仕組みです。

### 問題点
「ソースコードの表記を書き換える」という性質上、これらのトライグラフは**プリプロセッサ処理より前**という、かなり早いレベルで発動してしまいます。なので、文字列中にあったものも、お構いなしで変えていくので、「そこで文字列を2つに分ける」「`\?`という、`?`に変換されるだけのエスケープシーケンスを使って、`"?\?!"`のように書く」といった対策が必要となってしまいます（[参考](http://qiita.com/hnw/items/b29283e59ce9a24e5a53)）。

## 終焉（したけどあまり変わらないかも）
ISO 646しかなかったために7ビットに無理やり詰め込む状況もISO 8859では解消されて、さらにはUnicodeも導入される環境では、トライグラフは無用の長物となっていき、「コードに入っていたら警告が出る」「動作させるのにオプションがいる」ような状況となっていて、実質余計なもの扱いとなっていました。

C++11の制定にあたっても非推奨化の提案が出たのですが、EBCDIC環境でC++を使うIBMからの反対があり、いったんは流れてしまいました。C++17では非推奨を通り越して廃止となったのですが、オプションとして実装するのは妨げない、という流れになったので、IBMもそのまま使い続けて、ASCII/Unicode環境ではオプションで召喚 or 完全廃止、ということで、結局はそう変わらない気もしています。

## 関連リンク
* [PRE07-C. "??" の繰り返しは避ける](http://www.jpcert.or.jp/sc-rules/c-pre07-c.html)
* [廃止にあたってIBMの出したPDF](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4210.pdf)

## 脚注
[^1]: 今はだいぶ改善していますが、メール配信のSMTPも、7ビットしか通らないことになっています。
[^2]: JavaやJavaScriptでは、コードセットもUnicodeが前提となっています。
AWS EC2 のタイムゾーンを変更する手順 (memo)

AWS EC2 のタイムゾーンは、デフォルトでは「UTC」になっています。

日本環境用に「JST」に変更する手順を記載します。

**1．/etc/localtime の変更**
以下のように、/etc/localtime ファイルを入れ替えると、すぐにタイムゾーンの変更が確認できます。

````
$ date
Sun Oct 26 11:19:28 UTC 2014
$ sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
$ date
Sun Oct 26 20:19:44 JST 2014
````

上の dateコマンドでは「UTC」になっていますが、下の dateコマンドでは「JST」になっているのが確認できます。

**2．/etc/sysconfig/clock の変更**
次に、/etc/sysconfig/clock ファイルを編集します。

$ sudo vi /etc/sysconfig/clock
変更前は以下の値です。

````
ZONE="UTC"
UTC=true
以下の値に変更します。

ZONE="Asia/Tokyo"
UTC=False
````
以上で、EC2のタイムゾーンを変更する手順は終了です。
AndroidOのfindViewByIdの仕様変更

Google I/Oでは歓声が上がっていた(?)、Android OからのfindViewByIdの総称型対応について

# findViewById

API Level 26からは[findViewById](https://developer.android.com/reference/android/app/Activity.html#findViewById(int))に総称型が追加されています。

## Java

Javaではキャストする手間が減り記述量が減るようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/110221/654dfb43-c814-8be8-f04e-513485c47698.png)

バイトコード的には変更がないので、`compileSdkVersion`によって生成されるバイトコードは（恐らく）変化しません。

## Kotlin

**Kotlin 1.2からは問題なくコンパイルできるようになりました。**
[Information from explicit casts is used for type inference](https://kotlinlang.org/docs/reference/whatsnew12.html#information-from-explicit-casts-is-used-for-type-inference)

**1.2以前の記述**
一方、Kotlinでは`compileSdkVersion`を26に上げると、タイプパラメーターの推論ができないため、25までの記述はコンパイルエラーになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/110221/2d60dbe5-0915-6d39-0290-8fe2bf426258.png)

以下のように、タイプパラメーターを指定するか、推論できるようにすればコンパイルは通ります。

```kotlin
// こっちだとTextView!!になるので
val text26_1 = findViewById<TextView>(android.R.id.text2)
// 型を明示するほうが良さそう
val text26_2: TextView = findViewById(android.R.id.text2)
```

もしくは、予め`findViewById`をラッピングする拡張を作っておくといいかもしれません。

```kotlin
// compileSdkVersion 25
@Suppress("UNCHECKED_CAST")
fun <V : View?> Activity.find(@IdRes id: Int): V = findViewById(id) as V
// compileSdkVersion 26
fun <V : View?> Activity.find(@IdRes id: Int): V = findViewById<V>(id)
```

ButterKnifeとか使っていれば恐らくこの問題は発生しないと思いますが、KotlinAndroiderはお気をつけください。
Ionic2+ でカスタムアイコンをion-iconとかいろんなところで使えるようにする

Ionicでカスタムのアイコンを使いたいときに、画像だとion-iconとかtabのiconとかで使うのが面倒くさかったりしますね。

そこで、カスタムのion-iconを設定するときはこんな感じでやったのでメモ。

```scss:app.scss
ion-icon {
    &[class*="custom-icon-"] {
        mask-size: contain;
        mask-position: 50% 50%;
        mask-repeat: no-repeat;
        background: currentColor;
        width: 1em;
        height: 1em;
    }
    // custom icons
    &[class*="custom-icon-foo"] {
        mask-image: url(../assets/icon/foo.svg);
    }
    &[class*="custom-icon-bar"] {
        mask-image: url(../assets/icon/bar.svg);
    }
}
```

ちゃんと`background: currentColor`としてあげることで、色の変更にも追従します。

名前空間を汚染するのがいやなので、class名は`custom-icon-xxx`とあえてつけてます。場合によっては案件名などの接頭辞をつけてあげるのもいいと想います。

例えばタブだとこんな感じになります。

```html
<ion-tab [root]="tab1Root" tabTitle="タブ1" tabIcon="custom-icon-foo"></ion-tab>
<ion-tab [root]="tab2Root" tabTitle="タブ2" tabIcon="custom-icon-bar"></ion-tab>
<ion-tab [root]="tab3Root" tabTitle="タブ3" tabIcon="alert"></ion-tab>
```

3つめはIoniconsデフォルトのalertアイコンですね。
取得したHTMLタグ入りの文字列をAngualr, Ionic上で表示 styleタグもいける

IonicでHTMLタグの入った、特にStyleタグの入ったコンテンツを表示する必要がありました。
内容的には基本的すぎることなんですが、Componentの中でSanitizer使って作っても、型エラーで反映できなかったので共有のためシェアしておこうかなと。

結論から言うとこういうPipe作った。

```ts:safe-html.ts
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';

@Pipe({
  name: 'safeHTML',
})
export class SafeHtmlPipe implements PipeTransform {

  constructor(private sanitizer: DomSanitizer) {}

  transform(value) {
    return this.sanitizer.bypassSecurityTrustHtml(value);
  }
}
```

これをView側で呼び出す。Componentのメソッドの中でやろうとしても何故か上手くいかなかったので、おとなしくパイプを作りました。

```html
<div [innerHTML]="contents | safeHTML"></div>
```

あとはComponentの方で、contentsに対してHTMLタグ、それもStyleタグ入りの文字列をバインドしてあげてください。
GitHubプルリクエストで特定拡張子のファイルを非表示にする方法 (Chrome)

# GitHubプルリクエストで特定拡張子のファイルを非表示にする方法　＠Chrome

:one: 拡張機能 *Tampermonkey* をインストール
[Chrome ウェブストア](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo)
:two: 下記URLの箇条書き下から二つ目の `this link` をクリック
https://github.com/Mottie/GitHub-userscripts/wiki/GitHub-diff-files-filter
:three: Tampermonkeyのページが開いたら `install` ボタンを押す

これで、GitHubのページを開くとファイル拡張子フィルタボタンが出ます。

![ss-github.jpg](https://qiita-image-store.s3.amazonaws.com/0/75035/69d83e23-7666-1706-f933-09fe4e1cc9f8.jpeg)


## 補足
:two:のサイトには他にもいろんな拡張がある模様
そもそもこれらは、[GreaseMonkey](https://addons.mozilla.org/ja/firefox/addon/greasemonkey/
)というFireFox用の拡張機能のためのスクリプト
（なのでFireFoxユーザーはこっち）

ChromeではGreaseMonkeyそのものは使えないので、代わりの拡張機能の一つがTampermonkey
[NinjaKit](https://chrome.google.com/webstore/detail/ninjakit/gpbepnljaakggeobkclonlkhbdgccfek)というのもあるが、自分の環境ではインストールポップアップが正常に表示されなかった。

参考：
http://jutememo.blogspot.jp/2012/11/google-chrome-greasemonkey-tampermonkey.html
Ionic Native の Social Sharingが、マルチバイト文字のパスの読み込みでうまくいかない件

Ionic Nativeの便利な機能の1つにあるのが

**Social Sharing**
https://ionicframework.com/docs/native/social-sharing/

割と手間なくNativeのSNSシェア機能がIonicアプリから利用できます。

# バグについて
画像を読み込ませるURLに日本語が入っている時、挙動が安定しなくなった。

```ts
this.socialShareing.share("こんにちは", "世界", "https://画像へのURL");
```

こんな感じでオーソドックスな使い方をしていたんですが、マルチバイトの文字列を含んだ画像のURLが読み込めないというエラーがiOSで出てきました。

そこで

```ts
let imageUrl = encodeURI("https://画像へのURL");
```
と、URLをエンコードして上げることにしました。この時点でiOSでは動く。

# iOSを立てれば、Androidが立たず

iOSで動いたものの、今度はAndroidで動かなくなってしまった。
ので、Ionic の platformで場合分けして使ってあげることにしました。

```ts
let imageUrl = "https://画像へのURL";
if (this.platform.is('ios')) {
    imageUrl = encodeURI("https://画像へのURL");
}
```

以上。
Angularにおけるパイプ(PurePipe, ImpurePipe)とメソッドの違い



AngularでPipeを使うメリットとしては、「単純で、あらゆるコンポーネントでよく使うようなデータ整形処理は共通化して、Template(html)で記述できるようにする」というものです。


たとえば、%表記というのは内部的には 1.0 === 100% ですが、その変換は単純かつよく使うものです。

```
num1 = 2.5; 
```

のときに

```
{{num1 | percent}} 
``` 
と、PercentPipeを使って書くと、ビューの出力は

```
250%
```

になります。



Built-in Pipe として標準で用意されてるパイプには、下記のようによく使う単純なものが多いです。。

- DatePipe : 日付変換(yyyy/mm/dd形式等)
- DecimalPipe : 小数点切り捨て＆ゼロうめ(3.141592 -> 003.14)
- JsonPipe : object->json化(JSON.stringifyと同じ)
- PercentPipe : パーセント表記(0.4 -> 40%)
- SlicePipe : 先頭ｎ文字から、末尾ｍ文字までを切り出す。
- CurrencyPipe : 通貨書式変換(USD->$,等)
- UpperCasePipe, LowerCasePipe, TitleCasePipe : 大文字小文字変換。(日本語だと必要性があまり理解できないが、英語圏では使用頻度高い)



### PipeにするかMethodにするか

さて、似たようなことをするときに、カスタムPipeを作るか、Componentのメソッドにするか迷うときがあります。

また、PipeにはImpure(不純)パイプとPure(純粋)パイプがあり、Pureパイプが標準となっています。

この違いを簡単にテストしてみましょう。
https://plnkr.co/edit/cOhEpn9gAUBoKbFvDRtA?p=preview



- purePipe -> method -> impurePipe の順に無駄な実行が少ない。
- 変更検知(ChangeDetection)の関係で、methodは無駄に複数回呼ばれる。pipeは変更検知後にしか実行されないのでパフォーマンスが良い。
- impurePipeはホント無駄に呼ばれる。
- methodのほうがpurePipeより実行される回数が多くなっちゃう
	- ただし描画処理前に実行されるから、描画に与える影響は超軽微
	- 重い原因は大抵はDOM変更が重い。jsは軽い。
	- `<div>{{ date.toString() }}</div>` は、 `date.toString()` の実行結果が変わらない限りDOM変更されない。 
	- ただ、purePipeだと date値で比較し変化があったときのみpipeメソッド実行するのに比べ、 method/impurePipeは `date.toString()` の実行結果で比較する感じ。



## 結論

### ■ pipeは共通処理・軽い処理・純粋関数のみにする

カスタムPipeにするかMethodにするか悩むときは、Pipeの元々の定義に従い

- (ビューでやるような)単純な変換か？
- 多くのコンポーネントで使用頻度が高くそのための共通化すべきか？

あたりを判断基準にするべきで、「描画速度向上の為にPipeにしよう！」ということは避けるべきでしょう。


### ■ 配列をソートやフィルタするpipeは作らない

コンポーネントのプロパティに `sortedArray` や `filteredArray` を作るほうがパフォーマンスが良い。
変更検知のタイミングとか実行処理が重いからとか色々ある。
詳しくは [公式ドキュメントにわざわざ項目作られてる](https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe) ので参照してください(英語)。


### ■ メソッドは、ごく軽量なもの以外はtemplate内では使用しない

```
<h1>{{ getUserName(user.id) }} の BMI値 </h1>
<div>{{ user.calcBMI() }}</div>
```

こういうものは避ける。 `getUserName()` メソッドが裏でSQLやHTTPリクエストを実行していた場合、変更検知(ChangeDetection) が実行されるたびにSQL/HTTPを発行してしまう。

`user.calcBMI()` が内部的に `user.weight / (user.height * user.height)` を呼び出してるだけの場合、テンプレート中で

```
<div>{{ user.weight / (user.height * user.height) }}</div>
```

とするのと処理の負荷は(ほぼ)変わらない。 (関数呼び出しのオーバーヘッドとか、スマホで3万回の試行で30ms程度の差)



ただし、可能ならコンポーネント初期化時に、下記のように初期化したほうが良い。
理由としては、テンプレートで複雑に処理を記述すると、見通しが圧倒的に悪くなるため。

```
user.bmi = user.weight / (user.height * user.height);

// templateで
<div>{{ user.bmi }}</div>
```


**メソッド実行や計算は、テンプレート中からは除外したほうが無難**。 動作するし、テスト中には便利なんですけどね。

ChangeDetectionが走るタイミングで、これらのメソッド実行や計算は、何度も何度も起きることになる。(値が変わってなくても！)
Rails+vue.jsでfields_forとv-forを同時に使う方法

```erb
<div v-for='(index, user) in users'>
  <%= f.fields_for :users, User.new, child_index: '{{ index }}' do |user_form| %>
    <%= user_form.text_field :name, 'v-model': 'user.name' %>
  <% end %>
</div>
```
ポイント
v-forでindexを取り出す
child_indexにそのvueの変数であるindexが展開できるようにする
フィールドごとに、v-modelを設定する
空っぽのそのフィールド用のオブジェクトをfields_forに渡す
Laravel Homestead + IntelliJでリモートデバッグの環境構築方法

# はじめに
IntelliJでのリモートデバッグに書いてあるページは数あれど、
内容が散ってたり、書いてあるとおりにやっても上手くいかなかったりしたので、
自分で行った構築方法を整理するために書いておきます。
※PHP StormとUltimateが、細い部分で違うため、こういうことが起きてるのかな〜と思います。

ごちゃごちゃ触りまくった後なので、足りてなかったら教えてください。

# 環境
## ホスト側
* Windows10
* PHP 7.1
* Intellij idea ultimate 2017.1.4

## ゲスト側
* Homestead 最新version(Ubuntu)

# 前提条件
ホスト側には、PHP 7.1とIntelliJはインストール済とします。
ゲスト側は、Homesteadの設定でVagrant upができる状態とします。

# 構築手順
## ホスト側
1. IntelliJにリモートサーバーを設定する<BR>
以下から設定する。
[File] - [Settings] - [Languages & Frameworks] - [PHP] - [Servers]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56851/39f7f9f5-18ea-05ef-e299-a7ebb435b7dd.png)
それぞれ以下を指定します。
 * Host : homesteadに指定しているhost名
 * Port : homesteadに指定しているport番号（デフォルト80）
 * Debugger : Xdebug
 * File/Directory : ホスト側のプログラムが配置してあるパス
 * Absolute path on the server : ゲスト側とホスト側のマウントポイント（実際は違うはずだけど、シンボリックリンク、ジャンクションとか言った方が伝わる？？）

2. IntellijのRun Configurationsでリモートサーバーを紐づける<BR>
以下から設定する<BR>
[Run] - [Edit Configurations...]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56851/22971ebd-3b13-ae85-ce2a-a6f1762fee62.png)
PHP Web Applicationに追加します。
それぞれ以下を設定します。
 * Server : 1.で作ったリモートサーバーを選択します。
 * Start URL : Debugモードを起動した時に、ブラウザで表示するURLを指定します。
 
3. xdebugのポートを設定する
以下から設定する。
[File] - [Settings] - [Languages & Frameworks] - [PHP] - [debug]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56851/586d2626-4926-2eb1-8c79-99354b81755b.png)
任意の値で問題ないですが、デフォルトの9000は上手く動かないという解説が多く9001にしておけ、というサイトが多いので9001に設定してます。
(9000ってそんな使ってるソフトないし、SonarQubeとか9000で突っ込んで普通に動くので、何かあるんだと思います。)

ここまでやればホスト側の設定はOKです。

## ゲスト側
1. xdebugをインストールする

```bash:コマンド
sudo apt-get install xdebug-*
```
<BR>
2. xdebugの設定ファイルを修正する
 ファイルの場所
> /etc/php/7.1/fpm/conf.d/20-xdebug.ini

以下を追加する
> xdebug.remote_enable = On
> xdebug.remote_autostart = On
> xdebug.remote_host = Homesteadに設定しているゲストのIPアドレス(デフォルト：192.168.10.10)

また、xdebug.remote_portをIntellijのxdebugのDebug portに指定した番号に変更する
<BR>
3. 再起動する
 
```bash:コマンド
sudo service php7.1-fpm restart
```

## 試してみる
IntelliJ上でコード開いて任意の箇所にブレイクポイントを打ち、以下からデバッグモードを起動する。
以下から起動する
[Run] - [Debug]
どれで起動するかを聞かれるため、今作った"homestead"を選択する。
起動するとブラウザに初期表示のURLに設定した画面が新しいタブで表示されるので、画面を操作してデバッグしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56851/3d008136-5a4d-fb7c-2696-055599d14f24.png)
上手く設定できていれば、こんな感じで止まって各変数の値が見れます。

## 最後に
PHP歴3カ月突破しましたが、初めのころは特にブレイクポイントで止めるという企業文化も無かった＆周りも知らないみたいだったので、中々苦しかったです。
ブレイクポイントで止めれるようになってからは覚えるのも楽になったので、やっぱ基礎大事だし、
何か新しい言語・フレームワークを覚えるときは、データ構造が見えた方が手っ取り早くて良いな～と心から思いました。
WatchKit Appで image not foundが出たら

WatchKit Appを実機デバッグしていて、起動時に下記のような `image not found` のエラーが出たら、

```
dyld: Library not loaded: @rpath/libswiftCore.dylib
  Referenced from: /private/var/containers/Bundle/Application/EEC67151-E7C1-4133-B50F-C709C1948A1F/watchkitapp.app/PlugIns/watchkitapp Extension.appex/watchkitapp Extension
  Reason: image not found
```

WatchKitAppの Build Settings > Build Options > Allways Embed Swift Standard Libraries を `Yes` にすると吉かもしれません。

![スクリーンショット 2017-07-28 16.58.48.png](https://qiita-image-store.s3.amazonaws.com/0/47504/747f6b37-87cd-3d7f-ffc7-e481b11cb847.png)
mikorovのword2vec実装のLRの更新式メモ

## LRによるcontext wordの予測モデル

### context word
```math
P(y=1| v_{context}\cdot v_{target}) = \frac{1}{1 + \exp(- v_{context}\cdot v_{target}) }
```

### negative sampling word
```math
P(y=-1 | v_{context}\cdot v_{target}) = 1 - P(y=1 | v_{context}\cdot v_{target})
```

## y=1 => context wordの尤度最大化によるベクトル更新式

```math
\begin{eqnarray}
L &=& \log(P(y=1)  \\
\frac{\partial L}{\partial v_{c}} &=& 
- \partial v_c\log\left(（1 + \exp( - v_c \cdot v_t)\right) \\ 
&=& - \frac{1}{1 + \exp(-v_c \cdot v_t) } e^{-v_c \cdot v_t } \times - v_t \\
&=& \frac{\exp(-v_c \cdot v_t) }{1 + \exp(-v_c \cdot v_t) } v_t \\
&=& (1 - P(y=1)) v_t \\
\frac{\partial L}{\partial v_{t}} &=& (1-P(y=1) v_c \\
\end{eqnarray}
```

## y=-1 => negative sampling wordの尤度最大化によるベクトル更新式 

```math
\begin{eqnarray}
L &=& \log(P(y=-1) = \log(1 - P(y=1)) \\
\frac{\partial L}{\partial v_{c}} &=& 
\partial v_c\log(1- P(y=1)) \\ 
&=&
\frac{1}{1 - P(y=1)} -1 \times \partial v_c P(y=1) \\
&=& 
 \frac{1 + \exp(-v_c \cdot v_t)}{\exp(-v_c \cdot v_t)}
 -1 * -1 * (1 + \exp(-v_c \cdot v_t))^{-2} \exp(-v_c \cdot v_t) -1 v_t \\
&=& 
 \frac{-1}{1 + \exp(-v_c \cdot v_t)} v_t \\
&=&
 -P(y=1) v_t
\end{eqnarray}
```

## まとめると

- label = 1 <-> context word
- label = 0 <-> negative sampling word


```math
\begin{eqnarray}
g = \frac{\partial L}{\partial v_{c}} &=& 
(\mbox{label} - P(y=1)) v_t \\
g = \frac{\partial L}{\partial v_{t}} &=& 
(\mbox{label} - P(y=1)) v_c \\
\end{eqnarray}
```
Unity(iOS) + turbo-jpegで実行時エラーが起きたのでその対処

Android/iOS共通プロジェクトで turbo-jpegを使おうとして、iOS上でハマったことをメモ。

# 環境
- Unity5.6.2p1
- iOS 10.3.3

# libraryの準備
turbo-jpegの公式source forge( https://sourceforge.net/projects/libjpeg-turbo/files/ )から、Mac/iOS共有の .dmgを download。

Unityの Plugins/iOS/以下に

- libjpeg.a
- libturbojpeg.a

を copy。

# そのまま Unity+Xcodeで Buildすると
実行中、(turbo)jpegで読み書きなどしようとすると
```
tjGetErrorStr:JPEG parameter struct mismatch: library thinks size is 600, caller expects 632
```
とかいって怒られてしまい実行できません。構造体の byte packingまわりかなと思い turbo-jpegを自前buildして色々と試してみましたが改善せず。

よくよく調べてみると、turbo-jpegと Unityかどこかが持っている jpeglibが衝突している様子。

というわけで

# Link順序を変更
Xcode の Other Linker Flagsにおいて```-lturbojpeg -ljpeg```を先頭に追記してやることで、まっさきに linkするように修正しました。
 
![libjpegturbo.png](https://qiita-image-store.s3.amazonaws.com/0/118497/64422d02-cf39-77e3-4b93-fce42d39f855.png)

これで問題解決。先述のエラーも出なくなり、無事動作するようになりました。

# おわりに
iOSで C/C++な pluginを書くこともレアかもしれませんが、PCや Androidと共通化すると時々ハマるタイプの罠でした。
アジャイル勘違いQ&A

# アジャイル開発をよく知らない人たちが勘違いする項目をあげようと思います。

注) 質問内容に対して端的に回答はせず、これに乗じて好き勝手な蛇足文が付与されています。これらを楽しめる人が読んだら良いかなと思います。

# Q & A

Q. アジャイル開発は早く開発できる？
A. そうとは限りません。アジャイルの主眼は変化に強いことです。
刻々と変わる市場の変化、ユーザのニーズ、そして開発を進めていくことで分かる課題やよりよい方法の発見。
それらを受け入れるフレームワークです。
全ての変化を取り込むことを決めれば、開発スケジュールが伸びることもあるでしょう。

Q. じゃあ、変化にずっと対応していたらアジャイル開発はいつまでもリリース出来ないの？
A. 逆です。常にリリースできる状態を保った最小の機能単位を切り出し、それを使って進捗管理をし、リリースをします。
リリースは全ての機能が完成してからではなく、常にリリースできる状態になっていることがアジャイル開発の重要な要素です。

Q. アジャイル開発はドキュメントを書かない？
A. 必要なドキュメントは書きます。ただし、開発に困らないレベルのドキュメントしか書きません。
例えばアーキテクチャ図をかいた場合、話し合いでホワイトボードで書いたなら、記録は写真を取ってドキュメント管理ツール(Qiita:Teamなど)にアップするだけなどです。
形式を整えるのではなく、目的をとらえて、そのレベルでの情報共有をします。
アーキテクチャ図も常に変化するものです、ドキュメントを常に最新に保つことはコストが掛かります。
アーキテクチャ図を設計がしたいために書くのか、引き継ぎメンバのために残すのかで、どの水準で書くかは変わります。
前者なら先程の手法、後者であればLucidchartやPlantUMLなどを使って、変更に強いドキュメント化をした管理をする必要があります。
WordやExcelには書かないで下さい。

Q. アジャイル開発だからスケジュールを立てないよね？
A. そんなことはありません。必要であればガントチャートを書くこともあります。
また、ベロシティを計測することでチームがどのくらいの作業をいつまでにできるかを可視化することにコストを払うこともあります。

Q. マネージャがアジャイル開発が出来るって言ってました。スクラムマスタが進捗管理をすると言っていました。
A. 十分な知識を得ずにアジャイル開発をしている人は大抵アジャイル出来ていません。アジャイル開発宣言では手法は書かれていません。
手法はスクラム開発やXP開発などになります。この名前が出てこない場合はニワカなアジャイル開発チームである可能性が高いです。
アジャイル開発導入は正しい観点を持って実行しなければ、ただの場当たり開発になっているだけで、アジャイルな状態にはならないことが多いでしょう。
"場当たり開発"と聞いてうまくいくと思うでしょうか？ いいえ、失敗は約束されたようなものです。
"場当たり開発"と"アジャイル開発"の違いがちゃんと分かるようになってからチームに導入しましょう。
しっかりと知識を得て、チームの状態に合わせたプラクティス選んでから実行しましょう。

Q. アジャイルだから仕様はいつ変えてもいいよね？
A. はい。いつ変えても大丈夫です。ただし、そのコストは掛かります。
コストを考えながら設計を行うことは当たり前です。何を目指すべきかを最初に想定して最低限変化に強いアーキテクチャでシステムを作るところからアジャイルは始まっています。
変化に強いソフトウェア、CI、CDなども含めた開発環境もアジャイルの一部です。
ここも場当たりにならずに、アーキテクチャの変更は大きなコストを払うことになるため、しっかり設計してから実装を行う必要があります。
つまり、仕様の洗い出しは出来る限り最初に行うべきです。ただし、ウォーターフォールのように全ての機能の仕様が出来るまで開発をしないというわけではないです。
開発する機能に関わる部分の見通しが立ち、チームで合意が取れれば、その最小機能は実装を初めて構わないです。
このチケットサイズの運用こそ、アジャイル開発を上手く行かせるためのポイントの１つでしょう。

Q. アジャイル開発をするとモチベーションが上がる？
A. ウォーターフォールも正しく行えば素晴らしい開発手法です。
何が良くて、何が苦手なのか。特にSIのシステム開発では納品機能とスケジュールが契約によって縛られているため
アジャイル開発との相性はあまり良くありません。
どのような契約形態でユーザ企業とSI企業が契約するのかというところから、すでに十分なアジャイル開発の活用が出来るかどうかが始まっています。
ユーザ企業の中のシステム開発部門、もしくはWebサービス開発そのものがコア事業となっている会社の場合はアジャイル開発は合致するでしょう。
アジャイル開発は価値に焦点をおいた手法です。契約に焦点を置かれた状況ではウォーターフォールがマッチするケースは多いです。

# 勘違いアジャイルとは？

ものすごくシンプルに知識不足のケースが多いと思います。
適当に始めるのではなく、まずは勉強するところから始めてみましょう。
少なくとも３冊くらいアジャイル関連の本を読んでからが良いかなと思います。

少しだけおすすめする本を載せておきます。

アジャイルサムライ−達人開発者への道− http://amzn.to/2volRcv
おすすめ理由: アジャイル開発の基本的な考え方を全体的に簡単な言葉でまとめてくれていて読みやすい。

アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~
http://amzn.to/2vdKY1v
おすすめ理由: 見積もりとはどういうものなのか、生き物のように動く見積もりをどのように管理するのかがとても良い

スクラム　仕事が４倍速くなる“世界標準”のチーム戦術
http://amzn.to/2vdNnck
おすすめ理由: スクラムという手法についてと、それをベースとしたプラスアルファの観点

アート・オブ・アジャイル デベロップメント ―組織を成功に導くエクストリームプログラミング
http://amzn.to/2w1tGlC
おすすめ理由: XPという手法について


他にも色々良い本があると思うので、おすすめがあったらコメントで頂けると嬉しいです！
Tangoアプリの対応端末を絞る

Tangoアプリをリリースするときに対応端末をTango搭載端末のみに設定しておかないとTango対応端末でなくてもインストールできる状態になってしまいます。(もちろん正常に動作しない)
今のGoogle Play Consoleはリリースフローで対応端末の確認が入らないため忘れがちです。

## 対応端末設定方法
[公式のドキュメント](https://developers.google.com/tango/overview/android-tips)にもある通りAssets/Plugins/Android/AndroidManifest.xmlで次のように設定できます。

```
<application
...>
    ...
    <uses-library android:name="com.projecttango.libtango_device2" android:required="true" />
</application>
```
All About ACS: IBM i Access Client Solutions - IBM i へのサインオンを自動化する

# ACS の利用時に IBM i へのサインオンを自動化する

ACS の利用時に IBM i へのサインオンが求められます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/ab54670f-b0f9-ff1c-8df0-870bb816c235.png)

Access for Windows の場合は「cwBlogon.exe」で回避していたやつですね。
ACS では二つの方法方で

## デフォルトユーザー名の使用を選択
サインオンを自動化したいシステムに対して「システム構成」の「接続」タブでデフォルトユーザー名の指定を選択しユーザー名を指定しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/c14f9dd4-f767-aa2f-a3fe-55a5b10a83b0.png)

## netrc ファイルの使用
一つ目は netrc ファイルを使う方法です。
netrc ファイルに、システム名・ユーザー名・パスワードを記述します。
システム名と「デフォルト・ユーザー名」が netrc ファイルの内容と一致している場合、ユーザーにプロンプトを出さずに、netrc ファイルからのパスワードを使用してシステムへの接続が行われます。 

ACSのメイン画面から「編集」→「設定」を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/8d719e3d-09d9-bcf4-fd66-b2ad1f592fd2.png)

「netrc ファイルを読み取ってログオン情報を取得する」にチェックし、保管し ACS を再始動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184930/cceb2746-b5bf-6264-f95d-241902da8b2b.png)

ユーザーのホーム・ディレクトリーに、下記の名前でファイルを作ります。

.netrc  (Linux および Mac)
_netrc ファイル (Windows) 

例えば、Windows でユーザー名が User01 の場合「C:\Users\User01\\_netrc」というファイル名になります。

内容の形式は下記のとおりです。
```
machine <system> login <user-id> password <password>
```

例えばシステム「ibmi730」に対するデフォルトユーザー名が「user01」で、そのパスワードが「passw0rd」の場合下記になります。
対象システムが複数あれば、別の行に記述します。

```
machine ibmi730 login user01 password passw0rd
```

これで、起動時に「netrc ファイルを読み取ってログオン情報を取得する」にチェックされている状態で起動した ACS は IBM i へのサインオンが必要になったら netrc ファイルがホームディレクトリーにあるがチェックし、システム名・デフォルトユーザー名が一致すれば、ファイル内のパスワードで自動サインオンを試みます。

## Logon PLUGIN の使用
ACS には 特定の機能を直接呼び出したりバッチでできるようにする PLUGIN の機能があります。

起動プログラムに、下記のオプションを指定します。

```
/PLUGIN=logon /SYSTEM=<system> [/USERID=<userid>] [/PASSWORD=password>] [/AUTH] [/C] [/GUI=<1|0>]
```

起動プログラムは「Start_Programs\Windows_x86-64\acslaunch_win-64.exe」だったり「java -jar acsbundle.jar」だったりします。


例えば、今回の例で32 ビット Java を利用している場合、下記のようになりますので、PC へのログイン時に自動実行します。

```
Start_Programs\Windows_i386-32\acslaunch_win-32 /PLUGIN=logon /SYSTEM=ibmi730 /USERID=user01 /PASSWORD=passw0rd

```

細かなオプションは下記のとおりです。


> /SYSTEM   - システムの名前
> /USERID   - ユーザー ID
> /PASSWORD - ユーザー ID に関連付けられたパスワード
> /AUTH     - 指定されたログオン資格情報を使用してシステムへの接続を試行し、            成功時にのみキャッシュに入れます
> /C        - キャッシュをクリアします
> /GUI      - グラフィカル・ユーザー・インターフェースを使用できるかどうか

デフォルトでは、実行時に IBM i への接続・パスワードの検証を行わないでキャッシュしてしまうことに注意してください。
これは、PC へのログイン時などプラグインの利用時に IBM i へ接続できないことがある場合への配慮です。例えば、出先でPCを使うため Windows へログイン時は、IBM i につなげないケースです。プラグインの実行は  Windows へログイン時に行いたいが、接続・パスワードのチェックまですると、エラーになってしまいます。そのためその時点では接続やチェックは行いません。その後、帰社したり VPN で社内 LAN に接続し IBM i を利用するときに、キャッシュされたパスワードが初めて使われます。
即時に接続・チェックを行いたければ「/AUTH」を追加指定します。

## 自動ログオンがうまくいかない時
システムの名前が ACS に登録されているものと同じか確認します。
同じ接続先であっても、ACS は単に登録名で確認します。
同じIPアドレスを示すものでも「ibmi730」「ibmi730.example.com」「192.128.0.101」は ACS にとって異なるシステムです。

また、パスワード設定にデフォルトユーザー名が設定されていること、自動ログオンのユーザーとして、同一のデフォルトユーザー名が指定されていることを確認します。

***
2019-06-27 本文中、Windows の _netrc の場所が正しく表示されていなかったのを修正しました。
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***
Windows環境でAndroidのDataBindingを使ってる時にMalformedByteSequenceExceptionが出た時の対処方法

Windows環境でAndroidのDataBindingを使ってると以下のようなエラーが出ることがある。

```
Error:com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3バイトのUTF-8シーケンスのバイト3が無効です
```

これはレイアウトXMLで直接日本語を使ってるいると起きる。
例えばこんな感じの記述

```xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="hogeFlag"
            type="Boolean"/>
    </data>

....

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        text="@{hogeFlag ? `だめな日本語` : `foo`}"/>

</layout>
```

こういう時は素直にstringリソースを使うようにすれば正しく動く

```xml
<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        text="@{hogeFlag ? @string/hoge : @string/foo}"/>
```

一時的なものとして入れてたら思わぬ問題が起きてしまった。
ターミナルで今起動している画面のActivityやFragment名を確認するコマンドメモ

#はじめに
Andoird開発をしていてプロジェクトが大きい場合に、この画面どこのクラスなんだろうと思う時が多々ありまして先輩に教えていただいたやり方をメモとして残しておこうと思いました。
今回はメモ用なので大したことは書いていません。


#いま起動している画面のActivity名がわからないとき
ターミナルで
`$ adb shell dumpsys activity top`

これでActivity名が表示される

#いま起動している画面のFragment名がわからないとき
ターミナルで
`$ adb shell dumpsys activity top | grep 'Added Fragments' -A 10`

これでフラグメント名が表示される


#さいごに
アプリの改修の際にとっても助かります。
AndroidStudioを使っているのですがAndroid device monitorも重宝しています。
Burp Suite (Free Edition) でcookieやrequest値を確認

## 参考

* [SSTなるほど！コーナー 01 HTTP通信の中身を覗いてみよう！Burp Suite Free Edition 1.6編【前編】 | SST 株式会社セキュアスカイ・テクノロジー](https://www.securesky-tech.com/column/naruhodo/01.html)

## 準備

https://portswigger.net/burp/freedownload からダウンロード

![Screenshot_2017-08-01_16-54-00.png](https://qiita-image-store.s3.amazonaws.com/0/25728/02180411-297a-1453-02bb-4fdd3d3a1332.png)

```bash:起動
sudo apt install -y default-jdk-headless

java -jar burpsuite_free_v1.7.24.jar
```

![Screenshot_2017-08-01_16-53-08.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a7aaafcc-c982-034a-c3e6-ab9e2f722946.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c1ca142c-0b38-37d6-bd06-9ee3920d0874.png)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/05bf46ac-c244-88a6-0315-f0ecc9a9347e.png)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/05d66f3f-81d1-a0b5-2748-e430276858f7.png)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/67f61877-29c1-5b7c-a01a-786034f93a90.png)

## 接続準備

* proxy -> option -> 127.0.0.1:8080 にチェックがついていることを確認。

![Screenshot_2017-08-01_16-57-27.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b369315b-0350-feb6-686c-4222a3b87894.png)

* Proxy設定を行う。Firefoxだと [Proxy Switcher :: Add-ons for Firefox](https://addons.mozilla.org/en-US/firefox/addon/proxy-switcher/)

![proxy.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/955cdf5e-68d8-96bc-159a-089578b6e46d.jpeg)


## 接続

* proxy -> Intercept -> intercept is off
* proxy -> Intercept -> intercept is on

を押してブラウザで動作確認。
Pixi.jsわすれたときようまとめ


Pixi.jsをやっているときに調べたことなど。
環境
v4.5.0

# hello pixi.js

http://pixijs.github.io/examples/#/basics/basic.js

とりあえずここからはじめた。

# ベースクラス
ベースクラスをつくった。
諸事情によりTypeScript
よく使う関数とかはここにまとめておいて使うとべんりかなと思ったので。

```PixiBase.ts
import * as PIXI from 'pixi.js';

export class PixiBase{
  protected app: PIXI.Application;
  protected loader: PIXI.loaders.Loader;
  protected window: {w:number, h: number};


  constructor(w: number, h: number, opt:PIXI.IApplicationOptions, parentId:string){
    this.app = new PIXI.Application(w, h, opt);

    const elem:HTMLElement = document.getElementById(parentId);
    elem.appendChild(this.app.view);
    console.log("base");

    this.window = {w: w, h: h};

    this.loader = new PIXI.loaders.Loader();

    this.app.ticker.add(()=> {

        this.animate();
    });
  }

  protected setSpirte(sprite:PIXI.Sprite, x:number, y:number): void{
    sprite.anchor.set(0.5);
    sprite.x = x;
    sprite.y = y;
    this.app.stage.addChild(sprite);
  }

  protected animate():void{

  }


}
```

# shaderのuniformわたすやつ

基本これ
http://pixijs.github.io/examples/#/basics/custom-filter.js

onLoadedShaderのなかをこう。

```test.ts
let uniforms = {
  "time": {type: "f1", value: 0.0},
  "resolution" : {type: "v2"}
}

this.filter = new PIXI.Filter(null, res.strip.data, uniforms);

this.text.filters = [this.filter];
```

新しく渡す時

```js
this.text.filters[0].uniforms.time = this.time
```
こんなかんじで。

指定できるタイプ
https://github.com/pixijs/pixi.js/issues/2570
で書いてあった、
https://github.com/pixijs/pixi.js/blob/364c2457c6693d6e3ab68786539c53d566503e7b/src/core/renderers/webgl/shaders/Shader.js#L232-L463
見ればいけそうだけど、これいつのcommitなんだろう。。

# texcoord問題

別記事にまとめた
http://qiita.com/sa-k0/items/015937db7c9dfb43465f

# 画像に保存したい時

pixiというよりはcanvasだけど

```js
$('#result-canvas').on('click', ()=>{
  var canvas:HTMLCanvasElement = <HTMLCanvasElement>document.getElementById('canvas');

  var img = new Image();
  var type = 'image/png';
  img.src = canvas.toDataURL(type);
  img.onload = function(){
    window.location.href = img.src;
  };
});
```

PIXI独自の注意点としてoptionの
preserveDrawingBufferはtrueに設定しておく。
http://www.html5gamedevs.com/topic/17141-saving-pixi-to-image-using-todataurl-get-black-rectangle/
Pixi.jsのCustomFilterでシェーダーのtexcoordずれてた問題


環境
v4.5.0

# トラブル
pixi.jsのCustomFilterを利用して、フラグメントシェーダを利用しようとしたところ、
なんかvTextureCoordの値がずれてる気がする。

やろうとしたこと：
PIXI.GraphicsにCustomFilterかけてフラグメントシェーダだけで描画。

PIXI.SpriteにCustomFilterだと、vTextureCoordずれてなかった。

pixi始めて、すぐにぶつかったので原因はいまいちわかっていない、
そんなに情報ないので自分が変なことをしている、特殊なケースなのかもしれない。

```js
void main(void)
{

  vec2 uv = vTextureCoord.xy;
  
  if(uv.x > 0.5){
    gl_FragColor = vec4(1., 1., 0., 1.);
  }else{
    gl_FragColor = vec4(1., 0., 0., 1.);
  }

}
```

上記で試すとやっぱり0.5の位置がおかしい。


# 解決策

この辺見ながら対策したけどいまいちピンときていない。

https://github.com/pixijs/pixi.js/issues/2572
http://www.html5gamedevs.com/topic/23790-uv-in-filters/
http://www.html5gamedevs.com/topic/24347-weird-filterareas-size-on-v4/

```js
MyFilter = function(filterManager, input, output, clear){
    this.uniforms.mappedMatrix = filterManager.calculateNormalizedScreenSpaceMatrix(matrix);
    PIXI.Filter.apply.call(this, filterManager, input, output, clear);
}
```

js側は上記がキモ

```glsl
uniform mat3 mappedMatrix;
void main(void)
{
  vec3 map = vec3( vTextureCoord.xy,1)*mappedMatrix;
}
```
シェーダー側はmapをxyつかったら正常な値でましたよー。

http://pixijs.github.io/examples/#/basics/custom-filter.js
このExampleベースでつくってたので、自分はひとまず、

```hoge.js
~

function onLoaded (loader,res) {
	let uniform = {type: "mat3", value: new PIXI.Matrix()};

    filter = new PIXI.Filter(null, res.shader.data, { "mappedMatrix": uniform });

    // Add the filter
    background.filters = [filter];
    background.filters[0].apply = function(filterManager, input, output, clear) {
      this.uniforms.mappedMatrix = filterManager.calculateNormalizedScreenSpaceMatrix(this.uniforms.mappedMatrix);
      PIXI.Filter.prototype.apply.call(this, filterManager, input, output, clear);
    }

    // Resume application update
    app.start();
}
```

こんな感じにした。
(使ってるコードから適当に抜粋したのでこれで動くかは、わからない。)
文章を書くための覚書。

# まずは以下３つを意識する。

- 目的…何のために？
- 対象…誰のために？
- 必須要素…何を伝えたい？

例)要件定義書
- 目的…システム開発の妥当性を判断する。システム化の前に業務を分析・整理する。
- 対象…ベンダー、システム部門、業務部門
- 必須要素…現状を把握するためのAs-Is、今後どうしていくか検討するためのTo-Be　など…

対象が複数いる場合が多いですが、ステークホルダー・中心人物を意識すると良いと思います。

# 情報収集

- 情報を収集する。
- 収集した情報の取捨選択をする。
- 取捨選択した情報のグルーピングをする。
- グルーピングした情報を文章にするべく組み立てる。

「誰のため？」「何のため？」を常に意識し、情報を収集すること。

# 情報の表現
- 5W1Hを意識して、伝えるべき情報が盛り込まれているか確認。
- 読み手の前提知識を意識し、正しく情報が伝わるように配慮。
- 図は導線や余白に注意。色に意味を持たせることも重要。
- 表は分類する項目を縦軸と横軸のどちらにするか見極める
- グラフで提示した数値から何を伝えたいかは文章でまとめる

「誰のため？」ということを意識し、同じ内容でも文章の表現を変える。
相手が専門家であれば、専門用語を使った方がわかりやすいだろうし、エンドユーザなら噛み砕いた表現の方がわかりやすいでしょう。

# レビュー

- 対象者の立場になって読み直す
- 文章を確認する。
- 体裁を確認する。

ドキュメントの質の向上は作業の信憑性・信頼性の向上につながります。
レビュー時にはチェックリストを利用し、モレなく効率的に実施することも大切です。
また、指摘するときには必ず「どうしてダメなのか」という理由も伝えましょう。
[iOS] 文字列の適正な高さを求める方法

テーブルビューのセルの中に更にテーブルビューを入れ子でいれた時、入れ子で入れたテーブルビューの各セルの高さが動的に変わらなかったので、以下のように各要素毎に高さを求めました。

``` CalculateHeightOfString.swift
let string = "何かしらの文字列"
let maxSize = CGSize(width: UIScreen.main.bounds.width, height: 5000) // 幅は適正な値、高さは多めの数値を指定
let font = UIFont.systemFont(ofSize: 18) // フォントのサイズによって高さが変わるので実際のサイズを指定
let size = (string as NSString).boundingRect(with: maxSize, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSFontAttributeName: font], context: nil).size
```
Jestでaliasなパスでmoduleをimportできるように

## 問題

`Webpack.resolve.alias`や`tsconfig`の`paths`なんかでエイリアスを設定していて、そのソースをJestでテストしようとすると、Jestにそんなモジュールないよと怒られてしまいます。なので、Jestでもエイリアス設定するやり方。

> - [webpack.resolve.aliasを設定しているプロジェクトでの.flowconfig設定](http://qiita.com/nju33/items/720e5cca222c8ab3dd4f)
> - [TypeScriptでaliasなパスでmoduleをimportできるように](http://qiita.com/nju33/items/cf924f7b6bb513bef8a2)

## 設定

`package.json`の`jest.moduleNameMapper`を設定します。

> Jest - [moduleNameMapper](http://facebook.github.io/jest/docs/en/configuration.html#modulenamemapper-object-string-string)

```json:package.json
{
  "jest": {
    "moduleNameMapper": {
      "^components/(.+)": "<rootDir>/src/components/$1"
    }
  }
}
```

キーが正規表現、右がエイリアス。jsの`replace`みたいな感じですね。

```js
"components/button".replace(new RegExp("^components/(.+)"), "<rootDir>/src/components/$1")
// <rootDir>/src/components/button
```

### `<rootDir>`

これは現在ディレクトリに`package.json`があるなら現在のディレクトリないなら`process.cwd()`のパスが入ります。
ORA-12154: TNS: 指定された接続識別子を解決できませんでした (TNS-12154)

ORA-12154(TNS-12154)エラーとはどのようなエラーか？

ORA-12154エラーは、tnsnames.ora構成ファイルに指定されたネット・サービス名を検出できないことを示すエラーです。
一般的に、接続の際に使用した接続文字列が、tnsnames.ora から読み込めなかった場合に発生します。

ORA-12154エラーのエラー出力例

    ERROR:
    ORA-12154: TNS: 指定された接続識別子を解決できませんでした
ORA-12154の一般的な発生要因と対処

ORA-12154は一般に以下の要因で発生します。

tnsnames.oraの記載が正しくない
sqlnet.ora NAMES.DIRECTORY_PATH に TNSNAMES 以外のみが指定されている
sqlnet.oraに NAMES.DEFAULT_DOMAIN が設定されていた場合
tnsnames.oraの記載が正しくない
不正なコードが含まれている場合や記載ミスがある場合、接続文字列を認識できません。

sqlnet.ora NAMES.DIRECTORY_PATH に TNSNAMES 以外が指定されている
tnsnames.ora のみを使用して名前解決を行うように設定するには sqlnet.ora に以下のように記述します。

NAMES.DIRECTORY_PATH= (TNSNAMES)
sqlnet.oraに NAMES.DEFAULT_DOMAIN が設定されていた場合
NAMES.DEFAULT_DOMAIN = world と設定されている状態で、接続文字列 ORA001 と入力した場合、この接続文字列は自動的に ORA001.world と変換されます。この動作が、想定したものでない場合、ネット・サービス名を検出できず、ORA-12154エラーが発生する可能性があります。
以下のいずれかの対処を行ってください。

NAMES.DEFAULT_DOMAIN をコメントアウトする
tnsnames.ora の接続文字列にNAMES.DEFAULT_DOMAIN の値をドメイン名として付加する
キーワード

ORA-12154 TNS-12154 接続識別子 tnsnames.ora