OmniAICreator/Qiita-1.07M huggingface dataset:
gitでリモートのマージ済みブランチの最終コミッタを表示させる

## 背景
チームでマージ済みのブランチは削除するというルールがあるんですが、どうも守られていないようで、リモートブランチの数が増えていきました。
BitbucketのGUIではブランチの最終コミッタが表示されないので、ひと目で削除されていないマージ済みのブランチの最終コミッタを見分けたいと思い、gitコマンドでどうにかならないか、調査しました。

## スクリプト
```bash
for branch in `git branch -a --merged | grep -v master | grep -v develop | grep remotes/origin`
do 
    echo -e `git show --format="%ai %ar by %an" $branch | head -n 1` \\t$branch;
done | sort -r
```

ワンライナーで書くとこうなります。

```bash
$ for branch in `git branch -a --merged | grep -v master | grep -v develop | grep remotes/origin`; do echo -e `git show --format="%ai %ar by %an" $branch | head -n 1` \\t$branch; done | sort -r
```

## 注意
事前に`git fetch --prune`でリモートの削除済みブランチの追跡を切っておかないと、削除済みのブランチまで表示されるので、注意してください。
Xcodeのアップデートを「アプリケーションアップデートをインストール」でインストールするとハングアップする（調査中）

# 現象
Xcodeのアップデートが来たとき、「アップデートを自動的に確認」→「アプリケーションアップデートをインストール」にチェックを入れて自動インストールしようとすると、毎回mdworkerが暴走する。

<img width="592" alt="スクリーンショット 2017-11-01 11.31.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/48a6143e-69a9-8fc8-ef9f-8001ee8c1683.png">

# 対策
暴走してしまったら、一度再起動してApp StoreのXcodeの画面からアップデートをクリックする（画像のインストール中のところに出るボタン）。

<img width="564" alt="スクリーンショット 2017-11-01 11.38.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/50592c4a-324a-9011-0a3b-170957f59159.png">

# 検証中
「アプリケーションアップデートをインストール」のチェックを外すとダウンロードだけされて、インストールは手動になるのでハングアップしないのではという仮説。
safeAreaLayoutGuideをiOS 10で使う（？）


# もちろんできません

safeAreaLayoutGuideはiOS 11+のみで使えるので、iOS 10等をサポートしているとエラーになります。

大抵の場合は、画面端からの代わりにsafeAreaを使って、iPhone Xでもレイアウト崩れないようにしたいと思います。

とはいえ、レイアウトごとに

```swift
if #available(iOS 11.0, *) {
    view.safeAreaLayoutGuide.leftAnchor
} else {
    view.leftAnchor
}
```

みたいにするのは冗長です。

これを同じように扱えればよいわけです。

# 第一案

### 結果

UIViewのAnchorを、UILayoutGuideとして取り出すことで対応しました。

```swift
let safeAreaLayoutGuide = view.safeLayoutGuideOrSelfLayoutGuide()
```

これでiOS 11以上ならsafeAreaLayoutGuideが、iOS 10以下では自分自身のLayoutGuideが返されます。

### 実装

まず、leftAnchorなどはUIViewのプロパティなので、ProxyするクラスをUILayoutGuideを継承して作ります

```swift
private final class UIViewLayoutGuideProxy: UILayoutGuide {
    
    private unowned var _base: UIView
    
    override var leftAnchor: NSLayoutXAxisAnchor {
        return _base.leftAnchor
    }
    
}
```

そして、このiOS 10以下ではこのProxyを返すようなメソッドを生やせば完了です。

```swift
extension UIView {
    func safeLayoutGuideOrSelfLayoutGuide() -> UILayoutGuide {
        if #available(iOS 11.0, *) {
            return self.safeAreaLayoutGuide
        } else {
            return UIViewLayoutGuideProxy(self)
        }
    }
}
```


### Gist

以下でソースを公開しています（案1の方）

https://gist.github.com/ha1f/884ce4870dc395639e86c4395f5ea947

# 第二案

```swift
extension UIView {
    var safeLeftAnchor: NSLayoutXAxisAnchor {
        if #available(iOS 11.0, *) {
            return self.safeAreaLayoutGuide
        } else {
            return self.leftAnchor
        }
    }
}
```

みたいなのも考えましたが、せっかく `.leftAnchor` の名前はUIViewでもUILayoutGuideでも揃っているので、崩したくないなと思いました。
が、以下のようにviewがdeinitされた後に呼ばれる可能性がなくなるので、こっちのほうがいいかもしれません、、、（今更）

```swift
let tmp = view.safeLayoutGuideOrSelfLayoutGuide()
// viewがdeinitされた後に呼ぶと_baseがnilで落ちる
print(tmp.leftAnchor)
```

案2として同じGistの下側にあります！

# 第三案

Rxみたいにしてみた。これが一番いいかも

https://gist.github.com/ha1f/457b8427da3e37d5c72dcc61465b9f17


```swift
view.safeAreaLayoutGuideCompatible.leftAnchor
```

という感じ
API Gateway & Lambda Function(Python)でカスタムエラーのレスポンスを返す

AWS Lambda(Python)で独自例外を投げて、API Gatewayを通じてレスポンスを返すまでの設定メモです。

## 背景

Lambda処理内で例外がライズされると、Lambdaはスタックトレース等諸々を一つのJSONにシリアライズしてレスポンスとして返します。  
だけど、実際の運用上はスタックトレースは返さず、かつ独自のフォーマットでレスポンスを返したいケースが主だと思います。  
ここの設定に微妙に時間を取られてしまったのでメモとして残しておきます。

## Lamda Functinon

先ずはLambdaFunction側で関数を定義します。  
仮にHTTPステータスの500番を返したいとします。

### コード

強制的に例外を投げる実装です。  
カスタム例外クラスの中で`__str__`関数をオーバーライドし、JSON文字列として返す実装にします。

```python
# -*- coding: utf-8 -*-
import json


class MyException(Exception):
    def __init__(self, code, messages):
        self.code = code
        self.messages = messages

    def __str__(self):
        exobj = {
            'error': {
                'code': self.code,
                'messages': self.messages
            }
        }
        return json.dumps(exobj)


def lambda_handler(event, context):
    raise MyException(
        500,
        [
            {'message': 'hoge'},
            {'message': 'fuga'},
            {'message': 'piyo'}
        ]
    )
```

### Lambda Function実行時

Lambdaのコンソール上でテスト実行してみます。  
`__str__`関数で文字列化した内容が`errorMessage`要素に出力されています。  

この時点ではスタックトレース等余計な情報が含まれています。

