OmniAICreator/Qiita-1.07M huggingface dataset:
Cognos AnalyticsにおけるCognos Mobileの変更点

#概要
Cognos Analytics 11で、Cognos Mobileがどのように変更になったかという情報をまとめました。

#内容
**Native App**
Cognos BI 10.2.2までは、Native Appの用途はオンラインでのレポートの実行と、Active Reportのオフライン実行でしたが、Cognos Analytics 11では、オフラインのActive Reportの実行の用途のみとなりました。
ちなみに、現在公開されているCognos MobileのNative App v11は、Cognos BI 10に互換機能は維持されていて、Cognos BI 10にアクセスした場合は、これまで通りのオンラインのレポートの実行など、フル機能が使用できるとの事です。

Active Reportの取り込み方は、Cognos BI 10と変わらず、以下の3通りとなります。
1) Run the reports on a schedule and select to push to mobile recipients
2) Manually import the Active Report (via mail, iTunes, web server or file storage)
3) Browse the folder structure and download a Saved Output

また、Active Reportから実際のサーバー上のオンラインレポートにドリルスルーが定義されているような場合でも、Native Appはオフラインでの処理を想定した作りのため、ドリルスルーは実行することができなくなります。

**インターフェースの統一**
Cognos BI 10.2.2のMobileでは、Safariブラウザでアクセスした際も、MobileバージョンとDesktopバージョンの選択を行う画面が表示され、どちらかのインターフェースを選択しましたが、Cognos AnalyticsのMobileでは、インターフェースは1つになりました。

以下のようなイメージで、機能も非常に簡略化されており、「作成」ボタンでは「ダッシュボード」の機能のみが使用可能となっています。
このインターフェースから、レポートのオンライン実行は可能で、通常レポートだけでなく、Active Reportの実行も可能になっています。
「管理」の機能や、その他諸々の機能は使用できません。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/afb9070e-ab73-9ae3-4b56-1e179577fe01.png)

Cognos MobileのアクセスURLは、以下となっています。
http(s)://myserver:port/bi/v1/disp

Cognos Analytics Mobile 11の参考資料として、以下のリンクを添付しますのでご参考にして下さい。

**IBM Cognos Mobile Overview**
http://www-01.ibm.com/support/docview.wss?uid=swg27045608

**FAQ: What's new when using the Cognos Mobile native apps in Cognos Analytics v11**
http://www-01.ibm.com/support/docview.wss?uid=swg21973325

**IBM Cognos Mobile administration**
https://www.ibm.com/support/knowledgecenter/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.ug_cra.doc/c_mob_admin.html
vue-cliで始めるVue.jsチュートリアル (2)

**2020.5.27追記**

https://blog.sin-tanaka.com/posts/vuejs-tutorial-with-cli2/

本記事は個人ブログへ移管しました

かなり古い内容ではありますがご理解いただける方は参考までにどうぞ
vue-cliで始めるVue.jsチュートリアル (1)

**2020.5.27追記**

https://blog.sin-tanaka.com/posts/vuejs-tutorial-with-cli1/

本記事は個人ブログへ移管しました

かなり古い内容ではありますがご理解いただける方は参考までにどうぞ
Google App Maker ー 検索時に日本語を使えるようにする

App Maker でデータソースのクエリのパラメータに日本語を使うとエラーになってしまう。
そのうち治ると思うが、現在（2017/10/3) は動かないので、本記事で行うようなエラーの回避を行う必要がある。

そもそも App Maker ってなに？という人は、以下の記事を参照してください。
[Google App Maker とは？ 短期間で Web アプリケーション構築を可能にした理由](https://www.topgate.co.jp/what-is-google-app-maker)

## エラーが起きるケース

次のような一覧画面があり画面上部に絞込用のテキストボックスがあるようなケース。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/24f3a389-8d27-1d29-e555-0370fd13aa32.png)

### アルファベットは問題なし
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/9726d5b7-a0e3-7ea3-9ad7-2260d110817d.png)

### 日本語はエラー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/a4e316b6-cba8-678e-4984-11b6352a8029.png)

```text:エラーメッセージ	
Tue Oct 03 17:51:34 GMT+900 2017
(InvalidCharacterError) : Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
at Users.TextBox1.onValueChange:1:41
```


## エラーになる原因
query のパラメータに日本語を入れるときにエラーになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/272c8c29-45d9-1d40-7446-ad5f72ea643e.png)

```javascript
widget.datasource.query.parameters.text = widget.value;
widget.datasource.load();
```

## 改善方法

### パラメータの設定側
`encodeURIComponent` をつける。

```javascript
widget.datasource.query.parameters.text = encodeURIComponent(widget.value);
widget.datasource.load();
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/f368e15b-9dd3-c52d-5df8-2a185e691dd2.png)

### クエリの実行側
`decodeURIComponent` をつける。


```javascript
var text = query.parameters.text;
if (text) {
  query.filters.Name._contains = decodeURIComponent(text);
}

return query.run();
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/40e6a2f1-e91b-af52-ea66-1edff6688c52.png)

## 改善後の実行結果
エラーが出ずに日本語で検索できている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/95842e0f-7eaf-4d2f-c4e7-9b76cfbd02a5.png)
【小ネタ】SeleniumWebDriverで画面上の特定のテキストの有無を確認する。

tsuttieです(*'▽')
今回はテキストの有無の確認方法についてお話しします。


#1. Selenium2を使ってみて
Webアプリのテスト自動化を目的としてSelenium2を使ったので詰まった点を数回に分けてまとめて行きたいと思います。
#2. 使用したSelenium
・Selenium IDE
・Selenium Webdriver (Java 3.5.0)
※導入方法についてはわかりやすくまとめていらっしゃる方が多くおりますので、そのあたりのお話は省きます。
#3. 【本題】画面上に特定の文字列が存在するか確認する。
　Seleniumを使用する用途はいくつかあるかと思うのですが、その大半がWEBアプリの動作テストの自動化、もしくは単純作業の自動化だと思います。
そして、その作業を自動化する時に必ず必要になってくるのが、正常系、異常系の判別です。
なにをもって判断するかはその時々によるから後から考えるとして、手段は多いに越したことはないでしょう・・・？？

そういう理由から、今回はそれを実現するために
**判別のの方法の一つとして特定テキストの認識をできるように整備しておこう。**
という話ですね。

