OmniAICreator/Qiita-1.07M huggingface dataset:
VM環境のWindowsでハードディスクの容量が足らなくなたとき

VM環境で初期のハードディスクの割り当てが少なくて、動作中に容量が足らなくなってしまった。
VMの仮想マシン設定でハードディスクのサイズを変更しても割り当てのサイズが変更されるだけで、仮想上で実行しているWindowsの容量は未だ変わってくれません。パーティションのボリュームを変更してあげなければなりません。

# diskpartコマンドを使う

以下、その手順です。
管理者権限でコマンドプロンプトを開きます。

* list dis でディスクを確認
* select disk でディスクを選択
* list partition でパーティションサイズを確認
* list volume でボリュームを確認
* sel vol でボリュームを選択
* extend で空き領域いっぱいまで拡張

```bat
C:\Windows\system32>diskpart

Microsoft DiskPart バージョン 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
コンピューター: xxxxxxxxxxx

DISKPART> list dis

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン            80 GB    30 GB

DISKPART> select disk 0

ディスク 0 が選択されました。

DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ               49 GB  1024 KB

DISKPART> list volume

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0    D   WD Unlocker  UDF   CD-ROM        30 MB  正常
  Volume 1    C                NTFS  Partition     49 GB  正常       システム


DISKPART> sel vol c:

ボリューム 1 が選択されました。

DISKPART> extend

DiskPart はボリュームを正常に拡張しました。

DISKPART> list volume

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0    D   WD Unlocker  UDF   CD-ROM        30 MB  正常
* Volume 1    C                NTFS  Partition     79 GB  正常       システム


DISKPART>
```

# 参考

http://www.atmarkit.co.jp/ait/articles/0506/11/news012.html
http://www.atmarkit.co.jp/ait/articles/0812/26/news119.html
[Rails] PostgreSQLでカラム追加時にafterが使えないのでなんとかがんばる

なんでafter使えないんだこんちくしょう！
んで、RailsもRailsでModelでカラムの一覧を定義するようなところがないので、そこで順番を定義することもできないと。
(Railsについては調べきれていないだけかもしれないけど)

# やりたいこと

後からMigrationを追加すると、ActiveAdminの詳細ページとかでこうなってしまう。