![Lambda](https://www.evernote.com/l/AE075WpS2i9JtYP5vCj61NLpgPSdlJFKwSMB/image.png 'Lambda')

## API Gateway

続いて、API Gatewayの設定に移ります。  
通常どおりにリソース・メソッドを作成し、バックエンド処理に先程のLambdaを指定します。

### 単純にAPI作っただけ

この時点ではLambdaから返されたレスポンスがそのままクライアントに帰ることになります。  
HTTPステータスも200番が返っています。

![ApiGateway-default](https://www.evernote.com/l/AE3E5YO5sqVD_7r6wpNlDAwrQbpxwusOVqwB/image.png 'ApiGateway-default')

### メソッドレスポンスと統合レスポンスを設定する

API GatewayはデフォルトではLambdaの処理の成否に関係なく200番でレスポンスを返します。  
正しくステータスを返すようにメソッドレスポンスと統合レスポンスの設定を行います。

#### メソッドレスポンス

HTTPスタータスの500番を追加します。

![Response-1](https://www.evernote.com/l/AE2t1rG0s8ZJZLmn-foNYL06G2y9FdDXueIB/image.png, 'Response-1')

#### 統合レスポンス

各HTTPステータスの紐付けと、マッピングテンプレートの設定を行います。

- 「Lambda エラーの正規表現」では、Lambdaレスポンスの`errorMessage`属性に出力したエラーコード(`code`)にマッチする指定を行います。
- 「マッピングテンプレート」では、Lambdaレスポンスの`errorMessage`だけ抜き出してマッピングする指定を行います。

![Response-2](https://www.evernote.com/l/AE2cxNM_VlZNVrpN5x-pxFm-JK9vJNgGmKMB/image.png, 'Response-2')

### 再度APIのレスポンスを確認する

独自のエラーレスポンスが返る様になりました。  
余計な情報も出力されていませんし、HTTPステータスも500番台で返っています。

![Response-3](https://www.evernote.com/l/AE0PJsVWGOBOKLXISmZHIPxN-n8K66eEbv4B/image.png, 'Response-3')

おわり。
laravel55 + Polymer環境構築

## laravel55 + Polymer環境構築

PolymerをBowerを使ってインストールするために、`.bowerrc`ファイルをプロジェクトルートに作成します。

```
{
  "directory": "resources/assets/bower_components",
  "json": "bower.json"
}
```

`bower init`を実行して、`bower.json`を作ります。

```
$ bower init
```

`bower install`を実行して、Polymerをインストールします。

```
$ bower install --save Polymer/polymer 
```

`Laravel mix`より、publicディレクトリに`bower_components`ディレクトリがコピーされるように修正します。[参考](https://readouble.com/laravel/5.5/ja/mix.html)
`Laravel mix`の設定は、`webpack.mix.js`に追記します

```
...

mix.js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css')
   .copyDirectory('resources/assets/bower_components', 'public/bower_components');

...

```

`index.blade.php`などのHTMLのheaderにwebcomponentsのポリフィルと、Polymerを読み込みます。

```
...
    <script src="/bower_components/webcomponentsjs/webcomponents-loader.js"></script>
    <link rel="import" href="/bower_components/polymer/polymer.html">
...
```
ヒアドキュメントを折りたたむ


NetbeansでPHPコーディング。
ヒアドキュメントを書くときに折りたたみ対応させたい。
プラグインとかあるかもしれないけど、とりあえず以下の書き方でやってみた。

```
	if(1||$text=""){$text=<<<EOS
Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua.
Ut enim ad minim veniam
EOS;
}
```

他にいいやり方あれば教えて下さい。
2台のWEBカメラをUnityで使用する - USBデバイス名の変更

# レジストリからドライバの名前を変更する必要がある
Unity (2017.1)では2台の同じカメラを接続し、動作することはできない。    
これを動作するために、カメラのUSBドライバのFriendlyNameを書き換える必要がある。
※カメラデバイスのFriendlyNamdeではなくUSB側のFriendlyNamdeであることに注意。

# USBのIDを調べる
デバイスマネージャーを開き、USBの項目にWebCaneraを接続したときに増えているデバイスを調べる。
同じ名前が複数ある場合、「場所」に記載されている内容で判別が可能。

![2017-05-18_160956.png](https://qiita-image-store.s3.amazonaws.com/0/163818/f2ca693b-1a00-adec-3474-e9a4ad5f3601.png)
デバイスが判明したら、"詳細"のプロパティを"ハードウェアID"にした時の値と
"デバイス インスタンスパス"にした時の値を調べる。

![2017-05-18_161150.png](https://qiita-image-store.s3.amazonaws.com/0/163818/fdf9c093-e549-9f3b-129f-29d6e06973a8.png)]

![2017-05-18_161205.png](https://qiita-image-store.s3.amazonaws.com/0/163818/fb3d3a23-3eea-0222-6eb1-bc22d74540a2.png)


# 表示名の書き換え
regeditを起動し、"\\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"以下から調べた名前のディレクトリを探す。   

![2017-05-18_161257.png](https://qiita-image-store.s3.amazonaws.com/0/163818/643e029e-5e94-1573-12ff-8d5135ceb36b.png)

ディレクトリ内に"FriendryName"ファイルがない場合は"新規"→"文字列値(S)"を選択し、作成する。    
FriendlyNameの値を表示させたい任意の名前に変更する。    

![2017-05-18_161311.png](https://qiita-image-store.s3.amazonaws.com/0/163818/7474cff6-d862-48ec-35be-3f748e9db961.png)

変更できない場合はフォルダを右クリック→アクセス許可から、フルコントロールの権限を与える。

![2017-05-18_162648.png](https://qiita-image-store.s3.amazonaws.com/0/163818/145a9ea5-b2fc-14ec-47a8-e5aa2d392a10.png)
Antで@を連続して書く方法

# 現象
ftpからscpに書き換えるときに困ったことが起きました。
for文にてパラメータを指定する場合は@{param名}となるのですが、scpにてhostを指定する場合にも@が必要になります。
単純に@@と書くと1つの@が認識されずエラーになってしまいました。
# 解決方法
@を3つ書けば動きました。
## ftp

```xml
    <target name="TEST-hoge" description="Test" depends="Test-hoge">
        <for list="${deploy.hosts}" param="deploy.host">
            <sequential>
                <ftp server="@{deploy.host}" userid="${user.id}" password="${password}" remotedir="${home}" verbose="yes">
                    <fileset refid="xxx_transfer" />
                </ftp>
            </sequential>
        </for>
    </target>
```
## scp

```xml
    <target name="TEST-hoge" description="Test" depends="Test-hoge">
        <for list="${deploy.hosts}" param="deploy.host">
            <sequential>
                <scp todir="${user.id}@@@{deploy.host}:${home}" password="${password}" trust="yes">
                    <fileset refid="xxx_transfer" />
                </scp>
            </sequential>
        </for>
    </target>
```
# 補足説明
host名をパラメータにしたことで@が認識されなくて困ったというお話でした。
deploy先のサーバが複数あったためfor文を使いました。すっきり書けますね。
またサーバの増減があったときも設定ファイルを修正するだけでよくなります。
以下にfor文とscpの説明をかんたんに書いておきます。
## for文の書き方
みたままですが、paramを使う場合は@{param名}で値を取ることができます。
(以下はあまり意味のないタスクとなってます)

```xml
    <target name="TEST-hoge" description="Test" depends="Test-hoge">
        <for list="${deploy.hosts}" param="deploy.host">
            <sequential>
                <param name="host" value="@{deploy.host}" />
            </sequential>
        </for>
    </target>
```
## scpの書き方
todirには「ユーザ名@ホスト名:ディレクトリ」のフォーマットで書きます。

```xml
    <target name="TEST-hoge" description="Test" depends="Test-hoge">
        <scp todir="${user.id}@${host1}:${home}" password="${password}" trust="yes">
            <fileset refid="xxx_transfer" />
        </scp>
    </target>
```
Build SRPM


# AmazonLinux

## Get SRPM

See http://ec2-downloads.s3.amazonaws.com/AmazonLinuxAMIUserGuide.pdf

e.g. 
`get_reference_source -p php70-common`

> on EC2 only

## Build on amzn docker-image

`doker run -it amazonlinux` 

1) install build-tools 
`yum install rpmdevtools yum-utils`

2) `rpmdev-setuptree`

3) install dep-pkgs to build
`yum-builddep [path-to .spec]`

4) build
`rpmbuild -ba [path-to .spec]`

or 

binary only
`rpmbuild -bb [path-to .spec]`
angular ChartModule でハマったこと

# ハマったこと
 -`ng serve`でエラーが出ないのに、AoTビルド(`ng build --aot`)だとエラーになる

# 問題コード
```ts
@NgModule({
  imports: [
    ChartModule.forRoot(
      require('highcharts'),
      require('highcharts/highcharts-3d'),
      require('highcharts/highcharts-more')
    )
  ]
})
export class AppModule {
}
```

# 修正内容
```ts
export function highchartsFactory() {
  const chart = require('highcharts');
  const d3 = require('highcharts/highcharts-3d');
  const more = require('highcharts/highcharts-more');
  d3(chart);
  more(chart);

  return chart;
}

@NgModule({
  imports: [
    ChartModule
  ],
  providers: [
    {provide: HighchartsStatic, useFactory: highchartsFactory},
  ],
})
export class AppModule {
}
```
# 感想
 - よくわからんかったが、解決した。。。。難しい。。。。
【PostgreSQL】任意の文字列をTimestampやDateに変換する方法

###任意の文字列（'2000/01/01 20:15:00'）をTimestampに変換する方法

```sql:sql
TO_TIMESTAMP('2000/01/01 20:15:00', 'YYYY/MM/DD HH24:MI:SS')

```

###任意の文字列（'2000/01/01'）をDateに変換する方法

```sql:sql
TO_DATE('2000/01/01', 'YYYY/MM/DD')

```
C言語、C++言語で型のサイズを確認する方法

# 背景

CやC++でFPGAやハードウェアを制御する場合、まずは自分の環境でデータの型を確認した方が良い。そういう場合のちょっとしたコードです。

## サンプルコード

どこでもよいので、下記を挿入する。

```c: 
  double *dbl_pnt;
  int    *int_pnt;
  long    *long_pnt;
  long long  *longlong_pnt;
  printf("> Basic data type:\n");
  printf("  sizeof (char)     = %d\n", sizeof(char));
  printf("  sizeof (uchar)    = %d\n", sizeof(unsigned char));
  printf("  sizeof (short)    = %d\n", sizeof(short));
  printf("  sizeof (ushort)   = %d\n", sizeof(unsigned short));
  printf("  sizeof (int)      = %d\n", sizeof(int));
  printf("  sizeof (*int)     = %d\n", sizeof(int_pnt));
  printf("  sizeof (float)    = %d\n", sizeof(float));
  printf("  sizeof (double)   = %d\n", sizeof(double));
  printf("  sizeof (*double)  = %d\n", sizeof(dbl_pnt));

  printf("  sizeof (long)      = %d\n", sizeof(long));
  printf("  sizeof (*long)     = %d\n", sizeof(long_pnt));

  printf("  sizeof (long long )      = %d\n", sizeof(long long ));
  printf("  sizeof (*long long )     = %d\n", sizeof(longlong_pnt));
```

出力結果は、

```zsh
> Basic data type:
  sizeof (char)     = 1
  sizeof (uchar)    = 1
  sizeof (short)    = 2
  sizeof (ushort)   = 2
  sizeof (int)      = 4
  sizeof (*int)     = 8
  sizeof (float)    = 4
  sizeof (double)   = 8
  sizeof (*double)  = 8
  sizeof (long)      = 8
  sizeof (*long)     = 8
  sizeof (long long )      = 8
  sizeof (*long long )     = 8
```

上記の結果は、下記の環境で取得された。

``` zsh 
> gcc -v                                  
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
```

### 参考資料
- ３次元磁気流体シミュレーションコード [pluto](http://plutocode.ph.unito.it) の main.c
[Django]DjangoのテストをDEBUG=Trueで実行する

```python
from django.conf import settings

if not settings.DEBUG:
    raise ...

# テストしたい処理
```

デバッグ用の機能をテストしたいと思っていて試してたんだけど、どう頑張っても例外になってしまう。
そこで、よくよく調べると「Djangoのテストは、settings.pyの内容に関わらずDEBUG=Falseとして実行される」ということが判明した。

「開発環境ではDEBUG=Trueテストしたいのになー」と思って調べてたら、Django1.11から--debug-modeオプションが追加されたらしい。

```bash
python3 manage.py --debug-mode
```
【PostgreSQL】TimestampをDateに変換する

##変換方法

###CAST演算子で変換する方法（推奨）
```sql:sql
CAST(column1 AS DATE)
```
※column1はTimestamp型とします。

###TO_CHARでCHAR型に変換した後、TO_DATEでDATE型に変換する方法
```sql:sql
TO_DATE(TO_CHAR(column1, 'YYYY/MM/DD'),'YYYY/MM/DD')
```
※column1はTimestamp型とします。
IBM Cloud (aka Bluemix) ライト・アカウント作成手順

IBM Cloudのアカウント作成手順まとめ

この記事の短縮URLは http://ibm.biz/litecloud です。すべて小文字でお願いします。

IBM Cloudを無償で、期間の制限なく使えるライト・アカウントが導入されました。クラウドサービスでよくある事前のクレジットカード登録も不要で、すぐにアカウント登録が可能です。公式ご案内ページは[こちら](https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/)。
使用可能なサービスに制限はありますが本番環境としての使用もOKとのこと。実際にはリソースの制限もあるため、IBM Cloudで何が出来るかを理解するための評価・検証用としての使い方がメインになりそうです。

以下、アカウント作成までの手順をご紹介します。



## 1. Webブラウザで[IBM Cloudのポータル](https://bluemix.net)にアクセスします

https://bluemix.net で 「フリー・アカウントの作成」をクリック

![lite_acc01.png](https://qiita-image-store.s3.amazonaws.com/0/86120/55c43088-5af9-88e0-c7bb-75e3387cc838.png "lite_acc01.png")

## 2. 必要事項を入力します

IBM Cloudアカウントの作成画面でメールアドレス、名前、パスワードなどアカウント開設に必要な情報を入力します。これによりIBM IDの登録とIBM Cloudアカウントの作成が同時に行われます。

必要事項を入力し「アカウントの作成」をクリック

![lite_acc02.png](https://qiita-image-store.s3.amazonaws.com/0/86120/6ec58f57-f0b6-5bd4-9376-98a0c05c2dab.png "lite_acc02.png")

なお、IBM IDとはIBM Webサイトの各種サービスを利用するためのアカウントで、メールアドレス=IBM IDとなります。
既にIBM IDとして設定されているメールアドレスを指定した場合、名前などは登録済みなので、入力に必要な項目が最小限でIBM Cloudアカウントを作成できます。

***
ボット除けのreCAPTCHAの画面が表示されます。人間が操作していることを証明するため、指示に従って「確認」をクリック。
![lite_acc03.png](https://qiita-image-store.s3.amazonaws.com/0/86120/3f47f806-205a-6601-021c-2e3a1075cc09.png "lite_acc03.png")

***

情報が送信されました。
もう少しです。
![lite_acc04.png](https://qiita-image-store.s3.amazonaws.com/0/86120/a238cac9-5857-14b3-f61b-cf33c87e2342.png "lite_acc04.png")



## 3. メールが届くのでアカウントのactivationを行います
指定したアドレスに「Action required: Confirm your IBM Cloud account」というタイトルのメールが届きます。


本文中のリンク「Confirm account」をクリックします。

![lite_acc06.png](https://qiita-image-store.s3.amazonaws.com/0/86120/78af29ca-1a71-337e-3fb1-4d7396969b98.png "lite_acc06.png")


※発信元はno-reply@bluemix.netです。アドレス指定受信などメールの受信制限をされている方は事前に設定をしておきましょう。

***
「成功しました！」のメッセージが表示されればアカウント登録完了です。
「ログイン」をクリックします。
![lite_acc07.png](https://qiita-image-store.s3.amazonaws.com/0/86120/660d20e9-78ea-2228-0b31-2aef09d3eee3.png "lite_acc07.png")


## 4. IBM Cloudにログインします

IBM IDを利用したシングルサインオンのログイン画面が表示されます。ユーザーID（メールアドレス）とパスワードを入力してログインします。
![lite_acc08.png](https://qiita-image-store.s3.amazonaws.com/0/86120/1cf2a89d-fb6e-b958-dd14-e291f7b8c502.png "lite_acc08.png")


***

ログインが成功し、IBM Cloudのダッシュボード画面が表示されました。
 **これでアカウントの作成は完了です！**
従来よりも手順がシンプルになってますね :grinning: 

![lite_acc09.png](https://qiita-image-store.s3.amazonaws.com/0/86120/d46ed040-897f-2421-7281-f7d435d4aa5f.png "lite_acc09.png")


***
「オファリングの検討」をクリックすると、カタログ画面に遷移します。
ライト・アカウントで使用可能なアイテムが表示されているので、選択して「作成」ですぐにクラウド上に環境を作ることができます。

ライト・アカウントに対応したサービスは順次追加・拡張されるとのこと。早速このスクショの画像よりもサービスが増えています。今後も期待大ですね。

![lite_acc10.png](https://qiita-image-store.s3.amazonaws.com/0/86120/a494d67c-644b-65f1-1720-73a9e8ea037f.png "lite_acc10.png")


以上でIBM Cloudを使う準備は完了です。
それではBuilderとInnovatorのためのクラウド、IBM Cloudの世界を堪能してください:exclamation:
Zynq > PetaLinux > 2006年のsprintfのバグ調査 > "%+05.0f"に対する出力 > 問題ない

```txt:動作環境
CentOS 6.5
```

### リンク

https://bytes.com/topic/c/answers/525100-format-problem-sprintf

2006年の問題。Zynqの環境ではいかがか。


### code
https://bytes.com/topic/c/answers/525100-format-problem-sprintf

```myapp_171101.c
/*
 * Placeholder PetaLinux user application.
 *
 * Replace this with your application code
 */
#include <stdio.h>

void test_sprintf(void)
{
	char chData[6];

	sprintf(&chData[0], "%+05.0f", -0.038f);
	printf("%s\n", chData);
	sprintf(&chData[0], "%+05.0f", -0.380f);
	printf("%s\n", chData);
	sprintf(&chData[0], "%+05.0f", -3.800f);
	printf("%s\n", chData);
	sprintf(&chData[0], "%+05.0f", +0.038f);
	printf("%s\n", chData);
	sprintf(&chData[0], "%+05.0f", +0.380f);
	printf("%s\n", chData);
	sprintf(&chData[0], "%+05.0f", +3.800f);
	printf("%s\n", chData);
}

int main(int argc, char *argv[])
{
	// printf("Hello, PetaLinux World2!\n");
	// printf("cmdline args:\n");
	// while(argc--)
	// 	printf("%s\n",*argv++);

	test_sprintf();

	return 0;
}
```

### QEMUで再現

PetaLinux環境でのアプリケーション作成
https://qiita.com/7of9/items/025446735fec16f6a56a

QEMUで実行する (QEMUの終了方法についても記載)。
https://qiita.com/7of9/items/49f705c5b51c7c7c91a2

```
$ petalinux-boot --qemu --kernel
パスワードはroot, root? 
$ cd /bin
$ ./myapp_171101  (作成したアプリ名)
```

### 実行

```bash
# ./myapp_171101 
-0000
-0000
-0004
+0000
+0000
+0004
```

全部5桁になっているので、問題ないようだ。

### stdio.c

[build/linux/u-boot/src/u-boot-plnx/common/stdio.c](https://github.com/u-boot/u-boot/blob/master/common/stdio.c)
は
2009 Sergey Kubushynによるソースになっている。

[linux-xlnx/arch/powerpc/boot/stdio.c](https://github.com/Xilinx/linux-xlnx/blob/master/arch/powerpc/boot/stdio.c)とは別ものだろうか (Paul Mackerras 1997.)。
rails5でWEBアプリケーションにAPI機能を追加実装

シンプルなWEBサービスに簡単なAPI機能を実装し、外部から情報を取得できるようにする。
とりあえずAPIでjsonを返すところまで。
まずは閉じたAPIにするので、セキュリティはIP制限あたりを検討。
要件がシンプルなので、gemは使わずrailsのみでサクッと。

## 前提
- HogePersonモデルが存在する。

##application_controllerと別に、API用親コントローラを作成。
中身は別途。。

```ruby:app/controllers/api_controller.rb
class ApiController < ActionController::API
end
```

##APIコントローラを作成
```ruby:app/api/v1/hoge_person_controller.rb
class Api::V1::HogePersonController < ApiController
  before_action :set_hoge_person, only: [:profile]

  # ライセンスホルダの情報を返す。
  def profile
    # TODO: バリデーション
    # TODO: @hoge_personとステータス（成功/失敗）等を含むオブジェクトをjsonで返す。
    render json: @hoge_person
  end

  private
  def set_hoge_person
    # TODO: 返す情報を絞る
    # TODO: enum等、返す情報をフォーマットする。(document必要)
    # TODO: パラメータ名とモデルのカラム名は分けたい。
    @hoge_person = HogePerson.find_by(hoge_number: params[:hoge_number])
  end
```

##ルーティング

```ruby:config/routes.rb
namespace :api, {format: 'json'} do
  namespace :v1 do
    resources :hoge_persons, only: [] do
      collection do
        get :profile
      end
    end
  end
end
```

##アクセス
ターミナルで以下にアクセス。（又はブラウザからアドレス叩く。）
jsonが帰る。

```
curl https://service_domain/api/v1/hoge_persons/profile?hoge_number=123456001
```

ここから色々整備。

##参考など

- [RailsでAPIを作成するために色々比較したので所感と実装方法のご紹介 - Qiita](https://qiita.com/Kaki_Shoichi/items/d4adcf0298ed0b4614a2)
- [Rails5のAPIモードを使ったAPI実装方法（京阪淀屋橋駅【平日・出町柳方面】時刻表を例に） \- Qiita](https://qiita.com/tanakadaichi_1989/items/52dfcb0698c213272cfa)
Travis CIで複数の暗号化ファイルを扱う

Travis CIにはファイルを暗号化して秘密情報を公開リポジトリ上に安全に保存するような仕組みがあります。これは`travis`コマンドのサブコマンド`encrypt-file`で提供されており、下記のように利用します。

```
$ travis encrypt-file secret.txt
encrypting secret.txt for hnw/foobar
storing result as secret.txt.enc
storing secure env variables for decryption

Please add the following to your build script (before_install stage in your .travis.yml, for instance):

    openssl aes-256-cbc -K $****_key -iv $****_iv -in secret.txt.enc -out secret.txt -d

Pro Tip: You can add it automatically by running with --add.

Make sure to add secret.txt.enc to the git repository.
Make sure not to add secret.txt to the git repository.
Commit all changes to your .travis.yml.
```

`secret.txt`を暗号化すると`secret.txt.enc`が生成されますので、これをGitリポジトリにcommitして利用します。指定された`openssl`コマンドを`.travis.yml`内で利用することで、暗号化されたファイルを復号することができます。

この`encrypt-file`では公開鍵暗号の公開鍵を利用して暗号化が行われます[^1]。公開鍵暗号の鍵ペアはTravis CIプロジェクトごとに作られており、公開鍵はAPI経由で誰でも確認できますが、秘密鍵はTravis CIしか知らないため、復号できるのはTravis CIだけという仕組みになっています。

[^1]: 正確には256bit AES-CBCのKeyとIVを4096bit RSAの公開鍵で暗号化しています

# `travis encrypt-file`で複数ファイルの暗号化に対応する

ところで、`travis encrypt-file`で複数ファイルを暗号化すると、最後に暗号化したファイルしか復号できません。

このことはTravis CIのマニュアルにも記載があり、必要ファイルをtarに固めて1ファイルにするというワークアラウンドが紹介されています。

- https://docs.travis-ci.com/user/encrypting-files/#Encrypting-multiple-files

ただ、これを素直に書くと`.travis.yml`の記述が長々しくなるのが気持ち悪いと感じたので、使いやすくなるようなシェルスクリプトを書いてみました。

```shell:extract-encrypted-tar.sh
#! /usr/bin/env bash

set -eu

usage_exit() {
        echo "Usage: $0 [-K AES_KEY] [-v AES_IV] encrypted-tar-file [patternes]" 1>&2
        exit 1
}

while getopts K:iv:h OPT
do
    case $OPT in
        K)  AES_KEY=$OPTARG
            ;;
        i)
            ;;
        v)  AES_IV=$OPTARG
            ;;
        h)  usage_exit
            ;;
        \?) usage_exit
            ;;
    esac
done

shift $((OPTIND - 1))

if [[ $# -eq 0 ]]; then
    usage_exit
fi
if [[ ! -v AES_KEY || ! -v AES_IV ]]; then
    echo "Error: -K and -v are required options." 1>&2
    usage_exit
fi

ENC_TAR=$1
shift
PATTERNS="$@"

raw_tar=$(mktemp -d /tmp/XXXXXXXXX)/secrets.tar

openssl aes-256-cbc -K $AES_KEY -iv $AES_IV -in $ENC_TAR -out $raw_tar -d
tar xf $raw_tar $PATTERNS
rm $raw_tar
rmdir $(dirname $raw_tar)
```

これを使うと次のように暗号化tarを展開できます。

```
./extract-encrypted-tar.sh -K $****_key -iv $****_iv secrets.tar.enc
```

また、tarのオプションを渡せるので、下記のような指定も可能です。

```
./extract-encrypted-tar.sh -K $****_key -iv $****_iv secrets.tar.enc .ssh/ -C $HOME
```

この程度の粒度の処理もシェルスクリプトにまとめると`.travis.yml`の見通しが良くなるのでオススメです。
Xcode9でviewForSupplementaryElementOfKindが呼ばれない？

Xcode8で作成していたCollectionViewの画面を
Xcode9.0.1にて表示したところ、上記のバージョンで表示されていた
SectionHeaderが表示されません。
これはXcode9にて新しい処理が追加されてのでしょうか。

Xcode8での表示方法

Storyboard
-CollectionViewのSectionHeaderにチェック
-identifierにidをセット

ソース
-UICoolectionViewFlowLayoutにheaderReferenceSizeをセット
-func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSizeをセット
-func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableViewをセット

上記にてsectionHeaderが表示されていましたが、
Xcode9にて表示されませんでした。
ランダムファイル作成コマンド備忘録

# ファイル作成コマンドのメモ

度々使うけれどその度にググってるのでメモる。

### コマンド
```
dd bs=ブロックサイズ count=ブロック数  if=/dev/urandom of='出力ファイルpath'
```

### 1KBのランダムバイナリファイルを作るコマンド
```
dd bs=1024 count=1  if=/dev/urandom of='./1KB_file'
```
### 1MBのランダムバイナリファイルを作るコマンド
```
dd bs=1024 count=1024  if=/dev/urandom of='./1MB_file'
```
amazon linuxのイメージを使用してsshできるコンテナを作る

# 概要
AWS EC2(amazon linux)でsshログインして動作するものの動作テスト環境をdockerで構築するテスト。
ansibleやcapistrano,fabricなどssh経由でコマンドを送り込んで実行する系ツールの動作テストをローカル環境だけでやりたい場合を想定しています。

## 事前準備

### 公開キーを作成
公開キーを以下のように作ります。
```
ssh-keygen -t rsa -b 4096 -C "m71203@gmail.com" -f authorized_keys
```

### Dockerfileとdocker-composeファイルを作成
以下のようなDockerfileとdocker-compose.ymlを用意。
コンテナが１つなのでdocker-compose.ymlは必要ないのですが、どのようにコンテナを起動したかのメモかわりになるので残りしています。
Dockerfileの最後のCMDはtailしてコンテナを終了しないようにする為のものです。

```text:Dockerfile
FROM amazonlinux:latest

ARG USER

RUN yum -y update && yum -y install openssh-server && yum -y install sudo
RUN adduser $USER && mkdir -p /home/$USER/.ssh && chown $USER:$USER /home/$USER/.ssh && chmod 0700 /home/$USER/.ssh
ADD ./authorized_keys.pub /home/$USER/.ssh/authorized_keys
RUN chown $USER:$USER /home/$USER/.ssh/authorized_keys && chmod 0600 /home/$USER/.ssh/authorized_keys
RUN echo "$USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

CMD /etc/init.d/sshd start && tail -f /dev/null
```

```yaml:docker-compose.yml
version: '2'
services:
    app:
        build:
            context: .
            args:
                USER: user1
        container_name: al_test
        stdin_open: true
        tty: true
        ports:
            - "2022:22"
        volumes:
            - .:/share
```

## イメージ作成&コンテナ作成と起動
以下のコマンドでイメージとコンテナを作成。

```
docker-compose build
docker-compose up -d
```

## sshでのログイン
下のようなコマンドでsshログインできるようになります。

```
ssh -i authorized_keys user1@localhost -p 2022
```
ContiguousArray

意訳です。

* ContiguousArrayはメモリの連続した領域に要素を格納する特殊な配列。

* これはArrayが要素の型がクラスか@objcプロトコルの時にメモリの連続領域かNSArrayインスタンスのどちらかに要素を格納するのと対照的である。

* もし、使用する配列の要素の型がクラスか@objcプロトコルで、NSArrayへのブリッジやObjective-CのAPIへ渡す必要がない場合、ContiguousArrayを用いることはArrayより効率的でより予測可能なパフォーマンスがあがるだろう。

* 要素の型が構造体かenumの時は、ArrayとContiguousArrayは同じ効率である。ContiguousArrayはほとんどのプロパティとメソッドをそれらと共有しているので配列を用い方の詳しい情報はArray,ArraySliceを参照すること。
Code Signing Error: Signing for "Unity-iPhone" requires a development team. Select a development team in the project editor.


#環境
Xcode 9.1 beta

#症状
Xcodeから実機にインストールする以下のエラーが発生
>Code Signing Error: Signing for "Unity-iPhone" requires a development team. Select a development team in the project editor.

>Device "iPhone" isn't registered on the developer portal.

#解決方法
Xcodeの左カラムの一番上にあるプロジェクト名を選択し
右カラムの項目の`General`を選択
`Signing`に`No accounts found`と表示されていたので
`Add Acount`ボタンをクリック
`Apple id`と`password`を入力するダイアログが表示されたので入力し`Sign in`

ダイアログを閉じると`Team`というselectboxが`none`になっていたので先程sign inしたアカウントを選択

次にその下にあった`Register Device`をクリック


ここまで終えて再実行を行うとインストールが完了しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/72559/53013c62-9f9c-9828-79cb-163692b57a6e.png "image.png")
ReactNativeでAndroidのPopupMenuを出す

[PopupMenu](https://developer.android.com/reference/android/widget/PopupMenu.html) はAndroidの標準UIの一つで、ActionBarなどで使われている。

これをReactNativeから利用するには

```js
onOpenMenu = () => {
  UIManager.showPopupMenu(
    ReactNative.findNodeHandle(this._menu),
    ['Option 1', 'Option 2'],
    () => console.log('something went wrong with the popup menu'),
    (e, i) => console.log(`${e} : ${i}`)
  );
};
```

のようにする。

![Screen Shot 2017-10-31 at 7.12.26 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6000/85a053bd-6f17-c2fa-0c42-b056a8982674.png)


出典: [facebook/react-native#3004](https://github.com/facebook/react-native/issues/3004)



```js

import React from 'react';
import ReactNative, { StyleSheet, Text, TouchableNativeFeedback, TouchableHighlight, View, UIManager} from 'react-native';

export default class App extends React.Component {

  onOpenMenu = () => {
    UIManager.showPopupMenu(
      ReactNative.findNodeHandle(this._button),
      ['Option 1', 'Option 2'],
      () => console.log('something went wrong with the popup menu'),
      (e, i) => console.log(`${e} : ${i}`)
    );
  };

  render() {
    return (
      <View style={styles.container}>
        <TouchableNativeFeedback
          ref={e => {this._button = e;}}
          onPress={this.onOpenMenu}
          background={TouchableNativeFeedback.Ripple('#d0d0d0')}>
          <Text>Click me!</Text>
        </TouchableNativeFeedback>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});
```
Unpacking the update… Could not create directory. Wordpress

Memo:

for nginx people 
if you have php-fpm installed you have to tell it that its user and group is nginx. /etc/php-fpm.d/www.conf . find user which is assigned to apache by default and change it to nginx. also do it for group. then run this command :

````
sudo service php-fpm restart
````

also inside of your wordpress directory execute these commands

````
sudo chown nginx:nginx * -R 
sudo usermod -a -G nginx username
````
change username into what your current username is. 

yet you have to apply propper permissions. run these commands inside your wordpress directory

````
sudo find . -type f -exec chmod 664 {} + 
sudo find . -type d -exec chmod 775 {} +
````
DisposeBag

DisposeBagのRxSwiftのコードをみてみました。

https://github.com/ReactiveX/RxSwift/blob/master/RxSwift/Disposables/DisposeBag.swift

## Disposable

dispose(廃棄)できる。

```swift
public protocol Disposable {
    func dispose()
}
```

DisposeBagに入れておく。

```swift
extension Disposable {
    public func disposed(by bag: DisposeBag) {
        bag.insert(self)
    }
}
```

# DisposeBag

publicメソッドはinsertしかない。DisposeBagがdeinitしたときに持っているDisposableを廃棄してくれる。

```swift
public final class DisposeBag: DisposeBase {
    
    private var _lock = SpinLock()
    
    // state
    // 登録されたDisposable達
    private var _disposables = [Disposable]()
    // 廃棄フラグ　廃棄されると立つ
    private var _isDisposed = false
    
    public override init() {
        super.init()
    }
    
    /// bagにDisposableをいれる。すでに廃棄フラグがたっている場合、すぐにdisposeする。
    /// - parameter disposable: Disposable to add.
    public func insert(_ disposable: Disposable) {
        _insert(disposable)?.dispose()
    }
    
    /// Disposableを入れる。すでに廃棄フラグがたっていたら素通りする。廃棄フラグがたっていない場合はbagに入り、nilがかえる。
    private func _insert(_ disposable: Disposable) -> Disposable? {
        _lock.lock(); defer { _lock.unlock() }
        if _isDisposed {
            return disposable
        }

        _disposables.append(disposable)

        return nil
    }

    /// 内部的に利用、使いたい場合は代わりにCompositeDisposableを使うこと。
    /// 所持しているすべてのDisposableを廃棄処理する。
    private func dispose() {
        let oldDisposables = _dispose()

        for disposable in oldDisposables {
            disposable.dispose()
        }
    }
    
    /// キャッシュしているDisposableを取得、このメソッドではdispose(廃棄)をしていない。
    private func _dispose() -> [Disposable] {
        
        /// スピンロックをかける。
        _lock.lock(); defer { _lock.unlock() }

        /// 登録しているDisposable達
        let disposables = _disposables
        
        /// 登録しているDisposableを除く
        _disposables.removeAll(keepingCapacity: false)
        
        /// 廃棄したフラグをたてる
        _isDisposed = true
        
        /// 除いたDisposable 
        return disposables
    }
    
    /// deinit時に廃棄してくれる。
    deinit {
        dispose()
    }
}

```
linux-xlnx > arch > powerpc > sprintf > GitHubソース | PetaLinux + QEMUでの実行

GitHub.comにあるlinux-xlnxのsprintfソースコード。

[stdio.c](https://github.com/Xilinx/linux-xlnx/blob/629041605b93343ad2e8971ceaac3edcef0b043b/arch/powerpc/boot/stdio.c)

[そのhistory](https://github.com/Xilinx/linux-xlnx/commits/629041605b93343ad2e8971ceaac3edcef0b043b/arch/powerpc/boot/stdio.c)

~~Zynqでも上記のstdioを使っているのかは未消化。~~

linux-xlnxでstdio.hをFind fileするとarch/powerpc/bootのファイルのみ見つかる。

上記のソースを持ってきてCentOS上でビルとしようとしたが、様々なエラーが出て断念した。

### 実行環境

PetaLinux環境で試すのがいいのかもしれない。
https://qiita.com/7of9/items/025446735fec16f6a56a

QEMUで実行する (QEMUの終了方法についても記載)。
https://qiita.com/7of9/items/49f705c5b51c7c7c91a2

```
$ petalinux-boot --qemu --kernel
パスワードはroot, root? 
$ cd /bin
$ ./myapp_171101  (作成したアプリ名)
```
Twitter App Cardを設定した時の国設定

App Cardを設定した際、ストアの情報が全く反映されずにハマったのでメモ。

## Twitter公式ドキュメント
https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/app-card

> By default we search the US store, so if your app is in a different country, be sure to define this with the twitter:app:country meta tag.

と、記載されていたもの、書き方が明示されておらず。
日本はJA？JP？と迷いましたがJPで表示されました。

```html
<meta name="twitter:app:country" content="JP">
```

## Card validator
DropBoxの共有URLでも確認ができます。
https://www.dropbox.com/help/security/official-domains#domains

>ユーザー データをホストするために使用する URL
>
>これらのパスはユーザーがフォルダやファイルへのリンクを作成した際に、そのコンテンツをホストするために使用されます（たとえば、共有リンクの使用など）。Dropbox がこれらのリンクを使用して個人情報の提供を求めることはありません。

公式ドキュメントに掲載されているドメインと共有URLのドメインを書き換えてCard validatorに貼り付けてください。
https://www.dropbox.com/s/**********/index.html?dl=0
↓↓↓
https://dl-web.dropbox.com/s/**********/index.html?dl=0

こちらの記事も参考にさせていただきましたmm
https://qiita.com/atsushidesukedo/items/da1aa0c7bfbe6c6b89ee
AndroidStudio3.0でとりあえずビルド通す

こんにちは。
体育会系Androidエンジニアdeath.
AndroidStudioのビルドやっとこさ通ったので記念に書きまーす。

ちなみに、ビルドは
個人的には早くなった感じあんまりしないっす。

# 最も苦労したトラップ
どこかをいじってsyncボタンクリックするたびに

```
androidstudio3.0 Error:Could not get unknown property `variant Output Data` for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=productionDebug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
```

とにかく何度もコイツが登場する・・・


このエラーを普通に解釈すると
build.gradleにスクリプト的なの書いて
apk吐き出させる時とかに使うアレですよ。
書いている人がいらっしゃいましたので貼らせて頂きますね。
https://qiita.com/yamacraft/items/301f188b2433f47669ee

こういうapkの吐かせ方してる場合は↑この対応必要だそうです。

でも違うんです。
長尾のプロジェクトこんなん採用してないし。
variant Output Dataとか言われても身に覚えないし。
なんでこのエラー出るのか意味不明。

# 原因
明確にはわからず終いです。
やった感じとしては
公式サイトにあるAndroidStudio3.0対応の手順
https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html
にあるのに、やってないことがあったりすると上記エラーが出るっぽい。
ということで、公式読んでバッチリ理解デキてる人はハマらないのかもですね。

で、このエラーが出ても、syncボタンじゃなくて、Terminalで

```
./gradlew assembleDebug
```
的なコマンド叩くと(プロジェクトのFlavorとかによって、このコマンドは微妙に違ったりします)
syncボタン押した時は出てこなかったエラーが出てきたりするので
こっちも使いながら1こずつ問題を潰していきました。

### 以下、チェックポイント

1. **buildToolsVersion**を**26.0.2以上**にしているか？(しなきゃダメなんですって)
2. **build.gradle**の**dependencies**の**compile**を**implementation**にしたか？(しなきゃダメなんですって)
3. **build.gradle**の**dependencies**の**compile**を**implementation**にしちゃダメなやつまで**implementation**にしちゃってないか？(**Android的なライブラリ**は**implementation**、**Java的なライブラリ**は**compile**のまんまにする※)
4. **Retrolambda**を**消せ**(**Retrolambda関連の記述**を**build.gradle**からなくす)

※ちなみに
**3**
なんですが
最終的にビルド通ってみたら
**compile**
がついているのは、自分は一つもない状態になりました。
**compile xxx.xxx....**
にしてるやつは何度かビルドしている段階で
**annotationProcessor**にしてよ
とか
**compileOnly**にしてよ
とか
ピンポイントでお叱りメッセージが出たので
慎んでその通りにいたしました。

# dimention系のエラー
```android All flavors must now belong to a named flavor dimension.```

AndroidStudio3.0からは
**productFlavors**に**dimension**っていうのを書かなきゃいけなくなった、っていう話だそうです。
複数のパターンを組み合わせたい時だけ書けばいいのかと思いきや
そんなことしない場合にも書かなきゃダメだそうです。

**ダメだった例**

```
android {
    ......
    ......

    defaultConfig {
        ......
        ......
    }

    ......

    flavorDimensions "default"

    productFlavors {
        production {
            dimension "default"
        }

        staging {
            dimension "default"
            versionName "${VERSION_NAME}-stg"
            applicationIdSuffix ".staging"
        }
    }
}
```

**イケた例**

```
android {
    ......
    ......

    defaultConfig {
        ......
        ......
        flavorDimensions "default"
    }

    ......

    productFlavors {
        production {
            dimension "default"
        }

        staging {
            dimension "default"
            versionName "${VERSION_NAME}-stg"
            applicationIdSuffix ".staging"
        }
    }
}
```

公式では**ダメだった例**な書き方してるので
もしかしてダメだった例の書き方でもイケる場合があるのかもです。
(StackOverflowざーっと見ると、イケた例の方で書こうね、が多い気がします。)

とりあえずハマったのはこんなところです。
思い出したらまた足します！
OpenCVをPythonで動かそうとしてlibGL.soが無いって言われたけど解決した。

Docker上でOpenCVのPythonBindingを動かそうとしたらエラーがでた。

```
import cv2
ImportError: libGL.so.1: cannot open shared object fil e: No such file or directory
```

**Dockerfile**

```Dockerfile
FROM continuumio/anaconda3
RUN apt-get update
RUN conda install opencv -c conda-forge
RUN pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.4.0rc0-cp36-cp36m-linux_x86_64.whl
COPY run.py /run.py
CMD python /run.py
```

以下のコマンドで解決した。

```shell-session
# apt-get install -y libgl1-mesa-dev
```

他の人に聞いたら以下のコマンドでも解決したらしい。

```shell-session
# apt-get install -y libglib2.0-0 libsm6 libxrender1 libxext6
```
link > Xilinx sprintf > Format problem with sprintf | Xilkernel と連動させる場合はスレッドセーフ、リエントラントでない

Xilinx関連の開発環境でsprintf()がどうもおかしいとの報告があった。

### Format problem with sprintf

自分が見付けたのは以下の情報だ。
2006年の質問なので、2017年現在は解決しているだろうか。
https://bytes.com/topic/c/answers/525100-format-problem-sprintf

少なくともZynq + PetaLinux + QEMUでは発生しないようだ。
https://qiita.com/7of9/items/b6eb551b5974f8319f22

別途、マイナスの値をsprintf()した時にマイナスの分一つ多く桁が出る症状の連絡も受けている。
(再現する場合としない場合があるらしい)。


### 7.1i EDK、RTOS - sprintf、printf、fprintf、および malloc 関数を同時に使用すると、システムがクラッシュする

https://japan.xilinx.com/support/answers/22349.html

> C ライブラリは、Xilkernel と連動させる場合はスレッド セーフ/リエントラントではありません。 sprintf、printf、fprintf、および malloc 関数などを同時に使用すると、ロックアップが起こる可能性があります。 このため、同期化プリミティブでこれらの関数を保護する必要があります。

mutexなどで対応するのだろうか。
RTOSがXilkernel と連動していないかは不明。
ユーザビリティテスト３　パイロットテストと実査

前回までの流れ
１.[サイト公開前にユーザビリティテストをすることに](https://qiita.com/Yoko3/items/d8630ad719586db8f72d)
２.[ユーザビリティテスト１　目的決めと仮説立て](https://qiita.com/Yoko3/items/5caecf09540af4adf72c)
３.[ユーザビリティテスト２　シナリオ作成と準備](https://qiita.com/Yoko3/items/3d83621a9b6a63fc2ecb)

シナリオと機材の準備ができれば、あとは人を調整してやってみる。ここまでくれば、もうやるだけ。

# パイロットテスト
まずはユーザビリティテストをテストする。シナリオや機材、こんな準備でできるかな？って感じ。サイトのリニューアルに関わっていない同じグループのメンバーにちょっと声をかけて手伝ってもらった。

実際のパイロットテスト終了時（実施中は三脚にiPhoneが付いてた）
![photo.png](https://qiita-image-store.s3.amazonaws.com/0/55407/5fc876f1-ea13-b02a-5c18-91350ee02b37.png)

台本に書き出した内容を一通り通してやる。一通りやってみた結果をテスト自体のブラッシュアップへ。
質問事項を若干修正したり文言を直したり程度で済んだけど、台本に赤ペン入れ。時間配分は修正しなくても問題なさそう。

パイロットテストで参考値的な感じだけど、実際にシナリオをやってもらった結果、検証したかった「サイトに来た人が迷うことなくアイコンを選択して、自分の利用したいコンテンツにたどり着くことができるのか」ってところは、意外と達成できていた。あと、そうするんだ！そう思うんだ！と素直に驚かされることがあり、とても参考になった。

# 実査
本当に使う人の中から、ユーザビリティテストに参加してもらえる人を調整して実際にテストしてもらう。実査には立ち会わなかったので、結果のみフィードバックしてもらった。
検証したかった「サイトに来た人が迷うことなくアイコンを選択して、自分の利用したいコンテンツにたどり着くことができるのか」については、達成できていたそう。あと、迷ったポイント、感じたことを聞き取りした内容をフィードバックしてもらった。

# 改善作業へ
事後質問でメニューアイコンから読み取った内容を全て聞いたので、想定したものと使う側が考えたものにズレがあるものについて、どうしてそう考えたのか聞いた上で、カテゴリ自体と名称を再検討。また、想定していなかった行動については理由を聞き、修正が必要か否かを判断。

改善作業が終われば、サイトを公開へ。
あとは使ってもらって使いにくい部分があれば、その時々対応していければいいなぁ。
Android超基礎Layout編


# 概要
- AndroidのLayoutにかんするメモ
- 超基本的なこと
- Androidはじめたばかり


# Layout
- ConstraintLayout
- GridLayout
- FrameLayout
- LinearLayout(horizontal/vertical)
- RelativeLayout
- TableLayout



|レイアウト名|特徴|
|---|---|
| ConstraintLayout | 自動的にレイアウトの位置をマテリアルデザインに沿った最適な位置に調整してくれる　iOSのAutoLayoutの様な機能を持ったレイアウト |
| GridLayout | 縦横に配置する。写真の一覧や電卓の数値配置に並べたい場合などに使用する |
| FrameLayout | Viewを重ねて表示したい場合などに使用 |
| LinearLayout<br>(horizontal/vertical) | 縦(Vertical)/横(Horizontal)順番に並べて表示出来る |
| RelativeLayout | View同士の位置関係から相対的に配置出来る ex) 画像の右(画像の横幅が変わっても)にテキストを表示とか |
| TableLayout | htmlのtableタグと同じようにViewを配置出来る |


# ひとこと
超基礎からこつこつと
Xcodeのbeta版をインストールしようとすると「開発元を確認できないため、開けません」



#環境
OS:macOS High Sierra

#参考URL
Xcode9beta自体のDL方法などは詳しく書かれてる記事があるのでこちらを参考に
[【初心者向け】Xcode 9 (beta) 入れたい（；；）](https://qiita.com/keroppi0_0/items/8396e05b57e377b9eaa0)

#症状
DLが完了し、いざインストールをしようと`Xcode-beta.app`をクリックすると以下のようなエラーダイアログが出てインストールができない。
![スクリーンショット 2017-10-31 10.52.23.png](https://qiita-image-store.s3.amazonaws.com/0/72559/91be60ee-52f4-261f-e7d9-491a008c8a3a.png "スクリーンショット 2017-10-31 10.52.23.png")

#解決方法
まず`Xcode-beta.app`右クリックを右クリックし、`開く`を選択
![スクリーンショット 2017-10-31 10.52.33.png](https://qiita-image-store.s3.amazonaws.com/0/72559/2cdad363-5c24-4ecb-31bc-19dc59f6fb74.png "スクリーンショット 2017-10-31 10.52.33.png")

暫くすると今度は以下のようなダイアログが表示されるので`開く`を選択
![スクリーンショット 2017-10-31 10.54.37.png](https://qiita-image-store.s3.amazonaws.com/0/72559/ea9bffbf-2ba5-1547-9128-32c92d373f9f.png "スクリーンショット 2017-10-31 10.54.37.png")

`Install additional required components?`が表示されるので`install`でをクリックし、後は普通にインストール作業を進めるだけ。
(確認ダイアログは毎回出るのか分からない)
![スクリーンショット 2017-10-31 10.56.39.png](https://qiita-image-store.s3.amazonaws.com/0/72559/1c495fdd-4af2-2967-6104-1e9c24d11673.png "スクリーンショット 2017-10-31 10.56.39.png")
SmartGit > クローンして別リポジトリにした後に、ブランチ情報をremote originに上げる

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.5 #10143, installed: #10132
SmartGit付属のMinGW32
grep (GNU grep) 2.24
head (GNU coreutils) 8.25
```

### ブランチ情報の欠如

[SmartGit > remote情報の変更 > メニュー > [Remote] > [Properties] | .gitは外す < クローンして別リポジトリにする](https://qiita.com/7of9/items/3f37cdd566e9f0017421)
にて別リポジトリにした後で気づいたのが、ブランチ情報がremoteに上がっていないこと。

- SmartGit: ブランチ情報が見える
- remote (bitbucketなど): ブランチ情報が見えない

### ブランチ情報のPush

Branchesペインのoriginにブランチの一覧が見える。
それぞれのブランチ上で「右クリック > Push To...」にてremote
 originに上げることができる。

複数のブランチを選択して「Push To...」できる。
import matplotlib.pyplot で ImportError: No module named Tkinterと怒られる。

管理者権限がある場合Tkinterをインストールすればよいが、管理者権限が得られない場合はTkinterを使わないでpyplotをインポートするという解決策もある。

```
$ echo backend : Agg >> ~/.config/matplotlib/matplotlibrc
$ python

> import matplotlib
> matplotlib.use('Agg')
> import matplotlib.pyplot
```
ローディング用の React コンポーネントを作った

## React Circular Loading

ローディングを示すコンポーネントが欲しかったので [react-circular-loading](https://github.com/yami-beta/react-circular-loading) を作りました。
![react-circular-loading.gif](https://qiita-image-store.s3.amazonaws.com/0/31403/b3cadd04-45a7-67d7-28ac-434d91542ca9.gif)

コンポーネントのサンプルは [https://yami-beta.github.io/react-circular-loading/](https://yami-beta.github.io/react-circular-loading/) で見ることが出来ます。

react-circular-loading は **コンポーネント自体を提供せず、コンポーネントを生成する関数を提供します。**
ローディングを表示する場合、大きさや色、アニメーションの速度等を変えたいといったユースケースに対応するため、与えられたオプションからコンポーネントを生成する関数を提供する形を取りました。

### オプション

| オプション名 | 設定項目                       | 備考                                |
| ---          | ---                            | ---                                 |
| distance     | 中心からの距離                 | 単位: `em`, デフォルト: `4`         |
| dotSize      | ドットの大きさ                 | 単位: `em`, デフォルト: `1`         |
| dotColor0    | ドットの色（初期）             | デフォルト: `rgba(50, 51, 52, 0.1)` |
| dotColor1    | ドットの色（ハイライトの両隣） | デフォルト: `rgba(50, 51, 52, 0.2)` |
| dotColor2    | ドットの色（ハイライト）       | デフォルト: `rgba(50, 51, 52, 1.0)` |
| num          | ドットの数                     | デフォルト: `8`                     |
| speed        | アニメーション速度             | 単位: `ms`, デフォルト: `1000`      |


### 使い方

npm か yarn でインストールした後

```bash
$ npm install @yami_beta/react-circular-loading
$ # または
$ yarn add @yami_beta/react-circular-loading
```

`circularLoading()` にオプションを渡してコンポーネントを生成します。
下記の例だと、ドットが12個のコンポーネントが生成されます。

```js
import React from 'react';
import { render } from 'react-dom';
import { circularLoading }  from '@yami_beta/react-circular-loading';

const CircularLoading = circularLoading({
  num: 12,
});

class App extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    return (
      <div className="app">
        <h1>React Circular Loading Example</h1>
        <CircularLoading />
      </div>
    );
  }
}

render(<App />, document.getElementById('app'));
```
PHPのtraitを単体テストにかける方法

PHPの`trait`はそれ自体では`new`できないので、一見すると単体テスト不可能と思われるが、`trait`を`use`した普通のクラスをテスト用に作っておき、そのクラスに対して単体テストを実行すれば良い。

```php
<?php

trait Greetable {
	public function hello(int $repeat): string {
		return str_repeat('Hello!', $repeat);
	}
}

class GreetableBeings {
	use Greetable;
}

class GreetableTest {
	public function testHello() {
		$g = new GreetableBeings();
		assert($g->hello(1) === 'Hello!');
		assert($g->hello(2) === 'Hello!Hello!');
		assert($g->hello(3) === 'Hello!Hello!Hello!');
	}
}

(new GreetableTest)->testHello();
```

なお、PHP7からは[無名クラス]が使えるのでわざわざテスト用にクラスを作る必要はなくなった。

[無名クラス]: http://php.net/manual/ja/language.oop5.anonymous.php


```php:PHP7以上
<?php

trait Greetable {
	public function hello(int $repeat): string {
		return str_repeat('Hello!', $repeat);
	}
}

class GreetableTest {
	public function testHello() {
		$g = new class { use Greetable; }; // 無名クラス
		assert($g->hello(1) === 'Hello!');
		assert($g->hello(2) === 'Hello!Hello!');
		assert($g->hello(3) === 'Hello!Hello!Hello!');
	}
}

(new GreetableTest)->testHello();
```
Elasticsearchに登録した生年月日から現在の年齢を算出する.

Elasticsearchに登録した生年月日をscript(Painless)で計算させて、年齢を取得します。

使用するmapping定義   

```
{
  "xxxxxxxxx": {
    "mappings": {
      "xxxxxxxxx": {
        "properties": {
          "birthday": {
            "type": "date"
          }
        }
      }
    }
  }
}
```

データ 

```
{
  "birthday": "1996-09-29T09:00:00.000Z"
}
```

登録する生年月日は、ElasticsearchのTimeZoneにあわせて、UTCで登録しています。

query

```
{
  "query": {
    "match_all": {}
    }
  , "script_fields": {
    "age": {
      "script": {
        "lang": "painless",
        "inline": "Date n = new Date(); Date b = new Date(doc['birthday'].value); DateFormat f = new SimpleDateFormat('yyyy-MM-dd'); return Period.between(LocalDate.parse(f.format(b)), LocalDate.parse(f.format(n))).getYears();"
      }
    }
  },
  "_source":  [
    "birthday"
  ]
}
```

Painless Scriptでは、`new Date()`で現在日時を取得して、登録されている生年月日との差をPeriod.between()で取得しています。


query実行結果

```
{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "xxxxxxxxx",
        "_type": "xxxxxx",
        "_id": "xxxxx",
        "_score": 1,
        "_source": {
          "birthday": "1996-09-29T09:00:00.000Z"
        },
        "fields": {
          "age": [
            21
          ]
        }
      }
    ]
  }
}
```

painlessで利用できるJava APIは、以下。
https://www.elastic.co/guide/en/elasticsearch/reference/5.0/modules-scripting-painless.html#painless-api

なお、Elasticsearchでは、 [Joda-Time](http://www.joda.org/joda-time/)  も日時処理に利用できます。
スプレッドシートのタスク管理表から締め切りをメールでリマインドする



```
function myFunction() {
   　　var mySs = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートを取得　
    var Sheet = mySs.getSheetByName('シート名'); // シート名を取得 
    var mySheet = SpreadsheetApp.getActiveSheet(); //シートを取得
    var today = new Date(); //今日の日付を取得
    var strTo = "mail-address"; //To
    var strFrom = "mail-address"; //From

    /* 繰り返し計算 */
    for (var i = 150; i <= 200; i++) {
        var task_name = Sheet.getRange(i, 4).getValue(); //内容を取得
        var task_end_date = Sheet.getRange(i, 7).getValue(); //タスクの期限を取得
        var task_status　= Sheet.getRange(i, 8).getValue(); //タスクのステータス
        var dateDi = new Date(task_end_date); //タスク期限のDateを生成
        var dt = dateDi.getTime() - today.getTime(); //dateDiから今日の日付を引く
        var day = Math.ceil(dt / 1000 / 60 / 60 / 24);　 //日付に変換
      
        if (task_status == "完了") /* task_status列が完了なら何もしない　*/;
        else if (task_status == "対応中") /* task_status列が完了なら何もしない　*/;
 
        else if (0 < day　 && day <= 2) { //2日後の日付と締切日を比較
            /* メール本文を準備 */
            var strSubject2 = "【タスク/リマインド】" + task_name + "の期限が迫っています！";
            var strBody2 = task_end_date + "の期限が、残り" + day + "日と迫っています。";
            /* メールを送信 */
            var send = GmailApp.sendEmail(
                strTo,
                strSubject2,
                strBody2, {
                    from: strFrom,
                }
            );
        } else if (day <= 0) { //今日の日付と締切日を比較
            /* メール本文を準備 */
            var strSubject1 = "タスクの期限です";
            var strBody1 = "" + task_name + "の期限日です。" + (-day);
            /* メールを送信 */
            var send = GmailApp.sendEmail(
                strTo,
                strSubject1,
                strBody1, {
                    from: strFrom,
                }
            );
        }
    }
}
```


##参照サイト
http://komuinresign.net/blog/2016/11/google-apps-script/

https://qiita.com/kazu56/items/cca24cfdca4553269cab
Editor: Metal support disabled, skipping device initialization


#環境
Unity:2017.2.0f3



#エラー内容
>Editor: Metal support disabled, skipping device initialization

#解決方法
Edit -> Project Setting -> Setting for iOS(PC) -> Other Settings
の`Metal Editor Support`にチェックを入れる

>Changing editor graphics device
	Changing active graphics API requires reloding all graphics objects,it might take a while

というダイアログが出てくるので`Apply`で解決