　Selenium IDEでは、特定のテキストの有無によって処理を変えるものが機能として用意されています。
一つは特定のテキストが存在しない場合作業を中断する「assert」
もう一つはエラーは出すが、作業自体は続行する「verify」です。
詳細は以下URL
[http://oss.infoscience.co.jp/seleniumhq/docs/04_selenese_commands.html](http://oss.infoscience.co.jp/seleniumhq/docs/04_selenese_commands.html)

Selenium WebDriverでは、この「assert」、「verify」の機能は利用できなくなりました。
しかし、`driver.getPageSource().contains("テキスト")`を使うことで
より自由にテキストの検出をすることが可能となっています。
`driver.getPageSource().contains("テキスト")`は特定のテキストがHTML内に存在すればtrue,
なければfalseを返します。

これなら、「assert」、「verify」と同じ機能を作ることは容易ですし、それ以外にもなにかと使い勝手がよさそうですね！！

実際、機能を作り次第、記載できたらと思います！


最初、assertが使えないとわかった時焦りましたが、
逆にシンプルなほうが使い勝手良かったりしますよね。
そんな感じで今回は短いですが、以上で終わります！
PHPでAWS SSMパラメータストアの値を参照する

# AWS SSMパラメータストアとは

- AWS Simple System Managerのパラメータストアのこと
- 詳しくは以下を参照
 - http://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-paramstore.html

# 準備

- パラメータの定義
 - AWSコンソールから設定する場合は [サービス] -> [EC2] -> [パラメータストア] -> [パラメータの作成]

- IAMロールにSSMの権限を追加
 - 管理ポリシーのAmazonSSMReadOnlyAccessをアタッチしておく

- EC2インスタンスにIAMロールを割り当て


# 単純な実装例

```php:sample.php
<?php

require 'vendor/autoload.php';

function getSsmParameters(array $names)
{
    $config = [
        'version' => '2014-11-06',
        'region' => 'ap-northeast-1'
    ];

    $client = new Aws\Ssm\SsmClient($config);
    $result = $client->getParameters(
        [
            'Names' => $names,
            'WithDecryption' => false
        ]
    );

    if ($result['InvalidParameters']) {
        // 存在しない値
        echo "InvalidParameters: " . implode(', ', $result['InvalidParameters']) . "\n";
    }

    if (!is_array($result['Parameters'])) {
        return null;
    }

    $params = [];

    foreach ($result['Parameters'] as $v) {
        $name = $v['Name'];
        $params[$name] = $v['Value'];
    }

    return $params;
}

$params = getSsmParameters(['hoge', 'fuga']);

var_dump($params);
```

```sh
$ php sample.php
InvalidParameters: fuga
array(1) {
  ["hoge"]=>
  string(11) "hello,world"
}
```

参考: http://docs.aws.amazon.com/aws-sdk-php/v3/api/api-ssm-2014-11-06.html#getparameters
CentOS7 で yum groupinstall が出来ないんですけど。。。

CentOS7で、yumが変更されたとかで、groupinstall でエラーでハマりました。

```
# yum -y groupinstall base "Development tools"
Loaded plugins: fastestmirror, langpacks
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.jaist.ac.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Warning: Group base does not have any packages to install.
Group base does have 1 conditional packages, which may get installed.
Warning: Group development does not have any packages to install.
Maybe run: yum groups mark install (see man yum)
No packages in any requested group available to install or update
```

次のようにすると良いらしい。

```
yum -y groupinstall base "Development tools" --setopt=group_package_types=mandatory,default,optional
```


参照したのはこちら。
https://access.redhat.com/solutions/1310043
AWS Lambda 上で Python の外部ライブラリを使用する

AWS Lambda 上で pytz とか Python-msgpack 等の外部ライブラリを使用する方法です.

## TL;DR
lambda_function.py と同じディレクトリ階層にライブラリのモジュール一式を
設置してまとめて ZIP するだけ

## pip でカレントディレクトリにインストールする
例:
```$ pip install pytz==2017.2 -d ./```
pip install の -d オプションは続く指定ディレクトリにモジュールをダウンロードします.
上記コマンドを実行するとカレントディレクトリに, 

- pytz
- pytz-2017.2.dist-info

が生成されます. この要領で必要なライブラリ一式用意します.

## 落とし穴
大体のモジュールはこの方法で用意できますが, 中には OS 依存のモジュールがあります.
(ujson 等)
Lambda が実行されるマシンの OS は AmazonLinux なので例えば MacOS 上で作成したモジュールは使用できません. AmazonLinux 上で pip install したモジュールである必要があります.
幸い AmazonLinux は Docker イメージが公開されていますので Docker コンテナ内で pip install すれば OK です.
https://hub.docker.com/_/amazonlinux/

Python や pip 等も含めて Dockerfile はこんな感じになりました.
https://gist.github.com/t-miya/fd90e5bd7602b915a05498ddfa4549d0

どれが OS 依存非依存のライブラリか判別するのは大変なので基本的に AmazonLinux 環境でモジュール生成するといいです.

## SVC 管理する場合
lambda_function のソースコードのバージョン管理する際は AmazonLinux 上で各ライブラリの wheel を作成しておくとリポジトリの見通しがよくなります. さらに wheel になっていれば展開時の環境はなんでもよく, サイトからのダウンロードも不要なのでスクラップ & ビルドしやすくなります.
jQueryメソッドサンプルコード

###完成イメージ
[![https://gyazo.com/7a9e7fc4bec18ed37323668fd705a21f](https://i.gyazo.com/7a9e7fc4bec18ed37323668fd705a21f.gif)](https://gyazo.com/7a9e7fc4bec18ed37323668fd705a21f)
[![https://gyazo.com/1d23bebfb497f827091546c36471f21f](https://i.gyazo.com/1d23bebfb497f827091546c36471f21f.gif)](https://gyazo.com/1d23bebfb497f827091546c36471f21f)
###HTML
```
<body>
  <ul>
    <li>
      <p class="content-a">1.fadeOut</p>
      <img class="img-a" src="https:xxx.xxx.xxx" width="200px" height="100px">
    </li>
    <li>
      <p class="content-b">2.hide</p>
      <img class="img-b" src="https://xxx.xxx.xxx" width="200px" height="100px">
    </li>
    <li>
      <p class="content-c">3.slideUp</p>
      <img class="img-c" src="https:xxx.xxx.xxx" width="200px" height="100px">
    </li>
    <li>
      <p class="content-d">4.show</p>
      <img class="img-d" style="display: none" src="https://xxx.xxx.xxx" width="200px" height="100px">
    </li>
    <li>
      <p class="content-e">5.html</p>
      <div class="img-e">
        <img src="https:xxx.xxx.xxx" width="200px" height="100px">
      </div>
    </li>
    <li>
      <p class="content-f">6.css</p>
      <img class="img-f" src="https://xxx.xxx.xxx" width="200px" height="100px">
    </li>
  </ul>
</body>
```
###CSS
```
li {
    height: 160px;
    list-style: none;
}
```
###js
```
$('.content-a').click(function(){
    $('.img-a').fadeOut(1500);
});

$('.content-b').click(function(){
    $('.img-b').hide(1500);
});

$('.content-c').click(function(){
    $('.img-c').slideUp(1500);
});

$('.content-d').click(function(){
    $('.img-d').show(1500);
});

$('.content-e').click(function(){
    $('.img-e').html('<img src="https://xxx.xxx.xxx" width="200px" height="100px">');
});

$('.content-f').click(function(){
    $('.img-f').css('border-radius','30px').css('Opacity','0.6');
});
```
※「https\://xxx.xxx.xxx」は画像のURL
Python2 > Python scriptを置いているディレクトリにあるbash scriptを実行する実装 > def invoke_script(ascript)

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
```

Python 2.6.6を使用。

### やりたいこと

- CODE_171003/test_getdir_171003.py
- CODE_171003/test_hello_171003_exec

CODE_171003より一つ上のディレクトリからtest_getdir_171003.pyを実行し、そのPython script内でbash script(test_hello_171003_exec)を実行したい。

### 参考

ディレクトリを探す方法は以下を参考にした。
https://stackoverflow.com/questions/4934806/how-can-i-find-scripts-directory-with-python

### code

```bash:test_hello_171003_exec
#!/usr/bin/env bash
echo "zabuuun"
```

test_hello_171003_execには`chmod +x`しておく。


```test_getdir_171003.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os
import subprocess as sb

#on python2.6.6
#coding rule: PEP8


def invoke_script(ascript):
    #scd: script directory
    scd = os.path.dirname(os.path.realpath(__file__))
    acmd = scd + "/" + ascript
    sb.call(acmd.split())

invoke_script("test_hello_171003_exec")
```

```txt:run
$ python CODE_171003/test_getdir_171003.py 
zabuuun
```
AndroidでUDPブロードキャスト通信をするときの注意

[ブロードキャストアドレス](https://ja.wikipedia.org/wiki/ブロードキャストアドレス)を宛先に指定してUDPメッセージを送信すると、ローカルネットワーク内の全てのクライアントにメッセージを届けることができます。これを利用してローカルネットワーク内の通信相手を自動検出するようなアプリを作っていたのですが、AndroidアプリでUDPメッセージを受け取れないことがありました。完全に受け取れないわけではなく、たまに受け取れたりするし端末によって確実に受け取れるやつがいたりして、不思議なことになってました。

おそらくAndroidの電池周りの最適化の影響などでブロードキャストパケットの受け取りを制限するようになっているのではないかと思い調べてみたところ、[こちらの記事](https://pzoleeblogen.wordpress.com/2014/03/04/android-udp-broadcast-message-is-not-received/)に辿り着きました(リンク先英語です)。どうやらブロードキャストパケットを受信する前にWiFiマネージャーのロックを取得しなければいけないようです。
そのためのコードはこちら。

```java:ロックの取得
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
MulticastLock lock = wifi.createMulticastLock("lock");
lock.acquire();
```

ロックを取得したということは、使い終わったらロックを解放しなければいけません。そのためのコードはこちら。

```java:ロックの解放
lock.release();
```

これで無事UDPブロードキャスト通信ができるようになりました！
Google Analyticsで理解しておくべき用語まとめ(メモ)

今回はGoogleAnalyticsを使う上で覚えておいた方がいい用語をまとめました。



| 用語(GoogleAnalyticsGlossary)            　  |       解説                         |
|:----------------------------------|------------------------------------|
| ユーザー|GoogleAnalyticsの「ユーザー数」とは、「ユニークユーザー数」のことである<br>ユニークユーザー数とは、サイトを訪問したユーザー数を指します
|New Visitor<br>(新規ユーザー)     |サイトの新規ユーザーのこと<br>過去2年以内にサイトを訪問したことのないユーザーが分類されます           |
|Returning Visitor<br>(リピーター)            |サイトのリピーターのこと<br>過去2年以内にサイトを訪問したことのあるユーザーが分類される        |
| セッション              |サイトを訪問した回数<br>30分以内の再訪はまとめて1回のセッションとカウントされます|
|PV<br>(ページビュー数) |サイト内のページが表示された延べ数<br>ページを更新(リロード)しても1ページビューとなります         |
|ページ/セッション|1セッション中に閲覧されたページビューの平均です<br>サイトの回遊性を表す指標でもある
| 回遊性             |ユーザーがサイト内の色々なページを見て回る度合のこと<br>ページ/セッションの数値が大きいほど回遊性が高いサイトと表現できます|
| 直帰率            |1セッションで1ページビューしかない訪問数を全体の<strong>セッション数</strong>で割った数値を%で表したもの|
| 離脱率|あるページで離脱した数を、その<strong>ページの<br>ビュー数</strong>で割った数値を%で表したもの |
|目標<br>(コンバージョン率) |コンバージョン数を全体のセッション数<br>(母数)で割ったもの|
|ディメンション|GoogleAnalyticsにおける分析軸みたいなもので、日本語では「○○ごとの」,「○○別の」と表現出来る|
|チャネル|ディメンションの１つで、ユーザーの訪問経路を表す|   
|メディア|ユーザーの訪問経路を分類するためのディメンションのこと|  
|参照元|自サイトへのユーザーの訪問元となった外部サイトを表すディメンションのこと|  
|セグメント|レポートの数値を特定の条件で絞り込む機能<br>参照元,コンバージョンなど様々な軸でサイトの解析データを絞り込める|
CMake bootstrap は未最適化実行ファイルを生成するという罠

CMake を tarball で取得してビルドするとき、あなたはどんな手順で行いますか?

```
$ ./bootstrap
$ make
```

実はこれ、最適化されていない `cmake` をビルドしちゃいます。ただでさえクソ遅い CMake が激遅になってしまいます。

もしあなたがあまり古くない CMake をすでにインストールしているなら、以下のようにするのがベターですね。

```
$ /path/to/your/cmake -DCMAKE_BUILD_TYPE=Release .
$ make -jNN
```

私はもはや CMake 使いに `ninja-build` を活用していただきたいとばかり願っているので、以下のようにすると**ベスト**です。

```
$ /path/to/your/cmake -GNinja -DCMAKE_BUILD_TYPE=Release .
$ ninja
```

あ、CMake 初めてな人は仕方がないので `./bootstrap` を利用しましょう。

```
$ CXXFLAGS=-O3 ./bootstrap --parallel=XX
$ make -jNN
```

このやり方だと stage2 ビルドの `CMakeCache.txt` に `CMAKE_CXX_FLAGS:STRING=-O3` をセットしてくれます。それがイヤならば以下のやり方もあります。

```
$ ./bootstrap --parallel=XX
$ Bootstrap.cmk/cmake -DCMAKE_BUILD_TYPE=Release .
$ make -jNN
```

なお私はよだきんぼ(方言)なので CMake を `/usr/local` どころか `$HOME` にすらインストールしません。Symlink でイケますよ。

```
$ ln -sv /path/to/build/cmake-X.X/bin/c*make ~/bin/
```

(私は `ccmake` も多用します)
メモ

# Xcodeで画像処理用macOSアプリ開発(Swift)
## はじめに
Xcode, Swift初心者が画像処理アプリを開発する環境を整えようと思ったけど、
~~上手くいかなくてうんちだったので書いた。~~
Xcode9へのアップデートによりうまくいきました。うんちなのは私の方でした。
[めもあ](https://qiita.com/mippai_prpr/items/b1ff94d388140c9d4a68)

## 環境
>Mac Book Air
mac OS 10.12.6
Xcode 8.3.2

## 画像処理フレームワーク
[EasyImagy](https://github.com/koher/EasyImagy "EasyImagy")を使ってみることに。
[Swiftで画像をめちゃくちゃ簡単にあつかえるライブラリ](https://qiita.com/koher/items/7dc1aa10755b79102539 "Swiftで画像をめちゃくちゃ簡単にあつかえるライブラリ")

## インストール
[readme.MD](https://github.com/koher/EasyImagy/blob/master/README.md "readme.MD")に従う。
>1. Put EasyImagy.xcodeproj into your project/workspace in Xcode.
2. Click your project icon and select the application target and the "General" tab.
3. Add EasyImagy.framework to "Embedded Binaries".
4. import EasyImagy in your swift files.

まず1.ファイルの追加方法が分からない。ググる。
対象のファイルをXcodeのウィンドウにドラッグ&ドロップでプロジェクトに追加できるらしい。

## No such module
上記2.3.と進み、つづいて4. EasyImagyをimportするも、「No such module」のエラーが表示されつまづく。
![スクリーンショット 2017-10-03 15.32.22.png](https://qiita-image-store.s3.amazonaws.com/0/129820/e699a574-95dd-a3be-76a4-91850e56a8d6.png)

さらにググると以下を発見。
[アプリに広告のフレームワークを追加したのに「No such module 'GoogleMobileAds'」と表示される問題の解決方法(Xcode7,Swift2.0)](http://blog.livedoor.jp/healthlifeuuu-sakusei2/archives/1056512750.html "アプリに広告のフレームワークを追加したのに「No such module 'GoogleMobileAds'」と表示される問題の解決方法(Xcode7,Swift2.0)")
>これは、フレームワークをXcodeにコピーできていないことが原因です。
従って、何らかの方法でフレームワークをコピーしてXcodeに入れることでエラーは解決されます。
Xcodeに外部からのフレームワークをコピーする一つの方法として、BuildPhasesのCopyBundleResouecesに追加する方法があります。さっきの場合、GoogleMobileAdsをXcodeに追加する際にはドラッグしたらそのまま追加される感じでしたが、CopyBundleResouecesに追加する際には「Copy items if needed」というチェックの欄があります。

## xcodeprojがリソース一覧に追加されない
Copy Bundle Resourcesの下の[+]を選択し「Add other...」より「EasyImagy.xcodeproj」ファイルを選択してみるも一覧に追加されない。そもそも「Copy items if needed」というチェック欄が出ない。

![スクリーンショット 2017-10-03 15.33.06.png](https://qiita-image-store.s3.amazonaws.com/0/129820/2177fbd0-709e-dc62-6d74-e727f8ce5f35.png)
こっちは選択した回数だけ増殖する。

## Xcodeが落ちる
その後、「Embed Framework」よりフレームワークの追加ができることがわかった。
また、「Target Dependencies」にも同様にフレームワークを追加した。

>これをLinkBinaryWithLibraries(Linked Frameworks and Libraries)にドラッグして追加することで、エラーは解決されました。

とのことなので、「Embed Framework」から「Link Binary With Libraries」へドラッグしてみると…
Xcodeが落ちた。

![スクリーンショット 2017-10-03 16.31.01.png](https://qiita-image-store.s3.amazonaws.com/0/129820/317a802a-a1ab-67df-2e5b-b5efd240f117.png)
再起動。これはやらなくていいやつか？

## undeclared typeエラー
とりあえず、「No such module」エラーは出なくなった。
しかしビルドには失敗。フレームワーク内のソースコードで以下のエラーが発生。
>Use of undeclared type 'UnboundedRange'

「UnboundedRange」という型が宣言されていないそうな。
標準ライブラリ？らしいが調べてもわけわからんのでもう諦めた。
[UnboundedRange](https://developer.apple.com/documentation/swift/unboundedrange "UnboundedRange")

簡単な画像処理をしたいだけなのに何故こんなめんどくさいのか。
フレームワーク追加できてるのかもよく分からんし環境構築（できてない）だけで１日潰れるとかほんと勘弁してほしい（うんち）
PHP5.3.xまではクロージャ中にselfを使えない「Cannot access self:: when no class scope is active」

PHP5.3.29まではクロージャの中でselfは使えないので「Fatal error: Cannot access self:: when no class scope is active 」というエラーになります。PHP各バージョンでの実行結果の比較は[Online PHP editor | output for iCEhr](https://3v4l.org/iCEhr#v530)で見れます。



```php
<?php

class Foo
{
	const HOGE = 1;
	
	public static function callClosure()
	{
		$closure = function () {
			var_dump(self::HOGE); // エラーになる
		};
		$closure();
	}
}

Foo::callClosure();
```



解決策としては①のようにクラス名を直接指定します。

```php
<?php

class Foo
{
	const HOGE = 1;
	
	public static function callClosure()
	{
		$closure = function () {
			var_dump(Foo::HOGE); // ①
		};
		$closure();
	}
}

Foo::callClosure();
```
ImageMagick | bash > 4枚の画像の重ね合わせ > overlay_image_171003_exec

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
```

### 関連

[ImageMagick > 画像のoverlapping > composite -compose over LN.png background.png out.png](https://qiita.com/7of9/items/2dcd57e36b5ce3cfb758)

### 複数画像の合成

compositeによる合成は2つの画像までのようだ。

複数画像を合成する処理を実装してみた。

重ね合わせする元画像は以下で作成したもの。
[ImageMagick | bash > white, blue, yellow, redの色を持つ4つのファイルを作成する > 同じサイズ | 異なるサイズ | 異なるサイズ+背景:透明](https://qiita.com/7of9/items/d17eca51b44daa2a2866)

### code v0.1

```bash:overlay_image_171003_exec
#!/usr/bin/env bash

files[0]="gray.png"
files[1]="blue.png"
files[2]="yellow.png"
files[3]="red.png"

LAST_IDX=3

for istart in $(seq 0 $((LAST_IDX-1)));do
  inext=$((istart+1))
  echo $istart $inext
  if [ $istart = 0 ];then
  	composite -compose over ${files[istart]} ${files[inext]} out.png
  else
  	composite -compose over wrk.png ${files[inext]} out.png  
  fi
  mv out.png wrk.png
done
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3524eb6e-1fdb-219b-e80b-10b7f2e4f273.png)

### code v0.2 > 実行時引数を使用

```bash:overlay_image_171003_exec
#!/usr/bin/env bash

#
# v0.2 Oct. 03, 2017
#   - take runtime parameters (inputs and output)
# v0.1 Oct. 03, 2017
#   - composite multiple images
#

if [ $# -le 4 ];then
	echo "Error:invalid parameter"
	echo
	echo "Usage:"
	echo "  $0 [in1] [in2] [in3] [in4] [out]"
	exit
fi

IN_FILES[0]=$1
IN_FILES[1]=$2
IN_FILES[2]=$3
IN_FILES[3]=$4
OUT_FILE=$5

LAST_IDX=3
STOP_IDX=$((LAST_IDX-1))

for istart in $(seq 0 $STOP_IDX);do
  inext=$((istart+1))
  #echo $istart $inext
  if [ $istart = 0 ];then
  	composite -compose over ${IN_FILES[istart]} ${IN_FILES[inext]} out.png
  else
  	composite -compose over $OUT_FILE ${IN_FILES[inext]} out.png  
  fi
  mv out.png $OUT_FILE
done

```
RaspberryPiでSTM32開発環境の構築

# RaspberryPiでSTM32開発環境の構築
RaspberryPi3でSTM32 ARMマイコンを開発できるよう環境構築する。
## 用意したもの
-開発ホスト
RaspberryPi3
OS:Raspbian
-開発ターゲット
STM32 Nucleo Board STM32F303K8

RaspberryPi3とNucleoはUSBケーブル(Nucleo側はmini)で接続
## 参考サイト
参考にしたサイトは以下。
[UbuntuでSTM32 ARMマイコンの開発環境を整える](https://daichiahl.wordpress.com/2016/01/23/ubuntu%E3%81%A7stm32-arm%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%95%B4%E3%81%88%E3%82%8B/)
## 手順
###(1)ToolChainのインストール
 RaspberryPi3にはiPadからSSHで接続しているため、CUIで開発できる環境を選んだ。

```
sudo apt-get install binutils-arm-none-eabi gcc-arm-none-eabi
sudo apt-get install gdb-arm-none-eabi
```
###(2)ST-LINKドライバのインストール
Nucleoボードにはデバッガが搭載されているためST-LINKのドライバをインストールする。
ビルドにcmakeを使用するためインストールしておく。

```
sudo apt-get install cmake
sudo apt-get install libusb-1.0
```
適当なディレクトリで

```
git clone https://github.com/texane/stlink
cd stlink
make
cd build/Release
make
sudo make install
```
LD_LIBRARY_PATHに/usr/local/libを設定する

###(3)プログラム作成
プログラミングの内容は別途[こちら](https://qiita.com/mitazet/items/59f953ecfaadd3092e08)に記載。
main.elfがバイナリとして作成されたとする。

###(4)ST-LINKの起動

```
st-util
```
###(5)ST-LINK GDBクライアントによるプログラムの書き込み
ST-LINKとは別のコンソール立ち上げGDBを起動する。

```
arm-none-eabi-gdb main.elf
(gdb) tar ext :4242
```
この4242はST-LINKで使用するポート。
続いて書き込み。

```
(gdb) load
```
実行。

```
(gdb) kill
(gdb) run
```
そして、プログラムが走り出す。
Javaだけで、webのフロントとサーバが作れるGWTを始めませんか？　その４（開発環境の構築）_修正

以前、ご紹介したGWTの説明資料でリンクが正しく機能していなかったので、修正版を投稿いたしました。

http://kut2.nl/GWT_JAPAN/
CMake がキョドったら -GNinja で生成した build.ninja を読め

今回もタイトルでほぼ完結なので以下駄文です。

CMake で思った通りに動く Makefile を吐けなくて困った経験はありませんか?
困ったので CMake が吐いた Makefile を覗いてみたら人間向きの読み物ではないことを知ってうなだれたり発狂したりしたことありませんか?

CMake -GNinja が吐く build.ninja (と rules.ninja) はモノリシックかつ人間にもどうにか追えるファイルフォーマットなので、困ったときは build.ninja を吐かせてエディタで追ったりしてみましょう。いろいろ謎が解けるでしょう。ついでにチューニングの素材ともなります。

なお build.ninja の例はあえてここでは挙げません。挙げてみたかったんですが Clang/LLVM の build.ninja は 20MB くらいあるし…

せっかくだからこれを機に Ninja を使いましょう。インストールめんどくさければ ~/bin にビルドツリーからの symlink でもいいんです。

厄介なバグ(CMake 関係ではない)の原因をつきとめた気晴らしに短文を書いてみました☆
HTMLタグだけで簡易自動リロード（再読み込み）

### ○秒に一回更新
リアルタイムWEBとかじゃなくていい、watchコマンド的に定期的に更新されるページをつくりたい、という場合はメタタグ1行で実現できます。

```
<meta http-equiv="refresh" content="60" >
```
（この例だと60秒に一度リロード）

参考：
http://www.tagindex.com/html_tag/page/meta_refresh.html

### おまけ
チャット的なリアルタイムWEBならNode.js＋Socket.IOなんですかね。（聞きかじり）

- [Socket.IOを使ってNode.jsでリアルタイムWebアプリを開発する](https://thinkit.co.jp/story/2013/03/27/4003)
- [Node.jsとWebSocketでリアルタイムチャットをやってみた](http://www.websuppli.com/javascript/443/)
- [Node.js+Express+socket.ioでリアルタイムチャットを作ってWeb Appsに無料ホスティングする](https://qiita.com/n0bisuke/items/dfb588013838133f6045)
- [「リアルタイムWEBを実現する技術」の触りを知っておく為のまとめ](https://qiita.com/otmb/items/138f12c8832f78b2534d)
python2が入っているmacでpython3のライブラリをインストールする方法

#この記事について
macでpython３を使いたいと思い、必要なライブラリをインストールしようとした際に、デフォルトでインストールされているpython2のライブラリに邪魔をされたので、正しいインストールの方法をまとめておきたいと思います。

<dl>
  <dt>問題</dt>
  <dd>python2に邪魔されてpython3のライブラリがインストールできない</dd>
  <dt>解決策</dt>
  <dd>バージョンを指定してインストール
  <dd><code>python3   -m pip install [パッケージ名]</code></dd>
</dl>

以下で、詳しく解説していきます。

#python3の環境構築
python関連ライブラリのインストール方法についてですが、以下のようなツールを用いてインストールやバージョンの管理を行うのが一般的です。

- anaconda(https://www.anaconda.com/download/#macos)
- homebrew(https://brew.sh/)
- pip(https://pip.pypa.io/en/stable/installing/)

どれを使うかは各人に好みかと思いますが、私はpipを用いて実行しました。（python3.4以降のバージョンにはpipがデフォルトでインストールされているようです。）

#python2が邪魔でpython３のライブラリがインストールできない？！
調べて最初に出てくるのは、

`pip install`

とターミナルに打ち込めばいいよ。という趣旨のもの。ところが、そうすると、

`Requirement already satisfied: pandas in /usr/local/lib/python2.7/site-packages`

というメッセージが返ってきます。つまり、「もうそのライブラリ、あるよ。」といわれてしまったわけです。

macには、デフォルトでpython2がインストールされています。`pip install`のコマンドを実行すると、勝手にpython2の方のinstallと判断されてしまって、３の方には新しいライブラリが入りません。正しくは、バージョンを指定してインストール必要があります。

`python3   -m pip install [パッケージ名]`

例えば、pandasというライブラリをインストールしたい場合には、

`python3   -m pip install pandas`

と書けば良いわけです。


＜追記＞
インストールではなく、ライブラリの更新をしたい時には、
`python3 -m pip install --upgrade [パッケージ名]`
と書きましょう。
img要素の画像をデータURIスキームに変換する。

画像ファイルを取得してcanvasに転写し、DataURIsに変換して差し替えるスニペット。

```js

d3.selectAll("img")
    .each(function(){
        var canvas = document.createElement('canvas');
        canvas.width = this.clientWidth; 
        canvas.height = this.clientHeight;         
        canvas.getContext('2d').drawImage(this, 0, 0);
            
        var dataURI = canvas.toDataURL('image/png');
        d3.select(this).attr("src", dataURI);
        
        d3.select(canvas).remove();
        
});
```
Eclipseで削除したファイルを復元する(Restore Deleted Files in Eclipse)

1.**`Right-click on the folder of deleted file ⇒ Select Restore from local history`**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204707/ff903d1d-7a42-fafc-7a3a-03a81354c3b6.png)
2.**`Select your files ⇒ Click ok`**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204707/ca07667e-3cfd-38ad-4f50-f151d8dc9a7f.png)
xserverにComposerをインストールして使えるようにする


## はじめに

運用しているサイトのxserverにSSHで接続したら、CLIのPHPのバージョンが5.1と表示されていて、composerのインストールに若干詰まったのでメモ。
> 管理画面ではPHPのバージョンはphp7.0に指定していた。
> [公式](https://getcomposer.org/download/)のドキュメントの方法ではインストールできなかった(CLIのバージョンが古いため)


## composerのインストール

> curlコマンドを使う
> 以下の`php7.0`の部分を使っているPHPのバージョンに合わせる

```
// curlでインストール
$ curl -s https://getcomposer.org/installer | /usr/bin/php7.0
```


## php composer.phar installを行う方法

調べてみると、`php composer.phar install`を行うと出てきたのだが、こちらを実行すると`PHP Fatal error:  Class 'Phar' not found`と出てきた。

ではどうするか。

先ほどのPHPのバージョンを指定してコマンドを実行する

```
$ php7.0 composer.phar install
```

のようにする
ImageMagick | bash > white, blue, yellow, redの色を持つ4つのファイルを作成する > 同じサイズ | 異なるサイズ | 異なるサイズ+背景:透明

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
```


bashとImageMagick にて指定の色のファイルを作る。

### 参考

https://superuser.com/questions/294943/is-there-a-utility-to-create-blank-images
> answered Jun 9 '11 at 9:18
crnv

```
convert -size 32x32 xc:white empty.jpg
```

### code > 同じサイズ

上記をもとに以下を実装した。

```bash:test_make_emptyPng_171003_exec
#!/usr/bin/env bash

IMGSIZE="100x100"

for acolor in white blue yellow red;do
  convert -size $IMGSIZE xc:$acolor $acolor.png
done
```

実行すると以下のファイルが生成され、それぞれの色が付いた画像となる。

- white.png
- blue.png
- yellow.png
- red.png

### code > 異なるサイズ

色がついた部分を異なるサイズにして、画像サイズは同じとする実装。

```bash:test_png_diffSizes_171103_exec
#!/usr/bin/env bash

EXTSIZE="100x100"

colors[0]="gray"
colors[1]="blue"
colors[2]="yellow"
colors[3]="red"

sizes[0]="40x40"
sizes[1]="60x60"
sizes[2]="80x80"
sizes[3]="100x100"

for idx in $(seq 0 3);do
	acolor=${colors[idx]}
	convert -size ${sizes[idx]} -extent $EXTSIZE xc:$acolor $acolor.png
done
```

### code > 異なるサイズ + 背景色:透明

```bash:test_png_diffSizes_transparent_171103_exec
#!/usr/bin/env bash

EXTSIZE="100x100"

colors[0]="gray"
colors[1]="blue"
colors[2]="yellow"
colors[3]="red"

sizes[0]="40x40"
sizes[1]="60x60"
sizes[2]="80x80"
sizes[3]="100x100"

WRK_FILE="wrk.png"

for idx in $(seq 0 3);do
	acolor=${colors[idx]}
	convert -size ${sizes[idx]} xc:$acolor -extent $EXTSIZE wrk.png
	convert wrk.png -transparent "rgb(255,255,255)" $acolor.png
done

rm -f $WRK_FILE

```
エラー文「You cannot use the new command inside an Angular CLI project.」


Angularプロジェクトを以下のコマンドで生成しようとした時、エラーが発生した。

```
$ ng new [project名]
```

エラー文：
You cannot use the new command inside an Angular CLI project.

```
$ npm init
```

package.jsonを生成して再度実行したところ、無事に雛形プロジェクトが生成されました。
git reset --hard の復元

# やらかした
`git reset --hard [コミットID]`
ローカルコミットをファイル（変更箇所）毎消しちゃった。。。

# 落ち着いて確認
これでgitのログを確認。戻りたい履歴の`HEAD@{*}`の番号を確認する。
`git reflog`

# 復元
`git reset --hard "HEAD@{1}"`

HEAD@{1}の「{1}」は`git reflog`で確認した戻りたい履歴の番号を入れる。
S3互換ストレートエンジンminioで仮想ホスティング形式（サブドメイン形式）を使う

[minio](https://www.minio.io/)というS3互換のストレージエンジンがあります。
プログラムが1つで完結していて設置が簡単にできて、簡単ながらwebの管理画面まで含まれているという優れものです。

さて、S3のURLにはパス形式と、仮想ホスティング形式の2つがあります。

```
パス形式: https://minio.example.com/<バケット名>/file
仮想ホスティング形式: https://<バケット名>.minio.example.com/file
```
バケット名がパスの先頭に入るか、サブドメインとして入るかの違いです。

minioはパス形式しか対応していません。
ですが、最近では仮想ホスティング形式のほうが主流のようで、S3クライアントやライブラリのデフォルト設定ではminioに接続できないことがあります。

そこでnginx（webサーバ）を一枚噛ませて、仮想ホスティング形式のURLをパス形式のURLに変換することにします。

```
server {
    listen 80;
    server_name <バケット名>.minio.example.com;

    root /var/tmp;
    index index.html index.htm;

    client_max_body_size 50M;

    try_files $uri @minio;

    location @minio {
        rewrite /(.*) /<バケット名>/$1 break;
        proxy_pass http://localhost:9000;
        proxy_redirect default;
    }
}
```

`rewrite` で、パスの先頭に `/<バケット名>/`　を挿入することでパス形式に変換します。

バケットが増える度にバーチャルホストの設定が増えるのが面倒ですが、nginxだとserver名にワイルドカードが使えるので、それを利用すれば1設定ファイルで全バケットに対応できるかもしれませんね。チャレンジできる人はチャレンジしてみてください。
Mac OS XでRedis Clusterを立てる

## 開発環境
+ Mac:10.12.6
+ redis:4.0.0
+ ruby:2.0.0p648

# １サーバで3台のRedis Clusterを作る(最低３台から、スレーブをやるには６台から)

1.ディレクトリの用意

```
$ mkdir ~/cluster-test
$ cd ~/cluster-test
$ mkdir 700{0,1,2}
```

2.最小構成の設定ファイルを用意する

```
$ cd 7000
$ vim redis.conf
```
``` redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes 
```

3.各サーバの起動

``` 
terminal A
$ cd 7000
$ redis-server ./redis.conf
```
``` 
terminal B
$ cd 7001
$ redis-server ./redis.conf
```
``` 
terminal C
$ cd 7002
$ redis-server ./redis.conf
```

4.redisのソースを任意のディレクトリにダウンロード
http://download.redis.io からLatest stable versionの圧縮ファイルをダウンロードして任意のディレクトリに展開する

```
$ cd 
$ tar zvxf redis.tar
```

5.gemのredisをインストール

```
$ sudo gem install redis -v 3.3.3 
(ruby2.0.0なのでversion3.3.3にする)
```

6.クラスタリング

```
$ cd ~/redis/src/
$ ./redis-trib.rb create 127.0.0.1:7000 127.0.0.1:7001  127.0.0.1:7002
```
+ Can I set the above configuration? と聞かれるので yes を入力します
+ [OK] All nodes agree about slots configuration. となれば Cluster の構築は完了です

## 動作確認

```
$ redis-cli -c -p 7000
```
### Redis Clusterをredis-commanderで扱うにはどうすれば？（他のツールでもいいけど）

## 参考URL
+ https://qiita.com/sawada_masahiko/items/7b7956373b1a159e20c4
+ http://blog.kakakikikeke.tk/2015/08/try-redis-cluster.html

## 追記

上記で展開した、redisのソースにRedis Clusterを作るスクリプトがあるので、それを使うと簡単。
utils/create-clusterディレクトリにcreate-clusterというスクリプトがある。
使い方は同ディレクトリのreadmeを参照する。

```
開始するとき
$ ./create-cluster start
$ ./create-cluster create
```
```
停止するとき
$ ./create-cluster stop
```
MySQL5.7でrootパスワード初期化変更メモ / 2017年10月

パスワードを忘れたときに役立つ、rootパスワードを簡単初期化変更するためのメモです。
#初期化方法
1.MySQL停止
```$ mysql.server stop```

2.MySQL起動
```$ mysql.server start --skip-grant-tables```
→パスワード無しで接続可能

3.MySQLに接続
```$ mysql```

4.データベース選択
```use mysql;```

5.パスワードの更新```
update user set authentication_string=PASSWORD("新しいパスワードを記述") where User='root';
flush privileges;
```

6.MySQLを再起動

MySQLの接続解除
```quit;```
MySQL再起動```
$ mysql.server stop
$ mysql.server start
```
gtag.jsでページビューのときにカスタムディメンション送信

GAのトラッキングコードがgtag.jsに変わって、必要になったのでメモ。

カスタムディメンションの送信については 
 https://developers.google.com/analytics/devguides/collection/gtagjs/custom-dims-mets を見ると

```
gtag('config', 'GA_TRACKING_ID', {
  'custom_map': {'dimension<Index>': 'dimension_name'}
});

gtag('event', 'any_event_name', {'dimension_name': dimension_value});
```

こんな感じで書いてあってconfigでdimension_nameを定義して、そのあとはevent発生させるときにdimension_nameとdimension_valueの組み合わせの連想配列を渡してあげればよいとなってる。

でも、gtag.jsってconfigのときにpageviewが送信されるようになってるので、このときにカスタムディメンションを送れるようにしたい。

analytics.jsだとpageviewの前にsetでできましたが、gtag.jsでは以下の通りでできるようです。

```
gtag('config', 'GA_TRACKING_ID', {
  'custom_map': {'dimension<Index>': 'dimension_name'},
  'dimension_name': dimension_value
});

```
つまり、先のリンクにあるサンプルからするとこうですね。

```
gtag('config', 'GA_TRACKING_ID', {
  'custom_map': {'dimension2': 'age'}
  'age': 12
});
```
var_dumpの結果が省略されたので、全出力されるようにした

var_dumpファンクションでデバッグを行おうとした時、
子配列配下が「・・・」表記で省略されてしまった。

省略せずに表示させたく、
htaccess に以下を追記した。

```
php_value xdebug.var_display_max_children -1
php_value xdebug.var_display_max_data -1
php_value xdebug.var_display_max_depth -1
```
Sebastienでチャットボットが喋りだす

# Sebastien
セバスチャンと読みます。NTTドコモが開発した対話型AIアシスタント開発サービスです。

## 出来ること
日本語でボットを喋らせることが出来ます。日本語で話しかけてボットに指示を出せます。テキストではなく日本語の音声でボットを操ることが出来る、唯一のボット開発サービスです。（2017年10月時点）

## ここがすごい
他のボット開発ツールと連携できます。今まで使っていた開発ツールがあるならそのまま使い続けて、日本語の入出力だけをSebastienにやらせる、ということも可能です。

## 使ってみる
ダッシュボードにログインします。ダッシュボードはふたつあり、アプリやIoT機器などのデバイスを登録する「UserDashboard(UDS)」と、ボットの処理を設定する「DeveloperDashboard(DDS)」です。ボット開発に主に使うのはDDSですが、初回はUDSの設定が必要です。

- UDS([https://users.sebastien.ai/](https://users.sebastien.ai/))
- DDS([https://developers.sebastien.ai/](https://developers.sebastien.ai/))

どんなものが作れるのか具体的なデモの事例は[こちら](https://qiita.com/hiroka/items/1e034345d5be56c69a34)
EMR上でHive2.1から2.3へ

EMR限定なのかどうかは知らないけど、とりあえず書いておく。
某所に怒られたら消そう。ありがとう某所の中の人。

Emr5.8.0はHiveのバージョンが2.3.0になっており、どうやら2.1系とメタストアの互換性がないらしい。そのため、2.1系でRDSとかにメタストア作ってた場合、流用しようとするとクラスタの起動が出来ない。

以下はEMRでの手順を指す。一部手順はEMR使ってない場合でも流用できる気がする。

まず、hive-siteから

```
javax.jdo.option.ConnectionUserName
javax.jdo.option.ConnectionPassword
javax.jdo.option.ConnectionURL
```

この3つの設定ふっとばしてローカルのメタストアを向くようにしてクラスタ起動。

その後、masterインスタンスに繋いで/etc/hive/conf/hive-site.xmlを直接編集する。
※rootユーザ

```
javax.jdo.option.ConnectionUserName
javax.jdo.option.ConnectionPassword
javax.jdo.option.ConnectionURL
```

この3つがローカル用の設定になってるはずなので、それを今まで2.1系で使ってたRDSの設定を入れる。

その後、hadoopユーザとなり、

```
hive --service schemaTool -dbType mysql -info
```

を実行すると、

```
...
Hive distribution version
Metastore schema version
...

*** schemaTool failed ***
```

こんなんが出るはず。で、多分2つのversionが違うはずなので、

```
hive --service schemaTool -dbType mysql -upgradeSchema

...

schemaTool completed
```

失敗しなけりゃOK。またinfo叩くと今度は成功するはず。
なんかupgradeSchemaの中身は.sqlファイル実行してるだけくさいから直接手動でSQL流すでもいけるんでは？と思いはしたけどやめておいた。

## 20171027追記
ドハマりしたが解決したので。(確認バージョンEMR5.9.0)
core-siteに

fs.s3.awsAccessKeyId
fs.s3.awsSecretAccessKey

の設定がしてある場合、hiveでcountクエリが通らなかった。
ロールにs3のフル権限つけて、上の設定外したら通るようになった。
EclipseのMavenプロジェクトに slf4J + logback を追加

ログを出すつもりのないプロジェクトだったんだけど、
ログがほしいと言われたので足してみた

何も考えずにlog4jでやろうと思っていたんだけど、
どうやらすでに古いらしいｗ
そりゃそうだよな・・・

調べて言った結果、log4j2とslf4J + logbackの２つが主流っぽい
語呂的にはlog4j2のほうがよかったんだけど、
なんとなく新しいっぽいslf4J + logbackを選択！

いざ設定！！
[Eclipse で Maven プロジェクトの作成から slf4J + logback の設定](http://www.shookuro.com/entry/2017/04/28/153101)
こちらをそのまま真似させてもらいましたｗ

pom.xmlを開き以下を追加

``` pom.xml
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.18</version>
        <scope>provided</scope>
    </dependency>
  </dependencies>
```

プロジェクトを右クリックから、Maven - プロジェクトの更新 で反映
反映したらJava1.5になっちゃったので、java1.7を使うように変更

lombockを入れたのは、以下の記述をクラスに毎回書くことをなくすため

```
public static final Logger log =...」
```

ただしlombockをEclipseで使うにはインストールが必要
コマンドを実行しインストーラーが立ち上がるのでインストール実行（一瞬で終わります）

```
$ java -jar /Users/xxxxxx/.m2/repository/org/projectlombok/lombok/1.16.18/lombok-1.16.18.jar
```

でも代わりにこんな記述が必要になりました
（個人的にはこちらのほうがわかりにくいので、lombock入れなくてもよかったと思っていますが、、、）

```
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Main {
```

[logbackのマニュアル](https://logback.qos.ch/manual/configuration_ja.html)を見たところ、
出力レベルの設定とかそんなんはlogback.xmlに書き込むとのこと
だけどどこにも見つからない・・・

Mavenプロジェクトを作成する時に、どこかで設定をミスったのかな
src/main/resources
のソースフォルダーを作って、その中にlogback.xmlを置くことで解決

あとはこちらを参考に設定しました
[logback.xmlを設定する](http://javazuki.com/articles/slf4j-logback-usage.html)
(初心者向け)Swift3.0で初アプリ - 万歩計アプリ

Swift3.0を使って簡単なiPhoneアプリを作ってみます
万歩計アプリです。ViewController.swiftに下記をコピペします
Info.plistで`Privary - Motion Usage Description`を登録します

```

import UIKit
import CoreMotion

class ViewController: UIViewController {
    
    var myPedometer: CMPedometer!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
         // 画面の背景色を指定
        self.view.backgroundColor = UIColor(red:1.0,green:1.0,blue:0.875,alpha:1.0)

        // 歩数表示ラベルを作成
        let myStepLabel: UILabel = UILabel(frame: CGRect(x:0,y:0,width:150,height:150))
        // ラベルの背景色
        myStepLabel.backgroundColor = UIColor(red:1.0,green:0.875,blue:1.0,alpha:1.0)
        // ラベルの背景色
        myStepLabel.layer.masksToBounds = true
        myStepLabel.layer.cornerRadius = 75.0
        myStepLabel.textColor = UIColor.black
        myStepLabel.shadowColor = UIColor.gray
        myStepLabel.font = UIFont.systemFont(ofSize: CGFloat(30))
        myStepLabel.textAlignment = NSTextAlignment.center
        myStepLabel.layer.position = CGPoint(x: self.view.bounds.width/2,y: 200)
        // Viewに追加
        self.view.addSubview(myStepLabel)

        // 歩数計を生成
        myPedometer = CMPedometer()
        
        // ペドメーター(歩数計)で計測開始
        myPedometer.startUpdates(from: NSDate() as Date, withHandler: { (pedometerData, error) in
            if let e = error {
                print(e.localizedDescription)
                return
            }
            guard let data = pedometerData else {
                return
            }
            let myStep = data.numberOfSteps
            myStepLabel.text = "\(myStep) 歩"
        })
    }
    
}

```

- iPhoneの万歩計データは非同期に更新されるので慌てずに稼働を確認します。「ヘルスケア」メニューからも歩数のデータを確認可能です
- [万歩計の歩数の取得](http://docs.fabo.io/swift/coremotion/003_coremotion.html)を参考にさせていただきました。
FireGesturesのスワイプジェスチャが効かなくなったら


毎度イライラするので今回の対処法をメモ。

## 対処法

about:configの下記設定を確認。
このスワイプジェスチャーの設定値は、FireGesturesの設定画面から変更できるが反映されなくなくことがある。

`browser.gesture.swipe.down`
`browser.gesture.swipe.left`
`browser.gesture.swipe.right`
`browser.gesture.swipe.up`

手動で上記の設定値を空にすると直った。

## その他の設定

### システム環境設定

トラックパッドの設定で「ページ間をスワイプ」が「3本指でスワイプ」になっている。

### FireGesturesの設定

「スワイプジェスチャ」にチェックが入っている。
「連続的なスワイプによるマウスジェスチャ」にチェックが入っている。
vimでaleとunite使ってるのでunite-aleを作った話

# tl;dr

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">是非作ってください</p>&mdash; 暗黒美無王 dark neo power (@ShougoMatsu) <a href="https://twitter.com/ShougoMatsu/status/914755775335063552?ref_src=twsrc%5Etfw">2017年10月2日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

----

2017/9/30(土)のOsaka.vim #11にて[ALE](https://github.com/w0rp/ale)の存在を知りました。
[ALE](https://github.com/w0rp/ale)はVim8/Neovimのプラグインでlintを非同期で実行してくれます。

この結果の一覧をUniteで表示/ジャンプしようというのが[unite-ale](https://github.com/iyuuya/unite-ale)です。

以下はALE/Rubocop(Ruby)を動かしてみたときのGIFです。
![ale.gif](https://qiita-image-store.s3.amazonaws.com/0/2222/cdfec7a8-8f9d-8e8c-7177-34ed82ce0963.gif)

## バグ

~~`:Unite ale -no-quit`したときに`<C-l>`で`<Plug>(unite-redraw)`が実行されますが、これに対応していないので対応したいです。
誰か詳しい方PullRequest頂ければ嬉しいです。~~

あとは[Issue](https://github.com/iyuuya/unite-ale/issues/new)で…

## 余談
開発に掛けた時間は以下のような感じになりました。

- ALEのソースを読む: 10分
- Uniteのsourceの作り方を調べる: 20分
- コーディング: 5分

---

deniteで作れとのこと

追記(2017/10/04):作った https://github.com/iyuuya/denite-ale

以上
LinuxでCSVの特定の列がNullの行を取り出す

catとawkコマンドで実現。

awkの-Fオプションではデリミタを指定（下記はカンマを指定）。
その後は'パターン {アクション}'という形式で、パターンに一致したときにさせたいアクションを記述。
今回は9番目の項目がNULLだったら行全体を出力させる。
awkの\$0は行全体を意味する。今回の場合、おそらく\$0は省略可能。

```shell-session
cat target.csv | awk -F, '$9==NULL {print $0}' >9col_null_records.csv
```

これだけでOK。awk非常に便利。

awkはここのサイトがわかりやすそうだった。
https://www.ibm.com/developerworks/jp/linux/library/l-awk1/index.html
CentOS7なインスタンスのルートボリューム拡張

まったく覚えられないからめも。

### CentOS7からデフォルトのファイルシステムはxfsになってた

```
# df -T
ファイルシス   タイプ   1K-ブロック    使用   使用可 使用% マウント位置
/dev/xvda1     xfs         52417516 3562912 48854604    7% /

(省略)
```

### 例に漏れずそのままだとルートボリュームは何Gのせても8Gなのである
```
# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1       8.0G  3.6G  4.5G   44% /

(省略)
```

### 拡張手順
#### growpartいるかな
```
# rpm -qa | grep growpart
cloud-utils-growpart-0.29-2.el7.noarch
```

#### growpartする
```
# growpart /dev/xvda 1
CHANGED: partition=1 start=2048 old: size=16775168 end=16777216 new: size=104855519,end=104857567
```

#### xfs_growfsする
```
# xfs_growfs -d /
meta-data=/dev/xvda1             isize=512    agcount=4, agsize=524224 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2096896, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096896 to 13106939
```

#### 拡張されました
```
# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1        50G  3.6G   47G    8% /

(省略)
```

ぐぐってたら、いきなりxfs_growfs して「data size unchanged, skipping」って言われる！って
言ってる人がいたけどgrowpartすれば大丈夫。
でももしかしてgrowpartってfdiskとかで終点変えるのと同じなんですかね。
LinuxでCSVファイルの特定の列を取り出す

備忘録

cutコマンドを利用してtarget.csvから全行の9列目の項目を取り出す。

```shell-session
cut -d ',' -f 9 target.csv
```

-d オプションでデリミタを指定する。（デフォルトはタブ）
-f オプションで取り出したい列を指定する。

取り出した内容をファイルに吐き出したい場合は以下のように ">" でリダイレクト。

```shell-session
cut -d ',' -f 9 target.csv >dist.csv
```
Cordovaのios-deployインストール時にエラーが出た時

ios-depyloyのインストールorアップデートを下記の様にしようとして

```
sudo npm install -g ios-deploy
```

こんなエラーがでてしまうことがあり。

```
ENOENT: no such file or directory, chmod '/usr/local/lib/node_modules/ios-deploy/build/Release/ios-deploy'
```

https://github.com/phonegap/ios-deploy#os-x-1011-el-capitan-or-greater

この部分にちゃんと書いてありました。El Capitan以降は、このようにオプションを付けないと、上手く動作しない模様。

```
sudo npm install -g ios-deploy --unsafe-perm=true
```
【備忘録】Chrome DevToolsで要素に適用されているフォントを確認する方法


最近Webフォントを利用する機会が増えています。
そうじゃなくてもいち要素に対して複数のフォント指定を行なっていると思います。

そんな設定状態でじゃあ実際にはどのフォントが反映されているんだろう？

というのを確認する方法です。

## 概要

CSSで`font-family`指定をしていていも、
ローカルフォントが適用されているだけなのか、
ぱっと見ではわかりません。

それを確認する方法がChromeのDevToolsにはあったので備忘録として残します。

## 手順

1. 該当ページをChromeで表示
2. 該当要素をInspect(`Shift`+`Cmd`+`C`)で選択
3. **Elements** > **Computed** > **Rendered Fonts** を確認<br>
※ Panel Layout が **horizontal**の場合は**Styles**の右カラム最下部

## 表示内容

**<Font名> - Network resource**と表示されていたらWebフォントが適用されています。
**<Font名> - Local file**と表示されていたら閲覧しているPC内のフォントが適用されています。
【FuelPHP】Query Builderでフィールド上書き(UPDATE)

例えば、下記のようなテーブルがあるとする。

```
CREATE TABLE `sample` (
  `sample_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `delete_flag` bigint(20) unsigned NOT NULL DEFAULT '0',
  `sample1` int(10) unsigned DEFAULT NULL,
  `sample2` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`sample_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

**delete_flag** に **sample_id** を代入して上書きしたい。
発行したいSQLは以下の通り

```
UPDATE sample SET delete_flag = sample_id, sample1 = 1 WHERE sample2 = 2;
```

以下のようにして書くと、上記と同じようなSQLが発行できた。

```
// 上書き用変数作成
$update_set['sample1'] = 1;
$update_set['delete_flag'] = DB::expr('sample_id');

// SQL 実行
DB::update('sample')->set($update_set)->where('sample2', '=
', 2)->execute();		
```

**DB::expr** 関数をしようせずに実行すると誤ったSQLが発行される。

```
// 上書き用変数作成
$update_set['sample1'] = 1;
// ↓この状態だと、delete_flag に sample_id という文字列を入れてしまう。
$update_set['delete_flag'] = 'sample_id';

// SQL 実行
DB::update('sample')->set($update_set)->where('sample2', '=
', 2)->execute();		
```

【参考】[FuelPHP公式](http://fuelphp.jp/docs/1.8/classes/database/db.html#/method_expr)
Project Euler Q9 【特別なピタゴラス数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
ピタゴラス数(ピタゴラスの定理を満たす自然数)とは $a < b < c$ で以下の式を満たす数の組である.
$a^2 + b^2 = c^2$

例えば, $3^2 + 4^2 = 9 + 16 = 25 = 5^2$ である.

$a + b + c = 1000$ となるピタゴラスの三つ組が一つだけ存在する.
これらの積 $abc$ を計算しなさい.

## 解答

```bash
seq 1000 |
awk '{for(i=$1;i<=1000;i++){print sqrt($1^2+i^2),$1,i}}' |
awk '$1+$2+$3==1000{print $1*$2*$3}'
31875000
```

最初は数学的に紙と鉛筆で解こうと思ったが、途中でよくわからなくなった。。
ワンライナーでやったらすぐ終わったよ。。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
[Python で Project Euler #9「特別なピタゴラス数」](https://qiita.com/hoxo_m/items/a9aa6651774565d6cd4d)
Eclipseのメニューが押せなくなる

※メモ  
#現象
macOS(High Sierra)でのEclipse(ローカライズ化/ver4.7)起動後にメニューバーをクリックできない

#対処方法
Eclipseの言語設定を英語で起動

```shell-session:terminal
$ /Applications/Eclipse.app/Contents/MacOS/eclipse -nl en
```
　　or

/Applications/Eclipse.app/Contents/Info.plistのCFBundleLocalizationsをコメントアウト

```html:Info.plist
	<!-- <key>CFBundleLocalizations</key>
		<array>
			<string>ar</string>
			<string>cs</string>
			<string>da</string>
			<string>el</string>
			<string>en</string>
			<string>es</string>
			<string>de</string>
			<string>fi</string>
			<string>fr</string>
			<string>hu</string>
			<string>it</string>
			<string>iw</string>
			<string>ja</string>
			<string>ko</string>
			<string>nl</string>
			<string>no</string>
			<string>pl</string>
			<string>pt_BR</string>
			<string>pt</string>
			<string>ru</string>
			<string>sv</string>
			<string>tr</string>
			<string>zh_HK</string>
			<string>zh_TW</string>
			<string>zh</string>
		</array> -->
```

https://bugs.eclipse.org/bugs/show_bug.cgi?id=520176#c73 を参照
DynamoidのCRUDまとめ

# 前書き
Rails5でAPIを作っている際、AWSのDynamoDBの利用が必要になったので
ORMを探したところ、**[Dynamoid](https://github.com/Dynamoid/Dynamoid)**というORMが人気そうだったので、実際にCRUDで利用して見ました。

# Dynamoidのインストール
gemでバージョンを指定してインストールします。

```rb
gem 'dynamoid', '~> 1'
```

なお、aws-sdkのv2しか対応していないため指定してaws-sdkをインストールします。

```rb
gem 'aws-sdk', '~>2'
```

# 前準備
config/initializersに

* aws.rb(すでにある場合は編集なしです。)
* dynamoid.rb
* 
の２ファイルを作成し以下に編集します。

## aws.rb
ここには、AWSのクレデンシャルの設定を記述します。

```rb
# aws.rb
Aws.config.update(Rails.application.config_for(:aws).symbolize_keys)
```

## dynamoid.rb
ここには、Dynamoidの初期設定を記載します。
例では、namespaceをnullにしています。
Dynamoidは指定するAWSアカウント内にDynamoDBがない場合に自動で作成してくれるのですが
namespaceがnullではない場合、DB名に環境名が入るようになりますので
特に指定しない場合はnullで問題ありません。

```rb
# dynamoid.rb
Dynamoid.configure do |config|
  config.namespace = nil
end
```

## modelの記載
DynamoDBのカラムや名称はmodel内に記述します。
idはDynamoidが自動でHash値を入れてくれます。
defaultを指定する場合は例にしたがって記述すればdefault値が代入されます。

```rb
# models/table.rb
class Table
  include Dynamoid::Document
  
  table :name => "TableName", :key => "id", :read_capacity => 5, :write_capacity => 5

  field :is_deleted, :integer, {:default => "0"}
  field :is_enabled, :integer, {:default => "1"}
  field :title, :string
  field :body, :string
```

# CRUD
上述項目でDynamoidの利用ができるようになりますので
CRUDについてコード例をまとめます。
## Create

```rb
  def self.create(params)
    table = new(params)
    table if table.save
  end
```

## Read

```rb
  def self.read_all
    where(
      is_deleted: 0,
      is_enabled: 1,
    ).all
  end
```

## Update

```rb
  def self.update(id, params)
    table = find(id)

    table if table.update_attributes(params)
  end
```

## Delete
```rb
  def self.delete(id)
    table = find(id)

    table if table.delete
  end
```

# ハマりポイント
CRUDの処理にハマりはありませんでしたが
ControllerからParamaterを渡す際にハマりポイントがあり

```rb
params.to_h
```

と、ハッシュ化する必要がありました。
渡し方の問題かもしれませんが、Paramater部でエラーが出る場合はお試しください。

# 後書き
ApplicationRecordと同じ形でDynamoDBが触れるので、とてもわかりやすかったです。
Docker | 公開鍵でコンテナにssh接続する出来るようにするDockerfileの例

# 解説

dockerだからといって特別なことをするわけではない。
サーバー側でssh接続できる設定などをおこない、公開鍵を設置する。

# 動作例 ( Ubuntu の場合 )

## Dockerfile

```bash:Dockerfile
FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd

# ssh設定ファイルの書換え
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

# 手元の公開鍵をコピー
COPY id_rsa.pub /root/authorized_keys

# ssh用の port を晒す
EXPOSE 22

# 公開鍵を使えるようにする (パーミッション変更など)
CMD mkdir ~/.ssh && \
    mv ~/authorized_keys ~/.ssh/authorized_keys && \
    chmod 0600 ~/.ssh/authorized_keys &&  \
    # 最後に ssh を起動
    /usr/sbin/sshd -D
```

## 手元に鍵のペアを作っておく

```
$ ssh-keygen -f ./id_rsa -t rsa -b 4096 -C 'example@com' -N ''
```

## イメージをビルド


上記 `Dockerfile` の `COPY` 指定により、公開鍵がイメージにコピーされる。

```
$ docker image build . -t ssh_server
```

## コンテナを走らせる

```
$ docker run -d -p 10000:22 ssh_server
```

## 秘密鍵を指定してsshログインする

```
$ ssh root@127.0.0.1 -p 10000 -i id_rsa
```

# 環境

- Docker for mac
- Docker version 17.06.1-ce, build 874a737


# リンク

- [study-docker/ssh/public_key_login_with_copy at master · YumaInaura/study-docker](https://github.com/YumaInaura/study-docker/tree/master/ssh/public_key_login_with_copy)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->