![image](https://qiita-image-store.s3.amazonaws.com/0/64098/60b55b51-45eb-f91e-a39c-8ddda0c66bab.png)

後から追加した「画像」カラムに追加位置を指定できないので、「更新日」の後ろに追加されてしまった。かっこわるい。

もちろん、DSLで`show do row: id...`なんちゃらとやっていけば任意の順番で表示できるけど、めんどくさい。そういうことをしたくないんだ。ほんとにもう。
後からもっとカラム追加した時とかここ修正するの絶対忘れるし。

ということで、ActiveRecordの低層な部分でカラムの順番をなんとか動かせないかな。という記事です。

# ソースサンプル

## ダウンロード

[[Rails][ActiveRecord][PostgreSQL] sort columns / Gist](https://gist.github.com/goosys/aeb067db2423f1d6f39183dcb3a4bae2)

## ソース

```ruby:config/initializers/extensions/active_record/attributes.rb
#
# config/initializers/extensions/active_record/attributes.rb
# https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/attributes.rb
#
module ActiveRecord #:nodoc:
  module Attributes # :nodoc:
    module ClassMethods

      # Overriding method
      def columns
        # @columns ||= add_user_provided_columns(connection.schema_cache.columns(table_name)) #Original
        @columns ||= add_user_provided_columns(connection.schema_cache.columns(table_name).sort!(&scheme_comparator))
      end

      private

        # New method
        def scheme_comparator
          lambda do |a,b|
            a.name.end_with?("_at") ?
              (b.name.end_with?("_at") ? 0 : 1) :
              (b.name.end_with?("_at") ? -1 : 0)
          end
        end

    end
  end
end
```

# できた

といっても無理矢理ですけど！
（厳密にcreated_atとupdated_atだけにしたい場合は適宜変更してください）

![image](https://qiita-image-store.s3.amazonaws.com/0/64098/ce0780a5-c768-60b2-b1f6-0b7f4b39667a.png)

# でも

よく見たらこれ、columnにアクセスする度に毎回sortしてる？
要改良！
singular value decomposition(SVD)に関する確認

# objective

行列XのSVDが`X*X'`の固有値分解の結果と対応することを確認する。
このことは、SVDの結果を組み合わせると主成分分析と同等の結果を得られることの確認となる。
(計算上若干数値が変動する事はありえる)

# sample code

下記を実行。3x4の整数行列AのSVDの結果と、
A*A', A'*Aの固有値分解の結果とで、
得られる直交行列が同じであることを確認する。
matlabで記述しました。

```matlab:svdtest.m
A = randi(10, 3, 4);% generate a random integer matrix
[U, S, Vt] = svd(A)

[V1, D1] = eig(A*A')% eigen value decomposition of 3x3 matrix
[V2, D2] = eig(A'*A)% eigen value decomposition of 4x4 matrix

U*U'
Vt*Vt'
```

以下が実行結果。乱数なので変動します。

```matlabsession:result
U =
    0.7254   -0.0404   -0.6872
    0.4703   -0.6999    0.5376
    0.5027    0.7131    0.4887
S =
   20.6317         0         0         0
         0    7.6724         0         0
         0         0    3.2354         0
Vt =
    0.6149    0.4172   -0.4172    0.5233
    0.5186    0.1506   -0.1283   -0.8318
    0.2041    0.4612    0.8600    0.0781
    0.5579   -0.7685    0.2644    0.1679
V1 = % 列ベクトルの並び順、正負が異なることもあるがSVDの結果のUと等しい
   -0.6872   -0.0404    0.7254
    0.5376   -0.6999    0.4703
    0.4887    0.7131    0.5027
D1 =
   10.4680         0         0
         0   58.8651         0
         0         0  425.6669
V2 = % 列ベクトルの並び順、正負が異なることもあるがSVDの結果のVtと等しい
   -0.5233    0.4172    0.4172    0.6149
    0.8318    0.1283    0.1506    0.5186
   -0.0781   -0.8600    0.4612    0.2041
   -0.1679   -0.2644   -0.7685    0.5579
D2 =
   -0.0000         0         0         0
         0   10.4680         0         0
         0         0   58.8651         0
         0         0         0  425.6669
U*U' = % SVDの結果のUとVtはもちろん直交行列
    1.0000         0         0
         0    1.0000   -0.0000
         0   -0.0000    1.0000
Vt*Vt' =
    1.0000   -0.0000   -0.0000    0.0000
   -0.0000    1.0000    0.0000   -0.0000
   -0.0000    0.0000    1.0000    0.0000
    0.0000   -0.0000    0.0000    1.0000
```

特異値Sについて, S*S'が実対称行列(A*A')の固有値と対応することも確認できます。

```matlabsession
>> S*S'
ans =
  425.6669         0         0
         0   58.8651         0
         0         0   10.4680
% これがD2に等しいことが分かる。
```

線形代数の基礎ですが、こんな感じ。
SVDの結果がA*A'の固有値分解と同じであるので、
正方行列でない一般の行列を主成分分析しようと思ったら
NIPALSアルゴリズムの他にSVDを利用できる、ということになります。
s6/s6-overlayのsvscanctlコマンドでよく使うオプション

## svscanctl

TL;DR; [公式ドキュメント](http://skarnet.org/software/s6/s6-svscanctl.html)

### -a (Alarm)

```
# s6-svscanctl -a <svscandir> で対象ディレクトリ以下のサービスを直ちにスキャンする
$ s6-svscanctl -a /var/run/s6/services
# /var/run/s6/services以下には、/etc/services.d以下で定義しておいたサービス+αが作成されている
# ls /etc/services.d/
resolver
# /etc/s6/init # ls /var/run/s6/services
resolver      s6-fdholderd
```

### -t (Terminate)

s6-svscanがsuperviseしている全サービスにSIGTERMを送る。

応用すると、複数のサービスのうち特定のサービスが終了するときに全サービスを終了させるのは以下のように書ける。

```:/etc/services.d/<service名>/finish
#!/usr/bin/execlineb -S1

# only tell s6 to bring down the entire container, if it isn't already doing so
if { s6-test ${1} -ne 0 }
if { s6-test ${1} -ne 256 }

s6-svscanctl -t /var/run/s6/services
```
引用元: [janeczku/docker-alpine-kubernetes](https://github.com/janeczku/docker-alpine-kubernetes/blob/70266f1caf23c55d6ecb24cf233d1b829c8aedbd/rootfs/etc/services.d/resolver/finish)

READMEのここも参考に: https://github.com/just-containers/s6-overlay#writing-an-optional-finish-script
【Objective-C】三項演算子を使って真偽型のif文をすっきり【Swift】

三項演算子を使うことで真偽型のif文をすっきりできます。

<strong>値を入れる式 = 条件式 ? trueの場合 : falseの場合;</strong>


```objc
    BOOL isCheck;
    NSString *resultText;
    //Objective-CではBOOL型にYES,TRUE,1が使える
    isCheck = YES;   
```

if文だと

```objc
    if(isCheck){
        resultText = @"YES";
    }else if(!isCheck){
        resultText = @"NO";
    }
```

こうですが、三項演算子を使うと

```objc
    resultText = isCheck ? @"YES" : @"NO";
```

これだけでいいんです。
Swiftの場合は

```swift
var resultText : String?
var isCheck = false 

resultText = isCheck ? "YES" : "NO"
print(resultText!)
```

こんな感じです。
SwiftだとBoolの値はtrueかfalseしか使えないようです。
ターミナルからiCloud driveに移動する方法

#iCloudを使う理由
職場でDropBoxを使っていて、クラウドで保存するのに慣れていた。
私用ファイルの保存場所としてiCloudを使ってみる。

#iCloud Driveはどこにあるのか
やりたかったことは、

`pwd iCloud Drive Library Documents`
`cd iCloud Drive`

のような移動。最初はファインダー上の表示名で移動できるのかなと思っていた。

しかし、iCloudがどこにあるかわからない。

#ここにあった　（Mobile\ Documents/com~apple~CloudDocs）

`Users/momo/Library/Mobile\ Documents/com~apple~CloudDocs`
（usernameは私の名前です）

つまずいたのは半角スペース。
apple公式のコミュニティにおける回答では`Mobile Documents`と書いてあるが、これだと半角スペースの入った`Mobile`　のところで区切られるので　`No such file or directory`になってしまう。
`\`で区切ることで解決。

lsで確認。ちゃんとファイルが入っている。

#`\`　の出し方
いつも忘れちゃう。
`opt+¥`で出す。
組合せ最適化ソルバーの威力

# これなに
最適化問題を解くソルバーの威力(性能)をランダムで簡単な問題(ナップサック問題)を使ってみてみましょう。

# ランダムなナップサック問題を作成
アイテム数 n のナップサック問題[^1]を作成します。最適解が総アイテム数の8割くらいになるように調整しています。

```py3:python
import numpy as np
from pulp import *
def make(n):
    np.random.seed(1)
    w = 1 + np.random.rand(n)
    p = w + np.random.randn(n)*0.1
    m = LpProblem(sense=LpMaximize)
    v = [LpVariable('x%d'%i, cat=LpBinary) for i in range(n)]
    m += lpDot(p, v)
    m += lpDot(w, v) <= int(n*1.25)
    return v, m
```

# 計算時間を調べる
アイテム数を変えながら、計算時間を見てみましょう。最適化ソルバーはGUROBI 6.51を用いています。


```py3:python
v, m = make(10000)
%timeit -n 3 m.solve(GUROBI_CMD())
sum(value(x) for x in v)
>>>
3 loops, best of 3: 222 ms per loop
8254.0
```

```py3:python
v, m = make(20000)
%timeit -n 3 m.solve(GUROBI_CMD())
sum(value(x) for x in v)
>>>
3 loops, best of 3: 486 ms per loop
16470.0
```

```py3:python
v, m = make(50000)
%timeit -n 3 m.solve(GUROBI_CMD())
sum(value(x) for x in v)
>>>
3 loops, best of 3: 1.38 s per loop
41237.0
```

```py3:python
v, m = make(100000)
%timeit -n 3 m.solve(GUROBI_CMD())
sum(value(x) for x in v)
>>>
3 loops, best of 3: 2.64 s per loop
82458.0
```

# まとめ
n 個のアイテムがあったときに、選択の仕方の可能性数は、$2^n$ 通りあります。また、この計算時間は厳密解を求めるまでの時間なので、この可能性を(ほぼ)すべて調べています[^2]。

アイテム数|計算時間(秒)|解の可能性数
--:|--:|--:
10000|0.22|$2.00 * 10^{3010}$
20000|0.49|$3.98 * 10^{6020}$
50000|1.38|$3.16 * 10^{15051}$
100000|2.64|$9.99 * 10^{30102}$

- 解の可能性数は、アイテム数に対して指数的に増えていきます。しかし、計算時間は、線形に近いです。
- 10の3万乗[^3]という、途方もない組合せを調べるのに、3秒もかかっていません。

最近のソルバーが、如何に高性能かがわかるかと思います。ただし、組合せ最適化の問題の種類や定式化の仕方によっては、性能が著しく悪くなることもありますので、注意が必要です。

ナップサック問題は NP困難ですが、クラスが P である最大重みマッチング問題でも、ソルバーの高性能が確認できます([重みマッチング問題における解法の比較](http://qiita.com/SaitoTsutomu/items/7fd199a95d78a6f3b741))。

参考

- [組合せ最適化を使おう](http://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)
- 宮代先生の[整数計画法メモ](http://web.tuat.ac.jp/~miya/ipmemo.html)
- ナップサック問題関連
    - [組合せ最適化 - 典型問題 - ナップサック問題](http://qiita.com/SaitoTsutomu/items/d3c07494e7ba992bf19d)
    - [動的最適化を使ってゴルフの期待値を求める](http://qiita.com/SaitoTsutomu/items/859b3f0aec38edcac779)
    - [ナップサック問題の結果の図示](http://qiita.com/SaitoTsutomu/items/ce0d17b15a0226c94a0e)
- ソルバー関連
    - [整数計画法による定式化入門](http://web.tuat.ac.jp/~miya/fujie_ORSJ.pdf)
    - [整数計画ソルバー入門](http://web.tuat.ac.jp/~miya/miyashiro_ORSJ.pdf)
    - [ZIMPL言語とSCIPによる数理最適化](http://ir.acc.senshu-u.ac.jp/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=9818&item_no=1&page_id=13&block_id=52)
    - [Gurobi Optimizer](https://www.octobersky.jp/products/gurobi/gurobi.html)

以上

[^1]: ナップサック問題は、NP困難な問題で多項式オーダーの解法がないと考えられていますが、ソルバーでは効率的に解けます。
[^2]: 厳密な最適解の目的関数の値に対して、比の差がε以下となる解を求めています。デフォルトでは、ε=0.0001のようです(参考 [整数計画法メモ](http://web.tuat.ac.jp/~miya/ipmemo.html))。
[^3]: 宇宙の原子の個数でさえ $10^{80}$ぐらいで、はるかに小さい。
ログ収集ツールの比較

ビッグデータが話題になり始めてから日が経ち、Fluentd、Logstash、Apache flumeやkafkaの名前を聞くようになった。これらに付随して全文検索エンジンやkibana等のビジュアライザが話題になっている。ログ分析の初歩としてログ収集ツールについて調べてみた。

![Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/137716/65ac2b0e-9140-4db0-22a1-74eec43afe13.png)

## ログ収集ツール
ログ収集ツールとしてはFluentd、Logstash、Flume等が挙げられる。ファイルやメール、syslog、DB、センサからログデータを読込み、必要なログをフィルタして、jsonやxmlに整形してアウトプットする機能を持つ。


### [Fluentd](http://www.fluentd.org/ "Fluentd")

#### メリット
- プラグインが300+公開されており、様々な形式のデータをインプット、アウトプットできる
- 単体でログのフィルタ、バッファ、ルーティングができる
- 2000+を超える企業に利用されている
- 日本語の情報が多い

#### デメリット
>- 単体で動作するためfluentdが落ちたらバッファしているログが消える
>- 想定外のログが入力されると大量のスタックトレースが吐かれる
>
>引用：http://changineer.info/server/logging/fluentd-td-agent.html#fluentd-2

### [Logstash](https://www.elastic.co/products/logstash "Logstash")

#### メリット
- フィルタを簡単にカスタマイズできる
- Fluentdと比べるとシンプル
- Windowsでも動く

#### デメリット
- バッファがないため大量にログを吐く場合kafka等と組み合わせる必要がある。


### [Apache Flume](https://flume.apache.org/ "Apache Flume")

#### メリット
- 冗長化などの仕組みも備えているので障害にも強い
- Hadoopとの親和性が高い
- 大量のログデータをリアルタイムに転送できる


#### デメリット
- 機能が多いため設定が複雑

## [Apache Kafka](http://kafka.apache.org/ "Apache Kafka")
Kafkaは2011年に公開されたオープンソースの分散メッセージングシステムである。Zookeeper上にkafkaサービスを複数作成しクラスタを組むことで大量のメッセージを受け入れることができる。利用用途としては、ログ収集ツールからのアウトプットの受入、全文検索エンジンに追加する前のバッファなどに利用できる。

[ログのビジュアライゼーション手段についての調査](http://qiita.com/testnamed/items/e2431f2f7335265752f1 "ログのビジュアライゼーション手段についての調査")
Bash on Ubuntu on Windowsからcmd / startを使う

# はじめに

Bash on Ubuntu on WindowsはWindowsのファイルにアクセスしたりその逆もできます。
ですが、別システムのようなものなのでBashからWindowsのexeファイルを実行したり、
拡張子を関連付けたプログラムでファイルを開いたりできません。

これをどうにかできるようにした[cbwin](https://github.com/xilun/cbwin)があったので導入してみました。

# cbwinをインストール

1. Bash on Ubuntu on Windows側で[cbwin/releases](https://github.com/xilun/cbwin/releases)からzipをダウンロードして展開します。
1. 展開したら`install.sh`を実行します。
1. 同梱されている`outbash.exe`をWindows側の任意のパスにコピーします。

```shell-session
$ curl -LO https://github.com/xilun/cbwin/releases/download/v0.9/cbwin-bin-0.9.zip
$ unzip cbwin-bin-0.9.zip
$ cd cbwin-bin-0.9
$ sudo ./install.sh
$ mkdir /mnt/c/bin
$ cp outbash.exe /mnt/c/bin
```

以上で、`/usr/local/bin`に`wcmd`, `wstart`, `wrun`がインストールされます。
それぞれ`cmd`, `start`の代わりと直接`CreateProcess`を実行するコマンドです。

# cbwinを実行

Bash on Ubuntu on Windowsのbashを実行する代わりにoutbash.exeを実行します。
すると見た目は変わりませんが、インストールした3つのコマンドを使うことができます。
AWS ECSのタスク同様に、KubernetesでもPod毎にIAMロールを設定する仕組みと方法

## TL;DR;

https://github.com/kubernetes/kubernetes/issues/23580

## EC2におけるインスタンスプロフィールによる権限付与の仕組み

EC2インスタンスにインスタンスプロフィールを設定しておくと、プロフィールに設定したIAMロールの権限が付与された一時クレデンシャルをmetadataサービス(169.254.169.254)から得ることができます。
各言語向けのAWS SDKや、aws-cliはこれを利用してAWS_ACCESS_KEY_IDやAWS_SECRET_ACCESS_KEYなしでAWS APIを呼ぶことを可能にしてます。

## ECSのIAMロール対応

2016/8月のアップデート以後、AWS ECSはタスク毎にIAMロールを設定できるようになっています。この仕組は以下のとおりです。

* タスク内のコンテナの環境変数AWS_CONTAINER_CREDENTIALS_RELATIVE_URIにタスク毎にユニークなパスが設定される
* `169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`にアクセスすると、JSON形式でクレデンシャルが返ってくる
* 既存バージョンのAWS SDKは169.254.169.254からクレデンシャルを得る想定なのでこのままだと意味がないけど…
* 各言語のAWS CLI、AWS SDK(2016/7/13にリリースされたバージョン以降)は`169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`も見るようになっている(http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html#task-iam-roles-minimum-sdk)
* EC2インスタンスのOSレベルの設定で、`169.254.170.2`がローカルホストの`127.0.0.1:51679`にDNATで変換されるようにしておく
  * ECS-optimized AMIを利用している場合、既にそうなっている
  * 他のAMIを利用している場合、iptables等の設定をする　http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html#enable_task_iam_roles

## Kubernetesで同じことを実現する方法・仕組み

* 結局のところ、AWS SDKやAWS CLIを騙して、metadataサービスからEC2でインスタンスプロフィールが設定されているときと同じようにクレデンシャルが返ってくるように見せることができればよい
* iptablesのPREROUTING chainで、metadataサービスへの通信を変換(DNAT)
  * Pod内のコンテナから`169.254.169.254`へのアクセスが、iptablesによってプロキシ用コンテナに送られるようにする
  * そこで、EC2におけるインスタンスプロフィールのような挙動を実現する
    * 例えば[jtblin/kube2iam](https://github.com/jtblin/kube2iam)はPodに付与しておいたannotationに書かれているIAMロールを取り出し、プロキシ内でAssumeRole、一時クレデンシャルを返す

## 2018.3アップデート

kube2iamよりkiamのほうが安定して動いてます。あと危険なオプション(default-arnがない)がないのもポイント。

https://github.com/uswitch/kiam
PHPでHTMLをPDF出力するライブラリについて調べてみた

# やりたい事とポイント
- PHPでPDF出力を出力する。（そのまま）
- いちいちレイアウトを考えたくないのでHTMLをそのままPDFしたい。
- テンプレートのPDFなどは使わないシンプルな帳票で良い。
- composerでインストールできるphpのライブラリだけでやりたい。

# 環境
Mac OS X El Capitan 10.11.4
PHP 5.6.24
CodeIgniter 2.2.0（古い。が、他のFWでも参考になるかと思います）

# PDF出力ライブラリの選定（こんなにするつもりじゃなかった）
##mPDF
ドキュメントも豊富で主流のようなのだが後述の問題があった為、不採用。
##FPDF
HTMLに対応しておらず、項目の座標をいちいち指定しないといないので却下。
mPDFと同様の問題もあったので不採用。
##html2pdf
情報が少ない上に検索すると同名のサービスもヒットするのでげんなりして不採用。
名前はシンプル過ぎてもいけない事を学んだ。
##wkhtmltopdf(+snappy)
google製で性能・信頼感はあるのだがphpのライブラリだけでやりたいので却下。
##TCPDF
結果的にはTCPDFに落ちつた。

# PDF出力時に起きた問題
当初、mPDFでPDFファイルを作成したところPDFのダウンロードまでは出来るのだが
ファイルをChromeでそのまま開こうとすると
`PDF ドキュメントを読み込むことができませんでした`
のエラーが発生して開く事ができない。
Adobe Readerで開こうとすると

```
「hoge.pdf」を開けませんでした。ファイル形式がサポートされていないか、またはファイルが破損している可能性があります (例えば、電子メールの添付ファイルとして送信され、正しくデコードされなかった場合などが考えられます)。
Adobe PDF 文書を作成するには、作成元アプリケーションでファイルを Adobe PDF に印刷してください。
```
と激しく怒られる。
同じファイルをmacのプレビューやfirefoxで開くと普通に開ける。

# 調査
- Adobe ReaderのVersionが古い？ → 最新版にしても現象変わらず。
- PDFしたHTMLの問題？ →　適当な文字列だけのHTMLにしても現象変わらず。
- mPDFに何かオプションがある？ →　マニュアルを読んでもそれらしい設定はなさそう。
- 同様の事象をgoogle先生にお伺いしても「そんなのお前だけだよ」と言われる。

結局、原因が分からずmPDFが悪いに違いない！と決め付けPDF出力ライブラリの選定をやり直すハメになった。

長くなってしまったのでTCPDFを使ったPDF出力の方法は記事を分けます。
Firebase/AnalyticsとGooglaAnalyticsSDKを入れた際に、ハマった点「library not found for -lGoogleAnalyticsServices」

```
Use of Unresolved Identifier 'GGLContext'
```
というエラーや、

```
library not found for -lGoogleAnalyticsServices
```
こんなエラーがでた。

色んな方が同様なエラーで記事をあげていたが、
どれも解決せず。

library search pathの修正や、
Bridgin-Header.hのimport変更
swiftのAppDelegate.swiftで ``` import Google ``` 
other linker flagで ``` -lGoogleAnalyticsServices ``` 
PodfileのFireBaseやGoogleAnalytics周りを消したり追加したり絞ったり。


で、解決した方法。。！

AppDelegate.swiftの

```
FIRApp.configure()　
```

を 
GoogleAnalyticsの初期化前に宣言する
これだけでした。。汗
rails devise

http://ruby-rails.hatenadiary.com/entry/20140801/1406907000

If you have more than one Devise model in your application (such as `User` and `Admin`), you will notice that Devise uses the same views for all models. Fortunately, Devise offers an easy way to customize views. All you need to do is set `config.scoped_views = true` inside the `config/initializers/devise.rb` file.

https://launchschool.com/blog/how-to-use-devise-in-rails-for-authentication
PythonのrequestsライブラリでWarningが出る場合の強引な対応方法

Pythonのrequestsのライブラリは非常に便利なのでよく使うのだが、
実行時に何かとwarningがでてウザい。

例えばInsecurePlatformWarningなんかが出る。
ググッて[こちらの方](http://qiita.com/testnin2/items/97ddb749879415b23e18)を参考に対応しようと思ったが、パッケージを入れたりダウングレードするのはどうにも面倒。

なので、強引にソースコードを書き換えることにした。

書き換え方は簡単。

私の場合はこんなワーニングが出たが、

```
/usr/lib/python2.6/site-packages/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
```

ご丁寧にソースコードのpathが書いてあるので、それをvimか何かで開いて、

```
vim /usr/lib/python2.6/site-packages/requests/packages/urllib3/util/ssl_.py
```

以下のようにwarnings.warnもろともコメントアウトしてあげればOK

```py
        def wrap_socket(self, socket, server_hostname=None, server_side=False):
            #warnings.warn(
            #    'A true SSLContext object is not available. This prevents '
            #    'urllib3 from configuring SSL appropriately and may cause '
            #    'certain SSL connections to fail. You can upgrade to a newer '
            #    'version of Python to solve this. For more information, see '
            #    'https://urllib3.readthedocs.io/en/latest/security.html'
            #    '#insecureplatformwarning.',
            #    InsecurePlatformWarning
            #)
            kwargs = {
                'keyfile': self.keyfile,
                'certfile': self.certfile,
                'ca_certs': self.ca_certs,
                'cert_reqs': self.verify_mode,
                'ssl_version': self.protocol,
                'server_side': server_side,
            }

```

これで十分じゃね！？ｗ
プロジェクトに、必要なソース・フォルダーがありません: 'src/test/resources'を解決してみる。

さっき治ったばっかりのEclipseを起動し、GitLabからプロジェクトをインポートした時の話。
# よく見るエラーだけどなんとなく解決するエラー

1, ビルド・パスのエラーが解決されるまで、プロジェクトをビルドできません。 APIPassionPvP

まあよく見るエラーですが、その下に

2, プロジェクト 'APIPassionPvP' に、必要なソース・フォルダーがありません: 'src/test/resources'

っていうエラーが出てるので、いつものことじゃないなと思い記事を作成。

# 安定のググる
やはり、前例があるようで、[こんな記事](http://misatlabmemo.hatenablog.com/entry/2013/06/07/105319)を見つけ、対処。
うん。できた。

あれっ…、最初(1)のエラーを解決すると、2のエラーも解決できたようで一安心。

# まとめ
ビルド・パスのエラーが解決されるまで、プロジェクトをビルドできません。が出た時は、プロジェクトを右クリック > プロパティー > Javaのビルド・パス > すべて選択
で解決できる。
c++ builder XE4 > psapi.hを使う > #include <paspi.h>以外に#pragma comment( lib, "psapi.lib" )を追加

```txt:動作環境
C++ Builder XE4
```

関連: [c++ builder > アプリ使用メモリの確認 > GetProcessMemoryInfo()使用 > WorkingSetSize: DLLの使用分を含んだメモリ使用量](https://qiita.com/7of9/items/871a0189fabeb1365320)

## 症状

実行プロセスの情報を取得するためpsapi.hを使おうとした。

プロジェクトをビルドすると以下のエラーが出た。

> [ilink32 エラー] Error: 未解決の外部シンボル 'GetProcessMemoryInfo' が C:\USERS\xxx\DOCUMENTS\RAD STUDIO\PROJECTS\00-WORK\WIN32\DEBUG\UNIT1.OBJ から参照されています

## 対応

参考 http://stackoverflow.com/questions/18432745/visual-studio-c-link-with-psapi-lib


> answered Aug 26 '13 at 11:29
> by boleto
>
> Method 2
The following pragma directive causes the linker to search in your source file for the psapi.lib library while linking .
> `#pragma comment( lib, "psapi.lib" )`

`#include <psapi.h>`とは別に上記の`#pragma`を追加すると未解決のシンボルのエラーは出なくなった。
Eclipseが動かなくなったので色々試してみる

# Eclipseが死んだ
とりあえず、初投稿です。変な場所があればコメントお願いします。
いつも通り、EclipseでSpigotプラグインを書き、ビルドしようとしたらJDKを入れてなかったことに気づき、(この時点でJDKを入れてなかったことがおかしい)JDKをインストールしてみた。
インストールが終わったらしく勝手に再起動を始め、サインインしEclipseの実行ファイルを起動しても全く反応がなかった。
# PC構成
|||
|:-:|:-:|
|OS|Windows10 Home|
|JDK|1.8.0_101(を導入)|
|メモリ|8GB|
|||
# とりえあずJDKを再インストールしてみる
ネットで調べたところ、JDKを再インストールすると治るというのが書かれていたのでやってみたところ、全く反応無し。
# Eclipseログを確認してみる
[Eclipseが起動しないときの復旧対応方法 | WEB ARCH LABO](http://weblabo.oscasierra.net/eclipse-recovery/)を見てみると、とりえあずログを確認してみなさい、とのこと。
ワークスペースを確認しようと、Eclipseが格納されているディレクトリを開くとworkspaceディレクトリがないことが判明。ゴミ箱の中にもない。あ＾～これは完全に萎えたんじゃああぁぁぁ＾～。
#-cleanをつけて実行してみる
Eclipseの日本語化されている奴には嬉しいことに、cmdファイルが入っているので実行。
…反応ないんですがそれは。コマンドプロンプトが一瞬表示されるだけで、スプラッシュ画面も一切…。
# workspaceディレクトリを作成してみる
全く反応無し。
# EclipseC.exeを実行してみる
一瞬コマンドプロンプトが表示され、画面が閉じる。
#コマンドプロンプトでjavaを実行してみる
あれっ…エラーがが…。

C:\Users\oto1ro>java
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object

## ググってみる
環境変数がなんとか…とか書いてあったので、そういえば環境変数いじったなと思い、確認してみる。

- JAVA_HOME
  - C:\Program Files\Java\jdk1.8.0_101

## よくわからなかったので一回Javaをアンインストール
確認してみると、Javaが4つはいってました…。この辺が原因なのかも。

- Java 7 Update 80
- Java 8 Update 51
- Java 8 Update 101
- Java SE Developer Kit Update 101

一回全部アンインストールしてみます。
そして、JDK1.8.0_102(64bit)をインストール。
## 環境変数をいじってたので、それなりにいじってみる。
JAVA_HOMEをC:\Program Files\Java\jdk1.8.0_101からC:\Program Files\Java\jdk1.8.0_102に変更。
PathのC:\Program Files\Java\jdk1.7.0_80\binをC:\Program Files\Java\jdk1.8.0_102\binに変更。

## javaコマンドをコマンドプロンプトで実行。

C:\Users\oto1ro>java
使用方法: java [-options] class [args...]
           (クラスを実行する場合)
   または  java [-options] -jar jarfile [args...]
           (jarファイルを実行する場合)
…
よさそう。

## Eclipseを起動してみる
動く…動くぞっ！！！

# まとめ
多分、Javaの重複。あと、環境変数が変わってたらしい。
linux でつかってるvmwareがアップデートなどでカーネルが変わった時に動かなくなった時の対処。

１．まずversion.hをリンクを作成します。

`sudo ln -s /usr/src/linux-headers-$(uname -r)/include/generated/uapi/linux/version.h /usr/src/linux-headers-$(uname -r)/include/linux/version.h`

２．そしてカーネルにVMWAREのmodを追加します。

`sudo vmware-modconfig --console --install-all`
とある「さくらの IoT Platform」公式情報インデックス

このページは、さくらインターネットの「さくらの IoT Platofrm」に関するオフィシャル技術情報の整理・分類・一覧化を目的としています。随時更新予定です。

## 公式サイト

* [さくらのIoT Platform](https://iot.sakura.ad.jp/) <img src="http://b.hatena.ne.jp/entry/image/https://iot.sakura.ad.jp/" />

## 各種ドキュメント

* [さくらのIoT Platform｜開発者向け](https://iot.sakura.ad.jp/developer/) <img src="http://b.hatena.ne.jp/entry/image/https://iot.sakura.ad.jp/developer/" />
* [チュートリアル](https://github.com/sakura-internet/SakuraIoTAlphaDocs/blob/master/tutorial.md) <img src="http://b.hatena.ne.jp/entry/image/https://github.com/sakura-internet/SakuraIoTAlphaDocs/blob/master/tutorial.md" />
* [ハードウエア仕様](https://github.com/sakura-internet/SakuraIoTAlphaDocs/blob/master/module/hardware.md) <img src="http://b.hatena.ne.jp/entry/image/https://github.com/sakura-internet/SakuraIoTAlphaDocs/blob/master/module/hardware.md" />
* [サービス連携](https://github.com/sakura-internet/SakuraIoTAlphaDocs/blob/master/platform/services.md) <img src="http://b.hatena.ne.jp/entry/image/https://github.com/sakura-internet/SakuraIoTAlphaDocs/blob/master/platform/services.md" />
* [さくらの IoT プラットフォーム　利用マニュアル（PDF）](https://iot.sakura.ad.jp/developer/pdf/iot_platform_manual_ver1.0.pdf) <img src="http://b.hatena.ne.jp/entry/image/https://iot.sakura.ad.jp/developer/pdf/iot_platform_manual_ver1.0.pdf" />
* [チュートリアル](URL) <img src="http://b.hatena.ne.jp/entry/image/" />
* [さくらのIoT Platform｜よくあるご質問](https://iot.sakura.ad.jp/inquiry/faq.html) <img src="http://b.hatena.ne.jp/entry/image/https://iot.sakura.ad.jp/inquiry/faq.html" />


## スライド

* [「さくらのIoT Platform α」ハンズオン（さくらクラブIoT福岡 第1回勉強会~さくらのIoT Platformを体験しよう！）](http://www.slideshare.net/sakura_pr/ss-64599802) <img src="http://b.hatena.ne.jp/entry/image/http://www.slideshare.net/sakura_pr/ss-64599802" />
* [さくらのIoT Platform αの裏側すべて見せます（第32回さくらの夕べ in 沖縄）](http://www.slideshare.net/sakura_pr/iot-platform-64148689) <img src="http://b.hatena.ne.jp/entry/image/http://www.slideshare.net/sakura_pr/iot-platform-64148689" />
* [Sakura IoT Platform で実現したいこと！(第31回さくらの夕べ in 仙台 ～全国さくら前線ツアー2016 #さくらクラ…](http://www.slideshare.net/sakura_pr/sakura-iot-platform-31-in-2016) <img src="http://b.hatena.ne.jp/entry/image/http://www.slideshare.net/sakura_pr/sakura-iot-platform-31-in-2016" />
* [さくらのIoT Platform an Introduction](http://www.slideshare.net/sakura_pr/iot-platform-a-new-service-overview) <img src="http://b.hatena.ne.jp/entry/image/http://www.slideshare.net/sakura_pr/iot-platform-a-new-service-overview" />
* [さくらのIoT Platform α technical_details](http://www.slideshare.net/sakura_pr/io-t-platform-technicaldetails) <img src="http://b.hatena.ne.jp/entry/image/http://www.slideshare.net/sakura_pr/io-t-platform-technicaldetails" />
* [さくらのIoT platform α priority partners](http://www.slideshare.net/sakura_pr/iot-platform-priority-partners) <img src="http://b.hatena.ne.jp/entry/image/http://www.slideshare.net/sakura_pr/iot-platform-priority-partners" />
* [「さくらのIoT Platform α」ハンズオン（さくらクラブIoT福岡 第1回勉強会~さくらのIoT Platformを体験しよう！）](http://www.slideshare.net/sakura_pr/ss-64599802) <img src="http://b.hatena.ne.jp/entry/image/http://www.slideshare.net/sakura_pr/ss-64599802" />
新しい職場に慣れるために心がけ(ようと思っ)たこと

私事ではあるのですが、社内異動によって4月から職場環境が変わりました。
職種自体はエンジニアのままではあるのですが、
前の部署 Web系(JavaScript) → 今の部署 iOSアプリがメイン
となり、同じ会社とはいえ業務内容がガラリと変わりました。

異動してから4ヶ月が経ち、新しい環境にもすこーしずつ慣れてきました。
その「慣れる」にあたっての考え方や姿勢について改めて感じることがあったのでこの記事ではそれを書き留めようと思います。

## 戦力になれてない感に負けない
いきなり当たり前の話ですが異動直後は何も分からず、マジで無力です。
インプットの量が多く、聞いたことをたまに忘れて同じことを2回聞いちゃったり、
しょうもないミスをしたり、
いざアウトプットを出してもすごい小さかったり、
「やばいおれ全然戦力になってない」感がすごいです。

たとえそうなっても悲観せず
- 新しい知識は貪欲に学びにいく
- 地味で小さい仕事でも自分でできそうなものは取りに行く

これを繰り返して少しずつ自分の存在感を上げていきます。
しんどいときは気持ちの持ち方次第で結構変わってくるものです。

実際今もそこまで戦力になってる感はないのですが、とりあえず↑の２つを今後も続けられるように頑張っていきます。

(なんか当たり前のことを言ってるだけだ)

## GitHub見よう
今日ではソースコード管理にGitHubを利用している企業はとても多いと思います。
「ここを直したいとき、どのファイルのどの辺りを修正すればいいか」を把握するにはGitHubのプルリクエストを見るのが最も手っ取り早いと感じました。これに加えてレビューの雰囲気とかも掴めます。
時間の余裕があればソースコードを一から読むのが最も確実ですが、自分の案件をこなすことも必要になってくる以上、プロダクトの作りを効率的に把握しましょう。

## アウトプットはできるだけ細かく
↑で書いたように過去のプルリクエストを見ることでシステム構成をある程度把握することができますが
やっぱり最初の頃は「た、たぶんこれで合ってるはず・・・！」となってしまうことが多いです。
そこを確実にレビューしてもらうために、プルリクエストを出す際はできるだけ粒度を細かくしましょう。
一つのPRの差分が大きいと、本来間違ってしまっている箇所を見逃されてしまう可能性が上がってしまいます。
※PRを投げる前に口頭等で有識者に確認することもアリですが、今後自分以外に新しく入ってきた人がそのPRを見たときに気付けるように間違いの指摘もPRの中に残しておくべきだと思います。

## 以前の環境の方が良いと思ったものは取り入れる
以前の職場と比較して、「ここは前の方が良かったなー」、「でもこっちは今の方がいいなー」と感じることは多少なりとも出てきます。
以前の方が良いと思ったことは現環境にも提案して積極的に取り入れていきましょう。それが採用されて上手く回れば自分が戦力になった感も得られてメンタル的にも良いです。
また、もし可能なのであれば今の環境の方が良いと感じたことは前の環境にも伝えてあげましょう。
良いことは何でもオープンに。
ubuntuでChromeリモートデスクトップが古いって怒られる場合の対処方法。


１．エディタは好きなのに読み替えてください
`sudo nano /etc/apt/sources.list.d/chromeos.list`

２．下記を書き込んで保存
`deb http://dl.google.com/linux/chrome-remote-desktop/deb/ stable main`

３．再インストール

`sudo apt-get update`
`sudo apt-get install chrome-remote-desktop` または　`sudo apt-get upgrade`

もし、Chromeリモートデスクトップが立ち上がってない場合こうしてみてください。
`sudo /etc/init.d/chrome-remote-desktop start`
UbuntuやLinuxでChromeリモートデスクトップでタスクバー（通知領域）（ウインドウ）がでなくてこまるよの場合。対処方法

Linuxのデスクトップ経由でインストールされているものとして書いています。

まずはChromeリモートデスクトップを停止します。
`/opt/google/chrome-remote-desktop/chrome-remote-desktop --stop`

設定ファイルを一応バックアップを取ります。いらないひとはとらなくてok
`sudo cp /opt/google/chrome-remote-desktop/chrome-remote-desktop /opt/google/chrome-remote-desktop/chrome-remote-desktop.orig`

そして設定ファイルを編集します。エディタは各自すきなのでどうぞ
`sudo nano /opt/google/chrome-remote-desktop/chrome-remote-desktop`

DEFAULT_SIZES を検索して　`DEFAULT_SIZES = "1600x1200,3840x2560"` とかになってるのを

`DEFAULT_SIZES = "1920x1080,1600x1200,3840x2560"`　と修正

ディスプレイナンバーが20とかなってるので
`FIRST_X_DISPLAY_NUMBER = 0` と修正

あとは以下を#をつけてコメントアウトします。たくさんあるので間違えないようにしてください。
`#while os.path.exists(X_LOCK_FILE_TEMPLATE % display):`
`#  display += 1`

`#logging.info("Starting %s on display :%d" % (xvfb, display))`
`#screen_option = "%dx%dx24" % (max_width, max_height)`
`#self.x_proc = subprocess.Popen(`
`#    [xvfb, ":%d" % display,`
`#     "-auth", x_auth_file,`
`#     "-nolisten", "tcp",`
`#     "-noreset",`
`#     "-screen", "0", screen_option`
`#    ] + extra_x_args)`
`#if not self.x_proc.pid:`
`#  raise Exception("Could not start Xvfb.")`

そして保存

保存が終わったら
`/opt/google/chrome-remote-desktop/chrome-remote-desktop --start`

としてChromeリモートを復活させてください。


備考
たまに違うユーザーとかで設定をいじると同じPCで2個のChromeリモートデスクトップが2個待機状態になったりして
リストに名前があるのにアクセス出来ないという状態が起きる場合があります。

また、ホスト名が同じハードウェアも同じＡディスクのLINUXとＢディスクのLINUXがおなじPCとみなされて
アクセス出来ない場合もあります。

UnityでChromeリモートを設定してGnomeで設定をいじってもおかしくなる場合があるので
環境をかえる場合はホスト名をユニークにするか古い環境のデスクトップ共有は無効にしてから破棄するほうが良いかもです。

再現性の確認ができてないですが3つの状況が過去にあったりしました。

「検証不足自己責任でおねがいします。」
![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/53561/68e602f4-bc27-882d-24e3-cd47b3e4e76c.jpeg)
上記のように直接設定をいじるとGoogleからは別PCかもしれないと思われてるのかもしれないです。
設定をいじる場合は別PCなどから半透明な端末を無効化しておくとうまくいくみたいです。
Macでpsfragを使うときの覚書

Macのlatexでコンパイルするとき、elcapitanとmacOS sierraではデフォルトでヒラギノフォントを使えなくなっている。
dvips実行時のエラー文として、以下のように表示される。
```HiraKakuPro-W6-H not found, using Courier.```

そのため、ヒラギノフォントの代わりにIPAフォントを使うように指定する。

```shell-session:commands
updmap --setoption kanjiEmbed ipa
updmap
```
Tween.js × Three.js


Three.jsで[Tween.js](https://github.com/tweenjs/tween.js/)を使ってみる

デモ：[オライリー本のサンプル](https://oreilly-japan.github.io/learning-three-js-2e-ja-support/chapter-09/03-animation-tween.html)


```javascript:Tween.js適用部分を多少書き換えてみた
var posSrc = {pos: 1}; // 初期値
var tween = new TWEEN.Tween(posSrc)
            .to({pos: 0}, 5000)
            .easing(TWEEN.Easing.Bounce.InOut);
var tweenBack = new TWEEN.Tween(posSrc)
            .delay(1000)
            .to({pos: 1}, 3000)
            .easing(TWEEN.Easing.Sinusoidal.InOut);

// ループさせる | chain() 連結
tween.chain(tweenBack);
tweenBack.chain(tween);

var onUpdate = function () {
    var count = 0;
    var pos = this.pos; // this == {pos: 1}

    loadedGeometry.vertices.forEach(function (e) { // loadedGeometry.vertices.length == 8477
        var newY = ((e.y + 3.22544) * pos) - 3.22544;
        pointCloud.geometry.vertices[count++].set(e.x, newY, e.z);
    });

    pointCloud.geometry.verticesNeedUpdate = true;
};

// tweenがアップデートされるたび呼び出される
tween.onUpdate(onUpdate);
tweenBack.onUpdate(onUpdate);


loader.load("../assets/models/test.ply", function (geometry) {

    // モデルの読み込みが完了したらアニメーション開始
    tween.start();
});

function render() {
    TWEEN.update();
}
```

> 参考
[Tweenアニメーションの種類](http://sole.github.io/tween.js/examples/03_graphs.html)
[JavascriptアニメーションライブラリTween.jsの紹介](https://lab.sonicmoov.com/news/animation-library-tweenjs/)
[初めてのThree.js 第2版――WebGLのためのJavaScript 3Dライブラリ](https://www.oreilly.co.jp/books/9784873117706/)
私家版CSSの書き方カラバリ編


#考えたきっかけ

サイトを作ってからちょっと雰囲気を変えて試したいことがある。レイアウトや大きさを変えるのはそれなりに大変だけど、色だけなら結構簡単に変えられる。

といっても、適当にCSSを書いていると色を指定しているところを抜き出すにはちょっと面倒。そこで、あとから色を変えるのが楽になるように書いている。

#私家版CSSの書き方カラバリ編

CSSを書くときは色は必ず単独行で指定する。たとえばこんな感じ。

```css:style.css
/* こうじゃなくて */
.box {
   border: solid 1px #999;
}

/* こう書く */
.box {
   border: solid 1px;
   border-color: #999;
}
```

こうしておけば次のようなgrepで色の部分だけだ抽出できる。

`egrep '^\S|\{|\}|color' style.css` 

抽出結果を別ファイルに保存して、色の部分だけを書き換えて、元のCSSより後に読み込ませればカラバリのできあがり。

#おまけ

前に作って放置してあるCSSの色の確認と変更をするウェブアプリがあるのでリンクしておく。
http://gotto.jp/color-change/

githubにも置いてある。
https://github.com/gotto/color-change
手動要求 view controller 載入 nib (with Swift)

日前有碰到一些問題，就是當我在進行畫面邏輯的時候，
因為使用的 view controller 還沒有被顯示出來、 view 還沒被初始化、 nib 中的畫面元件也還沒被載入

`@IBOutlet` 繫結的畫面元件在程式碼中預設是以 **implicitly unwrapped optional** 的型態存在，如 `UILabel!` 、`UIButton!` 等等；因此這時候取用這些元件，因為在 runtime 中取得 nil 值，就 crash 了。

## 手動載入 nib

在 view controller 取用 view 的時候，會載入需要的 nib 檔案，
因此我們只需要手動做到這件事即可。

官方這麼寫

> The nib file you specify is not loaded right away. It is loaded the first time the view controller's view is accessed. 

接下來我們會用 `MYViewController` 當例子，這個 class

- 是 `UIViewController` 的子類別
- 需要透過 nib 來設定畫面元件

### iOS 9 的場合

``` swift
var myViewController = MYViewController(nibName: "MYViewController", bundle: nil)
myViewController.loadViewIfNeeded()
```

呼叫 `loadViewIfNeeded()` 這個方法即可

### iOS 8 以下的場合

因為上一小節提到的方法是在 iOS 9 開始才有的，因此在 iOS 8 只能用比較笨的方法，去呼叫 view controller 主要的 view ，觸發他載入 nib 。

``` swift
var myViewController = MYViewController(nibName: "MYViewController", bundle: nil)
let _ = myViewController.view
```

因為這個 view 也不需要使用，就使用 `_` 來承接這個值即可。
Angular Dartのハイレベルロードマップ


AngularDartのハイレベルロードマップの草稿が発表されたので抄訳してみた。

https://github.com/dart-lang/angular2/blob/master/ROADMAP.md

# 抄訳

## ハイレベルロードマップ

これは開発計画の草稿だ。Angular Dartは現在、多くの大規模なGoogleプロジェクトで使用されている。そして何よりも、私たちは特に、安定性、性能、そして生産性に関して深く検討する。

> Angular 2 JS/TS プロジェクトとの関係についてのメモ。私たちはTS版チームと設計と性能の記録を共有し２つのバージョンを出来るだけ近いものに維持するが、私たちは時折、Dartコミュニティーのためにより良いものになるように、同一の機能とAPIを持つよりも分化させることを選択する。現時点では、私たちはDagger2を基礎にした新しいDIとComponent APIを開発中であり、それはDartの強力な静的型解析とレキシカルスコープを活かしたものになる。

## 性能

* Angular Dartのコンパイラを、（できる限り）イディオマティックなDartコードを出力するように最適化する。
* Change Detectionの実行コストを最適化し、Flutterに似た、一部のコンポーネントツリーだけをアップデートの対象とするリアクティブモデルの方向に進める。
	* `*ngFor`を書き直し、メモリとCPUの消費を抑える。
	* `const/final`バインディングを理解させ、毎回でなくただ一度だけ検査させる。
* ブラウザーとコンポーネントのイベントが軽量化するよう最適化する。
* より洗練されたコードをビルドするため、静的型を使用してより最適化されたテンプレートを生成する。

## コードサイズ

* tree-shakingと親和性の高い静的なDependency Injection。
* コンパイラに、デバッギングパスを排したより良い「リリースモード」コードを出力させるよう改善する。
* `ngIf`ディレクティブを、それがスコープ外になる際には軽量化するよう改善する。

## 生産性

* 正式にDart DDCと[strong mode](https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md)をサポートする。全てのブラウザーで瞬時の更新操作で開発できるようになる。
* i18nヘルパーコードを生成する。
* テンプレートで、静的でトップレベルのメソッドとゲッターを使用できるようにする。
* より明瞭で、早期に報告される、理解可能なコンパイル時の警告（ランタイムと比較して）。

## 他の計画

私たちは近々、コード生成（production appのような）を利用したMaterial Components、ルーター、Form APIと、新しいテストに関するさらなる話を公開できる見込みだ。  


# 所感

* Dartが1年以上地道に整備してきたエコシステムを最大限生かしたフレームワークに変貌してほしい。
* コンパイラが改善されることで、現状ではかなり意味不明なこともあるDIに関するランタイムエラーメッセージに悩まされなくなることに大きな期待。
* DDCが正式にサポートされれば、ChromeやFirefox等のブラウザーで素速く開発できるようになる。DartiumはChromeのバージョンから何ヶ月も遅れているので、最新のWeb技術をJS APIのラッパーを書いてテストすることが現実的ではなかったが、これで現実的にできるようになるだろうし、CSSのクロスブラウザのテストも苦痛なくできるようになるだろう。例えるならばCoffeeScriptのようにDartを利用できることになりそうだ。
* Flutterの素晴らしい成果を積極的に取り込んでいってほしい。特に、FlutterのUIライブラリをコンパイルしてAngularで利用可能にすることは可能かどうか興味がある。ElmのviewのようにDartでviewを書いてAngularテンプレートにコンパイルするイメージ。
Interfaceのdefaultメソッドを使った手抜き実装

# Interfaceのデフォルトメソッド

個人的に、Apache Commonsは頻繁に使うのですけれど、近頃思うのは

**StringUtils.・・・やFileUtils.・・・などを毎回書くのがめんどくせぇ**

これを何とか手軽に省略できる手はないのかなぁと思いついたのが、インタフェースのdefault実装です。
思いつきなので有用であるか、メンテナンス性が良いのか…までは検討していません。

# 例えばこういうもの

StringUtilsとFileUtilsで頻繁に使うものだけ抽出してインタフェースを作ります。

```CommonsLangInterface.java
import org.apache.commons.lang3.StringUtils;

public interface CommonsLangInterface {
  public default boolean isBlank(String target) {
    return StringUtils.isBlank(target);
  }
}
```

```FileUtilsInterface.java
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;

public interface FileUtilsInterface {
  public default String read(String path) {
    try {
      return FileUtils.readFileToString(new File(path),"utf-8");
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }
}
```

これらを束ねるインタフェースも作ります

```BundleInterface.java
public interface BundleInterface extends CommonsLangInterface,FileUtilsInterface {

}
```

これらのインタフェースを使ったロジックでは、次のように

```SampleLogic.java
public class SampleLogic implements BundleInterface {
  public void validation(String target) {
    if (isBlank(target)) {
      // isBlank == true のロジック。例えばエラーメッセージ出して終了。
      return;
    }
    
    String data = read(target);
    
    // 読み込んだdataの処理.......
  }
}
```

と、省略できるようになります。

今回はApache Commonsを使った例を挙げましたが、業務ロジックでよく目にする **ナントカUtils** の代替とでき、特に継承クラスや他のインタフェースの邪魔はしない程度に作れますから、こういうのも良いのかも知れません。
Apache Solrから「全てのドキュメント」を指定して一発で取得することはできない

`Solr`は取得ドキュメント数を`rows`パラメーターで指定する。
デフォルトは10だ。
0では0件取得し、-1などはエラーだ。

では全てを取得するには`rows`に何を入れればいいか。
「全てのドキュメント」を表すパラメーター、値はない。

方法としては、

1. 一度無条件検索などを行い、`numFound`を取得し、それを`rows`に指定する
2. `admin/luke`にクエリを投げコア情報から`Num Docs`を取得し、それを`rows`に指定する
3. `rows`にドキュメント数より**十分大きい数値**を設定する

が考えられる。
手間、時差によるズレを考えると3がいいと思われる。
セットする値は`int`を考慮して`2147483647`などがいいだろう。

# 参考

[How to get all results from solr query? - Stack Overflow]

[How to get all results from solr query? - Stack Overflow]:http://stackoverflow.com/questions/10039778/how-to-get-all-results-from-solr-query
Windows10でシステムイメージの作成に失敗する

## 症状
「バックアップと復元(Windows7)」の「システムイメージの作成」から
ネットワークの共有フォルダにイメージを作成しようとしたが失敗してしまう。

```
ソースボリュームのシャドウコピーが削除されたため、バックアップに失敗しました。
ボリューム上での書き込み動作が頻繁であることが原因の可能性があります。バックアップを再実行してください。
問題が解決しない場合は、'VSSADMIN Resize ShadowStorage'コマンドを使用してシャドウコピーストレージを増やすことを検討してください（0x80780169）
```

## 対処

「システムの復元とシャドウコピー」のクリーンアップを行います。

- ディクスクリーンアップを起動。
- 「システムファイルのクリーンアップ」をクリック。
- 「その他オプション」タブをクリック。
- 「システムの復元とシャドウコピー」の「クリーンアップ」ボタンをクリック。

## まとめ
原因は不明ですがシャドウコピー領域不足が発生したようです。
今回はクリーンアップで対処しましたが、ダイアログで書かれているのシャドウコピー領域拡大でも対処できるでしょう。
Ajax についての覚書

さらに修正
dataTypeに関して大いなる勘違い。
dataTypeはAjaxの返り値の受取方法なので、これは送り先サーバーが値をどのような形式で返答してくるかを設定。
送るデータ形式とは全く関係ない。

データ送信は基本KEY->Val形式 以下の二種類。もしかして配列を入れると自動変換してくれるかも？
data:'&foo=bar1&foo=bar2';
data:{ foo1:'bar1', foo2:'bar2'};

送信でjsonを利用することはまれ。何故なら受け取り側がPOSTやGETというKey->Val形式だから。

```javascript
data: $('#form').serialize(), //&foo=bar1&foo=bar2 の形式
dataType:'json',　//任意
```

 POSTの取得側のロジックは以下のとおり
 
 ```php
$data = $_POST;
echo json_encode( array("result" =>  $data  ));
 ```


  それに対して、何かしらの理由でobj形式の受け渡しが必要な場合(ex:多次元配列)、
`JSON.stringify(serializeArray)`をセットで利用するが、その場合、そもそも`$_POST`の形式に適合しない。

 ```javascript
data: JSON.stringify($('#form').serializeArray()),
dataType:'json',　//任意
 ```
 
 JSONの取得側のロジックは以下のとおり
 
 ```php
$json = file_get_contents('php://input');
$data = json_decode($json, true);
echo json_encode( array("result" =>  $data  ));
 ```

<hr>

かなり悪戦苦闘の末、理解できた
https://teratail.com/questions/44809

dataTypeにjsonは基本使わない、私レベルでは。フォームのデータを送る程度なら`?key=val&` 形式の`serialize`のデータを送る。で二次配列だからこそ`$_POST`の形式に沿って取得できる

```javascript
$('#form').serialize(),
dataType:'text', <= ? 
```

 POSTの取得側のロジックは以下のとおり
 
 ```php
$data = $_POST;
echo json_encode( array("result" =>  $data  ));
 ```

<hr>
  それに対して、何かしらの理由でobj形式の受け渡しが必要な場合(ex:多次元配列)、`JSOS.stringify(serializeArray)`と`dataType:json`をセットで利用するが、その場合、そもそも`$_POST`の形式に適合しない。 
 
 ```javascript
JSON.stringify($('#form').serializeArray()),
dataType:'json',
 ```
 
 JSONの取得側のロジックは以下のとおり
 
 ```php
$json = file_get_contents('php://input');
$data = json_decode($json, true);
echo json_encode( array("result" =>  $data  ));
 ```
Mac 版 PowerShell で Graph API にアクセス

ついにきましたね！
誰得 PowerShell on MacOS！
https://github.com/PowerShell/PowerShell

誰得感満載なんで、今日は OAuth.jp じゃなくて Qiita に記事あげてみましょうね！

さ、ではさっそく PowerShell 祝いってことで、Graph API にアクセスしてみましょう。
あ、FB の方ね。

```ps1
#!/usr/local/bin/powershell -File

$access_token = Read-Host "token"

$headers = @{
  Authorization = "Bearer $access_token";
}

$response = Invoke-RestMethod 'https://graph.facebook.com/me' -Headers $headers

$response.id
$response.name
$response | ConvertTo-Json
```

上記のようなスクリプトを `graph_api_client_sample.ps1` ってファイル名で保存して、Terminal からそいつを実行すればよいようです。

```bash
user@tovan Desktop$ chmod +x graph_api_client_sample.ps1
user@tovan Desktop$ ./graph_api_client_sample.ps1
```

ps.

ついでに以下のように OAuth Dance するスクリプトも書いてみたんですけど、なんか 400 エラー返ってきてて、かつ実際の HTTP Request and/or Response を見る方法がわかんないんで挫折なぅです。
おしえて PowerShell のパパ！

```ps1
#!/usr/local/bin/powershell -File

$client_id = Read-Host "Client ID"
$client_secret = Read-Host "Client Secret"
$redirect_uri = Read-Host "Redirect URI"

$authz_endpoint = "https://graph.facebook.com/oauth/authorize"
$token_endpoint = "https://graph.facebook.com/oauth/token"

open ($authz_endpoint + "?client_id=" + $client_id + "&redirect_uri=" + $redirect_uri)

$code = Read-Host "code"

$params = @{
  client_id = $client_id;
  client_secret = $client_secret;
  code = $code;
  grant_type = "authorization_code";
  redirect_uri = $redirect_uri;
}

$result = Invoke-RestMethod -Uri $token_endpoint -Method Post -Body $params

$result.access_token
```

ちなみに返ってくるエラーはこんな感じ。

```ps1
Invoke-RestMethod : Response status code does not indicate success: 400 (Bad Request).
At /Users/user/Desktop/oauth_client.ps1:22 char:11
+ $result = Invoke-RestMethod -Uri $token_endpoint -Method Post -Body $ ...
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Method: POST, R...m-urlencoded
}:HttpRequestMessage) [Invoke-RestMethod], HttpRequestException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
```
rails omniauth

http://qiita.com/Hassan/items/176bc2c6fd75a3e00111

http://qiita.com/Hassan/items/176bc2c6fd75a3e00111

https://github.com/chen7897499/practice/tree/master/github-auth

https://github.com/chen7897499/practice/tree/master/twitter_auth

http://qiita.com/pugiemonn/items/f7956ba61012ca9fc16c

callback地址一定要写正确

如果报ssl error, 测试一下twitter能不能正确翻墙, twitter貌似dns污染了

可以proxychains rails s -b 0.0.0.0
iOS 8で、dyld: Symbol not found: _NSURLSessionTaskPriorityDefault の対処方法


CocoaPodsでライブラリのアップデートをおこなっていたら、ある時から突然、iOS 8で下記の実行時エラーが発生するようになりました。

```
dyld: Symbol not found: _NSURLSessionTaskPriorityDefault
  Referenced from: /Users/user/Library/Developer/CoreSimulator/Devices/6FA85157-45BD-429C-9B17-EC25662F3346/data/Containers/Bundle/Application/38194C23-0361-4C13-8661-7D6443D5A633/MyApp.app/MyApp
  Expected in: /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 8.4.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Foundation.framework/Foundation
 in /Users/user/Library/Developer/CoreSimulator/Devices/6FA85157-45BD-429C-9B17-EC25662F3346/data/Containers/Bundle/Application/38194C23-0361-4C13-8661-7D6443D5A633/MyApp.app/MyApp
```

 あるライブラリをアップデートしたら、`CFNetwork.framework` が不要になったらしく、その時から `CFNetwork.framework` がlinkされなくなったため発生しました。

## 環境

* Xcode Version 7.3.1 (7D1014)
* Deployment Target 8.3

## 調査


いろいろ参考サイトを探していたのですが、 `CFNetwork.framework` を手動で追加しろということらしいです。

しかし、CocoaPodsを使用している場合、本当に手動でXcodeの `Linked Frameworks and Libraries` に追加しても解消されません。

`Foundation.framework` より前に `CFNetwork.framework` をlinkしないといけないらしいですが、順番を入れ替えても、エラーが解消できません。

## 解決方法

答えは、CocoaPodsが生成しているxcconfigにありました。
`OTHER_LDFLAGS` に Foundation.framework がすでに入っているため、これより前に、 `CFNetwork.framework` を挿入する必要があります。


```App.xcconfig
// ↓ | の位置より前に追加
OTHER_LDFLAGS = $(inherited) -ObjC... | -framework "Foundation" ...

```

`pod install` 時に、 xcconfigファイルを書き換えたいため、 `post_install` フックに処理を追加します。


```Podfile
post_install do |installer_representation|
  installer_representation.pods_project.targets.each do |target|

    case target.name
    when /App$/, /App-Release$/
      target.build_configurations.each do |config|
        xcconfig_path = config.base_configuration_reference.real_path

        build_settings = Hash[*File.read(xcconfig_path).lines.map {|l| l.split(/\s*=\s*/, 2) }.flatten]

        other_ldflags = build_settings['OTHER_LDFLAGS']
        # see: Quickfix on iOS 8 crashes, https://openradar.appspot.com/23956486
        if idx = other_ldflags =~ /-framework \"Foundation\"/
          other_ldflags.insert(idx, '-framework "CFNetwork" ')
          build_settings['OTHER_LDFLAGS'] = other_ldflags
        end

        File.open(xcconfig_path, "w") {|f| f.puts build_settings.map {|k, v| "#{k} = #{v}" } }
      end
    end
  end
end
```

複数ターゲットがある場合(Podsでインストールするライブラリ用のターゲットもあるため)、必要なターゲットのみ変更するようにした方が良いでしょう。

## 参考

* https://openradar.appspot.com/23956486
* https://github.com/onevcat/Kingfisher/issues/169
さくらレンタルサーバーの~/.vimrcに設定を書きました。

さくらレンタルサーバーでvimを立ち上げると行番号がついていなく、色もついていないのでつけたいと思いました。

# さくらレンタルサーバーに.vimrcを用意

```bash:vimの設定を書く
vim ~/.vimrc 

set nu
syntax on
set expandtab
set tabstop=2
set shiftwidth=2
```
`set nu`と`syntax on`を書いておきました。

# vimで色がつきました
vimで適当なファイルを開くと行番号と色が着きました(☝ ՞ਊ ՞)

# 参考
[さくらレンタルサーバーにSSHで公開鍵ログインしました](http://qiita.com/pugiemonn/items/1597939003ca83208e0d)
[Vimの起動時に行番号を表示する設定を.vimrcに書きました。](http://qiita.com/pugiemonn/items/2f0eba494e8e051b99a4)
mindmup > すべての子nodeのfold/unfold > Shift+[ / F

マインドマップを作れるサービス www.mindmup.com

このサービスにおいて、全部のノードを展開(unfoldという）する機能が欲しくてサービスに連絡したところ、
https://mindmup.uservoice.com/
にて希望機能を登録すれば対応すると連絡いただいた。

そのサイトを見ているとすでに実装済だったことが分かった。
https://mindmup.uservoice.com/forums/200447-what-should-we-focus-on-next/suggestions/7040623-collapse-all-sub-child-nodes-action-menu-hotkey

## 手順

- 最上位ノードを選択
- Shift + [ : 子ノード含むすべての選択
- F: unfold / fold

例として、在庫管理のマップ。
https://atlas.mindmup.com/2016/08/de9478e047bf0134f4fb338a6149a680/ic_20160818/index.html


関連 http://qiita.com/7of9/items/a31c395864dd9f875c57
プロセス異常終了時の自動再起動

# 調査

## キーワード

### 検索

Google で検索したキーワード

* linux プロセス "異常終了" "再起動" 自動
* linux プロセス  "再起動" 自動 

### 関連

* monit
* upstart
* inittab
* respawn
* daemontools
* systemd
* supervisor

## 参考

### monit

* [Easy, proactive monitoring of processes, programs, files, directories, filesystems and hosts | Monit](https://mmonit.com/monit/)
* [monit でプロセスを監視する - いますぐ実践! Linuxシステム管理 / Vol.158](http://www.usupi.org/sysad/158.html)
* [CentOS 6.5にmonitをインストールしてプロセス監視をする - Qiita](http://qiita.com/ksworks/items/0f3bbfa9e0ba49b5ef06)

### upstart

* [upstartでプロセスを自動再起動させる。 — ペンギンと愉快な機械の日々](http://d.palmtb.net/2012/03/23/124932.html)
* [Upstart を使ってお手軽 daemon 化 - インフラエンジニアway - Powered by HEARTBEATS](http://heartbeats.jp/hbblog/2013/02/upstart-daemon.html)

### initab

* [initとプロセス再起動](http://www.slideshare.net/ttkzw/init)

### daemontools

* [unoh.github.com by unoh](https://unoh.github.io/2008/07/24/daemontools.html)

### supervisor

* [異常終了](https://siguniang.wordpress.com/2012/04/25/supervisor-autostart-process-mechanism/)

### 記事

* [How to monitor a service and restart if stopped in Linux - Super User](https://superuser.com/questions/683325/how-to-monitor-a-service-and-restart-if-stopped-in-linux)

#　結果

monit を使ってみることにした。
理由は以下

* 設定の容易さ
* 用途が比較的限定されていること
* メンテナンスが現在も行われていること

## メモ

* [linux - Monit daemon - error connecting to the monit daemon - Stack Overflow](https://stackoverflow.com/questions/28187786/monit-daemon-error-connecting-to-the-monit-daemon)
Jenkins CLIを用いてconfig.xmlからジョブを作成する

わざわざ面倒な手段を取っていることは自覚してます。

Jenkinsジョブのインポートは、JENKINS_HOMEのjobsにディレクトリ作って、config.xmlを置けば良いんだけど、
事情によりサーバを直接触らせられない時にジョブをインポートする方法。

意外と？config.xmlをインポートするようなプラグインが見つからなかったので、Jenkins CLIを使ってみた。

## 事前に用意するもの
* Jenkinsの管理者権限を保有したログインIDとパスワード
* インポート対象ジョブの定義がある **config.xml**
* Jenkinsからダウンロードした **jenkins-cli.jar**

## インポート手順
* コマンドプロンプトを開く
* **config.xml** がある場所へ移動
* 以下のコマンドを発行する

  ```bash
   % java -jar jenkins.cli.jar -s JenkinsのURL \
       create-job \
       --username JenkinsユーザID --password Jenkinsユーザパスワード \
       作成ジョブ名 < config.xml
  ```

* Jenkinsのトップページに指定したジョブが作成されていることを確認する

注意点としては、指定するジョブ名は **半角の英数字** であることと、スペースは使えないが、アンダーバーは使用可能であること。
語彙力診断テストをハックする

`Array.from(document.querySelectorAll('.answer[value="1"]')).forEach((ele, i)=>{setTimeout(()=>ele.click(), i*1200)})`

#### 使い方
1. [語彙力診断テスト](http://www.arealme.com/japanese-vocabulary-size-test/ja/)を開く
2. 任意の言語を選択
3. 測定スタートを**押下**
4. chrome dev toolを開く
5. 語彙力診断テストのwindowをクリック(アクティブにする)
6. コンソールに↑のJSを貼り付けてEnter

#### ja
![スクリーンショット 2016-08-19 13.34.31.png](https://qiita-image-store.s3.amazonaws.com/0/46870/0bfd3e64-f3c2-0ce7-0d76-80ad4d0ffd3c.png)

#### en
![スクリーンショット 2016-08-19 13.26.59.png](https://qiita-image-store.s3.amazonaws.com/0/46870/85a76683-7362-62c6-1532-d01a6df732cc.png)


関連
[語彙力診断の点数分布 - Qiita](http://qiita.com/kentskind/items/fc49952dda57c6a43260)
[「日本語ボキャブラリーテスト」のアルゴリズム - Qiita](http://qiita.com/kzymtn/items/c25eb8a77cb63e5fea0a)